diff --git a/.packages b/.packages
index fdf45db..112a27d 100644
--- a/.packages
+++ b/.packages
@@ -62,6 +62,7 @@
 mime:third_party/pkg/mime/lib
 mustache4dart:third_party/pkg/mustache4dart/lib
 oauth2:third_party/pkg/oauth2/lib
+observable:third_party/pkg/observable/lib
 observatory:runtime/observatory/lib
 observe:third_party/pkg/observe/lib
 package_config:third_party/pkg_tested/package_config/lib
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57fbfc4..7feb704 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,10 @@
 ### Core library changes
 * `dart:core`: Added `Uri.isScheme` function to check the scheme of a URI.
    Example: `uri.isScheme("http")`. Ignores case when comparing.
+* `dart:core`: Make `UriData.parse` validate its input better.
+  If the data is base-64 encoded, the data is normalized wrt.
+  alphabet and padding, and it contains invalid base-64 data,
+  parsing fails. Also normalizes non-base-64 data.
 * `dart:io`: Added functions `File.lastAccessed`, `File.lastAccessedSync`,
   `File.setLastModified`, `File.setLastModifiedSync`, `File.setLastAccessed`,
   and `File.setLastAccessedSync`.
diff --git a/DEPS b/DEPS
index 50498e5..b20d8b9 100644
--- a/DEPS
+++ b/DEPS
@@ -37,8 +37,8 @@
   "gperftools_revision": "@02eeed29df112728564a5dde6417fa4622b57a06",
 
   # Revisions of /third_party/* dependencies.
-  "args_tag": "@0.13.5",
-  "async_tag": "@1.11.3",
+  "args_tag": "@0.13.7",
+  "async_tag": "@1.13.0",
   "barback-0.13.0_rev": "@34853",
   "barback-0.14.0_rev": "@36398",
   "barback-0.14.1_rev": "@38525",
@@ -47,72 +47,73 @@
   "boolean_selector_tag" : "@1.0.2",
   "boringssl_gen_rev": "@1a810313a0290e1caace9da73fa3ab89995ad2c7",
   "boringssl_rev" : "@d519bf6be0b447fb80fbc539d4bff4479b5482a2",
-  "charcode_tag": "@1.1.0",
+  "charcode_tag": "@v1.1.1",
   "chrome_rev" : "@19997",
   "cli_util_tag" : "@0.0.1+3",
-  "code_transformers_tag": "@v0.4.2+3",
-  "collection_tag": "@1.10.1",
+  "code_transformers_tag": "@v0.5.1",
+  "collection_tag": "@1.13.0",
   "convert_tag": "@2.0.1",
   "crypto_tag" : "@2.0.1",
-  "csslib_tag" : "@0.13.2",
+  "csslib_tag" : "@0.13.3+1",
   "dart2js_info_tag" : "@0.5.3+1",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
   "dart_style_tag": "@0.2.16",
-  "dartdoc_tag" : "@v0.9.8+1",
+  "dartdoc_tag" : "@v0.9.12",
   "fixnum_tag": "@0.10.5",
-  "func_tag": "@0.1.0",
+  "func_tag": "@0.1.1",
   "glob_tag": "@1.1.3",
   "html_tag" : "@0.13.1",
-  "http_multi_server_tag" : "@2.0.2",
-  "http_parser_tag" : "@3.0.3",
+  "http_multi_server_tag" : "@2.0.3",
+  "http_parser_tag" : "@3.1.1",
   "http_tag" : "@0.11.3+9",
   "http_throttle_rev" : "@284344cd357e435c6c8ff9a4a21f02b9e384a541",
   "idl_parser_rev": "@7fbe68cab90c38147dee4f48c30ad0d496c17915",
-  "initialize_tag": "@v0.6.2+2",
+  "initialize_tag": "@v0.6.2+5",
   "intl_tag": "@0.14.0",
   "isolate_tag": "@1.0.0",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
-  "json_rpc_2_tag": "@2.0.2",
-  "linter_rev": "@89f93362c5b48ef5192d77e9a28cf9590542669b",
+  "json_rpc_2_tag": "@2.0.4",
+  "linter_rev": "@89f93362c5b48ef5192d77e9a28cf9590542669b", # prerelease 1.30
   "logging_tag": "@0.11.3+1",
-  "markdown_tag": "@0.11.0",
+  "markdown_tag": "@0.11.2",
   "matcher_tag": "@0.12.0+2",
-  "metatest_tag": "@0.2.2+2",
+  "metatest_tag": "@0.2.2+3",
   "mime_rev": "@75890811d4af5af080351ba8a2853ad4c8df98dd",
   "mustache4dart_tag" : "@v1.0.10",
   "oauth2_tag": "@1.0.2",
+  "observable_tag": "@0.17.0",
   "observatory_pub_packages_rev": "@26aad88f1c1915d39bbcbff3cad589e2402fdcf1",
-  "observe_tag": "@0.13.5",
+  "observe_tag": "@0.15.0",
   "package_config_tag": "@1.0.0",
   "package_resolver_tag": "@1.0.2+1",
   "path_tag": "@1.4.1",
   "plugin_tag": "@0.2.0",
   "ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
-  "pool_tag": "@1.2.4",
+  "pool_tag": "@1.3.0",
   "protobuf_tag": "@0.5.3",
   "pub_rev": "@53327f4a7ca2ddd20a40f6a94db61ac136371b03",
-  "pub_semver_tag": "@1.3.0",
+  "pub_semver_tag": "@1.3.2",
   "quiver_tag": "@0.22.0",
   "resource_rev":"@a49101ba2deb29c728acba6fb86000a8f730f4b1",
   "root_certificates_rev": "@0068d8911140e591ebb750af296e81940a9906f5",
-  "scheduled_test_tag": "@0.12.6",
+  "scheduled_test_tag": "@0.12.9",
   "shelf_static_tag": "@0.2.4",
   "shelf_packages_handler_tag": "@1.0.0",
-  "shelf_tag": "@0.6.5+3",
+  "shelf_tag": "@0.6.7+2",
   "shelf_web_socket_tag": "@0.2.1",
   "smoke_tag" : "@v0.3.6+2",
-  "source_map_stack_trace_tag": "@1.1.3",
+  "source_map_stack_trace_tag": "@1.1.4",
   "source_maps-0.9.4_rev": "@38524",
-  "source_maps_tag": "@0.10.1+2",
-  "source_span_tag": "@1.2.4",
-  "stack_trace_tag": "@1.6.6",
-  "stream_channel_tag": "@1.5.0",
-  "string_scanner_tag": "@1.0.0",
+  "source_maps_tag": "@0.10.2",
+  "source_span_tag": "@1.3.1",
+  "stack_trace_tag": "@1.7.1",
+  "stream_channel_tag": "@1.6.1",
+  "string_scanner_tag": "@1.0.1",
   "sunflower_rev": "@879b704933413414679396b129f5dfa96f7a0b1e",
   "test_reflective_loader_tag": "@0.1.0",
-  "test_tag": "@0.12.15+6",
+  "test_tag": "@0.12.18+1",
   "typed_data_tag": "@1.1.3",
-  "usage_tag": "@v2.2.2",
+  "usage_tag": "@v3.0.0+1",
   "utf_tag": "@0.9.0+3",
   "watcher_tag": "@0.9.7+3",
   "web_components_rev": "@6349e09f9118dce7ae1b309af5763745e25a9d61",
@@ -120,7 +121,7 @@
   "WebCore_rev": "@a86fe28efadcfc781f836037a80f27e22a5dad17",
   "when_tag": "@0.2.0+2",
   "which_tag": "@0.1.3+1",
-  "yaml_tag": "@2.1.11",
+  "yaml_tag": "@2.1.12",
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
 }
 
@@ -252,6 +253,8 @@
       + Var("mustache4dart_tag"),
   Var("dart_root") + "/third_party/pkg/oauth2":
       (Var("github_mirror") % "oauth2") + Var("oauth2_tag"),
+  Var("dart_root") + "/third_party/pkg/observable":
+      (Var("github_dartlang") % "observable") + Var("observable_tag"),
   Var("dart_root") + "/third_party/pkg/observe":
       (Var("github_mirror") % "observe") + Var("observe_tag"),
   Var("dart_root") + "/third_party/observatory_pub_packages":
diff --git a/docs/language/informal/covariant-from-class.md b/docs/language/informal/covariant-from-class.md
new file mode 100644
index 0000000..b9f3afe
--- /dev/null
+++ b/docs/language/informal/covariant-from-class.md
@@ -0,0 +1,388 @@
+# Informal Specification: Parameters that are Covariant due to Class Type Parameters
+
+Owner: eernstg@.
+
+## Summary
+
+This document is an informal specification which specifies how to determine the
+reified type of a tear-off where one or more parameters has a type annotation in
+which a formal type parameter of the enclosing class occurs in a covariant
+position. This feature has no effect in Dart 1, it only affects strong mode and
+the upcoming Dart 2.
+
+## Motivation
+
+The main topic here is variance, so we will briefly introduce that
+concept.
+
+Consider the situation where a type is specified as an expression that contains
+another type as a subexpression. For instance, `List<int>` contains `int` as a
+subexpression. We may then consider `List<...>` as a function, and `int` as an
+argument which is passed to that function. With that, covariance is the property
+that this function is increasing, and contravariance is the property that it is
+decreasing, using the subtype relation for comparisons.
+
+Generic classes in Dart are covariant in all their arguments. For example
+`List<E>` is covariant in `E`. This then means that `List<...>` is an
+increasing function, i.e., whenever `S` is a subtype of `T`, `List<S>` will be a
+subtype of `List<T>`.
+
+The subtype rule for function types in Dart 1 is different from the one in
+strong mode and in the upcoming Dart 2. This difference is the main fact that
+motivates the feature described in this document.
+
+Concretely, the subtype rule for function types allows for covariant return
+types in all cases. For instance, assuming that two functions `f` and `g` have
+identical parameter types, the type of `f` will always be a subtype of the type
+of `g` if `f` returns `int` and `g` returns `num`.
+
+This is not true for parameter types. In Dart 1, the function type subtype rule
+allows for covariant parameter types as well as contravariant ones, but strong
+mode and the upcoming Dart 2 require contravariance for parameter types. For
+instance, we have the following cases (using `void` for the return type, because
+the return type is uninteresting, it should just be the same everywhere):
+
+```dart 
+typedef void F(num n);
+
+void f1(Object o) {}
+void f2(num n) {}
+void f3(int i) {}
+
+main() {
+  F myF;
+  myF = f1;  // Contravariance: Succeeds in Dart 1, and in strong mode.
+  myF = f2;  // Same type: Always succeeds.
+  myF = f3;  // Covariance: Succeeds in Dart 1, but fails in strong mode.
+}
+```
+
+In all cases, the variance is concerned with the relationship between the type
+of the parameter for `myF` and the type of the parameter for the function which
+is assigned to `myF`. Since Dart 1 subtyping makes both `f1` and `f3` subtypes
+of the type of `myF`, all assignments succeed at run time (and static analysis
+proceeds without warnings). In strong mode and Dart 2, `f3` does not have a
+subtype of the type of `myF`, so this is considered as a downcast at compile
+time, and it fails at runtime.
+
+Contravariance is the sound rule that most languages use, so this means that
+function calls in strong mode and in Dart 2 are subject to more tight type
+checking, and some run-time errors cannot occur.
+
+However, covariant parameter types can be quite natural and convenient, they
+just impose an obligation on developers to use ad-hoc reasoning in order to
+avoid the potential type errors at run time. The
+[covariant overrides](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/covariant-overrides.md)
+feature was added exactly for this purpose: When developers want to use unsound
+covariance, they can get it by requesting it explicitly. In the (vast majority
+of) cases where the sound and more strict contravariant rule fits the intended
+design, there will be no such request, and parameter type covariance (which
+would then presumably only arise by mistake) will be flagged as a type error.
+
+In order to preserve a fundamental soundness property of Dart, the reified type
+of tear-offs of methods has parameter type `Object` for every parameter whose
+type is covariant. The desired property is that every expression with static
+type `T` must evaluate to a value whose dynamic type `S` which is a subtype of
+`T`. Here is an example why it would not work to reify the declared parameter
+type directly:
+
+```dart
+typedef void F(num n);
+
+class A {
+  // Assume the reified parameter type is `num`, directly as declared.
+  void f(covariant num n) {}
+}
+
+class B extends A {
+  // Assume the reified parameter type is `int`, directly as declared.
+  void f(int i) {}
+}
+
+main() {
+  A a = new B();
+  F myF = a.f; // Statically safe, yet fails at run time in strong mode and Dart 2!
+}
+```
+
+The problem is that `a.f` has static type `(num) -> void`, and if the
+reified type at run time is `(int) -> void` then `a.f` is an expression
+whose value at run time does _not_ conform to the statically known type.
+
+Even worse, there is no statically known type annotation that we can use in the
+declaration of `myF` which will make it safe&mdash;the value of `a` could be an
+instance of some other class `C` where the parameter type is `double`, and in
+general we cannot statically specify a function type where the parameter type is
+a subtype of the actual parameter type at runtime (as required for the
+initialization to succeed).
+
+_We could use the bottom type as the argument type, `(Null) -> void`, but that
+makes all invocations unsafe (except `myF(null)`). We believe that it is more
+useful to preserve the information that "it must be some kind of number", even
+though not all kinds of numbers will work. With `Null`, we just communicate that
+all invocations are unsafe, with no hints at all about which ones would be less
+unsafe than others._
+
+We do not want any such expressions where the value is not a subtype of the
+statically known type, and hence the reified type of `a.f` is `(Object) ->
+void`. In general, the type of each covariant parameter is reified as
+`Object`. In the example, this is how it works:
+
+```dart
+typedef void F(num n);
+
+class A {
+  // The reified parameter type is `Object` because `n` is covariant.
+  void f(covariant num n) {}
+}
+
+class B extends A {
+  // The reified parameter type is `Object` because `i` is covariant.
+  void f(int i) {}
+}
+
+main() {
+  A a = new B();
+  F myF = a.f; // Statically safe, and succeeds at runtime.
+}
+```
+
+_Note that an invocation of `myF` can be statically safe and yet fail at runtime,
+e.g., `myF(3.1)`, but this is exactly the same situation as with the torn-off
+method: `a.f(3.1)` is also considered statically safe, and yet it will fail at
+runtime._
+
+The purpose of this document is to cover one extra type of situation where the
+same typing situation arises.
+
+Parameters can have a covariant type because they are or contain a formal type
+parameter of an enclosing generic class. Here is an example using the core class
+`List` (which underscores that it is a common phenomenon, but any generic class
+would do):
+
+```dart
+// Here is the small part of the core List class that we need here.
+abstract class List<E> ... {
+  // The reified type is `(E) -> void` in all modes, as declared.
+  void add(E value);
+  // The reified type is `(Iterable<E>) -> void` in all modes, as declared.
+  void addAll(Iterable<E> iterable);
+  ...
+}
+
+typedef void F(num n);
+typedef void G(Iterable<num> n);
+
+main() {
+  List<num> xs = <int>[1, 2];
+  F myF = xs.add;    // Statically safe, yet fails at run time
+                     // in strong mode and Dart 2.
+  G myG = xs.addAll; // Same as above.
+}
+```
+
+The example illustrates that the exact same typing situation arises in the
+following two cases:
+
+- A covariant parameter type is induced by an overriding method declaration
+  (example: `int i` in `B.f`).
+- A Covariant parameter type is induced by the use of a formal type parameter of
+  the enclosing generic class in a covariant position in the parameter type
+  declaration (example: `E value` and `Iterable<E> iterable` in `List.add`
+  resp. `List.addAll`).
+
+This document specifies how to preserve the above mentioned expression soundness
+property of Dart, based on a modified rule for how to reify parameter types of
+tear-offs.
+
+## Informal specification
+
+### Syntax
+
+This feature does not give rise to any changes to the grammar of the language.
+
+### Standard mode
+
+This feature does not give rise to any changes to the static analysis nor the
+dynamic semantics of standard mode.
+
+### Strong mode
+
+In strong mode, this feature causes changes to the reified type of a function
+obtained by a closurizing property extraction in some cases, as specified
+below.
+
+#### Static types
+
+The static type of a property extraction remains unchanged.
+
+_The static type of a torn-off method is taken directly from the statically
+known declaration of that method, substituting actual type arguments for formal
+type parameters as usual. For instance, the static type of `xs.addAll` is
+`(Iterable<num>) -> void` when the static type of `xs` is `List<num>`._
+
+#### Reified types
+
+We need to introduce a new kind of covariant parameters, in addition to the
+notion of covariant parameters which is introduced in the informal
+specification of
+[covariant overrides](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/covariant-overrides.md).
+
+Consider a class _T_ which is generic or has a generic supertype (directly or
+indirectly). Let _S_ be said generic class. Assume that there is a declaration
+of a method, setter, or operator `m` in _S_, that `X` is a formal type parameter
+declared by _S_, and that said declaration of `m` has a formal parameter `x`
+whose type contains `X` in a covariant position. In this situation we say that
+the parameter `x` is **covariant due to class covariance**.
+
+_The type of `x` is in a covariant position when the type is `X` itself, e.g.,
+when the parameter is declared as `X x`. It is also in a covariant position when
+it is declared like `List<X> x`, because generic classes are covariant in all
+their type arguments. An example where `X` does not occur in a covariant
+position is when `x` is a function typed parameter like `int x(X arg)`._
+
+In the remainder of this section, a parameter which is covariant according
+to the definition given in 
+[covariant overrides](https://github.com/dart-lang/sdk/blob/master/docs/language/informal/covariant-overrides.md)
+is treated the same as a parameter which is covariant due to class covariance as
+defined in this document; in both cases we just refer to the parameter as a
+_covariant parameter_.
+
+The reified type for a function _f_ obtained by a closurizing property
+extraction on an instance method, setter, or operator is determined as follows:
+
+Let `m` be the name of the method, operator, or setter which is being
+closurized, let _T_ be the dynamic type of the receiver, and let _D_ be
+the declaration of `m` in _T_ or inherited by _T_ which is being extracted.
+
+The reified return type of _f_ the is the static return type of _D_. For each
+parameter `p` declared in _D_ which is not covariant, the part in the dynamic
+type of _f_ which corresponds to `p` is the static type of `p` in _D_. For each
+covariant parameter `q`, the part in the dynamic type of _f_ which corresponds
+to `q` is `Object`.
+
+_The occurrences of type parameters in the types of non-covariant parameters
+(note that those occurrences must be in a non-covariant position in the
+parameter type) are used as-is. For instance, `<String>[].asMap()` will have the
+reified type `() -> Map<int, String>`._
+
+The dynamic checks associated with invocation of such a function are still
+needed, and they are unchanged.
+
+_That is, a dynamic error occurs if a method with a covariant parameter p is
+invoked, and the actual argument value bound to p has a run-time type which is
+not a subtype of the type declared for p._
+
+## Alternatives
+
+The "erasure" of the reified parameter type for each covariant parameter to
+`Object` may seem agressive.
+
+In particular, it ignores upper bounds on the formal type parameter which gives
+rise to the covariance due to class covariance, and it ignores the structure of
+the type where that formal type parameter is used. Here are two examples:
+
+```dart
+class C<X extends num> {
+  void foo(X x) {}
+  void bar(List<X> xs) {}
+}
+```
+
+With this declaration, the reified type of `new C<int>().foo` will be `(Object)
+-> void`, even though it would have been possible to use the type `(num) ->
+void` based on the upper bound of `X`, and still preserve the earlier mentioned
+expression soundness. This is because all supertypes of the dynamic type of the
+receiver that declare `foo` have an argument type for it which is a subtype of
+`num`.
+
+Similarly, the reified type of `new C<int>().bar` will be `(Object) -> void`,
+even though it would have been possible to use the type `(List<num>) -> void`.
+
+Note that the reified type is independent of the static type of the receiver, so
+it does not matter that we consider `new C<int>()` directly, rather than using
+an intermediate variable whose type annotation is some supertype, e.g.,
+`C<num>`.
+
+In the first example, `foo`, there is a loss of information because we are
+(dynamically) allowed to assign the function to a variable of type `(Object) ->
+void`. Even worse, we may assign it to a variable of type `(String) -> void`,
+because `(Object) -> void` (that is, the actual type that the function reports
+to have) is a subtype of `(String) -> void`. In that situation, every statically
+safe invocation will fail, because there are no values of type `String` which
+will satisfy the dynamic check in the function itself, which requires an
+argument of type `int` (except `null`, of course, but this is rarely sufficient
+to make the function useful).
+
+In the second example, `bar`, the same phenomenon is extended a little, because
+we may assign the given torn-off function to a variable of type `(String) ->
+void`, in addition to more reasonable ones like `(Object) -> void`,
+`(Iterable<Object>) -> void`, and `(Iterable<int>) -> void`.
+
+It is certainly possible to specify a more "tight" reified type like the ones
+mentioned above. In order to do this, we would need the least upper bound of all
+the statically known types in all supertypes of the dynamic type of the
+receiver. This would involve a least upper bound operation on a set of types,
+and it would involve an instantiate-to-bounds operation on the type parameters.
+
+The main problem with this approach is that some declarations do not allow for
+computation of a finite type which is the least upper bound of all possible
+instantiations, so we cannot instantiate-to-bound:
+
+```dart
+// There is no finite type `T` such that all possible values
+// for `X` are subtypes of `T`.
+class D<X extends D<X>> {}
+```
+
+Similarly, some finite sets of types do not have a denotable least upper bound:
+
+```dart
+class I {}
+class J {}
+
+class A implements I, J {}
+class B implements I, J {}
+```
+
+In this case both of `A` and `B` have the two immediate superinterfaces `I` and
+`J`, and there is no single type (that we can express in Dart) which is the
+least of all the supertypes of `A` and `B`.
+
+So in some cases we will have to error out when we compute the reified type of a
+tear-off of a given method, unless we introduce intersection types and infinite
+types, or unless we find some other way around this difficulty.
+
+On the other hand, it should be noted that the common usage of these torn-off
+functions would be guided by the statically known types, which do have the
+potential to keep them "within a safe domain".
+
+Here is an example:
+
+```dart
+main() {
+  List<int> xs = <int>[];
+  void Function(int) f1 = xs.add; // Same type statically, OK at runtime.
+  void Function(num) f2 = xs.add; // Statically a downcast, can warn, OK at runtime.
+  void Function(Object) f3 = xs.add; // A downcast, can warn, OK at runtime.
+  void Function(String) f4 = xs.add; // An unrelated type, error in strong mode.
+
+  List<num> ys = xs; // "Forget part of the type".
+  void Function(int) f5 = ys.add; // Statically an upcast, OK at runtime.
+  void Function(num) f6 = ys.add; // Statically same type, OK at runtime.
+  void Function(Object) f7 = ys.add; // Statically a downcast, OK at runtime.
+  void Function(String) f8 = ys.add; // An unrelated type, error in strong mode.
+  
+  List<Object> zs = ys;
+  void Function(int) f9 = zs.add; // Statically an upcast, OK at runtime.
+  void Function(num) fa = zs.add; // Statically an upcast, OK at runtime.
+  void Function(Object) fb = zs.add; // Statically a same type, OK at runtime.
+  void Function(String) fc = zs.add; // Finally we can go wrong silently!
+}
+```
+
+In other words, the static typing helps programmers to maintain the same level
+of knowledge (say, "this is a list of `num`") consistently, even though it is
+consistently incomplete ("it's actually a list of `int`"), and this helps a lot
+in avoiding those crazy assignments (to `List<String>`) where almost all method
+invocations will go wrong.
diff --git a/pkg/analysis_server/analysis_server.iml b/pkg/analysis_server/analysis_server.iml
index 2cf6a6c..02af3aa 100644
--- a/pkg/analysis_server/analysis_server.iml
+++ b/pkg/analysis_server/analysis_server.iml
@@ -15,6 +15,8 @@
       <excludeFolder url="file://$MODULE_DIR$/test/edit/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/integration/analysis/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/integration/completion/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/integration/diagnostic/packages" />
+      <excludeFolder url="file://$MODULE_DIR$/test/integration/edit/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/integration/execution/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/integration/packages" />
       <excludeFolder url="file://$MODULE_DIR$/test/integration/search/packages" />
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index e6ad6ea..9756879c 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -108,7 +108,7 @@
 </style></head>
   <body>
     <h1>Analysis Server API Specification</h1>
-    <h1 style="color:#999999">Version 1.17.0</h1>
+    <h1 style="color:#999999">Version 1.18.0</h1>
     <p>
       This document contains a specification of the API provided by the
       analysis server.  The API in this document is currently under
@@ -2405,6 +2405,7 @@
         The diagnostic domain contains server diagnostics APIs.
       </p>
       
+      
     <h3>Requests</h3><dl><dt class="request"><a name="request_diagnostic.getDiagnostics">diagnostic.getDiagnostics</a> (<a href="#request_diagnostic.getDiagnostics">#</a>)</dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "diagnostic.getDiagnostics"
@@ -2420,6 +2421,25 @@
       <h4>returns:</h4><dl><dt class="field"><b>contexts (List&lt;<a href="#type_ContextData">ContextData</a>&gt;)</b></dt><dd>
             
             <p>The list of analysis contexts.</p>
+          </dd></dl></dd><dt class="request"><a name="request_diagnostic.getServerPort">diagnostic.getServerPort</a> (<a href="#request_diagnostic.getServerPort">#</a>)</dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "diagnostic.getServerPort"
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+    "<b>port</b>": int
+  }
+}</pre></div>
+        <p>
+          Return the port of the diagnostic web server. If the server is not running
+          this call will start the server. If unable to start the diagnostic web server,
+          this call will return an error of <tt>DEBUG_PORT_COULD_NOT_BE_OPENED</tt>.
+        </p>
+        
+      <h4>returns:</h4><dl><dt class="field"><b>port (int)</b></dt><dd>
+            
+            <p>The diagnostic server port.</p>
           </dd></dl></dd></dl>
     
       <h2 class="domain"><a name="types">Types</a></h2>
@@ -3781,6 +3801,11 @@
               not be satisfied because the content of the file changed before
               the requested results could be computed.
             </p>
+          </dd><dt class="value">DEBUG_PORT_COULD_NOT_BE_OPENED</dt><dd>
+            
+            <p>
+              The server was unable to open a port for the diagnostic server.
+            </p>
           </dd><dt class="value">FILE_NOT_ANALYZED</dt><dd>
             
             <p>
@@ -4504,7 +4529,7 @@
       TODO: TBD
     </p>
     <h2 class="domain"><a name="index">Index</a></h2>
-    <h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li></ul></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
+    <h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getReachableSources">getReachableSources</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.implemented">implemented</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h4>diagnostic (<a href="#domain_diagnostic">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_diagnostic.getDiagnostics">getDiagnostics</a></li><li><a href="#request_diagnostic.getServerPort">getServerPort</a></li></ul></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_ContextData">ContextData</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FileKind">FileKind</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_ImplementedClass">ImplementedClass</a></li><li><a href="#type_ImplementedMember">ImplementedMember</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
   
 
 </body></html>
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
index 9a11d6a..59b76b0 100644
--- a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
@@ -7759,6 +7759,109 @@
     return JenkinsSmiHash.finish(hash);
   }
 }
+/**
+ * diagnostic.getServerPort params
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class DiagnosticGetServerPortParams {
+  Request toRequest(String id) {
+    return new Request(id, "diagnostic.getServerPort", null);
+  }
+
+  @override
+  bool operator==(other) {
+    if (other is DiagnosticGetServerPortParams) {
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    return 367508704;
+  }
+}
+
+/**
+ * diagnostic.getServerPort result
+ *
+ * {
+ *   "port": int
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class DiagnosticGetServerPortResult implements HasToJson {
+  int _port;
+
+  /**
+   * The diagnostic server port.
+   */
+  int get port => _port;
+
+  /**
+   * The diagnostic server port.
+   */
+  void set port(int value) {
+    assert(value != null);
+    this._port = value;
+  }
+
+  DiagnosticGetServerPortResult(int port) {
+    this.port = port;
+  }
+
+  factory DiagnosticGetServerPortResult.fromJson(JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int port;
+      if (json.containsKey("port")) {
+        port = jsonDecoder.decodeInt(jsonPath + ".port", json["port"]);
+      } else {
+        throw jsonDecoder.missingKey(jsonPath, "port");
+      }
+      return new DiagnosticGetServerPortResult(port);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "diagnostic.getServerPort result", json);
+    }
+  }
+
+  factory DiagnosticGetServerPortResult.fromResponse(Response response) {
+    return new DiagnosticGetServerPortResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)), "result", response._result);
+  }
+
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["port"] = port;
+    return result;
+  }
+
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => JSON.encode(toJson());
+
+  @override
+  bool operator==(other) {
+    if (other is DiagnosticGetServerPortResult) {
+      return port == other.port;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, port.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
 
 /**
  * AddContentOverlay
@@ -14204,6 +14307,7 @@
  *
  * enum {
  *   CONTENT_MODIFIED
+ *   DEBUG_PORT_COULD_NOT_BE_OPENED
  *   FILE_NOT_ANALYZED
  *   FORMAT_INVALID_FILE
  *   FORMAT_WITH_ERRORS
@@ -14240,6 +14344,11 @@
   static const RequestErrorCode CONTENT_MODIFIED = const RequestErrorCode._("CONTENT_MODIFIED");
 
   /**
+   * The server was unable to open a port for the diagnostic server.
+   */
+  static const RequestErrorCode DEBUG_PORT_COULD_NOT_BE_OPENED = const RequestErrorCode._("DEBUG_PORT_COULD_NOT_BE_OPENED");
+
+  /**
    * A request specified a FilePath which does not match a file in an analysis
    * root, or the requested operation is not available for the file.
    */
@@ -14386,7 +14495,7 @@
   /**
    * A list containing all of the enum values that are defined.
    */
-  static const List<RequestErrorCode> VALUES = const <RequestErrorCode>[CONTENT_MODIFIED, FILE_NOT_ANALYZED, FORMAT_INVALID_FILE, FORMAT_WITH_ERRORS, GET_ERRORS_INVALID_FILE, GET_NAVIGATION_INVALID_FILE, GET_REACHABLE_SOURCES_INVALID_FILE, INVALID_ANALYSIS_ROOT, INVALID_EXECUTION_CONTEXT, INVALID_FILE_PATH_FORMAT, INVALID_OVERLAY_CHANGE, INVALID_PARAMETER, INVALID_REQUEST, NO_INDEX_GENERATED, ORGANIZE_DIRECTIVES_ERROR, REFACTORING_REQUEST_CANCELLED, SERVER_ALREADY_STARTED, SERVER_ERROR, SORT_MEMBERS_INVALID_FILE, SORT_MEMBERS_PARSE_ERRORS, UNANALYZED_PRIORITY_FILES, UNKNOWN_REQUEST, UNKNOWN_SOURCE, UNSUPPORTED_FEATURE];
+  static const List<RequestErrorCode> VALUES = const <RequestErrorCode>[CONTENT_MODIFIED, DEBUG_PORT_COULD_NOT_BE_OPENED, FILE_NOT_ANALYZED, FORMAT_INVALID_FILE, FORMAT_WITH_ERRORS, GET_ERRORS_INVALID_FILE, GET_NAVIGATION_INVALID_FILE, GET_REACHABLE_SOURCES_INVALID_FILE, INVALID_ANALYSIS_ROOT, INVALID_EXECUTION_CONTEXT, INVALID_FILE_PATH_FORMAT, INVALID_OVERLAY_CHANGE, INVALID_PARAMETER, INVALID_REQUEST, NO_INDEX_GENERATED, ORGANIZE_DIRECTIVES_ERROR, REFACTORING_REQUEST_CANCELLED, SERVER_ALREADY_STARTED, SERVER_ERROR, SORT_MEMBERS_INVALID_FILE, SORT_MEMBERS_PARSE_ERRORS, UNANALYZED_PRIORITY_FILES, UNKNOWN_REQUEST, UNKNOWN_SOURCE, UNSUPPORTED_FEATURE];
 
   final String name;
 
@@ -14396,6 +14505,8 @@
     switch (name) {
       case "CONTENT_MODIFIED":
         return CONTENT_MODIFIED;
+      case "DEBUG_PORT_COULD_NOT_BE_OPENED":
+        return DEBUG_PORT_COULD_NOT_BE_OPENED;
       case "FILE_NOT_ANALYZED":
         return FILE_NOT_ANALYZED;
       case "FORMAT_INVALID_FILE":
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol.dart b/pkg/analysis_server/lib/plugin/protocol/protocol.dart
index 49e19c1..ea425cf 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol.dart
@@ -339,6 +339,14 @@
       : _result = result;
 
   /**
+   * Create and return the `DEBUG_PORT_COULD_NOT_BE_OPENED` error response.
+   */
+  Response.debugPortCouldNotBeOpened(Request request, dynamic error)
+      : this(request.id,
+      error: new RequestError(
+          RequestErrorCode.DEBUG_PORT_COULD_NOT_BE_OPENED, '$error'));
+
+  /**
    * Initialize a newly created instance to represent the FILE_NOT_ANALYZED
    * error condition.
    */
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 1ea9e8d..c46ca60 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -20,6 +20,7 @@
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
@@ -51,7 +52,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
-import 'package:analyzer/src/summary/pub_summary.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/util/glob.dart';
 import 'package:analyzer/task/dart.dart';
@@ -92,7 +92,7 @@
    * The version of the analysis server. The value should be replaced
    * automatically during the build.
    */
-  static final String VERSION = '1.17.0';
+  static final String VERSION = '1.18.0';
 
   /**
    * The number of milliseconds to perform operations before inserting
@@ -320,11 +320,6 @@
    */
   ResolverProvider packageResolverProvider;
 
-  /**
-   * The manager of pub package summaries.
-   */
-  PubSummaryManager pubSummaryManager;
-
   nd.PerformanceLog _analysisPerformanceLogger;
   ByteStore byteStore;
   nd.AnalysisDriverScheduler analysisDriverScheduler;
@@ -335,6 +330,13 @@
   final Set<String> priorityFiles = new Set<String>();
 
   /**
+   * The DiagnosticServer for this AnalysisServer. If available, it can be used
+   * to start an http diagnostics server or return the port for an existing
+   * server.
+   */
+  DiagnosticServer diagnosticServer;
+
+  /**
    * Initialize a newly created server to receive requests from and send
    * responses to the given [channel].
    *
@@ -352,7 +354,8 @@
       this.options,
       this.sdkManager,
       this.instrumentationService,
-      {ResolverProvider fileResolverProvider: null,
+      {this.diagnosticServer,
+      ResolverProvider fileResolverProvider: null,
       ResolverProvider packageResolverProvider: null,
       bool useSingleContextManager: false,
       this.rethrowExceptions: true}) {
@@ -380,15 +383,7 @@
       }
       _analysisPerformanceLogger = new nd.PerformanceLog(sink);
     }
-    if (resourceProvider is PhysicalResourceProvider) {
-      byteStore = new MemoryCachingByteStore(
-          new EvictingFileByteStore(
-              resourceProvider.getStateLocation('.analysis-driver').path,
-              1024 * 1024 * 1024 /*1 GiB*/),
-          64 * 1024 * 1024 /*64 MiB*/);
-    } else {
-      byteStore = new MemoryByteStore();
-    }
+    byteStore = _createByteStore();
     analysisDriverScheduler =
         new nd.AnalysisDriverScheduler(_analysisPerformanceLogger);
     analysisDriverScheduler.status.listen(sendStatusNotificationNew);
@@ -432,8 +427,6 @@
     } else if (index != null) {
       searchEngine = new SearchEngineImpl(index, getAstProvider);
     }
-    pubSummaryManager =
-        new PubSummaryManager(resourceProvider, '${io.pid}.temp');
     Notification notification = new ServerConnectedParams(VERSION, io.pid,
             sessionId: instrumentationService.sessionId)
         .toNotification();
@@ -837,23 +830,6 @@
     return null;
   }
 
-// TODO(brianwilkerson) Add the following method after 'prioritySources' has
-// been added to InternalAnalysisContext.
-//  /**
-//   * Return a list containing the full names of all of the sources that are
-//   * priority sources.
-//   */
-//  List<String> getPriorityFiles() {
-//    List<String> priorityFiles = new List<String>();
-//    folderMap.values.forEach((ContextDirectory directory) {
-//      InternalAnalysisContext context = directory.context;
-//      context.prioritySources.forEach((Source source) {
-//        priorityFiles.add(source.fullName);
-//      });
-//    });
-//    return priorityFiles;
-//  }
-
   /**
    * Return a [Future] that completes with the resolved [CompilationUnit] for
    * the Dart file with the given [path], or with `null` if the file is not a
@@ -879,6 +855,23 @@
     });
   }
 
+// TODO(brianwilkerson) Add the following method after 'prioritySources' has
+// been added to InternalAnalysisContext.
+//  /**
+//   * Return a list containing the full names of all of the sources that are
+//   * priority sources.
+//   */
+//  List<String> getPriorityFiles() {
+//    List<String> priorityFiles = new List<String>();
+//    folderMap.values.forEach((ContextDirectory directory) {
+//      InternalAnalysisContext context = directory.context;
+//      context.prioritySources.forEach((Source source) {
+//        priorityFiles.add(source.fullName);
+//      });
+//    });
+//    return priorityFiles;
+//  }
+
   /**
    * Handle a [request] that was read from the communication channel.
    */
@@ -1665,6 +1658,24 @@
   }
 
   /**
+   * If the state location can be accessed, return the file byte store,
+   * otherwise return the memory byte store.
+   */
+  ByteStore _createByteStore() {
+    const int M = 1024 * 1024 /*1 MiB*/;
+    const int G = 1024 * 1024 * 1024 /*1 GiB*/;
+    if (resourceProvider is PhysicalResourceProvider) {
+      Folder stateLocation =
+          resourceProvider.getStateLocation('.analysis-driver');
+      if (stateLocation != null) {
+        return new MemoryCachingByteStore(
+            new EvictingFileByteStore(stateLocation.path, G), 64 * M);
+      }
+    }
+    return new MemoryCachingByteStore(new NullByteStore(), 64 * M);
+  }
+
+  /**
    * Return a set of all contexts whose associated folder is contained within,
    * or equal to, one of the resources in the given list of [resources].
    */
@@ -1783,7 +1794,6 @@
   bool enableIncrementalResolutionApi = false;
   bool enableIncrementalResolutionValidation = false;
   bool enableNewAnalysisDriver = false;
-  bool enablePubSummaryManager = false;
   bool finerGrainedInvalidation = false;
   bool noErrorNotification = false;
   bool noIndex = false;
@@ -1965,9 +1975,6 @@
     builderOptions.defaultOptions = options;
     builderOptions.defaultPackageFilePath = defaultPackageFilePath;
     builderOptions.defaultPackagesDirectoryPath = defaultPackagesDirectoryPath;
-    if (analysisServer.options.enablePubSummaryManager) {
-      builderOptions.pubSummaryManager = analysisServer.pubSummaryManager;
-    }
     ContextBuilder builder = new ContextBuilder(resourceProvider,
         analysisServer.sdkManager, analysisServer.overlayState,
         options: builderOptions);
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 5054f7b..519bbfe 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -97,6 +97,12 @@
 const String EDITS = 'edits';
 
 //
+// Diagnostics methods
+//
+const String DIAGNOSTIC_GET_DIAGNOSTICS = 'diagnostic.getDiagnostics';
+const String DIAGNOSTIC_GET_SERVER_PORT = 'diagnostic.getServerPort';
+
+//
 // Analysis option names
 //
 const String ELEMENT = 'element'; // boolean
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 391f299..c8f2ec2 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -149,7 +149,7 @@
     String file = params.file;
 
     if (server.options.enableNewAnalysisDriver) {
-      AnalysisDriver driver = server.getContainingDriver(file);
+      AnalysisDriver driver = server.getAnalysisDriver(file);
       if (driver == null) {
         server.sendResponse(new Response.getNavigationInvalidFile(request));
       } else {
diff --git a/pkg/analysis_server/lib/src/domain_diagnostic.dart b/pkg/analysis_server/lib/src/domain_diagnostic.dart
index d91aacf..738f129 100644
--- a/pkg/analysis_server/lib/src/domain_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/domain_diagnostic.dart
@@ -4,11 +4,13 @@
 
 library analysis_server.src.domain_diagnostic;
 
+import 'dart:async';
 import 'dart:collection';
 import 'dart:core';
 
 import 'package:analysis_server/plugin/protocol/protocol.dart';
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/context/cache.dart';
 import 'package:analyzer/src/context/context.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as nd;
@@ -27,9 +29,6 @@
 /// Instances of the class [DiagnosticDomainHandler] implement a
 /// [RequestHandler] that handles requests in the `diagnostic` domain.
 class DiagnosticDomainHandler implements RequestHandler {
-  /// The name of the request used to get diagnostic information.
-  static const String DIAGNOSTICS = 'diagnostic.getDiagnostics';
-
   /// The analysis server that is using this handler to process requests.
   final AnalysisServer server;
 
@@ -37,7 +36,7 @@
   /// [server].
   DiagnosticDomainHandler(this.server);
 
-  /// Answer the `diagnostic.diagnostics` request.
+  /// Answer the `diagnostic.getDiagnostics` request.
   Response computeDiagnostics(Request request) {
     List<ContextData> contexts = <ContextData>[];
     if (server.options.enableNewAnalysisDriver) {
@@ -101,12 +100,28 @@
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == DIAGNOSTICS) {
+      if (requestName == DIAGNOSTIC_GET_DIAGNOSTICS) {
         return computeDiagnostics(request);
+      } else if (requestName == DIAGNOSTIC_GET_SERVER_PORT) {
+        handleGetServerPort(request);
+        return Response.DELAYED_RESPONSE;
       }
     } on RequestFailure catch (exception) {
       return exception.response;
     }
     return null;
   }
+
+  /// Answer the `diagnostic.getServerPort` request.
+  Future handleGetServerPort(Request request) async {
+    try {
+      // Open a port (or return the existing one).
+      int port = await server.diagnosticServer.getServerPort();
+      server.sendResponse(
+          new DiagnosticGetServerPortResult(port).toResponse(request.id));
+    } catch (error) {
+      server
+          .sendResponse(new Response.debugPortCouldNotBeOpened(request, error));
+    }
+  }
 }
diff --git a/pkg/analysis_server/lib/src/plugin/notification_manager.dart b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
new file mode 100644
index 0000000..7f15024
--- /dev/null
+++ b/pkg/analysis_server/lib/src/plugin/notification_manager.dart
@@ -0,0 +1,387 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+
+import 'package:analysis_server/plugin/protocol/protocol.dart' as server;
+import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/plugin/result_collector.dart';
+import 'package:analysis_server/src/plugin/result_converter.dart';
+import 'package:analysis_server/src/plugin/result_merger.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
+import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
+import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
+
+/**
+ * The object used to coordinate the results of notifications from the analysis
+ * server and multiple plugins.
+ */
+class NotificationManager {
+  /**
+   * The identifier used to identify results from the server.
+   */
+  static const String serverId = 'server';
+
+  /**
+   * The channel used to send notifications to the client.
+   */
+  final ServerCommunicationChannel channel;
+
+  /**
+   * The resource provider used to get the path context.
+   */
+  final ResourceProvider provider;
+
+  /**
+   * A list of the paths of files and directories that are included for analysis.
+   */
+  List<String> includedPaths = <String>[];
+
+  /**
+   * A list of the paths of files and directories that are excluded from
+   * analysis.
+   */
+  List<String> excludedPaths = <String>[];
+
+  /**
+   * The current set of subscriptions to which the client has subscribed.
+   */
+  Map<server.AnalysisService, List<String>> currentSubscriptions =
+      <server.AnalysisService, List<String>>{};
+
+  /**
+   * The collector being used to collect the analysis errors from the plugins.
+   */
+  ResultCollector<List<server.AnalysisError>> errors;
+
+  /**
+   * The collector being used to collect the folding regions from the plugins.
+   */
+  ResultCollector<List<server.FoldingRegion>> folding;
+
+  /**
+   * The collector being used to collect the highlight regions from the plugins.
+   */
+  ResultCollector<List<server.HighlightRegion>> highlights;
+
+  /**
+   * The collector being used to collect the navigation parameters from the
+   * plugins.
+   */
+  ResultCollector<server.AnalysisNavigationParams> navigation;
+
+  /**
+   * The collector being used to collect the occurrences from the plugins.
+   */
+  ResultCollector<List<server.Occurrences>> occurrences;
+
+  /**
+   * The collector being used to collect the outlines from the plugins.
+   */
+  ResultCollector<List<server.Outline>> outlines;
+
+  /**
+   * The object used to convert results.
+   */
+  ResultConverter converter = new ResultConverter();
+
+  /**
+   * The object used to merge results.
+   */
+  ResultMerger merger = new ResultMerger();
+
+  /**
+   * Initialize a newly created notification manager.
+   */
+  NotificationManager(this.channel, this.provider) {
+    errors = new ResultCollector<List<server.AnalysisError>>(serverId,
+        predicate: _isIncluded);
+    folding = new ResultCollector<List<server.FoldingRegion>>(serverId);
+    highlights = new ResultCollector<List<server.HighlightRegion>>(serverId);
+    navigation = new ResultCollector<server.AnalysisNavigationParams>(serverId);
+    occurrences = new ResultCollector<List<server.Occurrences>>(serverId);
+    outlines = new ResultCollector<List<server.Outline>>(serverId);
+  }
+
+  /**
+   * Handle the given [notification] from the plugin with the given [pluginId].
+   */
+  void handlePluginNotification(
+      String pluginId, plugin.Notification notification) {
+    String event = notification.event;
+    switch (event) {
+      case plugin.ANALYSIS_NOTIFICATION_ERRORS:
+        plugin.AnalysisErrorsParams params =
+            new plugin.AnalysisErrorsParams.fromNotification(notification);
+        recordAnalysisErrors(
+            pluginId,
+            params.file,
+            params.errors
+                .map((plugin.AnalysisError error) =>
+                    converter.convertAnalysisError(error))
+                .toList());
+        break;
+      case plugin.ANALYSIS_NOTIFICATION_FOLDING:
+        plugin.AnalysisFoldingParams params =
+            new plugin.AnalysisFoldingParams.fromNotification(notification);
+        recordFoldingRegions(
+            pluginId,
+            params.file,
+            params.regions
+                .map((plugin.FoldingRegion region) =>
+                    converter.convertFoldingRegion(region))
+                .toList());
+        break;
+      case plugin.ANALYSIS_NOTIFICATION_HIGHLIGHTS:
+        plugin.AnalysisHighlightsParams params =
+            new plugin.AnalysisHighlightsParams.fromNotification(notification);
+        recordHighlightRegions(
+            pluginId,
+            params.file,
+            params.regions
+                .map((plugin.HighlightRegion region) =>
+                    converter.convertHighlightRegion(region))
+                .toList());
+        break;
+      case plugin.ANALYSIS_NOTIFICATION_NAVIGATION:
+        plugin.AnalysisNavigationParams params =
+            new plugin.AnalysisNavigationParams.fromNotification(notification);
+        recordNavigationParams(pluginId, params.file,
+            converter.convertAnalysisNavigationParams(params));
+        break;
+      case plugin.ANALYSIS_NOTIFICATION_OCCURRENCES:
+        plugin.AnalysisOccurrencesParams params =
+            new plugin.AnalysisOccurrencesParams.fromNotification(notification);
+        recordOccurrences(
+            pluginId,
+            params.file,
+            params.occurrences
+                .map((plugin.Occurrences occurrences) =>
+                    converter.convertOccurrences(occurrences))
+                .toList());
+        break;
+      case plugin.ANALYSIS_NOTIFICATION_OUTLINE:
+        plugin.AnalysisOutlineParams params =
+            new plugin.AnalysisOutlineParams.fromNotification(notification);
+        recordOutlines(
+            pluginId,
+            params.file,
+            params.outline
+                .map((plugin.Outline outline) =>
+                    converter.convertOutline(outline))
+                .toList());
+        break;
+    }
+  }
+
+  /**
+   * Record error information from the plugin with the given [pluginId] for the
+   * file with the given [filePath].
+   */
+  void recordAnalysisErrors(
+      String pluginId, String filePath, List<server.AnalysisError> errorData) {
+    if (errors.isCollectingFor(filePath)) {
+      errors.putResults(filePath, pluginId, errorData);
+      List<List<server.AnalysisError>> unmergedErrors =
+          errors.getResults(filePath);
+      List<server.AnalysisError> mergedErrors =
+          merger.mergeAnalysisErrors(unmergedErrors);
+      channel.sendNotification(
+          new server.AnalysisErrorsParams(filePath, mergedErrors)
+              .toNotification());
+    }
+  }
+
+  /**
+   * Record folding information from the plugin with the given [pluginId] for
+   * the file with the given [filePath].
+   */
+  void recordFoldingRegions(String pluginId, String filePath,
+      List<server.FoldingRegion> foldingData) {
+    if (folding.isCollectingFor(filePath)) {
+      folding.putResults(filePath, pluginId, foldingData);
+      List<List<server.FoldingRegion>> unmergedFolding =
+          folding.getResults(filePath);
+      List<server.FoldingRegion> mergedFolding =
+          merger.mergeFoldingRegions(unmergedFolding);
+      channel.sendNotification(
+          new server.AnalysisFoldingParams(filePath, mergedFolding)
+              .toNotification());
+    }
+  }
+
+  /**
+   * Record highlight information from the plugin with the given [pluginId] for
+   * the file with the given [filePath].
+   */
+  void recordHighlightRegions(String pluginId, String filePath,
+      List<server.HighlightRegion> highlightData) {
+    if (highlights.isCollectingFor(filePath)) {
+      highlights.putResults(filePath, pluginId, highlightData);
+      List<List<server.HighlightRegion>> unmergedHighlights =
+          highlights.getResults(filePath);
+      List<server.HighlightRegion> mergedHighlights =
+          merger.mergeHighlightRegions(unmergedHighlights);
+      channel.sendNotification(
+          new server.AnalysisHighlightsParams(filePath, mergedHighlights)
+              .toNotification());
+    }
+  }
+
+  /**
+   * Record navigation information from the plugin with the given [pluginId] for
+   * the file with the given [filePath].
+   */
+  void recordNavigationParams(String pluginId, String filePath,
+      server.AnalysisNavigationParams navigationData) {
+    if (navigation.isCollectingFor(filePath)) {
+      navigation.putResults(filePath, pluginId, navigationData);
+      List<server.AnalysisNavigationParams> unmergedNavigations =
+          navigation.getResults(filePath);
+      server.AnalysisNavigationParams mergedNavigations =
+          merger.mergeNavigation(unmergedNavigations);
+      channel.sendNotification(mergedNavigations.toNotification());
+    }
+  }
+
+  /**
+   * Record occurrences information from the plugin with the given [pluginId]
+   * for the file with the given [filePath].
+   */
+  void recordOccurrences(String pluginId, String filePath,
+      List<server.Occurrences> occurrencesData) {
+    if (occurrences.isCollectingFor(filePath)) {
+      occurrences.putResults(filePath, pluginId, occurrencesData);
+      List<List<server.Occurrences>> unmergedOccurrences =
+          occurrences.getResults(filePath);
+      List<server.Occurrences> mergedOccurrences =
+          merger.mergeOccurrences(unmergedOccurrences);
+      channel.sendNotification(
+          new server.AnalysisOccurrencesParams(filePath, mergedOccurrences)
+              .toNotification());
+    }
+  }
+
+  /**
+   * Record outline information from the plugin with the given [pluginId] for
+   * the file with the given [filePath].
+   */
+  void recordOutlines(
+      String pluginId, String filePath, List<server.Outline> outlineData) {
+    if (outlines.isCollectingFor(filePath)) {
+      outlines.putResults(filePath, pluginId, outlineData);
+      List<List<server.Outline>> unmergedOutlines =
+          outlines.getResults(filePath);
+      List<server.Outline> mergedOutlines =
+          merger.mergeOutline(unmergedOutlines);
+      channel.sendNotification(new server.AnalysisOutlineParams(
+              filePath, server.FileKind.LIBRARY, mergedOutlines[0])
+          .toNotification());
+    }
+  }
+
+  /**
+   * Set the lists of [included] and [excluded] files.
+   */
+  void setAnalysisRoots(List<String> included, List<String> excluded) {
+    includedPaths = included;
+    excludedPaths = excluded;
+  }
+
+  /**
+   * Set the current subscriptions to the given set of [newSubscriptions].
+   */
+  void setSubscriptions(
+      Map<server.AnalysisService, List<String>> newSubscriptions) {
+    /**
+     * Return the collector associated with the given service, or `null` if the
+     * service is not handled by this manager.
+     */
+    ResultCollector collectorFor(server.AnalysisService service) {
+      switch (service) {
+        case server.AnalysisService.FOLDING:
+          return folding;
+        case server.AnalysisService.HIGHLIGHTS:
+          return highlights;
+        case server.AnalysisService.NAVIGATION:
+          return navigation;
+        case server.AnalysisService.OCCURRENCES:
+          return occurrences;
+        case server.AnalysisService.OUTLINE:
+          return outlines;
+      }
+      return null;
+    }
+
+    Set<server.AnalysisService> services =
+        new HashSet<server.AnalysisService>();
+    services.addAll(currentSubscriptions.keys);
+    services.addAll(newSubscriptions.keys);
+    services.forEach((server.AnalysisService service) {
+      ResultCollector collector = collectorFor(service);
+      if (collector != null) {
+        List<String> currentPaths = currentSubscriptions[service];
+        List<String> newPaths = newSubscriptions[service];
+        if (currentPaths == null) {
+          if (newPaths == null) {
+            // This should not happen.
+            return;
+          }
+          // All of the [newPaths] need to be added.
+          newPaths.forEach((String filePath) {
+            collector.startCollectingFor(filePath);
+          });
+        } else if (newPaths == null) {
+          // All of the [currentPaths] need to be removed.
+          currentPaths.forEach((String filePath) {
+            collector.stopCollectingFor(filePath);
+          });
+        } else {
+          // Compute the difference of the two sets.
+          newPaths.forEach((String filePath) {
+            if (!currentPaths.contains(filePath)) {
+              collector.startCollectingFor(filePath);
+            }
+          });
+          currentPaths.forEach((String filePath) {
+            if (!newPaths.contains(filePath)) {
+              collector.stopCollectingFor(filePath);
+            }
+          });
+        }
+      }
+    });
+    currentSubscriptions = newSubscriptions;
+  }
+
+  /**
+   * Return `true` if errors should be collected for the file with the given
+   * [path] (because it is being analyzed).
+   */
+  bool _isIncluded(String path) {
+    bool isIncluded() {
+      for (String includedPath in includedPaths) {
+        if (provider.pathContext.isWithin(includedPath, path) ||
+            provider.pathContext.equals(includedPath, path)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    bool isExcluded() {
+      for (String excludedPath in excludedPaths) {
+        if (provider.pathContext.isWithin(excludedPath, path)) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    // TODO(brianwilkerson) Return false if error notifications are globally
+    // disabled.
+    return isIncluded() && !isExcluded();
+  }
+}
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 596b873..277c5b5 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -133,9 +133,7 @@
  * Create a Location based on an [engine.Element].
  */
 Location newLocation_fromElement(engine.Element element) {
-  engine.AnalysisContext context = element.context;
-  engine.Source source = element.source;
-  if (context == null || source == null) {
+  if (element == null || element.source == null) {
     return null;
   }
   int offset = element.nameOffset;
@@ -145,17 +143,17 @@
     offset = 0;
     length = 0;
   }
+  engine.CompilationUnitElement unitElement = _getUnitElement(element);
   engine.SourceRange range = new engine.SourceRange(offset, length);
-  return _locationForArgs(context, source, range);
+  return _locationForArgs(unitElement, range);
 }
 
 /**
  * Create a Location based on an [engine.SearchMatch].
  */
 Location newLocation_fromMatch(engine.SearchMatch match) {
-  engine.Element enclosingElement = match.element;
-  return _locationForArgs(
-      enclosingElement.context, enclosingElement.source, match.sourceRange);
+  engine.CompilationUnitElement unitElement = _getUnitElement(match.element);
+  return _locationForArgs(unitElement, match.sourceRange);
 }
 
 /**
@@ -165,10 +163,8 @@
   engine.CompilationUnit unit =
       node.getAncestor((node) => node is engine.CompilationUnit);
   engine.CompilationUnitElement unitElement = unit.element;
-  engine.AnalysisContext context = unitElement.context;
-  engine.Source source = unitElement.source;
   engine.SourceRange range = new engine.SourceRange(node.offset, node.length);
-  return _locationForArgs(context, source, range);
+  return _locationForArgs(unitElement, range);
 }
 
 /**
@@ -176,10 +172,7 @@
  */
 Location newLocation_fromUnit(
     engine.CompilationUnit unit, engine.SourceRange range) {
-  engine.CompilationUnitElement unitElement = unit.element;
-  engine.AnalysisContext context = unitElement.context;
-  engine.Source source = unitElement.source;
-  return _locationForArgs(context, source, range);
+  return _locationForArgs(unit.element, range);
 }
 
 /**
@@ -250,15 +243,33 @@
   return path;
 }
 
+engine.CompilationUnitElement _getUnitElement(engine.Element element) {
+  if (element is engine.CompilationUnitElement) {
+    return element;
+  }
+  if (element?.enclosingElement is engine.LibraryElement) {
+    element = element.enclosingElement;
+  }
+  if (element is engine.LibraryElement) {
+    return element.definingCompilationUnit;
+  }
+  for (; element != null; element = element.enclosingElement) {
+    if (element is engine.CompilationUnitElement) {
+      return element;
+    }
+  }
+  return null;
+}
+
 /**
  * Creates a new [Location].
  */
-Location _locationForArgs(engine.AnalysisContext context, engine.Source source,
-    engine.SourceRange range) {
+Location _locationForArgs(
+    engine.CompilationUnitElement unitElement, engine.SourceRange range) {
   int startLine = 0;
   int startColumn = 0;
   try {
-    engine.LineInfo lineInfo = context.computeLineInfo(source);
+    engine.LineInfo lineInfo = unitElement.lineInfo;
     if (lineInfo != null) {
       engine.LineInfo_Location offsetLocation =
           lineInfo.getLocation(range.offset);
@@ -266,6 +277,6 @@
       startColumn = offsetLocation.columnNumber;
     }
   } on AnalysisException {}
-  return new Location(
-      source.fullName, range.offset, range.length, startLine, startColumn);
+  return new Location(unitElement.source.fullName, range.offset, range.length,
+      startLine, startColumn);
 }
diff --git a/pkg/analysis_server/lib/src/server/diagnostic_server.dart b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
new file mode 100644
index 0000000..b147a43
--- /dev/null
+++ b/pkg/analysis_server/lib/src/server/diagnostic_server.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+/**
+ * A handle to start, and return the current port of, a diagnostic server.
+ */
+abstract class DiagnosticServer {
+  /**
+   * Return the port of the diagnostic web server. If the server is not running
+   * this call will start the server.
+   */
+  Future<int> getServerPort();
+}
diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index ea6074e..bc6baf2 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -11,6 +11,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/provisional/completion/dart/completion_plugin.dart';
+import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/server/http_server.dart';
 import 'package:analysis_server/src/server/stdio_server.dart';
 import 'package:analysis_server/src/socket_server.dart';
@@ -248,11 +249,6 @@
       'disable-new-analysis-driver';
 
   /**
-   * The name of the option used to enable using pub summary manager.
-   */
-  static const String ENABLE_PUB_SUMMARY_MANAGER = 'enable-pub-summary-manager';
-
-  /**
    * The name of the option used to enable fined grained invalidation.
    */
   static const String FINER_GRAINED_INVALIDATION = 'finer-grained-invalidation';
@@ -376,9 +372,9 @@
     int port;
     bool serve_http = false;
     if (results[PORT_OPTION] != null) {
-      serve_http = true;
       try {
         port = int.parse(results[PORT_OPTION]);
+        serve_http = true;
       } on FormatException {
         print('Invalid port number: ${results[PORT_OPTION]}');
         print('');
@@ -395,8 +391,6 @@
         results[INCREMENTAL_RESOLUTION_VALIDATION];
     analysisServerOptions.enableNewAnalysisDriver =
         !results[DISABLE_NEW_ANALYSIS_DRIVER];
-    analysisServerOptions.enablePubSummaryManager =
-        results[ENABLE_PUB_SUMMARY_MANAGER];
     analysisServerOptions.finerGrainedInvalidation =
         results[FINER_GRAINED_INVALIDATION];
     analysisServerOptions.noErrorNotification = results[NO_ERROR_NOTIFICATION];
@@ -451,11 +445,18 @@
               [instrumentationServer, fileBasedServer])
           : fileBasedServer;
     }
-    InstrumentationService service =
+    InstrumentationService instrumentationService =
         new InstrumentationService(instrumentationServer);
-    service.logVersion(_readUuid(service), results[CLIENT_ID],
-        results[CLIENT_VERSION], AnalysisServer.VERSION, defaultSdk.sdkVersion);
-    AnalysisEngine.instance.instrumentationService = service;
+    instrumentationService.logVersion(
+        _readUuid(instrumentationService),
+        results[CLIENT_ID],
+        results[CLIENT_VERSION],
+        AnalysisServer.VERSION,
+        defaultSdk.sdkVersion);
+    AnalysisEngine.instance.instrumentationService = instrumentationService;
+
+    _DiagnosticServerImpl diagnosticServer = new _DiagnosticServerImpl();
+
     //
     // Create the sockets and start listening for requests.
     //
@@ -463,7 +464,8 @@
         analysisServerOptions,
         new DartSdkManager(defaultSdkPath, useSummaries),
         defaultSdk,
-        service,
+        instrumentationService,
+        diagnosticServer,
         serverPlugin,
         fileResolverProvider,
         packageResolverProvider,
@@ -472,16 +474,17 @@
     stdioServer = new StdioAnalysisServer(socketServer);
     socketServer.userDefinedPlugins = _userDefinedPlugins;
 
+    diagnosticServer.httpServer = httpServer;
     if (serve_http) {
-      httpServer.serveHttp(port);
+      diagnosticServer.startOnPort(port);
     }
 
-    _captureExceptions(service, () {
+    _captureExceptions(instrumentationService, () {
       stdioServer.serveStdio().then((_) async {
         if (serve_http) {
           httpServer.close();
         }
-        await service.shutdown();
+        await instrumentationService.shutdown();
         exit(0);
       });
     },
@@ -548,10 +551,6 @@
         help: "disable using new analysis driver",
         defaultsTo: false,
         negatable: false);
-    parser.addFlag(ENABLE_PUB_SUMMARY_MANAGER,
-        help: "enable using summaries for pub cache packages",
-        defaultsTo: false,
-        negatable: false);
     parser.addFlag(FINER_GRAINED_INVALIDATION,
         help: "enable finer grained invalidation",
         defaultsTo: false,
@@ -662,3 +661,19 @@
     }
   }
 }
+
+/**
+ * Implements the [DiagnosticServer] class by wrapping an [HttpAnalysisServer].
+ */
+class _DiagnosticServerImpl extends DiagnosticServer {
+  HttpAnalysisServer httpServer;
+
+  _DiagnosticServerImpl();
+
+  Future startOnPort(int port) {
+    return httpServer.serveHttp(port);
+  }
+
+  @override
+  Future<int> getServerPort() => httpServer.serveHttp();
+}
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index 85c3557..48057fd 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -14,8 +14,10 @@
 
 /**
  * Instances of the class [HttpServer] implement a simple HTTP server. The
- * primary responsibility of this server is to listen for an UPGRADE request and
- * to start an analysis server.
+ * server:
+ *
+ * - listens for an UPGRADE request in order to start an analysis server
+ * - serves diagnostic information as html pages
  */
 class HttpAnalysisServer {
   /**
@@ -49,6 +51,11 @@
    */
   HttpAnalysisServer(this.socketServer);
 
+  /**
+   * Return the port this server is bound to.
+   */
+  Future<int> get boundPort async => (await _server)?.port;
+
   void close() {
     _server.then((HttpServer server) {
       server.close();
@@ -69,9 +76,20 @@
   /**
    * Begin serving HTTP requests over the given port.
    */
-  void serveHttp(int port) {
-    _server = HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port);
-    _server.then(_handleServer).catchError((_) {/* Ignore errors. */});
+  Future<int> serveHttp([int initialPort]) async {
+    if (_server != null) {
+      return boundPort;
+    }
+
+    try {
+      _server =
+          HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, initialPort ?? 0);
+      HttpServer server = await _server;
+      _handleServer(server);
+      return server.port;
+    } catch (ignore) {
+      return null;
+    }
   }
 
   /**
@@ -111,6 +129,8 @@
    * running an analysis server on a [WebSocket]-based communication channel.
    */
   void _handleWebSocket(WebSocket socket) {
+    // TODO(devoncarew): This serves the analysis server over a websocket
+    // connection for historical reasons (and should probably be removed).
     socketServer.createAnalysisServer(new WebSocketServerChannel(
         socket, socketServer.instrumentationService));
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/assist.dart b/pkg/analysis_server/lib/src/services/correction/assist.dart
index a1a5387..fe1a01b 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist.dart
@@ -119,6 +119,10 @@
       "Join 'if' statement with outer 'if' statement");
   static const JOIN_VARIABLE_DECLARATION = const AssistKind(
       'JOIN_VARIABLE_DECLARATION', 30, "Join variable declaration");
+  static const REPARENT_FLUTTER_LIST = const AssistKind(
+      "REPARENT_FLUTTER_LIST", 30, "Wrap widget list with new widget");
+  static const REPARENT_FLUTTER_WIDGET = const AssistKind(
+      "REPARENT_FLUTTER_WIDGET", 30, "Wrap new-expression with new widget");
   static const REMOVE_TYPE_ANNOTATION =
       const AssistKind('REMOVE_TYPE_ANNOTATION', 29, "Remove type annotation");
   static const REPLACE_CONDITIONAL_WITH_IF_ELSE = const AssistKind(
diff --git a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
index 28d6f8f..a313eb7 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -36,6 +36,10 @@
  * The computer for Dart assists.
  */
 class AssistProcessor {
+  static const FLUTTER_WIDGET_NAME = "Widget";
+  static const FLUTTER_WIDGET_URI =
+      "package:flutter/src/widgets/framework.dart";
+
   AnalysisContext analysisContext;
 
   Source source;
@@ -133,6 +137,8 @@
     _addProposal_joinVariableDeclaration_onAssignment();
     _addProposal_joinVariableDeclaration_onDeclaration();
     _addProposal_removeTypeAnnotation();
+    _addProposal_reparentFlutterList();
+    _addProposal_reparentFlutterWidget();
     _addProposal_replaceConditionalWithIfElse();
     _addProposal_replaceIfElseWithConditional();
     _addProposal_splitAndCondition();
@@ -1595,6 +1601,100 @@
     _addAssist(DartAssistKind.REMOVE_TYPE_ANNOTATION, []);
   }
 
+  void _addProposal_reparentFlutterList() {
+    if (node is! ListLiteral) {
+      return;
+    }
+    if ((node as ListLiteral).elements.any((Expression exp) =>
+        !(exp is InstanceCreationExpression &&
+            _isFlutterInstanceCreationExpression(exp)))) {
+      _coverageMarker();
+      return;
+    }
+    String literalSrc = utils.getNodeText(node);
+    SourceBuilder sb = new SourceBuilder(file, node.offset);
+    int newlineIdx = literalSrc.lastIndexOf(eol);
+    if (newlineIdx < 0 || newlineIdx == literalSrc.length - 1) {
+      _coverageMarker();
+      return; // Lists need to be in multi-line format already.
+    }
+    String indentOld = utils.getLinePrefix(node.offset + 1 + newlineIdx);
+    String indentArg = '$indentOld${utils.getIndent(1)}';
+    String indentList = '$indentOld${utils.getIndent(2)}';
+    sb.append('[');
+    sb.append(eol);
+    sb.append(indentArg);
+    sb.append('new ');
+    sb.startPosition('WIDGET');
+    sb.append('widget');
+    sb.endPosition();
+    sb.append('(');
+    sb.append(eol);
+    sb.append(indentList);
+    // Linked editing not needed since arg is always a list.
+    sb.append('children: ');
+    sb.append(literalSrc.replaceAll(
+        new RegExp("^$indentOld", multiLine: true), "$indentList"));
+    sb.append(',');
+    sb.append(eol);
+    sb.append(indentArg);
+    sb.append('),');
+    sb.append(eol);
+    sb.append(indentOld);
+    sb.append(']');
+    exitPosition = _newPosition(sb.offset + sb.length);
+    _insertBuilder(sb, literalSrc.length);
+    _addAssist(DartAssistKind.REPARENT_FLUTTER_LIST, []);
+  }
+
+  void _addProposal_reparentFlutterWidget() {
+    InstanceCreationExpression newExpr;
+    if (node is SimpleIdentifier) {
+      if (node.parent is ConstructorName &&
+          node.parent.parent is InstanceCreationExpression) {
+        newExpr = node.parent.parent;
+      } else if (node.parent?.parent is ConstructorName &&
+          node.parent.parent?.parent is InstanceCreationExpression) {
+        newExpr = node.parent.parent.parent;
+      }
+    } else if (node is InstanceCreationExpression) {
+      newExpr = node;
+    }
+    if (newExpr == null || !_isFlutterInstanceCreationExpression(newExpr)) {
+      _coverageMarker();
+      return;
+    }
+    String newExprSrc = utils.getNodeText(newExpr);
+    SourceBuilder sb = new SourceBuilder(file, newExpr.offset);
+    sb.append('new ');
+    sb.startPosition('WIDGET');
+    sb.append('widget');
+    sb.endPosition();
+    sb.append('(');
+    if (newExprSrc.contains(eol)) {
+      int newlineIdx = newExprSrc.lastIndexOf(eol);
+      if (newlineIdx == newExprSrc.length - 1) {
+        newlineIdx -= 1;
+      }
+      String indentOld = utils.getLinePrefix(newExpr.offset + 1 + newlineIdx);
+      String indentNew = '$indentOld${utils.getIndent(1)}';
+      sb.append(eol);
+      sb.append(indentNew);
+      newExprSrc = newExprSrc.replaceAll(
+          new RegExp("^$indentOld", multiLine: true), "$indentNew");
+      newExprSrc += ",$eol$indentOld";
+    }
+    sb.startPosition('CHILD');
+    sb.append('child');
+    sb.endPosition();
+    sb.append(': ');
+    sb.append(newExprSrc);
+    sb.append(')');
+    exitPosition = _newPosition(sb.offset + sb.length);
+    _insertBuilder(sb, newExpr.length);
+    _addAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET, []);
+  }
+
   void _addProposal_replaceConditionalWithIfElse() {
     ConditionalExpression conditional = null;
     // may be on Statement with Conditional
@@ -2196,6 +2296,24 @@
     }
   }
 
+  bool _isFlutterInstanceCreationExpression(
+      InstanceCreationExpression newExpr) {
+    ClassElement classElement = newExpr.staticElement?.enclosingElement;
+    InterfaceType superType = classElement?.allSupertypes?.firstWhere(
+        (InterfaceType type) => FLUTTER_WIDGET_NAME == type.name,
+        orElse: () => null);
+    if (superType == null) {
+      _coverageMarker();
+      return false;
+    }
+    Uri uri = superType.element?.source?.uri;
+    if (uri.toString() != FLUTTER_WIDGET_URI) {
+      _coverageMarker();
+      return false;
+    }
+    return true;
+  }
+
   Position _newPosition(int offset) {
     return new Position(file, offset);
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 124621e..db04b8a 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -123,6 +123,8 @@
       "Add optional positional parameter");
   static const ADD_MISSING_PARAMETER_REQUIRED = const FixKind(
       'ADD_MISSING_PARAMETER_REQUIRED', 30, "Add required parameter");
+  static const ADD_MISSING_REQUIRED_ARGUMENT = const FixKind(
+      'ADD_MISSING_REQUIRED_ARGUMENT', 30, "Add required argument");
   static const ADD_NE_NULL = const FixKind('ADD_NE_NULL', 50, "Add != null");
   static const ADD_PACKAGE_DEPENDENCY = const FixKind(
       'ADD_PACKAGE_DEPENDENCY', 50, "Add dependency on package '{0}'");
diff --git a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
index c823e4e..eb45caf 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -267,6 +267,9 @@
       _addFix_createConstructor_insteadOfSyntheticDefault();
       await _addFix_addMissingParameter();
     }
+    if (errorCode == HintCode.MISSING_REQUIRED_PARAM) {
+      _addFix_addMissingRequiredArgument();
+    }
     if (errorCode == StaticWarningCode.FUNCTION_WITHOUT_CALL) {
       _addFix_addMissingMethodCall();
     }
@@ -549,6 +552,57 @@
     }
   }
 
+  void _addFix_addMissingRequiredArgument() {
+    Element targetElement;
+    ArgumentList argumentList;
+
+    if (node is SimpleIdentifier) {
+      AstNode invocation = node.parent;
+      if (invocation is MethodInvocation) {
+        targetElement = invocation.methodName.bestElement;
+        argumentList = invocation.argumentList;
+      } else {
+        AstNode ancestor =
+            invocation.getAncestor((p) => p is InstanceCreationExpression);
+        if (ancestor is InstanceCreationExpression) {
+          targetElement = ancestor.staticElement;
+          argumentList = ancestor.argumentList;
+        }
+      }
+    }
+
+    if (targetElement is ExecutableElement) {
+      List<Expression> args = argumentList.arguments;
+      List<String> namedArgs = args
+          .where((e) => e is NamedExpression)
+          .map((e) => (e as NamedExpression).name.label.name)
+          .toList(growable: false);
+
+      List<ParameterElement> missingParams = targetElement.parameters
+          .where((p) => p.isRequired && !namedArgs.contains(p.name))
+          .toList(growable: false);
+      if (missingParams.isEmpty) {
+        return;
+      }
+
+      // add proposal
+
+      SourceBuilder sb;
+
+      if (args.isEmpty) {
+        sb = new SourceBuilder(file, argumentList.leftParenthesis.end);
+      } else {
+        sb = new SourceBuilder(file, args.last.end);
+        sb.append(', ');
+      }
+
+      sb.append(missingParams.map((p) => '${p.name}: null').join(', '));
+
+      _insertBuilder(sb, targetElement);
+      _addFix(DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT, []);
+    }
+  }
+
   void _addFix_boolInsteadOfBoolean() {
     SourceRange range = rf.rangeError(error);
     _addReplaceEdit(range, 'bool');
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 887e1b7..183b11d 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/plugin/server_plugin.dart';
+import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/index/index.dart';
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/instrumentation/instrumentation.dart';
@@ -32,6 +33,7 @@
 
   final DartSdk defaultSdk;
   final InstrumentationService instrumentationService;
+  final DiagnosticServer diagnosticServer;
   final ServerPlugin serverPlugin;
   final ResolverProvider fileResolverProvider;
   final ResolverProvider packageResolverProvider;
@@ -53,6 +55,7 @@
       this.sdkManager,
       this.defaultSdk,
       this.instrumentationService,
+      this.diagnosticServer,
       this.serverPlugin,
       this.fileResolverProvider,
       this.packageResolverProvider,
@@ -98,6 +101,7 @@
         analysisServerOptions,
         sdkManager,
         instrumentationService,
+        diagnosticServer: diagnosticServer,
         fileResolverProvider: fileResolverProvider,
         packageResolverProvider: packageResolverProvider,
         useSingleContextManager: useSingleContextManager,
diff --git a/pkg/analysis_server/lib/src/status/get_handler2.dart b/pkg/analysis_server/lib/src/status/get_handler2.dart
index fc181055..78a3998 100644
--- a/pkg/analysis_server/lib/src/status/get_handler2.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler2.dart
@@ -27,6 +27,7 @@
 import 'package:analyzer/src/generated/utilities_general.dart';
 import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/task/model.dart';
+import 'package:path/path.dart' as path;
 import 'package:plugin/plugin.dart';
 
 /**
@@ -197,8 +198,7 @@
       return _returnFailure(request, 'Analysis server is not running');
     }
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Analysis Performance', [],
-          (StringBuffer buffer) {
+      _writePage(buffer, 'Analysis Performance', [], (StringBuffer buffer) {
         buffer.write('<h3>Analysis Performance</h3>');
         _writeTwoColumns(buffer, (StringBuffer buffer) {
           //
@@ -287,7 +287,7 @@
       return _returnFailure(request, 'Analysis server is not running');
     }
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Communication Performance', [],
+      _writePage(buffer, 'Communication Performance', [],
           (StringBuffer buffer) {
         buffer.write('<h3>Communication Performance</h3>');
         _writeTwoColumns(buffer, (StringBuffer buffer) {
@@ -353,8 +353,7 @@
     String value = request.requestedUri.queryParameters['index'];
     int index = value != null ? int.parse(value, onError: (_) => 0) : 0;
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Completion Stats', [],
-          (StringBuffer buffer) {
+      _writePage(buffer, 'Completion Stats', [], (StringBuffer buffer) {
         _writeCompletionPerformanceDetail(buffer, index);
         _writeCompletionPerformanceList(buffer);
       });
@@ -446,8 +445,8 @@
     }
 
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(
-          buffer, 'Analysis Server - Context', ['Context: $contextFilter'],
+      String contextName = path.basename(contextFilter);
+      _writePage(buffer, 'Context: $contextName', [contextFilter],
           (StringBuffer buffer) {
         buffer.write('<h3>Configuration</h3>');
 
@@ -539,8 +538,7 @@
 
   void _returnFailure(HttpRequest request, String message) {
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Failure', [],
-          (StringBuffer buffer) {
+      _writePage(buffer, 'Failure', [], (StringBuffer buffer) {
         buffer.write(HTML_ESCAPE.convert(message));
       });
     });
@@ -554,8 +552,7 @@
     String contents = _overlayContents[path];
 
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Overlay', [],
-          (StringBuffer buffer) {
+      _writePage(buffer, 'Overlay', [], (StringBuffer buffer) {
         buffer.write('<pre>${HTML_ESCAPE.convert(contents)}</pre>');
       });
     });
@@ -571,8 +568,7 @@
     }
 
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Overlays', [],
-          (StringBuffer buffer) {
+      _writePage(buffer, 'Overlay information', [], (StringBuffer buffer) {
         buffer.write('<table border="1">');
         _overlayContents.clear();
         ContentCache overlayState = analysisServer.overlayState;
@@ -585,7 +581,7 @@
           _overlayContents[fullName] = contents;
         });
         int count = _overlayContents.length;
-        buffer.write('<tr><td colspan="2">Total: $count entries.</td></tr>');
+        buffer.write('<tr><td colspan="2">Total: $count entries</td></tr>');
         buffer.write('</table>');
       });
     });
@@ -596,7 +592,7 @@
    */
   void _returnServerStatus(HttpRequest request) {
     _writeResponse(request, (StringBuffer buffer) {
-      _writePage(buffer, 'Analysis Server - Status', [], (StringBuffer buffer) {
+      _writePage(buffer, 'Status', [], (StringBuffer buffer) {
         if (_writeServerStatus(buffer)) {
           _writeAnalysisStatus(buffer);
           _writeEditStatus(buffer);
@@ -636,12 +632,7 @@
    * Return a two digit decimal representation of the given non-negative integer
    * [value].
    */
-  String _twoDigit(int value) {
-    if (value < 10) {
-      return '0$value';
-    }
-    return value.toString();
-  }
+  String _twoDigit(int value) => value.toString().padLeft(2, '0');
 
   /**
    * Write the status of the analysis domain (on the main status page) to the
@@ -659,12 +650,9 @@
       buffer.write('<p>Using package resolver provider: ');
       buffer.write(_server.packageResolverProvider != null);
       buffer.write('</p>');
-      buffer.write('<p>');
-      buffer.write(makeLink(OVERLAYS_PATH, {}, 'All overlay information'));
-      buffer.write('</p>');
+      buffer.write(makeLink(OVERLAYS_PATH, {}, 'Overlay information'));
 
       buffer.write('<p><b>Analysis Contexts</b></p>');
-      buffer.write('<p>');
       bool first = true;
       folders.forEach((Folder folder) {
         if (first) {
@@ -676,19 +664,19 @@
         buffer.write(makeLink(CONTEXT_PATH, {CONTEXT_QUERY_PARAM: folder.path},
             key, _hasException(driverMap[folder])));
         if (!folder.getChild('.packages').exists) {
-          buffer.write(' <small>[no .packages file]</small>');
+          buffer.write(' [no .packages file]');
         }
       });
-      buffer.write('</p>');
 
       int freq = AnalysisServer.performOperationDelayFrequency;
       String delay = freq > 0 ? '1 ms every $freq ms' : 'off';
 
       buffer.write('<p><b>Performance Data</b></p>');
-      buffer.write('<p>Perform operation delay: $delay</p>');
-      buffer.write('<p>');
-      buffer.write(makeLink(ANALYSIS_PERFORMANCE_PATH, {}, 'Task data'));
-      buffer.write('</p>');
+      buffer.write(
+          makeLink(ANALYSIS_PERFORMANCE_PATH, {}, 'Analysis performance'));
+      buffer.write('<br>');
+      buffer.write('Perform operation delay: $delay');
+      buffer.write('<br>');
     }, (StringBuffer buffer) {
       _writeSubscriptionMap(
           buffer, AnalysisService.VALUES, analysisServer.analysisServices);
@@ -821,10 +809,7 @@
   void _writeEditStatus(StringBuffer buffer) {
     buffer.write('<h3>Edit Domain</h3>');
     _writeTwoColumns(buffer, (StringBuffer buffer) {
-      buffer.write('<p><b>Performance Data</b></p>');
-      buffer.write('<p>');
-      buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion data'));
-      buffer.write('</p>');
+      buffer.write(makeLink(COMPLETION_PATH, {}, 'Completion stats'));
     }, (StringBuffer buffer) {});
   }
 
@@ -879,8 +864,10 @@
     if (handler != null) {
       buffer.write('<h3>Execution Domain</h3>');
       _writeTwoColumns(buffer, (StringBuffer buffer) {
+        buffer.write('<br>');
+      }, (StringBuffer buffer) {
         _writeSubscriptionList(buffer, ExecutionService.VALUES, services);
-      }, (StringBuffer buffer) {});
+      });
     }
   }
 
@@ -939,7 +926,7 @@
     buffer.write('<meta charset="utf-8">');
     buffer.write(
         '<meta name="viewport" content="width=device-width, initial-scale=1.0">');
-    buffer.write('<title>$title</title>');
+    buffer.write('<title>Analysis Server</title>');
     buffer.write('<style>');
     buffer.write('a {color: #0000DD; text-decoration: none;}');
     buffer.write('a:link.error {background-color: #FFEEEE;}');
@@ -947,8 +934,10 @@
     buffer.write('a:hover.error {background-color: #FFEEEE;}');
     buffer.write('a:active.error {background-color: #FFEEEE;}');
     buffer.write(
-        'h3 {background-color: #DDDDDD; margin-top: 0em; margin-bottom: 0em;}');
-    buffer.write('p {margin-top: 0.5em; margin-bottom: 0.5em;}');
+        'div.subtitle {float: right; font-weight: normal; font-size: 1rem;}');
+    buffer.write('h2 {margin-top: 0;}');
+    buffer.write('h3 {border-bottom: 1px #DDD solid; margin-bottom: 0em;}');
+    buffer.write('p {margin-top: 0.5em; margin-bottom: 0;}');
     buffer.write(
         'p.commentary {margin-top: 1em; margin-bottom: 1em; margin-left: 2em; font-style: italic;}');
 //    response.write('span.error {text-decoration-line: underline; text-decoration-color: red; text-decoration-style: wavy;}');
@@ -962,10 +951,8 @@
     buffer.write('</head>');
 
     buffer.write('<body>');
-    buffer.write(
-        '<h2>$title <small><small>(as of $time on $date)</small></small></h2>');
+    buffer.write('<h2>$title <div class="subtitle">$date, $time</div></h2>');
     if (subtitles != null && subtitles.isNotEmpty) {
-      buffer.write('<blockquote>');
       bool first = true;
       for (String subtitle in subtitles) {
         if (first) {
@@ -977,7 +964,6 @@
         buffer.write(subtitle);
         buffer.write('</b>');
       }
-      buffer.write('</blockquote>');
     }
     try {
       body(buffer);
@@ -1069,7 +1055,11 @@
       } else {
         buffer.write('<td$classAttribute>');
       }
-      buffer.write(columns[i]);
+      if (columns[i] is int) {
+        buffer.write(_writeWithSeparators(columns[i]));
+      } else {
+        buffer.write(columns[i]);
+      }
       if (header) {
         buffer.write('</th>');
       } else {
@@ -1089,11 +1079,11 @@
 
     buffer.write('<h3>Server Domain</h3>');
     _writeTwoColumns(buffer, (StringBuffer buffer) {
+      buffer.write('<p><b>State</b></p>');
       if (analysisServer == null) {
         buffer.write('Status: <span style="color:red">Not running</span>');
         return;
       }
-      buffer.write('<p>');
       buffer.write('Status: Running<br>');
       buffer.write('New analysis driver: ');
       buffer.write(analysisServer.options.enableNewAnalysisDriver);
@@ -1105,23 +1095,17 @@
         buffer.write('Inactive');
       }
       buffer.write('<br>');
-      buffer.write('Server version: ');
-      buffer.write(AnalysisServer.VERSION);
-      buffer.write('<br>');
-      buffer.write('SDK: ');
-      buffer.write(Platform.version);
-      buffer.write('<br>');
       buffer.write('Process ID: ');
       buffer.write(pid);
-      buffer.write('</p>');
 
       buffer.write('<p><b>Performance Data</b></p>');
-      buffer.write('<p>');
       buffer.write(makeLink(
           COMMUNICATION_PERFORMANCE_PATH, {}, 'Communication performance'));
-      buffer.write('</p>');
     }, (StringBuffer buffer) {
       _writeSubscriptionList(buffer, ServerService.VALUES, services);
+      buffer.write('<p><b>Versions</b></p>');
+      buffer.write('Dart SDK: ${Platform.version}<br>');
+      buffer.write('Analysis server version: ${AnalysisServer.VERSION}<br>');
     });
     return analysisServer != null;
   }
@@ -1166,18 +1150,15 @@
       StringBuffer buffer, Enum service, Set<String> subscribedPaths) {
     buffer.write('<p>');
     buffer.write(service.name);
-    buffer.write('</p>');
-    if (subscribedPaths == null || subscribedPaths.isEmpty) {
-      buffer.write('none');
-    } else {
+    buffer.write('<br>');
+    if (subscribedPaths != null && subscribedPaths.isNotEmpty) {
       List<String> paths = subscribedPaths.toList();
       paths.sort();
       for (String path in paths) {
-        buffer.write('<p>');
-        buffer.write(path);
-        buffer.write('</p>');
+        buffer.write('$path<br>');
       }
     }
+    buffer.write('</p>');
   }
 
   /**
@@ -1189,11 +1170,10 @@
   void _writeSubscriptionList(StringBuffer buffer, List<Enum> allServices,
       Set<Enum> subscribedServices) {
     buffer.write('<p><b>Subscriptions</b></p>');
-    buffer.write('<p>');
     for (Enum service in allServices) {
       _writeSubscriptionInList(buffer, service, subscribedServices);
+      buffer.write('<br>');
     }
-    buffer.write('</p>');
   }
 
   /**
@@ -1238,6 +1218,18 @@
         : new Uri(path: path, queryParameters: params);
     String href = HTML_ESCAPE.convert(uri.toString());
     String classAttribute = hasError ? ' class="error"' : '';
-    return '<a href="$href"$classAttribute>$innerHtml</a>';
+    return '<a href="$href" $classAttribute>$innerHtml</a>';
   }
 }
+
+String _writeWithSeparators(int value) {
+  // TODO(devoncarew): Replace with the implementation from package:intl.
+  String str = value.toString();
+  int pos = 3;
+  while (str.length > pos) {
+    int len = str.length;
+    str = '${str.substring(0, len - pos)},${str.substring(len - pos)}';
+    pos += 4;
+  }
+  return str;
+}
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 0387ddd..a06b946 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -21,4 +21,4 @@
   html: any
   test_reflective_loader: ^0.1.0
   typed_mock: '>=0.0.4 <1.0.0'
-  test: ^0.12.0
+  test: ^0.12.17
diff --git a/pkg/analysis_server/test/analysis/get_navigation_test.dart b/pkg/analysis_server/test/analysis/get_navigation_test.dart
index 085659e..f7558f1 100644
--- a/pkg/analysis_server/test/analysis/get_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis/get_navigation_test.dart
@@ -49,18 +49,6 @@
     return _checkInvalid(file, -1, -1);
   }
 
-  test_fileWithoutContext() {
-    String file = '/outside.dart';
-    addFile(
-        file,
-        '''
-main() {
-  print(42);
-}
-''');
-    return _checkInvalid(file, -1, -1);
-  }
-
   test_importDirective() async {
     addTestFile('''
 import 'dart:math';
@@ -258,4 +246,17 @@
     generateSummaryFiles = true;
     super.setUp();
   }
+
+  test_fileOutsideOfRoot() async {
+    testFile = '/outside.dart';
+    addTestFile('''
+main() {
+  var test = 0;
+  print(test);
+}
+''');
+    await _getNavigation(testFile, testCode.indexOf('test);'), 0);
+    assertHasRegion('test);');
+    assertHasTarget('test = 0');
+  }
 }
diff --git a/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
new file mode 100644
index 0000000..72fa597
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/get_navigation_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetNavigationTest);
+  });
+}
+
+@reflectiveTest
+class GetNavigationTest extends AbstractAnalysisServerIntegrationTest {
+  test_navigation() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+class Foo {}
+
+class Bar {
+  Foo foo;
+}
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    await analysisFinished;
+
+    AnalysisGetNavigationResult result =
+        await sendAnalysisGetNavigation(pathname, text.indexOf('Foo foo'), 0);
+    expect(result.targets, hasLength(1));
+    NavigationTarget target = result.targets.first;
+    expect(target.kind, ElementKind.CLASS);
+    expect(target.offset, text.indexOf('Foo {}'));
+    expect(target.length, 3);
+    expect(target.startLine, 1);
+    expect(target.startColumn, 7);
+  }
+
+  // This fails - it returns navigation results for a whitespace area (#28799).
+  @failingTest
+  test_navigation_no_result() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+//
+
+class Foo {}
+
+class Bar {
+  Foo foo;
+}
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    await analysisFinished;
+
+    AnalysisGetNavigationResult result =
+        await sendAnalysisGetNavigation(pathname, 0, 0);
+    expect(result.targets, isEmpty);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/navigation_test.dart b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
index 2dcb074..e7f67eb 100644
--- a/pkg/analysis_server/test/integration/analysis/navigation_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/navigation_test.dart
@@ -17,7 +17,7 @@
 
 class AbstractAnalysisNavigationTest
     extends AbstractAnalysisServerIntegrationTest {
-  test_navigation() {
+  test_navigation() async {
     String pathname1 = sourcePath('test1.dart');
     String text1 = r'''
 library foo;
@@ -67,71 +67,71 @@
       targets = params.targets;
       targetFiles = params.files;
     });
-    return analysisFinished.then((_) {
-      // There should be a single error, due to the fact that 'dart:async' is
-      // not used.
-      expect(currentAnalysisErrors[pathname1], hasLength(1));
-      expect(currentAnalysisErrors[pathname2], isEmpty);
-      NavigationTarget findTargetElement(int index) {
-        for (NavigationRegion region in regions) {
-          if (region.offset <= index && index < region.offset + region.length) {
-            expect(region.targets, hasLength(1));
-            int targetIndex = region.targets[0];
-            return targets[targetIndex];
-          }
+
+    await analysisFinished;
+
+    // There should be a single error, due to the fact that 'dart:async' is not
+    // used.
+    expect(currentAnalysisErrors[pathname1], hasLength(1));
+    expect(currentAnalysisErrors[pathname2], isEmpty);
+    NavigationTarget findTargetElement(int index) {
+      for (NavigationRegion region in regions) {
+        if (region.offset <= index && index < region.offset + region.length) {
+          expect(region.targets, hasLength(1));
+          int targetIndex = region.targets[0];
+          return targets[targetIndex];
         }
-        fail('No element found for index $index');
-        return null;
       }
+      fail('No element found for index $index');
+      return null;
+    }
 
-      void checkLocal(
-          String source, String expectedTarget, ElementKind expectedKind) {
-        int sourceIndex = text1.indexOf(source);
-        int targetIndex = text1.indexOf(expectedTarget);
-        NavigationTarget element = findTargetElement(sourceIndex);
-        expect(targetFiles[element.fileIndex], equals(pathname1));
-        expect(element.offset, equals(targetIndex));
-        expect(element.kind, equals(expectedKind));
-      }
+    void checkLocal(
+        String source, String expectedTarget, ElementKind expectedKind) {
+      int sourceIndex = text1.indexOf(source);
+      int targetIndex = text1.indexOf(expectedTarget);
+      NavigationTarget element = findTargetElement(sourceIndex);
+      expect(targetFiles[element.fileIndex], equals(pathname1));
+      expect(element.offset, equals(targetIndex));
+      expect(element.kind, equals(expectedKind));
+    }
 
-      void checkRemote(String source, String expectedTargetRegexp,
-          ElementKind expectedKind) {
-        int sourceIndex = text1.indexOf(source);
-        NavigationTarget element = findTargetElement(sourceIndex);
-        expect(targetFiles[element.fileIndex], matches(expectedTargetRegexp));
-        expect(element.kind, equals(expectedKind));
-      }
+    void checkRemote(
+        String source, String expectedTargetRegexp, ElementKind expectedKind) {
+      int sourceIndex = text1.indexOf(source);
+      NavigationTarget element = findTargetElement(sourceIndex);
+      expect(targetFiles[element.fileIndex], matches(expectedTargetRegexp));
+      expect(element.kind, equals(expectedKind));
+    }
 
-      // TODO(paulberry): will the element type 'CLASS_TYPE_ALIAS' ever appear
-      // as a navigation target?
-      checkLocal('Class<int>', 'Class<TypeParameter>', ElementKind.CLASS);
-      checkRemote(
-          "'test2.dart';", r'test2.dart$', ElementKind.COMPILATION_UNIT);
-      checkLocal(
-          'Class<int>.constructor',
-          'constructor(); /* constructor declaration */',
-          ElementKind.CONSTRUCTOR);
-      checkLocal(
-          'constructor(); // usage',
-          'constructor(); /* constructor declaration */',
-          ElementKind.CONSTRUCTOR);
-      checkLocal('field;', 'field;', ElementKind.FIELD);
-      checkLocal('function(() => localVariable.field)',
-          'function(FunctionTypeAlias parameter)', ElementKind.FUNCTION);
-      checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();',
-          ElementKind.FUNCTION_TYPE_ALIAS);
-      checkLocal('field)', 'field;', ElementKind.GETTER);
-      checkRemote("'dart:async'", r'async\.dart$', ElementKind.LIBRARY);
-      checkLocal(
-          'localVariable.field', 'localVariable =', ElementKind.LOCAL_VARIABLE);
-      checkLocal('method();', 'method() {', ElementKind.METHOD);
-      checkLocal('parameter());', 'parameter) {', ElementKind.PARAMETER);
-      checkLocal('field = 1', 'field;', ElementKind.SETTER);
-      checkLocal('topLevelVariable;', 'topLevelVariable;',
-          ElementKind.TOP_LEVEL_VARIABLE);
-      checkLocal(
-          'TypeParameter field;', 'TypeParameter>', ElementKind.TYPE_PARAMETER);
-    });
+    // TODO(paulberry): will the element type 'CLASS_TYPE_ALIAS' ever appear as
+    // a navigation target?
+    checkLocal('Class<int>', 'Class<TypeParameter>', ElementKind.CLASS);
+    checkRemote("'test2.dart';", r'test2.dart$', ElementKind.COMPILATION_UNIT);
+    checkLocal(
+        'Class<int>.constructor',
+        'constructor(); /* constructor declaration */',
+        ElementKind.CONSTRUCTOR);
+    checkLocal(
+        'constructor(); // usage',
+        'constructor(); /* constructor declaration */',
+        ElementKind.CONSTRUCTOR);
+    checkLocal('field;', 'field;', ElementKind.FIELD);
+    checkLocal('function(() => localVariable.field)',
+        'function(FunctionTypeAlias parameter)', ElementKind.FUNCTION);
+    checkLocal('FunctionTypeAlias parameter', 'FunctionTypeAlias();',
+        ElementKind.FUNCTION_TYPE_ALIAS);
+    checkLocal('field)', 'field;', ElementKind.GETTER);
+    checkRemote("'dart:async'", r'async\.dart$', ElementKind.LIBRARY);
+    checkLocal(
+        'localVariable.field', 'localVariable =', ElementKind.LOCAL_VARIABLE);
+    checkLocal('method();', 'method() {', ElementKind.METHOD);
+    checkLocal('parameter());', 'parameter) {', ElementKind.PARAMETER);
+    checkLocal('field = 1', 'field;', ElementKind.SETTER);
+    checkLocal('topLevelVariable;', 'topLevelVariable;',
+        ElementKind.TOP_LEVEL_VARIABLE);
+    checkLocal(
+        'TypeParameter field;', 'TypeParameter>', ElementKind.TYPE_PARAMETER);
   }
 }
 
diff --git a/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
new file mode 100644
index 0000000..5174343
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/set_analysis_roots_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SetAnalysisRootsTest);
+  });
+}
+
+@reflectiveTest
+class SetAnalysisRootsTest extends AbstractAnalysisServerIntegrationTest {
+  test_options() async {
+    String pathname = sourcePath('test.dart');
+    writeFile(
+        pathname,
+        '''
+class Foo {
+  void bar() {}
+}
+''');
+
+    // Calling this will call analysis.setAnalysisRoots.
+    standardAnalysisSetup();
+
+    await analysisFinished;
+    expect(currentAnalysisErrors[pathname], isEmpty);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
new file mode 100644
index 0000000..9c507b8
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/set_subscriptions_test.dart
@@ -0,0 +1,37 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SetSubscriptionsTest);
+  });
+}
+
+@reflectiveTest
+class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
+  test_options() async {
+    String pathname = sourcePath('test.dart');
+    writeFile(
+        pathname,
+        '''
+class Foo {
+  void bar() {}
+}
+''');
+
+    // Calling this will subscribe to ServerService.STATUS.
+    standardAnalysisSetup();
+
+    await analysisFinished;
+    expect(currentAnalysisErrors[pathname], isEmpty);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/analysis/test_all.dart b/pkg/analysis_server/test/integration/analysis/test_all.dart
index a7eb871..d120e14 100644
--- a/pkg/analysis_server/test/integration/analysis/test_all.dart
+++ b/pkg/analysis_server/test/integration/analysis/test_all.dart
@@ -12,6 +12,7 @@
 import 'get_errors_nonStandard_sdk.dart' as get_errors_nonStandard_sdk;
 import 'get_errors_test.dart' as get_errors_test;
 import 'get_hover_test.dart' as get_hover_test;
+import 'get_navigation_test.dart' as get_navigation_test;
 import 'highlights_test.dart' as highlights_test;
 import 'highlights_test2.dart' as highlights_test2;
 import 'lint_driver_test.dart' as lint_driver_test;
@@ -23,9 +24,12 @@
 import 'package_root_test.dart' as package_root_test;
 import 'reanalyze_concurrent_test.dart' as reanalyze_concurrent_test;
 import 'reanalyze_test.dart' as reanalyze_test;
+import 'set_analysis_roots_test.dart' as set_analysis_roots_test;
+import 'set_subscriptions_test.dart' as set_subscriptions_test;
 import 'update_content_driver_test.dart' as update_content_driver_test;
 import 'update_content_list_test.dart' as update_content_list_test;
 import 'update_content_test.dart' as update_content_test;
+import 'update_options_test.dart' as update_options_test;
 
 /**
  * Utility for manually running all integration tests.
@@ -38,6 +42,7 @@
     get_errors_test.main();
     get_errors_nonStandard_sdk.main();
     get_hover_test.main();
+    get_navigation_test.main();
     highlights_test.main();
     highlights_test2.main();
     lint_driver_test.main();
@@ -49,8 +54,11 @@
     package_root_test.main();
     reanalyze_concurrent_test.main();
     reanalyze_test.main();
+    set_analysis_roots_test.main();
+    set_subscriptions_test.main();
     update_content_driver_test.main();
     update_content_test.main();
     update_content_list_test.main();
+    update_options_test.main();
   }, name: 'analysis');
 }
diff --git a/pkg/analysis_server/test/integration/analysis/update_options_test.dart b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
new file mode 100644
index 0000000..af62538
--- /dev/null
+++ b/pkg/analysis_server/test/integration/analysis/update_options_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UpdateOptionsTest);
+  });
+}
+
+@reflectiveTest
+class UpdateOptionsTest extends AbstractAnalysisServerIntegrationTest {
+  // We fail after the first analysis.updateOptions - we should not see a hint
+  // for the unused import (#28800).
+  @failingTest
+  test_options() async {
+    String pathname = sourcePath('test.dart');
+    writeFile(
+        pathname,
+        '''
+import 'dart:async'; // unused
+
+class Foo {
+  void bar() {}
+}
+''');
+    standardAnalysisSetup();
+
+    await sendAnalysisUpdateOptions(new AnalysisOptions()..generateHints = false);
+    await sendAnalysisReanalyze();
+    await analysisFinished;
+    expect(getErrors(pathname), isEmpty);
+
+    await sendAnalysisUpdateOptions(new AnalysisOptions()..generateHints = true);
+    await sendAnalysisReanalyze();
+    await analysisFinished;
+    expect(getErrors(pathname), hasLength(1));
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/coverage.md b/pkg/analysis_server/test/integration/coverage.md
index 0bf74f6..9dd2ed2 100644
--- a/pkg/analysis_server/test/integration/coverage.md
+++ b/pkg/analysis_server/test/integration/coverage.md
@@ -3,6 +3,8 @@
 
 This file is validated by `coverage_test.dart`.
 
+TODO(devoncarew): We should track analysis server notifications here as well.
+
 ## server domain
 - [x] server.getVersion
 - [x] server.shutdown
@@ -13,14 +15,14 @@
 - [x] analysis.getHover
 - [ ] analysis.getReachableSources
 - [ ] analysis.getLibraryDependencies
-- [ ] analysis.getNavigation
+- [x] analysis.getNavigation (failing - see #28799)
 - [x] analysis.reanalyze
-- [ ] analysis.setAnalysisRoots
+- [x] analysis.setAnalysisRoots
 - [ ] analysis.setGeneralSubscriptions
 - [ ] analysis.setPriorityFiles
-- [ ] analysis.setSubscriptions
+- [x] analysis.setSubscriptions
 - [x] analysis.updateContent
-- [ ] analysis.updateOptions
+- [x] analysis.updateOptions (failing - see #28800)
 
 ## completion domain
 - [x] completion.getSuggestions
@@ -33,19 +35,20 @@
 - [x] search.getTypeHierarchy
 
 ## edit domain
-- [ ] edit.format
+- [x] edit.format
 - [ ] edit.getAssists
 - [ ] edit.getAvailableRefactorings
 - [ ] edit.getFixes
 - [ ] edit.getRefactoring
-- [ ] edit.sortMembers
-- [ ] edit.organizeDirectives
+- [x] edit.sortMembers
+- [x] edit.organizeDirectives
 
 ## execution domain
 - [x] execution.createContext
 - [x] execution.deleteContext
 - [x] execution.mapUri
-- [ ] execution.setSubscriptions
+- [x] execution.setSubscriptions (failing - see #28806)
 
 ## diagnostic domain
-- [ ] diagnostic.getDiagnostics
+- [x] diagnostic.getDiagnostics
+- [x] diagnostic.getServerPort
diff --git a/pkg/analysis_server/test/integration/coverage_test.dart b/pkg/analysis_server/test/integration/coverage_test.dart
index 48acfba..d5a8588 100644
--- a/pkg/analysis_server/test/integration/coverage_test.dart
+++ b/pkg/analysis_server/test/integration/coverage_test.dart
@@ -41,6 +41,12 @@
           line.substring('##'.length, line.length - 'domain'.length).trim())
       .toSet();
 
+  // Remove any ' (test failed)' suffixes.
+  lines = lines.map((String line) {
+    int index = line.indexOf('(');
+    return index != -1 ? line.substring(0, index).trim() : line;
+  }).toList();
+
   // - [ ] server.getVersion
   Set<String> allMembers = lines
       .where((line) => line.startsWith('- '))
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
new file mode 100644
index 0000000..c22330c
--- /dev/null
+++ b/pkg/analysis_server/test/integration/diagnostic/get_diagnostics_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetDiagnosticsTest);
+  });
+}
+
+@reflectiveTest
+class GetDiagnosticsTest extends AbstractAnalysisServerIntegrationTest {
+  test_getDiagnostics() async {
+    standardAnalysisSetup();
+
+    DiagnosticGetDiagnosticsResult result =
+        await sendDiagnosticGetDiagnostics();
+
+    // Do some lightweight validation of the returned data.
+    expect(result.contexts, hasLength(1));
+    ContextData context = result.contexts.first;
+    expect(context.name, isNotEmpty);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
new file mode 100644
index 0000000..176e483
--- /dev/null
+++ b/pkg/analysis_server/test/integration/diagnostic/get_server_port_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetServerPortTest);
+  });
+}
+
+@reflectiveTest
+class GetServerPortTest extends AbstractAnalysisServerIntegrationTest {
+  test_connect() async {
+    standardAnalysisSetup();
+
+    DiagnosticGetServerPortResult result = await sendDiagnosticGetServerPort();
+    expect(result.port, isNotNull);
+    expect(result.port, isNonZero);
+
+    // Connect to the server and verify that it's serving the status page.
+    HttpClient client = new HttpClient();
+    HttpClientRequest request = await client
+        .getUrl(Uri.parse('http://localhost:${result.port}/status'));
+    HttpClientResponse response = await request.close();
+    String responseBody = await UTF8.decodeStream(response);
+    expect(responseBody, contains('<title>Analysis Server</title>'));
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/diagnostic/test_all.dart b/pkg/analysis_server/test/integration/diagnostic/test_all.dart
new file mode 100644
index 0000000..4e45dea
--- /dev/null
+++ b/pkg/analysis_server/test/integration/diagnostic/test_all.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'get_diagnostics_test.dart' as get_diagnostics_test;
+import 'get_server_port_test.dart' as get_server_port_test;
+
+main() {
+  defineReflectiveSuite(() {
+    get_diagnostics_test.main();
+    get_server_port_test.main();
+  }, name: 'diagnostics');
+}
diff --git a/pkg/analysis_server/test/integration/edit/format_test.dart b/pkg/analysis_server/test/integration/edit/format_test.dart
new file mode 100644
index 0000000..7aac4b7
--- /dev/null
+++ b/pkg/analysis_server/test/integration/edit/format_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FormatTest);
+  });
+}
+
+@reflectiveTest
+class FormatTest extends AbstractAnalysisServerIntegrationTest {
+  String formatTestSetup({bool withErrors: false}) {
+    String pathname = sourcePath('test.dart');
+
+    if (withErrors) {
+      String text = r'''
+class Class1 {
+  int field
+  void foo() {
+  }
+}
+''';
+      writeFile(pathname, text);
+    } else {
+      String text = r'''
+class Class1 {
+  int field;
+
+  void foo() {
+  }
+
+  void bar() {
+  }
+}
+''';
+      writeFile(pathname, text);
+    }
+    standardAnalysisSetup();
+    return pathname;
+  }
+
+  test_format() async {
+    String pathname = formatTestSetup();
+
+    EditFormatResult result = await sendEditFormat(pathname, 0, 0);
+    expect(result.edits, isNotEmpty);
+    expect(result.selectionOffset, 0);
+    expect(result.selectionLength, 0);
+  }
+
+  test_format_preserve_selection() async {
+    String pathname = formatTestSetup();
+
+    // format with 'bar' selected
+    int initialPosition = readFile(pathname).indexOf('bar()');
+    EditFormatResult result =
+        await sendEditFormat(pathname, initialPosition, 'bar'.length);
+    expect(result.edits, isNotEmpty);
+    expect(result.selectionOffset, initialPosition - 3);
+    expect(result.selectionLength, 'bar'.length);
+  }
+
+  test_format_with_errors() async {
+    String pathname = formatTestSetup(withErrors: true);
+
+    try {
+      await sendEditFormat(pathname, 0, 0);
+      fail('expected FORMAT_WITH_ERRORS');
+    } on ServerErrorMessage catch (message) {
+      expect(message.error['code'], 'FORMAT_WITH_ERRORS');
+    }
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/edit/organize_directives_test.dart b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
new file mode 100644
index 0000000..3356a66
--- /dev/null
+++ b/pkg/analysis_server/test/integration/edit/organize_directives_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(OrganizeDirectivesTest);
+  });
+}
+
+@reflectiveTest
+class OrganizeDirectivesTest extends AbstractAnalysisServerIntegrationTest {
+  test_organize_directives() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+import 'dart:math';
+import 'dart:async';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    EditOrganizeDirectivesResult result = await sendEditOrganizeDirectives(pathname);
+    SourceFileEdit edit = result.edit;
+    expect(edit.edits, hasLength(1));
+    expect(edit.edits.first.replacement, "import 'dart:async';\nimport 'dart:math");
+  }
+
+  test_organize_directives_no_changes() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+import 'dart:async';
+import 'dart:math';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    EditOrganizeDirectivesResult result = await sendEditOrganizeDirectives(pathname);
+    SourceFileEdit edit = result.edit;
+    expect(edit.edits, isEmpty);
+  }
+
+  test_organize_directives_with_errors() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+import 'dart:async'
+import 'dart:math';
+
+Future foo;
+int minified(int x, int y) => min(x, y);
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    try {
+      await sendEditOrganizeDirectives(pathname);
+    } on ServerErrorMessage catch (message) {
+      expect(message.error['code'], 'ORGANIZE_DIRECTIVES_ERROR');
+    }
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/edit/sort_members_test.dart b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
new file mode 100644
index 0000000..cdb79e5
--- /dev/null
+++ b/pkg/analysis_server/test/integration/edit/sort_members_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SortMembersTest);
+  });
+}
+
+@reflectiveTest
+class SortMembersTest extends AbstractAnalysisServerIntegrationTest {
+  test_sort() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+int foo;
+int bar;
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    EditSortMembersResult result = await sendEditSortMembers(pathname);
+    SourceFileEdit edit = result.edit;
+    expect(edit.edits, hasLength(1));
+    expect(edit.edits.first.replacement, "bar;\nint foo");
+  }
+
+  test_sort_no_changes() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+int bar;
+int foo;
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    EditSortMembersResult result = await sendEditSortMembers(pathname);
+    SourceFileEdit edit = result.edit;
+    expect(edit.edits, isEmpty);
+  }
+
+  test_sort_with_errors() async {
+    String pathname = sourcePath('test.dart');
+    String text = r'''
+int foo
+int bar;
+''';
+    writeFile(pathname, text);
+    standardAnalysisSetup();
+
+    try {
+      await sendEditSortMembers(pathname);
+    } on ServerErrorMessage catch (message) {
+      expect(message.error['code'], 'SORT_MEMBERS_PARSE_ERRORS');
+    }
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/edit/test_all.dart b/pkg/analysis_server/test/integration/edit/test_all.dart
new file mode 100644
index 0000000..68b97b1
--- /dev/null
+++ b/pkg/analysis_server/test/integration/edit/test_all.dart
@@ -0,0 +1,17 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'format_test.dart' as format_test;
+import 'organize_directives_test.dart' as organize_directives_test;
+import 'sort_members_test.dart' as sort_members_test;
+
+main() {
+  defineReflectiveSuite(() {
+    format_test.main();
+    organize_directives_test.main();
+    sort_members_test.main();
+  }, name: 'edit');
+}
diff --git a/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
new file mode 100644
index 0000000..fcd4189
--- /dev/null
+++ b/pkg/analysis_server/test/integration/execution/set_subscriptions_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../integration_tests.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SetSubscriptionsTest);
+  });
+}
+
+@reflectiveTest
+class SetSubscriptionsTest extends AbstractAnalysisServerIntegrationTest {
+  // Bad state: Should not be used with the new analysis driver (#28806)
+  @failingTest
+  test_subscribe() async {
+    writeFile(sourcePath('.packages'), 'foo:lib/');
+    standardAnalysisSetup();
+    await sendExecutionSetSubscriptions([ExecutionService.LAUNCH_DATA]);
+
+    String contextId =
+        (await sendExecutionCreateContext(sourceDirectory.path)).id;
+    expect(contextId, isNotNull);
+
+    String pathname = sourcePath('lib/main.dart');
+    writeFile(pathname, 'void main() {}');
+
+    ExecutionLaunchDataParams data = await onExecutionLaunchData.first;
+    expect(data.kind, ExecutableKind.SERVER);
+    expect(data.file, pathname);
+  }
+
+  @override
+  bool get enableNewAnalysisDriver => true;
+}
diff --git a/pkg/analysis_server/test/integration/execution/test_all.dart b/pkg/analysis_server/test/integration/execution/test_all.dart
index f24942d..6da630d 100644
--- a/pkg/analysis_server/test/integration/execution/test_all.dart
+++ b/pkg/analysis_server/test/integration/execution/test_all.dart
@@ -7,11 +7,13 @@
 import 'create_context_test.dart' as create_context_test;
 import 'delete_context_test.dart' as delete_context_test;
 import 'map_uri_test.dart' as map_uri_test;
+import 'set_subscriptions_test.dart' as set_subscription_test;
 
 main() {
   defineReflectiveSuite(() {
     create_context_test.main();
     delete_context_test.main();
     map_uri_test.main();
+    set_subscription_test.main();
   }, name: 'execution');
 }
diff --git a/pkg/analysis_server/test/integration/integration_test_methods.dart b/pkg/analysis_server/test/integration/integration_test_methods.dart
index 4bad372..14251bb 100644
--- a/pkg/analysis_server/test/integration/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/integration_test_methods.dart
@@ -1630,6 +1630,23 @@
   }
 
   /**
+   * Return the port of the diagnostic web server. If the server is not running
+   * this call will start the server. If unable to start the diagnostic web
+   * server, this call will return an error of DEBUG_PORT_COULD_NOT_BE_OPENED.
+   *
+   * Returns
+   *
+   * port (int)
+   *
+   *   The diagnostic server port.
+   */
+  Future<DiagnosticGetServerPortResult> sendDiagnosticGetServerPort() async {
+    var result = await server.send("diagnostic.getServerPort", null);
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    return new DiagnosticGetServerPortResult.fromJson(decoder, 'result', result);
+  }
+
+  /**
    * Initialize the fields in InttestMixin, and ensure that notifications will
    * be handled.
    */
diff --git a/pkg/analysis_server/test/integration/integration_tests.dart b/pkg/analysis_server/test/integration/integration_tests.dart
index 59cbe57..ebd6ff8 100644
--- a/pkg/analysis_server/test/integration/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/integration_tests.dart
@@ -125,6 +125,8 @@
    */
   bool _subscribedToServerStatus = false;
 
+  List<AnalysisError> getErrors(String pathname) => currentAnalysisErrors[pathname];
+
   AbstractAnalysisServerIntegrationTest() {
     initializeInttestMixin();
   }
@@ -176,7 +178,7 @@
    * The server is automatically started before every test, and a temporary
    * [sourceDirectory] is created.
    */
-  Future setUp() {
+  Future setUp() async {
     sourceDirectory = new Directory(Directory.systemTemp
         .createTempSync('analysisServer')
         .resolveSymbolicLinksSync());
@@ -193,13 +195,12 @@
       // A server error should never happen during an integration test.
       fail('${params.message}\n${params.stackTrace}');
     });
-    return startServer().then((_) {
-      server.listenToOutput(dispatchNotification);
-      server.exitCode.then((_) {
-        skipShutdown = true;
-      });
-      return serverConnected.future;
+    await startServer();
+    server.listenToOutput(dispatchNotification);
+    server.exitCode.then((_) {
+      skipShutdown = true;
     });
+    return serverConnected.future;
   }
 
   /**
@@ -277,6 +278,11 @@
     file.writeAsStringSync(contents);
     return file.resolveSymbolicLinksSync();
   }
+
+  /**
+   * Read a source file with the given absolute [pathname].
+   */
+  String readFile(String pathname) => new File(pathname).readAsStringSync();
 }
 
 /**
@@ -288,6 +294,8 @@
   ServerErrorMessage(this.message);
 
   dynamic get error => message['error'];
+
+  String toString() => message.toString();
 }
 
 /**
@@ -644,14 +652,12 @@
   }
 
   /**
-   * Start the server.  If [debugServer] is `true`, the server will be started
-   * with "--debug", allowing a debugger to be attached. If [profileServer] is
-   * `true`, the server will be started with "--observe" and
-   * "--pause-isolates-on-exit", allowing the observatory to be used.
+   * Start the server. If [profileServer] is `true`, the server will be started
+   * with "--observe" and "--pause-isolates-on-exit", allowing the observatory
+   * to be used.
    */
   Future start(
       {bool checked: true,
-      bool debugServer: false,
       int diagnosticPort,
       bool enableNewAnalysisDriver: false,
       bool noErrorNotification: false,
@@ -671,9 +677,6 @@
     //
     // Add VM arguments.
     //
-    if (debugServer) {
-      arguments.add('--debug');
-    }
     if (profileServer) {
       if (servicesPort == null) {
         arguments.add('--observe');
@@ -718,6 +721,9 @@
     }
 //    print('Launching $serverPath');
 //    print('$dartBinary ${arguments.join(' ')}');
+    // TODO(devoncarew): We could experiment with instead launching the analysis
+    // server in a separate isolate. This would make it easier to debug the
+    // integration tests, and would like speed the tests up as well.
     return Process.start(dartBinary, arguments).then((Process process) {
       _process = process;
       process.exitCode.then((int code) {
@@ -746,7 +752,7 @@
     // and is outputting a stacktrace, because it ensures that we see the
     // entire stacktrace.  Use expectAsync() to prevent the test from
     // ending during this 1 second.
-    new Future.delayed(new Duration(seconds: 1), expectAsync(() {
+    new Future.delayed(new Duration(seconds: 1), expectAsync0(() {
       fail('Bad data received from server: $details');
     }));
   }
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 7f2f3ab..58a53bd 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1053,6 +1053,23 @@
   }));
 
 /**
+ * diagnostic.getServerPort params
+ */
+final Matcher isDiagnosticGetServerPortParams = isNull;
+
+/**
+ * diagnostic.getServerPort result
+ *
+ * {
+ *   "port": int
+ * }
+ */
+final Matcher isDiagnosticGetServerPortResult = new LazyMatcher(() => new MatchesJsonObject(
+  "diagnostic.getServerPort result", {
+    "port": isInt
+  }));
+
+/**
  * AddContentOverlay
  *
  * {
@@ -2103,6 +2120,7 @@
  *
  * enum {
  *   CONTENT_MODIFIED
+ *   DEBUG_PORT_COULD_NOT_BE_OPENED
  *   FILE_NOT_ANALYZED
  *   FORMAT_INVALID_FILE
  *   FORMAT_WITH_ERRORS
@@ -2130,6 +2148,7 @@
  */
 final Matcher isRequestErrorCode = new MatchesEnum("RequestErrorCode", [
   "CONTENT_MODIFIED",
+  "DEBUG_PORT_COULD_NOT_BE_OPENED",
   "FILE_NOT_ANALYZED",
   "FORMAT_INVALID_FILE",
   "FORMAT_WITH_ERRORS",
diff --git a/pkg/analysis_server/test/integration/test_all.dart b/pkg/analysis_server/test/integration/test_all.dart
index 8e0c603..6fb5ad1 100644
--- a/pkg/analysis_server/test/integration/test_all.dart
+++ b/pkg/analysis_server/test/integration/test_all.dart
@@ -9,6 +9,8 @@
 import 'analysis/test_all.dart' as analysis_test_all;
 import 'completion/test_all.dart' as completion_test_all;
 import 'coverage_test.dart' as coverage_test;
+import 'diagnostic/test_all.dart' as diagnostic_test_all;
+import 'edit/test_all.dart' as edit_test_all;
 import 'execution/test_all.dart' as execution_test_all;
 import 'search/test_all.dart' as search_test_all;
 import 'server/test_all.dart' as server_test_all;
@@ -20,6 +22,8 @@
   defineReflectiveSuite(() {
     analysis_test_all.main();
     completion_test_all.main();
+    diagnostic_test_all.main();
+    edit_test_all.main();
     execution_test_all.main();
     search_test_all.main();
     server_test_all.main();
diff --git a/pkg/analysis_server/test/services/correction/assist_test.dart b/pkg/analysis_server/test/services/correction/assist_test.dart
index 30ba490..80a7939 100644
--- a/pkg/analysis_server/test/services/correction/assist_test.dart
+++ b/pkg/analysis_server/test/services/correction/assist_test.dart
@@ -15,6 +15,8 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/source/package_map_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:plugin/manager.dart';
@@ -42,6 +44,21 @@
   String resultCode;
   LinkedEditGroup linkedPositionGroup;
 
+  String flutterPkgLibPath = '/packages/flutter/lib';
+
+  String get _flutter_framework_code => '''
+class Widget {}
+class RenderObjectWidget extends Widget {}
+class StatelessWidget extends Widget {}
+class SingleChildRenderObjectWidget extends RenderObjectWidget {}
+class Transform extends SingleChildRenderObjectWidget {}
+class ClipRect extends SingleChildRenderObjectWidget { ClipRect.rect(){} }
+class AspectRatio extends SingleChildRenderObjectWidget {}
+class Container extends StatelessWidget { Container({child: null}){}}
+class DefaultTextStyle extends StatelessWidget { DefaultTextStyle({child: null}){}}
+class Row extends Widget { Row({children: null}){}}
+''';
+
   /**
    * Asserts that there is an [Assist] of the given [kind] at [offset] which
    * produces the [expected] code when applied to [testCode].
@@ -3603,6 +3620,231 @@
 ''');
   }
 
+  test_reparentFlutterList_BAD_multiLine() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+  return new Container(
+    child: new Row(
+      children: [/*caret*/
+// start
+        new Transform(),
+        new Object(),
+        new AspectRatio(),
+// end
+      ],
+    ),
+  );
+}
+''');
+    _setCaretLocation();
+    await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_LIST);
+  }
+
+  test_reparentFlutterList_BAD_singleLine() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+  var obj;
+// start
+    return new Row(children: [/*caret*/ new Transform()]);
+// end
+  }
+}
+''');
+    _setCaretLocation();
+    await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_LIST);
+  }
+
+  test_reparentFlutterList_OK_multiLine() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+  return new Container(
+    child: new Row(
+// start
+      children: [/*caret*/
+        new Transform(),
+        new Transform(),
+        new AspectRatio(),
+      ],
+// end
+    ),
+  );
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(
+        DartAssistKind.REPARENT_FLUTTER_LIST,
+        '''
+import 'package:flutter/src/widgets/framework.dart';
+build() {
+  return new Container(
+    child: new Row(
+// start
+      children: [
+        new widget(
+          children: [/*caret*/
+            new Transform(),
+            new Transform(),
+            new AspectRatio(),
+          ],
+        ),
+      ],
+// end
+    ),
+  );
+}
+''');
+  }
+
+  test_reparentFlutterWidget_BAD_minimal() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+/*caret*/x(){}
+''');
+    _setCaretLocation();
+    await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET);
+  }
+
+  test_reparentFlutterWidget_BAD_singleLine() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+  var obj;
+// start
+    return new Container(child: obj.xyz./*caret*/abc);
+// end
+  }
+}
+''');
+    _setCaretLocation();
+    await assertNoAssist(DartAssistKind.REPARENT_FLUTTER_WIDGET);
+  }
+
+  test_reparentFlutterWidget_OK_multiLines() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+    return new Container(
+// start
+      child: new /*caret*/DefaultTextStyle(
+        child: new Row(
+          children: <Widget>[
+            new Container(
+            ),
+          ],
+        ),
+      ),
+// end
+    );
+  }
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(
+        DartAssistKind.REPARENT_FLUTTER_WIDGET,
+        '''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+    return new Container(
+// start
+      child: new widget(
+        child: new /*caret*/DefaultTextStyle(
+          child: new Row(
+            children: <Widget>[
+              new Container(
+              ),
+            ],
+          ),
+        ),
+      ),
+// end
+    );
+  }
+}
+''');
+  }
+
+  test_reparentFlutterWidget_OK_singleLine1() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+// start
+    return /*caret*/new Container();
+// end
+  }
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(
+        DartAssistKind.REPARENT_FLUTTER_WIDGET,
+        '''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+// start
+    return /*caret*/new widget(child: new Container());
+// end
+  }
+}
+''');
+  }
+
+  test_reparentFlutterWidget_OK_singleLine2() async {
+    _configureFlutterPkg({
+      'src/widgets/framework.dart': _flutter_framework_code,
+    });
+    await resolveTestUnit('''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+// start
+    return new ClipRect./*caret*/rect();
+// end
+  }
+}
+''');
+    _setCaretLocation();
+    await assertHasAssist(
+        DartAssistKind.REPARENT_FLUTTER_WIDGET,
+        '''
+import 'package:flutter/src/widgets/framework.dart';
+class FakeFlutter {
+  main() {
+// start
+    return new widget(child: new ClipRect./*caret*/rect());
+// end
+  }
+}
+''');
+  }
+
   test_replaceConditionalWithIfElse_BAD_noEnclosingStatement() async {
     await resolveTestUnit('''
 var v = true ? 111 : 222;
@@ -4208,6 +4450,34 @@
     return await processor.compute();
   }
 
+  /**
+   * Configures the [SourceFactory] to have the `flutter` package in
+   * `/packages/flutter/lib` folder.
+   */
+  void _configureFlutterPkg(Map<String, String> pathToCode) {
+    pathToCode.forEach((path, code) {
+      provider.newFile('$flutterPkgLibPath/$path', code);
+    });
+    // configure SourceFactory
+    Folder myPkgFolder = provider.getResource(flutterPkgLibPath);
+    UriResolver pkgResolver = new PackageMapUriResolver(provider, {
+      'flutter': [myPkgFolder]
+    });
+    SourceFactory sourceFactory = new SourceFactory(
+        [new DartUriResolver(sdk), pkgResolver, resourceResolver]);
+    if (enableNewAnalysisDriver) {
+      driver.configure(sourceFactory: sourceFactory);
+    } else {
+      context.sourceFactory = sourceFactory;
+    }
+    // force 'flutter' resolution
+    addSource(
+        '/tmp/other.dart',
+        pathToCode.keys
+            .map((path) => "import 'package:flutter/$path';")
+            .join('\n'));
+  }
+
   List<Position> _findResultPositions(List<String> searchStrings) {
     List<Position> positions = <Position>[];
     for (String search in searchStrings) {
@@ -4217,6 +4487,11 @@
     return positions;
   }
 
+  void _setCaretLocation() {
+    offset = findOffset('/*caret*/') + '/*caret*/'.length;
+    length = 0;
+  }
+
   void _setStartEndSelection() {
     offset = findOffset('// start\n') + '// start\n'.length;
     length = findOffset('// end') - offset;
diff --git a/pkg/analysis_server/test/services/correction/fix_test.dart b/pkg/analysis_server/test/services/correction/fix_test.dart
index d6bd2db..57ff0c6 100644
--- a/pkg/analysis_server/test/services/correction/fix_test.dart
+++ b/pkg/analysis_server/test/services/correction/fix_test.dart
@@ -427,6 +427,102 @@
 ''');
   }
 
+  test_addMissingRequiredArg_cons_single() async {
+    _addMetaPackageSource();
+
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+class A {
+  A({@required int a}) {}
+}
+main() {
+  A a = new A();
+}
+''');
+    await assertHasFix(
+        DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
+        '''
+import 'package:meta/meta.dart';
+
+class A {
+  A({@required int a}) {}
+}
+main() {
+  A a = new A(a: null);
+}
+''');
+  }
+
+  test_addMissingRequiredArg_multiple() async {
+    _addMetaPackageSource();
+
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(a: 3);
+}
+''');
+    await assertHasFix(
+        DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
+        '''
+import 'package:meta/meta.dart';
+
+test({@required int a, @required int bcd}) {}
+main() {
+  test(a: 3, bcd: null);
+}
+''');
+  }
+
+  test_addMissingRequiredArg_single() async {
+    _addMetaPackageSource();
+
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test({@required int abc}) {}
+main() {
+  test();
+}
+''');
+    await assertHasFix(
+        DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
+        '''
+import 'package:meta/meta.dart';
+
+test({@required int abc}) {}
+main() {
+  test(abc: null);
+}
+''');
+  }
+
+  test_addMissingRequiredArg_single_normal() async {
+    _addMetaPackageSource();
+
+    await resolveTestUnit('''
+import 'package:meta/meta.dart';
+
+test(String x, {@required int abc}) {}
+main() {
+  test("foo");
+}
+''');
+    await assertHasFix(
+        DartFixKind.ADD_MISSING_REQUIRED_ARGUMENT,
+        '''
+import 'package:meta/meta.dart';
+
+test(String x, {@required int abc}) {}
+main() {
+  test("foo", abc: null);
+}
+''');
+  }
+
   test_addSync_asyncFor() async {
     await resolveTestUnit('''
 import 'dart:async';
@@ -5336,6 +5432,19 @@
 }
 ''');
   }
+
+  void _addMetaPackageSource() {
+    addPackageSource('meta', 'meta.dart', r'''
+library meta;
+
+const Required required = const Required();
+
+class Required {
+  final String reason;
+  const Required([this.reason]);
+}
+''');
+  }
 }
 
 @reflectiveTest
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index a6ea8b1..c3caaed 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -119,6 +119,7 @@
         new FolderBasedDartSdk(resourceProvider,
             FolderBasedDartSdk.defaultSdkDirectory(resourceProvider)),
         InstrumentationService.NULL_SERVICE,
+        null,
         serverPlugin,
         null,
         null,
diff --git a/pkg/analysis_server/test/src/plugin/notification_manager_test.dart b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
new file mode 100644
index 0000000..003750f
--- /dev/null
+++ b/pkg/analysis_server/test/src/plugin/notification_manager_test.dart
@@ -0,0 +1,500 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analysis_server/plugin/protocol/protocol.dart' as server;
+import 'package:analysis_server/src/channel/channel.dart';
+import 'package:analysis_server/src/plugin/notification_manager.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
+import 'package:analyzer_plugin/protocol/protocol_constants.dart' as plugin;
+import 'package:analyzer_plugin/protocol/protocol_generated.dart' as plugin;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'protocol_test_utilities.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NotificationManagerTest);
+  });
+}
+
+@reflectiveTest
+class NotificationManagerTest extends ProtocolTestUtilities {
+  String testDir;
+  String fileA;
+  String fileB;
+
+  TestChannel channel;
+
+  NotificationManager manager;
+
+  void setUp() {
+    MemoryResourceProvider provider = new MemoryResourceProvider();
+    testDir = provider.convertPath('/test');
+    fileA = provider.convertPath('/test/a.dart');
+    fileB = provider.convertPath('/test/b.dart');
+    channel = new TestChannel();
+    manager = new NotificationManager(channel, provider);
+  }
+
+  void test_handlePluginNotification_errors() {
+    manager.setAnalysisRoots([testDir], []);
+    plugin.AnalysisError pluginError1 = pluginAnalysisError(0, 0, file: fileA);
+    plugin.AnalysisError pluginError2 = pluginAnalysisError(3, 4, file: fileA);
+    plugin.AnalysisErrorsParams params =
+        new plugin.AnalysisErrorsParams(fileA, [pluginError1, pluginError2]);
+    manager.handlePluginNotification('a', params.toNotification());
+
+    server.AnalysisError serverError1 = serverAnalysisError(0, 0, file: fileA);
+    server.AnalysisError serverError2 = serverAnalysisError(3, 4, file: fileA);
+    _verifyErrors(fileA, [serverError1, serverError2]);
+  }
+
+  void test_handlePluginNotification_folding() {
+    manager.setSubscriptions({
+      server.AnalysisService.FOLDING: [fileA, fileB]
+    });
+    plugin.FoldingRegion pluginRegion1 = pluginFoldingRegion(10, 3);
+    plugin.FoldingRegion pluginRegion2 = pluginFoldingRegion(20, 6);
+    plugin.AnalysisFoldingParams params =
+        new plugin.AnalysisFoldingParams(fileA, [pluginRegion1, pluginRegion2]);
+    manager.handlePluginNotification('a', params.toNotification());
+
+    server.FoldingRegion serverRegion1 = serverFoldingRegion(10, 3);
+    server.FoldingRegion serverRegion2 = serverFoldingRegion(20, 6);
+    _verifyFoldingRegions(fileA, [serverRegion1, serverRegion2]);
+  }
+
+  void test_handlePluginNotification_highlights() {
+    manager.setSubscriptions({
+      server.AnalysisService.HIGHLIGHTS: [fileA, fileB]
+    });
+    plugin.HighlightRegion pluginRegion1 = pluginHighlightRegion(10, 3);
+    plugin.HighlightRegion pluginRegion2 = pluginHighlightRegion(20, 6);
+    plugin.AnalysisHighlightsParams params =
+        new plugin.AnalysisHighlightsParams(
+            fileA, [pluginRegion1, pluginRegion2]);
+
+    server.HighlightRegion serverRegion1 = serverHighlightRegion(10, 3);
+    server.HighlightRegion serverRegion2 = serverHighlightRegion(20, 6);
+    manager.handlePluginNotification('a', params.toNotification());
+    _verifyHighlightRegions(fileA, [serverRegion1, serverRegion2]);
+  }
+
+  void test_handlePluginNotification_naviation() {
+    manager.setSubscriptions({
+      server.AnalysisService.NAVIGATION: [fileA, fileB]
+    });
+    plugin.AnalysisNavigationParams pluginParams =
+        pluginNavigationParams(0, 0, file: fileA);
+    manager.handlePluginNotification('a', pluginParams.toNotification());
+
+    server.AnalysisNavigationParams serverParams =
+        serverNavigationParams(0, 0, file: fileA);
+    _verifyNavigationParams(serverParams);
+  }
+
+  void test_handlePluginNotification_occurences() {
+    manager.setSubscriptions({
+      server.AnalysisService.OCCURRENCES: [fileA, fileB]
+    });
+    plugin.Occurrences pluginOccurrences1 = pluginOccurrences(0, 0);
+    plugin.Occurrences pluginOccurrences2 = pluginOccurrences(5, 7);
+    plugin.AnalysisOccurrencesParams params =
+        new plugin.AnalysisOccurrencesParams(
+            fileA, [pluginOccurrences1, pluginOccurrences2]);
+
+    server.Occurrences serverOccurrences1 = serverOccurrences(0, 0);
+    server.Occurrences serverOccurrences2 = serverOccurrences(5, 7);
+    manager.handlePluginNotification('a', params.toNotification());
+    _verifyOccurrences(fileA, [serverOccurrences1, serverOccurrences2]);
+  }
+
+  void test_handlePluginNotification_outline() {
+    manager.setSubscriptions({
+      server.AnalysisService.OUTLINE: [fileA, fileB]
+    });
+    plugin.Outline pluginOutline1 = pluginOutline(0, 0);
+    plugin.AnalysisOutlineParams params =
+        new plugin.AnalysisOutlineParams(fileA, [pluginOutline1]);
+    manager.handlePluginNotification('a', params.toNotification());
+
+    server.Outline serverOutline1 = serverOutline(0, 0);
+    _verifyOutlines(fileA, serverOutline1);
+  }
+
+  void test_recordAnalysisErrors_noSubscription() {
+    server.AnalysisError error = serverAnalysisError(0, 0, file: fileA);
+    manager.recordAnalysisErrors('a', fileA, [error]);
+    expect(channel.sentNotification, isNull);
+  }
+
+  void test_recordAnalysisErrors_withSubscription() {
+    manager.setAnalysisRoots([testDir], []);
+    //
+    // Errors should be reported when they are recorded.
+    //
+    server.AnalysisError error1 = serverAnalysisError(0, 0, file: fileA);
+    server.AnalysisError error2 = serverAnalysisError(3, 4, file: fileA);
+    manager.recordAnalysisErrors('a', fileA, [error1, error2]);
+    _verifyErrors(fileA, [error1, error2]);
+    //
+    // Errors from different plugins should be cumulative.
+    //
+    server.AnalysisError error3 = serverAnalysisError(6, 8, file: fileA);
+    manager.recordAnalysisErrors('b', fileA, [error3]);
+    _verifyErrors(fileA, [error1, error2, error3]);
+    //
+    // Overwriting errors from one plugin should not affect errors from other
+    // plugins.
+    //
+    server.AnalysisError error4 = serverAnalysisError(9, 12, file: fileA);
+    manager.recordAnalysisErrors('a', fileA, [error4]);
+    _verifyErrors(fileA, [error4, error3]);
+    //
+    // Recording errors against a file should not affect the errors for other
+    // files.
+    //
+    server.AnalysisError error5 = serverAnalysisError(12, 16, file: fileB);
+    manager.recordAnalysisErrors('a', fileB, [error5]);
+    _verifyErrors(fileB, [error5]);
+  }
+
+  void test_recordFoldingRegions_noSubscription() {
+    server.FoldingRegion region = serverFoldingRegion(10, 5);
+    manager.recordFoldingRegions('a', fileA, [region]);
+    expect(channel.sentNotification, isNull);
+  }
+
+  void test_recordFoldingRegions_withSubscription() {
+    manager.setSubscriptions({
+      server.AnalysisService.FOLDING: [fileA, fileB]
+    });
+    //
+    // Regions should be reported when they are recorded.
+    //
+    server.FoldingRegion region1 = serverFoldingRegion(10, 3);
+    server.FoldingRegion region2 = serverFoldingRegion(20, 6);
+    manager.recordFoldingRegions('a', fileA, [region1, region2]);
+    _verifyFoldingRegions(fileA, [region1, region2]);
+    //
+    // Regions from different plugins should be cumulative.
+    //
+    server.FoldingRegion region3 = serverFoldingRegion(30, 5);
+    manager.recordFoldingRegions('b', fileA, [region3]);
+    _verifyFoldingRegions(fileA, [region1, region2, region3]);
+    //
+    // Overwriting regions from one plugin should not affect regions from other
+    // plugins.
+    //
+    server.FoldingRegion region4 = serverFoldingRegion(40, 2);
+    manager.recordFoldingRegions('a', fileA, [region4]);
+    _verifyFoldingRegions(fileA, [region4, region3]);
+    //
+    // Recording regions against a file should not affect the regions for other
+    // files.
+    //
+    server.FoldingRegion region5 = serverFoldingRegion(50, 7);
+    manager.recordFoldingRegions('a', fileB, [region5]);
+    _verifyFoldingRegions(fileB, [region5]);
+  }
+
+  void test_recordHighlightRegions_noSubscription() {
+    server.HighlightRegion region = serverHighlightRegion(10, 5);
+    manager.recordHighlightRegions('a', fileA, [region]);
+    expect(channel.sentNotification, isNull);
+  }
+
+  void test_recordHighlightRegions_withSubscription() {
+    manager.setSubscriptions({
+      server.AnalysisService.HIGHLIGHTS: [fileA, fileB]
+    });
+    //
+    // Regions should be reported when they are recorded.
+    //
+    server.HighlightRegion region1 = serverHighlightRegion(10, 3);
+    server.HighlightRegion region2 = serverHighlightRegion(20, 6);
+    manager.recordHighlightRegions('a', fileA, [region1, region2]);
+    _verifyHighlightRegions(fileA, [region1, region2]);
+    //
+    // Regions from different plugins should be cumulative.
+    //
+    server.HighlightRegion region3 = serverHighlightRegion(30, 5);
+    manager.recordHighlightRegions('b', fileA, [region3]);
+    _verifyHighlightRegions(fileA, [region1, region2, region3]);
+    //
+    // Overwriting regions from one plugin should not affect regions from other
+    // plugins.
+    //
+    server.HighlightRegion region4 = serverHighlightRegion(40, 2);
+    manager.recordHighlightRegions('a', fileA, [region4]);
+    _verifyHighlightRegions(fileA, [region4, region3]);
+    //
+    // Recording regions against a file should not affect the regions for other
+    // files.
+    //
+    server.HighlightRegion region5 = serverHighlightRegion(50, 7);
+    manager.recordHighlightRegions('a', fileB, [region5]);
+    _verifyHighlightRegions(fileB, [region5]);
+  }
+
+  void test_recordNavigationParams_noSubscription() {
+    server.AnalysisNavigationParams params =
+        serverNavigationParams(0, 0, file: fileA);
+    manager.recordNavigationParams('a', fileA, params);
+    expect(channel.sentNotification, isNull);
+  }
+
+  void test_recordNavigationParams_withSubscription() {
+    manager.setSubscriptions({
+      server.AnalysisService.NAVIGATION: [fileA, fileB]
+    });
+    //
+    // Parameters should be reported when they are recorded.
+    //
+    server.AnalysisNavigationParams params1 =
+        serverNavigationParams(0, 0, file: fileA);
+    manager.recordNavigationParams('a', fileA, params1);
+    _verifyNavigationParams(params1);
+    //
+    // Parameters from different plugins should be cumulative.
+    //
+    server.AnalysisNavigationParams params2 =
+        serverNavigationParams(2, 4, file: fileA);
+    manager.recordNavigationParams('b', fileA, params2);
+    server.AnalysisNavigationParams params1and2 =
+        new server.AnalysisNavigationParams(fileA, <server.NavigationRegion>[
+      new server.NavigationRegion(0, 2, <int>[0]),
+      new server.NavigationRegion(4, 2, <int>[1])
+    ], <server.NavigationTarget>[
+      new server.NavigationTarget(server.ElementKind.FIELD, 0, 1, 2, 2, 3),
+      new server.NavigationTarget(server.ElementKind.FIELD, 2, 5, 2, 6, 7)
+    ], <String>[
+      'aa',
+      'ab',
+      'ac',
+      'ad'
+    ]);
+    _verifyNavigationParams(params1and2);
+    //
+    // Overwriting parameters from one plugin should not affect parameters from
+    // other plugins.
+    //
+    server.AnalysisNavigationParams params3 =
+        serverNavigationParams(4, 8, file: fileA);
+    manager.recordNavigationParams('a', fileA, params3);
+    server.AnalysisNavigationParams params3and2 =
+        new server.AnalysisNavigationParams(fileA, <server.NavigationRegion>[
+      new server.NavigationRegion(8, 2, <int>[0]),
+      new server.NavigationRegion(4, 2, <int>[1])
+    ], <server.NavigationTarget>[
+      new server.NavigationTarget(server.ElementKind.FIELD, 0, 9, 2, 10, 11),
+      new server.NavigationTarget(server.ElementKind.FIELD, 2, 5, 2, 6, 7)
+    ], <String>[
+      'ae',
+      'af',
+      'ac',
+      'ad'
+    ]);
+    _verifyNavigationParams(params3and2);
+    //
+    // Recording parameters against a file should not affect the parameters for
+    // other files.
+    //
+    server.AnalysisNavigationParams params4 =
+        serverNavigationParams(6, 12, file: fileB);
+    manager.recordNavigationParams('a', fileB, params4);
+    _verifyNavigationParams(params4);
+  }
+
+  void test_recordOccurrences_noSubscription() {
+    server.Occurrences occurrences = serverOccurrences(0, 0);
+    manager.recordOccurrences('a', fileA, [occurrences]);
+    expect(channel.sentNotification, isNull);
+  }
+
+  void test_recordOccurrences_withSubscription() {
+    manager.setSubscriptions({
+      server.AnalysisService.OCCURRENCES: [fileA, fileB]
+    });
+    //
+    // Occurrences should be reported when they are recorded.
+    //
+    server.Occurrences occurrences1 = serverOccurrences(0, 0);
+    server.Occurrences occurrences2 = serverOccurrences(5, 7);
+    manager.recordOccurrences('a', fileA, [occurrences1, occurrences2]);
+    _verifyOccurrences(fileA, [occurrences1, occurrences2]);
+    //
+    // Occurrences from different plugins should be cumulative.
+    //
+    server.Occurrences occurrences3 = serverOccurrences(10, 14);
+    manager.recordOccurrences('b', fileA, [occurrences3]);
+    _verifyOccurrences(fileA, [occurrences1, occurrences2, occurrences3]);
+    //
+    // Overwriting occurrences from one plugin should not affect occurrences
+    // from other plugins.
+    //
+    server.Occurrences occurrences4 = serverOccurrences(15, 21);
+    manager.recordOccurrences('a', fileA, [occurrences4]);
+    _verifyOccurrences(fileA, [occurrences4, occurrences3]);
+    //
+    // Recording occurrences against a file should not affect the occurrences
+    // for other files.
+    //
+    server.Occurrences occurrences5 = serverOccurrences(20, 28);
+    manager.recordOccurrences('a', fileB, [occurrences5]);
+    _verifyOccurrences(fileB, [occurrences5]);
+  }
+
+  void test_recordOutlines_noSubscription() {
+    server.Outline outline = serverOutline(0, 0);
+    manager.recordOutlines('a', fileA, [outline]);
+    expect(channel.sentNotification, isNull);
+  }
+
+  @failingTest
+  void test_recordOutlines_withSubscription() {
+    fail('The outline handling needs to be re-worked slightly');
+    // TODO(brianwilkerson) Figure out outlines. What should we do when merge
+    // cannot produce a single outline?
+    manager.setSubscriptions({
+      server.AnalysisService.OUTLINE: [fileA, fileB]
+    });
+    //
+    // Outlines should be reported when they are recorded.
+    //
+    server.Outline outline1 = serverOutline(0, 0);
+    server.Outline outline2 = serverOutline(5, 7);
+    manager.recordOutlines('a', fileA, [outline1, outline2]);
+    // TODO(brianwilkerson) Figure out how to test this.
+//    _verifyOutlines(fileA, [outline1, outline2]);
+    //
+    // Outlines from different plugins should be cumulative.
+    //
+    server.Outline outline3 = serverOutline(10, 14);
+    manager.recordOutlines('b', fileA, [outline3]);
+    // TODO(brianwilkerson) Figure out how to test this.
+//    _verifyOutlines(fileA, [outline1, outline2, outline3]);
+    //
+    // Overwriting outlines from one plugin should not affect outlines from
+    // other plugins.
+    //
+    server.Outline outline4 = serverOutline(15, 21);
+    manager.recordOutlines('a', fileA, [outline4]);
+    // TODO(brianwilkerson) Figure out how to test this.
+//    _verifyOutlines(fileA, [outline4, outline3]);
+    //
+    // Recording outlines against a file should not affect the outlines for
+    // other files.
+    //
+    server.Outline outline5 = serverOutline(20, 28);
+    manager.recordOutlines('a', fileB, [outline5]);
+    // TODO(brianwilkerson) Figure out how to test this.
+//    _verifyOutlines(fileB, [outline5]);
+  }
+
+  void _verifyErrors(
+      String fileName, List<server.AnalysisError> expectedErrors) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.errors');
+    server.AnalysisErrorsParams params =
+        new server.AnalysisErrorsParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, fileName);
+    expect(params.errors, equals(expectedErrors));
+    channel.sentNotification = null;
+  }
+
+  void _verifyFoldingRegions(
+      String fileName, List<server.FoldingRegion> expectedRegions) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.folding');
+    server.AnalysisFoldingParams params =
+        new server.AnalysisFoldingParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, fileName);
+    expect(params.regions, equals(expectedRegions));
+    channel.sentNotification = null;
+  }
+
+  void _verifyHighlightRegions(
+      String fileName, List<server.HighlightRegion> expectedRegions) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.highlights');
+    server.AnalysisHighlightsParams params =
+        new server.AnalysisHighlightsParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, fileName);
+    expect(params.regions, equals(expectedRegions));
+    channel.sentNotification = null;
+  }
+
+  void _verifyNavigationParams(server.AnalysisNavigationParams expectedParams) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.navigation');
+    server.AnalysisNavigationParams params =
+        new server.AnalysisNavigationParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, expectedParams.file);
+    expect(params.files, equals(expectedParams.files));
+    expect(params.regions, equals(expectedParams.regions));
+    expect(params.targets, equals(expectedParams.targets));
+    channel.sentNotification = null;
+  }
+
+  void _verifyOccurrences(
+      String fileName, List<server.Occurrences> expectedOccurrences) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.occurrences');
+    server.AnalysisOccurrencesParams params =
+        new server.AnalysisOccurrencesParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, fileName);
+    expect(params.occurrences, equals(expectedOccurrences));
+    channel.sentNotification = null;
+  }
+
+  void _verifyOutlines(String fileName, server.Outline expectedOutline) {
+    server.Notification notification = channel.sentNotification;
+    expect(notification, isNotNull);
+    expect(notification.event, 'analysis.outline');
+    server.AnalysisOutlineParams params =
+        new server.AnalysisOutlineParams.fromNotification(notification);
+    expect(params, isNotNull);
+    expect(params.file, fileName);
+    expect(params.outline, equals(expectedOutline));
+    channel.sentNotification = null;
+  }
+}
+
+class TestChannel implements ServerCommunicationChannel {
+  server.Notification sentNotification;
+
+  @override
+  void close() {
+    fail('Unexpected invocation of close');
+  }
+
+  @override
+  void listen(void onRequest(server.Request request),
+      {Function onError, void onDone()}) {
+    fail('Unexpected invocation of listen');
+  }
+
+  @override
+  void sendNotification(server.Notification notification) {
+    sentNotification = notification;
+  }
+
+  @override
+  void sendResponse(server.Response response) {
+    fail('Unexpected invocation of sendResponse');
+  }
+}
diff --git a/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart b/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
index 37a3f01..4170658 100644
--- a/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
+++ b/pkg/analysis_server/test/src/plugin/protocol_test_utilities.dart
@@ -111,16 +111,16 @@
 
   /**
    * On return, increment [stringIndex] by 2 (or 3 if no [file] name is
-   * provided) and [intIndex] by 6.
+   * provided) and [intIndex] by 4.
    */
   plugin.AnalysisNavigationParams pluginNavigationParams(
           int stringIndex, int intIndex, {String file}) =>
       new plugin.AnalysisNavigationParams(
           file ?? fileName(stringIndex++), <plugin.NavigationRegion>[
-        new plugin.NavigationRegion(intIndex++, intIndex++, <int>[0])
+        new plugin.NavigationRegion(intIndex++, 2, <int>[0])
       ], <plugin.NavigationTarget>[
-        new plugin.NavigationTarget(plugin.ElementKind.FIELD, 0, intIndex++,
-            intIndex++, intIndex++, intIndex++)
+        new plugin.NavigationTarget(
+            plugin.ElementKind.FIELD, 0, intIndex++, 2, intIndex++, intIndex++)
       ], <String>[
         strings[stringIndex++],
         strings[stringIndex++]
@@ -230,16 +230,16 @@
 
   /**
    * On return, increment [stringIndex] by 2 (or 3 if no [file] name is
-   * provided) and [intIndex] by 6.
+   * provided) and [intIndex] by 4.
    */
   server.AnalysisNavigationParams serverNavigationParams(
           int stringIndex, int intIndex, {String file}) =>
       new server.AnalysisNavigationParams(
           file ?? fileName(stringIndex++), <server.NavigationRegion>[
-        new server.NavigationRegion(intIndex++, intIndex++, <int>[0])
+        new server.NavigationRegion(intIndex++, 2, <int>[0])
       ], <server.NavigationTarget>[
-        new server.NavigationTarget(server.ElementKind.FIELD, 0, intIndex++,
-            intIndex++, intIndex++, intIndex++)
+        new server.NavigationTarget(
+            server.ElementKind.FIELD, 0, intIndex++, 2, intIndex++, intIndex++)
       ], <String>[
         strings[stringIndex++],
         strings[stringIndex++]
diff --git a/pkg/analysis_server/test/src/plugin/test_all.dart b/pkg/analysis_server/test/src/plugin/test_all.dart
index 8037322..c99ac53 100644
--- a/pkg/analysis_server/test/src/plugin/test_all.dart
+++ b/pkg/analysis_server/test/src/plugin/test_all.dart
@@ -4,6 +4,7 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'notification_manager_test.dart' as notification_manager_test;
 import 'plugin_locator_test.dart' as plugin_locator_test;
 import 'result_collector_test.dart' as result_collector_test;
 import 'result_converter_test.dart' as result_converter_test;
@@ -11,6 +12,7 @@
 
 main() {
   defineReflectiveSuite(() {
+    notification_manager_test.main();
     plugin_locator_test.main();
     result_collector_test.main();
     result_converter_test.main();
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index 08beaa0..a8fb151 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -608,9 +608,6 @@
    *
    * If [checked] is `true`, the server's VM will be running in checked mode.
    *
-   * If [debugServer] is `true`, the server will be started with "--debug",
-   * allowing a debugger to be attached.
-   *
    * If [diagnosticPort] is not `null`, the server will serve status pages to
    * the specified port.
    *
@@ -625,7 +622,6 @@
    */
   Future<Null> start(
       {bool checked: true,
-      bool debugServer: false,
       int diagnosticPort,
       bool enableNewAnalysisDriver: false,
       bool profileServer: false,
@@ -644,9 +640,6 @@
     //
     // Add VM arguments.
     //
-    if (debugServer) {
-      arguments.add('--debug');
-    }
     if (profileServer) {
       if (servicesPort == null) {
         arguments.add('--observe');
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 8fb6d55..99e5ac0 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -298,6 +298,15 @@
   public void diagnostic_getDiagnostics(GetDiagnosticsConsumer consumer);
 
   /**
+   * {@code diagnostic.getServerPort}
+   *
+   * Return the port of the diagnostic web server. If the server is not running this call will start
+   * the server. If unable to start the diagnostic web server, this call will return an error of
+   * DEBUG_PORT_COULD_NOT_BE_OPENED.
+   */
+  public void diagnostic_getServerPort(GetServerPortConsumer consumer);
+
+  /**
    * {@code edit.format}
    *
    * Format the contents of a single file. The currently selected region of text is passed in so that
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
index 346bf63..37c06b5 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
@@ -30,6 +30,11 @@
   public static final String CONTENT_MODIFIED = "CONTENT_MODIFIED";
 
   /**
+   * The server was unable to open a port for the diagnostic server.
+   */
+  public static final String DEBUG_PORT_COULD_NOT_BE_OPENED = "DEBUG_PORT_COULD_NOT_BE_OPENED";
+
+  /**
    * A request specified a FilePath which does not match a file in an analysis root, or the requested
    * operation is not available for the file.
    */
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index d9213e2..2297a33 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -6,7 +6,7 @@
   </head>
   <body>
     <h1>Analysis Server API Specification</h1>
-    <h1 style="color:#999999">Version <version>1.17.0</version></h1>
+    <h1 style="color:#999999">Version <version>1.18.0</version></h1>
     <p>
       This document contains a specification of the API provided by the
       analysis server.  The API in this document is currently under
@@ -2049,6 +2049,19 @@
           </field>
         </result>
       </request>
+      <request method="getServerPort">
+        <p>
+          Return the port of the diagnostic web server. If the server is not running
+          this call will start the server. If unable to start the diagnostic web server,
+          this call will return an error of <tt>DEBUG_PORT_COULD_NOT_BE_OPENED</tt>.
+        </p>
+        <result>
+          <field name="port">
+            <ref>int</ref>
+            <p>The diagnostic server port.</p>
+          </field>
+        </result>
+      </request>
     </domain>
     <types>
       <h2 class="domain"><a name="types">Types</a></h2>
@@ -3731,6 +3744,12 @@
             </p>
           </value>
           <value>
+            <code>DEBUG_PORT_COULD_NOT_BE_OPENED</code>
+            <p>
+              The server was unable to open a port for the diagnostic server.
+            </p>
+          </value>
+          <value>
             <code>FILE_NOT_ANALYZED</code>
             <p>
               A request specified a FilePath which does not match a file in
diff --git a/pkg/analyzer/doc/tasks.html b/pkg/analyzer/doc/tasks.html
index 344f26d..6f5a691 100644
--- a/pkg/analyzer/doc/tasks.html
+++ b/pkg/analyzer/doc/tasks.html
@@ -186,6 +186,7 @@
   LIBRARY_SPECIFIC_UNITS [shape=box]
   LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
   LIBRARY_UNIT_ERRORS [shape=box]
+  LINE_INFO -> BuildCompilationUnitElementTask
   LINE_INFO -> DartErrorsTask
   LINE_INFO -> ParseDartTask
   LINE_INFO [shape=box]
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index f7dbe75..192485a 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -453,6 +453,11 @@
   bool get hasLoadLibraryFunction;
 
   /**
+   * Return the [LineInfo] for the [source], or `null` if not computed yet.
+   */
+  LineInfo get lineInfo;
+
+  /**
    * Return a list containing all of the top-level variables contained in this
    * compilation unit.
    */
@@ -719,7 +724,7 @@
    * Use the given [visitor] to visit this element. Return the value returned by
    * the visitor as a result of visiting this element.
    */
-  /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/> visitor);
+  /*=T*/ accept/*<T>*/(ElementVisitor<dynamic/*=T*/ > visitor);
 
   /**
    * Return the documentation comment for this element as it appears in the
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index 1871625..fe113b6 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -133,46 +133,38 @@
  * then remove the [ddc] named argument from this method.
  */
 void defineAnalysisArguments(ArgParser parser, {bool hide: true, ddc: false}) {
+  parser.addOption(sdkPathOption, help: 'The path to the Dart SDK.');
+  parser.addOption(analysisOptionsFileOption,
+      help: 'Path to an analysis options file.');
+  parser.addOption(packageRootOption,
+      help: 'The path to a package root directory (deprecated). '
+          'This option cannot be used with --packages.');
+  parser.addFlag(strongModeFlag,
+      help: 'Enable strong static checks (https://goo.gl/DqcBsw).',
+      defaultsTo: ddc);
+  parser.addFlag(noImplicitCastsFlag,
+      negatable: false,
+      help: 'Disable implicit casts in strong mode (https://goo.gl/cTLz40).');
+  parser.addFlag(noImplicitDynamicFlag,
+      negatable: false,
+      help: 'Disable implicit dynamic (https://goo.gl/m0UgXD).');
+
+  //
+  // Hidden flags and options.
+  //
   parser.addOption(defineVariableOption,
       abbr: 'D',
       allowMultiple: true,
       help: 'Define environment variables. For example, "-Dfoo=bar" defines an '
-          'environment variable named "foo" whose value is "bar".');
-
-  parser.addOption(sdkPathOption, help: 'The path to the Dart SDK.');
-  parser.addOption(sdkSummaryPathOption,
-      help: 'The path to the Dart SDK summary file.', hide: hide);
-
-  parser.addOption(analysisOptionsFileOption,
-      help: 'Path to an analysis options file.');
-
-  parser.addOption(packageRootOption,
-      abbr: 'p',
-      help: 'The path to a package root directory (deprecated). '
-          'This option cannot be used with --packages.');
+          'environment variable named "foo" whose value is "bar".',
+      hide: hide);
   parser.addOption(packagesOption,
       help: 'The path to the package resolution configuration file, which '
           'supplies a mapping of package names to paths. This option cannot be '
           'used with --package-root.',
       hide: ddc);
-
-  parser.addFlag(strongModeFlag,
-      help: 'Enable strong static checks (https://goo.gl/DqcBsw)',
-      defaultsTo: ddc);
-  parser.addFlag(noImplicitCastsFlag,
-      negatable: false,
-      help: 'Disable implicit casts in strong mode (https://goo.gl/cTLz40)');
-  parser.addFlag(noImplicitDynamicFlag,
-      negatable: false,
-      help: 'Disable implicit dynamic (https://goo.gl/m0UgXD)');
-  //
-  // Hidden flags and options.
-  //
-//  parser.addFlag(enableNullAwareOperatorsFlag, // 'enable-null-aware-operators'
-//      help: 'Enable support for null-aware operators (DEP 9).',
-//      defaultsTo: false,
-//      negatable: false,
-//      hide: hide || ddc);
+  parser.addOption(sdkSummaryPathOption,
+      help: 'The path to the Dart SDK summary file.', hide: hide);
   parser.addFlag(enableStrictCallChecksFlag,
       help: 'Fix issue 21938.',
       defaultsTo: false,
@@ -190,11 +182,6 @@
       defaultsTo: false,
       negatable: false,
       hide: hide);
-//  parser.addFlag('enable_type_checks',
-//      help: 'Check types in constant evaluation.',
-//      defaultsTo: false,
-//      negatable: false,
-//      hide: hide || ddc);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index fe6f5c3..2d8b0f1 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -25,8 +25,6 @@
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/workspace.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/summary/pub_summary.dart';
 import 'package:analyzer/src/summary/summary_sdk.dart';
 import 'package:analyzer/src/task/options.dart';
 import 'package:args/args.dart';
@@ -140,7 +138,6 @@
     context.name = path;
     //_processAnalysisOptions(context, optionMap);
     declareVariables(context);
-    configureSummaries(context);
     return context;
   }
 
@@ -164,25 +161,6 @@
     return driver;
   }
 
-  /**
-   * Configure the context to make use of summaries.
-   */
-  void configureSummaries(InternalAnalysisContext context) {
-    PubSummaryManager manager = builderOptions.pubSummaryManager;
-    if (manager != null) {
-      List<LinkedPubPackage> linkedBundles = manager.getLinkedBundles(context);
-      if (linkedBundles.isNotEmpty) {
-        SummaryDataStore store = new SummaryDataStore([]);
-        for (LinkedPubPackage package in linkedBundles) {
-          store.addBundle(null, package.unlinked);
-          store.addBundle(null, package.linked);
-        }
-        context.resultProvider =
-            new InputPackagesResultProvider(context, store);
-      }
-    }
-  }
-
   Map<String, List<Folder>> convertPackagesToMap(Packages packages) {
     Map<String, List<Folder>> folderMap = new HashMap<String, List<Folder>>();
     if (packages != null && packages != Packages.noPackages) {
@@ -628,11 +606,6 @@
   String defaultPackagesDirectoryPath;
 
   /**
-   * The manager of pub package summaries.
-   */
-  PubSummaryManager pubSummaryManager;
-
-  /**
    * Initialize a newly created set of options
    */
   ContextBuilderOptions();
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index 334a7ea..d1504d478 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -72,7 +72,7 @@
   /**
    * The version of data format, should be incremented on every format change.
    */
-  static const int DATA_VERSION = 20;
+  static const int DATA_VERSION = 22;
 
   /**
    * The number of exception contexts allowed to write. Once this field is
@@ -209,6 +209,11 @@
   final _resultController = new StreamController<AnalysisResult>();
 
   /**
+   * Resolution signatures of the most recently produced results for files.
+   */
+  final Map<String, String> _lastProducedSignatures = {};
+
+  /**
    * Cached results for [_priorityFiles].
    */
   final Map<String, AnalysisResult> _priorityResults = {};
@@ -247,7 +252,7 @@
       SourceFactory sourceFactory,
       this._analysisOptions,
       {PackageBundle sdkBundle,
-      this.analyzeWithoutTasks: false})
+      this.analyzeWithoutTasks: true})
       : _logger = logger,
         _sourceFactory = sourceFactory.clone(),
         _sdkBundle = sdkBundle {
@@ -695,9 +700,15 @@
    * Return `null` if the file is a part of an unknown library, so cannot be
    * analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is
    * analyzed anyway, even without a library.
+   *
+   * Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and
+   * the resolved signature of the file in its library is the same as the one
+   * that was the most recently produced to the client.
    */
   AnalysisResult _computeAnalysisResult(String path,
-      {bool withUnit: false, bool asIsIfPartWithoutLibrary: false}) {
+      {bool withUnit: false,
+      bool asIsIfPartWithoutLibrary: false,
+      bool skipIfSameSignature: false}) {
     FileState file = _fileTracker.fsState.getFileForPath(path);
 
     // Prepare the library - the file itself, or the known library.
@@ -710,12 +721,23 @@
       }
     }
 
+    // Prepare the signature and key.
+    String signature = _getResolvedUnitSignature(library, file);
+    String key = _getResolvedUnitKey(signature);
+
+    // Skip reading if the signature, so errors, are the same as the last time.
+    if (skipIfSameSignature) {
+      assert(!withUnit);
+      if (_lastProducedSignatures[path] == signature) {
+        return AnalysisResult._UNCHANGED;
+      }
+    }
+
     // If we don't need the fully resolved unit, check for the cached result.
     if (!withUnit) {
-      String key = _getResolvedUnitKey(library, file);
       List<int> bytes = _byteStore.get(key);
       if (bytes != null) {
-        return _getAnalysisResultFromBytes(file, bytes);
+        return _getAnalysisResultFromBytes(file, signature, bytes);
       }
     }
 
@@ -735,12 +757,19 @@
                 libraryContext.store,
                 library);
             Map<FileState, UnitAnalysisResult> results = analyzer.analyze();
-            UnitAnalysisResult fileResult = results[file];
-            resolvedUnit = fileResult.unit;
-
-            // Store the result into the cache.
-            bytes = _storeResolvedUnit(
-                library, file, resolvedUnit, fileResult.errors);
+            for (FileState unitFile in results.keys) {
+              UnitAnalysisResult unitResult = results[unitFile];
+              List<int> unitBytes =
+                  _serializeResolvedUnit(unitResult.unit, unitResult.errors);
+              String unitSignature =
+                  _getResolvedUnitSignature(library, unitFile);
+              String unitKey = _getResolvedUnitKey(unitSignature);
+              _byteStore.put(unitKey, unitBytes);
+              if (unitFile == file) {
+                bytes = unitBytes;
+                resolvedUnit = unitResult.unit;
+              }
+            }
           } else {
             ResolutionResult resolutionResult =
                 libraryContext.resolveUnit(library.source, file.source);
@@ -748,12 +777,14 @@
             List<AnalysisError> errors = resolutionResult.errors;
 
             // Store the result into the cache.
-            bytes = _storeResolvedUnit(library, file, resolvedUnit, errors);
+            bytes = _serializeResolvedUnit(resolvedUnit, errors);
+            _byteStore.put(key, bytes);
           }
 
           // Return the result, full or partial.
           _logger.writeln('Computed new analysis result.');
-          AnalysisResult result = _getAnalysisResultFromBytes(file, bytes,
+          AnalysisResult result = _getAnalysisResultFromBytes(
+              file, signature, bytes,
               content: withUnit ? file.content : null,
               withErrors: _fileTracker.addedFiles.contains(path),
               resolvedUnit: withUnit ? resolvedUnit : null);
@@ -844,7 +875,8 @@
    * Load the [AnalysisResult] for the given [file] from the [bytes]. Set
    * optional [content] and [resolvedUnit].
    */
-  AnalysisResult _getAnalysisResultFromBytes(FileState file, List<int> bytes,
+  AnalysisResult _getAnalysisResultFromBytes(
+      FileState file, String signature, List<int> bytes,
       {String content, bool withErrors: true, CompilationUnit resolvedUnit}) {
     var unit = new AnalysisDriverResolvedUnit.fromBuffer(bytes);
     List<AnalysisError> errors = withErrors
@@ -859,6 +891,7 @@
         content,
         file.contentHash,
         file.lineInfo,
+        signature,
         resolvedUnit,
         errors,
         unit.index);
@@ -885,11 +918,9 @@
   }
 
   /**
-   * Return the key to store fully resolved results for the [file] in the
-   * [library] into the cache.
+   * Return the key to store fully resolved results for the [signature].
    */
-  String _getResolvedUnitKey(FileState library, FileState file) {
-    String signature = _getResolvedUnitSignature(library, file);
+  String _getResolvedUnitKey(String signature) {
     return '$signature.resolved';
   }
 
@@ -1042,15 +1073,20 @@
       }
     }
 
+    // Analyze a general file.
     if (_fileTracker.hasPendingFiles) {
-      // Analyze a general file.
       String path = _fileTracker.anyPendingFile;
       try {
-        AnalysisResult result = _computeAnalysisResult(path, withUnit: false);
+        AnalysisResult result = _computeAnalysisResult(path,
+            withUnit: false, skipIfSameSignature: true);
         if (result == null) {
           _partsToAnalyze.add(path);
+        } else if (result == AnalysisResult._UNCHANGED) {
+          // We found that the set of errors is the same as we produced the
+          // last time, so we don't need to produce it again now.
         } else {
           _resultController.add(result);
+          _lastProducedSignatures[result.path] = result._signature;
         }
       } catch (exception, stackTrace) {
         _reportException(path, exception, stackTrace);
@@ -1110,6 +1146,25 @@
     _exceptionController.add(new ExceptionResult(path, caught, contextKey));
   }
 
+  /**
+   * Serialize the given [resolvedUnit] errors and index into bytes.
+   */
+  List<int> _serializeResolvedUnit(
+      CompilationUnit resolvedUnit, List<AnalysisError> errors) {
+    AnalysisDriverUnitIndexBuilder index = indexUnit(resolvedUnit);
+    return new AnalysisDriverResolvedUnitBuilder(
+            errors: errors
+                .map((error) => new AnalysisDriverUnitErrorBuilder(
+                    offset: error.offset,
+                    length: error.length,
+                    uniqueName: error.errorCode.uniqueName,
+                    message: error.message,
+                    correction: error.correction))
+                .toList(),
+            index: index)
+        .toBuffer();
+  }
+
   String _storeExceptionContext(
       String path, FileState libraryFile, exception, StackTrace stackTrace) {
     if (allowedNumberOfContextsToWrite <= 0) {
@@ -1158,30 +1213,6 @@
       return null;
     }
   }
-
-  /**
-   * Store the fully resolved results for the [file] in the [library] into the
-   * cache and return the stored bytes.
-   */
-  List<int> _storeResolvedUnit(FileState library, FileState file,
-      CompilationUnit resolvedUnit, List<AnalysisError> errors) {
-    AnalysisDriverUnitIndexBuilder index = indexUnit(resolvedUnit);
-
-    String key = _getResolvedUnitKey(library, file);
-    List<int> bytes = new AnalysisDriverResolvedUnitBuilder(
-            errors: errors
-                .map((error) => new AnalysisDriverUnitErrorBuilder(
-                    offset: error.offset,
-                    length: error.length,
-                    uniqueName: error.errorCode.uniqueName,
-                    message: error.message,
-                    correction: error.correction))
-                .toList(),
-            index: index)
-        .toBuffer();
-    _byteStore.put(key, bytes);
-    return bytes;
-  }
 }
 
 /**
@@ -1382,6 +1413,9 @@
  * any previously returned result, even inside of the same library.
  */
 class AnalysisResult {
+  static final _UNCHANGED = new AnalysisResult(
+      null, null, null, null, null, null, null, null, null, null, null, null);
+
   /**
    * The [AnalysisDriver] that produced this result.
    */
@@ -1425,6 +1459,13 @@
   final LineInfo lineInfo;
 
   /**
+   * The signature of the result based on the content of the file, and the
+   * transitive closure of files imported and exported by the the library of
+   * the requested file.
+   */
+  final String _signature;
+
+  /**
    * The fully resolved compilation unit for the [content].
    */
   final CompilationUnit unit;
@@ -1448,6 +1489,7 @@
       this.content,
       this.contentHash,
       this.lineInfo,
+      this._signature,
       this.unit,
       this.errors,
       this._index);
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 4718171..2e0d063 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -305,12 +305,14 @@
         bool defaultSuperInvocationNeeded = true;
         List<ConstructorInitializer> initializers =
             constant.constantInitializers;
-        for (ConstructorInitializer initializer in initializers) {
-          if (initializer is SuperConstructorInvocation ||
-              initializer is RedirectingConstructorInvocation) {
-            defaultSuperInvocationNeeded = false;
+        if (initializers != null) {
+          for (ConstructorInitializer initializer in initializers) {
+            if (initializer is SuperConstructorInvocation ||
+                initializer is RedirectingConstructorInvocation) {
+              defaultSuperInvocationNeeded = false;
+            }
+            initializer.accept(referenceFinder);
           }
-          initializer.accept(referenceFinder);
         }
         if (defaultSuperInvocationNeeded) {
           // No explicit superconstructor invocation found, so we need to
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ecd8ec6..c669ae1 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1300,6 +1300,9 @@
   @override
   Source source;
 
+  @override
+  LineInfo lineInfo;
+
   /**
    * The source of the library containing this compilation unit.
    *
@@ -2006,6 +2009,10 @@
       UnlinkedExecutable serializedExecutable, ClassElementImpl enclosingClass)
       : super.forSerialized(serializedExecutable, enclosingClass);
 
+  /**
+   * Return the constant initializers for this element, which will be empty if
+   * there are no initializers, or `null` if there was an error in the source.
+   */
   List<ConstructorInitializer> get constantInitializers {
     if (serializedExecutable != null && _constantInitializers == null) {
       _constantInitializers ??= serializedExecutable.constantInitializers
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index f8ae4a9..e38f5fe 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -209,6 +209,9 @@
   ElementKind get kind => ElementKind.COMPILATION_UNIT;
 
   @override
+  LineInfo get lineInfo => actualElement.lineInfo;
+
+  @override
   Source get source => actualElement.source;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
index 70f1124..f4f5348 100644
--- a/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
+++ b/pkg/analyzer/lib/src/dart/error/syntactic_errors.dart
@@ -450,6 +450,11 @@
       "Comment references should contain a possibly prefixed identifier and "
       "can start with 'new', but shouldn't contain anything else.");
 
+  static const ParserErrorCode INVALID_CONSTRUCTOR_NAME = const ParserErrorCode(
+      'INVALID_CONSTRUCTOR_NAME',
+      "The keyword '{0}' cannot be used to name a constructor.",
+      "Try giving the constructor a different name.");
+
   static const ParserErrorCode INVALID_HEX_ESCAPE = const ParserErrorCode(
       'INVALID_HEX_ESCAPE',
       "An escape sequence starting with '\\x' must be followed by 2 hexidecimal digits.");
diff --git a/pkg/analyzer/lib/src/generated/gn.dart b/pkg/analyzer/lib/src/generated/gn.dart
index 0e0b7fc..bf8ac4b 100644
--- a/pkg/analyzer/lib/src/generated/gn.dart
+++ b/pkg/analyzer/lib/src/generated/gn.dart
@@ -15,6 +15,21 @@
 import 'package:path/path.dart';
 
 /**
+ * Similar to Map#putIfAbsent, except that a value is stored only if it is not
+ * null.
+ */
+V _putIfNotNull<K, V>(Map<K, V> map, K key, V ifAbsent()) {
+  if (map.containsKey(key)) {
+    return map[key];
+  }
+  V computed = ifAbsent();
+  if (computed != null) {
+    map[key] = computed;
+  }
+  return computed;
+}
+
+/**
  * The [UriResolver] used to resolve `file` URIs in a [GnWorkspace].
  */
 class GnFileUriResolver extends ResourceUriResolver {
@@ -60,11 +75,6 @@
   final Context pathContext;
 
   /**
-   * The map of package sources indexed by package name.
-   */
-  final Map<String, String> _packages;
-
-  /**
    * The cache of absolute [Uri]s to [Source]s mappings.
    */
   final Map<Uri, Source> _sourceCache = new HashMap<Uri, Source>();
@@ -75,12 +85,11 @@
    */
   GnPackageUriResolver(GnWorkspace workspace)
       : workspace = workspace,
-        pathContext = workspace.provider.pathContext,
-        _packages = workspace.packages;
+        pathContext = workspace.provider.pathContext;
 
   @override
   Source resolveAbsolute(Uri uri, [Uri actualUri]) {
-    return _sourceCache.putIfAbsent(uri, () {
+    return _putIfNotNull(_sourceCache, uri, () {
       if (uri.scheme != 'package') {
         return null;
       }
@@ -97,10 +106,10 @@
       String fileUriPart = uriPath.substring(slash + 1);
       String filePath = fileUriPart.replaceAll('/', pathContext.separator);
 
-      if (!_packages.containsKey(packageName)) {
+      String packageBase = workspace.getPackageSource(packageName);
+      if (packageBase == null) {
         return null;
       }
-      String packageBase = _packages[packageName];
       String path = pathContext.join(packageBase, filePath);
       File file = workspace.findFile(path);
       return file?.createSource(uri);
@@ -116,15 +125,15 @@
       return null;
     }
 
-    String package = _packages.keys.firstWhere(
-        (key) => context.isWithin(_packages[key], path),
+    String package = workspace.packages.keys.firstWhere(
+        (key) => context.isWithin(workspace.packages[key], path),
         orElse: () => null);
-
     if (package == null) {
       return null;
     }
 
-    String sourcePath = context.relative(path, from: _packages[package]);
+    String sourcePath =
+        context.relative(path, from: workspace.packages[package]);
 
     return Uri.parse('package:$package/$sourcePath');
   }
@@ -151,16 +160,43 @@
   final String root;
 
   /**
-   * The map of package sources indexed by package name.
+   * The path to the directory with source locations.
+   *
+   * Each file in this directory is named after a Dart package and contains the
+   * path to the package's sources.
    */
-  final Map<String, String> packages;
+  final String _packagesDirectoryPath;
 
-  GnWorkspace._(this.provider, this.root, this.packages);
+  /**
+   * The cache of package locations indexed by package name.
+   */
+  final Map<String, String> _packageCache = new HashMap<String, String>();
+
+  GnWorkspace._internal(this.provider, this.root, this._packagesDirectoryPath);
+
+  factory GnWorkspace._(
+      ResourceProvider provider, String root, String packagesDirectoryPath) {
+    GnWorkspace workspace =
+        new GnWorkspace._internal(provider, root, packagesDirectoryPath);
+    // Preload known packages.
+    provider
+        .getFolder(packagesDirectoryPath)
+        .getChildren()
+        .where((resource) => resource is File)
+        .map((resource) => resource as File)
+        .forEach((file) {
+      String packageName = basename(file.path);
+      workspace.getPackageSource(packageName);
+    });
+    return workspace;
+  }
+
+  Map<String, String> get packages => _packageCache;
 
   @override
   Map<String, List<Folder>> get packageMap {
     Map<String, List<Folder>> result = new HashMap<String, List<Folder>>();
-    packages.forEach((package, sourceDir) {
+    _packageCache.forEach((package, sourceDir) {
       result[package] = [provider.getFolder(sourceDir)];
     });
     return result;
@@ -181,6 +217,18 @@
   }
 
   /**
+   * Return the source directory for the given package, or null if it could not
+   * be found.
+   */
+  String getPackageSource(String packageName) {
+    return _putIfNotNull(_packageCache, packageName, () {
+      String path =
+          provider.pathContext.join(_packagesDirectoryPath, packageName);
+      return findFile(path)?.readAsStringSync();
+    });
+  }
+
+  /**
    * Return the file with the given [absolutePath].
    *
    * Return `null` if the given [absolutePath] is not in the workspace [root].
@@ -188,47 +236,33 @@
   File findFile(String absolutePath) {
     try {
       File writableFile = provider.getFile(absolutePath);
-      return writableFile;
-    } catch (_) {
-      return null;
-    }
+      if (writableFile.exists) {
+        return writableFile;
+      }
+    } catch (_) {}
+    return null;
   }
 
   /**
-   * Locate the output directory.
+   * Locate the Dart sources directory.
    *
    * Return `null` if it could not be found.
    */
-  static String _getOutDirectory(ResourceProvider provider, String root) =>
-      provider
-          .getFolder('$root/out')
-          .getChildren()
-          .where((resource) => resource is Folder)
-          .map((resource) => resource as Folder)
-          .firstWhere((Folder folder) {
-        String baseName = basename(folder.path);
-        // TODO(pylaligand): find a better way to locate the proper directory.
-        return baseName.startsWith('debug') || baseName.startsWith('release');
-      }, orElse: () => null)?.path;
-
-  /**
-   * Return a map of package source locations indexed by package name.
-   */
-  static Map<String, String> _getPackages(
-      ResourceProvider provider, String outDirectory) {
-    String packagesDir = '$outDirectory/gen/dart.sources';
-    Map<String, String> result = new HashMap<String, String>();
-    provider
-        .getFolder(packagesDir)
+  static String _getPackagesDirectory(ResourceProvider provider, String root) {
+    Context pathContext = provider.pathContext;
+    String outDirectory = provider
+        .getFolder(pathContext.join(root, 'out'))
         .getChildren()
-        .where((resource) => resource is File)
-        .map((resource) => resource as File)
-        .forEach((file) {
-      String packageName = basename(file.path);
-      String source = file.readAsStringSync();
-      result[packageName] = source;
-    });
-    return result;
+        .where((resource) => resource is Folder)
+        .map((resource) => resource as Folder)
+        .firstWhere((Folder folder) {
+      String baseName = basename(folder.path);
+      // TODO(pylaligand): find a better way to locate the proper directory.
+      return baseName.startsWith('debug') || baseName.startsWith('release');
+    }, orElse: () => null)?.path;
+    return outDirectory == null
+        ? null
+        : provider.pathContext.join(outDirectory, 'gen', 'dart.sources');
   }
 
   /**
@@ -256,9 +290,8 @@
       // Found the .jiri_root file, must be a non-git workspace.
       if (folder.getChildAssumingFolder(_jiriRootName).exists) {
         String root = folder.path;
-        String outDirectory = _getOutDirectory(provider, root);
-        Map<String, String> packages = _getPackages(provider, outDirectory);
-        return new GnWorkspace._(provider, root, packages);
+        String packagesDirectory = _getPackagesDirectory(provider, root);
+        return new GnWorkspace._(provider, root, packagesDirectory);
       }
 
       // Go up the folder.
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index b8906c1..2c5cafc 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -249,12 +249,6 @@
   bool _inInitializer = false;
 
   /**
-   * A flag indicating whether the parser is to parse generic function type
-   * syntax.
-   */
-  bool parseGenericFunctionTypes = false;
-
-  /**
    * A flag indicating whether the parser is to parse generic method syntax.
    */
   @deprecated
@@ -1385,8 +1379,12 @@
       }
       return null;
     } else if (_tokenMatches(next, TokenType.PERIOD) &&
-        _tokenMatchesIdentifier(_peekAt(2)) &&
+        _tokenMatchesIdentifierOrKeyword(_peekAt(2)) &&
         _tokenMatches(_peekAt(3), TokenType.OPEN_PAREN)) {
+      if (!_tokenMatchesIdentifier(_peekAt(2))) {
+        _reportErrorForToken(ParserErrorCode.INVALID_CONSTRUCTOR_NAME,
+            _peekAt(2), [_peekAt(2).lexeme]);
+      }
       return _parseConstructor(
           commentAndMetadata,
           modifiers.externalKeyword,
@@ -1394,7 +1392,7 @@
           modifiers.factoryKeyword,
           parseSimpleIdentifier(),
           getAndAdvance(),
-          parseSimpleIdentifier(isDeclaration: true),
+          parseSimpleIdentifier(allowKeyword: true, isDeclaration: true),
           parseFormalParameterList());
     } else if (_tokenMatches(next, TokenType.OPEN_PAREN)) {
       TypeName returnType = _parseOptionalTypeNameComment();
@@ -4688,8 +4686,10 @@
    *     identifier ::=
    *         IDENTIFIER
    */
-  SimpleIdentifier parseSimpleIdentifier({bool isDeclaration: false}) {
-    if (_matchesIdentifier()) {
+  SimpleIdentifier parseSimpleIdentifier(
+      {bool allowKeyword: false, bool isDeclaration: false}) {
+    if (_matchesIdentifier() ||
+        (allowKeyword && _tokenMatchesIdentifierOrKeyword(_currentToken))) {
       return _parseSimpleIdentifierUnchecked(isDeclaration: isDeclaration);
     }
     _reportErrorForCurrentToken(ParserErrorCode.MISSING_IDENTIFIER);
@@ -5057,24 +5057,21 @@
    *       | functionType
    */
   TypeAnnotation parseTypeAnnotation(bool inExpression) {
-    if (parseGenericFunctionTypes) {
-      TypeAnnotation type = null;
-      if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
-        // Generic function type with no return type.
-        type = parseGenericFunctionTypeAfterReturnType(null);
-      } else if (_currentToken.keyword == Keyword.VOID &&
-          _atGenericFunctionTypeAfterReturnType(_currentToken.next)) {
-        type = astFactory.typeName(
-            astFactory.simpleIdentifier(getAndAdvance()), null);
-      } else {
-        type = parseTypeName(inExpression);
-      }
-      while (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
-        type = parseGenericFunctionTypeAfterReturnType(type);
-      }
-      return type;
+    TypeAnnotation type = null;
+    if (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
+      // Generic function type with no return type.
+      type = parseGenericFunctionTypeAfterReturnType(null);
+    } else if (_currentToken.keyword == Keyword.VOID &&
+        _atGenericFunctionTypeAfterReturnType(_currentToken.next)) {
+      type = astFactory.typeName(
+          astFactory.simpleIdentifier(getAndAdvance()), null);
+    } else {
+      type = parseTypeName(inExpression);
     }
-    return parseTypeName(inExpression);
+    while (_atGenericFunctionTypeAfterReturnType(_currentToken)) {
+      type = parseGenericFunctionTypeAfterReturnType(type);
+    }
+    return type;
   }
 
   /**
@@ -5535,22 +5532,19 @@
    * This method must be kept in sync with [parseTypeAnnotation].
    */
   Token skipTypeAnnotation(Token startToken) {
-    if (parseGenericFunctionTypes) {
-      Token next = null;
-      if (_atGenericFunctionTypeAfterReturnType(startToken)) {
-        next = skipGenericFunctionTypeAfterReturnType(startToken);
-      } else if (_currentToken.keyword == Keyword.VOID &&
-          _atGenericFunctionTypeAfterReturnType(_currentToken.next)) {
-        next = next.next;
-      } else {
-        next = skipTypeName(startToken);
-      }
-      while (next != null && _tokenMatchesString(next, 'Function')) {
-        next = skipGenericFunctionTypeAfterReturnType(next);
-      }
-      return next;
+    Token next = null;
+    if (_atGenericFunctionTypeAfterReturnType(startToken)) {
+      next = skipGenericFunctionTypeAfterReturnType(startToken);
+    } else if (_currentToken.keyword == Keyword.VOID &&
+        _atGenericFunctionTypeAfterReturnType(_currentToken.next)) {
+      next = next.next;
+    } else {
+      next = skipTypeName(startToken);
     }
-    return skipTypeName(startToken);
+    while (next != null && _atGenericFunctionTypeAfterReturnType(next)) {
+      next = skipGenericFunctionTypeAfterReturnType(next);
+    }
+    return next;
   }
 
   /**
@@ -7974,6 +7968,13 @@
       _tokenMatchesPseudoKeyword(token);
 
   /**
+   * Return `true` if the given [token] is either an identifier or a keyword.
+   */
+  bool _tokenMatchesIdentifierOrKeyword(Token token) =>
+      _tokenMatches(token, TokenType.IDENTIFIER) ||
+      _tokenMatches(token, TokenType.KEYWORD);
+
+  /**
    * Return `true` if the given [token] matches the given [keyword].
    */
   bool _tokenMatchesKeyword(Token token, Keyword keyword) =>
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 9ad6c5c..c86b37c 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -2114,8 +2114,8 @@
   List<String> get parts => _parts ??= <String>[];
 
   /**
-   * URI for the compilation units listed in the library's `part` declarations.
-   * These URIs are relative to the importing library.
+   * Absolute URI for the compilation units listed in the library's `part`
+   * declarations, empty string for invalid URI.
    */
   void set parts(List<String> value) {
     this._parts = value;
@@ -2125,11 +2125,7 @@
   String get uri => _uri ??= '';
 
   /**
-   * The relative URI of the dependent library.  This URI is relative to the
-   * importing library, even if there are intervening `export` declarations.
-   * So, for example, if `a.dart` imports `b/c.dart` and `b/c.dart` exports
-   * `d/e.dart`, the URI listed for `a.dart`'s dependency on `e.dart` will be
-   * `b/d/e.dart`.
+   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
    */
   void set uri(String value) {
     this._uri = value;
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 84e37ff..c0d461a 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -1179,17 +1179,13 @@
  */
 table LinkedDependency {
   /**
-   * URI for the compilation units listed in the library's `part` declarations.
-   * These URIs are relative to the importing library.
+   * Absolute URI for the compilation units listed in the library's `part`
+   * declarations, empty string for invalid URI.
    */
   parts:[string] (id: 1);
 
   /**
-   * The relative URI of the dependent library.  This URI is relative to the
-   * importing library, even if there are intervening `export` declarations.
-   * So, for example, if `a.dart` imports `b/c.dart` and `b/c.dart` exports
-   * `d/e.dart`, the URI listed for `a.dart`'s dependency on `e.dart` will be
-   * `b/d/e.dart`.
+   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
    */
   uri:string (id: 0);
 }
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index e6f142d..3389fee 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -596,18 +596,14 @@
  */
 abstract class LinkedDependency extends base.SummaryClass {
   /**
-   * URI for the compilation units listed in the library's `part` declarations.
-   * These URIs are relative to the importing library.
+   * Absolute URI for the compilation units listed in the library's `part`
+   * declarations, empty string for invalid URI.
    */
   @Id(1)
   List<String> get parts;
 
   /**
-   * The relative URI of the dependent library.  This URI is relative to the
-   * importing library, even if there are intervening `export` declarations.
-   * So, for example, if `a.dart` imports `b/c.dart` and `b/c.dart` exports
-   * `d/e.dart`, the URI listed for `a.dart`'s dependency on `e.dart` will be
-   * `b/d/e.dart`.
+   * The absolute URI of the dependent library, e.g. `package:foo/bar.dart`.
    */
   @Id(0)
   String get uri;
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index a97a11b..3d5a098 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -146,21 +146,11 @@
       <String, LinkedLibraryBuilder>{};
   for (String absoluteUri in libraryUris) {
     Uri uri = Uri.parse(absoluteUri);
-
-    UnlinkedUnit getRelativeUnit(String relativeUriStr) {
-      Uri relativeUri;
-      try {
-        relativeUri = Uri.parse(relativeUriStr);
-      } on FormatException {
-        return new UnlinkedUnitBuilder();
-      }
-      return getUnit(resolveRelativeUri(uri, relativeUri).toString());
-    }
-
     linkedLibraries[absoluteUri] = prelink(
+        absoluteUri,
         getUnit(absoluteUri),
-        getRelativeUnit,
-        (String relativeUri) => getRelativeUnit(relativeUri)?.publicNamespace,
+        getUnit,
+        (String absoluteUri) => getUnit(absoluteUri)?.publicNamespace,
         getDeclaredVariable);
   }
   return linkedLibraries;
@@ -3371,9 +3361,8 @@
           continue;
         }
 
-        String partAbsoluteUri = resolveRelativeUri(
-                _absoluteUri, partRelativeUri)
-            .toString();
+        String partAbsoluteUri =
+            resolveRelativeUri(_absoluteUri, partRelativeUri).toString();
         UnlinkedUnit partUnit = _linker.getUnit(partAbsoluteUri);
         _units.add(_makeUnitElement(
             partUnit ?? new UnlinkedUnitBuilder(), i + 1, partAbsoluteUri));
@@ -3415,19 +3404,19 @@
   LibraryElementForLink _getDependency(int index) {
     LibraryElementForLink result = _dependencies[index];
     if (result == null) {
-      String relativeUriStr = _linkedLibrary.dependencies[index].uri;
-
-      Uri relativeUri;
-      try {
-        relativeUri = Uri.parse(relativeUriStr);
-      } on FormatException {
-        return null;
+      Uri uri;
+      String uriStr = _linkedLibrary.dependencies[index].uri;
+      if (uriStr.isEmpty) {
+        uri = _absoluteUri;
+      } else {
+        try {
+          uri = Uri.parse(uriStr);
+        } on FormatException {
+          return null;
+        }
       }
 
-      Uri absoluteUri = relativeUriStr.isEmpty
-          ? _absoluteUri
-          : resolveRelativeUri(_absoluteUri, relativeUri);
-      result = _linker.getLibrary(absoluteUri);
+      result = _linker.getLibrary(uri);
       _dependencies[index] = result;
     }
     return result;
@@ -3492,12 +3481,12 @@
     Uri libraryUri = library._absoluteUri;
     List<String> partsRelativeToDependency =
         library.definingUnlinkedUnit.publicNamespace.parts;
-    List<String> partsRelativeToLibraryBeingLinked = partsRelativeToDependency
+    List<String> partsAbsolute = partsRelativeToDependency
         .map((partUri) =>
             resolveRelativeUri(libraryUri, Uri.parse(partUri)).toString())
         .toList();
     _linkedLibrary.dependencies.add(new LinkedDependencyBuilder(
-        parts: partsRelativeToLibraryBeingLinked, uri: libraryUri.toString()));
+        parts: partsAbsolute, uri: libraryUri.toString()));
     _dependencies.add(library);
     return result;
   }
diff --git a/pkg/analyzer/lib/src/summary/prelink.dart b/pkg/analyzer/lib/src/summary/prelink.dart
index 33ce0f9..1e64b4a 100644
--- a/pkg/analyzer/lib/src/summary/prelink.dart
+++ b/pkg/analyzer/lib/src/summary/prelink.dart
@@ -8,17 +8,22 @@
 import 'package:analyzer/src/summary/name_filter.dart';
 
 /**
- * Create a [LinkedLibraryBuilder] corresponding to the given
- * [definingUnit], which should be the defining compilation unit for a library.
- * Compilation units referenced by the defining compilation unit via `part`
- * declarations will be retrieved using [getPart].  Public namespaces for
- * libraries referenced by the defining compilation unit via `import`
+ * Create a [LinkedLibraryBuilder] corresponding to the given [definingUnitUri]
+ * and [definingUnit], which should be the defining compilation unit for a
+ * library. Compilation units referenced by the defining compilation unit via
+ * `part` declarations will be retrieved using [getPart].  Public namespaces
+ * for libraries referenced by the defining compilation unit via `import`
  * declarations (and files reachable from them via `part` and `export`
  * declarations) will be retrieved using [getImport].
  */
-LinkedLibraryBuilder prelink(UnlinkedUnit definingUnit, GetPartCallback getPart,
-    GetImportCallback getImport, GetDeclaredVariable getDeclaredVariable) {
-  return new _Prelinker(definingUnit, getPart, getImport, getDeclaredVariable)
+LinkedLibraryBuilder prelink(
+    String definingUnitUri,
+    UnlinkedUnit definingUnit,
+    GetPartCallback getPart,
+    GetImportCallback getImport,
+    GetDeclaredVariable getDeclaredVariable) {
+  return new _Prelinker(definingUnitUri, definingUnit, getPart, getImport,
+          getDeclaredVariable)
       .prelink();
 }
 
@@ -30,24 +35,21 @@
 
 /**
  * Type of the callback used by the prelinker to obtain public namespace
- * information about libraries imported by the library to be prelinked (and
- * the transitive closure of parts and exports reachable from those libraries).
- * [relativeUri] should be interpreted relative to the defining compilation
- * unit of the library being prelinked.
+ * information about libraries with the given [absoluteUri] imported by the
+ * library to be prelinked (and the transitive closure of parts and exports
+ * reachable from those libraries).
  *
  * If no file exists at the given uri, `null` should be returned.
  */
-typedef UnlinkedPublicNamespace GetImportCallback(String relativeUri);
+typedef UnlinkedPublicNamespace GetImportCallback(String absoluteUri);
 
 /**
  * Type of the callback used by the prelinker to obtain unlinked summaries of
- * part files of the library to be prelinked.  [relativeUri] should be
- * interpreted relative to the defining compilation unit of the library being
- * prelinked.
+ * part files of the library to be prelinked.
  *
  * If no file exists at the given uri, `null` should be returned.
  */
-typedef UnlinkedUnit GetPartCallback(String relativeUri);
+typedef UnlinkedUnit GetPartCallback(String absoluteUri);
 
 /**
  * A [_Meaning] representing a class.
@@ -184,11 +186,9 @@
 /**
  * Helper class containing temporary data structures needed to prelink a single
  * library.
- *
- * Note: throughout this class, a `null` value for a relative URI represents
- * the defining compilation unit of the library being prelinked.
  */
 class _Prelinker {
+  final String definingUnitUri;
   final UnlinkedUnit definingUnit;
   final GetPartCallback getPart;
   final GetImportCallback getImport;
@@ -216,42 +216,42 @@
    * List of dependencies of the library being prelinked.  This will be output
    * to [LinkedLibrary.dependencies].
    */
-  final List<LinkedDependencyBuilder> dependencies = <LinkedDependencyBuilder>[
-    new LinkedDependencyBuilder()
-  ];
+  final List<LinkedDependencyBuilder> dependencies =
+      <LinkedDependencyBuilder>[];
 
   /**
-   * Map from the relative URI of a dependent library to the index of the
+   * Map from the absolute URI of a dependent library to the index of the
    * corresponding entry in [dependencies].
    */
-  final Map<String, int> uriToDependency = <String, int>{null: 0};
+  final Map<String, int> uriToDependency = <String, int>{};
 
   /**
    * List of public namespaces corresponding to each entry in [dependencies].
    */
-  final List<_Namespace> dependencyToPublicNamespace = <_Namespace>[null];
+  final List<_Namespace> dependencyToPublicNamespace = <_Namespace>[];
 
-  _Prelinker(this.definingUnit, this.getPart, this.getImport,
-      this.getDeclaredVariable) {
-    partCache[null] = definingUnit;
-    importCache[null] = definingUnit.publicNamespace;
+  _Prelinker(this.definingUnitUri, this.definingUnit, this.getPart,
+      this.getImport, this.getDeclaredVariable) {
+    partCache[definingUnitUri] = definingUnit;
+    importCache[definingUnitUri] = definingUnit.publicNamespace;
   }
 
   /**
    * Compute the public namespace for the library whose URI is reachable from
-   * [definingUnit] via [relativeUri], by aggregating together public namespace
+   * [definingUnit] via [absoluteUri], by aggregating together public namespace
    * information from all of its parts.
    */
-  _Namespace aggregatePublicNamespace(String relativeUri) {
-    if (uriToDependency.containsKey(relativeUri)) {
-      return dependencyToPublicNamespace[uriToDependency[relativeUri]];
+  _Namespace aggregatePublicNamespace(String absoluteUri) {
+    if (uriToDependency.containsKey(absoluteUri)) {
+      return dependencyToPublicNamespace[uriToDependency[absoluteUri]];
     }
     assert(dependencies.length == dependencyToPublicNamespace.length);
     int dependency = dependencies.length;
-    uriToDependency[relativeUri] = dependency;
-    List<String> unitUris = getUnitUris(relativeUri);
+    uriToDependency[absoluteUri] = dependency;
+    List<String> unitUris = getUnitUris(absoluteUri);
     LinkedDependencyBuilder linkedDependency = new LinkedDependencyBuilder(
-        uri: relativeUri, parts: unitUris.sublist(1));
+        uri: absoluteUri,
+        parts: unitUris.skip(1).map((uri) => uri ?? '').toList());
     dependencies.add(linkedDependency);
 
     _Namespace aggregated = new _Namespace();
@@ -292,42 +292,39 @@
 
   /**
    * Compute the export namespace for the library whose URI is reachable from
-   * [definingUnit] via [relativeUri], by aggregating together public namespace
+   * [definingUnit] via [absoluteUri], by aggregating together public namespace
    * information from the library and the transitive closure of its exports.
-   *
-   * If [relativeUri] is `null` (meaning the export namespace of [definingUnit]
-   * should be computed), then names defined in [definingUnit] are ignored.
    */
-  _Namespace computeExportNamespace(String relativeUri) {
+  _Namespace computeExportNamespace(String absoluteUri) {
     Set<String> seenUris = new Set<String>();
-    _Namespace chaseExports(String relativeUri, NameFilter filter) {
-      _Namespace exportedNamespace = relativeUri == null
-          ? new _Namespace()
-          : aggregatePublicNamespace(relativeUri);
-      if (seenUris.add(relativeUri)) {
-        UnlinkedPublicNamespace publicNamespace = getImportCached(relativeUri);
+    _Namespace chaseExports(String absoluteUri, NameFilter filter) {
+      _Namespace exportedNamespace = aggregatePublicNamespace(absoluteUri);
+      if (seenUris.add(absoluteUri)) {
+        UnlinkedPublicNamespace publicNamespace = getImportCached(absoluteUri);
         if (publicNamespace != null) {
           for (UnlinkedExportPublic export in publicNamespace.exports) {
-            String relativeExportUri =
+            String unlinkedExportUri =
                 _selectUri(export.uri, export.configurations);
-            String exportUri = resolveUri(relativeUri, relativeExportUri);
-            NameFilter newFilter = filter.merge(
-                new NameFilter.forUnlinkedCombinators(export.combinators));
-            _Namespace exportNamespace = chaseExports(exportUri, newFilter);
-            exportNamespace.forEach((String name, _Meaning meaning) {
-              if (newFilter.accepts(name) &&
-                  !exportedNamespace.definesLibraryName(name)) {
-                exportedNamespace.add(name, meaning);
-              }
-            });
+            String exportUri = resolveUri(absoluteUri, unlinkedExportUri);
+            if (exportUri != null) {
+              NameFilter newFilter = filter.merge(
+                  new NameFilter.forUnlinkedCombinators(export.combinators));
+              _Namespace exportNamespace = chaseExports(exportUri, newFilter);
+              exportNamespace.forEach((String name, _Meaning meaning) {
+                if (newFilter.accepts(name) &&
+                    !exportedNamespace.definesLibraryName(name)) {
+                  exportedNamespace.add(name, meaning);
+                }
+              });
+            }
           }
         }
-        seenUris.remove(relativeUri);
+        seenUris.remove(absoluteUri);
       }
       return exportedNamespace;
     }
 
-    return chaseExports(relativeUri, NameFilter.identity);
+    return chaseExports(absoluteUri, NameFilter.identity);
   }
 
   /**
@@ -404,14 +401,14 @@
   }
 
   /**
-   * Filter the export namespace for the library whose URI is reachable from
-   * [definingUnit] via [relativeUri], retaining only those names accepted by
+   * Filter the export namespace for the library whose URI is reachable the
+   * given [absoluteUri], retaining only those names accepted by
    * [combinators], and store the resulting names in [result].  Names that
    * already exist in [result] are not overwritten.
    */
-  void filterExportNamespace(String relativeUri,
+  void filterExportNamespace(String absoluteUri,
       List<UnlinkedCombinator> combinators, _Namespace result) {
-    _Namespace exportNamespace = computeExportNamespace(relativeUri);
+    _Namespace exportNamespace = computeExportNamespace(absoluteUri);
     if (result == null) {
       // This can happen if the import prefix was shadowed by a local name, so
       // the imported symbols are inaccessible.
@@ -428,32 +425,33 @@
   /**
    * Wrapper around [getImport] that caches the return value in [importCache].
    */
-  UnlinkedPublicNamespace getImportCached(String relativeUri) {
-    return importCache.putIfAbsent(relativeUri, () => getImport(relativeUri));
+  UnlinkedPublicNamespace getImportCached(String absoluteUri) {
+    return importCache.putIfAbsent(absoluteUri, () => getImport(absoluteUri));
   }
 
   /**
    * Wrapper around [getPart] that caches the return value in [partCache] and
    * updates [importCache] appropriately.
    */
-  UnlinkedUnit getPartCached(String relativeUri) {
-    return partCache.putIfAbsent(relativeUri, () {
-      UnlinkedUnit unit = getPart(relativeUri);
-      importCache[relativeUri] = unit?.publicNamespace;
+  UnlinkedUnit getPartCached(String absoluteUri) {
+    return partCache.putIfAbsent(absoluteUri, () {
+      UnlinkedUnit unit = getPart(absoluteUri);
+      importCache[absoluteUri] = unit?.publicNamespace;
       return unit;
     });
   }
 
   /**
-   * Compute the set of relative URIs of all the compilation units in the
-   * library whose URI is reachable from [definingUnit] via [relativeUri].
+   * Compute the set of absolute URIs of all the compilation units in the
+   * library whose URI is reachable from [definingUnit] via [absoluteUri].
    */
-  List<String> getUnitUris(String relativeUri) {
-    List<String> result = <String>[relativeUri];
-    UnlinkedPublicNamespace publicNamespace = getImportCached(relativeUri);
+  List<String> getUnitUris(String absoluteUri) {
+    List<String> result = <String>[absoluteUri];
+    UnlinkedPublicNamespace publicNamespace = getImportCached(absoluteUri);
     if (publicNamespace != null) {
-      result.addAll(publicNamespace.parts
-          .map((String uri) => resolveUri(relativeUri, uri)));
+      result.addAll(publicNamespace.parts.map((String uri) {
+        return resolveUri(absoluteUri, uri);
+      }));
     }
     return result;
   }
@@ -463,9 +461,11 @@
    * return value is the index of the imported library in [dependencies].
    */
   int handleImport(UnlinkedImport import) {
-    String uri = import.isImplicit
+    String unlinkedUri = import.isImplicit
         ? 'dart:core'
         : _selectUri(import.uri, import.configurations);
+    String absoluteUri = resolveUri(definingUnitUri, unlinkedUri);
+
     _Namespace targetNamespace = null;
     if (import.prefixReference != 0) {
       // The name introduced by an import declaration can't have a prefix of
@@ -480,8 +480,8 @@
     } else {
       targetNamespace = privateNamespace;
     }
-    filterExportNamespace(uri, import.combinators, targetNamespace);
-    return uriToDependency[uri];
+    filterExportNamespace(absoluteUri, import.combinators, targetNamespace);
+    return uriToDependency[absoluteUri];
   }
 
   /**
@@ -527,9 +527,12 @@
    * constructor.
    */
   LinkedLibraryBuilder prelink() {
+    aggregatePublicNamespace(definingUnitUri);
+
     // Gather up the unlinked summaries for all the compilation units in the
     // library.
-    List<UnlinkedUnit> units = getUnitUris(null).map(getPartCached).toList();
+    List<String> unitUris = getUnitUris(definingUnitUri);
+    List<UnlinkedUnit> units = unitUris.map(getPartCached).toList();
 
     // Create the private namespace for the library by gathering all the names
     // defined in its compilation units.
@@ -544,7 +547,8 @@
     // defined in import declarations, because prefixes shouldn't shadow
     // exports.
     List<LinkedExportNameBuilder> exportNames = <LinkedExportNameBuilder>[];
-    computeExportNamespace(null).forEach((String name, _Meaning meaning) {
+    computeExportNamespace(definingUnitUri)
+        .forEach((String name, _Meaning meaning) {
       if (!privateNamespace.definesName(name)) {
         exportNames.add(meaning.encodeExportName(name));
       }
@@ -567,11 +571,14 @@
     // Fill in imported and exported names.
     List<int> importDependencies =
         definingUnit.imports.map(handleImport).toList();
-    List<int> exportDependencies =
-        definingUnit.publicNamespace.exports.map((UnlinkedExportPublic exp) {
-      String uri = _selectUri(exp.uri, exp.configurations);
-      return uriToDependency[uri];
-    }).toList();
+    List<int> exportDependencies = definingUnit.publicNamespace.exports
+        .map((UnlinkedExportPublic exp) {
+          String unlinkedUri = _selectUri(exp.uri, exp.configurations);
+          String absoluteUri = resolveUri(definingUnitUri, unlinkedUri);
+          return uriToDependency[absoluteUri];
+        })
+        .where((dependency) => dependency != null)
+        .toList();
 
     // Link each compilation unit.
     List<LinkedUnitBuilder> linkedUnits = units.map(linkUnit).toList();
@@ -586,15 +593,19 @@
   }
 
   /**
-   * Resolve [relativeUri] relative to [sourceUri].  Works correctly if
-   * [sourceUri] is also relative.
+   * Resolve [relativeUri] relative to [containingUri].  Return `null` if
+   * [relativeUri] is invalid or empty, so cannot be resolved.
    */
-  String resolveUri(String sourceUri, String relativeUri) {
-    if (sourceUri == null) {
-      return relativeUri;
-    } else {
-      return resolveRelativeUri(Uri.parse(sourceUri), Uri.parse(relativeUri))
-          .toString();
+  String resolveUri(String containingUri, String relativeUri) {
+    if (relativeUri == '') {
+      return null;
+    }
+    try {
+      Uri containingUriObj = Uri.parse(containingUri);
+      Uri relativeUriObj = Uri.parse(relativeUri);
+      return resolveRelativeUri(containingUriObj, relativeUriObj).toString();
+    } on FormatException {
+      return null;
     }
   }
 
diff --git a/pkg/analyzer/lib/src/summary/pub_summary.dart b/pkg/analyzer/lib/src/summary/pub_summary.dart
deleted file mode 100644
index 821b4fc..0000000
--- a/pkg/analyzer/lib/src/summary/pub_summary.dart
+++ /dev/null
@@ -1,835 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:core';
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/error/listener.dart';
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/scanner/reader.dart';
-import 'package:analyzer/src/dart/scanner/scanner.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/utilities_collection.dart';
-import 'package:analyzer/src/summary/api_signature.dart';
-import 'package:analyzer/src/summary/format.dart';
-import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary/link.dart';
-import 'package:analyzer/src/summary/package_bundle_reader.dart'
-    show ResynthesizerResultProvider, SummaryDataStore;
-import 'package:analyzer/src/summary/summarize_ast.dart'
-    show serializeAstUnlinked;
-import 'package:analyzer/src/summary/summarize_elements.dart'
-    show PackageBundleAssembler;
-import 'package:convert/convert.dart';
-import 'package:crypto/crypto.dart';
-import 'package:meta/meta.dart';
-import 'package:path/path.dart' as pathos;
-
-/**
- * Unlinked and linked information about a [PubPackage].
- */
-class LinkedPubPackage {
-  final PubPackage package;
-  final PackageBundle unlinked;
-  final PackageBundle linked;
-
-  final String linkedHash;
-
-  LinkedPubPackage(this.package, this.unlinked, this.linked, this.linkedHash);
-
-  @override
-  String toString() => package.toString();
-}
-
-/**
- * A package in the pub cache.
- */
-class PubPackage {
-  final String name;
-  final Folder libFolder;
-
-  PubPackage(this.name, this.libFolder);
-
-  Folder get folder => libFolder.parent;
-
-  @override
-  int get hashCode => libFolder.hashCode;
-
-  @override
-  bool operator ==(other) {
-    return other is PubPackage && other.libFolder == libFolder;
-  }
-
-  @override
-  String toString() => '($name in $folder)';
-}
-
-/**
- * Class that manages summaries for pub packages.
- *
- * The client should call [getLinkedBundles] after creating a new
- * [AnalysisContext] and configuring its source factory, but before computing
- * any analysis results.  The returned linked bundles can be used to create and
- * configure [ResynthesizerResultProvider] for the context.
- */
-class PubSummaryManager {
-  static const UNLINKED_NAME = 'unlinked.ds';
-  static const UNLINKED_SPEC_NAME = 'unlinked_spec.ds';
-
-  /**
-   * If `true` (by default), then linking new bundles is allowed.
-   * Otherwise only using existing cached bundles can be used.
-   */
-  final bool allowLinking;
-
-  /**
-   * See [PackageBundleAssembler.currentMajorVersion].
-   */
-  final int majorVersion;
-
-  final ResourceProvider resourceProvider;
-
-  /**
-   * The name of the temporary file that is used for atomic writes.
-   */
-  final String tempFileName;
-
-  /**
-   * The map from [PubPackage]s to their unlinked [PackageBundle]s in the pub
-   * cache.
-   */
-  final Map<PubPackage, PackageBundle> unlinkedBundleMap =
-      new HashMap<PubPackage, PackageBundle>();
-
-  /**
-   * The map from linked file paths to the corresponding linked bundles.
-   */
-  final Map<String, PackageBundle> linkedBundleMap =
-      new HashMap<String, PackageBundle>();
-
-  /**
-   * The set of packages to compute unlinked summaries for.
-   */
-  final Set<PubPackage> packagesToComputeUnlinked = new Set<PubPackage>();
-
-  /**
-   * The set of already processed packages, which we have already checked
-   * for their unlinked bundle existence, or scheduled its computing.
-   */
-  final Set<PubPackage> seenPackages = new Set<PubPackage>();
-
-  /**
-   * The [Completer] that completes when computing of all scheduled unlinked
-   * bundles is complete.
-   */
-  Completer _onUnlinkedCompleteCompleter;
-
-  PubSummaryManager(this.resourceProvider, this.tempFileName,
-      {@visibleForTesting this.allowLinking: true,
-      @visibleForTesting this.majorVersion:
-          PackageBundleAssembler.currentMajorVersion});
-
-  /**
-   * The [Future] that completes when computing of all scheduled unlinked
-   * bundles is complete.
-   */
-  Future get onUnlinkedComplete {
-    if (packagesToComputeUnlinked.isEmpty) {
-      return new Future.value();
-    }
-    _onUnlinkedCompleteCompleter ??= new Completer();
-    return _onUnlinkedCompleteCompleter.future;
-  }
-
-  /**
-   * Return the [pathos.Context] corresponding to the [resourceProvider].
-   */
-  pathos.Context get pathContext => resourceProvider.pathContext;
-
-  /**
-   * Complete when the unlinked bundles for the package with the given [name]
-   * and the [libFolder] are computed and written to the files.
-   *
-   * This method is intended to be used for generating unlinked bundles for
-   * the `Flutter` packages.
-   */
-  Future<Null> computeUnlinkedForFolder(String name, Folder libFolder) async {
-    PubPackage package = new PubPackage(name, libFolder);
-    _scheduleUnlinked(package);
-    await onUnlinkedComplete;
-  }
-
-  /**
-   * Return the list of linked [LinkedPubPackage]s that can be provided at this
-   * time for a subset of the packages used by the given [context].  If
-   * information about some of the used packages is not available yet, schedule
-   * its computation, so that it might be available later for other contexts
-   * referencing the same packages.
-   */
-  List<LinkedPubPackage> getLinkedBundles(AnalysisContext context) {
-    return new _ContextLinker(this, context).getLinkedBundles();
-  }
-
-  /**
-   * Return all available unlinked [PackageBundle]s for the given [context],
-   * maybe an empty map, but not `null`.
-   */
-  @visibleForTesting
-  Map<PubPackage, PackageBundle> getUnlinkedBundles(AnalysisContext context) {
-    bool strong = context.analysisOptions.strongMode;
-    Map<PubPackage, PackageBundle> unlinkedBundles =
-        new HashMap<PubPackage, PackageBundle>();
-    Map<String, List<Folder>> packageMap = context.sourceFactory.packageMap;
-    if (packageMap != null) {
-      packageMap.forEach((String packageName, List<Folder> libFolders) {
-        if (libFolders.length == 1) {
-          Folder libFolder = libFolders.first;
-          PubPackage package = new PubPackage(packageName, libFolder);
-          PackageBundle unlinkedBundle =
-              _getUnlinkedOrSchedule(package, strong);
-          if (unlinkedBundle != null) {
-            unlinkedBundles[package] = unlinkedBundle;
-          }
-        }
-      });
-    }
-    return unlinkedBundles;
-  }
-
-  /**
-   * Compute unlinked bundle for a package from [packagesToComputeUnlinked],
-   * and schedule delayed computation for the next package, if any.
-   */
-  void _computeNextUnlinked() {
-    if (packagesToComputeUnlinked.isNotEmpty) {
-      PubPackage package = packagesToComputeUnlinked.first;
-      _computeUnlinked(package, false);
-      _computeUnlinked(package, true);
-      packagesToComputeUnlinked.remove(package);
-      _scheduleNextUnlinked();
-    } else {
-      if (_onUnlinkedCompleteCompleter != null) {
-        _onUnlinkedCompleteCompleter.complete(true);
-        _onUnlinkedCompleteCompleter = null;
-      }
-    }
-  }
-
-  /**
-   * Compute the unlinked bundle for the package with the given path, put
-   * it in the [unlinkedBundleMap] and store into the [resourceProvider].
-   *
-   * TODO(scheglov) Consider moving into separate isolate(s).
-   */
-  void _computeUnlinked(PubPackage package, bool strong) {
-    Folder libFolder = package.libFolder;
-    String libPath = libFolder.path + pathContext.separator;
-    PackageBundleAssembler assembler = new PackageBundleAssembler();
-
-    /**
-     * Return the `package` [Uri] for the given [path] in the `lib` folder
-     * of the current package.
-     */
-    Uri getUri(String path) {
-      String pathInLib = path.substring(libPath.length);
-      String uriPath = pathos.posix.joinAll(pathContext.split(pathInLib));
-      String uriStr = 'package:${package.name}/$uriPath';
-      return Uri.parse(uriStr);
-    }
-
-    /**
-     * If the given [file] is a Dart file, add its unlinked unit.
-     */
-    void addDartFile(File file) {
-      String path = file.path;
-      if (AnalysisEngine.isDartFileName(path)) {
-        Uri uri = getUri(path);
-        Source source = file.createSource(uri);
-        CompilationUnit unit = _parse(source, strong);
-        UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
-        assembler.addUnlinkedUnit(source, unlinkedUnit);
-      }
-    }
-
-    /**
-     * Visit the [folder] recursively.
-     */
-    void addDartFiles(Folder folder) {
-      List<Resource> children = folder.getChildren();
-      for (Resource child in children) {
-        if (child is File) {
-          addDartFile(child);
-        }
-      }
-      for (Resource child in children) {
-        if (child is Folder) {
-          addDartFiles(child);
-        }
-      }
-    }
-
-    try {
-      addDartFiles(libFolder);
-      PackageBundleBuilder bundleWriter = assembler.assemble();
-      bundleWriter.majorVersion = majorVersion;
-      List<int> bytes = bundleWriter.toBuffer();
-      String fileName = _getUnlinkedName(strong);
-      _writeAtomic(package.folder, fileName, bytes);
-    } on FileSystemException {
-      // Ignore file system exceptions.
-    }
-  }
-
-  /**
-   * Return the name of the file for an unlinked bundle, in strong or spec mode.
-   */
-  String _getUnlinkedName(bool strong) {
-    if (strong) {
-      return UNLINKED_NAME;
-    } else {
-      return UNLINKED_SPEC_NAME;
-    }
-  }
-
-  /**
-   * Return the unlinked [PackageBundle] for the given [package]. If the bundle
-   * has not been compute yet, return `null` and schedule its computation.
-   */
-  PackageBundle _getUnlinkedOrSchedule(PubPackage package, bool strong) {
-    // Try to find in the cache.
-    PackageBundle bundle = unlinkedBundleMap[package];
-    if (bundle != null) {
-      return bundle;
-    }
-
-    // Try to read from the file system.
-    String fileName = _getUnlinkedName(strong);
-    File file = package.folder.getChildAssumingFile(fileName);
-    if (file.exists) {
-      try {
-        List<int> bytes = file.readAsBytesSync();
-        bundle = new PackageBundle.fromBuffer(bytes);
-      } on FileSystemException {
-        // Ignore file system exceptions.
-      }
-    }
-
-    // Verify compatibility and consistency.
-    bool isInPubCache = isPathInPubCache(pathContext, package.folder.path);
-    if (bundle != null &&
-        bundle.majorVersion == majorVersion &&
-        (isInPubCache || _isConsistent(package, bundle))) {
-      unlinkedBundleMap[package] = bundle;
-      return bundle;
-    }
-
-    // Schedule computation in the background, if in the pub cache.
-    if (isInPubCache) {
-      if (seenPackages.add(package)) {
-        _scheduleUnlinked(package);
-      }
-    }
-
-    // The bundle is not available.
-    return null;
-  }
-
-  /**
-   * Return `true` if content hashes for the [package] library files are the
-   * same the hashes in the unlinked [bundle].
-   */
-  bool _isConsistent(PubPackage package, PackageBundle bundle) {
-    List<String> actualHashes = <String>[];
-
-    /**
-     * If the given [file] is a Dart file, add its content hash.
-     */
-    void hashDartFile(File file) {
-      String path = file.path;
-      if (AnalysisEngine.isDartFileName(path)) {
-        List<int> fileBytes = file.readAsBytesSync();
-        List<int> hashBytes = md5.convert(fileBytes).bytes;
-        String hashHex = hex.encode(hashBytes);
-        actualHashes.add(hashHex);
-      }
-    }
-
-    /**
-     * Visit the [folder] recursively.
-     */
-    void hashDartFiles(Folder folder) {
-      List<Resource> children = folder.getChildren();
-      for (Resource child in children) {
-        if (child is File) {
-          hashDartFile(child);
-        } else if (child is Folder) {
-          hashDartFiles(child);
-        }
-      }
-    }
-
-    // Recursively compute hashes of the `lib` folder Dart files.
-    try {
-      hashDartFiles(package.libFolder);
-    } on FileSystemException {
-      return false;
-    }
-
-    // Compare sorted actual and bundle unit hashes.
-    List<String> bundleHashes = bundle.unlinkedUnitHashes.toList()..sort();
-    actualHashes.sort();
-    return listsEqual(actualHashes, bundleHashes);
-  }
-
-  /**
-   * Parse the given [source] into AST.
-   */
-  CompilationUnit _parse(Source source, bool strong) {
-    String code = source.contents.data;
-    AnalysisErrorListener errorListener = AnalysisErrorListener.NULL_LISTENER;
-    CharSequenceReader reader = new CharSequenceReader(code);
-    Scanner scanner = new Scanner(source, reader, errorListener);
-    scanner.scanGenericMethodComments = strong;
-    Token token = scanner.tokenize();
-    LineInfo lineInfo = new LineInfo(scanner.lineStarts);
-    Parser parser = new Parser(source, errorListener);
-    parser.parseGenericMethodComments = strong;
-    CompilationUnit unit = parser.parseCompilationUnit(token);
-    unit.lineInfo = lineInfo;
-    return unit;
-  }
-
-  /**
-   * Schedule delayed computation of the next package unlinked bundle from the
-   * set of [packagesToComputeUnlinked].  We delay each computation because we
-   * want operations in analysis server to proceed, and computing bundles of
-   * packages is a background task.
-   */
-  void _scheduleNextUnlinked() {
-    new Future.delayed(new Duration(milliseconds: 10), _computeNextUnlinked);
-  }
-
-  /**
-   * Schedule computing unlinked bundles for the given [package].
-   */
-  void _scheduleUnlinked(PubPackage package) {
-    if (packagesToComputeUnlinked.isEmpty) {
-      _scheduleNextUnlinked();
-    }
-    packagesToComputeUnlinked.add(package);
-  }
-
-  /**
-   * Atomically write the given [bytes] into the file in the [folder].
-   */
-  void _writeAtomic(Folder folder, String fileName, List<int> bytes) {
-    String filePath = folder.getChildAssumingFile(fileName).path;
-    File tempFile = folder.getChildAssumingFile(tempFileName);
-    tempFile.writeAsBytesSync(bytes);
-    tempFile.renameSync(filePath);
-  }
-
-  /**
-   * If the given [uri] has the `package` scheme, return the name of the
-   * package that contains the referenced resource.  Otherwise return `null`.
-   *
-   * For example `package:foo/bar.dart` => `foo`.
-   */
-  static String getPackageName(String uri) {
-    const String PACKAGE_SCHEME = 'package:';
-    if (uri.startsWith(PACKAGE_SCHEME)) {
-      int index = uri.indexOf('/');
-      if (index != -1) {
-        return uri.substring(PACKAGE_SCHEME.length, index);
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Return `true` if the given absolute [path] is in the pub cache.
-   */
-  static bool isPathInPubCache(pathos.Context pathContext, String path) {
-    List<String> parts = pathContext.split(path);
-    for (int i = 0; i < parts.length - 1; i++) {
-      if (parts[i] == '.pub-cache') {
-        return true;
-      }
-      if (parts[i] == 'Pub' && parts[i + 1] == 'Cache') {
-        return true;
-      }
-    }
-    return false;
-  }
-}
-
-class _ContextLinker {
-  final PubSummaryManager manager;
-  final AnalysisContext context;
-
-  final strong;
-  final _ListedPackages listedPackages;
-  final PackageBundle sdkBundle;
-
-  final List<_LinkNode> nodes = <_LinkNode>[];
-  final Map<String, _LinkNode> packageToNode = <String, _LinkNode>{};
-
-  _ContextLinker(this.manager, AnalysisContext context)
-      : context = context,
-        strong = context.analysisOptions.strongMode,
-        listedPackages = new _ListedPackages(context.sourceFactory),
-        sdkBundle = context.sourceFactory.dartSdk.getLinkedBundle();
-
-  /**
-   * Return the list of linked [LinkedPubPackage]s that can be provided at this
-   * time for a subset of the packages used by the [context].
-   */
-  List<LinkedPubPackage> getLinkedBundles() {
-//    Stopwatch timer = new Stopwatch()..start();
-
-    if (sdkBundle == null) {
-      return const <LinkedPubPackage>[];
-    }
-
-    Map<PubPackage, PackageBundle> unlinkedBundles =
-        manager.getUnlinkedBundles(context);
-
-    // TODO(scheglov) remove debug output after optimizing
-//    print('LOADED ${unlinkedBundles.length} unlinked bundles'
-//        ' in ${timer.elapsedMilliseconds} ms');
-//    timer..reset();
-
-    // If no unlinked bundles, there is nothing we can try to link.
-    if (unlinkedBundles.isEmpty) {
-      return const <LinkedPubPackage>[];
-    }
-
-    // Create nodes for packages.
-    unlinkedBundles.forEach((package, unlinked) {
-      _LinkNode node = new _LinkNode(this, package, unlinked);
-      nodes.add(node);
-      packageToNode[package.name] = node;
-    });
-
-    // Compute transitive dependencies, mark some nodes as failed.
-    for (_LinkNode node in nodes) {
-      node.computeTransitiveDependencies();
-    }
-
-    // Attempt to read existing linked bundles.
-    for (_LinkNode node in nodes) {
-      _readLinked(node);
-    }
-
-    // Link new packages, if allowed.
-    if (manager.allowLinking) {
-      _link();
-    }
-
-    // Create successfully linked packages.
-    List<LinkedPubPackage> linkedPackages = <LinkedPubPackage>[];
-    for (_LinkNode node in nodes) {
-      if (node.linked != null) {
-        linkedPackages.add(new LinkedPubPackage(
-            node.package, node.unlinked, node.linked, node.linkedHash));
-      }
-    }
-
-    // TODO(scheglov) remove debug output after optimizing
-//    print('LINKED ${linkedPackages.length} bundles'
-//        ' in ${timer.elapsedMilliseconds} ms');
-
-    // Done.
-    return linkedPackages;
-  }
-
-  String _getDeclaredVariable(String name) {
-    return context.declaredVariables.get(name);
-  }
-
-  /**
-   * Return the name of the file for a linked bundle, in strong or spec mode.
-   */
-  String _getLinkedName(String hash) {
-    if (strong) {
-      return 'linked_$hash.ds';
-    } else {
-      return 'linked_spec_$hash.ds';
-    }
-  }
-
-  void _link() {
-    // Fill the store with bundles.
-    // Append the linked SDK bundle.
-    // Append unlinked and (if read from a cache) linked package bundles.
-    SummaryDataStore store = new SummaryDataStore(const <String>[]);
-    store.addBundle(null, sdkBundle);
-    for (_LinkNode node in nodes) {
-      store.addBundle(null, node.unlinked);
-      if (node.linked != null) {
-        store.addBundle(null, node.linked);
-      }
-    }
-
-    // Prepare URIs to link.
-    Map<String, _LinkNode> uriToNode = <String, _LinkNode>{};
-    for (_LinkNode node in nodes) {
-      if (!node.isReady) {
-        for (String uri in node.unlinked.unlinkedUnitUris) {
-          uriToNode[uri] = node;
-        }
-      }
-    }
-    Set<String> libraryUris = uriToNode.keys.toSet();
-
-    // Perform linking.
-    Map<String, LinkedLibraryBuilder> linkedLibraries =
-        link(libraryUris, (String uri) {
-      return store.linkedMap[uri];
-    }, (String uri) {
-      return store.unlinkedMap[uri];
-    }, _getDeclaredVariable, strong);
-
-    // Assemble newly linked bundles.
-    for (_LinkNode node in nodes) {
-      if (!node.isReady) {
-        PackageBundleAssembler assembler = new PackageBundleAssembler();
-        linkedLibraries.forEach((uri, linkedLibrary) {
-          if (identical(uriToNode[uri], node)) {
-            assembler.addLinkedLibrary(uri, linkedLibrary);
-          }
-        });
-        List<int> bytes = assembler.assemble().toBuffer();
-        node.linkedNewBytes = bytes;
-        node.linked = new PackageBundle.fromBuffer(bytes);
-      }
-    }
-
-    // Write newly linked bundles.
-    for (_LinkNode node in nodes) {
-      _writeLinked(node);
-    }
-  }
-
-  /**
-   * Attempt to find the linked bundle that corresponds to the given [node]
-   * with all its transitive dependencies and put it into [_LinkNode.linked].
-   */
-  void _readLinked(_LinkNode node) {
-    String hash = node.linkedHash;
-    if (hash != null) {
-      String fileName = _getLinkedName(hash);
-      File file = node.package.folder.getChildAssumingFile(fileName);
-      // Try to find in the cache.
-      PackageBundle linked = manager.linkedBundleMap[file.path];
-      if (linked != null) {
-        node.linked = linked;
-        return;
-      }
-      // Try to read from the file system.
-      if (file.exists) {
-        try {
-          List<int> bytes = file.readAsBytesSync();
-          linked = new PackageBundle.fromBuffer(bytes);
-          manager.linkedBundleMap[file.path] = linked;
-          node.linked = linked;
-        } on FileSystemException {
-          // Ignore file system exceptions.
-        }
-      }
-    }
-  }
-
-  /**
-   * If a new linked bundle was linked for the given [node], write the bundle
-   * into the memory cache and the file system.
-   */
-  void _writeLinked(_LinkNode node) {
-    String hash = node.linkedHash;
-    if (hash != null && node.linkedNewBytes != null) {
-      String fileName = _getLinkedName(hash);
-      File file = node.package.folder.getChildAssumingFile(fileName);
-      manager.linkedBundleMap[file.path] = node.linked;
-      manager._writeAtomic(node.package.folder, fileName, node.linkedNewBytes);
-    }
-  }
-}
-
-/**
- * Information about a package to link.
- */
-class _LinkNode {
-  final _ContextLinker linker;
-  final PubPackage package;
-  final PackageBundle unlinked;
-
-  bool failed = false;
-  Set<_LinkNode> transitiveDependencies;
-
-  List<_LinkNode> _dependencies;
-  String _linkedHash;
-
-  List<int> linkedNewBytes;
-  PackageBundle linked;
-
-  _LinkNode(this.linker, this.package, this.unlinked);
-
-  /**
-   * Retrieve the dependencies of this node.
-   */
-  List<_LinkNode> get dependencies {
-    if (_dependencies == null) {
-      Set<_LinkNode> dependencies = new Set<_LinkNode>();
-
-      void appendDependency(String uriStr) {
-        Uri uri = Uri.parse(uriStr);
-        if (!uri.hasScheme) {
-          // A relative path in this package, skip it.
-        } else if (uri.scheme == 'dart') {
-          // Dependency on the SDK is implicit and always added.
-          // The SDK linked bundle is precomputed before linking packages.
-        } else if (uriStr.startsWith('package:')) {
-          String package = PubSummaryManager.getPackageName(uriStr);
-          _LinkNode packageNode = linker.packageToNode[package];
-          if (packageNode == null && linker.listedPackages.isListed(uriStr)) {
-            failed = true;
-          }
-          if (packageNode != null) {
-            dependencies.add(packageNode);
-          }
-        } else {
-          failed = true;
-        }
-      }
-
-      for (UnlinkedUnit unit in unlinked.unlinkedUnits) {
-        for (UnlinkedImport import in unit.imports) {
-          if (!import.isImplicit) {
-            appendDependency(import.uri);
-          }
-        }
-        for (UnlinkedExportPublic export in unit.publicNamespace.exports) {
-          appendDependency(export.uri);
-        }
-      }
-
-      _dependencies = dependencies.toList();
-    }
-    return _dependencies;
-  }
-
-  /**
-   * Return `true` is the node is ready - has the linked bundle or failed (does
-   * not have all required dependencies).
-   */
-  bool get isReady => linked != null || failed;
-
-  /**
-   * Return the hash string that corresponds to this linked bundle in the
-   * context of its SDK bundle and transitive dependencies.  Return `null` if
-   * the hash computation fails, because for example the full transitive
-   * dependencies cannot computed.
-   */
-  String get linkedHash {
-    if (_linkedHash == null && transitiveDependencies != null) {
-      ApiSignature signature = new ApiSignature();
-      // Add all unlinked API signatures.
-      List<String> signatures = <String>[];
-      signatures.add(linker.sdkBundle.apiSignature);
-      transitiveDependencies
-          .map((node) => node.unlinked.apiSignature)
-          .forEach(signatures.add);
-      signatures.sort();
-      signatures.forEach(signature.addString);
-      // Combine into a single hash.
-      appendDeclaredVariables(signature);
-      _linkedHash = signature.toHex();
-    }
-    return _linkedHash;
-  }
-
-  /**
-   * Append names and values of all referenced declared variables (even the
-   * ones without actually declared values) to the given [signature].
-   */
-  void appendDeclaredVariables(ApiSignature signature) {
-    Set<String> nameSet = new Set<String>();
-    for (_LinkNode node in transitiveDependencies) {
-      for (UnlinkedUnit unit in node.unlinked.unlinkedUnits) {
-        for (UnlinkedImport import in unit.imports) {
-          for (UnlinkedConfiguration configuration in import.configurations) {
-            nameSet.add(configuration.name);
-          }
-        }
-        for (UnlinkedExportPublic export in unit.publicNamespace.exports) {
-          for (UnlinkedConfiguration configuration in export.configurations) {
-            nameSet.add(configuration.name);
-          }
-        }
-      }
-    }
-    List<String> sortedNameList = nameSet.toList()..sort();
-    signature.addInt(sortedNameList.length);
-    for (String name in sortedNameList) {
-      signature.addString(name);
-      signature.addString(linker._getDeclaredVariable(name) ?? '');
-    }
-  }
-
-  /**
-   * Compute the set of existing transitive dependencies for this node.
-   * If any `package` dependency cannot be resolved, but it is one of the
-   * [listedPackages] then set [failed] to `true`.
-   * Only [unlinked] is used, so this method can be called before linking.
-   */
-  void computeTransitiveDependencies() {
-    if (transitiveDependencies == null) {
-      transitiveDependencies = new Set<_LinkNode>();
-
-      void appendDependencies(_LinkNode node) {
-        if (transitiveDependencies.add(node)) {
-          node.dependencies.forEach(appendDependencies);
-        }
-      }
-
-      appendDependencies(this);
-      if (transitiveDependencies.any((node) => node.failed)) {
-        failed = true;
-      }
-    }
-  }
-
-  @override
-  String toString() => package.toString();
-}
-
-/**
- * The set of package names that are listed in the `.packages` file of a
- * context.  These are the only packages, references to which can
- * be possibly resolved in the context.  Nodes that reference a `package:` URI
- * without the unlinked bundle, so without the node, cannot be linked.
- */
-class _ListedPackages {
-  final Set<String> names = new Set<String>();
-
-  _ListedPackages(SourceFactory sourceFactory) {
-    Map<String, List<Folder>> map = sourceFactory.packageMap;
-    if (map != null) {
-      names.addAll(map.keys);
-    }
-  }
-
-  /**
-   * Check whether the given `package:` [uri] is listed in the package map.
-   */
-  bool isListed(String uri) {
-    String package = PubSummaryManager.getPackageName(uri);
-    return names.contains(package);
-  }
-}
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 68c3017..aeec4b4 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -1508,6 +1508,15 @@
         unlinkedUnit,
         unlinkedPart,
         unitSource.shortName);
+
+    {
+      List<int> lineStarts = unlinkedUnit.lineStarts;
+      if (lineStarts.isEmpty) {
+        lineStarts = const <int>[0];
+      }
+      unit.lineInfo = new LineInfo(lineStarts);
+    }
+
     for (EntityRef t in linkedUnit.types) {
       linkedTypeMap[t.slot] = t;
     }
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 32a8bf4..5e57f8e 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -1037,6 +1037,11 @@
   static const String PARSED_UNIT_INPUT_NAME = 'PARSED_UNIT_INPUT_NAME';
 
   /**
+   * The name of the input whose value is the source line info.
+   */
+  static const String LINE_INFO_INPUT_NAME = 'LINE_INFO_INPUT_NAME';
+
+  /**
    * The task descriptor describing this kind of task.
    */
   static final TaskDescriptor DESCRIPTOR = new TaskDescriptor(
@@ -1068,6 +1073,7 @@
     LibrarySpecificUnit librarySpecificUnit = target;
     Source source = getRequiredSource();
     CompilationUnit unit = getRequiredInput(PARSED_UNIT_INPUT_NAME);
+    LineInfo lineInfo = getRequiredInput(LINE_INFO_INPUT_NAME);
     //
     // Try to get the existing CompilationUnitElement.
     //
@@ -1091,6 +1097,7 @@
       CompilationUnitBuilder builder = new CompilationUnitBuilder();
       element = builder.buildCompilationUnit(
           source, unit, librarySpecificUnit.library);
+      (element as CompilationUnitElementImpl).lineInfo = lineInfo;
     } else {
       new DeclarationResolver().resolve(unit, element);
     }
@@ -1118,7 +1125,8 @@
   static Map<String, TaskInput> buildInputs(AnalysisTarget target) {
     LibrarySpecificUnit unit = target;
     return <String, TaskInput>{
-      PARSED_UNIT_INPUT_NAME: PARSED_UNIT.of(unit.unit, flushOnAccess: true)
+      PARSED_UNIT_INPUT_NAME: PARSED_UNIT.of(unit.unit, flushOnAccess: true),
+      LINE_INFO_INPUT_NAME: LINE_INFO.of(unit.unit)
     };
   }
 
diff --git a/pkg/analyzer/test/generated/gn_test.dart b/pkg/analyzer/test/generated/gn_test.dart
index 060285a8..71bcb6b7 100644
--- a/pkg/analyzer/test/generated/gn_test.dart
+++ b/pkg/analyzer/test/generated/gn_test.dart
@@ -34,7 +34,7 @@
         _p('/workspace/a/source'));
     _setUp();
     _assertResolve(
-        'package:flutter/code.dart', '/workspace/a/source/code.dart');
+        'package:flutter/code.dart', _p('/workspace/a/source/code.dart'));
   }
 
   void test_resolveDoesNotExist() {
@@ -52,6 +52,23 @@
         resolver.resolveAbsolute(Uri.parse('package:bogus/code.dart')), null);
   }
 
+  void test_resolveAddToCache() {
+    _addResources([
+      '/workspace/.jiri_root/',
+      '/workspace/out/debug-x87_128/gen/dart.sources/',
+      '/workspace/some/code/',
+      '/workspace/a/source/code.dart',
+    ]);
+    _setUp();
+    expect(
+        resolver.resolveAbsolute(Uri.parse('package:flutter/code.dart')), null);
+    provider.newFile(
+        _p('/workspace/out/debug-x87_128/gen/dart.sources/flutter'),
+        _p('/workspace/a/source'));
+    _assertResolve(
+        'package:flutter/code.dart', _p('/workspace/a/source/code.dart'));
+  }
+
   void _addResources(List<String> paths) {
     for (String path in paths) {
       if (path.endsWith('/')) {
@@ -111,14 +128,14 @@
     provider.newFolder(_p('/workspace/out/debug-x87_128/gen/dart.sources'));
     provider.newFile(
         _p('/workspace/out/debug-x87_128/gen/dart.sources/flutter'),
-        '/path/to/source');
+        _p('/path/to/source'));
     provider.newFolder(_p('/workspace/some/code'));
     GnWorkspace workspace =
         GnWorkspace.find(provider, _p('/workspace/some/code'));
     expect(workspace, isNotNull);
     expect(workspace.root, _p('/workspace'));
-    expect(workspace.packages.length, 1);
-    expect(workspace.packages['flutter'], '/path/to/source');
+    expect(workspace.packageMap.length, 1);
+    expect(workspace.packageMap['flutter'][0].path, _p('/path/to/source'));
   }
 }
 
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 9f2a03e..988fafa 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -5,14 +5,15 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/generated/parser.dart' as analyzer;
 import 'package:front_end/src/fasta/analyzer/ast_builder.dart';
 import 'package:front_end/src/fasta/analyzer/element_store.dart';
 import 'package:front_end/src/fasta/builder/scope.dart';
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
 import 'package:front_end/src/fasta/kernel/kernel_library_builder.dart';
-import 'package:front_end/src/fasta/parser/parser.dart';
+import 'package:front_end/src/fasta/parser/parser.dart' as fasta;
 import 'package:front_end/src/fasta/scanner/string_scanner.dart';
-import 'package:front_end/src/fasta/scanner/token.dart';
+import 'package:front_end/src/fasta/scanner/token.dart' as fasta;
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -21,13 +22,14 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(ComplexParserTest_Fasta);
+    defineReflectiveTests(TopLevelParserTest_Fasta);
   });
 }
 
 /**
  * Type of the "parse..." methods defined in the Fasta parser.
  */
-typedef Token ParseFunction(Token token);
+typedef fasta.Token ParseFunction(fasta.Token token);
 
 /**
  * Proxy implementation of [Builder] used by Fasta parser tests.
@@ -247,7 +249,11 @@
  * Implementation of [AbstractParserTestCase] specialized for testing the
  * Fasta parser.
  */
-class FastaParserTestCase implements AbstractParserTestCase {
+class FastaParserTestCase extends Object
+    with ParserTestHelpers
+    implements AbstractParserTestCase {
+  ParserProxy _parserProxy;
+
   @override
   set enableGenericMethodComments(bool value) {
     if (value == true) {
@@ -267,10 +273,33 @@
   }
 
   @override
+  set enableUriInPartOf(bool value) {
+    if (value == true) {
+      // TODO(paulberry,ahe): URIs in "part of" declarations are not supported
+      // by Fasta.
+      throw new UnimplementedError();
+    }
+  }
+
+  @override
+  analyzer.Parser get parser => _parserProxy;
+
+  @override
+  void assertNoErrors() {
+    // TODO(paulberry): implement assertNoErrors
+  }
+
+  @override
+  void createParser(String content) {
+    var scanner = new StringScanner(content);
+    _parserProxy = new ParserProxy(scanner.tokenize());
+  }
+
+  @override
   CompilationUnit parseCompilationUnit(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    // TODO(paulberry): implement parseCompilationUnit
-    throw new UnimplementedError();
+    return _runParser(source, (parser) => parser.parseUnit, errorCodes)
+        as CompilationUnit;
   }
 
   @override
@@ -281,37 +310,47 @@
   }
 
   @override
+  CompilationUnit parseDirectives(String source,
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+    return _runParser(source, (parser) => parser.parseUnit, errorCodes);
+  }
+
+  @override
   Expression parseExpression(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    return _runParser(source, (parser) => parser.parseExpression, errorCodes);
+    return _runParser(source, (parser) => parser.parseExpression, errorCodes)
+        as Expression;
+  }
+
+  @override
+  CompilationUnitMember parseFullCompilationUnitMember() {
+    return _parserProxy._run((parser) => parser.parseTopLevelDeclaration)
+        as CompilationUnitMember;
+  }
+
+  @override
+  Directive parseFullDirective() {
+    return _parserProxy._run((parser) => parser.parseTopLevelDeclaration)
+        as Directive;
   }
 
   @override
   Statement parseStatement(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[],
       bool enableLazyAssignmentOperators]) {
-    return _runParser(source, (parser) => parser.parseStatement, errorCodes);
+    return _runParser(source, (parser) => parser.parseStatement, errorCodes)
+        as Statement;
   }
 
-  Object _runParser(String source, ParseFunction getParseFuction(Parser parser),
+  Object _runParser(
+      String source, ParseFunction getParseFunction(fasta.Parser parser),
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     if (errorCodes.isNotEmpty) {
       // TODO(paulberry): Check that the parser generates the proper errors.
       throw new UnimplementedError();
     }
-    var scanner = new StringScanner(source);
-    var token = scanner.tokenize();
-    var library = new KernelLibraryBuilderProxy();
-    var member = new BuilderProxy();
-    var elementStore = new ElementStoreProxy();
-    var scope = new ScopeProxy();
-    var astBuilder = new AstBuilder(library, member, elementStore, scope);
-    var parser = new Parser(astBuilder);
-    var parseFunction = getParseFuction(parser);
-    var endToken = parseFunction(token);
-    expect(endToken.isEof, isTrue);
-    expect(astBuilder.stack, hasLength(1));
-    return astBuilder.pop();
+    createParser(source);
+    return _parserProxy._run(getParseFunction);
   }
 }
 
@@ -340,6 +379,65 @@
 }
 
 /**
+ * Proxy implementation of the analyzer parser, implemented in terms of the
+ * Fasta parser.
+ *
+ * This allows many of the analyzer parser tests to be run on Fasta, even if
+ * they call into the analyzer parser class directly.
+ */
+class ParserProxy implements analyzer.Parser {
+  /**
+   * The token to parse next.
+   */
+  fasta.Token _currentFastaToken;
+
+  /**
+   * The fasta parser being wrapped.
+   */
+  final fasta.Parser _fastaParser;
+
+  /**
+   * The builder which creates the analyzer AST data structures expected by the
+   * analyzer parser tests.
+   */
+  final AstBuilder _astBuilder;
+
+  /**
+   * Creates a [ParserProxy] which is prepared to begin parsing at the given
+   * Fasta token.
+   */
+  factory ParserProxy(fasta.Token startingToken) {
+    var library = new KernelLibraryBuilderProxy();
+    var member = new BuilderProxy();
+    var elementStore = new ElementStoreProxy();
+    var scope = new ScopeProxy();
+    var astBuilder = new AstBuilder(library, member, elementStore, scope);
+    return new ParserProxy._(
+        startingToken, new fasta.Parser(astBuilder), astBuilder);
+  }
+
+  ParserProxy._(this._currentFastaToken, this._fastaParser, this._astBuilder);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  CompilationUnit parseCompilationUnit2() {
+    return _run((parser) => parser.parseUnit) as CompilationUnit;
+  }
+
+  /**
+   * Runs a single parser function, and returns the result as an analyzer AST.
+   */
+  Object _run(ParseFunction getParseFunction(fasta.Parser parser)) {
+    var parseFunction = getParseFunction(_fastaParser);
+    _currentFastaToken = parseFunction(_currentFastaToken);
+    expect(_currentFastaToken.isEof, isTrue);
+    expect(_astBuilder.stack, hasLength(1));
+    return _astBuilder.pop();
+  }
+}
+
+/**
  * Proxy implementation of [Scope] used by Fasta parser tests.
  *
  * Any name lookup request is satisfied by creating an instance of
@@ -349,8 +447,600 @@
   final _locals = <String, Builder>{};
 
   @override
+  void operator []=(String name, Builder member) {
+    _locals[name] = member;
+  }
+
+  @override
+  Scope createNestedScope({bool isModifiable: true}) {
+    return new Scope(<String, Builder>{}, this, isModifiable: isModifiable);
+  }
+
+  @override
   Builder lookup(String name, int charOffset, Uri fileUri) =>
       _locals.putIfAbsent(name, () => new BuilderProxy());
 
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+/**
+ * Tests of the fasta parser based on [TopLevelParserTestMixin].
+ */
+@reflectiveTest
+class TopLevelParserTest_Fasta extends FastaParserTestCase
+    with TopLevelParserTestMixin {
+  @override
+  @failingTest
+  void test_function_literal_allowed_at_toplevel() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super.test_function_literal_allowed_at_toplevel();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void
+      test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
+    // TODO(paulberry): Unhandled event: UnnamedFunction
+    super
+        .test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer();
+  }
+
+  @override
+  @failingTest
+  void test_parseClassDeclaration_abstract() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseClassDeclaration_abstract();
+  }
+
+  @override
+  @failingTest
+  void test_parseClassDeclaration_native() {
+    // TODO(paulberry): TODO(paulberry,ahe): Fasta parser doesn't appear to support "native" syntax yet.
+    super.test_parseClassDeclaration_native();
+  }
+
+  @override
+  @failingTest
+  void test_parseClassDeclaration_nonEmpty() {
+    // TODO(paulberry): Unhandled event: NoFieldInitializer
+    super.test_parseClassDeclaration_nonEmpty();
+  }
+
+  @override
+  @failingTest
+  void test_parseClassDeclaration_typeAlias_withB() {
+    // TODO(paulberry,ahe): capture `with` token.
+    super.test_parseClassDeclaration_typeAlias_withB();
+  }
+
+  @override
+  @failingTest
+  void test_parseClassDeclaration_typeParameters() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseClassDeclaration_typeParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
+    // TODO(paulberry): Unhandled event: Qualified
+    super.test_parseCompilationUnit_abstractAsPrefix_parameterized();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_builtIn_asFunctionName() {
+    // TODO(paulberry,ahe): Fasta's parser is confused when one of the built-in
+    // identifiers `export`, `import`, `library`, `part`, or `typedef` appears
+    // as the name of a top level function with an implicit return type.
+    super.test_parseCompilationUnit_builtIn_asFunctionName();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_empty() {
+    // TODO(paulberry): No objects placed on stack
+    super.test_parseCompilationUnit_empty();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_exportAsPrefix() {
+    // TODO(paulberry): TODO(paulberry,ahe): Fasta parser doesn't appear to handle this case correctly.
+    super.test_parseCompilationUnit_exportAsPrefix();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
+    // TODO(paulberry): Unhandled event: TypeArguments
+    super.test_parseCompilationUnit_exportAsPrefix_parameterized();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
+    // TODO(paulberry): Unhandled event: Qualified
+    super.test_parseCompilationUnit_operatorAsPrefix_parameterized();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_script() {
+    // TODO(paulberry): No objects placed on stack
+    super.test_parseCompilationUnit_script();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnit_typedefAsPrefix() {
+    // TODO(paulberry): TODO(paulberry,ahe): Fasta parser doesn't appear to handle this case correctly.
+    super.test_parseCompilationUnit_typedefAsPrefix();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_abstractAsPrefix() {
+    // TODO(paulberry): Unhandled event: Qualified
+    super.test_parseCompilationUnitMember_abstractAsPrefix();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_classTypeAlias() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_classTypeAlias();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_constVariable() {
+    // TODO(paulberry): Unhandled event: FieldInitializer
+    super.test_parseCompilationUnitMember_constVariable();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_finalVariable() {
+    // TODO(paulberry): Unhandled event: FieldInitializer
+    super.test_parseCompilationUnitMember_finalVariable();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_external_noType() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_function_external_noType();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_external_type() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_function_external_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_generic_noReturnType() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseCompilationUnitMember_function_generic_noReturnType();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
+    // TODO(paulberry,ahe): Fasta doesn't appear to support annotated type
+    // parameters.
+    super
+        .test_parseCompilationUnitMember_function_generic_noReturnType_annotated();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_generic_returnType() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseCompilationUnitMember_function_generic_returnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_generic_void() {
+    // TODO(paulberry): Unhandled event: VoidKeyword
+    super.test_parseCompilationUnitMember_function_generic_void();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_function_void() {
+    // TODO(paulberry): Unhandled event: VoidKeyword
+    super.test_parseCompilationUnitMember_function_void();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_getter_external_noType() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_getter_external_noType();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_getter_external_type() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_getter_external_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_setter_external_noType() {
+    // TODO(paulberry): Implement AstBuilder.handleModifier
+    super.test_parseCompilationUnitMember_setter_external_noType();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_setter_external_type() {
+    // TODO(paulberry): Unhandled event: VoidKeyword
+    super.test_parseCompilationUnitMember_setter_external_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_setter_type() {
+    // TODO(paulberry): Unhandled event: VoidKeyword
+    super.test_parseCompilationUnitMember_setter_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_typeAlias_abstract() {
+    // TODO(paulberry,ahe): Capture `=` token
+    super.test_parseCompilationUnitMember_typeAlias_abstract();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_typeAlias_generic() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseCompilationUnitMember_typeAlias_generic();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_typeAlias_implements() {
+    // TODO(paulberry,ahe): Capture `=` token
+    super.test_parseCompilationUnitMember_typeAlias_implements();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_typeAlias_noImplements() {
+    // TODO(paulberry,ahe): Capture `=` token
+    super.test_parseCompilationUnitMember_typeAlias_noImplements();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_typedef() {
+    // TODO(paulberry): Unhandled event: FunctionTypeAlias
+    super.test_parseCompilationUnitMember_typedef();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_variable() {
+    // TODO(paulberry): Unhandled event: FieldInitializer
+    super.test_parseCompilationUnitMember_variable();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_variableGet() {
+    // TODO(paulberry): Unhandled event: FieldInitializer
+    super.test_parseCompilationUnitMember_variableGet();
+  }
+
+  @override
+  @failingTest
+  void test_parseCompilationUnitMember_variableSet() {
+    // TODO(paulberry): Unhandled event: FieldInitializer
+    super.test_parseCompilationUnitMember_variableSet();
+  }
+
+  @override
+  @failingTest
+  void test_parseDirectives_complete() {
+    // TODO(paulberry,ahe): Fasta doesn't support script tags yet.
+    super.test_parseDirectives_complete();
+  }
+
+  @override
+  @failingTest
+  void test_parseDirectives_empty() {
+    // TODO(paulberry): No objects placed on stack
+    super.test_parseDirectives_empty();
+  }
+
+  @override
+  @failingTest
+  void test_parseDirectives_mixed() {
+    // TODO(paulberry,ahe): This test verifies the analyzer parser's ability to
+    // stop parsing as soon as the first non-directive is encountered; this is
+    // useful for quickly traversing an import graph.  Consider adding a similar
+    // ability to Fasta's parser.
+    super.test_parseDirectives_mixed();
+  }
+
+  @override
+  @failingTest
+  void test_parseDirectives_script() {
+    // TODO(paulberry): No objects placed on stack
+    super.test_parseDirectives_script();
+  }
+
+  @override
+  @failingTest
+  void test_parseEnumDeclaration_one() {
+    // TODO(paulberry): Unhandled event: Enum
+    super.test_parseEnumDeclaration_one();
+  }
+
+  @override
+  @failingTest
+  void test_parseEnumDeclaration_trailingComma() {
+    // TODO(paulberry): Unhandled event: Enum
+    super.test_parseEnumDeclaration_trailingComma();
+  }
+
+  @override
+  @failingTest
+  void test_parseEnumDeclaration_two() {
+    // TODO(paulberry): Unhandled event: Enum
+    super.test_parseEnumDeclaration_two();
+  }
+
+  @override
+  @failingTest
+  void test_parseExportDirective_configuration_multiple() {
+    // TODO(paulberry): Implement endConditionalUri
+    super.test_parseExportDirective_configuration_multiple();
+  }
+
+  @override
+  @failingTest
+  void test_parseExportDirective_configuration_single() {
+    // TODO(paulberry): Implement endConditionalUri
+    super.test_parseExportDirective_configuration_single();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionDeclaration_function() {
+    // TODO(paulberry): handle doc comments
+    super.test_parseFunctionDeclaration_function();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionDeclaration_functionWithTypeParameters() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseFunctionDeclaration_functionWithTypeParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
+    // TODO(paulberry,ahe): generic method comment syntax is not supported by
+    // Fasta.
+    super.test_parseFunctionDeclaration_functionWithTypeParameters_comment();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionDeclaration_getter() {
+    // TODO(paulberry): handle doc comments
+    super.test_parseFunctionDeclaration_getter();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionDeclaration_setter() {
+    // TODO(paulberry): handle doc comments
+    super.test_parseFunctionDeclaration_setter();
+  }
+
+  @override
+  @failingTest
+  void test_parseImportDirective_configuration_multiple() {
+    // TODO(paulberry): Implement endConditionalUri
+    super.test_parseImportDirective_configuration_multiple();
+  }
+
+  @override
+  @failingTest
+  void test_parseImportDirective_configuration_single() {
+    // TODO(paulberry): Implement endConditionalUri
+    super.test_parseImportDirective_configuration_single();
+  }
+
+  @override
+  @failingTest
+  void test_parsePartOfDirective_name() {
+    // TODO(paulberry,ahe): Thes test verifies that even if URIs in "part of"
+    // declarations are enabled, a construct of the form "part of identifier;"
+    // is still properly handled.  URIs in "part of" declarations are not
+    // supported by Fasta yet.
+    super.test_parsePartOfDirective_name();
+  }
+
+  @override
+  @failingTest
+  void test_parsePartOfDirective_uri() {
+    // TODO(paulberry,ahe): URIs in "part of" declarations are not supported by
+    // Fasta.
+    super.test_parsePartOfDirective_uri();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_noParameters() {
+    // TODO(paulberry): Unhandled event: FunctionTypeAlias
+    super.test_parseTypeAlias_function_noParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_noReturnType() {
+    // TODO(paulberry): Unhandled event: FunctionTypeAlias
+    super.test_parseTypeAlias_function_noReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_parameterizedReturnType() {
+    // TODO(paulberry): Unhandled event: TypeArguments
+    super.test_parseTypeAlias_function_parameterizedReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_parameters() {
+    // TODO(paulberry): Unhandled event: FunctionTypeAlias
+    super.test_parseTypeAlias_function_parameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_typeParameters() {
+    // TODO(paulberry): Unhandled event: TypeVariable
+    super.test_parseTypeAlias_function_typeParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_function_voidReturnType() {
+    // TODO(paulberry): Unhandled event: VoidKeyword
+    super.test_parseTypeAlias_function_voidReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_noParameters() {
+    super.test_parseTypeAlias_genericFunction_noParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_noReturnType() {
+    super.test_parseTypeAlias_genericFunction_noReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
+    super.test_parseTypeAlias_genericFunction_parameterizedReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_parameters() {
+    super.test_parseTypeAlias_genericFunction_parameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters() {
+    super.test_parseTypeAlias_genericFunction_typeParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
+    super.test_parseTypeAlias_genericFunction_typeParameters_noParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
+    super.test_parseTypeAlias_genericFunction_typeParameters_noReturnType();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
+    super
+        .test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
+    super.test_parseTypeAlias_genericFunction_typeParameters_parameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
+    super.test_parseTypeAlias_genericFunction_typeParameters_typeParameters();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
+    super.test_parseTypeAlias_genericFunction_typeParameters_voidReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseTypeAlias_genericFunction_voidReturnType() {
+    super.test_parseTypeAlias_genericFunction_voidReturnType();
+  }
+}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 914abd0..34aef35 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -30,6 +30,7 @@
     defineReflectiveTests(NonErrorParserTest);
     defineReflectiveTests(RecoveryParserTest);
     defineReflectiveTests(SimpleParserTest);
+    defineReflectiveTests(TopLevelParserTest);
   });
 }
 
@@ -37,11 +38,34 @@
  * Abstract base class for parser tests, which does not make assumptions about
  * which parser is used.
  */
-abstract class AbstractParserTestCase {
+abstract class AbstractParserTestCase implements ParserTestHelpers {
   void set enableGenericMethodComments(bool value);
 
   void set enableNnbd(bool value);
 
+  /**
+   * Set a flag indicating whether the parser is to parse part-of directives
+   * that specify a URI rather than a library name.
+   */
+  void set enableUriInPartOf(bool value);
+
+  /**
+   * Get the parser used by the test.
+   *
+   * Caller must first invoke [createParser].
+   */
+  Parser get parser;
+
+  /**
+   * Asserts that no errors occurred during parsing.
+   */
+  void assertNoErrors();
+
+  /**
+   * Prepares to parse using tokens scanned from the given [content] string.
+   */
+  void createParser(String content);
+
   CompilationUnit parseCompilationUnit(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
@@ -49,9 +73,33 @@
   CompilationUnit parseCompilationUnitWithOptions(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
+  /**
+   * Parse the given source as a compilation unit.
+   *
+   * @param source the source to be parsed
+   * @param errorCodes the error codes of the errors that are expected to be found
+   * @return the compilation unit that was parsed
+   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
+   *           not match those that are expected, or if the result would have been `null`
+   */
+  CompilationUnit parseDirectives(String source,
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
+
   Expression parseExpression(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
+  /**
+   * Parses a single top level member of a compilation unit (other than a
+   * directive), including any comment and/or metadata that precedes it.
+   */
+  CompilationUnitMember parseFullCompilationUnitMember();
+
+  /**
+   * Parses a single top level directive, including any comment and/or metadata
+   * that precedes it.
+   */
+  Directive parseFullDirective();
+
   Statement parseStatement(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[],
       bool enableLazyAssignmentOperators]);
@@ -1622,6 +1670,13 @@
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_COMMENT_REFERENCE]);
   }
 
+  void test_invalidConstructorName_with() {
+    createParser("C.with();");
+    ClassMember member = parser.parseClassMember('C');
+    expectNotNullIfNoErrors(member);
+    listener.assertErrorsWithCodes([ParserErrorCode.INVALID_CONSTRUCTOR_NAME]);
+  }
+
   void test_invalidHexEscape_invalidDigit() {
     createParser("'\\x0 a'");
     StringLiteral literal = parser.parseStringLiteral();
@@ -2942,7 +2997,9 @@
  * Implementation of [AbstractParserTestCase] specialized for testing the
  * analyzer parser.
  */
-class ParserTestCase extends EngineTestCase implements AbstractParserTestCase {
+class ParserTestCase extends EngineTestCase
+    with ParserTestHelpers
+    implements AbstractParserTestCase {
   /**
    * A flag indicating whether parser is to parse function bodies.
    */
@@ -2996,6 +3053,11 @@
    */
   Parser parser;
 
+  @override
+  void assertNoErrors() {
+    listener.assertNoErrors();
+  }
+
   /**
    * Create the [parser] and [listener] used by a test. The [parser] will be
    * prepared to parse the tokens scanned from the given [content].
@@ -3081,6 +3143,17 @@
     return unit;
   }
 
+  @override
+  CompilationUnit parseDirectives(String source,
+      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
+    createParser(source);
+    CompilationUnit unit = parser.parseDirectives2();
+    expect(unit, isNotNull);
+    expect(unit.declarations, hasLength(0));
+    listener.assertErrorsWithCodes(errorCodes);
+    return unit;
+  }
+
   /**
    * Parse the given source as an expression.
    *
@@ -3106,10 +3179,7 @@
   CompilationUnitMember parseFullCompilationUnitMember() =>
       parser.parseCompilationUnitMember(parser.parseCommentAndMetadata());
 
-  /**
-   * Parses a single top level directive, including any comment and/or metadata
-   * that precedes it.
-   */
+  @override
   Directive parseFullDirective() =>
       parser.parseDirective(parser.parseCommentAndMetadata());
 
@@ -3176,6 +3246,29 @@
 }
 
 /**
+ * Helper methods that aid in parser tests.
+ *
+ * Intended to be mixed in to parser test case classes.
+ */
+class ParserTestHelpers {
+  void expectCommentText(Comment comment, String expectedText) {
+    expect(comment.beginToken, same(comment.endToken));
+    expect(comment.beginToken.lexeme, expectedText);
+  }
+
+  void expectDottedName(DottedName name, List<String> expectedComponents) {
+    int count = expectedComponents.length;
+    NodeList<SimpleIdentifier> components = name.components;
+    expect(components, hasLength(count));
+    for (int i = 0; i < count; i++) {
+      SimpleIdentifier component = components[i];
+      expect(component, isNotNull);
+      expect(component.name, expectedComponents[i]);
+    }
+  }
+}
+
+/**
  * The class `RecoveryParserTest` defines parser tests that test the parsing of invalid code
  * sequences to ensure that the correct recovery steps are taken in the parser.
  */
@@ -4491,49 +4584,6 @@
     expect(literal.isSynthetic, isTrue);
   }
 
-  void test_function_literal_allowed_at_toplevel() {
-    parseCompilationUnit("var x = () {};");
-  }
-
-  void
-      test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = f(() {}); }");
-  }
-
-  void
-      test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = x[() {}]; }");
-  }
-
-  void
-      test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = [() {}]; }");
-  }
-
-  void
-      test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = {'key': () {}}; }");
-  }
-
-  void
-      test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = (() {}); }");
-  }
-
-  void
-      test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
-    parseCompilationUnit("class C { C() : a = \"\${(){}}\"; }");
-  }
-
-  void test_import_as_show() {
-    parseCompilationUnit("import 'dart:math' as M show E;");
-  }
-
-  void test_import_show_hide() {
-    parseCompilationUnit(
-        "import 'import1_lib.dart' show hide, show hide ugly;");
-  }
-
   void test_isFunctionDeclaration_nameButNoReturn_block() {
     expect(_isFunctionDeclaration("f() {}"), isTrue);
   }
@@ -5734,229 +5784,6 @@
     expect(section.propertyName, isNotNull);
   }
 
-  void test_parseClassDeclaration_abstract() {
-    createParser('abstract class A {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNotNull);
-    expect(declaration.extendsClause, isNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_empty() {
-    createParser('class A {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_extends() {
-    createParser('class A extends B {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNotNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_extendsAndImplements() {
-    createParser('class A extends B implements C {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNotNull);
-    expect(declaration.implementsClause, isNotNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_extendsAndWith() {
-    createParser('class A extends B with C {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.typeParameters, isNull);
-    expect(declaration.extendsClause, isNotNull);
-    expect(declaration.withClause, isNotNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-  }
-
-  void test_parseClassDeclaration_extendsAndWithAndImplements() {
-    createParser('class A extends B with C implements D {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.typeParameters, isNull);
-    expect(declaration.extendsClause, isNotNull);
-    expect(declaration.withClause, isNotNull);
-    expect(declaration.implementsClause, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-  }
-
-  void test_parseClassDeclaration_implements() {
-    createParser('class A implements C {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNull);
-    expect(declaration.implementsClause, isNotNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_native() {
-    createParser('class A native "nativeValue" {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    NativeClause nativeClause = declaration.nativeClause;
-    expect(nativeClause, isNotNull);
-    expect(nativeClause.nativeKeyword, isNotNull);
-    expect(nativeClause.name.stringValue, "nativeValue");
-    expect(nativeClause.beginToken, same(nativeClause.nativeKeyword));
-    expect(nativeClause.endToken, same(nativeClause.name.endToken));
-  }
-
-  void test_parseClassDeclaration_nonEmpty() {
-    createParser('class A {var f;}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(1));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNull);
-  }
-
-  void test_parseClassDeclaration_typeAlias_implementsC() {
-    createParser('class A = Object with B implements C;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.implementsClause, isNotNull);
-    expect(typeAlias.implementsClause.implementsKeyword, isNotNull);
-    expect(typeAlias.implementsClause.interfaces.length, 1);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseClassDeclaration_typeAlias_withB() {
-    createParser('class A = Object with B;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.withClause.withKeyword, isNotNull);
-    expect(typeAlias.withClause.mixinTypes.length, 1);
-    expect(typeAlias.implementsClause, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseClassDeclaration_typeParameters() {
-    createParser('class A<B> {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.abstractKeyword, isNull);
-    expect(declaration.extendsClause, isNull);
-    expect(declaration.implementsClause, isNull);
-    expect(declaration.classKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.members, hasLength(0));
-    expect(declaration.rightBracket, isNotNull);
-    expect(declaration.typeParameters, isNotNull);
-    expect(declaration.typeParameters.typeParameters, hasLength(1));
-  }
-
   void test_parseClassMember_constructor_withInitializers() {
     // TODO(brianwilkerson) Test other kinds of class members: fields, getters
     // and setters.
@@ -6112,7 +5939,6 @@
     expect(variable.name, isNotNull);
   }
 
-  @failingTest
   void test_parseClassMember_getter_functionType() {
     createParser('int Function(int) get g {}');
     ClassMember member = parser.parseClassMember('C');
@@ -6442,7 +6268,6 @@
     expect(method.body, isNotNull);
   }
 
-  @failingTest
   void test_parseClassMember_method_returnType_functionType() {
     createParser('int Function(String) m() {}');
     ClassMember member = parser.parseClassMember('C');
@@ -6558,7 +6383,6 @@
     expect(method.body, isNotNull);
   }
 
-  @failingTest
   void test_parseClassMember_operator_functionType() {
     createParser('int Function() operator +(int Function() f) {}');
     ClassMember member = parser.parseClassMember('C');
@@ -7260,499 +7084,6 @@
     expect(reference.offset, 15);
   }
 
-  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
-    createParser('abstract<dynamic> _abstract = new abstract.A();');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_builtIn_asFunctionName() {
-    parseCompilationUnit('abstract(x) => 0;');
-    parseCompilationUnit('as(x) => 0;');
-    parseCompilationUnit('dynamic(x) => 0;');
-    parseCompilationUnit('export(x) => 0;');
-    parseCompilationUnit('external(x) => 0;');
-    parseCompilationUnit('factory(x) => 0;');
-    parseCompilationUnit('get(x) => 0;');
-    parseCompilationUnit('implements(x) => 0;');
-    parseCompilationUnit('import(x) => 0;');
-    parseCompilationUnit('library(x) => 0;');
-    parseCompilationUnit('operator(x) => 0;');
-    parseCompilationUnit('part(x) => 0;');
-    parseCompilationUnit('set(x) => 0;');
-    parseCompilationUnit('static(x) => 0;');
-    parseCompilationUnit('typedef(x) => 0;');
-  }
-
-  void test_parseCompilationUnit_directives_multiple() {
-    createParser("library l;\npart 'a.dart';");
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(2));
-    expect(unit.declarations, hasLength(0));
-  }
-
-  void test_parseCompilationUnit_directives_single() {
-    createParser('library l;');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(1));
-    expect(unit.declarations, hasLength(0));
-  }
-
-  void test_parseCompilationUnit_empty() {
-    createParser('');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(0));
-  }
-
-  void test_parseCompilationUnit_exportAsPrefix() {
-    createParser('export.A _export = new export.A();');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
-    createParser('export<dynamic> _export = new export.A();');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
-    createParser('operator<dynamic> _operator = new operator.A();');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_script() {
-    createParser('#! /bin/dart');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNotNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(0));
-  }
-
-  void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
-    ParserTestCase.parseFunctionBodies = false;
-    createParser('f() { "\${n}"; }');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_topLevelDeclaration() {
-    createParser('class A {}');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnit_typedefAsPrefix() {
-    createParser('typedef.A _typedef = new typedef.A();');
-    CompilationUnit unit = parser.parseCompilationUnit2();
-    expectNotNullIfNoErrors(unit);
-    listener.assertNoErrors();
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-    expect(unit.declarations, hasLength(1));
-  }
-
-  void test_parseCompilationUnitMember_abstractAsPrefix() {
-    createParser('abstract.A _abstract = new abstract.A();');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_class() {
-    createParser('class A {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassDeclaration>());
-    ClassDeclaration declaration = member;
-    expect(declaration.name.name, "A");
-    expect(declaration.members, hasLength(0));
-  }
-
-  void test_parseCompilationUnitMember_classTypeAlias() {
-    createParser('abstract class A = B with C;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias declaration = member;
-    expect(declaration.name.name, "A");
-    expect(declaration.abstractKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_constVariable() {
-    createParser('const int x = 0;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_finalVariable() {
-    createParser('final x = 0;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_function_external_noType() {
-    createParser('external f();');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseCompilationUnitMember_function_external_type() {
-    createParser('external int f();');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseCompilationUnitMember_function_generic_noReturnType() {
-    createParser('f<E>() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.returnType, isNull);
-    expect(declaration.functionExpression.typeParameters, isNotNull);
-  }
-
-  void
-      test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
-    createParser('f<@a E>() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.returnType, isNull);
-    expect(declaration.functionExpression.typeParameters, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_function_generic_returnType() {
-    createParser('E f<E>() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.returnType, isNotNull);
-    expect(declaration.functionExpression.typeParameters, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_function_generic_void() {
-    createParser('void f<T>(T t) {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseCompilationUnitMember_function_noType() {
-    createParser('f() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseCompilationUnitMember_function_type() {
-    createParser('int f() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseCompilationUnitMember_function_void() {
-    createParser('void f() {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.returnType, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_getter_external_noType() {
-    createParser('external get p;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_getter_external_type() {
-    createParser('external int get p;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_getter_noType() {
-    createParser('get p => 0;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_getter_type() {
-    createParser('int get p => 0;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_setter_external_noType() {
-    createParser('external set p(v);');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_setter_external_type() {
-    createParser('external void set p(int v);');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.externalKeyword, isNotNull);
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_setter_noType() {
-    createParser('set p(v) {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_setter_type() {
-    createParser('void set p(int v) {}');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionDeclaration>());
-    FunctionDeclaration declaration = member;
-    expect(declaration.functionExpression, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-    expect(declaration.returnType, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_typeAlias_abstract() {
-    createParser('abstract class C = S with M;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.equals, isNotNull);
-    expect(typeAlias.abstractKeyword, isNotNull);
-    expect(typeAlias.superclass.name.name, "S");
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.implementsClause, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_typeAlias_generic() {
-    createParser('class C<E> = S<E> with M<E> implements I<E>;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
-    expect(typeAlias.typeParameters.typeParameters, hasLength(1));
-    expect(typeAlias.equals, isNotNull);
-    expect(typeAlias.abstractKeyword, isNull);
-    expect(typeAlias.superclass.name.name, "S");
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.implementsClause, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_typeAlias_implements() {
-    createParser('class C = S with M implements I;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.equals, isNotNull);
-    expect(typeAlias.abstractKeyword, isNull);
-    expect(typeAlias.superclass.name.name, "S");
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.implementsClause, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_typeAlias_noImplements() {
-    createParser('class C = S with M;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<ClassTypeAlias>());
-    ClassTypeAlias typeAlias = member;
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name.name, "C");
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.equals, isNotNull);
-    expect(typeAlias.abstractKeyword, isNull);
-    expect(typeAlias.superclass.name.name, "S");
-    expect(typeAlias.withClause, isNotNull);
-    expect(typeAlias.implementsClause, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_typedef() {
-    createParser('typedef F();');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<FunctionTypeAlias>());
-    FunctionTypeAlias typeAlias = member;
-    expect(typeAlias.name.name, "F");
-    expect(typeAlias.parameters.parameters, hasLength(0));
-  }
-
-  void test_parseCompilationUnitMember_variable() {
-    createParser('var x = 0;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_variableGet() {
-    createParser('String get = null;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
-  void test_parseCompilationUnitMember_variableSet() {
-    createParser('String set = null;');
-    CompilationUnitMember member = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(member);
-    listener.assertNoErrors();
-    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
-    TopLevelVariableDeclaration declaration = member;
-    expect(declaration.semicolon, isNotNull);
-    expect(declaration.variables, isNotNull);
-  }
-
   void test_parseConditionalExpression() {
     createParser('x ? y : z');
     ConditionalExpression expression = parser.parseConditionalExpression();
@@ -7772,7 +7103,7 @@
     listener.assertNoErrors();
     expect(configuration.ifKeyword, isNotNull);
     expect(configuration.leftParenthesis, isNotNull);
-    _expectDottedName(configuration.name, ["a", "b"]);
+    expectDottedName(configuration.name, ["a", "b"]);
     expect(configuration.equalToken, isNull);
     expect(configuration.value, isNull);
     expect(configuration.rightParenthesis, isNotNull);
@@ -7786,7 +7117,7 @@
     listener.assertNoErrors();
     expect(configuration.ifKeyword, isNotNull);
     expect(configuration.leftParenthesis, isNotNull);
-    _expectDottedName(configuration.name, ["a"]);
+    expectDottedName(configuration.name, ["a"]);
     expect(configuration.equalToken, isNull);
     expect(configuration.value, isNull);
     expect(configuration.rightParenthesis, isNotNull);
@@ -7800,7 +7131,7 @@
     listener.assertNoErrors();
     expect(configuration.ifKeyword, isNotNull);
     expect(configuration.leftParenthesis, isNotNull);
-    _expectDottedName(configuration.name, ["a", "b"]);
+    expectDottedName(configuration.name, ["a", "b"]);
     expect(configuration.equalToken, isNotNull);
     expect(configuration.value, isNotNull);
     expect(configuration.rightParenthesis, isNotNull);
@@ -7814,7 +7145,7 @@
     listener.assertNoErrors();
     expect(configuration.ifKeyword, isNotNull);
     expect(configuration.leftParenthesis, isNotNull);
-    _expectDottedName(configuration.name, ["a"]);
+    expectDottedName(configuration.name, ["a"]);
     expect(configuration.equalToken, isNotNull);
     expect(configuration.value, isNotNull);
     expect(configuration.rightParenthesis, isNotNull);
@@ -8049,115 +7380,6 @@
     expect(statement.semicolon, isNotNull);
   }
 
-  void test_parseDirective_export() {
-    createParser("export 'lib/lib.dart';");
-    Directive directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive, new isInstanceOf<ExportDirective>());
-    ExportDirective exportDirective = directive;
-    expect(exportDirective.keyword, isNotNull);
-    expect(exportDirective.uri, isNotNull);
-    expect(exportDirective.combinators, hasLength(0));
-    expect(exportDirective.semicolon, isNotNull);
-  }
-
-  void test_parseDirective_import() {
-    createParser("import 'lib/lib.dart';");
-    Directive directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive, new isInstanceOf<ImportDirective>());
-    ImportDirective importDirective = directive;
-    expect(importDirective.keyword, isNotNull);
-    expect(importDirective.uri, isNotNull);
-    expect(importDirective.asKeyword, isNull);
-    expect(importDirective.prefix, isNull);
-    expect(importDirective.combinators, hasLength(0));
-    expect(importDirective.semicolon, isNotNull);
-  }
-
-  void test_parseDirective_library() {
-    createParser("library l;");
-    Directive directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive, new isInstanceOf<LibraryDirective>());
-    LibraryDirective libraryDirective = directive;
-    expect(libraryDirective.libraryKeyword, isNotNull);
-    expect(libraryDirective.name, isNotNull);
-    expect(libraryDirective.semicolon, isNotNull);
-  }
-
-  void test_parseDirective_part() {
-    createParser("part 'lib/lib.dart';");
-    Directive directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive, new isInstanceOf<PartDirective>());
-    PartDirective partDirective = directive;
-    expect(partDirective.partKeyword, isNotNull);
-    expect(partDirective.uri, isNotNull);
-    expect(partDirective.semicolon, isNotNull);
-  }
-
-  void test_parseDirective_partOf() {
-    createParser("part of l;");
-    Directive directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive, new isInstanceOf<PartOfDirective>());
-    PartOfDirective partOfDirective = directive;
-    expect(partOfDirective.partKeyword, isNotNull);
-    expect(partOfDirective.ofKeyword, isNotNull);
-    expect(partOfDirective.libraryName, isNotNull);
-    expect(partOfDirective.semicolon, isNotNull);
-  }
-
-  void test_parseDirectives_complete() {
-    CompilationUnit unit =
-        _parseDirectives("#! /bin/dart\nlibrary l;\nclass A {}");
-    expect(unit.scriptTag, isNotNull);
-    expect(unit.directives, hasLength(1));
-  }
-
-  void test_parseDirectives_empty() {
-    CompilationUnit unit = _parseDirectives("");
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-  }
-
-  void test_parseDirectives_mixed() {
-    CompilationUnit unit =
-        _parseDirectives("library l; class A {} part 'foo.dart';");
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(1));
-  }
-
-  void test_parseDirectives_multiple() {
-    CompilationUnit unit = _parseDirectives("library l;\npart 'a.dart';");
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(2));
-  }
-
-  void test_parseDirectives_script() {
-    CompilationUnit unit = _parseDirectives("#! /bin/dart");
-    expect(unit.scriptTag, isNotNull);
-    expect(unit.directives, hasLength(0));
-  }
-
-  void test_parseDirectives_single() {
-    CompilationUnit unit = _parseDirectives("library l;");
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(1));
-  }
-
-  void test_parseDirectives_topLevelDeclaration() {
-    CompilationUnit unit = _parseDirectives("class A {}");
-    expect(unit.scriptTag, isNull);
-    expect(unit.directives, hasLength(0));
-  }
-
   void test_parseDocumentationComment_block() {
     createParser('/** */ class');
     Comment comment = parser
@@ -8215,7 +7437,7 @@
     DottedName name = parser.parseDottedName();
     expectNotNullIfNoErrors(name);
     listener.assertNoErrors();
-    _expectDottedName(name, ["a", "b", "c"]);
+    expectDottedName(name, ["a", "b", "c"]);
   }
 
   void test_parseDottedName_single() {
@@ -8223,7 +7445,7 @@
     DottedName name = parser.parseDottedName();
     expectNotNullIfNoErrors(name);
     listener.assertNoErrors();
-    _expectDottedName(name, ["a"]);
+    expectDottedName(name, ["a"]);
   }
 
   void test_parseEmptyStatement() {
@@ -8234,45 +7456,6 @@
     expect(statement.semicolon, isNotNull);
   }
 
-  void test_parseEnumDeclaration_one() {
-    createParser("enum E {ONE}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.enumKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.constants, hasLength(1));
-    expect(declaration.rightBracket, isNotNull);
-  }
-
-  void test_parseEnumDeclaration_trailingComma() {
-    createParser("enum E {ONE,}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.enumKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.constants, hasLength(1));
-    expect(declaration.rightBracket, isNotNull);
-  }
-
-  void test_parseEnumDeclaration_two() {
-    createParser("enum E {ONE, TWO}");
-    EnumDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    expect(declaration.documentationComment, isNull);
-    expect(declaration.enumKeyword, isNotNull);
-    expect(declaration.leftBracket, isNotNull);
-    expect(declaration.name, isNotNull);
-    expect(declaration.constants, hasLength(2));
-    expect(declaration.rightBracket, isNotNull);
-  }
-
   void test_parseEqualityExpression_normal() {
     createParser('x == y');
     BinaryExpression expression = parser.parseEqualityExpression();
@@ -8295,88 +7478,6 @@
     expect(expression.rightOperand, isNotNull);
   }
 
-  void test_parseExportDirective_configuration_multiple() {
-    createParser("export 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.configurations, hasLength(2));
-    _expectDottedName(directive.configurations[0].name, ['a']);
-    _expectDottedName(directive.configurations[1].name, ['c']);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_configuration_single() {
-    createParser("export 'lib/lib.dart' if (a.b == 'c.dart') '';");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.configurations, hasLength(1));
-    _expectDottedName(directive.configurations[0].name, ['a', 'b']);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_hide() {
-    createParser("export 'lib/lib.dart' hide A, B;");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.combinators, hasLength(1));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_hide_show() {
-    createParser("export 'lib/lib.dart' hide A show B;");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.combinators, hasLength(2));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_noCombinator() {
-    createParser("export 'lib/lib.dart';");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_show() {
-    createParser("export 'lib/lib.dart' show A, B;");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.combinators, hasLength(1));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseExportDirective_show_hide() {
-    createParser("export 'lib/lib.dart' show B hide A;");
-    ExportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.combinators, hasLength(2));
-    expect(directive.semicolon, isNotNull);
-  }
-
   void test_parseExpression_assign() {
     // TODO(brianwilkerson) Implement more tests for this method.
     Expression expression = parseExpression('x = y');
@@ -8887,7 +7988,6 @@
     expect(defaultParameter.kind, kind);
   }
 
-  @failingTest
   void test_parseFormalParameter_covariant_type_function() {
     ParameterKind kind = ParameterKind.REQUIRED;
     createParser('covariant String Function(int) a');
@@ -9123,7 +8223,6 @@
     expect(defaultParameter.kind, kind);
   }
 
-  @failingTest
   void test_parseFormalParameter_type_function() {
     ParameterKind kind = ParameterKind.REQUIRED;
     createParser('String Function(int) a');
@@ -9928,87 +9027,6 @@
     expect(functionBody, new isInstanceOf<EmptyFunctionBody>());
   }
 
-  void test_parseFunctionDeclaration_function() {
-    createParser('/// Doc\nT f() {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
-    expect((declaration.returnType as TypeName).name.name, 'T');
-    expect(declaration.name, isNotNull);
-    FunctionExpression expression = declaration.functionExpression;
-    expect(expression, isNotNull);
-    expect(expression.body, isNotNull);
-    expect(expression.typeParameters, isNull);
-    expect(expression.parameters, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseFunctionDeclaration_functionWithTypeParameters() {
-    createParser('/// Doc\nT f<E>() {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
-    expect((declaration.returnType as TypeName).name.name, 'T');
-    expect(declaration.name, isNotNull);
-    FunctionExpression expression = declaration.functionExpression;
-    expect(expression, isNotNull);
-    expect(expression.body, isNotNull);
-    expect(expression.typeParameters, isNotNull);
-    expect(expression.parameters, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
-    enableGenericMethodComments = true;
-    createParser('/// Doc\nT f/*<E>*/() {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
-    expect((declaration.returnType as TypeName).name.name, 'T');
-    expect(declaration.name, isNotNull);
-    FunctionExpression expression = declaration.functionExpression;
-    expect(expression, isNotNull);
-    expect(expression.body, isNotNull);
-    expect(expression.typeParameters, isNotNull);
-    expect(expression.parameters, isNotNull);
-    expect(declaration.propertyKeyword, isNull);
-  }
-
-  void test_parseFunctionDeclaration_getter() {
-    createParser('/// Doc\nT get p => 0;');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
-    expect((declaration.returnType as TypeName).name.name, 'T');
-    expect(declaration.name, isNotNull);
-    FunctionExpression expression = declaration.functionExpression;
-    expect(expression, isNotNull);
-    expect(expression.body, isNotNull);
-    expect(expression.typeParameters, isNull);
-    expect(expression.parameters, isNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
-  void test_parseFunctionDeclaration_setter() {
-    createParser('/// Doc\nT set p(v) {}');
-    FunctionDeclaration declaration = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(declaration);
-    listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
-    expect((declaration.returnType as TypeName).name.name, 'T');
-    expect(declaration.name, isNotNull);
-    FunctionExpression expression = declaration.functionExpression;
-    expect(expression, isNotNull);
-    expect(expression.body, isNotNull);
-    expect(expression.typeParameters, isNull);
-    expect(expression.parameters, isNotNull);
-    expect(declaration.propertyKeyword, isNotNull);
-  }
-
   void test_parseFunctionDeclarationStatement() {
     createParser('void f(int p) => p * 2;');
     FunctionDeclarationStatement statement =
@@ -10091,41 +9109,13 @@
     expect((expression.body as ExpressionFunctionBody).semicolon, isNull);
   }
 
-  @failingTest
-  void test_parseGenericTypeAlias_noTypeParameters() {
-    createParser('F = int Function(int);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(alias);
-    listener.assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
-    expect(alias.typeParameters, isNull);
-    expect(alias.equals, isNotNull);
-    expect(alias.functionType, isNotNull);
-    expect(alias.semicolon, isNotNull);
-  }
-
-  @failingTest
-  void test_parseGenericTypeAlias_typeParameters() {
-    createParser('F<T> = T Function(T);');
-    GenericTypeAlias alias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(alias);
-    listener.assertNoErrors();
-    expect(alias.name, isNotNull);
-    expect(alias.name.name, 'F');
-    expect(alias.typeParameters, isNotNull);
-    expect(alias.equals, isNotNull);
-    expect(alias.functionType, isNotNull);
-    expect(alias.semicolon, isNotNull);
-  }
-
   void test_parseGetter_nonStatic() {
     createParser('/// Doc\nT get a;');
     MethodDeclaration method = parser.parseClassMember('C');
     expectNotNullIfNoErrors(method);
     listener.assertNoErrors();
     expect(method.body, isNotNull);
-    _expectCommentText(method.documentationComment, '/// Doc');
+    expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
     expect(method.name, isNotNull);
@@ -10141,7 +9131,7 @@
     expectNotNullIfNoErrors(method);
     listener.assertNoErrors();
     expect(method.body, isNotNull);
-    _expectCommentText(method.documentationComment, '/// Doc');
+    expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword.lexeme, 'static');
     expect(method.name, isNotNull);
@@ -10242,143 +9232,12 @@
     expect(clause.implementsKeyword, isNotNull);
   }
 
-  void test_parseImportDirective_configuration_multiple() {
-    createParser("import 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.configurations, hasLength(2));
-    _expectDottedName(directive.configurations[0].name, ['a']);
-    _expectDottedName(directive.configurations[1].name, ['c']);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNull);
-    expect(directive.prefix, isNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_configuration_single() {
-    createParser("import 'lib/lib.dart' if (a.b == 'c.dart') '';");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.configurations, hasLength(1));
-    _expectDottedName(directive.configurations[0].name, ['a', 'b']);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNull);
-    expect(directive.prefix, isNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_deferred() {
-    createParser("import 'lib/lib.dart' deferred as a;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNotNull);
-    expect(directive.asKeyword, isNotNull);
-    expect(directive.prefix, isNotNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_hide() {
-    createParser("import 'lib/lib.dart' hide A, B;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNull);
-    expect(directive.prefix, isNull);
-    expect(directive.combinators, hasLength(1));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_noCombinator() {
-    createParser("import 'lib/lib.dart';");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNull);
-    expect(directive.prefix, isNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_prefix() {
-    createParser("import 'lib/lib.dart' as a;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNotNull);
-    expect(directive.prefix, isNotNull);
-    expect(directive.combinators, hasLength(0));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_prefix_hide_show() {
-    createParser("import 'lib/lib.dart' as a hide A show B;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNotNull);
-    expect(directive.prefix, isNotNull);
-    expect(directive.combinators, hasLength(2));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_prefix_show_hide() {
-    createParser("import 'lib/lib.dart' as a show B hide A;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNotNull);
-    expect(directive.prefix, isNotNull);
-    expect(directive.combinators, hasLength(2));
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parseImportDirective_show() {
-    createParser("import 'lib/lib.dart' show A, B;");
-    ImportDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.keyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.deferredKeyword, isNull);
-    expect(directive.asKeyword, isNull);
-    expect(directive.prefix, isNull);
-    expect(directive.combinators, hasLength(1));
-    expect(directive.semicolon, isNotNull);
-  }
-
   void test_parseInitializedIdentifierList_type() {
     createParser("/// Doc\nstatic T a = 1, b, c = 3;");
     FieldDeclaration declaration = parser.parseClassMember('C');
     expectNotNullIfNoErrors(declaration);
     listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
+    expectCommentText(declaration.documentationComment, '/// Doc');
     VariableDeclarationList fields = declaration.fields;
     expect(fields, isNotNull);
     expect(fields.keyword, isNull);
@@ -10393,7 +9252,7 @@
     FieldDeclaration declaration = parser.parseClassMember('C');
     expectNotNullIfNoErrors(declaration);
     listener.assertNoErrors();
-    _expectCommentText(declaration.documentationComment, '/// Doc');
+    expectCommentText(declaration.documentationComment, '/// Doc');
     VariableDeclarationList fields = declaration.fields;
     expect(fields, isNotNull);
     expect(fields.keyword.lexeme, 'var');
@@ -10648,16 +9507,6 @@
     expect((arguments[0] as TypeName).question, isNotNull);
   }
 
-  void test_parseLibraryDirective() {
-    createParser('library l;');
-    LibraryDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.libraryKeyword, isNotNull);
-    expect(directive.name, isNotNull);
-    expect(directive.semicolon, isNotNull);
-  }
-
   void test_parseLibraryIdentifier_multiple() {
     String name = "a.b.c";
     createParser(name);
@@ -11171,6 +10020,13 @@
     expect(expressionStatement.expression, isNotNull);
   }
 
+  void test_parseNonLabeledStatement_variableDeclaration_final_namedFunction() {
+    createParser('final int Function = 0;');
+    Statement statement = parser.parseNonLabeledStatement();
+    expectNotNullIfNoErrors(statement);
+    listener.assertNoErrors();
+  }
+
   void test_parseNormalFormalParameter_field_const_noType() {
     createParser('const this.a)');
     NormalFormalParameter parameter = parser.parseNormalFormalParameter();
@@ -11615,7 +10471,7 @@
     expectNotNullIfNoErrors(method);
     listener.assertNoErrors();
     expect(method.body, isNotNull);
-    _expectCommentText(method.documentationComment, '/// Doc');
+    expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
     expect(method.name, isNotNull);
@@ -11630,38 +10486,6 @@
     // TODO(brianwilkerson) Implement tests for this method.
   }
 
-  void test_parsePartDirective() {
-    createParser("part 'lib/lib.dart';");
-    PartDirective directive = parseFullDirective();
-    expectNotNullIfNoErrors(directive);
-    listener.assertNoErrors();
-    expect(directive.partKeyword, isNotNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parsePartOfDirective_name() {
-    enableUriInPartOf = true;
-    createParser("part of l;");
-    PartOfDirective directive = parseFullDirective();
-    expect(directive.partKeyword, isNotNull);
-    expect(directive.ofKeyword, isNotNull);
-    expect(directive.libraryName, isNotNull);
-    expect(directive.uri, isNull);
-    expect(directive.semicolon, isNotNull);
-  }
-
-  void test_parsePartOfDirective_uri() {
-    enableUriInPartOf = true;
-    createParser("part of 'lib.dart';");
-    PartOfDirective directive = parseFullDirective();
-    expect(directive.partKeyword, isNotNull);
-    expect(directive.ofKeyword, isNotNull);
-    expect(directive.libraryName, isNull);
-    expect(directive.uri, isNotNull);
-    expect(directive.semicolon, isNotNull);
-  }
-
   void test_parsePostfixExpression_decrement() {
     createParser('i--');
     Expression expression = parser.parsePostfixExpression();
@@ -12124,7 +10948,6 @@
     expect(invocation.period, isNull);
   }
 
-  @failingTest
   void test_parseRelationalExpression_as_functionType_noReturnType() {
     createParser('x as Function(int)');
     Expression expression = parser.parseRelationalExpression();
@@ -12137,7 +10960,6 @@
     expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
   }
 
-  @failingTest
   void test_parseRelationalExpression_as_functionType_returnType() {
     createParser('x as String Function(int)');
     Expression expression = parser.parseRelationalExpression();
@@ -12293,7 +11115,6 @@
     expect(statement.semicolon, isNotNull);
   }
 
-  @failingTest
   void test_parseReturnType_function() {
     createParser('A<B> Function<B>(B)');
     GenericFunctionType type = parser.parseReturnType(false);
@@ -12328,7 +11149,7 @@
     expectNotNullIfNoErrors(method);
     listener.assertNoErrors();
     expect(method.body, isNotNull);
-    _expectCommentText(method.documentationComment, '/// Doc');
+    expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword, isNull);
     expect(method.name, isNotNull);
@@ -12345,7 +11166,7 @@
     expectNotNullIfNoErrors(method);
     listener.assertNoErrors();
     expect(method.body, isNotNull);
-    _expectCommentText(method.documentationComment, '/// Doc');
+    expectCommentText(method.documentationComment, '/// Doc');
     expect(method.externalKeyword, isNull);
     expect(method.modifierKeyword.lexeme, 'static');
     expect(method.name, isNotNull);
@@ -13126,290 +11947,6 @@
     expect(statement.finallyBlock, isNotNull);
   }
 
-  void test_parseTypeAlias_function_noParameters() {
-    createParser('typedef bool F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-  }
-
-  void test_parseTypeAlias_function_noReturnType() {
-    createParser('typedef F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-  }
-
-  void test_parseTypeAlias_function_parameterizedReturnType() {
-    createParser('typedef A<B> F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-  }
-
-  void test_parseTypeAlias_function_parameters() {
-    createParser('typedef bool F(Object value);');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-  }
-
-  void test_parseTypeAlias_function_typeParameters() {
-    createParser('typedef bool F<E>();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-  }
-
-  void test_parseTypeAlias_function_voidReturnType() {
-    createParser('typedef void F();');
-    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.parameters, isNotNull);
-    expect(typeAlias.returnType, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_noParameters() {
-    createParser('typedef F = bool Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_noReturnType() {
-    createParser('typedef F = Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
-    createParser('typedef F = A<B> Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_parameters() {
-    createParser('typedef F = bool Function(Object value);');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters() {
-    createParser('typedef F = bool Function<E>();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNotNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
-    createParser('typedef F<T> = bool Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
-    createParser('typedef F<T> = Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void
-      test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
-    createParser('typedef F<T> = A<B> Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
-    createParser('typedef F<T> = bool Function(Object value);');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
-    createParser('typedef F<T> = bool Function<E>();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNotNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
-    createParser('typedef F<T> = void Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNotNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
-  void test_parseTypeAlias_genericFunction_voidReturnType() {
-    createParser('typedef F = void Function();');
-    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
-    expectNotNullIfNoErrors(typeAlias);
-    listener.assertNoErrors();
-    expect(typeAlias.typedefKeyword, isNotNull);
-    expect(typeAlias.name, isNotNull);
-    expect(typeAlias.typeParameters, isNull);
-    expect(typeAlias.semicolon, isNotNull);
-    GenericFunctionType functionType = typeAlias.functionType;
-    expect(functionType, isNotNull);
-    expect(functionType.parameters, isNotNull);
-    expect(functionType.returnType, isNotNull);
-    expect(functionType.typeParameters, isNull);
-  }
-
-  @failingTest
   void test_parseTypeAnnotation_function_noReturnType_noParameters() {
     createParser('Function() v');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13423,7 +11960,6 @@
     expect(parameterList.parameters, hasLength(0));
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_noReturnType_parameters() {
     createParser('Function(int, int) v');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13450,7 +11986,6 @@
     expect((parameter.type as TypeName).name.name, 'int');
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_noReturnType_typeParameters() {
     createParser('Function<S, T>()');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13466,7 +12001,6 @@
     expect(parameterList.parameters, hasLength(0));
   }
 
-  @failingTest
   void
       test_parseTypeAnnotation_function_noReturnType_typeParameters_parameters() {
     createParser('Function<T>(String, {T t})');
@@ -13490,7 +12024,6 @@
     listener.assertNoErrors();
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_function() {
     createParser('A Function(B, C) Function(D) v');
     // TODO(scheglov) improve the test to verify also the node properties
@@ -13499,7 +12032,6 @@
     listener.assertNoErrors();
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_noParameters() {
     createParser('List<int> Function()');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13513,7 +12045,6 @@
     expect(parameterList.parameters, hasLength(0));
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_parameters() {
     createParser('List<int> Function(String s, int i)');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13542,7 +12073,6 @@
     expect((parameter.type as TypeName).name.name, 'int');
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_simple() {
     createParser('A Function(B, C) v');
     // TODO(scheglov) improve the test to verify also the node properties
@@ -13551,7 +12081,6 @@
     listener.assertNoErrors();
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_typeParameters() {
     createParser('List<T> Function<T>()');
     GenericFunctionType functionType = parser.parseTypeAnnotation(false);
@@ -13567,7 +12096,6 @@
     expect(parameterList.parameters, hasLength(0));
   }
 
-  @failingTest
   void
       test_parseTypeAnnotation_function_returnType_typeParameters_parameters() {
     createParser('List<T> Function<T>(String s, [T])');
@@ -13584,7 +12112,6 @@
     expect(parameterList.parameters, hasLength(2));
   }
 
-  @failingTest
   void test_parseTypeAnnotation_function_returnType_withArguments() {
     createParser('A<B> Function(C) v');
     // TODO(scheglov) improve this test to verify also the node properties
@@ -13736,7 +12263,6 @@
     expect(typeName.question, isNotNull);
   }
 
-  @failingTest
   void test_parseTypeParameter_bounded_functionType_noReturn() {
     createParser('A extends Function(int)');
     TypeParameter parameter = parser.parseTypeParameter();
@@ -13747,7 +12273,6 @@
     expect(parameter.name, isNotNull);
   }
 
-  @failingTest
   void test_parseTypeParameter_bounded_functionType_return() {
     createParser('A extends String Function(int)');
     TypeParameter parameter = parser.parseTypeParameter();
@@ -14363,22 +12888,6 @@
     return value;
   }
 
-  void _expectCommentText(Comment comment, String expectedText) {
-    expect(comment.beginToken, same(comment.endToken));
-    expect(comment.beginToken.lexeme, expectedText);
-  }
-
-  void _expectDottedName(DottedName name, List<String> expectedComponents) {
-    int count = expectedComponents.length;
-    NodeList<SimpleIdentifier> components = name.components;
-    expect(components, hasLength(count));
-    for (int i = 0; i < count; i++) {
-      SimpleIdentifier component = components[i];
-      expect(component, isNotNull);
-      expect(component.name, expectedComponents[i]);
-    }
-  }
-
   /**
    * Invoke the method [Parser.isFunctionDeclaration] with the parser set to the token
    * stream produced by scanning the given source.
@@ -14436,23 +12945,1611 @@
     expectNotNullIfNoErrors(result);
     return result;
   }
+}
 
-  /**
-   * Parse the given source as a compilation unit.
-   *
-   * @param source the source to be parsed
-   * @param errorCodes the error codes of the errors that are expected to be found
-   * @return the compilation unit that was parsed
-   * @throws Exception if the source could not be parsed, if the compilation errors in the source do
-   *           not match those that are expected, or if the result would have been `null`
-   */
-  CompilationUnit _parseDirectives(String source,
-      [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
-    createParser(source);
-    CompilationUnit unit = parser.parseDirectives2();
+@reflectiveTest
+class TopLevelParserTest extends ParserTestCase with TopLevelParserTestMixin {}
+
+/**
+ * Tests which exercise the parser using a complete compilation unit or
+ * compilation unit member.
+ */
+abstract class TopLevelParserTestMixin implements AbstractParserTestCase {
+  void test_function_literal_allowed_at_toplevel() {
+    parseCompilationUnit("var x = () {};");
+  }
+
+  void
+      test_function_literal_allowed_in_ArgumentList_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = f(() {}); }");
+  }
+
+  void
+      test_function_literal_allowed_in_IndexExpression_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = x[() {}]; }");
+  }
+
+  void
+      test_function_literal_allowed_in_ListLiteral_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = [() {}]; }");
+  }
+
+  void
+      test_function_literal_allowed_in_MapLiteral_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = {'key': () {}}; }");
+  }
+
+  void
+      test_function_literal_allowed_in_ParenthesizedExpression_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = (() {}); }");
+  }
+
+  void
+      test_function_literal_allowed_in_StringInterpolation_in_ConstructorFieldInitializer() {
+    parseCompilationUnit("class C { C() : a = \"\${(){}}\"; }");
+  }
+
+  void test_import_as_show() {
+    parseCompilationUnit("import 'dart:math' as M show E;");
+  }
+
+  void test_import_show_hide() {
+    parseCompilationUnit(
+        "import 'import1_lib.dart' show hide, show hide ugly;");
+  }
+
+  void test_parseClassDeclaration_abstract() {
+    createParser('abstract class A {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNotNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_empty() {
+    createParser('class A {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extends() {
+    createParser('class A extends B {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndImplements() {
+    createParser('class A extends B implements C {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndWith() {
+    createParser('class A extends B with C {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseClassDeclaration_extendsAndWithAndImplements() {
+    createParser('class A extends B with C implements D {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.typeParameters, isNull);
+    expect(declaration.extendsClause, isNotNull);
+    expect(declaration.withClause, isNotNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseClassDeclaration_implements() {
+    createParser('class A implements C {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNotNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_native() {
+    createParser('class A native "nativeValue" {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    NativeClause nativeClause = declaration.nativeClause;
+    expect(nativeClause, isNotNull);
+    expect(nativeClause.nativeKeyword, isNotNull);
+    expect(nativeClause.name.stringValue, "nativeValue");
+    expect(nativeClause.beginToken, same(nativeClause.nativeKeyword));
+    expect(nativeClause.endToken, same(nativeClause.name.endToken));
+  }
+
+  void test_parseClassDeclaration_nonEmpty() {
+    createParser('class A {var f;}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNull);
+  }
+
+  void test_parseClassDeclaration_typeAlias_implementsC() {
+    createParser('class A = Object with B implements C;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.implementsClause.implementsKeyword, isNotNull);
+    expect(typeAlias.implementsClause.interfaces.length, 1);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassDeclaration_typeAlias_withB() {
+    createParser('class A = Object with B;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.withClause.withKeyword, isNotNull);
+    expect(typeAlias.withClause.mixinTypes.length, 1);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseClassDeclaration_typeParameters() {
+    createParser('class A<B> {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.abstractKeyword, isNull);
+    expect(declaration.extendsClause, isNull);
+    expect(declaration.implementsClause, isNull);
+    expect(declaration.classKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.members, hasLength(0));
+    expect(declaration.rightBracket, isNotNull);
+    expect(declaration.typeParameters, isNotNull);
+    expect(declaration.typeParameters.typeParameters, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
+    createParser('abstract<dynamic> _abstract = new abstract.A();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
     expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_builtIn_asFunctionName() {
+    parseCompilationUnit('abstract(x) => 0;');
+    parseCompilationUnit('as(x) => 0;');
+    parseCompilationUnit('dynamic(x) => 0;');
+    parseCompilationUnit('export(x) => 0;');
+    parseCompilationUnit('external(x) => 0;');
+    parseCompilationUnit('factory(x) => 0;');
+    parseCompilationUnit('get(x) => 0;');
+    parseCompilationUnit('implements(x) => 0;');
+    parseCompilationUnit('import(x) => 0;');
+    parseCompilationUnit('library(x) => 0;');
+    parseCompilationUnit('operator(x) => 0;');
+    parseCompilationUnit('part(x) => 0;');
+    parseCompilationUnit('set(x) => 0;');
+    parseCompilationUnit('static(x) => 0;');
+    parseCompilationUnit('typedef(x) => 0;');
+  }
+
+  void test_parseCompilationUnit_directives_multiple() {
+    createParser("library l;\npart 'a.dart';");
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
     expect(unit.declarations, hasLength(0));
-    listener.assertErrorsWithCodes(errorCodes);
-    return unit;
+  }
+
+  void test_parseCompilationUnit_directives_single() {
+    createParser('library l;');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_empty() {
+    createParser('');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_exportAsPrefix() {
+    createParser('export.A _export = new export.A();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_exportAsPrefix_parameterized() {
+    createParser('export<dynamic> _export = new export.A();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
+    createParser('operator<dynamic> _operator = new operator.A();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_script() {
+    createParser('#! /bin/dart');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(0));
+  }
+
+  void test_parseCompilationUnit_skipFunctionBody_withInterpolation() {
+    ParserTestCase.parseFunctionBodies = false;
+    createParser('f() { "\${n}"; }');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_topLevelDeclaration() {
+    createParser('class A {}');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnit_typedefAsPrefix() {
+    createParser('typedef.A _typedef = new typedef.A();');
+    CompilationUnit unit = parser.parseCompilationUnit2();
+    expect(unit, isNotNull);
+    assertNoErrors();
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+    expect(unit.declarations, hasLength(1));
+  }
+
+  void test_parseCompilationUnitMember_abstractAsPrefix() {
+    createParser('abstract.A _abstract = new abstract.A();');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_class() {
+    createParser('class A {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassDeclaration>());
+    ClassDeclaration declaration = member;
+    expect(declaration.name.name, "A");
+    expect(declaration.members, hasLength(0));
+  }
+
+  void test_parseCompilationUnitMember_classTypeAlias() {
+    createParser('abstract class A = B with C;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias declaration = member;
+    expect(declaration.name.name, "A");
+    expect(declaration.abstractKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_constVariable() {
+    createParser('const int x = 0;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_expressionFunctionBody_tokens() {
+    createParser('f() => 0;');
+    var f = parseFullCompilationUnitMember() as FunctionDeclaration;
+    var body = f.functionExpression.body as ExpressionFunctionBody;
+    expect(body.functionDefinition.lexeme, '=>');
+    expect(body.semicolon.lexeme, ';');
+  }
+
+  void test_parseCompilationUnitMember_finalVariable() {
+    createParser('final x = 0;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_function_external_noType() {
+    createParser('external f();');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_external_type() {
+    createParser('external int f();');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_generic_noReturnType() {
+    createParser('f<E>() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.returnType, isNull);
+    expect(declaration.functionExpression.typeParameters, isNotNull);
+  }
+
+  void
+      test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
+    createParser('f<@a E>() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.returnType, isNull);
+    expect(declaration.functionExpression.typeParameters, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_function_generic_returnType() {
+    createParser('E f<E>() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.returnType, isNotNull);
+    expect(declaration.functionExpression.typeParameters, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_function_generic_void() {
+    createParser('void f<T>(T t) {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_noType() {
+    createParser('f() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_type() {
+    createParser('int f() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseCompilationUnitMember_function_void() {
+    createParser('void f() {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.returnType, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_external_noType() {
+    createParser('external get p;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_external_type() {
+    createParser('external int get p;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_noType() {
+    createParser('get p => 0;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_getter_type() {
+    createParser('int get p => 0;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_external_noType() {
+    createParser('external set p(v);');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_external_type() {
+    createParser('external void set p(int v);');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.externalKeyword, isNotNull);
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_noType() {
+    createParser('set p(v) {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_setter_type() {
+    createParser('void set p(int v) {}');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionDeclaration>());
+    FunctionDeclaration declaration = member;
+    expect(declaration.functionExpression, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+    expect(declaration.returnType, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_abstract() {
+    createParser('abstract class C = S with M;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNotNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_generic() {
+    createParser('class C<E> = S<E> with M<E> implements I<E>;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters.typeParameters, hasLength(1));
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_implements() {
+    createParser('class C = S with M implements I;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typeAlias_noImplements() {
+    createParser('class C = S with M;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<ClassTypeAlias>());
+    ClassTypeAlias typeAlias = member;
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name.name, "C");
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.equals, isNotNull);
+    expect(typeAlias.abstractKeyword, isNull);
+    expect(typeAlias.superclass.name.name, "S");
+    expect(typeAlias.withClause, isNotNull);
+    expect(typeAlias.implementsClause, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_typedef() {
+    createParser('typedef F();');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<FunctionTypeAlias>());
+    FunctionTypeAlias typeAlias = member;
+    expect(typeAlias.name.name, "F");
+    expect(typeAlias.parameters.parameters, hasLength(0));
+  }
+
+  void test_parseCompilationUnitMember_variable() {
+    createParser('var x = 0;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_variableGet() {
+    createParser('String get = null;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseCompilationUnitMember_variableSet() {
+    createParser('String set = null;');
+    CompilationUnitMember member = parseFullCompilationUnitMember();
+    expect(member, isNotNull);
+    assertNoErrors();
+    expect(member, new isInstanceOf<TopLevelVariableDeclaration>());
+    TopLevelVariableDeclaration declaration = member;
+    expect(declaration.semicolon, isNotNull);
+    expect(declaration.variables, isNotNull);
+  }
+
+  void test_parseDirective_export() {
+    createParser("export 'lib/lib.dart';");
+    Directive directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive, new isInstanceOf<ExportDirective>());
+    ExportDirective exportDirective = directive;
+    expect(exportDirective.keyword, isNotNull);
+    expect(exportDirective.uri, isNotNull);
+    expect(exportDirective.combinators, hasLength(0));
+    expect(exportDirective.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_import() {
+    createParser("import 'lib/lib.dart';");
+    Directive directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive, new isInstanceOf<ImportDirective>());
+    ImportDirective importDirective = directive;
+    expect(importDirective.keyword, isNotNull);
+    expect(importDirective.uri, isNotNull);
+    expect(importDirective.asKeyword, isNull);
+    expect(importDirective.prefix, isNull);
+    expect(importDirective.combinators, hasLength(0));
+    expect(importDirective.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_library() {
+    createParser("library l;");
+    Directive directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive, new isInstanceOf<LibraryDirective>());
+    LibraryDirective libraryDirective = directive;
+    expect(libraryDirective.libraryKeyword, isNotNull);
+    expect(libraryDirective.name, isNotNull);
+    expect(libraryDirective.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_library_1_component() {
+    createParser("library a;");
+    var lib = parseFullDirective() as LibraryDirective;
+    expect(lib.name.components, hasLength(1));
+    expect(lib.name.components[0].name, 'a');
+  }
+
+  void test_parseDirective_library_2_components() {
+    createParser("library a.b;");
+    var lib = parseFullDirective() as LibraryDirective;
+    expect(lib.name.components, hasLength(2));
+    expect(lib.name.components[0].name, 'a');
+    expect(lib.name.components[1].name, 'b');
+  }
+
+  void test_parseDirective_library_3_components() {
+    createParser("library a.b.c;");
+    var lib = parseFullDirective() as LibraryDirective;
+    expect(lib.name.components, hasLength(3));
+    expect(lib.name.components[0].name, 'a');
+    expect(lib.name.components[1].name, 'b');
+    expect(lib.name.components[2].name, 'c');
+  }
+
+  void test_parseDirective_part() {
+    createParser("part 'lib/lib.dart';");
+    Directive directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive, new isInstanceOf<PartDirective>());
+    PartDirective partDirective = directive;
+    expect(partDirective.partKeyword, isNotNull);
+    expect(partDirective.uri, isNotNull);
+    expect(partDirective.semicolon, isNotNull);
+  }
+
+  void test_parseDirective_part_of_1_component() {
+    createParser("part of a;");
+    var partOf = parseFullDirective() as PartOfDirective;
+    expect(partOf.libraryName.components, hasLength(1));
+    expect(partOf.libraryName.components[0].name, 'a');
+  }
+
+  void test_parseDirective_part_of_2_components() {
+    createParser("part of a.b;");
+    var partOf = parseFullDirective() as PartOfDirective;
+    expect(partOf.libraryName.components, hasLength(2));
+    expect(partOf.libraryName.components[0].name, 'a');
+    expect(partOf.libraryName.components[1].name, 'b');
+  }
+
+  void test_parseDirective_part_of_3_components() {
+    createParser("part of a.b.c;");
+    var partOf = parseFullDirective() as PartOfDirective;
+    expect(partOf.libraryName.components, hasLength(3));
+    expect(partOf.libraryName.components[0].name, 'a');
+    expect(partOf.libraryName.components[1].name, 'b');
+    expect(partOf.libraryName.components[2].name, 'c');
+  }
+
+  void test_parseDirective_partOf() {
+    createParser("part of l;");
+    Directive directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive, new isInstanceOf<PartOfDirective>());
+    PartOfDirective partOfDirective = directive;
+    expect(partOfDirective.partKeyword, isNotNull);
+    expect(partOfDirective.ofKeyword, isNotNull);
+    expect(partOfDirective.libraryName, isNotNull);
+    expect(partOfDirective.semicolon, isNotNull);
+  }
+
+  void test_parseDirectives_complete() {
+    CompilationUnit unit =
+        parseDirectives("#! /bin/dart\nlibrary l;\nclass A {}");
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_empty() {
+    CompilationUnit unit = parseDirectives("");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseDirectives_mixed() {
+    CompilationUnit unit =
+        parseDirectives("library l; class A {} part 'foo.dart';");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_multiple() {
+    CompilationUnit unit = parseDirectives("library l;\npart 'a.dart';");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(2));
+  }
+
+  void test_parseDirectives_script() {
+    CompilationUnit unit = parseDirectives("#! /bin/dart");
+    expect(unit.scriptTag, isNotNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseDirectives_single() {
+    CompilationUnit unit = parseDirectives("library l;");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(1));
+  }
+
+  void test_parseDirectives_topLevelDeclaration() {
+    CompilationUnit unit = parseDirectives("class A {}");
+    expect(unit.scriptTag, isNull);
+    expect(unit.directives, hasLength(0));
+  }
+
+  void test_parseEnumDeclaration_one() {
+    createParser("enum E {ONE}");
+    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseEnumDeclaration_trailingComma() {
+    createParser("enum E {ONE,}");
+    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(1));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseEnumDeclaration_two() {
+    createParser("enum E {ONE, TWO}");
+    EnumDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expect(declaration.documentationComment, isNull);
+    expect(declaration.enumKeyword, isNotNull);
+    expect(declaration.leftBracket, isNotNull);
+    expect(declaration.name, isNotNull);
+    expect(declaration.constants, hasLength(2));
+    expect(declaration.rightBracket, isNotNull);
+  }
+
+  void test_parseExportDirective_configuration_multiple() {
+    createParser("export 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.configurations, hasLength(2));
+    expectDottedName(directive.configurations[0].name, ['a']);
+    expectDottedName(directive.configurations[1].name, ['c']);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_configuration_single() {
+    createParser("export 'lib/lib.dart' if (a.b == 'c.dart') '';");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.configurations, hasLength(1));
+    expectDottedName(directive.configurations[0].name, ['a', 'b']);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_hide() {
+    createParser("export 'lib/lib.dart' hide A, B;");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_hide_show() {
+    createParser("export 'lib/lib.dart' hide A show B;");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_noCombinator() {
+    createParser("export 'lib/lib.dart';");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_show() {
+    createParser("export 'lib/lib.dart' show A, B;");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseExportDirective_show_hide() {
+    createParser("export 'lib/lib.dart' show B hide A;");
+    ExportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseFunctionDeclaration_function() {
+    createParser('/// Doc\nT f() {}');
+    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expectCommentText(declaration.documentationComment, '/// Doc');
+    expect((declaration.returnType as TypeName).name.name, 'T');
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseFunctionDeclaration_functionWithTypeParameters() {
+    createParser('/// Doc\nT f<E>() {}');
+    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expectCommentText(declaration.documentationComment, '/// Doc');
+    expect((declaration.returnType as TypeName).name.name, 'T');
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseFunctionDeclaration_functionWithTypeParameters_comment() {
+    enableGenericMethodComments = true;
+    createParser('/// Doc\nT f/*<E>*/() {}');
+    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expectCommentText(declaration.documentationComment, '/// Doc');
+    expect((declaration.returnType as TypeName).name.name, 'T');
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNotNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNull);
+  }
+
+  void test_parseFunctionDeclaration_getter() {
+    createParser('/// Doc\nT get p => 0;');
+    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expectCommentText(declaration.documentationComment, '/// Doc');
+    expect((declaration.returnType as TypeName).name.name, 'T');
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  void test_parseFunctionDeclaration_setter() {
+    createParser('/// Doc\nT set p(v) {}');
+    FunctionDeclaration declaration = parseFullCompilationUnitMember();
+    expect(declaration, isNotNull);
+    assertNoErrors();
+    expectCommentText(declaration.documentationComment, '/// Doc');
+    expect((declaration.returnType as TypeName).name.name, 'T');
+    expect(declaration.name, isNotNull);
+    FunctionExpression expression = declaration.functionExpression;
+    expect(expression, isNotNull);
+    expect(expression.body, isNotNull);
+    expect(expression.typeParameters, isNull);
+    expect(expression.parameters, isNotNull);
+    expect(declaration.propertyKeyword, isNotNull);
+  }
+
+  @failingTest
+  void test_parseGenericTypeAlias_noTypeParameters() {
+    createParser('F = int Function(int);');
+    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    expect(alias, isNotNull);
+    assertNoErrors();
+    expect(alias.name, isNotNull);
+    expect(alias.name.name, 'F');
+    expect(alias.typeParameters, isNull);
+    expect(alias.equals, isNotNull);
+    expect(alias.functionType, isNotNull);
+    expect(alias.semicolon, isNotNull);
+  }
+
+  @failingTest
+  void test_parseGenericTypeAlias_typeParameters() {
+    createParser('F<T> = T Function(T);');
+    GenericTypeAlias alias = parseFullCompilationUnitMember();
+    expect(alias, isNotNull);
+    assertNoErrors();
+    expect(alias.name, isNotNull);
+    expect(alias.name.name, 'F');
+    expect(alias.typeParameters, isNotNull);
+    expect(alias.equals, isNotNull);
+    expect(alias.functionType, isNotNull);
+    expect(alias.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_configuration_multiple() {
+    createParser("import 'lib/lib.dart' if (a) 'b.dart' if (c) 'd.dart';");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.configurations, hasLength(2));
+    expectDottedName(directive.configurations[0].name, ['a']);
+    expectDottedName(directive.configurations[1].name, ['c']);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_configuration_single() {
+    createParser("import 'lib/lib.dart' if (a.b == 'c.dart') '';");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.configurations, hasLength(1));
+    expectDottedName(directive.configurations[0].name, ['a', 'b']);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_deferred() {
+    createParser("import 'lib/lib.dart' deferred as a;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNotNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_hide() {
+    createParser("import 'lib/lib.dart' hide A, B;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_noCombinator() {
+    createParser("import 'lib/lib.dart';");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix() {
+    createParser("import 'lib/lib.dart' as a;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(0));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix_hide_show() {
+    createParser("import 'lib/lib.dart' as a hide A show B;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_prefix_show_hide() {
+    createParser("import 'lib/lib.dart' as a show B hide A;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNotNull);
+    expect(directive.prefix, isNotNull);
+    expect(directive.combinators, hasLength(2));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseImportDirective_show() {
+    createParser("import 'lib/lib.dart' show A, B;");
+    ImportDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.keyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.deferredKeyword, isNull);
+    expect(directive.asKeyword, isNull);
+    expect(directive.prefix, isNull);
+    expect(directive.combinators, hasLength(1));
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseLibraryDirective() {
+    createParser('library l;');
+    LibraryDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.libraryKeyword, isNotNull);
+    expect(directive.name, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parsePartDirective() {
+    createParser("part 'lib/lib.dart';");
+    PartDirective directive = parseFullDirective();
+    expect(directive, isNotNull);
+    assertNoErrors();
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parsePartOfDirective_name() {
+    enableUriInPartOf = true;
+    createParser("part of l;");
+    PartOfDirective directive = parseFullDirective();
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.ofKeyword, isNotNull);
+    expect(directive.libraryName, isNotNull);
+    expect(directive.uri, isNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parsePartOfDirective_uri() {
+    enableUriInPartOf = true;
+    createParser("part of 'lib.dart';");
+    PartOfDirective directive = parseFullDirective();
+    expect(directive.partKeyword, isNotNull);
+    expect(directive.ofKeyword, isNotNull);
+    expect(directive.libraryName, isNull);
+    expect(directive.uri, isNotNull);
+    expect(directive.semicolon, isNotNull);
+  }
+
+  void test_parseTypeAlias_function_noParameters() {
+    createParser('typedef bool F();');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_noReturnType() {
+    createParser('typedef F();');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_parameterizedReturnType() {
+    createParser('typedef A<B> F();');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_parameters() {
+    createParser('typedef bool F(Object value);');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_function_typeParameters() {
+    createParser('typedef bool F<E>();');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+  }
+
+  void test_parseTypeAlias_function_voidReturnType() {
+    createParser('typedef void F();');
+    FunctionTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.parameters, isNotNull);
+    expect(typeAlias.returnType, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_noParameters() {
+    createParser('typedef F = bool Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_noReturnType() {
+    createParser('typedef F = Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_parameterizedReturnType() {
+    createParser('typedef F = A<B> Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_parameters() {
+    createParser('typedef F = bool Function(Object value);');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters() {
+    createParser('typedef F = bool Function<E>();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNotNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters_noParameters() {
+    createParser('typedef F<T> = bool Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters_noReturnType() {
+    createParser('typedef F<T> = Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void
+      test_parseTypeAlias_genericFunction_typeParameters_parameterizedReturnType() {
+    createParser('typedef F<T> = A<B> Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters_parameters() {
+    createParser('typedef F<T> = bool Function(Object value);');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters_typeParameters() {
+    createParser('typedef F<T> = bool Function<E>();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNotNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_typeParameters_voidReturnType() {
+    createParser('typedef F<T> = void Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNotNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
+  }
+
+  void test_parseTypeAlias_genericFunction_voidReturnType() {
+    createParser('typedef F = void Function();');
+    GenericTypeAlias typeAlias = parseFullCompilationUnitMember();
+    expect(typeAlias, isNotNull);
+    assertNoErrors();
+    expect(typeAlias.typedefKeyword, isNotNull);
+    expect(typeAlias.name, isNotNull);
+    expect(typeAlias.typeParameters, isNull);
+    expect(typeAlias.semicolon, isNotNull);
+    GenericFunctionType functionType = typeAlias.functionType;
+    expect(functionType, isNotNull);
+    expect(functionType.parameters, isNotNull);
+    expect(functionType.returnType, isNotNull);
+    expect(functionType.typeParameters, isNull);
   }
 }
diff --git a/pkg/analyzer/test/src/command_line/arguments_test.dart b/pkg/analyzer/test/src/command_line/arguments_test.dart
index 7e1bb68..fb12cd8 100644
--- a/pkg/analyzer/test/src/command_line/arguments_test.dart
+++ b/pkg/analyzer/test/src/command_line/arguments_test.dart
@@ -61,7 +61,6 @@
     expect(defaultOptions.strongMode, true);
     expect(defaultOptions.implicitCasts, false);
     expect(defaultOptions.implicitDynamic, false);
-    expect(options.pubSummaryManager, isNull);
   }
 
   void test_createContextBuilderOptions_none() {
@@ -83,7 +82,6 @@
     expect(defaultOptions.strongMode, false);
     expect(defaultOptions.implicitCasts, true);
     expect(defaultOptions.implicitDynamic, true);
-    expect(options.pubSummaryManager, isNull);
   }
 
   void test_createDartSdkManager_noPath_noSummaries() {
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index 7fcf61d..7bd4dce 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -2213,6 +2213,28 @@
     expect(result.errors, hasLength(0));
   }
 
+  test_results_skipNotAffected() async {
+    var a = _p('/test/lib/a.dart');
+    var b = _p('/test/lib/b.dart');
+    provider.newFile(a, 'class A {}');
+    provider.newFile(b, 'class B {}');
+
+    driver.addFile(a);
+    driver.addFile(b);
+    await scheduler.waitForIdle();
+
+    expect(allResults, hasLength(2));
+    allResults.clear();
+
+    // Update a.dart and notify.
+    provider.updateFile(a, 'class A2 {}');
+    driver.changeFile(a);
+
+    // Only result for a.dart should be produced, b.dart is not affected.
+    await scheduler.waitForIdle();
+    expect(allResults, hasLength(1));
+  }
+
   test_results_status() async {
     addTestFile('int f() => 42;');
     await scheduler.waitForIdle();
diff --git a/pkg/analyzer/test/src/summary/prelinker_test.dart b/pkg/analyzer/test/src/summary/prelinker_test.dart
index 7d59560..1e58a0e 100644
--- a/pkg/analyzer/test/src/summary/prelinker_test.dart
+++ b/pkg/analyzer/test/src/summary/prelinker_test.dart
@@ -4,8 +4,6 @@
 
 library analyzer.test.src.summary.prelinker_test;
 
-import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/summary/format.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/prelink.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -36,24 +34,16 @@
   void serializeLibraryText(String text, {bool allowErrors: false}) {
     super.serializeLibraryText(text, allowErrors: allowErrors);
 
-    UnlinkedUnit getPart(String relativeUriStr) {
-      Uri relativeUri;
-      try {
-        relativeUri = Uri.parse(relativeUriStr);
-      } on FormatException {
-        return new UnlinkedUnitBuilder();
-      }
-
-      String absoluteUri =
-          resolveRelativeUri(linkerInputs.testDartUri, relativeUri).toString();
+    UnlinkedUnit getPart(String absoluteUri) {
       return linkerInputs.getUnit(absoluteUri);
     }
 
-    UnlinkedPublicNamespace getImport(String relativeUri) {
-      return getPart(relativeUri)?.publicNamespace;
+    UnlinkedPublicNamespace getImport(String absoluteUri) {
+      return getPart(absoluteUri)?.publicNamespace;
     }
 
     linked = new LinkedLibrary.fromBuffer(prelink(
+        linkerInputs.testDartUri.toString(),
         linkerInputs.unlinkedDefiningUnit,
         getPart,
         getImport,
diff --git a/pkg/analyzer/test/src/summary/pub_summary_test.dart b/pkg/analyzer/test/src/summary/pub_summary_test.dart
deleted file mode 100644
index 62d9145..0000000
--- a/pkg/analyzer/test/src/summary/pub_summary_test.dart
+++ /dev/null
@@ -1,1385 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/source/package_map_resolver.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/summary/format.dart';
-import 'package:analyzer/src/summary/idl.dart';
-import 'package:analyzer/src/summary/pub_summary.dart';
-import 'package:analyzer/src/summary/summarize_elements.dart';
-import 'package:path/path.dart' as pathos;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../context/abstract_context.dart';
-import '../context/mock_sdk.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(PubSummaryManagerTest);
-  });
-}
-
-@reflectiveTest
-class PubSummaryManagerTest extends AbstractContextTest {
-  /**
-   * The path to the root of the pubcache directory used in these tests. The
-   * path has not been converted to the current platform, and is therefore only
-   * appropriate for composing paths that will later be converted.
-   */
-  static const String CACHE = '/home/.pub-cache/hosted/pub.dartlang.org';
-
-  PubSummaryManager manager;
-
-  Folder getFolder(String path) =>
-      resourceProvider.getFolder(resourceProvider.convertPath(path));
-
-  File newFile(String path, String content) {
-    //, [int stamp]) {
-    return resourceProvider.newFile(
-        resourceProvider.convertPath(path), content);
-  }
-
-  Folder newFolder(String path) =>
-      resourceProvider.newFolder(resourceProvider.convertPath(path));
-
-  void setUp() {
-    super.setUp();
-    _createManager();
-  }
-
-  test_computeUnlinkedForFolder() async {
-    // Create package files.
-    newFile(
-        '/flutter/aaa/lib/a.dart',
-        '''
-class A {}
-''');
-    newFile(
-        '/flutter/bbb/lib/b.dart',
-        '''
-class B {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('/flutter/aaa/lib');
-    Folder libFolderB = newFolder('/flutter/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    await manager.computeUnlinkedForFolder('aaa', libFolderA);
-    await manager.computeUnlinkedForFolder('bbb', libFolderB);
-
-    // The files must be created.
-    _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-  }
-
-  test_getLinkedBundles_cached() async {
-    String pathA1 = '$CACHE/aaa-1.0.0';
-    String pathA2 = '$CACHE/aaa-2.0.0';
-    newFile(
-        '$pathA1/lib/a.dart',
-        '''
-class A {}
-int a;
-''');
-    newFile(
-        '$pathA2/lib/a.dart',
-        '''
-class A2 {}
-int a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:aaa/a.dart';
-A b;
-''');
-    Folder folderA1 = getFolder(pathA1);
-    Folder folderA2 = getFolder(pathA2);
-    Folder folderB = getFolder('$CACHE/bbb');
-
-    // Configure packages resolution.
-    Folder libFolderA1 = newFolder('$pathA1/lib');
-    Folder libFolderA2 = newFolder('$pathA2/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA1],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Session 1.
-    // Create linked bundles and store them in files.
-    String linkedHashA;
-    String linkedHashB;
-    {
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get linked bundles.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(2));
-
-      // Verify that files with linked bundles were created.
-      LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa');
-      LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb');
-      linkedHashA = packageA.linkedHash;
-      linkedHashB = packageB.linkedHash;
-      _assertFileExists(folderA1, 'linked_spec_$linkedHashA.ds');
-      _assertFileExists(folderB, 'linked_spec_$linkedHashB.ds');
-    }
-
-    // Session 2.
-    // Recreate manager and ask again.
-    {
-      _createManager();
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(2));
-
-      // Verify that linked packages have the same hashes, so they must
-      // be have been read from the previously created files.
-      LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa');
-      LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb');
-      expect(packageA.linkedHash, linkedHashA);
-      expect(packageB.linkedHash, linkedHashB);
-    }
-
-    // Session 2 with different 'aaa' version.
-    // Different linked bundles.
-    {
-      context.sourceFactory = new SourceFactory(<UriResolver>[
-        sdkResolver,
-        resourceResolver,
-        new PackageMapUriResolver(resourceProvider, {
-          'aaa': [libFolderA2],
-          'bbb': [libFolderB],
-        })
-      ]);
-
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get linked bundles.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(2));
-
-      // Verify that new files with linked bundles were created.
-      LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa');
-      LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb');
-      expect(packageA.linkedHash, isNot(linkedHashA));
-      expect(packageB.linkedHash, isNot(linkedHashB));
-      _assertFileExists(folderA2, 'linked_spec_${packageA.linkedHash}.ds');
-      _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds');
-    }
-  }
-
-  test_getLinkedBundles_cached_declaredVariables_export() async {
-    await _testImpl_getLinkedBundles_cached_declaredVariables('export');
-  }
-
-  test_getLinkedBundles_cached_declaredVariables_import() async {
-    await _testImpl_getLinkedBundles_cached_declaredVariables('import');
-  }
-
-  test_getLinkedBundles_cached_differentSdk() async {
-    String pathA = '$CACHE/aaa';
-    newFile(
-        '$pathA/lib/a.dart',
-        '''
-class A {}
-int a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:aaa/a.dart';
-A b;
-''');
-    Folder folderA = getFolder(pathA);
-    Folder folderB = getFolder('$CACHE/bbb');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$pathA/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Session 1.
-    // Create linked bundles and store them in files.
-    String linkedHashA;
-    String linkedHashB;
-    {
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get linked bundles.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(2));
-
-      // Verify that files with linked bundles were created.
-      LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa');
-      LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb');
-      linkedHashA = packageA.linkedHash;
-      linkedHashB = packageB.linkedHash;
-      _assertFileExists(folderA, 'linked_spec_$linkedHashA.ds');
-      _assertFileExists(folderB, 'linked_spec_$linkedHashB.ds');
-    }
-
-    // Session 2.
-    // Use DartSdk with a different API signature.
-    // Different linked bundles should be created.
-    {
-      MockSdk sdk = new MockSdk(resourceProvider: resourceProvider);
-      sdk.updateUriFile('dart:math', (String content) {
-        return content + '  class NewMathClass {}';
-      });
-      context.sourceFactory = new SourceFactory(<UriResolver>[
-        new DartUriResolver(sdk),
-        resourceResolver,
-        new PackageMapUriResolver(resourceProvider, {
-          'aaa': [libFolderA],
-          'bbb': [libFolderB],
-        })
-      ]);
-
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get linked bundles.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(2));
-
-      // Verify that new files with linked bundles were created.
-      LinkedPubPackage packageA = _getLinkedPackage(linkedPackages, 'aaa');
-      LinkedPubPackage packageB = _getLinkedPackage(linkedPackages, 'bbb');
-      expect(packageA.linkedHash, isNot(linkedHashA));
-      expect(packageB.linkedHash, isNot(linkedHashB));
-      _assertFileExists(folderA, 'linked_spec_${packageA.linkedHash}.ds');
-      _assertFileExists(folderB, 'linked_spec_${packageB.linkedHash}.ds');
-    }
-  }
-
-  test_getLinkedBundles_cached_inconsistent_majorVersion() async {
-    String pathA = '$CACHE/aaa';
-    newFile(
-        '$pathA/lib/a.dart',
-        '''
-class A {}
-int a;
-''');
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$pathA/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-      })
-    ]);
-
-    // Session 1.
-    // Create the linked bundle and cache it in a file.
-    {
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get the linked bundle.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(1));
-    }
-
-    // Session 2.
-    // Recreate manager with a different major version.
-    // It cannot use the previously cache linked bundle.
-    // The reason is that we cannot use the cached unlinked bundle.
-    {
-      _createManager(majorVersion: 12345);
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, isEmpty);
-    }
-  }
-
-  test_getLinkedBundles_hasCycle() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b.dart';
-class A {}
-int a1;
-B a2;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:ccc/c.dart';
-class B {}
-C b;
-''');
-    newFile(
-        '$CACHE/ccc/lib/c.dart',
-        '''
-import 'package:aaa/a.dart';
-import 'package:ddd/d.dart';
-class C {}
-A c1;
-D c2;
-''');
-    newFile(
-        '$CACHE/ddd/lib/d.dart',
-        '''
-class D {}
-String d;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    Folder libFolderC = newFolder('$CACHE/ccc/lib');
-    Folder libFolderD = newFolder('$CACHE/ddd/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-        'ccc': [libFolderC],
-        'ddd': [libFolderD],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Now we should be able to get linked bundles.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(4));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      expect(linkedPackage.linked.linkedLibraryUris, ['package:aaa/a.dart']);
-      _assertHasLinkedVariable(linkedPackage, 'a1', 'int',
-          expectedTypeNameUri: 'dart:core');
-      _assertHasLinkedVariable(linkedPackage, 'a2', 'B',
-          expectedTypeNameUri: 'package:bbb/b.dart');
-    }
-
-    // package:bbb
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
-      expect(linkedPackage.linked.linkedLibraryUris, ['package:bbb/b.dart']);
-      _assertHasLinkedVariable(linkedPackage, 'b', 'C',
-          expectedTypeNameUri: 'package:ccc/c.dart');
-    }
-
-    // package:ccc
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
-      expect(linkedPackage.linked.linkedLibraryUris, ['package:ccc/c.dart']);
-      _assertHasLinkedVariable(linkedPackage, 'c1', 'A',
-          expectedTypeNameUri: 'package:aaa/a.dart');
-      _assertHasLinkedVariable(linkedPackage, 'c2', 'D',
-          expectedTypeNameUri: 'package:ddd/d.dart');
-    }
-
-    // package:ddd
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'ddd');
-      expect(linkedPackage.linked.linkedLibraryUris, ['package:ddd/d.dart']);
-      _assertHasLinkedVariable(linkedPackage, 'd', 'String',
-          expectedTypeNameUri: 'dart:core');
-    }
-  }
-
-  test_getLinkedBundles_missingBundle_listed() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b.dart';
-B a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-class B {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Ensure unlinked bundles for 'aaa'.
-    await manager.computeUnlinkedForFolder('aaa', libFolderA);
-
-    // Try to link.
-    // Neither 'aaa' nor 'bbb' are linked.
-    // 'bbb' does not have the unlinked bundle.
-    // 'aaa' is not linked because it references 'bbb', which is listed.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(0));
-  }
-
-  test_getLinkedBundles_missingBundle_listed_chained() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b.dart';
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:ccc/c.dart';
-''');
-    newFile(
-        '$CACHE/ccc/lib/c.dart',
-        '''
-class C {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    Folder libFolderC = newFolder('$CACHE/ccc/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-        'ccc': [libFolderC],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    await manager.computeUnlinkedForFolder('aaa', libFolderA);
-    await manager.computeUnlinkedForFolder('bbb', libFolderB);
-
-    // Try to link.
-    // Neither 'aaa' nor 'bbb' are linked.
-    // 'ccc' is listed in the package map, but its unlinked bundle is not ready.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(0));
-  }
-
-  test_getLinkedBundles_missingBundle_listed_partial() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-int a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:ccc/c.dart';
-C b;
-''');
-    newFile(
-        '$CACHE/ccc/lib/c.dart',
-        '''
-class C {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    Folder libFolderC = newFolder('$CACHE/ccc/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-        'ccc': [libFolderC],
-      })
-    ]);
-
-    // Ensure unlinked bundles for 'aaa'.
-    await manager.computeUnlinkedForFolder('aaa', libFolderA);
-    await manager.computeUnlinkedForFolder('bbb', libFolderB);
-
-    // Try to link.
-    // Only 'aaa' is linked.
-    // The package 'bbb' references the listed 'ccc' without unlinked bundle.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(1));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'int',
-          expectedTypeNameUri: 'dart:core');
-    }
-  }
-
-  test_getLinkedBundles_missingBundle_notListed() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-int a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:ccc/c.dart';
-int b1;
-C b2;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Try to link.
-    // Both 'aaa' and 'bbb' are linked.
-    // The package 'ccc' is not listed, so it cannot be resolved anyway,
-    // with summaries or without them.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(2));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'int',
-          expectedTypeNameUri: 'dart:core');
-    }
-
-    // package:bbb
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
-      _assertHasLinkedVariable(linkedPackage, 'b1', 'int',
-          expectedTypeNameUri: 'dart:core');
-      _assertHasLinkedVariable(linkedPackage, 'b2', 'C',
-          expectedToBeResolved: false);
-    }
-  }
-
-  test_getLinkedBundles_missingLibrary() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b2.dart';
-int a1;
-B2 a2;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-class B {}
-int b = 42;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Try to link.
-    // Both 'aaa' and 'bbb' are linked.
-    // The name 'B2' in 'a.dart' is not resolved.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(2));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a1', 'int',
-          expectedTypeNameUri: 'dart:core');
-      _assertHasLinkedVariable(linkedPackage, 'a2', 'B2',
-          expectedToBeResolved: false);
-    }
-
-    // package:bbb
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
-      _assertHasLinkedVariable(linkedPackage, 'b', 'int',
-          expectedTypeNameUri: 'dart:core');
-    }
-  }
-
-  test_getLinkedBundles_missingLibrary_hasCycle() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b.dart';
-B a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:aaa/a.dart';
-import 'package:ccc/c2.dart';
-class B {}
-int b1;
-C2 b2;
-''');
-    newFile(
-        '$CACHE/ccc/lib/c.dart',
-        '''
-class C {}
-int c;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    Folder libFolderC = newFolder('$CACHE/ccc/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-        'ccc': [libFolderC],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Try to link.
-    // All bundles 'aaa' and 'bbb' and 'ccc' are linked.
-    // The name 'C2' in 'b.dart' is not resolved.
-    // We have the corresponding unlinked bundle, and it is full, so if it does
-    // not have the library 'package:ccc/c2.dart', this means that this library
-    // does not exist in 'ccc' at all.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(3));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'B',
-          expectedTypeNameUri: 'package:bbb/b.dart');
-    }
-
-    // package:bbb
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
-      _assertHasLinkedVariable(linkedPackage, 'b1', 'int',
-          expectedTypeNameUri: 'dart:core');
-      _assertHasLinkedVariable(linkedPackage, 'b2', 'C2',
-          expectedToBeResolved: false);
-    }
-
-    // package:ccc
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'ccc');
-      _assertHasLinkedVariable(linkedPackage, 'c', 'int',
-          expectedTypeNameUri: 'dart:core');
-    }
-  }
-
-  test_getLinkedBundles_noCycle() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-class A {}
-int a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-import 'package:aaa/a.dart';
-A b;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Now we should be able to get linked bundles.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(2));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'int',
-          expectedTypeNameUri: 'dart:core');
-    }
-
-    // package:bbb
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'bbb');
-      _assertHasLinkedVariable(linkedPackage, 'b', 'A',
-          expectedTypeNameUri: 'package:aaa/a.dart');
-    }
-  }
-
-  test_getLinkedBundles_noCycle_relativeUri() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'src/a2.dart';
-A a;
-''');
-    newFile(
-        '$CACHE/aaa/lib/src/a2.dart',
-        '''
-class A {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Link.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(1));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'A',
-          expectedTypeNameUri: 'src/a2.dart');
-    }
-  }
-
-  test_getLinkedBundles_noCycle_withExport() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'package:bbb/b.dart';
-C a;
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-export 'package:ccc/c.dart';
-''');
-    newFile(
-        '$CACHE/ccc/lib/c.dart',
-        '''
-class C {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    Folder libFolderC = newFolder('$CACHE/ccc/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-        'ccc': [libFolderC],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Now we should be able to get linked bundles.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(3));
-
-    // package:aaa
-    {
-      LinkedPubPackage linkedPackage = linkedPackages
-          .singleWhere((linkedPackage) => linkedPackage.package.name == 'aaa');
-      _assertHasLinkedVariable(linkedPackage, 'a', 'C',
-          expectedTypeNameUri: 'package:ccc/c.dart');
-    }
-  }
-
-  test_getLinkedBundles_wrongScheme() async {
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-import 'xxx:yyy/zzz.dart';
-int a1;
-Z a2;
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-      })
-    ]);
-
-    // Ensure unlinked bundles.
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-
-    // Try to link.
-    // The package 'aaa' is not linked.
-    // We don't know how to handle the URI scheme 'xxx'.
-    List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-    expect(linkedPackages, hasLength(0));
-  }
-
-  test_getPackageName() {
-    String getPackageName(String uriStr) {
-      return PubSummaryManager.getPackageName(uriStr);
-    }
-
-    expect(getPackageName('package:foo/bar.dart'), 'foo');
-    expect(getPackageName('package:foo/bar/baz.dart'), 'foo');
-    expect(getPackageName('wrong:foo/bar.dart'), isNull);
-    expect(getPackageName('package:foo'), isNull);
-  }
-
-  test_getUnlinkedBundles() async {
-    // Create package files.
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-class A {}
-''');
-    newFile(
-        '$CACHE/aaa/lib/src/a2.dart',
-        '''
-class A2 {}
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-class B {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = newFolder('$CACHE/aaa/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // No unlinked bundles yet.
-    {
-      Map<PubPackage, PackageBundle> bundles =
-          manager.getUnlinkedBundles(context);
-      expect(bundles, isEmpty);
-    }
-
-    // The requested unlinked bundles must be available after the wait.
-    await manager.onUnlinkedComplete;
-    {
-      Map<PubPackage, PackageBundle> bundles =
-          manager.getUnlinkedBundles(context);
-      expect(bundles, hasLength(2));
-      {
-        PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa');
-        expect(bundle.linkedLibraryUris, isEmpty);
-        expect(bundle.unlinkedUnitUris,
-            ['package:aaa/a.dart', 'package:aaa/src/a2.dart']);
-        expect(bundle.unlinkedUnits, hasLength(2));
-        expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['A']);
-        expect(bundle.unlinkedUnits[1].classes.map((c) => c.name), ['A2']);
-      }
-      {
-        PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb');
-        expect(bundle.linkedLibraryUris, isEmpty);
-        expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']);
-        expect(bundle.unlinkedUnits, hasLength(1));
-        expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']);
-      }
-    }
-
-    // The files must be created.
-    _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderA.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-  }
-
-  test_getUnlinkedBundles_inconsistent_majorVersion() async {
-    // Create package files.
-    newFile(
-        '$CACHE/aaa/lib/a.dart',
-        '''
-class A {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolder = newFolder('$CACHE/aaa/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolder],
-      })
-    ]);
-
-    /**
-     * Verify that the [manager] has exactly one cache bundle `aaa`.
-     */
-    void _assertSingleBundle() {
-      Map<PubPackage, PackageBundle> bundles =
-          manager.getUnlinkedBundles(context);
-      expect(bundles, hasLength(1));
-      PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa');
-      expect(bundle.unlinkedUnitUris, ['package:aaa/a.dart']);
-    }
-
-    // Compute the bundle using a non-default major version.
-    _createManager(majorVersion: 12345);
-    manager.getUnlinkedBundles(context);
-    await manager.onUnlinkedComplete;
-    _assertSingleBundle();
-
-    // Recompute when using the default major version.
-    _createManager();
-    expect(manager.getUnlinkedBundles(context), isEmpty);
-
-    // Wait for the bundle to be computed.
-    await manager.onUnlinkedComplete;
-    _assertSingleBundle();
-    _assertFileExists(libFolder.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolder.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-
-    // Can read from the file again.
-    _createManager();
-    _assertSingleBundle();
-  }
-
-  test_getUnlinkedBundles_notPubCache_dontCreate() async {
-    String aaaPath = '/Users/user/projects/aaa';
-    // Create package files.
-    newFile(
-        '$aaaPath/lib/a.dart',
-        '''
-class A {}
-''');
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-class B {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = getFolder('$aaaPath/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // No unlinked bundles initially.
-    {
-      Map<PubPackage, PackageBundle> bundles =
-          manager.getUnlinkedBundles(context);
-      expect(bundles, isEmpty);
-    }
-
-    // Wait for unlinked bundles to be computed.
-    await manager.onUnlinkedComplete;
-    Map<PubPackage, PackageBundle> bundles =
-        manager.getUnlinkedBundles(context);
-    // We have just one bundle - for 'bbb'.
-    expect(bundles, hasLength(1));
-    // We computed the unlinked bundle for 'bbb'.
-    {
-      PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb');
-      expect(bundle.linkedLibraryUris, isEmpty);
-      expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']);
-      expect(bundle.unlinkedUnits, hasLength(1));
-      expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']);
-    }
-
-    // The files must be created.
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-  }
-
-  test_getUnlinkedBundles_notPubCache_useExisting() async {
-    String aaaPath = '/Users/user/projects/aaa';
-    // Create package files.
-    {
-      File file = newFile(
-          '$aaaPath/lib/a.dart',
-          '''
-class A {}
-''');
-      PackageBundleAssembler assembler = new PackageBundleAssembler()
-        ..addUnlinkedUnit(
-            file.createSource(Uri.parse('package:aaa/a.dart')),
-            new UnlinkedUnitBuilder());
-      resourceProvider.newFileWithBytes(
-          resourceProvider
-              .convertPath('$aaaPath/${PubSummaryManager.UNLINKED_SPEC_NAME}'),
-          assembler.assemble().toBuffer());
-    }
-    newFile(
-        '$CACHE/bbb/lib/b.dart',
-        '''
-class B {}
-''');
-
-    // Configure packages resolution.
-    Folder libFolderA = getFolder('$aaaPath/lib');
-    Folder libFolderB = newFolder('$CACHE/bbb/lib');
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-        'bbb': [libFolderB],
-      })
-    ]);
-
-    // Request already available unlinked bundles.
-    {
-      Map<PubPackage, PackageBundle> bundles =
-          manager.getUnlinkedBundles(context);
-      expect(bundles, hasLength(1));
-      // We get the unlinked bundle for 'aaa' because it already exists.
-      {
-        PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa');
-        expect(bundle, isNotNull);
-      }
-    }
-
-    // Wait for unlinked bundles to be computed.
-    await manager.onUnlinkedComplete;
-    Map<PubPackage, PackageBundle> bundles =
-        manager.getUnlinkedBundles(context);
-    expect(bundles, hasLength(2));
-    // We still have the unlinked bundle for 'aaa'.
-    {
-      PackageBundle bundle = _getBundleByPackageName(bundles, 'aaa');
-      expect(bundle, isNotNull);
-    }
-    // We computed the unlinked bundle for 'bbb'.
-    {
-      PackageBundle bundle = _getBundleByPackageName(bundles, 'bbb');
-      expect(bundle.linkedLibraryUris, isEmpty);
-      expect(bundle.unlinkedUnitUris, ['package:bbb/b.dart']);
-      expect(bundle.unlinkedUnits, hasLength(1));
-      expect(bundle.unlinkedUnits[0].classes.map((c) => c.name), ['B']);
-    }
-
-    // The files must be created.
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_NAME);
-    _assertFileExists(libFolderB.parent, PubSummaryManager.UNLINKED_SPEC_NAME);
-  }
-
-  test_getUnlinkedBundles_notPubCache_useExisting_inconsistent() async {
-    String aaaPath = '/Users/user/projects/aaa';
-    // Create package files.
-    newFile(
-        '$aaaPath/lib/a.dart',
-        '''
-class A {}
-''');
-
-    // Compute the bundles.
-    Folder libFolderA = getFolder('$aaaPath/lib');
-    await new PubSummaryManager(resourceProvider, '_.temp')
-        .computeUnlinkedForFolder('aaa', libFolderA);
-
-    // Configure packages resolution.
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-      })
-    ]);
-
-    // Request already available unlinked bundles.
-    expect(manager.getUnlinkedBundles(context), hasLength(1));
-
-    // Update a Dart file.
-    // So, the cached bundle cannot be reused.
-    resourceProvider.updateFile(
-        resourceProvider.convertPath('$aaaPath/lib/a.dart'),
-        '''
-class A2 {}
-''');
-    _createManager();
-    expect(manager.getUnlinkedBundles(context), isEmpty);
-
-    // ...and because it is not in the pub cache, it will not be recomputed.
-    await manager.onUnlinkedComplete;
-    expect(manager.getUnlinkedBundles(context), isEmpty);
-  }
-
-  test_getUnlinkedBundles_nullPackageMap() async {
-    context.sourceFactory =
-        new SourceFactory(<UriResolver>[sdkResolver, resourceResolver]);
-    Map<PubPackage, PackageBundle> bundles =
-        manager.getUnlinkedBundles(context);
-    expect(bundles, isEmpty);
-  }
-
-  test_isPathInPubCache_posix() {
-    expect(
-        PubSummaryManager.isPathInPubCache(pathos.posix,
-            '/home/.pub-cache/hosted/pub.dartlang.org/foo/lib/bar.dart'),
-        isTrue);
-    expect(
-        PubSummaryManager.isPathInPubCache(
-            pathos.posix, '/home/.pub-cache/foo/lib/bar.dart'),
-        isTrue);
-    expect(
-        PubSummaryManager.isPathInPubCache(
-            pathos.posix, '/home/sources/dart/foo/lib/bar.dart'),
-        isFalse);
-  }
-
-  test_isPathInPubCache_windows() {
-    expect(
-        PubSummaryManager.isPathInPubCache(pathos.windows,
-            r'C:\Users\user\Setters\Pub\Cache\hosted\foo\lib\bar.dart'),
-        isTrue);
-    expect(
-        PubSummaryManager.isPathInPubCache(
-            pathos.windows, r'C:\Users\user\Sources\Dart\foo\lib\bar.dart'),
-        isFalse);
-  }
-
-  void _assertFileExists(Folder folder, String fileName) {
-    expect(folder.getChildAssumingFile(fileName).exists, isTrue);
-  }
-
-  void _assertHasLinkedVariable(LinkedPubPackage linkedPackage,
-      String variableName, String expectedTypeName,
-      {bool expectedToBeResolved: true,
-      String expectedTypeNameUri: 'shouldBeSpecifiedIfResolved'}) {
-    PackageBundle unlinked = linkedPackage.unlinked;
-    PackageBundle linked = linkedPackage.linked;
-    expect(unlinked, isNotNull);
-    expect(linked, isNotNull);
-    for (int i = 0; i < unlinked.unlinkedUnitUris.length; i++) {
-      String unlinkedUnitUri = unlinked.unlinkedUnitUris[i];
-      UnlinkedUnit unlinkedUnit = unlinked.unlinkedUnits[i];
-      for (UnlinkedVariable v in unlinkedUnit.variables) {
-        if (v.name == variableName) {
-          int typeNameReference = v.type.reference;
-          expect(unlinkedUnit.references[typeNameReference].name,
-              expectedTypeName);
-          for (int j = 0; j < linked.linkedLibraryUris.length; j++) {
-            String linkedLibraryUri = linked.linkedLibraryUris[j];
-            if (linkedLibraryUri == unlinkedUnitUri) {
-              LinkedLibrary linkedLibrary = linked.linkedLibraries[j];
-              LinkedUnit linkedUnit = linkedLibrary.units.single;
-              int typeNameDependency =
-                  linkedUnit.references[typeNameReference].dependency;
-              if (expectedToBeResolved) {
-                expect(linkedLibrary.dependencies[typeNameDependency].uri,
-                    expectedTypeNameUri);
-              } else {
-                expect(typeNameDependency, isZero);
-              }
-              return;
-            }
-          }
-          fail('Cannot find linked unit for $variableName in $linkedPackage');
-        }
-      }
-    }
-    fail('Cannot find variable $variableName in $linkedPackage');
-  }
-
-  void _createManager(
-      {bool allowLinking: true,
-      int majorVersion: PackageBundleAssembler.currentMajorVersion}) {
-    manager = new PubSummaryManager(resourceProvider, '_.temp',
-        allowLinking: allowLinking, majorVersion: majorVersion);
-  }
-
-  LinkedPubPackage _getLinkedPackage(
-      List<LinkedPubPackage> packages, String name) {
-    return packages
-        .singleWhere((linkedPackage) => linkedPackage.package.name == name);
-  }
-
-  _testImpl_getLinkedBundles_cached_declaredVariables(
-      String importOrExport) async {
-    String pathA = '$CACHE/aaa/lib';
-    newFile('$pathA/foo.dart', 'class A {}');
-    newFile('$pathA/foo_io.dart', 'class A {}');
-    newFile('$pathA/foo_html.dart', 'class A {}');
-    newFile(
-        '$pathA/user.dart',
-        '''
-$importOrExport 'foo.dart'
-  if (dart.library.io) 'foo_io.dart'
-  if (dart.library.html) 'foo_html.dart';
-''');
-    // Configure packages resolution.
-    Folder libFolderA = newFolder(pathA);
-    context.sourceFactory = new SourceFactory(<UriResolver>[
-      sdkResolver,
-      resourceResolver,
-      new PackageMapUriResolver(resourceProvider, {
-        'aaa': [libFolderA],
-      })
-    ]);
-
-    void _assertDependencyInUser(PackageBundle bundle, String shortName) {
-      for (var i = 0; i < bundle.linkedLibraryUris.length; i++) {
-        if (bundle.linkedLibraryUris[i].endsWith('user.dart')) {
-          LinkedLibrary library = bundle.linkedLibraries[i];
-          expect(library.dependencies.map((d) => d.uri),
-              unorderedEquals(['', 'dart:core', shortName]));
-          return;
-        }
-      }
-      fail('Not found user.dart in $bundle');
-    }
-
-    // Session 1.
-    // Create the linked bundle and cache it in a file.
-    {
-      // Ensure unlinked bundles.
-      manager.getUnlinkedBundles(context);
-      await manager.onUnlinkedComplete;
-
-      // Now we should be able to get the linked bundle.
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(1));
-    }
-
-    // Session 2.
-    // Recreate manager and don't allow it to perform new linking.
-    // Set a declared variable, which is not used in the package.
-    // We still can get the cached linked bundle.
-    {
-      context.declaredVariables.define('not.used.variable', 'baz');
-      _createManager(allowLinking: false);
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(1));
-      _assertDependencyInUser(linkedPackages.single.linked, 'foo.dart');
-    }
-
-    // Session 3.
-    // Recreate manager and don't allow it to perform new linking.
-    // Set the value of a referenced declared variable.
-    // So, we cannot use the previously cached linked bundle.
-    {
-      context.declaredVariables.define('dart.library.io', 'does-not-matter');
-      _createManager(allowLinking: false);
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, isEmpty);
-    }
-
-    // Session 4.
-    // Enable new linking, and configure to use 'foo_html.dart'.
-    {
-      context.declaredVariables.define('dart.library.html', 'true');
-      _createManager();
-      List<LinkedPubPackage> linkedPackages = manager.getLinkedBundles(context);
-      expect(linkedPackages, hasLength(1));
-      _assertDependencyInUser(linkedPackages.single.linked, 'foo_html.dart');
-    }
-  }
-
-  static PackageBundle _getBundleByPackageName(
-      Map<PubPackage, PackageBundle> bundles, String name) {
-    PubPackage package =
-        bundles.keys.singleWhere((package) => package.name == name);
-    return bundles[package];
-  }
-}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index b101aa6..6fc2f52 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -889,18 +889,9 @@
       return;
     }
 
-    Source resolveRelativeUri(String relativeUri) {
-      Source resolvedSource =
-          context.sourceFactory.resolveUri(librarySource, relativeUri);
-      if (resolvedSource == null && !allowMissingFiles) {
-        throw new StateError('Could not resolve $relativeUri in the context of '
-            '$librarySource (${librarySource.runtimeType})');
-      }
-      return resolvedSource;
-    }
-
-    UnlinkedUnit getPart(String relativeUri) {
-      return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
+    UnlinkedUnit getPart(String absoluteUri) {
+      Source source = context.sourceFactory.forUri(absoluteUri);
+      return _getUnlinkedUnit(source);
     }
 
     UnlinkedPublicNamespace getImport(String relativeUri) {
@@ -909,10 +900,11 @@
 
     UnlinkedUnit definingUnit = _getUnlinkedUnit(librarySource);
     if (definingUnit != null) {
-      LinkedLibraryBuilder linkedLibrary = prelink(
+      LinkedLibraryBuilder linkedLibrary = prelink(librarySource.uri.toString(),
           definingUnit, getPart, getImport, context.declaredVariables.get);
       linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) {
-        _serializeLibrary(resolveRelativeUri(d.uri));
+        Source source = context.sourceFactory.forUri(d.uri);
+        _serializeLibrary(source);
       });
     }
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index fd40ab4..51b77ed 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -260,6 +260,7 @@
     compareUriReferencedElements(resynthesized, original, desc);
     expect(resynthesized.source, original.source);
     expect(resynthesized.librarySource, original.librarySource);
+    compareLineInfo(resynthesized.lineInfo, original.lineInfo);
     expect(resynthesized.types.length, original.types.length,
         reason: '$desc types');
     for (int i = 0; i < resynthesized.types.length; i++) {
@@ -821,6 +822,11 @@
     compareElements(resynthesized, original, desc);
   }
 
+  void compareLineInfo(LineInfo resynthesized, LineInfo original) {
+    expect(resynthesized.lineCount, original.lineCount);
+    expect(resynthesized.lineStarts, original.lineStarts);
+  }
+
   void compareLocalElementsOfExecutable(ExecutableElement resynthesized,
       ExecutableElement original, String desc) {
     if (original is! Member) {
@@ -4456,6 +4462,20 @@
 ''');
   }
 
+  test_nameConflict_importWithRelativeUri_exportWithAbsolute() {
+    if (resourceProvider.pathContext.separator != '/') {
+      return;
+    }
+
+    addLibrarySource('/a.dart', 'class A {}');
+    addLibrarySource('/b.dart', 'export "/a.dart";');
+    checkLibrary('''
+import 'a.dart';
+import 'b.dart';
+A v = null;
+''');
+  }
+
   test_nested_generic_functions_in_generic_class_with_function_typed_params() {
     checkLibrary('''
 class C<T, U> {
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
index 4105d32..11e7156 100644
--- a/pkg/analyzer/test/src/summary/summarize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
@@ -224,6 +224,9 @@
   }
 
   UnlinkedUnit getUnit(String absoluteUri) {
+    if (absoluteUri == null) {
+      return null;
+    }
     UnlinkedUnit unit = _uriToUnit[absoluteUri] ??
         SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri] ??
         _dependentUnlinkedUnits[absoluteUri];
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index 5f69ff1..001263c 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -216,7 +216,7 @@
     assertUnlinkedConst(annotations[0], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
+      (EntityRef r) => checkTypeRef(r, null, 'a',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -238,16 +238,11 @@
 
   /**
    * Verify that the [dependency]th element of the dependency table represents
-   * a file reachable via the given [absoluteUri] and [relativeUri].
+   * a file reachable via the given [absoluteUri].
    */
-  void checkDependency(int dependency, String absoluteUri, String relativeUri) {
+  void checkDependency(int dependency, String absoluteUri) {
     expect(dependency, new isInstanceOf<int>());
-    if (dependency >= linked.numPrelinkedDependencies) {
-      // Fully-linked dependencies are always absolute URIs.
-      expect(linked.dependencies[dependency].uri, absoluteUri);
-    } else {
-      expect(linked.dependencies[dependency].uri, relativeUri);
-    }
+    expect(linked.dependencies[dependency].uri, absoluteUri);
   }
 
   /**
@@ -284,24 +279,24 @@
    * Verify that the given [typeRef] represents the type `dynamic`.
    */
   void checkDynamicTypeRef(EntityRef typeRef) {
-    checkTypeRef(typeRef, null, null, 'dynamic');
+    checkTypeRef(typeRef, null, 'dynamic');
   }
 
   /**
    * Verify that the given [exportName] represents a reference to an entity
-   * declared in a file reachable via [absoluteUri] and [relativeUri], having
-   * name [expectedName].  [expectedKind] is the kind of object referenced.
-   * [expectedTargetUnit] is the index of the compilation unit in which the
-   * target of the [exportName] is expected to appear; if not specified it is
-   * assumed to be the defining compilation unit.
+   * declared in a file reachable via [absoluteUri], having name [expectedName].
+   * [expectedKind] is the kind of object referenced. [expectedTargetUnit] is
+   * the index of the compilation unit in which the target of the [exportName]
+   * is expected to appear; if not specified it is assumed to be the defining
+   * compilation unit.
    */
   void checkExportName(LinkedExportName exportName, String absoluteUri,
-      String relativeUri, String expectedName, ReferenceKind expectedKind,
+      String expectedName, ReferenceKind expectedKind,
       {int expectedTargetUnit: 0}) {
     expect(exportName, new isInstanceOf<LinkedExportName>());
     // Exported names must come from other libraries.
     expect(exportName.dependency, isNot(0));
-    checkDependency(exportName.dependency, absoluteUri, relativeUri);
+    checkDependency(exportName.dependency, absoluteUri);
     expect(exportName.name, expectedName);
     expect(exportName.kind, expectedKind);
     expect(exportName.unit, expectedTargetUnit);
@@ -339,7 +334,7 @@
    * associated type.  Otherwise, behave as in [checkLinkedTypeSlot].
    */
   void checkInferredTypeSlot(
-      int slotId, String absoluteUri, String relativeUri, String expectedName,
+      int slotId, String absoluteUri, String expectedName,
       {int numTypeArguments: 0,
       ReferenceKind expectedKind: ReferenceKind.classOrEnum,
       int expectedTargetUnit: 0,
@@ -348,7 +343,7 @@
       int numTypeParameters: 0,
       bool onlyInStrongMode: true}) {
     if (strongMode || !onlyInStrongMode) {
-      checkLinkedTypeSlot(slotId, absoluteUri, relativeUri, expectedName,
+      checkLinkedTypeSlot(slotId, absoluteUri, expectedName,
           numTypeArguments: numTypeArguments,
           expectedKind: expectedKind,
           expectedTargetUnit: expectedTargetUnit,
@@ -380,24 +375,24 @@
    * Verify that the given [typeRef] represents the type `dynamic`.
    */
   void checkLinkedDynamicTypeRef(EntityRef typeRef) {
-    checkLinkedTypeRef(typeRef, null, null, 'dynamic');
+    checkLinkedTypeRef(typeRef, null, 'dynamic');
   }
 
   /**
    * Verify that the given [typeRef] represents a reference to a type declared
-   * in a file reachable via [absoluteUri] and [relativeUri], having name
-   * [expectedName].  Verify that the number of type arguments
-   * is equal to [numTypeArguments].  [expectedKind] is the kind of object
-   * referenced.  [linkedSourceUnit] and [unlinkedSourceUnit] refer to the
-   * compilation unit within which the [typeRef] appears; if not specified they
-   * are assumed to refer to the defining compilation unit.
-   * [expectedTargetUnit] is the index of the compilation unit in which the
-   * target of the [typeRef] is expected to appear; if not specified it is
-   * assumed to be the defining compilation unit.  [numTypeParameters] is the
-   * number of type parameters of the thing being referred to.
+   * in a file reachable via [absoluteUri], having name [expectedName].  Verify
+   * that the number of type arguments is equal to [numTypeArguments].
+   * [expectedKind] is the kind of object referenced.  [linkedSourceUnit] and
+   * [unlinkedSourceUnit] refer to the compilation unit within which the
+   * [typeRef] appears; if not specified they are assumed to refer to the
+   * defining compilation unit. [expectedTargetUnit] is the index of the
+   * compilation unit in which the target of the [typeRef] is expected to
+   * appear; if not specified it is assumed to be the defining compilation unit.
+   * [numTypeParameters] is the number of type parameters of the thing being
+   * referred to.
    */
-  void checkLinkedTypeRef(EntityRef typeRef, String absoluteUri,
-      String relativeUri, String expectedName,
+  void checkLinkedTypeRef(
+      EntityRef typeRef, String absoluteUri, String expectedName,
       {int numTypeArguments: 0,
       ReferenceKind expectedKind: ReferenceKind.classOrEnum,
       int expectedTargetUnit: 0,
@@ -410,7 +405,7 @@
     expect(typeRef.paramReference, 0);
     int index = typeRef.reference;
     expect(typeRef.typeArguments, hasLength(numTypeArguments));
-    checkReferenceIndex(index, absoluteUri, relativeUri, expectedName,
+    checkReferenceIndex(index, absoluteUri, expectedName,
         expectedKind: expectedKind,
         expectedTargetUnit: expectedTargetUnit,
         linkedSourceUnit: linkedSourceUnit,
@@ -420,19 +415,18 @@
 
   /**
    * Verify that the given [slotId] represents a reference to a type declared
-   * in a file reachable via [absoluteUri] and [relativeUri], having name
-   * [expectedName].  Verify that the number of type arguments
-   * is equal to [numTypeArguments].  [expectedKind] is the kind of object
-   * referenced.  [linkedSourceUnit] and [unlinkedSourceUnit] refer to the
-   * compilation unit within which the [typeRef] appears; if not specified they
-   * are assumed to refer to the defining compilation unit.
-   * [expectedTargetUnit] is the index of the compilation unit in which the
-   * target of the [typeRef] is expected to appear; if not specified it is
-   * assumed to be the defining compilation unit.  [numTypeParameters] is the
-   * number of type parameters of the thing being referred to.
+   * in a file reachable via [absoluteUri], having name [expectedName].  Verify
+   * that the number of type arguments is equal to [numTypeArguments].
+   * [expectedKind] is the kind of object referenced.  [linkedSourceUnit] and
+   * [unlinkedSourceUnit] refer to the compilation unit within which the
+   * [typeRef] appears; if not specified they are assumed to refer to the
+   * defining compilation unit. [expectedTargetUnit] is the index of the
+   * compilation unit in which the target of the [typeRef] is expected to
+   * appear; if not specified it is assumed to be the defining compilation unit.
+   * [numTypeParameters] is the number of type parameters of the thing being
+   * referred to.
    */
-  void checkLinkedTypeSlot(
-      int slotId, String absoluteUri, String relativeUri, String expectedName,
+  void checkLinkedTypeSlot(int slotId, String absoluteUri, String expectedName,
       {int numTypeArguments: 0,
       ReferenceKind expectedKind: ReferenceKind.classOrEnum,
       int expectedTargetUnit: 0,
@@ -448,7 +442,6 @@
     checkLinkedTypeRef(
         getTypeRefForSlot(slotId, linkedSourceUnit: linkedSourceUnit),
         absoluteUri,
-        relativeUri,
         expectedName,
         numTypeArguments: numTypeArguments,
         expectedKind: expectedKind,
@@ -484,13 +477,13 @@
 
   /**
    * Check the data structures that are reachable from an index in the
-   * references table..  If the reference in question is an explicit
+   * references table.  If the reference in question is an explicit
    * reference, return the [UnlinkedReference] that is used to make the
    * explicit reference.  If the type reference in question is an implicit
    * reference, return `null`.
    */
-  UnlinkedReference checkReferenceIndex(int referenceIndex, String absoluteUri,
-      String relativeUri, String expectedName,
+  UnlinkedReference checkReferenceIndex(
+      int referenceIndex, String absoluteUri, String expectedName,
       {ReferenceKind expectedKind: ReferenceKind.classOrEnum,
       int expectedTargetUnit: 0,
       LinkedUnit linkedSourceUnit,
@@ -525,7 +518,7 @@
     if (absoluteUri == null) {
       expect(referenceResolution.dependency, 0);
     } else {
-      checkDependency(referenceResolution.dependency, absoluteUri, relativeUri);
+      checkDependency(referenceResolution.dependency, absoluteUri);
     }
     if (expectedName == null) {
       expect(name, isEmpty);
@@ -541,20 +534,19 @@
 
   /**
    * Verify that the given [typeRef] represents a reference to a type declared
-   * in a file reachable via [absoluteUri] and [relativeUri], having name
-   * [expectedName].  If [expectedPrefix] is supplied, verify that the type is
-   * reached via the given prefix.  Verify that the number of type arguments
-   * is equal to [numTypeArguments].  [expectedKind] is the kind of
-   * object referenced.  [linkedSourceUnit] and [unlinkedSourceUnit] refer
-   * to the compilation unit within which the [typeRef] appears; if not
-   * specified they are assumed to refer to the defining compilation unit.
-   * [expectedTargetUnit] is the index of the compilation unit in which the
-   * target of the [typeRef] is expected to appear; if not specified it is
-   * assumed to be the defining compilation unit.  [numTypeParameters] is the
-   * number of type parameters of the thing being referred to.
+   * in a file reachable via [absoluteUri], having name [expectedName].
+   * If [expectedPrefix] is supplied, verify that the type is reached via the
+   * given prefix.  Verify that the number of type arguments is equal to
+   * [numTypeArguments].  [expectedKind] is the kind of object referenced.
+   * [linkedSourceUnit] and [unlinkedSourceUnit] refer to the compilation unit
+   * within which the [typeRef] appears; if not specified they are assumed to
+   * refer to the defining compilation unit. [expectedTargetUnit] is the index
+   * of the compilation unit in which the target of the [typeRef] is expected
+   * to appear; if not specified it is assumed to be the defining compilation
+   * unit.  [numTypeParameters] is the number of type parameters of the thing
+   * being referred to.
    */
-  void checkTypeRef(EntityRef typeRef, String absoluteUri, String relativeUri,
-      String expectedName,
+  void checkTypeRef(EntityRef typeRef, String absoluteUri, String expectedName,
       {String expectedPrefix,
       List<_PrefixExpectation> prefixExpectations,
       int numTypeArguments: 0,
@@ -570,7 +562,7 @@
     int index = typeRef.reference;
     expect(typeRef.typeArguments, hasLength(numTypeArguments));
     UnlinkedReference reference = checkReferenceIndex(
-        index, absoluteUri, relativeUri, expectedName,
+        index, absoluteUri, expectedName,
         expectedKind: expectedKind,
         expectedTargetUnit: expectedTargetUnit,
         linkedSourceUnit: linkedSourceUnit,
@@ -585,7 +577,7 @@
       for (_PrefixExpectation expectation in prefixExpectations) {
         expect(reference.prefixReference, isNot(0));
         reference = checkReferenceIndex(reference.prefixReference,
-            expectation.absoluteUri, expectation.relativeUri, expectation.name,
+            expectation.absoluteUri, expectation.name,
             expectedKind: expectation.kind,
             expectedTargetUnit: expectedTargetUnit,
             linkedSourceUnit: linkedSourceUnit,
@@ -607,7 +599,7 @@
       {LinkedUnit linkedSourceUnit, UnlinkedUnit unlinkedSourceUnit}) {
     // When serializing from the element model, unresolved type refs lose their
     // name.
-    checkTypeRef(typeRef, null, null, expectedName,
+    checkTypeRef(typeRef, null, expectedName,
         expectedPrefix: expectedPrefix,
         expectedKind: ReferenceKind.unresolved,
         linkedSourceUnit: linkedSourceUnit,
@@ -618,7 +610,7 @@
    * Verify that the given [typeRef] represents the type `void`.
    */
   void checkVoidTypeRef(EntityRef typeRef) {
-    checkTypeRef(typeRef, null, null, 'void');
+    checkTypeRef(typeRef, null, 'void');
   }
 
   fail_invalid_prefix_dynamic() {
@@ -1009,8 +1001,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(
-        findVariable('a').type, absUri('/lib2.dart'), 'lib2.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib2.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1026,8 +1017,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(
-        findVariable('a').type, absUri('/lib2.dart'), 'lib2.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib2.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1043,8 +1033,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(
-        findVariable('a').type, absUri('/lib2.dart'), 'lib2.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib2.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1060,8 +1049,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(
-        findVariable('a').type, absUri('/lib2.dart'), 'lib2.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib2.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1076,7 +1064,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'lib.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1091,7 +1079,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'lib.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1106,7 +1094,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'lib.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1121,7 +1109,7 @@
 C c;
     ''',
         allowErrors: true);
-    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'lib.dart', 'A');
+    checkTypeRef(findVariable('a').type, absUri('/lib.dart'), 'A');
     checkUnresolvedTypeRef(findVariable('b').type, null, 'B');
     checkUnresolvedTypeRef(findVariable('c').type, null, 'C');
   }
@@ -1183,8 +1171,8 @@
 class F {}
 ''');
     expect(cls.mixins, hasLength(2));
-    checkTypeRef(cls.mixins[0], null, null, 'E');
-    checkTypeRef(cls.mixins[1], null, null, 'F');
+    checkTypeRef(cls.mixins[0], null, 'E');
+    checkTypeRef(cls.mixins[1], null, 'F');
   }
 
   test_class_alias_no_implicit_constructors() {
@@ -1208,7 +1196,7 @@
   test_class_alias_reference_generic() {
     EntityRef typeRef = serializeTypeText('C',
         otherDeclarations: 'class C<D, E> = F with G; class F {} class G {}');
-    checkTypeRef(typeRef, null, null, 'C', numTypeParameters: 2);
+    checkTypeRef(typeRef, null, 'C', numTypeParameters: 2);
   }
 
   test_class_alias_reference_generic_imported() {
@@ -1216,14 +1204,13 @@
         '/lib.dart', 'class C<D, E> = F with G; class F {} class G {}');
     EntityRef typeRef =
         serializeTypeText('C', otherDeclarations: 'import "lib.dart";');
-    checkTypeRef(typeRef, absUri('/lib.dart'), 'lib.dart', 'C',
-        numTypeParameters: 2);
+    checkTypeRef(typeRef, absUri('/lib.dart'), 'C', numTypeParameters: 2);
   }
 
   test_class_alias_supertype() {
     UnlinkedClass cls =
         serializeClassText('class C = D with E; class D {} class E {}');
-    checkTypeRef(cls.supertype, null, null, 'D');
+    checkTypeRef(cls.supertype, null, 'D');
     expect(cls.hasNoSupertype, isFalse);
   }
 
@@ -1372,7 +1359,7 @@
 class D {}
 ''');
     expect(cls.interfaces, hasLength(1));
-    checkTypeRef(cls.interfaces[0], null, null, 'D');
+    checkTypeRef(cls.interfaces[0], null, 'D');
   }
 
   test_class_interface_order() {
@@ -1382,8 +1369,8 @@
 class E {}
 ''');
     expect(cls.interfaces, hasLength(2));
-    checkTypeRef(cls.interfaces[0], null, null, 'D');
-    checkTypeRef(cls.interfaces[1], null, null, 'E');
+    checkTypeRef(cls.interfaces[0], null, 'D');
+    checkTypeRef(cls.interfaces[1], null, 'E');
   }
 
   test_class_mixin() {
@@ -1392,7 +1379,7 @@
 class D {}
 ''');
     expect(cls.mixins, hasLength(1));
-    checkTypeRef(cls.mixins[0], null, null, 'D');
+    checkTypeRef(cls.mixins[0], null, 'D');
   }
 
   test_class_mixin_order() {
@@ -1402,8 +1389,8 @@
 class E {}
 ''');
     expect(cls.mixins, hasLength(2));
-    checkTypeRef(cls.mixins[0], null, null, 'D');
-    checkTypeRef(cls.mixins[1], null, null, 'E');
+    checkTypeRef(cls.mixins[0], null, 'D');
+    checkTypeRef(cls.mixins[1], null, 'E');
   }
 
   test_class_name() {
@@ -1449,15 +1436,14 @@
   test_class_reference_generic() {
     EntityRef typeRef =
         serializeTypeText('C', otherDeclarations: 'class C<D, E> {}');
-    checkTypeRef(typeRef, null, null, 'C', numTypeParameters: 2);
+    checkTypeRef(typeRef, null, 'C', numTypeParameters: 2);
   }
 
   test_class_reference_generic_imported() {
     addNamedSource('/lib.dart', 'class C<D, E> {}');
     EntityRef typeRef =
         serializeTypeText('C', otherDeclarations: 'import "lib.dart";');
-    checkTypeRef(typeRef, absUri('/lib.dart'), 'lib.dart', 'C',
-        numTypeParameters: 2);
+    checkTypeRef(typeRef, absUri('/lib.dart'), 'C', numTypeParameters: 2);
   }
 
   test_class_superclass() {
@@ -1469,7 +1455,7 @@
   test_class_superclass_explicit() {
     UnlinkedClass cls = serializeClassText('class C extends D {} class D {}');
     expect(cls.supertype, isNotNull);
-    checkTypeRef(cls.supertype, null, null, 'D');
+    checkTypeRef(cls.supertype, null, 'D');
     expect(cls.hasNoSupertype, isFalse);
   }
 
@@ -1480,7 +1466,7 @@
       UnlinkedTypeParam typeParameter = cls.typeParameters[0];
       expect(typeParameter.name, 'T');
       expect(typeParameter.bound, isNotNull);
-      checkTypeRef(typeParameter.bound, 'dart:core', 'dart:core', 'List',
+      checkTypeRef(typeParameter.bound, 'dart:core', 'List',
           numTypeParameters: 1);
     }
   }
@@ -1524,8 +1510,7 @@
       expect(getTypeRefForSlot(closure.inferredReturnTypeSlot), isNull);
     } else {
       // Spec mode infers a type for the closure of `() => Bottom`.
-      checkInferredTypeSlot(
-          closure.inferredReturnTypeSlot, null, null, '*bottom*',
+      checkInferredTypeSlot(closure.inferredReturnTypeSlot, null, '*bottom*',
           onlyInStrongMode: false);
     }
   }
@@ -1543,9 +1528,9 @@
     expect(executable.localFunctions, hasLength(1));
     expect(executable.localFunctions[0].returnType, isNull);
     checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot,
-        absUri('/a.dart'), 'a.dart', 'D',
+        absUri('/a.dart'), 'D',
         onlyInStrongMode: false);
-    checkHasDependency('a.dart', fullyLinked: false);
+    checkHasDependency(absUri('/a.dart'), fullyLinked: false);
   }
 
   test_closure_executable_with_return_type_from_closure() {
@@ -1563,15 +1548,15 @@
     expect(executable.localFunctions, hasLength(2));
     EntityRef closureType =
         getTypeRefForSlot(executable.localFunctions[1].inferredReturnTypeSlot);
-    checkLinkedTypeRef(closureType, null, null, '',
+    checkLinkedTypeRef(closureType, null, '',
         expectedKind: ReferenceKind.function);
     int outerClosureIndex =
         definingUnit.references[closureType.reference].containingReference;
-    checkReferenceIndex(outerClosureIndex, null, null, '',
+    checkReferenceIndex(outerClosureIndex, null, '',
         expectedKind: ReferenceKind.function, localIndex: 1);
     int topLevelFunctionIndex =
         definingUnit.references[outerClosureIndex].containingReference;
-    checkReferenceIndex(topLevelFunctionIndex, null, null, 'f',
+    checkReferenceIndex(topLevelFunctionIndex, null, 'f',
         expectedKind: ReferenceKind.topLevelFunction);
     expect(
         definingUnit.references[topLevelFunctionIndex].containingReference, 0);
@@ -1591,7 +1576,7 @@
     expect(executable.localFunctions, hasLength(1));
     expect(executable.localFunctions[0].returnType, isNull);
     checkInferredTypeSlot(executable.localFunctions[0].inferredReturnTypeSlot,
-        absUri('/b.dart'), 'b.dart', 'D',
+        absUri('/b.dart'), 'D',
         onlyInStrongMode: false);
     if (!skipFullyLinkedData) {
       checkHasDependency('b.dart', fullyLinked: true);
@@ -1852,7 +1837,7 @@
           UnlinkedExprOperation.pushReference
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'T',
+          (EntityRef r) => checkTypeRef(r, null, 'T',
                   expectedKind: ReferenceKind.propertyAccessor,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
@@ -1942,7 +1927,7 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.topLevelFunction)
         ]);
   }
@@ -1974,7 +1959,7 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.topLevelFunction)
         ]);
   }
@@ -2014,15 +1999,15 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, null, null, 'named',
+        checkTypeRef(r, null, 'named',
             expectedKind: ReferenceKind.constructor,
             prefixExpectations: [
               new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
                   numTypeParameters: 2)
             ],
             numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2046,17 +2031,15 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, null, null, 'named',
+        checkTypeRef(r, null, 'named',
             expectedKind: ReferenceKind.constructor,
             prefixExpectations: [
               new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                  absoluteUri: absUri('/a.dart'),
-                  relativeUri: 'a.dart',
-                  numTypeParameters: 2)
+                  absoluteUri: absUri('/a.dart'), numTypeParameters: 2)
             ],
             numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2080,18 +2063,16 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, null, null, 'named',
+        checkTypeRef(r, null, 'named',
             expectedKind: ReferenceKind.constructor,
             prefixExpectations: [
               new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                  absoluteUri: absUri('/a.dart'),
-                  relativeUri: 'a.dart',
-                  numTypeParameters: 2),
+                  absoluteUri: absUri('/a.dart'), numTypeParameters: 2),
               new _PrefixExpectation(ReferenceKind.prefix, 'p')
             ],
             numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2110,12 +2091,12 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, null, null, 'C',
+        checkTypeRef(r, null, 'C',
             expectedKind: ReferenceKind.classOrEnum,
             numTypeParameters: 2,
             numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2139,12 +2120,12 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'C',
+        checkTypeRef(r, absUri('/a.dart'), 'C',
             expectedKind: ReferenceKind.classOrEnum,
             numTypeParameters: 2,
             numTypeArguments: 2);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2168,15 +2149,15 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'C',
+        checkTypeRef(r, absUri('/a.dart'), 'C',
             expectedKind: ReferenceKind.classOrEnum,
             numTypeParameters: 2,
             numTypeArguments: 2,
             prefixExpectations: [
               new _PrefixExpectation(ReferenceKind.prefix, 'p')
             ]);
-        checkTypeRef(r.typeArguments[0], 'dart:core', 'dart:core', 'int');
-        checkTypeRef(r.typeArguments[1], 'dart:core', 'dart:core', 'String');
+        checkTypeRef(r.typeArguments[0], 'dart:core', 'int');
+        checkTypeRef(r.typeArguments[1], 'dart:core', 'String');
       }
     ]);
   }
@@ -2194,7 +2175,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.constructor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -2220,11 +2201,11 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.constructor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -2247,11 +2228,11 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.constructor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -2293,8 +2274,8 @@
       'g',
       'f'
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'C', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -2316,7 +2297,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'C',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'C',
           expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
@@ -2339,7 +2320,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'C',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'C',
               expectedKind: ReferenceKind.classOrEnum,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
@@ -2360,7 +2341,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -2380,7 +2361,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.unresolved, 'C')
@@ -2407,11 +2388,11 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -2431,7 +2412,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.unresolved, 'C'),
@@ -2452,8 +2433,8 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'Foo',
-          expectedKind: ReferenceKind.unresolved)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'Foo', expectedKind: ReferenceKind.unresolved)
     ]);
   }
 
@@ -2471,7 +2452,7 @@
       0
     ], referenceValidators: [
       (EntityRef r) {
-        checkTypeRef(r, 'dart:core', 'dart:core', 'identical',
+        checkTypeRef(r, 'dart:core', 'identical',
             expectedKind: ReferenceKind.topLevelFunction);
       }
     ]);
@@ -2487,7 +2468,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -2510,11 +2491,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -2528,7 +2509,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.unresolved,
               unresolvedHasName: true,
               prefixExpectations: [
@@ -2548,7 +2529,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.unresolved,
               unresolvedHasName: true,
               prefixExpectations: [
@@ -2571,13 +2552,13 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.unresolved,
               unresolvedHasName: true,
               prefixExpectations: [
                 new _PrefixExpectation(
                     ReferenceKind.topLevelPropertyAccessor, 'a',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -2595,13 +2576,13 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'length',
+      (EntityRef r) => checkTypeRef(r, null, 'length',
               expectedKind: ReferenceKind.unresolved,
               unresolvedHasName: true,
               prefixExpectations: [
                 new _PrefixExpectation(
                     ReferenceKind.topLevelPropertyAccessor, 'a',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -2666,7 +2647,7 @@
       33,
       3
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int',
+      (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
           expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
@@ -2710,9 +2691,9 @@
       'bbb',
       'ccc'
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int',
+      (EntityRef r) => checkTypeRef(r, 'dart:core', 'int',
           expectedKind: ReferenceKind.classOrEnum),
-      (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'String',
+      (EntityRef r) => checkTypeRef(r, 'dart:core', 'String',
           expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
@@ -2906,8 +2887,8 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'C', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -2919,8 +2900,8 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'C',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'C', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -2932,7 +2913,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'V1',
+      (EntityRef r) => checkTypeRef(r, null, 'V1',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -2953,11 +2934,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'V1',
+      (EntityRef r) => checkTypeRef(r, null, 'V1',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -2970,7 +2951,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'values',
+      (EntityRef r) => checkTypeRef(r, null, 'values',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -2991,11 +2972,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'values',
+      (EntityRef r) => checkTypeRef(r, null, 'values',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -3010,7 +2991,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'F',
+      (EntityRef r) => checkTypeRef(r, null, 'F',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3033,11 +3014,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'F',
+      (EntityRef r) => checkTypeRef(r, null, 'F',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -3057,11 +3038,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'F',
+      (EntityRef r) => checkTypeRef(r, null, 'F',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p'),
               ])
     ]);
@@ -3077,7 +3058,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'b',
+      (EntityRef r) => checkTypeRef(r, null, 'b',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3095,7 +3076,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'x',
+      (EntityRef r) => checkTypeRef(r, null, 'x',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3118,11 +3099,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'x',
+      (EntityRef r) => checkTypeRef(r, null, 'x',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -3142,11 +3123,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'x',
+      (EntityRef r) => checkTypeRef(r, null, 'x',
               expectedKind: ReferenceKind.propertyAccessor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -3162,7 +3143,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
+      (EntityRef r) => checkTypeRef(r, null, 'm',
               expectedKind: ReferenceKind.method,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3185,11 +3166,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
+      (EntityRef r) => checkTypeRef(r, null, 'm',
               expectedKind: ReferenceKind.method,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart')
+                    absoluteUri: absUri('/a.dart'))
               ])
     ]);
   }
@@ -3209,11 +3190,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
+      (EntityRef r) => checkTypeRef(r, null, 'm',
               expectedKind: ReferenceKind.method,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
               ])
     ]);
@@ -3229,7 +3210,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'm',
+      (EntityRef r) => checkTypeRef(r, null, 'm',
               expectedKind: ReferenceKind.method,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3245,7 +3226,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'f',
+      (EntityRef r) => checkTypeRef(r, null, 'f',
           expectedKind: ReferenceKind.topLevelFunction)
     ]);
   }
@@ -3263,7 +3244,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'f',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'f',
           expectedKind: ReferenceKind.topLevelFunction)
     ]);
   }
@@ -3281,7 +3262,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'f',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'f',
               expectedKind: ReferenceKind.topLevelFunction,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.prefix, 'p')
@@ -3297,7 +3278,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'x',
+      (EntityRef r) => checkTypeRef(r, null, 'x',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -3311,7 +3292,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'x',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'x',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -3325,7 +3306,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'x',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'x',
           expectedKind: ReferenceKind.topLevelPropertyAccessor,
           expectedPrefix: 'p')
     ]);
@@ -3339,7 +3320,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
+      (EntityRef r) => checkTypeRef(r, null, 'a',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -3353,7 +3334,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -3368,7 +3349,7 @@
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
       (EntityRef r) {
-        return checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+        return checkTypeRef(r, absUri('/a.dart'), 'a',
             expectedKind: ReferenceKind.topLevelPropertyAccessor,
             expectedPrefix: 'p');
       }
@@ -3401,8 +3382,8 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
-          expectedKind: ReferenceKind.unresolved)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'foo', expectedKind: ReferenceKind.unresolved)
     ]);
   }
 
@@ -3416,7 +3397,7 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -3439,11 +3420,11 @@
     assertUnlinkedConst(variable.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                    absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                    absoluteUri: absUri('/a.dart')),
                 new _PrefixExpectation(ReferenceKind.prefix, 'p'),
               ])
     ]);
@@ -3843,7 +3824,7 @@
         executables: serializeClassText('class C { C(int this.x); final x; }')
             .executables);
     UnlinkedParam parameter = executable.parameters[0];
-    checkTypeRef(parameter.type, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(parameter.type, 'dart:core', 'int');
   }
 
   test_constructor_initializing_formal_function_typed() {
@@ -3860,7 +3841,7 @@
             serializeClassText('class C { C(int this.x()); Function x; }')
                 .executables);
     UnlinkedParam parameter = executable.parameters[0];
-    checkTypeRef(parameter.type, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(parameter.type, 'dart:core', 'int');
   }
 
   test_constructor_initializing_formal_function_typed_implicit_return_type() {
@@ -3914,7 +3895,7 @@
     assertUnlinkedConst(param.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
           expectedKind: ReferenceKind.topLevelFunction)
     ]);
   }
@@ -4082,7 +4063,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
           new _PrefixExpectation(ReferenceKind.classOrEnum, 'D')
@@ -4104,7 +4085,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
           new _PrefixExpectation(ReferenceKind.classOrEnum, 'D',
@@ -4136,11 +4117,14 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
-          new _PrefixExpectation(ReferenceKind.classOrEnum, 'D',
-              absoluteUri: absUri('/foo.dart'), relativeUri: 'foo.dart')
+          new _PrefixExpectation(
+            ReferenceKind.classOrEnum,
+            'D',
+            absoluteUri: absUri('/foo.dart'),
+          )
         ]);
   }
 
@@ -4165,13 +4149,15 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
-          new _PrefixExpectation(ReferenceKind.classOrEnum, 'D',
-              numTypeParameters: 2,
-              absoluteUri: absUri('/foo.dart'),
-              relativeUri: 'foo.dart')
+          new _PrefixExpectation(
+            ReferenceKind.classOrEnum,
+            'D',
+            numTypeParameters: 2,
+            absoluteUri: absUri('/foo.dart'),
+          )
         ],
         numTypeArguments: 2);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[0], 1);
@@ -4199,11 +4185,14 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
-          new _PrefixExpectation(ReferenceKind.classOrEnum, 'D',
-              absoluteUri: absUri('/foo.dart'), relativeUri: 'foo.dart'),
+          new _PrefixExpectation(
+            ReferenceKind.classOrEnum,
+            'D',
+            absoluteUri: absUri('/foo.dart'),
+          ),
           new _PrefixExpectation(ReferenceKind.prefix, 'foo')
         ]);
   }
@@ -4229,13 +4218,15 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'named',
+    checkTypeRef(executable.redirectedConstructor, null, 'named',
         expectedKind: ReferenceKind.constructor,
         prefixExpectations: [
-          new _PrefixExpectation(ReferenceKind.classOrEnum, 'D',
-              numTypeParameters: 2,
-              absoluteUri: absUri('/foo.dart'),
-              relativeUri: 'foo.dart'),
+          new _PrefixExpectation(
+            ReferenceKind.classOrEnum,
+            'D',
+            numTypeParameters: 2,
+            absoluteUri: absUri('/foo.dart'),
+          ),
           new _PrefixExpectation(ReferenceKind.prefix, 'foo')
         ],
         numTypeArguments: 2);
@@ -4258,7 +4249,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'D');
+    checkTypeRef(executable.redirectedConstructor, null, 'D');
   }
 
   test_constructor_redirected_factory_unnamed_generic() {
@@ -4276,7 +4267,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(executable.redirectedConstructor, null, null, 'D',
+    checkTypeRef(executable.redirectedConstructor, null, 'D',
         numTypeParameters: 2, numTypeArguments: 2);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[0], 1);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[1], 2);
@@ -4303,8 +4294,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(
-        executable.redirectedConstructor, absUri('/foo.dart'), 'foo.dart', 'D');
+    checkTypeRef(executable.redirectedConstructor, absUri('/foo.dart'), 'D');
   }
 
   test_constructor_redirected_factory_unnamed_imported_generic() {
@@ -4328,8 +4318,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(
-        executable.redirectedConstructor, absUri('/foo.dart'), 'foo.dart', 'D',
+    checkTypeRef(executable.redirectedConstructor, absUri('/foo.dart'), 'D',
         numTypeParameters: 2, numTypeArguments: 2);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[0], 1);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[1], 2);
@@ -4356,8 +4345,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(
-        executable.redirectedConstructor, absUri('/foo.dart'), 'foo.dart', 'D',
+    checkTypeRef(executable.redirectedConstructor, absUri('/foo.dart'), 'D',
         expectedPrefix: 'foo');
   }
 
@@ -4382,8 +4370,7 @@
     expect(executable.isRedirectedConstructor, isTrue);
     expect(executable.isFactory, isTrue);
     expect(executable.redirectedConstructorName, isEmpty);
-    checkTypeRef(
-        executable.redirectedConstructor, absUri('/foo.dart'), 'foo.dart', 'D',
+    checkTypeRef(executable.redirectedConstructor, absUri('/foo.dart'), 'D',
         numTypeParameters: 2, expectedPrefix: 'foo', numTypeArguments: 2);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[0], 1);
     checkParamTypeRef(executable.redirectedConstructor.typeArguments[1], 2);
@@ -4984,7 +4971,7 @@
     // re-export any names defined in b.dart, because a change to b.dart might
     // cause it to start exporting a name that the main test library *does*
     // use.
-    checkHasDependency('b.dart');
+    checkHasDependency(absUri('/b.dart'));
   }
 
   test_dependencies_export_unused() {
@@ -4994,17 +4981,17 @@
     // re-export any names defined in a.dart, because a change to a.dart might
     // cause it to start exporting a name that the main test library *will*
     // re-export.
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
   }
 
   test_dependencies_import_to_export() {
     addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}');
     addNamedSource('/b.dart', 'library b;');
     serializeLibraryText('import "a.dart"; A a;');
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
     // The main test library depends on b.dart, because names defined in
     // b.dart are exported by a.dart.
-    checkHasDependency('b.dart');
+    checkHasDependency(absUri('/b.dart'));
   }
 
   test_dependencies_import_to_export_in_subdirs_absolute_export() {
@@ -5012,7 +4999,7 @@
         'library a; export "${absUri('/a/b/b.dart')}"; class A {}');
     addNamedSource('/a/b/b.dart', 'library b;');
     serializeLibraryText('import "a/a.dart"; A a;');
-    checkHasDependency('a/a.dart');
+    checkHasDependency(absUri('/a/a.dart'));
     // The main test library depends on b.dart, because names defined in
     // b.dart are exported by a.dart.
     checkHasDependency(absUri('/a/b/b.dart'));
@@ -5032,20 +5019,20 @@
     addNamedSource('/a/a.dart', 'library a; export "b/b.dart"; class A {}');
     addNamedSource('/a/b/b.dart', 'library b;');
     serializeLibraryText('import "a/a.dart"; A a;');
-    checkHasDependency('a/a.dart');
+    checkHasDependency(absUri('/a/a.dart'));
     // The main test library depends on b.dart, because names defined in
     // b.dart are exported by a.dart.
-    checkHasDependency('a/b/b.dart');
+    checkHasDependency(absUri('/a/b/b.dart'));
   }
 
   test_dependencies_import_to_export_loop() {
     addNamedSource('/a.dart', 'library a; export "b.dart"; class A {}');
     addNamedSource('/b.dart', 'library b; export "a.dart";');
     serializeLibraryText('import "a.dart"; A a;');
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
     // Serialization should have been able to walk the transitive export
     // dependencies to b.dart without going into an infinite loop.
-    checkHasDependency('b.dart');
+    checkHasDependency(absUri('/b.dart'));
   }
 
   test_dependencies_import_to_export_transitive_closure() {
@@ -5053,10 +5040,10 @@
     addNamedSource('/b.dart', 'library b; export "c.dart";');
     addNamedSource('/c.dart', 'library c;');
     serializeLibraryText('import "a.dart"; A a;');
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
     // The main test library depends on c.dart, because names defined in
     // c.dart are exported by b.dart and then re-exported by a.dart.
-    checkHasDependency('c.dart');
+    checkHasDependency(absUri('/c.dart'));
   }
 
   test_dependencies_import_to_export_unused() {
@@ -5066,7 +5053,7 @@
     // The main test library depends on b.dart, even though it doesn't use any
     // names defined in b.dart, because a change to b.dart might cause it to
     // start exporting a name that the main test library *does* use.
-    checkHasDependency('b.dart');
+    checkHasDependency(absUri('/b.dart'));
   }
 
   test_dependencies_import_transitive_closure() {
@@ -5074,10 +5061,10 @@
         '/a.dart', 'library a; import "b.dart"; class A extends B {}');
     addNamedSource('/b.dart', 'library b; class B {}');
     serializeLibraryText('import "a.dart"; A a;');
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
     // The main test library doesn't depend on b.dart, because no change to
     // b.dart can possibly affect the serialized element model for it.
-    checkLacksDependency('b.dart');
+    checkLacksDependency(absUri('/b.dart'));
   }
 
   test_dependencies_import_unused() {
@@ -5086,7 +5073,7 @@
     // The main test library depends on a.dart, even though it doesn't use any
     // names defined in a.dart, because a change to a.dart might cause it to
     // start exporting a name that the main test library *does* use.
-    checkHasDependency('a.dart');
+    checkHasDependency(absUri('/a.dart'));
   }
 
   test_dependencies_parts() {
@@ -5095,8 +5082,9 @@
     addNamedSource('/b.dart', 'part of a;');
     addNamedSource('/c.dart', 'part of a;');
     serializeLibraryText('import "a.dart"; A a;');
-    int dep = checkHasDependency('a.dart');
-    checkDependencyParts(linked.dependencies[dep], ['b.dart', 'c.dart']);
+    int dep = checkHasDependency(absUri('/a.dart'));
+    checkDependencyParts(
+        linked.dependencies[dep], [absUri('/b.dart'), absUri('/c.dart')]);
   }
 
   test_dependencies_parts_relative_to_importing_library() {
@@ -5106,9 +5094,9 @@
     addNamedSource('/a/c/e/f.dart', 'part of d;');
     addNamedSource('/a/c/g/h.dart', 'part of d;');
     serializeLibraryText('import "a/b.dart"; D d;');
-    int dep = checkHasDependency('a/c/d.dart');
-    checkDependencyParts(
-        linked.dependencies[dep], ['a/c/e/f.dart', 'a/c/g/h.dart']);
+    int dep = checkHasDependency(absUri('/a/c/d.dart'));
+    checkDependencyParts(linked.dependencies[dep],
+        [absUri('/a/c/e/f.dart'), absUri('/a/c/g/h.dart')]);
   }
 
   test_elements_in_part() {
@@ -5309,7 +5297,7 @@
 
   test_executable_getter_type() {
     UnlinkedExecutable executable = serializeExecutableText('int get f => 1;');
-    checkTypeRef(executable.returnType, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(executable.returnType, 'dart:core', 'int');
     expect(executable.parameters, isEmpty);
   }
 
@@ -5410,7 +5398,7 @@
     {
       UnlinkedVariable e = variables.singleWhere((v) => v.name == 'e');
       _assertVariableVisible(code, e, 'on int catch (', '} // 3');
-      checkTypeRef(e.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(e.type, 'dart:core', 'int');
     }
     {
       UnlinkedVariable st = variables.singleWhere((v) => v.name == 'st');
@@ -5458,7 +5446,7 @@
     {
       UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
       _assertVariableVisible(code, i, 'for', '} // 3');
-      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(i.type, 'dart:core', 'int');
     }
   }
 
@@ -5482,7 +5470,7 @@
     {
       UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
       _assertVariableVisible(code, i, '{ // 1', '} // 4');
-      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(i.type, 'dart:core', 'int');
     }
   }
 
@@ -5505,12 +5493,12 @@
     {
       UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
       _assertVariableVisible(code, i, 'for', '} // 3');
-      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(i.type, 'dart:core', 'int');
     }
     {
       UnlinkedVariable i = variables.singleWhere((v) => v.name == 'j');
       _assertVariableVisible(code, i, 'for', '} // 3');
-      checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(i.type, 'dart:core', 'int');
     }
   }
 
@@ -5574,7 +5562,7 @@
       // f1 - v1
       UnlinkedVariable v1 = variables.singleWhere((v) => v.name == 'v1');
       _assertVariableVisible(code, v1, '{ // 1', '} // 2');
-      checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(v1.type, 'dart:core', 'int');
     }
     // f - f2
     {
@@ -5586,7 +5574,7 @@
       // f - f2 - v1
       UnlinkedVariable v1 = variables2.singleWhere((v) => v.name == 'v1');
       _assertVariableVisible(code, v1, '{ // 3', '} // 6');
-      checkTypeRef(v1.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(v1.type, 'dart:core', 'int');
       // f - f2 - f3
       UnlinkedExecutable f3 = functions2.singleWhere((v) => v.name == 'f3');
       _assertExecutableVisible(code, f3, '{ // 3', '} // 6');
@@ -5597,7 +5585,7 @@
       // f - f3 - v2
       UnlinkedVariable v2 = variables3.singleWhere((v) => v.name == 'v2');
       _assertVariableVisible(code, v2, '{ // 4', '} // 5');
-      checkTypeRef(v2.type, 'dart:core', 'dart:core', 'int');
+      checkTypeRef(v2.type, 'dart:core', 'int');
     }
   }
 
@@ -5813,7 +5801,7 @@
     expect(executable.isGenerator, isFalse);
     expect(executable.isStatic, false);
     expect(executable.parameters, hasLength(1));
-    checkTypeRef(executable.returnType, null, null, 'C');
+    checkTypeRef(executable.returnType, null, 'C');
     expect(executable.typeParameters, isEmpty);
     expect(executable.isExternal, false);
   }
@@ -5864,7 +5852,7 @@
     expect(executable.isFactory, false);
     expect(executable.isStatic, false);
     expect(executable.parameters, hasLength(1));
-    checkTypeRef(executable.returnType, 'dart:core', 'dart:core', 'bool');
+    checkTypeRef(executable.returnType, 'dart:core', 'bool');
     expect(executable.typeParameters, isEmpty);
   }
 
@@ -5929,8 +5917,7 @@
 
   test_executable_param_function_typed_return_type() {
     UnlinkedExecutable executable = serializeExecutableText('f(int g()) {}');
-    checkTypeRef(
-        executable.parameters[0].type, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(executable.parameters[0].type, 'dart:core', 'int');
   }
 
   test_executable_param_function_typed_return_type_implicit() {
@@ -5956,7 +5943,7 @@
     assertUnlinkedConst(param.initializer.bodyExpr, operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+      (EntityRef r) => checkTypeRef(r, null, 'foo',
           expectedKind: ReferenceKind.topLevelFunction)
     ]);
   }
@@ -6105,13 +6092,13 @@
 f(MyFunction myFunction) {}
 ''');
     expect(executable.parameters[0].isFunctionTyped, isFalse);
-    checkTypeRef(executable.parameters[0].type, null, null, 'MyFunction',
+    checkTypeRef(executable.parameters[0].type, null, 'MyFunction',
         expectedKind: ReferenceKind.typedef);
   }
 
   test_executable_return_type() {
     UnlinkedExecutable executable = serializeExecutableText('int f() => 1;');
-    checkTypeRef(executable.returnType, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(executable.returnType, 'dart:core', 'int');
   }
 
   test_executable_return_type_implicit() {
@@ -6169,8 +6156,7 @@
     checkVoidTypeRef(executable.returnType);
     expect(executable.parameters, hasLength(1));
     expect(executable.parameters[0].name, 'value');
-    checkTypeRef(
-        executable.parameters[0].type, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(executable.parameters[0].type, 'dart:core', 'int');
   }
 
   test_executable_static() {
@@ -6232,7 +6218,7 @@
     addNamedSource('/a.dart', 'class C {}');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'C',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'C',
         ReferenceKind.classOrEnum);
   }
 
@@ -6241,7 +6227,7 @@
         '/a.dart', 'class C extends _D with _E {} class _D {} class _E {}');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'C',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'C',
         ReferenceKind.classOrEnum);
   }
 
@@ -6276,14 +6262,14 @@
   test_export_dependency() {
     serializeLibraryText('export "dart:async";');
     expect(unlinkedUnits[0].exports, hasLength(1));
-    checkDependency(linked.exportDependencies[0], 'dart:async', 'dart:async');
+    checkDependency(linked.exportDependencies[0], 'dart:async');
   }
 
   test_export_enum() {
     addNamedSource('/a.dart', 'enum E { v }');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'E',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'E',
         ReferenceKind.classOrEnum);
   }
 
@@ -6292,7 +6278,7 @@
     addNamedSource('/b.dart', 'part of foo; f() {}');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelFunction,
         expectedTargetUnit: 1);
   }
@@ -6301,7 +6287,7 @@
     addNamedSource('/a.dart', 'f() {}');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelFunction);
   }
 
@@ -6309,7 +6295,7 @@
     addNamedSource('/a.dart', 'get f => null');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelPropertyAccessor);
   }
 
@@ -6317,7 +6303,7 @@
     addNamedSource('/a.dart', 'f() {} g() {}');
     serializeLibraryText('export "a.dart" hide g;');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelFunction);
   }
 
@@ -6348,8 +6334,7 @@
     allowMissingFiles = true;
     serializeLibraryText('export "foo.dart";', allowErrors: true);
     expect(unlinkedUnits[0].imports, hasLength(1));
-    checkDependency(
-        linked.exportDependencies[0], absUri('/foo.dart'), 'foo.dart');
+    checkDependency(linked.exportDependencies[0], absUri('/foo.dart'));
   }
 
   test_export_names_excludes_names_from_library() {
@@ -6368,7 +6353,7 @@
     addNamedSource('/a.dart', 'f() {}');
     serializeLibraryText('export "a.dart"; import "dart:core" as f; f.int _x;');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelFunction);
   }
 
@@ -6392,7 +6377,7 @@
     addNamedSource('/a.dart', 'void set f(value) {}');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f=',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f=',
         ReferenceKind.topLevelPropertyAccessor);
   }
 
@@ -6418,7 +6403,7 @@
     addNamedSource('/a.dart', 'var v;');
     serializeLibraryText('export "a.dart"; const v = 0;');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'v=',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'v=',
         ReferenceKind.topLevelPropertyAccessor);
   }
 
@@ -6428,7 +6413,7 @@
     addNamedSource('/a.dart', 'var v;');
     serializeLibraryText('export "a.dart"; final v = 0;');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'v=',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'v=',
         ReferenceKind.topLevelPropertyAccessor);
   }
 
@@ -6436,7 +6421,7 @@
     addNamedSource('/a.dart', 'f() {} g() {}');
     serializeLibraryText('export "a.dart" show f;');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'f',
+    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'f',
         ReferenceKind.topLevelFunction);
   }
 
@@ -6466,8 +6451,8 @@
     addNamedSource('/a.dart', 'typedef F();');
     serializeLibraryText('export "a.dart";');
     expect(linked.exportNames, hasLength(1));
-    checkExportName(linked.exportNames[0], absUri('/a.dart'), 'a.dart', 'F',
-        ReferenceKind.typedef);
+    checkExportName(
+        linked.exportNames[0], absUri('/a.dart'), 'F', ReferenceKind.typedef);
   }
 
   test_export_uri() {
@@ -6507,12 +6492,12 @@
     LinkedExportName getter =
         linked.exportNames.firstWhere((e) => e.name == 'v');
     expect(getter, isNotNull);
-    checkExportName(getter, absUri('/a.dart'), 'a.dart', 'v',
-        ReferenceKind.topLevelPropertyAccessor);
+    checkExportName(
+        getter, absUri('/a.dart'), 'v', ReferenceKind.topLevelPropertyAccessor);
     LinkedExportName setter =
         linked.exportNames.firstWhere((e) => e.name == 'v=');
     expect(setter, isNotNull);
-    checkExportName(setter, absUri('/a.dart'), 'a.dart', 'v=',
+    checkExportName(setter, absUri('/a.dart'), 'v=',
         ReferenceKind.topLevelPropertyAccessor);
   }
 
@@ -6615,7 +6600,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+          (EntityRef r) => checkTypeRef(r, null, 'f',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
@@ -6675,7 +6660,7 @@
           'f'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'b',
+          (EntityRef r) => checkTypeRef(r, null, 'b',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(
@@ -6709,7 +6694,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+          (EntityRef r) => checkTypeRef(r, null, 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -6743,7 +6728,7 @@
           'f'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+          (EntityRef r) => checkTypeRef(r, null, 'C',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -6772,7 +6757,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+          (EntityRef r) => checkTypeRef(r, null, 'f',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -6811,7 +6796,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+          (EntityRef r) => checkTypeRef(r, null, 'f',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
@@ -6864,7 +6849,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+          (EntityRef r) => checkTypeRef(r, null, 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -6896,7 +6881,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+          (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -6929,7 +6914,7 @@
         strings: [],
         referenceValidators: [
           (EntityRef r) {
-            return checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'a',
+            return checkTypeRef(r, absUri('/a.dart'), 'a',
                 expectedKind: ReferenceKind.topLevelPropertyAccessor,
                 expectedPrefix: 'p');
           }
@@ -6968,7 +6953,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'items',
+          (EntityRef r) => checkTypeRef(r, null, 'items',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(
@@ -7020,7 +7005,7 @@
           'f2',
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+          (EntityRef r) => checkTypeRef(r, null, 'C',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7093,9 +7078,9 @@
           'fa2',
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'A',
+          (EntityRef r) => checkTypeRef(r, null, 'A',
               expectedKind: ReferenceKind.classOrEnum),
-          (EntityRef r) => checkTypeRef(r, null, null, 'B',
+          (EntityRef r) => checkTypeRef(r, null, 'B',
               expectedKind: ReferenceKind.classOrEnum),
         ]);
   }
@@ -7142,7 +7127,7 @@
           'm',
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+          (EntityRef r) => checkTypeRef(r, null, 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor),
         ]);
   }
@@ -7174,7 +7159,7 @@
           'items'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+          (EntityRef r) => checkTypeRef(r, null, 'C',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7203,7 +7188,7 @@
           'f'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+          (EntityRef r) => checkTypeRef(r, null, 'C',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7232,7 +7217,7 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.topLevelFunction)
         ]);
   }
@@ -7264,7 +7249,7 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'foo',
+          (EntityRef r) => checkTypeRef(r, null, 'foo',
               expectedKind: ReferenceKind.topLevelFunction)
         ]);
   }
@@ -7423,7 +7408,7 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'x',
+          (EntityRef r) => checkTypeRef(r, null, 'x',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -7556,7 +7541,7 @@
           'm'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C',
+          (EntityRef r) => checkTypeRef(r, null, 'C',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7588,9 +7573,9 @@
           'f'
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'C'),
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int'),
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'String')
+          (EntityRef r) => checkTypeRef(r, null, 'C'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'int'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'String')
         ]);
   }
 
@@ -7627,7 +7612,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+          (EntityRef r) => checkTypeRef(r, null, 'm',
                   expectedKind: ReferenceKind.unresolved,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.unresolved, 'c'),
@@ -7665,11 +7650,11 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+          (EntityRef r) => checkTypeRef(r, null, 'm',
                   expectedKind: ReferenceKind.method,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.classOrEnum, 'C',
-                        absoluteUri: absUri('/a.dart'), relativeUri: 'a.dart'),
+                        absoluteUri: absUri('/a.dart')),
                     new _PrefixExpectation(ReferenceKind.prefix, 'p')
                   ])
         ]);
@@ -7696,9 +7681,9 @@
           0
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'u',
+          (EntityRef r) => checkTypeRef(r, null, 'u',
               expectedKind: ReferenceKind.topLevelPropertyAccessor),
-          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+          (EntityRef r) => checkTypeRef(r, null, 'f',
               expectedKind: ReferenceKind.topLevelFunction)
         ]);
   }
@@ -7722,11 +7707,11 @@
           2
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'f',
+          (EntityRef r) => checkTypeRef(r, null, 'f',
               expectedKind: ReferenceKind.topLevelFunction,
               numTypeParameters: 2),
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'int'),
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'String')
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'int'),
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'String')
         ]);
   }
 
@@ -7792,7 +7777,7 @@
           42
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'num',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7814,7 +7799,7 @@
           42
         ],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, 'dart:core', 'dart:core', 'num',
+          (EntityRef r) => checkTypeRef(r, 'dart:core', 'num',
               expectedKind: ReferenceKind.classOrEnum)
         ]);
   }
@@ -7886,7 +7871,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'm',
+          (EntityRef r) => checkTypeRef(r, null, 'm',
                   expectedKind: ReferenceKind.method,
                   prefixExpectations: [
                     new _PrefixExpectation(ReferenceKind.classOrEnum, 'C')
@@ -7911,8 +7896,7 @@
         'class C extends D { var v; C(int this.v); }'
         ' abstract class D { num get v; }',
         className: 'C');
-    checkInferredTypeSlot(
-        cls.fields[0].inferredTypeSlot, 'dart:core', 'dart:core', 'num');
+    checkInferredTypeSlot(cls.fields[0].inferredTypeSlot, 'dart:core', 'num');
     expect(cls.executables[0].kind, UnlinkedExecutableKind.constructor);
     expect(cls.executables[0].parameters[0].inferredTypeSlot, 0);
   }
@@ -7927,8 +7911,7 @@
         'class C extends D { var v; C(this.v); }'
         ' abstract class D { int get v; }',
         className: 'C');
-    checkInferredTypeSlot(
-        cls.fields[0].inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(cls.fields[0].inferredTypeSlot, 'dart:core', 'int');
     expect(cls.executables[0].kind, UnlinkedExecutableKind.constructor);
     expect(cls.executables[0].parameters[0].inferredTypeSlot, 0);
   }
@@ -7949,7 +7932,7 @@
 
   test_field_inferred_type_nonstatic_implicit_initialized() {
     UnlinkedVariable v = serializeClassText('class C { var v = 0; }').fields[0];
-    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_field_inferred_type_nonstatic_implicit_uninitialized() {
@@ -7957,7 +7940,7 @@
             'class C extends D { var v; } abstract class D { int get v; }',
             className: 'C')
         .fields[0];
-    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_field_inferred_type_static_explicit_initialized() {
@@ -7969,7 +7952,7 @@
   test_field_inferred_type_static_implicit_initialized() {
     UnlinkedVariable v =
         serializeClassText('class C { static var v = 0; }').fields[0];
-    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_field_inferred_type_static_implicit_uninitialized() {
@@ -8021,10 +8004,9 @@
       return;
     }
     serializeLibraryText('final x = 0; String y;');
-    checkLinkedTypeSlot(unlinkedUnits[0].variables[0].inferredTypeSlot,
-        'dart:core', 'dart:core', 'int');
-    checkTypeRef(
-        unlinkedUnits[0].variables[1].type, 'dart:core', 'dart:core', 'String');
+    checkLinkedTypeSlot(
+        unlinkedUnits[0].variables[0].inferredTypeSlot, 'dart:core', 'int');
+    checkTypeRef(unlinkedUnits[0].variables[1].type, 'dart:core', 'String');
     // Even though the definition of y follows the definition of x, the linked
     // type reference for x should use a higher numbered reference than the
     // unlinked type reference for y.
@@ -8095,8 +8077,7 @@
             'class C extends D { get f => null; } abstract class D { int get f; }',
             className: 'C')
         .executables[0];
-    checkInferredTypeSlot(
-        f.inferredReturnTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(f.inferredReturnTypeSlot, 'dart:core', 'int');
   }
 
   test_getter_inferred_type_static_implicit_return() {
@@ -8159,7 +8140,7 @@
     serializeLibraryText('import "dart:async"; Future x;');
     // Second import is the implicit import of dart:core
     expect(unlinkedUnits[0].imports, hasLength(2));
-    checkDependency(linked.importDependencies[0], 'dart:async', 'dart:async');
+    checkDependency(linked.importDependencies[0], 'dart:async');
   }
 
   test_import_explicit() {
@@ -8188,7 +8169,7 @@
     // The implicit import of dart:core is represented in the model.
     serializeLibraryText('');
     expect(unlinkedUnits[0].imports, hasLength(1));
-    checkDependency(linked.importDependencies[0], 'dart:core', 'dart:core');
+    checkDependency(linked.importDependencies[0], 'dart:core');
     expect(unlinkedUnits[0].imports[0].uri, isEmpty);
     if (includeInformative) {
       expect(unlinkedUnits[0].imports[0].uriOffset, 0);
@@ -8206,8 +8187,7 @@
     serializeLibraryText('import "foo.dart";', allowErrors: true);
     // Second import is the implicit import of dart:core
     expect(unlinkedUnits[0].imports, hasLength(2));
-    checkDependency(
-        linked.importDependencies[0], absUri('/foo.dart'), 'foo.dart');
+    checkDependency(linked.importDependencies[0], absUri('/foo.dart'));
   }
 
   test_import_no_combinators() {
@@ -8235,7 +8215,7 @@
     allowMissingFiles = true;
     addNamedSource('/foo.dart', 'part "bar.dart"; class C {}');
     serializeLibraryText('import "foo.dart"; C x;');
-    checkTypeRef(findVariable('x').type, absUri('/foo.dart'), 'foo.dart', 'C');
+    checkTypeRef(findVariable('x').type, absUri('/foo.dart'), 'C');
   }
 
   test_import_of_missing_export() {
@@ -8244,7 +8224,7 @@
     allowMissingFiles = true;
     addNamedSource('/foo.dart', 'export "bar.dart"; class C {}');
     serializeLibraryText('import "foo.dart"; C x;');
-    checkTypeRef(findVariable('x').type, absUri('/foo.dart'), 'foo.dart', 'C');
+    checkTypeRef(findVariable('x').type, absUri('/foo.dart'), 'C');
   }
 
   test_import_offset() {
@@ -8282,7 +8262,7 @@
   test_import_prefix_reference() {
     UnlinkedVariable variable =
         serializeVariableText('import "dart:async" as a; a.Future v;');
-    checkTypeRef(variable.type, 'dart:async', 'dart:async', 'Future',
+    checkTypeRef(variable.type, 'dart:async', 'Future',
         expectedPrefix: 'a', numTypeParameters: 1);
   }
 
@@ -8301,19 +8281,18 @@
 c.Cls cCls;
 D dCls;
 ''');
-    checkTypeRef(findVariable('aCls').type, absUri('/a.dart'), 'a.dart', 'A');
-    checkTypeRef(findVariable('bCls').type, absUri('/b.dart'), 'b.dart', 'Cls',
+    checkTypeRef(findVariable('aCls').type, absUri('/a.dart'), 'A');
+    checkTypeRef(findVariable('bCls').type, absUri('/b.dart'), 'Cls',
         expectedPrefix: 'b');
-    checkTypeRef(findVariable('cCls').type, absUri('/c.dart'), 'c.dart', 'Cls',
+    checkTypeRef(findVariable('cCls').type, absUri('/c.dart'), 'Cls',
         expectedPrefix: 'c');
-    checkTypeRef(findVariable('dCls').type, absUri('/d.dart'), 'd.dart', 'D');
+    checkTypeRef(findVariable('dCls').type, absUri('/d.dart'), 'D');
   }
 
   test_import_reference() {
     UnlinkedVariable variable =
         serializeVariableText('import "dart:async"; Future v;');
-    checkTypeRef(variable.type, 'dart:async', 'dart:async', 'Future',
-        numTypeParameters: 1);
+    checkTypeRef(variable.type, 'dart:async', 'Future', numTypeParameters: 1);
   }
 
   test_import_reference_merged_no_prefix() {
@@ -8326,12 +8305,11 @@
 ''');
     {
       EntityRef typeRef = findVariable('f').type;
-      checkTypeRef(typeRef, 'dart:async', 'dart:async', 'Future',
-          numTypeParameters: 1);
+      checkTypeRef(typeRef, 'dart:async', 'Future', numTypeParameters: 1);
     }
     {
       EntityRef typeRef = findVariable('s').type;
-      checkTypeRef(typeRef, 'dart:async', 'dart:async', 'Stream',
+      checkTypeRef(typeRef, 'dart:async', 'Stream',
           expectedTargetUnit: 1, numTypeParameters: 1);
     }
   }
@@ -8346,12 +8324,12 @@
 ''');
     {
       EntityRef typeRef = findVariable('f').type;
-      checkTypeRef(typeRef, 'dart:async', 'dart:async', 'Future',
+      checkTypeRef(typeRef, 'dart:async', 'Future',
           expectedPrefix: 'a', numTypeParameters: 1);
     }
     {
       EntityRef typeRef = findVariable('s').type;
-      checkTypeRef(typeRef, 'dart:async', 'dart:async', 'Stream',
+      checkTypeRef(typeRef, 'dart:async', 'Stream',
           expectedTargetUnit: 1, expectedPrefix: 'a', numTypeParameters: 1);
     }
   }
@@ -8366,9 +8344,9 @@
 p.A a;
 p.B b;
 ''');
-    checkTypeRef(findVariable('a').type, absUri('/a.dart'), 'a.dart', 'A',
+    checkTypeRef(findVariable('a').type, absUri('/a.dart'), 'A',
         expectedPrefix: 'p');
-    checkTypeRef(findVariable('b').type, absUri('/b.dart'), 'b.dart', 'B',
+    checkTypeRef(findVariable('b').type, absUri('/b.dart'), 'B',
         expectedPrefix: 'p');
   }
 
@@ -8379,10 +8357,9 @@
 class D extends p.C {} // Prevent "unused import" warning
 ''');
     expect(unlinkedUnits[0].imports[0].uri, 'test.dart');
-    checkDependency(
-        linked.importDependencies[0], absUri('/test.dart'), 'test.dart');
-    checkTypeRef(unlinkedUnits[0].classes[1].supertype, absUri('/test.dart'),
-        'test.dart', 'C',
+    checkDependency(linked.importDependencies[0], absUri('/test.dart'));
+    checkTypeRef(
+        unlinkedUnits[0].classes[1].supertype, absUri('/test.dart'), 'C',
         expectedPrefix: 'p');
   }
 
@@ -8453,7 +8430,7 @@
     UnlinkedParam g = f.parameters[0];
     expect(g.name, 'g');
     EntityRef typeRef = getTypeRefForSlot(g.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, null, null, 'f',
+    checkLinkedTypeRef(typeRef, null, 'f',
         expectedKind: ReferenceKind.method, numTypeArguments: 1);
     checkParamTypeRef(typeRef.typeArguments[0], 1);
   }
@@ -8466,10 +8443,10 @@
         serializeClassText('class C { final x = <dynamic, int>{}; }');
     EntityRef type = getTypeRefForSlot(cls.fields[0].inferredTypeSlot);
     // Check that x has inferred type `Map<dynamic, int>`.
-    checkLinkedTypeRef(type, 'dart:core', 'dart:core', 'Map',
+    checkLinkedTypeRef(type, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
-    checkLinkedTypeRef(type.typeArguments[0], null, null, 'dynamic');
-    checkLinkedTypeRef(type.typeArguments[1], 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(type.typeArguments[0], null, 'dynamic');
+    checkLinkedTypeRef(type.typeArguments[1], 'dart:core', 'int');
   }
 
   test_inferred_type_reference_shared_prefixed() {
@@ -8495,10 +8472,10 @@
         className: 'C');
     EntityRef type = getTypeRefForSlot(cls.fields[0].inferredTypeSlot);
     // Check that v has inferred type Map<T, int>.
-    checkLinkedTypeRef(type, 'dart:core', 'dart:core', 'Map',
+    checkLinkedTypeRef(type, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
     checkParamTypeRef(type.typeArguments[0], 1);
-    checkLinkedTypeRef(type.typeArguments[1], 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(type.typeArguments[1], 'dart:core', 'int');
   }
 
   test_inferred_type_refers_to_function_typed_param_of_typedef() {
@@ -8516,8 +8493,7 @@
     UnlinkedParam y = closure.parameters[0];
     expect(y.name, 'y');
     EntityRef typeRef = getTypeRefForSlot(y.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, null, null, 'F',
-        expectedKind: ReferenceKind.typedef);
+    checkLinkedTypeRef(typeRef, null, 'F', expectedKind: ReferenceKind.typedef);
     expect(typeRef.implicitFunctionTypeIndices, [0]);
   }
 
@@ -8537,7 +8513,7 @@
     expect(type.paramReference, 0);
     expect(type.typeArguments, hasLength(2));
     checkParamTypeRef(type.typeArguments[0], 1);
-    checkTypeRef(type.typeArguments[1], 'dart:core', 'dart:core', 'int');
+    checkTypeRef(type.typeArguments[1], 'dart:core', 'int');
     expect(type.reference,
         greaterThanOrEqualTo(unlinkedUnits[0].references.length));
     LinkedReference linkedReference =
@@ -8549,7 +8525,7 @@
     expect(linkedReference.unit, 0);
     expect(linkedReference.containingReference, isNot(0));
     expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(linkedReference.containingReference, null, null, 'D',
+    checkReferenceIndex(linkedReference.containingReference, null, 'D',
         numTypeParameters: 2);
   }
 
@@ -8581,7 +8557,7 @@
     expect(linkedReference.containingReference, isNot(0));
     expect(linkedReference.containingReference, lessThan(type.reference));
     checkReferenceIndex(
-        linkedReference.containingReference, absUri('/b.dart'), 'b.dart', 'E');
+        linkedReference.containingReference, absUri('/b.dart'), 'E');
   }
 
   test_inferred_type_refers_to_method_function_typed_parameter_type() {
@@ -8610,7 +8586,7 @@
     expect(linkedReference.unit, 0);
     expect(linkedReference.containingReference, isNot(0));
     expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(linkedReference.containingReference, null, null, 'D');
+    checkReferenceIndex(linkedReference.containingReference, null, 'D');
   }
 
   test_inferred_type_refers_to_nested_function_typed_param() {
@@ -8627,7 +8603,7 @@
     UnlinkedParam y = closure.parameters[1];
     expect(y.name, 'y');
     EntityRef typeRef = getTypeRefForSlot(y.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, null, null, 'f',
+    checkLinkedTypeRef(typeRef, null, 'f',
         expectedKind: ReferenceKind.topLevelFunction);
     expect(typeRef.implicitFunctionTypeIndices, [0, 1]);
   }
@@ -8646,7 +8622,7 @@
     UnlinkedParam y = closure.parameters[1];
     expect(y.name, 'y');
     EntityRef typeRef = getTypeRefForSlot(y.inferredTypeSlot);
-    checkLinkedTypeRef(typeRef, null, null, 'f',
+    checkLinkedTypeRef(typeRef, null, 'f',
         expectedKind: ReferenceKind.topLevelFunction);
     expect(typeRef.implicitFunctionTypeIndices, [0, 1]);
   }
@@ -8677,7 +8653,7 @@
     expect(linkedReference.unit, 0);
     expect(linkedReference.containingReference, isNot(0));
     expect(linkedReference.containingReference, lessThan(type.reference));
-    checkReferenceIndex(linkedReference.containingReference, null, null, 'D');
+    checkReferenceIndex(linkedReference.containingReference, null, 'D');
   }
 
   test_inferred_type_skips_trailing_dynamic() {
@@ -8688,9 +8664,9 @@
         serializeClassText('class C { final x = <int, dynamic>{}; }');
     EntityRef type = getTypeRefForSlot(cls.fields[0].inferredTypeSlot);
     // Check that x has inferred type `Map<int, dynamic>`.
-    checkLinkedTypeRef(type, 'dart:core', 'dart:core', 'Map',
+    checkLinkedTypeRef(type, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
-    checkLinkedTypeRef(type.typeArguments[0], 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(type.typeArguments[0], 'dart:core', 'int');
     checkLinkedDynamicTypeRef(type.typeArguments[1]);
   }
 
@@ -8701,7 +8677,7 @@
     UnlinkedClass cls = serializeClassText('class C { final x = []; }');
     EntityRef type = getTypeRefForSlot(cls.fields[0].inferredTypeSlot);
     // Check that x has inferred type `List<dynamic>`.
-    checkLinkedTypeRef(type, 'dart:core', 'dart:core', 'List',
+    checkLinkedTypeRef(type, 'dart:core', 'List',
         numTypeParameters: 1, numTypeArguments: 1);
   }
 
@@ -8710,7 +8686,7 @@
     UnlinkedVariable variable = serializeVariableText('int v = null;');
     expect(variable.initializer.returnType, isNull);
     checkInferredTypeSlot(
-        variable.initializer.inferredReturnTypeSlot, null, null, '*bottom*',
+        variable.initializer.inferredReturnTypeSlot, null, '*bottom*',
         onlyInStrongMode: false);
   }
 
@@ -8723,10 +8699,10 @@
         'import "a.dart"; int v = new C().d;',
         allowErrors: true);
     expect(variable.initializer.returnType, isNull);
-    checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot,
-        absUri('/a.dart'), 'a.dart', 'D',
+    checkInferredTypeSlot(
+        variable.initializer.inferredReturnTypeSlot, absUri('/a.dart'), 'D',
         onlyInStrongMode: false);
-    checkHasDependency('a.dart', fullyLinked: false);
+    checkHasDependency(absUri('/a.dart'), fullyLinked: false);
   }
 
   test_initializer_executable_with_return_type_from_closure() {
@@ -8741,15 +8717,15 @@
         serializeVariableText('int v = () => 0;', allowErrors: true);
     EntityRef closureType =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
-    checkLinkedTypeRef(closureType, null, null, '',
+    checkLinkedTypeRef(closureType, null, '',
         expectedKind: ReferenceKind.function);
     int initializerIndex =
         definingUnit.references[closureType.reference].containingReference;
-    checkReferenceIndex(initializerIndex, null, null, '',
+    checkReferenceIndex(initializerIndex, null, '',
         expectedKind: ReferenceKind.function);
     int variableIndex =
         definingUnit.references[initializerIndex].containingReference;
-    checkReferenceIndex(variableIndex, null, null, 'v',
+    checkReferenceIndex(variableIndex, null, 'v',
         expectedKind: ReferenceKind.topLevelPropertyAccessor);
     expect(definingUnit.references[variableIndex].containingReference, 0);
   }
@@ -8772,18 +8748,18 @@
     UnlinkedVariable variable = cls.fields[0];
     EntityRef closureType =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
-    checkLinkedTypeRef(closureType, null, null, '',
+    checkLinkedTypeRef(closureType, null, '',
         expectedKind: ReferenceKind.function);
     int initializerIndex =
         definingUnit.references[closureType.reference].containingReference;
-    checkReferenceIndex(initializerIndex, null, null, '',
+    checkReferenceIndex(initializerIndex, null, '',
         expectedKind: ReferenceKind.function);
     int variableIndex =
         definingUnit.references[initializerIndex].containingReference;
-    checkReferenceIndex(variableIndex, null, null, 'v',
+    checkReferenceIndex(variableIndex, null, 'v',
         expectedKind: ReferenceKind.propertyAccessor);
     int classIndex = definingUnit.references[variableIndex].containingReference;
-    checkReferenceIndex(classIndex, null, null, 'C');
+    checkReferenceIndex(classIndex, null, 'C');
     expect(definingUnit.references[classIndex].containingReference, 0);
   }
 
@@ -8805,19 +8781,19 @@
     UnlinkedVariable variable = executable.localVariables[1];
     EntityRef closureType =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
-    checkLinkedTypeRef(closureType, null, null, '',
+    checkLinkedTypeRef(closureType, null, '',
         expectedKind: ReferenceKind.function);
     int initializerIndex =
         definingUnit.references[closureType.reference].containingReference;
-    checkReferenceIndex(initializerIndex, null, null, '',
+    checkReferenceIndex(initializerIndex, null, '',
         expectedKind: ReferenceKind.function);
     int variableIndex =
         definingUnit.references[initializerIndex].containingReference;
-    checkReferenceIndex(variableIndex, null, null, 'v',
+    checkReferenceIndex(variableIndex, null, 'v',
         expectedKind: ReferenceKind.variable, localIndex: 1);
     int topLevelFunctionIndex =
         definingUnit.references[variableIndex].containingReference;
-    checkReferenceIndex(topLevelFunctionIndex, null, null, 'f',
+    checkReferenceIndex(topLevelFunctionIndex, null, 'f',
         expectedKind: ReferenceKind.topLevelFunction);
     expect(
         definingUnit.references[topLevelFunctionIndex].containingReference, 0);
@@ -8833,8 +8809,8 @@
         'import "a.dart"; int v = new C().d;',
         allowErrors: true);
     expect(variable.initializer.returnType, isNull);
-    checkInferredTypeSlot(variable.initializer.inferredReturnTypeSlot,
-        absUri('/b.dart'), 'b.dart', 'D',
+    checkInferredTypeSlot(
+        variable.initializer.inferredReturnTypeSlot, absUri('/b.dart'), 'D',
         onlyInStrongMode: false);
     if (!skipFullyLinkedData) {
       checkHasDependency('b.dart', fullyLinked: true);
@@ -8885,8 +8861,7 @@
     serializeLibraryText(
         'library my.lib; part "foo.dart"; part "bar.dart"; C c;',
         allowErrors: true);
-    checkTypeRef(findVariable('c').type, null, null, 'C',
-        expectedTargetUnit: 2);
+    checkTypeRef(findVariable('c').type, null, 'C', expectedTargetUnit: 2);
   }
 
   test_lineStarts() {
@@ -8940,13 +8915,13 @@
 class C {}
 C c;
 D d;''');
-    checkTypeRef(findVariable('c').type, null, null, 'C');
-    checkTypeRef(findVariable('d').type, absUri('/a.dart'), 'a.dart', 'D');
+    checkTypeRef(findVariable('c').type, null, 'C');
+    checkTypeRef(findVariable('d').type, absUri('/a.dart'), 'D');
   }
 
   test_localNameShadowsImportPrefix() {
     serializeLibraryText('import "dart:async" as a; class a {}; a x;');
-    checkTypeRef(findVariable('x').type, null, null, 'a');
+    checkTypeRef(findVariable('x').type, null, 'a');
   }
 
   test_metadata_classDeclaration() {
@@ -8971,7 +8946,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.constructor,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'A')
@@ -8990,11 +8965,14 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.constructor,
               prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'A',
-                    absoluteUri: absUri('/foo.dart'), relativeUri: 'foo.dart'),
+                new _PrefixExpectation(
+                  ReferenceKind.classOrEnum,
+                  'A',
+                  absoluteUri: absUri('/foo.dart'),
+                ),
                 new _PrefixExpectation(ReferenceKind.prefix, 'foo')
               ])
     ]);
@@ -9012,7 +8990,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.unresolved, 'A'),
@@ -9033,11 +9011,14 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
-                new _PrefixExpectation(ReferenceKind.classOrEnum, 'A',
-                    absoluteUri: absUri('/foo.dart'), relativeUri: 'foo.dart'),
+                new _PrefixExpectation(
+                  ReferenceKind.classOrEnum,
+                  'A',
+                  absoluteUri: absUri('/foo.dart'),
+                ),
                 new _PrefixExpectation(ReferenceKind.prefix, 'foo')
               ])
     ]);
@@ -9053,7 +9034,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.unresolved, 'A')
@@ -9071,7 +9052,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'named',
+      (EntityRef r) => checkTypeRef(r, null, 'named',
               expectedKind: ReferenceKind.unresolved,
               prefixExpectations: [
                 new _PrefixExpectation(ReferenceKind.classOrEnum, 'A')
@@ -9089,8 +9070,8 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'A', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -9105,7 +9086,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/foo.dart'), 'foo.dart', 'A',
+      (EntityRef r) => checkTypeRef(r, absUri('/foo.dart'), 'A',
           expectedKind: ReferenceKind.classOrEnum, expectedPrefix: 'foo')
     ]);
   }
@@ -9122,7 +9103,7 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
+      (EntityRef r) => checkTypeRef(r, null, 'A',
           expectedKind: ReferenceKind.unresolved, expectedPrefix: 'foo')
     ]);
   }
@@ -9137,8 +9118,8 @@
       0,
       0
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.unresolved)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'A', expectedKind: ReferenceKind.unresolved)
     ]);
   }
 
@@ -9153,8 +9134,8 @@
       0,
       1
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'A', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -9263,8 +9244,8 @@
       0,
       1
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'A', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -9285,8 +9266,8 @@
       0,
       1
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'A',
-          expectedKind: ReferenceKind.classOrEnum)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'A', expectedKind: ReferenceKind.classOrEnum)
     ]);
   }
 
@@ -9323,13 +9304,13 @@
     assertUnlinkedConst(annotations[0], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
+      (EntityRef r) => checkTypeRef(r, null, 'a',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
     assertUnlinkedConst(annotations[1], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'b',
+      (EntityRef r) => checkTypeRef(r, null, 'b',
           expectedKind: ReferenceKind.topLevelPropertyAccessor)
     ]);
   }
@@ -9348,7 +9329,7 @@
     assertUnlinkedConst(cls.annotations[0], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'a.dart', 'b',
+      (EntityRef r) => checkTypeRef(r, absUri('/a.dart'), 'b',
           expectedKind: ReferenceKind.topLevelPropertyAccessor,
           expectedPrefix: 'a')
     ]);
@@ -9363,7 +9344,7 @@
     assertUnlinkedConst(cls.annotations[0], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'b',
+      (EntityRef r) => checkTypeRef(r, null, 'b',
           expectedKind: ReferenceKind.unresolved, expectedPrefix: 'a')
     ]);
   }
@@ -9418,8 +9399,8 @@
     assertUnlinkedConst(cls.annotations[0], operators: [
       UnlinkedExprOperation.pushReference
     ], referenceValidators: [
-      (EntityRef r) => checkTypeRef(r, null, null, 'a',
-          expectedKind: ReferenceKind.unresolved)
+      (EntityRef r) =>
+          checkTypeRef(r, null, 'a', expectedKind: ReferenceKind.unresolved)
     ]);
   }
 
@@ -9461,8 +9442,7 @@
             ' abstract class D { void f(int value); }',
             className: 'C')
         .executables[0];
-    checkInferredTypeSlot(
-        f.parameters[0].inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(f.parameters[0].inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_method_inferred_type_nonstatic_implicit_return() {
@@ -9470,8 +9450,7 @@
             'class C extends D { f() => null; } abstract class D { int f(); }',
             className: 'C')
         .executables[0];
-    checkInferredTypeSlot(
-        f.inferredReturnTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(f.inferredReturnTypeSlot, 'dart:core', 'int');
   }
 
   test_method_inferred_type_static_implicit_param() {
@@ -9704,14 +9683,13 @@
             ' abstract class D { void set f(int value); }',
             className: 'C')
         .executables[0];
-    checkInferredTypeSlot(
-        f.parameters[0].inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(f.parameters[0].inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_setter_inferred_type_nonstatic_implicit_return() {
     UnlinkedExecutable f =
         serializeClassText('class C { set f(int value) {} }').executables[0];
-    checkInferredTypeSlot(f.inferredReturnTypeSlot, null, null, 'void');
+    checkInferredTypeSlot(f.inferredReturnTypeSlot, null, 'void');
   }
 
   test_setter_inferred_type_static_implicit_param() {
@@ -9769,11 +9747,9 @@
 bool f() => true;
 ''');
     EntityRef inferredType = getTypeRefForSlot(variable.inferredTypeSlot);
-    checkLinkedTypeRef(
-        inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(inferredType.syntheticReturnType, 'dart:core', 'int');
     expect(inferredType.syntheticParams, hasLength(1));
-    checkLinkedTypeRef(
-        inferredType.syntheticParams[0].type, null, null, '*bottom*');
+    checkLinkedTypeRef(inferredType.syntheticParams[0].type, null, '*bottom*');
   }
 
   test_syntheticFunctionType_genericClosure_inGenericFunction() {
@@ -9795,13 +9771,11 @@
 }
 ''').localVariables[0];
     EntityRef inferredType = getTypeRefForSlot(variable.inferredTypeSlot);
-    checkLinkedTypeRef(
-        inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(inferredType.syntheticReturnType, 'dart:core', 'int');
     expect(inferredType.syntheticParams, hasLength(3));
     checkParamTypeRef(inferredType.syntheticParams[0].type, 2);
     checkParamTypeRef(inferredType.syntheticParams[1].type, 1);
-    checkLinkedTypeRef(
-        inferredType.syntheticParams[2].type, null, null, '*bottom*');
+    checkLinkedTypeRef(inferredType.syntheticParams[2].type, null, '*bottom*');
   }
 
   test_syntheticFunctionType_inGenericClass() {
@@ -9816,8 +9790,7 @@
 ''').fields[0];
     EntityRef inferredType =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
-    checkLinkedTypeRef(
-        inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(inferredType.syntheticReturnType, 'dart:core', 'int');
     checkParamTypeRef(inferredType.syntheticParams[0].type, 2);
     checkParamTypeRef(inferredType.syntheticParams[1].type, 1);
   }
@@ -9833,29 +9806,28 @@
 ''').localVariables[0];
     EntityRef inferredType =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
-    checkLinkedTypeRef(
-        inferredType.syntheticReturnType, 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(inferredType.syntheticReturnType, 'dart:core', 'int');
     checkParamTypeRef(inferredType.syntheticParams[0].type, 2);
     checkParamTypeRef(inferredType.syntheticParams[1].type, 1);
   }
 
   test_type_arguments_explicit() {
     EntityRef typeRef = serializeTypeText('List<int>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List',
+    checkTypeRef(typeRef, 'dart:core', 'List',
         numTypeParameters: 1, numTypeArguments: 1);
-    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'int');
+    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'int');
   }
 
   test_type_arguments_explicit_dynamic() {
     EntityRef typeRef = serializeTypeText('List<dynamic>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List',
+    checkTypeRef(typeRef, 'dart:core', 'List',
         numTypeParameters: 1, numTypeArguments: 1);
     checkDynamicTypeRef(typeRef.typeArguments[0]);
   }
 
   test_type_arguments_explicit_dynamic_dynamic() {
     EntityRef typeRef = serializeTypeText('Map<dynamic, dynamic>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'Map',
+    checkTypeRef(typeRef, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
     checkDynamicTypeRef(typeRef.typeArguments[0]);
     checkDynamicTypeRef(typeRef.typeArguments[1]);
@@ -9863,16 +9835,16 @@
 
   test_type_arguments_explicit_dynamic_int() {
     EntityRef typeRef = serializeTypeText('Map<dynamic, int>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'Map',
+    checkTypeRef(typeRef, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
     checkDynamicTypeRef(typeRef.typeArguments[0]);
-    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'dart:core', 'int');
+    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'int');
   }
 
   test_type_arguments_explicit_dynamic_typedef() {
     EntityRef typeRef =
         serializeTypeText('F<dynamic>', otherDeclarations: 'typedef T F<T>();');
-    checkTypeRef(typeRef, null, null, 'F',
+    checkTypeRef(typeRef, null, 'F',
         expectedKind: ReferenceKind.typedef,
         numTypeParameters: 1,
         numTypeArguments: 1);
@@ -9881,56 +9853,55 @@
 
   test_type_arguments_explicit_String_dynamic() {
     EntityRef typeRef = serializeTypeText('Map<String, dynamic>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'Map',
+    checkTypeRef(typeRef, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
-    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'String');
+    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'String');
     checkDynamicTypeRef(typeRef.typeArguments[1]);
   }
 
   test_type_arguments_explicit_String_int() {
     EntityRef typeRef = serializeTypeText('Map<String, int>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'Map',
+    checkTypeRef(typeRef, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
-    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'String');
-    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'dart:core', 'int');
+    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'String');
+    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'int');
   }
 
   test_type_arguments_explicit_typedef() {
     EntityRef typeRef =
         serializeTypeText('F<int>', otherDeclarations: 'typedef T F<T>();');
-    checkTypeRef(typeRef, null, null, 'F',
+    checkTypeRef(typeRef, null, 'F',
         expectedKind: ReferenceKind.typedef,
         numTypeParameters: 1,
         numTypeArguments: 1);
-    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'int');
+    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'int');
   }
 
   test_type_arguments_implicit() {
     EntityRef typeRef = serializeTypeText('List');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'List',
-        numTypeParameters: 1);
+    checkTypeRef(typeRef, 'dart:core', 'List', numTypeParameters: 1);
   }
 
   test_type_arguments_implicit_typedef() {
     EntityRef typeRef =
         serializeTypeText('F', otherDeclarations: 'typedef T F<T>();');
-    checkTypeRef(typeRef, null, null, 'F',
+    checkTypeRef(typeRef, null, 'F',
         expectedKind: ReferenceKind.typedef, numTypeParameters: 1);
   }
 
   test_type_arguments_implicit_typedef_withBound() {
     EntityRef typeRef = serializeTypeText('F',
         otherDeclarations: 'typedef T F<T extends num>();');
-    checkTypeRef(typeRef, null, null, 'F',
+    checkTypeRef(typeRef, null, 'F',
         expectedKind: ReferenceKind.typedef, numTypeParameters: 1);
   }
 
   test_type_arguments_order() {
     EntityRef typeRef = serializeTypeText('Map<int, Object>');
-    checkTypeRef(typeRef, 'dart:core', 'dart:core', 'Map',
+    checkTypeRef(typeRef, 'dart:core', 'Map',
         numTypeParameters: 2, numTypeArguments: 2);
-    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'dart:core', 'int');
-    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'dart:core', 'Object');
+    checkTypeRef(typeRef.typeArguments[0], 'dart:core', 'int');
+    checkTypeRef(typeRef.typeArguments[1], 'dart:core', 'Object');
   }
 
   test_type_dynamic() {
@@ -9945,7 +9916,7 @@
 ''');
     UnlinkedExecutable m = c.executables[0];
     expect(m.name, 'm');
-    checkTypeRef(m.parameters[0].type, null, null, 'dynamic');
+    checkTypeRef(m.parameters[0].type, null, 'dynamic');
   }
 
   test_type_param_codeRange() {
@@ -10033,7 +10004,7 @@
     addNamedSource('/a.dart', 'part of foo; C v;');
     serializeLibraryText('library foo; part "a.dart"; class C {}');
     checkTypeRef(findVariable('v', variables: unlinkedUnits[1].variables).type,
-        null, null, 'C',
+        null, 'C',
         expectedKind: ReferenceKind.classOrEnum,
         linkedSourceUnit: linked.units[1],
         unlinkedSourceUnit: unlinkedUnits[1]);
@@ -10046,7 +10017,7 @@
         'library foo; import "a.dart"; import "a.dart" as a; part "p.dart";',
         allowErrors: true);
     checkTypeRef(findVariable('v', variables: unlinkedUnits[1].variables).type,
-        absUri('/a.dart'), 'a.dart', 'C',
+        absUri('/a.dart'), 'C',
         expectedPrefix: 'a',
         linkedSourceUnit: linked.units[1],
         unlinkedSourceUnit: unlinkedUnits[1]);
@@ -10070,7 +10041,7 @@
     addNamedSource('/a.dart', 'library a; export "b.dart";');
     addNamedSource('/b.dart', 'library b; class C {}');
     checkTypeRef(serializeTypeText('C', otherDeclarations: 'import "a.dart";'),
-        absUri('/b.dart'), 'b.dart', 'C');
+        absUri('/b.dart'), 'C');
   }
 
   test_type_reference_to_import_of_export_via_prefix() {
@@ -10079,7 +10050,6 @@
     checkTypeRef(
         serializeTypeText('p.C', otherDeclarations: 'import "a.dart" as p;'),
         absUri('/b.dart'),
-        'b.dart',
         'C',
         expectedPrefix: 'p');
   }
@@ -10091,7 +10061,6 @@
         serializeTypeText('C',
             otherDeclarations: 'library my.lib; import "a.dart";'),
         absUri('/a.dart'),
-        'a.dart',
         'C',
         expectedTargetUnit: 1);
   }
@@ -10103,15 +10072,14 @@
         serializeTypeText('p.C',
             otherDeclarations: 'library my.lib; import "a.dart" as p;'),
         absUri('/a.dart'),
-        'a.dart',
         'C',
         expectedPrefix: 'p',
         expectedTargetUnit: 1);
   }
 
   test_type_reference_to_internal_class() {
-    checkTypeRef(serializeTypeText('C', otherDeclarations: 'class C {}'), null,
-        null, 'C');
+    checkTypeRef(
+        serializeTypeText('C', otherDeclarations: 'class C {}'), null, 'C');
   }
 
   test_type_reference_to_internal_class_alias() {
@@ -10119,13 +10087,12 @@
         serializeTypeText('C',
             otherDeclarations: 'class C = D with E; class D {} class E {}'),
         null,
-        null,
         'C');
   }
 
   test_type_reference_to_internal_enum() {
     checkTypeRef(serializeTypeText('E', otherDeclarations: 'enum E { value }'),
-        null, null, 'E');
+        null, 'E');
   }
 
   test_type_reference_to_local_part() {
@@ -10134,7 +10101,6 @@
         serializeTypeText('C',
             otherDeclarations: 'library my.lib; part "a.dart";'),
         null,
-        null,
         'C',
         expectedTargetUnit: 1);
   }
@@ -10149,7 +10115,7 @@
   test_type_reference_to_part() {
     addNamedSource('/a.dart', 'part of foo; class C { C(); }');
     serializeLibraryText('library foo; part "a.dart"; C c;');
-    checkTypeRef(unlinkedUnits[0].variables.single.type, null, null, 'C',
+    checkTypeRef(unlinkedUnits[0].variables.single.type, null, 'C',
         expectedKind: ReferenceKind.classOrEnum, expectedTargetUnit: 1);
   }
 
@@ -10168,19 +10134,16 @@
     // Note: it is important that each reference to class C records the prefix
     // used to find it; otherwise it's possible that relinking might produce an
     // incorrect result after a change to lib2.dart, lib3.dart, or lib4.dart.
-    checkTypeRef(
-        findVariable('c2').type, absUri('/lib1.dart'), 'lib1.dart', 'C');
-    checkTypeRef(
-        findVariable('c3').type, absUri('/lib1.dart'), 'lib1.dart', 'C',
+    checkTypeRef(findVariable('c2').type, absUri('/lib1.dart'), 'C');
+    checkTypeRef(findVariable('c3').type, absUri('/lib1.dart'), 'C',
         expectedPrefix: 'a');
-    checkTypeRef(
-        findVariable('c4').type, absUri('/lib1.dart'), 'lib1.dart', 'C',
+    checkTypeRef(findVariable('c4').type, absUri('/lib1.dart'), 'C',
         expectedPrefix: 'b');
   }
 
   test_type_reference_to_typedef() {
     checkTypeRef(serializeTypeText('F', otherDeclarations: 'typedef void F();'),
-        null, null, 'F',
+        null, 'F',
         expectedKind: ReferenceKind.typedef);
   }
 
@@ -10193,8 +10156,7 @@
     // The referenced unit should be 2, since unit 0 is a.dart and unit 1 is
     // b.dart.  a.dart and b.dart are counted even though nothing is imported
     // from them.
-    checkTypeRef(typeRef, absUri('/a.dart'), 'a.dart', 'C',
-        expectedTargetUnit: 2);
+    checkTypeRef(typeRef, absUri('/a.dart'), 'C', expectedTargetUnit: 2);
   }
 
   test_type_unresolved() {
@@ -10255,7 +10217,7 @@
   test_typedef_reference_generic() {
     EntityRef typeRef =
         serializeTypeText('F', otherDeclarations: 'typedef void F<A, B>();');
-    checkTypeRef(typeRef, null, null, 'F',
+    checkTypeRef(typeRef, null, 'F',
         numTypeParameters: 2, expectedKind: ReferenceKind.typedef);
   }
 
@@ -10263,13 +10225,13 @@
     addNamedSource('/lib.dart', 'typedef void F<A, B>();');
     EntityRef typeRef =
         serializeTypeText('F', otherDeclarations: 'import "lib.dart";');
-    checkTypeRef(typeRef, absUri('/lib.dart'), 'lib.dart', 'F',
+    checkTypeRef(typeRef, absUri('/lib.dart'), 'F',
         numTypeParameters: 2, expectedKind: ReferenceKind.typedef);
   }
 
   test_typedef_return_type_explicit() {
     UnlinkedTypedef type = serializeTypedefText('typedef int F();');
-    checkTypeRef(type.returnType, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(type.returnType, 'dart:core', 'int');
   }
 
   test_typedef_type_param_in_parameter() {
@@ -10308,8 +10270,7 @@
     expect(unlinkedUnits[0].publicNamespace.exports, hasLength(1));
     expect(unlinkedUnits[0].publicNamespace.exports[0].uri, 'foo.dart');
     expect(linked.exportDependencies, hasLength(1));
-    checkDependency(
-        linked.exportDependencies[0], absUri('/foo.dart'), 'foo.dart');
+    checkDependency(linked.exportDependencies[0], absUri('/foo.dart'));
   }
 
   test_unresolved_import() {
@@ -10320,8 +10281,7 @@
     // Note: imports[1] is the implicit import of dart:core.
     expect(unlinkedUnits[0].imports[1].isImplicit, true);
     expect(linked.importDependencies, hasLength(2));
-    checkDependency(
-        linked.importDependencies[0], absUri('/foo.dart'), 'foo.dart');
+    checkDependency(linked.importDependencies[0], absUri('/foo.dart'));
   }
 
   test_unresolved_part() {
@@ -10369,7 +10329,7 @@
     EntityRef type =
         getTypeRefForSlot(variable.initializer.inferredReturnTypeSlot);
     expect(type.typeArguments, hasLength(1));
-    checkLinkedTypeRef(type.typeArguments[0], 'dart:core', 'dart:core', 'int');
+    checkLinkedTypeRef(type.typeArguments[0], 'dart:core', 'int');
   }
 
   test_variable() {
@@ -10447,7 +10407,7 @@
 
   test_variable_inferred_type_implicit_initialized() {
     UnlinkedVariable v = serializeVariableText('var v = 0;');
-    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'dart:core', 'int');
+    checkInferredTypeSlot(v.inferredTypeSlot, 'dart:core', 'int');
   }
 
   test_variable_inferred_type_implicit_uninitialized() {
@@ -10578,7 +10538,7 @@
   test_variable_type() {
     UnlinkedVariable variable =
         serializeVariableText('int i;', variableName: 'i');
-    checkTypeRef(variable.type, 'dart:core', 'dart:core', 'int');
+    checkTypeRef(variable.type, 'dart:core', 'int');
   }
 
   /**
@@ -10650,7 +10610,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+          (EntityRef r) => checkTypeRef(r, null, 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -10712,7 +10672,7 @@
         ],
         strings: [],
         referenceValidators: [
-          (EntityRef r) => checkTypeRef(r, null, null, 'a',
+          (EntityRef r) => checkTypeRef(r, null, 'a',
               expectedKind: ReferenceKind.topLevelPropertyAccessor)
         ]);
   }
@@ -10734,9 +10694,8 @@
   final ReferenceKind kind;
   final String name;
   final String absoluteUri;
-  final String relativeUri;
   final int numTypeParameters;
 
   _PrefixExpectation(this.kind, this.name,
-      {this.absoluteUri, this.relativeUri, this.numTypeParameters: 0});
+      {this.absoluteUri, this.numTypeParameters: 0});
 }
diff --git a/pkg/analyzer/test/src/summary/test_all.dart b/pkg/analyzer/test/src/summary/test_all.dart
index bce3840..95ccf76 100644
--- a/pkg/analyzer/test/src/summary/test_all.dart
+++ b/pkg/analyzer/test/src/summary/test_all.dart
@@ -13,7 +13,6 @@
 import 'name_filter_test.dart' as name_filter_test;
 import 'package_bundle_reader_test.dart' as package_bundle_reader_test;
 import 'prelinker_test.dart' as prelinker_test;
-import 'pub_summary_test.dart' as pub_summary_test;
 import 'resynthesize_ast_test.dart' as resynthesize_ast_test;
 import 'summarize_ast_strong_test.dart' as summarize_ast_strong_test;
 import 'summarize_ast_test.dart' as summarize_ast_test;
@@ -28,7 +27,6 @@
     name_filter_test.main();
     package_bundle_reader_test.main();
     prelinker_test.main();
-    pub_summary_test.main();
     resynthesize_ast_test.main();
     summarize_ast_strong_test.main();
     summarize_ast_test.main();
diff --git a/pkg/analyzer/tool/task_dependency_graph/tasks.dot b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
index 89988ad..1907d88 100644
--- a/pkg/analyzer/tool/task_dependency_graph/tasks.dot
+++ b/pkg/analyzer/tool/task_dependency_graph/tasks.dot
@@ -181,6 +181,7 @@
   LIBRARY_SPECIFIC_UNITS [shape=box]
   LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
   LIBRARY_UNIT_ERRORS [shape=box]
+  LINE_INFO -> BuildCompilationUnitElementTask
   LINE_INFO -> DartErrorsTask
   LINE_INFO -> ParseDartTask
   LINE_INFO [shape=box]
diff --git a/pkg/analyzer_cli/README.md b/pkg/analyzer_cli/README.md
index 947e730..7943162 100644
--- a/pkg/analyzer_cli/README.md
+++ b/pkg/analyzer_cli/README.md
@@ -68,14 +68,11 @@
 
 The following options are deprecated:
 
-* `-p` _or_ `--package-root=`<br>
+* `--package-root=`<br>
   **Deprecated.** Specify the directory to search for any libraries that are
   imported using `package:`. _This option is replaced as of Dart 1.12 with
   `--packages`._
 
-* `--machine`<br>
-  **Deprecated.** Replaced by `--format`.
-
 * `--show-package-warnings`<br>
   **Deprecated.** Replaced by `--package-warnings`.
 
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 5df078a..73ff30b 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -266,8 +266,9 @@
       if (analysisDriver != null) {
         String path = librarySource.fullName;
         analysisDriver.priorityFiles = [path];
-        AnalysisResult analysisResult = await analysisDriver.getResult(path);
-        return analysisResult.unit.element.library;
+        UnitElementResult elementResult =
+            await analysisDriver.getUnitElement(path);
+        return elementResult.element.library;
       } else {
         return context.computeLibraryElement(librarySource);
       }
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e91d07e..e6e3ad7 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -76,7 +76,7 @@
   static final PerformanceTag _analyzeAllTag =
       new PerformanceTag("Driver._analyzeAll");
 
-  static ByteStore analysisDriverByteStore = new MemoryByteStore();
+  static ByteStore analysisDriverMemoryByteStore = new MemoryByteStore();
 
   /// The plugins that are defined outside the `analyzer_cli` package.
   List<Plugin> _userDefinedPlugins = <Plugin>[];
@@ -244,10 +244,17 @@
     // Check that each part has a corresponding source in the input list.
     for (Source part in parts) {
       bool found = false;
-      for (var lib in context.getLibrariesContaining(part)) {
-        if (libUris.contains(lib.uri)) {
+      if (analysisDriver != null) {
+        var partFile = analysisDriver.fsState.getFileForPath(part.fullName);
+        if (libUris.contains(partFile.library?.uri)) {
           found = true;
         }
+      } else {
+        for (var lib in context.getLibrariesContaining(part)) {
+          if (libUris.contains(lib.uri)) {
+            found = true;
+          }
+        }
       }
       if (!found) {
         errorSink.writeln("${part.fullName} is a part and cannot be analyzed.");
@@ -572,7 +579,7 @@
           scheduler,
           log,
           resourceProvider,
-          analysisDriverByteStore,
+          analysisDriverMemoryByteStore,
           new FileContentOverlay(),
           'test',
           context.sourceFactory,
@@ -716,6 +723,20 @@
     }
   }
 
+  static AnalysisOptionsImpl createAnalysisOptions(
+      file_system.ResourceProvider resourceProvider,
+      SourceFactory sourceFactory,
+      CommandLineOptions options) {
+    // Prepare context options.
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptionsForCommandLineOptions(options);
+
+    // Process analysis options file (and notify all interested parties).
+    _processAnalysisOptions(
+        resourceProvider, sourceFactory, analysisOptions, options);
+    return analysisOptions;
+  }
+
   static AnalysisOptionsImpl createAnalysisOptionsForCommandLineOptions(
       CommandLineOptions options) {
     AnalysisOptionsImpl contextOptions = new AnalysisOptionsImpl();
@@ -733,20 +754,6 @@
     return contextOptions;
   }
 
-  static AnalysisOptionsImpl createAnalysisOptions(
-      file_system.ResourceProvider resourceProvider,
-      SourceFactory sourceFactory,
-      CommandLineOptions options) {
-    // Prepare context options.
-    AnalysisOptionsImpl analysisOptions =
-        createAnalysisOptionsForCommandLineOptions(options);
-
-    // Process analysis options file (and notify all interested parties).
-    _processAnalysisOptions(
-        resourceProvider, sourceFactory, analysisOptions, options);
-    return analysisOptions;
-  }
-
   static void setAnalysisContextOptions(
       file_system.ResourceProvider resourceProvider,
       SourceFactory sourceFactory,
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 7dd9de9..7f8da52 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -33,7 +33,7 @@
 
 /// Analyzer commandline configuration options.
 class CommandLineOptions {
-  final bool enableNewAnalysisDriver = false;
+  final bool enableNewAnalysisDriver = true;
 
   /// The path to output analysis results when in build mode.
   final String buildAnalysisOutput;
@@ -87,9 +87,6 @@
   /// Whether to display version information
   final bool displayVersion;
 
-  /// Whether to enable null-aware operators (DEP 9).
-  final bool enableNullAwareOperators;
-
   /// Whether to treat type mismatches found during constant evaluation as
   /// errors.
   final bool enableTypeChecks;
@@ -143,6 +140,9 @@
   /// Whether to treat lints as fatal
   final bool lintsAreFatal;
 
+  /// Whether to use memory byte store for analysis driver.
+  final bool useAnalysisDriverMemoryByteStore;
+
   /// Initialize options from the given parsed [args].
   CommandLineOptions._fromArgs(ArgResults args)
       : buildAnalysisOutput = args['build-analysis-output'],
@@ -162,13 +162,12 @@
         disableCacheFlushing = args['disable-cache-flushing'],
         disableHints = args['no-hints'],
         displayVersion = args['version'],
-        enableNullAwareOperators = args['enable-null-aware-operators'],
         enableTypeChecks = args['enable_type_checks'],
         hintsAreFatal = args['fatal-hints'],
         ignoreUnrecognizedFlags = args['ignore-unrecognized-flags'],
         lints = args['lints'],
         log = args['log'],
-        machineFormat = args['machine'] || args['format'] == 'machine',
+        machineFormat = args['format'] == 'machine',
         perfReport = args['x-perf-report'],
         shouldBatch = args['batch'],
         showPackageWarnings = args['show-package-warnings'] ||
@@ -181,7 +180,9 @@
         strongMode = args['strong'],
         implicitCasts = !args['no-implicit-casts'],
         implicitDynamic = !args['no-implicit-dynamic'],
-        lintsAreFatal = args['fatal-lints'];
+        lintsAreFatal = args['fatal-lints'],
+        useAnalysisDriverMemoryByteStore =
+            args['use-analysis-driver-memory-byte-store'];
 
   /// The path to an analysis options file
   String get analysisOptionsFile =>
@@ -223,7 +224,7 @@
         }
       }
 
-      var sdkPath = options.dartSdkPath;
+      String sdkPath = options.dartSdkPath;
 
       // Check that SDK is specified.
       if (sdkPath == null) {
@@ -246,13 +247,6 @@
       }
     }
 
-    // OK.  Report deprecated options.
-    if (options.enableNullAwareOperators) {
-      errorSink.writeln(
-          "Info: Option '--enable-null-aware-operators' is no longer needed. "
-          "Null aware operators are supported by default.");
-    }
-
     // Build mode.
     if (options.buildModePersistentWorker && !options.buildMode) {
       printAndFail('The option --persisten_worker can be used only '
@@ -285,20 +279,21 @@
     bool verbose = args.contains('-v') || args.contains('--verbose');
     bool hide = !verbose;
 
-    var parser = new ArgParser(allowTrailingOptions: true);
+    ArgParser parser = new ArgParser(allowTrailingOptions: true);
+
+    if (!hide) {
+      parser.addSeparator('General options:');
+    }
+
+    // TODO(devoncarew): This defines some hidden flags, which would be better
+    // defined with the rest of the hidden flags below (to group well with the
+    // other flags).
     defineAnalysisArguments(parser, hide: hide);
+
     parser
-      ..addFlag('batch',
-          abbr: 'b',
-          help: 'Read commands from standard input (for testing).',
-          defaultsTo: false,
-          negatable: false)
       ..addOption('format',
-          help: 'Specifies the format in which errors are displayed.')
-      ..addFlag('machine',
-          help: 'Print errors in a format suitable for parsing (deprecated).',
-          defaultsTo: false,
-          negatable: false)
+          help: 'Specifies the format in which errors are displayed; the only '
+              'currently allowed value is \'machine\'.')
       ..addFlag('version',
           help: 'Print the analyzer version.',
           defaultsTo: false,
@@ -309,7 +304,6 @@
           help: 'Do not show hint results.',
           defaultsTo: false,
           negatable: false)
-      ..addFlag('disable-cache-flushing', defaultsTo: false, hide: true)
       ..addFlag(ignoreUnrecognizedFlagsFlag,
           help: 'Ignore unrecognized command line flags.',
           defaultsTo: false,
@@ -338,29 +332,30 @@
           help: 'Show warnings from SDK imports (deprecated).',
           defaultsTo: false,
           negatable: false)
-      ..addOption('x-package-warnings-prefix',
-          help:
-              'Show warnings from package: imports that match the given prefix',
-          hide: true)
-      ..addOption('x-perf-report',
-          help: 'Writes a performance report to the given file (experimental).')
       ..addFlag('help',
           abbr: 'h',
-          help: 'Display this help message.\n'
-              'Add --verbose to show hidden options.',
+          help:
+              'Display this help message. Add --verbose to show hidden options.',
           defaultsTo: false,
           negatable: false)
       ..addFlag('verbose',
-          abbr: 'v', defaultsTo: false, help: 'Verbose output.')
+          abbr: 'v',
+          defaultsTo: false,
+          help: 'Verbose output.',
+          negatable: false)
       ..addOption('url-mapping',
           help: '--url-mapping=libraryUri,/path/to/library.dart directs the '
               'analyzer to use "library.dart" as the source for an import '
               'of "libraryUri".',
           allowMultiple: true,
-          splitCommas: false)
-      //
-      // Build mode.
-      //
+          splitCommas: false);
+
+    // Build mode options.
+    if (!hide) {
+      parser.addSeparator('Build mode flags:');
+    }
+
+    parser
       ..addFlag('persistent_worker',
           help: 'Enable Bazel persistent worker mode.',
           defaultsTo: false,
@@ -414,19 +409,26 @@
           help: 'Exit with code 0 even if errors are found.',
           defaultsTo: false,
           negatable: false,
-          hide: hide)
-      //
-      // Hidden flags.
-      //
-      ..addFlag('enable-async',
-          help: 'Enable support for the proposed async feature.',
+          hide: hide);
+
+    // Hidden flags.
+    if (!hide) {
+      parser.addSeparator('Less frequently used flags:');
+    }
+
+    parser
+      ..addFlag('batch',
+          help: 'Read commands from standard input (for testing).',
           defaultsTo: false,
           negatable: false,
           hide: hide)
-      ..addFlag('enable-enum',
-          help: 'Enable support for the proposed enum feature.',
-          defaultsTo: false,
-          negatable: false,
+      ..addFlag('disable-cache-flushing', defaultsTo: false, hide: hide)
+      ..addOption('x-perf-report',
+          help: 'Writes a performance report to the given file (experimental).',
+          hide: hide)
+      ..addOption('x-package-warnings-prefix',
+          help:
+              'Show warnings from package: imports that match the given prefix',
           hide: hide)
       ..addFlag('enable-conditional-directives',
           help:
@@ -434,16 +436,6 @@
           defaultsTo: false,
           negatable: false,
           hide: hide)
-      ..addFlag('enable-null-aware-operators',
-          help: 'Enable support for null-aware operators (DEP 9).',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
-      ..addFlag('enable-new-task-model',
-          help: 'deprecated -- Ennable new task model.',
-          defaultsTo: false,
-          negatable: false,
-          hide: hide)
       ..addFlag('log',
           help: 'Log additional messages and exceptions.',
           defaultsTo: false,
@@ -453,16 +445,18 @@
           help: 'Check types in constant evaluation.',
           defaultsTo: false,
           negatable: false,
+          hide: hide)
+      ..addFlag('use-analysis-driver-memory-byte-store',
+          help: 'Use memory byte store, not the file system cache.',
+          defaultsTo: false,
+          negatable: false,
           hide: hide);
 
     try {
-      // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
-      args =
-          args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList();
       if (args.contains('--$ignoreUnrecognizedFlagsFlag')) {
         args = filterUnknownArguments(args, parser);
       }
-      var results = parser.parse(args);
+      ArgResults results = parser.parse(args);
 
       // Persistent worker.
       if (args.contains('--persistent_worker')) {
@@ -527,12 +521,15 @@
     }
   }
 
-  static _showUsage(parser) {
-    errorSink
-        .writeln('Usage: $_binaryName [options...] <libraries to analyze...>');
-    errorSink.writeln(parser.getUsage());
-    errorSink.writeln('');
+  static _showUsage(ArgParser parser) {
     errorSink.writeln(
-        'For more information, see http://www.dartlang.org/tools/analyzer.');
+        'Usage: $_binaryName [options...] <directory or list of files>');
+    errorSink.writeln('');
+    errorSink.writeln(parser.usage);
+    errorSink.writeln('');
+    errorSink.writeln('''
+Run "dartanalyzer -h -v" for verbose help output, including less commonly used options.
+For more information, see http://www.dartlang.org/tools/analyzer.
+''');
   }
 }
diff --git a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
index a7fa657..94b936c 100644
--- a/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
+++ b/pkg/analyzer_cli/test/data/package_with_embedder_yaml/lib/core.dart
@@ -4,6 +4,8 @@
 
 library dart.core;
 
+import 'dart:async';
+
 class Object {
   bool operator ==(other) => identical(this, other);
   String toString() => 'a string';
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 0a379c4..cd0e5df 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -342,7 +342,7 @@
                 '--dart-sdk',
                 findSdkDirForSummaries(),
                 '--build-mode',
-                '--machine'
+                '--format=machine'
               ]..addAll(additionalArgs),
               options: 'data/options_tests_project/$optionsFileName');
         }
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index c0ca301..885c22c 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -122,7 +122,7 @@
 
       test('package root', () {
         CommandLineOptions options = CommandLineOptions
-            .parse(['--dart-sdk', '.', '-p', 'bar', 'foo.dart']);
+            .parse(['--dart-sdk', '.', '--package-root', 'bar', 'foo.dart']);
         expect(options.packageRootPath, equals('bar'));
       });
 
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index 8315bf9..a73140d 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -13,4 +13,4 @@
 
 dev_dependencies:
   test_reflective_loader: ^0.1.0
-  test: ^0.12.0
+  test: ^0.12.17
diff --git a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
index 80c7a20..99f7b0d 100644
--- a/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
+++ b/pkg/analyzer_plugin/test/integration/support/integration_tests.dart
@@ -719,7 +719,7 @@
     // and is outputting a stacktrace, because it ensures that we see the
     // entire stacktrace.  Use expectAsync() to prevent the test from
     // ending during this 1 second.
-    new Future.delayed(new Duration(seconds: 1), expectAsync(() {
+    new Future.delayed(new Duration(seconds: 1), expectAsync0(() {
       fail('Bad data received from server: $details');
     }));
   }
diff --git a/pkg/compiler/lib/src/kernel/kernel_visitor.dart b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
index 8ba98d0..d4562e0 100644
--- a/pkg/compiler/lib/src/kernel/kernel_visitor.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_visitor.dart
@@ -47,6 +47,7 @@
         GetterElement,
         InitializingFormalElement,
         JumpTarget,
+        LibraryElement,
         LocalElement,
         LocalFunctionElement,
         LocalVariableElement,
@@ -202,6 +203,13 @@
   final Map<CascadeReceiver, ir.VariableGet> cascadeReceivers =
       <CascadeReceiver, ir.VariableGet>{};
 
+  // This maps underlying Library elements to the corresponding DeferredImport
+  // object, via the prefix name (aka "bar" in
+  // "import foo.dart deferred as bar"). LibraryElement corresponds to the
+  // imported library element.
+  final Map<LibraryElement, Map<String, ir.DeferredImport>> deferredImports =
+      <LibraryElement, Map<String, ir.DeferredImport>>{};
+
   ir.Node associateElement(ir.Node node, Element element) {
     kernel.nodeToElement[node] = element;
     return node;
@@ -214,6 +222,10 @@
 
   bool isVoidContext = false;
 
+  /// If non-null, reference to a deferred library that a subsequent getter is
+  /// using.
+  ir.DeferredImport _deferredLibrary;
+
   KernelVisitor(this.currentElement, this.elements, this.kernel);
 
   KernelVisitor get sendVisitor => this;
@@ -363,7 +375,15 @@
   }
 
   @override
-  void previsitDeferredAccess(Send node, PrefixElement prefix, _) {}
+  void previsitDeferredAccess(Send node, PrefixElement prefix, _) {
+    // This is visited before any element access, and if it is deferred,
+    // prefix.isDeferred = true.
+    if (prefix != null && prefix.isDeferred) {
+      _deferredLibrary = getDeferredImport(prefix);
+    } else {
+      _deferredLibrary = null;
+    }
+  }
 
   @override
   internalError(Spannable spannable, String message) {
@@ -1204,9 +1224,12 @@
   }
 
   @override
-  ir.TypeLiteral visitClassTypeLiteralGet(
+  ir.Expression visitClassTypeLiteralGet(
       Send node, ConstantExpression constant, _) {
-    return buildTypeLiteral(constant);
+    var loadedCheckFunc =
+        _createCheckLibraryLoadedFuncIfNeeded(_deferredLibrary);
+    _deferredLibrary = null;
+    return loadedCheckFunc(buildTypeLiteral(constant));
   }
 
   @override
@@ -1994,7 +2017,10 @@
   }
 
   ir.Expression buildStaticGet(Element element) {
-    return buildStaticAccessor(element).buildSimpleRead();
+    var loadedCheckFunc =
+        _createCheckLibraryLoadedFuncIfNeeded(_deferredLibrary);
+    _deferredLibrary = null;
+    return loadedCheckFunc(buildStaticAccessor(element).buildSimpleRead());
   }
 
   @override
@@ -2206,14 +2232,13 @@
   }
 
   @override
-  ir.StaticInvocation handleStaticFunctionInvoke(
-      Send node,
-      MethodElement function,
-      NodeList arguments,
-      CallStructure callStructure,
-      _) {
-    return associateNode(
-        buildStaticInvoke(function, arguments, isConst: false), node);
+  ir.Expression handleStaticFunctionInvoke(Send node, MethodElement function,
+      NodeList arguments, CallStructure callStructure, _) {
+    var loadedCheckFunc =
+        _createCheckLibraryLoadedFuncIfNeeded(_deferredLibrary);
+    _deferredLibrary = null;
+    return loadedCheckFunc(associateNode(
+        buildStaticInvoke(function, arguments, isConst: false), node));
   }
 
   @override
@@ -2229,24 +2254,36 @@
     return buildIrFunction(ir.ProcedureKind.Getter, getter, body);
   }
 
+  ir.DeferredImport getDeferredImport(PrefixElement prefix) {
+    var map = deferredImports[prefix.deferredImport.importedLibrary] ??=
+        <String, ir.DeferredImport>{};
+    return map[prefix.name] ??= associateElement(
+        new ir.DeferredImport(
+            kernel.libraries[prefix.deferredImport.importedLibrary],
+            prefix.name),
+        prefix);
+  }
+
   @override
   ir.Expression handleStaticGetterGet(Send node, FunctionElement getter, _) {
     if (getter.isDeferredLoaderGetter) {
-      // TODO(ahe): Support deferred load.
-      return new ir.InvalidExpression();
+      return new ir.LoadLibrary(getDeferredImport(getter.enclosingElement));
     }
-    return buildStaticGet(getter);
+    var expression = buildStaticGet(getter);
+    return expression;
   }
 
   @override
   ir.Expression handleStaticGetterInvoke(Send node, FunctionElement getter,
       NodeList arguments, CallStructure callStructure, _) {
+    var expression;
     if (getter.isDeferredLoaderGetter) {
-      // TODO(ahe): Support deferred load.
-      return new ir.InvalidExpression();
+      expression =
+          new ir.LoadLibrary(getDeferredImport(getter.enclosingElement));
+    } else {
+      expression = buildStaticGet(getter);
     }
-    return associateNode(
-        buildCall(buildStaticGet(getter), callStructure, arguments), node);
+    return associateNode(buildCall(expression, callStructure, arguments), node);
   }
 
   @override
@@ -2675,10 +2712,27 @@
     return buildIrFunction(ir.ProcedureKind.Setter, setter, body);
   }
 
+  /// Return a function that accepts an expression and returns an expression. If
+  /// deferredImport is null, then the function returned is the identity
+  /// expression. Otherwise, it inserts a CheckLibraryIsLoaded call before
+  /// evaluating the expression.
+  _createCheckLibraryLoadedFuncIfNeeded(ir.DeferredImport deferredImport) {
+    if (deferredImport != null) {
+      return (ir.Expression inputExpression) => new ir.Let(
+          makeOrReuseVariable(new ir.CheckLibraryIsLoaded(deferredImport)),
+          inputExpression);
+    } else {
+      return (ir.Expression expr) => expr;
+    }
+  }
+
   @override
-  ir.TypeLiteral visitTypeVariableTypeLiteralGet(
+  ir.Expression visitTypeVariableTypeLiteralGet(
       Send node, TypeVariableElement element, _) {
-    return buildTypeVariable(element);
+    var loadedCheckFunc =
+        _createCheckLibraryLoadedFuncIfNeeded(_deferredLibrary);
+    _deferredLibrary = null;
+    return loadedCheckFunc(buildTypeVariable(element));
   }
 
   @override
@@ -2707,9 +2761,12 @@
   }
 
   @override
-  ir.TypeLiteral visitTypedefTypeLiteralGet(
+  ir.Expression visitTypedefTypeLiteralGet(
       Send node, ConstantExpression constant, _) {
-    return buildTypeLiteral(constant);
+    var loadedCheckFunc =
+        _createCheckLibraryLoadedFuncIfNeeded(_deferredLibrary);
+    _deferredLibrary = null;
+    return loadedCheckFunc(buildTypeLiteral(constant));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/task.dart b/pkg/compiler/lib/src/kernel/task.dart
index 42f439b..6b0cfdb 100644
--- a/pkg/compiler/lib/src/kernel/task.dart
+++ b/pkg/compiler/lib/src/kernel/task.dart
@@ -37,8 +37,11 @@
   ///
   /// May enqueue more elements to the resolution queue.
   ir.Program buildProgram(LibraryElement library) {
+    var main = library.findExported(Identifiers.main);
+    if (main == null) {
+      main = _compiler.backend.helperForMissingMain();
+    }
     return new ir.Program(kernel.libraryDependencies(library.canonicalUri))
-      ..mainMethod =
-          kernel.functionToIr(library.findExported(Identifiers.main));
+      ..mainMethod = kernel.functionToIr(main);
   }
 }
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 9bbfb8d..bdbc238 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -4,6 +4,9 @@
 
 library dart2js.serialization;
 
+import 'package:front_end/src/fasta/scanner/precedence.dart' show
+    PrecedenceInfo;
+
 import '../common.dart';
 import '../common/resolution.dart';
 import '../constants/expressions.dart';
@@ -20,6 +23,16 @@
 
 export 'task.dart' show LibraryDeserializer;
 
+final Map<String, String> canonicalNames = computeCanonicalNames();
+
+Map<String, String> computeCanonicalNames() {
+  Map<String, String> result = <String, String>{};
+  for (PrecedenceInfo info in PrecedenceInfo.all) {
+    result[info.value] = info.value;
+  }
+  return result;
+}
+
 /// An object that supports the encoding an [ObjectValue] for serialization.
 ///
 /// The [ObjectEncoder] ensures that nominality and circularities of
@@ -471,7 +484,7 @@
       }
       throw new StateError("String value '$key' not found in $_map.");
     }
-    return value;
+    return canonicalNames[value] ?? value;
   }
 
   /// Returns the list of [String] values associated with [key] in the decoded
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 974f561..87e8380 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -593,6 +593,31 @@
   }
 
   @override
+  void visitCheckLibraryIsLoaded(ir.CheckLibraryIsLoaded checkLoad) {
+    HInstruction prefixConstant = graph.addConstantString(
+        new DartString.literal(checkLoad.import.name), closedWorld);
+    var prefixElement = astAdapter.getElement(checkLoad.import);
+    HInstruction uriConstant = graph.addConstantString(
+        new DartString.literal(prefixElement.deferredImport.uri.toString()),
+        closedWorld);
+    _pushStaticInvocation(astAdapter.checkDeferredIsLoaded,
+        [prefixConstant, uriConstant], astAdapter.checkDeferredIsLoadedType);
+  }
+
+  @override
+  void visitLoadLibrary(ir.LoadLibrary loadLibrary) {
+    // TODO(efortuna): Source information!
+    push(new HInvokeStatic(
+        backend.helpers.loadLibraryWrapper,
+        [
+          graph.addConstantString(
+              new DartString.literal(loadLibrary.import.name), closedWorld)
+        ],
+        commonMasks.nonNullType,
+        targetCanThrow: false));
+  }
+
+  @override
   void visitBlock(ir.Block block) {
     assert(!isAborted());
     for (ir.Statement statement in block.statements) {
@@ -1830,8 +1855,9 @@
       // Invoke the getter
       _pushStaticInvocation(staticTarget, const <HInstruction>[],
           astAdapter.returnTypeOf(staticTarget));
-    } else if (staticTarget is ir.Field && staticTarget.isConst) {
-      assert(staticTarget.initializer != null);
+    } else if (staticTarget is ir.Field &&
+        (staticTarget.isConst ||
+            staticTarget.isFinal && !_isLazyStatic(staticTarget))) {
       stack.add(graph.addConstant(
           astAdapter.getConstantFor(staticTarget.initializer), closedWorld));
     } else {
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index e0f85cc..c12d7c4 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -355,6 +355,13 @@
     });
   }
 
+  ir.Procedure get checkDeferredIsLoaded =>
+      kernel.functions[_backend.helpers.checkDeferredIsLoaded];
+
+  TypeMask get checkDeferredIsLoadedType =>
+      TypeMaskFactory.inferredReturnTypeForElement(
+          _backend.helpers.checkDeferredIsLoaded, _globalInferenceResults);
+
   ir.Procedure get createInvocationMirror =>
       kernel.functions[_backend.helpers.createInvocationMirror];
 
diff --git a/pkg/dev_compiler/USAGE.md b/pkg/dev_compiler/USAGE.md
index dcdce9a..ccdf8aa 100644
--- a/pkg/dev_compiler/USAGE.md
+++ b/pkg/dev_compiler/USAGE.md
@@ -10,7 +10,7 @@
 The following instructions are in a state of flux -- please expect them to
 change. If you find issues, please let us know.
 
-1.  Clone the [DDC repository](https://github.com/dart-lang/sdk) and
+1.  Follow the [Getting the Source](https://github.com/dart-lang/sdk/wiki/Building#getting-the-source) steps, and
     set the environment variable `DDC_PATH` to the `pkg/dev_compiler`
     subdirectory within wherever you check that out.
 
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index b6da6fe..6daca3e 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -2624,7 +2624,8 @@
         window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
       }
     }
-    return typeof window == "undefined" ? global : window;
+    var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {};
+    return globalState;
   })();
   dart.JsSymbol = Symbol;
   dart._mixins = Symbol("mixins");
@@ -19094,12 +19095,14 @@
           return completer.future;
         };
       }
-      static forEach(input, f) {
-        let iterator = input[dartx.iterator];
-        return async.Future.doWhile(dart.fn(() => {
-          if (!dart.test(iterator.moveNext())) return false;
-          return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
-        }, VoidToObject$()));
+      static forEach(T) {
+        return (input, f) => {
+          let iterator = input[dartx.iterator];
+          return async.Future.doWhile(dart.fn(() => {
+            if (!dart.test(iterator.moveNext())) return false;
+            return async.Future.sync(dart.fn(() => f(iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
+          }, VoidToObject$()));
+        };
       }
       static doWhile(f) {
         let doneSignal = new async._Future();
@@ -19129,7 +19132,7 @@
       statics: () => ({
         wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
         any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
-        forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
+        forEach: dart.definiteFunctionType(T => [async.Future, [core.Iterable$(T), dart.functionType(dart.dynamic, [T])]]),
         doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
       }),
       names: ['wait', 'any', 'forEach', 'doWhile']
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 674993a..4c51d02 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -1,4430 +1,6635 @@
-(function() {
-  'use strict';
-  const dart = Object.create(null);
-  const dartx = Object.create(null);
-  const _debugger = Object.create(null);
-  const _foreign_helper = Object.create(null);
-  const _interceptors = Object.create(null);
-  const _internal = Object.create(null);
-  const _isolate_helper = Object.create(null);
-  const _js_embedded_names = Object.create(null);
-  const _js_helper = Object.create(null);
-  const _js_mirrors = Object.create(null);
-  const _js_primitives = Object.create(null);
-  const _metadata = Object.create(null);
-  const _native_typed_data = Object.create(null);
-  const async = Object.create(null);
-  const collection = Object.create(null);
-  const convert = Object.create(null);
-  const core = Object.create(null);
-  const developer = Object.create(null);
-  const io = Object.create(null);
-  const isolate = Object.create(null);
-  const js = Object.create(null);
-  const js_util = Object.create(null);
-  const math = Object.create(null);
-  const mirrors = Object.create(null);
-  const typed_data = Object.create(null);
-  const indexed_db = Object.create(null);
-  const html$ = Object.create(null);
-  const html_common = Object.create(null);
-  const svg$ = Object.create(null);
-  const web_audio = Object.create(null);
-  const web_gl = Object.create(null);
-  const web_sql = Object.create(null);
-  let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
-  let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
-  let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
-  let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
-  let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
-  let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
-  let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
-  let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
-  let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
-  let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
-  let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
-  let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
-  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
-  let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
-  let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
-  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
-  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
-  let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
-  let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
-  let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
-  let JSMutableArray = () => (JSMutableArray = dart.constFn(_interceptors.JSMutableArray$()))();
-  let JSFixedArray = () => (JSFixedArray = dart.constFn(_interceptors.JSFixedArray$()))();
-  let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
-  let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
-  let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
-  let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
-  let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
-  let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
-  let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
-  let StringTonum = () => (StringTonum = dart.constFn(dart.functionType(core.num, [core.String])))();
-  let StringTodouble = () => (StringTodouble = dart.constFn(dart.functionType(core.double, [core.String])))();
-  let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.functionType(core.bool, [dart.dynamic])))();
-  let ListMixin = () => (ListMixin = dart.constFn(collection.ListMixin$()))();
-  let ListBase = () => (ListBase = dart.constFn(collection.ListBase$()))();
-  let UnmodifiableListMixin = () => (UnmodifiableListMixin = dart.constFn(_internal.UnmodifiableListMixin$()))();
-  let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
-  let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
-  let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
-  let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
-  let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
-  let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
-  let _Transformation = () => (_Transformation = dart.constFn(_internal._Transformation$()))();
-  let MappedIterable = () => (MappedIterable = dart.constFn(_internal.MappedIterable$()))();
-  let EfficientLengthMappedIterable = () => (EfficientLengthMappedIterable = dart.constFn(_internal.EfficientLengthMappedIterable$()))();
-  let Iterator = () => (Iterator = dart.constFn(core.Iterator$()))();
-  let MappedIterator = () => (MappedIterator = dart.constFn(_internal.MappedIterator$()))();
-  let MappedListIterable = () => (MappedListIterable = dart.constFn(_internal.MappedListIterable$()))();
-  let _ElementPredicate = () => (_ElementPredicate = dart.constFn(_internal._ElementPredicate$()))();
-  let WhereIterable = () => (WhereIterable = dart.constFn(_internal.WhereIterable$()))();
-  let WhereIterator = () => (WhereIterator = dart.constFn(_internal.WhereIterator$()))();
-  let _ExpandFunction = () => (_ExpandFunction = dart.constFn(_internal._ExpandFunction$()))();
-  let ExpandIterable = () => (ExpandIterable = dart.constFn(_internal.ExpandIterable$()))();
-  let ExpandIterator = () => (ExpandIterator = dart.constFn(_internal.ExpandIterator$()))();
-  let TakeIterable = () => (TakeIterable = dart.constFn(_internal.TakeIterable$()))();
-  let EfficientLengthTakeIterable = () => (EfficientLengthTakeIterable = dart.constFn(_internal.EfficientLengthTakeIterable$()))();
-  let TakeIterator = () => (TakeIterator = dart.constFn(_internal.TakeIterator$()))();
-  let TakeWhileIterable = () => (TakeWhileIterable = dart.constFn(_internal.TakeWhileIterable$()))();
-  let TakeWhileIterator = () => (TakeWhileIterator = dart.constFn(_internal.TakeWhileIterator$()))();
-  let SkipIterable = () => (SkipIterable = dart.constFn(_internal.SkipIterable$()))();
-  let EfficientLengthSkipIterable = () => (EfficientLengthSkipIterable = dart.constFn(_internal.EfficientLengthSkipIterable$()))();
-  let SkipIterator = () => (SkipIterator = dart.constFn(_internal.SkipIterator$()))();
-  let SkipWhileIterable = () => (SkipWhileIterable = dart.constFn(_internal.SkipWhileIterable$()))();
-  let SkipWhileIterator = () => (SkipWhileIterator = dart.constFn(_internal.SkipWhileIterator$()))();
-  let EmptyIterable = () => (EmptyIterable = dart.constFn(_internal.EmptyIterable$()))();
-  let EmptyIterator = () => (EmptyIterator = dart.constFn(_internal.EmptyIterator$()))();
-  let FixedLengthListMixin = () => (FixedLengthListMixin = dart.constFn(_internal.FixedLengthListMixin$()))();
-  let FixedLengthListBase = () => (FixedLengthListBase = dart.constFn(_internal.FixedLengthListBase$()))();
-  let ListMapView = () => (ListMapView = dart.constFn(_internal.ListMapView$()))();
-  let ReversedListIterable = () => (ReversedListIterable = dart.constFn(_internal.ReversedListIterable$()))();
-  let MapOfint$_IsolateContext = () => (MapOfint$_IsolateContext = dart.constFn(core.Map$(core.int, _isolate_helper._IsolateContext)))();
-  let MapOfint$dynamic = () => (MapOfint$dynamic = dart.constFn(core.Map$(core.int, dart.dynamic)))();
-  let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
-  let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
-  let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
-  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
-  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
-  let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
-  let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
-  let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
-  let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic])))();
-  let StringTovoid = () => (StringTovoid = dart.constFn(dart.functionType(dart.void, [core.String])))();
-  let ExpandoOfint = () => (ExpandoOfint = dart.constFn(core.Expando$(core.int)))();
-  let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
-  let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
-  let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
-  let VoidToObject = () => (VoidToObject = dart.constFn(dart.functionType(core.Object, [])))();
-  let Stream = () => (Stream = dart.constFn(async.Stream$()))();
-  let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
-  let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.functionType(dart.void, [async.Timer])))();
-  let MapOfdynamic$int = () => (MapOfdynamic$int = dart.constFn(core.Map$(dart.dynamic, core.int)))();
-  let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic])))();
-  let InternalMap = () => (InternalMap = dart.constFn(_js_helper.InternalMap$()))();
-  let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
-  let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
-  let SyncIterator = () => (SyncIterator = dart.constFn(_js_helper.SyncIterator$()))();
-  let IterableBase = () => (IterableBase = dart.constFn(collection.IterableBase$()))();
-  let SyncIterable = () => (SyncIterable = dart.constFn(_js_helper.SyncIterable$()))();
-  let JsLinkedHashMap = () => (JsLinkedHashMap = dart.constFn(_js_helper.JsLinkedHashMap$()))();
-  let Es6LinkedHashMap = () => (Es6LinkedHashMap = dart.constFn(_js_helper.Es6LinkedHashMap$()))();
-  let LinkedHashMapCell = () => (LinkedHashMapCell = dart.constFn(_js_helper.LinkedHashMapCell$()))();
-  let LinkedHashMapKeyIterable = () => (LinkedHashMapKeyIterable = dart.constFn(_js_helper.LinkedHashMapKeyIterable$()))();
-  let LinkedHashMapKeyIterator = () => (LinkedHashMapKeyIterator = dart.constFn(_js_helper.LinkedHashMapKeyIterator$()))();
-  let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
-  let IterableOfMatch = () => (IterableOfMatch = dart.constFn(core.Iterable$(core.Match)))();
-  let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
-  let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
-  let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
-  let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
-  let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
-  let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
-  let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
-  let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
-  let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
-  let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
-  let JSArrayOfType = () => (JSArrayOfType = dart.constFn(_interceptors.JSArray$(core.Type)))();
-  let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
-  let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
-  let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
-  let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
-  let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
-  let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
-  let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
-  let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
-  let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
-  let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
-  let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
-  let ZoneBinaryCallbackOfdynamic$Object$StackTrace = () => (ZoneBinaryCallbackOfdynamic$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, core.Object, core.StackTrace)))();
-  let _BufferingStreamSubscription = () => (_BufferingStreamSubscription = dart.constFn(async._BufferingStreamSubscription$()))();
-  let _ControllerSubscription = () => (_ControllerSubscription = dart.constFn(async._ControllerSubscription$()))();
-  let _BroadcastSubscription = () => (_BroadcastSubscription = dart.constFn(async._BroadcastSubscription$()))();
-  let _BroadcastStreamController = () => (_BroadcastStreamController = dart.constFn(async._BroadcastStreamController$()))();
-  let _SyncBroadcastStreamController = () => (_SyncBroadcastStreamController = dart.constFn(async._SyncBroadcastStreamController$()))();
-  let _AsyncBroadcastStreamController = () => (_AsyncBroadcastStreamController = dart.constFn(async._AsyncBroadcastStreamController$()))();
-  let _AsBroadcastStreamController = () => (_AsBroadcastStreamController = dart.constFn(async._AsBroadcastStreamController$()))();
-  let _DoneSubscription = () => (_DoneSubscription = dart.constFn(async._DoneSubscription$()))();
-  let FutureOr = () => (FutureOr = dart.constFn(async.FutureOr$()))();
-  let dynamicToFutureOr = () => (dynamicToFutureOr = dart.constFn(dart.functionType(async.FutureOr, [dart.dynamic])))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
-  let Future = () => (Future = dart.constFn(async.Future$()))();
-  let Completer = () => (Completer = dart.constFn(async.Completer$()))();
-  let _FutureOnValue = () => (_FutureOnValue = dart.constFn(async._FutureOnValue$()))();
-  let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
-  let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
-  let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
-  let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
-  let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
-  let _Future = () => (_Future = dart.constFn(async._Future$()))();
-  let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
-  let EventSink = () => (EventSink = dart.constFn(async.EventSink$()))();
-  let StreamView = () => (StreamView = dart.constFn(async.StreamView$()))();
-  let StreamConsumer = () => (StreamConsumer = dart.constFn(async.StreamConsumer$()))();
-  let StreamSink = () => (StreamSink = dart.constFn(async.StreamSink$()))();
-  let StreamTransformer = () => (StreamTransformer = dart.constFn(async.StreamTransformer$()))();
-  let StreamIterator = () => (StreamIterator = dart.constFn(async.StreamIterator$()))();
-  let _ControllerEventSinkWrapper = () => (_ControllerEventSinkWrapper = dart.constFn(async._ControllerEventSinkWrapper$()))();
-  let StreamController = () => (StreamController = dart.constFn(async.StreamController$()))();
-  let SynchronousStreamController = () => (SynchronousStreamController = dart.constFn(async.SynchronousStreamController$()))();
-  let _StreamControllerLifecycle = () => (_StreamControllerLifecycle = dart.constFn(async._StreamControllerLifecycle$()))();
-  let _StreamController = () => (_StreamController = dart.constFn(async._StreamController$()))();
-  let _SyncStreamControllerDispatch = () => (_SyncStreamControllerDispatch = dart.constFn(async._SyncStreamControllerDispatch$()))();
-  let _AsyncStreamControllerDispatch = () => (_AsyncStreamControllerDispatch = dart.constFn(async._AsyncStreamControllerDispatch$()))();
-  let _AsyncStreamController = () => (_AsyncStreamController = dart.constFn(async._AsyncStreamController$()))();
-  let _SyncStreamController = () => (_SyncStreamController = dart.constFn(async._SyncStreamController$()))();
-  let _StreamSinkWrapper = () => (_StreamSinkWrapper = dart.constFn(async._StreamSinkWrapper$()))();
-  let _AddStreamState = () => (_AddStreamState = dart.constFn(async._AddStreamState$()))();
-  let _StreamControllerAddStreamState = () => (_StreamControllerAddStreamState = dart.constFn(async._StreamControllerAddStreamState$()))();
-  let _EventSink = () => (_EventSink = dart.constFn(async._EventSink$()))();
-  let _EventDispatch = () => (_EventDispatch = dart.constFn(async._EventDispatch$()))();
-  let _EventGenerator = () => (_EventGenerator = dart.constFn(async._EventGenerator$()))();
-  let _GeneratedStreamImpl = () => (_GeneratedStreamImpl = dart.constFn(async._GeneratedStreamImpl$()))();
-  let _PendingEvents = () => (_PendingEvents = dart.constFn(async._PendingEvents$()))();
-  let _IterablePendingEvents = () => (_IterablePendingEvents = dart.constFn(async._IterablePendingEvents$()))();
-  let _DataHandler = () => (_DataHandler = dart.constFn(async._DataHandler$()))();
-  let _DelayedEvent = () => (_DelayedEvent = dart.constFn(async._DelayedEvent$()))();
-  let _DelayedData = () => (_DelayedData = dart.constFn(async._DelayedData$()))();
-  let _StreamImplEvents = () => (_StreamImplEvents = dart.constFn(async._StreamImplEvents$()))();
-  let _BroadcastCallback = () => (_BroadcastCallback = dart.constFn(async._BroadcastCallback$()))();
-  let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
-  let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
-  let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
-  let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
-  let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
-  let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
-  let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
-  let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
-  let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
-  let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
-  let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
-  let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
-  let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
-  let _TakeStream = () => (_TakeStream = dart.constFn(async._TakeStream$()))();
-  let _StateStreamSubscription = () => (_StateStreamSubscription = dart.constFn(async._StateStreamSubscription$()))();
-  let _TakeWhileStream = () => (_TakeWhileStream = dart.constFn(async._TakeWhileStream$()))();
-  let _SkipStream = () => (_SkipStream = dart.constFn(async._SkipStream$()))();
-  let _SkipWhileStream = () => (_SkipWhileStream = dart.constFn(async._SkipWhileStream$()))();
-  let _Equality = () => (_Equality = dart.constFn(async._Equality$()))();
-  let _DistinctStream = () => (_DistinctStream = dart.constFn(async._DistinctStream$()))();
-  let _EventSinkWrapper = () => (_EventSinkWrapper = dart.constFn(async._EventSinkWrapper$()))();
-  let _SinkTransformerStreamSubscription = () => (_SinkTransformerStreamSubscription = dart.constFn(async._SinkTransformerStreamSubscription$()))();
-  let _SinkMapper = () => (_SinkMapper = dart.constFn(async._SinkMapper$()))();
-  let _StreamSinkTransformer = () => (_StreamSinkTransformer = dart.constFn(async._StreamSinkTransformer$()))();
-  let _BoundSinkStream = () => (_BoundSinkStream = dart.constFn(async._BoundSinkStream$()))();
-  let _TransformDataHandler = () => (_TransformDataHandler = dart.constFn(async._TransformDataHandler$()))();
-  let _TransformErrorHandler = () => (_TransformErrorHandler = dart.constFn(async._TransformErrorHandler$()))();
-  let _TransformDoneHandler = () => (_TransformDoneHandler = dart.constFn(async._TransformDoneHandler$()))();
-  let _HandlerEventSink = () => (_HandlerEventSink = dart.constFn(async._HandlerEventSink$()))();
-  let _StreamHandlerTransformer = () => (_StreamHandlerTransformer = dart.constFn(async._StreamHandlerTransformer$()))();
-  let _SubscriptionTransformer = () => (_SubscriptionTransformer = dart.constFn(async._SubscriptionTransformer$()))();
-  let _StreamSubscriptionTransformer = () => (_StreamSubscriptionTransformer = dart.constFn(async._StreamSubscriptionTransformer$()))();
-  let _BoundSubscriptionStream = () => (_BoundSubscriptionStream = dart.constFn(async._BoundSubscriptionStream$()))();
-  let ZoneCallback = () => (ZoneCallback = dart.constFn(async.ZoneCallback$()))();
-  let ZoneUnaryCallback = () => (ZoneUnaryCallback = dart.constFn(async.ZoneUnaryCallback$()))();
-  let ZoneBinaryCallback = () => (ZoneBinaryCallback = dart.constFn(async.ZoneBinaryCallback$()))();
-  let HandleUncaughtErrorHandler = () => (HandleUncaughtErrorHandler = dart.constFn(async.HandleUncaughtErrorHandler$()))();
-  let RunHandler = () => (RunHandler = dart.constFn(async.RunHandler$()))();
-  let RunUnaryHandler = () => (RunUnaryHandler = dart.constFn(async.RunUnaryHandler$()))();
-  let RunBinaryHandler = () => (RunBinaryHandler = dart.constFn(async.RunBinaryHandler$()))();
-  let RegisterCallbackHandler = () => (RegisterCallbackHandler = dart.constFn(async.RegisterCallbackHandler$()))();
-  let RegisterUnaryCallbackHandler = () => (RegisterUnaryCallbackHandler = dart.constFn(async.RegisterUnaryCallbackHandler$()))();
-  let RegisterBinaryCallbackHandler = () => (RegisterBinaryCallbackHandler = dart.constFn(async.RegisterBinaryCallbackHandler$()))();
-  let _ZoneFunction = () => (_ZoneFunction = dart.constFn(async._ZoneFunction$()))();
-  let _ZoneFunctionOfRunHandler = () => (_ZoneFunctionOfRunHandler = dart.constFn(async._ZoneFunction$(async.RunHandler)))();
-  let _ZoneFunctionOfRunUnaryHandler = () => (_ZoneFunctionOfRunUnaryHandler = dart.constFn(async._ZoneFunction$(async.RunUnaryHandler)))();
-  let _ZoneFunctionOfRunBinaryHandler = () => (_ZoneFunctionOfRunBinaryHandler = dart.constFn(async._ZoneFunction$(async.RunBinaryHandler)))();
-  let _ZoneFunctionOfRegisterCallbackHandler = () => (_ZoneFunctionOfRegisterCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterCallbackHandler)))();
-  let _ZoneFunctionOfRegisterUnaryCallbackHandler = () => (_ZoneFunctionOfRegisterUnaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterUnaryCallbackHandler)))();
-  let _ZoneFunctionOfRegisterBinaryCallbackHandler = () => (_ZoneFunctionOfRegisterBinaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterBinaryCallbackHandler)))();
-  let _ZoneFunctionOfErrorCallbackHandler = () => (_ZoneFunctionOfErrorCallbackHandler = dart.constFn(async._ZoneFunction$(async.ErrorCallbackHandler)))();
-  let _ZoneFunctionOfScheduleMicrotaskHandler = () => (_ZoneFunctionOfScheduleMicrotaskHandler = dart.constFn(async._ZoneFunction$(async.ScheduleMicrotaskHandler)))();
-  let _ZoneFunctionOfCreateTimerHandler = () => (_ZoneFunctionOfCreateTimerHandler = dart.constFn(async._ZoneFunction$(async.CreateTimerHandler)))();
-  let _ZoneFunctionOfCreatePeriodicTimerHandler = () => (_ZoneFunctionOfCreatePeriodicTimerHandler = dart.constFn(async._ZoneFunction$(async.CreatePeriodicTimerHandler)))();
-  let _ZoneFunctionOfPrintHandler = () => (_ZoneFunctionOfPrintHandler = dart.constFn(async._ZoneFunction$(async.PrintHandler)))();
-  let _ZoneFunctionOfForkHandler = () => (_ZoneFunctionOfForkHandler = dart.constFn(async._ZoneFunction$(async.ForkHandler)))();
-  let _ZoneFunctionOfHandleUncaughtErrorHandler = () => (_ZoneFunctionOfHandleUncaughtErrorHandler = dart.constFn(async._ZoneFunction$(async.HandleUncaughtErrorHandler)))();
-  let _HashMap = () => (_HashMap = dart.constFn(collection._HashMap$()))();
-  let _IdentityHashMap = () => (_IdentityHashMap = dart.constFn(collection._IdentityHashMap$()))();
-  let _PredicateOfObject = () => (_PredicateOfObject = dart.constFn(collection._Predicate$(core.Object)))();
-  let _CustomHashMap = () => (_CustomHashMap = dart.constFn(collection._CustomHashMap$()))();
-  let _HashMapKeyIterable = () => (_HashMapKeyIterable = dart.constFn(collection._HashMapKeyIterable$()))();
-  let _HashMapKeyIterator = () => (_HashMapKeyIterator = dart.constFn(collection._HashMapKeyIterator$()))();
-  let _LinkedIdentityHashMap = () => (_LinkedIdentityHashMap = dart.constFn(collection._LinkedIdentityHashMap$()))();
-  let _Es6LinkedIdentityHashMap = () => (_Es6LinkedIdentityHashMap = dart.constFn(collection._Es6LinkedIdentityHashMap$()))();
-  let _Es6MapIterable = () => (_Es6MapIterable = dart.constFn(collection._Es6MapIterable$()))();
-  let _Es6MapIterator = () => (_Es6MapIterator = dart.constFn(collection._Es6MapIterator$()))();
-  let _LinkedCustomHashMap = () => (_LinkedCustomHashMap = dart.constFn(collection._LinkedCustomHashMap$()))();
-  let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
-  let SetOfObject = () => (SetOfObject = dart.constFn(core.Set$(core.Object)))();
-  let SetMixin = () => (SetMixin = dart.constFn(collection.SetMixin$()))();
-  let SetBase = () => (SetBase = dart.constFn(collection.SetBase$()))();
-  let _HashSetBase = () => (_HashSetBase = dart.constFn(collection._HashSetBase$()))();
-  let _HashSet = () => (_HashSet = dart.constFn(collection._HashSet$()))();
-  let _IdentityHashSet = () => (_IdentityHashSet = dart.constFn(collection._IdentityHashSet$()))();
-  let _CustomHashSet = () => (_CustomHashSet = dart.constFn(collection._CustomHashSet$()))();
-  let _HashSetIterator = () => (_HashSetIterator = dart.constFn(collection._HashSetIterator$()))();
-  let _LinkedHashSet = () => (_LinkedHashSet = dart.constFn(collection._LinkedHashSet$()))();
-  let _LinkedIdentityHashSet = () => (_LinkedIdentityHashSet = dart.constFn(collection._LinkedIdentityHashSet$()))();
-  let _LinkedCustomHashSet = () => (_LinkedCustomHashSet = dart.constFn(collection._LinkedCustomHashSet$()))();
-  let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
-  let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
-  let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
-  let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
-  let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
-  let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
-  let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
-  let IterableMixin = () => (IterableMixin = dart.constFn(collection.IterableMixin$()))();
-  let HasNextIterator = () => (HasNextIterator = dart.constFn(collection.HasNextIterator$()))();
-  let LinkedHashMap = () => (LinkedHashMap = dart.constFn(collection.LinkedHashMap$()))();
-  let LinkedHashSet = () => (LinkedHashSet = dart.constFn(collection.LinkedHashSet$()))();
-  let LinkedList = () => (LinkedList = dart.constFn(collection.LinkedList$()))();
-  let _LinkedListIterator = () => (_LinkedListIterator = dart.constFn(collection._LinkedListIterator$()))();
-  let LinkedListEntry = () => (LinkedListEntry = dart.constFn(collection.LinkedListEntry$()))();
-  let MapMixin = () => (MapMixin = dart.constFn(collection.MapMixin$()))();
-  let MapBase = () => (MapBase = dart.constFn(collection.MapBase$()))();
-  let _UnmodifiableMapMixin = () => (_UnmodifiableMapMixin = dart.constFn(collection._UnmodifiableMapMixin$()))();
-  let UnmodifiableMapBase = () => (UnmodifiableMapBase = dart.constFn(collection.UnmodifiableMapBase$()))();
-  let _MapBaseValueIterable = () => (_MapBaseValueIterable = dart.constFn(collection._MapBaseValueIterable$()))();
-  let _MapBaseValueIterator = () => (_MapBaseValueIterator = dart.constFn(collection._MapBaseValueIterator$()))();
-  let MapView = () => (MapView = dart.constFn(collection.MapView$()))();
-  let UnmodifiableMapView = () => (UnmodifiableMapView = dart.constFn(collection.UnmodifiableMapView$()))();
-  let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic, dart.dynamic])))();
-  let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
-  let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
-  let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
-  let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
-  let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
-  let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
-  let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
-  let DoubleLinkedQueue = () => (DoubleLinkedQueue = dart.constFn(collection.DoubleLinkedQueue$()))();
-  let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
-  let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
-  let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
-  let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
-  let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
-  let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
-  let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
-  let _TypeTest = () => (_TypeTest = dart.constFn(collection._TypeTest$()))();
-  let SplayTreeMap = () => (SplayTreeMap = dart.constFn(collection.SplayTreeMap$()))();
-  let _SplayTreeIterator = () => (_SplayTreeIterator = dart.constFn(collection._SplayTreeIterator$()))();
-  let _SplayTreeKeyIterable = () => (_SplayTreeKeyIterable = dart.constFn(collection._SplayTreeKeyIterable$()))();
-  let _SplayTreeValueIterable = () => (_SplayTreeValueIterable = dart.constFn(collection._SplayTreeValueIterable$()))();
-  let _SplayTreeKeyIterator = () => (_SplayTreeKeyIterator = dart.constFn(collection._SplayTreeKeyIterator$()))();
-  let _SplayTreeValueIterator = () => (_SplayTreeValueIterator = dart.constFn(collection._SplayTreeValueIterator$()))();
-  let _SplayTreeNodeIterator = () => (_SplayTreeNodeIterator = dart.constFn(collection._SplayTreeNodeIterator$()))();
-  let SplayTreeSet = () => (SplayTreeSet = dart.constFn(collection.SplayTreeSet$()))();
-  let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
-  let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
-  let Codec = () => (Codec = dart.constFn(convert.Codec$()))();
-  let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
-  let List = () => (List = dart.constFn(core.List$()))();
-  let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
-  let MapOfString$Encoding = () => (MapOfString$Encoding = dart.constFn(core.Map$(core.String, convert.Encoding)))();
-  let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
-  let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
-  let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
-  let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
-  let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
-  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.functionType(dart.void, [ListOfint()])))();
-  let _ChunkedConversionCallback = () => (_ChunkedConversionCallback = dart.constFn(convert._ChunkedConversionCallback$()))();
-  let ChunkedConverter = () => (ChunkedConverter = dart.constFn(convert.ChunkedConverter$()))();
-  let _SimpleCallbackSink = () => (_SimpleCallbackSink = dart.constFn(convert._SimpleCallbackSink$()))();
-  let _ConverterStreamEventSink = () => (_ConverterStreamEventSink = dart.constFn(convert._ConverterStreamEventSink$()))();
-  let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
-  let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
-  let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
-  let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
-  let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
-  let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
-  let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
-  let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
-  let Comparator = () => (Comparator = dart.constFn(core.Comparator$()))();
-  let Comparable = () => (Comparable = dart.constFn(core.Comparable$()))();
-  let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
-  let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
-  let Expando = () => (Expando = dart.constFn(core.Expando$()))();
-  let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
-  let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
-  let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
-  let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
-  let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
-  let Set = () => (Set = dart.constFn(core.Set$()))();
-  let Sink = () => (Sink = dart.constFn(core.Sink$()))();
-  let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
-  let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
-  let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
-  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
-  let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
-  let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
-  let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
-  let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
-  let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
-  let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
-  let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
-  let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
-  let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
-  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
-  let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
-  let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
-  let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
-  let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
-  let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
-  let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
-  let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
-  let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
-  let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
-  let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
-  let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
-  let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
-  let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
-  let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
-  let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
-  let ListOfFileSystemEntityType = () => (ListOfFileSystemEntityType = dart.constFn(core.List$(io.FileSystemEntityType)))();
-  let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
-  let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
-  let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
-  let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
-  let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
-  let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
-  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
-  let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
-  let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
-  let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
-  let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
-  let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
-  let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
-  let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
-  let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
-  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
-  let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
-  let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
-  let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
-  let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
-  let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
-  let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
-  let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(io._Credentials)))();
-  let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(io._ProxyCredentials)))();
-  let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(io._HttpClientRequest)))();
-  let FutureOrOf_HttpClientRequest = () => (FutureOrOf_HttpClientRequest = dart.constFn(async.FutureOr$(io._HttpClientRequest)))();
-  let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate, core.String, core.int])))();
-  let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
-  let UriAndStringAndStringToFutureOfbool = () => (UriAndStringAndStringToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.Uri, core.String, core.String])))();
-  let StringAndintAndString__ToFutureOfbool = () => (StringAndintAndString__ToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.String, core.int, core.String, core.String])))();
-  let UriToString = () => (UriToString = dart.constFn(dart.functionType(core.String, [core.Uri])))();
-  let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, io._ConnectionTarget)))();
-  let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(io._Credentials)))();
-  let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(io._ProxyCredentials)))();
-  let MapOfint$_HttpConnection = () => (MapOfint$_HttpConnection = dart.constFn(core.Map$(core.int, io._HttpConnection)))();
-  let HashMapOfint$_HttpConnection = () => (HashMapOfint$_HttpConnection = dart.constFn(collection.HashMap$(core.int, io._HttpConnection)))();
-  let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(io._HttpConnection)))();
-  let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(io.HttpRequest)))();
-  let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
-  let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
-  let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
-  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
-  let ListOfbool = () => (ListOfbool = dart.constFn(core.List$(core.bool)))();
-  let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
-  let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
-  let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
-  let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
-  let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
-  let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
-  let MapOfint$_FileResourceInfo = () => (MapOfint$_FileResourceInfo = dart.constFn(core.Map$(core.int, io._FileResourceInfo)))();
-  let MapOfint$_ProcessResourceInfo = () => (MapOfint$_ProcessResourceInfo = dart.constFn(core.Map$(core.int, io._ProcessResourceInfo)))();
-  let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
-  let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
-  let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
-  let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
-  let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
-  let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
-  let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
-  let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
-  let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
-  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
-  let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
-  let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
-  let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
-  let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
-  let X509CertificateTodynamic = () => (X509CertificateTodynamic = dart.constFn(dart.functionType(dart.dynamic, [io.X509Certificate])))();
-  let intToListOfint = () => (intToListOfint = dart.constFn(dart.functionType(ListOfint(), [core.int])))();
-  let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
-  let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
-  let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
-  let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
-  let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
-  let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
-  let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
-  let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
-  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
-  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
-  let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
-  let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
-  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
-  let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
-  let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
-  let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
-  let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
-  let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
-  let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
-  let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
-  let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
-  let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
-  let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
-  let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
-  let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
-  let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
-  let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
-  let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
-  let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
-  let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
-  let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
-  let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
-  let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
-  let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
-  let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
-  let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
-  let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
-  let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
-  let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
-  let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
-  let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
-  let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
-  let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
-  let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
-  let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
-  let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
-  let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
-  let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
-  let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
-  let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
-  let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
-  let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
-  let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
-  let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
-  let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
-  let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
-  let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
-  let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
-  let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
-  let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
-  let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
-  let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
-  let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
-  let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
-  let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
-  let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
-  let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
-  let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
-  let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
-  let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
-  let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
-  let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
-  let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
-  let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
-  let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
-  let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
-  let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
-  let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
-  let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
-  let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
-  let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
-  let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
-  let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
-  let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
-  let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
-  let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
-  let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
-  let _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html$._wrapZoneBinaryCallback$(ListOfMutationRecord(), html$.MutationObserver, dart.void)))();
-  let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
-  let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
-  let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
-  let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
-  let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
-  let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
-  let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
-  let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
-  let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
-  let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
-  let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
-  let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
-  let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
-  let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
-  let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
-  let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
-  let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
-  let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
-  let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
-  let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
-  let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
-  let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
-  let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
-  let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
-  let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
-  let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
-  let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
-  let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
-  let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
-  let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
-  let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
-  let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
-  let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
-  let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
-  let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
-  let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
-  let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
-  let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html$._EventStream$(html$.BeforeUnloadEvent)))();
-  let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
-  let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
-  let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
-  let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
-  let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
-  let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
-  let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
-  let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
-  let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
-  let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
-  let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
-  let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
-  let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
-  let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
-  let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
-  let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
-  let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
-  let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
-  let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
-  let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
-  let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
-  let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
-  let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
-  let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
-  let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
-  let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
-  let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
-  let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
-  let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
-  let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
-  let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
-  let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
-  let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
-  let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
-  let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
-  let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
-  let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
-  let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
-  let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
-  let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
-  let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
-  let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
-  let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
-  let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
-  let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
-  let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
-  let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
-  let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
-  let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
-  let VoidToFunctionType = () => (VoidToFunctionType = dart.constFn(dart.definiteFunctionType(dart.FunctionType, [])))();
-  let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
-  let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
-  let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
-  let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
-  let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
-  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
-  let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
-  let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
-  let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
-  let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
-  let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
-  let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
-  let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
-  let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
-  let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
-  let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
-  let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
-  let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
-  let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
-  let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
-  let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
-  let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
-  let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
-  let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
-  let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
-  let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
-  let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
-  let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
-  let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
-  let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
-  let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
-  let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
-  let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
-  let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
-  let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
-  let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
-  let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
-  let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
-  let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
-  let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
-  let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
-  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
-  let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
-  let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicAnddynamicTodynamic = () => (dynamicAnddynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let dynamicToArgumentError = () => (dynamicToArgumentError = dart.constFn(dart.definiteFunctionType(core.ArgumentError, [dart.dynamic])))();
-  let dynamicToStackTrace = () => (dynamicToStackTrace = dart.constFn(dart.definiteFunctionType(core.StackTrace, [dart.dynamic])))();
-  let dynamicToint = () => (dynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic])))();
-  let dynamicAndMapTodynamic = () => (dynamicAndMapTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Map])))();
-  let dynamicAndStringTodynamic = () => (dynamicAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])))();
-  let dynamicAndStringAnddynamicTovoid = () => (dynamicAndStringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, dart.dynamic])))();
-  let FAndintToF = () => (FAndintToF = dart.constFn(dart.definiteFunctionType(F => [F, [F, core.int]])))();
-  let JSSyntaxRegExpTodynamic = () => (JSSyntaxRegExpTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_js_helper.JSSyntaxRegExp])))();
-  let JSSyntaxRegExpToint = () => (JSSyntaxRegExpToint = dart.constFn(dart.definiteFunctionType(core.int, [_js_helper.JSSyntaxRegExp])))();
-  let JSSyntaxRegExpAndStringAndintToMatch = () => (JSSyntaxRegExpAndStringAndintToMatch = dart.constFn(dart.definiteFunctionType(core.Match, [_js_helper.JSSyntaxRegExp, core.String, core.int])))();
-  let dynamicAnddynamicAnddynamicToint = () => (dynamicAnddynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicAnddynamicToString = () => (dynamicAnddynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicAnddynamicTobool = () => (dynamicAnddynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let StringAndStringAndintToIterableOfMatch = () => (StringAndStringAndintToIterableOfMatch = dart.constFn(dart.definiteFunctionType(IterableOfMatch(), [core.String, core.String, core.int])))();
-  let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
-  let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
-  let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
-  let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
-  let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
-  let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
-  let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
-  let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
-  let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
-  let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
-  let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
-  let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
-  let SymbolToString = () => (SymbolToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Symbol])))();
-  let dynamicAnddynamicToSymbol = () => (dynamicAnddynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic, dart.dynamic])))();
-  let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [dart.dynamic])))();
-  let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
-  let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
-  let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
-  let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
-  let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
-  let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
-  let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
-  let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
-  let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
-  let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
-  let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
-  let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))();
-  let intAndListAndintTovoid = () => (intAndListAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.List, core.int])))();
-  let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
-  let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
-  let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
-  let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
-  let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
-  let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
-  let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
-  let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
-  let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
-  let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
-  let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
-  let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
-  let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
-  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
-  let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
-  let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
-  let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
-  let _EventSinkAnddynamicAnddynamicTovoid = () => (_EventSinkAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._EventSink, dart.dynamic, dart.dynamic])))();
-  let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
-  let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
-  let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
-  let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
-  let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
-  let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
-  let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
-  let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
-  let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
-  let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
-  let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
-  let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
-  let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
-  let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
-  let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
-  let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
-  let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
-  let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object])))();
-  let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
-  let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
-  let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
-  let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
-  let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
-  let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
-  let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
-  let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
-  let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
-  let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
-  let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
-  let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
-  let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
-  let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
-  let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
-  let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
-  let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
-  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
-  let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
-  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
-  let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
-  let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
-  let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
-  let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
-  let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
-  let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
-  let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
-  let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
-  let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
-  let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
-  let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
-  let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
-  let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
-  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
-  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
-  let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
-  let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
-  let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
-  let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
-  let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
-  let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.definiteFunctionType(io._Directory, [dart.dynamic])))();
-  let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.definiteFunctionType(io.Directory, [dart.dynamic])))();
-  let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
-  let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
-  let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
-  let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
-  let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
-  let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
-  let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
-  let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
-  let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
-  let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
-  let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
-  let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
-  let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
-  let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
-  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
-  let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
-  let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
-  let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
-  let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
-  let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
-  let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
-  let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
-  let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
-  let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
-  let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
-  let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
-  let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
-  let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [dart.dynamic])))();
-  let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [])))();
-  let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [])))();
-  let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.definiteFunctionType(io._Credentials, [io._AuthenticationScheme])))();
-  let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
-  let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
-  let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
-  let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
-  let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
-  let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
-  let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
-  let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
-  let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-  let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
-  let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
-  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
-  let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
-  let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
-  let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
-  let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
-  let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
-  let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
-  let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._ConnectionInfo])))();
-  let _ConnectionInfoToFutureOrOf_HttpClientRequest = () => (_ConnectionInfoToFutureOrOf_HttpClientRequest = dart.constFn(dart.definiteFunctionType(FutureOrOf_HttpClientRequest(), [io._ConnectionInfo])))();
-  let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._HttpClientRequest])))();
-  let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.definiteFunctionType(io._ConnectionTarget, [])))();
-  let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
-  let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
-  let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
-  let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
-  let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
-  let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
-  let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
-  let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
-  let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
-  let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
-  let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
-  let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
-  let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
-  let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.definiteFunctionType(io.Link, [dart.dynamic])))();
-  let DurationTovoid = () => (DurationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Duration])))();
-  let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
-  let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
-  let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
-  let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
-  let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
-  let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
-  let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
-  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
-  let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
-  let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
-  let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
-  let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
-  let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
-  let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
-  let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
-  let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
-  let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
-  let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
-  let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
-  let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
-  let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
-  let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
-  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
-  let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
-  let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
-  let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
-  let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
-  let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
-  let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
-  let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
-  let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
-  let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
-  let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
-  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T => [T, [T]])))();
-  let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [mirrors.LibraryMirror])))();
-  let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
-  let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
-  let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-  let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
-  let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
-  let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-  let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
-  let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
-  let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
-  let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-  let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
-  let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
-  let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
-  let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
-  let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
-  let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
-  let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
-  let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
-  let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
-  let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
-  let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
-  let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
-  let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
-  let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
-  let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
-  let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
-  let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
-  let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
-  let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
-  let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
-  let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
-  let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
-  let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
-  let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
-  let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
-  let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
-  let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
-  let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
-  let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
-  let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
-  let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
-  let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
-  let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
-  let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
-  let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
-  let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
-  let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
-  let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
-  let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
-  let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
-  let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
-  let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
-  let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
-  let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
-  let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
-  let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
-  let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
-  let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
-  let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
-  let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
-  let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
-  dart.mixin = function(base, ...mixins) {
-    class Mixin extends base {}
-    for (let m of mixins) {
-      dart.copyProperties(Mixin.prototype, m.prototype);
+'use strict';
+const dart = Object.create(null);
+const dartx = Object.create(null);
+const _debugger = Object.create(null);
+const _foreign_helper = Object.create(null);
+const _interceptors = Object.create(null);
+const _internal = Object.create(null);
+const _isolate_helper = Object.create(null);
+const _js_embedded_names = Object.create(null);
+const _js_helper = Object.create(null);
+const _js_mirrors = Object.create(null);
+const _js_primitives = Object.create(null);
+const _metadata = Object.create(null);
+const _native_typed_data = Object.create(null);
+const async = Object.create(null);
+const collection = Object.create(null);
+const convert = Object.create(null);
+const core = Object.create(null);
+const developer = Object.create(null);
+const io = Object.create(null);
+const isolate = Object.create(null);
+const js = Object.create(null);
+const js_util = Object.create(null);
+const math = Object.create(null);
+const mirrors = Object.create(null);
+const typed_data = Object.create(null);
+const indexed_db = Object.create(null);
+const html$ = Object.create(null);
+const html_common = Object.create(null);
+const svg$ = Object.create(null);
+const web_audio = Object.create(null);
+const web_gl = Object.create(null);
+const web_sql = Object.create(null);
+let ListOfObject = () => (ListOfObject = dart.constFn(core.List$(core.Object)))();
+let JSArrayOfListOfObject = () => (JSArrayOfListOfObject = dart.constFn(_interceptors.JSArray$(ListOfObject())))();
+let JSArrayOfObject = () => (JSArrayOfObject = dart.constFn(_interceptors.JSArray$(core.Object)))();
+let MapOfSymbol$dynamic = () => (MapOfSymbol$dynamic = dart.constFn(core.Map$(core.Symbol, dart.dynamic)))();
+let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
+let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
+let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
+let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
+let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
+let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
+let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
+let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
+let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
+let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
+let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
+let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
+let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
+let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
+let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
+let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
+let JSMutableArray = () => (JSMutableArray = dart.constFn(_interceptors.JSMutableArray$()))();
+let JSFixedArray = () => (JSFixedArray = dart.constFn(_interceptors.JSFixedArray$()))();
+let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
+let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
+let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
+let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
+let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
+let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
+let ComparableOfnum = () => (ComparableOfnum = dart.constFn(core.Comparable$(core.num)))();
+let StringTonum = () => (StringTonum = dart.constFn(dart.functionType(core.num, [core.String])))();
+let StringTodouble = () => (StringTodouble = dart.constFn(dart.functionType(core.double, [core.String])))();
+let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.functionType(core.bool, [dart.dynamic])))();
+let ListMixin = () => (ListMixin = dart.constFn(collection.ListMixin$()))();
+let ListBase = () => (ListBase = dart.constFn(collection.ListBase$()))();
+let UnmodifiableListMixin = () => (UnmodifiableListMixin = dart.constFn(_internal.UnmodifiableListMixin$()))();
+let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
+let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
+let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
+let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
+let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
+let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
+let _Transformation = () => (_Transformation = dart.constFn(_internal._Transformation$()))();
+let MappedIterable = () => (MappedIterable = dart.constFn(_internal.MappedIterable$()))();
+let EfficientLengthMappedIterable = () => (EfficientLengthMappedIterable = dart.constFn(_internal.EfficientLengthMappedIterable$()))();
+let Iterator = () => (Iterator = dart.constFn(core.Iterator$()))();
+let MappedIterator = () => (MappedIterator = dart.constFn(_internal.MappedIterator$()))();
+let MappedListIterable = () => (MappedListIterable = dart.constFn(_internal.MappedListIterable$()))();
+let _ElementPredicate = () => (_ElementPredicate = dart.constFn(_internal._ElementPredicate$()))();
+let WhereIterable = () => (WhereIterable = dart.constFn(_internal.WhereIterable$()))();
+let WhereIterator = () => (WhereIterator = dart.constFn(_internal.WhereIterator$()))();
+let _ExpandFunction = () => (_ExpandFunction = dart.constFn(_internal._ExpandFunction$()))();
+let ExpandIterable = () => (ExpandIterable = dart.constFn(_internal.ExpandIterable$()))();
+let ExpandIterator = () => (ExpandIterator = dart.constFn(_internal.ExpandIterator$()))();
+let TakeIterable = () => (TakeIterable = dart.constFn(_internal.TakeIterable$()))();
+let EfficientLengthTakeIterable = () => (EfficientLengthTakeIterable = dart.constFn(_internal.EfficientLengthTakeIterable$()))();
+let TakeIterator = () => (TakeIterator = dart.constFn(_internal.TakeIterator$()))();
+let TakeWhileIterable = () => (TakeWhileIterable = dart.constFn(_internal.TakeWhileIterable$()))();
+let TakeWhileIterator = () => (TakeWhileIterator = dart.constFn(_internal.TakeWhileIterator$()))();
+let SkipIterable = () => (SkipIterable = dart.constFn(_internal.SkipIterable$()))();
+let EfficientLengthSkipIterable = () => (EfficientLengthSkipIterable = dart.constFn(_internal.EfficientLengthSkipIterable$()))();
+let SkipIterator = () => (SkipIterator = dart.constFn(_internal.SkipIterator$()))();
+let SkipWhileIterable = () => (SkipWhileIterable = dart.constFn(_internal.SkipWhileIterable$()))();
+let SkipWhileIterator = () => (SkipWhileIterator = dart.constFn(_internal.SkipWhileIterator$()))();
+let EmptyIterable = () => (EmptyIterable = dart.constFn(_internal.EmptyIterable$()))();
+let EmptyIterator = () => (EmptyIterator = dart.constFn(_internal.EmptyIterator$()))();
+let FixedLengthListMixin = () => (FixedLengthListMixin = dart.constFn(_internal.FixedLengthListMixin$()))();
+let FixedLengthListBase = () => (FixedLengthListBase = dart.constFn(_internal.FixedLengthListBase$()))();
+let ListMapView = () => (ListMapView = dart.constFn(_internal.ListMapView$()))();
+let ReversedListIterable = () => (ReversedListIterable = dart.constFn(_internal.ReversedListIterable$()))();
+let MapOfint$_IsolateContext = () => (MapOfint$_IsolateContext = dart.constFn(core.Map$(core.int, _isolate_helper._IsolateContext)))();
+let MapOfint$dynamic = () => (MapOfint$dynamic = dart.constFn(core.Map$(core.int, dart.dynamic)))();
+let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
+let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
+let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
+let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
+let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
+let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
+let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
+let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
+let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic])))();
+let StringTovoid = () => (StringTovoid = dart.constFn(dart.functionType(dart.void, [core.String])))();
+let ExpandoOfint = () => (ExpandoOfint = dart.constFn(core.Expando$(core.int)))();
+let _FutureOfString = () => (_FutureOfString = dart.constFn(async._Future$(core.String)))();
+let _FutureOfbool = () => (_FutureOfbool = dart.constFn(async._Future$(core.bool)))();
+let _FutureOfint = () => (_FutureOfint = dart.constFn(async._Future$(core.int)))();
+let VoidToObject = () => (VoidToObject = dart.constFn(dart.functionType(core.Object, [])))();
+let Stream = () => (Stream = dart.constFn(async.Stream$()))();
+let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.functionType(dart.void, [])))();
+let TimerTovoid = () => (TimerTovoid = dart.constFn(dart.functionType(dart.void, [async.Timer])))();
+let MapOfdynamic$int = () => (MapOfdynamic$int = dart.constFn(core.Map$(dart.dynamic, core.int)))();
+let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic])))();
+let InternalMap = () => (InternalMap = dart.constFn(_js_helper.InternalMap$()))();
+let JSArrayOfint = () => (JSArrayOfint = dart.constFn(_interceptors.JSArray$(core.int)))();
+let ListOfint = () => (ListOfint = dart.constFn(core.List$(core.int)))();
+let SyncIterator = () => (SyncIterator = dart.constFn(_js_helper.SyncIterator$()))();
+let IterableBase = () => (IterableBase = dart.constFn(collection.IterableBase$()))();
+let SyncIterable = () => (SyncIterable = dart.constFn(_js_helper.SyncIterable$()))();
+let JsLinkedHashMap = () => (JsLinkedHashMap = dart.constFn(_js_helper.JsLinkedHashMap$()))();
+let Es6LinkedHashMap = () => (Es6LinkedHashMap = dart.constFn(_js_helper.Es6LinkedHashMap$()))();
+let LinkedHashMapCell = () => (LinkedHashMapCell = dart.constFn(_js_helper.LinkedHashMapCell$()))();
+let LinkedHashMapKeyIterable = () => (LinkedHashMapKeyIterable = dart.constFn(_js_helper.LinkedHashMapKeyIterable$()))();
+let LinkedHashMapKeyIterator = () => (LinkedHashMapKeyIterator = dart.constFn(_js_helper.LinkedHashMapKeyIterator$()))();
+let IteratorOfMatch = () => (IteratorOfMatch = dart.constFn(core.Iterator$(core.Match)))();
+let IterableOfMatch = () => (IterableOfMatch = dart.constFn(core.Iterable$(core.Match)))();
+let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
+let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
+let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
+let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
+let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
+let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
+let JSArrayOfClassMirror = () => (JSArrayOfClassMirror = dart.constFn(_interceptors.JSArray$(mirrors.ClassMirror)))();
+let ListOfClassMirror = () => (ListOfClassMirror = dart.constFn(core.List$(mirrors.ClassMirror)))();
+let ListOfTypeVariableMirror = () => (ListOfTypeVariableMirror = dart.constFn(core.List$(mirrors.TypeVariableMirror)))();
+let MapOfSymbol$MethodMirror = () => (MapOfSymbol$MethodMirror = dart.constFn(core.Map$(core.Symbol, mirrors.MethodMirror)))();
+let JSArrayOfType = () => (JSArrayOfType = dart.constFn(_interceptors.JSArray$(core.Type)))();
+let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
+let ListOfFloat32x4 = () => (ListOfFloat32x4 = dart.constFn(core.List$(typed_data.Float32x4)))();
+let ListOfInt32x4 = () => (ListOfInt32x4 = dart.constFn(core.List$(typed_data.Int32x4)))();
+let ListOfFloat64x2 = () => (ListOfFloat64x2 = dart.constFn(core.List$(typed_data.Float64x2)))();
+let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
+let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
+let ListOfdouble = () => (ListOfdouble = dart.constFn(core.List$(core.double)))();
+let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
+let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
+let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
+let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
+let ZoneBinaryCallbackOfdynamic$Object$StackTrace = () => (ZoneBinaryCallbackOfdynamic$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, core.Object, core.StackTrace)))();
+let _BufferingStreamSubscription = () => (_BufferingStreamSubscription = dart.constFn(async._BufferingStreamSubscription$()))();
+let _ControllerSubscription = () => (_ControllerSubscription = dart.constFn(async._ControllerSubscription$()))();
+let _BroadcastSubscription = () => (_BroadcastSubscription = dart.constFn(async._BroadcastSubscription$()))();
+let _BroadcastStreamController = () => (_BroadcastStreamController = dart.constFn(async._BroadcastStreamController$()))();
+let _SyncBroadcastStreamController = () => (_SyncBroadcastStreamController = dart.constFn(async._SyncBroadcastStreamController$()))();
+let _AsyncBroadcastStreamController = () => (_AsyncBroadcastStreamController = dart.constFn(async._AsyncBroadcastStreamController$()))();
+let _AsBroadcastStreamController = () => (_AsBroadcastStreamController = dart.constFn(async._AsBroadcastStreamController$()))();
+let _DoneSubscription = () => (_DoneSubscription = dart.constFn(async._DoneSubscription$()))();
+let FutureOr = () => (FutureOr = dart.constFn(async.FutureOr$()))();
+let dynamicToFutureOr = () => (dynamicToFutureOr = dart.constFn(dart.functionType(async.FutureOr, [dart.dynamic])))();
+let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.functionType(dart.dynamic, [])))();
+let Future = () => (Future = dart.constFn(async.Future$()))();
+let Completer = () => (Completer = dart.constFn(async.Completer$()))();
+let _FutureOnValue = () => (_FutureOnValue = dart.constFn(async._FutureOnValue$()))();
+let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
+let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
+let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
+let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
+let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
+let _Future = () => (_Future = dart.constFn(async._Future$()))();
+let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
+let EventSink = () => (EventSink = dart.constFn(async.EventSink$()))();
+let StreamView = () => (StreamView = dart.constFn(async.StreamView$()))();
+let StreamConsumer = () => (StreamConsumer = dart.constFn(async.StreamConsumer$()))();
+let StreamSink = () => (StreamSink = dart.constFn(async.StreamSink$()))();
+let StreamTransformer = () => (StreamTransformer = dart.constFn(async.StreamTransformer$()))();
+let StreamIterator = () => (StreamIterator = dart.constFn(async.StreamIterator$()))();
+let _ControllerEventSinkWrapper = () => (_ControllerEventSinkWrapper = dart.constFn(async._ControllerEventSinkWrapper$()))();
+let StreamController = () => (StreamController = dart.constFn(async.StreamController$()))();
+let SynchronousStreamController = () => (SynchronousStreamController = dart.constFn(async.SynchronousStreamController$()))();
+let _StreamControllerLifecycle = () => (_StreamControllerLifecycle = dart.constFn(async._StreamControllerLifecycle$()))();
+let _StreamController = () => (_StreamController = dart.constFn(async._StreamController$()))();
+let _SyncStreamControllerDispatch = () => (_SyncStreamControllerDispatch = dart.constFn(async._SyncStreamControllerDispatch$()))();
+let _AsyncStreamControllerDispatch = () => (_AsyncStreamControllerDispatch = dart.constFn(async._AsyncStreamControllerDispatch$()))();
+let _AsyncStreamController = () => (_AsyncStreamController = dart.constFn(async._AsyncStreamController$()))();
+let _SyncStreamController = () => (_SyncStreamController = dart.constFn(async._SyncStreamController$()))();
+let _StreamSinkWrapper = () => (_StreamSinkWrapper = dart.constFn(async._StreamSinkWrapper$()))();
+let _AddStreamState = () => (_AddStreamState = dart.constFn(async._AddStreamState$()))();
+let _StreamControllerAddStreamState = () => (_StreamControllerAddStreamState = dart.constFn(async._StreamControllerAddStreamState$()))();
+let _EventSink = () => (_EventSink = dart.constFn(async._EventSink$()))();
+let _EventDispatch = () => (_EventDispatch = dart.constFn(async._EventDispatch$()))();
+let _EventGenerator = () => (_EventGenerator = dart.constFn(async._EventGenerator$()))();
+let _GeneratedStreamImpl = () => (_GeneratedStreamImpl = dart.constFn(async._GeneratedStreamImpl$()))();
+let _PendingEvents = () => (_PendingEvents = dart.constFn(async._PendingEvents$()))();
+let _IterablePendingEvents = () => (_IterablePendingEvents = dart.constFn(async._IterablePendingEvents$()))();
+let _DataHandler = () => (_DataHandler = dart.constFn(async._DataHandler$()))();
+let _DelayedEvent = () => (_DelayedEvent = dart.constFn(async._DelayedEvent$()))();
+let _DelayedData = () => (_DelayedData = dart.constFn(async._DelayedData$()))();
+let _StreamImplEvents = () => (_StreamImplEvents = dart.constFn(async._StreamImplEvents$()))();
+let _BroadcastCallback = () => (_BroadcastCallback = dart.constFn(async._BroadcastCallback$()))();
+let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
+let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
+let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
+let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
+let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
+let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
+let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
+let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
+let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
+let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
+let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
+let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
+let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
+let _TakeStream = () => (_TakeStream = dart.constFn(async._TakeStream$()))();
+let _StateStreamSubscription = () => (_StateStreamSubscription = dart.constFn(async._StateStreamSubscription$()))();
+let _TakeWhileStream = () => (_TakeWhileStream = dart.constFn(async._TakeWhileStream$()))();
+let _SkipStream = () => (_SkipStream = dart.constFn(async._SkipStream$()))();
+let _SkipWhileStream = () => (_SkipWhileStream = dart.constFn(async._SkipWhileStream$()))();
+let _Equality = () => (_Equality = dart.constFn(async._Equality$()))();
+let _DistinctStream = () => (_DistinctStream = dart.constFn(async._DistinctStream$()))();
+let _EventSinkWrapper = () => (_EventSinkWrapper = dart.constFn(async._EventSinkWrapper$()))();
+let _SinkTransformerStreamSubscription = () => (_SinkTransformerStreamSubscription = dart.constFn(async._SinkTransformerStreamSubscription$()))();
+let _SinkMapper = () => (_SinkMapper = dart.constFn(async._SinkMapper$()))();
+let _StreamSinkTransformer = () => (_StreamSinkTransformer = dart.constFn(async._StreamSinkTransformer$()))();
+let _BoundSinkStream = () => (_BoundSinkStream = dart.constFn(async._BoundSinkStream$()))();
+let _TransformDataHandler = () => (_TransformDataHandler = dart.constFn(async._TransformDataHandler$()))();
+let _TransformErrorHandler = () => (_TransformErrorHandler = dart.constFn(async._TransformErrorHandler$()))();
+let _TransformDoneHandler = () => (_TransformDoneHandler = dart.constFn(async._TransformDoneHandler$()))();
+let _HandlerEventSink = () => (_HandlerEventSink = dart.constFn(async._HandlerEventSink$()))();
+let _StreamHandlerTransformer = () => (_StreamHandlerTransformer = dart.constFn(async._StreamHandlerTransformer$()))();
+let _SubscriptionTransformer = () => (_SubscriptionTransformer = dart.constFn(async._SubscriptionTransformer$()))();
+let _StreamSubscriptionTransformer = () => (_StreamSubscriptionTransformer = dart.constFn(async._StreamSubscriptionTransformer$()))();
+let _BoundSubscriptionStream = () => (_BoundSubscriptionStream = dart.constFn(async._BoundSubscriptionStream$()))();
+let ZoneCallback = () => (ZoneCallback = dart.constFn(async.ZoneCallback$()))();
+let ZoneUnaryCallback = () => (ZoneUnaryCallback = dart.constFn(async.ZoneUnaryCallback$()))();
+let ZoneBinaryCallback = () => (ZoneBinaryCallback = dart.constFn(async.ZoneBinaryCallback$()))();
+let HandleUncaughtErrorHandler = () => (HandleUncaughtErrorHandler = dart.constFn(async.HandleUncaughtErrorHandler$()))();
+let RunHandler = () => (RunHandler = dart.constFn(async.RunHandler$()))();
+let RunUnaryHandler = () => (RunUnaryHandler = dart.constFn(async.RunUnaryHandler$()))();
+let RunBinaryHandler = () => (RunBinaryHandler = dart.constFn(async.RunBinaryHandler$()))();
+let RegisterCallbackHandler = () => (RegisterCallbackHandler = dart.constFn(async.RegisterCallbackHandler$()))();
+let RegisterUnaryCallbackHandler = () => (RegisterUnaryCallbackHandler = dart.constFn(async.RegisterUnaryCallbackHandler$()))();
+let RegisterBinaryCallbackHandler = () => (RegisterBinaryCallbackHandler = dart.constFn(async.RegisterBinaryCallbackHandler$()))();
+let _ZoneFunction = () => (_ZoneFunction = dart.constFn(async._ZoneFunction$()))();
+let _ZoneFunctionOfRunHandler = () => (_ZoneFunctionOfRunHandler = dart.constFn(async._ZoneFunction$(async.RunHandler)))();
+let _ZoneFunctionOfRunUnaryHandler = () => (_ZoneFunctionOfRunUnaryHandler = dart.constFn(async._ZoneFunction$(async.RunUnaryHandler)))();
+let _ZoneFunctionOfRunBinaryHandler = () => (_ZoneFunctionOfRunBinaryHandler = dart.constFn(async._ZoneFunction$(async.RunBinaryHandler)))();
+let _ZoneFunctionOfRegisterCallbackHandler = () => (_ZoneFunctionOfRegisterCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterCallbackHandler)))();
+let _ZoneFunctionOfRegisterUnaryCallbackHandler = () => (_ZoneFunctionOfRegisterUnaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterUnaryCallbackHandler)))();
+let _ZoneFunctionOfRegisterBinaryCallbackHandler = () => (_ZoneFunctionOfRegisterBinaryCallbackHandler = dart.constFn(async._ZoneFunction$(async.RegisterBinaryCallbackHandler)))();
+let _ZoneFunctionOfErrorCallbackHandler = () => (_ZoneFunctionOfErrorCallbackHandler = dart.constFn(async._ZoneFunction$(async.ErrorCallbackHandler)))();
+let _ZoneFunctionOfScheduleMicrotaskHandler = () => (_ZoneFunctionOfScheduleMicrotaskHandler = dart.constFn(async._ZoneFunction$(async.ScheduleMicrotaskHandler)))();
+let _ZoneFunctionOfCreateTimerHandler = () => (_ZoneFunctionOfCreateTimerHandler = dart.constFn(async._ZoneFunction$(async.CreateTimerHandler)))();
+let _ZoneFunctionOfCreatePeriodicTimerHandler = () => (_ZoneFunctionOfCreatePeriodicTimerHandler = dart.constFn(async._ZoneFunction$(async.CreatePeriodicTimerHandler)))();
+let _ZoneFunctionOfPrintHandler = () => (_ZoneFunctionOfPrintHandler = dart.constFn(async._ZoneFunction$(async.PrintHandler)))();
+let _ZoneFunctionOfForkHandler = () => (_ZoneFunctionOfForkHandler = dart.constFn(async._ZoneFunction$(async.ForkHandler)))();
+let _ZoneFunctionOfHandleUncaughtErrorHandler = () => (_ZoneFunctionOfHandleUncaughtErrorHandler = dart.constFn(async._ZoneFunction$(async.HandleUncaughtErrorHandler)))();
+let _HashMap = () => (_HashMap = dart.constFn(collection._HashMap$()))();
+let _IdentityHashMap = () => (_IdentityHashMap = dart.constFn(collection._IdentityHashMap$()))();
+let _PredicateOfObject = () => (_PredicateOfObject = dart.constFn(collection._Predicate$(core.Object)))();
+let _CustomHashMap = () => (_CustomHashMap = dart.constFn(collection._CustomHashMap$()))();
+let _HashMapKeyIterable = () => (_HashMapKeyIterable = dart.constFn(collection._HashMapKeyIterable$()))();
+let _HashMapKeyIterator = () => (_HashMapKeyIterator = dart.constFn(collection._HashMapKeyIterator$()))();
+let _LinkedIdentityHashMap = () => (_LinkedIdentityHashMap = dart.constFn(collection._LinkedIdentityHashMap$()))();
+let _Es6LinkedIdentityHashMap = () => (_Es6LinkedIdentityHashMap = dart.constFn(collection._Es6LinkedIdentityHashMap$()))();
+let _Es6MapIterable = () => (_Es6MapIterable = dart.constFn(collection._Es6MapIterable$()))();
+let _Es6MapIterator = () => (_Es6MapIterator = dart.constFn(collection._Es6MapIterator$()))();
+let _LinkedCustomHashMap = () => (_LinkedCustomHashMap = dart.constFn(collection._LinkedCustomHashMap$()))();
+let IterableOfObject = () => (IterableOfObject = dart.constFn(core.Iterable$(core.Object)))();
+let SetOfObject = () => (SetOfObject = dart.constFn(core.Set$(core.Object)))();
+let SetMixin = () => (SetMixin = dart.constFn(collection.SetMixin$()))();
+let SetBase = () => (SetBase = dart.constFn(collection.SetBase$()))();
+let _HashSetBase = () => (_HashSetBase = dart.constFn(collection._HashSetBase$()))();
+let _HashSet = () => (_HashSet = dart.constFn(collection._HashSet$()))();
+let _IdentityHashSet = () => (_IdentityHashSet = dart.constFn(collection._IdentityHashSet$()))();
+let _CustomHashSet = () => (_CustomHashSet = dart.constFn(collection._CustomHashSet$()))();
+let _HashSetIterator = () => (_HashSetIterator = dart.constFn(collection._HashSetIterator$()))();
+let _LinkedHashSet = () => (_LinkedHashSet = dart.constFn(collection._LinkedHashSet$()))();
+let _LinkedIdentityHashSet = () => (_LinkedIdentityHashSet = dart.constFn(collection._LinkedIdentityHashSet$()))();
+let _LinkedCustomHashSet = () => (_LinkedCustomHashSet = dart.constFn(collection._LinkedCustomHashSet$()))();
+let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
+let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
+let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
+let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
+let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
+let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
+let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
+let IterableMixin = () => (IterableMixin = dart.constFn(collection.IterableMixin$()))();
+let HasNextIterator = () => (HasNextIterator = dart.constFn(collection.HasNextIterator$()))();
+let LinkedHashMap = () => (LinkedHashMap = dart.constFn(collection.LinkedHashMap$()))();
+let LinkedHashSet = () => (LinkedHashSet = dart.constFn(collection.LinkedHashSet$()))();
+let LinkedList = () => (LinkedList = dart.constFn(collection.LinkedList$()))();
+let _LinkedListIterator = () => (_LinkedListIterator = dart.constFn(collection._LinkedListIterator$()))();
+let LinkedListEntry = () => (LinkedListEntry = dart.constFn(collection.LinkedListEntry$()))();
+let MapMixin = () => (MapMixin = dart.constFn(collection.MapMixin$()))();
+let MapBase = () => (MapBase = dart.constFn(collection.MapBase$()))();
+let _UnmodifiableMapMixin = () => (_UnmodifiableMapMixin = dart.constFn(collection._UnmodifiableMapMixin$()))();
+let UnmodifiableMapBase = () => (UnmodifiableMapBase = dart.constFn(collection.UnmodifiableMapBase$()))();
+let _MapBaseValueIterable = () => (_MapBaseValueIterable = dart.constFn(collection._MapBaseValueIterable$()))();
+let _MapBaseValueIterator = () => (_MapBaseValueIterator = dart.constFn(collection._MapBaseValueIterator$()))();
+let MapView = () => (MapView = dart.constFn(collection.MapView$()))();
+let UnmodifiableMapView = () => (UnmodifiableMapView = dart.constFn(collection.UnmodifiableMapView$()))();
+let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.functionType(dart.void, [dart.dynamic, dart.dynamic])))();
+let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
+let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
+let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
+let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
+let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
+let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
+let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
+let DoubleLinkedQueue = () => (DoubleLinkedQueue = dart.constFn(collection.DoubleLinkedQueue$()))();
+let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
+let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
+let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
+let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
+let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
+let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
+let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
+let _TypeTest = () => (_TypeTest = dart.constFn(collection._TypeTest$()))();
+let SplayTreeMap = () => (SplayTreeMap = dart.constFn(collection.SplayTreeMap$()))();
+let _SplayTreeIterator = () => (_SplayTreeIterator = dart.constFn(collection._SplayTreeIterator$()))();
+let _SplayTreeKeyIterable = () => (_SplayTreeKeyIterable = dart.constFn(collection._SplayTreeKeyIterable$()))();
+let _SplayTreeValueIterable = () => (_SplayTreeValueIterable = dart.constFn(collection._SplayTreeValueIterable$()))();
+let _SplayTreeKeyIterator = () => (_SplayTreeKeyIterator = dart.constFn(collection._SplayTreeKeyIterator$()))();
+let _SplayTreeValueIterator = () => (_SplayTreeValueIterator = dart.constFn(collection._SplayTreeValueIterator$()))();
+let _SplayTreeNodeIterator = () => (_SplayTreeNodeIterator = dart.constFn(collection._SplayTreeNodeIterator$()))();
+let SplayTreeSet = () => (SplayTreeSet = dart.constFn(collection.SplayTreeSet$()))();
+let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
+let MappedIterableOfString$dynamic = () => (MappedIterableOfString$dynamic = dart.constFn(_internal.MappedIterable$(core.String, dart.dynamic)))();
+let SinkOfObject = () => (SinkOfObject = dart.constFn(core.Sink$(core.Object)))();
+let Codec = () => (Codec = dart.constFn(convert.Codec$()))();
+let ComparableOfString = () => (ComparableOfString = dart.constFn(core.Comparable$(core.String)))();
+let List = () => (List = dart.constFn(core.List$()))();
+let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
+let MapOfString$Encoding = () => (MapOfString$Encoding = dart.constFn(core.Map$(core.String, convert.Encoding)))();
+let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
+let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
+let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
+let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
+let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
+let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.functionType(dart.void, [ListOfint()])))();
+let _ChunkedConversionCallback = () => (_ChunkedConversionCallback = dart.constFn(convert._ChunkedConversionCallback$()))();
+let ChunkedConverter = () => (ChunkedConverter = dart.constFn(convert.ChunkedConverter$()))();
+let _SimpleCallbackSink = () => (_SimpleCallbackSink = dart.constFn(convert._SimpleCallbackSink$()))();
+let _ConverterStreamEventSink = () => (_ConverterStreamEventSink = dart.constFn(convert._ConverterStreamEventSink$()))();
+let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
+let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
+let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
+let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
+let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
+let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
+let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
+let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
+let Comparator = () => (Comparator = dart.constFn(core.Comparator$()))();
+let Comparable = () => (Comparable = dart.constFn(core.Comparable$()))();
+let ComparableOfDateTime = () => (ComparableOfDateTime = dart.constFn(core.Comparable$(core.DateTime)))();
+let ComparableOfDuration = () => (ComparableOfDuration = dart.constFn(core.Comparable$(core.Duration)))();
+let Expando = () => (Expando = dart.constFn(core.Expando$()))();
+let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
+let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
+let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
+let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
+let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
+let Set = () => (Set = dart.constFn(core.Set$()))();
+let Sink = () => (Sink = dart.constFn(core.Sink$()))();
+let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
+let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
+let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
+let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
+let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
+let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
+let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
+let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
+let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
+let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
+let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
+let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
+let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
+let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
+let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
+let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
+let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
+let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
+let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
+let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
+let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
+let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
+let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
+let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
+let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
+let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
+let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
+let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
+let ListOfFileSystemEntityType = () => (ListOfFileSystemEntityType = dart.constFn(core.List$(io.FileSystemEntityType)))();
+let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
+let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
+let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
+let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
+let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
+let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
+let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
+let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
+let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
+let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
+let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
+let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
+let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
+let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
+let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
+let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
+let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
+let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
+let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
+let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
+let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
+let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
+let JSArrayOf_Credentials = () => (JSArrayOf_Credentials = dart.constFn(_interceptors.JSArray$(io._Credentials)))();
+let JSArrayOf_ProxyCredentials = () => (JSArrayOf_ProxyCredentials = dart.constFn(_interceptors.JSArray$(io._ProxyCredentials)))();
+let FutureOf_HttpClientRequest = () => (FutureOf_HttpClientRequest = dart.constFn(async.Future$(io._HttpClientRequest)))();
+let FutureOrOf_HttpClientRequest = () => (FutureOrOf_HttpClientRequest = dart.constFn(async.FutureOr$(io._HttpClientRequest)))();
+let X509CertificateAndStringAndintTobool = () => (X509CertificateAndStringAndintTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate, core.String, core.int])))();
+let FutureOfbool = () => (FutureOfbool = dart.constFn(async.Future$(core.bool)))();
+let UriAndStringAndStringToFutureOfbool = () => (UriAndStringAndStringToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.Uri, core.String, core.String])))();
+let StringAndintAndString__ToFutureOfbool = () => (StringAndintAndString__ToFutureOfbool = dart.constFn(dart.functionType(FutureOfbool(), [core.String, core.int, core.String, core.String])))();
+let UriToString = () => (UriToString = dart.constFn(dart.functionType(core.String, [core.Uri])))();
+let MapOfString$_ConnectionTarget = () => (MapOfString$_ConnectionTarget = dart.constFn(core.Map$(core.String, io._ConnectionTarget)))();
+let ListOf_Credentials = () => (ListOf_Credentials = dart.constFn(core.List$(io._Credentials)))();
+let ListOf_ProxyCredentials = () => (ListOf_ProxyCredentials = dart.constFn(core.List$(io._ProxyCredentials)))();
+let MapOfint$_HttpConnection = () => (MapOfint$_HttpConnection = dart.constFn(core.Map$(core.int, io._HttpConnection)))();
+let HashMapOfint$_HttpConnection = () => (HashMapOfint$_HttpConnection = dart.constFn(collection.HashMap$(core.int, io._HttpConnection)))();
+let LinkedListOf_HttpConnection = () => (LinkedListOf_HttpConnection = dart.constFn(collection.LinkedList$(io._HttpConnection)))();
+let StreamControllerOfHttpRequest = () => (StreamControllerOfHttpRequest = dart.constFn(async.StreamController$(io.HttpRequest)))();
+let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
+let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
+let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
+let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
+let ListOfbool = () => (ListOfbool = dart.constFn(core.List$(core.bool)))();
+let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
+let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
+let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
+let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
+let ListOfMapOfString$String = () => (ListOfMapOfString$String = dart.constFn(core.List$(MapOfString$String())))();
+let FutureOfServiceExtensionResponse = () => (FutureOfServiceExtensionResponse = dart.constFn(async.Future$(developer.ServiceExtensionResponse)))();
+let MapOfint$_FileResourceInfo = () => (MapOfint$_FileResourceInfo = dart.constFn(core.Map$(core.int, io._FileResourceInfo)))();
+let MapOfint$_ProcessResourceInfo = () => (MapOfint$_ProcessResourceInfo = dart.constFn(core.Map$(core.int, io._ProcessResourceInfo)))();
+let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
+let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
+let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
+let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
+let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
+let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
+let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
+let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
+let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
+let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
+let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
+let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
+let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
+let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
+let X509CertificateTodynamic = () => (X509CertificateTodynamic = dart.constFn(dart.functionType(dart.dynamic, [io.X509Certificate])))();
+let intToListOfint = () => (intToListOfint = dart.constFn(dart.functionType(ListOfint(), [core.int])))();
+let StreamOfRawSocket = () => (StreamOfRawSocket = dart.constFn(async.Stream$(io.RawSocket)))();
+let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
+let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
+let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
+let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
+let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
+let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
+let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
+let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
+let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
+let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
+let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
+let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
+let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
+let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
+let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
+let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
+let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
+let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
+let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
+let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
+let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
+let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
+let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
+let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
+let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
+let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
+let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
+let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
+let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
+let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
+let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
+let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
+let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
+let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
+let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
+let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
+let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
+let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
+let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
+let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
+let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
+let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
+let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
+let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
+let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
+let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
+let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
+let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
+let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
+let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
+let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
+let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
+let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
+let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
+let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
+let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
+let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
+let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
+let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
+let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
+let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
+let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
+let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
+let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
+let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
+let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
+let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
+let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
+let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
+let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
+let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
+let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
+let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
+let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
+let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
+let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
+let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
+let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
+let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
+let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
+let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
+let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
+let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
+let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
+let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
+let _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html$._wrapZoneBinaryCallback$(ListOfMutationRecord(), html$.MutationObserver, dart.void)))();
+let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
+let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
+let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
+let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
+let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
+let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
+let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
+let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
+let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
+let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
+let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
+let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
+let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
+let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
+let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
+let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
+let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
+let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
+let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
+let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
+let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
+let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
+let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
+let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
+let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
+let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
+let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
+let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
+let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
+let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
+let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
+let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
+let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
+let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
+let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
+let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
+let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
+let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html$._EventStream$(html$.BeforeUnloadEvent)))();
+let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
+let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
+let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
+let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
+let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
+let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
+let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
+let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
+let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
+let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
+let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
+let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
+let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
+let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
+let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
+let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
+let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
+let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
+let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
+let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
+let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
+let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
+let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
+let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
+let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
+let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
+let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
+let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
+let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
+let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
+let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
+let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
+let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
+let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
+let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
+let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
+let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
+let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
+let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
+let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
+let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
+let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
+let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
+let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
+let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
+let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
+let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
+let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
+let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
+let VoidToFunctionType = () => (VoidToFunctionType = dart.constFn(dart.definiteFunctionType(dart.FunctionType, [])))();
+let dynamicToString = () => (dynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic])))();
+let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
+let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
+let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
+let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
+let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
+let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
+let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
+let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
+let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
+let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
+let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
+let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
+let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
+let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
+let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
+let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
+let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
+let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
+let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
+let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
+let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
+let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
+let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
+let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
+let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
+let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
+let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
+let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
+let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
+let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
+let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
+let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
+let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
+let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
+let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
+let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
+let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
+let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
+let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
+let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
+let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicAnddynamicTodynamic = () => (dynamicAnddynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let dynamicToArgumentError = () => (dynamicToArgumentError = dart.constFn(dart.definiteFunctionType(core.ArgumentError, [dart.dynamic])))();
+let dynamicToStackTrace = () => (dynamicToStackTrace = dart.constFn(dart.definiteFunctionType(core.StackTrace, [dart.dynamic])))();
+let dynamicToint = () => (dynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic])))();
+let dynamicAndMapTodynamic = () => (dynamicAndMapTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Map])))();
+let dynamicAndStringTodynamic = () => (dynamicAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])))();
+let dynamicAndStringAnddynamicTovoid = () => (dynamicAndStringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, dart.dynamic])))();
+let FAndintToF = () => (FAndintToF = dart.constFn(dart.definiteFunctionType(F => [F, [F, core.int]])))();
+let JSSyntaxRegExpTodynamic = () => (JSSyntaxRegExpTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_js_helper.JSSyntaxRegExp])))();
+let JSSyntaxRegExpToint = () => (JSSyntaxRegExpToint = dart.constFn(dart.definiteFunctionType(core.int, [_js_helper.JSSyntaxRegExp])))();
+let JSSyntaxRegExpAndStringAndintToMatch = () => (JSSyntaxRegExpAndStringAndintToMatch = dart.constFn(dart.definiteFunctionType(core.Match, [_js_helper.JSSyntaxRegExp, core.String, core.int])))();
+let dynamicAnddynamicAnddynamicToint = () => (dynamicAnddynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicAnddynamicToString = () => (dynamicAnddynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicAnddynamicTobool = () => (dynamicAnddynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let StringAndStringAndintToIterableOfMatch = () => (StringAndStringAndintToIterableOfMatch = dart.constFn(dart.definiteFunctionType(IterableOfMatch(), [core.String, core.String, core.int])))();
+let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
+let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
+let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
+let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
+let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
+let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
+let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
+let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
+let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
+let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
+let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
+let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
+let SymbolToString = () => (SymbolToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Symbol])))();
+let dynamicAnddynamicToSymbol = () => (dynamicAnddynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic, dart.dynamic])))();
+let dynamicToInstanceMirror = () => (dynamicToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [dart.dynamic])))();
+let TypeToTypeMirror = () => (TypeToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [core.Type])))();
+let dynamicAndListTodynamic = () => (dynamicAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.List])))();
+let dynamicAndStringAndListTodynamic = () => (dynamicAndStringAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.List])))();
+let SymbolTodynamic = () => (SymbolTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Symbol])))();
+let dynamicToSymbol = () => (dynamicToSymbol = dart.constFn(dart.definiteFunctionType(core.Symbol, [dart.dynamic])))();
+let dynamicToMapOfSymbol$dynamic = () => (dynamicToMapOfSymbol$dynamic = dart.constFn(dart.definiteFunctionType(MapOfSymbol$dynamic(), [dart.dynamic])))();
+let TypeAndInvocationTodynamic = () => (TypeAndInvocationTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.Invocation])))();
+let SymbolAnddynamicToNull = () => (SymbolAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.Symbol, dart.dynamic])))();
+let MapOfSymbol$dynamicTodynamic = () => (MapOfSymbol$dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [MapOfSymbol$dynamic()])))();
+let dynamicToTypeMirror = () => (dynamicToTypeMirror = dart.constFn(dart.definiteFunctionType(mirrors.TypeMirror, [dart.dynamic])))();
+let dynamicAnddynamicAnddynamicTovoid = () => (dynamicAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])))();
+let ListToList = () => (ListToList = dart.constFn(dart.definiteFunctionType(core.List, [core.List])))();
+let intTobool = () => (intTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.int])))();
+let intAndListAndintTovoid = () => (intAndListAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.List, core.int])))();
+let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
+let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
+let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
+let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
+let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
+let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
+let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
+let dynamicTo_Future = () => (dynamicTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [dart.dynamic])))();
+let _AsyncCallbackTovoid = () => (_AsyncCallbackTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._AsyncCallback])))();
+let FnToNull = () => (FnToNull = dart.constFn(dart.definiteFunctionType(core.Null, [VoidTovoid()])))();
+let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
+let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
+let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
+let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
+let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
+let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
+let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
+let _EventSinkAnddynamicAnddynamicTovoid = () => (_EventSinkAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._EventSink, dart.dynamic, dart.dynamic])))();
+let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
+let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
+let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
+let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
+let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
+let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
+let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
+let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
+let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
+let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
+let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
+let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
+let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
+let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
+let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
+let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
+let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
+let ObjectTobool = () => (ObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object])))();
+let dynamicAnddynamicTobool = () => (dynamicAnddynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic])))();
+let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
+let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
+let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
+let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
+let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
+let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
+let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
+let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
+let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
+let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
+let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
+let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
+let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
+let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
+let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
+let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
+let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
+let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
+let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
+let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
+let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
+let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
+let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
+let StringAndServiceExtensionHandlerTodynamic = () => (StringAndServiceExtensionHandlerTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, developer.ServiceExtensionHandler])))();
+let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
+let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
+let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
+let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
+let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
+let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
+let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
+let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
+let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
+let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
+let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
+let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
+let dynamicTo_Directory = () => (dynamicTo_Directory = dart.constFn(dart.definiteFunctionType(io._Directory, [dart.dynamic])))();
+let dynamicToDirectory = () => (dynamicToDirectory = dart.constFn(dart.definiteFunctionType(io.Directory, [dart.dynamic])))();
+let dynamicToFutureOrOfString = () => (dynamicToFutureOrOfString = dart.constFn(dart.definiteFunctionType(FutureOrOfString(), [dart.dynamic])))();
+let dynamicToFutureOrOfbool = () => (dynamicToFutureOrOfbool = dart.constFn(dart.definiteFunctionType(FutureOrOfbool(), [dart.dynamic])))();
+let dynamicToFutureOrOfint = () => (dynamicToFutureOrOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfint(), [dart.dynamic])))();
+let ListOfintToNull = () => (ListOfintToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfint()])))();
+let RandomAccessFileTovoid = () => (RandomAccessFileTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.RandomAccessFile])))();
+let RandomAccessFileToFutureOr = () => (RandomAccessFileToFutureOr = dart.constFn(dart.definiteFunctionType(async.FutureOr, [io.RandomAccessFile])))();
+let RandomAccessFileToNull = () => (RandomAccessFileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RandomAccessFile])))();
+let RandomAccessFileToFutureOfRandomAccessFile = () => (RandomAccessFileToFutureOfRandomAccessFile = dart.constFn(dart.definiteFunctionType(FutureOfRandomAccessFile(), [io.RandomAccessFile])))();
+let dynamicTo_File = () => (dynamicTo_File = dart.constFn(dart.definiteFunctionType(io._File, [dart.dynamic])))();
+let FileSystemEntityTo_File = () => (FileSystemEntityTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.FileSystemEntity])))();
+let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
+let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
+let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
+let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
+let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
+let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
+let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
+let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
+let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
+let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
+let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
+let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
+let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
+let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
+let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
+let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
+let _HttpClientRequestToFutureOfHttpClientResponse = () => (_HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io._HttpClientRequest])))();
+let dynamicToFutureOfHttpClientResponse = () => (dynamicToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [dart.dynamic])))();
+let VoidToFutureOfHttpClientResponse = () => (VoidToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [])))();
+let VoidToListOfString = () => (VoidToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [])))();
+let _AuthenticationSchemeTo_Credentials = () => (_AuthenticationSchemeTo_Credentials = dart.constFn(dart.definiteFunctionType(io._Credentials, [io._AuthenticationScheme])))();
+let _CredentialsTovoid = () => (_CredentialsTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io._Credentials])))();
+let _AuthenticationSchemeAndStringToFuture = () => (_AuthenticationSchemeAndStringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [io._AuthenticationScheme, core.String])))();
+let dynamicToFutureOrOfHttpClientResponse = () => (dynamicToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [dart.dynamic])))();
+let CookieToNull = () => (CookieToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Cookie])))();
+let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
+let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
+let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
+let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
+let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
+let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
+let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
+let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
+let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
+let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
+let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
+let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
+let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
+let _ConnectionInfoTo_HttpClientRequest = () => (_ConnectionInfoTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._ConnectionInfo])))();
+let _ConnectionInfoToFutureOrOf_HttpClientRequest = () => (_ConnectionInfoToFutureOrOf_HttpClientRequest = dart.constFn(dart.definiteFunctionType(FutureOrOf_HttpClientRequest(), [io._ConnectionInfo])))();
+let _HttpClientRequestTo_HttpClientRequest = () => (_HttpClientRequestTo_HttpClientRequest = dart.constFn(dart.definiteFunctionType(io._HttpClientRequest, [io._HttpClientRequest])))();
+let VoidTo_ConnectionTarget = () => (VoidTo_ConnectionTarget = dart.constFn(dart.definiteFunctionType(io._ConnectionTarget, [])))();
+let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
+let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
+let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
+let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
+let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
+let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
+let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
+let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
+let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
+let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
+let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
+let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
+let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
+let dynamicToLink = () => (dynamicToLink = dart.constFn(dart.definiteFunctionType(io.Link, [dart.dynamic])))();
+let DurationTovoid = () => (DurationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Duration])))();
+let RawSecureServerSocketToSecureServerSocket = () => (RawSecureServerSocketToSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])))();
+let RawSecureSocketToSecureSocket = () => (RawSecureSocketToSecureSocket = dart.constFn(dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])))();
+let dynamicToFutureOfRawSecureSocket = () => (dynamicToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [dart.dynamic])))();
+let RawServerSocketToRawSecureServerSocket = () => (RawServerSocketToRawSecureServerSocket = dart.constFn(dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket])))();
+let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
+let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
+let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
+let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
+let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
+let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
+let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
+let EventSinkTo_WebSocketProtocolTransformer = () => (EventSinkTo_WebSocketProtocolTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketProtocolTransformer, [async.EventSink])))();
+let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
+let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
+let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
+let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
+let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
+let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
+let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
+let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
+let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
+let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
+let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
+let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
+let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
+let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
+let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
+let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
+let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
+let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
+let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
+let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
+let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
+let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T => [T, [T]])))();
+let LibraryMirrorTobool = () => (LibraryMirrorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [mirrors.LibraryMirror])))();
+let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
+let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
+let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
+let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
+let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
+let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
+let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
+let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
+let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
+let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
+let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
+let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
+let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
+let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
+let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
+let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
+let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
+let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
+let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
+let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
+let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
+let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
+let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
+let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
+let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
+let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
+let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
+let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
+let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
+let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
+let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
+let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
+let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
+let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
+let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
+let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
+let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
+let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
+let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
+let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
+let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
+let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
+let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
+let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
+let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
+let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
+let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
+let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
+let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
+let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
+let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
+let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
+let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
+let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
+let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
+let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
+let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
+let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
+let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
+let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
+dart.mixin = function(base, ...mixins) {
+  class Mixin extends base {}
+  for (let m of mixins) {
+    dart.copyProperties(Mixin.prototype, m.prototype);
+  }
+  Mixin.prototype.new = function(...args) {
+    for (let i = mixins.length - 1; i >= 0; i--) {
+      mixins[i].prototype.new.call(this);
     }
-    Mixin.prototype.new = function(...args) {
-      for (let i = mixins.length - 1; i >= 0; i--) {
-        mixins[i].prototype.new.call(this);
-      }
-      base.prototype.new.apply(this, args);
-    };
-    dart.setSignature(Mixin, {
-      methods: () => {
-        let s = {};
-        for (let m of mixins) {
-          dart.copyProperties(s, m[dart._methodSig]);
-        }
-        return s;
-      },
-      fields: () => {
-        let s = {};
-        for (let m of mixins) {
-          dart.copyProperties(s, m[dart._fieldSig]);
-        }
-        return s;
-      },
-      getters: () => {
-        let s = {};
-        for (let m of mixins) {
-          dart.copyProperties(s, m[dart._getterSig]);
-        }
-        return s;
-      },
-      setters: () => {
-        let s = {};
-        for (let m of mixins) {
-          dart.copyProperties(s, m[dart._setterSig]);
-        }
-        return s;
-      }
-    });
-    Mixin[dart._mixins] = mixins;
-    return Mixin;
+    base.prototype.new.apply(this, args);
   };
-  dart.getMixins = function(clazz) {
-    return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
-  };
-  dart.getImplements = function(clazz) {
-    return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
-  };
-  dart.flattenFutures = function(builder) {
-    function flatten(T) {
-      if (!T) return builder(dart.dynamic);
-      let futureClass = dart.getGenericClass(async.Future);
-      if (dart.getGenericClass(T) == futureClass) {
-        let args = dart.getGenericArgs(T);
-        if (args) return builder(args[0]);
+  dart.setSignature(Mixin, {
+    methods: () => {
+      let s = {};
+      for (let m of mixins) {
+        dart.copyProperties(s, m[dart._methodSig]);
       }
-      return builder(T);
+      return s;
+    },
+    fields: () => {
+      let s = {};
+      for (let m of mixins) {
+        dart.copyProperties(s, m[dart._fieldSig]);
+      }
+      return s;
+    },
+    getters: () => {
+      let s = {};
+      for (let m of mixins) {
+        dart.copyProperties(s, m[dart._getterSig]);
+      }
+      return s;
+    },
+    setters: () => {
+      let s = {};
+      for (let m of mixins) {
+        dart.copyProperties(s, m[dart._setterSig]);
+      }
+      return s;
     }
-    return flatten;
-  };
-  dart.generic = function(typeConstructor, setBaseClass) {
-    if (setBaseClass === void 0) setBaseClass = null;
-    return (() => {
-      let length = typeConstructor.length;
-      if (length < 1) {
-        dart.throwInternalError('must have at least one generic type argument');
+  });
+  Mixin[dart._mixins] = mixins;
+  return Mixin;
+};
+dart.getMixins = function(clazz) {
+  return Object.hasOwnProperty.call(clazz, dart._mixins) ? clazz[dart._mixins] : null;
+};
+dart.getImplements = function(clazz) {
+  return Object.hasOwnProperty.call(clazz, dart.implements) ? clazz[dart.implements] : null;
+};
+dart.flattenFutures = function(builder) {
+  function flatten(T) {
+    if (!T) return builder(dart.dynamic);
+    let futureClass = dart.getGenericClass(async.Future);
+    if (dart.getGenericClass(T) == futureClass) {
+      let args = dart.getGenericArgs(T);
+      if (args) return builder(args[0]);
+    }
+    return builder(T);
+  }
+  return flatten;
+};
+dart.generic = function(typeConstructor, setBaseClass) {
+  if (setBaseClass === void 0) setBaseClass = null;
+  return (() => {
+    let length = typeConstructor.length;
+    if (length < 1) {
+      dart.throwInternalError('must have at least one generic type argument');
+    }
+    let resultMap = new Map();
+    function makeGenericType(...args) {
+      if (args.length != length && args.length != 0) {
+        dart.throwInternalError('requires ' + length + ' or 0 type arguments');
       }
-      let resultMap = new Map();
-      function makeGenericType(...args) {
-        if (args.length != length && args.length != 0) {
-          dart.throwInternalError('requires ' + length + ' or 0 type arguments');
+      while (args.length < length)
+        args.push(dart.dynamic);
+      let value = resultMap;
+      for (let i = 0; i < length; i++) {
+        let arg = args[i];
+        if (arg == null) {
+          dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
         }
-        while (args.length < length)
-          args.push(dart.dynamic);
-        let value = resultMap;
-        for (let i = 0; i < length; i++) {
-          let arg = args[i];
-          if (arg == null) {
-            dart.throwInternalError('type arguments should not be null: ' + typeConstructor);
-          }
-          let map = value;
-          value = map.get(arg);
-          if (value === void 0) {
-            if (i + 1 == length) {
-              value = typeConstructor.apply(null, args);
-              if (value) {
-                value[dart._typeArguments] = args;
-                value[dart._originalDeclaration] = makeGenericType;
-              }
-              map.set(arg, value);
-              if (setBaseClass) setBaseClass(value);
-            } else {
-              value = new Map();
-              map.set(arg, value);
+        let map = value;
+        value = map.get(arg);
+        if (value === void 0) {
+          if (i + 1 == length) {
+            value = typeConstructor.apply(null, args);
+            if (value) {
+              value[dart._typeArguments] = args;
+              value[dart._originalDeclaration] = makeGenericType;
             }
+            map.set(arg, value);
+            if (setBaseClass) setBaseClass(value);
+          } else {
+            value = new Map();
+            map.set(arg, value);
           }
         }
-        return value;
       }
-      makeGenericType[dart._genericTypeCtor] = typeConstructor;
-      return makeGenericType;
-    })();
-  };
-  dart.getGenericClass = function(type) {
-    return dart.safeGetOwnProperty(type, dart._originalDeclaration);
-  };
-  dart.getGenericArgs = function(type) {
-    return dart.safeGetOwnProperty(type, dart._typeArguments);
-  };
-  dart.getConstructorSig = function(value) {
-    return value[dart._constructorSig];
-  };
-  dart.getMethodSig = function(value) {
-    return value[dart._methodSig];
-  };
-  dart.getFieldSig = function(value) {
-    return value[dart._fieldSig];
-  };
-  dart.getGetterSig = function(value) {
-    return value[dart._getterSig];
-  };
-  dart.getSetterSig = function(value) {
-    return value[dart._setterSig];
-  };
-  dart.getStaticSig = function(value) {
-    return value[dart._staticSig];
-  };
-  dart.getStaticFieldSig = function(value) {
-    return value[dart._staticFieldSig];
-  };
-  dart.getStaticGetterSig = function(value) {
-    return value[dart._staticGetterSig];
-  };
-  dart.getStaticSetterSig = function(value) {
-    return value[dart._staticSetterSig];
-  };
-  dart.getGenericTypeCtor = function(value) {
-    return value[dart._genericTypeCtor];
-  };
-  dart.getType = function(obj) {
-    return obj == null ? core.Object : obj.__proto__.constructor;
-  };
-  dart.isJsInterop = function(obj) {
-    if (typeof obj === "function") {
-      return dart._getRuntimeType(obj) == null;
+      return value;
     }
-    if (typeof obj !== "object") return false;
-    if (dart.getExtensionType(obj) != null) return false;
-    return !(obj instanceof core.Object);
-  };
-  dart.getMethodType = function(type, name) {
-    let sigObj = type[dart._methodSig];
-    if (sigObj === void 0) return void 0;
-    return sigObj[name];
-  };
-  dart.getFieldType = function(type, name) {
-    let sigObj = type[dart._fieldSig];
-    if (sigObj === void 0) return void 0;
-    let fieldType = sigObj[name];
-    return fieldType instanceof Array ? fieldType[0] : fieldType;
-  };
-  dart.getSetterType = function(type, name) {
-    let sigObj = type[dart._setterSig];
-    if (sigObj === void 0) return void 0;
-    return sigObj[name];
-  };
-  dart.classGetConstructorType = function(cls, name) {
-    if (!name) name = 'new';
-    if (cls === void 0) return void 0;
-    if (cls == null) return void 0;
-    let sigCtor = cls[dart._constructorSig];
-    if (sigCtor === void 0) return void 0;
-    return sigCtor[name];
-  };
-  dart.bind = function(obj, name, f) {
-    if (f === void 0) f = obj[name];
-    f = f.bind(obj);
-    let sig = dart.getMethodType(dart.getType(obj), name);
-    dart.assert(sig);
-    dart.tag(f, sig);
-    return f;
-  };
-  dart.gbind = function(f, ...typeArgs) {
-    let result = f.apply(null, typeArgs);
-    let sig = dart._getRuntimeType(f).apply(null, typeArgs);
-    dart.tag(result, sig);
-    return result;
-  };
-  dart._setInstanceSignature = function(f, sigF, kind) {
-    dart.defineMemoizedGetter(f, kind, () => {
-      let sigObj = sigF();
-      let proto = f.__proto__;
-      sigObj.__proto__ = kind in proto ? proto[kind] : null;
-      return sigObj;
+    makeGenericType[dart._genericTypeCtor] = typeConstructor;
+    return makeGenericType;
+  })();
+};
+dart.getGenericClass = function(type) {
+  return dart.safeGetOwnProperty(type, dart._originalDeclaration);
+};
+dart.getGenericArgs = function(type) {
+  return dart.safeGetOwnProperty(type, dart._typeArguments);
+};
+dart.getConstructorSig = function(value) {
+  return value[dart._constructorSig];
+};
+dart.getMethodSig = function(value) {
+  return value[dart._methodSig];
+};
+dart.getFieldSig = function(value) {
+  return value[dart._fieldSig];
+};
+dart.getGetterSig = function(value) {
+  return value[dart._getterSig];
+};
+dart.getSetterSig = function(value) {
+  return value[dart._setterSig];
+};
+dart.getStaticSig = function(value) {
+  return value[dart._staticSig];
+};
+dart.getStaticFieldSig = function(value) {
+  return value[dart._staticFieldSig];
+};
+dart.getStaticGetterSig = function(value) {
+  return value[dart._staticGetterSig];
+};
+dart.getStaticSetterSig = function(value) {
+  return value[dart._staticSetterSig];
+};
+dart.getGenericTypeCtor = function(value) {
+  return value[dart._genericTypeCtor];
+};
+dart.getType = function(obj) {
+  return obj == null ? core.Object : obj.__proto__.constructor;
+};
+dart.isJsInterop = function(obj) {
+  if (typeof obj === "function") {
+    return dart._getRuntimeType(obj) == null;
+  }
+  if (typeof obj !== "object") return false;
+  if (dart.getExtensionType(obj) != null) return false;
+  return !(obj instanceof core.Object);
+};
+dart.getMethodType = function(type, name) {
+  let sigObj = type[dart._methodSig];
+  if (sigObj === void 0) return void 0;
+  return sigObj[name];
+};
+dart.getFieldType = function(type, name) {
+  let sigObj = type[dart._fieldSig];
+  if (sigObj === void 0) return void 0;
+  let fieldType = sigObj[name];
+  return fieldType instanceof Array ? fieldType[0] : fieldType;
+};
+dart.getSetterType = function(type, name) {
+  let sigObj = type[dart._setterSig];
+  if (sigObj === void 0) return void 0;
+  return sigObj[name];
+};
+dart.classGetConstructorType = function(cls, name) {
+  if (!name) name = 'new';
+  if (cls === void 0) return void 0;
+  if (cls == null) return void 0;
+  let sigCtor = cls[dart._constructorSig];
+  if (sigCtor === void 0) return void 0;
+  return sigCtor[name];
+};
+dart.bind = function(obj, name, f) {
+  if (f === void 0) f = obj[name];
+  f = f.bind(obj);
+  let sig = dart.getMethodType(dart.getType(obj), name);
+  dart.assert(sig);
+  dart.tag(f, sig);
+  return f;
+};
+dart.gbind = function(f, ...typeArgs) {
+  let result = f.apply(null, typeArgs);
+  let sig = dart._getRuntimeType(f).apply(null, typeArgs);
+  dart.tag(result, sig);
+  return result;
+};
+dart._setInstanceSignature = function(f, sigF, kind) {
+  dart.defineMemoizedGetter(f, kind, () => {
+    let sigObj = sigF();
+    let proto = f.__proto__;
+    sigObj.__proto__ = kind in proto ? proto[kind] : null;
+    return sigObj;
+  });
+};
+dart._setMethodSignature = function(f, sigF) {
+  return dart._setInstanceSignature(f, sigF, dart._methodSig);
+};
+dart._setFieldSignature = function(f, sigF) {
+  return dart._setInstanceSignature(f, sigF, dart._fieldSig);
+};
+dart._setGetterSignature = function(f, sigF) {
+  return dart._setInstanceSignature(f, sigF, dart._getterSig);
+};
+dart._setSetterSignature = function(f, sigF) {
+  return dart._setInstanceSignature(f, sigF, dart._setterSig);
+};
+dart._setConstructorSignature = function(f, sigF) {
+  return dart.defineMemoizedGetter(f, dart._constructorSig, sigF);
+};
+dart._setStaticSignature = function(f, sigF) {
+  return dart.defineMemoizedGetter(f, dart._staticSig, sigF);
+};
+dart._setStaticFieldSignature = function(f, sigF) {
+  return dart.defineMemoizedGetter(f, dart._staticFieldSig, sigF);
+};
+dart._setStaticGetterSignature = function(f, sigF) {
+  return dart.defineMemoizedGetter(f, dart._staticGetterSig, sigF);
+};
+dart._setStaticSetterSignature = function(f, sigF) {
+  return dart.defineMemoizedGetter(f, dart._staticSetterSig, sigF);
+};
+dart._setStaticTypes = function(f, names) {
+  for (let name of names) {
+    if (!f[name]) continue;
+    dart.tagLazy(f[name], function() {
+      return f[dart._staticSig][name];
     });
+  }
+};
+dart.setSignature = function(f, signature) {
+  let constructors = 'constructors' in signature ? signature.constructors : () => ({});
+  let methods = 'methods' in signature ? signature.methods : () => ({});
+  let fields = 'fields' in signature ? signature.fields : () => ({});
+  let getters = 'getters' in signature ? signature.getters : () => ({});
+  let setters = 'setters' in signature ? signature.setters : () => ({});
+  let statics = 'statics' in signature ? signature.statics : () => ({});
+  let staticFields = 'sfields' in signature ? signature.sfields : () => ({});
+  let staticGetters = 'sgetters' in signature ? signature.sgetters : () => ({});
+  let staticSetters = 'ssetters' in signature ? signature.ssetters : () => ({});
+  let names = 'names' in signature ? signature.names : [];
+  dart._setConstructorSignature(f, constructors);
+  dart._setMethodSignature(f, methods);
+  dart._setFieldSignature(f, fields);
+  dart._setGetterSignature(f, getters);
+  dart._setSetterSignature(f, setters);
+  dart._setStaticSignature(f, statics);
+  dart._setStaticFieldSignature(f, staticFields);
+  dart._setStaticGetterSignature(f, staticGetters);
+  dart._setStaticSetterSignature(f, staticSetters);
+  dart._setStaticTypes(f, names);
+};
+dart._hasSigEntry = function(type, sigF, name) {
+  let sigObj = type[sigF];
+  if (sigObj === void 0) return false;
+  return name in sigObj;
+};
+dart.hasMethod = function(type, name) {
+  return dart._hasSigEntry(type, dart._methodSig, name);
+};
+dart.hasGetter = function(type, name) {
+  return dart._hasSigEntry(type, dart._getterSig, name);
+};
+dart.hasSetter = function(type, name) {
+  return dart._hasSigEntry(type, dart._setterSig, name);
+};
+dart.hasField = function(type, name) {
+  return dart._hasSigEntry(type, dart._fieldSig, name);
+};
+dart.defineNamedConstructor = function(clazz, name) {
+  let proto = clazz.prototype;
+  let initMethod = proto[name];
+  let ctor = function(...args) {
+    initMethod.apply(this, args);
   };
-  dart._setMethodSignature = function(f, sigF) {
-    return dart._setInstanceSignature(f, sigF, dart._methodSig);
-  };
-  dart._setFieldSignature = function(f, sigF) {
-    return dart._setInstanceSignature(f, sigF, dart._fieldSig);
-  };
-  dart._setGetterSignature = function(f, sigF) {
-    return dart._setInstanceSignature(f, sigF, dart._getterSig);
-  };
-  dart._setSetterSignature = function(f, sigF) {
-    return dart._setInstanceSignature(f, sigF, dart._setterSig);
-  };
-  dart._setConstructorSignature = function(f, sigF) {
-    return dart.defineMemoizedGetter(f, dart._constructorSig, sigF);
-  };
-  dart._setStaticSignature = function(f, sigF) {
-    return dart.defineMemoizedGetter(f, dart._staticSig, sigF);
-  };
-  dart._setStaticFieldSignature = function(f, sigF) {
-    return dart.defineMemoizedGetter(f, dart._staticFieldSig, sigF);
-  };
-  dart._setStaticGetterSignature = function(f, sigF) {
-    return dart.defineMemoizedGetter(f, dart._staticGetterSig, sigF);
-  };
-  dart._setStaticSetterSignature = function(f, sigF) {
-    return dart.defineMemoizedGetter(f, dart._staticSetterSig, sigF);
-  };
-  dart._setStaticTypes = function(f, names) {
-    for (let name of names) {
-      if (!f[name]) continue;
-      dart.tagLazy(f[name], function() {
-        return f[dart._staticSig][name];
-      });
-    }
-  };
-  dart.setSignature = function(f, signature) {
-    let constructors = 'constructors' in signature ? signature.constructors : () => ({});
-    let methods = 'methods' in signature ? signature.methods : () => ({});
-    let fields = 'fields' in signature ? signature.fields : () => ({});
-    let getters = 'getters' in signature ? signature.getters : () => ({});
-    let setters = 'setters' in signature ? signature.setters : () => ({});
-    let statics = 'statics' in signature ? signature.statics : () => ({});
-    let staticFields = 'sfields' in signature ? signature.sfields : () => ({});
-    let staticGetters = 'sgetters' in signature ? signature.sgetters : () => ({});
-    let staticSetters = 'ssetters' in signature ? signature.ssetters : () => ({});
-    let names = 'names' in signature ? signature.names : [];
-    dart._setConstructorSignature(f, constructors);
-    dart._setMethodSignature(f, methods);
-    dart._setFieldSignature(f, fields);
-    dart._setGetterSignature(f, getters);
-    dart._setSetterSignature(f, setters);
-    dart._setStaticSignature(f, statics);
-    dart._setStaticFieldSignature(f, staticFields);
-    dart._setStaticGetterSignature(f, staticGetters);
-    dart._setStaticSetterSignature(f, staticSetters);
-    dart._setStaticTypes(f, names);
-  };
-  dart._hasSigEntry = function(type, sigF, name) {
-    let sigObj = type[sigF];
-    if (sigObj === void 0) return false;
-    return name in sigObj;
-  };
-  dart.hasMethod = function(type, name) {
-    return dart._hasSigEntry(type, dart._methodSig, name);
-  };
-  dart.hasGetter = function(type, name) {
-    return dart._hasSigEntry(type, dart._getterSig, name);
-  };
-  dart.hasSetter = function(type, name) {
-    return dart._hasSigEntry(type, dart._setterSig, name);
-  };
-  dart.hasField = function(type, name) {
-    return dart._hasSigEntry(type, dart._fieldSig, name);
-  };
-  dart.defineNamedConstructor = function(clazz, name) {
-    let proto = clazz.prototype;
-    let initMethod = proto[name];
-    let ctor = function(...args) {
-      initMethod.apply(this, args);
-    };
-    ctor[dart.isNamedConstructor] = true;
-    ctor.prototype = proto;
-    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
-  };
-  dart.getExtensionType = function(obj) {
-    return obj[dart._extensionType];
-  };
-  dart.getExtensionSymbol = function(name) {
-    let sym = dartx[name];
-    if (sym == null) {
-      sym = Symbol("dartx." + name.toString());
-      dartx[name] = sym;
-    }
-    return sym;
-  };
-  dart.defineExtensionNames = function(names) {
-    return names.forEach(dart.getExtensionSymbol);
-  };
-  dart._installProperties = function(jsProto, extProto) {
-    let coreObjProto = core.Object.prototype;
-    let parentsExtension = jsProto.__proto__[dart._extensionType];
-    let installedParent = parentsExtension && parentsExtension.prototype;
-    dart._installProperties2(jsProto, extProto, coreObjProto, installedParent);
-  };
-  dart._installProperties2 = function(jsProto, extProto, coreObjProto, installedParent) {
-    if (extProto === coreObjProto) {
-      dart._installPropertiesForObject(jsProto, coreObjProto);
-      return;
-    }
-    if (jsProto !== extProto) {
-      let extParent = extProto.__proto__;
-      if (installedParent !== extParent) {
-        dart._installProperties2(jsProto, extParent, coreObjProto, installedParent);
-      }
-    }
-    dart.copyTheseProperties(jsProto, extProto, dart.getOwnPropertySymbols(extProto));
-  };
-  dart._installPropertiesForObject = function(jsProto, coreObjProto) {
-    let names = dart.getOwnPropertyNames(coreObjProto);
-    for (let i = 0; i < names.length; ++i) {
-      let name = names[i];
-      let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
-      dart.defineProperty(jsProto, dart.getExtensionSymbol(name), desc);
-    }
+  ctor[dart.isNamedConstructor] = true;
+  ctor.prototype = proto;
+  dart.defineProperty(clazz, name, {value: ctor, configurable: true});
+};
+dart.getExtensionType = function(obj) {
+  return obj[dart._extensionType];
+};
+dart.getExtensionSymbol = function(name) {
+  let sym = dartx[name];
+  if (sym == null) {
+    sym = Symbol("dartx." + name.toString());
+    dartx[name] = sym;
+  }
+  return sym;
+};
+dart.defineExtensionNames = function(names) {
+  return names.forEach(dart.getExtensionSymbol);
+};
+dart._installProperties = function(jsProto, extProto) {
+  let coreObjProto = core.Object.prototype;
+  let parentsExtension = jsProto.__proto__[dart._extensionType];
+  let installedParent = parentsExtension && parentsExtension.prototype;
+  dart._installProperties2(jsProto, extProto, coreObjProto, installedParent);
+};
+dart._installProperties2 = function(jsProto, extProto, coreObjProto, installedParent) {
+  if (extProto === coreObjProto) {
+    dart._installPropertiesForObject(jsProto, coreObjProto);
     return;
-  };
-  dart.registerExtension = function(jsType, dartExtType) {
-    if (!jsType) return;
-    let extProto = dartExtType.prototype;
-    let jsProto = jsType.prototype;
-    if (!jsProto) return;
-    jsProto[dart._extensionType] = dartExtType;
-    dart._installProperties(jsProto, extProto);
-    function updateSig(sigF) {
-      let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, sigF).get;
-      dart.assert(originalSigFn);
-      dart.defineMemoizedGetter(jsType, sigF, originalSigFn);
+  }
+  if (jsProto !== extProto) {
+    let extParent = extProto.__proto__;
+    if (installedParent !== extParent) {
+      dart._installProperties2(jsProto, extParent, coreObjProto, installedParent);
     }
-    updateSig(dart._methodSig);
-    updateSig(dart._fieldSig);
-    updateSig(dart._getterSig);
-    updateSig(dart._setterSig);
-  };
-  dart.defineExtensionMembers = function(type, methodNames) {
-    let proto = type.prototype;
-    for (let name of methodNames) {
-      let method = dart.getOwnPropertyDescriptor(proto, name);
-      dart.defineProperty(proto, dart.getExtensionSymbol(name), method);
-    }
-    function upgradeSig(sigF) {
-      let originalSigFn = dart.getOwnPropertyDescriptor(type, sigF).get;
-      dart.defineMemoizedGetter(type, sigF, function() {
-        let sig = originalSigFn();
-        let propertyNames = Object.getOwnPropertyNames(sig);
-        for (let name of methodNames) {
-          if (name in sig) {
-            sig[dart.getExtensionSymbol(name)] = sig[name];
-          }
+  }
+  dart.copyTheseProperties(jsProto, extProto, dart.getOwnPropertySymbols(extProto));
+};
+dart._installPropertiesForObject = function(jsProto, coreObjProto) {
+  let names = dart.getOwnPropertyNames(coreObjProto);
+  for (let i = 0; i < names.length; ++i) {
+    let name = names[i];
+    let desc = dart.getOwnPropertyDescriptor(coreObjProto, name);
+    dart.defineProperty(jsProto, dart.getExtensionSymbol(name), desc);
+  }
+  return;
+};
+dart.registerExtension = function(jsType, dartExtType) {
+  if (!jsType) return;
+  let extProto = dartExtType.prototype;
+  let jsProto = jsType.prototype;
+  if (!jsProto) return;
+  jsProto[dart._extensionType] = dartExtType;
+  dart._installProperties(jsProto, extProto);
+  function updateSig(sigF) {
+    let originalSigFn = dart.getOwnPropertyDescriptor(dartExtType, sigF).get;
+    dart.assert(originalSigFn);
+    dart.defineMemoizedGetter(jsType, sigF, originalSigFn);
+  }
+  updateSig(dart._methodSig);
+  updateSig(dart._fieldSig);
+  updateSig(dart._getterSig);
+  updateSig(dart._setterSig);
+};
+dart.defineExtensionMembers = function(type, methodNames) {
+  let proto = type.prototype;
+  for (let name of methodNames) {
+    let method = dart.getOwnPropertyDescriptor(proto, name);
+    dart.defineProperty(proto, dart.getExtensionSymbol(name), method);
+  }
+  function upgradeSig(sigF) {
+    let originalSigFn = dart.getOwnPropertyDescriptor(type, sigF).get;
+    dart.defineMemoizedGetter(type, sigF, function() {
+      let sig = originalSigFn();
+      let propertyNames = Object.getOwnPropertyNames(sig);
+      for (let name of methodNames) {
+        if (name in sig) {
+          sig[dart.getExtensionSymbol(name)] = sig[name];
         }
-        return sig;
-      });
-    }
-    upgradeSig(dart._methodSig);
-    upgradeSig(dart._fieldSig);
-    upgradeSig(dart._getterSig);
-    upgradeSig(dart._setterSig);
-  };
-  dart.setType = function(obj, type) {
-    obj.__proto__ = type.prototype;
-    return obj;
-  };
-  dart.list = function(obj, elementType) {
-    return dart.setType(obj, dart.getGenericClass(_interceptors.JSArray)(elementType));
-  };
-  dart.setBaseClass = function(derived, base) {
+      }
+      return sig;
+    });
+  }
+  upgradeSig(dart._methodSig);
+  upgradeSig(dart._fieldSig);
+  upgradeSig(dart._getterSig);
+  upgradeSig(dart._setterSig);
+};
+dart.setType = function(obj, type) {
+  obj.__proto__ = type.prototype;
+  return obj;
+};
+dart.list = function(obj, elementType) {
+  return dart.setType(obj, dart.getGenericClass(_interceptors.JSArray)(elementType));
+};
+dart.setBaseClass = function(derived, base) {
+  derived.prototype.__proto__ = base.prototype;
+  derived.__proto__ = base;
+};
+dart.setExtensionBaseClass = function(derived, base) {
+  if (base) {
+    derived.prototype[dart._extensionType] = derived;
     derived.prototype.__proto__ = base.prototype;
-    derived.__proto__ = base;
-  };
-  dart.setExtensionBaseClass = function(derived, base) {
-    if (base) {
-      derived.prototype[dart._extensionType] = derived;
-      derived.prototype.__proto__ = base.prototype;
+  }
+};
+dart.callableClass = function(callableCtor, classExpr) {
+  callableCtor.prototype = classExpr.prototype;
+  callableCtor.prototype.constructor = callableCtor;
+  callableCtor.__proto__ = classExpr;
+  return callableCtor;
+};
+dart.defineNamedConstructorCallable = function(clazz, name, ctor) {
+  ctor.prototype = clazz.prototype;
+  dart.defineProperty(clazz, name, {value: ctor, configurable: true});
+};
+dart.defineEnumValues = function(enumClass, names) {
+  let values = [];
+  for (var i = 0; i < names.length; i++) {
+    let value = dart.const(new enumClass(i));
+    values.push(value);
+    Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
+  }
+  enumClass.values = dart.constList(values, enumClass);
+};
+dart.fn = function(closure, t) {
+  if (t == null) {
+    t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
+  }
+  dart.tag(closure, t);
+  return closure;
+};
+dart.lazyFn = function(closure, computeType) {
+  dart.tagLazy(closure, computeType);
+  return closure;
+};
+dart._checkPrimitiveType = function(obj) {
+  if (obj == null) return core.Null;
+  if (typeof obj == "number") {
+    if (Math.floor(obj) == obj) {
+      return core.int;
     }
-  };
-  dart.callableClass = function(callableCtor, classExpr) {
-    callableCtor.prototype = classExpr.prototype;
-    callableCtor.prototype.constructor = callableCtor;
-    callableCtor.__proto__ = classExpr;
-    return callableCtor;
-  };
-  dart.defineNamedConstructorCallable = function(clazz, name, ctor) {
-    ctor.prototype = clazz.prototype;
-    dart.defineProperty(clazz, name, {value: ctor, configurable: true});
-  };
-  dart.defineEnumValues = function(enumClass, names) {
-    let values = [];
-    for (var i = 0; i < names.length; i++) {
-      let value = dart.const(new enumClass(i));
-      values.push(value);
-      Object.defineProperty(enumClass, names[i], {value: value, configurable: true});
-    }
-    enumClass.values = dart.constList(values, enumClass);
-  };
-  dart.fn = function(closure, t) {
-    if (t == null) {
-      t = dart.definiteFunctionType(dart.dynamic, Array(closure.length).fill(dart.dynamic), void 0);
-    }
-    dart.tag(closure, t);
-    return closure;
-  };
-  dart.lazyFn = function(closure, computeType) {
-    dart.tagLazy(closure, computeType);
-    return closure;
-  };
-  dart._checkPrimitiveType = function(obj) {
-    if (obj == null) return core.Null;
-    if (typeof obj == "number") {
-      if (Math.floor(obj) == obj) {
-        return core.int;
-      }
-      return core.double;
-    }
-    if (typeof obj == "boolean") {
-      return core.bool;
-    }
-    if (typeof obj == "string") {
-      return core.String;
-    }
-    if (typeof obj == "symbol") {
-      return dart.jsobject;
-    }
-    return null;
-  };
-  dart.getFunctionType = function(obj) {
-    let args = Array(obj.length).fill(dart.dynamic);
-    return dart.definiteFunctionType(dart.bottom, args, void 0);
-  };
-  dart.getReifiedType = function(obj) {
-    let result = dart._checkPrimitiveType(obj);
-    if (result != null) return result;
-    return dart._nonPrimitiveRuntimeType(obj);
-  };
-  dart._nonPrimitiveRuntimeType = function(obj) {
-    let result = dart._getRuntimeType(obj);
-    if (result != null) return result;
-    result = dart.getExtensionType(obj);
-    if (result != null) return result;
-    result = obj.constructor;
-    if (result === Function) {
-      return dart.jsobject;
-    }
-    if (result == null) {
-      return dart.jsobject;
-    }
-    return result;
-  };
-  dart.wrapType = function(type) {
-    if (type.hasOwnProperty(dart._typeObject)) {
-      return type[dart._typeObject];
-    }
-    return type[dart._typeObject] = new dart.WrappedType(type);
-  };
-  dart.lazyJSType = function(getJSTypeCallback, name) {
-    let key = getJSTypeCallback.toString();
-    if (dart._lazyJSTypes.has(key)) {
-      return dart._lazyJSTypes.get(key);
-    }
-    let ret = new dart.LazyJSType(getJSTypeCallback, name);
-    dart._lazyJSTypes.set(key, ret);
-    return ret;
-  };
-  dart.lazyAnonymousJSType = function(name) {
-    if (dart._lazyJSTypes.has(name)) {
-      return dart._lazyJSTypes.get(name);
-    }
-    let ret = new dart.LazyJSType(null, name);
-    dart._lazyJSTypes.set(name, ret);
-    return ret;
-  };
-  const _wrappedType = Symbol('_wrappedType');
-  dart.unwrapType = function(obj) {
-    return obj[_wrappedType];
-  };
-  dart._getRuntimeType = function(value) {
-    return value[dart._runtimeType];
-  };
-  dart.getIsNamedConstructor = function(value) {
-    return value[dart.isNamedConstructor];
-  };
-  dart.getDartLibraryName = function(value) {
-    return value[dart_library.dartLibraryName];
-  };
-  dart.tag = function(value, t) {
-    value[dart._runtimeType] = t;
-  };
-  dart.tagComputed = function(value, compute) {
-    dart.defineProperty(value, dart._runtimeType, {get: compute});
-  };
-  dart.tagLazy = function(value, compute) {
-    dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
-  };
-  dart._warn = function(arg) {
-    console.warn(arg);
-  };
-  const _jsTypeCallback = Symbol('_jsTypeCallback');
-  const _rawJSType = Symbol('_rawJSType');
-  const _dartName = Symbol('_dartName');
-  dart._isInstanceOfLazyJSType = function(o, t) {
-    if (t[_jsTypeCallback] != null) {
-      if (t[_rawJSType] == null) {
-        let expected = t[_dartName];
-        let actual = dart.typeName(dart.getReifiedType(o));
-        dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
-        return true;
-      }
-      return dart.is(o, t[_rawJSType]);
-    }
-    if (o == null) return false;
-    return dart._isJSObject(o);
-  };
-  dart._asInstanceOfLazyJSType = function(o, t) {
-    if (t[_jsTypeCallback] != null) {
-      if (t[_rawJSType] == null) {
-        let expected = t[_dartName];
-        let actual = dart.typeName(dart.getReifiedType(o));
-        dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
-        return o;
-      }
-      return dart.as(o, t[_rawJSType]);
-    }
-    if (o == null) return null;
-    if (!dart.test(dart._isJSObject(o))) dart._throwCastError(o, t, true);
-    return o;
-  };
-  dart._isJSObject = function(o) {
-    return !dart.getReifiedType(o)[dart._runtimeType];
-  };
-  dart._initialize2 = function() {
-    dart.TypeRep.prototype.is = function is_T(object) {
-      return dart.is(object, this);
-    };
-    dart.TypeRep.prototype.as = function as_T(object) {
-      return dart.as(object, this);
-    };
-    dart.TypeRep.prototype._check = function check_T(object) {
-      return dart.check(object, this);
-    };
-    dart.Dynamic.prototype.is = function is_Dynamic(object) {
+    return core.double;
+  }
+  if (typeof obj == "boolean") {
+    return core.bool;
+  }
+  if (typeof obj == "string") {
+    return core.String;
+  }
+  if (typeof obj == "symbol") {
+    return dart.jsobject;
+  }
+  return null;
+};
+dart.getFunctionType = function(obj) {
+  let args = Array(obj.length).fill(dart.dynamic);
+  return dart.definiteFunctionType(dart.bottom, args, void 0);
+};
+dart.getReifiedType = function(obj) {
+  let result = dart._checkPrimitiveType(obj);
+  if (result != null) return result;
+  return dart._nonPrimitiveRuntimeType(obj);
+};
+dart._nonPrimitiveRuntimeType = function(obj) {
+  let result = dart._getRuntimeType(obj);
+  if (result != null) return result;
+  result = dart.getExtensionType(obj);
+  if (result != null) return result;
+  result = obj.constructor;
+  if (result === Function) {
+    return dart.jsobject;
+  }
+  if (result == null) {
+    return dart.jsobject;
+  }
+  return result;
+};
+dart.wrapType = function(type) {
+  if (type.hasOwnProperty(dart._typeObject)) {
+    return type[dart._typeObject];
+  }
+  return type[dart._typeObject] = new dart.WrappedType(type);
+};
+dart.lazyJSType = function(getJSTypeCallback, name) {
+  let key = getJSTypeCallback.toString();
+  if (dart._lazyJSTypes.has(key)) {
+    return dart._lazyJSTypes.get(key);
+  }
+  let ret = new dart.LazyJSType(getJSTypeCallback, name);
+  dart._lazyJSTypes.set(key, ret);
+  return ret;
+};
+dart.lazyAnonymousJSType = function(name) {
+  if (dart._lazyJSTypes.has(name)) {
+    return dart._lazyJSTypes.get(name);
+  }
+  let ret = new dart.LazyJSType(null, name);
+  dart._lazyJSTypes.set(name, ret);
+  return ret;
+};
+const _wrappedType = Symbol('_wrappedType');
+dart.unwrapType = function(obj) {
+  return obj[_wrappedType];
+};
+dart._getRuntimeType = function(value) {
+  return value[dart._runtimeType];
+};
+dart.getIsNamedConstructor = function(value) {
+  return value[dart.isNamedConstructor];
+};
+dart.getDartLibraryName = function(value) {
+  return value[dart_library.dartLibraryName];
+};
+dart.tag = function(value, t) {
+  value[dart._runtimeType] = t;
+};
+dart.tagComputed = function(value, compute) {
+  dart.defineProperty(value, dart._runtimeType, {get: compute});
+};
+dart.tagLazy = function(value, compute) {
+  dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
+};
+dart._warn = function(arg) {
+  console.warn(arg);
+};
+const _jsTypeCallback = Symbol('_jsTypeCallback');
+const _rawJSType = Symbol('_rawJSType');
+const _dartName = Symbol('_dartName');
+dart._isInstanceOfLazyJSType = function(o, t) {
+  if (t[_jsTypeCallback] != null) {
+    if (t[_rawJSType] == null) {
+      let expected = t[_dartName];
+      let actual = dart.typeName(dart.getReifiedType(o));
+      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
       return true;
-    };
-    dart.Dynamic.prototype.as = function as_Dynamic(object) {
-      return object;
-    };
-    dart.Dynamic.prototype._check = function check_Dynamic(object) {
-      return object;
-    };
-    dart.LazyJSType.prototype.is = function is_T(object) {
-      return dart._isInstanceOfLazyJSType(object, this);
-    };
-    dart.LazyJSType.prototype.as = function as_T(object) {
-      return dart._asInstanceOfLazyJSType(object, this);
-    };
-    dart.LazyJSType.prototype._check = function check_T(object) {
-      return dart._asInstanceOfLazyJSType(object, this);
-    };
-  };
-  dart._memoizeArray = function(map, arr, create) {
-    let len = arr.length;
-    map = dart._lookupNonTerminal(map, len);
-    for (var i = 0; i < len - 1; ++i) {
-      map = dart._lookupNonTerminal(map, arr[i]);
     }
-    let result = map.get(arr[len - 1]);
-    if (result !== void 0) return result;
-    map.set(arr[len - 1], result = create());
+    return dart.is(o, t[_rawJSType]);
+  }
+  if (o == null) return false;
+  return dart._isJSObject(o);
+};
+dart._asInstanceOfLazyJSType = function(o, t) {
+  if (t[_jsTypeCallback] != null) {
+    if (t[_rawJSType] == null) {
+      let expected = t[_dartName];
+      let actual = dart.typeName(dart.getReifiedType(o));
+      dart._warn(dart.str`Cannot find native JavaScript type (${expected}) ` + dart.str`to type check ${actual}`);
+      return o;
+    }
+    return dart.as(o, t[_rawJSType]);
+  }
+  if (o == null) return null;
+  if (!dart.test(dart._isJSObject(o))) dart._throwCastError(o, t, true);
+  return o;
+};
+dart._isJSObject = function(o) {
+  return !dart.getReifiedType(o)[dart._runtimeType];
+};
+dart._initialize2 = function() {
+  dart.TypeRep.prototype.is = function is_T(object) {
+    return dart.is(object, this);
+  };
+  dart.TypeRep.prototype.as = function as_T(object) {
+    return dart.as(object, this);
+  };
+  dart.TypeRep.prototype._check = function check_T(object) {
+    return dart.check(object, this);
+  };
+  dart.Dynamic.prototype.is = function is_Dynamic(object) {
+    return true;
+  };
+  dart.Dynamic.prototype.as = function as_Dynamic(object) {
+    return object;
+  };
+  dart.Dynamic.prototype._check = function check_Dynamic(object) {
+    return object;
+  };
+  dart.LazyJSType.prototype.is = function is_T(object) {
+    return dart._isInstanceOfLazyJSType(object, this);
+  };
+  dart.LazyJSType.prototype.as = function as_T(object) {
+    return dart._asInstanceOfLazyJSType(object, this);
+  };
+  dart.LazyJSType.prototype._check = function check_T(object) {
+    return dart._asInstanceOfLazyJSType(object, this);
+  };
+};
+dart._memoizeArray = function(map, arr, create) {
+  let len = arr.length;
+  map = dart._lookupNonTerminal(map, len);
+  for (var i = 0; i < len - 1; ++i) {
+    map = dart._lookupNonTerminal(map, arr[i]);
+  }
+  let result = map.get(arr[len - 1]);
+  if (result !== void 0) return result;
+  map.set(arr[len - 1], result = create());
+  return result;
+};
+dart._normalizeParameter = function(a) {
+  if (a instanceof Array) {
+    let result = [];
+    result.push(a[0] == dart.dynamic ? dart.bottom : a[0]);
+    result.push(a.slice(1));
+    return result;
+  }
+  return a == dart.dynamic ? dart.bottom : a;
+};
+dart._canonicalizeArray = function(definite, array, map) {
+  let arr = definite ? array : array.map(dart._normalizeParameter);
+  return dart._memoizeArray(map, arr, () => arr);
+};
+dart._canonicalizeNamed = function(definite, named, map) {
+  let key = [];
+  let names = dart.getOwnPropertyNames(named);
+  let r = {};
+  for (var i = 0; i < names.length; ++i) {
+    let name = names[i];
+    let type = named[name];
+    if (!definite) r[name] = type = dart._normalizeParameter(type);
+    key.push(name);
+    key.push(type);
+  }
+  if (!definite) named = r;
+  return dart._memoizeArray(map, key, () => named);
+};
+dart._lookupNonTerminal = function(map, key) {
+  let result = map.get(key);
+  if (result !== void 0) return result;
+  map.set(key, result = new Map());
+  return result;
+};
+dart._createSmall = function(count, definite, returnType, required) {
+  let map = dart._fnTypeSmallMap[count];
+  let args = definite ? required : required.map(dart._normalizeParameter);
+  for (var i = 0; i < count; ++i) {
+    map = dart._lookupNonTerminal(map, args[i]);
+  }
+  let result = map.get(returnType);
+  if (result !== void 0) return result;
+  result = new dart.FunctionType(returnType, args, [], {});
+  map.set(returnType, result);
+  return result;
+};
+dart.typedef = function(name, closure) {
+  return new dart.Typedef(name, closure);
+};
+dart._functionType = function(definite, returnType, args, extra) {
+  if (args === void 0 && extra === void 0) {
+    const fnTypeParts = returnType;
+    function makeGenericFnType(...types) {
+      let parts = fnTypeParts.apply(null, types);
+      return dart.FunctionType.create(definite, parts[0], parts[1], parts[2]);
+    }
+    makeGenericFnType[dart._typeFormalCount] = fnTypeParts.length;
+    return makeGenericFnType;
+  }
+  return dart.FunctionType.create(definite, returnType, args, extra);
+};
+dart.functionType = function(returnType, args, extra) {
+  return dart._functionType(false, returnType, args, extra);
+};
+dart.definiteFunctionType = function(returnType, args, extra) {
+  return dart._functionType(true, returnType, args, extra);
+};
+dart.typeName = function(type) {
+  if (type === void 0) return "undefined type";
+  if (type === null) return "null type";
+  if (type instanceof dart.TypeRep) {
+    if (type instanceof dart.Typedef) {
+      return type.name + "(" + type.functionType.toString() + ")";
+    }
+    return type.toString();
+  }
+  if (type instanceof dart.WrappedType) {
+    return "Wrapped(" + dart.unwrapType(type) + ")";
+  }
+  let tag = dart._getRuntimeType(type);
+  if (tag === core.Type) {
+    let name = type.name;
+    let args = dart.getGenericArgs(type);
+    if (!args) return name;
+    let result = name;
+    let allDynamic = true;
+    result += '<';
+    for (let i = 0; i < args.length; ++i) {
+      if (i > 0) result += ', ';
+      let argName = dart.typeName(args[i]);
+      if (argName != 'dynamic') allDynamic = false;
+      result += argName;
+    }
+    result += '>';
+    if (allDynamic) return name;
+    return result;
+  }
+  if (tag) return "Not a type: " + tag.name;
+  return "JSObject<" + type.name + ">";
+};
+dart.getImplicitFunctionType = function(type) {
+  if (dart.test(dart.isFunctionType(type))) return type;
+  return dart.getMethodType(type, 'call');
+};
+dart.isFunctionType = function(type) {
+  return type instanceof dart.AbstractFunctionType || type === core.Function;
+};
+dart.isLazyJSSubtype = function(t1, t2, isCovariant) {
+  if (dart.equals(t1, t2)) return true;
+  if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
+  return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], isCovariant);
+};
+dart.isFunctionSubtype = function(ft1, ft2, isCovariant) {
+  if (ft2 === core.Function) {
+    return true;
+  }
+  if (ft1 === core.Function) {
+    return false;
+  }
+  let ret1 = ft1.returnType;
+  let ret2 = ft2.returnType;
+  let args1 = ft1.args;
+  let args2 = ft2.args;
+  if (args1.length > args2.length) {
+    return isCovariant ? false : null;
+  }
+  for (let i = 0; i < args1.length; ++i) {
+    if (!dart._isSubtype(args2[i], args1[i], !isCovariant)) {
+      return null;
+    }
+  }
+  let optionals1 = ft1.optionals;
+  let optionals2 = ft2.optionals;
+  if (args1.length + optionals1.length < args2.length + optionals2.length) {
+    return isCovariant ? false : null;
+  }
+  let j = 0;
+  for (let i = args1.length; i < args2.length; ++i, ++j) {
+    if (!dart._isSubtype(args2[i], optionals1[j], !isCovariant)) {
+      return null;
+    }
+  }
+  for (let i = 0; i < optionals2.length; ++i, ++j) {
+    if (!dart._isSubtype(optionals2[i], optionals1[j], !isCovariant)) {
+      return null;
+    }
+  }
+  let named1 = ft1.named;
+  let named2 = ft2.named;
+  let names = dart.getOwnPropertyNames(named2);
+  for (let i = 0; i < names.length; ++i) {
+    let name = names[i];
+    let n1 = named1[name];
+    let n2 = named2[name];
+    if (n1 === void 0) {
+      return isCovariant ? false : null;
+    }
+    if (!dart._isSubtype(n2, n1, !isCovariant)) {
+      return null;
+    }
+  }
+  if (ret1 === dart.void) return dart._isTop(ret2);
+  if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
+  return true;
+};
+dart._subtypeMemo = function(f) {
+  let memo = new Map();
+  return (t1, t2) => {
+    let map = memo.get(t1);
+    let result;
+    if (map) {
+      result = map.get(t2);
+      if (result !== void 0) return result;
+    } else {
+      memo.set(t1, map = new Map());
+    }
+    result = f(t1, t2);
+    map.set(t2, result);
     return result;
   };
-  dart._normalizeParameter = function(a) {
-    if (a instanceof Array) {
-      let result = [];
-      result.push(a[0] == dart.dynamic ? dart.bottom : a[0]);
-      result.push(a.slice(1));
-      return result;
+};
+dart._isBottom = function(type) {
+  return type == dart.bottom || type == core.Null;
+};
+dart._isTop = function(type) {
+  if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
+    return dart._isTop(dart.getGenericArgs(type)[0]);
+  }
+  return type == core.Object || type == dart.dynamic || type == dart.void;
+};
+dart._isSubtype = function(t1, t2, isCovariant) {
+  if (t1 === t2) return true;
+  if (dart._isTop(t2) || dart._isBottom(t1)) {
+    return true;
+  }
+  if (dart._isBottom(t2)) return null;
+  if (dart._isTop(t1)) {
+    if (t1 === dart.dynamic) return null;
+    return false;
+  }
+  if (!(t1 instanceof dart.AbstractFunctionType) && !(t2 instanceof dart.AbstractFunctionType)) {
+    let result = dart.isClassSubType(t1, t2, isCovariant);
+    if (result === true || result === null) return result;
+  }
+  t1 = dart.getImplicitFunctionType(t1);
+  if (!t1) return false;
+  if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
+    return dart.isFunctionSubtype(t1, t2, isCovariant);
+  }
+  if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
+    return dart.isLazyJSSubtype(t1, t2, isCovariant);
+  }
+  return false;
+};
+dart.isClassSubType = function(t1, t2, isCovariant) {
+  if (t1 == t2) return true;
+  if (t1 == core.Object) return false;
+  if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
+  let raw1 = dart.getGenericClass(t1);
+  let raw2 = dart.getGenericClass(t2);
+  if (raw1 != null && raw1 == raw2) {
+    let typeArguments1 = dart.getGenericArgs(t1);
+    let typeArguments2 = dart.getGenericArgs(t2);
+    let length = typeArguments1.length;
+    if (typeArguments2.length == 0) {
+      return true;
+    } else if (length == 0) {
+      if (typeArguments2.every(dart._isTop)) return true;
+      return null;
     }
-    return a == dart.dynamic ? dart.bottom : a;
-  };
-  dart._canonicalizeArray = function(definite, array, map) {
-    let arr = definite ? array : array.map(dart._normalizeParameter);
-    return dart._memoizeArray(map, arr, () => arr);
-  };
-  dart._canonicalizeNamed = function(definite, named, map) {
-    let key = [];
-    let names = dart.getOwnPropertyNames(named);
-    let r = {};
-    for (var i = 0; i < names.length; ++i) {
-      let name = names[i];
-      let type = named[name];
-      if (!definite) r[name] = type = dart._normalizeParameter(type);
-      key.push(name);
-      key.push(type);
+    dart.assert(length == typeArguments2.length);
+    for (let i = 0; i < length; ++i) {
+      let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], isCovariant);
+      if (!result) {
+        return result;
+      }
     }
-    if (!definite) named = r;
-    return dart._memoizeArray(map, key, () => named);
+    return true;
+  }
+  if (raw1 === dart.getGenericClass(async.FutureOr)) {
+    let t1TypeArg = dart.getGenericArgs(t1)[0];
+    let t1Future = dart.getGenericClass(async.Future)(t1TypeArg);
+    return dart.isSubtype(t1Future, t2) && dart.isSubtype(t1TypeArg, t2);
+  } else if (raw2 === dart.getGenericClass(async.FutureOr)) {
+    let t2TypeArg = dart.getGenericArgs(t2)[0];
+    let t2Future = dart.getGenericClass(async.Future)(t2TypeArg);
+    return dart.isSubtype(t1, t2Future) || dart.isSubtype(t1, t2TypeArg);
+  }
+  let indefinite = false;
+  function definitive(t1, t2) {
+    let result = dart.isClassSubType(t1, t2, isCovariant);
+    if (result == null) {
+      indefinite = true;
+      return false;
+    }
+    return result;
+  }
+  if (definitive(t1.__proto__, t2)) return true;
+  let mixins = dart.getMixins(t1);
+  if (mixins) {
+    for (let m1 of mixins) {
+      if (m1 != null && definitive(m1, t2)) return true;
+    }
+  }
+  let getInterfaces = dart.getImplements(t1);
+  if (getInterfaces) {
+    for (let i1 of getInterfaces()) {
+      if (i1 != null && definitive(i1, t2)) return true;
+    }
+  }
+  if (indefinite) return null;
+  return false;
+};
+dart.isGroundType = function(type) {
+  if (type instanceof dart.AbstractFunctionType) {
+    if (!dart._isTop(type.returnType)) return false;
+    for (let i = 0; i < type.args.length; ++i) {
+      if (!dart._isBottom(type.args[i])) return false;
+    }
+    for (let i = 0; i < type.optionals.length; ++i) {
+      if (!dart._isBottom(type.optionals[i])) return false;
+    }
+    let names = dart.getOwnPropertyNames(type.named);
+    for (let i = 0; i < names.length; ++i) {
+      if (!dart._isBottom(type.named[names[i]])) return false;
+    }
+    return true;
+  }
+  let typeArgs = dart.getGenericArgs(type);
+  if (!typeArgs) return true;
+  for (let t of typeArgs) {
+    if (t != core.Object && t != dart.dynamic) return false;
+  }
+  return true;
+};
+dart.trapRuntimeErrors = function(flag) {
+  dart._trapRuntimeErrors = flag;
+};
+dart.throwCastError = function(object, actual, type) {
+  var found = dart.typeName(actual);
+  var expected = dart.typeName(type);
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new _js_helper.CastErrorImplementation(object, found, expected));
+};
+dart.throwTypeError = function(object, actual, type) {
+  var found = dart.typeName(actual);
+  var expected = dart.typeName(type);
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new _js_helper.TypeErrorImplementation(object, found, expected));
+};
+dart.throwStrongModeCastError = function(object, actual, type) {
+  var found = dart.typeName(actual);
+  var expected = dart.typeName(type);
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new _js_helper.StrongModeCastError(object, found, expected));
+};
+dart.throwStrongModeTypeError = function(object, actual, type) {
+  var found = dart.typeName(actual);
+  var expected = dart.typeName(type);
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new _js_helper.StrongModeTypeError(object, found, expected));
+};
+dart.throwUnimplementedError = function(message) {
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new core.UnimplementedError(message));
+};
+dart.throwAssertionError = function(message) {
+  if (message === void 0) message = null;
+  return (() => {
+    if (dart._trapRuntimeErrors) debugger;
+    let error = message != null ? new _js_helper.AssertionErrorWithMessage(message()) : new core.AssertionError();
+    dart.throw(error);
+  })();
+};
+dart.throwNullValueError = function() {
+  if (dart._trapRuntimeErrors) debugger;
+  dart.throw(new core.NoSuchMethodError(null, new core.Symbol('<Unexpected Null Value>'), null, null, null));
+};
+dart.syncStar = function(gen, E, ...args) {
+  const SyncIterable_E = dart.getGenericClass(_js_helper.SyncIterable)(E);
+  return new SyncIterable_E(gen, args);
+};
+dart.async = function(gen, T, ...args) {
+  let iter;
+  function onValue(res) {
+    if (res === void 0) res = null;
+    return next(iter.next(res));
+  }
+  function onError(err) {
+    return next(iter.throw(err));
+  }
+  function next(ret) {
+    if (ret.done) return ret.value;
+    let future = ret.value;
+    if (!dart.is(future, dart.getGenericClass(async.Future))) {
+      future = async.Future.value(future);
+    }
+    return future.then(dart.dynamic)(onValue, {onError: onError});
+  }
+  return dart.getGenericClass(async.Future)(T).microtask(function() {
+    iter = gen.apply(null, args)[Symbol.iterator]();
+    return onValue();
+  });
+};
+dart.asyncStar = function(gen, T, ...args) {
+  return new dart._AsyncStarStreamController(gen, T, args).controller.stream;
+};
+dart.dload = function(obj, field) {
+  let f = dart._canonicalMember(obj, field);
+  dart._trackCall(obj);
+  if (f != null) {
+    let type = dart.getType(obj);
+    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
+    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
+    if (dart.test(dart.isJsInterop(obj))) return obj[f];
+  }
+  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
+};
+dart.dloadMirror = function(obj, field) {
+  let f = dart._canonicalMember(obj, field);
+  dart._trackCall(obj);
+  if (f != null) {
+    let type = dart.getType(obj);
+    if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
+    if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
+  }
+  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
+};
+dart._stripGenericArguments = function(type) {
+  let genericClass = dart.getGenericClass(type);
+  if (genericClass != null) return genericClass();
+  return type;
+};
+dart.dputMirror = function(obj, field, value) {
+  let f = dart._canonicalMember(obj, field);
+  dart._trackCall(obj);
+  if (f != null) {
+    let objType = dart.getType(obj);
+    let setterType = dart.getSetterType(objType, f);
+    if (setterType != void 0) {
+      return obj[f] = dart.check(value, dart._stripGenericArguments(setterType.args[0]));
+    } else {
+      let fieldType = dart.getFieldType(objType, f);
+      if (fieldType != void 0) {
+        return obj[f] = dart.check(value, dart._stripGenericArguments(fieldType));
+      }
+    }
+  }
+  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
+};
+dart.dput = function(obj, field, value) {
+  let f = dart._canonicalMember(obj, field);
+  dart._trackCall(obj);
+  if (f != null) {
+    let objType = dart.getType(obj);
+    let setterType = dart.getSetterType(objType, f);
+    if (setterType != void 0) {
+      return obj[f] = dart.check(value, setterType.args[0]);
+    } else {
+      let fieldType = dart.getFieldType(objType, f);
+      if (fieldType != void 0) {
+        return obj[f] = dart.check(value, fieldType);
+      }
+      if (dart.test(dart.isJsInterop(obj))) {
+        return obj[f] = value;
+      }
+    }
+  }
+  return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
+};
+dart._checkApply = function(type, actuals) {
+  if (type instanceof Array) {
+    type = type[0];
+  }
+  if (actuals.length < type.args.length) return false;
+  let index = 0;
+  for (let i = 0; i < type.args.length; ++i) {
+    dart.check(actuals[i], type.args[i]);
+    ++index;
+  }
+  if (actuals.length == type.args.length) return true;
+  let extras = actuals.length - type.args.length;
+  if (type.optionals.length > 0) {
+    if (extras > type.optionals.length) return false;
+    for (let i = 0, j = index; i < extras; ++i, ++j) {
+      dart.check(actuals[j], type.optionals[i]);
+    }
+    return true;
+  }
+  if (extras != 1) return false;
+  if (dart.getOwnPropertyNames(type.named).length == 0) return false;
+  let opts = actuals[index];
+  let names = dart.getOwnPropertyNames(opts);
+  if (names.length == 0) return false;
+  for (var name of names) {
+    if (!dart.hasOwnProperty.call(type.named, name)) {
+      return false;
+    }
+    dart.check(opts[name], type.named[name]);
+  }
+  return true;
+};
+dart._toSymbolName = function(symbol) {
+  let str = symbol.toString();
+  return str.substring(7, str.length - 1);
+};
+dart._toDisplayName = function(name) {
+  if (name[0] === '_') {
+    switch (name) {
+      case '_get':
+      {
+        return '[]';
+      }
+      case '_set':
+      {
+        return '[]=';
+      }
+      case '_negate':
+      {
+        return 'unary-';
+      }
+      case '_constructor':
+      case '_prototype':
+      {
+        return name.substring(1);
+      }
+    }
+  }
+  return name;
+};
+dart._dartSymbol = function(name) {
+  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
+};
+dart.extractNamedArgs = function(args) {
+  if (args.length > 0) {
+    let last = args[args.length - 1];
+    if (last != null && last.__proto__ === Object.prototype) {
+      return args.pop();
+    }
+  }
+  return null;
+};
+dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
+  dart._trackCall(obj);
+  let originalTarget = obj === void 0 ? f : obj;
+  function callNSM() {
+    return dart.noSuchMethod(originalTarget, new dart.InvocationImpl(name, args, {namedArguments: dart.extractNamedArgs(args), isMethod: true}));
+  }
+  if (!(f instanceof Function)) {
+    if (f != null) {
+      ftype = dart.getMethodType(dart.getType(f), 'call');
+      f = f.call;
+    }
+    if (!(f instanceof Function)) {
+      return callNSM();
+    }
+  }
+  if (ftype === void 0) {
+    ftype = dart._getRuntimeType(f);
+  }
+  if (!ftype) {
+    if (typeArgs != null) {
+      dart.throwStrongModeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
+    }
+    return f.apply(obj, args);
+  }
+  let formalCount = ftype[dart._typeFormalCount];
+  if (formalCount != null) {
+    if (typeArgs == null) {
+      typeArgs = Array(formalCount).fill(dart.dynamic);
+    } else if (typeArgs.length != formalCount) {
+      dart.throwStrongModeError('incorrect number of arguments to generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected ' + formalCount + '.');
+    }
+    ftype = ftype.apply(null, typeArgs);
+  } else if (typeArgs != null) {
+    dart.throwStrongModeError('got type arguments to non-generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected none.');
+  }
+  if (dart._checkApply(ftype, args)) {
+    if (typeArgs != null) {
+      return f.apply(obj, typeArgs).apply(obj, args);
+    }
+    return f.apply(obj, args);
+  }
+  return callNSM();
+};
+dart.dcall = function(f, ...args) {
+  return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, null, args, 'call');
+};
+dart.dgcall = function(f, typeArgs, ...args) {
+  return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
+};
+dart._dhelperRepl = function(object, field, callback) {
+  let rawField = field;
+  if (typeof field == 'symbol') {
+    if (field in object) return callback(field);
+    field = field.toString();
+    field = field.substring('Symbol('.length, field.length - 1);
+  } else if (field.charAt(0) != '_') {
+    return callback(field);
+  }
+  if (field in object) return callback(field);
+  let proto = object;
+  while (proto !== null) {
+    let symbols = Object.getOwnPropertySymbols(proto);
+    let target = 'Symbol(' + field + ')';
+    for (let s = 0; s < symbols.length; s++) {
+      let sym = symbols[s];
+      if (target == sym.toString()) return callback(sym);
+    }
+    proto = proto.__proto__;
+  }
+  return callback(rawField);
+};
+dart.dloadRepl = function(obj, field) {
+  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
+};
+dart.dputRepl = function(obj, field, value) {
+  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
+};
+dart._callMethodRepl = function(obj, method, typeArgs, args) {
+  return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
+};
+dart.dsendRepl = function(obj, method, ...args) {
+  return dart._callMethodRepl(obj, method, null, args);
+};
+dart.dgsendRepl = function(obj, typeArgs, method, ...args) {
+  return dart._callMethodRepl(obj, method, typeArgs, args);
+};
+dart.getDynamicStats = function() {
+  let ret = JSArrayOfListOfObject().of([]);
+  let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
+  keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx._get](b).count[dartx.compareTo](dart._callMethodStats[dartx._get](a).count), StringAndStringToint()));
+  for (let key of keys) {
+    let stats = dart._callMethodStats[dartx._get](key);
+    ret[dartx.add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count]));
+  }
+  return ret;
+};
+dart.clearDynamicStats = function() {
+  dart._callMethodStats[dartx.clear]();
+};
+dart._trackCall = function(obj) {
+  if (!dart.trackProfile) return;
+  let actual = dart.getReifiedType(obj);
+  let stackStr = new Error().stack;
+  let stack = stackStr[dartx.split]('\n    at ');
+  let src = '';
+  for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
+    let frame = stack[dartx._get](i);
+    if (!dart.test(frame[dartx.contains]('dart_sdk.js'))) {
+      src = frame;
+      break;
+    }
+  }
+  let actualTypeName = dart.typeName(actual);
+  let o = dart._callMethodStats[dartx.putIfAbsent](dart.str`${actualTypeName} <${src}>`, dart.fn(() => new dart._MethodStats(actualTypeName, src), VoidTo_MethodStats()));
+  o.count = dart.notNull(o.count) + 1;
+};
+dart._callMethod = function(obj, name, typeArgs, args, displayName) {
+  let symbol = dart._canonicalMember(obj, name);
+  if (symbol == null) {
+    return dart.noSuchMethod(obj, new dart.InvocationImpl(displayName, core.List._check(args), {isMethod: true}));
+  }
+  let f = obj != null ? obj[symbol] : null;
+  let type = dart.getType(obj);
+  let ftype = dart.getMethodType(type, symbol);
+  return dart._checkAndCall(f, ftype, obj, typeArgs, args, displayName);
+};
+dart.dsend = function(obj, method, ...args) {
+  return dart._callMethod(obj, method, null, args, method);
+};
+dart.dgsend = function(obj, typeArgs, method, ...args) {
+  return dart._callMethod(obj, method, typeArgs, args, method);
+};
+dart.dindex = function(obj, index) {
+  return dart._callMethod(obj, '_get', null, [index], '[]');
+};
+dart.dsetindex = function(obj, index, value) {
+  return dart._callMethod(obj, '_set', null, [index, value], '[]=');
+};
+dart._ignoreMemo = function(f) {
+  let memo = new Map();
+  return (t1, t2) => {
+    let map = memo.get(t1);
+    let result;
+    if (map) {
+      result = map.get(t2);
+      if (result !== void 0) return result;
+    } else {
+      memo.set(t1, map = new Map());
+    }
+    result = f(t1, t2);
+    map.set(t2, result);
+    return result;
   };
-  dart._lookupNonTerminal = function(map, key) {
+};
+dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
+  let actual = dart.getReifiedType(obj);
+  let result = dart.isSubtype(actual, type);
+  if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
+  if (result === false) return false;
+  if (ignoreFromWhiteList == void 0) return result;
+  if (dart._ignoreTypeFailure(actual, type)) return true;
+  return result;
+};
+dart.instanceOfOrNull = function(obj, type) {
+  if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
+  return false;
+};
+dart.is = function(obj, type) {
+  if (obj == null) {
+    return type == core.Null || dart._isTop(type);
+  }
+  let result = dart.strongInstanceOf(obj, type);
+  if (result !== null) return result;
+  let actual = dart.getReifiedType(obj);
+  dart.throwStrongModeError('Strong mode is-check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
+};
+dart.as = function(obj, type) {
+  if (type == dart.dynamic || obj == null) return obj;
+  let result = dart.strongInstanceOf(obj, type, true);
+  if (result) return obj;
+  dart._throwCastError(obj, type, result);
+};
+dart.check = function(obj, type) {
+  if (type == dart.dynamic || obj == null) return obj;
+  let result = dart.strongInstanceOf(obj, type, true);
+  if (result) return obj;
+  dart._throwTypeError(obj, type, result);
+};
+dart.test = function(obj) {
+  if (typeof obj == 'boolean') return obj;
+  return dart.booleanConversionFailed(obj);
+};
+dart.booleanConversionFailed = function(obj) {
+  if (obj == null) {
+    dart.throw(new _js_helper.BooleanConversionAssertionError());
+  }
+  let actual = dart.getReifiedType(obj);
+  let expected = core.bool;
+  dart.throw(new _js_helper.TypeErrorImplementation.fromMessage(dart.str`type '${dart.typeName(actual)}' is not a subtype of ` + dart.str`type '${dart.typeName(expected)}' in boolean expression`));
+};
+dart._throwCastError = function(obj, type, result) {
+  let actual = dart.getReifiedType(obj);
+  if (result == false) dart.throwCastError(obj, actual, type);
+  dart.throwStrongModeCastError(obj, actual, type);
+};
+dart._throwTypeError = function(obj, type, result) {
+  let actual = dart.getReifiedType(obj);
+  if (result == false) dart.throwTypeError(obj, actual, type);
+  dart.throwStrongModeTypeError(obj, actual, type);
+};
+dart.asInt = function(obj) {
+  if (obj == null) return null;
+  if (Math.floor(obj) != obj) {
+    dart.throwCastError(obj, dart.getReifiedType(obj), core.int);
+  }
+  return obj;
+};
+dart.addSimpleTypeTests = function(ctor) {
+  ctor.is = function is_C(object) {
+    if (object instanceof this) return true;
+    return dart.is(object, this);
+  };
+  ctor.as = function as_C(object) {
+    if (object instanceof this) return object;
+    return dart.as(object, this);
+  };
+  ctor._check = function check_C(object) {
+    if (object instanceof this) return object;
+    return dart.check(object, this);
+  };
+};
+dart.addTypeTests = function(ctor) {
+  ctor.as = function as_G(object) {
+    return dart.as(object, this);
+  };
+  ctor.is = function is_G(object) {
+    return dart.is(object, this);
+  };
+  ctor._check = function check_G(object) {
+    return dart.check(object, this);
+  };
+};
+dart.equals = function(x, y) {
+  if (x == null || y == null) return x == y;
+  let eq = x['=='];
+  return eq ? eq.call(x, y) : x === y;
+};
+dart.notNull = function(x) {
+  if (x == null) dart.throwNullValueError();
+  return x;
+};
+dart.map = function(values, K, V) {
+  if (K === void 0) K = null;
+  if (V === void 0) V = null;
+  return (() => {
+    if (K == null) K = dart.dynamic;
+    if (V == null) V = dart.dynamic;
+    let map = dart.getGenericClass(collection.LinkedHashMap)(K, V).new();
+    if (Array.isArray(values)) {
+      for (let i = 0, end = values.length - 1; i < end; i += 2) {
+        let key = values[i];
+        let value = values[i + 1];
+        map._set(key, value);
+      }
+    } else if (typeof values === 'object') {
+      for (let key of dart.getOwnPropertyNames(values)) {
+        map._set(key, values[key]);
+      }
+    }
+    return map;
+  })();
+};
+dart.assert = function(condition, message) {
+  if (message === void 0) message = null;
+  return (() => {
+    if (!condition) dart.throwAssertionError(message);
+  })();
+};
+dart.throw = function(obj) {
+  dart._stack = new Error();
+  throw obj;
+};
+dart.getError = function(exception) {
+  var stack = dart._stack;
+  return stack !== null ? stack : exception;
+};
+dart.stackPrint = function(exception) {
+  var error = dart.getError(exception);
+  console.log(error.stack ? error.stack : 'No stack trace for: ' + error);
+};
+dart.stackTrace = function(exception) {
+  var error = dart.getError(exception);
+  return _js_helper.getTraceFromException(error);
+};
+dart.nullSafe = function(obj, ...callbacks) {
+  if (obj == null) return obj;
+  for (let callback of callbacks) {
+    obj = callback(obj);
+    if (obj == null) break;
+  }
+  return obj;
+};
+dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
+  for (let k of keys) {
+    let value = map.get(k);
+    if (!value) {
+      map.set(k, value = new Map());
+    }
+    map = value;
+  }
+  if (map.has(dart._value)) return map.get(dart._value);
+  let value = valueFn();
+  map.set(dart._value, value);
+  return value;
+};
+dart.const = function(obj) {
+  function lookupNonTerminal(map, key) {
     let result = map.get(key);
     if (result !== void 0) return result;
     map.set(key, result = new Map());
     return result;
-  };
-  dart._createSmall = function(count, definite, returnType, required) {
-    let map = dart._fnTypeSmallMap[count];
-    let args = definite ? required : required.map(dart._normalizeParameter);
-    for (var i = 0; i < count; ++i) {
-      map = dart._lookupNonTerminal(map, args[i]);
-    }
-    let result = map.get(returnType);
+  }
+  let names = dart.getOwnNamesAndSymbols(obj);
+  let count = names.length;
+  let map = lookupNonTerminal(dart.constants, count);
+  for (let i = 0; i < count; i++) {
+    let name = names[i];
+    map = lookupNonTerminal(map, name);
+    map = lookupNonTerminal(map, obj[name]);
+  }
+  let type = dart.getReifiedType(obj);
+  let value = map.get(type);
+  if (value) return value;
+  map.set(type, obj);
+  return obj;
+};
+dart.constList = function(elements, elementType) {
+  function lookupNonTerminal(map, key) {
+    let result = map.get(key);
     if (result !== void 0) return result;
-    result = new dart.FunctionType(returnType, args, [], {});
-    map.set(returnType, result);
+    map.set(key, result = new Map());
     return result;
-  };
-  dart.typedef = function(name, closure) {
-    return new dart.Typedef(name, closure);
-  };
-  dart._functionType = function(definite, returnType, args, extra) {
-    if (args === void 0 && extra === void 0) {
-      const fnTypeParts = returnType;
-      function makeGenericFnType(...types) {
-        let parts = fnTypeParts.apply(null, types);
-        return dart.FunctionType.create(definite, parts[0], parts[1], parts[2]);
-      }
-      makeGenericFnType[dart._typeFormalCount] = fnTypeParts.length;
-      return makeGenericFnType;
+  }
+  let count = elements.length;
+  let map = lookupNonTerminal(dart.constantLists, count);
+  for (let i = 0; i < count; i++) {
+    map = lookupNonTerminal(map, elements[i]);
+  }
+  let value = map.get(elementType);
+  if (value) return value;
+  value = dart.list(elements, elementType);
+  map.set(elementType, value);
+  return value;
+};
+dart.hashCode = function(obj) {
+  if (obj == null) return 0;
+  switch (typeof obj) {
+    case "number":
+    {
+      return obj & 0x1FFFFFFF;
     }
-    return dart.FunctionType.create(definite, returnType, args, extra);
-  };
-  dart.functionType = function(returnType, args, extra) {
-    return dart._functionType(false, returnType, args, extra);
-  };
-  dart.definiteFunctionType = function(returnType, args, extra) {
-    return dart._functionType(true, returnType, args, extra);
-  };
-  dart.typeName = function(type) {
-    if (type === void 0) return "undefined type";
-    if (type === null) return "null type";
-    if (type instanceof dart.TypeRep) {
-      if (type instanceof dart.Typedef) {
-        return type.name + "(" + type.functionType.toString() + ")";
-      }
-      return type.toString();
+    case "boolean":
+    {
+      return obj ? 2 * 3 * 23 * 3761 : 269 * 811;
     }
-    if (type instanceof dart.WrappedType) {
-      return "Wrapped(" + dart.unwrapType(type) + ")";
+    case "function":
+    {
+      return _js_helper.Primitives.objectHashCode(obj);
     }
-    let tag = dart._getRuntimeType(type);
-    if (tag === core.Type) {
-      let name = type.name;
-      let args = dart.getGenericArgs(type);
-      if (!args) return name;
-      let result = name;
-      let allDynamic = true;
-      result += '<';
-      for (let i = 0; i < args.length; ++i) {
-        if (i > 0) result += ', ';
-        let argName = dart.typeName(args[i]);
-        if (argName != 'dynamic') allDynamic = false;
-        result += argName;
-      }
-      result += '>';
-      if (allDynamic) return name;
-      return result;
-    }
-    if (tag) return "Not a type: " + tag.name;
-    return "JSObject<" + type.name + ">";
-  };
-  dart.getImplicitFunctionType = function(type) {
-    if (dart.test(dart.isFunctionType(type))) return type;
-    return dart.getMethodType(type, 'call');
-  };
-  dart.isFunctionType = function(type) {
-    return type instanceof dart.AbstractFunctionType || type === core.Function;
-  };
-  dart.isLazyJSSubtype = function(t1, t2, isCovariant) {
-    if (dart.equals(t1, t2)) return true;
-    if (t1[_jsTypeCallback] == null || t2[_jsTypeCallback] == null) return true;
-    return dart.isClassSubType(t1[_rawJSType], t2[_rawJSType], isCovariant);
-  };
-  dart.isFunctionSubtype = function(ft1, ft2, isCovariant) {
-    if (ft2 === core.Function) {
-      return true;
-    }
-    if (ft1 === core.Function) {
-      return false;
-    }
-    let ret1 = ft1.returnType;
-    let ret2 = ft2.returnType;
-    let args1 = ft1.args;
-    let args2 = ft2.args;
-    if (args1.length > args2.length) {
-      return isCovariant ? false : null;
-    }
-    for (let i = 0; i < args1.length; ++i) {
-      if (!dart._isSubtype(args2[i], args1[i], !isCovariant)) {
-        return null;
-      }
-    }
-    let optionals1 = ft1.optionals;
-    let optionals2 = ft2.optionals;
-    if (args1.length + optionals1.length < args2.length + optionals2.length) {
-      return isCovariant ? false : null;
-    }
-    let j = 0;
-    for (let i = args1.length; i < args2.length; ++i, ++j) {
-      if (!dart._isSubtype(args2[i], optionals1[j], !isCovariant)) {
-        return null;
-      }
-    }
-    for (let i = 0; i < optionals2.length; ++i, ++j) {
-      if (!dart._isSubtype(optionals2[i], optionals1[j], !isCovariant)) {
-        return null;
-      }
-    }
-    let named1 = ft1.named;
-    let named2 = ft2.named;
-    let names = dart.getOwnPropertyNames(named2);
-    for (let i = 0; i < names.length; ++i) {
-      let name = names[i];
-      let n1 = named1[name];
-      let n2 = named2[name];
-      if (n1 === void 0) {
-        return isCovariant ? false : null;
-      }
-      if (!dart._isSubtype(n2, n1, !isCovariant)) {
-        return null;
-      }
-    }
-    if (ret1 === dart.void) return dart._isTop(ret2);
-    if (!dart._isSubtype(ret1, ret2, isCovariant)) return null;
-    return true;
-  };
-  dart._subtypeMemo = function(f) {
-    let memo = new Map();
-    return (t1, t2) => {
-      let map = memo.get(t1);
-      let result;
-      if (map) {
-        result = map.get(t2);
-        if (result !== void 0) return result;
-      } else {
-        memo.set(t1, map = new Map());
-      }
-      result = f(t1, t2);
-      map.set(t2, result);
-      return result;
-    };
-  };
-  dart._isBottom = function(type) {
-    return type == dart.bottom || type == core.Null;
-  };
-  dart._isTop = function(type) {
-    if (dart.getGenericClass(type) === dart.getGenericClass(async.FutureOr)) {
-      return dart._isTop(dart.getGenericArgs(type)[0]);
-    }
-    return type == core.Object || type == dart.dynamic || type == dart.void;
-  };
-  dart._isSubtype = function(t1, t2, isCovariant) {
-    if (t1 === t2) return true;
-    if (dart._isTop(t2) || dart._isBottom(t1)) {
-      return true;
-    }
-    if (dart._isBottom(t2)) return null;
-    if (dart._isTop(t1)) {
-      if (t1 === dart.dynamic) return null;
-      return false;
-    }
-    if (!(t1 instanceof dart.AbstractFunctionType) && !(t2 instanceof dart.AbstractFunctionType)) {
-      let result = dart.isClassSubType(t1, t2, isCovariant);
-      if (result === true || result === null) return result;
-    }
-    t1 = dart.getImplicitFunctionType(t1);
-    if (!t1) return false;
-    if (dart.isFunctionType(t1) && dart.isFunctionType(t2)) {
-      return dart.isFunctionSubtype(t1, t2, isCovariant);
-    }
-    if (t1 instanceof dart.LazyJSType && t2 instanceof dart.LazyJSType) {
-      return dart.isLazyJSSubtype(t1, t2, isCovariant);
-    }
-    return false;
-  };
-  dart.isClassSubType = function(t1, t2, isCovariant) {
-    if (t1 == t2) return true;
-    if (t1 == core.Object) return false;
-    if (t1 == null) return t2 == core.Object || t2 == dart.dynamic;
-    let raw1 = dart.getGenericClass(t1);
-    let raw2 = dart.getGenericClass(t2);
-    if (raw1 != null && raw1 == raw2) {
-      let typeArguments1 = dart.getGenericArgs(t1);
-      let typeArguments2 = dart.getGenericArgs(t2);
-      let length = typeArguments1.length;
-      if (typeArguments2.length == 0) {
-        return true;
-      } else if (length == 0) {
-        if (typeArguments2.every(dart._isTop)) return true;
-        return null;
-      }
-      dart.assert(length == typeArguments2.length);
-      for (let i = 0; i < length; ++i) {
-        let result = dart._isSubtype(typeArguments1[i], typeArguments2[i], isCovariant);
-        if (!result) {
-          return result;
-        }
-      }
-      return true;
-    }
-    if (raw1 === dart.getGenericClass(async.FutureOr)) {
-      let t1TypeArg = dart.getGenericArgs(t1)[0];
-      let t1Future = dart.getGenericClass(async.Future)(t1TypeArg);
-      return dart.isSubtype(t1Future, t2) && dart.isSubtype(t1TypeArg, t2);
-    } else if (raw2 === dart.getGenericClass(async.FutureOr)) {
-      let t2TypeArg = dart.getGenericArgs(t2)[0];
-      let t2Future = dart.getGenericClass(async.Future)(t2TypeArg);
-      return dart.isSubtype(t1, t2Future) || dart.isSubtype(t1, t2TypeArg);
-    }
-    let indefinite = false;
-    function definitive(t1, t2) {
-      let result = dart.isClassSubType(t1, t2, isCovariant);
-      if (result == null) {
-        indefinite = true;
-        return false;
-      }
-      return result;
-    }
-    if (definitive(t1.__proto__, t2)) return true;
-    let mixins = dart.getMixins(t1);
-    if (mixins) {
-      for (let m1 of mixins) {
-        if (m1 != null && definitive(m1, t2)) return true;
-      }
-    }
-    let getInterfaces = dart.getImplements(t1);
-    if (getInterfaces) {
-      for (let i1 of getInterfaces()) {
-        if (i1 != null && definitive(i1, t2)) return true;
-      }
-    }
-    if (indefinite) return null;
-    return false;
-  };
-  dart.isGroundType = function(type) {
-    if (type instanceof dart.AbstractFunctionType) {
-      if (!dart._isTop(type.returnType)) return false;
-      for (let i = 0; i < type.args.length; ++i) {
-        if (!dart._isBottom(type.args[i])) return false;
-      }
-      for (let i = 0; i < type.optionals.length; ++i) {
-        if (!dart._isBottom(type.optionals[i])) return false;
-      }
-      let names = dart.getOwnPropertyNames(type.named);
-      for (let i = 0; i < names.length; ++i) {
-        if (!dart._isBottom(type.named[names[i]])) return false;
-      }
-      return true;
-    }
-    let typeArgs = dart.getGenericArgs(type);
-    if (!typeArgs) return true;
-    for (let t of typeArgs) {
-      if (t != core.Object && t != dart.dynamic) return false;
-    }
-    return true;
-  };
-  dart.trapRuntimeErrors = function(flag) {
-    dart._trapRuntimeErrors = flag;
-  };
-  dart.throwCastError = function(object, actual, type) {
-    var found = dart.typeName(actual);
-    var expected = dart.typeName(type);
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new _js_helper.CastErrorImplementation(object, found, expected));
-  };
-  dart.throwTypeError = function(object, actual, type) {
-    var found = dart.typeName(actual);
-    var expected = dart.typeName(type);
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new _js_helper.TypeErrorImplementation(object, found, expected));
-  };
-  dart.throwStrongModeCastError = function(object, actual, type) {
-    var found = dart.typeName(actual);
-    var expected = dart.typeName(type);
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new _js_helper.StrongModeCastError(object, found, expected));
-  };
-  dart.throwStrongModeTypeError = function(object, actual, type) {
-    var found = dart.typeName(actual);
-    var expected = dart.typeName(type);
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new _js_helper.StrongModeTypeError(object, found, expected));
-  };
-  dart.throwUnimplementedError = function(message) {
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new core.UnimplementedError(message));
-  };
-  dart.throwAssertionError = function(message) {
-    if (message === void 0) message = null;
-    return (() => {
-      if (dart._trapRuntimeErrors) debugger;
-      let error = message != null ? new _js_helper.AssertionErrorWithMessage(message()) : new core.AssertionError();
-      dart.throw(error);
-    })();
-  };
-  dart.throwNullValueError = function() {
-    if (dart._trapRuntimeErrors) debugger;
-    dart.throw(new core.NoSuchMethodError(null, new core.Symbol('<Unexpected Null Value>'), null, null, null));
-  };
-  dart.syncStar = function(gen, E, ...args) {
-    const SyncIterable_E = dart.getGenericClass(_js_helper.SyncIterable)(E);
-    return new SyncIterable_E(gen, args);
-  };
-  dart.async = function(gen, T, ...args) {
-    let iter;
-    function onValue(res) {
-      if (res === void 0) res = null;
-      return next(iter.next(res));
-    }
-    function onError(err) {
-      return next(iter.throw(err));
-    }
-    function next(ret) {
-      if (ret.done) return ret.value;
-      let future = ret.value;
-      if (!dart.is(future, dart.getGenericClass(async.Future))) {
-        future = async.Future.value(future);
-      }
-      return future.then(dart.dynamic)(onValue, {onError: onError});
-    }
-    return dart.getGenericClass(async.Future)(T).microtask(function() {
-      iter = gen.apply(null, args)[Symbol.iterator]();
-      return onValue();
-    });
-  };
-  dart.asyncStar = function(gen, T, ...args) {
-    return new dart._AsyncStarStreamController(gen, T, args).controller.stream;
-  };
-  dart.dload = function(obj, field) {
-    let f = dart._canonicalMember(obj, field);
-    dart._trackCall(obj);
-    if (f != null) {
-      let type = dart.getType(obj);
-      if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
-      if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
-      if (dart.test(dart.isJsInterop(obj))) return obj[f];
-    }
-    return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
-  };
-  dart.dloadMirror = function(obj, field) {
-    let f = dart._canonicalMember(obj, field);
-    dart._trackCall(obj);
-    if (f != null) {
-      let type = dart.getType(obj);
-      if (dart.test(dart.hasField(type, f)) || dart.test(dart.hasGetter(type, f))) return obj[f];
-      if (dart.test(dart.hasMethod(type, f))) return dart.bind(obj, f, void 0);
-    }
-    return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [], {isGetter: true}));
-  };
-  dart._stripGenericArguments = function(type) {
-    let genericClass = dart.getGenericClass(type);
-    if (genericClass != null) return genericClass();
-    return type;
-  };
-  dart.dputMirror = function(obj, field, value) {
-    let f = dart._canonicalMember(obj, field);
-    dart._trackCall(obj);
-    if (f != null) {
-      let objType = dart.getType(obj);
-      let setterType = dart.getSetterType(objType, f);
-      if (setterType != void 0) {
-        return obj[f] = dart.check(value, dart._stripGenericArguments(setterType.args[0]));
-      } else {
-        let fieldType = dart.getFieldType(objType, f);
-        if (fieldType != void 0) {
-          return obj[f] = dart.check(value, dart._stripGenericArguments(fieldType));
-        }
-      }
-    }
-    return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
-  };
-  dart.dput = function(obj, field, value) {
-    let f = dart._canonicalMember(obj, field);
-    dart._trackCall(obj);
-    if (f != null) {
-      let objType = dart.getType(obj);
-      let setterType = dart.getSetterType(objType, f);
-      if (setterType != void 0) {
-        return obj[f] = dart.check(value, setterType.args[0]);
-      } else {
-        let fieldType = dart.getFieldType(objType, f);
-        if (fieldType != void 0) {
-          return obj[f] = dart.check(value, fieldType);
-        }
-        if (dart.test(dart.isJsInterop(obj))) {
-          return obj[f] = value;
-        }
-      }
-    }
-    return dart.noSuchMethod(obj, new dart.InvocationImpl(field, [value], {isSetter: true}));
-  };
-  dart._checkApply = function(type, actuals) {
-    if (type instanceof Array) {
-      type = type[0];
-    }
-    if (actuals.length < type.args.length) return false;
-    let index = 0;
-    for (let i = 0; i < type.args.length; ++i) {
-      dart.check(actuals[i], type.args[i]);
-      ++index;
-    }
-    if (actuals.length == type.args.length) return true;
-    let extras = actuals.length - type.args.length;
-    if (type.optionals.length > 0) {
-      if (extras > type.optionals.length) return false;
-      for (let i = 0, j = index; i < extras; ++i, ++j) {
-        dart.check(actuals[j], type.optionals[i]);
-      }
-      return true;
-    }
-    if (extras != 1) return false;
-    if (dart.getOwnPropertyNames(type.named).length == 0) return false;
-    let opts = actuals[index];
-    let names = dart.getOwnPropertyNames(opts);
-    if (names.length == 0) return false;
-    for (var name of names) {
-      if (!dart.hasOwnProperty.call(type.named, name)) {
-        return false;
-      }
-      dart.check(opts[name], type.named[name]);
-    }
-    return true;
-  };
-  dart._toSymbolName = function(symbol) {
-    let str = symbol.toString();
-    return str.substring(7, str.length - 1);
-  };
-  dart._toDisplayName = function(name) {
-    if (name[0] === '_') {
-      switch (name) {
-        case '_get':
-        {
-          return '[]';
-        }
-        case '_set':
-        {
-          return '[]=';
-        }
-        case '_negate':
-        {
-          return 'unary-';
-        }
-        case '_constructor':
-        case '_prototype':
-        {
-          return name.substring(1);
-        }
-      }
-    }
-    return name;
-  };
-  dart._dartSymbol = function(name) {
-    return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
-  };
-  dart.extractNamedArgs = function(args) {
-    if (args.length > 0) {
-      let last = args[args.length - 1];
-      if (last != null && last.__proto__ === Object.prototype) {
-        return args.pop();
-      }
-    }
-    return null;
-  };
-  dart._checkAndCall = function(f, ftype, obj, typeArgs, args, name) {
-    dart._trackCall(obj);
-    let originalTarget = obj === void 0 ? f : obj;
-    function callNSM() {
-      return dart.noSuchMethod(originalTarget, new dart.InvocationImpl(name, args, {namedArguments: dart.extractNamedArgs(args), isMethod: true}));
-    }
-    if (!(f instanceof Function)) {
-      if (f != null) {
-        ftype = dart.getMethodType(dart.getType(f), 'call');
-        f = f.call;
-      }
-      if (!(f instanceof Function)) {
-        return callNSM();
-      }
-    }
-    if (ftype === void 0) {
-      ftype = dart._getRuntimeType(f);
-    }
-    if (!ftype) {
-      if (typeArgs != null) {
-        dart.throwStrongModeError('call to JS object `' + obj + '` with type arguments <' + typeArgs + '> is not supported.');
-      }
-      return f.apply(obj, args);
-    }
-    let formalCount = ftype[dart._typeFormalCount];
-    if (formalCount != null) {
-      if (typeArgs == null) {
-        typeArgs = Array(formalCount).fill(dart.dynamic);
-      } else if (typeArgs.length != formalCount) {
-        dart.throwStrongModeError('incorrect number of arguments to generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected ' + formalCount + '.');
-      }
-      ftype = ftype.apply(null, typeArgs);
-    } else if (typeArgs != null) {
-      dart.throwStrongModeError('got type arguments to non-generic function ' + dart.typeName(ftype) + ', got <' + typeArgs + '> expected none.');
-    }
-    if (dart._checkApply(ftype, args)) {
-      if (typeArgs != null) {
-        return f.apply(obj, typeArgs).apply(obj, args);
-      }
-      return f.apply(obj, args);
-    }
-    return callNSM();
-  };
-  dart.dcall = function(f, ...args) {
-    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, null, args, 'call');
-  };
-  dart.dgcall = function(f, typeArgs, ...args) {
-    return dart._checkAndCall(f, dart._getRuntimeType(f), void 0, typeArgs, args, 'call');
-  };
-  dart._dhelperRepl = function(object, field, callback) {
-    let rawField = field;
-    if (typeof field == 'symbol') {
-      if (field in object) return callback(field);
-      field = field.toString();
-      field = field.substring('Symbol('.length, field.length - 1);
-    } else if (field.charAt(0) != '_') {
-      return callback(field);
-    }
-    if (field in object) return callback(field);
-    let proto = object;
-    while (proto !== null) {
-      let symbols = Object.getOwnPropertySymbols(proto);
-      let target = 'Symbol(' + field + ')';
-      for (let s = 0; s < symbols.length; s++) {
-        let sym = symbols[s];
-        if (target == sym.toString()) return callback(sym);
-      }
-      proto = proto.__proto__;
-    }
-    return callback(rawField);
-  };
-  dart.dloadRepl = function(obj, field) {
-    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
-  };
-  dart.dputRepl = function(obj, field, value) {
-    return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
-  };
-  dart._callMethodRepl = function(obj, method, typeArgs, args) {
-    return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
-  };
-  dart.dsendRepl = function(obj, method, ...args) {
-    return dart._callMethodRepl(obj, method, null, args);
-  };
-  dart.dgsendRepl = function(obj, typeArgs, method, ...args) {
-    return dart._callMethodRepl(obj, method, typeArgs, args);
-  };
-  dart.getDynamicStats = function() {
-    let ret = JSArrayOfListOfObject().of([]);
-    let keys = dart._callMethodStats[dartx.keys][dartx.toList]();
-    keys[dartx.sort](dart.fn((a, b) => dart._callMethodStats[dartx._get](b).count[dartx.compareTo](dart._callMethodStats[dartx._get](a).count), StringAndStringToint()));
-    for (let key of keys) {
-      let stats = dart._callMethodStats[dartx._get](key);
-      ret[dartx.add](JSArrayOfObject().of([stats.typeName, stats.frame, stats.count]));
-    }
-    return ret;
-  };
-  dart.clearDynamicStats = function() {
-    dart._callMethodStats[dartx.clear]();
-  };
-  dart._trackCall = function(obj) {
-    if (!dart.trackProfile) return;
-    let actual = dart.getReifiedType(obj);
-    let stackStr = new Error().stack;
-    let stack = stackStr[dartx.split]('\n    at ');
-    let src = '';
-    for (let i = 2; i < dart.notNull(stack[dartx.length]); ++i) {
-      let frame = stack[dartx._get](i);
-      if (!dart.test(frame[dartx.contains]('dart_sdk.js'))) {
-        src = frame;
-        break;
-      }
-    }
-    let actualTypeName = dart.typeName(actual);
-    let o = dart._callMethodStats[dartx.putIfAbsent](dart.str`${actualTypeName} <${src}>`, dart.fn(() => new dart._MethodStats(actualTypeName, src), VoidTo_MethodStats()));
-    o.count = dart.notNull(o.count) + 1;
-  };
-  dart._callMethod = function(obj, name, typeArgs, args, displayName) {
-    let symbol = dart._canonicalMember(obj, name);
-    if (symbol == null) {
-      return dart.noSuchMethod(obj, new dart.InvocationImpl(displayName, core.List._check(args), {isMethod: true}));
-    }
-    let f = obj != null ? obj[symbol] : null;
-    let type = dart.getType(obj);
-    let ftype = dart.getMethodType(type, symbol);
-    return dart._checkAndCall(f, ftype, obj, typeArgs, args, displayName);
-  };
-  dart.dsend = function(obj, method, ...args) {
-    return dart._callMethod(obj, method, null, args, method);
-  };
-  dart.dgsend = function(obj, typeArgs, method, ...args) {
-    return dart._callMethod(obj, method, typeArgs, args, method);
-  };
-  dart.dindex = function(obj, index) {
-    return dart._callMethod(obj, '_get', null, [index], '[]');
-  };
-  dart.dsetindex = function(obj, index, value) {
-    return dart._callMethod(obj, '_set', null, [index, value], '[]=');
-  };
-  dart._ignoreMemo = function(f) {
-    let memo = new Map();
-    return (t1, t2) => {
-      let map = memo.get(t1);
-      let result;
-      if (map) {
-        result = map.get(t2);
-        if (result !== void 0) return result;
-      } else {
-        memo.set(t1, map = new Map());
-      }
-      result = f(t1, t2);
-      map.set(t2, result);
-      return result;
-    };
-  };
-  dart.strongInstanceOf = function(obj, type, ignoreFromWhiteList) {
-    let actual = dart.getReifiedType(obj);
-    let result = dart.isSubtype(actual, type);
-    if (result || actual == dart.jsobject || actual == core.int && type == core.double) return true;
-    if (result === false) return false;
-    if (ignoreFromWhiteList == void 0) return result;
-    if (dart._ignoreTypeFailure(actual, type)) return true;
-    return result;
-  };
-  dart.instanceOfOrNull = function(obj, type) {
-    if (obj == null || dart.strongInstanceOf(obj, type, true)) return true;
-    return false;
-  };
-  dart.is = function(obj, type) {
-    if (obj == null) {
-      return type == core.Null || dart._isTop(type);
-    }
-    let result = dart.strongInstanceOf(obj, type);
-    if (result !== null) return result;
-    let actual = dart.getReifiedType(obj);
-    dart.throwStrongModeError('Strong mode is-check failure: ' + dart.typeName(actual) + ' does not soundly subtype ' + dart.typeName(type));
-  };
-  dart.as = function(obj, type) {
-    if (type == dart.dynamic || obj == null) return obj;
-    let result = dart.strongInstanceOf(obj, type, true);
-    if (result) return obj;
-    dart._throwCastError(obj, type, result);
-  };
-  dart.check = function(obj, type) {
-    if (type == dart.dynamic || obj == null) return obj;
-    let result = dart.strongInstanceOf(obj, type, true);
-    if (result) return obj;
-    dart._throwTypeError(obj, type, result);
-  };
-  dart.test = function(obj) {
-    if (typeof obj == 'boolean') return obj;
-    return dart.booleanConversionFailed(obj);
-  };
-  dart.booleanConversionFailed = function(obj) {
-    if (obj == null) {
-      dart.throw(new _js_helper.BooleanConversionAssertionError());
-    }
-    let actual = dart.getReifiedType(obj);
-    let expected = core.bool;
-    dart.throw(new _js_helper.TypeErrorImplementation.fromMessage(dart.str`type '${dart.typeName(actual)}' is not a subtype of ` + dart.str`type '${dart.typeName(expected)}' in boolean expression`));
-  };
-  dart._throwCastError = function(obj, type, result) {
-    let actual = dart.getReifiedType(obj);
-    if (result == false) dart.throwCastError(obj, actual, type);
-    dart.throwStrongModeCastError(obj, actual, type);
-  };
-  dart._throwTypeError = function(obj, type, result) {
-    let actual = dart.getReifiedType(obj);
-    if (result == false) dart.throwTypeError(obj, actual, type);
-    dart.throwStrongModeTypeError(obj, actual, type);
-  };
-  dart.asInt = function(obj) {
-    if (obj == null) return null;
-    if (Math.floor(obj) != obj) {
-      dart.throwCastError(obj, dart.getReifiedType(obj), core.int);
-    }
-    return obj;
-  };
-  dart.addSimpleTypeTests = function(ctor) {
-    ctor.is = function is_C(object) {
-      if (object instanceof this) return true;
-      return dart.is(object, this);
-    };
-    ctor.as = function as_C(object) {
-      if (object instanceof this) return object;
-      return dart.as(object, this);
-    };
-    ctor._check = function check_C(object) {
-      if (object instanceof this) return object;
-      return dart.check(object, this);
-    };
-  };
-  dart.addTypeTests = function(ctor) {
-    ctor.as = function as_G(object) {
-      return dart.as(object, this);
-    };
-    ctor.is = function is_G(object) {
-      return dart.is(object, this);
-    };
-    ctor._check = function check_G(object) {
-      return dart.check(object, this);
-    };
-  };
-  dart.equals = function(x, y) {
-    if (x == null || y == null) return x == y;
-    let eq = x['=='];
-    return eq ? eq.call(x, y) : x === y;
-  };
-  dart.notNull = function(x) {
-    if (x == null) dart.throwNullValueError();
-    return x;
-  };
-  dart.map = function(values, K, V) {
-    if (K === void 0) K = null;
-    if (V === void 0) V = null;
-    return (() => {
-      if (K == null) K = dart.dynamic;
-      if (V == null) V = dart.dynamic;
-      let map = dart.getGenericClass(collection.LinkedHashMap)(K, V).new();
-      if (Array.isArray(values)) {
-        for (let i = 0, end = values.length - 1; i < end; i += 2) {
-          let key = values[i];
-          let value = values[i + 1];
-          map._set(key, value);
-        }
-      } else if (typeof values === 'object') {
-        for (let key of dart.getOwnPropertyNames(values)) {
-          map._set(key, values[key]);
-        }
-      }
-      return map;
-    })();
-  };
-  dart.assert = function(condition, message) {
-    if (message === void 0) message = null;
-    return (() => {
-      if (!condition) dart.throwAssertionError(message);
-    })();
-  };
-  dart.throw = function(obj) {
-    dart._stack = new Error();
-    throw obj;
-  };
-  dart.getError = function(exception) {
-    var stack = dart._stack;
-    return stack !== null ? stack : exception;
-  };
-  dart.stackPrint = function(exception) {
-    var error = dart.getError(exception);
-    console.log(error.stack ? error.stack : 'No stack trace for: ' + error);
-  };
-  dart.stackTrace = function(exception) {
-    var error = dart.getError(exception);
-    return _js_helper.getTraceFromException(error);
-  };
-  dart.nullSafe = function(obj, ...callbacks) {
-    if (obj == null) return obj;
-    for (let callback of callbacks) {
-      obj = callback(obj);
-      if (obj == null) break;
-    }
-    return obj;
-  };
-  dart.multiKeyPutIfAbsent = function(map, keys, valueFn) {
-    for (let k of keys) {
-      let value = map.get(k);
-      if (!value) {
-        map.set(k, value = new Map());
-      }
-      map = value;
-    }
-    if (map.has(dart._value)) return map.get(dart._value);
-    let value = valueFn();
-    map.set(dart._value, value);
+  }
+  let extension = dart.getExtensionType(obj);
+  if (extension != null) {
+    return obj[dartx.hashCode];
+  }
+  return obj.hashCode;
+};
+dart.toString = function(obj) {
+  if (obj == null) return "null";
+  let extension = dart.getExtensionType(obj);
+  if (extension != null) {
+    return obj[dartx.toString]();
+  }
+  if (typeof obj == "function") {
+    return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
+  }
+  return obj.toString();
+};
+dart.noSuchMethod = function(obj, invocation) {
+  if (obj == null || typeof obj == "function") {
+    dart.throw(new core.NoSuchMethodError(obj, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
+  }
+  let extension = dart.getExtensionType(obj);
+  if (extension != null) {
+    return obj[dartx.noSuchMethod](invocation);
+  }
+  return obj.noSuchMethod(invocation);
+};
+dart.constFn = function(x) {
+  return () => x;
+};
+dart.runtimeType = function(obj) {
+  let result = dart._checkPrimitiveType(obj);
+  if (result != null) return dart.wrapType(result);
+  let extension = dart.getExtensionType(obj);
+  if (extension != null) {
+    result = obj[dartx.runtimeType];
+    return result != null ? result : dart.wrapType(extension);
+  }
+  if (typeof obj == "function") {
+    return dart.wrapType(dart.getReifiedType(obj));
+  }
+  return obj.runtimeType;
+};
+dart.str = function(strings, ...values) {
+  let s = strings[0];
+  for (let i = 0, len = values.length; i < len;) {
+    s += dart.notNull(dart.toString(values[i])) + strings[++i];
+  }
+  return s;
+};
+dart._canonicalMember = function(obj, name) {
+  if (typeof name === "symbol") return name;
+  if (obj != null && dart.getExtensionType(obj) != null) {
+    return dartx[name];
+  }
+  if (dart.equals(name, 'constructor') || dart.equals(name, 'prototype')) {
+    name = '+' + dart.notNull(core.String._check(name));
+  }
+  return name;
+};
+dart.loadLibrary = function() {
+  return async.Future.value();
+};
+dart.defineProperty = function(obj, name, desc) {
+  return Object.defineProperty(obj, name, desc);
+};
+dart.getOwnPropertyDescriptor = function(obj, name) {
+  return Object.getOwnPropertyDescriptor(obj, name);
+};
+dart.getOwnPropertyNames = function(obj) {
+  return Object.getOwnPropertyNames(obj);
+};
+dart.getOwnPropertySymbols = function(obj) {
+  return Object.getOwnPropertySymbols(obj);
+};
+dart.throwStrongModeError = function(message) {
+  if (dart.test(dart._trapRuntimeErrors)) debugger;
+  throw new _js_helper.StrongModeErrorImplementation(message);
+};
+dart.throwInternalError = function(message) {
+  if (dart.test(dart._trapRuntimeErrors)) debugger;
+  throw Error(message);
+};
+dart.getOwnNamesAndSymbols = function(obj) {
+  let names = dart.getOwnPropertyNames(obj);
+  let symbols = dart.getOwnPropertySymbols(obj);
+  return names.concat(symbols);
+};
+dart.safeGetOwnProperty = function(obj, name) {
+  let desc = dart.getOwnPropertyDescriptor(obj, name);
+  if (desc != null) return desc.value;
+};
+dart.defineLazyProperty = function(to, name, desc) {
+  let init = desc.get;
+  let value = null;
+  function lazySetter(x) {
+    init = null;
+    value = x;
+  }
+  function circularInitError() {
+    dart.throwInternalError('circular initialization for field ' + name);
+  }
+  function lazyGetter() {
+    if (init == null) return value;
+    let f = init;
+    init = circularInitError;
+    lazySetter(f());
     return value;
-  };
-  dart.const = function(obj) {
-    function lookupNonTerminal(map, key) {
-      let result = map.get(key);
-      if (result !== void 0) return result;
-      map.set(key, result = new Map());
-      return result;
-    }
-    let names = dart.getOwnNamesAndSymbols(obj);
-    let count = names.length;
-    let map = lookupNonTerminal(dart.constants, count);
-    for (let i = 0; i < count; i++) {
-      let name = names[i];
-      map = lookupNonTerminal(map, name);
-      map = lookupNonTerminal(map, obj[name]);
-    }
-    let type = dart.getReifiedType(obj);
-    let value = map.get(type);
-    if (value) return value;
-    map.set(type, obj);
-    return obj;
-  };
-  dart.constList = function(elements, elementType) {
-    function lookupNonTerminal(map, key) {
-      let result = map.get(key);
-      if (result !== void 0) return result;
-      map.set(key, result = new Map());
-      return result;
-    }
-    let count = elements.length;
-    let map = lookupNonTerminal(dart.constantLists, count);
-    for (let i = 0; i < count; i++) {
-      map = lookupNonTerminal(map, elements[i]);
-    }
-    let value = map.get(elementType);
-    if (value) return value;
-    value = dart.list(elements, elementType);
-    map.set(elementType, value);
-    return value;
-  };
-  dart.hashCode = function(obj) {
-    if (obj == null) return 0;
-    switch (typeof obj) {
-      case "number":
-      {
-        return obj & 0x1FFFFFFF;
+  }
+  desc.get = lazyGetter;
+  desc.configurable = true;
+  if (desc.set) desc.set = lazySetter;
+  return dart.defineProperty(to, name, desc);
+};
+dart.defineLazy = function(to, from) {
+  for (let name of dart.getOwnNamesAndSymbols(from)) {
+    dart.defineLazyProperty(to, name, dart.getOwnPropertyDescriptor(from, name));
+  }
+};
+dart.defineMemoizedGetter = function(obj, name, getter) {
+  return dart.defineLazyProperty(obj, name, {get: getter});
+};
+dart.copyTheseProperties = function(to, from, names) {
+  for (let i = 0; i < names.length; ++i) {
+    dart.copyProperty(to, from, names[i]);
+  }
+  return to;
+};
+dart.copyProperty = function(to, from, name) {
+  let desc = dart.getOwnPropertyDescriptor(from, name);
+  if (name == Symbol.iterator) {
+    let existing = dart.getOwnPropertyDescriptor(to, name);
+    if (existing != null) {
+      if (existing.writable) {
+        to[name] = desc.value;
       }
-      case "boolean":
-      {
-        return obj ? 2 * 3 * 23 * 3761 : 269 * 811;
+      return;
+    }
+  }
+  dart.defineProperty(to, name, desc);
+};
+dart.export = function(to, from, name) {
+  return dart.copyProperty(to, from, name);
+};
+dart.copyProperties = function(to, from) {
+  return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
+};
+dart.global = (function() {
+  if (typeof NodeList !== "undefined") {
+    NodeList.prototype.get = function(i) {
+      return this[i];
+    };
+    NamedNodeMap.prototype.get = function(i) {
+      return this[i];
+    };
+    DOMTokenList.prototype.get = function(i) {
+      return this[i];
+    };
+    HTMLCollection.prototype.get = function(i) {
+      return this[i];
+    };
+    if (typeof PannerNode == "undefined") {
+      let audioContext;
+      if (typeof AudioContext == "undefined" && typeof webkitAudioContext != "undefined") {
+        audioContext = new webkitAudioContext();
+      } else {
+        audioContext = new AudioContext();
+        window.StereoPannerNode = audioContext.createStereoPanner().constructor;
       }
-      case "function":
-      {
-        return _js_helper.Primitives.objectHashCode(obj);
+      window.PannerNode = audioContext.createPanner().constructor;
+    }
+    if (typeof AudioSourceNode == "undefined") {
+      window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
+    }
+    if (typeof FontFaceSet == "undefined") {
+      window.FontFaceSet = document.fonts.__proto__.constructor;
+    }
+    if (typeof MemoryInfo == "undefined") {
+      if (typeof window.performance.memory != "undefined") {
+        window.MemoryInfo = window.performance.memory.constructor;
       }
     }
-    let extension = dart.getExtensionType(obj);
-    if (extension != null) {
-      return obj[dartx.hashCode];
+    if (typeof Geolocation == "undefined") {
+      navigator.geolocation.constructor;
     }
-    return obj.hashCode;
-  };
-  dart.toString = function(obj) {
-    if (obj == null) return "null";
-    let extension = dart.getExtensionType(obj);
-    if (extension != null) {
-      return obj[dartx.toString]();
-    }
-    if (typeof obj == "function") {
-      return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
-    }
-    return obj.toString();
-  };
-  dart.noSuchMethod = function(obj, invocation) {
-    if (obj == null || typeof obj == "function") {
-      dart.throw(new core.NoSuchMethodError(obj, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
-    }
-    let extension = dart.getExtensionType(obj);
-    if (extension != null) {
-      return obj[dartx.noSuchMethod](invocation);
-    }
-    return obj.noSuchMethod(invocation);
-  };
-  dart.constFn = function(x) {
-    return () => x;
-  };
-  dart.runtimeType = function(obj) {
-    let result = dart._checkPrimitiveType(obj);
-    if (result != null) return dart.wrapType(result);
-    let extension = dart.getExtensionType(obj);
-    if (extension != null) {
-      result = obj[dartx.runtimeType];
-      return result != null ? result : dart.wrapType(extension);
-    }
-    if (typeof obj == "function") {
-      return dart.wrapType(dart.getReifiedType(obj));
-    }
-    return obj.runtimeType;
-  };
-  dart.str = function(strings, ...values) {
-    let s = strings[0];
-    for (let i = 0, len = values.length; i < len;) {
-      s += dart.notNull(dart.toString(values[i])) + strings[++i];
-    }
-    return s;
-  };
-  dart._canonicalMember = function(obj, name) {
-    if (typeof name === "symbol") return name;
-    if (obj != null && dart.getExtensionType(obj) != null) {
-      return dartx[name];
-    }
-    if (dart.equals(name, 'constructor') || dart.equals(name, 'prototype')) {
-      name = '+' + dart.notNull(core.String._check(name));
-    }
-    return name;
-  };
-  dart.loadLibrary = function() {
-    return async.Future.value();
-  };
-  dart.defineProperty = function(obj, name, desc) {
-    return Object.defineProperty(obj, name, desc);
-  };
-  dart.getOwnPropertyDescriptor = function(obj, name) {
-    return Object.getOwnPropertyDescriptor(obj, name);
-  };
-  dart.getOwnPropertyNames = function(obj) {
-    return Object.getOwnPropertyNames(obj);
-  };
-  dart.getOwnPropertySymbols = function(obj) {
-    return Object.getOwnPropertySymbols(obj);
-  };
-  dart.throwStrongModeError = function(message) {
-    if (dart.test(dart._trapRuntimeErrors)) debugger;
-    throw new _js_helper.StrongModeErrorImplementation(message);
-  };
-  dart.throwInternalError = function(message) {
-    if (dart.test(dart._trapRuntimeErrors)) debugger;
-    throw Error(message);
-  };
-  dart.getOwnNamesAndSymbols = function(obj) {
-    let names = dart.getOwnPropertyNames(obj);
-    let symbols = dart.getOwnPropertySymbols(obj);
-    return names.concat(symbols);
-  };
-  dart.safeGetOwnProperty = function(obj, name) {
-    let desc = dart.getOwnPropertyDescriptor(obj, name);
-    if (desc != null) return desc.value;
-  };
-  dart.defineLazyProperty = function(to, name, desc) {
-    let init = desc.get;
-    let value = null;
-    function lazySetter(x) {
-      init = null;
-      value = x;
-    }
-    function circularInitError() {
-      dart.throwInternalError('circular initialization for field ' + name);
-    }
-    function lazyGetter() {
-      if (init == null) return value;
-      let f = init;
-      init = circularInitError;
-      lazySetter(f());
-      return value;
-    }
-    desc.get = lazyGetter;
-    desc.configurable = true;
-    if (desc.set) desc.set = lazySetter;
-    return dart.defineProperty(to, name, desc);
-  };
-  dart.defineLazy = function(to, from) {
-    for (let name of dart.getOwnNamesAndSymbols(from)) {
-      dart.defineLazyProperty(to, name, dart.getOwnPropertyDescriptor(from, name));
-    }
-  };
-  dart.defineMemoizedGetter = function(obj, name, getter) {
-    return dart.defineLazyProperty(obj, name, {get: getter});
-  };
-  dart.copyTheseProperties = function(to, from, names) {
-    for (let i = 0; i < names.length; ++i) {
-      dart.copyProperty(to, from, names[i]);
-    }
-    return to;
-  };
-  dart.copyProperty = function(to, from, name) {
-    let desc = dart.getOwnPropertyDescriptor(from, name);
-    if (name == Symbol.iterator) {
-      let existing = dart.getOwnPropertyDescriptor(to, name);
-      if (existing != null) {
-        if (existing.writable) {
-          to[name] = desc.value;
-        }
-        return;
+    if (typeof Animation == "undefined") {
+      let d = document.createElement('div');
+      if (typeof d.animate != "undefined") {
+        window.Animation = d.animate(d).constructor;
       }
     }
-    dart.defineProperty(to, name, desc);
-  };
-  dart.export = function(to, from, name) {
-    return dart.copyProperty(to, from, name);
-  };
-  dart.copyProperties = function(to, from) {
-    return dart.copyTheseProperties(to, from, dart.getOwnNamesAndSymbols(from));
-  };
-  dart.global = (function() {
-    if (typeof NodeList !== "undefined") {
-      NodeList.prototype.get = function(i) {
-        return this[i];
-      };
-      NamedNodeMap.prototype.get = function(i) {
-        return this[i];
-      };
-      DOMTokenList.prototype.get = function(i) {
-        return this[i];
-      };
-      HTMLCollection.prototype.get = function(i) {
-        return this[i];
-      };
-      if (typeof PannerNode == "undefined") {
-        let audioContext;
-        if (typeof AudioContext == "undefined" && typeof webkitAudioContext != "undefined") {
-          audioContext = new webkitAudioContext();
-        } else {
-          audioContext = new AudioContext();
-          window.StereoPannerNode = audioContext.createStereoPanner().constructor;
-        }
-        window.PannerNode = audioContext.createPanner().constructor;
+    if (typeof SourceBufferList == "undefined") {
+      window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
+    }
+  }
+  var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {};
+  return globalState;
+})();
+dart.JsSymbol = Symbol;
+dart._mixins = Symbol("mixins");
+dart.implements = Symbol("implements");
+dart._typeArguments = Symbol("typeArguments");
+dart._originalDeclaration = Symbol("originalDeclaration");
+dart._constructorSig = Symbol("sigCtor");
+dart._methodSig = Symbol("sigMethod");
+dart._fieldSig = Symbol("sigField");
+dart._getterSig = Symbol("sigGetter");
+dart._setterSig = Symbol("sigSetter");
+dart._staticSig = Symbol("sigStaticMethod");
+dart._staticFieldSig = Symbol("sigStaticField");
+dart._staticGetterSig = Symbol("sigStaticGetter");
+dart._staticSetterSig = Symbol("sigStaticSetter");
+dart._genericTypeCtor = Symbol("genericType");
+dart._extensionType = Symbol("extensionType");
+dart.dartx = dartx;
+dart._runtimeType = Symbol("_runtimeType");
+dart.isNamedConstructor = Symbol("isNamedConstructor");
+dart.defineLazy(dart, {
+  get _lazyJSTypes() {
+    return new Map();
+  },
+  set _lazyJSTypes(_) {}
+});
+dart.metadata = Symbol("metadata");
+dart._typeObject = Symbol("typeObject");
+core.Object = class Object {
+  constructor(...args) {
+    return this.new.apply(this, args);
+  }
+  new() {
+  }
+  ['=='](other) {
+    return core.identical(this, other);
+  }
+  get hashCode() {
+    return _js_helper.Primitives.objectHashCode(this);
+  }
+  toString() {
+    return _js_helper.Primitives.objectToString(this);
+  }
+  noSuchMethod(invocation) {
+    dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
+  }
+  get runtimeType() {
+    return dart.wrapType(dart.getReifiedType(this));
+  }
+};
+core.Object.is = function is_Object(o) {
+  if (o instanceof this) return true;
+  return dart.is(o, this);
+};
+core.Object.as = function as_Object(o) {
+  if (o == null || o instanceof this) return o;
+  return dart.as(o, this);
+};
+core.Object._check = function check_Object(o) {
+  if (o == null || o instanceof this) return o;
+  return dart.check(o, this);
+};
+dart.setSignature(core.Object, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Object, [])}),
+  getters: () => ({
+    hashCode: dart.definiteFunctionType(core.int, []),
+    runtimeType: dart.definiteFunctionType(core.Type, [])
+  }),
+  methods: () => ({
+    '==': dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    toString: dart.definiteFunctionType(core.String, []),
+    noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
+  })
+});
+dart.tagComputed(core.Object, () => core.Type);
+dart.TypeRep = class TypeRep extends core.Object {
+  new() {
+    dart._initialize;
+  }
+  get name() {
+    return this.toString();
+  }
+};
+dart.TypeRep[dart.implements] = () => [core.Type];
+dart.setSignature(dart.TypeRep, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.TypeRep, [])}),
+  getters: () => ({name: dart.definiteFunctionType(core.String, [])})
+});
+dart.Dynamic = class Dynamic extends dart.TypeRep {
+  new() {
+    super.new();
+  }
+  toString() {
+    return 'dynamic';
+  }
+};
+dart.LazyJSType = class LazyJSType extends core.Object {
+  new(jsTypeCallback, dartName) {
+    this[_jsTypeCallback] = jsTypeCallback;
+    this[_dartName] = dartName;
+  }
+  get [_rawJSType]() {
+    return this[_jsTypeCallback]();
+  }
+  toString() {
+    return core.String._check(this[_jsTypeCallback] != null ? dart.typeName(this[_rawJSType]) : this[_dartName]);
+  }
+};
+dart.LazyJSType[dart.implements] = () => [core.Type];
+dart.setSignature(dart.LazyJSType, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.LazyJSType, [dart.dynamic, dart.dynamic])}),
+  fields: () => ({
+    [_jsTypeCallback]: dart.dynamic,
+    [_dartName]: dart.dynamic
+  }),
+  getters: () => ({[_rawJSType]: dart.definiteFunctionType(dart.dynamic, [])})
+});
+dart.dynamic = new dart.Dynamic();
+dart._initialize = dart._initialize2();
+dart.Void = class Void extends dart.TypeRep {
+  new() {
+    super.new();
+  }
+  toString() {
+    return 'void';
+  }
+};
+dart.void = new dart.Void();
+dart.Bottom = class Bottom extends dart.TypeRep {
+  new() {
+    super.new();
+  }
+  toString() {
+    return 'bottom';
+  }
+};
+dart.bottom = new dart.Bottom();
+dart.JSObject = class JSObject extends dart.TypeRep {
+  new() {
+    super.new();
+  }
+  toString() {
+    return 'NativeJavaScriptObject';
+  }
+};
+dart.jsobject = new dart.JSObject();
+core.Type = class Type extends core.Object {};
+dart.WrappedType = class WrappedType extends core.Type {
+  new(wrappedType) {
+    this[_wrappedType] = wrappedType;
+  }
+  toString() {
+    return dart.typeName(this[_wrappedType]);
+  }
+};
+dart.setSignature(dart.WrappedType, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
+  fields: () => ({[_wrappedType]: dart.dynamic})
+});
+const _stringValue = Symbol('_stringValue');
+dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
+  new() {
+    this[_stringValue] = null;
+    super.new();
+  }
+  toString() {
+    return this.name;
+  }
+  get name() {
+    if (this[_stringValue] != null) return this[_stringValue];
+    let buffer = '(';
+    for (let i = 0; i < this.args.length; ++i) {
+      if (i > 0) {
+        buffer = dart.notNull(buffer) + ', ';
       }
-      if (typeof AudioSourceNode == "undefined") {
-        window.AudioSourceNode = MediaElementAudioSourceNode.__proto__;
+      buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.args[i]));
+    }
+    if (this.optionals.length > 0) {
+      if (this.args.length > 0) {
+        buffer = dart.notNull(buffer) + ', ';
       }
-      if (typeof FontFaceSet == "undefined") {
-        window.FontFaceSet = document.fonts.__proto__.constructor;
-      }
-      if (typeof MemoryInfo == "undefined") {
-        if (typeof window.performance.memory != "undefined") {
-          window.MemoryInfo = window.performance.memory.constructor;
-        }
-      }
-      if (typeof Geolocation == "undefined") {
-        navigator.geolocation.constructor;
-      }
-      if (typeof Animation == "undefined") {
-        let d = document.createElement('div');
-        if (typeof d.animate != "undefined") {
-          window.Animation = d.animate(d).constructor;
-        }
-      }
-      if (typeof SourceBufferList == "undefined") {
-        window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
-      }
-    }
-    return typeof window == "undefined" ? global : window;
-  })();
-  dart.JsSymbol = Symbol;
-  dart._mixins = Symbol("mixins");
-  dart.implements = Symbol("implements");
-  dart._typeArguments = Symbol("typeArguments");
-  dart._originalDeclaration = Symbol("originalDeclaration");
-  dart._constructorSig = Symbol("sigCtor");
-  dart._methodSig = Symbol("sigMethod");
-  dart._fieldSig = Symbol("sigField");
-  dart._getterSig = Symbol("sigGetter");
-  dart._setterSig = Symbol("sigSetter");
-  dart._staticSig = Symbol("sigStaticMethod");
-  dart._staticFieldSig = Symbol("sigStaticField");
-  dart._staticGetterSig = Symbol("sigStaticGetter");
-  dart._staticSetterSig = Symbol("sigStaticSetter");
-  dart._genericTypeCtor = Symbol("genericType");
-  dart._extensionType = Symbol("extensionType");
-  dart.dartx = dartx;
-  dart._runtimeType = Symbol("_runtimeType");
-  dart.isNamedConstructor = Symbol("isNamedConstructor");
-  dart.defineLazy(dart, {
-    get _lazyJSTypes() {
-      return new Map();
-    },
-    set _lazyJSTypes(_) {}
-  });
-  dart.metadata = Symbol("metadata");
-  dart._typeObject = Symbol("typeObject");
-  core.Object = class Object {
-    constructor(...args) {
-      return this.new.apply(this, args);
-    }
-    new() {
-    }
-    ['=='](other) {
-      return core.identical(this, other);
-    }
-    get hashCode() {
-      return _js_helper.Primitives.objectHashCode(this);
-    }
-    toString() {
-      return _js_helper.Primitives.objectToString(this);
-    }
-    noSuchMethod(invocation) {
-      dart.throw(new core.NoSuchMethodError(this, invocation.memberName, invocation.positionalArguments, invocation.namedArguments));
-    }
-    get runtimeType() {
-      return dart.wrapType(dart.getReifiedType(this));
-    }
-  };
-  core.Object.is = function is_Object(o) {
-    if (o instanceof this) return true;
-    return dart.is(o, this);
-  };
-  core.Object.as = function as_Object(o) {
-    if (o == null || o instanceof this) return o;
-    return dart.as(o, this);
-  };
-  core.Object._check = function check_Object(o) {
-    if (o == null || o instanceof this) return o;
-    return dart.check(o, this);
-  };
-  dart.setSignature(core.Object, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Object, [])}),
-    getters: () => ({
-      hashCode: dart.definiteFunctionType(core.int, []),
-      runtimeType: dart.definiteFunctionType(core.Type, [])
-    }),
-    methods: () => ({
-      '==': dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      toString: dart.definiteFunctionType(core.String, []),
-      noSuchMethod: dart.definiteFunctionType(dart.dynamic, [core.Invocation])
-    })
-  });
-  dart.tagComputed(core.Object, () => core.Type);
-  dart.TypeRep = class TypeRep extends core.Object {
-    new() {
-      dart._initialize;
-    }
-    get name() {
-      return this.toString();
-    }
-  };
-  dart.TypeRep[dart.implements] = () => [core.Type];
-  dart.setSignature(dart.TypeRep, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.TypeRep, [])}),
-    getters: () => ({name: dart.definiteFunctionType(core.String, [])})
-  });
-  dart.Dynamic = class Dynamic extends dart.TypeRep {
-    new() {
-      super.new();
-    }
-    toString() {
-      return 'dynamic';
-    }
-  };
-  dart.LazyJSType = class LazyJSType extends core.Object {
-    new(jsTypeCallback, dartName) {
-      this[_jsTypeCallback] = jsTypeCallback;
-      this[_dartName] = dartName;
-    }
-    get [_rawJSType]() {
-      return this[_jsTypeCallback]();
-    }
-    toString() {
-      return core.String._check(this[_jsTypeCallback] != null ? dart.typeName(this[_rawJSType]) : this[_dartName]);
-    }
-  };
-  dart.LazyJSType[dart.implements] = () => [core.Type];
-  dart.setSignature(dart.LazyJSType, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.LazyJSType, [dart.dynamic, dart.dynamic])}),
-    fields: () => ({
-      [_jsTypeCallback]: dart.dynamic,
-      [_dartName]: dart.dynamic
-    }),
-    getters: () => ({[_rawJSType]: dart.definiteFunctionType(dart.dynamic, [])})
-  });
-  dart.dynamic = new dart.Dynamic();
-  dart._initialize = dart._initialize2();
-  dart.Void = class Void extends dart.TypeRep {
-    new() {
-      super.new();
-    }
-    toString() {
-      return 'void';
-    }
-  };
-  dart.void = new dart.Void();
-  dart.Bottom = class Bottom extends dart.TypeRep {
-    new() {
-      super.new();
-    }
-    toString() {
-      return 'bottom';
-    }
-  };
-  dart.bottom = new dart.Bottom();
-  dart.JSObject = class JSObject extends dart.TypeRep {
-    new() {
-      super.new();
-    }
-    toString() {
-      return 'NativeJavaScriptObject';
-    }
-  };
-  dart.jsobject = new dart.JSObject();
-  core.Type = class Type extends core.Object {};
-  dart.WrappedType = class WrappedType extends core.Type {
-    new(wrappedType) {
-      this[_wrappedType] = wrappedType;
-    }
-    toString() {
-      return dart.typeName(this[_wrappedType]);
-    }
-  };
-  dart.setSignature(dart.WrappedType, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.WrappedType, [dart.dynamic])}),
-    fields: () => ({[_wrappedType]: dart.dynamic})
-  });
-  const _stringValue = Symbol('_stringValue');
-  dart.AbstractFunctionType = class AbstractFunctionType extends dart.TypeRep {
-    new() {
-      this[_stringValue] = null;
-      super.new();
-    }
-    toString() {
-      return this.name;
-    }
-    get name() {
-      if (this[_stringValue] != null) return this[_stringValue];
-      let buffer = '(';
-      for (let i = 0; i < this.args.length; ++i) {
+      buffer = dart.notNull(buffer) + '[';
+      for (let i = 0; i < this.optionals.length; ++i) {
         if (i > 0) {
           buffer = dart.notNull(buffer) + ', ';
         }
-        buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.args[i]));
+        buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.optionals[i]));
       }
-      if (this.optionals.length > 0) {
-        if (this.args.length > 0) {
+      buffer = dart.notNull(buffer) + ']';
+    } else if (Object.keys(this.named).length > 0) {
+      if (this.args.length > 0) {
+        buffer = dart.notNull(buffer) + ', ';
+      }
+      buffer = dart.notNull(buffer) + '{';
+      let names = dart.getOwnPropertyNames(this.named);
+      names.sort();
+      for (let i = 0; i < names.length; ++i) {
+        if (i > 0) {
           buffer = dart.notNull(buffer) + ', ';
         }
-        buffer = dart.notNull(buffer) + '[';
-        for (let i = 0; i < this.optionals.length; ++i) {
-          if (i > 0) {
-            buffer = dart.notNull(buffer) + ', ';
-          }
-          buffer = dart.notNull(buffer) + dart.notNull(dart.typeName(this.optionals[i]));
-        }
-        buffer = dart.notNull(buffer) + ']';
-      } else if (Object.keys(this.named).length > 0) {
-        if (this.args.length > 0) {
-          buffer = dart.notNull(buffer) + ', ';
-        }
-        buffer = dart.notNull(buffer) + '{';
-        let names = dart.getOwnPropertyNames(this.named);
-        names.sort();
-        for (let i = 0; i < names.length; ++i) {
-          if (i > 0) {
-            buffer = dart.notNull(buffer) + ', ';
-          }
-          let typeNameString = dart.typeName(this.named[names[i]]);
-          buffer = dart.notNull(buffer) + dart.str`${names[i]}: ${typeNameString}`;
-        }
-        buffer = dart.notNull(buffer) + '}';
+        let typeNameString = dart.typeName(this.named[names[i]]);
+        buffer = dart.notNull(buffer) + dart.str`${names[i]}: ${typeNameString}`;
       }
-      let returnTypeName = dart.typeName(this.returnType);
-      buffer = dart.notNull(buffer) + dart.str`) -> ${returnTypeName}`;
-      this[_stringValue] = buffer;
-      return buffer;
+      buffer = dart.notNull(buffer) + '}';
     }
-  };
-  dart.setSignature(dart.AbstractFunctionType, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.AbstractFunctionType, [])}),
-    fields: () => ({[_stringValue]: core.String})
-  });
-  dart._fnTypeNamedArgMap = new Map();
-  dart._fnTypeArrayArgMap = new Map();
-  dart._fnTypeTypeMap = new Map();
-  dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
-  const _process = Symbol('_process');
-  dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
-    static create(definite, returnType, args, extra) {
-      if (extra === void 0 && args.length < 3) {
-        return dart._createSmall(args.length, definite, returnType, args);
-      }
-      args = dart._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
-      let keys = null;
-      let create = null;
-      if (extra === void 0) {
-        keys = [returnType, args];
-        create = dart.fn(() => new dart.FunctionType(returnType, args, [], {}), VoidToFunctionType());
-      } else if (extra instanceof Array) {
-        let optionals = dart._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
-        keys = [returnType, args, optionals];
-        create = dart.fn(() => new dart.FunctionType(returnType, args, optionals, {}), VoidToFunctionType());
+    let returnTypeName = dart.typeName(this.returnType);
+    buffer = dart.notNull(buffer) + dart.str`) -> ${returnTypeName}`;
+    this[_stringValue] = buffer;
+    return buffer;
+  }
+};
+dart.setSignature(dart.AbstractFunctionType, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.AbstractFunctionType, [])}),
+  fields: () => ({[_stringValue]: core.String})
+});
+dart._fnTypeNamedArgMap = new Map();
+dart._fnTypeArrayArgMap = new Map();
+dart._fnTypeTypeMap = new Map();
+dart._fnTypeSmallMap = [new Map(), new Map(), new Map()];
+const _process = Symbol('_process');
+dart.FunctionType = class FunctionType extends dart.AbstractFunctionType {
+  static create(definite, returnType, args, extra) {
+    if (extra === void 0 && args.length < 3) {
+      return dart._createSmall(args.length, definite, returnType, args);
+    }
+    args = dart._canonicalizeArray(definite, args, dart._fnTypeArrayArgMap);
+    let keys = null;
+    let create = null;
+    if (extra === void 0) {
+      keys = [returnType, args];
+      create = dart.fn(() => new dart.FunctionType(returnType, args, [], {}), VoidToFunctionType());
+    } else if (extra instanceof Array) {
+      let optionals = dart._canonicalizeArray(definite, extra, dart._fnTypeArrayArgMap);
+      keys = [returnType, args, optionals];
+      create = dart.fn(() => new dart.FunctionType(returnType, args, optionals, {}), VoidToFunctionType());
+    } else {
+      let named = dart._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
+      keys = [returnType, args, named];
+      create = dart.fn(() => new dart.FunctionType(returnType, args, [], named), VoidToFunctionType());
+    }
+    return dart._memoizeArray(dart._fnTypeTypeMap, keys, create);
+  }
+  [_process](array, metadata) {
+    let result = [];
+    for (let i = 0; i < array.length; ++i) {
+      let arg = array[i];
+      if (arg instanceof Array) {
+        dart.dsend(metadata, 'add', arg.slice(1));
+        result[dartx.add](arg[0]);
       } else {
-        let named = dart._canonicalizeNamed(definite, extra, dart._fnTypeNamedArgMap);
-        keys = [returnType, args, named];
-        create = dart.fn(() => new dart.FunctionType(returnType, args, [], named), VoidToFunctionType());
+        metadata.push([]);
+        result.push(arg);
       }
-      return dart._memoizeArray(dart._fnTypeTypeMap, keys, create);
     }
-    [_process](array, metadata) {
-      let result = [];
-      for (let i = 0; i < array.length; ++i) {
-        let arg = array[i];
-        if (arg instanceof Array) {
-          dart.dsend(metadata, 'add', arg.slice(1));
-          result[dartx.add](arg[0]);
+    return result;
+  }
+  new(returnType, args, optionals, named) {
+    this.returnType = returnType;
+    this.args = args;
+    this.optionals = optionals;
+    this.named = named;
+    this.metadata = null;
+    super.new();
+    this.metadata = [];
+    this.args = this[_process](this.args, this.metadata);
+    this.optionals = this[_process](this.optionals, this.metadata);
+  }
+};
+dart.setSignature(dart.FunctionType, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.FunctionType, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  fields: () => ({
+    returnType: dart.dynamic,
+    args: dart.dynamic,
+    optionals: dart.dynamic,
+    named: dart.dynamic,
+    metadata: dart.dynamic
+  }),
+  methods: () => ({[_process]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])}),
+  statics: () => ({create: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  names: ['create']
+});
+const _name = Symbol('_name');
+const _closure = Symbol('_closure');
+const _functionType = Symbol('_functionType');
+dart.Typedef = class Typedef extends dart.AbstractFunctionType {
+  new(name, closure) {
+    this[_name] = name;
+    this[_closure] = closure;
+    this[_functionType] = null;
+    super.new();
+  }
+  get name() {
+    return core.String._check(this[_name]);
+  }
+  get functionType() {
+    if (this[_functionType] == null) {
+      this[_functionType] = this[_closure]();
+    }
+    return this[_functionType];
+  }
+  get returnType() {
+    return this.functionType.returnType;
+  }
+  get args() {
+    return core.List._check(this.functionType.args);
+  }
+  get optionals() {
+    return core.List._check(this.functionType.optionals);
+  }
+  get named() {
+    return this.functionType.named;
+  }
+  get metadata() {
+    return core.List._check(this.functionType.metadata);
+  }
+};
+dart.setSignature(dart.Typedef, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.Typedef, [dart.dynamic, dart.dynamic])}),
+  fields: () => ({
+    [_name]: dart.dynamic,
+    [_closure]: dart.dynamic,
+    [_functionType]: dart.AbstractFunctionType
+  }),
+  getters: () => ({
+    functionType: dart.definiteFunctionType(dart.AbstractFunctionType, []),
+    returnType: dart.definiteFunctionType(dart.dynamic, []),
+    args: dart.definiteFunctionType(core.List, []),
+    optionals: dart.definiteFunctionType(core.List, []),
+    named: dart.definiteFunctionType(dart.dynamic, []),
+    metadata: dart.definiteFunctionType(core.List, [])
+  })
+});
+dart._typeFormalCount = Symbol("_typeFormalCount");
+dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
+dart._trapRuntimeErrors = true;
+dart._jsIterator = Symbol("_jsIterator");
+dart._current = Symbol("_current");
+dart._AsyncStarStreamController = class _AsyncStarStreamController {
+  constructor(generator, T, args) {
+    this.isAdding = false;
+    this.isWaiting = false;
+    this.isScheduled = false;
+    this.isSuspendedAtYield = false;
+    this.canceler = null;
+    this.iterator = generator(this, ...args)[Symbol.iterator]();
+    this.controller = dart.getGenericClass(async.StreamController)(T).new({
+      onListen: () => this.scheduleGenerator(),
+      onResume: () => this.onResume(),
+      onCancel: () => this.onCancel()
+    });
+  }
+  onResume() {
+    if (this.isSuspendedAtYield) {
+      this.scheduleGenerator();
+    }
+  }
+  onCancel() {
+    if (this.controller.isClosed) {
+      return null;
+    }
+    if (this.canceler == null) {
+      this.canceler = async.Completer.new();
+      this.scheduleGenerator();
+    }
+    return this.canceler.future;
+  }
+  close() {
+    if (this.canceler != null && !this.canceler.isCompleted) {
+      this.canceler.complete();
+    }
+    this.controller.close();
+  }
+  scheduleGenerator() {
+    if (this.isScheduled || this.controller.isPaused || this.isAdding || this.isWaiting) {
+      return;
+    }
+    this.isScheduled = true;
+    async.scheduleMicrotask(() => this.runBody());
+  }
+  runBody(opt_awaitValue) {
+    this.isScheduled = false;
+    this.isSuspendedAtYield = false;
+    this.isWaiting = false;
+    let iter;
+    try {
+      iter = this.iterator.next(opt_awaitValue);
+    } catch (e) {
+      this.addError(e, dart.stackTrace(e));
+      this.close();
+      return;
+    }
+
+    if (iter.done) {
+      this.close();
+      return;
+    }
+    if (this.isSuspendedAtYield || this.isAdding) return;
+    this.isWaiting = true;
+    let future = iter.value;
+    if (!dart.is(future, dart.getGenericClass(async.Future))) {
+      future = async.Future.value(future);
+    }
+    return future.then(dart.dynamic)(x => this.runBody(x), {
+      onError: (e, s) => this.throwError(e, s)
+    });
+  }
+  add(event) {
+    if (!this.controller.hasListener) return true;
+    this.controller.add(event);
+    this.scheduleGenerator();
+    this.isSuspendedAtYield = true;
+    return false;
+  }
+  addStream(stream) {
+    if (!this.controller.hasListener) return true;
+    this.isAdding = true;
+    this.controller.addStream(stream, {cancelOnError: false}).then(dart.dynamic)(() => {
+      this.isAdding = false;
+      this.scheduleGenerator();
+    }, {
+      onError: (e, s) => this.throwError(e, s)
+    });
+  }
+  throwError(error, stackTrace) {
+    try {
+      this.iterator.throw(error);
+    } catch (e) {
+      this.addError(e, stackTrace);
+    }
+
+  }
+  addError(error, stackTrace) {
+    if (this.canceler != null && !this.canceler.isCompleted) {
+      this.canceler.completeError(error, stackTrace);
+      return;
+    }
+    if (!this.controller.hasListener) return;
+    this.controller.addError(error, stackTrace);
+  }
+};
+core.Invocation = class Invocation extends core.Object {
+  get isAccessor() {
+    return dart.test(this.isGetter) || dart.test(this.isSetter);
+  }
+};
+dart.setSignature(core.Invocation, {
+  getters: () => ({isAccessor: dart.definiteFunctionType(core.bool, [])})
+});
+dart.InvocationImpl = class InvocationImpl extends core.Invocation {
+  new(memberName, positionalArguments, opts) {
+    let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
+    let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
+    let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
+    let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
+    this.positionalArguments = positionalArguments;
+    this.isMethod = isMethod;
+    this.isGetter = isGetter;
+    this.isSetter = isSetter;
+    this.memberName = dart._dartSymbol(memberName);
+    this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
+  }
+  static _namedArgsToSymbols(namedArgs) {
+    if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
+    return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
+  }
+};
+dart.setSignature(dart.InvocationImpl, {
+  constructors: () => ({new: dart.definiteFunctionType(dart.InvocationImpl, [dart.dynamic, core.List], {namedArguments: dart.dynamic, isMethod: core.bool, isGetter: core.bool, isSetter: core.bool})}),
+  fields: () => ({
+    memberName: core.Symbol,
+    positionalArguments: core.List,
+    namedArguments: MapOfSymbol$dynamic(),
+    isMethod: core.bool,
+    isGetter: core.bool,
+    isSetter: core.bool
+  }),
+  statics: () => ({_namedArgsToSymbols: dart.definiteFunctionType(core.Map$(core.Symbol, dart.dynamic), [dart.dynamic])}),
+  names: ['_namedArgsToSymbols']
+});
+dart._MethodStats = class _MethodStats extends core.Object {
+  new(typeName, frame) {
+    this.typeName = typeName;
+    this.frame = frame;
+    this.count = null;
+    this.count = 0;
+  }
+};
+dart.setSignature(dart._MethodStats, {
+  constructors: () => ({new: dart.definiteFunctionType(dart._MethodStats, [core.String, core.String])}),
+  fields: () => ({
+    typeName: core.String,
+    frame: core.String,
+    count: core.int
+  })
+});
+dart.defineLazy(dart, {
+  get _callMethodStats() {
+    return MapOfString$_MethodStats().new();
+  },
+  set _callMethodStats(_) {}
+});
+dart.defineLazy(dart, {
+  get trackProfile() {
+    return dart.global.trackDdcProfile;
+  },
+  set trackProfile(_) {}
+});
+dart._ignoreTypeFailure = (() => {
+  return dart._ignoreMemo((actual, type) => {
+    if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
+      console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
+      return true;
+    }
+    return false;
+  });
+})();
+dart._stack = null;
+dart._value = Symbol("_value");
+dart.constants = new Map();
+dart.constantLists = new Map();
+dart.JsIterator = class JsIterator {
+  constructor(dartIterator) {
+    this.dartIterator = dartIterator;
+  }
+  next() {
+    let i = this.dartIterator;
+    let done = !i.moveNext();
+    return {done: done, value: done ? void 0 : i.current};
+  }
+};
+dart.hasOwnProperty = Object.prototype.hasOwnProperty;
+_debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_debugger.JsonMLConfig, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLConfig, [core.String])}),
+  fields: () => ({name: core.String}),
+  sfields: () => ({
+    none: _debugger.JsonMLConfig,
+    skipDart: _debugger.JsonMLConfig,
+    keyToString: _debugger.JsonMLConfig,
+    asClass: _debugger.JsonMLConfig
+  })
+});
+dart.defineLazy(_debugger.JsonMLConfig, {
+  get none() {
+    return dart.const(new _debugger.JsonMLConfig("none"));
+  },
+  get skipDart() {
+    return dart.const(new _debugger.JsonMLConfig("skipDart"));
+  },
+  get keyToString() {
+    return dart.const(new _debugger.JsonMLConfig("keyToString"));
+  },
+  get asClass() {
+    return dart.const(new _debugger.JsonMLConfig("asClass"));
+  }
+});
+_debugger._maxSpanLength = 100;
+dart.defineLazy(_debugger, {
+  get _devtoolsFormatter() {
+    return new _debugger.JsonMLFormatter(new _debugger.DartFormatter());
+  },
+  set _devtoolsFormatter(_) {}
+});
+_debugger._typeof = function(object) {
+  return typeof object;
+};
+dart.lazyFn(_debugger._typeof, () => dynamicToString());
+_debugger.getOwnPropertyNames = function(object) {
+  return dart.list(Object.getOwnPropertyNames(object), core.String);
+};
+dart.lazyFn(_debugger.getOwnPropertyNames, () => dynamicToListOfString());
+_debugger.getOwnPropertySymbols = function(object) {
+  return Object.getOwnPropertySymbols(object);
+};
+dart.lazyFn(_debugger.getOwnPropertySymbols, () => dynamicToList());
+_debugger.JSNative = class JSNative extends core.Object {
+  static getProperty(object, name) {
+    return object[name];
+  }
+  static setProperty(object, name, value) {
+    return object[name] = value;
+  }
+};
+dart.setSignature(_debugger.JSNative, {
+  statics: () => ({
+    getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['getProperty', 'setProperty']
+});
+_debugger.addMetadataChildren = function(object, ret) {
+  ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
+};
+dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
+_debugger.getObjectTypeName = function(object) {
+  let reifiedType = dart.getReifiedType(object);
+  if (reifiedType == null) {
+    if (_debugger._typeof(object) == 'function') {
+      return '[[Raw JavaScript Function]]';
+    }
+    return '<Error getting type name>';
+  }
+  return _debugger.getTypeName(core.Type._check(reifiedType));
+};
+dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
+_debugger.getTypeName = function(type) {
+  let name = dart.typeName(type);
+  if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
+  return name;
+};
+dart.lazyFn(_debugger.getTypeName, () => TypeToString());
+_debugger._getType = function(object) {
+  return core.Type.is(object) ? object : dart.getReifiedType(object);
+};
+dart.fn(_debugger._getType, dynamicToObject());
+const _simpleFormatter = Symbol('_simpleFormatter');
+_debugger.safePreview = function(object, config) {
+  try {
+    let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
+    if (preview != null) return preview;
+    return dart.toString(object);
+  } catch (e) {
+    return dart.str`<Exception thrown> ${e}`;
+  }
+
+};
+dart.lazyFn(_debugger.safePreview, () => dynamicAnddynamicToString());
+_debugger.symbolName = function(symbol) {
+  let name = dart.toString(symbol);
+  dart.assert(name[dartx.startsWith]('Symbol('));
+  return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dartx.length]) - 1);
+};
+dart.lazyFn(_debugger.symbolName, () => dynamicToString());
+_debugger.hasMethod = function(object, name) {
+  try {
+    return core.bool._check(dart.hasMethod(object, name));
+  } catch (e) {
+    return false;
+  }
+
+};
+dart.lazyFn(_debugger.hasMethod, () => dynamicAndStringTobool());
+_debugger.NameValuePair = class NameValuePair extends core.Object {
+  new(opts) {
+    let name = opts && 'name' in opts ? opts.name : null;
+    let value = opts && 'value' in opts ? opts.value : null;
+    let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
+    let hideName = opts && 'hideName' in opts ? opts.hideName : false;
+    this.name = name;
+    this.value = value;
+    this.config = config;
+    this.hideName = hideName;
+  }
+  ['=='](other) {
+    return _debugger.NameValuePair.is(other) && other.name == this.name;
+  }
+  get hashCode() {
+    return dart.hashCode(this.name);
+  }
+  get displayName() {
+    return dart.test(this.hideName) ? '' : this.name;
+  }
+};
+dart.setSignature(_debugger.NameValuePair, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, config: _debugger.JsonMLConfig, hideName: core.bool})}),
+  fields: () => ({
+    name: core.String,
+    value: core.Object,
+    config: _debugger.JsonMLConfig,
+    hideName: core.bool
+  }),
+  getters: () => ({displayName: dart.definiteFunctionType(core.String, [])})
+});
+_debugger.MapEntry = class MapEntry extends core.Object {
+  new(opts) {
+    let key = opts && 'key' in opts ? opts.key : null;
+    let value = opts && 'value' in opts ? opts.value : null;
+    this.key = key;
+    this.value = value;
+  }
+};
+dart.setSignature(_debugger.MapEntry, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})}),
+  fields: () => ({
+    key: core.Object,
+    value: core.Object
+  })
+});
+_debugger.IterableSpan = class IterableSpan extends core.Object {
+  new(start, end, iterable) {
+    this.start = start;
+    this.end = end;
+    this.iterable = iterable;
+  }
+  get length() {
+    return dart.notNull(this.end) - dart.notNull(this.start);
+  }
+  get maxPowerOfSubsetSize() {
+    return (dart.notNull(math.log(dart.notNull(this.length) - 0.5)) / dart.notNull(math.log(_debugger._maxSpanLength)))[dartx.truncate]();
+  }
+  get subsetSize() {
+    return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
+  }
+  asMap() {
+    return this.iterable[dartx.skip](this.start)[dartx.take](this.length)[dartx.toList]()[dartx.asMap]();
+  }
+  children() {
+    let children = JSArrayOfNameValuePair().of([]);
+    if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
+      this.asMap()[dartx.forEach](dart.fn((i, element) => {
+        children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
+      }, intAnddynamicToNull()));
+    } else {
+      for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
+        let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
+        if (subSpan.length == 1) {
+          children[dartx.add](new _debugger.NameValuePair({name: dart.toString(i), value: this.iterable[dartx.elementAt](i)}));
         } else {
-          metadata.push([]);
-          result.push(arg);
+          children[dartx.add](new _debugger.NameValuePair({name: dart.str`[${i}...${dart.notNull(subSpan.end) - 1}]`, value: subSpan, hideName: true}));
         }
       }
+    }
+    return children;
+  }
+};
+dart.setSignature(_debugger.IterableSpan, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.IterableSpan, [core.int, core.int, core.Iterable])}),
+  fields: () => ({
+    start: core.int,
+    end: core.int,
+    iterable: core.Iterable
+  }),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    maxPowerOfSubsetSize: dart.definiteFunctionType(core.int, []),
+    subsetSize: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    asMap: dart.definiteFunctionType(core.Map$(core.int, dart.dynamic), []),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [])
+  })
+});
+_debugger.Library = class Library extends core.Object {
+  new(name, object) {
+    this.name = name;
+    this.object = object;
+  }
+};
+dart.setSignature(_debugger.Library, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.Library, [core.String, core.Object])}),
+  fields: () => ({
+    name: core.String,
+    object: core.Object
+  })
+});
+_debugger.NamedConstructor = class NamedConstructor extends core.Object {
+  new(object) {
+    this.object = object;
+  }
+};
+dart.setSignature(_debugger.NamedConstructor, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.NamedConstructor, [core.Object])}),
+  fields: () => ({object: core.Object})
+});
+_debugger.HeritageClause = class HeritageClause extends core.Object {
+  new(name, types) {
+    this.name = name;
+    this.types = types;
+  }
+};
+dart.setSignature(_debugger.HeritageClause, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.HeritageClause, [core.String, core.List])}),
+  fields: () => ({
+    name: core.String,
+    types: core.List
+  })
+});
+_debugger.safeGetProperty = function(protoChain, name) {
+  try {
+    return _debugger.JSNative.getProperty(protoChain, name);
+  } catch (e) {
+    return dart.str`<Exception thrown> ${e}`;
+  }
+
+};
+dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
+_debugger.safeProperties = function(object) {
+  return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
+};
+dart.fn(_debugger.safeProperties, dynamicTodynamic$());
+const _attributes = Symbol('_attributes');
+const _jsonML = Symbol('_jsonML');
+_debugger.JsonMLElement = class JsonMLElement extends core.Object {
+  new(tagName) {
+    this[_attributes] = null;
+    this[_jsonML] = null;
+    this[_attributes] = {};
+    this[_jsonML] = [tagName, this[_attributes]];
+  }
+  appendChild(element) {
+    this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
+  }
+  createChild(tagName) {
+    let c = new _debugger.JsonMLElement(tagName);
+    this[_jsonML][dartx.add](c.toJsonML());
+    return c;
+  }
+  createObjectTag(object) {
+    return (() => {
+      let _ = this.createChild('object');
+      _.addAttribute('object', object);
+      return _;
+    })();
+  }
+  setStyle(style) {
+    dart.dput(this[_attributes], 'style', style);
+  }
+  addStyle(style) {
+    if (dart.dload(this[_attributes], 'style') == null) {
+      dart.dput(this[_attributes], 'style', style);
+    } else {
+      let o = this[_attributes];
+      dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
+    }
+  }
+  addAttribute(key, value) {
+    _debugger.JSNative.setProperty(this[_attributes], key, value);
+  }
+  createTextChild(text) {
+    this[_jsonML][dartx.add](text);
+  }
+  toJsonML() {
+    return this[_jsonML];
+  }
+};
+dart.setSignature(_debugger.JsonMLElement, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic])}),
+  fields: () => ({
+    [_attributes]: dart.dynamic,
+    [_jsonML]: core.List
+  }),
+  methods: () => ({
+    appendChild: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    createChild: dart.definiteFunctionType(_debugger.JsonMLElement, [core.String]),
+    createObjectTag: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic]),
+    setStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    addStyle: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    addAttribute: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    createTextChild: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    toJsonML: dart.definiteFunctionType(dart.dynamic, [])
+  })
+});
+_debugger.isNativeJavaScriptObject = function(object) {
+  let type = _debugger._typeof(object);
+  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
+};
+dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
+_debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
+  new(simpleFormatter) {
+    this[_simpleFormatter] = simpleFormatter;
+    this.customFormattersOn = false;
+  }
+  setMaxSpanLengthForTestingOnly(spanLength) {
+    _debugger._maxSpanLength = spanLength;
+  }
+  header(object, config) {
+    this.customFormattersOn = true;
+    if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
+      return null;
+    }
+    let c = this[_simpleFormatter].preview(object, config);
+    if (c == null) return null;
+    if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
+      c = dart.toString(object);
+    }
+    let element = new _debugger.JsonMLElement('span');
+    element.setStyle('background-color: #d9edf7;');
+    element.createTextChild(c);
+    return element.toJsonML();
+  }
+  hasBody(object, config) {
+    return this[_simpleFormatter].hasChildren(object, config);
+  }
+  body(object, config) {
+    let body = new _debugger.JsonMLElement('ol');
+    body.setStyle('list-style-type: none;' + 'padding-left: 0px;' + 'margin-top: 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px;');
+    if (core.StackTrace.is(object)) {
+      body.addStyle('color: rgb(196, 26, 22);');
+    }
+    let children = this[_simpleFormatter].children(object, config);
+    for (let child of children) {
+      let li = body.createChild('li');
+      let nameSpan = new _debugger.JsonMLElement('span');
+      nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
+      nameSpan.setStyle('color: rgb(136, 19, 145);');
+      if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
+        nameSpan.addStyle("padding-left: 13px;");
+        li.appendChild(nameSpan);
+        let objectTag = li.createObjectTag(child.value);
+        objectTag.addAttribute('config', child.config);
+        if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
+          li.setStyle("padding-left: 13px;");
+        }
+      } else {
+        li.setStyle("padding-left: 13px;");
+        let _ = li.createChild('span');
+        _.appendChild(nameSpan);
+        _.createTextChild(_debugger.safePreview(child.value, child.config));
+      }
+    }
+    return body.toJsonML();
+  }
+};
+dart.setSignature(_debugger.JsonMLFormatter, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLFormatter, [_debugger.DartFormatter])}),
+  fields: () => ({
+    [_simpleFormatter]: _debugger.DartFormatter,
+    customFormattersOn: core.bool
+  }),
+  methods: () => ({
+    setMaxSpanLengthForTestingOnly: dart.definiteFunctionType(dart.void, [core.int]),
+    header: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    hasBody: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    body: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])
+  })
+});
+_debugger.Formatter = class Formatter extends core.Object {};
+const _formatters = Symbol('_formatters');
+_debugger.DartFormatter = class DartFormatter extends core.Object {
+  new() {
+    this[_formatters] = null;
+    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
+  }
+  preview(object, config) {
+    try {
+      if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
+        return dart.toString(object);
+      }
+      for (let formatter of this[_formatters]) {
+        if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
+      }
+    } catch (e) {
+      let trace = dart.stackTrace(e);
+      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
+    }
+
+    return null;
+  }
+  hasChildren(object, config) {
+    if (object == null) return false;
+    try {
+      for (let formatter of this[_formatters]) {
+        if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
+      }
+    } catch (e) {
+      let trace = dart.stackTrace(e);
+      html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
+    }
+
+    return false;
+  }
+  children(object, config) {
+    try {
+      if (object != null) {
+        for (let formatter of this[_formatters]) {
+          if (dart.test(formatter.accept(object, config))) return formatter.children(object);
+        }
+      }
+    } catch (e) {
+      let trace = dart.stackTrace(e);
+      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
+    }
+
+    return JSArrayOfNameValuePair().of([]);
+  }
+};
+dart.setSignature(_debugger.DartFormatter, {
+  constructors: () => ({new: dart.definiteFunctionType(_debugger.DartFormatter, [])}),
+  fields: () => ({[_formatters]: ListOfFormatter()}),
+  methods: () => ({
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
+  })
+});
+_debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
+  accept(object, config) {
+    return !dart.test(_debugger.isNativeJavaScriptObject(object));
+  }
+  preview(object) {
+    return _debugger.getObjectTypeName(object);
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    let properties = LinkedHashSetOfNameValuePair().new();
+    _debugger.addMetadataChildren(object, properties);
+    let current = object;
+    let protoChain = JSArrayOfObject().of([]);
+    while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
+      protoChain[dartx.add](current);
+      current = _debugger.safeGetProperty(current, '__proto__');
+    }
+    for (current of protoChain) {
+      for (let symbol of _debugger.getOwnPropertySymbols(current)) {
+        let dartName = _debugger.symbolName(symbol);
+        if (dart.test(_debugger.hasMethod(object, dartName))) {
+          continue;
+        }
+        let dartXPrefix = 'dartx.';
+        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
+          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
+        } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
+          continue;
+        }
+        let value = _debugger.safeGetProperty(object, symbol);
+        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
+      }
+    }
+    for (current of protoChain) {
+      let className = dart.dload(dart.getReifiedType(current), 'name');
+      for (let name of _debugger.getOwnPropertyNames(current)) {
+        if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
+        if (dart.test(_debugger.hasMethod(object, name))) {
+          continue;
+        }
+        let value = _debugger.safeGetProperty(object, name);
+        properties.add(new _debugger.NameValuePair({name: name, value: value}));
+      }
+    }
+    return properties.toList();
+  }
+};
+dart.setSignature(_debugger.ObjectFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  }),
+  sfields: () => ({_customNames: SetOfString()})
+});
+dart.defineLazy(_debugger.ObjectFormatter, {
+  get _customNames() {
+    return (() => {
+      let _ = SetOfString().new();
+      _.add('constructor');
+      _.add('prototype');
+      _.add('__proto__');
+      return _;
+    })();
+  },
+  set _customNames(_) {}
+});
+_debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
+  accept(object, config) {
+    return dart.getDartLibraryName(object) != null;
+  }
+  hasChildren(object) {
+    return true;
+  }
+  preview(object) {
+    let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
+    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
+      dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
+    }
+    return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
+  }
+  children(object) {
+    let children = LinkedHashSetOfNameValuePair().new();
+    for (let name of _debugger.getOwnPropertyNames(object)) {
+      let value = _debugger.safeGetProperty(object, name);
+      name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
+      children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
+    }
+    return children.toList();
+  }
+};
+_debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.LibraryModuleFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
+  new() {
+    this.genericParameters = HashMapOfString$String().new();
+  }
+  accept(object, config) {
+    return _debugger.Library.is(object);
+  }
+  hasChildren(object) {
+    return true;
+  }
+  preview(object) {
+    return core.String._check(dart.dload(object, 'name'));
+  }
+  children(object) {
+    let children = LinkedHashSetOfNameValuePair().new();
+    let nonGenericProperties = LinkedHashMapOfString$Object().new();
+    let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
+    dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
+      let genericTypeConstructor = dart.getGenericTypeCtor(value);
+      if (genericTypeConstructor != null) {
+        this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
+      } else {
+        nonGenericProperties._set(core.String._check(name), value);
+      }
+    }, dynamicAnddynamicToNull()));
+    nonGenericProperties.forEach(dart.fn((name, value) => {
+      if (core.Type.is(value)) {
+        children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
+      } else {
+        children.add(new _debugger.NameValuePair({name: name, value: value}));
+      }
+    }, StringAndObjectToNull()));
+    return children.toList();
+  }
+  recordGenericParameters(name, genericTypeConstructor) {
+    this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
+  }
+  classChild(name, child) {
+    let typeName = _debugger.getTypeName(core.Type._check(child));
+    let parameterName = dart.str`${name}\$`;
+    if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
+      typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
+      _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
+    }
+    return new _debugger.NameValuePair({name: typeName, value: child});
+  }
+};
+_debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.LibraryFormatter, {
+  fields: () => ({genericParameters: HashMapOfString$String()}),
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
+    recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
+    classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
+  })
+});
+_debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
+  accept(object, config) {
+    if (_debugger._typeof(object) != 'function') return false;
+    return dart.getReifiedType(object) != null;
+  }
+  hasChildren(object) {
+    return true;
+  }
+  preview(object) {
+    return dart.typeName(dart.getReifiedType(object));
+  }
+  children(object) {
+    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
+  }
+};
+_debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.FunctionFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.MapFormatter = class MapFormatter extends core.Object {
+  accept(object, config) {
+    return core.Map.is(object);
+  }
+  hasChildren(object) {
+    return true;
+  }
+  preview(object) {
+    let map = core.Map._check(object);
+    return dart.str`${_debugger.getObjectTypeName(map)} length ${map[dartx.length]}`;
+  }
+  children(object) {
+    let map = core.Map._check(object);
+    let entries = LinkedHashSetOfNameValuePair().new();
+    map[dartx.forEach](dart.fn((key, value) => {
+      let entryWrapper = new _debugger.MapEntry({key: key, value: value});
+      entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
+    }, dynamicAnddynamicToNull()));
+    _debugger.addMetadataChildren(object, entries);
+    return entries.toList();
+  }
+};
+_debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.MapFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.IterableFormatter = class IterableFormatter extends core.Object {
+  accept(object, config) {
+    return core.Iterable.is(object);
+  }
+  preview(object) {
+    let iterable = core.Iterable._check(object);
+    try {
+      let length = iterable[dartx.length];
+      return dart.str`${_debugger.getObjectTypeName(iterable)} length ${length}`;
+    } catch (_) {
+      return dart.str`${_debugger.getObjectTypeName(iterable)}`;
+    }
+
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    let children = LinkedHashSetOfNameValuePair().new();
+    children.addAll(new _debugger.IterableSpan(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
+    _debugger.addMetadataChildren(object, children);
+    return children.toList();
+  }
+};
+_debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.IterableFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
+  accept(object, config) {
+    return _debugger.NamedConstructor.is(object);
+  }
+  preview(object) {
+    return 'Named Constructor';
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
+  }
+};
+_debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.NamedConstructorFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
+  accept(object, config) {
+    return _debugger.MapEntry.is(object);
+  }
+  preview(object) {
+    let entry = _debugger.MapEntry._check(object);
+    return dart.str`${_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)} => ${_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none)}`;
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
+  }
+};
+_debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.MapEntryFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
+  accept(object, config) {
+    return _debugger.HeritageClause.is(object);
+  }
+  preview(object) {
+    let clause = _debugger.HeritageClause._check(object);
+    let typeNames = clause.types[dartx.map](core.String)(_debugger.getTypeName);
+    return dart.str`${clause.name} ${typeNames[dartx.join](", ")}`;
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    let clause = _debugger.HeritageClause._check(object);
+    let children = JSArrayOfNameValuePair().of([]);
+    for (let type of clause.types) {
+      children[dartx.add](new _debugger.NameValuePair({value: type, config: _debugger.JsonMLConfig.asClass}));
+    }
+    return children;
+  }
+};
+_debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.HeritageClauseFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
+  accept(object, config) {
+    return _debugger.IterableSpan.is(object);
+  }
+  preview(object) {
+    return dart.str`[${dart.dload(object, 'start')}...${dart.dsend(dart.dload(object, 'end'), '-', 1)}]`;
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    return ListOfNameValuePair()._check(dart.dsend(object, 'children'));
+  }
+};
+_debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.IterableSpanFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
+  accept(object, config) {
+    return core.StackTrace.is(object);
+  }
+  preview(object) {
+    return 'StackTrace';
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    return dart.toString(object)[dartx.split]('\n')[dartx.map](_debugger.NameValuePair)(dart.fn(line => new _debugger.NameValuePair({value: line[dartx.replaceFirst](core.RegExp.new('^\\s+at\\s'), ''), hideName: true}), StringToNameValuePair()))[dartx.toList]();
+  }
+};
+_debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.StackTraceFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.ClassFormatter = class ClassFormatter extends core.Object {
+  accept(object, config) {
+    return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
+  }
+  preview(object) {
+    let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
+    if (typeName != null) return core.String._check(typeName);
+    let type = _debugger._getType(object);
+    let implements$ = dart.getImplements(type);
+    typeName = _debugger.getTypeName(core.Type._check(type));
+    if (implements$ != null) {
+      let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
+      return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
+    } else {
+      return core.String._check(typeName);
+    }
+  }
+  hasChildren(object) {
+    return true;
+  }
+  children(object) {
+    let type = _debugger._getType(object);
+    let children = JSArrayOfNameValuePair().of([]);
+    let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
+    let mixins = dart.getMixins(type);
+    if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
+      children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+    }
+    let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
+    for (let name of _debugger.getOwnPropertyNames(object)) {
+      if (dart.test(hiddenProperties[dartx.contains](name))) continue;
+      let value = _debugger.safeGetProperty(object, name);
+      if (value != null && dart.getIsNamedConstructor(value) != null) {
+        value = new _debugger.NamedConstructor(value);
+        name = dart.str`${typeName}.${name}`;
+      }
+      children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+    }
+    let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
+    let prototype = object.prototype;
+    if (prototype != null) {
+      for (let name of _debugger.getOwnPropertyNames(prototype)) {
+        if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
+        let func = _debugger.safeGetProperty(prototype, name);
+        let constructor = _debugger.safeGetProperty(prototype, 'constructor');
+        let sigObj = dart.getMethodSig(constructor);
+        if (sigObj != null) {
+          let value = _debugger.safeGetProperty(sigObj, name);
+          if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
+            dart.tag(func, value);
+            children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
+          }
+        }
+      }
+    }
+    return children;
+  }
+};
+_debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.ClassFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
+_debugger.registerDevtoolsFormatter = function() {
+  let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
+  dart.global.devtoolsFormatters = formatters;
+};
+dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
+_foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
+  if (arg0 === void 0) arg0 = null;
+  if (arg1 === void 0) arg1 = null;
+  if (arg2 === void 0) arg2 = null;
+  if (arg3 === void 0) arg3 = null;
+  if (arg4 === void 0) arg4 = null;
+  if (arg5 === void 0) arg5 = null;
+  if (arg6 === void 0) arg6 = null;
+  if (arg7 === void 0) arg7 = null;
+  if (arg8 === void 0) arg8 = null;
+  if (arg9 === void 0) arg9 = null;
+  if (arg10 === void 0) arg10 = null;
+  if (arg11 === void 0) arg11 = null;
+};
+dart.lazyFn(_foreign_helper.JS, () => StringAndString__Todynamic());
+_foreign_helper.JSExportName = class JSExportName extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_foreign_helper.JSExportName, {
+  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JSExportName, [core.String])}),
+  fields: () => ({name: core.String})
+});
+_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT = function() {
+};
+dart.lazyFn(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT, () => VoidToIsolateContext());
+_foreign_helper.IsolateContext = class IsolateContext extends core.Object {};
+_foreign_helper.JS_CALL_IN_ISOLATE = function(isolate, func) {
+};
+dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
+_foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
+};
+dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
+_foreign_helper.JS_CREATE_ISOLATE = function() {
+};
+dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
+_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
+};
+dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
+_foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
+};
+dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
+_foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
+};
+dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
+_foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
+};
+dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
+_foreign_helper.JS_OBJECT_CLASS_NAME = function() {
+};
+dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
+_foreign_helper.JS_NULL_CLASS_NAME = function() {
+};
+dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
+_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
+};
+dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
+_foreign_helper.JS_CURRENT_ISOLATE = function() {
+};
+dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
+_foreign_helper.JS_SIGNATURE_NAME = function() {
+};
+dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
+_foreign_helper.JS_TYPEDEF_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
+_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
+};
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
+_foreign_helper.JS_GET_NAME = function(name) {
+};
+dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
+_foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
+};
+dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
+_foreign_helper.JS_GET_FLAG = function(name) {
+};
+dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
+_foreign_helper.JS_EFFECT = function(code) {
+  dart.dcall(code, null);
+};
+dart.lazyFn(_foreign_helper.JS_EFFECT, () => FunctionTovoid());
+_foreign_helper.JS_CONST = class JS_CONST extends core.Object {
+  new(code) {
+    this.code = code;
+  }
+};
+dart.setSignature(_foreign_helper.JS_CONST, {
+  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JS_CONST, [core.String])}),
+  fields: () => ({code: core.String})
+});
+_foreign_helper.JS_STRING_CONCAT = function(a, b) {
+  return a + b;
+};
+dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
+_foreign_helper._Rest = class _Rest extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_foreign_helper._Rest, {
+  constructors: () => ({new: dart.definiteFunctionType(_foreign_helper._Rest, [])})
+});
+_foreign_helper.rest = dart.const(new _foreign_helper._Rest());
+_foreign_helper.spread = function(args) {
+  dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
+};
+dart.fn(_foreign_helper.spread, dynamicTodynamic$());
+_interceptors.Interceptor = class Interceptor extends core.Object {
+  new() {
+  }
+};
+dart.addTypeTests(_interceptors.Interceptor);
+dart.setSignature(_interceptors.Interceptor, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.Interceptor, [])})
+});
+_interceptors.getInterceptor = function(obj) {
+  return obj;
+};
+dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
+dart.defineExtensionNames([
+  'toString',
+  'hashCode',
+  'runtimeType'
+]);
+_interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
+  new() {
+    super.new();
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+  get [dartx.hashCode]() {
+    return this ? 2 * 3 * 23 * 3761 : 269 * 811;
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(core.bool);
+  }
+};
+_interceptors.JSBool[dart.implements] = () => [core.bool];
+dart.setSignature(_interceptors.JSBool, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSBool, [])})
+});
+dart.registerExtension(dart.global.Boolean, _interceptors.JSBool);
+_interceptors.JSIndexable$ = dart.generic(E => {
+  class JSIndexable extends core.Object {}
+  dart.addTypeTests(JSIndexable);
+  return JSIndexable;
+});
+_interceptors.JSIndexable = JSIndexable();
+_interceptors.JSObject = class JSObject extends core.Object {};
+_interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
+  new() {
+    super.new();
+  }
+  get hashCode() {
+    return 0;
+  }
+  get runtimeType() {
+    return dart.wrapType(_interceptors.JSObject);
+  }
+};
+_interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
+dart.setSignature(_interceptors.JavaScriptObject, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JavaScriptObject, [])})
+});
+_interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {
+  new() {
+    super.new();
+  }
+};
+dart.setSignature(_interceptors.PlainJavaScriptObject, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.PlainJavaScriptObject, [])})
+});
+_interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
+  new() {
+    super.new();
+  }
+  toString() {
+    return String(this);
+  }
+};
+dart.setSignature(_interceptors.UnknownJavaScriptObject, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.UnknownJavaScriptObject, [])})
+});
+_interceptors.findInterceptorConstructorForType = function(type) {
+};
+dart.fn(_interceptors.findInterceptorConstructorForType, TypeTodynamic());
+_interceptors.findConstructorForNativeSubclassType = function(type, name) {
+};
+dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
+_interceptors.getNativeInterceptor = function(object) {
+};
+dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
+_interceptors.setDispatchProperty = function(object, value) {
+};
+dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
+const _removeWhere = Symbol('_removeWhere');
+_interceptors.JSArray$ = dart.generic(E => {
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
+  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
+  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
+  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
+  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
+  let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
+  dart.defineExtensionNames([
+    'checkMutable',
+    'checkGrowable',
+    'add',
+    'removeAt',
+    'insert',
+    'insertAll',
+    'setAll',
+    'removeLast',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'where',
+    'expand',
+    'addAll',
+    'clear',
+    'forEach',
+    'map',
+    'join',
+    'take',
+    'takeWhile',
+    'skip',
+    'skipWhile',
+    'reduce',
+    'fold',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'elementAt',
+    'sublist',
+    'getRange',
+    'first',
+    'last',
+    'single',
+    'removeRange',
+    'setRange',
+    'fillRange',
+    'replaceRange',
+    'any',
+    'every',
+    'reversed',
+    'sort',
+    'shuffle',
+    'indexOf',
+    'lastIndexOf',
+    'contains',
+    'isEmpty',
+    'isNotEmpty',
+    'toString',
+    'toList',
+    'toSet',
+    'iterator',
+    'hashCode',
+    'length',
+    'length',
+    '_get',
+    '_set',
+    'asMap'
+  ]);
+  class JSArray extends core.Object {
+    new() {
+    }
+    static typed(allocation) {
+      return dart.list(allocation, E);
+    }
+    static of(allocation) {
+      return dart.setType(allocation, JSArray);
+    }
+    static markFixed(allocation) {
+      return JSArrayOfE().typed(_interceptors.JSArray.markFixedList(core.List._check(allocation)));
+    }
+    static markGrowable(allocation) {
+      return JSArrayOfE().typed(allocation);
+    }
+    static markFixedList(list) {
+      list.fixed$length = Array;
+      return list;
+    }
+    static markUnmodifiableList(list) {
+      list.fixed$length = Array;
+      list.immutable$list = Array;
+      return list;
+    }
+    [dartx.checkMutable](reason) {
+      if (this.immutable$list) {
+        dart.throw(new core.UnsupportedError(core.String._check(reason)));
+      }
+    }
+    [dartx.checkGrowable](reason) {
+      if (this.fixed$length) {
+        dart.throw(new core.UnsupportedError(core.String._check(reason)));
+      }
+    }
+    [dartx.add](value) {
+      E._check(value);
+      this[dartx.checkGrowable]('add');
+      this.push(value);
+    }
+    [dartx.removeAt](index) {
+      this[dartx.checkGrowable]('removeAt');
+      if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
+      if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this[dartx.length])) {
+        dart.throw(new core.RangeError.value(index));
+      }
+      return this.splice(index, 1)[0];
+    }
+    [dartx.insert](index, value) {
+      E._check(value);
+      this[dartx.checkGrowable]('insert');
+      if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
+      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
+        dart.throw(new core.RangeError.value(index));
+      }
+      this.splice(index, 0, value);
+    }
+    [dartx.insertAll](index, iterable) {
+      IterableOfE()._check(iterable);
+      this[dartx.checkGrowable]('insertAll');
+      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
+      if (!_internal.EfficientLength.is(iterable)) {
+        iterable = iterable[dartx.toList]();
+      }
+      let insertionLength = iterable[dartx.length];
+      this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
+      let end = dart.notNull(index) + dart.notNull(insertionLength);
+      this[dartx.setRange](end, this[dartx.length], this, index);
+      this[dartx.setRange](index, end, iterable);
+    }
+    [dartx.setAll](index, iterable) {
+      IterableOfE()._check(iterable);
+      this[dartx.checkMutable]('setAll');
+      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
+      for (let element of iterable) {
+        this[dartx._set]((() => {
+          let x = index;
+          index = dart.notNull(x) + 1;
+          return x;
+        })(), element);
+      }
+    }
+    [dartx.removeLast]() {
+      this[dartx.checkGrowable]('removeLast');
+      if (this[dartx.length] == 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
+      return this.pop();
+    }
+    [dartx.remove](element) {
+      this[dartx.checkGrowable]('remove');
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          this.splice(i, 1);
+          return true;
+        }
+      }
+      return false;
+    }
+    [dartx.removeWhere](test) {
+      this[dartx.checkGrowable]('removeWhere');
+      this[_removeWhere](test, true);
+    }
+    [dartx.retainWhere](test) {
+      this[dartx.checkGrowable]('retainWhere');
+      this[_removeWhere](test, false);
+    }
+    [_removeWhere](test, removeMatching) {
+      let retained = [];
+      let end = this[dartx.length];
+      for (let i = 0; i < dart.notNull(end); i++) {
+        let element = this[i];
+        if (!dart.test(test(E._check(element))) == removeMatching) {
+          retained[dartx.add](element);
+        }
+        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
+      }
+      if (retained[dartx.length] == end) return;
+      this[dartx.length] = retained[dartx.length];
+      for (let i = 0; i < dart.notNull(retained[dartx.length]); i++) {
+        this[dartx._set](i, E._check(retained[dartx._get](i)));
+      }
+    }
+    [dartx.where](f) {
+      return new (WhereIterableOfE())(this, f);
+    }
+    [dartx.expand](T) {
+      return f => {
+        return new (_internal.ExpandIterable$(E, T))(this, f);
+      };
+    }
+    [dartx.addAll](collection) {
+      IterableOfE()._check(collection);
+      let i = this[dartx.length];
+      this[dartx.checkGrowable]('addAll');
+      for (let e of collection) {
+        dart.assert(i == this[dartx.length] || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
+        i = dart.notNull(i) + 1;
+        this.push(e);
+      }
+    }
+    [dartx.clear]() {
+      this[dartx.length] = 0;
+    }
+    [dartx.forEach](f) {
+      let end = this[dartx.length];
+      for (let i = 0; i < dart.notNull(end); i++) {
+        let element = this[i];
+        f(element);
+        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
+      }
+    }
+    [dartx.map](T) {
+      return f => {
+        return new (_internal.MappedListIterable$(E, T))(this, f);
+      };
+    }
+    [dartx.join](separator) {
+      if (separator === void 0) separator = "";
+      let list = core.List.new(this[dartx.length]);
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        list[dartx._set](i, dart.str`${this[dartx._get](i)}`);
+      }
+      return list.join(separator);
+    }
+    [dartx.take](n) {
+      return new (SubListIterableOfE())(this, 0, n);
+    }
+    [dartx.takeWhile](test) {
+      return new (TakeWhileIterableOfE())(this, test);
+    }
+    [dartx.skip](n) {
+      return new (SubListIterableOfE())(this, n, null);
+    }
+    [dartx.skipWhile](test) {
+      return new (SkipWhileIterableOfE())(this, test);
+    }
+    [dartx.reduce](combine) {
+      EAndEToE()._check(combine);
+      let length = this[dartx.length];
+      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
+      let value = this[dartx._get](0);
+      for (let i = 1; i < dart.notNull(length); i++) {
+        let element = this[i];
+        value = combine(value, element);
+        if (length != this[dartx.length]) dart.throw(new core.ConcurrentModificationError(this));
+      }
+      return value;
+    }
+    [dartx.fold](T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        let length = this[dartx.length];
+        for (let i = 0; i < dart.notNull(length); i++) {
+          let element = this[i];
+          value = combine(value, element);
+          if (this[dartx.length] != length) dart.throw(new core.ConcurrentModificationError(this));
+        }
+        return value;
+      };
+    }
+    [dartx.firstWhere](test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let end = this[dartx.length];
+      for (let i = 0; i < dart.notNull(end); ++i) {
+        let element = this[i];
+        if (dart.test(test(element))) return element;
+        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    [dartx.lastWhere](test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let length = this[dartx.length];
+      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
+        let element = this[i];
+        if (dart.test(test(element))) return element;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    [dartx.singleWhere](test) {
+      let length = this[dartx.length];
+      let match = null;
+      let matchFound = false;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = this[i];
+        if (dart.test(test(E._check(element)))) {
+          if (matchFound) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          matchFound = true;
+          match = E._check(element);
+        }
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (matchFound) return match;
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    [dartx.elementAt](index) {
+      return this[dartx._get](index);
+    }
+    [dartx.sublist](start, end) {
+      if (end === void 0) end = null;
+      _js_helper.checkNull(start);
+      if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
+      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
+        dart.throw(new core.RangeError.range(start, 0, this[dartx.length], "start"));
+      }
+      if (end == null) {
+        end = this[dartx.length];
+      } else {
+        if (!(typeof end == 'number')) dart.throw(_js_helper.argumentErrorValue(end));
+        if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(this[dartx.length])) {
+          dart.throw(new core.RangeError.range(end, start, this[dartx.length], "end"));
+        }
+      }
+      if (start == end) return JSArrayOfE().of([]);
+      return JSArrayOfE().typed(this.slice(start, end));
+    }
+    [dartx.getRange](start, end) {
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      return new (SubListIterableOfE())(this, start, end);
+    }
+    get [dartx.first]() {
+      if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](0);
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    get [dartx.last]() {
+      if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    get [dartx.single]() {
+      if (this[dartx.length] == 1) return this[dartx._get](0);
+      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
+      dart.throw(_internal.IterableElementError.tooMany());
+    }
+    [dartx.removeRange](start, end) {
+      this[dartx.checkGrowable]('removeRange');
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      let deleteCount = dart.notNull(end) - dart.notNull(start);
+      this.splice(start, deleteCount);
+    }
+    [dartx.setRange](start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      this[dartx.checkMutable]('set range');
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (length == 0) return;
+      core.RangeError.checkNotNegative(skipCount, "skipCount");
+      let otherList = null;
+      let otherStart = null;
+      if (core.List.is(iterable)) {
+        otherList = ListOfE()._check(iterable);
+        otherStart = skipCount;
+      } else {
+        otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
+        otherStart = 0;
+      }
+      if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
+        dart.throw(_internal.IterableElementError.tooFew());
+      }
+      if (dart.notNull(otherStart) < dart.notNull(start)) {
+        for (let i = length - 1; i >= 0; i--) {
+          let element = otherList[dartx._get](dart.notNull(otherStart) + i);
+          this[dart.notNull(start) + i] = element;
+        }
+      } else {
+        for (let i = 0; i < length; i++) {
+          let element = otherList[dartx._get](dart.notNull(otherStart) + i);
+          this[dart.notNull(start) + i] = element;
+        }
+      }
+    }
+    [dartx.fillRange](start, end, fillValue) {
+      if (fillValue === void 0) fillValue = null;
+      E._check(fillValue);
+      this[dartx.checkMutable]('fill range');
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        this[i] = fillValue;
+      }
+    }
+    [dartx.replaceRange](start, end, replacement) {
+      IterableOfE()._check(replacement);
+      this[dartx.checkGrowable]('replace range');
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      if (!_internal.EfficientLength.is(replacement)) {
+        replacement = replacement[dartx.toList]();
+      }
+      let removeLength = dart.notNull(end) - dart.notNull(start);
+      let insertLength = replacement[dartx.length];
+      if (removeLength >= dart.notNull(insertLength)) {
+        let delta = removeLength - dart.notNull(insertLength);
+        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
+        let newLength = dart.notNull(this[dartx.length]) - delta;
+        this[dartx.setRange](start, insertEnd, replacement);
+        if (delta != 0) {
+          this[dartx.setRange](insertEnd, newLength, this, end);
+          this[dartx.length] = newLength;
+        }
+      } else {
+        let delta = dart.notNull(insertLength) - removeLength;
+        let newLength = dart.notNull(this[dartx.length]) + delta;
+        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
+        this[dartx.length] = newLength;
+        this[dartx.setRange](insertEnd, newLength, this, end);
+        this[dartx.setRange](start, insertEnd, replacement);
+      }
+    }
+    [dartx.any](test) {
+      let end = this[dartx.length];
+      for (let i = 0; i < dart.notNull(end); i++) {
+        let element = this[i];
+        if (dart.test(test(element))) return true;
+        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
+      }
+      return false;
+    }
+    [dartx.every](test) {
+      let end = this[dartx.length];
+      for (let i = 0; i < dart.notNull(end); i++) {
+        let element = this[i];
+        if (!dart.test(test(element))) return false;
+        if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
+      }
+      return true;
+    }
+    get [dartx.reversed]() {
+      return new (ReversedListIterableOfE())(this);
+    }
+    [dartx.sort](compare) {
+      if (compare === void 0) compare = null;
+      this[dartx.checkMutable]('sort');
+      if (compare == null) {
+        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
+      } else {
+        _internal.Sort.sort(E)(this, compare);
+      }
+    }
+    [dartx.shuffle](random) {
+      if (random === void 0) random = null;
+      this[dartx.checkMutable]('shuffle');
+      if (random == null) random = math.Random.new();
+      let length = this[dartx.length];
+      while (dart.notNull(length) > 1) {
+        let pos = random.nextInt(length);
+        length = dart.notNull(length) - 1;
+        let tmp = this[dartx._get](length);
+        this[dartx._set](length, this[dartx._get](pos));
+        this[dartx._set](pos, tmp);
+      }
+    }
+    [dartx.indexOf](element, start) {
+      if (start === void 0) start = 0;
+      if (dart.notNull(start) >= dart.notNull(this[dartx.length])) {
+        return -1;
+      }
+      if (dart.notNull(start) < 0) {
+        start = 0;
+      }
+      for (let i = start; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          return i;
+        }
+      }
+      return -1;
+    }
+    [dartx.lastIndexOf](element, startIndex) {
+      if (startIndex === void 0) startIndex = null;
+      if (startIndex == null) {
+        startIndex = dart.notNull(this[dartx.length]) - 1;
+      } else {
+        if (dart.notNull(startIndex) < 0) {
+          return -1;
+        }
+        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
+          startIndex = dart.notNull(this[dartx.length]) - 1;
+        }
+      }
+      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          return i;
+        }
+      }
+      return -1;
+    }
+    [dartx.contains](other) {
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        if (dart.equals(this[dartx._get](i), other)) return true;
+      }
+      return false;
+    }
+    get [dartx.isEmpty]() {
+      return this[dartx.length] == 0;
+    }
+    get [dartx.isNotEmpty]() {
+      return !dart.test(this[dartx.isEmpty]);
+    }
+    [dartx.toString]() {
+      return collection.ListBase.listToString(this);
+    }
+    [dartx.toList](opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let list = this.slice();
+      if (!dart.test(growable)) _interceptors.JSArray.markFixedList(core.List._check(list));
+      return JSArrayOfE().typed(list);
+    }
+    [dartx.toSet]() {
+      return SetOfE().from(this);
+    }
+    get [dartx.iterator]() {
+      return new (ArrayIteratorOfE())(this);
+    }
+    get [dartx.hashCode]() {
+      return _js_helper.Primitives.objectHashCode(this);
+    }
+    get [dartx.length]() {
+      return this.length;
+    }
+    set [dartx.length](newLength) {
+      this[dartx.checkGrowable]('set length');
+      if (!(typeof newLength == 'number')) {
+        dart.throw(new core.ArgumentError.value(newLength, 'newLength'));
+      }
+      if (dart.notNull(newLength) < 0) {
+        dart.throw(new core.RangeError.range(newLength, 0, null, 'newLength'));
+      }
+      this.length = newLength;
+    }
+    [dartx._get](index) {
+      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
+      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
+      return this[index];
+    }
+    [dartx._set](index, value) {
+      E._check(value);
+      this[dartx.checkMutable]('indexed set');
+      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
+      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
+      this[index] = value;
+      return value;
+    }
+    [dartx.asMap]() {
+      return new (ListMapViewOfE())(this);
+    }
+  }
+  dart.setExtensionBaseClass(JSArray, dart.global.Array);
+  dart.addTypeTests(JSArray);
+  JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
+  dart.setSignature(JSArray, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(_interceptors.JSArray$(E), []),
+      typed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
+      of: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
+      markFixed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
+      markGrowable: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic])
+    }),
+    getters: () => ({
+      [dartx.first]: dart.definiteFunctionType(E, []),
+      [dartx.last]: dart.definiteFunctionType(E, []),
+      [dartx.single]: dart.definiteFunctionType(E, []),
+      [dartx.reversed]: dart.definiteFunctionType(core.Iterable$(E), []),
+      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
+      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
+      [dartx.iterator]: dart.definiteFunctionType(core.Iterator$(E), []),
+      [dartx.length]: dart.definiteFunctionType(core.int, [])
+    }),
+    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+    methods: () => ({
+      [dartx.checkMutable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+      [dartx.checkGrowable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+      [dartx.add]: dart.definiteFunctionType(dart.void, [E]),
+      [dartx.removeAt]: dart.definiteFunctionType(E, [core.int]),
+      [dartx.insert]: dart.definiteFunctionType(dart.void, [core.int, E]),
+      [dartx.insertAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      [dartx.setAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      [dartx.removeLast]: dart.definiteFunctionType(E, []),
+      [dartx.remove]: dart.definiteFunctionType(core.bool, [core.Object]),
+      [dartx.removeWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
+      [dartx.retainWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
+      [_removeWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
+      [dartx.where]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      [dartx.expand]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
+      [dartx.addAll]: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
+      [dartx.forEach]: dart.definiteFunctionType(dart.void, [ETovoid()]),
+      [dartx.map]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
+      [dartx.join]: dart.definiteFunctionType(core.String, [], [core.String]),
+      [dartx.take]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      [dartx.takeWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      [dartx.skip]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      [dartx.skipWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      [dartx.reduce]: dart.definiteFunctionType(E, [EAndEToE()]),
+      [dartx.fold]: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
+      [dartx.firstWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      [dartx.lastWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      [dartx.singleWhere]: dart.definiteFunctionType(E, [ETobool()]),
+      [dartx.elementAt]: dart.definiteFunctionType(E, [core.int]),
+      [dartx.sublist]: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
+      [dartx.getRange]: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
+      [dartx.removeRange]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+      [dartx.setRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
+      [dartx.fillRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
+      [dartx.replaceRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
+      [dartx.any]: dart.definiteFunctionType(core.bool, [ETobool()]),
+      [dartx.every]: dart.definiteFunctionType(core.bool, [ETobool()]),
+      [dartx.sort]: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
+      [dartx.shuffle]: dart.definiteFunctionType(dart.void, [], [math.Random]),
+      [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+      [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Object]),
+      [dartx.toList]: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
+      [dartx.toSet]: dart.definiteFunctionType(core.Set$(E), []),
+      [dartx._get]: dart.definiteFunctionType(E, [core.int]),
+      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, E]),
+      [dartx.asMap]: dart.definiteFunctionType(core.Map$(core.int, E), [])
+    }),
+    statics: () => ({
+      markFixedList: dart.definiteFunctionType(core.List, [core.List]),
+      markUnmodifiableList: dart.definiteFunctionType(core.List, [core.List])
+    }),
+    names: ['markFixedList', 'markUnmodifiableList']
+  });
+  return JSArray;
+});
+_interceptors.JSArray = JSArray();
+dart.registerExtension(dart.global.Array, _interceptors.JSArray);
+_interceptors.JSMutableArray$ = dart.generic(E => {
+  class JSMutableArray extends _interceptors.JSArray$(E) {
+    new() {
+      super.new();
+    }
+  }
+  return JSMutableArray;
+});
+_interceptors.JSMutableArray = JSMutableArray();
+_interceptors.JSFixedArray$ = dart.generic(E => {
+  class JSFixedArray extends _interceptors.JSMutableArray$(E) {
+    new() {
+      super.new();
+    }
+  }
+  return JSFixedArray;
+});
+_interceptors.JSFixedArray = JSFixedArray();
+_interceptors.JSExtendableArray$ = dart.generic(E => {
+  class JSExtendableArray extends _interceptors.JSMutableArray$(E) {
+    new() {
+      super.new();
+    }
+  }
+  return JSExtendableArray;
+});
+_interceptors.JSExtendableArray = JSExtendableArray();
+_interceptors.JSUnmodifiableArray$ = dart.generic(E => {
+  class JSUnmodifiableArray extends _interceptors.JSArray$(E) {
+    new() {
+      super.new();
+    }
+  }
+  return JSUnmodifiableArray;
+});
+_interceptors.JSUnmodifiableArray = JSUnmodifiableArray();
+const _iterable = Symbol('_iterable');
+const _length = Symbol('_length');
+const _index = Symbol('_index');
+const _current = Symbol('_current');
+_interceptors.ArrayIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  class ArrayIterator extends core.Object {
+    new(iterable) {
+      this[_iterable] = iterable;
+      this[_length] = iterable[dartx.length];
+      this[_index] = 0;
+      this[_current] = null;
+    }
+    get current() {
+      return this[_current];
+    }
+    moveNext() {
+      let length = this[_iterable][dartx.length];
+      if (this[_length] != length) {
+        dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
+      }
+      if (dart.notNull(this[_index]) >= dart.notNull(length)) {
+        this[_current] = null;
+        return false;
+      }
+      this[_current] = this[_iterable][dartx._get](this[_index]);
+      this[_index] = dart.notNull(this[_index]) + 1;
+      return true;
+    }
+  }
+  dart.addTypeTests(ArrayIterator);
+  ArrayIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(ArrayIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_interceptors.ArrayIterator$(E), [JSArrayOfE()])}),
+    fields: () => ({
+      [_iterable]: JSArrayOfE(),
+      [_length]: core.int,
+      [_index]: core.int,
+      [_current]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return ArrayIterator;
+});
+_interceptors.ArrayIterator = ArrayIterator();
+const _isInt32 = Symbol('_isInt32');
+const _tdivSlow = Symbol('_tdivSlow');
+const _shlPositive = Symbol('_shlPositive');
+const _shrOtherPositive = Symbol('_shrOtherPositive');
+const _shrBothPositive = Symbol('_shrBothPositive');
+dart.defineExtensionNames([
+  'compareTo',
+  'isNegative',
+  'isNaN',
+  'isInfinite',
+  'isFinite',
+  'remainder',
+  'abs',
+  'sign',
+  'toInt',
+  'truncate',
+  'ceil',
+  'floor',
+  'round',
+  'ceilToDouble',
+  'floorToDouble',
+  'roundToDouble',
+  'truncateToDouble',
+  'clamp',
+  'toDouble',
+  'toStringAsFixed',
+  'toStringAsExponential',
+  'toStringAsPrecision',
+  'toRadixString',
+  'toString',
+  'hashCode',
+  '_negate',
+  '+',
+  '-',
+  '/',
+  '*',
+  '%',
+  '~/',
+  '<<',
+  '>>',
+  '&',
+  '|',
+  '^',
+  '<',
+  '>',
+  '<=',
+  '>=',
+  'isEven',
+  'isOdd',
+  'toUnsigned',
+  'toSigned',
+  'bitLength',
+  'modPow',
+  'modInverse',
+  'gcd',
+  '~'
+]);
+_interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
+  new() {
+    super.new();
+  }
+  [dartx.compareTo](b) {
+    if (this < dart.notNull(b)) {
+      return -1;
+    } else if (this > dart.notNull(b)) {
+      return 1;
+    } else if (this == b) {
+      if (this == 0) {
+        let bIsNegative = b[dartx.isNegative];
+        if (this[dartx.isNegative] == bIsNegative) return 0;
+        if (dart.test(this[dartx.isNegative])) return -1;
+        return 1;
+      }
+      return 0;
+    } else if (dart.test(this[dartx.isNaN])) {
+      if (dart.test(b[dartx.isNaN])) {
+        return 0;
+      }
+      return 1;
+    } else {
+      return -1;
+    }
+  }
+  get [dartx.isNegative]() {
+    return this == 0 ? 1 / this < 0 : this < 0;
+  }
+  get [dartx.isNaN]() {
+    return isNaN(this);
+  }
+  get [dartx.isInfinite]() {
+    return this == 1 / 0 || this == -1 / 0;
+  }
+  get [dartx.isFinite]() {
+    return isFinite(this);
+  }
+  [dartx.remainder](b) {
+    if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
+    return this % b;
+  }
+  [dartx.abs]() {
+    return Math.abs(this);
+  }
+  get [dartx.sign]() {
+    return this > 0 ? 1 : this < 0 ? -1 : this;
+  }
+  [dartx.toInt]() {
+    if (this >= _interceptors.JSNumber._MIN_INT32 && this <= _interceptors.JSNumber._MAX_INT32) {
+      return this | 0;
+    }
+    if (isFinite(this)) {
+      return this[dartx.truncateToDouble]() + 0;
+    }
+    dart.throw(new core.UnsupportedError("" + this));
+  }
+  [dartx.truncate]() {
+    return this[dartx.toInt]();
+  }
+  [dartx.ceil]() {
+    return this[dartx.ceilToDouble]()[dartx.toInt]();
+  }
+  [dartx.floor]() {
+    return this[dartx.floorToDouble]()[dartx.toInt]();
+  }
+  [dartx.round]() {
+    if (this > 0) {
+      if (this !== 1 / 0) {
+        return Math.round(this);
+      }
+    } else if (this > -1 / 0) {
+      return 0 - Math.round(0 - this);
+    }
+    dart.throw(new core.UnsupportedError("" + this));
+  }
+  [dartx.ceilToDouble]() {
+    return Math.ceil(this);
+  }
+  [dartx.floorToDouble]() {
+    return Math.floor(this);
+  }
+  [dartx.roundToDouble]() {
+    if (this < 0) {
+      return -Math.round(-this);
+    } else {
+      return Math.round(this);
+    }
+  }
+  [dartx.truncateToDouble]() {
+    return this < 0 ? this[dartx.ceilToDouble]() : this[dartx.floorToDouble]();
+  }
+  [dartx.clamp](lowerLimit, upperLimit) {
+    if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
+      dart.throw(_js_helper.argumentErrorValue(lowerLimit));
+    }
+    if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
+    if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
+    return this;
+  }
+  [dartx.toDouble]() {
+    return this;
+  }
+  [dartx.toStringAsFixed](fractionDigits) {
+    _js_helper.checkInt(fractionDigits);
+    if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
+      dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
+    }
+    let result = this.toFixed(fractionDigits);
+    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
+    return result;
+  }
+  [dartx.toStringAsExponential](fractionDigits) {
+    if (fractionDigits === void 0) fractionDigits = null;
+    let result = null;
+    if (fractionDigits != null) {
+      _js_helper.checkInt(fractionDigits);
+      if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
+        dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
+      }
+      result = this.toExponential(fractionDigits);
+    } else {
+      result = this.toExponential();
+    }
+    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
+    return result;
+  }
+  [dartx.toStringAsPrecision](precision) {
+    _js_helper.checkInt(precision);
+    if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
+      dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
+    }
+    let result = this.toPrecision(precision);
+    if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
+    return result;
+  }
+  [dartx.toRadixString](radix) {
+    _js_helper.checkInt(radix);
+    if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
+      dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
+    }
+    let result = this.toString(radix);
+    let rightParenCode = 41;
+    if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
+      return result;
+    }
+    return _interceptors.JSNumber._handleIEtoString(result);
+  }
+  static _handleIEtoString(result) {
+    let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
+    if (match == null) {
+      dart.throw(new core.UnsupportedError(dart.str`Unexpected toString result: ${result}`));
+    }
+    result = dart.dindex(match, 1);
+    let exponent = +dart.dindex(match, 3);
+    if (dart.dindex(match, 2) != null) {
+      result = result + dart.dindex(match, 2);
+      exponent = exponent - dart.dindex(match, 2).length;
+    }
+    return dart.notNull(result) + "0"[dartx['*']](exponent);
+  }
+  [dartx.toString]() {
+    if (this == 0 && 1 / this < 0) {
+      return '-0.0';
+    } else {
+      return "" + this;
+    }
+  }
+  get [dartx.hashCode]() {
+    return this & 0x1FFFFFFF;
+  }
+  [dartx._negate]() {
+    return -this;
+  }
+  [dartx['+']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this + other;
+  }
+  [dartx['-']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this - other;
+  }
+  [dartx['/']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this / other;
+  }
+  [dartx['*']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this * other;
+  }
+  [dartx['%']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    let result = this % other;
+    if (result == 0) return 0;
+    if (result > 0) return result;
+    if (other < 0) {
+      return result - other;
+    } else {
+      return result + other;
+    }
+  }
+  [_isInt32](value) {
+    return (value | 0) === value;
+  }
+  [dartx['~/']](other) {
+    if (dart.test(this[_isInt32](this)) && dart.test(this[_isInt32](other)) && 0 != other && -1 != other) {
+      return this / other | 0;
+    } else {
+      return this[_tdivSlow](other);
+    }
+  }
+  [_tdivSlow](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return (this / other)[dartx.toInt]();
+  }
+  [dartx['<<']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
+    return this[_shlPositive](other);
+  }
+  [_shlPositive](other) {
+    return other > 31 ? 0 : this << other >>> 0;
+  }
+  [dartx['>>']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
+    return this[_shrOtherPositive](other);
+  }
+  [_shrOtherPositive](other) {
+    return this > 0 ? this[_shrBothPositive](other) : this >> (dart.notNull(other) > 31 ? 31 : other) >>> 0;
+  }
+  [_shrBothPositive](other) {
+    return other > 31 ? 0 : this >>> other;
+  }
+  [dartx['&']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return (this & other) >>> 0;
+  }
+  [dartx['|']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return (this | other) >>> 0;
+  }
+  [dartx['^']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return (this ^ other) >>> 0;
+  }
+  [dartx['<']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this < other;
+  }
+  [dartx['>']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this > other;
+  }
+  [dartx['<=']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this <= other;
+  }
+  [dartx['>=']](other) {
+    if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
+    return this >= other;
+  }
+  get [dartx.isEven]() {
+    return (this & 1) == 0;
+  }
+  get [dartx.isOdd]() {
+    return (this & 1) == 1;
+  }
+  [dartx.toUnsigned](width) {
+    return (this & (1)[dartx['<<']](width) - 1) >>> 0;
+  }
+  [dartx.toSigned](width) {
+    let signMask = (1)[dartx['<<']](dart.notNull(width) - 1);
+    return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
+  }
+  get [dartx.bitLength]() {
+    let nonneg = this < 0 ? -this - 1 : this;
+    if (nonneg >= 4294967296) {
+      nonneg = (nonneg / 4294967296)[dartx.truncate]();
+      return dart.notNull(_interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg))) + 32;
+    }
+    return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
+  }
+  [dartx.modPow](e, m) {
+    if (!(typeof e == 'number')) {
+      dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
+    }
+    if (!(typeof m == 'number')) {
+      dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
+    }
+    if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
+    if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
+    if (e == 0) return 1;
+    let b = this;
+    if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
+      b = b[dartx['%']](m);
+    }
+    let r = 1;
+    while (dart.notNull(e) > 0) {
+      if (dart.test(e[dartx.isOdd])) {
+        r = (r * dart.notNull(b))[dartx['%']](m);
+      }
+      e = (dart.notNull(e) / 2)[dartx.truncate]();
+      b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
+    }
+    return r;
+  }
+  static _binaryGcd(x, y, inv) {
+    let s = 1;
+    if (!dart.test(inv)) {
+      while (dart.test(x[dartx.isEven]) && dart.test(y[dartx.isEven])) {
+        x = (dart.notNull(x) / 2)[dartx.truncate]();
+        y = (dart.notNull(y) / 2)[dartx.truncate]();
+        s = s * 2;
+      }
+      if (dart.test(y[dartx.isOdd])) {
+        let t = x;
+        x = y;
+        y = t;
+      }
+    }
+    let ac = x[dartx.isEven];
+    let u = x;
+    let v = y;
+    let a = 1, b = 0, c = 0, d = 1;
+    do {
+      while (dart.test(u[dartx.isEven])) {
+        u = (dart.notNull(u) / 2)[dartx.truncate]();
+        if (dart.test(ac)) {
+          if (!dart.test(a[dartx.isEven]) || !dart.test(b[dartx.isEven])) {
+            a = dart.notNull(a) + dart.notNull(y);
+            b = dart.notNull(b) - dart.notNull(x);
+          }
+          a = (dart.notNull(a) / 2)[dartx.truncate]();
+        } else if (!dart.test(b[dartx.isEven])) {
+          b = dart.notNull(b) - dart.notNull(x);
+        }
+        b = (dart.notNull(b) / 2)[dartx.truncate]();
+      }
+      while (dart.test(v[dartx.isEven])) {
+        v = (dart.notNull(v) / 2)[dartx.truncate]();
+        if (dart.test(ac)) {
+          if (!dart.test(c[dartx.isEven]) || !dart.test(d[dartx.isEven])) {
+            c = dart.notNull(c) + dart.notNull(y);
+            d = dart.notNull(d) - dart.notNull(x);
+          }
+          c = (dart.notNull(c) / 2)[dartx.truncate]();
+        } else if (!dart.test(d[dartx.isEven])) {
+          d = dart.notNull(d) - dart.notNull(x);
+        }
+        d = (dart.notNull(d) / 2)[dartx.truncate]();
+      }
+      if (dart.notNull(u) >= dart.notNull(v)) {
+        u = dart.notNull(u) - dart.notNull(v);
+        if (dart.test(ac)) {
+          a = dart.notNull(a) - dart.notNull(c);
+        }
+        b = dart.notNull(b) - dart.notNull(d);
+      } else {
+        v = dart.notNull(v) - dart.notNull(u);
+        if (dart.test(ac)) {
+          c = dart.notNull(c) - dart.notNull(a);
+        }
+        d = dart.notNull(d) - dart.notNull(b);
+      }
+    } while (u != 0);
+    if (!dart.test(inv)) return s * dart.notNull(v);
+    if (v != 1) dart.throw(core.Exception.new("Not coprime"));
+    if (dart.notNull(d) < 0) {
+      d = dart.notNull(d) + dart.notNull(x);
+      if (dart.notNull(d) < 0) {
+        d = dart.notNull(d) + dart.notNull(x);
+      }
+    } else if (dart.notNull(d) > dart.notNull(x)) {
+      d = dart.notNull(d) - dart.notNull(x);
+      if (dart.notNull(d) > dart.notNull(x)) {
+        d = dart.notNull(d) - dart.notNull(x);
+      }
+    }
+    return d;
+  }
+  [dartx.modInverse](m) {
+    if (!(typeof m == 'number')) {
+      dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
+    }
+    if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
+    if (m == 1) return 0;
+    let t = this;
+    if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
+      t = t[dartx['%']](m);
+    }
+    if (t == 1) return 1;
+    if (t == 0 || dart.test(t[dartx.isEven]) && dart.test(m[dartx.isEven])) {
+      dart.throw(core.Exception.new("Not coprime"));
+    }
+    return _interceptors.JSNumber._binaryGcd(m, t, true);
+  }
+  [dartx.gcd](other) {
+    if (!(typeof other == 'number')) {
+      dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
+    }
+    let x = this[dartx.abs]();
+    let y = other[dartx.abs]();
+    if (x == 0) return y;
+    if (y == 0) return x;
+    if (x == 1 || y == 1) return 1;
+    return _interceptors.JSNumber._binaryGcd(x, y, false);
+  }
+  static _bitCount(i) {
+    i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
+    i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
+    i = 252645135 & dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 4));
+    i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 8));
+    i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 16));
+    return dart.notNull(i) & 63;
+  }
+  static _shru(value, shift) {
+    return value >>> shift;
+  }
+  static _shrs(value, shift) {
+    return value >> shift;
+  }
+  static _ors(a, b) {
+    return a | b;
+  }
+  static _spread(i) {
+    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
+    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
+    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
+    i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
+    i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
+    return i;
+  }
+  [dartx['~']]() {
+    return ~this >>> 0;
+  }
+};
+_interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
+dart.setSignature(_interceptors.JSNumber, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSNumber, [])}),
+  getters: () => ({
+    [dartx.isNegative]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isNaN]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isInfinite]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isFinite]: dart.definiteFunctionType(core.bool, []),
+    [dartx.sign]: dart.definiteFunctionType(_interceptors.JSNumber, []),
+    [dartx.isEven]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isOdd]: dart.definiteFunctionType(core.bool, []),
+    [dartx.bitLength]: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx.remainder]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
+    [dartx.abs]: dart.definiteFunctionType(_interceptors.JSNumber, []),
+    [dartx.toInt]: dart.definiteFunctionType(core.int, []),
+    [dartx.truncate]: dart.definiteFunctionType(core.int, []),
+    [dartx.ceil]: dart.definiteFunctionType(core.int, []),
+    [dartx.floor]: dart.definiteFunctionType(core.int, []),
+    [dartx.round]: dart.definiteFunctionType(core.int, []),
+    [dartx.ceilToDouble]: dart.definiteFunctionType(core.double, []),
+    [dartx.floorToDouble]: dart.definiteFunctionType(core.double, []),
+    [dartx.roundToDouble]: dart.definiteFunctionType(core.double, []),
+    [dartx.truncateToDouble]: dart.definiteFunctionType(core.double, []),
+    [dartx.clamp]: dart.definiteFunctionType(core.num, [core.num, core.num]),
+    [dartx.toDouble]: dart.definiteFunctionType(core.double, []),
+    [dartx.toStringAsFixed]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.toStringAsExponential]: dart.definiteFunctionType(core.String, [], [core.int]),
+    [dartx.toStringAsPrecision]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.toRadixString]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx._negate]: dart.definiteFunctionType(_interceptors.JSNumber, []),
+    [dartx['+']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
+    [dartx['-']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
+    [dartx['/']]: dart.definiteFunctionType(core.double, [core.num]),
+    [dartx['*']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
+    [dartx['%']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
+    [_isInt32]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [dartx['~/']]: dart.definiteFunctionType(core.int, [core.num]),
+    [_tdivSlow]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['<<']]: dart.definiteFunctionType(core.int, [core.num]),
+    [_shlPositive]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['>>']]: dart.definiteFunctionType(core.int, [core.num]),
+    [_shrOtherPositive]: dart.definiteFunctionType(core.int, [core.num]),
+    [_shrBothPositive]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['&']]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['|']]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['^']]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx['<']]: dart.definiteFunctionType(core.bool, [core.num]),
+    [dartx['>']]: dart.definiteFunctionType(core.bool, [core.num]),
+    [dartx['<=']]: dart.definiteFunctionType(core.bool, [core.num]),
+    [dartx['>=']]: dart.definiteFunctionType(core.bool, [core.num]),
+    [dartx.toUnsigned]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.toSigned]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.modPow]: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    [dartx.modInverse]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.gcd]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx['~']]: dart.definiteFunctionType(core.int, [])
+  }),
+  sfields: () => ({
+    _MIN_INT32: core.int,
+    _MAX_INT32: core.int
+  }),
+  statics: () => ({
+    _handleIEtoString: dart.definiteFunctionType(core.String, [core.String]),
+    _binaryGcd: dart.definiteFunctionType(core.int, [core.int, core.int, core.bool]),
+    _bitCount: dart.definiteFunctionType(core.int, [core.int]),
+    _shru: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    _shrs: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    _ors: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    _spread: dart.definiteFunctionType(core.int, [core.int])
+  }),
+  names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
+});
+_interceptors.JSNumber._MIN_INT32 = -2147483648;
+_interceptors.JSNumber._MAX_INT32 = 2147483647;
+dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
+const _defaultSplit = Symbol('_defaultSplit');
+let const$;
+dart.defineExtensionNames([
+  'codeUnitAt',
+  'allMatches',
+  'matchAsPrefix',
+  '+',
+  'endsWith',
+  'replaceAll',
+  'replaceAllMapped',
+  'splitMapJoin',
+  'replaceFirst',
+  'replaceFirstMapped',
+  'split',
+  'replaceRange',
+  'startsWith',
+  'substring',
+  'toLowerCase',
+  'toUpperCase',
+  'trim',
+  'trimLeft',
+  'trimRight',
+  '*',
+  'padLeft',
+  'padRight',
+  'codeUnits',
+  'runes',
+  'indexOf',
+  'lastIndexOf',
+  'contains',
+  'isEmpty',
+  'isNotEmpty',
+  'compareTo',
+  'toString',
+  'hashCode',
+  'runtimeType',
+  'length',
+  '_get'
+]);
+_interceptors.JSString = class JSString extends _interceptors.Interceptor {
+  new() {
+    super.new();
+  }
+  [dartx.codeUnitAt](index) {
+    if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
+    if (dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
+    if (dart.notNull(index) >= dart.notNull(this[dartx.length])) dart.throw(_js_helper.diagnoseIndexError(this, index));
+    return this.charCodeAt(index);
+  }
+  [dartx.allMatches](string, start) {
+    if (start === void 0) start = 0;
+    _js_helper.checkString(string);
+    _js_helper.checkInt(start);
+    if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(string[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
+    }
+    return _js_helper.allMatchesInStringUnchecked(this, string, start);
+  }
+  [dartx.matchAsPrefix](string, start) {
+    if (start === void 0) start = 0;
+    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
+    }
+    if (dart.notNull(start) + dart.notNull(this[dartx.length]) > dart.notNull(string[dartx.length])) return null;
+    for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+      if (string[dartx.codeUnitAt](dart.notNull(start) + i) != this[dartx.codeUnitAt](i)) {
+        return null;
+      }
+    }
+    return new _js_helper.StringMatch(start, string, this);
+  }
+  [dartx['+']](other) {
+    if (!(typeof other == 'string')) dart.throw(new core.ArgumentError.value(other));
+    return this + other;
+  }
+  [dartx.endsWith](other) {
+    _js_helper.checkString(other);
+    let otherLength = other[dartx.length];
+    if (dart.notNull(otherLength) > dart.notNull(this[dartx.length])) return false;
+    return other == this[dartx.substring](dart.notNull(this[dartx.length]) - dart.notNull(otherLength));
+  }
+  [dartx.replaceAll](from, to) {
+    _js_helper.checkString(to);
+    return _js_helper.stringReplaceAllUnchecked(this, from, to);
+  }
+  [dartx.replaceAllMapped](from, convert) {
+    return this[dartx.splitMapJoin](from, {onMatch: convert});
+  }
+  [dartx.splitMapJoin](from, opts) {
+    let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
+    let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
+    return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
+  }
+  [dartx.replaceFirst](from, to, startIndex) {
+    if (startIndex === void 0) startIndex = 0;
+    _js_helper.checkString(to);
+    _js_helper.checkInt(startIndex);
+    core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
+    return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
+  }
+  [dartx.replaceFirstMapped](from, replace, startIndex) {
+    if (startIndex === void 0) startIndex = 0;
+    _js_helper.checkNull(replace);
+    _js_helper.checkInt(startIndex);
+    core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
+    return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
+  }
+  [dartx.split](pattern) {
+    _js_helper.checkNull(pattern);
+    if (typeof pattern == 'string') {
+      return this.split(pattern);
+    } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) == 0) {
+      let re = _js_helper.regExpGetNative(pattern);
+      return this.split(re);
+    } else {
+      return this[_defaultSplit](pattern);
+    }
+  }
+  [dartx.replaceRange](start, end, replacement) {
+    _js_helper.checkString(replacement);
+    _js_helper.checkInt(start);
+    end = core.RangeError.checkValidRange(start, end, this[dartx.length]);
+    _js_helper.checkInt(end);
+    return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
+  }
+  [_defaultSplit](pattern) {
+    let result = JSArrayOfString().of([]);
+    let start = 0;
+    let length = 1;
+    for (let match of pattern[dartx.allMatches](this)) {
+      let matchStart = match.start;
+      let matchEnd = match.end;
+      length = dart.notNull(matchEnd) - dart.notNull(matchStart);
+      if (length == 0 && start == matchStart) {
+        continue;
+      }
+      let end = matchStart;
+      result[dartx.add](this[dartx.substring](start, end));
+      start = matchEnd;
+    }
+    if (dart.notNull(start) < dart.notNull(this[dartx.length]) || length > 0) {
+      result[dartx.add](this[dartx.substring](start));
+    }
+    return result;
+  }
+  [dartx.startsWith](pattern, index) {
+    if (index === void 0) index = 0;
+    _js_helper.checkInt(index);
+    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
+      dart.throw(new core.RangeError.range(index, 0, this[dartx.length]));
+    }
+    if (typeof pattern == 'string') {
+      let other = pattern;
+      let otherLength = other[dartx.length];
+      let endIndex = dart.notNull(index) + dart.notNull(otherLength);
+      if (endIndex > dart.notNull(this[dartx.length])) return false;
+      return other == this.substring(index, endIndex);
+    }
+    return pattern[dartx.matchAsPrefix](this, index) != null;
+  }
+  [dartx.substring](startIndex, endIndex) {
+    if (endIndex === void 0) endIndex = null;
+    _js_helper.checkInt(startIndex);
+    if (endIndex == null) endIndex = this[dartx.length];
+    _js_helper.checkInt(endIndex);
+    if (dart.notNull(startIndex) < 0) dart.throw(new core.RangeError.value(startIndex));
+    if (dart.notNull(startIndex) > dart.notNull(endIndex)) dart.throw(new core.RangeError.value(startIndex));
+    if (dart.notNull(endIndex) > dart.notNull(this[dartx.length])) dart.throw(new core.RangeError.value(endIndex));
+    return this.substring(startIndex, endIndex);
+  }
+  [dartx.toLowerCase]() {
+    return this.toLowerCase();
+  }
+  [dartx.toUpperCase]() {
+    return this.toUpperCase();
+  }
+  static _isWhitespace(codeUnit) {
+    if (dart.notNull(codeUnit) < 256) {
+      switch (codeUnit) {
+        case 9:
+        case 10:
+        case 11:
+        case 12:
+        case 13:
+        case 32:
+        case 133:
+        case 160:
+        {
+          return true;
+        }
+        default:
+        {
+          return false;
+        }
+      }
+    }
+    switch (codeUnit) {
+      case 5760:
+      case 6158:
+      case 8192:
+      case 8193:
+      case 8194:
+      case 8195:
+      case 8196:
+      case 8197:
+      case 8198:
+      case 8199:
+      case 8200:
+      case 8201:
+      case 8202:
+      case 8232:
+      case 8233:
+      case 8239:
+      case 8287:
+      case 12288:
+      case 65279:
+      {
+        return true;
+      }
+      default:
+      {
+        return false;
+      }
+    }
+  }
+  static _skipLeadingWhitespace(string, index) {
+    let SPACE = 32;
+    let CARRIAGE_RETURN = 13;
+    while (dart.notNull(index) < dart.notNull(string[dartx.length])) {
+      let codeUnit = string[dartx.codeUnitAt](index);
+      if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
+        break;
+      }
+      index = dart.notNull(index) + 1;
+    }
+    return index;
+  }
+  static _skipTrailingWhitespace(string, index) {
+    let SPACE = 32;
+    let CARRIAGE_RETURN = 13;
+    while (dart.notNull(index) > 0) {
+      let codeUnit = string[dartx.codeUnitAt](dart.notNull(index) - 1);
+      if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
+        break;
+      }
+      index = dart.notNull(index) - 1;
+    }
+    return index;
+  }
+  [dartx.trim]() {
+    let NEL = 133;
+    let result = this.trim();
+    if (result[dartx.length] == 0) return result;
+    let firstCode = result[dartx.codeUnitAt](0);
+    let startIndex = 0;
+    if (firstCode == NEL) {
+      startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
+      if (startIndex == result[dartx.length]) return "";
+    }
+    let endIndex = result[dartx.length];
+    let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
+    if (lastCode == NEL) {
+      endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
+    }
+    if (startIndex == 0 && endIndex == result[dartx.length]) return result;
+    return result.substring(startIndex, endIndex);
+  }
+  [dartx.trimLeft]() {
+    let NEL = 133;
+    let result = null;
+    let startIndex = 0;
+    if (typeof this.trimLeft != "undefined") {
+      result = this.trimLeft();
+      if (result[dartx.length] == 0) return result;
+      let firstCode = result[dartx.codeUnitAt](0);
+      if (firstCode == NEL) {
+        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
+      }
+    } else {
+      result = this;
+      startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
+    }
+    if (startIndex == 0) return result;
+    if (startIndex == result[dartx.length]) return "";
+    return result.substring(startIndex);
+  }
+  [dartx.trimRight]() {
+    let NEL = 133;
+    let result = null;
+    let endIndex = null;
+    if (typeof this.trimRight != "undefined") {
+      result = this.trimRight();
+      endIndex = result[dartx.length];
+      if (endIndex == 0) return result;
+      let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
+      if (lastCode == NEL) {
+        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
+      }
+    } else {
+      result = this;
+      endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this[dartx.length]);
+    }
+    if (endIndex == result[dartx.length]) return result;
+    if (endIndex == 0) return "";
+    return result.substring(0, endIndex);
+  }
+  [dartx['*']](times) {
+    if (0 >= dart.notNull(times)) return '';
+    if (times == 1 || this[dartx.length] == 0) return this;
+    if (times != times >>> 0) {
+      dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
+    }
+    let result = '';
+    let s = this;
+    while (true) {
+      if ((dart.notNull(times) & 1) == 1) result = s + result;
+      times = times >>> 1;
+      if (times == 0) break;
+      s = s + s;
+    }
+    return result;
+  }
+  [dartx.padLeft](width, padding) {
+    if (padding === void 0) padding = ' ';
+    let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
+    if (delta <= 0) return this;
+    return padding[dartx['*']](delta) + this;
+  }
+  [dartx.padRight](width, padding) {
+    if (padding === void 0) padding = ' ';
+    let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
+    if (delta <= 0) return this;
+    return this[dartx['+']](padding[dartx['*']](delta));
+  }
+  get [dartx.codeUnits]() {
+    return new _internal.CodeUnits(this);
+  }
+  get [dartx.runes]() {
+    return new core.Runes(this);
+  }
+  [dartx.indexOf](pattern, start) {
+    if (start === void 0) start = 0;
+    _js_helper.checkNull(pattern);
+    if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
+    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
+    }
+    if (typeof pattern == 'string') {
+      return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
+    }
+    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
+      let re = pattern;
+      let match = _js_helper.firstMatchAfter(re, this, start);
+      return match == null ? -1 : match.start;
+    }
+    for (let i = start; dart.notNull(i) <= dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
+      if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
+    }
+    return -1;
+  }
+  [dartx.lastIndexOf](pattern, start) {
+    if (start === void 0) start = null;
+    _js_helper.checkNull(pattern);
+    if (start == null) {
+      start = this[dartx.length];
+    } else if (!(typeof start == 'number')) {
+      dart.throw(_js_helper.argumentErrorValue(start));
+    } else if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
+    }
+    if (typeof pattern == 'string') {
+      let other = pattern;
+      if (dart.notNull(start) + dart.notNull(other[dartx.length]) > dart.notNull(this[dartx.length])) {
+        start = dart.notNull(this[dartx.length]) - dart.notNull(other[dartx.length]);
+      }
+      return core.int._check(_js_helper.stringLastIndexOfUnchecked(this, other, start));
+    }
+    for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
+      if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
+    }
+    return -1;
+  }
+  [dartx.contains](other, startIndex) {
+    if (startIndex === void 0) startIndex = 0;
+    _js_helper.checkNull(other);
+    if (dart.notNull(startIndex) < 0 || dart.notNull(startIndex) > dart.notNull(this[dartx.length])) {
+      dart.throw(new core.RangeError.range(startIndex, 0, this[dartx.length]));
+    }
+    return _js_helper.stringContainsUnchecked(this, other, startIndex);
+  }
+  get [dartx.isEmpty]() {
+    return this[dartx.length] == 0;
+  }
+  get [dartx.isNotEmpty]() {
+    return !dart.test(this[dartx.isEmpty]);
+  }
+  [dartx.compareTo](other) {
+    if (!(typeof other == 'string')) dart.throw(_js_helper.argumentErrorValue(other));
+    return dart.equals(this, other) ? 0 : this < other ? -1 : 1;
+  }
+  [dartx.toString]() {
+    return this;
+  }
+  get [dartx.hashCode]() {
+    let hash = 0;
+    for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+      hash = 536870911 & hash + this.charCodeAt(i);
+      hash = 536870911 & hash + ((524287 & hash) << 10);
+      hash = hash ^ hash >> 6;
+    }
+    hash = 536870911 & hash + ((67108863 & hash) << 3);
+    hash = hash ^ hash >> 11;
+    return 536870911 & hash + ((16383 & hash) << 15);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(core.String);
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
+    if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
+    return this[index];
+  }
+};
+_interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
+dart.setSignature(_interceptors.JSString, {
+  constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSString, [])}),
+  getters: () => ({
+    [dartx.codeUnits]: dart.definiteFunctionType(core.List$(core.int), []),
+    [dartx.runes]: dart.definiteFunctionType(core.Runes, []),
+    [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
+    [dartx.length]: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    [dartx.codeUnitAt]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.allMatches]: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
+    [dartx.matchAsPrefix]: dart.definiteFunctionType(core.Match, [core.String], [core.int]),
+    [dartx['+']]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.endsWith]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.replaceAll]: dart.definiteFunctionType(core.String, [core.Pattern, core.String]),
+    [dartx.replaceAllMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()]),
+    [dartx.splitMapJoin]: dart.definiteFunctionType(core.String, [core.Pattern], {onMatch: MatchToString(), onNonMatch: StringToString()}),
+    [dartx.replaceFirst]: dart.definiteFunctionType(core.String, [core.Pattern, core.String], [core.int]),
+    [dartx.replaceFirstMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()], [core.int]),
+    [dartx.split]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
+    [dartx.replaceRange]: dart.definiteFunctionType(core.String, [core.int, core.int, core.String]),
+    [_defaultSplit]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
+    [dartx.startsWith]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
+    [dartx.substring]: dart.definiteFunctionType(core.String, [core.int], [core.int]),
+    [dartx.toLowerCase]: dart.definiteFunctionType(core.String, []),
+    [dartx.toUpperCase]: dart.definiteFunctionType(core.String, []),
+    [dartx.trim]: dart.definiteFunctionType(core.String, []),
+    [dartx.trimLeft]: dart.definiteFunctionType(core.String, []),
+    [dartx.trimRight]: dart.definiteFunctionType(core.String, []),
+    [dartx['*']]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.padLeft]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
+    [dartx.padRight]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
+    [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
+    [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
+    [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
+    [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.String]),
+    [dartx._get]: dart.definiteFunctionType(core.String, [core.int])
+  }),
+  statics: () => ({
+    _isWhitespace: dart.definiteFunctionType(core.bool, [core.int]),
+    _skipLeadingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int]),
+    _skipTrailingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int])
+  }),
+  names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
+});
+dart.registerExtension(dart.global.String, _interceptors.JSString);
+core.num = class num extends core.Object {
+  static parse(input, onError) {
+    if (onError === void 0) onError = null;
+    let source = input[dartx.trim]();
+    let result = core.int.parse(source, {onError: core.num._returnIntNull});
+    if (result != null) return result;
+    result = core.double.parse(source, core.num._returnDoubleNull);
+    if (result != null) return result;
+    if (onError == null) dart.throw(new core.FormatException(input));
+    return onError(input);
+  }
+  static _returnIntNull(_) {
+    return null;
+  }
+  static _returnDoubleNull(_) {
+    return null;
+  }
+};
+core.num.is = function is_num(o) {
+  return typeof o == "number";
+};
+core.num.as = function as_num(o) {
+  if (typeof o == "number" || o == null) return o;
+  return dart.as(o, core.num);
+};
+core.num._check = function check_num(o) {
+  if (typeof o == "number" || o == null) return o;
+  return dart.check(o, core.num);
+};
+core.num[dart.implements] = () => [ComparableOfnum()];
+dart.setSignature(core.num, {
+  statics: () => ({
+    parse: dart.definiteFunctionType(core.num, [core.String], [StringTonum()]),
+    _returnIntNull: dart.definiteFunctionType(core.int, [core.String]),
+    _returnDoubleNull: dart.definiteFunctionType(core.double, [core.String])
+  }),
+  names: ['parse', '_returnIntNull', '_returnDoubleNull']
+});
+core.double = class double extends core.num {
+  static parse(source, onError) {
+    if (onError === void 0) onError = null;
+    return _js_helper.Primitives.parseDouble(source, onError);
+  }
+};
+dart.setSignature(core.double, {
+  sfields: () => ({
+    NAN: core.double,
+    INFINITY: core.double,
+    NEGATIVE_INFINITY: core.double,
+    MIN_POSITIVE: core.double,
+    MAX_FINITE: core.double
+  }),
+  statics: () => ({parse: dart.definiteFunctionType(core.double, [core.String], [StringTodouble()])}),
+  names: ['parse']
+});
+core.double.NAN = 0.0 / 0.0;
+core.double.INFINITY = 1.0 / 0.0;
+core.double.MIN_POSITIVE = 5e-324;
+core.double.MAX_FINITE = 1.7976931348623157e+308;
+dart.defineLazy(core.double, {
+  get NEGATIVE_INFINITY() {
+    return -core.double.INFINITY;
+  }
+});
+_internal.POWERS_OF_TEN = dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
+const _string = Symbol('_string');
+const _filter = Symbol('_filter');
+collection.ListMixin$ = dart.generic(E => {
+  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
+  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
+  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
+  let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
+  dart.defineExtensionNames([
+    'iterator',
+    'elementAt',
+    'forEach',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last',
+    'single',
+    'contains',
+    'every',
+    'any',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'join',
+    'where',
+    'map',
+    'expand',
+    'reduce',
+    'fold',
+    'skip',
+    'skipWhile',
+    'take',
+    'takeWhile',
+    'toList',
+    'toSet',
+    'add',
+    'addAll',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'clear',
+    'removeLast',
+    'sort',
+    'shuffle',
+    'asMap',
+    'sublist',
+    'getRange',
+    'removeRange',
+    'fillRange',
+    'setRange',
+    'replaceRange',
+    'indexOf',
+    'lastIndexOf',
+    'insert',
+    'removeAt',
+    'insertAll',
+    'setAll',
+    'reversed',
+    'toString'
+  ]);
+  class ListMixin extends core.Object {
+    get iterator() {
+      return new (ListIteratorOfE())(this);
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this[dartx.iterator]);
+    }
+    elementAt(index) {
+      return this[dartx._get](index);
+    }
+    forEach(action) {
+      let length = this[dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        action(this[dartx._get](i));
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+    }
+    get isEmpty() {
+      return this[dartx.length] == 0;
+    }
+    get isNotEmpty() {
+      return !dart.test(this[dartx.isEmpty]);
+    }
+    get first() {
+      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[dartx._get](0);
+    }
+    get last() {
+      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
+    }
+    get single() {
+      if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
+      if (dart.notNull(this[dartx.length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      return this[dartx._get](0);
+    }
+    contains(element) {
+      let length = this[dartx.length];
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        if (dart.equals(this[dartx._get](i), element)) return true;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return false;
+    }
+    every(test) {
+      let length = this[dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        if (!dart.test(test(this[dartx._get](i)))) return false;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return true;
+    }
+    any(test) {
+      let length = this[dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        if (dart.test(test(this[dartx._get](i)))) return true;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return false;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let length = this[dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = this[dartx._get](i);
+        if (dart.test(test(element))) return element;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let length = this[dartx.length];
+      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
+        let element = this[dartx._get](i);
+        if (dart.test(test(element))) return element;
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    singleWhere(test) {
+      let length = this[dartx.length];
+      let match = null;
+      let matchFound = false;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = this[dartx._get](i);
+        if (dart.test(test(element))) {
+          if (matchFound) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          matchFound = true;
+          match = element;
+        }
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (matchFound) return match;
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      if (this[dartx.length] == 0) return "";
+      let buffer = new core.StringBuffer();
+      buffer.writeAll(this, separator);
+      return buffer.toString();
+    }
+    where(test) {
+      return new (WhereIterableOfE())(this, test);
+    }
+    map(T) {
+      return f => {
+        return new (_internal.MappedListIterable$(E, T))(this, f);
+      };
+    }
+    expand(T) {
+      return f => {
+        return new (_internal.ExpandIterable$(E, T))(this, f);
+      };
+    }
+    reduce(combine) {
+      EAndEToE()._check(combine);
+      let length = this[dartx.length];
+      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
+      let value = this[dartx._get](0);
+      for (let i = 1; i < dart.notNull(length); i++) {
+        value = combine(value, this[dartx._get](i));
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return value;
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        let length = this[dartx.length];
+        for (let i = 0; i < dart.notNull(length); i++) {
+          value = combine(value, this[dartx._get](i));
+          if (length != this[dartx.length]) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+        }
+        return value;
+      };
+    }
+    skip(count) {
+      return new (SubListIterableOfE())(this, count, null);
+    }
+    skipWhile(test) {
+      return new (SkipWhileIterableOfE())(this, test);
+    }
+    take(count) {
+      return new (SubListIterableOfE())(this, 0, count);
+    }
+    takeWhile(test) {
+      return new (TakeWhileIterableOfE())(this, test);
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let result = null;
+      if (dart.test(growable)) {
+        result = ListOfE().new();
+        result[dartx.length] = this[dartx.length];
+      } else {
+        result = ListOfE().new(this[dartx.length]);
+      }
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        result[dartx._set](i, this[dartx._get](i));
+      }
       return result;
     }
-    new(returnType, args, optionals, named) {
-      this.returnType = returnType;
-      this.args = args;
-      this.optionals = optionals;
-      this.named = named;
-      this.metadata = null;
-      super.new();
-      this.metadata = [];
-      this.args = this[_process](this.args, this.metadata);
-      this.optionals = this[_process](this.optionals, this.metadata);
-    }
-  };
-  dart.setSignature(dart.FunctionType, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.FunctionType, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
-    fields: () => ({
-      returnType: dart.dynamic,
-      args: dart.dynamic,
-      optionals: dart.dynamic,
-      named: dart.dynamic,
-      metadata: dart.dynamic
-    }),
-    methods: () => ({[_process]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])}),
-    statics: () => ({create: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
-    names: ['create']
-  });
-  const _name = Symbol('_name');
-  const _closure = Symbol('_closure');
-  const _functionType = Symbol('_functionType');
-  dart.Typedef = class Typedef extends dart.AbstractFunctionType {
-    new(name, closure) {
-      this[_name] = name;
-      this[_closure] = closure;
-      this[_functionType] = null;
-      super.new();
-    }
-    get name() {
-      return core.String._check(this[_name]);
-    }
-    get functionType() {
-      if (this[_functionType] == null) {
-        this[_functionType] = this[_closure]();
+    toSet() {
+      let result = SetOfE().new();
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        result.add(this[dartx._get](i));
       }
-      return this[_functionType];
+      return result;
     }
-    get returnType() {
-      return this.functionType.returnType;
+    add(element) {
+      E._check(element);
+      this[dartx._set]((() => {
+        let x = this[dartx.length];
+        this[dartx.length] = dart.notNull(x) + 1;
+        return x;
+      })(), element);
     }
-    get args() {
-      return core.List._check(this.functionType.args);
-    }
-    get optionals() {
-      return core.List._check(this.functionType.optionals);
-    }
-    get named() {
-      return this.functionType.named;
-    }
-    get metadata() {
-      return core.List._check(this.functionType.metadata);
-    }
-  };
-  dart.setSignature(dart.Typedef, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.Typedef, [dart.dynamic, dart.dynamic])}),
-    fields: () => ({
-      [_name]: dart.dynamic,
-      [_closure]: dart.dynamic,
-      [_functionType]: dart.AbstractFunctionType
-    }),
-    getters: () => ({
-      functionType: dart.definiteFunctionType(dart.AbstractFunctionType, []),
-      returnType: dart.definiteFunctionType(dart.dynamic, []),
-      args: dart.definiteFunctionType(core.List, []),
-      optionals: dart.definiteFunctionType(core.List, []),
-      named: dart.definiteFunctionType(dart.dynamic, []),
-      metadata: dart.definiteFunctionType(core.List, [])
-    })
-  });
-  dart._typeFormalCount = Symbol("_typeFormalCount");
-  dart.isSubtype = dart._subtypeMemo((t1, t2) => t1 === t2 || dart._isSubtype(t1, t2, true));
-  dart._trapRuntimeErrors = true;
-  dart._jsIterator = Symbol("_jsIterator");
-  dart._current = Symbol("_current");
-  dart._AsyncStarStreamController = class _AsyncStarStreamController {
-    constructor(generator, T, args) {
-      this.isAdding = false;
-      this.isWaiting = false;
-      this.isScheduled = false;
-      this.isSuspendedAtYield = false;
-      this.canceler = null;
-      this.iterator = generator(this, ...args)[Symbol.iterator]();
-      this.controller = dart.getGenericClass(async.StreamController)(T).new({
-        onListen: () => this.scheduleGenerator(),
-        onResume: () => this.onResume(),
-        onCancel: () => this.onCancel()
-      });
-    }
-    onResume() {
-      if (this.isSuspendedAtYield) {
-        this.scheduleGenerator();
+    addAll(iterable) {
+      IterableOfE()._check(iterable);
+      let i = this[dartx.length];
+      for (let element of iterable) {
+        dart.assert(this[dartx.length] == i || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
+        this[dartx.length] = dart.notNull(i) + 1;
+        this[dartx._set](i, element);
+        i = dart.notNull(i) + 1;
       }
     }
-    onCancel() {
-      if (this.controller.isClosed) {
-        return null;
-      }
-      if (this.canceler == null) {
-        this.canceler = async.Completer.new();
-        this.scheduleGenerator();
-      }
-      return this.canceler.future;
-    }
-    close() {
-      if (this.canceler != null && !this.canceler.isCompleted) {
-        this.canceler.complete();
-      }
-      this.controller.close();
-    }
-    scheduleGenerator() {
-      if (this.isScheduled || this.controller.isPaused || this.isAdding || this.isWaiting) {
-        return;
-      }
-      this.isScheduled = true;
-      async.scheduleMicrotask(() => this.runBody());
-    }
-    runBody(opt_awaitValue) {
-      this.isScheduled = false;
-      this.isSuspendedAtYield = false;
-      this.isWaiting = false;
-      let iter;
-      try {
-        iter = this.iterator.next(opt_awaitValue);
-      } catch (e) {
-        this.addError(e, dart.stackTrace(e));
-        this.close();
-        return;
-      }
-
-      if (iter.done) {
-        this.close();
-        return;
-      }
-      if (this.isSuspendedAtYield || this.isAdding) return;
-      this.isWaiting = true;
-      let future = iter.value;
-      if (!dart.is(future, dart.getGenericClass(async.Future))) {
-        future = async.Future.value(future);
-      }
-      return future.then(dart.dynamic)(x => this.runBody(x), {
-        onError: (e, s) => this.throwError(e, s)
-      });
-    }
-    add(event) {
-      if (!this.controller.hasListener) return true;
-      this.controller.add(event);
-      this.scheduleGenerator();
-      this.isSuspendedAtYield = true;
-      return false;
-    }
-    addStream(stream) {
-      if (!this.controller.hasListener) return true;
-      this.isAdding = true;
-      this.controller.addStream(stream, {cancelOnError: false}).then(dart.dynamic)(() => {
-        this.isAdding = false;
-        this.scheduleGenerator();
-      }, {
-        onError: (e, s) => this.throwError(e, s)
-      });
-    }
-    throwError(error, stackTrace) {
-      try {
-        this.iterator.throw(error);
-      } catch (e) {
-        this.addError(e, stackTrace);
-      }
-
-    }
-    addError(error, stackTrace) {
-      if (this.canceler != null && !this.canceler.isCompleted) {
-        this.canceler.completeError(error, stackTrace);
-        return;
-      }
-      if (!this.controller.hasListener) return;
-      this.controller.addError(error, stackTrace);
-    }
-  };
-  core.Invocation = class Invocation extends core.Object {
-    get isAccessor() {
-      return dart.test(this.isGetter) || dart.test(this.isSetter);
-    }
-  };
-  dart.setSignature(core.Invocation, {
-    getters: () => ({isAccessor: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.InvocationImpl = class InvocationImpl extends core.Invocation {
-    new(memberName, positionalArguments, opts) {
-      let namedArguments = opts && 'namedArguments' in opts ? opts.namedArguments : null;
-      let isMethod = opts && 'isMethod' in opts ? opts.isMethod : false;
-      let isGetter = opts && 'isGetter' in opts ? opts.isGetter : false;
-      let isSetter = opts && 'isSetter' in opts ? opts.isSetter : false;
-      this.positionalArguments = positionalArguments;
-      this.isMethod = isMethod;
-      this.isGetter = isGetter;
-      this.isSetter = isSetter;
-      this.memberName = dart._dartSymbol(memberName);
-      this.namedArguments = dart.InvocationImpl._namedArgsToSymbols(namedArguments);
-    }
-    static _namedArgsToSymbols(namedArgs) {
-      if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
-      return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
-    }
-  };
-  dart.setSignature(dart.InvocationImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(dart.InvocationImpl, [dart.dynamic, core.List], {namedArguments: dart.dynamic, isMethod: core.bool, isGetter: core.bool, isSetter: core.bool})}),
-    fields: () => ({
-      memberName: core.Symbol,
-      positionalArguments: core.List,
-      namedArguments: MapOfSymbol$dynamic(),
-      isMethod: core.bool,
-      isGetter: core.bool,
-      isSetter: core.bool
-    }),
-    statics: () => ({_namedArgsToSymbols: dart.definiteFunctionType(core.Map$(core.Symbol, dart.dynamic), [dart.dynamic])}),
-    names: ['_namedArgsToSymbols']
-  });
-  dart._MethodStats = class _MethodStats extends core.Object {
-    new(typeName, frame) {
-      this.typeName = typeName;
-      this.frame = frame;
-      this.count = null;
-      this.count = 0;
-    }
-  };
-  dart.setSignature(dart._MethodStats, {
-    constructors: () => ({new: dart.definiteFunctionType(dart._MethodStats, [core.String, core.String])}),
-    fields: () => ({
-      typeName: core.String,
-      frame: core.String,
-      count: core.int
-    })
-  });
-  dart.defineLazy(dart, {
-    get _callMethodStats() {
-      return MapOfString$_MethodStats().new();
-    },
-    set _callMethodStats(_) {}
-  });
-  dart.defineLazy(dart, {
-    get trackProfile() {
-      return dart.global.trackDdcProfile;
-    },
-    set trackProfile(_) {}
-  });
-  dart._ignoreTypeFailure = (() => {
-    return dart._ignoreMemo((actual, type) => {
-      if (!!dart.isSubtype(type, core.Iterable) && !!dart.isSubtype(actual, core.Iterable) || !!dart.isSubtype(type, async.Future) && !!dart.isSubtype(actual, async.Future) || !!dart.isSubtype(type, core.Map) && !!dart.isSubtype(actual, core.Map) || dart.isFunctionType(type) && dart.isFunctionType(actual) || !!dart.isSubtype(type, async.Stream) && !!dart.isSubtype(actual, async.Stream) || !!dart.isSubtype(type, async.StreamSubscription) && !!dart.isSubtype(actual, async.StreamSubscription)) {
-        console.warn('Ignoring cast fail from ' + dart.typeName(actual) + ' to ' + dart.typeName(type));
-        return true;
+    remove(element) {
+      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          this[dartx.setRange](i, dart.notNull(this[dartx.length]) - 1, this, i + 1);
+          this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
+          return true;
+        }
       }
       return false;
-    });
-  })();
-  dart._stack = null;
-  dart._value = Symbol("_value");
-  dart.constants = new Map();
-  dart.constantLists = new Map();
-  dart.JsIterator = class JsIterator {
-    constructor(dartIterator) {
-      this.dartIterator = dartIterator;
     }
-    next() {
-      let i = this.dartIterator;
-      let done = !i.moveNext();
-      return {done: done, value: done ? void 0 : i.current};
+    removeWhere(test) {
+      this[_filter](test, false);
     }
-  };
-  dart.hasOwnProperty = Object.prototype.hasOwnProperty;
-  _debugger.JsonMLConfig = class JsonMLConfig extends core.Object {
-    new(name) {
-      this.name = name;
+    retainWhere(test) {
+      this[_filter](test, true);
     }
-  };
-  dart.setSignature(_debugger.JsonMLConfig, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLConfig, [core.String])}),
-    fields: () => ({name: core.String}),
-    sfields: () => ({
-      none: _debugger.JsonMLConfig,
-      skipDart: _debugger.JsonMLConfig,
-      keyToString: _debugger.JsonMLConfig,
-      asClass: _debugger.JsonMLConfig
-    })
-  });
-  dart.defineLazy(_debugger.JsonMLConfig, {
-    get none() {
-      return dart.const(new _debugger.JsonMLConfig("none"));
-    },
-    get skipDart() {
-      return dart.const(new _debugger.JsonMLConfig("skipDart"));
-    },
-    get keyToString() {
-      return dart.const(new _debugger.JsonMLConfig("keyToString"));
-    },
-    get asClass() {
-      return dart.const(new _debugger.JsonMLConfig("asClass"));
-    }
-  });
-  _debugger._maxSpanLength = 100;
-  dart.defineLazy(_debugger, {
-    get _devtoolsFormatter() {
-      return new _debugger.JsonMLFormatter(new _debugger.DartFormatter());
-    },
-    set _devtoolsFormatter(_) {}
-  });
-  _debugger._typeof = function(object) {
-    return typeof object;
-  };
-  dart.lazyFn(_debugger._typeof, () => dynamicToString());
-  _debugger.getOwnPropertyNames = function(object) {
-    return dart.list(Object.getOwnPropertyNames(object), core.String);
-  };
-  dart.lazyFn(_debugger.getOwnPropertyNames, () => dynamicToListOfString());
-  _debugger.getOwnPropertySymbols = function(object) {
-    return Object.getOwnPropertySymbols(object);
-  };
-  dart.lazyFn(_debugger.getOwnPropertySymbols, () => dynamicToList());
-  _debugger.JSNative = class JSNative extends core.Object {
-    static getProperty(object, name) {
-      return object[name];
-    }
-    static setProperty(object, name, value) {
-      return object[name] = value;
-    }
-  };
-  dart.setSignature(_debugger.JSNative, {
-    statics: () => ({
-      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['getProperty', 'setProperty']
-  });
-  _debugger.addMetadataChildren = function(object, ret) {
-    ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
-  };
-  dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
-  _debugger.getObjectTypeName = function(object) {
-    let reifiedType = dart.getReifiedType(object);
-    if (reifiedType == null) {
-      if (_debugger._typeof(object) == 'function') {
-        return '[[Raw JavaScript Function]]';
+    [_filter](test, retainMatching) {
+      let source = this;
+      let retained = JSArrayOfE().of([]);
+      let length = source[dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = source[dartx._get](i);
+        if (dart.dcall(test, element) == retainMatching) {
+          retained[dartx.add](element);
+        }
+        if (length != source[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(source));
+        }
       }
-      return '<Error getting type name>';
+      if (retained[dartx.length] != source[dartx.length]) {
+        source[dartx.setRange](0, retained[dartx.length], retained);
+        source[dartx.length] = retained[dartx.length];
+      }
     }
-    return _debugger.getTypeName(core.Type._check(reifiedType));
-  };
-  dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
-  _debugger.getTypeName = function(type) {
-    let name = dart.typeName(type);
-    if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
-    return name;
-  };
-  dart.lazyFn(_debugger.getTypeName, () => TypeToString());
-  _debugger._getType = function(object) {
-    return core.Type.is(object) ? object : dart.getReifiedType(object);
-  };
-  dart.fn(_debugger._getType, dynamicToObject());
-  const _simpleFormatter = Symbol('_simpleFormatter');
-  _debugger.safePreview = function(object, config) {
-    try {
-      let preview = _debugger._devtoolsFormatter[_simpleFormatter].preview(object, config);
-      if (preview != null) return preview;
-      return dart.toString(object);
-    } catch (e) {
-      return dart.str`<Exception thrown> ${e}`;
+    clear() {
+      this[dartx.length] = 0;
     }
-
-  };
-  dart.lazyFn(_debugger.safePreview, () => dynamicAnddynamicToString());
-  _debugger.symbolName = function(symbol) {
-    let name = dart.toString(symbol);
-    dart.assert(name[dartx.startsWith]('Symbol('));
-    return name[dartx.substring]('Symbol('[dartx.length], dart.notNull(name[dartx.length]) - 1);
-  };
-  dart.lazyFn(_debugger.symbolName, () => dynamicToString());
-  _debugger.hasMethod = function(object, name) {
-    try {
-      return core.bool._check(dart.hasMethod(object, name));
-    } catch (e) {
-      return false;
+    removeLast() {
+      if (this[dartx.length] == 0) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      let result = this[dartx._get](dart.notNull(this[dartx.length]) - 1);
+      this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
+      return result;
     }
-
-  };
-  dart.lazyFn(_debugger.hasMethod, () => dynamicAndStringTobool());
-  _debugger.NameValuePair = class NameValuePair extends core.Object {
-    new(opts) {
-      let name = opts && 'name' in opts ? opts.name : null;
-      let value = opts && 'value' in opts ? opts.value : null;
-      let config = opts && 'config' in opts ? opts.config : _debugger.JsonMLConfig.none;
-      let hideName = opts && 'hideName' in opts ? opts.hideName : false;
-      this.name = name;
-      this.value = value;
-      this.config = config;
-      this.hideName = hideName;
+    sort(compare) {
+      if (compare === void 0) compare = null;
+      if (compare == null) {
+        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
+      } else {
+        _internal.Sort.sort(E)(this, compare);
+      }
     }
-    ['=='](other) {
-      return _debugger.NameValuePair.is(other) && other.name == this.name;
-    }
-    get hashCode() {
-      return dart.hashCode(this.name);
-    }
-    get displayName() {
-      return dart.test(this.hideName) ? '' : this.name;
-    }
-  };
-  dart.setSignature(_debugger.NameValuePair, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.NameValuePair, [], {name: core.String, value: core.Object, config: _debugger.JsonMLConfig, hideName: core.bool})}),
-    fields: () => ({
-      name: core.String,
-      value: core.Object,
-      config: _debugger.JsonMLConfig,
-      hideName: core.bool
-    }),
-    getters: () => ({displayName: dart.definiteFunctionType(core.String, [])})
-  });
-  _debugger.MapEntry = class MapEntry extends core.Object {
-    new(opts) {
-      let key = opts && 'key' in opts ? opts.key : null;
-      let value = opts && 'value' in opts ? opts.value : null;
-      this.key = key;
-      this.value = value;
-    }
-  };
-  dart.setSignature(_debugger.MapEntry, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.MapEntry, [], {key: core.Object, value: core.Object})}),
-    fields: () => ({
-      key: core.Object,
-      value: core.Object
-    })
-  });
-  _debugger.IterableSpan = class IterableSpan extends core.Object {
-    new(start, end, iterable) {
-      this.start = start;
-      this.end = end;
-      this.iterable = iterable;
-    }
-    get length() {
-      return dart.notNull(this.end) - dart.notNull(this.start);
-    }
-    get maxPowerOfSubsetSize() {
-      return (dart.notNull(math.log(dart.notNull(this.length) - 0.5)) / dart.notNull(math.log(_debugger._maxSpanLength)))[dartx.truncate]();
-    }
-    get subsetSize() {
-      return dart.asInt(math.pow(_debugger._maxSpanLength, this.maxPowerOfSubsetSize));
+    shuffle(random) {
+      if (random === void 0) random = null;
+      if (random == null) random = math.Random.new();
+      let length = this[dartx.length];
+      while (dart.notNull(length) > 1) {
+        let pos = random.nextInt(length);
+        length = dart.notNull(length) - 1;
+        let tmp = this[dartx._get](length);
+        this[dartx._set](length, this[dartx._get](pos));
+        this[dartx._set](pos, tmp);
+      }
     }
     asMap() {
-      return this.iterable[dartx.skip](this.start)[dartx.take](this.length)[dartx.toList]()[dartx.asMap]();
+      return new (ListMapViewOfE())(this);
     }
-    children() {
-      let children = JSArrayOfNameValuePair().of([]);
-      if (dart.notNull(this.length) <= dart.notNull(_debugger._maxSpanLength)) {
-        this.asMap()[dartx.forEach](dart.fn((i, element) => {
-          children[dartx.add](new _debugger.NameValuePair({name: dart.toString(dart.notNull(i) + dart.notNull(this.start)), value: element}));
-        }, intAnddynamicToNull()));
+    sublist(start, end) {
+      if (end === void 0) end = null;
+      let listLength = this[dartx.length];
+      if (end == null) end = listLength;
+      core.RangeError.checkValidRange(start, end, listLength);
+      let length = dart.notNull(end) - dart.notNull(start);
+      let result = ListOfE().new();
+      result[dartx.length] = length;
+      for (let i = 0; i < length; i++) {
+        result[dartx._set](i, this[dartx._get](dart.notNull(start) + i));
+      }
+      return result;
+    }
+    getRange(start, end) {
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      return new (SubListIterableOfE())(this, start, end);
+    }
+    removeRange(start, end) {
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      let length = dart.notNull(end) - dart.notNull(start);
+      this[dartx.setRange](start, dart.notNull(this[dartx.length]) - length, this, end);
+      this[dartx.length] = dart.notNull(this[dartx.length]) - length;
+    }
+    fillRange(start, end, fill) {
+      if (fill === void 0) fill = null;
+      E._check(fill);
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        this[dartx._set](i, fill);
+      }
+    }
+    setRange(start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (length == 0) return;
+      core.RangeError.checkNotNegative(skipCount, "skipCount");
+      let otherList = null;
+      let otherStart = null;
+      if (ListOfE().is(iterable)) {
+        otherList = iterable;
+        otherStart = skipCount;
       } else {
-        for (let i = this.start; dart.notNull(i) < dart.notNull(this.end); i = dart.notNull(i) + dart.notNull(this.subsetSize)) {
-          let subSpan = new _debugger.IterableSpan(i, math.min(core.int)(this.end, dart.notNull(this.subsetSize) + dart.notNull(i)), this.iterable);
-          if (subSpan.length == 1) {
-            children[dartx.add](new _debugger.NameValuePair({name: dart.toString(i), value: this.iterable[dartx.elementAt](i)}));
-          } else {
-            children[dartx.add](new _debugger.NameValuePair({name: dart.str`[${i}...${dart.notNull(subSpan.end) - 1}]`, value: subSpan, hideName: true}));
-          }
-        }
+        otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
+        otherStart = 0;
       }
-      return children;
-    }
-  };
-  dart.setSignature(_debugger.IterableSpan, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.IterableSpan, [core.int, core.int, core.Iterable])}),
-    fields: () => ({
-      start: core.int,
-      end: core.int,
-      iterable: core.Iterable
-    }),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      maxPowerOfSubsetSize: dart.definiteFunctionType(core.int, []),
-      subsetSize: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      asMap: dart.definiteFunctionType(core.Map$(core.int, dart.dynamic), []),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [])
-    })
-  });
-  _debugger.Library = class Library extends core.Object {
-    new(name, object) {
-      this.name = name;
-      this.object = object;
-    }
-  };
-  dart.setSignature(_debugger.Library, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.Library, [core.String, core.Object])}),
-    fields: () => ({
-      name: core.String,
-      object: core.Object
-    })
-  });
-  _debugger.NamedConstructor = class NamedConstructor extends core.Object {
-    new(object) {
-      this.object = object;
-    }
-  };
-  dart.setSignature(_debugger.NamedConstructor, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.NamedConstructor, [core.Object])}),
-    fields: () => ({object: core.Object})
-  });
-  _debugger.HeritageClause = class HeritageClause extends core.Object {
-    new(name, types) {
-      this.name = name;
-      this.types = types;
-    }
-  };
-  dart.setSignature(_debugger.HeritageClause, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.HeritageClause, [core.String, core.List])}),
-    fields: () => ({
-      name: core.String,
-      types: core.List
-    })
-  });
-  _debugger.safeGetProperty = function(protoChain, name) {
-    try {
-      return _debugger.JSNative.getProperty(protoChain, name);
-    } catch (e) {
-      return dart.str`<Exception thrown> ${e}`;
-    }
-
-  };
-  dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
-  _debugger.safeProperties = function(object) {
-    return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
-  };
-  dart.fn(_debugger.safeProperties, dynamicTodynamic$());
-  const _attributes = Symbol('_attributes');
-  const _jsonML = Symbol('_jsonML');
-  _debugger.JsonMLElement = class JsonMLElement extends core.Object {
-    new(tagName) {
-      this[_attributes] = null;
-      this[_jsonML] = null;
-      this[_attributes] = {};
-      this[_jsonML] = [tagName, this[_attributes]];
-    }
-    appendChild(element) {
-      this[_jsonML][dartx.add](dart.dsend(element, 'toJsonML'));
-    }
-    createChild(tagName) {
-      let c = new _debugger.JsonMLElement(tagName);
-      this[_jsonML][dartx.add](c.toJsonML());
-      return c;
-    }
-    createObjectTag(object) {
-      return (() => {
-        let _ = this.createChild('object');
-        _.addAttribute('object', object);
-        return _;
-      })();
-    }
-    setStyle(style) {
-      dart.dput(this[_attributes], 'style', style);
-    }
-    addStyle(style) {
-      if (dart.dload(this[_attributes], 'style') == null) {
-        dart.dput(this[_attributes], 'style', style);
+      if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
+        dart.throw(_internal.IterableElementError.tooFew());
+      }
+      if (dart.notNull(otherStart) < dart.notNull(start)) {
+        for (let i = length - 1; i >= 0; i--) {
+          this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
+        }
       } else {
-        let o = this[_attributes];
-        dart.dput(o, 'style', dart.dsend(dart.dload(o, 'style'), '+', style));
-      }
-    }
-    addAttribute(key, value) {
-      _debugger.JSNative.setProperty(this[_attributes], key, value);
-    }
-    createTextChild(text) {
-      this[_jsonML][dartx.add](text);
-    }
-    toJsonML() {
-      return this[_jsonML];
-    }
-  };
-  dart.setSignature(_debugger.JsonMLElement, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic])}),
-    fields: () => ({
-      [_attributes]: dart.dynamic,
-      [_jsonML]: core.List
-    }),
-    methods: () => ({
-      appendChild: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      createChild: dart.definiteFunctionType(_debugger.JsonMLElement, [core.String]),
-      createObjectTag: dart.definiteFunctionType(_debugger.JsonMLElement, [dart.dynamic]),
-      setStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      addStyle: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      addAttribute: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      createTextChild: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      toJsonML: dart.definiteFunctionType(dart.dynamic, [])
-    })
-  });
-  _debugger.isNativeJavaScriptObject = function(object) {
-    let type = _debugger._typeof(object);
-    return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
-  };
-  dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
-  _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
-    new(simpleFormatter) {
-      this[_simpleFormatter] = simpleFormatter;
-      this.customFormattersOn = false;
-    }
-    setMaxSpanLengthForTestingOnly(spanLength) {
-      _debugger._maxSpanLength = spanLength;
-    }
-    header(object, config) {
-      this.customFormattersOn = true;
-      if (dart.equals(config, _debugger.JsonMLConfig.skipDart) || dart.test(_debugger.isNativeJavaScriptObject(object))) {
-        return null;
-      }
-      let c = this[_simpleFormatter].preview(object, config);
-      if (c == null) return null;
-      if (dart.equals(config, _debugger.JsonMLConfig.keyToString)) {
-        c = dart.toString(object);
-      }
-      let element = new _debugger.JsonMLElement('span');
-      element.setStyle('background-color: #d9edf7;');
-      element.createTextChild(c);
-      return element.toJsonML();
-    }
-    hasBody(object, config) {
-      return this[_simpleFormatter].hasChildren(object, config);
-    }
-    body(object, config) {
-      let body = new _debugger.JsonMLElement('ol');
-      body.setStyle('list-style-type: none;' + 'padding-left: 0px;' + 'margin-top: 0px;' + 'margin-bottom: 0px;' + 'margin-left: 12px;');
-      if (core.StackTrace.is(object)) {
-        body.addStyle('color: rgb(196, 26, 22);');
-      }
-      let children = this[_simpleFormatter].children(object, config);
-      for (let child of children) {
-        let li = body.createChild('li');
-        let nameSpan = new _debugger.JsonMLElement('span');
-        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
-        nameSpan.setStyle('color: rgb(136, 19, 145);');
-        if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
-          nameSpan.addStyle("padding-left: 13px;");
-          li.appendChild(nameSpan);
-          let objectTag = li.createObjectTag(child.value);
-          objectTag.addAttribute('config', child.config);
-          if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
-            li.setStyle("padding-left: 13px;");
-          }
-        } else {
-          li.setStyle("padding-left: 13px;");
-          let _ = li.createChild('span');
-          _.appendChild(nameSpan);
-          _.createTextChild(_debugger.safePreview(child.value, child.config));
+        for (let i = 0; i < length; i++) {
+          this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
         }
       }
-      return body.toJsonML();
     }
-  };
-  dart.setSignature(_debugger.JsonMLFormatter, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.JsonMLFormatter, [_debugger.DartFormatter])}),
-    fields: () => ({
-      [_simpleFormatter]: _debugger.DartFormatter,
-      customFormattersOn: core.bool
-    }),
-    methods: () => ({
-      setMaxSpanLengthForTestingOnly: dart.definiteFunctionType(dart.void, [core.int]),
-      header: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      hasBody: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      body: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])
-    })
-  });
-  _debugger.Formatter = class Formatter extends core.Object {};
-  const _formatters = Symbol('_formatters');
-  _debugger.DartFormatter = class DartFormatter extends core.Object {
-    new() {
-      this[_formatters] = null;
-      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
-    }
-    preview(object, config) {
-      try {
-        if (object == null || typeof object == 'number' || typeof object == 'string' || dart.test(_debugger.isNativeJavaScriptObject(object))) {
-          return dart.toString(object);
+    replaceRange(start, end, newContents) {
+      IterableOfE()._check(newContents);
+      core.RangeError.checkValidRange(start, end, this[dartx.length]);
+      if (!_internal.EfficientLength.is(newContents)) {
+        newContents = newContents[dartx.toList]();
+      }
+      let removeLength = dart.notNull(end) - dart.notNull(start);
+      let insertLength = newContents[dartx.length];
+      if (removeLength >= dart.notNull(insertLength)) {
+        let delta = removeLength - dart.notNull(insertLength);
+        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
+        let newLength = dart.notNull(this[dartx.length]) - delta;
+        this[dartx.setRange](start, insertEnd, newContents);
+        if (delta != 0) {
+          this[dartx.setRange](insertEnd, newLength, this, end);
+          this[dartx.length] = newLength;
         }
-        for (let formatter of this[_formatters]) {
-          if (dart.test(formatter.accept(object, config))) return formatter.preview(object);
-        }
-      } catch (e) {
-        let trace = dart.stackTrace(e);
-        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
-      }
-
-      return null;
-    }
-    hasChildren(object, config) {
-      if (object == null) return false;
-      try {
-        for (let formatter of this[_formatters]) {
-          if (dart.test(formatter.accept(object, config))) return formatter.hasChildren(object);
-        }
-      } catch (e) {
-        let trace = dart.stackTrace(e);
-        html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
-      }
-
-      return false;
-    }
-    children(object, config) {
-      try {
-        if (object != null) {
-          for (let formatter of this[_formatters]) {
-            if (dart.test(formatter.accept(object, config))) return formatter.children(object);
-          }
-        }
-      } catch (e) {
-        let trace = dart.stackTrace(e);
-        html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
-      }
-
-      return JSArrayOfNameValuePair().of([]);
-    }
-  };
-  dart.setSignature(_debugger.DartFormatter, {
-    constructors: () => ({new: dart.definiteFunctionType(_debugger.DartFormatter, [])}),
-    fields: () => ({[_formatters]: ListOfFormatter()}),
-    methods: () => ({
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic, dart.dynamic])
-    })
-  });
-  _debugger.ObjectFormatter = class ObjectFormatter extends _debugger.Formatter {
-    accept(object, config) {
-      return !dart.test(_debugger.isNativeJavaScriptObject(object));
-    }
-    preview(object) {
-      return _debugger.getObjectTypeName(object);
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      let properties = LinkedHashSetOfNameValuePair().new();
-      _debugger.addMetadataChildren(object, properties);
-      let current = object;
-      let protoChain = JSArrayOfObject().of([]);
-      while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
-        protoChain[dartx.add](current);
-        current = _debugger.safeGetProperty(current, '__proto__');
-      }
-      for (current of protoChain) {
-        for (let symbol of _debugger.getOwnPropertySymbols(current)) {
-          let dartName = _debugger.symbolName(symbol);
-          if (dart.test(_debugger.hasMethod(object, dartName))) {
-            continue;
-          }
-          let dartXPrefix = 'dartx.';
-          if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
-            dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
-          } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, symbol);
-          properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
-        }
-      }
-      for (current of protoChain) {
-        let className = dart.dload(dart.getReifiedType(current), 'name');
-        for (let name of _debugger.getOwnPropertyNames(current)) {
-          if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
-          if (dart.test(_debugger.hasMethod(object, name))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, name);
-          properties.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }
-      return properties.toList();
-    }
-  };
-  dart.setSignature(_debugger.ObjectFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    }),
-    sfields: () => ({_customNames: SetOfString()})
-  });
-  dart.defineLazy(_debugger.ObjectFormatter, {
-    get _customNames() {
-      return (() => {
-        let _ = SetOfString().new();
-        _.add('constructor');
-        _.add('prototype');
-        _.add('__proto__');
-        return _;
-      })();
-    },
-    set _customNames(_) {}
-  });
-  _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
-    accept(object, config) {
-      return dart.getDartLibraryName(object) != null;
-    }
-    hasChildren(object) {
-      return true;
-    }
-    preview(object) {
-      let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
-      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
-        dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
-      }
-      return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
-    }
-    children(object) {
-      let children = LinkedHashSetOfNameValuePair().new();
-      for (let name of _debugger.getOwnPropertyNames(object)) {
-        let value = _debugger.safeGetProperty(object, name);
-        name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
-        children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
-      }
-      return children.toList();
-    }
-  };
-  _debugger.LibraryModuleFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.LibraryModuleFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.LibraryFormatter = class LibraryFormatter extends core.Object {
-    new() {
-      this.genericParameters = HashMapOfString$String().new();
-    }
-    accept(object, config) {
-      return _debugger.Library.is(object);
-    }
-    hasChildren(object) {
-      return true;
-    }
-    preview(object) {
-      return core.String._check(dart.dload(object, 'name'));
-    }
-    children(object) {
-      let children = LinkedHashSetOfNameValuePair().new();
-      let nonGenericProperties = LinkedHashMapOfString$Object().new();
-      let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
-      dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
-        let genericTypeConstructor = dart.getGenericTypeCtor(value);
-        if (genericTypeConstructor != null) {
-          this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
-        } else {
-          nonGenericProperties._set(core.String._check(name), value);
-        }
-      }, dynamicAnddynamicToNull()));
-      nonGenericProperties.forEach(dart.fn((name, value) => {
-        if (core.Type.is(value)) {
-          children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
-        } else {
-          children.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }, StringAndObjectToNull()));
-      return children.toList();
-    }
-    recordGenericParameters(name, genericTypeConstructor) {
-      this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
-    }
-    classChild(name, child) {
-      let typeName = _debugger.getTypeName(core.Type._check(child));
-      let parameterName = dart.str`${name}\$`;
-      if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
-        typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
-        _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
-      }
-      return new _debugger.NameValuePair({name: typeName, value: child});
-    }
-  };
-  _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.LibraryFormatter, {
-    fields: () => ({genericParameters: HashMapOfString$String()}),
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
-      recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
-      classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
-    })
-  });
-  _debugger.FunctionFormatter = class FunctionFormatter extends core.Object {
-    accept(object, config) {
-      if (_debugger._typeof(object) != 'function') return false;
-      return dart.getReifiedType(object) != null;
-    }
-    hasChildren(object) {
-      return true;
-    }
-    preview(object) {
-      return dart.typeName(dart.getReifiedType(object));
-    }
-    children(object) {
-      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'signature', value: this.preview(object)}), new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
-    }
-  };
-  _debugger.FunctionFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.FunctionFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.MapFormatter = class MapFormatter extends core.Object {
-    accept(object, config) {
-      return core.Map.is(object);
-    }
-    hasChildren(object) {
-      return true;
-    }
-    preview(object) {
-      let map = core.Map._check(object);
-      return dart.str`${_debugger.getObjectTypeName(map)} length ${map[dartx.length]}`;
-    }
-    children(object) {
-      let map = core.Map._check(object);
-      let entries = LinkedHashSetOfNameValuePair().new();
-      map[dartx.forEach](dart.fn((key, value) => {
-        let entryWrapper = new _debugger.MapEntry({key: key, value: value});
-        entries.add(new _debugger.NameValuePair({name: dart.toString(entries.length), value: entryWrapper}));
-      }, dynamicAnddynamicToNull()));
-      _debugger.addMetadataChildren(object, entries);
-      return entries.toList();
-    }
-  };
-  _debugger.MapFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.MapFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.IterableFormatter = class IterableFormatter extends core.Object {
-    accept(object, config) {
-      return core.Iterable.is(object);
-    }
-    preview(object) {
-      let iterable = core.Iterable._check(object);
-      try {
-        let length = iterable[dartx.length];
-        return dart.str`${_debugger.getObjectTypeName(iterable)} length ${length}`;
-      } catch (_) {
-        return dart.str`${_debugger.getObjectTypeName(iterable)}`;
-      }
-
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      let children = LinkedHashSetOfNameValuePair().new();
-      children.addAll(new _debugger.IterableSpan(0, core.int._check(dart.dload(object, 'length')), core.Iterable._check(object)).children());
-      _debugger.addMetadataChildren(object, children);
-      return children.toList();
-    }
-  };
-  _debugger.IterableFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.IterableFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.NamedConstructorFormatter = class NamedConstructorFormatter extends core.Object {
-    accept(object, config) {
-      return _debugger.NamedConstructor.is(object);
-    }
-    preview(object) {
-      return 'Named Constructor';
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'JavaScript Function', value: object, config: _debugger.JsonMLConfig.skipDart})]);
-    }
-  };
-  _debugger.NamedConstructorFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.NamedConstructorFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.MapEntryFormatter = class MapEntryFormatter extends core.Object {
-    accept(object, config) {
-      return _debugger.MapEntry.is(object);
-    }
-    preview(object) {
-      let entry = _debugger.MapEntry._check(object);
-      return dart.str`${_debugger.safePreview(entry.key, _debugger.JsonMLConfig.none)} => ${_debugger.safePreview(entry.value, _debugger.JsonMLConfig.none)}`;
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      return JSArrayOfNameValuePair().of([new _debugger.NameValuePair({name: 'key', value: dart.dload(object, 'key'), config: _debugger.JsonMLConfig.keyToString}), new _debugger.NameValuePair({name: 'value', value: dart.dload(object, 'value')})]);
-    }
-  };
-  _debugger.MapEntryFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.MapEntryFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.HeritageClauseFormatter = class HeritageClauseFormatter extends core.Object {
-    accept(object, config) {
-      return _debugger.HeritageClause.is(object);
-    }
-    preview(object) {
-      let clause = _debugger.HeritageClause._check(object);
-      let typeNames = clause.types[dartx.map](core.String)(_debugger.getTypeName);
-      return dart.str`${clause.name} ${typeNames[dartx.join](", ")}`;
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      let clause = _debugger.HeritageClause._check(object);
-      let children = JSArrayOfNameValuePair().of([]);
-      for (let type of clause.types) {
-        children[dartx.add](new _debugger.NameValuePair({value: type, config: _debugger.JsonMLConfig.asClass}));
-      }
-      return children;
-    }
-  };
-  _debugger.HeritageClauseFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.HeritageClauseFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.IterableSpanFormatter = class IterableSpanFormatter extends core.Object {
-    accept(object, config) {
-      return _debugger.IterableSpan.is(object);
-    }
-    preview(object) {
-      return dart.str`[${dart.dload(object, 'start')}...${dart.dsend(dart.dload(object, 'end'), '-', 1)}]`;
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      return ListOfNameValuePair()._check(dart.dsend(object, 'children'));
-    }
-  };
-  _debugger.IterableSpanFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.IterableSpanFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.StackTraceFormatter = class StackTraceFormatter extends core.Object {
-    accept(object, config) {
-      return core.StackTrace.is(object);
-    }
-    preview(object) {
-      return 'StackTrace';
-    }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      return dart.toString(object)[dartx.split]('\n')[dartx.map](_debugger.NameValuePair)(dart.fn(line => new _debugger.NameValuePair({value: line[dartx.replaceFirst](core.RegExp.new('^\\s+at\\s'), ''), hideName: true}), StringToNameValuePair()))[dartx.toList]();
-    }
-  };
-  _debugger.StackTraceFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.StackTraceFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.ClassFormatter = class ClassFormatter extends core.Object {
-    accept(object, config) {
-      return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
-    }
-    preview(object) {
-      let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
-      if (typeName != null) return core.String._check(typeName);
-      let type = _debugger._getType(object);
-      let implements$ = dart.getImplements(type);
-      typeName = _debugger.getTypeName(core.Type._check(type));
-      if (implements$ != null) {
-        let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
-        return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
       } else {
-        return core.String._check(typeName);
+        let delta = dart.notNull(insertLength) - removeLength;
+        let newLength = dart.notNull(this[dartx.length]) + delta;
+        let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
+        this[dartx.length] = newLength;
+        this[dartx.setRange](insertEnd, newLength, this, end);
+        this[dartx.setRange](start, insertEnd, newContents);
       }
     }
-    hasChildren(object) {
-      return true;
-    }
-    children(object) {
-      let type = _debugger._getType(object);
-      let children = JSArrayOfNameValuePair().of([]);
-      let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
-      let mixins = dart.getMixins(type);
-      if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
-        children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+    indexOf(element, startIndex) {
+      if (startIndex === void 0) startIndex = 0;
+      if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
+        return -1;
       }
-      let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
-      for (let name of _debugger.getOwnPropertyNames(object)) {
-        if (dart.test(hiddenProperties[dartx.contains](name))) continue;
-        let value = _debugger.safeGetProperty(object, name);
-        if (value != null && dart.getIsNamedConstructor(value) != null) {
-          value = new _debugger.NamedConstructor(value);
-          name = dart.str`${typeName}.${name}`;
-        }
-        children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+      if (dart.notNull(startIndex) < 0) {
+        startIndex = 0;
       }
-      let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
-      let prototype = object.prototype;
-      if (prototype != null) {
-        for (let name of _debugger.getOwnPropertyNames(prototype)) {
-          if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
-          let func = _debugger.safeGetProperty(prototype, name);
-          let constructor = _debugger.safeGetProperty(prototype, 'constructor');
-          let sigObj = dart.getMethodSig(constructor);
-          if (sigObj != null) {
-            let value = _debugger.safeGetProperty(sigObj, name);
-            if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
-              dart.tag(func, value);
-              children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
-            }
-          }
+      for (let i = startIndex; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          return i;
         }
       }
-      return children;
+      return -1;
     }
-  };
-  _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
-  dart.setSignature(_debugger.ClassFormatter, {
-    methods: () => ({
-      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
-    })
-  });
-  _debugger.registerDevtoolsFormatter = function() {
-    let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
-    dart.global.devtoolsFormatters = formatters;
-  };
-  dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
-  _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
-    if (arg0 === void 0) arg0 = null;
-    if (arg1 === void 0) arg1 = null;
-    if (arg2 === void 0) arg2 = null;
-    if (arg3 === void 0) arg3 = null;
-    if (arg4 === void 0) arg4 = null;
-    if (arg5 === void 0) arg5 = null;
-    if (arg6 === void 0) arg6 = null;
-    if (arg7 === void 0) arg7 = null;
-    if (arg8 === void 0) arg8 = null;
-    if (arg9 === void 0) arg9 = null;
-    if (arg10 === void 0) arg10 = null;
-    if (arg11 === void 0) arg11 = null;
-  };
-  dart.lazyFn(_foreign_helper.JS, () => StringAndString__Todynamic());
-  _foreign_helper.JSExportName = class JSExportName extends core.Object {
-    new(name) {
-      this.name = name;
-    }
-  };
-  dart.setSignature(_foreign_helper.JSExportName, {
-    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JSExportName, [core.String])}),
-    fields: () => ({name: core.String})
-  });
-  _foreign_helper.JS_CURRENT_ISOLATE_CONTEXT = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT, () => VoidToIsolateContext());
-  _foreign_helper.IsolateContext = class IsolateContext extends core.Object {};
-  _foreign_helper.JS_CALL_IN_ISOLATE = function(isolate, func) {
-  };
-  dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
-  _foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
-  };
-  dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
-  _foreign_helper.JS_CREATE_ISOLATE = function() {
-  };
-  dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
-  _foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
-  };
-  dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
-  _foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
-  };
-  dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
-  _foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
-  _foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
-  _foreign_helper.JS_OBJECT_CLASS_NAME = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
-  _foreign_helper.JS_NULL_CLASS_NAME = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
-  _foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
-  _foreign_helper.JS_CURRENT_ISOLATE = function() {
-  };
-  dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
-  _foreign_helper.JS_SIGNATURE_NAME = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
-  _foreign_helper.JS_TYPEDEF_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
-  _foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
-  };
-  dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
-  _foreign_helper.JS_GET_NAME = function(name) {
-  };
-  dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
-  _foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
-  };
-  dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
-  _foreign_helper.JS_GET_FLAG = function(name) {
-  };
-  dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
-  _foreign_helper.JS_EFFECT = function(code) {
-    dart.dcall(code, null);
-  };
-  dart.lazyFn(_foreign_helper.JS_EFFECT, () => FunctionTovoid());
-  _foreign_helper.JS_CONST = class JS_CONST extends core.Object {
-    new(code) {
-      this.code = code;
-    }
-  };
-  dart.setSignature(_foreign_helper.JS_CONST, {
-    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper.JS_CONST, [core.String])}),
-    fields: () => ({code: core.String})
-  });
-  _foreign_helper.JS_STRING_CONCAT = function(a, b) {
-    return a + b;
-  };
-  dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
-  _foreign_helper._Rest = class _Rest extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_foreign_helper._Rest, {
-    constructors: () => ({new: dart.definiteFunctionType(_foreign_helper._Rest, [])})
-  });
-  _foreign_helper.rest = dart.const(new _foreign_helper._Rest());
-  _foreign_helper.spread = function(args) {
-    dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
-  };
-  dart.fn(_foreign_helper.spread, dynamicTodynamic$());
-  _interceptors.Interceptor = class Interceptor extends core.Object {
-    new() {
-    }
-  };
-  dart.addTypeTests(_interceptors.Interceptor);
-  dart.setSignature(_interceptors.Interceptor, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.Interceptor, [])})
-  });
-  _interceptors.getInterceptor = function(obj) {
-    return obj;
-  };
-  dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
-  dart.defineExtensionNames([
-    'toString',
-    'hashCode',
-    'runtimeType'
-  ]);
-  _interceptors.JSBool = class JSBool extends _interceptors.Interceptor {
-    new() {
-      super.new();
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-    get [dartx.hashCode]() {
-      return this ? 2 * 3 * 23 * 3761 : 269 * 811;
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(core.bool);
-    }
-  };
-  _interceptors.JSBool[dart.implements] = () => [core.bool];
-  dart.setSignature(_interceptors.JSBool, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSBool, [])})
-  });
-  dart.registerExtension(dart.global.Boolean, _interceptors.JSBool);
-  _interceptors.JSIndexable$ = dart.generic(E => {
-    class JSIndexable extends core.Object {}
-    dart.addTypeTests(JSIndexable);
-    return JSIndexable;
-  });
-  _interceptors.JSIndexable = JSIndexable();
-  _interceptors.JSObject = class JSObject extends core.Object {};
-  _interceptors.JavaScriptObject = class JavaScriptObject extends _interceptors.Interceptor {
-    new() {
-      super.new();
-    }
-    get hashCode() {
-      return 0;
-    }
-    get runtimeType() {
-      return dart.wrapType(_interceptors.JSObject);
-    }
-  };
-  _interceptors.JavaScriptObject[dart.implements] = () => [_interceptors.JSObject];
-  dart.setSignature(_interceptors.JavaScriptObject, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JavaScriptObject, [])})
-  });
-  _interceptors.PlainJavaScriptObject = class PlainJavaScriptObject extends _interceptors.JavaScriptObject {
-    new() {
-      super.new();
-    }
-  };
-  dart.setSignature(_interceptors.PlainJavaScriptObject, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.PlainJavaScriptObject, [])})
-  });
-  _interceptors.UnknownJavaScriptObject = class UnknownJavaScriptObject extends _interceptors.JavaScriptObject {
-    new() {
-      super.new();
-    }
-    toString() {
-      return String(this);
-    }
-  };
-  dart.setSignature(_interceptors.UnknownJavaScriptObject, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.UnknownJavaScriptObject, [])})
-  });
-  _interceptors.findInterceptorConstructorForType = function(type) {
-  };
-  dart.fn(_interceptors.findInterceptorConstructorForType, TypeTodynamic());
-  _interceptors.findConstructorForNativeSubclassType = function(type, name) {
-  };
-  dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
-  _interceptors.getNativeInterceptor = function(object) {
-  };
-  dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
-  _interceptors.setDispatchProperty = function(object, value) {
-  };
-  dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
-  const _removeWhere = Symbol('_removeWhere');
-  _interceptors.JSArray$ = dart.generic(E => {
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
-    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
-    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
-    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let ArrayIteratorOfE = () => (ArrayIteratorOfE = dart.constFn(_interceptors.ArrayIterator$(E)))();
-    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
-    let JSIndexableOfE = () => (JSIndexableOfE = dart.constFn(_interceptors.JSIndexable$(E)))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
-    dart.defineExtensionNames([
-      'checkMutable',
-      'checkGrowable',
-      'add',
-      'removeAt',
-      'insert',
-      'insertAll',
-      'setAll',
-      'removeLast',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'where',
-      'expand',
-      'addAll',
-      'clear',
-      'forEach',
-      'map',
-      'join',
-      'take',
-      'takeWhile',
-      'skip',
-      'skipWhile',
-      'reduce',
-      'fold',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'elementAt',
-      'sublist',
-      'getRange',
-      'first',
-      'last',
-      'single',
-      'removeRange',
-      'setRange',
-      'fillRange',
-      'replaceRange',
-      'any',
-      'every',
-      'reversed',
-      'sort',
-      'shuffle',
-      'indexOf',
-      'lastIndexOf',
-      'contains',
-      'isEmpty',
-      'isNotEmpty',
-      'toString',
-      'toList',
-      'toSet',
-      'iterator',
-      'hashCode',
-      'length',
-      'length',
-      '_get',
-      '_set',
-      'asMap'
-    ]);
-    class JSArray extends core.Object {
-      new() {
-      }
-      static typed(allocation) {
-        return dart.list(allocation, E);
-      }
-      static of(allocation) {
-        return dart.setType(allocation, JSArray);
-      }
-      static markFixed(allocation) {
-        return JSArrayOfE().typed(_interceptors.JSArray.markFixedList(core.List._check(allocation)));
-      }
-      static markGrowable(allocation) {
-        return JSArrayOfE().typed(allocation);
-      }
-      static markFixedList(list) {
-        list.fixed$length = Array;
-        return list;
-      }
-      static markUnmodifiableList(list) {
-        list.fixed$length = Array;
-        list.immutable$list = Array;
-        return list;
-      }
-      [dartx.checkMutable](reason) {
-        if (this.immutable$list) {
-          dart.throw(new core.UnsupportedError(core.String._check(reason)));
+    lastIndexOf(element, startIndex) {
+      if (startIndex === void 0) startIndex = null;
+      if (startIndex == null) {
+        startIndex = dart.notNull(this[dartx.length]) - 1;
+      } else {
+        if (dart.notNull(startIndex) < 0) {
+          return -1;
+        }
+        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
+          startIndex = dart.notNull(this[dartx.length]) - 1;
         }
       }
-      [dartx.checkGrowable](reason) {
-        if (this.fixed$length) {
-          dart.throw(new core.UnsupportedError(core.String._check(reason)));
+      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
+        if (dart.equals(this[dartx._get](i), element)) {
+          return i;
         }
       }
-      [dartx.add](value) {
-        E._check(value);
-        this[dartx.checkGrowable]('add');
-        this.push(value);
+      return -1;
+    }
+    insert(index, element) {
+      E._check(element);
+      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
+      if (index == this[dartx.length]) {
+        this[dartx.add](element);
+        return;
       }
-      [dartx.removeAt](index) {
-        this[dartx.checkGrowable]('removeAt');
-        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
-        if (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this[dartx.length])) {
-          dart.throw(new core.RangeError.value(index));
-        }
-        return this.splice(index, 1)[0];
+      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError(index));
+      this[dartx.length] = dart.notNull(this[dartx.length]) + 1;
+      this[dartx.setRange](dart.notNull(index) + 1, this[dartx.length], this, index);
+      this[dartx._set](index, element);
+    }
+    removeAt(index) {
+      let result = this[dartx._get](index);
+      this[dartx.setRange](index, dart.notNull(this[dartx.length]) - 1, this, dart.notNull(index) + 1);
+      this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
+      return result;
+    }
+    insertAll(index, iterable) {
+      IterableOfE()._check(iterable);
+      core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
+      if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
+        iterable = iterable[dartx.toList]();
       }
-      [dartx.insert](index, value) {
-        E._check(value);
-        this[dartx.checkGrowable]('insert');
-        if (!(typeof index == 'number')) dart.throw(_js_helper.argumentErrorValue(index));
-        if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
-          dart.throw(new core.RangeError.value(index));
-        }
-        this.splice(index, 0, value);
+      let insertionLength = iterable[dartx.length];
+      this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
+      if (iterable[dartx.length] != insertionLength) {
+        this[dartx.length] = dart.notNull(this[dartx.length]) - dart.notNull(insertionLength);
+        dart.throw(new core.ConcurrentModificationError(iterable));
       }
-      [dartx.insertAll](index, iterable) {
-        IterableOfE()._check(iterable);
-        this[dartx.checkGrowable]('insertAll');
-        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable)) {
-          iterable = iterable[dartx.toList]();
-        }
-        let insertionLength = iterable[dartx.length];
-        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
-        let end = dart.notNull(index) + dart.notNull(insertionLength);
-        this[dartx.setRange](end, this[dartx.length], this, index);
-        this[dartx.setRange](index, end, iterable);
-      }
-      [dartx.setAll](index, iterable) {
-        IterableOfE()._check(iterable);
-        this[dartx.checkMutable]('setAll');
-        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
+      this[dartx.setRange](dart.notNull(index) + dart.notNull(insertionLength), this[dartx.length], this, index);
+      this[dartx.setAll](index, iterable);
+    }
+    setAll(index, iterable) {
+      IterableOfE()._check(iterable);
+      if (core.List.is(iterable)) {
+        this[dartx.setRange](index, dart.notNull(index) + dart.notNull(iterable[dartx.length]), iterable);
+      } else {
         for (let element of iterable) {
           this[dartx._set]((() => {
             let x = index;
@@ -4433,24818 +6638,6232 @@
           })(), element);
         }
       }
-      [dartx.removeLast]() {
-        this[dartx.checkGrowable]('removeLast');
-        if (this[dartx.length] == 0) dart.throw(_js_helper.diagnoseIndexError(this, -1));
-        return this.pop();
-      }
-      [dartx.remove](element) {
-        this[dartx.checkGrowable]('remove');
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            this.splice(i, 1);
-            return true;
-          }
-        }
-        return false;
-      }
-      [dartx.removeWhere](test) {
-        this[dartx.checkGrowable]('removeWhere');
-        this[_removeWhere](test, true);
-      }
-      [dartx.retainWhere](test) {
-        this[dartx.checkGrowable]('retainWhere');
-        this[_removeWhere](test, false);
-      }
-      [_removeWhere](test, removeMatching) {
-        let retained = [];
-        let end = this[dartx.length];
-        for (let i = 0; i < dart.notNull(end); i++) {
-          let element = this[i];
-          if (!dart.test(test(E._check(element))) == removeMatching) {
-            retained[dartx.add](element);
-          }
-          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        if (retained[dartx.length] == end) return;
-        this[dartx.length] = retained[dartx.length];
-        for (let i = 0; i < dart.notNull(retained[dartx.length]); i++) {
-          this[dartx._set](i, E._check(retained[dartx._get](i)));
-        }
-      }
-      [dartx.where](f) {
-        return new (WhereIterableOfE())(this, f);
-      }
-      [dartx.expand](T) {
-        return f => {
-          return new (_internal.ExpandIterable$(E, T))(this, f);
-        };
-      }
-      [dartx.addAll](collection) {
-        IterableOfE()._check(collection);
-        let i = this[dartx.length];
-        this[dartx.checkGrowable]('addAll');
-        for (let e of collection) {
-          dart.assert(i == this[dartx.length] || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
-          i = dart.notNull(i) + 1;
-          this.push(e);
-        }
-      }
-      [dartx.clear]() {
-        this[dartx.length] = 0;
-      }
-      [dartx.forEach](f) {
-        let end = this[dartx.length];
-        for (let i = 0; i < dart.notNull(end); i++) {
-          let element = this[i];
-          f(element);
-          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
-        }
-      }
-      [dartx.map](T) {
-        return f => {
-          return new (_internal.MappedListIterable$(E, T))(this, f);
-        };
-      }
-      [dartx.join](separator) {
-        if (separator === void 0) separator = "";
-        let list = core.List.new(this[dartx.length]);
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          list[dartx._set](i, dart.str`${this[dartx._get](i)}`);
-        }
-        return list.join(separator);
-      }
-      [dartx.take](n) {
-        return new (SubListIterableOfE())(this, 0, n);
-      }
-      [dartx.takeWhile](test) {
-        return new (TakeWhileIterableOfE())(this, test);
-      }
-      [dartx.skip](n) {
-        return new (SubListIterableOfE())(this, n, null);
-      }
-      [dartx.skipWhile](test) {
-        return new (SkipWhileIterableOfE())(this, test);
-      }
-      [dartx.reduce](combine) {
-        EAndEToE()._check(combine);
-        let length = this[dartx.length];
-        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
-        let value = this[dartx._get](0);
-        for (let i = 1; i < dart.notNull(length); i++) {
-          let element = this[i];
-          value = combine(value, element);
-          if (length != this[dartx.length]) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        return value;
-      }
-      [dartx.fold](T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          let length = this[dartx.length];
-          for (let i = 0; i < dart.notNull(length); i++) {
-            let element = this[i];
-            value = combine(value, element);
-            if (this[dartx.length] != length) dart.throw(new core.ConcurrentModificationError(this));
-          }
-          return value;
-        };
-      }
-      [dartx.firstWhere](test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let end = this[dartx.length];
-        for (let i = 0; i < dart.notNull(end); ++i) {
-          let element = this[i];
-          if (dart.test(test(element))) return element;
-          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      [dartx.lastWhere](test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let length = this[dartx.length];
-        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
-          let element = this[i];
-          if (dart.test(test(element))) return element;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      [dartx.singleWhere](test) {
-        let length = this[dartx.length];
-        let match = null;
-        let matchFound = false;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = this[i];
-          if (dart.test(test(E._check(element)))) {
-            if (matchFound) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            matchFound = true;
-            match = E._check(element);
-          }
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (matchFound) return match;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      [dartx.elementAt](index) {
-        return this[dartx._get](index);
-      }
-      [dartx.sublist](start, end) {
-        if (end === void 0) end = null;
-        _js_helper.checkNull(start);
-        if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
-        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
-          dart.throw(new core.RangeError.range(start, 0, this[dartx.length], "start"));
-        }
-        if (end == null) {
-          end = this[dartx.length];
-        } else {
-          if (!(typeof end == 'number')) dart.throw(_js_helper.argumentErrorValue(end));
-          if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(this[dartx.length])) {
-            dart.throw(new core.RangeError.range(end, start, this[dartx.length], "end"));
-          }
-        }
-        if (start == end) return JSArrayOfE().of([]);
-        return JSArrayOfE().typed(this.slice(start, end));
-      }
-      [dartx.getRange](start, end) {
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        return new (SubListIterableOfE())(this, start, end);
-      }
-      get [dartx.first]() {
-        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](0);
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      get [dartx.last]() {
-        if (dart.notNull(this[dartx.length]) > 0) return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      get [dartx.single]() {
-        if (this[dartx.length] == 1) return this[dartx._get](0);
-        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
-        dart.throw(_internal.IterableElementError.tooMany());
-      }
-      [dartx.removeRange](start, end) {
-        this[dartx.checkGrowable]('removeRange');
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        let deleteCount = dart.notNull(end) - dart.notNull(start);
-        this.splice(start, deleteCount);
-      }
-      [dartx.setRange](start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        this[dartx.checkMutable]('set range');
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        let length = dart.notNull(end) - dart.notNull(start);
-        if (length == 0) return;
-        core.RangeError.checkNotNegative(skipCount, "skipCount");
-        let otherList = null;
-        let otherStart = null;
-        if (core.List.is(iterable)) {
-          otherList = ListOfE()._check(iterable);
-          otherStart = skipCount;
-        } else {
-          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
-          otherStart = 0;
-        }
-        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
-          dart.throw(_internal.IterableElementError.tooFew());
-        }
-        if (dart.notNull(otherStart) < dart.notNull(start)) {
-          for (let i = length - 1; i >= 0; i--) {
-            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
-            this[dart.notNull(start) + i] = element;
-          }
-        } else {
-          for (let i = 0; i < length; i++) {
-            let element = otherList[dartx._get](dart.notNull(otherStart) + i);
-            this[dart.notNull(start) + i] = element;
-          }
-        }
-      }
-      [dartx.fillRange](start, end, fillValue) {
-        if (fillValue === void 0) fillValue = null;
-        E._check(fillValue);
-        this[dartx.checkMutable]('fill range');
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          this[i] = fillValue;
-        }
-      }
-      [dartx.replaceRange](start, end, replacement) {
-        IterableOfE()._check(replacement);
-        this[dartx.checkGrowable]('replace range');
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(replacement)) {
-          replacement = replacement[dartx.toList]();
-        }
-        let removeLength = dart.notNull(end) - dart.notNull(start);
-        let insertLength = replacement[dartx.length];
-        if (removeLength >= dart.notNull(insertLength)) {
-          let delta = removeLength - dart.notNull(insertLength);
-          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
-          let newLength = dart.notNull(this[dartx.length]) - delta;
-          this[dartx.setRange](start, insertEnd, replacement);
-          if (delta != 0) {
-            this[dartx.setRange](insertEnd, newLength, this, end);
-            this[dartx.length] = newLength;
-          }
-        } else {
-          let delta = dart.notNull(insertLength) - removeLength;
-          let newLength = dart.notNull(this[dartx.length]) + delta;
-          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
-          this[dartx.length] = newLength;
-          this[dartx.setRange](insertEnd, newLength, this, end);
-          this[dartx.setRange](start, insertEnd, replacement);
-        }
-      }
-      [dartx.any](test) {
-        let end = this[dartx.length];
-        for (let i = 0; i < dart.notNull(end); i++) {
-          let element = this[i];
-          if (dart.test(test(element))) return true;
-          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        return false;
-      }
-      [dartx.every](test) {
-        let end = this[dartx.length];
-        for (let i = 0; i < dart.notNull(end); i++) {
-          let element = this[i];
-          if (!dart.test(test(element))) return false;
-          if (this[dartx.length] != end) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        return true;
-      }
-      get [dartx.reversed]() {
-        return new (ReversedListIterableOfE())(this);
-      }
-      [dartx.sort](compare) {
-        if (compare === void 0) compare = null;
-        this[dartx.checkMutable]('sort');
-        if (compare == null) {
-          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-        } else {
-          _internal.Sort.sort(E)(this, compare);
-        }
-      }
-      [dartx.shuffle](random) {
-        if (random === void 0) random = null;
-        this[dartx.checkMutable]('shuffle');
-        if (random == null) random = math.Random.new();
-        let length = this[dartx.length];
-        while (dart.notNull(length) > 1) {
-          let pos = random.nextInt(length);
-          length = dart.notNull(length) - 1;
-          let tmp = this[dartx._get](length);
-          this[dartx._set](length, this[dartx._get](pos));
-          this[dartx._set](pos, tmp);
-        }
-      }
-      [dartx.indexOf](element, start) {
-        if (start === void 0) start = 0;
-        if (dart.notNull(start) >= dart.notNull(this[dartx.length])) {
-          return -1;
-        }
-        if (dart.notNull(start) < 0) {
-          start = 0;
-        }
-        for (let i = start; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            return i;
-          }
-        }
-        return -1;
-      }
-      [dartx.lastIndexOf](element, startIndex) {
-        if (startIndex === void 0) startIndex = null;
-        if (startIndex == null) {
-          startIndex = dart.notNull(this[dartx.length]) - 1;
-        } else {
-          if (dart.notNull(startIndex) < 0) {
-            return -1;
-          }
-          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
-            startIndex = dart.notNull(this[dartx.length]) - 1;
-          }
-        }
-        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            return i;
-          }
-        }
-        return -1;
-      }
-      [dartx.contains](other) {
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          if (dart.equals(this[dartx._get](i), other)) return true;
-        }
-        return false;
-      }
-      get [dartx.isEmpty]() {
-        return this[dartx.length] == 0;
-      }
-      get [dartx.isNotEmpty]() {
-        return !dart.test(this[dartx.isEmpty]);
-      }
-      [dartx.toString]() {
-        return collection.ListBase.listToString(this);
-      }
-      [dartx.toList](opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let list = this.slice();
-        if (!dart.test(growable)) _interceptors.JSArray.markFixedList(core.List._check(list));
-        return JSArrayOfE().typed(list);
-      }
-      [dartx.toSet]() {
-        return SetOfE().from(this);
-      }
-      get [dartx.iterator]() {
-        return new (ArrayIteratorOfE())(this);
-      }
-      get [dartx.hashCode]() {
-        return _js_helper.Primitives.objectHashCode(this);
-      }
-      get [dartx.length]() {
-        return this.length;
-      }
-      set [dartx.length](newLength) {
-        this[dartx.checkGrowable]('set length');
-        if (!(typeof newLength == 'number')) {
-          dart.throw(new core.ArgumentError.value(newLength, 'newLength'));
-        }
-        if (dart.notNull(newLength) < 0) {
-          dart.throw(new core.RangeError.range(newLength, 0, null, 'newLength'));
-        }
-        this.length = newLength;
-      }
-      [dartx._get](index) {
-        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
-        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
-        return this[index];
-      }
-      [dartx._set](index, value) {
-        E._check(value);
-        this[dartx.checkMutable]('indexed set');
-        if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
-        if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
-        this[index] = value;
-        return value;
-      }
-      [dartx.asMap]() {
-        return new (ListMapViewOfE())(this);
-      }
     }
-    dart.setExtensionBaseClass(JSArray, dart.global.Array);
-    dart.addTypeTests(JSArray);
-    JSArray[dart.implements] = () => [ListOfE(), JSIndexableOfE()];
-    dart.setSignature(JSArray, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(_interceptors.JSArray$(E), []),
-        typed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
-        of: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
-        markFixed: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic]),
-        markGrowable: dart.definiteFunctionType(_interceptors.JSArray$(E), [dart.dynamic])
-      }),
-      getters: () => ({
-        [dartx.first]: dart.definiteFunctionType(E, []),
-        [dartx.last]: dart.definiteFunctionType(E, []),
-        [dartx.single]: dart.definiteFunctionType(E, []),
-        [dartx.reversed]: dart.definiteFunctionType(core.Iterable$(E), []),
-        [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
-        [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
-        [dartx.iterator]: dart.definiteFunctionType(core.Iterator$(E), []),
-        [dartx.length]: dart.definiteFunctionType(core.int, [])
-      }),
-      setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-      methods: () => ({
-        [dartx.checkMutable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-        [dartx.checkGrowable]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-        [dartx.add]: dart.definiteFunctionType(dart.void, [E]),
-        [dartx.removeAt]: dart.definiteFunctionType(E, [core.int]),
-        [dartx.insert]: dart.definiteFunctionType(dart.void, [core.int, E]),
-        [dartx.insertAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        [dartx.setAll]: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        [dartx.removeLast]: dart.definiteFunctionType(E, []),
-        [dartx.remove]: dart.definiteFunctionType(core.bool, [core.Object]),
-        [dartx.removeWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
-        [dartx.retainWhere]: dart.definiteFunctionType(dart.void, [ETobool()]),
-        [_removeWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
-        [dartx.where]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        [dartx.expand]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
-        [dartx.addAll]: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-        [dartx.forEach]: dart.definiteFunctionType(dart.void, [ETovoid()]),
-        [dartx.map]: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
-        [dartx.join]: dart.definiteFunctionType(core.String, [], [core.String]),
-        [dartx.take]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        [dartx.takeWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        [dartx.skip]: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        [dartx.skipWhile]: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        [dartx.reduce]: dart.definiteFunctionType(E, [EAndEToE()]),
-        [dartx.fold]: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
-        [dartx.firstWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        [dartx.lastWhere]: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        [dartx.singleWhere]: dart.definiteFunctionType(E, [ETobool()]),
-        [dartx.elementAt]: dart.definiteFunctionType(E, [core.int]),
-        [dartx.sublist]: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
-        [dartx.getRange]: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
-        [dartx.removeRange]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-        [dartx.setRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
-        [dartx.fillRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
-        [dartx.replaceRange]: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
-        [dartx.any]: dart.definiteFunctionType(core.bool, [ETobool()]),
-        [dartx.every]: dart.definiteFunctionType(core.bool, [ETobool()]),
-        [dartx.sort]: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
-        [dartx.shuffle]: dart.definiteFunctionType(dart.void, [], [math.Random]),
-        [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-        [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-        [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Object]),
-        [dartx.toList]: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
-        [dartx.toSet]: dart.definiteFunctionType(core.Set$(E), []),
-        [dartx._get]: dart.definiteFunctionType(E, [core.int]),
-        [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, E]),
-        [dartx.asMap]: dart.definiteFunctionType(core.Map$(core.int, E), [])
-      }),
-      statics: () => ({
-        markFixedList: dart.definiteFunctionType(core.List, [core.List]),
-        markUnmodifiableList: dart.definiteFunctionType(core.List, [core.List])
-      }),
-      names: ['markFixedList', 'markUnmodifiableList']
-    });
-    return JSArray;
-  });
-  _interceptors.JSArray = JSArray();
-  dart.registerExtension(dart.global.Array, _interceptors.JSArray);
-  _interceptors.JSMutableArray$ = dart.generic(E => {
-    class JSMutableArray extends _interceptors.JSArray$(E) {
-      new() {
-        super.new();
-      }
-    }
-    return JSMutableArray;
-  });
-  _interceptors.JSMutableArray = JSMutableArray();
-  _interceptors.JSFixedArray$ = dart.generic(E => {
-    class JSFixedArray extends _interceptors.JSMutableArray$(E) {
-      new() {
-        super.new();
-      }
-    }
-    return JSFixedArray;
-  });
-  _interceptors.JSFixedArray = JSFixedArray();
-  _interceptors.JSExtendableArray$ = dart.generic(E => {
-    class JSExtendableArray extends _interceptors.JSMutableArray$(E) {
-      new() {
-        super.new();
-      }
-    }
-    return JSExtendableArray;
-  });
-  _interceptors.JSExtendableArray = JSExtendableArray();
-  _interceptors.JSUnmodifiableArray$ = dart.generic(E => {
-    class JSUnmodifiableArray extends _interceptors.JSArray$(E) {
-      new() {
-        super.new();
-      }
-    }
-    return JSUnmodifiableArray;
-  });
-  _interceptors.JSUnmodifiableArray = JSUnmodifiableArray();
-  const _iterable = Symbol('_iterable');
-  const _length = Symbol('_length');
-  const _index = Symbol('_index');
-  const _current = Symbol('_current');
-  _interceptors.ArrayIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    class ArrayIterator extends core.Object {
-      new(iterable) {
-        this[_iterable] = iterable;
-        this[_length] = iterable[dartx.length];
-        this[_index] = 0;
-        this[_current] = null;
-      }
-      get current() {
-        return this[_current];
-      }
-      moveNext() {
-        let length = this[_iterable][dartx.length];
-        if (this[_length] != length) {
-          dart.throw(_js_helper.throwConcurrentModificationError(this[_iterable]));
-        }
-        if (dart.notNull(this[_index]) >= dart.notNull(length)) {
-          this[_current] = null;
-          return false;
-        }
-        this[_current] = this[_iterable][dartx._get](this[_index]);
-        this[_index] = dart.notNull(this[_index]) + 1;
-        return true;
-      }
-    }
-    dart.addTypeTests(ArrayIterator);
-    ArrayIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(ArrayIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_interceptors.ArrayIterator$(E), [JSArrayOfE()])}),
-      fields: () => ({
-        [_iterable]: JSArrayOfE(),
-        [_length]: core.int,
-        [_index]: core.int,
-        [_current]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return ArrayIterator;
-  });
-  _interceptors.ArrayIterator = ArrayIterator();
-  const _isInt32 = Symbol('_isInt32');
-  const _tdivSlow = Symbol('_tdivSlow');
-  const _shlPositive = Symbol('_shlPositive');
-  const _shrOtherPositive = Symbol('_shrOtherPositive');
-  const _shrBothPositive = Symbol('_shrBothPositive');
-  dart.defineExtensionNames([
-    'compareTo',
-    'isNegative',
-    'isNaN',
-    'isInfinite',
-    'isFinite',
-    'remainder',
-    'abs',
-    'sign',
-    'toInt',
-    'truncate',
-    'ceil',
-    'floor',
-    'round',
-    'ceilToDouble',
-    'floorToDouble',
-    'roundToDouble',
-    'truncateToDouble',
-    'clamp',
-    'toDouble',
-    'toStringAsFixed',
-    'toStringAsExponential',
-    'toStringAsPrecision',
-    'toRadixString',
-    'toString',
-    'hashCode',
-    '_negate',
-    '+',
-    '-',
-    '/',
-    '*',
-    '%',
-    '~/',
-    '<<',
-    '>>',
-    '&',
-    '|',
-    '^',
-    '<',
-    '>',
-    '<=',
-    '>=',
-    'isEven',
-    'isOdd',
-    'toUnsigned',
-    'toSigned',
-    'bitLength',
-    'modPow',
-    'modInverse',
-    'gcd',
-    '~'
-  ]);
-  _interceptors.JSNumber = class JSNumber extends _interceptors.Interceptor {
-    new() {
-      super.new();
-    }
-    [dartx.compareTo](b) {
-      if (this < dart.notNull(b)) {
-        return -1;
-      } else if (this > dart.notNull(b)) {
-        return 1;
-      } else if (this == b) {
-        if (this == 0) {
-          let bIsNegative = b[dartx.isNegative];
-          if (this[dartx.isNegative] == bIsNegative) return 0;
-          if (dart.test(this[dartx.isNegative])) return -1;
-          return 1;
-        }
-        return 0;
-      } else if (dart.test(this[dartx.isNaN])) {
-        if (dart.test(b[dartx.isNaN])) {
-          return 0;
-        }
-        return 1;
-      } else {
-        return -1;
-      }
-    }
-    get [dartx.isNegative]() {
-      return this == 0 ? 1 / this < 0 : this < 0;
-    }
-    get [dartx.isNaN]() {
-      return isNaN(this);
-    }
-    get [dartx.isInfinite]() {
-      return this == 1 / 0 || this == -1 / 0;
-    }
-    get [dartx.isFinite]() {
-      return isFinite(this);
-    }
-    [dartx.remainder](b) {
-      if (!(typeof b == 'number')) dart.throw(_js_helper.argumentErrorValue(b));
-      return this % b;
-    }
-    [dartx.abs]() {
-      return Math.abs(this);
-    }
-    get [dartx.sign]() {
-      return this > 0 ? 1 : this < 0 ? -1 : this;
-    }
-    [dartx.toInt]() {
-      if (this >= _interceptors.JSNumber._MIN_INT32 && this <= _interceptors.JSNumber._MAX_INT32) {
-        return this | 0;
-      }
-      if (isFinite(this)) {
-        return this[dartx.truncateToDouble]() + 0;
-      }
-      dart.throw(new core.UnsupportedError("" + this));
-    }
-    [dartx.truncate]() {
-      return this[dartx.toInt]();
-    }
-    [dartx.ceil]() {
-      return this[dartx.ceilToDouble]()[dartx.toInt]();
-    }
-    [dartx.floor]() {
-      return this[dartx.floorToDouble]()[dartx.toInt]();
-    }
-    [dartx.round]() {
-      if (this > 0) {
-        if (this !== 1 / 0) {
-          return Math.round(this);
-        }
-      } else if (this > -1 / 0) {
-        return 0 - Math.round(0 - this);
-      }
-      dart.throw(new core.UnsupportedError("" + this));
-    }
-    [dartx.ceilToDouble]() {
-      return Math.ceil(this);
-    }
-    [dartx.floorToDouble]() {
-      return Math.floor(this);
-    }
-    [dartx.roundToDouble]() {
-      if (this < 0) {
-        return -Math.round(-this);
-      } else {
-        return Math.round(this);
-      }
-    }
-    [dartx.truncateToDouble]() {
-      return this < 0 ? this[dartx.ceilToDouble]() : this[dartx.floorToDouble]();
-    }
-    [dartx.clamp](lowerLimit, upperLimit) {
-      if (dart.notNull(lowerLimit[dartx.compareTo](upperLimit)) > 0) {
-        dart.throw(_js_helper.argumentErrorValue(lowerLimit));
-      }
-      if (dart.notNull(this[dartx.compareTo](lowerLimit)) < 0) return lowerLimit;
-      if (dart.notNull(this[dartx.compareTo](upperLimit)) > 0) return upperLimit;
-      return this;
-    }
-    [dartx.toDouble]() {
-      return this;
-    }
-    [dartx.toStringAsFixed](fractionDigits) {
-      _js_helper.checkInt(fractionDigits);
-      if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
-        dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
-      }
-      let result = this.toFixed(fractionDigits);
-      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
-      return result;
-    }
-    [dartx.toStringAsExponential](fractionDigits) {
-      if (fractionDigits === void 0) fractionDigits = null;
-      let result = null;
-      if (fractionDigits != null) {
-        _js_helper.checkInt(fractionDigits);
-        if (dart.notNull(fractionDigits) < 0 || dart.notNull(fractionDigits) > 20) {
-          dart.throw(new core.RangeError.range(fractionDigits, 0, 20, "fractionDigits"));
-        }
-        result = this.toExponential(fractionDigits);
-      } else {
-        result = this.toExponential();
-      }
-      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
-      return result;
-    }
-    [dartx.toStringAsPrecision](precision) {
-      _js_helper.checkInt(precision);
-      if (dart.notNull(precision) < 1 || dart.notNull(precision) > 21) {
-        dart.throw(new core.RangeError.range(precision, 1, 21, "precision"));
-      }
-      let result = this.toPrecision(precision);
-      if (this == 0 && dart.test(this[dartx.isNegative])) return dart.str`-${result}`;
-      return result;
-    }
-    [dartx.toRadixString](radix) {
-      _js_helper.checkInt(radix);
-      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
-        dart.throw(new core.RangeError.range(radix, 2, 36, "radix"));
-      }
-      let result = this.toString(radix);
-      let rightParenCode = 41;
-      if (result[dartx.codeUnitAt](dart.notNull(result[dartx.length]) - 1) != rightParenCode) {
-        return result;
-      }
-      return _interceptors.JSNumber._handleIEtoString(result);
-    }
-    static _handleIEtoString(result) {
-      let match = /^([\da-z]+)(?:\.([\da-z]+))?\(e\+(\d+)\)$/.exec(result);
-      if (match == null) {
-        dart.throw(new core.UnsupportedError(dart.str`Unexpected toString result: ${result}`));
-      }
-      result = dart.dindex(match, 1);
-      let exponent = +dart.dindex(match, 3);
-      if (dart.dindex(match, 2) != null) {
-        result = result + dart.dindex(match, 2);
-        exponent = exponent - dart.dindex(match, 2).length;
-      }
-      return dart.notNull(result) + "0"[dartx['*']](exponent);
-    }
-    [dartx.toString]() {
-      if (this == 0 && 1 / this < 0) {
-        return '-0.0';
-      } else {
-        return "" + this;
-      }
-    }
-    get [dartx.hashCode]() {
-      return this & 0x1FFFFFFF;
-    }
-    [dartx._negate]() {
-      return -this;
-    }
-    [dartx['+']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this + other;
-    }
-    [dartx['-']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this - other;
-    }
-    [dartx['/']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this / other;
-    }
-    [dartx['*']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this * other;
-    }
-    [dartx['%']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      let result = this % other;
-      if (result == 0) return 0;
-      if (result > 0) return result;
-      if (other < 0) {
-        return result - other;
-      } else {
-        return result + other;
-      }
-    }
-    [_isInt32](value) {
-      return (value | 0) === value;
-    }
-    [dartx['~/']](other) {
-      if (dart.test(this[_isInt32](this)) && dart.test(this[_isInt32](other)) && 0 != other && -1 != other) {
-        return this / other | 0;
-      } else {
-        return this[_tdivSlow](other);
-      }
-    }
-    [_tdivSlow](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return (this / other)[dartx.toInt]();
-    }
-    [dartx['<<']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
-      return this[_shlPositive](other);
-    }
-    [_shlPositive](other) {
-      return other > 31 ? 0 : this << other >>> 0;
-    }
-    [dartx['>>']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      if (other < 0) dart.throw(_js_helper.argumentErrorValue(other));
-      return this[_shrOtherPositive](other);
-    }
-    [_shrOtherPositive](other) {
-      return this > 0 ? this[_shrBothPositive](other) : this >> (dart.notNull(other) > 31 ? 31 : other) >>> 0;
-    }
-    [_shrBothPositive](other) {
-      return other > 31 ? 0 : this >>> other;
-    }
-    [dartx['&']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return (this & other) >>> 0;
-    }
-    [dartx['|']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return (this | other) >>> 0;
-    }
-    [dartx['^']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return (this ^ other) >>> 0;
-    }
-    [dartx['<']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this < other;
-    }
-    [dartx['>']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this > other;
-    }
-    [dartx['<=']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this <= other;
-    }
-    [dartx['>=']](other) {
-      if (!(typeof other == 'number')) dart.throw(_js_helper.argumentErrorValue(other));
-      return this >= other;
-    }
-    get [dartx.isEven]() {
-      return (this & 1) == 0;
-    }
-    get [dartx.isOdd]() {
-      return (this & 1) == 1;
-    }
-    [dartx.toUnsigned](width) {
-      return (this & (1)[dartx['<<']](width) - 1) >>> 0;
-    }
-    [dartx.toSigned](width) {
-      let signMask = (1)[dartx['<<']](dart.notNull(width) - 1);
-      return ((this & signMask - 1) >>> 0) - ((this & signMask) >>> 0);
-    }
-    get [dartx.bitLength]() {
-      let nonneg = this < 0 ? -this - 1 : this;
-      if (nonneg >= 4294967296) {
-        nonneg = (nonneg / 4294967296)[dartx.truncate]();
-        return dart.notNull(_interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg))) + 32;
-      }
-      return _interceptors.JSNumber._bitCount(_interceptors.JSNumber._spread(nonneg));
-    }
-    [dartx.modPow](e, m) {
-      if (!(typeof e == 'number')) {
-        dart.throw(new core.ArgumentError.value(e, "exponent", "not an integer"));
-      }
-      if (!(typeof m == 'number')) {
-        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
-      }
-      if (dart.notNull(e) < 0) dart.throw(new core.RangeError.range(e, 0, null, "exponent"));
-      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
-      if (e == 0) return 1;
-      let b = this;
-      if (dart.notNull(b) < 0 || dart.notNull(b) > dart.notNull(m)) {
-        b = b[dartx['%']](m);
-      }
-      let r = 1;
-      while (dart.notNull(e) > 0) {
-        if (dart.test(e[dartx.isOdd])) {
-          r = (r * dart.notNull(b))[dartx['%']](m);
-        }
-        e = (dart.notNull(e) / 2)[dartx.truncate]();
-        b = (dart.notNull(b) * dart.notNull(b))[dartx['%']](m);
-      }
-      return r;
-    }
-    static _binaryGcd(x, y, inv) {
-      let s = 1;
-      if (!dart.test(inv)) {
-        while (dart.test(x[dartx.isEven]) && dart.test(y[dartx.isEven])) {
-          x = (dart.notNull(x) / 2)[dartx.truncate]();
-          y = (dart.notNull(y) / 2)[dartx.truncate]();
-          s = s * 2;
-        }
-        if (dart.test(y[dartx.isOdd])) {
-          let t = x;
-          x = y;
-          y = t;
-        }
-      }
-      let ac = x[dartx.isEven];
-      let u = x;
-      let v = y;
-      let a = 1, b = 0, c = 0, d = 1;
-      do {
-        while (dart.test(u[dartx.isEven])) {
-          u = (dart.notNull(u) / 2)[dartx.truncate]();
-          if (dart.test(ac)) {
-            if (!dart.test(a[dartx.isEven]) || !dart.test(b[dartx.isEven])) {
-              a = dart.notNull(a) + dart.notNull(y);
-              b = dart.notNull(b) - dart.notNull(x);
-            }
-            a = (dart.notNull(a) / 2)[dartx.truncate]();
-          } else if (!dart.test(b[dartx.isEven])) {
-            b = dart.notNull(b) - dart.notNull(x);
-          }
-          b = (dart.notNull(b) / 2)[dartx.truncate]();
-        }
-        while (dart.test(v[dartx.isEven])) {
-          v = (dart.notNull(v) / 2)[dartx.truncate]();
-          if (dart.test(ac)) {
-            if (!dart.test(c[dartx.isEven]) || !dart.test(d[dartx.isEven])) {
-              c = dart.notNull(c) + dart.notNull(y);
-              d = dart.notNull(d) - dart.notNull(x);
-            }
-            c = (dart.notNull(c) / 2)[dartx.truncate]();
-          } else if (!dart.test(d[dartx.isEven])) {
-            d = dart.notNull(d) - dart.notNull(x);
-          }
-          d = (dart.notNull(d) / 2)[dartx.truncate]();
-        }
-        if (dart.notNull(u) >= dart.notNull(v)) {
-          u = dart.notNull(u) - dart.notNull(v);
-          if (dart.test(ac)) {
-            a = dart.notNull(a) - dart.notNull(c);
-          }
-          b = dart.notNull(b) - dart.notNull(d);
-        } else {
-          v = dart.notNull(v) - dart.notNull(u);
-          if (dart.test(ac)) {
-            c = dart.notNull(c) - dart.notNull(a);
-          }
-          d = dart.notNull(d) - dart.notNull(b);
-        }
-      } while (u != 0);
-      if (!dart.test(inv)) return s * dart.notNull(v);
-      if (v != 1) dart.throw(core.Exception.new("Not coprime"));
-      if (dart.notNull(d) < 0) {
-        d = dart.notNull(d) + dart.notNull(x);
-        if (dart.notNull(d) < 0) {
-          d = dart.notNull(d) + dart.notNull(x);
-        }
-      } else if (dart.notNull(d) > dart.notNull(x)) {
-        d = dart.notNull(d) - dart.notNull(x);
-        if (dart.notNull(d) > dart.notNull(x)) {
-          d = dart.notNull(d) - dart.notNull(x);
-        }
-      }
-      return d;
-    }
-    [dartx.modInverse](m) {
-      if (!(typeof m == 'number')) {
-        dart.throw(new core.ArgumentError.value(m, "modulus", "not an integer"));
-      }
-      if (dart.notNull(m) <= 0) dart.throw(new core.RangeError.range(m, 1, null, "modulus"));
-      if (m == 1) return 0;
-      let t = this;
-      if (dart.notNull(t) < 0 || dart.notNull(t) >= dart.notNull(m)) {
-        t = t[dartx['%']](m);
-      }
-      if (t == 1) return 1;
-      if (t == 0 || dart.test(t[dartx.isEven]) && dart.test(m[dartx.isEven])) {
-        dart.throw(core.Exception.new("Not coprime"));
-      }
-      return _interceptors.JSNumber._binaryGcd(m, t, true);
-    }
-    [dartx.gcd](other) {
-      if (!(typeof other == 'number')) {
-        dart.throw(new core.ArgumentError.value(other, "other", "not an integer"));
-      }
-      let x = this[dartx.abs]();
-      let y = other[dartx.abs]();
-      if (x == 0) return y;
-      if (y == 0) return x;
-      if (x == 1 || y == 1) return 1;
-      return _interceptors.JSNumber._binaryGcd(x, y, false);
-    }
-    static _bitCount(i) {
-      i = dart.notNull(_interceptors.JSNumber._shru(i, 0)) - (dart.notNull(_interceptors.JSNumber._shru(i, 1)) & 1431655765);
-      i = (dart.notNull(i) & 858993459) + (dart.notNull(_interceptors.JSNumber._shru(i, 2)) & 858993459);
-      i = 252645135 & dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 4));
-      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 8));
-      i = dart.notNull(i) + dart.notNull(_interceptors.JSNumber._shru(i, 16));
-      return dart.notNull(i) & 63;
-    }
-    static _shru(value, shift) {
-      return value >>> shift;
-    }
-    static _shrs(value, shift) {
-      return value >> shift;
-    }
-    static _ors(a, b) {
-      return a | b;
-    }
-    static _spread(i) {
-      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 1));
-      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 2));
-      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 4));
-      i = _interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 8));
-      i = _interceptors.JSNumber._shru(_interceptors.JSNumber._ors(i, _interceptors.JSNumber._shrs(i, 16)), 0);
-      return i;
-    }
-    [dartx['~']]() {
-      return ~this >>> 0;
-    }
-  };
-  _interceptors.JSNumber[dart.implements] = () => [core.int, core.double];
-  dart.setSignature(_interceptors.JSNumber, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSNumber, [])}),
-    getters: () => ({
-      [dartx.isNegative]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isNaN]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isInfinite]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isFinite]: dart.definiteFunctionType(core.bool, []),
-      [dartx.sign]: dart.definiteFunctionType(_interceptors.JSNumber, []),
-      [dartx.isEven]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isOdd]: dart.definiteFunctionType(core.bool, []),
-      [dartx.bitLength]: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx.remainder]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
-      [dartx.abs]: dart.definiteFunctionType(_interceptors.JSNumber, []),
-      [dartx.toInt]: dart.definiteFunctionType(core.int, []),
-      [dartx.truncate]: dart.definiteFunctionType(core.int, []),
-      [dartx.ceil]: dart.definiteFunctionType(core.int, []),
-      [dartx.floor]: dart.definiteFunctionType(core.int, []),
-      [dartx.round]: dart.definiteFunctionType(core.int, []),
-      [dartx.ceilToDouble]: dart.definiteFunctionType(core.double, []),
-      [dartx.floorToDouble]: dart.definiteFunctionType(core.double, []),
-      [dartx.roundToDouble]: dart.definiteFunctionType(core.double, []),
-      [dartx.truncateToDouble]: dart.definiteFunctionType(core.double, []),
-      [dartx.clamp]: dart.definiteFunctionType(core.num, [core.num, core.num]),
-      [dartx.toDouble]: dart.definiteFunctionType(core.double, []),
-      [dartx.toStringAsFixed]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.toStringAsExponential]: dart.definiteFunctionType(core.String, [], [core.int]),
-      [dartx.toStringAsPrecision]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.toRadixString]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx._negate]: dart.definiteFunctionType(_interceptors.JSNumber, []),
-      [dartx['+']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
-      [dartx['-']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
-      [dartx['/']]: dart.definiteFunctionType(core.double, [core.num]),
-      [dartx['*']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
-      [dartx['%']]: dart.definiteFunctionType(_interceptors.JSNumber, [core.num]),
-      [_isInt32]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [dartx['~/']]: dart.definiteFunctionType(core.int, [core.num]),
-      [_tdivSlow]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['<<']]: dart.definiteFunctionType(core.int, [core.num]),
-      [_shlPositive]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['>>']]: dart.definiteFunctionType(core.int, [core.num]),
-      [_shrOtherPositive]: dart.definiteFunctionType(core.int, [core.num]),
-      [_shrBothPositive]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['&']]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['|']]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['^']]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx['<']]: dart.definiteFunctionType(core.bool, [core.num]),
-      [dartx['>']]: dart.definiteFunctionType(core.bool, [core.num]),
-      [dartx['<=']]: dart.definiteFunctionType(core.bool, [core.num]),
-      [dartx['>=']]: dart.definiteFunctionType(core.bool, [core.num]),
-      [dartx.toUnsigned]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.toSigned]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.modPow]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [dartx.modInverse]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.gcd]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx['~']]: dart.definiteFunctionType(core.int, [])
-    }),
-    sfields: () => ({
-      _MIN_INT32: core.int,
-      _MAX_INT32: core.int
-    }),
-    statics: () => ({
-      _handleIEtoString: dart.definiteFunctionType(core.String, [core.String]),
-      _binaryGcd: dart.definiteFunctionType(core.int, [core.int, core.int, core.bool]),
-      _bitCount: dart.definiteFunctionType(core.int, [core.int]),
-      _shru: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      _shrs: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      _ors: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      _spread: dart.definiteFunctionType(core.int, [core.int])
-    }),
-    names: ['_handleIEtoString', '_binaryGcd', '_bitCount', '_shru', '_shrs', '_ors', '_spread']
-  });
-  _interceptors.JSNumber._MIN_INT32 = -2147483648;
-  _interceptors.JSNumber._MAX_INT32 = 2147483647;
-  dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
-  const _defaultSplit = Symbol('_defaultSplit');
-  let const$;
-  dart.defineExtensionNames([
-    'codeUnitAt',
-    'allMatches',
-    'matchAsPrefix',
-    '+',
-    'endsWith',
-    'replaceAll',
-    'replaceAllMapped',
-    'splitMapJoin',
-    'replaceFirst',
-    'replaceFirstMapped',
-    'split',
-    'replaceRange',
-    'startsWith',
-    'substring',
-    'toLowerCase',
-    'toUpperCase',
-    'trim',
-    'trimLeft',
-    'trimRight',
-    '*',
-    'padLeft',
-    'padRight',
-    'codeUnits',
-    'runes',
-    'indexOf',
-    'lastIndexOf',
-    'contains',
-    'isEmpty',
-    'isNotEmpty',
-    'compareTo',
-    'toString',
-    'hashCode',
-    'runtimeType',
-    'length',
-    '_get'
-  ]);
-  _interceptors.JSString = class JSString extends _interceptors.Interceptor {
-    new() {
-      super.new();
-    }
-    [dartx.codeUnitAt](index) {
-      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
-      if (dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
-      if (dart.notNull(index) >= dart.notNull(this[dartx.length])) dart.throw(_js_helper.diagnoseIndexError(this, index));
-      return this.charCodeAt(index);
-    }
-    [dartx.allMatches](string, start) {
-      if (start === void 0) start = 0;
-      _js_helper.checkString(string);
-      _js_helper.checkInt(start);
-      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(string[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
-      }
-      return _js_helper.allMatchesInStringUnchecked(this, string, start);
-    }
-    [dartx.matchAsPrefix](string, start) {
-      if (start === void 0) start = 0;
-      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
-      }
-      if (dart.notNull(start) + dart.notNull(this[dartx.length]) > dart.notNull(string[dartx.length])) return null;
-      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-        if (string[dartx.codeUnitAt](dart.notNull(start) + i) != this[dartx.codeUnitAt](i)) {
-          return null;
-        }
-      }
-      return new _js_helper.StringMatch(start, string, this);
-    }
-    [dartx['+']](other) {
-      if (!(typeof other == 'string')) dart.throw(new core.ArgumentError.value(other));
-      return this + other;
-    }
-    [dartx.endsWith](other) {
-      _js_helper.checkString(other);
-      let otherLength = other[dartx.length];
-      if (dart.notNull(otherLength) > dart.notNull(this[dartx.length])) return false;
-      return other == this[dartx.substring](dart.notNull(this[dartx.length]) - dart.notNull(otherLength));
-    }
-    [dartx.replaceAll](from, to) {
-      _js_helper.checkString(to);
-      return _js_helper.stringReplaceAllUnchecked(this, from, to);
-    }
-    [dartx.replaceAllMapped](from, convert) {
-      return this[dartx.splitMapJoin](from, {onMatch: convert});
-    }
-    [dartx.splitMapJoin](from, opts) {
-      let onMatch = opts && 'onMatch' in opts ? opts.onMatch : null;
-      let onNonMatch = opts && 'onNonMatch' in opts ? opts.onNonMatch : null;
-      return _js_helper.stringReplaceAllFuncUnchecked(this, from, onMatch, onNonMatch);
-    }
-    [dartx.replaceFirst](from, to, startIndex) {
-      if (startIndex === void 0) startIndex = 0;
-      _js_helper.checkString(to);
-      _js_helper.checkInt(startIndex);
-      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
-      return _js_helper.stringReplaceFirstUnchecked(this, from, to, startIndex);
-    }
-    [dartx.replaceFirstMapped](from, replace, startIndex) {
-      if (startIndex === void 0) startIndex = 0;
-      _js_helper.checkNull(replace);
-      _js_helper.checkInt(startIndex);
-      core.RangeError.checkValueInInterval(startIndex, 0, this[dartx.length], "startIndex");
-      return _js_helper.stringReplaceFirstMappedUnchecked(this, from, replace, startIndex);
-    }
-    [dartx.split](pattern) {
-      _js_helper.checkNull(pattern);
-      if (typeof pattern == 'string') {
-        return this.split(pattern);
-      } else if (_js_helper.JSSyntaxRegExp.is(pattern) && _js_helper.regExpCaptureCount(pattern) == 0) {
-        let re = _js_helper.regExpGetNative(pattern);
-        return this.split(re);
-      } else {
-        return this[_defaultSplit](pattern);
-      }
-    }
-    [dartx.replaceRange](start, end, replacement) {
-      _js_helper.checkString(replacement);
-      _js_helper.checkInt(start);
-      end = core.RangeError.checkValidRange(start, end, this[dartx.length]);
-      _js_helper.checkInt(end);
-      return _js_helper.stringReplaceRangeUnchecked(this, start, end, replacement);
-    }
-    [_defaultSplit](pattern) {
-      let result = JSArrayOfString().of([]);
-      let start = 0;
-      let length = 1;
-      for (let match of pattern[dartx.allMatches](this)) {
-        let matchStart = match.start;
-        let matchEnd = match.end;
-        length = dart.notNull(matchEnd) - dart.notNull(matchStart);
-        if (length == 0 && start == matchStart) {
-          continue;
-        }
-        let end = matchStart;
-        result[dartx.add](this[dartx.substring](start, end));
-        start = matchEnd;
-      }
-      if (dart.notNull(start) < dart.notNull(this[dartx.length]) || length > 0) {
-        result[dartx.add](this[dartx.substring](start));
-      }
-      return result;
-    }
-    [dartx.startsWith](pattern, index) {
-      if (index === void 0) index = 0;
-      _js_helper.checkInt(index);
-      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this[dartx.length])) {
-        dart.throw(new core.RangeError.range(index, 0, this[dartx.length]));
-      }
-      if (typeof pattern == 'string') {
-        let other = pattern;
-        let otherLength = other[dartx.length];
-        let endIndex = dart.notNull(index) + dart.notNull(otherLength);
-        if (endIndex > dart.notNull(this[dartx.length])) return false;
-        return other == this.substring(index, endIndex);
-      }
-      return pattern[dartx.matchAsPrefix](this, index) != null;
-    }
-    [dartx.substring](startIndex, endIndex) {
-      if (endIndex === void 0) endIndex = null;
-      _js_helper.checkInt(startIndex);
-      if (endIndex == null) endIndex = this[dartx.length];
-      _js_helper.checkInt(endIndex);
-      if (dart.notNull(startIndex) < 0) dart.throw(new core.RangeError.value(startIndex));
-      if (dart.notNull(startIndex) > dart.notNull(endIndex)) dart.throw(new core.RangeError.value(startIndex));
-      if (dart.notNull(endIndex) > dart.notNull(this[dartx.length])) dart.throw(new core.RangeError.value(endIndex));
-      return this.substring(startIndex, endIndex);
-    }
-    [dartx.toLowerCase]() {
-      return this.toLowerCase();
-    }
-    [dartx.toUpperCase]() {
-      return this.toUpperCase();
-    }
-    static _isWhitespace(codeUnit) {
-      if (dart.notNull(codeUnit) < 256) {
-        switch (codeUnit) {
-          case 9:
-          case 10:
-          case 11:
-          case 12:
-          case 13:
-          case 32:
-          case 133:
-          case 160:
-          {
-            return true;
-          }
-          default:
-          {
-            return false;
-          }
-        }
-      }
-      switch (codeUnit) {
-        case 5760:
-        case 6158:
-        case 8192:
-        case 8193:
-        case 8194:
-        case 8195:
-        case 8196:
-        case 8197:
-        case 8198:
-        case 8199:
-        case 8200:
-        case 8201:
-        case 8202:
-        case 8232:
-        case 8233:
-        case 8239:
-        case 8287:
-        case 12288:
-        case 65279:
-        {
-          return true;
-        }
-        default:
-        {
-          return false;
-        }
-      }
-    }
-    static _skipLeadingWhitespace(string, index) {
-      let SPACE = 32;
-      let CARRIAGE_RETURN = 13;
-      while (dart.notNull(index) < dart.notNull(string[dartx.length])) {
-        let codeUnit = string[dartx.codeUnitAt](index);
-        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
-          break;
-        }
-        index = dart.notNull(index) + 1;
-      }
-      return index;
-    }
-    static _skipTrailingWhitespace(string, index) {
-      let SPACE = 32;
-      let CARRIAGE_RETURN = 13;
-      while (dart.notNull(index) > 0) {
-        let codeUnit = string[dartx.codeUnitAt](dart.notNull(index) - 1);
-        if (codeUnit != SPACE && codeUnit != CARRIAGE_RETURN && !dart.test(_interceptors.JSString._isWhitespace(codeUnit))) {
-          break;
-        }
-        index = dart.notNull(index) - 1;
-      }
-      return index;
-    }
-    [dartx.trim]() {
-      let NEL = 133;
-      let result = this.trim();
-      if (result[dartx.length] == 0) return result;
-      let firstCode = result[dartx.codeUnitAt](0);
-      let startIndex = 0;
-      if (firstCode == NEL) {
-        startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
-        if (startIndex == result[dartx.length]) return "";
-      }
-      let endIndex = result[dartx.length];
-      let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
-      if (lastCode == NEL) {
-        endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
-      }
-      if (startIndex == 0 && endIndex == result[dartx.length]) return result;
-      return result.substring(startIndex, endIndex);
-    }
-    [dartx.trimLeft]() {
-      let NEL = 133;
-      let result = null;
-      let startIndex = 0;
-      if (typeof this.trimLeft != "undefined") {
-        result = this.trimLeft();
-        if (result[dartx.length] == 0) return result;
-        let firstCode = result[dartx.codeUnitAt](0);
-        if (firstCode == NEL) {
-          startIndex = _interceptors.JSString._skipLeadingWhitespace(result, 1);
-        }
-      } else {
-        result = this;
-        startIndex = _interceptors.JSString._skipLeadingWhitespace(this, 0);
-      }
-      if (startIndex == 0) return result;
-      if (startIndex == result[dartx.length]) return "";
-      return result.substring(startIndex);
-    }
-    [dartx.trimRight]() {
-      let NEL = 133;
-      let result = null;
-      let endIndex = null;
-      if (typeof this.trimRight != "undefined") {
-        result = this.trimRight();
-        endIndex = result[dartx.length];
-        if (endIndex == 0) return result;
-        let lastCode = result[dartx.codeUnitAt](dart.notNull(endIndex) - 1);
-        if (lastCode == NEL) {
-          endIndex = _interceptors.JSString._skipTrailingWhitespace(result, dart.notNull(endIndex) - 1);
-        }
-      } else {
-        result = this;
-        endIndex = _interceptors.JSString._skipTrailingWhitespace(this, this[dartx.length]);
-      }
-      if (endIndex == result[dartx.length]) return result;
-      if (endIndex == 0) return "";
-      return result.substring(0, endIndex);
-    }
-    [dartx['*']](times) {
-      if (0 >= dart.notNull(times)) return '';
-      if (times == 1 || this[dartx.length] == 0) return this;
-      if (times != times >>> 0) {
-        dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
-      }
-      let result = '';
-      let s = this;
-      while (true) {
-        if ((dart.notNull(times) & 1) == 1) result = s + result;
-        times = times >>> 1;
-        if (times == 0) break;
-        s = s + s;
-      }
-      return result;
-    }
-    [dartx.padLeft](width, padding) {
-      if (padding === void 0) padding = ' ';
-      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
-      if (delta <= 0) return this;
-      return padding[dartx['*']](delta) + this;
-    }
-    [dartx.padRight](width, padding) {
-      if (padding === void 0) padding = ' ';
-      let delta = dart.notNull(width) - dart.notNull(this[dartx.length]);
-      if (delta <= 0) return this;
-      return this[dartx['+']](padding[dartx['*']](delta));
-    }
-    get [dartx.codeUnits]() {
-      return new _internal.CodeUnits(this);
-    }
-    get [dartx.runes]() {
-      return new core.Runes(this);
-    }
-    [dartx.indexOf](pattern, start) {
-      if (start === void 0) start = 0;
-      _js_helper.checkNull(pattern);
-      if (!(typeof start == 'number')) dart.throw(_js_helper.argumentErrorValue(start));
-      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
-      }
-      if (typeof pattern == 'string') {
-        return _js_helper.stringIndexOfStringUnchecked(this, pattern, start);
-      }
-      if (_js_helper.JSSyntaxRegExp.is(pattern)) {
-        let re = pattern;
-        let match = _js_helper.firstMatchAfter(re, this, start);
-        return match == null ? -1 : match.start;
-      }
-      for (let i = start; dart.notNull(i) <= dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
-        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
-      }
-      return -1;
-    }
-    [dartx.lastIndexOf](pattern, start) {
-      if (start === void 0) start = null;
-      _js_helper.checkNull(pattern);
-      if (start == null) {
-        start = this[dartx.length];
-      } else if (!(typeof start == 'number')) {
-        dart.throw(_js_helper.argumentErrorValue(start));
-      } else if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(this[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, this[dartx.length]));
-      }
-      if (typeof pattern == 'string') {
-        let other = pattern;
-        if (dart.notNull(start) + dart.notNull(other[dartx.length]) > dart.notNull(this[dartx.length])) {
-          start = dart.notNull(this[dartx.length]) - dart.notNull(other[dartx.length]);
-        }
-        return core.int._check(_js_helper.stringLastIndexOfUnchecked(this, other, start));
-      }
-      for (let i = start; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-        if (pattern[dartx.matchAsPrefix](this, i) != null) return i;
-      }
-      return -1;
-    }
-    [dartx.contains](other, startIndex) {
-      if (startIndex === void 0) startIndex = 0;
-      _js_helper.checkNull(other);
-      if (dart.notNull(startIndex) < 0 || dart.notNull(startIndex) > dart.notNull(this[dartx.length])) {
-        dart.throw(new core.RangeError.range(startIndex, 0, this[dartx.length]));
-      }
-      return _js_helper.stringContainsUnchecked(this, other, startIndex);
-    }
-    get [dartx.isEmpty]() {
-      return this[dartx.length] == 0;
-    }
-    get [dartx.isNotEmpty]() {
-      return !dart.test(this[dartx.isEmpty]);
-    }
-    [dartx.compareTo](other) {
-      if (!(typeof other == 'string')) dart.throw(_js_helper.argumentErrorValue(other));
-      return dart.equals(this, other) ? 0 : this < other ? -1 : 1;
-    }
-    [dartx.toString]() {
-      return this;
-    }
-    get [dartx.hashCode]() {
-      let hash = 0;
-      for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-        hash = 536870911 & hash + this.charCodeAt(i);
-        hash = 536870911 & hash + ((524287 & hash) << 10);
-        hash = hash ^ hash >> 6;
-      }
-      hash = 536870911 & hash + ((67108863 & hash) << 3);
-      hash = hash ^ hash >> 11;
-      return 536870911 & hash + ((16383 & hash) << 15);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(core.String);
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (!(typeof index == 'number')) dart.throw(_js_helper.diagnoseIndexError(this, index));
-      if (dart.notNull(index) >= dart.notNull(this[dartx.length]) || dart.notNull(index) < 0) dart.throw(_js_helper.diagnoseIndexError(this, index));
-      return this[index];
-    }
-  };
-  _interceptors.JSString[dart.implements] = () => [core.String, JSIndexableOfString()];
-  dart.setSignature(_interceptors.JSString, {
-    constructors: () => ({new: dart.definiteFunctionType(_interceptors.JSString, [])}),
-    getters: () => ({
-      [dartx.codeUnits]: dart.definiteFunctionType(core.List$(core.int), []),
-      [dartx.runes]: dart.definiteFunctionType(core.Runes, []),
-      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, []),
-      [dartx.length]: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      [dartx.codeUnitAt]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.allMatches]: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
-      [dartx.matchAsPrefix]: dart.definiteFunctionType(core.Match, [core.String], [core.int]),
-      [dartx['+']]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.endsWith]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.replaceAll]: dart.definiteFunctionType(core.String, [core.Pattern, core.String]),
-      [dartx.replaceAllMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()]),
-      [dartx.splitMapJoin]: dart.definiteFunctionType(core.String, [core.Pattern], {onMatch: MatchToString(), onNonMatch: StringToString()}),
-      [dartx.replaceFirst]: dart.definiteFunctionType(core.String, [core.Pattern, core.String], [core.int]),
-      [dartx.replaceFirstMapped]: dart.definiteFunctionType(core.String, [core.Pattern, MatchToString()], [core.int]),
-      [dartx.split]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
-      [dartx.replaceRange]: dart.definiteFunctionType(core.String, [core.int, core.int, core.String]),
-      [_defaultSplit]: dart.definiteFunctionType(core.List$(core.String), [core.Pattern]),
-      [dartx.startsWith]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
-      [dartx.substring]: dart.definiteFunctionType(core.String, [core.int], [core.int]),
-      [dartx.toLowerCase]: dart.definiteFunctionType(core.String, []),
-      [dartx.toUpperCase]: dart.definiteFunctionType(core.String, []),
-      [dartx.trim]: dart.definiteFunctionType(core.String, []),
-      [dartx.trimLeft]: dart.definiteFunctionType(core.String, []),
-      [dartx.trimRight]: dart.definiteFunctionType(core.String, []),
-      [dartx['*']]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.padLeft]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
-      [dartx.padRight]: dart.definiteFunctionType(core.String, [core.int], [core.String]),
-      [dartx.indexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
-      [dartx.lastIndexOf]: dart.definiteFunctionType(core.int, [core.Pattern], [core.int]),
-      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.Pattern], [core.int]),
-      [dartx.compareTo]: dart.definiteFunctionType(core.int, [core.String]),
-      [dartx._get]: dart.definiteFunctionType(core.String, [core.int])
-    }),
-    statics: () => ({
-      _isWhitespace: dart.definiteFunctionType(core.bool, [core.int]),
-      _skipLeadingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int]),
-      _skipTrailingWhitespace: dart.definiteFunctionType(core.int, [core.String, core.int])
-    }),
-    names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
-  });
-  dart.registerExtension(dart.global.String, _interceptors.JSString);
-  core.num = class num extends core.Object {
-    static parse(input, onError) {
-      if (onError === void 0) onError = null;
-      let source = input[dartx.trim]();
-      let result = core.int.parse(source, {onError: core.num._returnIntNull});
-      if (result != null) return result;
-      result = core.double.parse(source, core.num._returnDoubleNull);
-      if (result != null) return result;
-      if (onError == null) dart.throw(new core.FormatException(input));
-      return onError(input);
-    }
-    static _returnIntNull(_) {
-      return null;
-    }
-    static _returnDoubleNull(_) {
-      return null;
-    }
-  };
-  core.num.is = function is_num(o) {
-    return typeof o == "number";
-  };
-  core.num.as = function as_num(o) {
-    if (typeof o == "number" || o == null) return o;
-    return dart.as(o, core.num);
-  };
-  core.num._check = function check_num(o) {
-    if (typeof o == "number" || o == null) return o;
-    return dart.check(o, core.num);
-  };
-  core.num[dart.implements] = () => [ComparableOfnum()];
-  dart.setSignature(core.num, {
-    statics: () => ({
-      parse: dart.definiteFunctionType(core.num, [core.String], [StringTonum()]),
-      _returnIntNull: dart.definiteFunctionType(core.int, [core.String]),
-      _returnDoubleNull: dart.definiteFunctionType(core.double, [core.String])
-    }),
-    names: ['parse', '_returnIntNull', '_returnDoubleNull']
-  });
-  core.double = class double extends core.num {
-    static parse(source, onError) {
-      if (onError === void 0) onError = null;
-      return _js_helper.Primitives.parseDouble(source, onError);
-    }
-  };
-  dart.setSignature(core.double, {
-    sfields: () => ({
-      NAN: core.double,
-      INFINITY: core.double,
-      NEGATIVE_INFINITY: core.double,
-      MIN_POSITIVE: core.double,
-      MAX_FINITE: core.double
-    }),
-    statics: () => ({parse: dart.definiteFunctionType(core.double, [core.String], [StringTodouble()])}),
-    names: ['parse']
-  });
-  core.double.NAN = 0.0 / 0.0;
-  core.double.INFINITY = 1.0 / 0.0;
-  core.double.MIN_POSITIVE = 5e-324;
-  core.double.MAX_FINITE = 1.7976931348623157e+308;
-  dart.defineLazy(core.double, {
-    get NEGATIVE_INFINITY() {
-      return -core.double.INFINITY;
-    }
-  });
-  _internal.POWERS_OF_TEN = dart.constList([1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0, 10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0, 100000000000000.0, 1000000000000000.0, 10000000000000000.0, 100000000000000000.0, 1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0, 1e+21, 1e+22], core.double);
-  const _string = Symbol('_string');
-  const _filter = Symbol('_filter');
-  collection.ListMixin$ = dart.generic(E => {
-    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
-    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
-    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    let ListMapViewOfE = () => (ListMapViewOfE = dart.constFn(_internal.ListMapView$(E)))();
-    let ReversedListIterableOfE = () => (ReversedListIterableOfE = dart.constFn(_internal.ReversedListIterable$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
-    dart.defineExtensionNames([
-      'iterator',
-      'elementAt',
-      'forEach',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last',
-      'single',
-      'contains',
-      'every',
-      'any',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'join',
-      'where',
-      'map',
-      'expand',
-      'reduce',
-      'fold',
-      'skip',
-      'skipWhile',
-      'take',
-      'takeWhile',
-      'toList',
-      'toSet',
-      'add',
-      'addAll',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'clear',
-      'removeLast',
-      'sort',
-      'shuffle',
-      'asMap',
-      'sublist',
-      'getRange',
-      'removeRange',
-      'fillRange',
-      'setRange',
-      'replaceRange',
-      'indexOf',
-      'lastIndexOf',
-      'insert',
-      'removeAt',
-      'insertAll',
-      'setAll',
-      'reversed',
-      'toString'
-    ]);
-    class ListMixin extends core.Object {
-      get iterator() {
-        return new (ListIteratorOfE())(this);
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
-      }
-      elementAt(index) {
-        return this[dartx._get](index);
-      }
-      forEach(action) {
-        let length = this[dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          action(this[dartx._get](i));
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-      }
-      get isEmpty() {
-        return this[dartx.length] == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this[dartx.isEmpty]);
-      }
-      get first() {
-        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this[dartx._get](0);
-      }
-      get last() {
-        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this[dartx._get](dart.notNull(this[dartx.length]) - 1);
-      }
-      get single() {
-        if (this[dartx.length] == 0) dart.throw(_internal.IterableElementError.noElement());
-        if (dart.notNull(this[dartx.length]) > 1) dart.throw(_internal.IterableElementError.tooMany());
-        return this[dartx._get](0);
-      }
-      contains(element) {
-        let length = this[dartx.length];
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          if (dart.equals(this[dartx._get](i), element)) return true;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return false;
-      }
-      every(test) {
-        let length = this[dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          if (!dart.test(test(this[dartx._get](i)))) return false;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return true;
-      }
-      any(test) {
-        let length = this[dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          if (dart.test(test(this[dartx._get](i)))) return true;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return false;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let length = this[dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = this[dartx._get](i);
-          if (dart.test(test(element))) return element;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let length = this[dartx.length];
-        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
-          let element = this[dartx._get](i);
-          if (dart.test(test(element))) return element;
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test) {
-        let length = this[dartx.length];
-        let match = null;
-        let matchFound = false;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = this[dartx._get](i);
-          if (dart.test(test(element))) {
-            if (matchFound) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            matchFound = true;
-            match = element;
-          }
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (matchFound) return match;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        if (this[dartx.length] == 0) return "";
-        let buffer = new core.StringBuffer();
-        buffer.writeAll(this, separator);
-        return buffer.toString();
-      }
-      where(test) {
-        return new (WhereIterableOfE())(this, test);
-      }
-      map(T) {
-        return f => {
-          return new (_internal.MappedListIterable$(E, T))(this, f);
-        };
-      }
-      expand(T) {
-        return f => {
-          return new (_internal.ExpandIterable$(E, T))(this, f);
-        };
-      }
-      reduce(combine) {
-        EAndEToE()._check(combine);
-        let length = this[dartx.length];
-        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
-        let value = this[dartx._get](0);
-        for (let i = 1; i < dart.notNull(length); i++) {
-          value = combine(value, this[dartx._get](i));
-          if (length != this[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return value;
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          let length = this[dartx.length];
-          for (let i = 0; i < dart.notNull(length); i++) {
-            value = combine(value, this[dartx._get](i));
-            if (length != this[dartx.length]) {
-              dart.throw(new core.ConcurrentModificationError(this));
-            }
-          }
-          return value;
-        };
-      }
-      skip(count) {
-        return new (SubListIterableOfE())(this, count, null);
-      }
-      skipWhile(test) {
-        return new (SkipWhileIterableOfE())(this, test);
-      }
-      take(count) {
-        return new (SubListIterableOfE())(this, 0, count);
-      }
-      takeWhile(test) {
-        return new (TakeWhileIterableOfE())(this, test);
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let result = null;
-        if (dart.test(growable)) {
-          result = ListOfE().new();
-          result[dartx.length] = this[dartx.length];
-        } else {
-          result = ListOfE().new(this[dartx.length]);
-        }
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          result[dartx._set](i, this[dartx._get](i));
-        }
-        return result;
-      }
-      toSet() {
-        let result = SetOfE().new();
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          result.add(this[dartx._get](i));
-        }
-        return result;
-      }
-      add(element) {
-        E._check(element);
-        this[dartx._set]((() => {
-          let x = this[dartx.length];
-          this[dartx.length] = dart.notNull(x) + 1;
-          return x;
-        })(), element);
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        let i = this[dartx.length];
-        for (let element of iterable) {
-          dart.assert(this[dartx.length] == i || dart.test(dart.throw(new core.ConcurrentModificationError(this))));
-          this[dartx.length] = dart.notNull(i) + 1;
-          this[dartx._set](i, element);
-          i = dart.notNull(i) + 1;
-        }
-      }
-      remove(element) {
-        for (let i = 0; i < dart.notNull(this[dartx.length]); i++) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            this[dartx.setRange](i, dart.notNull(this[dartx.length]) - 1, this, i + 1);
-            this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
-            return true;
-          }
-        }
-        return false;
-      }
-      removeWhere(test) {
-        this[_filter](test, false);
-      }
-      retainWhere(test) {
-        this[_filter](test, true);
-      }
-      [_filter](test, retainMatching) {
-        let source = this;
-        let retained = JSArrayOfE().of([]);
-        let length = source[dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = source[dartx._get](i);
-          if (dart.dcall(test, element) == retainMatching) {
-            retained[dartx.add](element);
-          }
-          if (length != source[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(source));
-          }
-        }
-        if (retained[dartx.length] != source[dartx.length]) {
-          source[dartx.setRange](0, retained[dartx.length], retained);
-          source[dartx.length] = retained[dartx.length];
-        }
-      }
-      clear() {
-        this[dartx.length] = 0;
-      }
-      removeLast() {
-        if (this[dartx.length] == 0) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let result = this[dartx._get](dart.notNull(this[dartx.length]) - 1);
-        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
-        return result;
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        if (compare == null) {
-          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-        } else {
-          _internal.Sort.sort(E)(this, compare);
-        }
-      }
-      shuffle(random) {
-        if (random === void 0) random = null;
-        if (random == null) random = math.Random.new();
-        let length = this[dartx.length];
-        while (dart.notNull(length) > 1) {
-          let pos = random.nextInt(length);
-          length = dart.notNull(length) - 1;
-          let tmp = this[dartx._get](length);
-          this[dartx._set](length, this[dartx._get](pos));
-          this[dartx._set](pos, tmp);
-        }
-      }
-      asMap() {
-        return new (ListMapViewOfE())(this);
-      }
-      sublist(start, end) {
-        if (end === void 0) end = null;
-        let listLength = this[dartx.length];
-        if (end == null) end = listLength;
-        core.RangeError.checkValidRange(start, end, listLength);
-        let length = dart.notNull(end) - dart.notNull(start);
-        let result = ListOfE().new();
-        result[dartx.length] = length;
-        for (let i = 0; i < length; i++) {
-          result[dartx._set](i, this[dartx._get](dart.notNull(start) + i));
-        }
-        return result;
-      }
-      getRange(start, end) {
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        return new (SubListIterableOfE())(this, start, end);
-      }
-      removeRange(start, end) {
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        let length = dart.notNull(end) - dart.notNull(start);
-        this[dartx.setRange](start, dart.notNull(this[dartx.length]) - length, this, end);
-        this[dartx.length] = dart.notNull(this[dartx.length]) - length;
-      }
-      fillRange(start, end, fill) {
-        if (fill === void 0) fill = null;
-        E._check(fill);
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          this[dartx._set](i, fill);
-        }
-      }
-      setRange(start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        let length = dart.notNull(end) - dart.notNull(start);
-        if (length == 0) return;
-        core.RangeError.checkNotNegative(skipCount, "skipCount");
-        let otherList = null;
-        let otherStart = null;
-        if (ListOfE().is(iterable)) {
-          otherList = iterable;
-          otherStart = skipCount;
-        } else {
-          otherList = iterable[dartx.skip](skipCount)[dartx.toList]({growable: false});
-          otherStart = 0;
-        }
-        if (dart.notNull(otherStart) + length > dart.notNull(otherList[dartx.length])) {
-          dart.throw(_internal.IterableElementError.tooFew());
-        }
-        if (dart.notNull(otherStart) < dart.notNull(start)) {
-          for (let i = length - 1; i >= 0; i--) {
-            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
-          }
-        } else {
-          for (let i = 0; i < length; i++) {
-            this[dartx._set](dart.notNull(start) + i, otherList[dartx._get](dart.notNull(otherStart) + i));
-          }
-        }
-      }
-      replaceRange(start, end, newContents) {
-        IterableOfE()._check(newContents);
-        core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(newContents)) {
-          newContents = newContents[dartx.toList]();
-        }
-        let removeLength = dart.notNull(end) - dart.notNull(start);
-        let insertLength = newContents[dartx.length];
-        if (removeLength >= dart.notNull(insertLength)) {
-          let delta = removeLength - dart.notNull(insertLength);
-          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
-          let newLength = dart.notNull(this[dartx.length]) - delta;
-          this[dartx.setRange](start, insertEnd, newContents);
-          if (delta != 0) {
-            this[dartx.setRange](insertEnd, newLength, this, end);
-            this[dartx.length] = newLength;
-          }
-        } else {
-          let delta = dart.notNull(insertLength) - removeLength;
-          let newLength = dart.notNull(this[dartx.length]) + delta;
-          let insertEnd = dart.notNull(start) + dart.notNull(insertLength);
-          this[dartx.length] = newLength;
-          this[dartx.setRange](insertEnd, newLength, this, end);
-          this[dartx.setRange](start, insertEnd, newContents);
-        }
-      }
-      indexOf(element, startIndex) {
-        if (startIndex === void 0) startIndex = 0;
-        if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
-          return -1;
-        }
-        if (dart.notNull(startIndex) < 0) {
-          startIndex = 0;
-        }
-        for (let i = startIndex; dart.notNull(i) < dart.notNull(this[dartx.length]); i = dart.notNull(i) + 1) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            return i;
-          }
-        }
-        return -1;
-      }
-      lastIndexOf(element, startIndex) {
-        if (startIndex === void 0) startIndex = null;
-        if (startIndex == null) {
-          startIndex = dart.notNull(this[dartx.length]) - 1;
-        } else {
-          if (dart.notNull(startIndex) < 0) {
-            return -1;
-          }
-          if (dart.notNull(startIndex) >= dart.notNull(this[dartx.length])) {
-            startIndex = dart.notNull(this[dartx.length]) - 1;
-          }
-        }
-        for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-          if (dart.equals(this[dartx._get](i), element)) {
-            return i;
-          }
-        }
-        return -1;
-      }
-      insert(index, element) {
-        E._check(element);
-        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (index == this[dartx.length]) {
-          this[dartx.add](element);
-          return;
-        }
-        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError(index));
-        this[dartx.length] = dart.notNull(this[dartx.length]) + 1;
-        this[dartx.setRange](dart.notNull(index) + 1, this[dartx.length], this, index);
-        this[dartx._set](index, element);
-      }
-      removeAt(index) {
-        let result = this[dartx._get](index);
-        this[dartx.setRange](index, dart.notNull(this[dartx.length]) - 1, this, dart.notNull(index) + 1);
-        this[dartx.length] = dart.notNull(this[dartx.length]) - 1;
-        return result;
-      }
-      insertAll(index, iterable) {
-        IterableOfE()._check(iterable);
-        core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
-          iterable = iterable[dartx.toList]();
-        }
-        let insertionLength = iterable[dartx.length];
-        this[dartx.length] = dart.notNull(this[dartx.length]) + dart.notNull(insertionLength);
-        if (iterable[dartx.length] != insertionLength) {
-          this[dartx.length] = dart.notNull(this[dartx.length]) - dart.notNull(insertionLength);
-          dart.throw(new core.ConcurrentModificationError(iterable));
-        }
-        this[dartx.setRange](dart.notNull(index) + dart.notNull(insertionLength), this[dartx.length], this, index);
-        this[dartx.setAll](index, iterable);
-      }
-      setAll(index, iterable) {
-        IterableOfE()._check(iterable);
-        if (core.List.is(iterable)) {
-          this[dartx.setRange](index, dart.notNull(index) + dart.notNull(iterable[dartx.length]), iterable);
-        } else {
-          for (let element of iterable) {
-            this[dartx._set]((() => {
-              let x = index;
-              index = dart.notNull(x) + 1;
-              return x;
-            })(), element);
-          }
-        }
-      }
-      get reversed() {
-        return new (ReversedListIterableOfE())(this);
-      }
-      toString() {
-        return collection.IterableBase.iterableToFullString(this, '[', ']');
-      }
-    }
-    dart.addTypeTests(ListMixin);
-    ListMixin[dart.implements] = () => [ListOfE()];
-    dart.setSignature(ListMixin, {
-      getters: () => ({
-        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        first: dart.definiteFunctionType(E, []),
-        last: dart.definiteFunctionType(E, []),
-        single: dart.definiteFunctionType(E, []),
-        reversed: dart.definiteFunctionType(core.Iterable$(E), [])
-      }),
-      methods: () => ({
-        elementAt: dart.definiteFunctionType(E, [core.int]),
-        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
-        contains: dart.definiteFunctionType(core.bool, [core.Object]),
-        every: dart.definiteFunctionType(core.bool, [ETobool()]),
-        any: dart.definiteFunctionType(core.bool, [ETobool()]),
-        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
-        join: dart.definiteFunctionType(core.String, [], [core.String]),
-        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
-        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
-        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
-        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
-        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
-        toSet: dart.definiteFunctionType(core.Set$(E), []),
-        add: dart.definiteFunctionType(dart.void, [E]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        [_filter]: dart.definiteFunctionType(dart.void, [dynamicTobool(), core.bool]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        removeLast: dart.definiteFunctionType(E, []),
-        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
-        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
-        asMap: dart.definiteFunctionType(core.Map$(core.int, E), []),
-        sublist: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
-        getRange: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
-        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
-        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
-        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
-        indexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-        lastIndexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
-        removeAt: dart.definiteFunctionType(E, [core.int]),
-        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
-      })
-    });
-    dart.defineExtensionMembers(ListMixin, [
-      'elementAt',
-      'forEach',
-      'contains',
-      'every',
-      'any',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'join',
-      'where',
-      'map',
-      'expand',
-      'reduce',
-      'fold',
-      'skip',
-      'skipWhile',
-      'take',
-      'takeWhile',
-      'toList',
-      'toSet',
-      'add',
-      'addAll',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'clear',
-      'removeLast',
-      'sort',
-      'shuffle',
-      'asMap',
-      'sublist',
-      'getRange',
-      'removeRange',
-      'fillRange',
-      'setRange',
-      'replaceRange',
-      'indexOf',
-      'lastIndexOf',
-      'insert',
-      'removeAt',
-      'insertAll',
-      'setAll',
-      'toString',
-      'iterator',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last',
-      'single',
-      'reversed'
-    ]);
-    return ListMixin;
-  });
-  collection.ListMixin = ListMixin();
-  collection.ListBase$ = dart.generic(E => {
-    class ListBase extends dart.mixin(core.Object, collection.ListMixin$(E)) {
-      static listToString(list) {
-        return collection.IterableBase.iterableToFullString(list, '[', ']');
-      }
-    }
-    dart.addTypeTests(ListBase);
-    dart.setSignature(ListBase, {
-      statics: () => ({listToString: dart.definiteFunctionType(core.String, [core.List])}),
-      names: ['listToString']
-    });
-    return ListBase;
-  });
-  collection.ListBase = ListBase();
-  _internal.UnmodifiableListMixin$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
-    class UnmodifiableListMixin extends core.Object {
-      _set(index, value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-        return value;
-      }
-      set length(newLength) {
-        dart.throw(new core.UnsupportedError("Cannot change the length of an unmodifiable list"));
-      }
-      setAll(at, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-      }
-      add(value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
-      }
-      insert(index, element) {
-        E._check(element);
-        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
-      }
-      insertAll(at, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
-      }
-      remove(element) {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      removeWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      retainWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-      }
-      shuffle(random) {
-        if (random === void 0) random = null;
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-      }
-      clear() {
-        dart.throw(new core.UnsupportedError("Cannot clear an unmodifiable list"));
-      }
-      removeAt(index) {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      removeLast() {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      setRange(start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-      }
-      removeRange(start, end) {
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      replaceRange(start, end, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
-      }
-      fillRange(start, end, fillValue) {
-        if (fillValue === void 0) fillValue = null;
-        E._check(fillValue);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
-      }
-    }
-    dart.addTypeTests(UnmodifiableListMixin);
-    UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
-    dart.setSignature(UnmodifiableListMixin, {
-      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-      methods: () => ({
-        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
-        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        add: dart.definiteFunctionType(dart.void, [E]),
-        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
-        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()]),
-        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        removeAt: dart.definiteFunctionType(E, [core.int]),
-        removeLast: dart.definiteFunctionType(E, []),
-        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
-        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
-        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
-      })
-    });
-    dart.defineExtensionMembers(UnmodifiableListMixin, [
-      '_set',
-      'setAll',
-      'add',
-      'insert',
-      'insertAll',
-      'addAll',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'sort',
-      'shuffle',
-      'clear',
-      'removeAt',
-      'removeLast',
-      'setRange',
-      'removeRange',
-      'replaceRange',
-      'fillRange',
-      'length'
-    ]);
-    return UnmodifiableListMixin;
-  });
-  _internal.UnmodifiableListMixin = UnmodifiableListMixin();
-  _internal.UnmodifiableListBase$ = dart.generic(E => {
-    class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), _internal.UnmodifiableListMixin$(E)) {
-      new() {
-        super.new();
-      }
-    }
-    return UnmodifiableListBase;
-  });
-  _internal.UnmodifiableListBase = UnmodifiableListBase();
-  core.int = class int extends core.num {
-    static fromEnvironment(name, opts) {
-      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
-      dart.throw(new core.UnsupportedError('int.fromEnvironment can only be used as a const constructor'));
-    }
-    static parse(source, opts) {
-      let radix = opts && 'radix' in opts ? opts.radix : null;
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      return _js_helper.Primitives.parseInt(source, radix, onError);
-    }
-  };
-  core.int.is = function is_int(o) {
-    return typeof o == "number" && Math.floor(o) == o;
-  };
-  core.int.as = function as_int(o) {
-    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
-    return dart.as(o, core.int);
-  };
-  core.int._check = function check_int(o) {
-    if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
-    return dart.check(o, core.int);
-  };
-  dart.setSignature(core.int, {
-    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.int, [core.String], {defaultValue: core.int})}),
-    statics: () => ({parse: dart.definiteFunctionType(core.int, [core.String], {radix: core.int, onError: StringToint()})}),
-    names: ['parse']
-  });
-  _internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
-    new(string) {
-      this[_string] = string;
-    }
-    get length() {
-      return this[_string][dartx.length];
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _get(i) {
-      return this[_string][dartx.codeUnitAt](i);
-    }
-    static stringOf(u) {
-      return u[_string];
-    }
-  };
-  dart.addSimpleTypeTests(_internal.CodeUnits);
-  dart.setSignature(_internal.CodeUnits, {
-    constructors: () => ({new: dart.definiteFunctionType(_internal.CodeUnits, [core.String])}),
-    fields: () => ({[_string]: core.String}),
-    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({_get: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({stringOf: dart.definiteFunctionType(core.String, [_internal.CodeUnits])}),
-    names: ['stringOf']
-  });
-  dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
-  _internal.EfficientLength = class EfficientLength extends core.Object {};
-  core.Iterable$ = dart.generic(E => {
-    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
-    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
-    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
-    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
-    dart.defineExtensionNames([
-      'map',
-      'where',
-      'expand',
-      'contains',
-      'forEach',
-      'reduce',
-      'fold',
-      'every',
-      'join',
-      'any',
-      'toList',
-      'toSet',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'take',
-      'takeWhile',
-      'skip',
-      'skipWhile',
-      'first',
-      'last',
-      'single',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'elementAt',
-      'toString'
-    ]);
-    class Iterable extends core.Object {
-      new() {
-      }
-      static generate(count, generator) {
-        if (generator === void 0) generator = null;
-        if (dart.notNull(count) <= 0) return new (EmptyIterableOfE())();
-        return new (_GeneratorIterableOfE())(count, generator);
-      }
-      static empty() {
-        return new (EmptyIterableOfE())();
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
-      }
-      map(T) {
-        return f => {
-          return _internal.MappedIterable$(E, T).new(this, f);
-        };
-      }
-      where(test) {
-        return new (WhereIterableOfE())(this, test);
-      }
-      expand(T) {
-        return f => {
-          return new (_internal.ExpandIterable$(E, T))(this, f);
-        };
-      }
-      contains(element) {
-        for (let e of this) {
-          if (dart.equals(e, element)) return true;
-        }
-        return false;
-      }
-      forEach(f) {
-        for (let element of this)
-          f(element);
-      }
-      reduce(combine) {
-        EAndEToE()._check(combine);
-        let iterator = this[dartx.iterator];
-        if (!dart.test(iterator.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let value = iterator.current;
-        while (dart.test(iterator.moveNext())) {
-          value = combine(value, iterator.current);
-        }
-        return value;
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          for (let element of this)
-            value = combine(value, element);
-          return value;
-        };
-      }
-      every(f) {
-        for (let element of this) {
-          if (!dart.test(f(element))) return false;
-        }
-        return true;
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        let iterator = this[dartx.iterator];
-        if (!dart.test(iterator.moveNext())) return "";
-        let buffer = new core.StringBuffer();
-        if (separator == null || separator == "") {
-          do {
-            buffer.write(dart.str`${iterator.current}`);
-          } while (dart.test(iterator.moveNext()));
-        } else {
-          buffer.write(dart.str`${iterator.current}`);
-          while (dart.test(iterator.moveNext())) {
-            buffer.write(separator);
-            buffer.write(dart.str`${iterator.current}`);
-          }
-        }
-        return buffer.toString();
-      }
-      any(f) {
-        for (let element of this) {
-          if (dart.test(f(element))) return true;
-        }
-        return false;
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        return ListOfE().from(this, {growable: growable});
-      }
-      toSet() {
-        return SetOfE().from(this);
-      }
-      get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
-        let count = 0;
-        let it = this[dartx.iterator];
-        while (dart.test(it.moveNext())) {
-          count++;
-        }
-        return count;
-      }
-      get isEmpty() {
-        return !dart.test(this[dartx.iterator].moveNext());
-      }
-      get isNotEmpty() {
-        return !dart.test(this[dartx.isEmpty]);
-      }
-      take(count) {
-        return TakeIterableOfE().new(this, count);
-      }
-      takeWhile(test) {
-        return new (TakeWhileIterableOfE())(this, test);
-      }
-      skip(count) {
-        return SkipIterableOfE().new(this, count);
-      }
-      skipWhile(test) {
-        return new (SkipWhileIterableOfE())(this, test);
-      }
-      get first() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        return it.current;
-      }
-      get last() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let result = null;
-        do {
-          result = it.current;
-        } while (dart.test(it.moveNext()));
-        return result;
-      }
-      get single() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
-        let result = it.current;
-        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
-        return result;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        for (let element of this) {
-          if (dart.test(test(element))) return element;
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test) {
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            if (foundMatching) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      elementAt(index) {
-        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
-        core.RangeError.checkNotNegative(index, "index");
-        let elementIndex = 0;
-        for (let element of this) {
-          if (index == elementIndex) return element;
-          elementIndex++;
-        }
-        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
-      }
-      toString() {
-        return collection.IterableBase.iterableToShortString(this, '(', ')');
-      }
-    }
-    dart.addTypeTests(Iterable);
-    dart.setSignature(Iterable, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(core.Iterable$(E), []),
-        generate: dart.definiteFunctionType(core.Iterable$(E), [core.int], [intToE()]),
-        empty: dart.definiteFunctionType(core.Iterable$(E), [])
-      }),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        first: dart.definiteFunctionType(E, []),
-        last: dart.definiteFunctionType(E, []),
-        single: dart.definiteFunctionType(E, [])
-      }),
-      methods: () => ({
-        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
-        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
-        contains: dart.definiteFunctionType(core.bool, [core.Object]),
-        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
-        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
-        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
-        every: dart.definiteFunctionType(core.bool, [ETobool()]),
-        join: dart.definiteFunctionType(core.String, [], [core.String]),
-        any: dart.definiteFunctionType(core.bool, [ETobool()]),
-        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
-        toSet: dart.definiteFunctionType(core.Set$(E), []),
-        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
-        elementAt: dart.definiteFunctionType(E, [core.int])
-      })
-    });
-    dart.defineExtensionMembers(Iterable, [
-      'map',
-      'where',
-      'expand',
-      'contains',
-      'forEach',
-      'reduce',
-      'fold',
-      'every',
-      'join',
-      'any',
-      'toList',
-      'toSet',
-      'take',
-      'takeWhile',
-      'skip',
-      'skipWhile',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'elementAt',
-      'toString',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last',
-      'single'
-    ]);
-    return Iterable;
-  });
-  core.Iterable = Iterable();
-  _internal.ListIterable$ = dart.generic(E => {
-    let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let dynamicAndEToE = () => (dynamicAndEToE = dart.constFn(dart.functionType(E, [dart.dynamic, E])))();
-    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListIterable extends core.Iterable$(E) {
-      new() {
-        super.new();
-      }
-      get iterator() {
-        return new (ListIteratorOfE())(this);
-      }
-      forEach(action) {
-        let length = this.length;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          action(this.elementAt(i));
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-      }
-      get isEmpty() {
-        return this.length == 0;
-      }
-      get first() {
-        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this.elementAt(0);
-      }
-      get last() {
-        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this.elementAt(dart.notNull(this.length) - 1);
-      }
-      get single() {
-        if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
-        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
-        return this.elementAt(0);
-      }
-      contains(element) {
-        let length = this.length;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          if (dart.equals(this.elementAt(i), element)) return true;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return false;
-      }
-      every(test) {
-        let length = this.length;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          if (!dart.test(test(this.elementAt(i)))) return false;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return true;
-      }
-      any(test) {
-        let length = this.length;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          if (dart.test(test(this.elementAt(i)))) return true;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return false;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let length = this.length;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = this.elementAt(i);
-          if (dart.test(test(element))) return element;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let length = this.length;
-        for (let i = dart.notNull(length) - 1; i >= 0; i--) {
-          let element = this.elementAt(i);
-          if (dart.test(test(element))) return element;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test) {
-        let length = this.length;
-        let match = null;
-        let matchFound = false;
-        for (let i = 0; i < dart.notNull(length); i++) {
-          let element = this.elementAt(i);
-          if (dart.test(test(element))) {
-            if (matchFound) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            matchFound = true;
-            match = element;
-          }
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        if (matchFound) return match;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        let length = this.length;
-        if (!dart.test(separator[dartx.isEmpty])) {
-          if (length == 0) return "";
-          let first = dart.str`${this.elementAt(0)}`;
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          let buffer = new core.StringBuffer(first);
-          for (let i = 1; i < dart.notNull(length); i++) {
-            buffer.write(separator);
-            buffer.write(this.elementAt(i));
-            if (length != this.length) {
-              dart.throw(new core.ConcurrentModificationError(this));
-            }
-          }
-          return buffer.toString();
-        } else {
-          let buffer = new core.StringBuffer();
-          for (let i = 0; i < dart.notNull(length); i++) {
-            buffer.write(this.elementAt(i));
-            if (length != this.length) {
-              dart.throw(new core.ConcurrentModificationError(this));
-            }
-          }
-          return buffer.toString();
-        }
-      }
-      where(test) {
-        return super.where(test);
-      }
-      map(T) {
-        return f => {
-          return new (_internal.MappedListIterable$(E, T))(this, f);
-        };
-      }
-      reduce(combine) {
-        dynamicAndEToE()._check(combine);
-        let length = this.length;
-        if (length == 0) dart.throw(_internal.IterableElementError.noElement());
-        let value = this.elementAt(0);
-        for (let i = 1; i < dart.notNull(length); i++) {
-          value = dart.dcall(combine, value, this.elementAt(i));
-          if (length != this.length) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-        return value;
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          let length = this.length;
-          for (let i = 0; i < dart.notNull(length); i++) {
-            value = combine(value, this.elementAt(i));
-            if (length != this.length) {
-              dart.throw(new core.ConcurrentModificationError(this));
-            }
-          }
-          return value;
-        };
-      }
-      skip(count) {
-        return new (SubListIterableOfE())(this, count, null);
-      }
-      skipWhile(test) {
-        return super.skipWhile(test);
-      }
-      take(count) {
-        return new (SubListIterableOfE())(this, 0, count);
-      }
-      takeWhile(test) {
-        return super.takeWhile(test);
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let result = null;
-        if (dart.test(growable)) {
-          result = ListOfE().new();
-          result[dartx.length] = this.length;
-        } else {
-          result = ListOfE().new(this.length);
-        }
-        for (let i = 0; i < dart.notNull(this.length); i++) {
-          result[dartx._set](i, this.elementAt(i));
-        }
-        return result;
-      }
-      toSet() {
-        let result = SetOfE().new();
-        for (let i = 0; i < dart.notNull(this.length); i++) {
-          result.add(this.elementAt(i));
-        }
-        return result;
-      }
-    }
-    ListIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(ListIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterable$(E), [])}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
-    });
-    dart.defineExtensionMembers(ListIterable, [
-      'forEach',
-      'contains',
-      'every',
-      'any',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'join',
-      'where',
-      'map',
-      'reduce',
-      'fold',
-      'skip',
-      'skipWhile',
-      'take',
-      'takeWhile',
-      'toList',
-      'toSet',
-      'iterator',
-      'isEmpty',
-      'first',
-      'last',
-      'single'
-    ]);
-    return ListIterable;
-  });
-  _internal.ListIterable = ListIterable();
-  const _iterable$ = Symbol('_iterable');
-  const _start = Symbol('_start');
-  const _endOrLength = Symbol('_endOrLength');
-  const _endIndex = Symbol('_endIndex');
-  const _startIndex = Symbol('_startIndex');
-  _internal.SubListIterable$ = dart.generic(E => {
-    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class SubListIterable extends _internal.ListIterable$(E) {
-      new(iterable, start, endOrLength) {
-        this[_iterable$] = iterable;
-        this[_start] = start;
-        this[_endOrLength] = endOrLength;
-        super.new();
-        core.RangeError.checkNotNegative(this[_start], "start");
-        if (this[_endOrLength] != null) {
-          core.RangeError.checkNotNegative(this[_endOrLength], "end");
-          if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
-            dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
-          }
-        }
-      }
-      get [_endIndex]() {
-        let length = this[_iterable$][dartx.length];
-        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
-        return this[_endOrLength];
-      }
-      get [_startIndex]() {
-        let length = this[_iterable$][dartx.length];
-        if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
-        return this[_start];
-      }
-      get length() {
-        let length = this[_iterable$][dartx.length];
-        if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
-        if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
-          return dart.notNull(length) - dart.notNull(this[_start]);
-        }
-        return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
-      }
-      elementAt(index) {
-        let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
-        if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
-          dart.throw(core.RangeError.index(index, this, "index"));
-        }
-        return this[_iterable$][dartx.elementAt](realIndex);
-      }
-      skip(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        let newStart = dart.notNull(this[_start]) + dart.notNull(count);
-        if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
-          return new (EmptyIterableOfE())();
-        }
-        return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
-      }
-      take(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (this[_endOrLength] == null) {
-          return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
-        } else {
-          let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
-          if (dart.notNull(this[_endOrLength]) < newEnd) return this;
-          return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
-        }
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let start = this[_start];
-        let end = this[_iterable$][dartx.length];
-        if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
-        let length = dart.notNull(end) - dart.notNull(start);
-        if (length < 0) length = 0;
-        let result = dart.test(growable) ? (() => {
-          let _ = ListOfE().new();
-          _[dartx.length] = length;
-          return _;
-        })() : ListOfE().new(length);
-        for (let i = 0; i < length; i++) {
-          result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
-          if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
-        }
-        return result;
-      }
-    }
-    dart.setSignature(SubListIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_start]: core.int,
-        [_endOrLength]: core.int
-      }),
-      getters: () => ({
-        [_endIndex]: dart.definiteFunctionType(core.int, []),
-        [_startIndex]: dart.definiteFunctionType(core.int, [])
-      })
-    });
-    dart.defineExtensionMembers(SubListIterable, [
-      'elementAt',
-      'skip',
-      'take',
-      'toList',
-      'length'
-    ]);
-    return SubListIterable;
-  });
-  _internal.SubListIterable = SubListIterable();
-  const _length$ = Symbol('_length');
-  const _index$ = Symbol('_index');
-  const _current$ = Symbol('_current');
-  _internal.ListIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class ListIterator extends core.Object {
-      new(iterable) {
-        this[_iterable$] = iterable;
-        this[_length$] = iterable[dartx.length];
-        this[_index$] = 0;
-        this[_current$] = null;
-      }
-      get current() {
-        return this[_current$];
-      }
-      moveNext() {
-        let length = this[_iterable$][dartx.length];
-        if (this[_length$] != length) {
-          dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
-        }
-        if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
-          this[_current$] = null;
-          return false;
-        }
-        this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
-        this[_index$] = dart.notNull(this[_index$]) + 1;
-        return true;
-      }
-    }
-    dart.addTypeTests(ListIterator);
-    ListIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(ListIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_length$]: core.int,
-        [_index$]: core.int,
-        [_current$]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return ListIterator;
-  });
-  _internal.ListIterator = ListIterator();
-  _internal._Transformation$ = dart.generic((S, T) => {
-    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
-    return _Transformation;
-  });
-  _internal._Transformation = _Transformation();
-  const _f = Symbol('_f');
-  _internal.MappedIterable$ = dart.generic((S, T) => {
-    let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
-    let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
-    let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
-    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
-    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
-    class MappedIterable extends core.Iterable$(T) {
-      static new(iterable, func) {
-        if (_internal.EfficientLength.is(iterable)) {
-          return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
-        }
-        return new (MappedIterableOfS$T())._(iterable, func);
-      }
-      _(iterable, f) {
-        this[_iterable$] = iterable;
-        this[_f] = f;
-        super.new();
-      }
-      get iterator() {
-        return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
-      }
-      get length() {
-        return this[_iterable$][dartx.length];
-      }
-      get isEmpty() {
-        return this[_iterable$][dartx.isEmpty];
-      }
-      get first() {
-        return this[_f](this[_iterable$][dartx.first]);
-      }
-      get last() {
-        return this[_f](this[_iterable$][dartx.last]);
-      }
-      get single() {
-        return this[_f](this[_iterable$][dartx.single]);
-      }
-      elementAt(index) {
-        return this[_f](this[_iterable$][dartx.elementAt](index));
-      }
-    }
-    dart.defineNamedConstructor(MappedIterable, '_');
-    dart.setSignature(MappedIterable, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()]),
-        _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
-      }),
-      fields: () => ({
-        [_iterable$]: IterableOfS(),
-        [_f]: _TransformationOfS$T()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
-    });
-    dart.defineExtensionMembers(MappedIterable, [
-      'elementAt',
-      'iterator',
-      'length',
-      'isEmpty',
-      'first',
-      'last',
-      'single'
-    ]);
-    return MappedIterable;
-  });
-  _internal.MappedIterable = MappedIterable();
-  _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
-    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
-    let SToT = () => (SToT = dart.constFn(dart.functionType(T, [S])))();
-    class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
-      new(iterable, func) {
-        super._(iterable, func);
-      }
-    }
-    EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(EfficientLengthMappedIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthMappedIterable$(S, T), [IterableOfS(), SToT()])})
-    });
-    return EfficientLengthMappedIterable;
-  });
-  _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
-  const _iterator = Symbol('_iterator');
-  core.Iterator$ = dart.generic(E => {
-    class Iterator extends core.Object {}
-    dart.addTypeTests(Iterator);
-    return Iterator;
-  });
-  core.Iterator = Iterator();
-  _internal.MappedIterator$ = dart.generic((S, T) => {
-    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
-    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
-    class MappedIterator extends core.Iterator$(T) {
-      new(iterator, f) {
-        this[_iterator] = iterator;
-        this[_f] = f;
-        this[_current$] = null;
-      }
-      moveNext() {
-        if (dart.test(this[_iterator].moveNext())) {
-          this[_current$] = this[_f](this[_iterator].current);
-          return true;
-        }
-        this[_current$] = null;
-        return false;
-      }
-      get current() {
-        return this[_current$];
-      }
-    }
-    dart.setSignature(MappedIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
-      fields: () => ({
-        [_current$]: T,
-        [_iterator]: IteratorOfS(),
-        [_f]: _TransformationOfS$T()
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return MappedIterator;
-  });
-  _internal.MappedIterator = MappedIterator();
-  const _source = Symbol('_source');
-  _internal.MappedListIterable$ = dart.generic((S, T) => {
-    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
-    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
-    class MappedListIterable extends _internal.ListIterable$(T) {
-      new(source, f) {
-        this[_source] = source;
-        this[_f] = f;
-        super.new();
-      }
-      get length() {
-        return this[_source][dartx.length];
-      }
-      elementAt(index) {
-        return this[_f](this[_source][dartx.elementAt](index));
-      }
-    }
-    MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(MappedListIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.MappedListIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])}),
-      fields: () => ({
-        [_source]: IterableOfS(),
-        [_f]: _TransformationOfS$T()
-      })
-    });
-    dart.defineExtensionMembers(MappedListIterable, ['elementAt', 'length']);
-    return MappedListIterable;
-  });
-  _internal.MappedListIterable = MappedListIterable();
-  _internal._ElementPredicate$ = dart.generic(E => {
-    const _ElementPredicate = dart.typedef('_ElementPredicate', () => dart.functionType(core.bool, [E]));
-    return _ElementPredicate;
-  });
-  _internal._ElementPredicate = _ElementPredicate();
-  _internal.WhereIterable$ = dart.generic(E => {
-    let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class WhereIterable extends core.Iterable$(E) {
-      new(iterable, f) {
-        this[_iterable$] = iterable;
-        this[_f] = f;
-        super.new();
-      }
-      get iterator() {
-        return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
-      }
-    }
-    dart.setSignature(WhereIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_f]: _ElementPredicateOfE()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(WhereIterable, ['iterator']);
-    return WhereIterable;
-  });
-  _internal.WhereIterable = WhereIterable();
-  _internal.WhereIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class WhereIterator extends core.Iterator$(E) {
-      new(iterator, f) {
-        this[_iterator] = iterator;
-        this[_f] = f;
-      }
-      moveNext() {
-        while (dart.test(this[_iterator].moveNext())) {
-          if (dart.test(this[_f](this[_iterator].current))) {
-            return true;
-          }
-        }
-        return false;
-      }
-      get current() {
-        return this[_iterator].current;
-      }
-    }
-    dart.setSignature(WhereIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterator]: IteratorOfE(),
-        [_f]: _ElementPredicateOfE()
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return WhereIterator;
-  });
-  _internal.WhereIterator = WhereIterator();
-  _internal._ExpandFunction$ = dart.generic((S, T) => {
-    const _ExpandFunction = dart.typedef('_ExpandFunction', () => dart.functionType(core.Iterable$(T), [S]));
-    return _ExpandFunction;
-  });
-  _internal._ExpandFunction = _ExpandFunction();
-  _internal.ExpandIterable$ = dart.generic((S, T) => {
-    let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
-    let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
-    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
-    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
-    class ExpandIterable extends core.Iterable$(T) {
-      new(iterable, f) {
-        this[_iterable$] = iterable;
-        this[_f] = f;
-        super.new();
-      }
-      get iterator() {
-        return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
-      }
-    }
-    dart.setSignature(ExpandIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
-      fields: () => ({
-        [_iterable$]: IterableOfS(),
-        [_f]: _ExpandFunctionOfS$T()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
-    });
-    dart.defineExtensionMembers(ExpandIterable, ['iterator']);
-    return ExpandIterable;
-  });
-  _internal.ExpandIterable = ExpandIterable();
-  const _currentExpansion = Symbol('_currentExpansion');
-  _internal.ExpandIterator$ = dart.generic((S, T) => {
-    let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
-    let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
-    let EmptyIteratorOfT = () => (EmptyIteratorOfT = dart.constFn(_internal.EmptyIterator$(T)))();
-    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
-    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
-    class ExpandIterator extends core.Object {
-      new(iterator, f) {
-        this[_iterator] = iterator;
-        this[_f] = f;
-        this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
-        this[_current$] = null;
-      }
-      get current() {
-        return this[_current$];
-      }
-      moveNext() {
-        if (this[_currentExpansion] == null) return false;
-        while (!dart.test(this[_currentExpansion].moveNext())) {
-          this[_current$] = null;
-          if (dart.test(this[_iterator].moveNext())) {
-            this[_currentExpansion] = null;
-            this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
-          } else {
-            return false;
-          }
-        }
-        this[_current$] = this[_currentExpansion].current;
-        return true;
-      }
-    }
-    dart.addTypeTests(ExpandIterator);
-    ExpandIterator[dart.implements] = () => [IteratorOfT()];
-    dart.setSignature(ExpandIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterator$(S, T), [IteratorOfS(), _ExpandFunctionOfS$T()])}),
-      fields: () => ({
-        [_iterator]: IteratorOfS(),
-        [_f]: _ExpandFunctionOfS$T(),
-        [_currentExpansion]: IteratorOfT(),
-        [_current$]: T
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return ExpandIterator;
-  });
-  _internal.ExpandIterator = ExpandIterator();
-  const _takeCount = Symbol('_takeCount');
-  _internal.TakeIterable$ = dart.generic(E => {
-    let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
-    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
-    let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class TakeIterable extends core.Iterable$(E) {
-      static new(iterable, takeCount) {
-        if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
-          dart.throw(new core.ArgumentError(takeCount));
-        }
-        if (_internal.EfficientLength.is(iterable)) {
-          return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
-        }
-        return new (TakeIterableOfE())._(iterable, takeCount);
-      }
-      _(iterable, takeCount) {
-        this[_iterable$] = iterable;
-        this[_takeCount] = takeCount;
-        super.new();
-      }
-      get iterator() {
-        return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
-      }
-    }
-    dart.defineNamedConstructor(TakeIterable, '_');
-    dart.setSignature(TakeIterable, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int]),
-        _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
-      }),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_takeCount]: core.int
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(TakeIterable, ['iterator']);
-    return TakeIterable;
-  });
-  _internal.TakeIterable = TakeIterable();
-  _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
-      new(iterable, takeCount) {
-        super._(iterable, takeCount);
-      }
-      get length() {
-        let iterableLength = this[_iterable$][dartx.length];
-        if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
-        return iterableLength;
-      }
-    }
-    EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(EfficientLengthTakeIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthTakeIterable$(E), [IterableOfE(), core.int])})
-    });
-    dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
-    return EfficientLengthTakeIterable;
-  });
-  _internal.EfficientLengthTakeIterable = EfficientLengthTakeIterable();
-  const _remaining = Symbol('_remaining');
-  _internal.TakeIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class TakeIterator extends core.Iterator$(E) {
-      new(iterator, remaining) {
-        this[_iterator] = iterator;
-        this[_remaining] = remaining;
-        dart.assert(typeof this[_remaining] == 'number' && dart.notNull(this[_remaining]) >= 0);
-      }
-      moveNext() {
-        this[_remaining] = dart.notNull(this[_remaining]) - 1;
-        if (dart.notNull(this[_remaining]) >= 0) {
-          return this[_iterator].moveNext();
-        }
-        this[_remaining] = -1;
-        return false;
-      }
-      get current() {
-        if (dart.notNull(this[_remaining]) < 0) return null;
-        return this[_iterator].current;
-      }
-    }
-    dart.setSignature(TakeIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeIterator$(E), [IteratorOfE(), core.int])}),
-      fields: () => ({
-        [_iterator]: IteratorOfE(),
-        [_remaining]: core.int
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return TakeIterator;
-  });
-  _internal.TakeIterator = TakeIterator();
-  _internal.TakeWhileIterable$ = dart.generic(E => {
-    let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class TakeWhileIterable extends core.Iterable$(E) {
-      new(iterable, f) {
-        this[_iterable$] = iterable;
-        this[_f] = f;
-        super.new();
-      }
-      get iterator() {
-        return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
-      }
-    }
-    dart.setSignature(TakeWhileIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_f]: _ElementPredicateOfE()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(TakeWhileIterable, ['iterator']);
-    return TakeWhileIterable;
-  });
-  _internal.TakeWhileIterable = TakeWhileIterable();
-  const _isFinished = Symbol('_isFinished');
-  _internal.TakeWhileIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class TakeWhileIterator extends core.Iterator$(E) {
-      new(iterator, f) {
-        this[_iterator] = iterator;
-        this[_f] = f;
-        this[_isFinished] = false;
-      }
-      moveNext() {
-        if (dart.test(this[_isFinished])) return false;
-        if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
-          this[_isFinished] = true;
-          return false;
-        }
-        return true;
-      }
-      get current() {
-        if (dart.test(this[_isFinished])) return null;
-        return this[_iterator].current;
-      }
-    }
-    dart.setSignature(TakeWhileIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterator]: IteratorOfE(),
-        [_f]: _ElementPredicateOfE(),
-        [_isFinished]: core.bool
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return TakeWhileIterator;
-  });
-  _internal.TakeWhileIterator = TakeWhileIterator();
-  const _skipCount = Symbol('_skipCount');
-  _internal.SkipIterable$ = dart.generic(E => {
-    let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
-    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
-    let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class SkipIterable extends core.Iterable$(E) {
-      static new(iterable, count) {
-        if (_internal.EfficientLength.is(iterable)) {
-          return new (EfficientLengthSkipIterableOfE())(iterable, count);
-        }
-        return new (SkipIterableOfE())._(iterable, count);
-      }
-      _(iterable, skipCount) {
-        this[_iterable$] = iterable;
-        this[_skipCount] = skipCount;
-        super.new();
-        if (!(typeof this[_skipCount] == 'number')) {
-          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
-        }
-        core.RangeError.checkNotNegative(this[_skipCount], "count");
-      }
-      skip(count) {
-        if (!(typeof this[_skipCount] == 'number')) {
-          dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
-        }
-        core.RangeError.checkNotNegative(this[_skipCount], "count");
-        return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
-      }
-      get iterator() {
-        return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
-      }
-    }
-    dart.defineNamedConstructor(SkipIterable, '_');
-    dart.setSignature(SkipIterable, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int]),
-        _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
-      }),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_skipCount]: core.int
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(SkipIterable, ['skip', 'iterator']);
-    return SkipIterable;
-  });
-  _internal.SkipIterable = SkipIterable();
-  _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
-      new(iterable, skipCount) {
-        super._(iterable, skipCount);
-      }
-      get length() {
-        let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
-        if (length >= 0) return length;
-        return 0;
-      }
-    }
-    EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(EfficientLengthSkipIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthSkipIterable$(E), [IterableOfE(), core.int])})
-    });
-    dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
-    return EfficientLengthSkipIterable;
-  });
-  _internal.EfficientLengthSkipIterable = EfficientLengthSkipIterable();
-  _internal.SkipIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class SkipIterator extends core.Iterator$(E) {
-      new(iterator, skipCount) {
-        this[_iterator] = iterator;
-        this[_skipCount] = skipCount;
-        dart.assert(typeof this[_skipCount] == 'number' && dart.notNull(this[_skipCount]) >= 0);
-      }
-      moveNext() {
-        for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
-          this[_iterator].moveNext();
-        this[_skipCount] = 0;
-        return this[_iterator].moveNext();
-      }
-      get current() {
-        return this[_iterator].current;
-      }
-    }
-    dart.setSignature(SkipIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipIterator$(E), [IteratorOfE(), core.int])}),
-      fields: () => ({
-        [_iterator]: IteratorOfE(),
-        [_skipCount]: core.int
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return SkipIterator;
-  });
-  _internal.SkipIterator = SkipIterator();
-  _internal.SkipWhileIterable$ = dart.generic(E => {
-    let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class SkipWhileIterable extends core.Iterable$(E) {
-      new(iterable, f) {
-        this[_iterable$] = iterable;
-        this[_f] = f;
-        super.new();
-      }
-      get iterator() {
-        return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
-      }
-    }
-    dart.setSignature(SkipWhileIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterable$]: IterableOfE(),
-        [_f]: _ElementPredicateOfE()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(SkipWhileIterable, ['iterator']);
-    return SkipWhileIterable;
-  });
-  _internal.SkipWhileIterable = SkipWhileIterable();
-  const _hasSkipped = Symbol('_hasSkipped');
-  _internal.SkipWhileIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
-    class SkipWhileIterator extends core.Iterator$(E) {
-      new(iterator, f) {
-        this[_iterator] = iterator;
-        this[_f] = f;
-        this[_hasSkipped] = false;
-      }
-      moveNext() {
-        if (!dart.test(this[_hasSkipped])) {
-          this[_hasSkipped] = true;
-          while (dart.test(this[_iterator].moveNext())) {
-            if (!dart.test(this[_f](this[_iterator].current))) return true;
-          }
-        }
-        return this[_iterator].moveNext();
-      }
-      get current() {
-        return this[_iterator].current;
-      }
-    }
-    dart.setSignature(SkipWhileIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
-      fields: () => ({
-        [_iterator]: IteratorOfE(),
-        [_f]: _ElementPredicateOfE(),
-        [_hasSkipped]: core.bool
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return SkipWhileIterator;
-  });
-  _internal.SkipWhileIterator = SkipWhileIterator();
-  _internal.EmptyIterable$ = dart.generic(E => {
-    let EmptyIteratorOfE = () => (EmptyIteratorOfE = dart.constFn(_internal.EmptyIterator$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class EmptyIterable extends core.Iterable$(E) {
-      new() {
-        super.new();
-      }
-      get iterator() {
-        return dart.const(new (EmptyIteratorOfE())());
-      }
-      forEach(action) {}
-      get isEmpty() {
-        return true;
-      }
-      get length() {
-        return 0;
-      }
-      get first() {
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      get last() {
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      get single() {
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      elementAt(index) {
-        dart.throw(new core.RangeError.range(index, 0, 0, "index"));
-      }
-      contains(element) {
-        return false;
-      }
-      every(test) {
-        return true;
-      }
-      any(test) {
-        return false;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        return "";
-      }
-      where(test) {
-        return this;
-      }
-      map(T) {
-        return f => {
-          return dart.const(new (_internal.EmptyIterable$(T))());
-        };
-      }
-      reduce(combine) {
-        EAndEToE()._check(combine);
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          return initialValue;
-        };
-      }
-      skip(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        return this;
-      }
-      skipWhile(test) {
-        return this;
-      }
-      take(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        return this;
-      }
-      takeWhile(test) {
-        return this;
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
-      }
-      toSet() {
-        return SetOfE().new();
-      }
-    }
-    EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(EmptyIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterable$(E), [])}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
-    });
-    dart.defineExtensionMembers(EmptyIterable, [
-      'forEach',
-      'elementAt',
-      'contains',
-      'every',
-      'any',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'join',
-      'where',
-      'map',
-      'reduce',
-      'fold',
-      'skip',
-      'skipWhile',
-      'take',
-      'takeWhile',
-      'toList',
-      'toSet',
-      'iterator',
-      'isEmpty',
-      'length',
-      'first',
-      'last',
-      'single'
-    ]);
-    return EmptyIterable;
-  });
-  _internal.EmptyIterable = EmptyIterable();
-  _internal.EmptyIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class EmptyIterator extends core.Object {
-      new() {
-      }
-      moveNext() {
-        return false;
-      }
-      get current() {
-        return null;
-      }
-    }
-    dart.addTypeTests(EmptyIterator);
-    EmptyIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(EmptyIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterator$(E), [])}),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return EmptyIterator;
-  });
-  _internal.EmptyIterator = EmptyIterator();
-  _internal.IterableElementError = class IterableElementError extends core.Object {
-    static noElement() {
-      return new core.StateError("No element");
-    }
-    static tooMany() {
-      return new core.StateError("Too many elements");
-    }
-    static tooFew() {
-      return new core.StateError("Too few elements");
-    }
-  };
-  dart.setSignature(_internal.IterableElementError, {
-    statics: () => ({
-      noElement: dart.definiteFunctionType(core.StateError, []),
-      tooMany: dart.definiteFunctionType(core.StateError, []),
-      tooFew: dart.definiteFunctionType(core.StateError, [])
-    }),
-    names: ['noElement', 'tooMany', 'tooFew']
-  });
-  _internal.FixedLengthListMixin$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    dart.defineExtensionNames([
-      'length',
-      'add',
-      'insert',
-      'insertAll',
-      'addAll',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'clear',
-      'removeAt',
-      'removeLast',
-      'removeRange',
-      'replaceRange'
-    ]);
-    class FixedLengthListMixin extends core.Object {
-      set length(newLength) {
-        dart.throw(new core.UnsupportedError("Cannot change the length of a fixed-length list"));
-      }
-      add(value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
-      }
-      insert(index, value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
-      }
-      insertAll(at, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
-      }
-      remove(element) {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      removeWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      retainWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      clear() {
-        dart.throw(new core.UnsupportedError("Cannot clear a fixed-length list"));
-      }
-      removeAt(index) {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      removeLast() {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      removeRange(start, end) {
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-      replaceRange(start, end, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
-      }
-    }
-    dart.addTypeTests(FixedLengthListMixin);
-    dart.setSignature(FixedLengthListMixin, {
-      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [E]),
-        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
-        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        removeAt: dart.definiteFunctionType(E, [core.int]),
-        removeLast: dart.definiteFunctionType(E, []),
-        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()])
-      })
-    });
-    dart.defineExtensionMembers(FixedLengthListMixin, [
-      'add',
-      'insert',
-      'insertAll',
-      'addAll',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'clear',
-      'removeAt',
-      'removeLast',
-      'removeRange',
-      'replaceRange',
-      'length'
-    ]);
-    return FixedLengthListMixin;
-  });
-  _internal.FixedLengthListMixin = FixedLengthListMixin();
-  _internal.FixedLengthListBase$ = dart.generic(E => {
-    class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), _internal.FixedLengthListMixin$(E)) {
-      new() {
-        super.new();
-      }
-    }
-    return FixedLengthListBase;
-  });
-  _internal.FixedLengthListBase = FixedLengthListBase();
-  const _backedList = Symbol('_backedList');
-  _internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
-    new(backedList) {
-      this[_backedList] = backedList;
-      super.new();
-    }
-    get length() {
-      return this[_backedList][dartx.length];
-    }
-    elementAt(index) {
-      core.RangeError.checkValidIndex(index, this);
-      return index;
-    }
-  };
-  dart.addSimpleTypeTests(_internal._ListIndicesIterable);
-  dart.setSignature(_internal._ListIndicesIterable, {
-    constructors: () => ({new: dart.definiteFunctionType(_internal._ListIndicesIterable, [core.List])}),
-    fields: () => ({[_backedList]: core.List})
-  });
-  dart.defineExtensionMembers(_internal._ListIndicesIterable, ['elementAt', 'length']);
-  const _values = Symbol('_values');
-  _internal.ListMapView$ = dart.generic(E => {
-    let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let MapOfint$E = () => (MapOfint$E = dart.constFn(core.Map$(core.int, E)))();
-    let intAndETovoid = () => (intAndETovoid = dart.constFn(dart.functionType(dart.void, [core.int, E])))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    class ListMapView extends core.Object {
-      new(values) {
-        this[_values] = values;
-      }
-      _get(key) {
-        return dart.test(this.containsKey(key)) ? this[_values][dartx._get](core.int._check(key)) : null;
-      }
-      get length() {
-        return this[_values][dartx.length];
-      }
-      get values() {
-        return new (SubListIterableOfE())(this[_values], 0, null);
-      }
-      get keys() {
-        return new _internal._ListIndicesIterable(this[_values]);
-      }
-      get isEmpty() {
-        return this[_values][dartx.isEmpty];
-      }
-      get isNotEmpty() {
-        return this[_values][dartx.isNotEmpty];
-      }
-      containsValue(value) {
-        return this[_values][dartx.contains](value);
-      }
-      containsKey(key) {
-        return typeof key == 'number' && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
-      }
-      forEach(f) {
-        let length = this[_values][dartx.length];
-        for (let i = 0; i < dart.notNull(length); i++) {
-          f(i, this[_values][dartx._get](i));
-          if (length != this[_values][dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(this[_values]));
-          }
-        }
-      }
-      _set(key, value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
-        return value;
-      }
-      putIfAbsent(key, ifAbsent) {
-        VoidToE()._check(ifAbsent);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
-      }
-      remove(key) {
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
-      }
-      clear() {
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
-      }
-      addAll(other) {
-        MapOfint$E()._check(other);
-        dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-    }
-    dart.addTypeTests(ListMapView);
-    ListMapView[dart.implements] = () => [MapOfint$E()];
-    dart.setSignature(ListMapView, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ListMapView$(E), [ListOfE()])}),
-      fields: () => ({[_values]: ListOfE()}),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        values: dart.definiteFunctionType(core.Iterable$(E), []),
-        keys: dart.definiteFunctionType(core.Iterable$(core.int), []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        _get: dart.definiteFunctionType(E, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        forEach: dart.definiteFunctionType(dart.void, [intAndETovoid()]),
-        _set: dart.definiteFunctionType(dart.void, [core.int, E]),
-        putIfAbsent: dart.definiteFunctionType(E, [core.int, VoidToE()]),
-        remove: dart.definiteFunctionType(E, [core.Object]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfint$E()])
-      })
-    });
-    dart.defineExtensionMembers(ListMapView, [
-      '_get',
-      'containsValue',
-      'containsKey',
-      'forEach',
-      '_set',
-      'putIfAbsent',
-      'remove',
-      'clear',
-      'addAll',
-      'length',
-      'values',
-      'keys',
-      'isEmpty',
-      'isNotEmpty'
-    ]);
-    return ListMapView;
-  });
-  _internal.ListMapView = ListMapView();
-  _internal.ReversedListIterable$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class ReversedListIterable extends _internal.ListIterable$(E) {
-      new(source) {
-        this[_source] = source;
-        super.new();
-      }
-      get length() {
-        return this[_source][dartx.length];
-      }
-      elementAt(index) {
-        return this[_source][dartx.elementAt](dart.notNull(this[_source][dartx.length]) - 1 - dart.notNull(index));
-      }
-    }
-    dart.setSignature(ReversedListIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_internal.ReversedListIterable$(E), [IterableOfE()])}),
-      fields: () => ({[_source]: IterableOfE()})
-    });
-    dart.defineExtensionMembers(ReversedListIterable, ['elementAt', 'length']);
-    return ReversedListIterable;
-  });
-  _internal.ReversedListIterable = ReversedListIterable();
-  _internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
-    static add() {
-      return new core.UnsupportedError("Cannot add to unmodifiable List");
-    }
-    static change() {
-      return new core.UnsupportedError("Cannot change the content of an unmodifiable List");
-    }
-    static length() {
-      return new core.UnsupportedError("Cannot change length of unmodifiable List");
-    }
-    static remove() {
-      return new core.UnsupportedError("Cannot remove from unmodifiable List");
-    }
-  };
-  dart.setSignature(_internal.UnmodifiableListError, {
-    statics: () => ({
-      add: dart.definiteFunctionType(core.UnsupportedError, []),
-      change: dart.definiteFunctionType(core.UnsupportedError, []),
-      length: dart.definiteFunctionType(core.UnsupportedError, []),
-      remove: dart.definiteFunctionType(core.UnsupportedError, [])
-    }),
-    names: ['add', 'change', 'length', 'remove']
-  });
-  _internal.NonGrowableListError = class NonGrowableListError extends core.Object {
-    static add() {
-      return new core.UnsupportedError("Cannot add to non-growable List");
-    }
-    static length() {
-      return new core.UnsupportedError("Cannot change length of non-growable List");
-    }
-    static remove() {
-      return new core.UnsupportedError("Cannot remove from non-growable List");
-    }
-  };
-  dart.setSignature(_internal.NonGrowableListError, {
-    statics: () => ({
-      add: dart.definiteFunctionType(core.UnsupportedError, []),
-      length: dart.definiteFunctionType(core.UnsupportedError, []),
-      remove: dart.definiteFunctionType(core.UnsupportedError, [])
-    }),
-    names: ['add', 'length', 'remove']
-  });
-  _internal.makeListFixedLength = function(E) {
-    return growableList => {
-      _interceptors.JSArray.markFixedList(growableList);
-      return growableList;
-    };
-  };
-  dart.lazyFn(_internal.makeListFixedLength, () => ListOfEToListOfE());
-  _internal.makeFixedListUnmodifiable = function(E) {
-    return fixedLengthList => {
-      _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
-      return fixedLengthList;
-    };
-  };
-  dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
-  _internal.Lists = class Lists extends core.Object {
-    static copy(src, srcStart, dst, dstStart, count) {
-      if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
-        for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      } else {
-        for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      }
-    }
-    static areEqual(a, b) {
-      if (core.identical(a, b)) return true;
-      if (!core.List.is(b)) return false;
-      let length = a[dartx.length];
-      if (!dart.equals(length, dart.dload(b, 'length'))) return false;
-      for (let i = 0; i < dart.notNull(length); i++) {
-        if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
-      }
-      return true;
-    }
-    static indexOf(a, element, startIndex, endIndex) {
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) < 0) {
-        startIndex = 0;
-      }
-      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static lastIndexOf(a, element, startIndex) {
-      if (dart.notNull(startIndex) < 0) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        startIndex = dart.notNull(a[dartx.length]) - 1;
-      }
-      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static indicesCheck(a, start, end) {
-      core.RangeError.checkValidRange(start, end, a[dartx.length]);
-    }
-    static rangeCheck(a, start, length) {
-      core.RangeError.checkNotNegative(length);
-      core.RangeError.checkNotNegative(start);
-      if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
-        let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
-        dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
-      }
-    }
-  };
-  dart.setSignature(_internal.Lists, {
-    statics: () => ({
-      copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
-      areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
-      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-      indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
-      rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
-    }),
-    names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
-  });
-  _internal.printToZone = null;
-  _internal.printToConsole = function(line) {
-    _js_primitives.printString(dart.str`${line}`);
-  };
-  dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
-  _internal.Sort = class Sort extends core.Object {
-    static sort(E) {
-      return (a, compare) => {
-        _internal.Sort._doSort(E)(a, 0, dart.notNull(a[dartx.length]) - 1, compare);
-      };
-    }
-    static sortRange(E) {
-      return (a, from, to, compare) => {
-        if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[dartx.length]) || dart.notNull(to) < dart.notNull(from)) {
-          dart.throw("OutOfRange");
-        }
-        _internal.Sort._doSort(E)(a, from, dart.notNull(to) - 1, compare);
-      };
-    }
-    static _doSort(E) {
-      return (a, left, right, compare) => {
-        if (dart.notNull(right) - dart.notNull(left) <= _internal.Sort._INSERTION_SORT_THRESHOLD) {
-          _internal.Sort._insertionSort(E)(a, left, right, compare);
-        } else {
-          _internal.Sort._dualPivotQuicksort(E)(a, left, right, compare);
-        }
-      };
-    }
-    static _insertionSort(E) {
-      return (a, left, right, compare) => {
-        for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
-          let el = a[dartx._get](i);
-          let j = i;
-          while (j > dart.notNull(left) && dart.notNull(compare(a[dartx._get](j - 1), el)) > 0) {
-            a[dartx._set](j, a[dartx._get](j - 1));
-            j--;
-          }
-          a[dartx._set](j, el);
-        }
-      };
-    }
-    static _dualPivotQuicksort(E) {
-      return (a, left, right, compare) => {
-        dart.assert(dart.notNull(right) - dart.notNull(left) > _internal.Sort._INSERTION_SORT_THRESHOLD);
-        let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[dartx.truncate]();
-        let index1 = dart.notNull(left) + sixth;
-        let index5 = dart.notNull(right) - sixth;
-        let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[dartx.truncate]();
-        let index2 = index3 - sixth;
-        let index4 = index3 + sixth;
-        let el1 = a[dartx._get](index1);
-        let el2 = a[dartx._get](index2);
-        let el3 = a[dartx._get](index3);
-        let el4 = a[dartx._get](index4);
-        let el5 = a[dartx._get](index5);
-        if (dart.notNull(compare(el1, el2)) > 0) {
-          let t = el1;
-          el1 = el2;
-          el2 = t;
-        }
-        if (dart.notNull(compare(el4, el5)) > 0) {
-          let t = el4;
-          el4 = el5;
-          el5 = t;
-        }
-        if (dart.notNull(compare(el1, el3)) > 0) {
-          let t = el1;
-          el1 = el3;
-          el3 = t;
-        }
-        if (dart.notNull(compare(el2, el3)) > 0) {
-          let t = el2;
-          el2 = el3;
-          el3 = t;
-        }
-        if (dart.notNull(compare(el1, el4)) > 0) {
-          let t = el1;
-          el1 = el4;
-          el4 = t;
-        }
-        if (dart.notNull(compare(el3, el4)) > 0) {
-          let t = el3;
-          el3 = el4;
-          el4 = t;
-        }
-        if (dart.notNull(compare(el2, el5)) > 0) {
-          let t = el2;
-          el2 = el5;
-          el5 = t;
-        }
-        if (dart.notNull(compare(el2, el3)) > 0) {
-          let t = el2;
-          el2 = el3;
-          el3 = t;
-        }
-        if (dart.notNull(compare(el4, el5)) > 0) {
-          let t = el4;
-          el4 = el5;
-          el5 = t;
-        }
-        let pivot1 = el2;
-        let pivot2 = el4;
-        a[dartx._set](index1, el1);
-        a[dartx._set](index3, el3);
-        a[dartx._set](index5, el5);
-        a[dartx._set](index2, a[dartx._get](left));
-        a[dartx._set](index4, a[dartx._get](right));
-        let less = dart.notNull(left) + 1;
-        let great = dart.notNull(right) - 1;
-        let pivots_are_equal = compare(pivot1, pivot2) == 0;
-        if (pivots_are_equal) {
-          let pivot = pivot1;
-          for (let k = less; k <= great; k++) {
-            let ak = a[dartx._get](k);
-            let comp = compare(ak, pivot);
-            if (comp == 0) continue;
-            if (dart.notNull(comp) < 0) {
-              if (k != less) {
-                a[dartx._set](k, a[dartx._get](less));
-                a[dartx._set](less, ak);
-              }
-              less++;
-            } else {
-              while (true) {
-                comp = compare(a[dartx._get](great), pivot);
-                if (dart.notNull(comp) > 0) {
-                  great--;
-                  continue;
-                } else if (dart.notNull(comp) < 0) {
-                  a[dartx._set](k, a[dartx._get](less));
-                  a[dartx._set](less++, a[dartx._get](great));
-                  a[dartx._set](great--, ak);
-                  break;
-                } else {
-                  a[dartx._set](k, a[dartx._get](great));
-                  a[dartx._set](great--, ak);
-                  break;
-                }
-              }
-            }
-          }
-        } else {
-          for (let k = less; k <= great; k++) {
-            let ak = a[dartx._get](k);
-            let comp_pivot1 = compare(ak, pivot1);
-            if (dart.notNull(comp_pivot1) < 0) {
-              if (k != less) {
-                a[dartx._set](k, a[dartx._get](less));
-                a[dartx._set](less, ak);
-              }
-              less++;
-            } else {
-              let comp_pivot2 = compare(ak, pivot2);
-              if (dart.notNull(comp_pivot2) > 0) {
-                while (true) {
-                  let comp = compare(a[dartx._get](great), pivot2);
-                  if (dart.notNull(comp) > 0) {
-                    great--;
-                    if (great < k) break;
-                    continue;
-                  } else {
-                    comp = compare(a[dartx._get](great), pivot1);
-                    if (dart.notNull(comp) < 0) {
-                      a[dartx._set](k, a[dartx._get](less));
-                      a[dartx._set](less++, a[dartx._get](great));
-                      a[dartx._set](great--, ak);
-                    } else {
-                      a[dartx._set](k, a[dartx._get](great));
-                      a[dartx._set](great--, ak);
-                    }
-                    break;
-                  }
-                }
-              }
-            }
-          }
-        }
-        a[dartx._set](left, a[dartx._get](less - 1));
-        a[dartx._set](less - 1, pivot1);
-        a[dartx._set](right, a[dartx._get](great + 1));
-        a[dartx._set](great + 1, pivot2);
-        _internal.Sort._doSort(E)(a, left, less - 2, compare);
-        _internal.Sort._doSort(E)(a, great + 2, right, compare);
-        if (pivots_are_equal) {
-          return;
-        }
-        if (less < index1 && great > index5) {
-          while (compare(a[dartx._get](less), pivot1) == 0) {
-            less++;
-          }
-          while (compare(a[dartx._get](great), pivot2) == 0) {
-            great--;
-          }
-          for (let k = less; k <= great; k++) {
-            let ak = a[dartx._get](k);
-            let comp_pivot1 = compare(ak, pivot1);
-            if (comp_pivot1 == 0) {
-              if (k != less) {
-                a[dartx._set](k, a[dartx._get](less));
-                a[dartx._set](less, ak);
-              }
-              less++;
-            } else {
-              let comp_pivot2 = compare(ak, pivot2);
-              if (comp_pivot2 == 0) {
-                while (true) {
-                  let comp = compare(a[dartx._get](great), pivot2);
-                  if (comp == 0) {
-                    great--;
-                    if (great < k) break;
-                    continue;
-                  } else {
-                    comp = compare(a[dartx._get](great), pivot1);
-                    if (dart.notNull(comp) < 0) {
-                      a[dartx._set](k, a[dartx._get](less));
-                      a[dartx._set](less++, a[dartx._get](great));
-                      a[dartx._set](great--, ak);
-                    } else {
-                      a[dartx._set](k, a[dartx._get](great));
-                      a[dartx._set](great--, ak);
-                    }
-                    break;
-                  }
-                }
-              }
-            }
-          }
-          _internal.Sort._doSort(E)(a, less, great, compare);
-        } else {
-          _internal.Sort._doSort(E)(a, less, great, compare);
-        }
-      };
-    }
-  };
-  dart.setSignature(_internal.Sort, {
-    sfields: () => ({_INSERTION_SORT_THRESHOLD: core.int}),
-    statics: () => ({
-      sort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), dart.functionType(core.int, [E, E])]]),
-      sortRange: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
-      _doSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
-      _insertionSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
-      _dualPivotQuicksort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]])
-    }),
-    names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
-  });
-  _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-  const _name$ = Symbol('_name');
-  const _nativeSymbol = Symbol('_nativeSymbol');
-  _internal.Symbol = class Symbol extends core.Object {
-    new(name) {
-      this[_name$] = name;
-      this[_nativeSymbol] = null;
-    }
-    es6(name, nativeSymbol) {
-      this[_name$] = name;
-      this[_nativeSymbol] = nativeSymbol;
-    }
-    unvalidated(name) {
-      this[_name$] = name;
-      this[_nativeSymbol] = null;
-    }
-    validated(name) {
-      this[_name$] = _internal.Symbol.validatePublicSymbol(name);
-      this[_nativeSymbol] = null;
-    }
-    ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
-    }
-    get hashCode() {
-      let hash = this._hashCode;
-      if (hash != null) return hash;
-      let arbitraryPrime = 664597;
-      hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name$]));
-      this._hashCode = hash;
-      return hash;
+    get reversed() {
+      return new (ReversedListIterableOfE())(this);
     }
     toString() {
-      return dart.str`Symbol("${this[_name$]}")`;
+      return collection.IterableBase.iterableToFullString(this, '[', ']');
     }
-    static getName(symbol) {
-      return symbol[_name$];
-    }
-    static getNativeSymbol(symbol) {
-      return symbol[_nativeSymbol];
-    }
-    static validatePublicSymbol(name) {
-      if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
-      if (dart.test(name[dartx.startsWith]('_'))) {
-        dart.throw(new core.ArgumentError(dart.str`"${name}" is a private identifier`));
-      }
-      dart.throw(new core.ArgumentError(dart.str`"${name}" is not a valid (qualified) symbol name`));
-    }
-    static isValidSymbol(name) {
-      return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
-    }
-  };
-  dart.defineNamedConstructor(_internal.Symbol, 'es6');
-  dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
-  dart.defineNamedConstructor(_internal.Symbol, 'validated');
-  _internal.Symbol[dart.implements] = () => [core.Symbol];
-  dart.setSignature(_internal.Symbol, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
-      es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
-      unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
-      validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
+  }
+  dart.addTypeTests(ListMixin);
+  ListMixin[dart.implements] = () => [ListOfE()];
+  dart.setSignature(ListMixin, {
+    getters: () => ({
+      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      first: dart.definiteFunctionType(E, []),
+      last: dart.definiteFunctionType(E, []),
+      single: dart.definiteFunctionType(E, []),
+      reversed: dart.definiteFunctionType(core.Iterable$(E), [])
     }),
-    fields: () => ({
-      [_name$]: core.String,
-      [_nativeSymbol]: dart.dynamic
-    }),
-    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
-    sfields: () => ({
-      reservedWordRE: core.String,
-      publicIdentifierRE: core.String,
-      identifierRE: core.String,
-      operatorRE: core.String,
-      publicSymbolPattern: core.RegExp,
-      symbolPattern: core.RegExp
-    }),
-    statics: () => ({
-      getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
-      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
-      validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
-      isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
-  });
-  _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
-  _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
-  dart.defineLazy(_internal.Symbol, {
-    get publicIdentifierRE() {
-      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$][\\w$]*';
-    },
-    get identifierRE() {
-      return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$_][\\w$]*';
-    },
-    get publicSymbolPattern() {
-      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.publicIdentifierRE}(?:=?\$|[.](?!\$)))+?\$`);
-    },
-    get symbolPattern() {
-      return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.identifierRE}(?:=?\$|[.](?!\$)))+?\$`);
-    }
-  });
-  _isolate_helper._callInIsolate = function(isolate, func) {
-    let result = isolate.eval(func);
-    _isolate_helper._globalState.topEventLoop.run();
-    return result;
-  };
-  dart.lazyFn(_isolate_helper._callInIsolate, () => _IsolateContextAndFunctionTodynamic());
-  const _activeJsAsyncCount = Symbol('_activeJsAsyncCount');
-  _isolate_helper.enterJsAsync = function() {
-    let o = _isolate_helper._globalState.topEventLoop;
-    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
-  };
-  dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
-  _isolate_helper.leaveJsAsync = function() {
-    let o = _isolate_helper._globalState.topEventLoop;
-    o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
-    dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
-  };
-  dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
-  _isolate_helper.isWorker = function() {
-    return _isolate_helper._globalState.isWorker;
-  };
-  dart.lazyFn(_isolate_helper.isWorker, () => VoidTobool());
-  _isolate_helper._currentIsolate = function() {
-    return _isolate_helper._globalState.currentContext;
-  };
-  dart.lazyFn(_isolate_helper._currentIsolate, () => VoidTo_IsolateContext());
-  _isolate_helper.startRootIsolate = function(entry, args) {
-    args = args;
-    if (args == null) args = [];
-    if (!core.List.is(args)) {
-      dart.throw(new core.ArgumentError(dart.str`Arguments to main must be a List: ${args}`));
-    }
-    _isolate_helper._globalState = new _isolate_helper._Manager(core.Function._check(entry));
-    if (dart.test(_isolate_helper._globalState.isWorker)) return;
-    let rootContext = new _isolate_helper._IsolateContext();
-    _isolate_helper._globalState.rootContext = rootContext;
-    _isolate_helper._globalState.currentContext = rootContext;
-    if (_isolate_helper._MainFunctionArgs.is(entry)) {
-      rootContext.eval(dart.fn(() => {
-        dart.dcall(entry, args);
-      }, VoidToNull()));
-    } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
-      rootContext.eval(dart.fn(() => {
-        dart.dcall(entry, args, null);
-      }, VoidToNull()));
-    } else {
-      rootContext.eval(core.Function._check(entry));
-    }
-    _isolate_helper._globalState.topEventLoop.run();
-  };
-  dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
-  dart.copyProperties(_isolate_helper, {
-    get _globalState() {
-      return dart.globalState;
-    },
-    set _globalState(val) {
-      dart.globalState = val;
-    }
-  });
-  const _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment');
-  const _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler');
-  _isolate_helper._Manager = class _Manager extends core.Object {
-    get useWorkers() {
-      return this.supportsWorkers;
-    }
-    new(entry) {
-      this.entry = entry;
-      this.nextIsolateId = 0;
-      this.currentManagerId = 0;
-      this.nextManagerId = 1;
-      this.currentContext = null;
-      this.rootContext = null;
-      this.topEventLoop = null;
-      this.fromCommandLine = null;
-      this.isWorker = null;
-      this.supportsWorkers = null;
-      this.isolates = null;
-      this.mainManager = null;
-      this.managers = null;
-      this[_nativeDetectEnvironment]();
-      this.topEventLoop = new _isolate_helper._EventLoop();
-      this.isolates = MapOfint$_IsolateContext().new();
-      this.managers = MapOfint$dynamic().new();
-      if (dart.test(this.isWorker)) {
-        this.mainManager = new _isolate_helper._MainManagerStub();
-        this[_nativeInitWorkerMessageHandler]();
-      }
-    }
-    [_nativeDetectEnvironment]() {
-      let isWindowDefined = _isolate_helper.globalWindow != null;
-      let isWorkerDefined = _isolate_helper.globalWorker != null;
-      this.isWorker = !isWindowDefined && dart.test(_isolate_helper.globalPostMessageDefined);
-      this.supportsWorkers = dart.test(this.isWorker) || isWorkerDefined && _isolate_helper.IsolateNatives.thisScript != null;
-      this.fromCommandLine = !isWindowDefined && !dart.test(this.isWorker);
-    }
-    [_nativeInitWorkerMessageHandler]() {
-      let func = (function(f, a) {
-        return function(e) {
-          f(a, e);
-        };
-      })(_isolate_helper.IsolateNatives._processWorkerMessage, this.mainManager);
-      _isolate_helper.global.onmessage = func;
-      _isolate_helper.global.dartPrint = _isolate_helper.global.dartPrint || (function(serialize) {
-        return function(object) {
-          var _self = _isolate_helper.global;
-          if (_self.console && _self.console.log) {
-            _self.console.log(object);
-          } else {
-            _self.postMessage(serialize(object));
-          }
-        };
-      })(_isolate_helper._Manager._serializePrintMessage);
-    }
-    static _serializePrintMessage(object) {
-      return _isolate_helper._serializeMessage(dart.map({command: "print", msg: object}, core.String, dart.dynamic));
-    }
-    maybeCloseWorker() {
-      if (dart.test(this.isWorker) && dart.test(this.isolates[dartx.isEmpty]) && this.topEventLoop[_activeJsAsyncCount] == 0) {
-        this.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'close'}, core.String, core.String)));
-      }
-    }
-  };
-  dart.setSignature(_isolate_helper._Manager, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Manager, [core.Function])}),
-    fields: () => ({
-      nextIsolateId: core.int,
-      currentManagerId: core.int,
-      nextManagerId: core.int,
-      currentContext: _isolate_helper._IsolateContext,
-      rootContext: _isolate_helper._IsolateContext,
-      topEventLoop: _isolate_helper._EventLoop,
-      fromCommandLine: core.bool,
-      isWorker: core.bool,
-      supportsWorkers: core.bool,
-      isolates: MapOfint$_IsolateContext(),
-      mainManager: _isolate_helper._MainManagerStub,
-      managers: MapOfint$dynamic(),
-      entry: core.Function
-    }),
-    getters: () => ({useWorkers: dart.definiteFunctionType(core.bool, [])}),
     methods: () => ({
-      [_nativeDetectEnvironment]: dart.definiteFunctionType(dart.void, []),
-      [_nativeInitWorkerMessageHandler]: dart.definiteFunctionType(dart.void, []),
-      maybeCloseWorker: dart.definiteFunctionType(dart.void, [])
-    }),
-    statics: () => ({_serializePrintMessage: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
-    names: ['_serializePrintMessage']
+      elementAt: dart.definiteFunctionType(E, [core.int]),
+      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
+      contains: dart.definiteFunctionType(core.bool, [core.Object]),
+      every: dart.definiteFunctionType(core.bool, [ETobool()]),
+      any: dart.definiteFunctionType(core.bool, [ETobool()]),
+      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
+      join: dart.definiteFunctionType(core.String, [], [core.String]),
+      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
+      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
+      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
+      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
+      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
+      toSet: dart.definiteFunctionType(core.Set$(E), []),
+      add: dart.definiteFunctionType(dart.void, [E]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      [_filter]: dart.definiteFunctionType(dart.void, [dynamicTobool(), core.bool]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      removeLast: dart.definiteFunctionType(E, []),
+      sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
+      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
+      asMap: dart.definiteFunctionType(core.Map$(core.int, E), []),
+      sublist: dart.definiteFunctionType(core.List$(E), [core.int], [core.int]),
+      getRange: dart.definiteFunctionType(core.Iterable$(E), [core.int, core.int]),
+      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E]),
+      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
+      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
+      indexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+      lastIndexOf: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
+      removeAt: dart.definiteFunctionType(E, [core.int]),
+      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
+    })
   });
-  const _scheduledControlEvents = Symbol('_scheduledControlEvents');
-  const _isExecutingEvent = Symbol('_isExecutingEvent');
-  const _id = Symbol('_id');
-  const _updateGlobalState = Symbol('_updateGlobalState');
-  const _setGlobals = Symbol('_setGlobals');
-  const _addRegistration = Symbol('_addRegistration');
-  const _close = Symbol('_close');
-  _isolate_helper._IsolateContext = class _IsolateContext extends core.Object {
+  dart.defineExtensionMembers(ListMixin, [
+    'elementAt',
+    'forEach',
+    'contains',
+    'every',
+    'any',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'join',
+    'where',
+    'map',
+    'expand',
+    'reduce',
+    'fold',
+    'skip',
+    'skipWhile',
+    'take',
+    'takeWhile',
+    'toList',
+    'toSet',
+    'add',
+    'addAll',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'clear',
+    'removeLast',
+    'sort',
+    'shuffle',
+    'asMap',
+    'sublist',
+    'getRange',
+    'removeRange',
+    'fillRange',
+    'setRange',
+    'replaceRange',
+    'indexOf',
+    'lastIndexOf',
+    'insert',
+    'removeAt',
+    'insertAll',
+    'setAll',
+    'toString',
+    'iterator',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last',
+    'single',
+    'reversed'
+  ]);
+  return ListMixin;
+});
+collection.ListMixin = ListMixin();
+collection.ListBase$ = dart.generic(E => {
+  class ListBase extends dart.mixin(core.Object, collection.ListMixin$(E)) {
+    static listToString(list) {
+      return collection.IterableBase.iterableToFullString(list, '[', ']');
+    }
+  }
+  dart.addTypeTests(ListBase);
+  dart.setSignature(ListBase, {
+    statics: () => ({listToString: dart.definiteFunctionType(core.String, [core.List])}),
+    names: ['listToString']
+  });
+  return ListBase;
+});
+collection.ListBase = ListBase();
+_internal.UnmodifiableListMixin$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
+  class UnmodifiableListMixin extends core.Object {
+    _set(index, value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+      return value;
+    }
+    set length(newLength) {
+      dart.throw(new core.UnsupportedError("Cannot change the length of an unmodifiable list"));
+    }
+    setAll(at, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+    }
+    add(value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
+    }
+    insert(index, element) {
+      E._check(element);
+      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
+    }
+    insertAll(at, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
+    }
+    addAll(iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to an unmodifiable list"));
+    }
+    remove(element) {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    removeWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    retainWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    sort(compare) {
+      if (compare === void 0) compare = null;
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+    }
+    shuffle(random) {
+      if (random === void 0) random = null;
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+    }
+    clear() {
+      dart.throw(new core.UnsupportedError("Cannot clear an unmodifiable list"));
+    }
+    removeAt(index) {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    removeLast() {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    setRange(start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+    }
+    removeRange(start, end) {
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    replaceRange(start, end, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot remove from an unmodifiable list"));
+    }
+    fillRange(start, end, fillValue) {
+      if (fillValue === void 0) fillValue = null;
+      E._check(fillValue);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable list"));
+    }
+  }
+  dart.addTypeTests(UnmodifiableListMixin);
+  UnmodifiableListMixin[dart.implements] = () => [ListOfE()];
+  dart.setSignature(UnmodifiableListMixin, {
+    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+    methods: () => ({
+      _set: dart.definiteFunctionType(dart.void, [core.int, E]),
+      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      add: dart.definiteFunctionType(dart.void, [E]),
+      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
+      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      sort: dart.definiteFunctionType(dart.void, [], [ComparatorOfE()]),
+      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      removeAt: dart.definiteFunctionType(E, [core.int]),
+      removeLast: dart.definiteFunctionType(E, []),
+      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
+      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
+      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
+    })
+  });
+  dart.defineExtensionMembers(UnmodifiableListMixin, [
+    '_set',
+    'setAll',
+    'add',
+    'insert',
+    'insertAll',
+    'addAll',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'sort',
+    'shuffle',
+    'clear',
+    'removeAt',
+    'removeLast',
+    'setRange',
+    'removeRange',
+    'replaceRange',
+    'fillRange',
+    'length'
+  ]);
+  return UnmodifiableListMixin;
+});
+_internal.UnmodifiableListMixin = UnmodifiableListMixin();
+_internal.UnmodifiableListBase$ = dart.generic(E => {
+  class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), _internal.UnmodifiableListMixin$(E)) {
     new() {
-      this.id = (() => {
-        let o = _isolate_helper._globalState, x = o.nextIsolateId;
-        o.nextIsolateId = dart.notNull(x) + 1;
-        return x;
-      })();
-      this.ports = MapOfint$RawReceivePortImpl().new();
-      this.weakPorts = SetOfint().new();
-      this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
-      this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
-      this.pauseCapability = isolate.Capability.new();
-      this.terminateCapability = isolate.Capability.new();
-      this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
-      this.pauseTokens = SetOfCapability().new();
-      this.errorPorts = SetOfSendPort().new();
-      this.initialized = false;
-      this.isPaused = false;
-      this.doneHandlers = null;
-      this[_scheduledControlEvents] = null;
-      this[_isExecutingEvent] = false;
-      this.errorsAreFatal = true;
-      this.registerWeak(this.controlPort[_id], this.controlPort);
+      super.new();
     }
-    addPause(authentification, resume) {
-      if (!dart.equals(this.pauseCapability, authentification)) return;
-      if (dart.test(this.pauseTokens.add(resume)) && !dart.test(this.isPaused)) {
-        this.isPaused = true;
+  }
+  return UnmodifiableListBase;
+});
+_internal.UnmodifiableListBase = UnmodifiableListBase();
+core.int = class int extends core.num {
+  static fromEnvironment(name, opts) {
+    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
+    dart.throw(new core.UnsupportedError('int.fromEnvironment can only be used as a const constructor'));
+  }
+  static parse(source, opts) {
+    let radix = opts && 'radix' in opts ? opts.radix : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    return _js_helper.Primitives.parseInt(source, radix, onError);
+  }
+};
+core.int.is = function is_int(o) {
+  return typeof o == "number" && Math.floor(o) == o;
+};
+core.int.as = function as_int(o) {
+  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
+  return dart.as(o, core.int);
+};
+core.int._check = function check_int(o) {
+  if (typeof o == "number" && Math.floor(o) == o || o == null) return o;
+  return dart.check(o, core.int);
+};
+dart.setSignature(core.int, {
+  constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.int, [core.String], {defaultValue: core.int})}),
+  statics: () => ({parse: dart.definiteFunctionType(core.int, [core.String], {radix: core.int, onError: StringToint()})}),
+  names: ['parse']
+});
+_internal.CodeUnits = class CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
+  new(string) {
+    this[_string] = string;
+  }
+  get length() {
+    return this[_string][dartx.length];
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _get(i) {
+    return this[_string][dartx.codeUnitAt](i);
+  }
+  static stringOf(u) {
+    return u[_string];
+  }
+};
+dart.addSimpleTypeTests(_internal.CodeUnits);
+dart.setSignature(_internal.CodeUnits, {
+  constructors: () => ({new: dart.definiteFunctionType(_internal.CodeUnits, [core.String])}),
+  fields: () => ({[_string]: core.String}),
+  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({_get: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({stringOf: dart.definiteFunctionType(core.String, [_internal.CodeUnits])}),
+  names: ['stringOf']
+});
+dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
+_internal.EfficientLength = class EfficientLength extends core.Object {};
+core.Iterable$ = dart.generic(E => {
+  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
+  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
+  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
+  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
+  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
+  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
+  dart.defineExtensionNames([
+    'map',
+    'where',
+    'expand',
+    'contains',
+    'forEach',
+    'reduce',
+    'fold',
+    'every',
+    'join',
+    'any',
+    'toList',
+    'toSet',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'take',
+    'takeWhile',
+    'skip',
+    'skipWhile',
+    'first',
+    'last',
+    'single',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'elementAt',
+    'toString'
+  ]);
+  class Iterable extends core.Object {
+    new() {
+    }
+    static generate(count, generator) {
+      if (generator === void 0) generator = null;
+      if (dart.notNull(count) <= 0) return new (EmptyIterableOfE())();
+      return new (_GeneratorIterableOfE())(count, generator);
+    }
+    static empty() {
+      return new (EmptyIterableOfE())();
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this[dartx.iterator]);
+    }
+    map(T) {
+      return f => {
+        return _internal.MappedIterable$(E, T).new(this, f);
+      };
+    }
+    where(test) {
+      return new (WhereIterableOfE())(this, test);
+    }
+    expand(T) {
+      return f => {
+        return new (_internal.ExpandIterable$(E, T))(this, f);
+      };
+    }
+    contains(element) {
+      for (let e of this) {
+        if (dart.equals(e, element)) return true;
       }
-      this[_updateGlobalState]();
+      return false;
     }
-    removePause(resume) {
-      if (!dart.test(this.isPaused)) return;
-      this.pauseTokens.remove(resume);
-      if (dart.test(this.pauseTokens.isEmpty)) {
-        while (dart.test(this.delayedEvents[dartx.isNotEmpty])) {
-          let event = this.delayedEvents[dartx.removeLast]();
-          _isolate_helper._globalState.topEventLoop.prequeue(event);
+    forEach(f) {
+      for (let element of this)
+        f(element);
+    }
+    reduce(combine) {
+      EAndEToE()._check(combine);
+      let iterator = this[dartx.iterator];
+      if (!dart.test(iterator.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      let value = iterator.current;
+      while (dart.test(iterator.moveNext())) {
+        value = combine(value, iterator.current);
+      }
+      return value;
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        for (let element of this)
+          value = combine(value, element);
+        return value;
+      };
+    }
+    every(f) {
+      for (let element of this) {
+        if (!dart.test(f(element))) return false;
+      }
+      return true;
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      let iterator = this[dartx.iterator];
+      if (!dart.test(iterator.moveNext())) return "";
+      let buffer = new core.StringBuffer();
+      if (separator == null || separator == "") {
+        do {
+          buffer.write(dart.str`${iterator.current}`);
+        } while (dart.test(iterator.moveNext()));
+      } else {
+        buffer.write(dart.str`${iterator.current}`);
+        while (dart.test(iterator.moveNext())) {
+          buffer.write(separator);
+          buffer.write(dart.str`${iterator.current}`);
         }
-        this.isPaused = false;
       }
-      this[_updateGlobalState]();
+      return buffer.toString();
     }
-    addDoneListener(responsePort) {
-      if (this.doneHandlers == null) {
-        this.doneHandlers = [];
+    any(f) {
+      for (let element of this) {
+        if (dart.test(f(element))) return true;
       }
-      if (dart.test(dart.dsend(this.doneHandlers, 'contains', responsePort))) return;
-      dart.dsend(this.doneHandlers, 'add', responsePort);
+      return false;
     }
-    removeDoneListener(responsePort) {
-      if (this.doneHandlers == null) return;
-      dart.dsend(this.doneHandlers, 'remove', responsePort);
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      return ListOfE().from(this, {growable: growable});
     }
-    setErrorsFatal(authentification, errorsAreFatal) {
-      if (!dart.equals(this.terminateCapability, authentification)) return;
-      this.errorsAreFatal = errorsAreFatal;
+    toSet() {
+      return SetOfE().from(this);
     }
-    handlePing(responsePort, pingType) {
-      if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
-        responsePort.send(null);
-        return;
+    get length() {
+      dart.assert(!_internal.EfficientLength.is(this));
+      let count = 0;
+      let it = this[dartx.iterator];
+      while (dart.test(it.moveNext())) {
+        count++;
       }
-      function respond() {
-        responsePort.send(null);
-      }
-      dart.fn(respond, VoidTovoid$());
-      if (pingType == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
-        return;
-      }
-      dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
-      if (this[_scheduledControlEvents] == null) {
-        this[_scheduledControlEvents] = collection.Queue.new();
-      }
-      dart.dsend(this[_scheduledControlEvents], 'addLast', respond);
+      return count;
     }
-    handleKill(authentification, priority) {
-      if (!dart.equals(this.terminateCapability, authentification)) return;
-      if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
-        this.kill();
-        return;
-      }
-      if (priority == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
-        return;
-      }
-      dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
-      if (this[_scheduledControlEvents] == null) {
-        this[_scheduledControlEvents] = collection.Queue.new();
-      }
-      dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill'));
+    get isEmpty() {
+      return !dart.test(this[dartx.iterator].moveNext());
     }
-    addErrorListener(port) {
-      this.errorPorts.add(port);
+    get isNotEmpty() {
+      return !dart.test(this[dartx.isEmpty]);
     }
-    removeErrorListener(port) {
-      this.errorPorts.remove(port);
+    take(count) {
+      return TakeIterableOfE().new(this, count);
     }
-    handleUncaughtError(error, stackTrace) {
-      if (dart.test(this.errorPorts.isEmpty)) {
-        if (dart.test(this.errorsAreFatal) && core.identical(this, _isolate_helper._globalState.rootContext)) {
-          return;
-        }
-        if (_isolate_helper.global.console && _isolate_helper.global.console.error) {
-          _isolate_helper.global.console.error(error, stackTrace);
-        } else {
-          core.print(error);
-          if (stackTrace != null) core.print(stackTrace);
-        }
-        return;
+    takeWhile(test) {
+      return new (TakeWhileIterableOfE())(this, test);
+    }
+    skip(count) {
+      return SkipIterableOfE().new(this, count);
+    }
+    skipWhile(test) {
+      return new (SkipWhileIterableOfE())(this, test);
+    }
+    get first() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
       }
-      let message = core.List.new(2);
-      message[dartx._set](0, dart.toString(error));
-      message[dartx._set](1, stackTrace == null ? null : dart.toString(stackTrace));
-      for (let port of this.errorPorts)
-        port.send(message);
+      return it.current;
     }
-    eval(code) {
-      let old = _isolate_helper._globalState.currentContext;
-      _isolate_helper._globalState.currentContext = this;
-      this[_setGlobals]();
+    get last() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
       let result = null;
-      this[_isExecutingEvent] = true;
-      try {
-        result = dart.dcall(code);
-      } catch (e) {
-        let s = dart.stackTrace(e);
-        this.handleUncaughtError(e, s);
-        if (dart.test(this.errorsAreFatal)) {
-          this.kill();
-          if (core.identical(this, _isolate_helper._globalState.rootContext)) {
-            throw e;
-          }
+      do {
+        result = it.current;
+      } while (dart.test(it.moveNext()));
+      return result;
+    }
+    get single() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
+      let result = it.current;
+      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
+      return result;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      for (let element of this) {
+        if (dart.test(test(element))) return element;
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          result = element;
+          foundMatching = true;
         }
       }
- finally {
-        this[_isExecutingEvent] = false;
-        _isolate_helper._globalState.currentContext = old;
-        if (old != null) old[_setGlobals]();
-        if (this[_scheduledControlEvents] != null) {
-          while (dart.test(dart.dload(this[_scheduledControlEvents], 'isNotEmpty'))) {
-            dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'));
+      if (foundMatching) return result;
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    singleWhere(test) {
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          if (foundMatching) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          result = element;
+          foundMatching = true;
+        }
+      }
+      if (foundMatching) return result;
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    elementAt(index) {
+      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
+      core.RangeError.checkNotNegative(index, "index");
+      let elementIndex = 0;
+      for (let element of this) {
+        if (index == elementIndex) return element;
+        elementIndex++;
+      }
+      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
+    }
+    toString() {
+      return collection.IterableBase.iterableToShortString(this, '(', ')');
+    }
+  }
+  dart.addTypeTests(Iterable);
+  dart.setSignature(Iterable, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(core.Iterable$(E), []),
+      generate: dart.definiteFunctionType(core.Iterable$(E), [core.int], [intToE()]),
+      empty: dart.definiteFunctionType(core.Iterable$(E), [])
+    }),
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      first: dart.definiteFunctionType(E, []),
+      last: dart.definiteFunctionType(E, []),
+      single: dart.definiteFunctionType(E, [])
+    }),
+    methods: () => ({
+      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
+      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
+      contains: dart.definiteFunctionType(core.bool, [core.Object]),
+      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
+      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
+      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
+      every: dart.definiteFunctionType(core.bool, [ETobool()]),
+      join: dart.definiteFunctionType(core.String, [], [core.String]),
+      any: dart.definiteFunctionType(core.bool, [ETobool()]),
+      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
+      toSet: dart.definiteFunctionType(core.Set$(E), []),
+      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
+      elementAt: dart.definiteFunctionType(E, [core.int])
+    })
+  });
+  dart.defineExtensionMembers(Iterable, [
+    'map',
+    'where',
+    'expand',
+    'contains',
+    'forEach',
+    'reduce',
+    'fold',
+    'every',
+    'join',
+    'any',
+    'toList',
+    'toSet',
+    'take',
+    'takeWhile',
+    'skip',
+    'skipWhile',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'elementAt',
+    'toString',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last',
+    'single'
+  ]);
+  return Iterable;
+});
+core.Iterable = Iterable();
+_internal.ListIterable$ = dart.generic(E => {
+  let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let dynamicAndEToE = () => (dynamicAndEToE = dart.constFn(dart.functionType(E, [dart.dynamic, E])))();
+  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  class ListIterable extends core.Iterable$(E) {
+    new() {
+      super.new();
+    }
+    get iterator() {
+      return new (ListIteratorOfE())(this);
+    }
+    forEach(action) {
+      let length = this.length;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        action(this.elementAt(i));
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+    }
+    get isEmpty() {
+      return this.length == 0;
+    }
+    get first() {
+      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this.elementAt(0);
+    }
+    get last() {
+      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this.elementAt(dart.notNull(this.length) - 1);
+    }
+    get single() {
+      if (this.length == 0) dart.throw(_internal.IterableElementError.noElement());
+      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      return this.elementAt(0);
+    }
+    contains(element) {
+      let length = this.length;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        if (dart.equals(this.elementAt(i), element)) return true;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return false;
+    }
+    every(test) {
+      let length = this.length;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        if (!dart.test(test(this.elementAt(i)))) return false;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return true;
+    }
+    any(test) {
+      let length = this.length;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        if (dart.test(test(this.elementAt(i)))) return true;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return false;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let length = this.length;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = this.elementAt(i);
+        if (dart.test(test(element))) return element;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let length = this.length;
+      for (let i = dart.notNull(length) - 1; i >= 0; i--) {
+        let element = this.elementAt(i);
+        if (dart.test(test(element))) return element;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    singleWhere(test) {
+      let length = this.length;
+      let match = null;
+      let matchFound = false;
+      for (let i = 0; i < dart.notNull(length); i++) {
+        let element = this.elementAt(i);
+        if (dart.test(test(element))) {
+          if (matchFound) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          matchFound = true;
+          match = element;
+        }
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      if (matchFound) return match;
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      let length = this.length;
+      if (!dart.test(separator[dartx.isEmpty])) {
+        if (length == 0) return "";
+        let first = dart.str`${this.elementAt(0)}`;
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        let buffer = new core.StringBuffer(first);
+        for (let i = 1; i < dart.notNull(length); i++) {
+          buffer.write(separator);
+          buffer.write(this.elementAt(i));
+          if (length != this.length) {
+            dart.throw(new core.ConcurrentModificationError(this));
           }
         }
+        return buffer.toString();
+      } else {
+        let buffer = new core.StringBuffer();
+        for (let i = 0; i < dart.notNull(length); i++) {
+          buffer.write(this.elementAt(i));
+          if (length != this.length) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+        }
+        return buffer.toString();
+      }
+    }
+    where(test) {
+      return super.where(test);
+    }
+    map(T) {
+      return f => {
+        return new (_internal.MappedListIterable$(E, T))(this, f);
+      };
+    }
+    reduce(combine) {
+      dynamicAndEToE()._check(combine);
+      let length = this.length;
+      if (length == 0) dart.throw(_internal.IterableElementError.noElement());
+      let value = this.elementAt(0);
+      for (let i = 1; i < dart.notNull(length); i++) {
+        value = dart.dcall(combine, value, this.elementAt(i));
+        if (length != this.length) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+      return value;
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        let length = this.length;
+        for (let i = 0; i < dart.notNull(length); i++) {
+          value = combine(value, this.elementAt(i));
+          if (length != this.length) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+        }
+        return value;
+      };
+    }
+    skip(count) {
+      return new (SubListIterableOfE())(this, count, null);
+    }
+    skipWhile(test) {
+      return super.skipWhile(test);
+    }
+    take(count) {
+      return new (SubListIterableOfE())(this, 0, count);
+    }
+    takeWhile(test) {
+      return super.takeWhile(test);
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let result = null;
+      if (dart.test(growable)) {
+        result = ListOfE().new();
+        result[dartx.length] = this.length;
+      } else {
+        result = ListOfE().new(this.length);
+      }
+      for (let i = 0; i < dart.notNull(this.length); i++) {
+        result[dartx._set](i, this.elementAt(i));
       }
       return result;
     }
-    [_setGlobals]() {
-      _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics);
+    toSet() {
+      let result = SetOfE().new();
+      for (let i = 0; i < dart.notNull(this.length); i++) {
+        result.add(this.elementAt(i));
+      }
+      return result;
     }
-    handleControlMessage(message) {
-      switch (dart.dindex(message, 0)) {
-        case "pause":
-        {
-          this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
-          break;
+  }
+  ListIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(ListIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterable$(E), [])}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
+  });
+  dart.defineExtensionMembers(ListIterable, [
+    'forEach',
+    'contains',
+    'every',
+    'any',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'join',
+    'where',
+    'map',
+    'reduce',
+    'fold',
+    'skip',
+    'skipWhile',
+    'take',
+    'takeWhile',
+    'toList',
+    'toSet',
+    'iterator',
+    'isEmpty',
+    'first',
+    'last',
+    'single'
+  ]);
+  return ListIterable;
+});
+_internal.ListIterable = ListIterable();
+const _iterable$ = Symbol('_iterable');
+const _start = Symbol('_start');
+const _endOrLength = Symbol('_endOrLength');
+const _endIndex = Symbol('_endIndex');
+const _startIndex = Symbol('_startIndex');
+_internal.SubListIterable$ = dart.generic(E => {
+  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
+  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class SubListIterable extends _internal.ListIterable$(E) {
+    new(iterable, start, endOrLength) {
+      this[_iterable$] = iterable;
+      this[_start] = start;
+      this[_endOrLength] = endOrLength;
+      super.new();
+      core.RangeError.checkNotNegative(this[_start], "start");
+      if (this[_endOrLength] != null) {
+        core.RangeError.checkNotNegative(this[_endOrLength], "end");
+        if (dart.notNull(this[_start]) > dart.notNull(this[_endOrLength])) {
+          dart.throw(new core.RangeError.range(this[_start], 0, this[_endOrLength], "start"));
         }
-        case "resume":
-        {
-          this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
-          break;
-        }
-        case 'add-ondone':
-        {
-          this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
-          break;
-        }
-        case 'remove-ondone':
-        {
-          this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
-          break;
-        }
-        case 'set-errors-fatal':
-        {
-          this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
-          break;
-        }
-        case "ping":
-        {
-          this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
-          break;
-        }
-        case "kill":
-        {
-          this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
-          break;
-        }
-        case "getErrors":
-        {
-          this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
-          break;
-        }
-        case "stopErrors":
-        {
-          this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
-          break;
-        }
-        default:
       }
     }
-    lookup(portId) {
-      return this.ports[dartx._get](portId);
+    get [_endIndex]() {
+      let length = this[_iterable$][dartx.length];
+      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
+      return this[_endOrLength];
     }
-    [_addRegistration](portId, port) {
-      if (dart.test(this.ports[dartx.containsKey](portId))) {
-        dart.throw(core.Exception.new("Registry: ports must be registered only once."));
+    get [_startIndex]() {
+      let length = this[_iterable$][dartx.length];
+      if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
+      return this[_start];
+    }
+    get length() {
+      let length = this[_iterable$][dartx.length];
+      if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
+      if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
+        return dart.notNull(length) - dart.notNull(this[_start]);
       }
-      this.ports[dartx._set](portId, port);
+      return dart.notNull(this[_endOrLength]) - dart.notNull(this[_start]);
     }
-    register(portId, port) {
-      this[_addRegistration](portId, port);
-      this[_updateGlobalState]();
+    elementAt(index) {
+      let realIndex = dart.notNull(this[_startIndex]) + dart.notNull(index);
+      if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
+        dart.throw(core.RangeError.index(index, this, "index"));
+      }
+      return this[_iterable$][dartx.elementAt](realIndex);
     }
-    registerWeak(portId, port) {
-      this.weakPorts.add(portId);
-      this[_addRegistration](portId, port);
+    skip(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      let newStart = dart.notNull(this[_start]) + dart.notNull(count);
+      if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
+        return new (EmptyIterableOfE())();
+      }
+      return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
     }
-    [_updateGlobalState]() {
-      if (dart.notNull(this.ports[dartx.length]) - dart.notNull(this.weakPorts.length) > 0 || dart.test(this.isPaused) || !dart.test(this.initialized)) {
-        _isolate_helper._globalState.isolates[dartx._set](this.id, this);
+    take(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      if (this[_endOrLength] == null) {
+        return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
       } else {
-        this.kill();
+        let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
+        if (dart.notNull(this[_endOrLength]) < newEnd) return this;
+        return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
       }
     }
-    kill() {
-      if (this[_scheduledControlEvents] != null) {
-        dart.dsend(this[_scheduledControlEvents], 'clear');
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let start = this[_start];
+      let end = this[_iterable$][dartx.length];
+      if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (length < 0) length = 0;
+      let result = dart.test(growable) ? (() => {
+        let _ = ListOfE().new();
+        _[dartx.length] = length;
+        return _;
+      })() : ListOfE().new(length);
+      for (let i = 0; i < length; i++) {
+        result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
+        if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
       }
-      for (let port of this.ports[dartx.values]) {
-        port[_close]();
-      }
-      this.ports[dartx.clear]();
-      this.weakPorts.clear();
-      _isolate_helper._globalState.isolates[dartx.remove](this.id);
-      this.errorPorts.clear();
-      if (this.doneHandlers != null) {
-        for (let port of core.Iterable._check(this.doneHandlers)) {
-          isolate.SendPort._check(port);
-          port.send(null);
-        }
-        this.doneHandlers = null;
-      }
+      return result;
     }
-    unregister(portId) {
-      this.ports[dartx.remove](portId);
-      this.weakPorts.remove(portId);
-      this[_updateGlobalState]();
-    }
-  };
-  _isolate_helper._IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext];
-  dart.setSignature(_isolate_helper._IsolateContext, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateContext, [])}),
+  }
+  dart.setSignature(SubListIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
     fields: () => ({
-      id: core.int,
-      ports: MapOfint$RawReceivePortImpl(),
-      weakPorts: SetOfint(),
-      isolateStatics: dart.dynamic,
-      controlPort: _isolate_helper.RawReceivePortImpl,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability,
-      initialized: core.bool,
-      isPaused: core.bool,
-      delayedEvents: ListOf_IsolateEvent(),
-      pauseTokens: SetOfCapability(),
-      doneHandlers: dart.dynamic,
-      [_scheduledControlEvents]: dart.dynamic,
-      [_isExecutingEvent]: core.bool,
-      errorsAreFatal: core.bool,
-      errorPorts: SetOfSendPort()
+      [_iterable$]: IterableOfE(),
+      [_start]: core.int,
+      [_endOrLength]: core.int
     }),
-    methods: () => ({
-      addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
-      removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
-      handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
-      handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
-      eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
-      [_setGlobals]: dart.definiteFunctionType(dart.void, []),
-      handleControlMessage: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      lookup: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.int]),
-      [_addRegistration]: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
-      register: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
-      registerWeak: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
-      [_updateGlobalState]: dart.definiteFunctionType(dart.void, []),
-      kill: dart.definiteFunctionType(dart.void, []),
-      unregister: dart.definiteFunctionType(dart.void, [core.int])
+    getters: () => ({
+      [_endIndex]: dart.definiteFunctionType(core.int, []),
+      [_startIndex]: dart.definiteFunctionType(core.int, [])
     })
   });
-  const _runHelper = Symbol('_runHelper');
-  _isolate_helper._EventLoop = class _EventLoop extends core.Object {
-    new() {
-      this.events = QueueOf_IsolateEvent().new();
-      this[_activeJsAsyncCount] = 0;
+  dart.defineExtensionMembers(SubListIterable, [
+    'elementAt',
+    'skip',
+    'take',
+    'toList',
+    'length'
+  ]);
+  return SubListIterable;
+});
+_internal.SubListIterable = SubListIterable();
+const _length$ = Symbol('_length');
+const _index$ = Symbol('_index');
+const _current$ = Symbol('_current');
+_internal.ListIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class ListIterator extends core.Object {
+    new(iterable) {
+      this[_iterable$] = iterable;
+      this[_length$] = iterable[dartx.length];
+      this[_index$] = 0;
+      this[_current$] = null;
     }
-    enqueue(isolate, fn, msg) {
-      this.events.addLast(new _isolate_helper._IsolateEvent(_isolate_helper._IsolateContext._check(isolate), core.Function._check(fn), core.String._check(msg)));
+    get current() {
+      return this[_current$];
     }
-    prequeue(event) {
-      this.events.addFirst(event);
-    }
-    dequeue() {
-      if (dart.test(this.events.isEmpty)) return null;
-      return this.events.removeFirst();
-    }
-    checkOpenReceivePortsFromCommandLine() {
-      if (_isolate_helper._globalState.rootContext != null && dart.test(_isolate_helper._globalState.isolates[dartx.containsKey](_isolate_helper._globalState.rootContext.id)) && dart.test(_isolate_helper._globalState.fromCommandLine) && dart.test(_isolate_helper._globalState.rootContext.ports[dartx.isEmpty])) {
-        dart.throw(core.Exception.new("Program exited with open ReceivePorts."));
+    moveNext() {
+      let length = this[_iterable$][dartx.length];
+      if (this[_length$] != length) {
+        dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
       }
-    }
-    runIteration() {
-      let event = this.dequeue();
-      if (event == null) {
-        this.checkOpenReceivePortsFromCommandLine();
-        _isolate_helper._globalState.maybeCloseWorker();
+      if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
+        this[_current$] = null;
         return false;
       }
-      event.process();
+      this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
+      this[_index$] = dart.notNull(this[_index$]) + 1;
       return true;
     }
-    [_runHelper]() {
-      if (_isolate_helper.globalWindow != null) {
-        const next = (function() {
-          if (!dart.test(this.runIteration())) return;
-          async.Timer.run(next);
-        }).bind(this);
-        dart.fn(next, VoidToNull());
-        next();
-      } else {
-        while (dart.test(this.runIteration())) {
-        }
-      }
-    }
-    run() {
-      if (!dart.test(_isolate_helper._globalState.isWorker)) {
-        this[_runHelper]();
-      } else {
-        try {
-          this[_runHelper]();
-        } catch (e) {
-          let trace = dart.stackTrace(e);
-          _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'error', msg: dart.str`${e}\n${trace}`}, core.String, core.String)));
-        }
-
-      }
-    }
-  };
-  dart.setSignature(_isolate_helper._EventLoop, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._EventLoop, [])}),
+  }
+  dart.addTypeTests(ListIterator);
+  ListIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(ListIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
     fields: () => ({
-      events: QueueOf_IsolateEvent(),
-      [_activeJsAsyncCount]: core.int
+      [_iterable$]: IterableOfE(),
+      [_length$]: core.int,
+      [_index$]: core.int,
+      [_current$]: E
     }),
-    methods: () => ({
-      enqueue: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      prequeue: dart.definiteFunctionType(dart.void, [_isolate_helper._IsolateEvent]),
-      dequeue: dart.definiteFunctionType(_isolate_helper._IsolateEvent, []),
-      checkOpenReceivePortsFromCommandLine: dart.definiteFunctionType(dart.void, []),
-      runIteration: dart.definiteFunctionType(core.bool, []),
-      [_runHelper]: dart.definiteFunctionType(dart.void, []),
-      run: dart.definiteFunctionType(dart.void, [])
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return ListIterator;
+});
+_internal.ListIterator = ListIterator();
+_internal._Transformation$ = dart.generic((S, T) => {
+  const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
+  return _Transformation;
+});
+_internal._Transformation = _Transformation();
+const _f = Symbol('_f');
+_internal.MappedIterable$ = dart.generic((S, T) => {
+  let EfficientLengthMappedIterableOfS$T = () => (EfficientLengthMappedIterableOfS$T = dart.constFn(_internal.EfficientLengthMappedIterable$(S, T)))();
+  let MappedIterableOfS$T = () => (MappedIterableOfS$T = dart.constFn(_internal.MappedIterable$(S, T)))();
+  let MappedIteratorOfS$T = () => (MappedIteratorOfS$T = dart.constFn(_internal.MappedIterator$(S, T)))();
+  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
+  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
+  class MappedIterable extends core.Iterable$(T) {
+    static new(iterable, func) {
+      if (_internal.EfficientLength.is(iterable)) {
+        return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
+      }
+      return new (MappedIterableOfS$T())._(iterable, func);
+    }
+    _(iterable, f) {
+      this[_iterable$] = iterable;
+      this[_f] = f;
+      super.new();
+    }
+    get iterator() {
+      return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
+    }
+    get length() {
+      return this[_iterable$][dartx.length];
+    }
+    get isEmpty() {
+      return this[_iterable$][dartx.isEmpty];
+    }
+    get first() {
+      return this[_f](this[_iterable$][dartx.first]);
+    }
+    get last() {
+      return this[_f](this[_iterable$][dartx.last]);
+    }
+    get single() {
+      return this[_f](this[_iterable$][dartx.single]);
+    }
+    elementAt(index) {
+      return this[_f](this[_iterable$][dartx.elementAt](index));
+    }
+  }
+  dart.defineNamedConstructor(MappedIterable, '_');
+  dart.setSignature(MappedIterable, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()]),
+      _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
+    }),
+    fields: () => ({
+      [_iterable$]: IterableOfS(),
+      [_f]: _TransformationOfS$T()
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
+  });
+  dart.defineExtensionMembers(MappedIterable, [
+    'elementAt',
+    'iterator',
+    'length',
+    'isEmpty',
+    'first',
+    'last',
+    'single'
+  ]);
+  return MappedIterable;
+});
+_internal.MappedIterable = MappedIterable();
+_internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
+  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
+  let SToT = () => (SToT = dart.constFn(dart.functionType(T, [S])))();
+  class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
+    new(iterable, func) {
+      super._(iterable, func);
+    }
+  }
+  EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(EfficientLengthMappedIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthMappedIterable$(S, T), [IterableOfS(), SToT()])})
+  });
+  return EfficientLengthMappedIterable;
+});
+_internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
+const _iterator = Symbol('_iterator');
+core.Iterator$ = dart.generic(E => {
+  class Iterator extends core.Object {}
+  dart.addTypeTests(Iterator);
+  return Iterator;
+});
+core.Iterator = Iterator();
+_internal.MappedIterator$ = dart.generic((S, T) => {
+  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
+  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
+  class MappedIterator extends core.Iterator$(T) {
+    new(iterator, f) {
+      this[_iterator] = iterator;
+      this[_f] = f;
+      this[_current$] = null;
+    }
+    moveNext() {
+      if (dart.test(this[_iterator].moveNext())) {
+        this[_current$] = this[_f](this[_iterator].current);
+        return true;
+      }
+      this[_current$] = null;
+      return false;
+    }
+    get current() {
+      return this[_current$];
+    }
+  }
+  dart.setSignature(MappedIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
+    fields: () => ({
+      [_current$]: T,
+      [_iterator]: IteratorOfS(),
+      [_f]: _TransformationOfS$T()
+    }),
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return MappedIterator;
+});
+_internal.MappedIterator = MappedIterator();
+const _source = Symbol('_source');
+_internal.MappedListIterable$ = dart.generic((S, T) => {
+  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
+  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
+  class MappedListIterable extends _internal.ListIterable$(T) {
+    new(source, f) {
+      this[_source] = source;
+      this[_f] = f;
+      super.new();
+    }
+    get length() {
+      return this[_source][dartx.length];
+    }
+    elementAt(index) {
+      return this[_f](this[_source][dartx.elementAt](index));
+    }
+  }
+  MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(MappedListIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.MappedListIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])}),
+    fields: () => ({
+      [_source]: IterableOfS(),
+      [_f]: _TransformationOfS$T()
     })
   });
-  _isolate_helper._IsolateEvent = class _IsolateEvent extends core.Object {
-    new(isolate, fn, message) {
-      this.isolate = isolate;
-      this.fn = fn;
-      this.message = message;
+  dart.defineExtensionMembers(MappedListIterable, ['elementAt', 'length']);
+  return MappedListIterable;
+});
+_internal.MappedListIterable = MappedListIterable();
+_internal._ElementPredicate$ = dart.generic(E => {
+  const _ElementPredicate = dart.typedef('_ElementPredicate', () => dart.functionType(core.bool, [E]));
+  return _ElementPredicate;
+});
+_internal._ElementPredicate = _ElementPredicate();
+_internal.WhereIterable$ = dart.generic(E => {
+  let WhereIteratorOfE = () => (WhereIteratorOfE = dart.constFn(_internal.WhereIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class WhereIterable extends core.Iterable$(E) {
+    new(iterable, f) {
+      this[_iterable$] = iterable;
+      this[_f] = f;
+      super.new();
     }
-    process() {
-      if (dart.test(this.isolate.isPaused)) {
-        this.isolate.delayedEvents[dartx.add](this);
-        return;
-      }
-      this.isolate.eval(this.fn);
+    get iterator() {
+      return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
-  };
-  dart.setSignature(_isolate_helper._IsolateEvent, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateEvent, [_isolate_helper._IsolateContext, core.Function, core.String])}),
+  }
+  dart.setSignature(WhereIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
     fields: () => ({
-      isolate: _isolate_helper._IsolateContext,
-      fn: core.Function,
-      message: core.String
+      [_iterable$]: IterableOfE(),
+      [_f]: _ElementPredicateOfE()
     }),
-    methods: () => ({process: dart.definiteFunctionType(dart.void, [])})
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
-  dart.defineLazy(_isolate_helper, {
-    get global() {
-      return typeof global == 'undefined' ? self : global;
+  dart.defineExtensionMembers(WhereIterable, ['iterator']);
+  return WhereIterable;
+});
+_internal.WhereIterable = WhereIterable();
+_internal.WhereIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class WhereIterator extends core.Iterator$(E) {
+    new(iterator, f) {
+      this[_iterator] = iterator;
+      this[_f] = f;
     }
+    moveNext() {
+      while (dart.test(this[_iterator].moveNext())) {
+        if (dart.test(this[_f](this[_iterator].current))) {
+          return true;
+        }
+      }
+      return false;
+    }
+    get current() {
+      return this[_iterator].current;
+    }
+  }
+  dart.setSignature(WhereIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
+    fields: () => ({
+      [_iterator]: IteratorOfE(),
+      [_f]: _ElementPredicateOfE()
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
   });
-  _isolate_helper._MainManagerStub = class _MainManagerStub extends core.Object {
-    postMessage(msg) {
-      _isolate_helper.global.postMessage(msg);
+  return WhereIterator;
+});
+_internal.WhereIterator = WhereIterator();
+_internal._ExpandFunction$ = dart.generic((S, T) => {
+  const _ExpandFunction = dart.typedef('_ExpandFunction', () => dart.functionType(core.Iterable$(T), [S]));
+  return _ExpandFunction;
+});
+_internal._ExpandFunction = _ExpandFunction();
+_internal.ExpandIterable$ = dart.generic((S, T) => {
+  let ExpandIteratorOfS$T = () => (ExpandIteratorOfS$T = dart.constFn(_internal.ExpandIterator$(S, T)))();
+  let IterableOfS = () => (IterableOfS = dart.constFn(core.Iterable$(S)))();
+  let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
+  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
+  class ExpandIterable extends core.Iterable$(T) {
+    new(iterable, f) {
+      this[_iterable$] = iterable;
+      this[_f] = f;
+      super.new();
     }
-  };
-  dart.setSignature(_isolate_helper._MainManagerStub, {
-    methods: () => ({postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+    get iterator() {
+      return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
+    }
+  }
+  dart.setSignature(ExpandIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
+    fields: () => ({
+      [_iterable$]: IterableOfS(),
+      [_f]: _ExpandFunctionOfS$T()
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
   });
-  _isolate_helper._SPAWNED_SIGNAL = "spawned";
-  _isolate_helper._SPAWN_FAILED_SIGNAL = "spawn failed";
-  dart.copyProperties(_isolate_helper, {
-    get globalWindow() {
-      return _isolate_helper.global.window;
+  dart.defineExtensionMembers(ExpandIterable, ['iterator']);
+  return ExpandIterable;
+});
+_internal.ExpandIterable = ExpandIterable();
+const _currentExpansion = Symbol('_currentExpansion');
+_internal.ExpandIterator$ = dart.generic((S, T) => {
+  let IteratorOfS = () => (IteratorOfS = dart.constFn(core.Iterator$(S)))();
+  let _ExpandFunctionOfS$T = () => (_ExpandFunctionOfS$T = dart.constFn(_internal._ExpandFunction$(S, T)))();
+  let EmptyIteratorOfT = () => (EmptyIteratorOfT = dart.constFn(_internal.EmptyIterator$(T)))();
+  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
+  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
+  class ExpandIterator extends core.Object {
+    new(iterator, f) {
+      this[_iterator] = iterator;
+      this[_f] = f;
+      this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
+      this[_current$] = null;
     }
-  });
-  dart.copyProperties(_isolate_helper, {
-    get globalWorker() {
-      return _isolate_helper.global.Worker;
+    get current() {
+      return this[_current$];
     }
-  });
-  dart.copyProperties(_isolate_helper, {
-    get globalPostMessageDefined() {
-      return !!_isolate_helper.global.postMessage;
-    }
-  });
-  _isolate_helper._MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart.dynamic, []));
-  _isolate_helper._MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionType(dart.dynamic, [dart.dynamic]));
-  _isolate_helper._MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
-  _isolate_helper.IsolateNatives = class IsolateNatives extends core.Object {
-    static computeThisScript() {
-      let currentScript = document.currentScript;
-      if (currentScript != null) {
-        return String(currentScript.src);
-      }
-      if (dart.test(_js_helper.Primitives.isD8)) return _isolate_helper.IsolateNatives.computeThisScriptD8();
-      if (dart.test(_js_helper.Primitives.isJsshell)) return _isolate_helper.IsolateNatives.computeThisScriptJsshell();
-      if (_isolate_helper._globalState != null && dart.test(_isolate_helper._globalState.isWorker)) {
-        return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
-      }
-      return null;
-    }
-    static computeThisScriptJsshell() {
-      return thisFilename();
-    }
-    static computeThisScriptD8() {
-      return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
-    }
-    static computeThisScriptFromTrace() {
-      let stack = new Error().stack;
-      if (stack == null) {
-        stack = (function() {
-          try {
-            throw new Error();
-          } catch (e) {
-            return e.stack;
-          }
-
-        })();
-        if (stack == null) dart.throw(new core.UnsupportedError('No stack trace'));
-      }
-      let pattern = null, matches = null;
-      pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m");
-      matches = stack.match(pattern);
-      if (matches != null) return matches[1];
-      pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m");
-      matches = stack.match(pattern);
-      if (matches != null) return matches[1];
-      dart.throw(new core.UnsupportedError(dart.str`Cannot extract URI from "${stack}"`));
-    }
-    static _getEventData(e) {
-      return e.data;
-    }
-    static _processWorkerMessage(sender, e) {
-      let msg = _isolate_helper._deserializeMessage(_isolate_helper.IsolateNatives._getEventData(e));
-      switch (dart.dindex(msg, 'command')) {
-        case 'start':
-        {
-          _isolate_helper._globalState.currentManagerId = core.int._check(dart.dindex(msg, 'id'));
-          let functionName = core.String._check(dart.dindex(msg, 'functionName'));
-          let entryPoint = core.Function._check(functionName == null ? _isolate_helper._globalState.entry : _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName));
-          let args = dart.dindex(msg, 'args');
-          let message = _isolate_helper._deserializeMessage(dart.dindex(msg, 'msg'));
-          let isSpawnUri = dart.dindex(msg, 'isSpawnUri');
-          let startPaused = dart.dindex(msg, 'startPaused');
-          let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
-          let context = new _isolate_helper._IsolateContext();
-          _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
-            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
-          }, VoidToNull()), 'worker-start');
-          _isolate_helper._globalState.currentContext = context;
-          _isolate_helper._globalState.topEventLoop.run();
-          break;
-        }
-        case 'spawn-worker':
-        {
-          if (_isolate_helper.IsolateNatives.enableSpawnWorker != null) _isolate_helper.IsolateNatives.handleSpawnWorkerRequest(msg);
-          break;
-        }
-        case 'message':
-        {
-          let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
-          if (port != null) {
-            dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
-          }
-          _isolate_helper._globalState.topEventLoop.run();
-          break;
-        }
-        case 'close':
-        {
-          _isolate_helper._globalState.managers[dartx.remove](_isolate_helper.IsolateNatives.workerIds._get(sender));
-          sender.terminate();
-          _isolate_helper._globalState.topEventLoop.run();
-          break;
-        }
-        case 'log':
-        {
-          _isolate_helper.IsolateNatives._log(dart.dindex(msg, 'msg'));
-          break;
-        }
-        case 'print':
-        {
-          if (dart.test(_isolate_helper._globalState.isWorker)) {
-            _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'print', msg: msg}, core.String, dart.dynamic)));
-          } else {
-            core.print(dart.dindex(msg, 'msg'));
-          }
-          break;
-        }
-        case 'error':
-        {
-          dart.throw(dart.dindex(msg, 'msg'));
-        }
-      }
-    }
-    static handleSpawnWorkerRequest(msg) {
-      let replyPort = dart.dindex(msg, 'replyPort');
-      _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
-        dart.dsend(replyPort, 'send', msg);
-      }, ListToNull()), {onError: dart.fn(errorMessage => {
-          dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
-        }, StringToNull())});
-    }
-    static _log(msg) {
-      if (dart.test(_isolate_helper._globalState.isWorker)) {
-        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'log', msg: msg}, core.String, dart.dynamic)));
-      } else {
-        try {
-          _isolate_helper.IsolateNatives._consoleLog(msg);
-        } catch (e) {
-          let trace = dart.stackTrace(e);
-          dart.throw(core.Exception.new(trace));
-        }
-
-      }
-    }
-    static _consoleLog(msg) {
-      _isolate_helper.global.console.log(msg);
-    }
-    static _getJSFunctionFromName(functionName) {
-      let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_embedded_names.GLOBAL_FUNCTIONS);
-      return globalFunctionsContainer[functionName]();
-    }
-    static _getJSFunctionName(f) {
-      return f.$name;
-    }
-    static _allocate(ctor) {
-      return new ctor();
-    }
-    static spawnFunction(topLevelFunction, message, startPaused) {
-      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
-      let name = _isolate_helper.IsolateNatives._getJSFunctionName(topLevelFunction);
-      if (name == null) {
-        dart.throw(new core.UnsupportedError("only top-level functions can be spawned."));
-      }
-      let isLight = false;
-      let isSpawnUri = false;
-      return _isolate_helper.IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
-    }
-    static spawnUri(uri, args, message, startPaused) {
-      _isolate_helper.IsolateNatives.enableSpawnWorker = true;
-      let isLight = false;
-      let isSpawnUri = true;
-      return _isolate_helper.IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
-    }
-    static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
-      if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
-        uri = dart.notNull(uri) + ".js";
-      }
-      let port = isolate.ReceivePort.new();
-      let completer = CompleterOfList().new();
-      port.first.then(dart.dynamic)(dart.fn(msg => {
-        if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
-          completer.complete(msg);
+    moveNext() {
+      if (this[_currentExpansion] == null) return false;
+      while (!dart.test(this[_currentExpansion].moveNext())) {
+        this[_current$] = null;
+        if (dart.test(this[_iterator].moveNext())) {
+          this[_currentExpansion] = null;
+          this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
         } else {
-          dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
-          completer.completeError(dart.dindex(msg, 1));
-        }
-      }, dynamicToNull$()));
-      let signalReply = port.sendPort;
-      if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
-        _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
-      } else {
-        _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
-      }
-      return completer.future;
-    }
-    static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
-      if (args != null) args = ListOfString().from(args);
-      if (dart.test(_isolate_helper._globalState.isWorker)) {
-        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort}, core.String, core.Object)));
-      } else {
-        _isolate_helper.IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError);
-      }
-    }
-    static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
-      if (uri != null) {
-        dart.throw(new core.UnsupportedError("Currently spawnUri is not supported without web workers."));
-      }
-      message = _isolate_helper._clone(message);
-      if (args != null) args = ListOfString().from(args);
-      _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
-        let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
-        _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
-      }, VoidToNull()), 'nonworker start');
-    }
-    static get currentIsolate() {
-      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-      return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
-    }
-    static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
-      let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-      _js_helper.Primitives.initializeStatics(context.id);
-      replyTo.send(JSArrayOfObject().of([_isolate_helper._SPAWNED_SIGNAL, context.controlPort.sendPort, context.pauseCapability, context.terminateCapability]));
-      function runStartFunction() {
-        context.initialized = true;
-        if (!dart.test(isSpawnUri)) {
-          dart.dcall(topLevel, message);
-        } else if (_isolate_helper._MainFunctionArgsMessage.is(topLevel)) {
-          dart.dcall(topLevel, args, message);
-        } else if (_isolate_helper._MainFunctionArgs.is(topLevel)) {
-          dart.dcall(topLevel, args);
-        } else {
-          dart.dcall(topLevel);
+          return false;
         }
       }
-      dart.fn(runStartFunction, VoidTovoid$());
-      if (dart.test(startPaused)) {
-        context.addPause(context.pauseCapability, context.pauseCapability);
-        _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
-      } else {
-        runStartFunction();
-      }
-    }
-    static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
-      if (uri == null) uri = _isolate_helper.IsolateNatives.thisScript;
-      let worker = new Worker(uri);
-      let onerrorTrampoline = (function(f, u, c) {
-        return function(e) {
-          return f(e, u, c);
-        };
-      })(_isolate_helper.IsolateNatives.workerOnError, uri, onError);
-      worker.onerror = onerrorTrampoline;
-      let processWorkerMessageTrampoline = (function(f, a) {
-        return function(e) {
-          e.onerror = null;
-          return f(a, e);
-        };
-      })(_isolate_helper.IsolateNatives._processWorkerMessage, worker);
-      worker.onmessage = processWorkerMessageTrampoline;
-      let o = _isolate_helper._globalState;
-      let workerId = o.nextManagerId;
-      o.nextManagerId = dart.notNull(workerId) + 1;
-      _isolate_helper.IsolateNatives.workerIds._set(worker, workerId);
-      _isolate_helper._globalState.managers[dartx._set](workerId, worker);
-      worker.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'start', id: workerId, replyTo: _isolate_helper._serializeMessage(replyPort), args: args, msg: _isolate_helper._serializeMessage(message), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functionName}, core.String, core.Object)));
-    }
-    static workerOnError(event, uri, onError) {
-      event.preventDefault();
-      let message = event.message;
-      if (message == null) {
-        message = dart.str`Error spawning worker for ${uri}`;
-      } else {
-        message = dart.str`Error spawning worker for ${uri} (${message})`;
-      }
-      onError(message);
+      this[_current$] = this[_currentExpansion].current;
       return true;
     }
-  };
-  dart.setSignature(_isolate_helper.IsolateNatives, {
-    sfields: () => ({
-      enableSpawnWorker: dart.dynamic,
-      thisScript: core.String,
-      workerIds: ExpandoOfint()
+  }
+  dart.addTypeTests(ExpandIterator);
+  ExpandIterator[dart.implements] = () => [IteratorOfT()];
+  dart.setSignature(ExpandIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterator$(S, T), [IteratorOfS(), _ExpandFunctionOfS$T()])}),
+    fields: () => ({
+      [_iterator]: IteratorOfS(),
+      [_f]: _ExpandFunctionOfS$T(),
+      [_currentExpansion]: IteratorOfT(),
+      [_current$]: T
     }),
-    sgetters: () => ({currentIsolate: dart.definiteFunctionType(isolate.Isolate, [])}),
-    statics: () => ({
-      computeThisScript: dart.definiteFunctionType(core.String, []),
-      computeThisScriptJsshell: dart.definiteFunctionType(core.String, []),
-      computeThisScriptD8: dart.definiteFunctionType(core.String, []),
-      computeThisScriptFromTrace: dart.definiteFunctionType(core.String, []),
-      _getEventData: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _processWorkerMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      handleSpawnWorkerRequest: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _log: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _consoleLog: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      _getJSFunctionFromName: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _getJSFunctionName: dart.definiteFunctionType(core.String, [core.Function]),
-      _allocate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
-      spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
-      spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
-      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-      workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return ExpandIterator;
+});
+_internal.ExpandIterator = ExpandIterator();
+const _takeCount = Symbol('_takeCount');
+_internal.TakeIterable$ = dart.generic(E => {
+  let EfficientLengthTakeIterableOfE = () => (EfficientLengthTakeIterableOfE = dart.constFn(_internal.EfficientLengthTakeIterable$(E)))();
+  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
+  let TakeIteratorOfE = () => (TakeIteratorOfE = dart.constFn(_internal.TakeIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class TakeIterable extends core.Iterable$(E) {
+    static new(iterable, takeCount) {
+      if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
+        dart.throw(new core.ArgumentError(takeCount));
+      }
+      if (_internal.EfficientLength.is(iterable)) {
+        return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
+      }
+      return new (TakeIterableOfE())._(iterable, takeCount);
+    }
+    _(iterable, takeCount) {
+      this[_iterable$] = iterable;
+      this[_takeCount] = takeCount;
+      super.new();
+    }
+    get iterator() {
+      return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
+    }
+  }
+  dart.defineNamedConstructor(TakeIterable, '_');
+  dart.setSignature(TakeIterable, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int]),
+      _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
     }),
-    names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
+    fields: () => ({
+      [_iterable$]: IterableOfE(),
+      [_takeCount]: core.int
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
-  _isolate_helper.IsolateNatives.enableSpawnWorker = null;
-  dart.defineLazy(_isolate_helper.IsolateNatives, {
-    get thisScript() {
-      return _isolate_helper.IsolateNatives.computeThisScript();
-    },
-    set thisScript(_) {},
-    get workerIds() {
-      return new (ExpandoOfint())();
+  dart.defineExtensionMembers(TakeIterable, ['iterator']);
+  return TakeIterable;
+});
+_internal.TakeIterable = TakeIterable();
+_internal.EfficientLengthTakeIterable$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
+    new(iterable, takeCount) {
+      super._(iterable, takeCount);
     }
+    get length() {
+      let iterableLength = this[_iterable$][dartx.length];
+      if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
+      return iterableLength;
+    }
+  }
+  EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(EfficientLengthTakeIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthTakeIterable$(E), [IterableOfE(), core.int])})
   });
-  const _isolateId = Symbol('_isolateId');
-  const _checkReplyTo = Symbol('_checkReplyTo');
-  _isolate_helper._BaseSendPort = class _BaseSendPort extends core.Object {
-    new(isolateId) {
-      this[_isolateId] = isolateId;
+  dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
+  return EfficientLengthTakeIterable;
+});
+_internal.EfficientLengthTakeIterable = EfficientLengthTakeIterable();
+const _remaining = Symbol('_remaining');
+_internal.TakeIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class TakeIterator extends core.Iterator$(E) {
+    new(iterator, remaining) {
+      this[_iterator] = iterator;
+      this[_remaining] = remaining;
+      dart.assert(typeof this[_remaining] == 'number' && dart.notNull(this[_remaining]) >= 0);
     }
-    [_checkReplyTo](replyTo) {
-      if (replyTo != null && !_isolate_helper._NativeJsSendPort.is(replyTo) && !_isolate_helper._WorkerSendPort.is(replyTo)) {
-        dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"));
+    moveNext() {
+      this[_remaining] = dart.notNull(this[_remaining]) - 1;
+      if (dart.notNull(this[_remaining]) >= 0) {
+        return this[_iterator].moveNext();
+      }
+      this[_remaining] = -1;
+      return false;
+    }
+    get current() {
+      if (dart.notNull(this[_remaining]) < 0) return null;
+      return this[_iterator].current;
+    }
+  }
+  dart.setSignature(TakeIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeIterator$(E), [IteratorOfE(), core.int])}),
+    fields: () => ({
+      [_iterator]: IteratorOfE(),
+      [_remaining]: core.int
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return TakeIterator;
+});
+_internal.TakeIterator = TakeIterator();
+_internal.TakeWhileIterable$ = dart.generic(E => {
+  let TakeWhileIteratorOfE = () => (TakeWhileIteratorOfE = dart.constFn(_internal.TakeWhileIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class TakeWhileIterable extends core.Iterable$(E) {
+    new(iterable, f) {
+      this[_iterable$] = iterable;
+      this[_f] = f;
+      super.new();
+    }
+    get iterator() {
+      return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
+    }
+  }
+  dart.setSignature(TakeWhileIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
+    fields: () => ({
+      [_iterable$]: IterableOfE(),
+      [_f]: _ElementPredicateOfE()
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
+  });
+  dart.defineExtensionMembers(TakeWhileIterable, ['iterator']);
+  return TakeWhileIterable;
+});
+_internal.TakeWhileIterable = TakeWhileIterable();
+const _isFinished = Symbol('_isFinished');
+_internal.TakeWhileIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class TakeWhileIterator extends core.Iterator$(E) {
+    new(iterator, f) {
+      this[_iterator] = iterator;
+      this[_f] = f;
+      this[_isFinished] = false;
+    }
+    moveNext() {
+      if (dart.test(this[_isFinished])) return false;
+      if (!dart.test(this[_iterator].moveNext()) || !dart.test(this[_f](this[_iterator].current))) {
+        this[_isFinished] = true;
+        return false;
+      }
+      return true;
+    }
+    get current() {
+      if (dart.test(this[_isFinished])) return null;
+      return this[_iterator].current;
+    }
+  }
+  dart.setSignature(TakeWhileIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
+    fields: () => ({
+      [_iterator]: IteratorOfE(),
+      [_f]: _ElementPredicateOfE(),
+      [_isFinished]: core.bool
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return TakeWhileIterator;
+});
+_internal.TakeWhileIterator = TakeWhileIterator();
+const _skipCount = Symbol('_skipCount');
+_internal.SkipIterable$ = dart.generic(E => {
+  let EfficientLengthSkipIterableOfE = () => (EfficientLengthSkipIterableOfE = dart.constFn(_internal.EfficientLengthSkipIterable$(E)))();
+  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
+  let SkipIteratorOfE = () => (SkipIteratorOfE = dart.constFn(_internal.SkipIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class SkipIterable extends core.Iterable$(E) {
+    static new(iterable, count) {
+      if (_internal.EfficientLength.is(iterable)) {
+        return new (EfficientLengthSkipIterableOfE())(iterable, count);
+      }
+      return new (SkipIterableOfE())._(iterable, count);
+    }
+    _(iterable, skipCount) {
+      this[_iterable$] = iterable;
+      this[_skipCount] = skipCount;
+      super.new();
+      if (!(typeof this[_skipCount] == 'number')) {
+        dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
+      }
+      core.RangeError.checkNotNegative(this[_skipCount], "count");
+    }
+    skip(count) {
+      if (!(typeof this[_skipCount] == 'number')) {
+        dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
+      }
+      core.RangeError.checkNotNegative(this[_skipCount], "count");
+      return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
+    }
+    get iterator() {
+      return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
+    }
+  }
+  dart.defineNamedConstructor(SkipIterable, '_');
+  dart.setSignature(SkipIterable, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int]),
+      _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
+    }),
+    fields: () => ({
+      [_iterable$]: IterableOfE(),
+      [_skipCount]: core.int
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
+  });
+  dart.defineExtensionMembers(SkipIterable, ['skip', 'iterator']);
+  return SkipIterable;
+});
+_internal.SkipIterable = SkipIterable();
+_internal.EfficientLengthSkipIterable$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
+    new(iterable, skipCount) {
+      super._(iterable, skipCount);
+    }
+    get length() {
+      let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
+      if (length >= 0) return length;
+      return 0;
+    }
+  }
+  EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(EfficientLengthSkipIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.EfficientLengthSkipIterable$(E), [IterableOfE(), core.int])})
+  });
+  dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
+  return EfficientLengthSkipIterable;
+});
+_internal.EfficientLengthSkipIterable = EfficientLengthSkipIterable();
+_internal.SkipIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class SkipIterator extends core.Iterator$(E) {
+    new(iterator, skipCount) {
+      this[_iterator] = iterator;
+      this[_skipCount] = skipCount;
+      dart.assert(typeof this[_skipCount] == 'number' && dart.notNull(this[_skipCount]) >= 0);
+    }
+    moveNext() {
+      for (let i = 0; i < dart.notNull(this[_skipCount]); i++)
+        this[_iterator].moveNext();
+      this[_skipCount] = 0;
+      return this[_iterator].moveNext();
+    }
+    get current() {
+      return this[_iterator].current;
+    }
+  }
+  dart.setSignature(SkipIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipIterator$(E), [IteratorOfE(), core.int])}),
+    fields: () => ({
+      [_iterator]: IteratorOfE(),
+      [_skipCount]: core.int
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return SkipIterator;
+});
+_internal.SkipIterator = SkipIterator();
+_internal.SkipWhileIterable$ = dart.generic(E => {
+  let SkipWhileIteratorOfE = () => (SkipWhileIteratorOfE = dart.constFn(_internal.SkipWhileIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class SkipWhileIterable extends core.Iterable$(E) {
+    new(iterable, f) {
+      this[_iterable$] = iterable;
+      this[_f] = f;
+      super.new();
+    }
+    get iterator() {
+      return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
+    }
+  }
+  dart.setSignature(SkipWhileIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
+    fields: () => ({
+      [_iterable$]: IterableOfE(),
+      [_f]: _ElementPredicateOfE()
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
+  });
+  dart.defineExtensionMembers(SkipWhileIterable, ['iterator']);
+  return SkipWhileIterable;
+});
+_internal.SkipWhileIterable = SkipWhileIterable();
+const _hasSkipped = Symbol('_hasSkipped');
+_internal.SkipWhileIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
+  class SkipWhileIterator extends core.Iterator$(E) {
+    new(iterator, f) {
+      this[_iterator] = iterator;
+      this[_f] = f;
+      this[_hasSkipped] = false;
+    }
+    moveNext() {
+      if (!dart.test(this[_hasSkipped])) {
+        this[_hasSkipped] = true;
+        while (dart.test(this[_iterator].moveNext())) {
+          if (!dart.test(this[_f](this[_iterator].current))) return true;
+        }
+      }
+      return this[_iterator].moveNext();
+    }
+    get current() {
+      return this[_iterator].current;
+    }
+  }
+  dart.setSignature(SkipWhileIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterator$(E), [IteratorOfE(), _ElementPredicateOfE()])}),
+    fields: () => ({
+      [_iterator]: IteratorOfE(),
+      [_f]: _ElementPredicateOfE(),
+      [_hasSkipped]: core.bool
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return SkipWhileIterator;
+});
+_internal.SkipWhileIterator = SkipWhileIterator();
+_internal.EmptyIterable$ = dart.generic(E => {
+  let EmptyIteratorOfE = () => (EmptyIteratorOfE = dart.constFn(_internal.EmptyIterator$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  class EmptyIterable extends core.Iterable$(E) {
+    new() {
+      super.new();
+    }
+    get iterator() {
+      return dart.const(new (EmptyIteratorOfE())());
+    }
+    forEach(action) {}
+    get isEmpty() {
+      return true;
+    }
+    get length() {
+      return 0;
+    }
+    get first() {
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    get last() {
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    get single() {
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    elementAt(index) {
+      dart.throw(new core.RangeError.range(index, 0, 0, "index"));
+    }
+    contains(element) {
+      return false;
+    }
+    every(test) {
+      return true;
+    }
+    any(test) {
+      return false;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    singleWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      return "";
+    }
+    where(test) {
+      return this;
+    }
+    map(T) {
+      return f => {
+        return dart.const(new (_internal.EmptyIterable$(T))());
+      };
+    }
+    reduce(combine) {
+      EAndEToE()._check(combine);
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        return initialValue;
+      };
+    }
+    skip(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      return this;
+    }
+    skipWhile(test) {
+      return this;
+    }
+    take(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      return this;
+    }
+    takeWhile(test) {
+      return this;
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      return dart.test(growable) ? JSArrayOfE().of([]) : ListOfE().new(0);
+    }
+    toSet() {
+      return SetOfE().new();
+    }
+  }
+  EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(EmptyIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterable$(E), [])}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
+  });
+  dart.defineExtensionMembers(EmptyIterable, [
+    'forEach',
+    'elementAt',
+    'contains',
+    'every',
+    'any',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'join',
+    'where',
+    'map',
+    'reduce',
+    'fold',
+    'skip',
+    'skipWhile',
+    'take',
+    'takeWhile',
+    'toList',
+    'toSet',
+    'iterator',
+    'isEmpty',
+    'length',
+    'first',
+    'last',
+    'single'
+  ]);
+  return EmptyIterable;
+});
+_internal.EmptyIterable = EmptyIterable();
+_internal.EmptyIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class EmptyIterator extends core.Object {
+    new() {
+    }
+    moveNext() {
+      return false;
+    }
+    get current() {
+      return null;
+    }
+  }
+  dart.addTypeTests(EmptyIterator);
+  EmptyIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(EmptyIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.EmptyIterator$(E), [])}),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return EmptyIterator;
+});
+_internal.EmptyIterator = EmptyIterator();
+_internal.IterableElementError = class IterableElementError extends core.Object {
+  static noElement() {
+    return new core.StateError("No element");
+  }
+  static tooMany() {
+    return new core.StateError("Too many elements");
+  }
+  static tooFew() {
+    return new core.StateError("Too few elements");
+  }
+};
+dart.setSignature(_internal.IterableElementError, {
+  statics: () => ({
+    noElement: dart.definiteFunctionType(core.StateError, []),
+    tooMany: dart.definiteFunctionType(core.StateError, []),
+    tooFew: dart.definiteFunctionType(core.StateError, [])
+  }),
+  names: ['noElement', 'tooMany', 'tooFew']
+});
+_internal.FixedLengthListMixin$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  dart.defineExtensionNames([
+    'length',
+    'add',
+    'insert',
+    'insertAll',
+    'addAll',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'clear',
+    'removeAt',
+    'removeLast',
+    'removeRange',
+    'replaceRange'
+  ]);
+  class FixedLengthListMixin extends core.Object {
+    set length(newLength) {
+      dart.throw(new core.UnsupportedError("Cannot change the length of a fixed-length list"));
+    }
+    add(value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
+    }
+    insert(index, value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
+    }
+    insertAll(at, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
+    }
+    addAll(iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to a fixed-length list"));
+    }
+    remove(element) {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    removeWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    retainWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    clear() {
+      dart.throw(new core.UnsupportedError("Cannot clear a fixed-length list"));
+    }
+    removeAt(index) {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    removeLast() {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    removeRange(start, end) {
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+    replaceRange(start, end, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot remove from a fixed-length list"));
+    }
+  }
+  dart.addTypeTests(FixedLengthListMixin);
+  dart.setSignature(FixedLengthListMixin, {
+    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [E]),
+      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
+      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      removeAt: dart.definiteFunctionType(E, [core.int]),
+      removeLast: dart.definiteFunctionType(E, []),
+      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()])
+    })
+  });
+  dart.defineExtensionMembers(FixedLengthListMixin, [
+    'add',
+    'insert',
+    'insertAll',
+    'addAll',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'clear',
+    'removeAt',
+    'removeLast',
+    'removeRange',
+    'replaceRange',
+    'length'
+  ]);
+  return FixedLengthListMixin;
+});
+_internal.FixedLengthListMixin = FixedLengthListMixin();
+_internal.FixedLengthListBase$ = dart.generic(E => {
+  class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), _internal.FixedLengthListMixin$(E)) {
+    new() {
+      super.new();
+    }
+  }
+  return FixedLengthListBase;
+});
+_internal.FixedLengthListBase = FixedLengthListBase();
+const _backedList = Symbol('_backedList');
+_internal._ListIndicesIterable = class _ListIndicesIterable extends _internal.ListIterable$(core.int) {
+  new(backedList) {
+    this[_backedList] = backedList;
+    super.new();
+  }
+  get length() {
+    return this[_backedList][dartx.length];
+  }
+  elementAt(index) {
+    core.RangeError.checkValidIndex(index, this);
+    return index;
+  }
+};
+dart.addSimpleTypeTests(_internal._ListIndicesIterable);
+dart.setSignature(_internal._ListIndicesIterable, {
+  constructors: () => ({new: dart.definiteFunctionType(_internal._ListIndicesIterable, [core.List])}),
+  fields: () => ({[_backedList]: core.List})
+});
+dart.defineExtensionMembers(_internal._ListIndicesIterable, ['elementAt', 'length']);
+const _values = Symbol('_values');
+_internal.ListMapView$ = dart.generic(E => {
+  let SubListIterableOfE = () => (SubListIterableOfE = dart.constFn(_internal.SubListIterable$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let MapOfint$E = () => (MapOfint$E = dart.constFn(core.Map$(core.int, E)))();
+  let intAndETovoid = () => (intAndETovoid = dart.constFn(dart.functionType(dart.void, [core.int, E])))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  class ListMapView extends core.Object {
+    new(values) {
+      this[_values] = values;
+    }
+    _get(key) {
+      return dart.test(this.containsKey(key)) ? this[_values][dartx._get](core.int._check(key)) : null;
+    }
+    get length() {
+      return this[_values][dartx.length];
+    }
+    get values() {
+      return new (SubListIterableOfE())(this[_values], 0, null);
+    }
+    get keys() {
+      return new _internal._ListIndicesIterable(this[_values]);
+    }
+    get isEmpty() {
+      return this[_values][dartx.isEmpty];
+    }
+    get isNotEmpty() {
+      return this[_values][dartx.isNotEmpty];
+    }
+    containsValue(value) {
+      return this[_values][dartx.contains](value);
+    }
+    containsKey(key) {
+      return typeof key == 'number' && dart.notNull(key) >= 0 && dart.notNull(key) < dart.notNull(this.length);
+    }
+    forEach(f) {
+      let length = this[_values][dartx.length];
+      for (let i = 0; i < dart.notNull(length); i++) {
+        f(i, this[_values][dartx._get](i));
+        if (length != this[_values][dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this[_values]));
+        }
       }
     }
-  };
-  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
-  dart.setSignature(_isolate_helper._BaseSendPort, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._BaseSendPort, [core.int])}),
-    fields: () => ({[_isolateId]: core.int}),
-    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
-  });
-  const _receivePort = Symbol('_receivePort');
-  const _isClosed = Symbol('_isClosed');
-  const _add = Symbol('_add');
-  _isolate_helper._NativeJsSendPort = class _NativeJsSendPort extends _isolate_helper._BaseSendPort {
-    new(receivePort, isolateId) {
-      this[_receivePort] = receivePort;
-      super.new(isolateId);
+    _set(key, value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
+      return value;
     }
-    send(message) {
-      let isolate = _isolate_helper._globalState.isolates[dartx._get](this[_isolateId]);
-      if (isolate == null) return;
-      if (dart.test(this[_receivePort][_isClosed])) return;
-      let msg = _isolate_helper._clone(message);
-      if (dart.equals(isolate.controlPort, this[_receivePort])) {
-        isolate.handleControlMessage(msg);
+    putIfAbsent(key, ifAbsent) {
+      VoidToE()._check(ifAbsent);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
+    }
+    remove(key) {
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
+    }
+    clear() {
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
+    }
+    addAll(other) {
+      MapOfint$E()._check(other);
+      dart.throw(new core.UnsupportedError("Cannot modify an unmodifiable map"));
+    }
+    toString() {
+      return collection.Maps.mapToString(this);
+    }
+  }
+  dart.addTypeTests(ListMapView);
+  ListMapView[dart.implements] = () => [MapOfint$E()];
+  dart.setSignature(ListMapView, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ListMapView$(E), [ListOfE()])}),
+    fields: () => ({[_values]: ListOfE()}),
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      values: dart.definiteFunctionType(core.Iterable$(E), []),
+      keys: dart.definiteFunctionType(core.Iterable$(core.int), []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      _get: dart.definiteFunctionType(E, [core.Object]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+      forEach: dart.definiteFunctionType(dart.void, [intAndETovoid()]),
+      _set: dart.definiteFunctionType(dart.void, [core.int, E]),
+      putIfAbsent: dart.definiteFunctionType(E, [core.int, VoidToE()]),
+      remove: dart.definiteFunctionType(E, [core.Object]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfint$E()])
+    })
+  });
+  dart.defineExtensionMembers(ListMapView, [
+    '_get',
+    'containsValue',
+    'containsKey',
+    'forEach',
+    '_set',
+    'putIfAbsent',
+    'remove',
+    'clear',
+    'addAll',
+    'length',
+    'values',
+    'keys',
+    'isEmpty',
+    'isNotEmpty'
+  ]);
+  return ListMapView;
+});
+_internal.ListMapView = ListMapView();
+_internal.ReversedListIterable$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class ReversedListIterable extends _internal.ListIterable$(E) {
+    new(source) {
+      this[_source] = source;
+      super.new();
+    }
+    get length() {
+      return this[_source][dartx.length];
+    }
+    elementAt(index) {
+      return this[_source][dartx.elementAt](dart.notNull(this[_source][dartx.length]) - 1 - dart.notNull(index));
+    }
+  }
+  dart.setSignature(ReversedListIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_internal.ReversedListIterable$(E), [IterableOfE()])}),
+    fields: () => ({[_source]: IterableOfE()})
+  });
+  dart.defineExtensionMembers(ReversedListIterable, ['elementAt', 'length']);
+  return ReversedListIterable;
+});
+_internal.ReversedListIterable = ReversedListIterable();
+_internal.UnmodifiableListError = class UnmodifiableListError extends core.Object {
+  static add() {
+    return new core.UnsupportedError("Cannot add to unmodifiable List");
+  }
+  static change() {
+    return new core.UnsupportedError("Cannot change the content of an unmodifiable List");
+  }
+  static length() {
+    return new core.UnsupportedError("Cannot change length of unmodifiable List");
+  }
+  static remove() {
+    return new core.UnsupportedError("Cannot remove from unmodifiable List");
+  }
+};
+dart.setSignature(_internal.UnmodifiableListError, {
+  statics: () => ({
+    add: dart.definiteFunctionType(core.UnsupportedError, []),
+    change: dart.definiteFunctionType(core.UnsupportedError, []),
+    length: dart.definiteFunctionType(core.UnsupportedError, []),
+    remove: dart.definiteFunctionType(core.UnsupportedError, [])
+  }),
+  names: ['add', 'change', 'length', 'remove']
+});
+_internal.NonGrowableListError = class NonGrowableListError extends core.Object {
+  static add() {
+    return new core.UnsupportedError("Cannot add to non-growable List");
+  }
+  static length() {
+    return new core.UnsupportedError("Cannot change length of non-growable List");
+  }
+  static remove() {
+    return new core.UnsupportedError("Cannot remove from non-growable List");
+  }
+};
+dart.setSignature(_internal.NonGrowableListError, {
+  statics: () => ({
+    add: dart.definiteFunctionType(core.UnsupportedError, []),
+    length: dart.definiteFunctionType(core.UnsupportedError, []),
+    remove: dart.definiteFunctionType(core.UnsupportedError, [])
+  }),
+  names: ['add', 'length', 'remove']
+});
+_internal.makeListFixedLength = function(E) {
+  return growableList => {
+    _interceptors.JSArray.markFixedList(growableList);
+    return growableList;
+  };
+};
+dart.lazyFn(_internal.makeListFixedLength, () => ListOfEToListOfE());
+_internal.makeFixedListUnmodifiable = function(E) {
+  return fixedLengthList => {
+    _interceptors.JSArray.markUnmodifiableList(fixedLengthList);
+    return fixedLengthList;
+  };
+};
+dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
+_internal.Lists = class Lists extends core.Object {
+  static copy(src, srcStart, dst, dstStart, count) {
+    if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
+      for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
+        dst[dartx._set](j, src[dartx._get](i));
+      }
+    } else {
+      for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
+        dst[dartx._set](j, src[dartx._get](i));
+      }
+    }
+  }
+  static areEqual(a, b) {
+    if (core.identical(a, b)) return true;
+    if (!core.List.is(b)) return false;
+    let length = a[dartx.length];
+    if (!dart.equals(length, dart.dload(b, 'length'))) return false;
+    for (let i = 0; i < dart.notNull(length); i++) {
+      if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
+    }
+    return true;
+  }
+  static indexOf(a, element, startIndex, endIndex) {
+    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
+      return -1;
+    }
+    if (dart.notNull(startIndex) < 0) {
+      startIndex = 0;
+    }
+    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
+      if (dart.equals(a[dartx._get](i), element)) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  static lastIndexOf(a, element, startIndex) {
+    if (dart.notNull(startIndex) < 0) {
+      return -1;
+    }
+    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
+      startIndex = dart.notNull(a[dartx.length]) - 1;
+    }
+    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
+      if (dart.equals(a[dartx._get](i), element)) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  static indicesCheck(a, start, end) {
+    core.RangeError.checkValidRange(start, end, a[dartx.length]);
+  }
+  static rangeCheck(a, start, length) {
+    core.RangeError.checkNotNegative(length);
+    core.RangeError.checkNotNegative(start);
+    if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
+      let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
+      dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
+    }
+  }
+};
+dart.setSignature(_internal.Lists, {
+  statics: () => ({
+    copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
+    areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
+    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
+    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
+    indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
+    rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
+  }),
+  names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
+});
+_internal.printToZone = null;
+_internal.printToConsole = function(line) {
+  _js_primitives.printString(dart.str`${line}`);
+};
+dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
+_internal.Sort = class Sort extends core.Object {
+  static sort(E) {
+    return (a, compare) => {
+      _internal.Sort._doSort(E)(a, 0, dart.notNull(a[dartx.length]) - 1, compare);
+    };
+  }
+  static sortRange(E) {
+    return (a, from, to, compare) => {
+      if (dart.notNull(from) < 0 || dart.notNull(to) > dart.notNull(a[dartx.length]) || dart.notNull(to) < dart.notNull(from)) {
+        dart.throw("OutOfRange");
+      }
+      _internal.Sort._doSort(E)(a, from, dart.notNull(to) - 1, compare);
+    };
+  }
+  static _doSort(E) {
+    return (a, left, right, compare) => {
+      if (dart.notNull(right) - dart.notNull(left) <= _internal.Sort._INSERTION_SORT_THRESHOLD) {
+        _internal.Sort._insertionSort(E)(a, left, right, compare);
+      } else {
+        _internal.Sort._dualPivotQuicksort(E)(a, left, right, compare);
+      }
+    };
+  }
+  static _insertionSort(E) {
+    return (a, left, right, compare) => {
+      for (let i = dart.notNull(left) + 1; i <= dart.notNull(right); i++) {
+        let el = a[dartx._get](i);
+        let j = i;
+        while (j > dart.notNull(left) && dart.notNull(compare(a[dartx._get](j - 1), el)) > 0) {
+          a[dartx._set](j, a[dartx._get](j - 1));
+          j--;
+        }
+        a[dartx._set](j, el);
+      }
+    };
+  }
+  static _dualPivotQuicksort(E) {
+    return (a, left, right, compare) => {
+      dart.assert(dart.notNull(right) - dart.notNull(left) > _internal.Sort._INSERTION_SORT_THRESHOLD);
+      let sixth = ((dart.notNull(right) - dart.notNull(left) + 1) / 6)[dartx.truncate]();
+      let index1 = dart.notNull(left) + sixth;
+      let index5 = dart.notNull(right) - sixth;
+      let index3 = ((dart.notNull(left) + dart.notNull(right)) / 2)[dartx.truncate]();
+      let index2 = index3 - sixth;
+      let index4 = index3 + sixth;
+      let el1 = a[dartx._get](index1);
+      let el2 = a[dartx._get](index2);
+      let el3 = a[dartx._get](index3);
+      let el4 = a[dartx._get](index4);
+      let el5 = a[dartx._get](index5);
+      if (dart.notNull(compare(el1, el2)) > 0) {
+        let t = el1;
+        el1 = el2;
+        el2 = t;
+      }
+      if (dart.notNull(compare(el4, el5)) > 0) {
+        let t = el4;
+        el4 = el5;
+        el5 = t;
+      }
+      if (dart.notNull(compare(el1, el3)) > 0) {
+        let t = el1;
+        el1 = el3;
+        el3 = t;
+      }
+      if (dart.notNull(compare(el2, el3)) > 0) {
+        let t = el2;
+        el2 = el3;
+        el3 = t;
+      }
+      if (dart.notNull(compare(el1, el4)) > 0) {
+        let t = el1;
+        el1 = el4;
+        el4 = t;
+      }
+      if (dart.notNull(compare(el3, el4)) > 0) {
+        let t = el3;
+        el3 = el4;
+        el4 = t;
+      }
+      if (dart.notNull(compare(el2, el5)) > 0) {
+        let t = el2;
+        el2 = el5;
+        el5 = t;
+      }
+      if (dart.notNull(compare(el2, el3)) > 0) {
+        let t = el2;
+        el2 = el3;
+        el3 = t;
+      }
+      if (dart.notNull(compare(el4, el5)) > 0) {
+        let t = el4;
+        el4 = el5;
+        el5 = t;
+      }
+      let pivot1 = el2;
+      let pivot2 = el4;
+      a[dartx._set](index1, el1);
+      a[dartx._set](index3, el3);
+      a[dartx._set](index5, el5);
+      a[dartx._set](index2, a[dartx._get](left));
+      a[dartx._set](index4, a[dartx._get](right));
+      let less = dart.notNull(left) + 1;
+      let great = dart.notNull(right) - 1;
+      let pivots_are_equal = compare(pivot1, pivot2) == 0;
+      if (pivots_are_equal) {
+        let pivot = pivot1;
+        for (let k = less; k <= great; k++) {
+          let ak = a[dartx._get](k);
+          let comp = compare(ak, pivot);
+          if (comp == 0) continue;
+          if (dart.notNull(comp) < 0) {
+            if (k != less) {
+              a[dartx._set](k, a[dartx._get](less));
+              a[dartx._set](less, ak);
+            }
+            less++;
+          } else {
+            while (true) {
+              comp = compare(a[dartx._get](great), pivot);
+              if (dart.notNull(comp) > 0) {
+                great--;
+                continue;
+              } else if (dart.notNull(comp) < 0) {
+                a[dartx._set](k, a[dartx._get](less));
+                a[dartx._set](less++, a[dartx._get](great));
+                a[dartx._set](great--, ak);
+                break;
+              } else {
+                a[dartx._set](k, a[dartx._get](great));
+                a[dartx._set](great--, ak);
+                break;
+              }
+            }
+          }
+        }
+      } else {
+        for (let k = less; k <= great; k++) {
+          let ak = a[dartx._get](k);
+          let comp_pivot1 = compare(ak, pivot1);
+          if (dart.notNull(comp_pivot1) < 0) {
+            if (k != less) {
+              a[dartx._set](k, a[dartx._get](less));
+              a[dartx._set](less, ak);
+            }
+            less++;
+          } else {
+            let comp_pivot2 = compare(ak, pivot2);
+            if (dart.notNull(comp_pivot2) > 0) {
+              while (true) {
+                let comp = compare(a[dartx._get](great), pivot2);
+                if (dart.notNull(comp) > 0) {
+                  great--;
+                  if (great < k) break;
+                  continue;
+                } else {
+                  comp = compare(a[dartx._get](great), pivot1);
+                  if (dart.notNull(comp) < 0) {
+                    a[dartx._set](k, a[dartx._get](less));
+                    a[dartx._set](less++, a[dartx._get](great));
+                    a[dartx._set](great--, ak);
+                  } else {
+                    a[dartx._set](k, a[dartx._get](great));
+                    a[dartx._set](great--, ak);
+                  }
+                  break;
+                }
+              }
+            }
+          }
+        }
+      }
+      a[dartx._set](left, a[dartx._get](less - 1));
+      a[dartx._set](less - 1, pivot1);
+      a[dartx._set](right, a[dartx._get](great + 1));
+      a[dartx._set](great + 1, pivot2);
+      _internal.Sort._doSort(E)(a, left, less - 2, compare);
+      _internal.Sort._doSort(E)(a, great + 2, right, compare);
+      if (pivots_are_equal) {
         return;
       }
-      _isolate_helper._globalState.topEventLoop.enqueue(isolate, dart.fn(() => {
-        if (!dart.test(this[_receivePort][_isClosed])) {
-          this[_receivePort][_add](msg);
+      if (less < index1 && great > index5) {
+        while (compare(a[dartx._get](less), pivot1) == 0) {
+          less++;
         }
-      }, VoidToNull()), dart.str`receive ${message}`);
-    }
-    ['=='](other) {
-      return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
-    }
-    get hashCode() {
-      return this[_receivePort][_id];
-    }
-  };
-  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
-  dart.setSignature(_isolate_helper._NativeJsSendPort, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._NativeJsSendPort, [_isolate_helper.RawReceivePortImpl, core.int])}),
-    fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
-    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
-  });
-  const _workerId = Symbol('_workerId');
-  const _receivePortId = Symbol('_receivePortId');
-  _isolate_helper._WorkerSendPort = class _WorkerSendPort extends _isolate_helper._BaseSendPort {
-    new(workerId, isolateId, receivePortId) {
-      this[_workerId] = workerId;
-      this[_receivePortId] = receivePortId;
-      super.new(isolateId);
-    }
-    send(message) {
-      let workerMessage = _isolate_helper._serializeMessage(dart.map({command: 'message', port: this, msg: message}, core.String, core.Object));
-      if (dart.test(_isolate_helper._globalState.isWorker)) {
-        _isolate_helper._globalState.mainManager.postMessage(workerMessage);
+        while (compare(a[dartx._get](great), pivot2) == 0) {
+          great--;
+        }
+        for (let k = less; k <= great; k++) {
+          let ak = a[dartx._get](k);
+          let comp_pivot1 = compare(ak, pivot1);
+          if (comp_pivot1 == 0) {
+            if (k != less) {
+              a[dartx._set](k, a[dartx._get](less));
+              a[dartx._set](less, ak);
+            }
+            less++;
+          } else {
+            let comp_pivot2 = compare(ak, pivot2);
+            if (comp_pivot2 == 0) {
+              while (true) {
+                let comp = compare(a[dartx._get](great), pivot2);
+                if (comp == 0) {
+                  great--;
+                  if (great < k) break;
+                  continue;
+                } else {
+                  comp = compare(a[dartx._get](great), pivot1);
+                  if (dart.notNull(comp) < 0) {
+                    a[dartx._set](k, a[dartx._get](less));
+                    a[dartx._set](less++, a[dartx._get](great));
+                    a[dartx._set](great--, ak);
+                  } else {
+                    a[dartx._set](k, a[dartx._get](great));
+                    a[dartx._set](great--, ak);
+                  }
+                  break;
+                }
+              }
+            }
+          }
+        }
+        _internal.Sort._doSort(E)(a, less, great, compare);
       } else {
-        let manager = _isolate_helper._globalState.managers[dartx._get](this[_workerId]);
-        if (manager != null) {
-          manager.postMessage(workerMessage);
+        _internal.Sort._doSort(E)(a, less, great, compare);
+      }
+    };
+  }
+};
+dart.setSignature(_internal.Sort, {
+  sfields: () => ({_INSERTION_SORT_THRESHOLD: core.int}),
+  statics: () => ({
+    sort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), dart.functionType(core.int, [E, E])]]),
+    sortRange: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
+    _doSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
+    _insertionSort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]]),
+    _dualPivotQuicksort: dart.definiteFunctionType(E => [dart.void, [core.List$(E), core.int, core.int, dart.functionType(core.int, [E, E])]])
+  }),
+  names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
+});
+_internal.Sort._INSERTION_SORT_THRESHOLD = 32;
+const _name$ = Symbol('_name');
+const _nativeSymbol = Symbol('_nativeSymbol');
+_internal.Symbol = class Symbol extends core.Object {
+  new(name) {
+    this[_name$] = name;
+    this[_nativeSymbol] = null;
+  }
+  es6(name, nativeSymbol) {
+    this[_name$] = name;
+    this[_nativeSymbol] = nativeSymbol;
+  }
+  unvalidated(name) {
+    this[_name$] = name;
+    this[_nativeSymbol] = null;
+  }
+  validated(name) {
+    this[_name$] = _internal.Symbol.validatePublicSymbol(name);
+    this[_nativeSymbol] = null;
+  }
+  ['=='](other) {
+    return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+  }
+  get hashCode() {
+    let hash = this._hashCode;
+    if (hash != null) return hash;
+    let arbitraryPrime = 664597;
+    hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name$]));
+    this._hashCode = hash;
+    return hash;
+  }
+  toString() {
+    return dart.str`Symbol("${this[_name$]}")`;
+  }
+  static getName(symbol) {
+    return symbol[_name$];
+  }
+  static getNativeSymbol(symbol) {
+    return symbol[_nativeSymbol];
+  }
+  static validatePublicSymbol(name) {
+    if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
+    if (dart.test(name[dartx.startsWith]('_'))) {
+      dart.throw(new core.ArgumentError(dart.str`"${name}" is a private identifier`));
+    }
+    dart.throw(new core.ArgumentError(dart.str`"${name}" is not a valid (qualified) symbol name`));
+  }
+  static isValidSymbol(name) {
+    return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
+  }
+};
+dart.defineNamedConstructor(_internal.Symbol, 'es6');
+dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
+dart.defineNamedConstructor(_internal.Symbol, 'validated');
+_internal.Symbol[dart.implements] = () => [core.Symbol];
+dart.setSignature(_internal.Symbol, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+    es6: dart.definiteFunctionType(_internal.Symbol, [core.String, dart.dynamic]),
+    unvalidated: dart.definiteFunctionType(_internal.Symbol, [core.String]),
+    validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
+  }),
+  fields: () => ({
+    [_name$]: core.String,
+    [_nativeSymbol]: dart.dynamic
+  }),
+  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
+  sfields: () => ({
+    reservedWordRE: core.String,
+    publicIdentifierRE: core.String,
+    identifierRE: core.String,
+    operatorRE: core.String,
+    publicSymbolPattern: core.RegExp,
+    symbolPattern: core.RegExp
+  }),
+  statics: () => ({
+    getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
+    getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
+    validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
+    isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
+});
+_internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
+_internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
+dart.defineLazy(_internal.Symbol, {
+  get publicIdentifierRE() {
+    return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$][\\w$]*';
+  },
+  get identifierRE() {
+    return '(?!' + dart.str`${_internal.Symbol.reservedWordRE}` + '\\b(?!\\$))[a-zA-Z$_][\\w$]*';
+  },
+  get publicSymbolPattern() {
+    return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.publicIdentifierRE}(?:=?\$|[.](?!\$)))+?\$`);
+  },
+  get symbolPattern() {
+    return core.RegExp.new(dart.str`^(?:${_internal.Symbol.operatorRE}\$|${_internal.Symbol.identifierRE}(?:=?\$|[.](?!\$)))+?\$`);
+  }
+});
+_isolate_helper._callInIsolate = function(isolate, func) {
+  let result = isolate.eval(func);
+  _isolate_helper._globalState.topEventLoop.run();
+  return result;
+};
+dart.lazyFn(_isolate_helper._callInIsolate, () => _IsolateContextAndFunctionTodynamic());
+const _activeJsAsyncCount = Symbol('_activeJsAsyncCount');
+_isolate_helper.enterJsAsync = function() {
+  let o = _isolate_helper._globalState.topEventLoop;
+  o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
+};
+dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
+_isolate_helper.leaveJsAsync = function() {
+  let o = _isolate_helper._globalState.topEventLoop;
+  o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
+  dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
+};
+dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
+_isolate_helper.isWorker = function() {
+  return _isolate_helper._globalState.isWorker;
+};
+dart.lazyFn(_isolate_helper.isWorker, () => VoidTobool());
+_isolate_helper._currentIsolate = function() {
+  return _isolate_helper._globalState.currentContext;
+};
+dart.lazyFn(_isolate_helper._currentIsolate, () => VoidTo_IsolateContext());
+_isolate_helper.startRootIsolate = function(entry, args) {
+  args = args;
+  if (args == null) args = [];
+  if (!core.List.is(args)) {
+    dart.throw(new core.ArgumentError(dart.str`Arguments to main must be a List: ${args}`));
+  }
+  _isolate_helper._globalState = new _isolate_helper._Manager(core.Function._check(entry));
+  if (dart.test(_isolate_helper._globalState.isWorker)) return;
+  let rootContext = new _isolate_helper._IsolateContext();
+  _isolate_helper._globalState.rootContext = rootContext;
+  _isolate_helper._globalState.currentContext = rootContext;
+  if (_isolate_helper._MainFunctionArgs.is(entry)) {
+    rootContext.eval(dart.fn(() => {
+      dart.dcall(entry, args);
+    }, VoidToNull()));
+  } else if (_isolate_helper._MainFunctionArgsMessage.is(entry)) {
+    rootContext.eval(dart.fn(() => {
+      dart.dcall(entry, args, null);
+    }, VoidToNull()));
+  } else {
+    rootContext.eval(core.Function._check(entry));
+  }
+  _isolate_helper._globalState.topEventLoop.run();
+};
+dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
+dart.copyProperties(_isolate_helper, {
+  get _globalState() {
+    return dart.globalState;
+  },
+  set _globalState(val) {
+    dart.globalState = val;
+  }
+});
+const _nativeDetectEnvironment = Symbol('_nativeDetectEnvironment');
+const _nativeInitWorkerMessageHandler = Symbol('_nativeInitWorkerMessageHandler');
+_isolate_helper._Manager = class _Manager extends core.Object {
+  get useWorkers() {
+    return this.supportsWorkers;
+  }
+  new(entry) {
+    this.entry = entry;
+    this.nextIsolateId = 0;
+    this.currentManagerId = 0;
+    this.nextManagerId = 1;
+    this.currentContext = null;
+    this.rootContext = null;
+    this.topEventLoop = null;
+    this.fromCommandLine = null;
+    this.isWorker = null;
+    this.supportsWorkers = null;
+    this.isolates = null;
+    this.mainManager = null;
+    this.managers = null;
+    this[_nativeDetectEnvironment]();
+    this.topEventLoop = new _isolate_helper._EventLoop();
+    this.isolates = MapOfint$_IsolateContext().new();
+    this.managers = MapOfint$dynamic().new();
+    if (dart.test(this.isWorker)) {
+      this.mainManager = new _isolate_helper._MainManagerStub();
+      this[_nativeInitWorkerMessageHandler]();
+    }
+  }
+  [_nativeDetectEnvironment]() {
+    let isWindowDefined = _isolate_helper.globalWindow != null;
+    let isWorkerDefined = _isolate_helper.globalWorker != null;
+    this.isWorker = !isWindowDefined && dart.test(_isolate_helper.globalPostMessageDefined);
+    this.supportsWorkers = dart.test(this.isWorker) || isWorkerDefined && _isolate_helper.IsolateNatives.thisScript != null;
+    this.fromCommandLine = !isWindowDefined && !dart.test(this.isWorker);
+  }
+  [_nativeInitWorkerMessageHandler]() {
+    let func = (function(f, a) {
+      return function(e) {
+        f(a, e);
+      };
+    })(_isolate_helper.IsolateNatives._processWorkerMessage, this.mainManager);
+    _isolate_helper.global.onmessage = func;
+    _isolate_helper.global.dartPrint = _isolate_helper.global.dartPrint || (function(serialize) {
+      return function(object) {
+        var _self = _isolate_helper.global;
+        if (_self.console && _self.console.log) {
+          _self.console.log(object);
+        } else {
+          _self.postMessage(serialize(object));
+        }
+      };
+    })(_isolate_helper._Manager._serializePrintMessage);
+  }
+  static _serializePrintMessage(object) {
+    return _isolate_helper._serializeMessage(dart.map({command: "print", msg: object}, core.String, dart.dynamic));
+  }
+  maybeCloseWorker() {
+    if (dart.test(this.isWorker) && dart.test(this.isolates[dartx.isEmpty]) && this.topEventLoop[_activeJsAsyncCount] == 0) {
+      this.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'close'}, core.String, core.String)));
+    }
+  }
+};
+dart.setSignature(_isolate_helper._Manager, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Manager, [core.Function])}),
+  fields: () => ({
+    nextIsolateId: core.int,
+    currentManagerId: core.int,
+    nextManagerId: core.int,
+    currentContext: _isolate_helper._IsolateContext,
+    rootContext: _isolate_helper._IsolateContext,
+    topEventLoop: _isolate_helper._EventLoop,
+    fromCommandLine: core.bool,
+    isWorker: core.bool,
+    supportsWorkers: core.bool,
+    isolates: MapOfint$_IsolateContext(),
+    mainManager: _isolate_helper._MainManagerStub,
+    managers: MapOfint$dynamic(),
+    entry: core.Function
+  }),
+  getters: () => ({useWorkers: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({
+    [_nativeDetectEnvironment]: dart.definiteFunctionType(dart.void, []),
+    [_nativeInitWorkerMessageHandler]: dart.definiteFunctionType(dart.void, []),
+    maybeCloseWorker: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({_serializePrintMessage: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
+  names: ['_serializePrintMessage']
+});
+const _scheduledControlEvents = Symbol('_scheduledControlEvents');
+const _isExecutingEvent = Symbol('_isExecutingEvent');
+const _id = Symbol('_id');
+const _updateGlobalState = Symbol('_updateGlobalState');
+const _setGlobals = Symbol('_setGlobals');
+const _addRegistration = Symbol('_addRegistration');
+const _close = Symbol('_close');
+_isolate_helper._IsolateContext = class _IsolateContext extends core.Object {
+  new() {
+    this.id = (() => {
+      let o = _isolate_helper._globalState, x = o.nextIsolateId;
+      o.nextIsolateId = dart.notNull(x) + 1;
+      return x;
+    })();
+    this.ports = MapOfint$RawReceivePortImpl().new();
+    this.weakPorts = SetOfint().new();
+    this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
+    this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
+    this.pauseCapability = isolate.Capability.new();
+    this.terminateCapability = isolate.Capability.new();
+    this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
+    this.pauseTokens = SetOfCapability().new();
+    this.errorPorts = SetOfSendPort().new();
+    this.initialized = false;
+    this.isPaused = false;
+    this.doneHandlers = null;
+    this[_scheduledControlEvents] = null;
+    this[_isExecutingEvent] = false;
+    this.errorsAreFatal = true;
+    this.registerWeak(this.controlPort[_id], this.controlPort);
+  }
+  addPause(authentification, resume) {
+    if (!dart.equals(this.pauseCapability, authentification)) return;
+    if (dart.test(this.pauseTokens.add(resume)) && !dart.test(this.isPaused)) {
+      this.isPaused = true;
+    }
+    this[_updateGlobalState]();
+  }
+  removePause(resume) {
+    if (!dart.test(this.isPaused)) return;
+    this.pauseTokens.remove(resume);
+    if (dart.test(this.pauseTokens.isEmpty)) {
+      while (dart.test(this.delayedEvents[dartx.isNotEmpty])) {
+        let event = this.delayedEvents[dartx.removeLast]();
+        _isolate_helper._globalState.topEventLoop.prequeue(event);
+      }
+      this.isPaused = false;
+    }
+    this[_updateGlobalState]();
+  }
+  addDoneListener(responsePort) {
+    if (this.doneHandlers == null) {
+      this.doneHandlers = [];
+    }
+    if (dart.test(dart.dsend(this.doneHandlers, 'contains', responsePort))) return;
+    dart.dsend(this.doneHandlers, 'add', responsePort);
+  }
+  removeDoneListener(responsePort) {
+    if (this.doneHandlers == null) return;
+    dart.dsend(this.doneHandlers, 'remove', responsePort);
+  }
+  setErrorsFatal(authentification, errorsAreFatal) {
+    if (!dart.equals(this.terminateCapability, authentification)) return;
+    this.errorsAreFatal = errorsAreFatal;
+  }
+  handlePing(responsePort, pingType) {
+    if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      responsePort.send(null);
+      return;
+    }
+    function respond() {
+      responsePort.send(null);
+    }
+    dart.fn(respond, VoidTovoid$());
+    if (pingType == isolate.Isolate.AS_EVENT) {
+      _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
+      return;
+    }
+    dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
+    if (this[_scheduledControlEvents] == null) {
+      this[_scheduledControlEvents] = collection.Queue.new();
+    }
+    dart.dsend(this[_scheduledControlEvents], 'addLast', respond);
+  }
+  handleKill(authentification, priority) {
+    if (!dart.equals(this.terminateCapability, authentification)) return;
+    if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      this.kill();
+      return;
+    }
+    if (priority == isolate.Isolate.AS_EVENT) {
+      _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
+      return;
+    }
+    dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
+    if (this[_scheduledControlEvents] == null) {
+      this[_scheduledControlEvents] = collection.Queue.new();
+    }
+    dart.dsend(this[_scheduledControlEvents], 'addLast', dart.bind(this, 'kill'));
+  }
+  addErrorListener(port) {
+    this.errorPorts.add(port);
+  }
+  removeErrorListener(port) {
+    this.errorPorts.remove(port);
+  }
+  handleUncaughtError(error, stackTrace) {
+    if (dart.test(this.errorPorts.isEmpty)) {
+      if (dart.test(this.errorsAreFatal) && core.identical(this, _isolate_helper._globalState.rootContext)) {
+        return;
+      }
+      if (_isolate_helper.global.console && _isolate_helper.global.console.error) {
+        _isolate_helper.global.console.error(error, stackTrace);
+      } else {
+        core.print(error);
+        if (stackTrace != null) core.print(stackTrace);
+      }
+      return;
+    }
+    let message = core.List.new(2);
+    message[dartx._set](0, dart.toString(error));
+    message[dartx._set](1, stackTrace == null ? null : dart.toString(stackTrace));
+    for (let port of this.errorPorts)
+      port.send(message);
+  }
+  eval(code) {
+    let old = _isolate_helper._globalState.currentContext;
+    _isolate_helper._globalState.currentContext = this;
+    this[_setGlobals]();
+    let result = null;
+    this[_isExecutingEvent] = true;
+    try {
+      result = dart.dcall(code);
+    } catch (e) {
+      let s = dart.stackTrace(e);
+      this.handleUncaughtError(e, s);
+      if (dart.test(this.errorsAreFatal)) {
+        this.kill();
+        if (core.identical(this, _isolate_helper._globalState.rootContext)) {
+          throw e;
         }
       }
     }
-    ['=='](other) {
-      return _isolate_helper._WorkerSendPort.is(other) && this[_workerId] == other[_workerId] && this[_isolateId] == other[_isolateId] && this[_receivePortId] == other[_receivePortId];
+ finally {
+      this[_isExecutingEvent] = false;
+      _isolate_helper._globalState.currentContext = old;
+      if (old != null) old[_setGlobals]();
+      if (this[_scheduledControlEvents] != null) {
+        while (dart.test(dart.dload(this[_scheduledControlEvents], 'isNotEmpty'))) {
+          dart.dcall(dart.dsend(this[_scheduledControlEvents], 'removeFirst'));
+        }
+      }
     }
-    get hashCode() {
-      return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
+    return result;
+  }
+  [_setGlobals]() {
+    _foreign_helper.JS_SET_CURRENT_ISOLATE(this.isolateStatics);
+  }
+  handleControlMessage(message) {
+    switch (dart.dindex(message, 0)) {
+      case "pause":
+      {
+        this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
+        break;
+      }
+      case "resume":
+      {
+        this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
+        break;
+      }
+      case 'add-ondone':
+      {
+        this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        break;
+      }
+      case 'remove-ondone':
+      {
+        this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        break;
+      }
+      case 'set-errors-fatal':
+      {
+        this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
+        break;
+      }
+      case "ping":
+      {
+        this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        break;
+      }
+      case "kill":
+      {
+        this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        break;
+      }
+      case "getErrors":
+      {
+        this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        break;
+      }
+      case "stopErrors":
+      {
+        this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        break;
+      }
+      default:
     }
-  };
-  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
-  dart.setSignature(_isolate_helper._WorkerSendPort, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._WorkerSendPort, [core.int, core.int, core.int])}),
-    fields: () => ({
-      [_workerId]: core.int,
-      [_receivePortId]: core.int
-    }),
-    methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
-  });
-  const _handler = Symbol('_handler');
-  _isolate_helper.RawReceivePortImpl = class RawReceivePortImpl extends core.Object {
-    new(handler) {
-      this[_handler] = handler;
-      this[_id] = (() => {
-        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
-        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
-        return x;
+  }
+  lookup(portId) {
+    return this.ports[dartx._get](portId);
+  }
+  [_addRegistration](portId, port) {
+    if (dart.test(this.ports[dartx.containsKey](portId))) {
+      dart.throw(core.Exception.new("Registry: ports must be registered only once."));
+    }
+    this.ports[dartx._set](portId, port);
+  }
+  register(portId, port) {
+    this[_addRegistration](portId, port);
+    this[_updateGlobalState]();
+  }
+  registerWeak(portId, port) {
+    this.weakPorts.add(portId);
+    this[_addRegistration](portId, port);
+  }
+  [_updateGlobalState]() {
+    if (dart.notNull(this.ports[dartx.length]) - dart.notNull(this.weakPorts.length) > 0 || dart.test(this.isPaused) || !dart.test(this.initialized)) {
+      _isolate_helper._globalState.isolates[dartx._set](this.id, this);
+    } else {
+      this.kill();
+    }
+  }
+  kill() {
+    if (this[_scheduledControlEvents] != null) {
+      dart.dsend(this[_scheduledControlEvents], 'clear');
+    }
+    for (let port of this.ports[dartx.values]) {
+      port[_close]();
+    }
+    this.ports[dartx.clear]();
+    this.weakPorts.clear();
+    _isolate_helper._globalState.isolates[dartx.remove](this.id);
+    this.errorPorts.clear();
+    if (this.doneHandlers != null) {
+      for (let port of core.Iterable._check(this.doneHandlers)) {
+        isolate.SendPort._check(port);
+        port.send(null);
+      }
+      this.doneHandlers = null;
+    }
+  }
+  unregister(portId) {
+    this.ports[dartx.remove](portId);
+    this.weakPorts.remove(portId);
+    this[_updateGlobalState]();
+  }
+};
+_isolate_helper._IsolateContext[dart.implements] = () => [_foreign_helper.IsolateContext];
+dart.setSignature(_isolate_helper._IsolateContext, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateContext, [])}),
+  fields: () => ({
+    id: core.int,
+    ports: MapOfint$RawReceivePortImpl(),
+    weakPorts: SetOfint(),
+    isolateStatics: dart.dynamic,
+    controlPort: _isolate_helper.RawReceivePortImpl,
+    pauseCapability: isolate.Capability,
+    terminateCapability: isolate.Capability,
+    initialized: core.bool,
+    isPaused: core.bool,
+    delayedEvents: ListOf_IsolateEvent(),
+    pauseTokens: SetOfCapability(),
+    doneHandlers: dart.dynamic,
+    [_scheduledControlEvents]: dart.dynamic,
+    [_isExecutingEvent]: core.bool,
+    errorsAreFatal: core.bool,
+    errorPorts: SetOfSendPort()
+  }),
+  methods: () => ({
+    addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
+    removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
+    addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
+    handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
+    handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
+    eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
+    [_setGlobals]: dart.definiteFunctionType(dart.void, []),
+    handleControlMessage: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    lookup: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.int]),
+    [_addRegistration]: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
+    register: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
+    registerWeak: dart.definiteFunctionType(dart.void, [core.int, _isolate_helper.RawReceivePortImpl]),
+    [_updateGlobalState]: dart.definiteFunctionType(dart.void, []),
+    kill: dart.definiteFunctionType(dart.void, []),
+    unregister: dart.definiteFunctionType(dart.void, [core.int])
+  })
+});
+const _runHelper = Symbol('_runHelper');
+_isolate_helper._EventLoop = class _EventLoop extends core.Object {
+  new() {
+    this.events = QueueOf_IsolateEvent().new();
+    this[_activeJsAsyncCount] = 0;
+  }
+  enqueue(isolate, fn, msg) {
+    this.events.addLast(new _isolate_helper._IsolateEvent(_isolate_helper._IsolateContext._check(isolate), core.Function._check(fn), core.String._check(msg)));
+  }
+  prequeue(event) {
+    this.events.addFirst(event);
+  }
+  dequeue() {
+    if (dart.test(this.events.isEmpty)) return null;
+    return this.events.removeFirst();
+  }
+  checkOpenReceivePortsFromCommandLine() {
+    if (_isolate_helper._globalState.rootContext != null && dart.test(_isolate_helper._globalState.isolates[dartx.containsKey](_isolate_helper._globalState.rootContext.id)) && dart.test(_isolate_helper._globalState.fromCommandLine) && dart.test(_isolate_helper._globalState.rootContext.ports[dartx.isEmpty])) {
+      dart.throw(core.Exception.new("Program exited with open ReceivePorts."));
+    }
+  }
+  runIteration() {
+    let event = this.dequeue();
+    if (event == null) {
+      this.checkOpenReceivePortsFromCommandLine();
+      _isolate_helper._globalState.maybeCloseWorker();
+      return false;
+    }
+    event.process();
+    return true;
+  }
+  [_runHelper]() {
+    if (_isolate_helper.globalWindow != null) {
+      const next = (function() {
+        if (!dart.test(this.runIteration())) return;
+        async.Timer.run(next);
+      }).bind(this);
+      dart.fn(next, VoidToNull());
+      next();
+    } else {
+      while (dart.test(this.runIteration())) {
+      }
+    }
+  }
+  run() {
+    if (!dart.test(_isolate_helper._globalState.isWorker)) {
+      this[_runHelper]();
+    } else {
+      try {
+        this[_runHelper]();
+      } catch (e) {
+        let trace = dart.stackTrace(e);
+        _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'error', msg: dart.str`${e}\n${trace}`}, core.String, core.String)));
+      }
+
+    }
+  }
+};
+dart.setSignature(_isolate_helper._EventLoop, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._EventLoop, [])}),
+  fields: () => ({
+    events: QueueOf_IsolateEvent(),
+    [_activeJsAsyncCount]: core.int
+  }),
+  methods: () => ({
+    enqueue: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    prequeue: dart.definiteFunctionType(dart.void, [_isolate_helper._IsolateEvent]),
+    dequeue: dart.definiteFunctionType(_isolate_helper._IsolateEvent, []),
+    checkOpenReceivePortsFromCommandLine: dart.definiteFunctionType(dart.void, []),
+    runIteration: dart.definiteFunctionType(core.bool, []),
+    [_runHelper]: dart.definiteFunctionType(dart.void, []),
+    run: dart.definiteFunctionType(dart.void, [])
+  })
+});
+_isolate_helper._IsolateEvent = class _IsolateEvent extends core.Object {
+  new(isolate, fn, message) {
+    this.isolate = isolate;
+    this.fn = fn;
+    this.message = message;
+  }
+  process() {
+    if (dart.test(this.isolate.isPaused)) {
+      this.isolate.delayedEvents[dartx.add](this);
+      return;
+    }
+    this.isolate.eval(this.fn);
+  }
+};
+dart.setSignature(_isolate_helper._IsolateEvent, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._IsolateEvent, [_isolate_helper._IsolateContext, core.Function, core.String])}),
+  fields: () => ({
+    isolate: _isolate_helper._IsolateContext,
+    fn: core.Function,
+    message: core.String
+  }),
+  methods: () => ({process: dart.definiteFunctionType(dart.void, [])})
+});
+dart.defineLazy(_isolate_helper, {
+  get global() {
+    return typeof global == 'undefined' ? self : global;
+  }
+});
+_isolate_helper._MainManagerStub = class _MainManagerStub extends core.Object {
+  postMessage(msg) {
+    _isolate_helper.global.postMessage(msg);
+  }
+};
+dart.setSignature(_isolate_helper._MainManagerStub, {
+  methods: () => ({postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+});
+_isolate_helper._SPAWNED_SIGNAL = "spawned";
+_isolate_helper._SPAWN_FAILED_SIGNAL = "spawn failed";
+dart.copyProperties(_isolate_helper, {
+  get globalWindow() {
+    return _isolate_helper.global.window;
+  }
+});
+dart.copyProperties(_isolate_helper, {
+  get globalWorker() {
+    return _isolate_helper.global.Worker;
+  }
+});
+dart.copyProperties(_isolate_helper, {
+  get globalPostMessageDefined() {
+    return !!_isolate_helper.global.postMessage;
+  }
+});
+_isolate_helper._MainFunction = dart.typedef('_MainFunction', () => dart.functionType(dart.dynamic, []));
+_isolate_helper._MainFunctionArgs = dart.typedef('_MainFunctionArgs', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+_isolate_helper._MainFunctionArgsMessage = dart.typedef('_MainFunctionArgsMessage', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
+_isolate_helper.IsolateNatives = class IsolateNatives extends core.Object {
+  static computeThisScript() {
+    let currentScript = document.currentScript;
+    if (currentScript != null) {
+      return String(currentScript.src);
+    }
+    if (dart.test(_js_helper.Primitives.isD8)) return _isolate_helper.IsolateNatives.computeThisScriptD8();
+    if (dart.test(_js_helper.Primitives.isJsshell)) return _isolate_helper.IsolateNatives.computeThisScriptJsshell();
+    if (_isolate_helper._globalState != null && dart.test(_isolate_helper._globalState.isWorker)) {
+      return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
+    }
+    return null;
+  }
+  static computeThisScriptJsshell() {
+    return thisFilename();
+  }
+  static computeThisScriptD8() {
+    return _isolate_helper.IsolateNatives.computeThisScriptFromTrace();
+  }
+  static computeThisScriptFromTrace() {
+    let stack = new Error().stack;
+    if (stack == null) {
+      stack = (function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+
       })();
-      this[_isClosed] = false;
-      _isolate_helper._globalState.currentContext.register(this[_id], this);
+      if (stack == null) dart.throw(new core.UnsupportedError('No stack trace'));
     }
-    weak(handler) {
-      this[_handler] = handler;
-      this[_id] = (() => {
-        let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
-        _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
-        return x;
-      })();
-      this[_isClosed] = false;
-      _isolate_helper._globalState.currentContext.registerWeak(this[_id], this);
-    }
-    _controlPort() {
-      this[_handler] = null;
-      this[_id] = 0;
-      this[_isClosed] = false;
-    }
-    set handler(newHandler) {
-      this[_handler] = newHandler;
-    }
-    [_close]() {
-      this[_isClosed] = true;
-      this[_handler] = null;
-    }
-    close() {
-      if (dart.test(this[_isClosed])) return;
-      this[_isClosed] = true;
-      this[_handler] = null;
-      _isolate_helper._globalState.currentContext.unregister(this[_id]);
-    }
-    [_add](dataEvent) {
-      if (dart.test(this[_isClosed])) return;
-      dart.dcall(this[_handler], dataEvent);
-    }
-    get sendPort() {
-      return new _isolate_helper._NativeJsSendPort(this, _isolate_helper._globalState.currentContext.id);
-    }
-  };
-  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
-  dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
-  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
-  dart.setSignature(_isolate_helper.RawReceivePortImpl, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
-      weak: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
-      _controlPort: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [])
-    }),
-    fields: () => ({
-      [_id]: core.int,
-      [_handler]: core.Function,
-      [_isClosed]: core.bool
-    }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
-    setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
-    methods: () => ({
-      [_close]: dart.definiteFunctionType(dart.void, []),
-      close: dart.definiteFunctionType(dart.void, []),
-      [_add]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    sfields: () => ({_nextFreeId: core.int})
-  });
-  _isolate_helper.RawReceivePortImpl._nextFreeId = 1;
-  const _rawPort = Symbol('_rawPort');
-  const _controller = Symbol('_controller');
-  const _add$ = Symbol('_add');
-  const _closeUnchecked = Symbol('_closeUnchecked');
-  const _addError = Symbol('_addError');
-  const _completeError = Symbol('_completeError');
-  const _complete = Symbol('_complete');
-  const _sink = Symbol('_sink');
-  async.Stream$ = dart.generic(T => {
-    let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
-    let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
-    let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
-    let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
-    let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
-    let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
-    let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
-    let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
-    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
-    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
-    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
-    let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
-    let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
-    let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
-    let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
-    let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
-    let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
-    let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
-    let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
-    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
-    let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
-    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-    let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
-    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
-    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
-    let IterableOfFutureOfT = () => (IterableOfFutureOfT = dart.constFn(core.Iterable$(FutureOfT())))();
-    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
-    let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
-    let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
-    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
-    let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
-    let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
-    let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
-    class Stream extends core.Object {
-      new() {
+    let pattern = null, matches = null;
+    pattern = new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m");
+    matches = stack.match(pattern);
+    if (matches != null) return matches[1];
+    pattern = new RegExp("^[^@]*@(.*):[0-9]*$", "m");
+    matches = stack.match(pattern);
+    if (matches != null) return matches[1];
+    dart.throw(new core.UnsupportedError(dart.str`Cannot extract URI from "${stack}"`));
+  }
+  static _getEventData(e) {
+    return e.data;
+  }
+  static _processWorkerMessage(sender, e) {
+    let msg = _isolate_helper._deserializeMessage(_isolate_helper.IsolateNatives._getEventData(e));
+    switch (dart.dindex(msg, 'command')) {
+      case 'start':
+      {
+        _isolate_helper._globalState.currentManagerId = core.int._check(dart.dindex(msg, 'id'));
+        let functionName = core.String._check(dart.dindex(msg, 'functionName'));
+        let entryPoint = core.Function._check(functionName == null ? _isolate_helper._globalState.entry : _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName));
+        let args = dart.dindex(msg, 'args');
+        let message = _isolate_helper._deserializeMessage(dart.dindex(msg, 'msg'));
+        let isSpawnUri = dart.dindex(msg, 'isSpawnUri');
+        let startPaused = dart.dindex(msg, 'startPaused');
+        let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
+        let context = new _isolate_helper._IsolateContext();
+        _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
+          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
+        }, VoidToNull()), 'worker-start');
+        _isolate_helper._globalState.currentContext = context;
+        _isolate_helper._globalState.topEventLoop.run();
+        break;
       }
-      _internal() {
+      case 'spawn-worker':
+      {
+        if (_isolate_helper.IsolateNatives.enableSpawnWorker != null) _isolate_helper.IsolateNatives.handleSpawnWorkerRequest(msg);
+        break;
       }
-      static empty() {
-        return new (_EmptyStreamOfT())();
+      case 'message':
+      {
+        let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
+        if (port != null) {
+          dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
+        }
+        _isolate_helper._globalState.topEventLoop.run();
+        break;
       }
-      static fromFuture(future) {
-        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
-        future.then(dart.dynamic)(dart.fn(value => {
-          controller[_add$](value);
+      case 'close':
+      {
+        _isolate_helper._globalState.managers[dartx.remove](_isolate_helper.IsolateNatives.workerIds._get(sender));
+        sender.terminate();
+        _isolate_helper._globalState.topEventLoop.run();
+        break;
+      }
+      case 'log':
+      {
+        _isolate_helper.IsolateNatives._log(dart.dindex(msg, 'msg'));
+        break;
+      }
+      case 'print':
+      {
+        if (dart.test(_isolate_helper._globalState.isWorker)) {
+          _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'print', msg: msg}, core.String, dart.dynamic)));
+        } else {
+          core.print(dart.dindex(msg, 'msg'));
+        }
+        break;
+      }
+      case 'error':
+      {
+        dart.throw(dart.dindex(msg, 'msg'));
+      }
+    }
+  }
+  static handleSpawnWorkerRequest(msg) {
+    let replyPort = dart.dindex(msg, 'replyPort');
+    _isolate_helper.IsolateNatives.spawn(core.String._check(dart.dindex(msg, 'functionName')), core.String._check(dart.dindex(msg, 'uri')), ListOfString()._check(dart.dindex(msg, 'args')), dart.dindex(msg, 'msg'), false, core.bool._check(dart.dindex(msg, 'isSpawnUri')), core.bool._check(dart.dindex(msg, 'startPaused'))).then(dart.dynamic)(dart.fn(msg => {
+      dart.dsend(replyPort, 'send', msg);
+    }, ListToNull()), {onError: dart.fn(errorMessage => {
+        dart.dsend(replyPort, 'send', JSArrayOfString().of([_isolate_helper._SPAWN_FAILED_SIGNAL, errorMessage]));
+      }, StringToNull())});
+  }
+  static _log(msg) {
+    if (dart.test(_isolate_helper._globalState.isWorker)) {
+      _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'log', msg: msg}, core.String, dart.dynamic)));
+    } else {
+      try {
+        _isolate_helper.IsolateNatives._consoleLog(msg);
+      } catch (e) {
+        let trace = dart.stackTrace(e);
+        dart.throw(core.Exception.new(trace));
+      }
+
+    }
+  }
+  static _consoleLog(msg) {
+    _isolate_helper.global.console.log(msg);
+  }
+  static _getJSFunctionFromName(functionName) {
+    let globalFunctionsContainer = _foreign_helper.JS_EMBEDDED_GLOBAL("", _js_embedded_names.GLOBAL_FUNCTIONS);
+    return globalFunctionsContainer[functionName]();
+  }
+  static _getJSFunctionName(f) {
+    return f.$name;
+  }
+  static _allocate(ctor) {
+    return new ctor();
+  }
+  static spawnFunction(topLevelFunction, message, startPaused) {
+    _isolate_helper.IsolateNatives.enableSpawnWorker = true;
+    let name = _isolate_helper.IsolateNatives._getJSFunctionName(topLevelFunction);
+    if (name == null) {
+      dart.throw(new core.UnsupportedError("only top-level functions can be spawned."));
+    }
+    let isLight = false;
+    let isSpawnUri = false;
+    return _isolate_helper.IsolateNatives.spawn(name, null, null, message, isLight, isSpawnUri, startPaused);
+  }
+  static spawnUri(uri, args, message, startPaused) {
+    _isolate_helper.IsolateNatives.enableSpawnWorker = true;
+    let isLight = false;
+    let isSpawnUri = true;
+    return _isolate_helper.IsolateNatives.spawn(null, dart.toString(uri), args, message, isLight, isSpawnUri, startPaused);
+  }
+  static spawn(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
+    if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
+      uri = dart.notNull(uri) + ".js";
+    }
+    let port = isolate.ReceivePort.new();
+    let completer = CompleterOfList().new();
+    port.first.then(dart.dynamic)(dart.fn(msg => {
+      if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
+        completer.complete(msg);
+      } else {
+        dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
+        completer.completeError(dart.dindex(msg, 1));
+      }
+    }, dynamicToNull$()));
+    let signalReply = port.sendPort;
+    if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
+      _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
+    } else {
+      _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
+    }
+    return completer.future;
+  }
+  static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
+    if (args != null) args = ListOfString().from(args);
+    if (dart.test(_isolate_helper._globalState.isWorker)) {
+      _isolate_helper._globalState.mainManager.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort}, core.String, core.Object)));
+    } else {
+      _isolate_helper.IsolateNatives._spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError);
+    }
+  }
+  static _startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
+    if (uri != null) {
+      dart.throw(new core.UnsupportedError("Currently spawnUri is not supported without web workers."));
+    }
+    message = _isolate_helper._clone(message);
+    if (args != null) args = ListOfString().from(args);
+    _isolate_helper._globalState.topEventLoop.enqueue(new _isolate_helper._IsolateContext(), dart.fn(() => {
+      let func = _isolate_helper.IsolateNatives._getJSFunctionFromName(functionName);
+      _isolate_helper.IsolateNatives._startIsolate(core.Function._check(func), args, message, isSpawnUri, startPaused, replyPort);
+    }, VoidToNull()), 'nonworker start');
+  }
+  static get currentIsolate() {
+    let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
+    return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
+  }
+  static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
+    _js_helper.Primitives.initializeStatics(context.id);
+    replyTo.send(JSArrayOfObject().of([_isolate_helper._SPAWNED_SIGNAL, context.controlPort.sendPort, context.pauseCapability, context.terminateCapability]));
+    function runStartFunction() {
+      context.initialized = true;
+      if (!dart.test(isSpawnUri)) {
+        dart.dcall(topLevel, message);
+      } else if (_isolate_helper._MainFunctionArgsMessage.is(topLevel)) {
+        dart.dcall(topLevel, args, message);
+      } else if (_isolate_helper._MainFunctionArgs.is(topLevel)) {
+        dart.dcall(topLevel, args);
+      } else {
+        dart.dcall(topLevel);
+      }
+    }
+    dart.fn(runStartFunction, VoidTovoid$());
+    if (dart.test(startPaused)) {
+      context.addPause(context.pauseCapability, context.pauseCapability);
+      _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
+    } else {
+      runStartFunction();
+    }
+  }
+  static _spawnWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
+    if (uri == null) uri = _isolate_helper.IsolateNatives.thisScript;
+    let worker = new Worker(uri);
+    let onerrorTrampoline = (function(f, u, c) {
+      return function(e) {
+        return f(e, u, c);
+      };
+    })(_isolate_helper.IsolateNatives.workerOnError, uri, onError);
+    worker.onerror = onerrorTrampoline;
+    let processWorkerMessageTrampoline = (function(f, a) {
+      return function(e) {
+        e.onerror = null;
+        return f(a, e);
+      };
+    })(_isolate_helper.IsolateNatives._processWorkerMessage, worker);
+    worker.onmessage = processWorkerMessageTrampoline;
+    let o = _isolate_helper._globalState;
+    let workerId = o.nextManagerId;
+    o.nextManagerId = dart.notNull(workerId) + 1;
+    _isolate_helper.IsolateNatives.workerIds._set(worker, workerId);
+    _isolate_helper._globalState.managers[dartx._set](workerId, worker);
+    worker.postMessage(_isolate_helper._serializeMessage(dart.map({command: 'start', id: workerId, replyTo: _isolate_helper._serializeMessage(replyPort), args: args, msg: _isolate_helper._serializeMessage(message), isSpawnUri: isSpawnUri, startPaused: startPaused, functionName: functionName}, core.String, core.Object)));
+  }
+  static workerOnError(event, uri, onError) {
+    event.preventDefault();
+    let message = event.message;
+    if (message == null) {
+      message = dart.str`Error spawning worker for ${uri}`;
+    } else {
+      message = dart.str`Error spawning worker for ${uri} (${message})`;
+    }
+    onError(message);
+    return true;
+  }
+};
+dart.setSignature(_isolate_helper.IsolateNatives, {
+  sfields: () => ({
+    enableSpawnWorker: dart.dynamic,
+    thisScript: core.String,
+    workerIds: ExpandoOfint()
+  }),
+  sgetters: () => ({currentIsolate: dart.definiteFunctionType(isolate.Isolate, [])}),
+  statics: () => ({
+    computeThisScript: dart.definiteFunctionType(core.String, []),
+    computeThisScriptJsshell: dart.definiteFunctionType(core.String, []),
+    computeThisScriptD8: dart.definiteFunctionType(core.String, []),
+    computeThisScriptFromTrace: dart.definiteFunctionType(core.String, []),
+    _getEventData: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _processWorkerMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    handleSpawnWorkerRequest: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _log: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _consoleLog: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    _getJSFunctionFromName: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _getJSFunctionName: dart.definiteFunctionType(core.String, [core.Function]),
+    _allocate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
+    spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
+    spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
+    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
+    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
+    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+    workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
+  }),
+  names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
+});
+_isolate_helper.IsolateNatives.enableSpawnWorker = null;
+dart.defineLazy(_isolate_helper.IsolateNatives, {
+  get thisScript() {
+    return _isolate_helper.IsolateNatives.computeThisScript();
+  },
+  set thisScript(_) {},
+  get workerIds() {
+    return new (ExpandoOfint())();
+  }
+});
+const _isolateId = Symbol('_isolateId');
+const _checkReplyTo = Symbol('_checkReplyTo');
+_isolate_helper._BaseSendPort = class _BaseSendPort extends core.Object {
+  new(isolateId) {
+    this[_isolateId] = isolateId;
+  }
+  [_checkReplyTo](replyTo) {
+    if (replyTo != null && !_isolate_helper._NativeJsSendPort.is(replyTo) && !_isolate_helper._WorkerSendPort.is(replyTo)) {
+      dart.throw(core.Exception.new("SendPort.send: Illegal replyTo port type"));
+    }
+  }
+};
+_isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
+dart.setSignature(_isolate_helper._BaseSendPort, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._BaseSendPort, [core.int])}),
+  fields: () => ({[_isolateId]: core.int}),
+  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
+});
+const _receivePort = Symbol('_receivePort');
+const _isClosed = Symbol('_isClosed');
+const _add = Symbol('_add');
+_isolate_helper._NativeJsSendPort = class _NativeJsSendPort extends _isolate_helper._BaseSendPort {
+  new(receivePort, isolateId) {
+    this[_receivePort] = receivePort;
+    super.new(isolateId);
+  }
+  send(message) {
+    let isolate = _isolate_helper._globalState.isolates[dartx._get](this[_isolateId]);
+    if (isolate == null) return;
+    if (dart.test(this[_receivePort][_isClosed])) return;
+    let msg = _isolate_helper._clone(message);
+    if (dart.equals(isolate.controlPort, this[_receivePort])) {
+      isolate.handleControlMessage(msg);
+      return;
+    }
+    _isolate_helper._globalState.topEventLoop.enqueue(isolate, dart.fn(() => {
+      if (!dart.test(this[_receivePort][_isClosed])) {
+        this[_receivePort][_add](msg);
+      }
+    }, VoidToNull()), dart.str`receive ${message}`);
+  }
+  ['=='](other) {
+    return _isolate_helper._NativeJsSendPort.is(other) && dart.equals(this[_receivePort], other[_receivePort]);
+  }
+  get hashCode() {
+    return this[_receivePort][_id];
+  }
+};
+_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
+dart.setSignature(_isolate_helper._NativeJsSendPort, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._NativeJsSendPort, [_isolate_helper.RawReceivePortImpl, core.int])}),
+  fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
+  methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+});
+const _workerId = Symbol('_workerId');
+const _receivePortId = Symbol('_receivePortId');
+_isolate_helper._WorkerSendPort = class _WorkerSendPort extends _isolate_helper._BaseSendPort {
+  new(workerId, isolateId, receivePortId) {
+    this[_workerId] = workerId;
+    this[_receivePortId] = receivePortId;
+    super.new(isolateId);
+  }
+  send(message) {
+    let workerMessage = _isolate_helper._serializeMessage(dart.map({command: 'message', port: this, msg: message}, core.String, core.Object));
+    if (dart.test(_isolate_helper._globalState.isWorker)) {
+      _isolate_helper._globalState.mainManager.postMessage(workerMessage);
+    } else {
+      let manager = _isolate_helper._globalState.managers[dartx._get](this[_workerId]);
+      if (manager != null) {
+        manager.postMessage(workerMessage);
+      }
+    }
+  }
+  ['=='](other) {
+    return _isolate_helper._WorkerSendPort.is(other) && this[_workerId] == other[_workerId] && this[_isolateId] == other[_isolateId] && this[_receivePortId] == other[_receivePortId];
+  }
+  get hashCode() {
+    return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
+  }
+};
+_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
+dart.setSignature(_isolate_helper._WorkerSendPort, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._WorkerSendPort, [core.int, core.int, core.int])}),
+  fields: () => ({
+    [_workerId]: core.int,
+    [_receivePortId]: core.int
+  }),
+  methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+});
+const _handler = Symbol('_handler');
+_isolate_helper.RawReceivePortImpl = class RawReceivePortImpl extends core.Object {
+  new(handler) {
+    this[_handler] = handler;
+    this[_id] = (() => {
+      let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
+      _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
+      return x;
+    })();
+    this[_isClosed] = false;
+    _isolate_helper._globalState.currentContext.register(this[_id], this);
+  }
+  weak(handler) {
+    this[_handler] = handler;
+    this[_id] = (() => {
+      let x = _isolate_helper.RawReceivePortImpl._nextFreeId;
+      _isolate_helper.RawReceivePortImpl._nextFreeId = dart.notNull(x) + 1;
+      return x;
+    })();
+    this[_isClosed] = false;
+    _isolate_helper._globalState.currentContext.registerWeak(this[_id], this);
+  }
+  _controlPort() {
+    this[_handler] = null;
+    this[_id] = 0;
+    this[_isClosed] = false;
+  }
+  set handler(newHandler) {
+    this[_handler] = newHandler;
+  }
+  [_close]() {
+    this[_isClosed] = true;
+    this[_handler] = null;
+  }
+  close() {
+    if (dart.test(this[_isClosed])) return;
+    this[_isClosed] = true;
+    this[_handler] = null;
+    _isolate_helper._globalState.currentContext.unregister(this[_id]);
+  }
+  [_add](dataEvent) {
+    if (dart.test(this[_isClosed])) return;
+    dart.dcall(this[_handler], dataEvent);
+  }
+  get sendPort() {
+    return new _isolate_helper._NativeJsSendPort(this, _isolate_helper._globalState.currentContext.id);
+  }
+};
+dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
+dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
+_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
+dart.setSignature(_isolate_helper.RawReceivePortImpl, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
+    weak: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [core.Function]),
+    _controlPort: dart.definiteFunctionType(_isolate_helper.RawReceivePortImpl, [])
+  }),
+  fields: () => ({
+    [_id]: core.int,
+    [_handler]: core.Function,
+    [_isClosed]: core.bool
+  }),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
+  methods: () => ({
+    [_close]: dart.definiteFunctionType(dart.void, []),
+    close: dart.definiteFunctionType(dart.void, []),
+    [_add]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  sfields: () => ({_nextFreeId: core.int})
+});
+_isolate_helper.RawReceivePortImpl._nextFreeId = 1;
+const _rawPort = Symbol('_rawPort');
+const _controller = Symbol('_controller');
+const _add$ = Symbol('_add');
+const _closeUnchecked = Symbol('_closeUnchecked');
+const _addError = Symbol('_addError');
+const _completeError = Symbol('_completeError');
+const _complete = Symbol('_complete');
+const _sink = Symbol('_sink');
+async.Stream$ = dart.generic(T => {
+  let _EmptyStreamOfT = () => (_EmptyStreamOfT = dart.constFn(async._EmptyStream$(T)))();
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
+  let _GeneratedStreamImplOfT = () => (_GeneratedStreamImplOfT = dart.constFn(async._GeneratedStreamImpl$(T)))();
+  let _IterablePendingEventsOfT = () => (_IterablePendingEventsOfT = dart.constFn(async._IterablePendingEvents$(T)))();
+  let _BoundSinkStreamOfdynamic$T = () => (_BoundSinkStreamOfdynamic$T = dart.constFn(async._BoundSinkStream$(dart.dynamic, T)))();
+  let _AsBroadcastStreamOfT = () => (_AsBroadcastStreamOfT = dart.constFn(async._AsBroadcastStream$(T)))();
+  let _WhereStreamOfT = () => (_WhereStreamOfT = dart.constFn(async._WhereStream$(T)))();
+  let _HandleErrorStreamOfT = () => (_HandleErrorStreamOfT = dart.constFn(async._HandleErrorStream$(T)))();
+  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
+  let TAndTToT = () => (TAndTToT = dart.constFn(dart.functionType(T, [T, T])))();
+  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
+  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
+  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
+  let _FutureOfListOfT = () => (_FutureOfListOfT = dart.constFn(async._Future$(ListOfT())))();
+  let SetOfT = () => (SetOfT = dart.constFn(core.Set$(T)))();
+  let _FutureOfSetOfT = () => (_FutureOfSetOfT = dart.constFn(async._Future$(SetOfT())))();
+  let _TakeStreamOfT = () => (_TakeStreamOfT = dart.constFn(async._TakeStream$(T)))();
+  let _TakeWhileStreamOfT = () => (_TakeWhileStreamOfT = dart.constFn(async._TakeWhileStream$(T)))();
+  let _SkipStreamOfT = () => (_SkipStreamOfT = dart.constFn(async._SkipStream$(T)))();
+  let _SkipWhileStreamOfT = () => (_SkipWhileStreamOfT = dart.constFn(async._SkipWhileStream$(T)))();
+  let _DistinctStreamOfT = () => (_DistinctStreamOfT = dart.constFn(async._DistinctStream$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
+  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
+  let TTobool = () => (TTobool = dart.constFn(dart.functionType(core.bool, [T])))();
+  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
+  let TAndTTobool = () => (TAndTTobool = dart.constFn(dart.functionType(core.bool, [T, T])))();
+  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
+  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
+  let IterableOfFutureOfT = () => (IterableOfFutureOfT = dart.constFn(core.Iterable$(FutureOfT())))();
+  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
+  let intToT = () => (intToT = dart.constFn(dart.functionType(T, [core.int])))();
+  let EventSinkOfTToEventSink = () => (EventSinkOfTToEventSink = dart.constFn(dart.functionType(async.EventSink, [EventSinkOfT()])))();
+  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
+  let VoidTo_IterablePendingEventsOfT = () => (VoidTo_IterablePendingEventsOfT = dart.constFn(dart.definiteFunctionType(_IterablePendingEventsOfT(), [])))();
+  let VoidToT = () => (VoidToT = dart.constFn(dart.definiteFunctionType(T, [])))();
+  let TTovoid$ = () => (TTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [T])))();
+  class Stream extends core.Object {
+    new() {
+    }
+    _internal() {
+    }
+    static empty() {
+      return new (_EmptyStreamOfT())();
+    }
+    static fromFuture(future) {
+      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
+      future.then(dart.dynamic)(dart.fn(value => {
+        controller[_add$](value);
+        controller[_closeUnchecked]();
+      }, TToNull()), {onError: dart.fn((error, stackTrace) => {
+          controller[_addError](error, core.StackTrace._check(stackTrace));
           controller[_closeUnchecked]();
-        }, TToNull()), {onError: dart.fn((error, stackTrace) => {
-            controller[_addError](error, core.StackTrace._check(stackTrace));
-            controller[_closeUnchecked]();
-          }, dynamicAnddynamicToNull())});
-        return controller.stream;
-      }
-      static fromFutures(futures) {
-        let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
-        let count = 0;
-        let onValue = dart.fn(value => {
-          if (!dart.test(controller.isClosed)) {
-            controller[_add$](value);
-            if (--count == 0) controller[_closeUnchecked]();
-          }
-        }, TToNull());
-        let onError = dart.fn((error, stack) => {
-          if (!dart.test(controller.isClosed)) {
-            controller[_addError](error, core.StackTrace._check(stack));
-            if (--count == 0) controller[_closeUnchecked]();
-          }
-        }, dynamicAnddynamicToNull());
-        for (let future of futures) {
-          count++;
-          future.then(dart.dynamic)(onValue, {onError: onError});
+        }, dynamicAnddynamicToNull())});
+      return controller.stream;
+    }
+    static fromFutures(futures) {
+      let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
+      let count = 0;
+      let onValue = dart.fn(value => {
+        if (!dart.test(controller.isClosed)) {
+          controller[_add$](value);
+          if (--count == 0) controller[_closeUnchecked]();
         }
-        if (count == 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
-        return controller.stream;
+      }, TToNull());
+      let onError = dart.fn((error, stack) => {
+        if (!dart.test(controller.isClosed)) {
+          controller[_addError](error, core.StackTrace._check(stack));
+          if (--count == 0) controller[_closeUnchecked]();
+        }
+      }, dynamicAnddynamicToNull());
+      for (let future of futures) {
+        count++;
+        future.then(dart.dynamic)(onValue, {onError: onError});
       }
-      static fromIterable(data) {
-        return new (_GeneratedStreamImplOfT())(dart.fn(() => new (_IterablePendingEventsOfT())(data), VoidTo_IterablePendingEventsOfT()));
+      if (count == 0) async.scheduleMicrotask(dart.bind(controller, 'close'));
+      return controller.stream;
+    }
+    static fromIterable(data) {
+      return new (_GeneratedStreamImplOfT())(dart.fn(() => new (_IterablePendingEventsOfT())(data), VoidTo_IterablePendingEventsOfT()));
+    }
+    static periodic(period, computation) {
+      if (computation === void 0) computation = null;
+      let timer = null;
+      let computationCount = 0;
+      let controller = null;
+      let watch = new core.Stopwatch();
+      function sendEvent() {
+        watch.reset();
+        let data = null;
+        if (computation != null) {
+          try {
+            data = computation(computationCount++);
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            controller.addError(e, s);
+            return;
+          }
+
+        }
+        controller.add(data);
       }
-      static periodic(period, computation) {
-        if (computation === void 0) computation = null;
-        let timer = null;
-        let computationCount = 0;
+      dart.fn(sendEvent, VoidTovoid$());
+      function startPeriodicTimer() {
+        dart.assert(timer == null);
+        timer = async.Timer.periodic(period, dart.fn(timer => {
+          sendEvent();
+        }, TimerToNull()));
+      }
+      dart.fn(startPeriodicTimer, VoidTovoid$());
+      controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
+          watch.start();
+          startPeriodicTimer();
+        }, VoidToNull()), onPause: dart.fn(() => {
+          timer.cancel();
+          timer = null;
+          watch.stop();
+        }, VoidToNull()), onResume: dart.fn(() => {
+          dart.assert(timer == null);
+          let elapsed = watch.elapsed;
+          watch.start();
+          timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
+            timer = null;
+            startPeriodicTimer();
+            sendEvent();
+          }, VoidToNull()));
+        }, VoidToNull()), onCancel: dart.fn(() => {
+          if (timer != null) timer.cancel();
+          timer = null;
+        }, VoidToNull())});
+      return controller.stream;
+    }
+    static eventTransformed(source, mapSink) {
+      return new (_BoundSinkStreamOfdynamic$T())(source, mapSink);
+    }
+    get isBroadcast() {
+      return false;
+    }
+    asBroadcastStream(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      return new (_AsBroadcastStreamOfT())(this, onListen, onCancel);
+    }
+    where(test) {
+      return new (_WhereStreamOfT())(this, test);
+    }
+    map(S) {
+      return convert => {
+        return new (async._MapStream$(T, S))(this, convert);
+      };
+    }
+    asyncMap(E) {
+      return convert => {
         let controller = null;
-        let watch = new core.Stopwatch();
-        function sendEvent() {
-          watch.reset();
-          let data = null;
-          if (computation != null) {
+        let subscription = null;
+        const onListen = (function() {
+          let add = dart.bind(controller, 'add');
+          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
+          let eventSink = async._EventSink$(E).as(controller);
+          let addError = dart.bind(eventSink, _addError);
+          subscription = this.listen(dart.fn(event => {
+            let newValue = null;
             try {
-              data = computation(computationCount++);
+              newValue = convert(event);
             } catch (e) {
               let s = dart.stackTrace(e);
               controller.addError(e, s);
               return;
             }
 
-          }
-          controller.add(data);
-        }
-        dart.fn(sendEvent, VoidTovoid$());
-        function startPeriodicTimer() {
-          dart.assert(timer == null);
-          timer = async.Timer.periodic(period, dart.fn(timer => {
-            sendEvent();
-          }, TimerToNull()));
-        }
-        dart.fn(startPeriodicTimer, VoidTovoid$());
-        controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
-            watch.start();
-            startPeriodicTimer();
-          }, VoidToNull()), onPause: dart.fn(() => {
-            timer.cancel();
-            timer = null;
-            watch.stop();
-          }, VoidToNull()), onResume: dart.fn(() => {
-            dart.assert(timer == null);
-            let elapsed = watch.elapsed;
-            watch.start();
-            timer = async.Timer.new(period['-'](elapsed), dart.fn(() => {
-              timer = null;
-              startPeriodicTimer();
-              sendEvent();
-            }, VoidToNull()));
-          }, VoidToNull()), onCancel: dart.fn(() => {
-            if (timer != null) timer.cancel();
-            timer = null;
-          }, VoidToNull())});
-        return controller.stream;
-      }
-      static eventTransformed(source, mapSink) {
-        return new (_BoundSinkStreamOfdynamic$T())(source, mapSink);
-      }
-      get isBroadcast() {
-        return false;
-      }
-      asBroadcastStream(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        return new (_AsBroadcastStreamOfT())(this, onListen, onCancel);
-      }
-      where(test) {
-        return new (_WhereStreamOfT())(this, test);
-      }
-      map(S) {
-        return convert => {
-          return new (async._MapStream$(T, S))(this, convert);
-        };
-      }
-      asyncMap(E) {
-        return convert => {
-          let controller = null;
-          let subscription = null;
-          const onListen = (function() {
-            let add = dart.bind(controller, 'add');
-            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
-            let eventSink = async._EventSink$(E).as(controller);
-            let addError = dart.bind(eventSink, _addError);
-            subscription = this.listen(dart.fn(event => {
-              let newValue = null;
-              try {
-                newValue = convert(event);
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                controller.addError(e, s);
-                return;
-              }
-
-              if (async.Future.is(newValue)) {
-                subscription.pause();
-                newValue.then(dart.void)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
-              } else {
-                controller.add(E.as(newValue));
-              }
-            }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
-          }).bind(this);
-          dart.fn(onListen, VoidTovoid$());
-          if (dart.test(this.isBroadcast)) {
-            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
-          } else {
-            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
-                subscription.pause();
-              }, VoidToNull()), onResume: dart.fn(() => {
-                subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
-          }
-          return controller.stream;
-        };
-      }
-      asyncExpand(E) {
-        return convert => {
-          let controller = null;
-          let subscription = null;
-          const onListen = (function() {
-            dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
-            let eventSink = async._EventSink$(E).as(controller);
-            subscription = this.listen(dart.fn(event => {
-              let newStream = null;
-              try {
-                newStream = convert(event);
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                controller.addError(e, s);
-                return;
-              }
-
-              if (newStream != null) {
-                subscription.pause();
-                controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
-              }
-            }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
-          }).bind(this);
-          dart.fn(onListen, VoidTovoid$());
-          if (dart.test(this.isBroadcast)) {
-            controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
-          } else {
-            controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
-                subscription.pause();
-              }, VoidToNull()), onResume: dart.fn(() => {
-                subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
-          }
-          return controller.stream;
-        };
-      }
-      handleError(onError, opts) {
-        let test = opts && 'test' in opts ? opts.test : null;
-        return new (_HandleErrorStreamOfT())(this, onError, test);
-      }
-      expand(S) {
-        return convert => {
-          return new (async._ExpandStream$(T, S))(this, convert);
-        };
-      }
-      pipe(streamConsumer) {
-        StreamConsumerOfT()._check(streamConsumer);
-        return streamConsumer.addStream(this).then(dart.dynamic)(dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
-      }
-      transform(S) {
-        return streamTransformer => {
-          async.StreamTransformer$(T, S)._check(streamTransformer);
-          return streamTransformer.bind(this);
-        };
-      }
-      reduce(combine) {
-        TAndTToT()._check(combine);
-        let result = new (_FutureOfT())();
-        let seenFirst = false;
-        let value = null;
-        let subscription = null;
-        subscription = this.listen(dart.fn(element => {
-          if (seenFirst) {
-            async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
-              value = newValue;
-            }, TToNull()), async._cancelAndErrorClosure(subscription, result));
-          } else {
-            value = element;
-            seenFirst = true;
-          }
-        }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
-            if (!seenFirst) {
-              try {
-                dart.throw(_internal.IterableElementError.noElement());
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                async._completeWithErrorCallback(result, e, s);
-              }
-
+            if (async.Future.is(newValue)) {
+              subscription.pause();
+              newValue.then(dart.void)(add, {onError: addError}).whenComplete(dart.bind(subscription, 'resume'));
             } else {
-              result[_complete](value);
+              controller.add(E.as(newValue));
             }
-          }, VoidToNull()), cancelOnError: true});
-        return result;
-      }
-      fold(S) {
-        return (initialValue, combine) => {
-          let result = new (async._Future$(S))();
-          let value = initialValue;
-          let subscription = null;
-          subscription = this.listen(dart.fn(element => {
-            async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
-              value = newValue;
-            }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
-          }, TToNull()), {onError: dart.fn((e, st) => {
-              result[_completeError](e, core.StackTrace._check(st));
-            }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
-              result[_complete](value);
-            }, VoidToNull()), cancelOnError: true});
-          return result;
-        };
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        let result = new (_FutureOfString())();
-        let buffer = new core.StringBuffer();
-        let subscription = null;
-        let first = true;
-        subscription = this.listen(dart.fn(element => {
-          if (!first) {
-            buffer.write(separator);
-          }
-          first = false;
-          try {
-            buffer.write(element);
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._cancelAndErrorWithReplacement(subscription, result, e, s);
-          }
-
-        }, TToNull()), {onError: dart.fn(e => {
-            result[_completeError](e);
-          }, dynamicToNull$()), onDone: dart.fn(() => {
-            result[_complete](buffer.toString());
-          }, VoidToNull()), cancelOnError: true});
-        return result;
-      }
-      contains(needle) {
-        let future = new (_FutureOfbool())();
-        let subscription = null;
-        subscription = this.listen(dart.fn(element => {
-          async._runUserCode(dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
-            if (dart.test(isMatch)) {
-              async._cancelAndValue(subscription, future, true);
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](false);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      forEach(action) {
-        let future = new async._Future();
-        let subscription = null;
-        subscription = this.listen(dart.fn(element => {
-          async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
-          }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](null);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      every(test) {
-        let future = new (_FutureOfbool())();
-        let subscription = null;
-        subscription = this.listen(dart.fn(element => {
-          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
-            if (!dart.test(isMatch)) {
-              async._cancelAndValue(subscription, future, false);
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](true);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      any(test) {
-        let future = new (_FutureOfbool())();
-        let subscription = null;
-        subscription = this.listen(dart.fn(element => {
-          async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
-            if (dart.test(isMatch)) {
-              async._cancelAndValue(subscription, future, true);
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](false);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      get length() {
-        let future = new (_FutureOfint())();
-        let count = 0;
-        this.listen(dart.fn(_ => {
-          count++;
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](count);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      get isEmpty() {
-        let future = new (_FutureOfbool())();
-        let subscription = null;
-        subscription = this.listen(dart.fn(_ => {
-          async._cancelAndValue(subscription, future, false);
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](true);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      toList() {
-        let result = JSArrayOfT().of([]);
-        let future = new (_FutureOfListOfT())();
-        this.listen(dart.fn(data => {
-          result[dartx.add](data);
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](result);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      toSet() {
-        let result = SetOfT().new();
-        let future = new (_FutureOfSetOfT())();
-        this.listen(dart.fn(data => {
-          result.add(data);
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_complete](result);
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      drain(E) {
-        return futureValue => {
-          if (futureValue === void 0) futureValue = null;
-          return this.listen(null, {cancelOnError: true}).asFuture(E)(futureValue);
-        };
-      }
-      take(count) {
-        return new (_TakeStreamOfT())(this, count);
-      }
-      takeWhile(test) {
-        return new (_TakeWhileStreamOfT())(this, test);
-      }
-      skip(count) {
-        return new (_SkipStreamOfT())(this, count);
-      }
-      skipWhile(test) {
-        return new (_SkipWhileStreamOfT())(this, test);
-      }
-      distinct(equals) {
-        if (equals === void 0) equals = null;
-        return new (_DistinctStreamOfT())(this, equals);
-      }
-      get first() {
-        let future = new (_FutureOfT())();
-        let subscription = null;
-        subscription = this.listen(dart.fn(value => {
-          async._cancelAndValue(subscription, future, value);
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      get last() {
-        let future = new (_FutureOfT())();
-        let result = null;
-        let foundResult = false;
-        this.listen(dart.fn(value => {
-          foundResult = true;
-          result = value;
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            if (foundResult) {
-              future[_complete](result);
-              return;
-            }
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      get single() {
-        let future = new (_FutureOfT())();
-        let result = null;
-        let foundResult = false;
-        let subscription = null;
-        subscription = this.listen(dart.fn(value => {
-          if (foundResult) {
-            try {
-              dart.throw(_internal.IterableElementError.tooMany());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._cancelAndErrorWithReplacement(subscription, future, e, s);
-            }
-
-            return;
-          }
-          foundResult = true;
-          result = value;
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            if (foundResult) {
-              future[_complete](result);
-              return;
-            }
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      firstWhere(test, opts) {
-        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
-        let future = new async._Future();
-        let subscription = null;
-        subscription = this.listen(dart.fn(value => {
-          async._runUserCode(dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
-            if (dart.test(isMatch)) {
-              async._cancelAndValue(subscription, future, value);
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            if (defaultValue != null) {
-              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
-              return;
-            }
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      lastWhere(test, opts) {
-        let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
-        let future = new async._Future();
-        let result = null;
-        let foundResult = false;
-        let subscription = null;
-        subscription = this.listen(dart.fn(value => {
-          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
-            if (dart.test(isMatch)) {
-              foundResult = true;
-              result = value;
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            if (foundResult) {
-              future[_complete](result);
-              return;
-            }
-            if (defaultValue != null) {
-              async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
-              return;
-            }
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      singleWhere(test) {
-        let future = new (_FutureOfT())();
-        let result = null;
-        let foundResult = false;
-        let subscription = null;
-        subscription = this.listen(dart.fn(value => {
-          async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
-            if (dart.test(isMatch)) {
-              if (foundResult) {
-                try {
-                  dart.throw(_internal.IterableElementError.tooMany());
-                } catch (e) {
-                  let s = dart.stackTrace(e);
-                  async._cancelAndErrorWithReplacement(subscription, future, e, s);
-                }
-
-                return;
-              }
-              foundResult = true;
-              result = value;
-            }
-          }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            if (foundResult) {
-              future[_complete](result);
-              return;
-            }
-            try {
-              dart.throw(_internal.IterableElementError.noElement());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              async._completeWithErrorCallback(future, e, s);
-            }
-
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      elementAt(index) {
-        if (!(typeof index == 'number') || dart.notNull(index) < 0) dart.throw(new core.ArgumentError(index));
-        let future = new (_FutureOfT())();
-        let subscription = null;
-        let elementIndex = 0;
-        subscription = this.listen(dart.fn(value => {
-          if (index == elementIndex) {
-            async._cancelAndValue(subscription, future, value);
-            return;
-          }
-          elementIndex = elementIndex + 1;
-        }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
-            future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
-          }, VoidToNull()), cancelOnError: true});
-        return future;
-      }
-      timeout(timeLimit, opts) {
-        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
-        let controller = null;
-        let subscription = null;
-        let timer = null;
-        let zone = null;
-        let timeout = null;
-        function onData(event) {
-          timer.cancel();
-          controller.add(event);
-          timer = zone.createTimer(timeLimit, timeout);
-        }
-        dart.fn(onData, TTovoid$());
-        function onError(error, stackTrace) {
-          timer.cancel();
-          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
-          let eventSink = controller;
-          dart.dsend(eventSink, _addError, error, stackTrace);
-          timer = zone.createTimer(timeLimit, timeout);
-        }
-        dart.fn(onError, dynamicAndStackTraceTovoid());
-        function onDone() {
-          timer.cancel();
-          controller.close();
-        }
-        dart.fn(onDone, VoidTovoid$());
-        const onListen = (function() {
-          zone = async.Zone.current;
-          if (onTimeout == null) {
-            timeout = dart.fn(() => {
-              controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
-            }, VoidToNull());
-          } else {
-            let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
-            let wrapper = new async._ControllerEventSinkWrapper(null);
-            timeout = dart.fn(() => {
-              wrapper[_sink] = controller;
-              zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
-              wrapper[_sink] = null;
-            }, VoidToNull());
-          }
-          subscription = this.listen(onData, {onError: onError, onDone: onDone});
-          timer = zone.createTimer(timeLimit, timeout);
+          }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
         }).bind(this);
         dart.fn(onListen, VoidTovoid$());
-        function onCancel() {
-          timer.cancel();
-          let result = subscription.cancel();
-          subscription = null;
-          return result;
+        if (dart.test(this.isBroadcast)) {
+          controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
+              subscription.cancel();
+            }, VoidToNull()), sync: true});
+        } else {
+          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
+              subscription.pause();
+            }, VoidToNull()), onResume: dart.fn(() => {
+              subscription.resume();
+            }, VoidToNull()), onCancel: dart.fn(() => {
+              subscription.cancel();
+            }, VoidToNull()), sync: true});
         }
-        dart.fn(onCancel, VoidToFuture());
-        controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
-          timer.cancel();
-          subscription.pause();
-        }, VoidToNull()), dart.fn(() => {
-          subscription.resume();
-          timer = zone.createTimer(timeLimit, timeout);
-        }, VoidToNull()), onCancel);
         return controller.stream;
-      }
+      };
     }
-    dart.addTypeTests(Stream);
-    dart.defineNamedConstructor(Stream, '_internal');
-    dart.setSignature(Stream, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async.Stream$(T), []),
-        _internal: dart.definiteFunctionType(async.Stream$(T), []),
-        empty: dart.definiteFunctionType(async.Stream$(T), []),
-        fromFuture: dart.definiteFunctionType(async.Stream$(T), [FutureOfT()]),
-        fromFutures: dart.definiteFunctionType(async.Stream$(T), [IterableOfFutureOfT()]),
-        fromIterable: dart.definiteFunctionType(async.Stream$(T), [IterableOfT()]),
-        periodic: dart.definiteFunctionType(async.Stream$(T), [core.Duration], [intToT()]),
-        eventTransformed: dart.definiteFunctionType(async.Stream$(T), [async.Stream, EventSinkOfTToEventSink()])
-      }),
-      getters: () => ({
-        isBroadcast: dart.definiteFunctionType(core.bool, []),
-        length: dart.definiteFunctionType(async.Future$(core.int), []),
-        isEmpty: dart.definiteFunctionType(async.Future$(core.bool), []),
-        first: dart.definiteFunctionType(async.Future$(T), []),
-        last: dart.definiteFunctionType(async.Future$(T), []),
-        single: dart.definiteFunctionType(async.Future$(T), [])
-      }),
-      methods: () => ({
-        asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
-        where: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
-        map: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(S, [T])]]),
-        asyncMap: dart.definiteFunctionType(E => [async.Stream$(E), [TTodynamic()]]),
-        asyncExpand: dart.definiteFunctionType(E => [async.Stream$(E), [dart.functionType(async.Stream$(E), [T])]]),
-        handleError: dart.definiteFunctionType(async.Stream$(T), [core.Function], {test: dynamicTobool()}),
-        expand: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(core.Iterable$(S), [T])]]),
-        pipe: dart.definiteFunctionType(async.Future, [StreamConsumerOfT()]),
-        transform: dart.definiteFunctionType(S => [async.Stream$(S), [async.StreamTransformer$(T, S)]]),
-        reduce: dart.definiteFunctionType(async.Future$(T), [TAndTToT()]),
-        fold: dart.definiteFunctionType(S => [async.Future$(S), [S, dart.functionType(S, [S, T])]]),
-        join: dart.definiteFunctionType(async.Future$(core.String), [], [core.String]),
-        contains: dart.definiteFunctionType(async.Future$(core.bool), [core.Object]),
-        forEach: dart.definiteFunctionType(async.Future, [TTovoid()]),
-        every: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
-        any: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
-        toList: dart.definiteFunctionType(async.Future$(core.List$(T)), []),
-        toSet: dart.definiteFunctionType(async.Future$(core.Set$(T)), []),
-        drain: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
-        take: dart.definiteFunctionType(async.Stream$(T), [core.int]),
-        takeWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
-        skip: dart.definiteFunctionType(async.Stream$(T), [core.int]),
-        skipWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
-        distinct: dart.definiteFunctionType(async.Stream$(T), [], [TAndTTobool()]),
-        firstWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
-        lastWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
-        singleWhere: dart.definiteFunctionType(async.Future$(T), [TTobool()]),
-        elementAt: dart.definiteFunctionType(async.Future$(T), [core.int]),
-        timeout: dart.definiteFunctionType(async.Stream$(T), [core.Duration], {onTimeout: EventSinkOfTTovoid()})
-      })
-    });
-    return Stream;
-  });
-  async.Stream = Stream();
-  _isolate_helper.ReceivePortImpl = class ReceivePortImpl extends async.Stream {
-    new() {
-      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl(null));
-    }
-    weak() {
-      ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl.weak(null));
-    }
-    fromRawReceivePort(rawPort) {
-      this[_rawPort] = rawPort;
-      this[_controller] = null;
-      super.new();
-      this[_controller] = async.StreamController.new({onCancel: dart.bind(this, 'close'), sync: true});
-      this[_rawPort].handler = dart.bind(this[_controller], 'add');
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    close() {
-      this[_rawPort].close();
-      this[_controller].close();
-    }
-    get sendPort() {
-      return this[_rawPort].sendPort;
-    }
-  };
-  dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
-  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
-  dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
-  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
-  dart.setSignature(_isolate_helper.ReceivePortImpl, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
-      weak: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
-      fromRawReceivePort: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, [isolate.RawReceivePort])
-    }),
-    fields: () => ({
-      [_rawPort]: isolate.RawReceivePort,
-      [_controller]: async.StreamController
-    }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _once = Symbol('_once');
-  const _inEventLoop = Symbol('_inEventLoop');
-  const _handle = Symbol('_handle');
-  _isolate_helper.TimerImpl = class TimerImpl extends core.Object {
-    new(milliseconds, callback) {
-      this[_once] = true;
-      this[_inEventLoop] = false;
-      this[_handle] = null;
-      if (milliseconds == 0 && (!dart.test(_isolate_helper.hasTimer()) || dart.test(_isolate_helper._globalState.isWorker))) {
-        const internalCallback = (function() {
-          this[_handle] = null;
-          callback();
+    asyncExpand(E) {
+      return convert => {
+        let controller = null;
+        let subscription = null;
+        const onListen = (function() {
+          dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
+          let eventSink = async._EventSink$(E).as(controller);
+          subscription = this.listen(dart.fn(event => {
+            let newStream = null;
+            try {
+              newStream = convert(event);
+            } catch (e) {
+              let s = dart.stackTrace(e);
+              controller.addError(e, s);
+              return;
+            }
+
+            if (newStream != null) {
+              subscription.pause();
+              controller.addStream(newStream).whenComplete(dart.bind(subscription, 'resume'));
+            }
+          }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
         }).bind(this);
-        dart.fn(internalCallback, VoidTovoid$());
-        this[_handle] = 1;
-        _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
-        this[_inEventLoop] = true;
-      } else if (dart.test(_isolate_helper.hasTimer())) {
-        const internalCallback = (function() {
-          this[_handle] = null;
-          _isolate_helper.leaveJsAsync();
-          callback();
-        }).bind(this);
-        dart.fn(internalCallback, VoidTovoid$());
-        _isolate_helper.enterJsAsync();
-        this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
-      } else {
-        dart.assert(dart.notNull(milliseconds) > 0);
-        dart.throw(new core.UnsupportedError("Timer greater than 0."));
-      }
-    }
-    periodic(milliseconds, callback) {
-      this[_once] = false;
-      this[_inEventLoop] = false;
-      this[_handle] = null;
-      if (dart.test(_isolate_helper.hasTimer())) {
-        _isolate_helper.enterJsAsync();
-        this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
-          callback(this);
-        }, VoidToNull()), milliseconds);
-      } else {
-        dart.throw(new core.UnsupportedError("Periodic timer."));
-      }
-    }
-    cancel() {
-      if (dart.test(_isolate_helper.hasTimer())) {
-        if (dart.test(this[_inEventLoop])) {
-          dart.throw(new core.UnsupportedError("Timer in event loop cannot be canceled."));
-        }
-        if (this[_handle] == null) return;
-        _isolate_helper.leaveJsAsync();
-        if (dart.test(this[_once])) {
-          _isolate_helper.global.clearTimeout(this[_handle]);
+        dart.fn(onListen, VoidTovoid$());
+        if (dart.test(this.isBroadcast)) {
+          controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
+              subscription.cancel();
+            }, VoidToNull()), sync: true});
         } else {
-          _isolate_helper.global.clearInterval(this[_handle]);
+          controller = async.StreamController$(E).new({onListen: onListen, onPause: dart.fn(() => {
+              subscription.pause();
+            }, VoidToNull()), onResume: dart.fn(() => {
+              subscription.resume();
+            }, VoidToNull()), onCancel: dart.fn(() => {
+              subscription.cancel();
+            }, VoidToNull()), sync: true});
         }
-        this[_handle] = null;
-      } else {
-        dart.throw(new core.UnsupportedError("Canceling a timer."));
-      }
+        return controller.stream;
+      };
     }
-    get isActive() {
-      return this[_handle] != null;
+    handleError(onError, opts) {
+      let test = opts && 'test' in opts ? opts.test : null;
+      return new (_HandleErrorStreamOfT())(this, onError, test);
     }
-  };
-  dart.defineNamedConstructor(_isolate_helper.TimerImpl, 'periodic');
-  _isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
-  dart.setSignature(_isolate_helper.TimerImpl, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, VoidTovoid()]),
-      periodic: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, TimerTovoid()])
-    }),
-    fields: () => ({
-      [_once]: core.bool,
-      [_inEventLoop]: core.bool,
-      [_handle]: core.int
-    }),
-    getters: () => ({isActive: dart.definiteFunctionType(core.bool, [])}),
-    methods: () => ({cancel: dart.definiteFunctionType(dart.void, [])})
-  });
-  _isolate_helper.hasTimer = function() {
-    return _isolate_helper.global.setTimeout != null;
-  };
-  dart.lazyFn(_isolate_helper.hasTimer, () => VoidTobool());
-  _isolate_helper.CapabilityImpl = class CapabilityImpl extends core.Object {
-    new() {
-      CapabilityImpl.prototype._internal.call(this, _js_helper.random64());
+    expand(S) {
+      return convert => {
+        return new (async._ExpandStream$(T, S))(this, convert);
+      };
     }
-    _internal(id) {
-      this[_id] = id;
+    pipe(streamConsumer) {
+      StreamConsumerOfT()._check(streamConsumer);
+      return streamConsumer.addStream(this).then(dart.dynamic)(dart.fn(_ => streamConsumer.close(), dynamicToFuture()));
     }
-    get hashCode() {
-      let hash = this[_id];
-      hash = (hash[dartx['>>']](0) ^ (dart.notNull(hash) / 4294967296)[dartx.truncate]()) >>> 0;
-      hash = ((~dart.notNull(hash) >>> 0) + (dart.notNull(hash) << 15 >>> 0) & 4294967295) >>> 0;
-      hash = (dart.notNull(hash) ^ hash[dartx['>>']](12)) >>> 0;
-      hash = (dart.notNull(hash) * 5 & 4294967295) >>> 0;
-      hash = (dart.notNull(hash) ^ hash[dartx['>>']](4)) >>> 0;
-      hash = (dart.notNull(hash) * 2057 & 4294967295) >>> 0;
-      hash = (dart.notNull(hash) ^ hash[dartx['>>']](16)) >>> 0;
-      return hash;
+    transform(S) {
+      return streamTransformer => {
+        async.StreamTransformer$(T, S)._check(streamTransformer);
+        return streamTransformer.bind(this);
+      };
     }
-    ['=='](other) {
-      if (core.identical(other, this)) return true;
-      if (_isolate_helper.CapabilityImpl.is(other)) {
-        return core.identical(this[_id], other[_id]);
-      }
-      return false;
-    }
-  };
-  dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
-  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
-  dart.setSignature(_isolate_helper.CapabilityImpl, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, []),
-      _internal: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, [core.int])
-    }),
-    fields: () => ({[_id]: core.int}),
-    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
-  });
-  _isolate_helper._serializeMessage = function(message) {
-    return new _isolate_helper._Serializer().serialize(message);
-  };
-  dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
-  _isolate_helper._deserializeMessage = function(message) {
-    return new _isolate_helper._Deserializer().deserialize(message);
-  };
-  dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
-  _isolate_helper._clone = function(message) {
-    let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
-    let deserializer = new _isolate_helper._Deserializer();
-    return deserializer.deserialize(serializer.serialize(message));
-  };
-  dart.fn(_isolate_helper._clone, dynamicTodynamic$());
-  const _serializeSendPorts = Symbol('_serializeSendPorts');
-  _isolate_helper._Serializer = class _Serializer extends core.Object {
-    new(opts) {
-      let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
-      this.serializedObjectIds = MapOfdynamic$int().identity();
-      this[_serializeSendPorts] = core.bool._check(serializeSendPorts);
-    }
-    serialize(x) {
-      if (dart.test(this.isPrimitive(x))) return this.serializePrimitive(x);
-      let serializationId = this.serializedObjectIds[dartx._get](x);
-      if (serializationId != null) return this.makeRef(serializationId);
-      serializationId = this.serializedObjectIds[dartx.length];
-      this.serializedObjectIds[dartx._set](x, serializationId);
-      if (_native_typed_data.NativeByteBuffer.is(x)) return this.serializeByteBuffer(x);
-      if (_native_typed_data.NativeTypedData.is(x)) return this.serializeTypedData(x);
-      if (_interceptors.JSIndexable.is(x)) return this.serializeJSIndexable(x);
-      if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
-      if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
-      if (_interceptors.Interceptor.is(x)) this.unsupported(x);
-      if (isolate.RawReceivePort.is(x)) {
-        this.unsupported(x, "RawReceivePorts can't be transmitted:");
-      }
-      if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
-      if (_isolate_helper._WorkerSendPort.is(x)) return this.serializeWorkerSendPort(x);
-      if (core.Function.is(x)) return this.serializeClosure(x);
-      return this.serializeDartObject(x);
-    }
-    unsupported(x, message) {
-      if (message === void 0) message = null;
-      if (message == null) message = "Can't transmit:";
-      dart.throw(new core.UnsupportedError(dart.str`${message} ${x}`));
-    }
-    makeRef(serializationId) {
-      return JSArrayOfObject().of(["ref", serializationId]);
-    }
-    isPrimitive(x) {
-      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
-    }
-    serializePrimitive(primitive) {
-      return primitive;
-    }
-    serializeByteBuffer(buffer) {
-      return JSArrayOfObject().of(["buffer", buffer]);
-    }
-    serializeTypedData(data) {
-      return JSArrayOfObject().of(["typed", data]);
-    }
-    serializeJSIndexable(indexable) {
-      dart.assert(!(typeof indexable == 'string'));
-      let serialized = core.List._check(this.serializeArray(_interceptors.JSArray._check(indexable)));
-      if (_interceptors.JSFixedArray.is(indexable)) return JSArrayOfObject().of(["fixed", serialized]);
-      if (_interceptors.JSExtendableArray.is(indexable)) return JSArrayOfObject().of(["extendable", serialized]);
-      if (_interceptors.JSMutableArray.is(indexable)) return JSArrayOfObject().of(["mutable", serialized]);
-      if (_interceptors.JSArray.is(indexable)) return JSArrayOfObject().of(["const", serialized]);
-      this.unsupported(indexable, "Can't serialize indexable: ");
-      return null;
-    }
-    serializeArray(x) {
-      let serialized = [];
-      serialized[dartx.length] = x[dartx.length];
-      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
-        serialized[dartx._set](i, this.serialize(x[dartx._get](i)));
-      }
-      return serialized;
-    }
-    serializeArrayInPlace(x) {
-      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
-        x[dartx._set](i, this.serialize(x[dartx._get](i)));
-      }
-      return x;
-    }
-    serializeMap(x) {
-      let serializeTearOff = dart.bind(this, 'serialize');
-      return JSArrayOfObject().of(['map', x.keys[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList](), x.values[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList]()]);
-    }
-    serializeJSObject(x) {
-      if (!!x.constructor && x.constructor !== Object) {
-        this.unsupported(x, "Only plain JS Objects are supported:");
-      }
-      let keys = Object.keys(x);
-      let values = [];
-      values[dartx.length] = keys[dartx.length];
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        values[dartx._set](i, this.serialize(x[keys[dartx._get](i)]));
-      }
-      return JSArrayOfObject().of(['js-object', keys, values]);
-    }
-    serializeWorkerSendPort(x) {
-      if (dart.test(this[_serializeSendPorts])) {
-        return JSArrayOfObject().of(['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]);
-      }
-      return JSArrayOfObject().of(['raw sendport', x]);
-    }
-    serializeJsSendPort(x) {
-      if (dart.test(this[_serializeSendPorts])) {
-        let workerId = _isolate_helper._globalState.currentManagerId;
-        return JSArrayOfObject().of(['sendport', workerId, x[_isolateId], x[_receivePort][_id]]);
-      }
-      return JSArrayOfObject().of(['raw sendport', x]);
-    }
-    serializeCapability(x) {
-      return JSArrayOfObject().of(['capability', x[_id]]);
-    }
-    serializeClosure(x) {
-      let name = _isolate_helper.IsolateNatives._getJSFunctionName(x);
-      if (name == null) {
-        this.unsupported(x, "Closures can't be transmitted:");
-      }
-      return JSArrayOfString().of(['function', name]);
-    }
-    serializeDartObject(x) {
-      let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_ID_EXTRACTOR);
-      let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_FIELDS_EXTRACTOR);
-      let classId = classExtractor(x);
-      let fields = fieldsExtractor(x);
-      return ['dart', classId, this.serializeArrayInPlace(_interceptors.JSArray._check(fields))];
-    }
-  };
-  dart.setSignature(_isolate_helper._Serializer, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Serializer, [], {serializeSendPorts: dart.dynamic})}),
-    fields: () => ({
-      [_serializeSendPorts]: core.bool,
-      serializedObjectIds: MapOfdynamic$int()
-    }),
-    methods: () => ({
-      serialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      unsupported: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
-      makeRef: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      serializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      serializeByteBuffer: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeByteBuffer]),
-      serializeTypedData: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeTypedData]),
-      serializeJSIndexable: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSIndexable]),
-      serializeArray: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
-      serializeArrayInPlace: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
-      serializeMap: dart.definiteFunctionType(dart.dynamic, [_js_helper.InternalMap]),
-      serializeJSObject: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSObject]),
-      serializeWorkerSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._WorkerSendPort]),
-      serializeJsSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._NativeJsSendPort]),
-      serializeCapability: dart.definiteFunctionType(dart.dynamic, [_isolate_helper.CapabilityImpl]),
-      serializeClosure: dart.definiteFunctionType(dart.dynamic, [core.Function]),
-      serializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    })
-  });
-  const _adjustSendPorts = Symbol('_adjustSendPorts');
-  _isolate_helper._Deserializer = class _Deserializer extends core.Object {
-    new(opts) {
-      let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendPorts : true;
-      this.deserializedObjects = core.List.new();
-      this[_adjustSendPorts] = core.bool._check(adjustSendPorts);
-    }
-    deserialize(x) {
-      if (dart.test(this.isPrimitive(x))) return this.deserializePrimitive(x);
-      if (!_interceptors.JSArray.is(x)) dart.throw(new core.ArgumentError(dart.str`Bad serialized message: ${x}`));
-      switch (dart.dload(x, 'first')) {
-        case "ref":
-        {
-          return this.deserializeRef(x);
-        }
-        case "buffer":
-        {
-          return this.deserializeByteBuffer(x);
-        }
-        case "typed":
-        {
-          return this.deserializeTypedData(x);
-        }
-        case "fixed":
-        {
-          return this.deserializeFixed(x);
-        }
-        case "extendable":
-        {
-          return this.deserializeExtendable(x);
-        }
-        case "mutable":
-        {
-          return this.deserializeMutable(x);
-        }
-        case "const":
-        {
-          return this.deserializeConst(x);
-        }
-        case "map":
-        {
-          return this.deserializeMap(_js_helper.InternalMap._check(x));
-        }
-        case "sendport":
-        {
-          return this.deserializeSendPort(x);
-        }
-        case "raw sendport":
-        {
-          return this.deserializeRawSendPort(x);
-        }
-        case "js-object":
-        {
-          return this.deserializeJSObject(x);
-        }
-        case "function":
-        {
-          return this.deserializeClosure(x);
-        }
-        case "dart":
-        {
-          return this.deserializeDartObject(x);
-        }
-        default:
-        {
-          dart.throw(dart.str`couldn't deserialize: ${x}`);
-        }
-      }
-    }
-    isPrimitive(x) {
-      return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
-    }
-    deserializePrimitive(x) {
-      return x;
-    }
-    deserializeRef(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
-      let serializationId = core.int._check(dart.dindex(x, 1));
-      return this.deserializedObjects[dartx._get](serializationId);
-    }
-    deserializeByteBuffer(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
-      let result = _native_typed_data.NativeByteBuffer._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return result;
-    }
-    deserializeTypedData(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
-      let result = _native_typed_data.NativeTypedData._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return result;
-    }
-    deserializeArrayInPlace(x) {
-      for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
-        x[dartx._set](i, this.deserialize(x[dartx._get](i)));
-      }
-      return x;
-    }
-    deserializeFixed(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
-      let result = core.List._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
-    }
-    deserializeExtendable(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
-      let result = core.List._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
-    }
-    deserializeMutable(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
-      let result = core.List._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return this.deserializeArrayInPlace(_interceptors.JSArray._check(result));
-    }
-    deserializeConst(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
-      let result = core.List._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
-    }
-    deserializeMap(x) {
-      dart.assert(dart.equals(x._get(0), 'map'));
-      let keys = core.List._check(x._get(1));
-      let values = core.List._check(x._get(2));
-      let result = dart.map();
-      this.deserializedObjects[dartx.add](result);
-      keys = keys[dartx.map](dart.dynamic)(dart.bind(this, 'deserialize'))[dartx.toList]();
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        result[dartx._set](keys[dartx._get](i), this.deserialize(values[dartx._get](i)));
-      }
-      return result;
-    }
-    deserializeSendPort(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'sendport'));
-      let managerId = core.int._check(dart.dindex(x, 1));
-      let isolateId = core.int._check(dart.dindex(x, 2));
-      let receivePortId = core.int._check(dart.dindex(x, 3));
-      let result = null;
-      if (managerId == _isolate_helper._globalState.currentManagerId) {
-        let isolate = _isolate_helper._globalState.isolates[dartx._get](isolateId);
-        if (isolate == null) return null;
-        let receivePort = isolate.lookup(receivePortId);
-        if (receivePort == null) return null;
-        result = new _isolate_helper._NativeJsSendPort(receivePort, isolateId);
-      } else {
-        result = new _isolate_helper._WorkerSendPort(managerId, isolateId, receivePortId);
-      }
-      this.deserializedObjects[dartx.add](result);
-      return result;
-    }
-    deserializeRawSendPort(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
-      let result = isolate.SendPort._check(dart.dindex(x, 1));
-      this.deserializedObjects[dartx.add](result);
-      return result;
-    }
-    deserializeJSObject(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
-      let keys = core.List._check(dart.dindex(x, 1));
-      let values = core.List._check(dart.dindex(x, 2));
-      let o = {};
-      this.deserializedObjects[dartx.add](o);
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        o[keys[dartx._get](i)] = this.deserialize(values[dartx._get](i));
-      }
-      return o;
-    }
-    deserializeClosure(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
-      let name = core.String._check(dart.dindex(x, 1));
-      let result = core.Function._check(_isolate_helper.IsolateNatives._getJSFunctionFromName(name));
-      this.deserializedObjects[dartx.add](result);
-      return result;
-    }
-    deserializeDartObject(x) {
-      dart.assert(dart.equals(dart.dindex(x, 0), 'dart'));
-      let classId = core.String._check(dart.dindex(x, 1));
-      let fields = core.List._check(dart.dindex(x, 2));
-      let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
-      let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
-      let emptyInstance = instanceFromClassId(classId);
-      this.deserializedObjects[dartx.add](emptyInstance);
-      this.deserializeArrayInPlace(_interceptors.JSArray._check(fields));
-      return initializeObject(classId, emptyInstance, fields);
-    }
-  };
-  dart.setSignature(_isolate_helper._Deserializer, {
-    constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Deserializer, [], {adjustSendPorts: dart.dynamic})}),
-    fields: () => ({
-      [_adjustSendPorts]: core.bool,
-      deserializedObjects: core.List
-    }),
-    methods: () => ({
-      deserialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      deserializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      deserializeRef: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      deserializeByteBuffer: dart.definiteFunctionType(_native_typed_data.NativeByteBuffer, [dart.dynamic]),
-      deserializeTypedData: dart.definiteFunctionType(_native_typed_data.NativeTypedData, [dart.dynamic]),
-      deserializeArrayInPlace: dart.definiteFunctionType(core.List, [_interceptors.JSArray]),
-      deserializeFixed: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      deserializeExtendable: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
-      deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-      deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-      deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
-      deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    })
-  });
-  _js_embedded_names.DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
-  _js_embedded_names.TYPE_INFORMATION = 'typeInformation';
-  _js_embedded_names.GLOBAL_FUNCTIONS = 'globalFunctions';
-  _js_embedded_names.STATICS = 'statics';
-  _js_embedded_names.INTERCEPTED_NAMES = 'interceptedNames';
-  _js_embedded_names.MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
-  _js_embedded_names.MANGLED_NAMES = 'mangledNames';
-  _js_embedded_names.LIBRARIES = 'libraries';
-  _js_embedded_names.FINISHED_CLASSES = 'finishedClasses';
-  _js_embedded_names.ALL_CLASSES = 'allClasses';
-  _js_embedded_names.METADATA = 'metadata';
-  _js_embedded_names.INTERCEPTORS_BY_TAG = 'interceptorsByTag';
-  _js_embedded_names.LEAF_TAGS = 'leafTags';
-  _js_embedded_names.LAZIES = 'lazies';
-  _js_embedded_names.GET_ISOLATE_TAG = 'getIsolateTag';
-  _js_embedded_names.ISOLATE_TAG = 'isolateTag';
-  _js_embedded_names.CURRENT_SCRIPT = 'currentScript';
-  _js_embedded_names.DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
-  _js_embedded_names.DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
-  _js_embedded_names.INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
-  _js_embedded_names.IS_HUNK_LOADED = 'isHunkLoaded';
-  _js_embedded_names.IS_HUNK_INITIALIZED = 'isHunkInitialized';
-  _js_embedded_names.DEFERRED_INITIALIZED = 'deferredInitialized';
-  _js_embedded_names.CLASS_ID_EXTRACTOR = 'classIdExtractor';
-  _js_embedded_names.CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
-  _js_embedded_names.INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
-  _js_embedded_names.INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
-  _js_embedded_names.TYPEDEF_TYPE_PROPERTY_NAME = "$typedefType";
-  _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
-  _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
-  _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
-  _js_helper._Patch = class _Patch extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_js_helper._Patch, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._Patch, [])})
-  });
-  _js_helper.patch = dart.const(new _js_helper._Patch());
-  _js_helper.InternalMap$ = dart.generic((K, V) => {
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    class InternalMap extends core.Object {}
-    dart.addTypeTests(InternalMap);
-    InternalMap[dart.implements] = () => [MapOfK$V()];
-    return InternalMap;
-  });
-  _js_helper.InternalMap = InternalMap();
-  _js_helper.Primitives = class Primitives extends core.Object {
-    static initializeStatics(id) {
-      _js_helper.Primitives.mirrorFunctionCacheName = dart.notNull(_js_helper.Primitives.mirrorFunctionCacheName) + dart.str`_${id}`;
-      _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
-    }
-    static objectHashCode(object) {
-      let hash = object.$identityHash;
-      if (hash == null) {
-        hash = Math.random() * 0x3fffffff | 0;
-        object.$identityHash = hash;
-      }
-      return hash;
-    }
-    static _parseIntError(source, handleError) {
-      if (handleError == null) dart.throw(new core.FormatException(source));
-      return handleError(source);
-    }
-    static parseInt(source, radix, handleError) {
-      _js_helper.checkString(source);
-      let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
-      let match = re.exec(source);
-      let digitsIndex = 1;
-      let hexIndex = 2;
-      let decimalIndex = 3;
-      let nonDecimalHexIndex = 4;
-      if (match == null) {
-        return _js_helper.Primitives._parseIntError(source, handleError);
-      }
-      let decimalMatch = match[dartx._get](decimalIndex);
-      if (radix == null) {
-        if (decimalMatch != null) {
-          return parseInt(source, 10);
-        }
-        if (match[dartx._get](hexIndex) != null) {
-          return parseInt(source, 16);
-        }
-        return _js_helper.Primitives._parseIntError(source, handleError);
-      }
-      if (!(typeof radix == 'number')) {
-        dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
-      }
-      if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
-        dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
-      }
-      if (radix == 10 && decimalMatch != null) {
-        return parseInt(source, 10);
-      }
-      if (dart.notNull(radix) < 10 || decimalMatch == null) {
-        let maxCharCode = null;
-        if (dart.notNull(radix) <= 10) {
-          maxCharCode = 48 - 1 + dart.notNull(radix);
-        } else {
-          maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
-        }
-        dart.assert(typeof match[dartx._get](digitsIndex) == 'string');
-        let digitsPart = match[digitsIndex];
-        for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
-          let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
-          if (characterCode > dart.notNull(maxCharCode)) {
-            return _js_helper.Primitives._parseIntError(source, handleError);
-          }
-        }
-      }
-      return parseInt(source, radix);
-    }
-    static _parseDoubleError(source, handleError) {
-      if (handleError == null) {
-        dart.throw(new core.FormatException('Invalid double', source));
-      }
-      return handleError(source);
-    }
-    static parseDouble(source, handleError) {
-      _js_helper.checkString(source);
-      if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
-        return _js_helper.Primitives._parseDoubleError(source, handleError);
-      }
-      let result = parseFloat(source);
-      if (dart.test(result[dartx.isNaN])) {
-        let trimmed = source[dartx.trim]();
-        if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
-          return result;
-        }
-        return _js_helper.Primitives._parseDoubleError(source, handleError);
-      }
-      return result;
-    }
-    static objectTypeName(object) {
-      return dart.toString(_js_helper.getRuntimeType(object));
-    }
-    static objectToString(object) {
-      let name = dart.typeName(dart.getReifiedType(object));
-      return dart.str`Instance of '${name}'`;
-    }
-    static dateNow() {
-      return Date.now();
-    }
-    static initTicker() {
-      if (_js_helper.Primitives.timerFrequency != null) return;
-      _js_helper.Primitives.timerFrequency = 1000;
-      _js_helper.Primitives.timerTicks = _js_helper.Primitives.dateNow;
-      if (typeof window == "undefined") return;
-      let jsWindow = window;
-      if (jsWindow == null) return;
-      let performance = jsWindow.performance;
-      if (performance == null) return;
-      if (typeof performance.now != "function") return;
-      _js_helper.Primitives.timerFrequency = 1000000;
-      _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[dartx.floor](), VoidToint());
-    }
-    static get isD8() {
-      return typeof version == "function" && typeof os == "object" && "system" in os;
-    }
-    static get isJsshell() {
-      return typeof version == "function" && typeof system == "function";
-    }
-    static currentUri() {
-      if (!!self.location) {
-        return self.location.href;
-      }
-      return null;
-    }
-    static _fromCharCodeApply(array) {
-      let kMaxApply = 500;
-      let end = array[dartx.length];
-      if (dart.notNull(end) <= kMaxApply) {
-        return String.fromCharCode.apply(null, array);
-      }
-      let result = '';
-      for (let i = 0; i < dart.notNull(end); i = i + kMaxApply) {
-        let chunkEnd = i + kMaxApply < dart.notNull(end) ? i + kMaxApply : end;
-        result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
-      }
-      return result;
-    }
-    static stringFromCodePoints(codePoints) {
-      let a = JSArrayOfint().of([]);
-      for (let i of codePoints) {
-        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
-        if (dart.notNull(i) <= 65535) {
-          a[dartx.add](i);
-        } else if (dart.notNull(i) <= 1114111) {
-          a[dartx.add](55296 + (dart.notNull(i) - 65536 >> 10 & 1023));
-          a[dartx.add](56320 + (dart.notNull(i) & 1023));
-        } else {
-          dart.throw(_js_helper.argumentErrorValue(i));
-        }
-      }
-      return _js_helper.Primitives._fromCharCodeApply(a);
-    }
-    static stringFromCharCodes(charCodes) {
-      for (let i of charCodes) {
-        if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
-        if (dart.notNull(i) < 0) dart.throw(_js_helper.argumentErrorValue(i));
-        if (dart.notNull(i) > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
-      }
-      return _js_helper.Primitives._fromCharCodeApply(charCodes);
-    }
-    static stringFromNativeUint8List(charCodes, start, end) {
-      let kMaxApply = 500;
-      if (dart.notNull(end) <= kMaxApply && start == 0 && end == charCodes[dartx.length]) {
-        return String.fromCharCode.apply(null, charCodes);
-      }
-      let result = '';
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + kMaxApply) {
-        let chunkEnd = dart.notNull(i) + kMaxApply < dart.notNull(end) ? dart.notNull(i) + kMaxApply : end;
-        result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
-      }
-      return result;
-    }
-    static stringFromCharCode(charCode) {
-      if (0 <= dart.notNull(charCode)) {
-        if (dart.notNull(charCode) <= 65535) {
-          return String.fromCharCode(charCode);
-        }
-        if (dart.notNull(charCode) <= 1114111) {
-          let bits = dart.notNull(charCode) - 65536;
-          let low = 56320 | bits & 1023;
-          let high = (55296 | bits[dartx['>>']](10)) >>> 0;
-          return String.fromCharCode(high, low);
-        }
-      }
-      dart.throw(new core.RangeError.range(charCode, 0, 1114111));
-    }
-    static stringConcatUnchecked(string1, string2) {
-      return _foreign_helper.JS_STRING_CONCAT(string1, string2);
-    }
-    static flattenString(str) {
-      return str.charCodeAt(0) == 0 ? str : str;
-    }
-    static getTimeZoneName(receiver) {
-      let d = _js_helper.Primitives.lazyAsJsDate(receiver);
-      let match = /\((.*)\)/.exec(d.toString());
-      if (match != null) return core.String._check(match[dartx._get](1));
-      match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
-      if (match != null) return core.String._check(match[dartx._get](1));
-      match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
-      if (match != null) return core.String._check(match[dartx._get](0));
-      return "";
-    }
-    static getTimeZoneOffsetInMinutes(receiver) {
-      return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
-    }
-    static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
-      let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
-      _js_helper.checkInt(years);
-      _js_helper.checkInt(month);
-      _js_helper.checkInt(day);
-      _js_helper.checkInt(hours);
-      _js_helper.checkInt(minutes);
-      _js_helper.checkInt(seconds);
-      _js_helper.checkInt(milliseconds);
-      _js_helper.checkBool(isUtc);
-      let jsMonth = dart.notNull(month) - 1;
+    reduce(combine) {
+      TAndTToT()._check(combine);
+      let result = new (_FutureOfT())();
+      let seenFirst = false;
       let value = null;
-      if (dart.test(isUtc)) {
-        value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
-      } else {
-        value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
-      }
-      if (dart.test(value[dartx.isNaN]) || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
-        return null;
-      }
-      if (dart.notNull(years) <= 0 || dart.notNull(years) < 100) return core.num._check(_js_helper.Primitives.patchUpY2K(value, years, isUtc));
-      return value;
-    }
-    static patchUpY2K(value, years, isUtc) {
-      let date = new Date(value);
-      if (dart.test(isUtc)) {
-        date.setUTCFullYear(years);
-      } else {
-        date.setFullYear(years);
-      }
-      return date.valueOf();
-    }
-    static lazyAsJsDate(receiver) {
-      if (receiver.date === void 0) {
-        receiver.date = new Date(receiver.millisecondsSinceEpoch);
-      }
-      return receiver.date;
-    }
-    static getYear(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
-    }
-    static getMonth(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
-    }
-    static getDay(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
-    }
-    static getHours(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
-    }
-    static getMinutes(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
-    }
-    static getSeconds(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
-    }
-    static getMilliseconds(receiver) {
-      return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
-    }
-    static getWeekday(receiver) {
-      let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
-      return (weekday + 6)[dartx['%']](7) + 1;
-    }
-    static valueFromDateString(str) {
-      if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
-      let value = Date.parse(str);
-      if (dart.test(value[dartx.isNaN])) dart.throw(_js_helper.argumentErrorValue(str));
-      return value;
-    }
-    static getProperty(object, key) {
-      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
-        dart.throw(_js_helper.argumentErrorValue(object));
-      }
-      return object[key];
-    }
-    static setProperty(object, key, value) {
-      if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
-        dart.throw(_js_helper.argumentErrorValue(object));
-      }
-      object[key] = value;
-    }
-    static extractStackTrace(error) {
-      return _js_helper.getTraceFromException(error.$thrownJsError);
-    }
-  };
-  dart.setSignature(_js_helper.Primitives, {
-    sfields: () => ({
-      mirrorFunctionCacheName: core.String,
-      mirrorInvokeCacheName: core.String,
-      DOLLAR_CHAR_VALUE: core.int,
-      timerFrequency: core.int,
-      timerTicks: core.Function
-    }),
-    sgetters: () => ({
-      isD8: dart.definiteFunctionType(core.bool, []),
-      isJsshell: dart.definiteFunctionType(core.bool, [])
-    }),
-    statics: () => ({
-      initializeStatics: dart.definiteFunctionType(dart.void, [core.int]),
-      objectHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
-      _parseIntError: dart.definiteFunctionType(core.int, [core.String, StringToint()]),
-      parseInt: dart.definiteFunctionType(core.int, [core.String, core.int, StringToint()]),
-      _parseDoubleError: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
-      parseDouble: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
-      objectTypeName: dart.definiteFunctionType(core.String, [core.Object]),
-      objectToString: dart.definiteFunctionType(core.String, [core.Object]),
-      dateNow: dart.definiteFunctionType(core.int, []),
-      initTicker: dart.definiteFunctionType(dart.void, []),
-      currentUri: dart.definiteFunctionType(core.String, []),
-      _fromCharCodeApply: dart.definiteFunctionType(core.String, [ListOfint()]),
-      stringFromCodePoints: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
-      stringFromCharCodes: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
-      stringFromNativeUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
-      stringFromCharCode: dart.definiteFunctionType(core.String, [core.int]),
-      stringConcatUnchecked: dart.definiteFunctionType(core.String, [core.String, core.String]),
-      flattenString: dart.definiteFunctionType(core.String, [core.String]),
-      getTimeZoneName: dart.definiteFunctionType(core.String, [core.DateTime]),
-      getTimeZoneOffsetInMinutes: dart.definiteFunctionType(core.int, [core.DateTime]),
-      valueFromDecomposedDate: dart.definiteFunctionType(core.num, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
-      patchUpY2K: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      lazyAsJsDate: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getYear: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getMonth: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getDay: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getHours: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getMinutes: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getSeconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getMilliseconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      getWeekday: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
-      valueFromDateString: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      setProperty: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      extractStackTrace: dart.definiteFunctionType(core.StackTrace, [core.Error])
-    }),
-    names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromNativeUint8List', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'extractStackTrace']
-  });
-  _js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
-  _js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
-  _js_helper.Primitives.DOLLAR_CHAR_VALUE = 36;
-  _js_helper.Primitives.timerFrequency = null;
-  _js_helper.Primitives.timerTicks = null;
-  _js_helper.diagnoseIndexError = function(indexable, index) {
-    if (!(typeof index == 'number')) return new core.ArgumentError.value(index, 'index');
-    let length = core.int._check(dart.dload(indexable, 'length'));
-    if (dart.test(dart.dsend(index, '<', 0)) || dart.test(dart.dsend(index, '>=', length))) {
-      return core.RangeError.index(core.int._check(index), indexable, 'index', null, length);
-    }
-    return new core.RangeError.value(core.num._check(index), 'index');
-  };
-  dart.lazyFn(_js_helper.diagnoseIndexError, () => dynamicAnddynamicToError());
-  _js_helper.diagnoseRangeError = function(start, end, length) {
-    if (!(typeof start == 'number')) {
-      return new core.ArgumentError.value(start, 'start');
-    }
-    if (dart.test(dart.dsend(start, '<', 0)) || dart.test(dart.dsend(start, '>', length))) {
-      return new core.RangeError.range(core.num._check(start), 0, core.int._check(length), 'start');
-    }
-    if (end != null) {
-      if (!(typeof end == 'number')) {
-        return new core.ArgumentError.value(end, 'end');
-      }
-      if (dart.test(dart.dsend(end, '<', start)) || dart.test(dart.dsend(end, '>', length))) {
-        return new core.RangeError.range(core.num._check(end), core.int._check(start), core.int._check(length), 'end');
-      }
-    }
-    return new core.ArgumentError.value(end, "end");
-  };
-  dart.lazyFn(_js_helper.diagnoseRangeError, () => dynamicAnddynamicAnddynamicToError());
-  _js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
-    return receiver.lastIndexOf(element, start);
-  };
-  dart.fn(_js_helper.stringLastIndexOfUnchecked, dynamicAnddynamicAnddynamicTodynamic());
-  _js_helper.argumentErrorValue = function(object) {
-    return new core.ArgumentError.value(object);
-  };
-  dart.lazyFn(_js_helper.argumentErrorValue, () => dynamicToArgumentError());
-  _js_helper.checkNull = function(object) {
-    if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
-    return object;
-  };
-  dart.fn(_js_helper.checkNull, dynamicTodynamic$());
-  _js_helper.checkNum = function(value) {
-    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
-    return value;
-  };
-  dart.fn(_js_helper.checkNum, dynamicTodynamic$());
-  _js_helper.checkInt = function(value) {
-    if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
-    return value;
-  };
-  dart.fn(_js_helper.checkInt, dynamicTodynamic$());
-  _js_helper.checkBool = function(value) {
-    if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
-    return value;
-  };
-  dart.fn(_js_helper.checkBool, dynamicTodynamic$());
-  _js_helper.checkString = function(value) {
-    if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
-    return value;
-  };
-  dart.fn(_js_helper.checkString, dynamicTodynamic$());
-  _js_helper.throwRuntimeError = function(message) {
-    dart.throw(new _js_helper.RuntimeError(message));
-  };
-  dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
-  _js_helper.throwAbstractClassInstantiationError = function(className) {
-    dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
-  };
-  dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
-  _js_helper.throwConcurrentModificationError = function(collection) {
-    dart.throw(new core.ConcurrentModificationError(collection));
-  };
-  dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
-  const _message = Symbol('_message');
-  const _method = Symbol('_method');
-  core.Error = class Error extends core.Object {
-    new() {
-    }
-    static safeToString(object) {
-      if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
-        return dart.toString(object);
-      }
-      if (typeof object == 'string') {
-        return core.Error._stringToSafeString(object);
-      }
-      return core.Error._objectToString(object);
-    }
-    static _stringToSafeString(string) {
-      return _js_helper.jsonEncodeNative(string);
-    }
-    static _objectToString(object) {
-      return _js_helper.Primitives.objectToString(object);
-    }
-    get stackTrace() {
-      return _js_helper.Primitives.extractStackTrace(this);
-    }
-  };
-  dart.setSignature(core.Error, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Error, [])}),
-    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])}),
-    statics: () => ({
-      safeToString: dart.definiteFunctionType(core.String, [core.Object]),
-      _stringToSafeString: dart.definiteFunctionType(core.String, [core.String]),
-      _objectToString: dart.definiteFunctionType(core.String, [core.Object])
-    }),
-    names: ['safeToString', '_stringToSafeString', '_objectToString']
-  });
-  _js_helper.NullError = class NullError extends core.Error {
-    new(message, match) {
-      this[_message] = message;
-      this[_method] = core.String._check(match == null ? null : match.method);
-      super.new();
-    }
-    toString() {
-      if (this[_method] == null) return dart.str`NullError: ${this[_message]}`;
-      return dart.str`NullError: method not found: '${this[_method]}' on null`;
-    }
-  };
-  _js_helper.NullError[dart.implements] = () => [core.NoSuchMethodError];
-  dart.setSignature(_js_helper.NullError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NullError, [core.String, dart.dynamic])}),
-    fields: () => ({
-      [_message]: core.String,
-      [_method]: core.String
-    })
-  });
-  const _receiver = Symbol('_receiver');
-  _js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
-    new(message, match) {
-      this[_message] = message;
-      this[_method] = core.String._check(match == null ? null : match.method);
-      this[_receiver] = core.String._check(match == null ? null : match.receiver);
-      super.new();
-    }
-    toString() {
-      if (this[_method] == null) return dart.str`NoSuchMethodError: ${this[_message]}`;
-      if (this[_receiver] == null) {
-        return dart.str`NoSuchMethodError: method not found: '${this[_method]}' (${this[_message]})`;
-      }
-      return "NoSuchMethodError: " + dart.str`method not found: '${this[_method]}' on '${this[_receiver]}' (${this[_message]})`;
-    }
-  };
-  _js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
-  dart.setSignature(_js_helper.JsNoSuchMethodError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsNoSuchMethodError, [core.String, dart.dynamic])}),
-    fields: () => ({
-      [_message]: core.String,
-      [_method]: core.String,
-      [_receiver]: core.String
-    })
-  });
-  _js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
-    new(message) {
-      this[_message] = message;
-      super.new();
-    }
-    toString() {
-      return dart.test(this[_message][dartx.isEmpty]) ? 'Error' : dart.str`Error: ${this[_message]}`;
-    }
-  };
-  dart.setSignature(_js_helper.UnknownJsTypeError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.UnknownJsTypeError, [core.String])}),
-    fields: () => ({[_message]: core.String})
-  });
-  _js_helper.getTraceFromException = function(exception) {
-    return new _js_helper._StackTrace(exception);
-  };
-  dart.lazyFn(_js_helper.getTraceFromException, () => dynamicToStackTrace());
-  const _exception = Symbol('_exception');
-  const _trace = Symbol('_trace');
-  _js_helper._StackTrace = class _StackTrace extends core.Object {
-    new(exception) {
-      this[_exception] = exception;
-      this[_trace] = null;
-    }
-    toString() {
-      if (this[_trace] != null) return this[_trace];
-      let trace = null;
-      if (this[_exception] !== null && typeof this[_exception] === "object") {
-        trace = this[_exception].stack;
-      }
-      return this[_trace] = trace == null ? '' : trace;
-    }
-  };
-  _js_helper._StackTrace[dart.implements] = () => [core.StackTrace];
-  dart.setSignature(_js_helper._StackTrace, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StackTrace, [dart.dynamic])}),
-    fields: () => ({
-      [_exception]: dart.dynamic,
-      [_trace]: core.String
-    })
-  });
-  _js_helper.objectHashCode = function(object) {
-    if (object == null || typeof object != 'object') {
-      return dart.hashCode(object);
-    } else {
-      return _js_helper.Primitives.objectHashCode(object);
-    }
-  };
-  dart.fn(_js_helper.objectHashCode, dynamicToint());
-  _js_helper.fillLiteralMap = function(keyValuePairs, result) {
-    let index = 0;
-    let length = _js_helper.getLength(keyValuePairs);
-    while (index < dart.notNull(length)) {
-      let key = _js_helper.getIndex(keyValuePairs, index++);
-      let value = _js_helper.getIndex(keyValuePairs, index++);
-      result[dartx._set](key, value);
-    }
-    return result;
-  };
-  dart.lazyFn(_js_helper.fillLiteralMap, () => dynamicAndMapTodynamic());
-  _js_helper.jsHasOwnProperty = function(jsObject, property) {
-    return jsObject.hasOwnProperty(property);
-  };
-  dart.lazyFn(_js_helper.jsHasOwnProperty, () => dynamicAndStringTobool());
-  _js_helper.jsPropertyAccess = function(jsObject, property) {
-    return jsObject[property];
-  };
-  dart.lazyFn(_js_helper.jsPropertyAccess, () => dynamicAndStringTodynamic());
-  _js_helper.getFallThroughError = function() {
-    return new _js_helper.FallThroughErrorImplementation();
-  };
-  dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
-  _js_helper.Creates = class Creates extends core.Object {
-    new(types) {
-      this.types = types;
-    }
-  };
-  dart.setSignature(_js_helper.Creates, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Creates, [core.String])}),
-    fields: () => ({types: core.String})
-  });
-  _js_helper.Returns = class Returns extends core.Object {
-    new(types) {
-      this.types = types;
-    }
-  };
-  dart.setSignature(_js_helper.Returns, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Returns, [core.String])}),
-    fields: () => ({types: core.String})
-  });
-  _js_helper.JSName = class JSName extends core.Object {
-    new(name) {
-      this.name = name;
-    }
-  };
-  dart.setSignature(_js_helper.JSName, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSName, [core.String])}),
-    fields: () => ({name: core.String})
-  });
-  _js_helper.JavaScriptIndexingBehavior = class JavaScriptIndexingBehavior extends core.Object {};
-  _js_helper.TypeErrorImplementation = class TypeErrorImplementation extends core.Error {
-    new(value, actualType, expectedType) {
-      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}'`;
-      super.new();
-    }
-    fromMessage(message) {
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  dart.defineNamedConstructor(_js_helper.TypeErrorImplementation, 'fromMessage');
-  _js_helper.TypeErrorImplementation[dart.implements] = () => [core.TypeError];
-  dart.setSignature(_js_helper.TypeErrorImplementation, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.Object, core.Object, core.Object]),
-      fromMessage: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.String])
-    }),
-    fields: () => ({message: core.String})
-  });
-  _js_helper.CastErrorImplementation = class CastErrorImplementation extends core.Error {
-    new(value, actualType, expectedType) {
-      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` incompatible type '${expectedType}'`;
-      super.new();
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  _js_helper.CastErrorImplementation[dart.implements] = () => [core.CastError];
-  dart.setSignature(_js_helper.CastErrorImplementation, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.CastErrorImplementation, [core.Object, core.Object, core.Object])}),
-    fields: () => ({message: core.String})
-  });
-  _js_helper.StrongModeTypeError = class StrongModeTypeError extends core.Error {
-    new(value, actualType, expectedType) {
-      this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}' in strong mode`;
-      super.new();
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  _js_helper.StrongModeTypeError[dart.implements] = () => [core.TypeError, core.StrongModeError];
-  dart.setSignature(_js_helper.StrongModeTypeError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeTypeError, [core.Object, core.Object, core.Object])}),
-    fields: () => ({message: core.String})
-  });
-  _js_helper.StrongModeCastError = class StrongModeCastError extends core.Error {
-    new(value, actualType, expectedType) {
-      this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` type '${expectedType}' which is incompatible in strong mode`;
-      super.new();
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  _js_helper.StrongModeCastError[dart.implements] = () => [core.CastError, core.StrongModeError];
-  dart.setSignature(_js_helper.StrongModeCastError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeCastError, [core.Object, core.Object, core.Object])}),
-    fields: () => ({message: core.String})
-  });
-  _js_helper.StrongModeErrorImplementation = class StrongModeErrorImplementation extends core.Error {
-    new(message) {
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return this.message;
-    }
-  };
-  _js_helper.StrongModeErrorImplementation[dart.implements] = () => [core.StrongModeError];
-  dart.setSignature(_js_helper.StrongModeErrorImplementation, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeErrorImplementation, [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  core.FallThroughError = class FallThroughError extends core.Error {
-    new() {
-      super.new();
-    }
-  };
-  dart.setSignature(core.FallThroughError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.FallThroughError, [])})
-  });
-  _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
-    new() {
-      super.new();
-    }
-    toString() {
-      return "Switch case fall-through.";
-    }
-  };
-  dart.setSignature(_js_helper.FallThroughErrorImplementation, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.FallThroughErrorImplementation, [])})
-  });
-  _js_helper.RuntimeError = class RuntimeError extends core.Error {
-    new(message) {
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return dart.str`RuntimeError: ${this.message}`;
-    }
-  };
-  dart.setSignature(_js_helper.RuntimeError, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.RuntimeError, [dart.dynamic])}),
-    fields: () => ({message: dart.dynamic})
-  });
-  core.AssertionError = class AssertionError extends core.Error {
-    new() {
-      super.new();
-    }
-    toString() {
-      return "Assertion failed";
-    }
-  };
-  dart.setSignature(core.AssertionError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.AssertionError, [])})
-  });
-  _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
-    new(message) {
-      this[_message] = message;
-      super.new();
-    }
-    toString() {
-      return dart.str`Assertion failed: ${this[_message]}`;
-    }
-  };
-  dart.setSignature(_js_helper.AssertionErrorWithMessage, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.AssertionErrorWithMessage, [core.Object])}),
-    fields: () => ({[_message]: core.Object})
-  });
-  _js_helper.random64 = function() {
-    let int32a = Math.random() * 0x100000000 >>> 0;
-    let int32b = Math.random() * 0x100000000 >>> 0;
-    return int32a + int32b * 4294967296;
-  };
-  dart.fn(_js_helper.random64, VoidToint());
-  _js_helper.jsonEncodeNative = function(string) {
-    return JSON.stringify(string);
-  };
-  dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
-  const _jsIterator = Symbol('_jsIterator');
-  const _current$0 = Symbol('_current');
-  _js_helper.SyncIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class SyncIterator extends core.Object {
-      new(jsIterator) {
-        this[_jsIterator] = jsIterator;
-        this[_current$0] = null;
-      }
-      get current() {
-        return this[_current$0];
-      }
-      moveNext() {
-        let ret = this[_jsIterator].next();
-        this[_current$0] = ret.value;
-        return !ret.done;
-      }
-    }
-    dart.addTypeTests(SyncIterator);
-    SyncIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(SyncIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
-      fields: () => ({
-        [_jsIterator]: dart.dynamic,
-        [_current$0]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return SyncIterator;
-  });
-  _js_helper.SyncIterator = SyncIterator();
-  const _generator = Symbol('_generator');
-  const _args = Symbol('_args');
-  collection.IterableBase$ = dart.generic(E => {
-    class IterableBase extends core.Iterable$(E) {
-      new() {
-        super.new();
-      }
-      static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
-        if (leftDelimiter === void 0) leftDelimiter = '(';
-        if (rightDelimiter === void 0) rightDelimiter = ')';
-        if (dart.test(collection._isToStringVisiting(iterable))) {
-          if (leftDelimiter == "(" && rightDelimiter == ")") {
-            return "(...)";
-          }
-          return dart.str`${leftDelimiter}...${rightDelimiter}`;
-        }
-        let parts = [];
-        collection._toStringVisiting[dartx.add](iterable);
-        try {
-          collection._iterablePartsToStrings(iterable, parts);
-        } finally {
-          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
-          collection._toStringVisiting[dartx.removeLast]();
-        }
-        return (() => {
-          let _ = new core.StringBuffer(leftDelimiter);
-          _.writeAll(parts, ", ");
-          _.write(rightDelimiter);
-          return _;
-        })().toString();
-      }
-      static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
-        if (leftDelimiter === void 0) leftDelimiter = '(';
-        if (rightDelimiter === void 0) rightDelimiter = ')';
-        if (dart.test(collection._isToStringVisiting(iterable))) {
-          return dart.str`${leftDelimiter}...${rightDelimiter}`;
-        }
-        let buffer = new core.StringBuffer(leftDelimiter);
-        collection._toStringVisiting[dartx.add](iterable);
-        try {
-          buffer.writeAll(iterable, ", ");
-        } finally {
-          dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
-          collection._toStringVisiting[dartx.removeLast]();
-        }
-        buffer.write(rightDelimiter);
-        return buffer.toString();
-      }
-    }
-    dart.setSignature(IterableBase, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.IterableBase$(E), [])}),
-      statics: () => ({
-        iterableToShortString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String]),
-        iterableToFullString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String])
-      }),
-      names: ['iterableToShortString', 'iterableToFullString']
-    });
-    return IterableBase;
-  });
-  collection.IterableBase = IterableBase();
-  _js_helper.SyncIterable$ = dart.generic(E => {
-    let SyncIteratorOfE = () => (SyncIteratorOfE = dart.constFn(_js_helper.SyncIterator$(E)))();
-    class SyncIterable extends collection.IterableBase$(E) {
-      new(generator, args) {
-        this[_generator] = generator;
-        this[_args] = args;
-        super.new();
-      }
-      [_jsIterator]() {
-        return this[_generator](...this[_args]);
-      }
-      get iterator() {
-        return new (SyncIteratorOfE())(this[_jsIterator]());
-      }
-    }
-    dart.setSignature(SyncIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterable$(E), [dart.dynamic, dart.dynamic])}),
-      fields: () => ({
-        [_generator]: dart.dynamic,
-        [_args]: dart.dynamic
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({[_jsIterator]: dart.definiteFunctionType(dart.dynamic, [])})
-    });
-    dart.defineExtensionMembers(SyncIterable, ['iterator']);
-    return SyncIterable;
-  });
-  _js_helper.SyncIterable = SyncIterable();
-  _js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
-    new() {
-      super.new();
-    }
-    toString() {
-      return 'Failed assertion: boolean expression must not be null';
-    }
-  };
-  _js_helper.NoThrows = class NoThrows extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_js_helper.NoThrows, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoThrows, [])})
-  });
-  _js_helper.NoInline = class NoInline extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_js_helper.NoInline, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoInline, [])})
-  });
-  _js_helper.Native = class Native extends core.Object {
-    new(name) {
-      this.name = name;
-    }
-  };
-  dart.setSignature(_js_helper.Native, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.Native, [core.String])}),
-    fields: () => ({name: core.String})
-  });
-  _js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {
-    new(opts) {
-      let name = opts && 'name' in opts ? opts.name : null;
-      this.name = name;
-    }
-  };
-  dart.setSignature(_js_helper.JsPeerInterface, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsPeerInterface, [], {name: core.String})}),
-    fields: () => ({name: core.String})
-  });
-  _js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_js_helper.SupportJsExtensionMethods, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
-  });
-  const _length$0 = Symbol('_length');
-  const _strings = Symbol('_strings');
-  const _nums = Symbol('_nums');
-  const _rest = Symbol('_rest');
-  const _first = Symbol('_first');
-  const _last = Symbol('_last');
-  const _modifications = Symbol('_modifications');
-  const _containsTableEntry = Symbol('_containsTableEntry');
-  const _getBucket = Symbol('_getBucket');
-  const _getTableCell = Symbol('_getTableCell');
-  const _newHashTable = Symbol('_newHashTable');
-  const _addHashTableEntry = Symbol('_addHashTableEntry');
-  const _getTableBucket = Symbol('_getTableBucket');
-  const _newLinkedCell = Symbol('_newLinkedCell');
-  const _setTableEntry = Symbol('_setTableEntry');
-  const _removeHashTableEntry = Symbol('_removeHashTableEntry');
-  const _unlinkCell = Symbol('_unlinkCell');
-  const _modified = Symbol('_modified');
-  const _next = Symbol('_next');
-  const _deleteTableEntry = Symbol('_deleteTableEntry');
-  const _previous = Symbol('_previous');
-  _js_helper.JsLinkedHashMap$ = dart.generic((K, V) => {
-    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
-    let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
-    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
-    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
-    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
-    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
-    class JsLinkedHashMap extends core.Object {
-      new() {
-        this[_length$0] = 0;
-        this[_strings] = null;
-        this[_nums] = null;
-        this[_rest] = null;
-        this[_first] = null;
-        this[_last] = null;
-        this[_modifications] = 0;
-      }
-      static es6() {
-        return new (JsLinkedHashMapOfK$V())();
-      }
-      get length() {
-        return this[_length$0];
-      }
-      get isEmpty() {
-        return this[_length$0] == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      get keys() {
-        return new (LinkedHashMapKeyIterableOfK())(this);
-      }
-      get values() {
-        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
-      }
-      containsKey(key) {
-        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
-          let strings = this[_strings];
-          if (strings == null) return false;
-          return this[_containsTableEntry](strings, key);
-        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
-          let nums = this[_nums];
-          if (nums == null) return false;
-          return this[_containsTableEntry](nums, key);
+      let subscription = null;
+      subscription = this.listen(dart.fn(element => {
+        if (seenFirst) {
+          async._runUserCode(dart.fn(() => combine(value, element), VoidToT()), dart.fn(newValue => {
+            value = newValue;
+          }, TToNull()), async._cancelAndErrorClosure(subscription, result));
         } else {
-          return this.internalContainsKey(key);
+          value = element;
+          seenFirst = true;
         }
-      }
-      internalContainsKey(key) {
-        let rest = this[_rest];
-        if (rest == null) return false;
-        let bucket = this[_getBucket](rest, key);
-        return dart.notNull(this.internalFindBucketIndex(bucket, key)) >= 0;
-      }
-      containsValue(value) {
-        return this.keys[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        other[dartx.forEach](dart.fn((key, value) => {
-          this._set(key, value);
-        }, KAndVToNull()));
-      }
-      _get(key) {
-        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
-          let strings = this[_strings];
-          if (strings == null) return null;
-          let cell = this[_getTableCell](strings, key);
-          return cell == null ? null : cell.hashMapCellValue;
-        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
-          let nums = this[_nums];
-          if (nums == null) return null;
-          let cell = this[_getTableCell](nums, key);
-          return cell == null ? null : cell.hashMapCellValue;
-        } else {
-          return this.internalGet(key);
-        }
-      }
-      internalGet(key) {
-        let rest = this[_rest];
-        if (rest == null) return null;
-        let bucket = this[_getBucket](rest, key);
-        let index = this.internalFindBucketIndex(bucket, key);
-        if (dart.notNull(index) < 0) return null;
-        let cell = bucket[index];
-        return cell.hashMapCellValue;
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
-          let strings = this[_strings];
-          if (strings == null) this[_strings] = strings = this[_newHashTable]();
-          this[_addHashTableEntry](strings, key, value);
-        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
-          let nums = this[_nums];
-          if (nums == null) this[_nums] = nums = this[_newHashTable]();
-          this[_addHashTableEntry](nums, key, value);
-        } else {
-          this.internalSet(key, value);
-        }
-        return value;
-      }
-      internalSet(key, value) {
-        K._check(key);
-        V._check(value);
-        let rest = this[_rest];
-        if (rest == null) this[_rest] = rest = this[_newHashTable]();
-        let hash = this.internalComputeHashCode(key);
-        let bucket = this[_getTableBucket](rest, hash);
-        if (bucket == null) {
-          let cell = this[_newLinkedCell](key, value);
-          this[_setTableEntry](rest, hash, [cell]);
-        } else {
-          let index = this.internalFindBucketIndex(bucket, key);
-          if (dart.notNull(index) >= 0) {
-            let cell = bucket[index];
-            cell.hashMapCellValue = value;
-          } else {
-            let cell = this[_newLinkedCell](key, value);
-            bucket.push(cell);
-          }
-        }
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        if (dart.test(this.containsKey(key))) return this._get(key);
-        let value = ifAbsent();
-        this._set(key, value);
-        return value;
-      }
-      remove(key) {
-        if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
-          return this[_removeHashTableEntry](this[_strings], key);
-        } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
-          return this[_removeHashTableEntry](this[_nums], key);
-        } else {
-          return this.internalRemove(key);
-        }
-      }
-      internalRemove(key) {
-        let rest = this[_rest];
-        if (rest == null) return null;
-        let bucket = this[_getBucket](rest, key);
-        let index = this.internalFindBucketIndex(bucket, key);
-        if (dart.notNull(index) < 0) return null;
-        let cell = bucket.splice(index, 1)[0];
-        this[_unlinkCell](cell);
-        return cell.hashMapCellValue;
-      }
-      clear() {
-        if (dart.notNull(this[_length$0]) > 0) {
-          this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
-          this[_length$0] = 0;
-          this[_modified]();
-        }
-      }
-      forEach(action) {
-        let cell = this[_first];
-        let modifications = this[_modifications];
-        while (cell != null) {
-          action(cell.hashMapCellKey, cell.hashMapCellValue);
-          if (modifications != this[_modifications]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          cell = cell[_next];
-        }
-      }
-      [_addHashTableEntry](table, key, value) {
-        K._check(key);
-        V._check(value);
-        let cell = this[_getTableCell](table, key);
-        if (cell == null) {
-          this[_setTableEntry](table, key, this[_newLinkedCell](key, value));
-        } else {
-          cell.hashMapCellValue = value;
-        }
-      }
-      [_removeHashTableEntry](table, key) {
-        if (table == null) return null;
-        let cell = this[_getTableCell](table, key);
-        if (cell == null) return null;
-        this[_unlinkCell](cell);
-        this[_deleteTableEntry](table, key);
-        return cell.hashMapCellValue;
-      }
-      [_modified]() {
-        this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
-      }
-      [_newLinkedCell](key, value) {
-        K._check(key);
-        V._check(value);
-        let cell = new (LinkedHashMapCellOfK$V())(key, value);
-        if (this[_first] == null) {
-          this[_first] = this[_last] = cell;
-        } else {
-          let last = this[_last];
-          cell[_previous] = last;
-          this[_last] = last[_next] = cell;
-        }
-        this[_length$0] = dart.notNull(this[_length$0]) + 1;
-        this[_modified]();
-        return cell;
-      }
-      [_unlinkCell](cell) {
-        LinkedHashMapCellOfK$V()._check(cell);
-        let previous = cell[_previous];
-        let next = cell[_next];
-        if (previous == null) {
-          dart.assert(dart.equals(cell, this[_first]));
-          this[_first] = next;
-        } else {
-          previous[_next] = next;
-        }
-        if (next == null) {
-          dart.assert(dart.equals(cell, this[_last]));
-          this[_last] = previous;
-        } else {
-          next[_previous] = previous;
-        }
-        this[_length$0] = dart.notNull(this[_length$0]) - 1;
-        this[_modified]();
-      }
-      static _isStringKey(key) {
-        return typeof key == 'string';
-      }
-      static _isNumericKey(key) {
-        return typeof key == 'number' && (key & 0x3ffffff) === key;
-      }
-      internalComputeHashCode(key) {
-        return dart.hashCode(key) & 0x3ffffff;
-      }
-      [_getBucket](table, key) {
-        let hash = this.internalComputeHashCode(key);
-        return this[_getTableBucket](table, hash);
-      }
-      internalFindBucketIndex(bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (dart.equals(cell.hashMapCellKey, key)) return i;
-        }
-        return -1;
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-      [_getTableCell](table, key) {
-        return table[key];
-      }
-      [_getTableBucket](table, key) {
-        return table[key];
-      }
-      [_setTableEntry](table, key, value) {
-        dart.assert(value != null);
-        table[key] = value;
-      }
-      [_deleteTableEntry](table, key) {
-        delete table[key];
-      }
-      [_containsTableEntry](table, key) {
-        let cell = this[_getTableCell](table, key);
-        return cell != null;
-      }
-      [_newHashTable]() {
-        let table = Object.create(null);
-        let temporaryKey = '<non-identifier-key>';
-        this[_setTableEntry](table, temporaryKey, table);
-        this[_deleteTableEntry](table, temporaryKey);
-        return table;
-      }
-    }
-    dart.addTypeTests(JsLinkedHashMap);
-    JsLinkedHashMap[dart.implements] = () => [LinkedHashMapOfK$V(), InternalMapOfK$V()];
-    dart.setSignature(JsLinkedHashMap, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), []),
-        es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
-      }),
-      fields: () => ({
-        [_length$0]: core.int,
-        [_strings]: dart.dynamic,
-        [_nums]: dart.dynamic,
-        [_rest]: dart.dynamic,
-        [_first]: LinkedHashMapCellOfK$V(),
-        [_last]: LinkedHashMapCellOfK$V(),
-        [_modifications]: core.int
-      }),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        keys: dart.definiteFunctionType(core.Iterable$(K), []),
-        values: dart.definiteFunctionType(core.Iterable$(V), [])
-      }),
-      methods: () => ({
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        internalContainsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        _get: dart.definiteFunctionType(V, [core.Object]),
-        internalGet: dart.definiteFunctionType(V, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [K, V]),
-        internalSet: dart.definiteFunctionType(dart.void, [K, V]),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
-        remove: dart.definiteFunctionType(V, [core.Object]),
-        internalRemove: dart.definiteFunctionType(V, [core.Object]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
-        [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
-        [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
-        [_modified]: dart.definiteFunctionType(dart.void, []),
-        [_newLinkedCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V]),
-        [_unlinkCell]: dart.definiteFunctionType(dart.void, [LinkedHashMapCellOfK$V()]),
-        internalComputeHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
-        [_getBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
-        internalFindBucketIndex: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
-        [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
-        [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
-        [_setTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-        [_deleteTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-        [_containsTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-        [_newHashTable]: dart.definiteFunctionType(dart.dynamic, [])
-      }),
-      statics: () => ({
-        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic])
-      }),
-      names: ['_isStringKey', '_isNumericKey']
-    });
-    dart.defineExtensionMembers(JsLinkedHashMap, [
-      'containsKey',
-      'containsValue',
-      'addAll',
-      '_get',
-      '_set',
-      'putIfAbsent',
-      'remove',
-      'clear',
-      'forEach',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'keys',
-      'values'
-    ]);
-    return JsLinkedHashMap;
-  });
-  _js_helper.JsLinkedHashMap = JsLinkedHashMap();
-  _js_helper.Es6LinkedHashMap$ = dart.generic((K, V) => {
-    class Es6LinkedHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
-      new() {
-        super.new();
-      }
-      [_getTableCell](table, key) {
-        return table.get(key);
-      }
-      [_getTableBucket](table, key) {
-        return table.get(key);
-      }
-      [_setTableEntry](table, key, value) {
-        table.set(key, value);
-      }
-      [_deleteTableEntry](table, key) {
-        table.delete(key);
-      }
-      [_containsTableEntry](table, key) {
-        return table.has(key);
-      }
-      [_newHashTable]() {
-        return new Map();
-      }
-    }
-    return Es6LinkedHashMap;
-  });
-  _js_helper.Es6LinkedHashMap = Es6LinkedHashMap();
-  _js_helper.LinkedHashMapCell$ = dart.generic((K, V) => {
-    let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
-    class LinkedHashMapCell extends core.Object {
-      new(hashMapCellKey, hashMapCellValue) {
-        this.hashMapCellKey = hashMapCellKey;
-        this.hashMapCellValue = hashMapCellValue;
-        this[_next] = null;
-        this[_previous] = null;
-      }
-    }
-    dart.addTypeTests(LinkedHashMapCell);
-    dart.setSignature(LinkedHashMapCell, {
-      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V])}),
-      fields: () => ({
-        hashMapCellKey: K,
-        hashMapCellValue: V,
-        [_next]: LinkedHashMapCellOfK$V(),
-        [_previous]: LinkedHashMapCellOfK$V()
-      })
-    });
-    return LinkedHashMapCell;
-  });
-  _js_helper.LinkedHashMapCell = LinkedHashMapCell();
-  const _map = Symbol('_map');
-  _js_helper.LinkedHashMapKeyIterable$ = dart.generic(E => {
-    let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-    class LinkedHashMapKeyIterable extends core.Iterable$(E) {
-      new(map) {
-        this[_map] = map;
-        super.new();
-      }
-      get length() {
-        return this[_map][_length$0];
-      }
-      get isEmpty() {
-        return this[_map][_length$0] == 0;
-      }
-      get iterator() {
-        return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
-      }
-      contains(element) {
-        return this[_map].containsKey(element);
-      }
-      forEach(f) {
-        let cell = this[_map][_first];
-        let modifications = this[_map][_modifications];
-        while (cell != null) {
-          f(cell.hashMapCellKey);
-          if (modifications != this[_map][_modifications]) {
-            dart.throw(new core.ConcurrentModificationError(this[_map]));
-          }
-          cell = cell[_next];
-        }
-      }
-    }
-    LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(LinkedHashMapKeyIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterable$(E), [JsLinkedHashMapOfE$dynamic()])}),
-      fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(LinkedHashMapKeyIterable, [
-      'contains',
-      'forEach',
-      'length',
-      'isEmpty',
-      'iterator'
-    ]);
-    return LinkedHashMapKeyIterable;
-  });
-  _js_helper.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable();
-  const _cell = Symbol('_cell');
-  _js_helper.LinkedHashMapKeyIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-    let LinkedHashMapCellOfE$dynamic = () => (LinkedHashMapCellOfE$dynamic = dart.constFn(_js_helper.LinkedHashMapCell$(E, dart.dynamic)))();
-    class LinkedHashMapKeyIterator extends core.Object {
-      new(map, modifications) {
-        this[_map] = map;
-        this[_modifications] = modifications;
-        this[_cell] = null;
-        this[_current$0] = null;
-        this[_cell] = this[_map][_first];
-      }
-      get current() {
-        return this[_current$0];
-      }
-      moveNext() {
-        if (this[_modifications] != this[_map][_modifications]) {
-          dart.throw(new core.ConcurrentModificationError(this[_map]));
-        } else if (this[_cell] == null) {
-          this[_current$0] = null;
-          return false;
-        } else {
-          this[_current$0] = this[_cell].hashMapCellKey;
-          this[_cell] = this[_cell][_next];
-          return true;
-        }
-      }
-    }
-    dart.addTypeTests(LinkedHashMapKeyIterator);
-    LinkedHashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(LinkedHashMapKeyIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterator$(E), [JsLinkedHashMapOfE$dynamic(), core.int])}),
-      fields: () => ({
-        [_map]: JsLinkedHashMapOfE$dynamic(),
-        [_modifications]: core.int,
-        [_cell]: LinkedHashMapCellOfE$dynamic(),
-        [_current$0]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return LinkedHashMapKeyIterator;
-  });
-  _js_helper.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator();
-  _js_helper.defineProperty = function(obj, property, value) {
-    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
-  };
-  dart.lazyFn(_js_helper.defineProperty, () => dynamicAndStringAnddynamicTovoid());
-  _js_helper.convertDartClosureToJS = function(F) {
-    return (closure, arity) => {
-      return closure;
-    };
-  };
-  dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
-  _js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
-  };
-  dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
-  _js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
-  };
-  dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
-  _js_helper.makeLeafDispatchRecord = function(interceptor) {
-  };
-  dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
-  const _nativeRegExp = Symbol('_nativeRegExp');
-  _js_helper.regExpGetNative = function(regexp) {
-    return regexp[_nativeRegExp];
-  };
-  dart.lazyFn(_js_helper.regExpGetNative, () => JSSyntaxRegExpTodynamic());
-  const _nativeGlobalVersion = Symbol('_nativeGlobalVersion');
-  _js_helper.regExpGetGlobalNative = function(regexp) {
-    let nativeRegexp = regexp[_nativeGlobalVersion];
-    nativeRegexp.lastIndex = 0;
-    return nativeRegexp;
-  };
-  dart.lazyFn(_js_helper.regExpGetGlobalNative, () => JSSyntaxRegExpTodynamic());
-  const _nativeAnchoredVersion = Symbol('_nativeAnchoredVersion');
-  _js_helper.regExpCaptureCount = function(regexp) {
-    let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
-    let match = nativeAnchoredRegExp.exec('');
-    return core.int._check(dart.dsend(dart.dload(match, 'length'), '-', 2));
-  };
-  dart.lazyFn(_js_helper.regExpCaptureCount, () => JSSyntaxRegExpToint());
-  const _nativeGlobalRegExp = Symbol('_nativeGlobalRegExp');
-  const _nativeAnchoredRegExp = Symbol('_nativeAnchoredRegExp');
-  const _isMultiLine = Symbol('_isMultiLine');
-  const _isCaseSensitive = Symbol('_isCaseSensitive');
-  const _execGlobal = Symbol('_execGlobal');
-  const _execAnchored = Symbol('_execAnchored');
-  _js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
-    toString() {
-      return dart.str`RegExp/${this.pattern}/`;
-    }
-    new(source, opts) {
-      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
-      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
-      this.pattern = source;
-      this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, false);
-      this[_nativeGlobalRegExp] = null;
-      this[_nativeAnchoredRegExp] = null;
-    }
-    get [_nativeGlobalVersion]() {
-      if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
-      return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], true);
-    }
-    get [_nativeAnchoredVersion]() {
-      if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
-      return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str`${this.pattern}|()`, this[_isMultiLine], this[_isCaseSensitive], true);
-    }
-    get [_isMultiLine]() {
-      return this[_nativeRegExp].multiline;
-    }
-    get [_isCaseSensitive]() {
-      return !this[_nativeRegExp].ignoreCase;
-    }
-    static makeNative(source, multiLine, caseSensitive, global) {
-      _js_helper.checkString(source);
-      let m = dart.test(multiLine) ? 'm' : '';
-      let i = dart.test(caseSensitive) ? '' : 'i';
-      let g = dart.test(global) ? 'g' : '';
-      let regexp = (function() {
-        try {
-          return new RegExp(source, m + i + g);
-        } catch (e) {
-          return e;
-        }
-
-      })();
-      if (regexp instanceof RegExp) return regexp;
-      let errorMessage = String(regexp);
-      dart.throw(new core.FormatException(dart.str`Illegal RegExp pattern: ${source}, ${errorMessage}`));
-    }
-    firstMatch(string) {
-      let m = this[_nativeRegExp].exec(_js_helper.checkString(string));
-      if (m == null) return null;
-      return new _js_helper._MatchImplementation(this, m);
-    }
-    hasMatch(string) {
-      return this[_nativeRegExp].test(_js_helper.checkString(string));
-    }
-    stringMatch(string) {
-      let match = this.firstMatch(string);
-      if (match != null) return match.group(0);
-      return null;
-    }
-    allMatches(string, start) {
-      if (start === void 0) start = 0;
-      _js_helper.checkString(string);
-      _js_helper.checkInt(start);
-      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
-      }
-      return new _js_helper._AllMatchesIterable(this, string, start);
-    }
-    [_execGlobal](string, start) {
-      let regexp = this[_nativeGlobalVersion];
-      regexp.lastIndex = start;
-      let match = regexp.exec(string);
-      if (match == null) return null;
-      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
-    }
-    [_execAnchored](string, start) {
-      let regexp = this[_nativeAnchoredVersion];
-      regexp.lastIndex = start;
-      let match = regexp.exec(string);
-      if (match == null) return null;
-      if (match[dartx._get](dart.notNull(match[dartx.length]) - 1) != null) return null;
-      match[dartx.length] = dart.notNull(match[dartx.length]) - 1;
-      return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
-    }
-    matchAsPrefix(string, start) {
-      if (start === void 0) start = 0;
-      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
-        dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
-      }
-      return this[_execAnchored](string, start);
-    }
-    get isMultiLine() {
-      return this[_isMultiLine];
-    }
-    get isCaseSensitive() {
-      return this[_isCaseSensitive];
-    }
-  };
-  _js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
-  dart.setSignature(_js_helper.JSSyntaxRegExp, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSSyntaxRegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})}),
-    fields: () => ({
-      pattern: core.String,
-      [_nativeRegExp]: dart.dynamic,
-      [_nativeGlobalRegExp]: dart.dynamic,
-      [_nativeAnchoredRegExp]: dart.dynamic
-    }),
-    getters: () => ({
-      [_nativeGlobalVersion]: dart.definiteFunctionType(dart.dynamic, []),
-      [_nativeAnchoredVersion]: dart.definiteFunctionType(dart.dynamic, []),
-      [_isMultiLine]: dart.definiteFunctionType(core.bool, []),
-      [_isCaseSensitive]: dart.definiteFunctionType(core.bool, []),
-      isMultiLine: dart.definiteFunctionType(core.bool, []),
-      isCaseSensitive: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      firstMatch: dart.definiteFunctionType(core.Match, [core.String]),
-      hasMatch: dart.definiteFunctionType(core.bool, [core.String]),
-      stringMatch: dart.definiteFunctionType(core.String, [core.String]),
-      allMatches: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
-      [_execGlobal]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
-      [_execAnchored]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
-      matchAsPrefix: dart.definiteFunctionType(core.Match, [core.String], [core.int])
-    }),
-    statics: () => ({makeNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool, core.bool, core.bool])}),
-    names: ['makeNative']
-  });
-  dart.defineExtensionMembers(_js_helper.JSSyntaxRegExp, ['allMatches', 'matchAsPrefix']);
-  const _match = Symbol('_match');
-  _js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
-    new(pattern, match) {
-      this.pattern = pattern;
-      this[_match] = match;
-      dart.assert(typeof this[_match].input == 'string');
-      dart.assert(typeof this[_match].index == 'number');
-    }
-    get input() {
-      return this[_match].input;
-    }
-    get start() {
-      return this[_match].index;
-    }
-    get end() {
-      return dart.notNull(this.start) + dart.notNull(this[_match][dartx._get](0)[dartx.length]);
-    }
-    group(index) {
-      return this[_match][dartx._get](index);
-    }
-    _get(index) {
-      return this.group(index);
-    }
-    get groupCount() {
-      return dart.notNull(this[_match][dartx.length]) - 1;
-    }
-    groups(groups) {
-      let out = JSArrayOfString().of([]);
-      for (let i of groups) {
-        out[dartx.add](this.group(i));
-      }
-      return out;
-    }
-  };
-  _js_helper._MatchImplementation[dart.implements] = () => [core.Match];
-  dart.setSignature(_js_helper._MatchImplementation, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._MatchImplementation, [core.Pattern, ListOfString()])}),
-    fields: () => ({
-      pattern: core.Pattern,
-      [_match]: ListOfString()
-    }),
-    getters: () => ({
-      input: dart.definiteFunctionType(core.String, []),
-      start: dart.definiteFunctionType(core.int, []),
-      end: dart.definiteFunctionType(core.int, []),
-      groupCount: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      group: dart.definiteFunctionType(core.String, [core.int]),
-      _get: dart.definiteFunctionType(core.String, [core.int]),
-      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
-    })
-  });
-  const _re = Symbol('_re');
-  const _string$ = Symbol('_string');
-  const _start$ = Symbol('_start');
-  core.Match = class Match extends core.Object {};
-  _js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
-    new(re, string, start) {
-      this[_re] = re;
-      this[_string$] = string;
-      this[_start$] = start;
-      super.new();
-    }
-    get iterator() {
-      return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
-    }
-  };
-  dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
-  dart.setSignature(_js_helper._AllMatchesIterable, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
-    fields: () => ({
-      [_re]: _js_helper.JSSyntaxRegExp,
-      [_string$]: core.String,
-      [_start$]: core.int
-    }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
-  });
-  dart.defineExtensionMembers(_js_helper._AllMatchesIterable, ['iterator']);
-  const _regExp = Symbol('_regExp');
-  const _nextIndex = Symbol('_nextIndex');
-  _js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
-    new(regExp, string, nextIndex) {
-      this[_regExp] = regExp;
-      this[_string$] = string;
-      this[_nextIndex] = nextIndex;
-      this[_current$0] = null;
-    }
-    get current() {
-      return this[_current$0];
-    }
-    moveNext() {
-      if (this[_string$] == null) return false;
-      if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
-        let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
-        if (match != null) {
-          this[_current$0] = match;
-          let nextIndex = match.end;
-          if (match.start == nextIndex) {
-            nextIndex = dart.notNull(nextIndex) + 1;
-          }
-          this[_nextIndex] = nextIndex;
-          return true;
-        }
-      }
-      this[_current$0] = null;
-      this[_string$] = null;
-      return false;
-    }
-  };
-  _js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
-  dart.setSignature(_js_helper._AllMatchesIterator, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
-    fields: () => ({
-      [_regExp]: _js_helper.JSSyntaxRegExp,
-      [_string$]: core.String,
-      [_nextIndex]: core.int,
-      [_current$0]: core.Match
-    }),
-    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
-    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-  });
-  _js_helper.firstMatchAfter = function(regExp, string, start) {
-    return regExp[_execGlobal](string, start);
-  };
-  dart.lazyFn(_js_helper.firstMatchAfter, () => JSSyntaxRegExpAndStringAndintToMatch());
-  _js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
-    return receiver.indexOf(other, startIndex);
-  };
-  dart.fn(_js_helper.stringIndexOfStringUnchecked, dynamicAnddynamicAnddynamicToint());
-  _js_helper.substring1Unchecked = function(receiver, startIndex) {
-    return receiver.substring(startIndex);
-  };
-  dart.lazyFn(_js_helper.substring1Unchecked, () => dynamicAnddynamicToString());
-  _js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
-    return receiver.substring(startIndex, endIndex);
-  };
-  dart.lazyFn(_js_helper.substring2Unchecked, () => dynamicAnddynamicAnddynamicToString());
-  _js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
-    return dart.notNull(_js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex)) >= 0;
-  };
-  dart.lazyFn(_js_helper.stringContainsStringUnchecked, () => dynamicAnddynamicAnddynamicTobool());
-  _js_helper.StringMatch = class StringMatch extends core.Object {
-    new(start, input, pattern) {
-      this.start = start;
-      this.input = input;
-      this.pattern = pattern;
-    }
-    get end() {
-      return dart.notNull(this.start) + dart.notNull(this.pattern[dartx.length]);
-    }
-    _get(g) {
-      return this.group(g);
-    }
-    get groupCount() {
-      return 0;
-    }
-    group(group_) {
-      if (group_ != 0) {
-        dart.throw(new core.RangeError.value(group_));
-      }
-      return this.pattern;
-    }
-    groups(groups_) {
-      let result = ListOfString().new();
-      for (let g of groups_) {
-        result[dartx.add](this.group(g));
-      }
-      return result;
-    }
-  };
-  _js_helper.StringMatch[dart.implements] = () => [core.Match];
-  dart.setSignature(_js_helper.StringMatch, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper.StringMatch, [core.int, core.String, core.String])}),
-    fields: () => ({
-      start: core.int,
-      input: core.String,
-      pattern: core.String
-    }),
-    getters: () => ({
-      end: dart.definiteFunctionType(core.int, []),
-      groupCount: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      _get: dart.definiteFunctionType(core.String, [core.int]),
-      group: dart.definiteFunctionType(core.String, [core.int]),
-      groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
-    })
-  });
-  _js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
-    return new _js_helper._StringAllMatchesIterable(string, pattern, startIndex);
-  };
-  dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
-  const _input = Symbol('_input');
-  const _pattern = Symbol('_pattern');
-  const _index$0 = Symbol('_index');
-  _js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
-    new(input, pattern, index) {
-      this[_input] = input;
-      this[_pattern] = pattern;
-      this[_index$0] = index;
-      super.new();
-    }
-    get iterator() {
-      return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
-    }
-    get first() {
-      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
-      if (dart.notNull(index) >= 0) {
-        return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
-      }
-      dart.throw(_internal.IterableElementError.noElement());
-    }
-  };
-  dart.addSimpleTypeTests(_js_helper._StringAllMatchesIterable);
-  dart.setSignature(_js_helper._StringAllMatchesIterable, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterable, [core.String, core.String, core.int])}),
-    fields: () => ({
-      [_input]: core.String,
-      [_pattern]: core.String,
-      [_index$0]: core.int
-    }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
-  });
-  dart.defineExtensionMembers(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
-  _js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
-    new(input, pattern, index) {
-      this[_input] = input;
-      this[_pattern] = pattern;
-      this[_index$0] = index;
-      this[_current$0] = null;
-    }
-    moveNext() {
-      if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
-        this[_current$0] = null;
-        return false;
-      }
-      let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
-      if (dart.notNull(index) < 0) {
-        this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
-        this[_current$0] = null;
-        return false;
-      }
-      let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
-      this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
-      if (end == this[_index$0]) end++;
-      this[_index$0] = end;
-      return true;
-    }
-    get current() {
-      return this[_current$0];
-    }
-  };
-  _js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
-  dart.setSignature(_js_helper._StringAllMatchesIterator, {
-    constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterator, [core.String, core.String, core.int])}),
-    fields: () => ({
-      [_input]: core.String,
-      [_pattern]: core.String,
-      [_index$0]: core.int,
-      [_current$0]: core.Match
-    }),
-    getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
-    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-  });
-  _js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
-    if (typeof other == 'string') {
-      return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
-    } else if (_js_helper.JSSyntaxRegExp.is(other)) {
-      return other.hasMatch(receiver[dartx.substring](startIndex));
-    } else {
-      let substr = receiver[dartx.substring](startIndex);
-      return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', substr), 'isNotEmpty'));
-    }
-  };
-  dart.lazyFn(_js_helper.stringContainsUnchecked, () => StringAnddynamicAndintTobool());
-  _js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
-    replacement = replacement.replace(/\$/g, "$$$$");
-    return receiver.replace(replacer, replacement);
-  };
-  dart.lazyFn(_js_helper.stringReplaceJS, () => dynamicAnddynamicAnddynamicToString());
-  _js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
-    let match = regexp[_execGlobal](receiver, startIndex);
-    if (match == null) return receiver;
-    let start = match.start;
-    let end = match.end;
-    return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
-  };
-  dart.lazyFn(_js_helper.stringReplaceFirstRE, () => StringAndJSSyntaxRegExpAndString__ToString());
-  _js_helper.quoteStringForRegExp = function(string) {
-    return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
-  };
-  dart.lazyFn(_js_helper.quoteStringForRegExp, () => dynamicToString());
-  _js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
-    _js_helper.checkString(replacement);
-    if (typeof pattern == 'string') {
-      if (pattern == "") {
-        if (receiver == "") {
-          return replacement;
-        } else {
-          let result = new core.StringBuffer();
-          let length = receiver[dartx.length];
-          result.write(replacement);
-          for (let i = 0; i < dart.notNull(length); i++) {
-            result.write(receiver[dartx._get](i));
-            result.write(replacement);
-          }
-          return result.toString();
-        }
-      } else {
-        let quoted = _js_helper.quoteStringForRegExp(pattern);
-        let replacer = new RegExp(quoted, 'g');
-        return _js_helper.stringReplaceJS(receiver, replacer, replacement);
-      }
-    } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
-      let re = _js_helper.regExpGetGlobalNative(pattern);
-      return _js_helper.stringReplaceJS(receiver, re, replacement);
-    } else {
-      _js_helper.checkNull(pattern);
-      dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
-    }
-  };
-  dart.lazyFn(_js_helper.stringReplaceAllUnchecked, () => StringAndPatternAndStringToString());
-  _js_helper._matchString = function(match) {
-    return match._get(0);
-  };
-  dart.lazyFn(_js_helper._matchString, () => MatchToString$());
-  _js_helper._stringIdentity = function(string) {
-    return string;
-  };
-  dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
-  _js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
-    if (onMatch == null) onMatch = _js_helper._matchString;
-    if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
-    if (typeof pattern == 'string') {
-      return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
-    }
-    if (!core.Pattern.is(pattern)) {
-      dart.throw(new core.ArgumentError.value(pattern, 'pattern', 'is not a Pattern'));
-    }
-    let buffer = new core.StringBuffer();
-    let startIndex = 0;
-    for (let match of pattern[dartx.allMatches](receiver)) {
-      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, match.start)));
-      buffer.write(onMatch(match));
-      startIndex = match.end;
-    }
-    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
-    return buffer.toString();
-  };
-  dart.lazyFn(_js_helper.stringReplaceAllFuncUnchecked, () => StringAndPatternAndFn__ToString());
-  _js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
-    let buffer = new core.StringBuffer();
-    let length = receiver[dartx.length];
-    let i = 0;
-    buffer.write(onNonMatch(""));
-    while (i < dart.notNull(length)) {
-      buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
-      let code = receiver[dartx.codeUnitAt](i);
-      if ((dart.notNull(code) & ~1023) == 55296 && dart.notNull(length) > i + 1) {
-        code = receiver[dartx.codeUnitAt](i + 1);
-        if ((dart.notNull(code) & ~1023) == 56320) {
-          buffer.write(onNonMatch(receiver[dartx.substring](i, i + 2)));
-          i = i + 2;
-          continue;
-        }
-      }
-      buffer.write(onNonMatch(receiver[dartx._get](i)));
-      i++;
-    }
-    buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
-    buffer.write(onNonMatch(""));
-    return buffer.toString();
-  };
-  dart.lazyFn(_js_helper.stringReplaceAllEmptyFuncUnchecked, () => StringAndFnAndFnToString());
-  _js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
-    let patternLength = pattern[dartx.length];
-    if (patternLength == 0) {
-      return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
-    }
-    let length = receiver[dartx.length];
-    let buffer = new core.StringBuffer();
-    let startIndex = 0;
-    while (startIndex < dart.notNull(length)) {
-      let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
-      if (position == -1) {
-        break;
-      }
-      buffer.write(onNonMatch(receiver[dartx.substring](startIndex, position)));
-      buffer.write(onMatch(new _js_helper.StringMatch(position, receiver, pattern)));
-      startIndex = dart.notNull(position) + dart.notNull(patternLength);
-    }
-    buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
-    return buffer.toString();
-  };
-  dart.lazyFn(_js_helper.stringReplaceAllStringFuncUnchecked, () => StringAndStringAndFn__ToString());
-  _js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
-    if (typeof pattern == 'string') {
-      let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
-      if (dart.notNull(index) < 0) return receiver;
-      let end = dart.notNull(index) + dart.notNull(pattern[dartx.length]);
-      return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
-    }
-    if (_js_helper.JSSyntaxRegExp.is(pattern)) {
-      return startIndex == 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
-    }
-    _js_helper.checkNull(pattern);
-    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
-    if (!dart.test(matches.moveNext())) return receiver;
-    let match = matches.current;
-    return receiver[dartx.replaceRange](match.start, match.end, replacement);
-  };
-  dart.lazyFn(_js_helper.stringReplaceFirstUnchecked, () => StringAndPatternAndString__ToString());
-  _js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
-    let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
-    if (!dart.test(matches.moveNext())) return receiver;
-    let match = matches.current;
-    let replacement = dart.str`${replace(match)}`;
-    return receiver[dartx.replaceRange](match.start, match.end, replacement);
-  };
-  dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
-  _js_helper.stringJoinUnchecked = function(array, separator) {
-    return array.join(separator);
-  };
-  dart.lazyFn(_js_helper.stringJoinUnchecked, () => dynamicAnddynamicToString());
-  _js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
-    let prefix = receiver.substring(0, start);
-    let suffix = receiver.substring(end);
-    return dart.str`${prefix}${replacement}${suffix}`;
-  };
-  dart.lazyFn(_js_helper.stringReplaceRangeUnchecked, () => StringAndintAndint__ToString());
-  _js_helper.getRuntimeType = function(object) {
-    return dart.getReifiedType(object);
-  };
-  dart.fn(_js_helper.getRuntimeType, dynamicToType());
-  _js_helper.getIndex = function(array, index) {
-    dart.assert(_js_helper.isJsArray(array));
-    return array[index];
-  };
-  dart.fn(_js_helper.getIndex, dynamicAndintTodynamic());
-  _js_helper.getLength = function(array) {
-    dart.assert(_js_helper.isJsArray(array));
-    return array.length;
-  };
-  dart.fn(_js_helper.getLength, dynamicToint());
-  _js_helper.isJsArray = function(value) {
-    return _interceptors.JSArray.is(value);
-  };
-  dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
-  _js_mirrors.getName = function(symbol) {
-    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
-  };
-  dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
-  _js_mirrors.getSymbol = function(name, library) {
-    return dart.throw(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
-  };
-  dart.lazyFn(_js_mirrors.getSymbol, () => dynamicAnddynamicToSymbol());
-  dart.defineLazy(_js_mirrors, {
-    get currentJsMirrorSystem() {
-      return dart.throw(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
-    }
-  });
-  dart.defineLazy(_js_mirrors, {
-    get _typeMirror() {
-      return Symbol("_typeMirror");
-    }
-  });
-  _js_mirrors.reflect = function(reflectee) {
-    if (core.Function.is(reflectee)) {
-      return new _js_mirrors.JsClosureMirror._(reflectee);
-    } else {
-      return new _js_mirrors.JsInstanceMirror._(reflectee);
-    }
-  };
-  dart.lazyFn(_js_mirrors.reflect, () => dynamicToInstanceMirror());
-  _js_mirrors.reflectType = function(key) {
-    let unwrapped = _js_mirrors._unwrap(key);
-    let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
-    if (property != null) {
-      return property.value;
-    }
-    let mirror = new _js_mirrors.JsClassMirror._(key);
-    unwrapped[_js_mirrors._typeMirror] = mirror;
-    return mirror;
-  };
-  dart.lazyFn(_js_mirrors.reflectType, () => TypeToTypeMirror());
-  dart.defineLazy(_js_mirrors, {
-    get _dart() {
-      return dart;
-    }
-  });
-  _js_mirrors._dload = function(obj, name) {
-    return _js_mirrors._dart.dloadMirror(obj, name);
-  };
-  dart.lazyFn(_js_mirrors._dload, () => dynamicAndStringTodynamic());
-  _js_mirrors._dput = function(obj, name, val) {
-    _js_mirrors._dart.dputMirror(obj, name, val);
-  };
-  dart.lazyFn(_js_mirrors._dput, () => dynamicAndStringAnddynamicTovoid());
-  _js_mirrors._dcall = function(obj, args) {
-    return _js_mirrors._dart.dcall(obj, ...args);
-  };
-  dart.lazyFn(_js_mirrors._dcall, () => dynamicAndListTodynamic());
-  _js_mirrors._dsend = function(obj, name, args) {
-    return _js_mirrors._dart.dsend(obj, name, ...args);
-  };
-  dart.lazyFn(_js_mirrors._dsend, () => dynamicAndStringAndListTodynamic());
-  _js_mirrors._getGenericClass = function(obj) {
-    return _js_mirrors._dart.getGenericClass(obj);
-  };
-  dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
-  _js_mirrors._getGenericArgs = function(obj) {
-    return _js_mirrors._dart.getGenericArgs(obj);
-  };
-  dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
-  _js_mirrors._defaultConstructorType = function(type) {
-    return _js_mirrors._dart.definiteFunctionType(type, []);
-  };
-  dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
-  _js_mirrors._getMixins = function(type) {
-    return _js_mirrors._dart.getMixins(type, []);
-  };
-  dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
-  _js_mirrors._Lazy$ = dart.generic(T => {
-    const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
-    return _Lazy;
-  });
-  _js_mirrors._Lazy = _Lazy();
-  _js_mirrors._getESSymbol = function(symbol) {
-    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
-  };
-  dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
-  _js_mirrors._getMember = function(symbol) {
-    let privateSymbol = _js_mirrors._getESSymbol(symbol);
-    if (privateSymbol != null) {
-      return privateSymbol;
-    }
-    let name = _js_mirrors.getName(symbol);
-    switch (name) {
-      case '[]':
-      {
-        name = '_get';
-        break;
-      }
-      case '[]=':
-      {
-        name = '_set';
-        break;
-      }
-      case 'unary-':
-      {
-        name = '_negate';
-        break;
-      }
-      case 'constructor':
-      case 'prototype':
-      {
-        name = dart.str`_${name}`;
-        break;
-      }
-    }
-    return name;
-  };
-  dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
-  _js_mirrors._getNameForESSymbol = function(member) {
-    dart.assert(typeof member == "symbol");
-    let str = dart.toString(member);
-    dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
-    return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
-  };
-  dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
-  _js_mirrors._getSymbolForESSymbol = function(member) {
-    let name = _js_mirrors._getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
-  };
-  dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
-  _js_mirrors._getSymbolForMember = function(member) {
-    if (typeof member == 'string') {
-      return core.Symbol.new(member);
-    } else {
-      let name = _js_mirrors._getNameForESSymbol(member);
-      return new _internal.Symbol.es6(name, member);
-    }
-  };
-  dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
-  _js_mirrors._toDartMap = function(data) {
-    if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
-    let map = MapOfSymbol$dynamic().new();
-    let publicMembers = Object.getOwnPropertyNames(data);
-    for (let member of core.Iterable._check(publicMembers)) {
-      let symbol = core.Symbol.new(core.String._check(member));
-      map[dartx._set](symbol, data[member]);
-    }
-    let privateMembers = Object.getOwnPropertySymbols(data);
-    for (let member of core.Iterable._check(privateMembers)) {
-      let symbol = _js_mirrors._getSymbolForESSymbol(member);
-      map[dartx._set](symbol, data[member]);
-    }
-    return map;
-  };
-  dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getConstructors = function(obj) {
-    let sig = _js_mirrors._dart.getConstructorSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getFields = function(obj) {
-    let sig = _js_mirrors._dart.getFieldSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getMethods = function(obj) {
-    let sig = _js_mirrors._dart.getMethodSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getGetters = function(obj) {
-    let sig = _js_mirrors._dart.getGetterSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getSetters = function(obj) {
-    let sig = _js_mirrors._dart.getSetterSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getStaticFields = function(obj) {
-    let sig = _js_mirrors._dart.getStaticFieldSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getStatics = function(obj) {
-    let sig = _js_mirrors._dart.getStaticSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getStaticGetters = function(obj) {
-    let sig = _js_mirrors._dart.getStaticGetterSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._getStaticSetters = function(obj) {
-    let sig = _js_mirrors._dart.getStaticSetterSig(obj);
-    return _js_mirrors._toDartMap(sig);
-  };
-  dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
-  _js_mirrors._unwrap = function(obj) {
-    return _js_mirrors._dart.unwrapType(obj);
-  };
-  dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
-  _js_mirrors._wrap = function(obj) {
-    return _js_mirrors._dart.wrapType(obj);
-  };
-  dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
-  _js_mirrors._runtimeType = function(obj) {
-    return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
-  };
-  dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
-  _js_mirrors._unimplemented = function(t, i) {
-    dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
-  };
-  dart.fn(_js_mirrors._unimplemented, TypeAndInvocationTodynamic());
-  _js_mirrors._toJsMap = function(map) {
-    let obj = {};
-    map[dartx.forEach](dart.fn((key, value) => {
-      obj[_js_mirrors.getName(key)] = value;
-    }, SymbolAnddynamicToNull()));
-    return obj;
-  };
-  dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
-  _js_mirrors.JsMirror = class JsMirror extends core.Object {
-    noSuchMethod(i) {
-      _js_mirrors._unimplemented(this.runtimeType, i);
-    }
-  };
-  _js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
-  _js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
-    get identifiers() {
-      return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl('identifiers', [], {isGetter: true})));
-    }
-    get isShow() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isShow', [], {isGetter: true})));
-    }
-    get isHide() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isHide', [], {isGetter: true})));
-    }
-  };
-  _js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
-  _js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
-    get simpleName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('simpleName', [], {isGetter: true})));
-    }
-    get qualifiedName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
-    }
-    get owner() {
-      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
-    }
-    get isPrivate() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
-    }
-    get isTopLevel() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    get metadata() {
-      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
-    }
-  };
-  _js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
-  _js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
-    get debugName() {
-      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('debugName', [], {isGetter: true})));
-    }
-    get isCurrent() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isCurrent', [], {isGetter: true})));
-    }
-    get rootLibrary() {
-      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('rootLibrary', [], {isGetter: true})));
-    }
-  };
-  _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
-  _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
-    get isImport() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
-    }
-    get isExport() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
-    }
-    get sourceLibrary() {
-      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
-    }
-    get targetLibrary() {
-      return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('targetLibrary', [], {isGetter: true})));
-    }
-    get prefix() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('prefix', [], {isGetter: true})));
-    }
-    get combinators() {
-      return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl('combinators', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    get metadata() {
-      return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
-    }
-  };
-  _js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
-  _js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
-    invoke(...args) {
-      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('invoke', args, {isMethod: true})));
-    }
-    getField(...args) {
-      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('getField', args, {isMethod: true})));
-    }
-    setField(...args) {
-      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
-    }
-  };
-  _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
-  const _getAccessor = Symbol('_getAccessor');
-  _js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
-    get hasReflectee() {
-      return true;
-    }
-    get type() {
-      if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
-      return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
-    }
-    _(reflectee) {
-      this.reflectee = reflectee;
-    }
-    ['=='](other) {
-      return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
-    }
-    get hashCode() {
-      return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
-    }
-    [_getAccessor](reflectee, symbol, args, namedArgs) {
-      if (args === void 0) args = null;
-      if (namedArgs === void 0) namedArgs = null;
-      return _js_mirrors._getMember(symbol);
-    }
-    getField(symbol) {
-      let name = this[_getAccessor](this.reflectee, symbol);
-      let field = _js_mirrors._dload(this.reflectee, core.String._check(name));
-      return _js_mirrors.reflect(field);
-    }
-    setField(symbol, value) {
-      let name = this[_getAccessor](this.reflectee, symbol);
-      _js_mirrors._dput(this.reflectee, core.String._check(name), value);
-      return _js_mirrors.reflect(value);
-    }
-    invoke(symbol, args, namedArgs) {
-      if (namedArgs === void 0) namedArgs = null;
-      let name = this[_getAccessor](this.reflectee, symbol, args, namedArgs);
-      if (namedArgs != null) {
-        args = core.List.from(args);
-        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
-      }
-      let result = _js_mirrors._dsend(this.reflectee, core.String._check(name), args);
-      return _js_mirrors.reflect(result);
-    }
-    toString() {
-      return dart.str`InstanceMirror on '${this.reflectee}'`;
-    }
-    delegate(...args) {
-      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsInstanceMirror, '_');
-  _js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
-  dart.setSignature(_js_mirrors.JsInstanceMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsInstanceMirror, [dart.dynamic])}),
-    fields: () => ({reflectee: dart.dynamic}),
-    getters: () => ({
-      hasReflectee: dart.definiteFunctionType(core.bool, []),
-      type: dart.definiteFunctionType(mirrors.ClassMirror, [])
-    }),
-    methods: () => ({
-      '==': dart.definiteFunctionType(core.bool, [core.Object]),
-      [_getAccessor]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Symbol], [core.List, MapOfSymbol$dynamic()]),
-      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
-      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
-      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
-    })
-  });
-  _js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
-    _(reflectee) {
-      super._(reflectee);
-    }
-    apply(args, namedArgs) {
-      if (namedArgs === void 0) namedArgs = null;
-      if (namedArgs != null) {
-        args = core.List.from(args);
-        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
-      }
-      let result = _js_mirrors._dcall(this.reflectee, args);
-      return _js_mirrors.reflect(result);
-    }
-    delegate(...args) {
-      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
-    }
-    get function() {
-      return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl('function', [], {isGetter: true})));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsClosureMirror, '_');
-  _js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
-  dart.setSignature(_js_mirrors.JsClosureMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
-    methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
-  });
-  const _metadata$ = Symbol('_metadata');
-  const _cls = Symbol('_cls');
-  let const$0;
-  const _declarations = Symbol('_declarations');
-  const _raw = Symbol('_raw');
-  const _mixin = Symbol('_mixin');
-  const _typeArguments = Symbol('_typeArguments');
-  let const$1;
-  _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
-    get metadata() {
-      if (this[_metadata$] == null) {
-        let unwrapped = _js_mirrors._unwrap(this[_cls]);
-        let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
-        this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
-      }
-      return this[_metadata$];
-    }
-    get declarations() {
-      if (this[_declarations] == null) {
-        this[_declarations] = MapOfSymbol$DeclarationMirror().new();
-        let unwrapped = _js_mirrors._unwrap(this[_cls]);
-        let constructors = _js_mirrors._getConstructors(unwrapped);
-        constructors[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        if (dart.test(constructors[dartx.isEmpty])) {
-          let name = 'new';
-          let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
-          let symbol = core.Symbol.new(name);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
-        }
-        let fields = _js_mirrors._getFields(unwrapped);
-        fields[dartx.forEach](dart.fn((symbol, t) => {
-          let metadata = [];
-          if (core.List.is(t)) {
-            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
-            t = dart.dindex(t, 0);
-          }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicToNull()));
-        let methods = _js_mirrors._getMethods(unwrapped);
-        methods[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        let getters = _js_mirrors._getGetters(unwrapped);
-        getters[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        let setters = _js_mirrors._getSetters(unwrapped);
-        setters[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
-          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        let staticFields = _js_mirrors._getStaticFields(unwrapped);
-        staticFields[dartx.forEach](dart.fn((symbol, t) => {
-          let name = _js_mirrors.getName(symbol);
-          let metadata = [];
-          if (core.List.is(t)) {
-            metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
-            t = dart.dindex(t, 0);
-          }
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
-        }, SymbolAnddynamicToNull()));
-        let statics = _js_mirrors._getStatics(unwrapped);
-        statics[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
-        staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
-        staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
-          let name = _js_mirrors.getName(symbol);
-          this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
-        }, SymbolAnddynamicToNull()));
-        this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
-      }
-      return this[_declarations];
-    }
-    _(cls) {
-      this[_cls] = cls;
-      this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
-      this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
-      this[_mixin] = null;
-      this[_typeArguments] = null;
-      this[_metadata$] = null;
-      this[_declarations] = null;
-      let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
-      if (typeArgs == null) {
-        this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
-      } else {
-        this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
-      }
-    }
-    newInstance(constructorName, args, namedArgs) {
-      if (namedArgs === void 0) namedArgs = null;
-      let name = _js_mirrors.getName(constructorName);
-      dart.assert(namedArgs == null || dart.test(namedArgs[dartx.isEmpty]));
-      let instance = name == 'new' || name == '' ? new (_js_mirrors._unwrap(this[_cls]))(...args) : new (_js_mirrors._unwrap(this[_cls]))[name](...args);
-      return _js_mirrors.reflect(instance);
-    }
-    getField(symbol) {
-      let name = _js_mirrors.getName(symbol);
-      return _js_mirrors.reflect(_js_mirrors._unwrap(this[_cls])[name]);
-    }
-    setField(symbol, value) {
-      let name = _js_mirrors.getName(symbol);
-      _js_mirrors._unwrap(this[_cls])[name] = value;
-      return _js_mirrors.reflect(value);
-    }
-    invoke(symbol, args, namedArgs) {
-      if (namedArgs === void 0) namedArgs = null;
-      let name = _js_mirrors.getName(symbol);
-      if (namedArgs != null) {
-        args = core.List.from(args);
-        args[dartx.add](_js_mirrors._toJsMap(namedArgs));
-      }
-      let result = _js_mirrors._unwrap(this[_cls])[name](...args);
-      return _js_mirrors.reflect(result);
-    }
-    get superinterfaces() {
-      let interfaceThunk = _js_mirrors._unwrap(this[_cls])[dart.implements];
-      if (interfaceThunk == null) {
-        return JSArrayOfClassMirror().of([]);
-      } else {
-        let interfaces = interfaceThunk();
-        return ListOfClassMirror()._check(interfaces[dartx.map](mirrors.TypeMirror)(dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror()))[dartx.toList]());
-      }
-    }
-    get hasReflectedType() {
-      return true;
-    }
-    get reflectedType() {
-      return this[_cls];
-    }
-    get isOriginalDeclaration() {
-      return this[_raw] == null;
-    }
-    get typeArguments() {
-      return this[_typeArguments];
-    }
-    get originalDeclaration() {
-      if (this[_raw] == null) {
-        return this;
-      }
-      dart.throw(new core.UnimplementedError("ClassMirror.originalDeclaration unimplemented"));
-    }
-    get superclass() {
-      if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
-        return null;
-      } else {
-        return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
-      }
-    }
-    get mixin() {
-      if (this[_mixin] != null) {
-        return this[_mixin];
-      }
-      let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
-      if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
-        this[_mixin] = this;
-        return this[_mixin];
-      }
-      if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
-        dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
-      }
-      this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
-      return this[_mixin];
-    }
-    toString() {
-      return dart.str`ClassMirror on '${this[_cls]}'`;
-    }
-    get qualifiedName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
-    }
-    get owner() {
-      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
-    }
-    get isPrivate() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
-    }
-    get isTopLevel() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    isSubtypeOf(...args) {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubtypeOf', args, {isMethod: true})));
-    }
-    isAssignableTo(...args) {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAssignableTo', args, {isMethod: true})));
-    }
-    get typeVariables() {
-      return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
-    }
-    isSubclassOf(...args) {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
-    }
-    get isAbstract() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
-    }
-    get instanceMembers() {
-      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
-    }
-    get staticMembers() {
-      return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('staticMembers', [], {isGetter: true})));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsClassMirror, '_');
-  _js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
-  dart.setSignature(_js_mirrors.JsClassMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClassMirror, [core.Type])}),
-    fields: () => ({
-      [_cls]: core.Type,
-      simpleName: core.Symbol,
-      [_raw]: dart.dynamic,
-      [_mixin]: mirrors.ClassMirror,
-      [_typeArguments]: ListOfTypeMirror(),
-      [_metadata$]: ListOfInstanceMirror(),
-      [_declarations]: MapOfSymbol$DeclarationMirror()
-    }),
-    getters: () => ({
-      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), []),
-      declarations: dart.definiteFunctionType(core.Map$(core.Symbol, mirrors.DeclarationMirror), []),
-      superinterfaces: dart.definiteFunctionType(core.List$(mirrors.ClassMirror), []),
-      hasReflectedType: dart.definiteFunctionType(core.bool, []),
-      reflectedType: dart.definiteFunctionType(core.Type, []),
-      isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
-      typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
-      originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
-      superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
-      mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
-    }),
-    methods: () => ({
-      newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
-      getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
-      setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
-      invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
-    })
-  });
-  const _symbol = Symbol('_symbol');
-  const _name$0 = Symbol('_name');
-  _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
-    get simpleName() {
-      return this[_symbol];
-    }
-    _(symbol, t, annotations) {
-      this[_symbol] = symbol;
-      this[_name$0] = _js_mirrors.getName(symbol);
-      this.type = _js_mirrors.reflectType(t);
-      this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
-      this.isStatic = false;
-      this.isFinal = false;
-    }
-    toString() {
-      return dart.str`VariableMirror on '${this[_name$0]}'`;
-    }
-    get qualifiedName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
-    }
-    get owner() {
-      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
-    }
-    get isPrivate() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
-    }
-    get isTopLevel() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    get isConst() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
-  _js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
-  dart.setSignature(_js_mirrors.JsVariableMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
-    fields: () => ({
-      [_symbol]: core.Symbol,
-      [_name$0]: core.String,
-      type: mirrors.TypeMirror,
-      metadata: ListOfInstanceMirror(),
-      isStatic: core.bool,
-      isFinal: core.bool
-    }),
-    getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
-  });
-  _js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
-    _(member, t, annotations) {
-      super._(member, t, annotations);
-    }
-    toString() {
-      return dart.str`ParameterMirror on '${this[_name$0]}'`;
-    }
-    get qualifiedName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
-    }
-    get owner() {
-      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
-    }
-    get isPrivate() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
-    }
-    get isTopLevel() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    get isConst() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
-    }
-    get isOptional() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOptional', [], {isGetter: true})));
-    }
-    get isNamed() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isNamed', [], {isGetter: true})));
-    }
-    get hasDefaultValue() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('hasDefaultValue', [], {isGetter: true})));
-    }
-    get defaultValue() {
-      return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('defaultValue', [], {isGetter: true})));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
-  _js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
-  dart.setSignature(_js_mirrors.JsParameterMirror, {
-    constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
-  });
-  const _params = Symbol('_params');
-  const _createParameterMirrorList = Symbol('_createParameterMirrorList');
-  let const$2;
-  let const$3;
-  let const$4;
-  _js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
-    get isSetter() {
-      return this[_name$0][dartx.endsWith]('=');
-    }
-    get isPrivate() {
-      return this[_name$0][dartx.startsWith]('_');
-    }
-    get simpleName() {
-      return this[_symbol];
-    }
-    _constructor(cls, symbol, ftype) {
-      this[_symbol] = symbol;
-      this[_name$0] = _js_mirrors.getName(symbol);
-      this.isConstructor = true;
-      this.isStatic = false;
-      this[_params] = null;
-      this[_metadata$] = null;
-      this.isFinal = false;
-      this[_createParameterMirrorList](ftype);
-    }
-    _instanceMethod(cls, symbol, ftype) {
-      this[_symbol] = symbol;
-      this[_name$0] = _js_mirrors.getName(symbol);
-      this.isConstructor = false;
-      this.isStatic = false;
-      this[_params] = null;
-      this[_metadata$] = null;
-      this.isFinal = false;
-      this[_createParameterMirrorList](ftype);
-    }
-    _staticMethod(cls, symbol, ftype) {
-      this[_symbol] = symbol;
-      this[_name$0] = _js_mirrors.getName(symbol);
-      this.isConstructor = false;
-      this.isStatic = true;
-      this[_params] = null;
-      this[_metadata$] = null;
-      this.isFinal = false;
-      this[_createParameterMirrorList](ftype);
-    }
-    get constructorName() {
-      return dart.test(this.isConstructor) ? this[_symbol] : null;
-    }
-    get parameters() {
-      return this[_params];
-    }
-    get metadata() {
-      return this[_metadata$];
-    }
-    [_createParameterMirrorList](ftype) {
-      if (ftype == null) {
-        this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
-        this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
-        return;
-      }
-      if (!core.Function.is(ftype) && core.List.is(ftype)) {
-        this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
-        ftype = dart.dindex(ftype, 0);
-      } else {
-        this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
-      }
-      if (typeof ftype == "function") {
-        ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
-      }
-      let args = core.List._check(dart.dload(ftype, 'args'));
-      let opts = core.List._check(dart.dload(ftype, 'optionals'));
-      let params = ListOfParameterMirror().new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
-      for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
-        let type = args[dartx._get](i);
-        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
-        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
-        params[dartx._set](i, param);
-      }
-      for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
-        let type = opts[dartx._get](i);
-        let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
-        let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
-        params[dartx._set](i + dart.notNull(args[dartx.length]), param);
-      }
-      this[_params] = ListOfParameterMirror().unmodifiable(params);
-    }
-    toString() {
-      return dart.str`MethodMirror on '${this[_name$0]}'`;
-    }
-    get qualifiedName() {
-      return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
-    }
-    get owner() {
-      return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
-    }
-    get isTopLevel() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
-    }
-    get location() {
-      return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
-    }
-    get returnType() {
-      return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl('returnType', [], {isGetter: true})));
-    }
-    get source() {
-      return core.String._check(this.noSuchMethod(new dart.InvocationImpl('source', [], {isGetter: true})));
-    }
-    get isAbstract() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
-    }
-    get isSynthetic() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSynthetic', [], {isGetter: true})));
-    }
-    get isRegularMethod() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRegularMethod', [], {isGetter: true})));
-    }
-    get isOperator() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOperator', [], {isGetter: true})));
-    }
-    get isGetter() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGetter', [], {isGetter: true})));
-    }
-    get isConstConstructor() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConstConstructor', [], {isGetter: true})));
-    }
-    get isGenerativeConstructor() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGenerativeConstructor', [], {isGetter: true})));
-    }
-    get isRedirectingConstructor() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRedirectingConstructor', [], {isGetter: true})));
-    }
-    get isFactoryConstructor() {
-      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isFactoryConstructor', [], {isGetter: true})));
-    }
-  };
-  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_constructor');
-  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_instanceMethod');
-  dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_staticMethod');
-  _js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
-  dart.setSignature(_js_mirrors.JsMethodMirror, {
-    constructors: () => ({
-      _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
-      _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
-      _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
-    }),
-    fields: () => ({
-      [_symbol]: core.Symbol,
-      [_name$0]: core.String,
-      [_params]: ListOfParameterMirror(),
-      [_metadata$]: ListOfInstanceMirror(),
-      isConstructor: core.bool,
-      isStatic: core.bool,
-      isFinal: core.bool
-    }),
-    getters: () => ({
-      isSetter: dart.definiteFunctionType(core.bool, []),
-      isPrivate: dart.definiteFunctionType(core.bool, []),
-      simpleName: dart.definiteFunctionType(core.Symbol, []),
-      constructorName: dart.definiteFunctionType(core.Symbol, []),
-      parameters: dart.definiteFunctionType(core.List$(mirrors.ParameterMirror), []),
-      metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), [])
-    }),
-    methods: () => ({[_createParameterMirrorList]: dart.definiteFunctionType(dart.void, [dart.dynamic])})
-  });
-  _js_primitives.printString = function(string) {
-    if (typeof dartPrint == "function") {
-      dartPrint(string);
-      return;
-    }
-    if (typeof console == "object" && typeof console.log != "undefined") {
-      console.log(string);
-      return;
-    }
-    if (typeof window == "object") {
-      return;
-    }
-    if (typeof print == "function") {
-      print(string);
-      return;
-    }
-    throw "Unable to print message: " + String(string);
-  };
-  dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
-  _metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
-    new(browserName, minimumVersion) {
-      if (minimumVersion === void 0) minimumVersion = null;
-      this.browserName = browserName;
-      this.minimumVersion = minimumVersion;
-    }
-  };
-  dart.setSignature(_metadata.SupportedBrowser, {
-    constructors: () => ({new: dart.definiteFunctionType(_metadata.SupportedBrowser, [core.String], [core.String])}),
-    fields: () => ({
-      browserName: core.String,
-      minimumVersion: core.String
-    }),
-    sfields: () => ({
-      CHROME: core.String,
-      FIREFOX: core.String,
-      IE: core.String,
-      OPERA: core.String,
-      SAFARI: core.String
-    })
-  });
-  _metadata.SupportedBrowser.CHROME = "Chrome";
-  _metadata.SupportedBrowser.FIREFOX = "Firefox";
-  _metadata.SupportedBrowser.IE = "Internet Explorer";
-  _metadata.SupportedBrowser.OPERA = "Opera";
-  _metadata.SupportedBrowser.SAFARI = "Safari";
-  _metadata.Experimental = class Experimental extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_metadata.Experimental, {
-    constructors: () => ({new: dart.definiteFunctionType(_metadata.Experimental, [])})
-  });
-  _metadata.DomName = class DomName extends core.Object {
-    new(name) {
-      this.name = name;
-    }
-  };
-  dart.setSignature(_metadata.DomName, {
-    constructors: () => ({new: dart.definiteFunctionType(_metadata.DomName, [core.String])}),
-    fields: () => ({name: core.String})
-  });
-  _metadata.DocsEditable = class DocsEditable extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_metadata.DocsEditable, {
-    constructors: () => ({new: dart.definiteFunctionType(_metadata.DocsEditable, [])})
-  });
-  _metadata.Unstable = class Unstable extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(_metadata.Unstable, {
-    constructors: () => ({new: dart.definiteFunctionType(_metadata.Unstable, [])})
-  });
-  dart.defineExtensionNames([
-    'lengthInBytes',
-    'runtimeType',
-    'asUint8List',
-    'asInt8List',
-    'asUint8ClampedList',
-    'asUint16List',
-    'asInt16List',
-    'asUint32List',
-    'asInt32List',
-    'asUint64List',
-    'asInt64List',
-    'asInt32x4List',
-    'asFloat32List',
-    'asFloat64List',
-    'asFloat32x4List',
-    'asFloat64x2List',
-    'asByteData'
-  ]);
-  _native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
-    get [dartx.lengthInBytes]() {
-      return this.byteLength;
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.ByteBuffer);
-    }
-    [dartx.asUint8List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
-    }
-    [dartx.asInt8List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
-    }
-    [dartx.asUint8ClampedList](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
-    }
-    [dartx.asUint16List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
-    }
-    [dartx.asInt16List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
-    }
-    [dartx.asUint32List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
-    }
-    [dartx.asInt32List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
-    }
-    [dartx.asUint64List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
-    }
-    [dartx.asInt64List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
-    }
-    [dartx.asInt32x4List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      let storage = _native_typed_data.NativeInt32List._check(this[dartx.asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
-      return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
-    }
-    [dartx.asFloat32List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
-    }
-    [dartx.asFloat64List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
-    }
-    [dartx.asFloat32x4List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      let storage = _native_typed_data.NativeFloat32List._check(this[dartx.asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
-      return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
-    }
-    [dartx.asFloat64x2List](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      let storage = _native_typed_data.NativeFloat64List._check(this[dartx.asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
-      return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
-    }
-    [dartx.asByteData](offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
-    }
-  };
-  _native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
-  dart.setSignature(_native_typed_data.NativeByteBuffer, {
-    getters: () => ({[dartx.lengthInBytes]: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      [dartx.asUint8List]: dart.definiteFunctionType(typed_data.Uint8List, [], [core.int, core.int]),
-      [dartx.asInt8List]: dart.definiteFunctionType(typed_data.Int8List, [], [core.int, core.int]),
-      [dartx.asUint8ClampedList]: dart.definiteFunctionType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
-      [dartx.asUint16List]: dart.definiteFunctionType(typed_data.Uint16List, [], [core.int, core.int]),
-      [dartx.asInt16List]: dart.definiteFunctionType(typed_data.Int16List, [], [core.int, core.int]),
-      [dartx.asUint32List]: dart.definiteFunctionType(typed_data.Uint32List, [], [core.int, core.int]),
-      [dartx.asInt32List]: dart.definiteFunctionType(typed_data.Int32List, [], [core.int, core.int]),
-      [dartx.asUint64List]: dart.definiteFunctionType(typed_data.Uint64List, [], [core.int, core.int]),
-      [dartx.asInt64List]: dart.definiteFunctionType(typed_data.Int64List, [], [core.int, core.int]),
-      [dartx.asInt32x4List]: dart.definiteFunctionType(typed_data.Int32x4List, [], [core.int, core.int]),
-      [dartx.asFloat32List]: dart.definiteFunctionType(typed_data.Float32List, [], [core.int, core.int]),
-      [dartx.asFloat64List]: dart.definiteFunctionType(typed_data.Float64List, [], [core.int, core.int]),
-      [dartx.asFloat32x4List]: dart.definiteFunctionType(typed_data.Float32x4List, [], [core.int, core.int]),
-      [dartx.asFloat64x2List]: dart.definiteFunctionType(typed_data.Float64x2List, [], [core.int, core.int]),
-      [dartx.asByteData]: dart.definiteFunctionType(typed_data.ByteData, [], [core.int, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.ArrayBuffer, _native_typed_data.NativeByteBuffer);
-  const _storage = Symbol('_storage');
-  typed_data.Float32x4 = class Float32x4 extends core.Object {
-    static new(x, y, z, w) {
-      return new _native_typed_data.NativeFloat32x4(x, y, z, w);
-    }
-    static splat(v) {
-      return new _native_typed_data.NativeFloat32x4.splat(v);
-    }
-    static zero() {
-      return new _native_typed_data.NativeFloat32x4.zero();
-    }
-    static fromInt32x4Bits(x) {
-      return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
-    }
-    static fromFloat64x2(v) {
-      return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
-    }
-  };
-  dart.setSignature(typed_data.Float32x4, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float32x4, [core.double, core.double, core.double, core.double]),
-      splat: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      zero: dart.definiteFunctionType(typed_data.Float32x4, []),
-      fromInt32x4Bits: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Int32x4]),
-      fromFloat64x2: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float64x2])
-    }),
-    sfields: () => ({
-      XXXX: core.int,
-      XXXY: core.int,
-      XXXZ: core.int,
-      XXXW: core.int,
-      XXYX: core.int,
-      XXYY: core.int,
-      XXYZ: core.int,
-      XXYW: core.int,
-      XXZX: core.int,
-      XXZY: core.int,
-      XXZZ: core.int,
-      XXZW: core.int,
-      XXWX: core.int,
-      XXWY: core.int,
-      XXWZ: core.int,
-      XXWW: core.int,
-      XYXX: core.int,
-      XYXY: core.int,
-      XYXZ: core.int,
-      XYXW: core.int,
-      XYYX: core.int,
-      XYYY: core.int,
-      XYYZ: core.int,
-      XYYW: core.int,
-      XYZX: core.int,
-      XYZY: core.int,
-      XYZZ: core.int,
-      XYZW: core.int,
-      XYWX: core.int,
-      XYWY: core.int,
-      XYWZ: core.int,
-      XYWW: core.int,
-      XZXX: core.int,
-      XZXY: core.int,
-      XZXZ: core.int,
-      XZXW: core.int,
-      XZYX: core.int,
-      XZYY: core.int,
-      XZYZ: core.int,
-      XZYW: core.int,
-      XZZX: core.int,
-      XZZY: core.int,
-      XZZZ: core.int,
-      XZZW: core.int,
-      XZWX: core.int,
-      XZWY: core.int,
-      XZWZ: core.int,
-      XZWW: core.int,
-      XWXX: core.int,
-      XWXY: core.int,
-      XWXZ: core.int,
-      XWXW: core.int,
-      XWYX: core.int,
-      XWYY: core.int,
-      XWYZ: core.int,
-      XWYW: core.int,
-      XWZX: core.int,
-      XWZY: core.int,
-      XWZZ: core.int,
-      XWZW: core.int,
-      XWWX: core.int,
-      XWWY: core.int,
-      XWWZ: core.int,
-      XWWW: core.int,
-      YXXX: core.int,
-      YXXY: core.int,
-      YXXZ: core.int,
-      YXXW: core.int,
-      YXYX: core.int,
-      YXYY: core.int,
-      YXYZ: core.int,
-      YXYW: core.int,
-      YXZX: core.int,
-      YXZY: core.int,
-      YXZZ: core.int,
-      YXZW: core.int,
-      YXWX: core.int,
-      YXWY: core.int,
-      YXWZ: core.int,
-      YXWW: core.int,
-      YYXX: core.int,
-      YYXY: core.int,
-      YYXZ: core.int,
-      YYXW: core.int,
-      YYYX: core.int,
-      YYYY: core.int,
-      YYYZ: core.int,
-      YYYW: core.int,
-      YYZX: core.int,
-      YYZY: core.int,
-      YYZZ: core.int,
-      YYZW: core.int,
-      YYWX: core.int,
-      YYWY: core.int,
-      YYWZ: core.int,
-      YYWW: core.int,
-      YZXX: core.int,
-      YZXY: core.int,
-      YZXZ: core.int,
-      YZXW: core.int,
-      YZYX: core.int,
-      YZYY: core.int,
-      YZYZ: core.int,
-      YZYW: core.int,
-      YZZX: core.int,
-      YZZY: core.int,
-      YZZZ: core.int,
-      YZZW: core.int,
-      YZWX: core.int,
-      YZWY: core.int,
-      YZWZ: core.int,
-      YZWW: core.int,
-      YWXX: core.int,
-      YWXY: core.int,
-      YWXZ: core.int,
-      YWXW: core.int,
-      YWYX: core.int,
-      YWYY: core.int,
-      YWYZ: core.int,
-      YWYW: core.int,
-      YWZX: core.int,
-      YWZY: core.int,
-      YWZZ: core.int,
-      YWZW: core.int,
-      YWWX: core.int,
-      YWWY: core.int,
-      YWWZ: core.int,
-      YWWW: core.int,
-      ZXXX: core.int,
-      ZXXY: core.int,
-      ZXXZ: core.int,
-      ZXXW: core.int,
-      ZXYX: core.int,
-      ZXYY: core.int,
-      ZXYZ: core.int,
-      ZXYW: core.int,
-      ZXZX: core.int,
-      ZXZY: core.int,
-      ZXZZ: core.int,
-      ZXZW: core.int,
-      ZXWX: core.int,
-      ZXWY: core.int,
-      ZXWZ: core.int,
-      ZXWW: core.int,
-      ZYXX: core.int,
-      ZYXY: core.int,
-      ZYXZ: core.int,
-      ZYXW: core.int,
-      ZYYX: core.int,
-      ZYYY: core.int,
-      ZYYZ: core.int,
-      ZYYW: core.int,
-      ZYZX: core.int,
-      ZYZY: core.int,
-      ZYZZ: core.int,
-      ZYZW: core.int,
-      ZYWX: core.int,
-      ZYWY: core.int,
-      ZYWZ: core.int,
-      ZYWW: core.int,
-      ZZXX: core.int,
-      ZZXY: core.int,
-      ZZXZ: core.int,
-      ZZXW: core.int,
-      ZZYX: core.int,
-      ZZYY: core.int,
-      ZZYZ: core.int,
-      ZZYW: core.int,
-      ZZZX: core.int,
-      ZZZY: core.int,
-      ZZZZ: core.int,
-      ZZZW: core.int,
-      ZZWX: core.int,
-      ZZWY: core.int,
-      ZZWZ: core.int,
-      ZZWW: core.int,
-      ZWXX: core.int,
-      ZWXY: core.int,
-      ZWXZ: core.int,
-      ZWXW: core.int,
-      ZWYX: core.int,
-      ZWYY: core.int,
-      ZWYZ: core.int,
-      ZWYW: core.int,
-      ZWZX: core.int,
-      ZWZY: core.int,
-      ZWZZ: core.int,
-      ZWZW: core.int,
-      ZWWX: core.int,
-      ZWWY: core.int,
-      ZWWZ: core.int,
-      ZWWW: core.int,
-      WXXX: core.int,
-      WXXY: core.int,
-      WXXZ: core.int,
-      WXXW: core.int,
-      WXYX: core.int,
-      WXYY: core.int,
-      WXYZ: core.int,
-      WXYW: core.int,
-      WXZX: core.int,
-      WXZY: core.int,
-      WXZZ: core.int,
-      WXZW: core.int,
-      WXWX: core.int,
-      WXWY: core.int,
-      WXWZ: core.int,
-      WXWW: core.int,
-      WYXX: core.int,
-      WYXY: core.int,
-      WYXZ: core.int,
-      WYXW: core.int,
-      WYYX: core.int,
-      WYYY: core.int,
-      WYYZ: core.int,
-      WYYW: core.int,
-      WYZX: core.int,
-      WYZY: core.int,
-      WYZZ: core.int,
-      WYZW: core.int,
-      WYWX: core.int,
-      WYWY: core.int,
-      WYWZ: core.int,
-      WYWW: core.int,
-      WZXX: core.int,
-      WZXY: core.int,
-      WZXZ: core.int,
-      WZXW: core.int,
-      WZYX: core.int,
-      WZYY: core.int,
-      WZYZ: core.int,
-      WZYW: core.int,
-      WZZX: core.int,
-      WZZY: core.int,
-      WZZZ: core.int,
-      WZZW: core.int,
-      WZWX: core.int,
-      WZWY: core.int,
-      WZWZ: core.int,
-      WZWW: core.int,
-      WWXX: core.int,
-      WWXY: core.int,
-      WWXZ: core.int,
-      WWXW: core.int,
-      WWYX: core.int,
-      WWYY: core.int,
-      WWYZ: core.int,
-      WWYW: core.int,
-      WWZX: core.int,
-      WWZY: core.int,
-      WWZZ: core.int,
-      WWZW: core.int,
-      WWWX: core.int,
-      WWWY: core.int,
-      WWWZ: core.int,
-      WWWW: core.int
-    })
-  });
-  typed_data.Float32x4.XXXX = 0;
-  typed_data.Float32x4.XXXY = 64;
-  typed_data.Float32x4.XXXZ = 128;
-  typed_data.Float32x4.XXXW = 192;
-  typed_data.Float32x4.XXYX = 16;
-  typed_data.Float32x4.XXYY = 80;
-  typed_data.Float32x4.XXYZ = 144;
-  typed_data.Float32x4.XXYW = 208;
-  typed_data.Float32x4.XXZX = 32;
-  typed_data.Float32x4.XXZY = 96;
-  typed_data.Float32x4.XXZZ = 160;
-  typed_data.Float32x4.XXZW = 224;
-  typed_data.Float32x4.XXWX = 48;
-  typed_data.Float32x4.XXWY = 112;
-  typed_data.Float32x4.XXWZ = 176;
-  typed_data.Float32x4.XXWW = 240;
-  typed_data.Float32x4.XYXX = 4;
-  typed_data.Float32x4.XYXY = 68;
-  typed_data.Float32x4.XYXZ = 132;
-  typed_data.Float32x4.XYXW = 196;
-  typed_data.Float32x4.XYYX = 20;
-  typed_data.Float32x4.XYYY = 84;
-  typed_data.Float32x4.XYYZ = 148;
-  typed_data.Float32x4.XYYW = 212;
-  typed_data.Float32x4.XYZX = 36;
-  typed_data.Float32x4.XYZY = 100;
-  typed_data.Float32x4.XYZZ = 164;
-  typed_data.Float32x4.XYZW = 228;
-  typed_data.Float32x4.XYWX = 52;
-  typed_data.Float32x4.XYWY = 116;
-  typed_data.Float32x4.XYWZ = 180;
-  typed_data.Float32x4.XYWW = 244;
-  typed_data.Float32x4.XZXX = 8;
-  typed_data.Float32x4.XZXY = 72;
-  typed_data.Float32x4.XZXZ = 136;
-  typed_data.Float32x4.XZXW = 200;
-  typed_data.Float32x4.XZYX = 24;
-  typed_data.Float32x4.XZYY = 88;
-  typed_data.Float32x4.XZYZ = 152;
-  typed_data.Float32x4.XZYW = 216;
-  typed_data.Float32x4.XZZX = 40;
-  typed_data.Float32x4.XZZY = 104;
-  typed_data.Float32x4.XZZZ = 168;
-  typed_data.Float32x4.XZZW = 232;
-  typed_data.Float32x4.XZWX = 56;
-  typed_data.Float32x4.XZWY = 120;
-  typed_data.Float32x4.XZWZ = 184;
-  typed_data.Float32x4.XZWW = 248;
-  typed_data.Float32x4.XWXX = 12;
-  typed_data.Float32x4.XWXY = 76;
-  typed_data.Float32x4.XWXZ = 140;
-  typed_data.Float32x4.XWXW = 204;
-  typed_data.Float32x4.XWYX = 28;
-  typed_data.Float32x4.XWYY = 92;
-  typed_data.Float32x4.XWYZ = 156;
-  typed_data.Float32x4.XWYW = 220;
-  typed_data.Float32x4.XWZX = 44;
-  typed_data.Float32x4.XWZY = 108;
-  typed_data.Float32x4.XWZZ = 172;
-  typed_data.Float32x4.XWZW = 236;
-  typed_data.Float32x4.XWWX = 60;
-  typed_data.Float32x4.XWWY = 124;
-  typed_data.Float32x4.XWWZ = 188;
-  typed_data.Float32x4.XWWW = 252;
-  typed_data.Float32x4.YXXX = 1;
-  typed_data.Float32x4.YXXY = 65;
-  typed_data.Float32x4.YXXZ = 129;
-  typed_data.Float32x4.YXXW = 193;
-  typed_data.Float32x4.YXYX = 17;
-  typed_data.Float32x4.YXYY = 81;
-  typed_data.Float32x4.YXYZ = 145;
-  typed_data.Float32x4.YXYW = 209;
-  typed_data.Float32x4.YXZX = 33;
-  typed_data.Float32x4.YXZY = 97;
-  typed_data.Float32x4.YXZZ = 161;
-  typed_data.Float32x4.YXZW = 225;
-  typed_data.Float32x4.YXWX = 49;
-  typed_data.Float32x4.YXWY = 113;
-  typed_data.Float32x4.YXWZ = 177;
-  typed_data.Float32x4.YXWW = 241;
-  typed_data.Float32x4.YYXX = 5;
-  typed_data.Float32x4.YYXY = 69;
-  typed_data.Float32x4.YYXZ = 133;
-  typed_data.Float32x4.YYXW = 197;
-  typed_data.Float32x4.YYYX = 21;
-  typed_data.Float32x4.YYYY = 85;
-  typed_data.Float32x4.YYYZ = 149;
-  typed_data.Float32x4.YYYW = 213;
-  typed_data.Float32x4.YYZX = 37;
-  typed_data.Float32x4.YYZY = 101;
-  typed_data.Float32x4.YYZZ = 165;
-  typed_data.Float32x4.YYZW = 229;
-  typed_data.Float32x4.YYWX = 53;
-  typed_data.Float32x4.YYWY = 117;
-  typed_data.Float32x4.YYWZ = 181;
-  typed_data.Float32x4.YYWW = 245;
-  typed_data.Float32x4.YZXX = 9;
-  typed_data.Float32x4.YZXY = 73;
-  typed_data.Float32x4.YZXZ = 137;
-  typed_data.Float32x4.YZXW = 201;
-  typed_data.Float32x4.YZYX = 25;
-  typed_data.Float32x4.YZYY = 89;
-  typed_data.Float32x4.YZYZ = 153;
-  typed_data.Float32x4.YZYW = 217;
-  typed_data.Float32x4.YZZX = 41;
-  typed_data.Float32x4.YZZY = 105;
-  typed_data.Float32x4.YZZZ = 169;
-  typed_data.Float32x4.YZZW = 233;
-  typed_data.Float32x4.YZWX = 57;
-  typed_data.Float32x4.YZWY = 121;
-  typed_data.Float32x4.YZWZ = 185;
-  typed_data.Float32x4.YZWW = 249;
-  typed_data.Float32x4.YWXX = 13;
-  typed_data.Float32x4.YWXY = 77;
-  typed_data.Float32x4.YWXZ = 141;
-  typed_data.Float32x4.YWXW = 205;
-  typed_data.Float32x4.YWYX = 29;
-  typed_data.Float32x4.YWYY = 93;
-  typed_data.Float32x4.YWYZ = 157;
-  typed_data.Float32x4.YWYW = 221;
-  typed_data.Float32x4.YWZX = 45;
-  typed_data.Float32x4.YWZY = 109;
-  typed_data.Float32x4.YWZZ = 173;
-  typed_data.Float32x4.YWZW = 237;
-  typed_data.Float32x4.YWWX = 61;
-  typed_data.Float32x4.YWWY = 125;
-  typed_data.Float32x4.YWWZ = 189;
-  typed_data.Float32x4.YWWW = 253;
-  typed_data.Float32x4.ZXXX = 2;
-  typed_data.Float32x4.ZXXY = 66;
-  typed_data.Float32x4.ZXXZ = 130;
-  typed_data.Float32x4.ZXXW = 194;
-  typed_data.Float32x4.ZXYX = 18;
-  typed_data.Float32x4.ZXYY = 82;
-  typed_data.Float32x4.ZXYZ = 146;
-  typed_data.Float32x4.ZXYW = 210;
-  typed_data.Float32x4.ZXZX = 34;
-  typed_data.Float32x4.ZXZY = 98;
-  typed_data.Float32x4.ZXZZ = 162;
-  typed_data.Float32x4.ZXZW = 226;
-  typed_data.Float32x4.ZXWX = 50;
-  typed_data.Float32x4.ZXWY = 114;
-  typed_data.Float32x4.ZXWZ = 178;
-  typed_data.Float32x4.ZXWW = 242;
-  typed_data.Float32x4.ZYXX = 6;
-  typed_data.Float32x4.ZYXY = 70;
-  typed_data.Float32x4.ZYXZ = 134;
-  typed_data.Float32x4.ZYXW = 198;
-  typed_data.Float32x4.ZYYX = 22;
-  typed_data.Float32x4.ZYYY = 86;
-  typed_data.Float32x4.ZYYZ = 150;
-  typed_data.Float32x4.ZYYW = 214;
-  typed_data.Float32x4.ZYZX = 38;
-  typed_data.Float32x4.ZYZY = 102;
-  typed_data.Float32x4.ZYZZ = 166;
-  typed_data.Float32x4.ZYZW = 230;
-  typed_data.Float32x4.ZYWX = 54;
-  typed_data.Float32x4.ZYWY = 118;
-  typed_data.Float32x4.ZYWZ = 182;
-  typed_data.Float32x4.ZYWW = 246;
-  typed_data.Float32x4.ZZXX = 10;
-  typed_data.Float32x4.ZZXY = 74;
-  typed_data.Float32x4.ZZXZ = 138;
-  typed_data.Float32x4.ZZXW = 202;
-  typed_data.Float32x4.ZZYX = 26;
-  typed_data.Float32x4.ZZYY = 90;
-  typed_data.Float32x4.ZZYZ = 154;
-  typed_data.Float32x4.ZZYW = 218;
-  typed_data.Float32x4.ZZZX = 42;
-  typed_data.Float32x4.ZZZY = 106;
-  typed_data.Float32x4.ZZZZ = 170;
-  typed_data.Float32x4.ZZZW = 234;
-  typed_data.Float32x4.ZZWX = 58;
-  typed_data.Float32x4.ZZWY = 122;
-  typed_data.Float32x4.ZZWZ = 186;
-  typed_data.Float32x4.ZZWW = 250;
-  typed_data.Float32x4.ZWXX = 14;
-  typed_data.Float32x4.ZWXY = 78;
-  typed_data.Float32x4.ZWXZ = 142;
-  typed_data.Float32x4.ZWXW = 206;
-  typed_data.Float32x4.ZWYX = 30;
-  typed_data.Float32x4.ZWYY = 94;
-  typed_data.Float32x4.ZWYZ = 158;
-  typed_data.Float32x4.ZWYW = 222;
-  typed_data.Float32x4.ZWZX = 46;
-  typed_data.Float32x4.ZWZY = 110;
-  typed_data.Float32x4.ZWZZ = 174;
-  typed_data.Float32x4.ZWZW = 238;
-  typed_data.Float32x4.ZWWX = 62;
-  typed_data.Float32x4.ZWWY = 126;
-  typed_data.Float32x4.ZWWZ = 190;
-  typed_data.Float32x4.ZWWW = 254;
-  typed_data.Float32x4.WXXX = 3;
-  typed_data.Float32x4.WXXY = 67;
-  typed_data.Float32x4.WXXZ = 131;
-  typed_data.Float32x4.WXXW = 195;
-  typed_data.Float32x4.WXYX = 19;
-  typed_data.Float32x4.WXYY = 83;
-  typed_data.Float32x4.WXYZ = 147;
-  typed_data.Float32x4.WXYW = 211;
-  typed_data.Float32x4.WXZX = 35;
-  typed_data.Float32x4.WXZY = 99;
-  typed_data.Float32x4.WXZZ = 163;
-  typed_data.Float32x4.WXZW = 227;
-  typed_data.Float32x4.WXWX = 51;
-  typed_data.Float32x4.WXWY = 115;
-  typed_data.Float32x4.WXWZ = 179;
-  typed_data.Float32x4.WXWW = 243;
-  typed_data.Float32x4.WYXX = 7;
-  typed_data.Float32x4.WYXY = 71;
-  typed_data.Float32x4.WYXZ = 135;
-  typed_data.Float32x4.WYXW = 199;
-  typed_data.Float32x4.WYYX = 23;
-  typed_data.Float32x4.WYYY = 87;
-  typed_data.Float32x4.WYYZ = 151;
-  typed_data.Float32x4.WYYW = 215;
-  typed_data.Float32x4.WYZX = 39;
-  typed_data.Float32x4.WYZY = 103;
-  typed_data.Float32x4.WYZZ = 167;
-  typed_data.Float32x4.WYZW = 231;
-  typed_data.Float32x4.WYWX = 55;
-  typed_data.Float32x4.WYWY = 119;
-  typed_data.Float32x4.WYWZ = 183;
-  typed_data.Float32x4.WYWW = 247;
-  typed_data.Float32x4.WZXX = 11;
-  typed_data.Float32x4.WZXY = 75;
-  typed_data.Float32x4.WZXZ = 139;
-  typed_data.Float32x4.WZXW = 203;
-  typed_data.Float32x4.WZYX = 27;
-  typed_data.Float32x4.WZYY = 91;
-  typed_data.Float32x4.WZYZ = 155;
-  typed_data.Float32x4.WZYW = 219;
-  typed_data.Float32x4.WZZX = 43;
-  typed_data.Float32x4.WZZY = 107;
-  typed_data.Float32x4.WZZZ = 171;
-  typed_data.Float32x4.WZZW = 235;
-  typed_data.Float32x4.WZWX = 59;
-  typed_data.Float32x4.WZWY = 123;
-  typed_data.Float32x4.WZWZ = 187;
-  typed_data.Float32x4.WZWW = 251;
-  typed_data.Float32x4.WWXX = 15;
-  typed_data.Float32x4.WWXY = 79;
-  typed_data.Float32x4.WWXZ = 143;
-  typed_data.Float32x4.WWXW = 207;
-  typed_data.Float32x4.WWYX = 31;
-  typed_data.Float32x4.WWYY = 95;
-  typed_data.Float32x4.WWYZ = 159;
-  typed_data.Float32x4.WWYW = 223;
-  typed_data.Float32x4.WWZX = 47;
-  typed_data.Float32x4.WWZY = 111;
-  typed_data.Float32x4.WWZZ = 175;
-  typed_data.Float32x4.WWZW = 239;
-  typed_data.Float32x4.WWWX = 63;
-  typed_data.Float32x4.WWWY = 127;
-  typed_data.Float32x4.WWWZ = 191;
-  typed_data.Float32x4.WWWW = 255;
-  _native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float32x4), _internal.FixedLengthListMixin$(typed_data.Float32x4)) {
-    new(length) {
-      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
-    }
-    _externalStorage(storage) {
-      this[_storage] = storage;
-    }
-    _slowFromList(list) {
-      this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[dartx.length]) * 4);
-      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
-        let e = list[dartx._get](i);
-        this[_storage][dartx._set](i * 4 + 0, e.x);
-        this[_storage][dartx._set](i * 4 + 1, e.y);
-        this[_storage][dartx._set](i * 4 + 2, e.z);
-        this[_storage][dartx._set](i * 4 + 3, e.w);
-      }
-    }
-    get runtimeType() {
-      return dart.wrapType(typed_data.Float32x4List);
-    }
-    static fromList(list) {
-      if (_native_typed_data.NativeFloat32x4List.is(list)) {
-        return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
-      } else {
-        return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
-      }
-    }
-    get buffer() {
-      return this[_storage][dartx.buffer];
-    }
-    get lengthInBytes() {
-      return this[_storage][dartx.lengthInBytes];
-    }
-    get offsetInBytes() {
-      return this[_storage][dartx.offsetInBytes];
-    }
-    get elementSizeInBytes() {
-      return typed_data.Float32x4List.BYTES_PER_ELEMENT;
-    }
-    get length() {
-      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _get(index) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
-      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
-      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
-      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    _set(index, value) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
-      return value;
-    }
-    sublist(start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this.length);
-      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_externalStorage');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_slowFromList');
-  _native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
-  dart.setSignature(_native_typed_data.NativeFloat32x4List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [core.int]),
-      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [_native_typed_data.NativeFloat32List]),
-      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()])
-    }),
-    fields: () => ({[_storage]: _native_typed_data.NativeFloat32List}),
-    getters: () => ({
-      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-      lengthInBytes: dart.definiteFunctionType(core.int, []),
-      offsetInBytes: dart.definiteFunctionType(core.int, []),
-      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
-      length: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      _get: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32x4])
-    })
-  });
-  dart.defineExtensionMembers(_native_typed_data.NativeFloat32x4List, [
-    '_get',
-    '_set',
-    'sublist',
-    'buffer',
-    'lengthInBytes',
-    'offsetInBytes',
-    'elementSizeInBytes',
-    'length'
-  ]);
-  typed_data.Int32x4 = class Int32x4 extends core.Object {
-    static new(x, y, z, w) {
-      return new _native_typed_data.NativeInt32x4(x, y, z, w);
-    }
-    static bool(x, y, z, w) {
-      return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
-    }
-    static fromFloat32x4Bits(x) {
-      return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
-    }
-  };
-  dart.setSignature(typed_data.Int32x4, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int32x4, [core.int, core.int, core.int, core.int]),
-      bool: dart.definiteFunctionType(typed_data.Int32x4, [core.bool, core.bool, core.bool, core.bool]),
-      fromFloat32x4Bits: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4])
-    }),
-    sfields: () => ({
-      XXXX: core.int,
-      XXXY: core.int,
-      XXXZ: core.int,
-      XXXW: core.int,
-      XXYX: core.int,
-      XXYY: core.int,
-      XXYZ: core.int,
-      XXYW: core.int,
-      XXZX: core.int,
-      XXZY: core.int,
-      XXZZ: core.int,
-      XXZW: core.int,
-      XXWX: core.int,
-      XXWY: core.int,
-      XXWZ: core.int,
-      XXWW: core.int,
-      XYXX: core.int,
-      XYXY: core.int,
-      XYXZ: core.int,
-      XYXW: core.int,
-      XYYX: core.int,
-      XYYY: core.int,
-      XYYZ: core.int,
-      XYYW: core.int,
-      XYZX: core.int,
-      XYZY: core.int,
-      XYZZ: core.int,
-      XYZW: core.int,
-      XYWX: core.int,
-      XYWY: core.int,
-      XYWZ: core.int,
-      XYWW: core.int,
-      XZXX: core.int,
-      XZXY: core.int,
-      XZXZ: core.int,
-      XZXW: core.int,
-      XZYX: core.int,
-      XZYY: core.int,
-      XZYZ: core.int,
-      XZYW: core.int,
-      XZZX: core.int,
-      XZZY: core.int,
-      XZZZ: core.int,
-      XZZW: core.int,
-      XZWX: core.int,
-      XZWY: core.int,
-      XZWZ: core.int,
-      XZWW: core.int,
-      XWXX: core.int,
-      XWXY: core.int,
-      XWXZ: core.int,
-      XWXW: core.int,
-      XWYX: core.int,
-      XWYY: core.int,
-      XWYZ: core.int,
-      XWYW: core.int,
-      XWZX: core.int,
-      XWZY: core.int,
-      XWZZ: core.int,
-      XWZW: core.int,
-      XWWX: core.int,
-      XWWY: core.int,
-      XWWZ: core.int,
-      XWWW: core.int,
-      YXXX: core.int,
-      YXXY: core.int,
-      YXXZ: core.int,
-      YXXW: core.int,
-      YXYX: core.int,
-      YXYY: core.int,
-      YXYZ: core.int,
-      YXYW: core.int,
-      YXZX: core.int,
-      YXZY: core.int,
-      YXZZ: core.int,
-      YXZW: core.int,
-      YXWX: core.int,
-      YXWY: core.int,
-      YXWZ: core.int,
-      YXWW: core.int,
-      YYXX: core.int,
-      YYXY: core.int,
-      YYXZ: core.int,
-      YYXW: core.int,
-      YYYX: core.int,
-      YYYY: core.int,
-      YYYZ: core.int,
-      YYYW: core.int,
-      YYZX: core.int,
-      YYZY: core.int,
-      YYZZ: core.int,
-      YYZW: core.int,
-      YYWX: core.int,
-      YYWY: core.int,
-      YYWZ: core.int,
-      YYWW: core.int,
-      YZXX: core.int,
-      YZXY: core.int,
-      YZXZ: core.int,
-      YZXW: core.int,
-      YZYX: core.int,
-      YZYY: core.int,
-      YZYZ: core.int,
-      YZYW: core.int,
-      YZZX: core.int,
-      YZZY: core.int,
-      YZZZ: core.int,
-      YZZW: core.int,
-      YZWX: core.int,
-      YZWY: core.int,
-      YZWZ: core.int,
-      YZWW: core.int,
-      YWXX: core.int,
-      YWXY: core.int,
-      YWXZ: core.int,
-      YWXW: core.int,
-      YWYX: core.int,
-      YWYY: core.int,
-      YWYZ: core.int,
-      YWYW: core.int,
-      YWZX: core.int,
-      YWZY: core.int,
-      YWZZ: core.int,
-      YWZW: core.int,
-      YWWX: core.int,
-      YWWY: core.int,
-      YWWZ: core.int,
-      YWWW: core.int,
-      ZXXX: core.int,
-      ZXXY: core.int,
-      ZXXZ: core.int,
-      ZXXW: core.int,
-      ZXYX: core.int,
-      ZXYY: core.int,
-      ZXYZ: core.int,
-      ZXYW: core.int,
-      ZXZX: core.int,
-      ZXZY: core.int,
-      ZXZZ: core.int,
-      ZXZW: core.int,
-      ZXWX: core.int,
-      ZXWY: core.int,
-      ZXWZ: core.int,
-      ZXWW: core.int,
-      ZYXX: core.int,
-      ZYXY: core.int,
-      ZYXZ: core.int,
-      ZYXW: core.int,
-      ZYYX: core.int,
-      ZYYY: core.int,
-      ZYYZ: core.int,
-      ZYYW: core.int,
-      ZYZX: core.int,
-      ZYZY: core.int,
-      ZYZZ: core.int,
-      ZYZW: core.int,
-      ZYWX: core.int,
-      ZYWY: core.int,
-      ZYWZ: core.int,
-      ZYWW: core.int,
-      ZZXX: core.int,
-      ZZXY: core.int,
-      ZZXZ: core.int,
-      ZZXW: core.int,
-      ZZYX: core.int,
-      ZZYY: core.int,
-      ZZYZ: core.int,
-      ZZYW: core.int,
-      ZZZX: core.int,
-      ZZZY: core.int,
-      ZZZZ: core.int,
-      ZZZW: core.int,
-      ZZWX: core.int,
-      ZZWY: core.int,
-      ZZWZ: core.int,
-      ZZWW: core.int,
-      ZWXX: core.int,
-      ZWXY: core.int,
-      ZWXZ: core.int,
-      ZWXW: core.int,
-      ZWYX: core.int,
-      ZWYY: core.int,
-      ZWYZ: core.int,
-      ZWYW: core.int,
-      ZWZX: core.int,
-      ZWZY: core.int,
-      ZWZZ: core.int,
-      ZWZW: core.int,
-      ZWWX: core.int,
-      ZWWY: core.int,
-      ZWWZ: core.int,
-      ZWWW: core.int,
-      WXXX: core.int,
-      WXXY: core.int,
-      WXXZ: core.int,
-      WXXW: core.int,
-      WXYX: core.int,
-      WXYY: core.int,
-      WXYZ: core.int,
-      WXYW: core.int,
-      WXZX: core.int,
-      WXZY: core.int,
-      WXZZ: core.int,
-      WXZW: core.int,
-      WXWX: core.int,
-      WXWY: core.int,
-      WXWZ: core.int,
-      WXWW: core.int,
-      WYXX: core.int,
-      WYXY: core.int,
-      WYXZ: core.int,
-      WYXW: core.int,
-      WYYX: core.int,
-      WYYY: core.int,
-      WYYZ: core.int,
-      WYYW: core.int,
-      WYZX: core.int,
-      WYZY: core.int,
-      WYZZ: core.int,
-      WYZW: core.int,
-      WYWX: core.int,
-      WYWY: core.int,
-      WYWZ: core.int,
-      WYWW: core.int,
-      WZXX: core.int,
-      WZXY: core.int,
-      WZXZ: core.int,
-      WZXW: core.int,
-      WZYX: core.int,
-      WZYY: core.int,
-      WZYZ: core.int,
-      WZYW: core.int,
-      WZZX: core.int,
-      WZZY: core.int,
-      WZZZ: core.int,
-      WZZW: core.int,
-      WZWX: core.int,
-      WZWY: core.int,
-      WZWZ: core.int,
-      WZWW: core.int,
-      WWXX: core.int,
-      WWXY: core.int,
-      WWXZ: core.int,
-      WWXW: core.int,
-      WWYX: core.int,
-      WWYY: core.int,
-      WWYZ: core.int,
-      WWYW: core.int,
-      WWZX: core.int,
-      WWZY: core.int,
-      WWZZ: core.int,
-      WWZW: core.int,
-      WWWX: core.int,
-      WWWY: core.int,
-      WWWZ: core.int,
-      WWWW: core.int
-    })
-  });
-  typed_data.Int32x4.XXXX = 0;
-  typed_data.Int32x4.XXXY = 64;
-  typed_data.Int32x4.XXXZ = 128;
-  typed_data.Int32x4.XXXW = 192;
-  typed_data.Int32x4.XXYX = 16;
-  typed_data.Int32x4.XXYY = 80;
-  typed_data.Int32x4.XXYZ = 144;
-  typed_data.Int32x4.XXYW = 208;
-  typed_data.Int32x4.XXZX = 32;
-  typed_data.Int32x4.XXZY = 96;
-  typed_data.Int32x4.XXZZ = 160;
-  typed_data.Int32x4.XXZW = 224;
-  typed_data.Int32x4.XXWX = 48;
-  typed_data.Int32x4.XXWY = 112;
-  typed_data.Int32x4.XXWZ = 176;
-  typed_data.Int32x4.XXWW = 240;
-  typed_data.Int32x4.XYXX = 4;
-  typed_data.Int32x4.XYXY = 68;
-  typed_data.Int32x4.XYXZ = 132;
-  typed_data.Int32x4.XYXW = 196;
-  typed_data.Int32x4.XYYX = 20;
-  typed_data.Int32x4.XYYY = 84;
-  typed_data.Int32x4.XYYZ = 148;
-  typed_data.Int32x4.XYYW = 212;
-  typed_data.Int32x4.XYZX = 36;
-  typed_data.Int32x4.XYZY = 100;
-  typed_data.Int32x4.XYZZ = 164;
-  typed_data.Int32x4.XYZW = 228;
-  typed_data.Int32x4.XYWX = 52;
-  typed_data.Int32x4.XYWY = 116;
-  typed_data.Int32x4.XYWZ = 180;
-  typed_data.Int32x4.XYWW = 244;
-  typed_data.Int32x4.XZXX = 8;
-  typed_data.Int32x4.XZXY = 72;
-  typed_data.Int32x4.XZXZ = 136;
-  typed_data.Int32x4.XZXW = 200;
-  typed_data.Int32x4.XZYX = 24;
-  typed_data.Int32x4.XZYY = 88;
-  typed_data.Int32x4.XZYZ = 152;
-  typed_data.Int32x4.XZYW = 216;
-  typed_data.Int32x4.XZZX = 40;
-  typed_data.Int32x4.XZZY = 104;
-  typed_data.Int32x4.XZZZ = 168;
-  typed_data.Int32x4.XZZW = 232;
-  typed_data.Int32x4.XZWX = 56;
-  typed_data.Int32x4.XZWY = 120;
-  typed_data.Int32x4.XZWZ = 184;
-  typed_data.Int32x4.XZWW = 248;
-  typed_data.Int32x4.XWXX = 12;
-  typed_data.Int32x4.XWXY = 76;
-  typed_data.Int32x4.XWXZ = 140;
-  typed_data.Int32x4.XWXW = 204;
-  typed_data.Int32x4.XWYX = 28;
-  typed_data.Int32x4.XWYY = 92;
-  typed_data.Int32x4.XWYZ = 156;
-  typed_data.Int32x4.XWYW = 220;
-  typed_data.Int32x4.XWZX = 44;
-  typed_data.Int32x4.XWZY = 108;
-  typed_data.Int32x4.XWZZ = 172;
-  typed_data.Int32x4.XWZW = 236;
-  typed_data.Int32x4.XWWX = 60;
-  typed_data.Int32x4.XWWY = 124;
-  typed_data.Int32x4.XWWZ = 188;
-  typed_data.Int32x4.XWWW = 252;
-  typed_data.Int32x4.YXXX = 1;
-  typed_data.Int32x4.YXXY = 65;
-  typed_data.Int32x4.YXXZ = 129;
-  typed_data.Int32x4.YXXW = 193;
-  typed_data.Int32x4.YXYX = 17;
-  typed_data.Int32x4.YXYY = 81;
-  typed_data.Int32x4.YXYZ = 145;
-  typed_data.Int32x4.YXYW = 209;
-  typed_data.Int32x4.YXZX = 33;
-  typed_data.Int32x4.YXZY = 97;
-  typed_data.Int32x4.YXZZ = 161;
-  typed_data.Int32x4.YXZW = 225;
-  typed_data.Int32x4.YXWX = 49;
-  typed_data.Int32x4.YXWY = 113;
-  typed_data.Int32x4.YXWZ = 177;
-  typed_data.Int32x4.YXWW = 241;
-  typed_data.Int32x4.YYXX = 5;
-  typed_data.Int32x4.YYXY = 69;
-  typed_data.Int32x4.YYXZ = 133;
-  typed_data.Int32x4.YYXW = 197;
-  typed_data.Int32x4.YYYX = 21;
-  typed_data.Int32x4.YYYY = 85;
-  typed_data.Int32x4.YYYZ = 149;
-  typed_data.Int32x4.YYYW = 213;
-  typed_data.Int32x4.YYZX = 37;
-  typed_data.Int32x4.YYZY = 101;
-  typed_data.Int32x4.YYZZ = 165;
-  typed_data.Int32x4.YYZW = 229;
-  typed_data.Int32x4.YYWX = 53;
-  typed_data.Int32x4.YYWY = 117;
-  typed_data.Int32x4.YYWZ = 181;
-  typed_data.Int32x4.YYWW = 245;
-  typed_data.Int32x4.YZXX = 9;
-  typed_data.Int32x4.YZXY = 73;
-  typed_data.Int32x4.YZXZ = 137;
-  typed_data.Int32x4.YZXW = 201;
-  typed_data.Int32x4.YZYX = 25;
-  typed_data.Int32x4.YZYY = 89;
-  typed_data.Int32x4.YZYZ = 153;
-  typed_data.Int32x4.YZYW = 217;
-  typed_data.Int32x4.YZZX = 41;
-  typed_data.Int32x4.YZZY = 105;
-  typed_data.Int32x4.YZZZ = 169;
-  typed_data.Int32x4.YZZW = 233;
-  typed_data.Int32x4.YZWX = 57;
-  typed_data.Int32x4.YZWY = 121;
-  typed_data.Int32x4.YZWZ = 185;
-  typed_data.Int32x4.YZWW = 249;
-  typed_data.Int32x4.YWXX = 13;
-  typed_data.Int32x4.YWXY = 77;
-  typed_data.Int32x4.YWXZ = 141;
-  typed_data.Int32x4.YWXW = 205;
-  typed_data.Int32x4.YWYX = 29;
-  typed_data.Int32x4.YWYY = 93;
-  typed_data.Int32x4.YWYZ = 157;
-  typed_data.Int32x4.YWYW = 221;
-  typed_data.Int32x4.YWZX = 45;
-  typed_data.Int32x4.YWZY = 109;
-  typed_data.Int32x4.YWZZ = 173;
-  typed_data.Int32x4.YWZW = 237;
-  typed_data.Int32x4.YWWX = 61;
-  typed_data.Int32x4.YWWY = 125;
-  typed_data.Int32x4.YWWZ = 189;
-  typed_data.Int32x4.YWWW = 253;
-  typed_data.Int32x4.ZXXX = 2;
-  typed_data.Int32x4.ZXXY = 66;
-  typed_data.Int32x4.ZXXZ = 130;
-  typed_data.Int32x4.ZXXW = 194;
-  typed_data.Int32x4.ZXYX = 18;
-  typed_data.Int32x4.ZXYY = 82;
-  typed_data.Int32x4.ZXYZ = 146;
-  typed_data.Int32x4.ZXYW = 210;
-  typed_data.Int32x4.ZXZX = 34;
-  typed_data.Int32x4.ZXZY = 98;
-  typed_data.Int32x4.ZXZZ = 162;
-  typed_data.Int32x4.ZXZW = 226;
-  typed_data.Int32x4.ZXWX = 50;
-  typed_data.Int32x4.ZXWY = 114;
-  typed_data.Int32x4.ZXWZ = 178;
-  typed_data.Int32x4.ZXWW = 242;
-  typed_data.Int32x4.ZYXX = 6;
-  typed_data.Int32x4.ZYXY = 70;
-  typed_data.Int32x4.ZYXZ = 134;
-  typed_data.Int32x4.ZYXW = 198;
-  typed_data.Int32x4.ZYYX = 22;
-  typed_data.Int32x4.ZYYY = 86;
-  typed_data.Int32x4.ZYYZ = 150;
-  typed_data.Int32x4.ZYYW = 214;
-  typed_data.Int32x4.ZYZX = 38;
-  typed_data.Int32x4.ZYZY = 102;
-  typed_data.Int32x4.ZYZZ = 166;
-  typed_data.Int32x4.ZYZW = 230;
-  typed_data.Int32x4.ZYWX = 54;
-  typed_data.Int32x4.ZYWY = 118;
-  typed_data.Int32x4.ZYWZ = 182;
-  typed_data.Int32x4.ZYWW = 246;
-  typed_data.Int32x4.ZZXX = 10;
-  typed_data.Int32x4.ZZXY = 74;
-  typed_data.Int32x4.ZZXZ = 138;
-  typed_data.Int32x4.ZZXW = 202;
-  typed_data.Int32x4.ZZYX = 26;
-  typed_data.Int32x4.ZZYY = 90;
-  typed_data.Int32x4.ZZYZ = 154;
-  typed_data.Int32x4.ZZYW = 218;
-  typed_data.Int32x4.ZZZX = 42;
-  typed_data.Int32x4.ZZZY = 106;
-  typed_data.Int32x4.ZZZZ = 170;
-  typed_data.Int32x4.ZZZW = 234;
-  typed_data.Int32x4.ZZWX = 58;
-  typed_data.Int32x4.ZZWY = 122;
-  typed_data.Int32x4.ZZWZ = 186;
-  typed_data.Int32x4.ZZWW = 250;
-  typed_data.Int32x4.ZWXX = 14;
-  typed_data.Int32x4.ZWXY = 78;
-  typed_data.Int32x4.ZWXZ = 142;
-  typed_data.Int32x4.ZWXW = 206;
-  typed_data.Int32x4.ZWYX = 30;
-  typed_data.Int32x4.ZWYY = 94;
-  typed_data.Int32x4.ZWYZ = 158;
-  typed_data.Int32x4.ZWYW = 222;
-  typed_data.Int32x4.ZWZX = 46;
-  typed_data.Int32x4.ZWZY = 110;
-  typed_data.Int32x4.ZWZZ = 174;
-  typed_data.Int32x4.ZWZW = 238;
-  typed_data.Int32x4.ZWWX = 62;
-  typed_data.Int32x4.ZWWY = 126;
-  typed_data.Int32x4.ZWWZ = 190;
-  typed_data.Int32x4.ZWWW = 254;
-  typed_data.Int32x4.WXXX = 3;
-  typed_data.Int32x4.WXXY = 67;
-  typed_data.Int32x4.WXXZ = 131;
-  typed_data.Int32x4.WXXW = 195;
-  typed_data.Int32x4.WXYX = 19;
-  typed_data.Int32x4.WXYY = 83;
-  typed_data.Int32x4.WXYZ = 147;
-  typed_data.Int32x4.WXYW = 211;
-  typed_data.Int32x4.WXZX = 35;
-  typed_data.Int32x4.WXZY = 99;
-  typed_data.Int32x4.WXZZ = 163;
-  typed_data.Int32x4.WXZW = 227;
-  typed_data.Int32x4.WXWX = 51;
-  typed_data.Int32x4.WXWY = 115;
-  typed_data.Int32x4.WXWZ = 179;
-  typed_data.Int32x4.WXWW = 243;
-  typed_data.Int32x4.WYXX = 7;
-  typed_data.Int32x4.WYXY = 71;
-  typed_data.Int32x4.WYXZ = 135;
-  typed_data.Int32x4.WYXW = 199;
-  typed_data.Int32x4.WYYX = 23;
-  typed_data.Int32x4.WYYY = 87;
-  typed_data.Int32x4.WYYZ = 151;
-  typed_data.Int32x4.WYYW = 215;
-  typed_data.Int32x4.WYZX = 39;
-  typed_data.Int32x4.WYZY = 103;
-  typed_data.Int32x4.WYZZ = 167;
-  typed_data.Int32x4.WYZW = 231;
-  typed_data.Int32x4.WYWX = 55;
-  typed_data.Int32x4.WYWY = 119;
-  typed_data.Int32x4.WYWZ = 183;
-  typed_data.Int32x4.WYWW = 247;
-  typed_data.Int32x4.WZXX = 11;
-  typed_data.Int32x4.WZXY = 75;
-  typed_data.Int32x4.WZXZ = 139;
-  typed_data.Int32x4.WZXW = 203;
-  typed_data.Int32x4.WZYX = 27;
-  typed_data.Int32x4.WZYY = 91;
-  typed_data.Int32x4.WZYZ = 155;
-  typed_data.Int32x4.WZYW = 219;
-  typed_data.Int32x4.WZZX = 43;
-  typed_data.Int32x4.WZZY = 107;
-  typed_data.Int32x4.WZZZ = 171;
-  typed_data.Int32x4.WZZW = 235;
-  typed_data.Int32x4.WZWX = 59;
-  typed_data.Int32x4.WZWY = 123;
-  typed_data.Int32x4.WZWZ = 187;
-  typed_data.Int32x4.WZWW = 251;
-  typed_data.Int32x4.WWXX = 15;
-  typed_data.Int32x4.WWXY = 79;
-  typed_data.Int32x4.WWXZ = 143;
-  typed_data.Int32x4.WWXW = 207;
-  typed_data.Int32x4.WWYX = 31;
-  typed_data.Int32x4.WWYY = 95;
-  typed_data.Int32x4.WWYZ = 159;
-  typed_data.Int32x4.WWYW = 223;
-  typed_data.Int32x4.WWZX = 47;
-  typed_data.Int32x4.WWZY = 111;
-  typed_data.Int32x4.WWZZ = 175;
-  typed_data.Int32x4.WWZW = 239;
-  typed_data.Int32x4.WWWX = 63;
-  typed_data.Int32x4.WWWY = 127;
-  typed_data.Int32x4.WWWZ = 191;
-  typed_data.Int32x4.WWWW = 255;
-  _native_typed_data.NativeInt32x4List = class NativeInt32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Int32x4), _internal.FixedLengthListMixin$(typed_data.Int32x4)) {
-    new(length) {
-      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
-    }
-    _externalStorage(storage) {
-      this[_storage] = storage;
-    }
-    _slowFromList(list) {
-      this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[dartx.length]) * 4);
-      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
-        let e = list[dartx._get](i);
-        this[_storage][dartx._set](i * 4 + 0, e.x);
-        this[_storage][dartx._set](i * 4 + 1, e.y);
-        this[_storage][dartx._set](i * 4 + 2, e.z);
-        this[_storage][dartx._set](i * 4 + 3, e.w);
-      }
-    }
-    get runtimeType() {
-      return dart.wrapType(typed_data.Int32x4List);
-    }
-    static fromList(list) {
-      if (_native_typed_data.NativeInt32x4List.is(list)) {
-        return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
-      } else {
-        return new _native_typed_data.NativeInt32x4List._slowFromList(list);
-      }
-    }
-    get buffer() {
-      return this[_storage][dartx.buffer];
-    }
-    get lengthInBytes() {
-      return this[_storage][dartx.lengthInBytes];
-    }
-    get offsetInBytes() {
-      return this[_storage][dartx.offsetInBytes];
-    }
-    get elementSizeInBytes() {
-      return typed_data.Int32x4List.BYTES_PER_ELEMENT;
-    }
-    get length() {
-      return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _get(index) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
-      let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
-      let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
-      let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
-      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
-    }
-    _set(index, value) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
-      this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
-      return value;
-    }
-    sublist(start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this.length);
-      return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_externalStorage');
-  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_slowFromList');
-  _native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
-  dart.setSignature(_native_typed_data.NativeInt32x4List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [core.int]),
-      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [typed_data.Int32List]),
-      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()])
-    }),
-    fields: () => ({[_storage]: typed_data.Int32List}),
-    getters: () => ({
-      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-      lengthInBytes: dart.definiteFunctionType(core.int, []),
-      offsetInBytes: dart.definiteFunctionType(core.int, []),
-      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
-      length: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      _get: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Int32x4])
-    })
-  });
-  dart.defineExtensionMembers(_native_typed_data.NativeInt32x4List, [
-    '_get',
-    '_set',
-    'sublist',
-    'buffer',
-    'lengthInBytes',
-    'offsetInBytes',
-    'elementSizeInBytes',
-    'length'
-  ]);
-  typed_data.Float64x2 = class Float64x2 extends core.Object {
-    static new(x, y) {
-      return new _native_typed_data.NativeFloat64x2(x, y);
-    }
-    static splat(v) {
-      return new _native_typed_data.NativeFloat64x2.splat(v);
-    }
-    static zero() {
-      return new _native_typed_data.NativeFloat64x2.zero();
-    }
-    static fromFloat32x4(v) {
-      return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
-    }
-  };
-  dart.setSignature(typed_data.Float64x2, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float64x2, [core.double, core.double]),
-      splat: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
-      zero: dart.definiteFunctionType(typed_data.Float64x2, []),
-      fromFloat32x4: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float32x4])
-    })
-  });
-  _native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float64x2), _internal.FixedLengthListMixin$(typed_data.Float64x2)) {
-    new(length) {
-      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
-    }
-    _externalStorage(storage) {
-      this[_storage] = storage;
-    }
-    _slowFromList(list) {
-      this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[dartx.length]) * 2);
-      for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
-        let e = list[dartx._get](i);
-        this[_storage][dartx._set](i * 2 + 0, e.x);
-        this[_storage][dartx._set](i * 2 + 1, e.y);
-      }
-    }
-    static fromList(list) {
-      if (_native_typed_data.NativeFloat64x2List.is(list)) {
-        return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
-      } else {
-        return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
-      }
-    }
-    get runtimeType() {
-      return dart.wrapType(typed_data.Float64x2List);
-    }
-    get buffer() {
-      return this[_storage][dartx.buffer];
-    }
-    get lengthInBytes() {
-      return this[_storage][dartx.lengthInBytes];
-    }
-    get offsetInBytes() {
-      return this[_storage][dartx.offsetInBytes];
-    }
-    get elementSizeInBytes() {
-      return typed_data.Float64x2List.BYTES_PER_ELEMENT;
-    }
-    get length() {
-      return (dart.notNull(this[_storage][dartx.length]) / 2)[dartx.truncate]();
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _get(index) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      let _x = this[_storage][dartx._get](dart.notNull(index) * 2 + 0);
-      let _y = this[_storage][dartx._get](dart.notNull(index) * 2 + 1);
-      return typed_data.Float64x2.new(_x, _y);
-    }
-    _set(index, value) {
-      _native_typed_data._checkValidIndex(index, this, this.length);
-      this[_storage][dartx._set](dart.notNull(index) * 2 + 0, value.x);
-      this[_storage][dartx._set](dart.notNull(index) * 2 + 1, value.y);
-      return value;
-    }
-    sublist(start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this.length);
-      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][dartx.sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_externalStorage');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_slowFromList');
-  _native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
-  dart.setSignature(_native_typed_data.NativeFloat64x2List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [core.int]),
-      _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [_native_typed_data.NativeFloat64List]),
-      _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()])
-    }),
-    fields: () => ({[_storage]: _native_typed_data.NativeFloat64List}),
-    getters: () => ({
-      buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-      lengthInBytes: dart.definiteFunctionType(core.int, []),
-      offsetInBytes: dart.definiteFunctionType(core.int, []),
-      elementSizeInBytes: dart.definiteFunctionType(core.int, []),
-      length: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      _get: dart.definiteFunctionType(typed_data.Float64x2, [core.int]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float64x2])
-    })
-  });
-  dart.defineExtensionMembers(_native_typed_data.NativeFloat64x2List, [
-    '_get',
-    '_set',
-    'sublist',
-    'buffer',
-    'lengthInBytes',
-    'offsetInBytes',
-    'elementSizeInBytes',
-    'length'
-  ]);
-  const _invalidPosition = Symbol('_invalidPosition');
-  const _checkPosition = Symbol('_checkPosition');
-  dart.defineExtensionNames([
-    'buffer',
-    'lengthInBytes',
-    'offsetInBytes',
-    'elementSizeInBytes'
-  ]);
-  _native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
-    get [dartx.buffer]() {
-      return this.buffer;
-    }
-    get [dartx.lengthInBytes]() {
-      return this.byteLength;
-    }
-    get [dartx.offsetInBytes]() {
-      return this.byteOffset;
-    }
-    get [dartx.elementSizeInBytes]() {
-      return this.BYTES_PER_ELEMENT;
-    }
-    [_invalidPosition](position, length, name) {
-      if (!(typeof position == 'number')) {
-        dart.throw(new core.ArgumentError.value(position, name, 'Invalid list position'));
-      } else {
-        dart.throw(new core.RangeError.range(position, 0, length, name));
-      }
-    }
-    [_checkPosition](position, length, name) {
-      if (position >>> 0 !== position || position > dart.notNull(length)) {
-        this[_invalidPosition](position, length, name);
-      }
-    }
-  };
-  _native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
-  dart.setSignature(_native_typed_data.NativeTypedData, {
-    getters: () => ({
-      [dartx.buffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-      [dartx.lengthInBytes]: dart.definiteFunctionType(core.int, []),
-      [dartx.offsetInBytes]: dart.definiteFunctionType(core.int, []),
-      [dartx.elementSizeInBytes]: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      [_invalidPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
-      [_checkPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String])
-    })
-  });
-  dart.registerExtension(dart.global.ArrayBufferView, _native_typed_data.NativeTypedData);
-  _native_typed_data._checkLength = function(length) {
-    if (!(typeof length == 'number')) dart.throw(new core.ArgumentError(dart.str`Invalid length ${length}`));
-    return core.int._check(length);
-  };
-  dart.fn(_native_typed_data._checkLength, dynamicToint());
-  _native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
-    if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
-      dart.throw(new core.ArgumentError('Invalid view buffer'));
-    }
-    if (!(typeof offsetInBytes == 'number')) {
-      dart.throw(new core.ArgumentError(dart.str`Invalid view offsetInBytes ${offsetInBytes}`));
-    }
-    if (length != null && !(typeof length == 'number')) {
-      dart.throw(new core.ArgumentError(dart.str`Invalid view length ${length}`));
-    }
-  };
-  dart.fn(_native_typed_data._checkViewArguments, dynamicAnddynamicAnddynamicTovoid());
-  _native_typed_data._ensureNativeList = function(list) {
-    if (_interceptors.JSIndexable.is(list)) return list;
-    let result = core.List.new(list[dartx.length]);
-    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
-      result[dartx._set](i, list[dartx._get](i));
-    }
-    return result;
-  };
-  dart.lazyFn(_native_typed_data._ensureNativeList, () => ListToList());
-  const _getFloat32 = Symbol('_getFloat32');
-  const _getFloat64 = Symbol('_getFloat64');
-  const _getInt16 = Symbol('_getInt16');
-  const _getInt32 = Symbol('_getInt32');
-  const _getUint16 = Symbol('_getUint16');
-  const _getUint32 = Symbol('_getUint32');
-  const _setFloat32 = Symbol('_setFloat32');
-  const _setFloat64 = Symbol('_setFloat64');
-  const _setInt16 = Symbol('_setInt16');
-  const _setInt32 = Symbol('_setInt32');
-  const _setUint16 = Symbol('_setUint16');
-  const _setUint32 = Symbol('_setUint32');
-  dart.defineExtensionNames([
-    'runtimeType',
-    'elementSizeInBytes',
-    'getFloat32',
-    'getFloat64',
-    'getInt16',
-    'getInt32',
-    'getInt64',
-    'getInt8',
-    'getUint16',
-    'getUint32',
-    'getUint64',
-    'getUint8',
-    'setFloat32',
-    'setFloat64',
-    'setInt16',
-    'setInt32',
-    'setInt64',
-    'setInt8',
-    'setUint16',
-    'setUint32',
-    'setUint64',
-    'setUint8'
-  ]);
-  _native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
-    static new(length) {
-      return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.ByteData);
-    }
-    get [dartx.elementSizeInBytes]() {
-      return 1;
-    }
-    [dartx.getFloat32](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getFloat32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getFloat32](...args) {
-      return this.getFloat32.apply(this, args);
-    }
-    [dartx.getFloat64](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getFloat64](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getFloat64](...args) {
-      return this.getFloat64.apply(this, args);
-    }
-    [dartx.getInt16](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getInt16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getInt16](...args) {
-      return this.getInt16.apply(this, args);
-    }
-    [dartx.getInt32](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getInt32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getInt32](...args) {
-      return this.getInt32.apply(this, args);
-    }
-    [dartx.getInt64](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
-    }
-    [dartx.getInt8](...args) {
-      return this.getInt8.apply(this, args);
-    }
-    [dartx.getUint16](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getUint16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getUint16](...args) {
-      return this.getUint16.apply(this, args);
-    }
-    [dartx.getUint32](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_getUint32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_getUint32](...args) {
-      return this.getUint32.apply(this, args);
-    }
-    [dartx.getUint64](byteOffset, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
-    }
-    [dartx.getUint8](...args) {
-      return this.getUint8.apply(this, args);
-    }
-    [dartx.setFloat32](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setFloat32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setFloat32](...args) {
-      return this.setFloat32.apply(this, args);
-    }
-    [dartx.setFloat64](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setFloat64](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setFloat64](...args) {
-      return this.setFloat64.apply(this, args);
-    }
-    [dartx.setInt16](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setInt16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setInt16](...args) {
-      return this.setInt16.apply(this, args);
-    }
-    [dartx.setInt32](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setInt32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setInt32](...args) {
-      return this.setInt32.apply(this, args);
-    }
-    [dartx.setInt64](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
-    }
-    [dartx.setInt8](...args) {
-      return this.setInt8.apply(this, args);
-    }
-    [dartx.setUint16](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setUint16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setUint16](...args) {
-      return this.setUint16.apply(this, args);
-    }
-    [dartx.setUint32](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      return this[_setUint32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
-    }
-    [_setUint32](...args) {
-      return this.setUint32.apply(this, args);
-    }
-    [dartx.setUint64](byteOffset, value, endian) {
-      if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
-      dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
-    }
-    [dartx.setUint8](...args) {
-      return this.setUint8.apply(this, args);
-    }
-    static _create1(arg) {
-      return new DataView(new ArrayBuffer(arg));
-    }
-    static _create2(arg1, arg2) {
-      return new DataView(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new DataView(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
-  dart.setSignature(_native_typed_data.NativeByteData, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeByteData, [core.int]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeByteData, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({
-      [dartx.getFloat32]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
-      [_getFloat32]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
-      [dartx.getFloat64]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
-      [_getFloat64]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
-      [dartx.getInt16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [_getInt16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
-      [dartx.getInt32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [_getInt32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
-      [dartx.getInt64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [dartx.getInt8]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.getUint16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [_getUint16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
-      [dartx.getUint32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [_getUint32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
-      [dartx.getUint64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
-      [dartx.getUint8]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
-      [_setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
-      [dartx.setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
-      [_setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
-      [dartx.setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [_setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
-      [dartx.setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [_setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
-      [dartx.setInt64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [dartx.setInt8]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [_setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
-      [dartx.setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [_setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
-      [dartx.setUint64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
-      [dartx.setUint8]: dart.definiteFunctionType(dart.void, [core.int, core.int])
-    }),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.DataView, _native_typed_data.NativeByteData);
-  const _setRangeFast = Symbol('_setRangeFast');
-  _native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
-    [_setRangeFast](start, end, source, skipCount) {
-      let targetLength = this[dartx.length];
-      this[_checkPosition](start, targetLength, "start");
-      this[_checkPosition](end, targetLength, "end");
-      if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
-      let count = dart.notNull(end) - dart.notNull(start);
-      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
-      let sourceLength = source[dartx.length];
-      if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
-        dart.throw(new core.StateError('Not enough elements'));
-      }
-      if (skipCount != 0 || sourceLength != count) {
-        source = source.subarray(skipCount, dart.notNull(skipCount) + count);
-      }
-      this.set(source, start);
-    }
-  };
-  _native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
-  dart.setSignature(_native_typed_data.NativeTypedArray, {
-    methods: () => ({[_setRangeFast]: dart.definiteFunctionType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])})
-  });
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'setRange'
-  ]);
-  _native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.double), _internal.FixedLengthListMixin$(core.double)) {
-    get length() {
-      return this.length;
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _get(index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    _set(index, value) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      this[index] = value;
-      return value;
-    }
-    setRange(start, end, iterable, skipCount) {
-      if (skipCount === void 0) skipCount = 0;
-      if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
-        this[_setRangeFast](start, end, iterable, skipCount);
-        return;
-      }
-      super[dartx.setRange](start, end, iterable, skipCount);
-    }
-  };
-  dart.setSignature(_native_typed_data.NativeTypedArrayOfDouble, {
-    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      _get: dart.definiteFunctionType(core.double, [core.int]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, core.num])
-    })
-  });
-  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange', 'length']);
-  dart.defineExtensionNames([
-    'length',
-    '_set',
-    'setRange'
-  ]);
-  _native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.int), _internal.FixedLengthListMixin$(core.int)) {
-    get length() {
-      return this.length;
-    }
-    set length(value) {
-      super.length = value;
-    }
-    _set(index, value) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      this[index] = value;
-      return value;
-    }
-    setRange(start, end, iterable, skipCount) {
-      if (skipCount === void 0) skipCount = 0;
-      if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
-        this[_setRangeFast](start, end, iterable, skipCount);
-        return;
-      }
-      super[dartx.setRange](start, end, iterable, skipCount);
-    }
-  };
-  _native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
-  dart.setSignature(_native_typed_data.NativeTypedArrayOfInt, {
-    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({_set: dart.definiteFunctionType(dart.void, [core.int, core.int])})
-  });
-  dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange', 'length']);
-  dart.defineExtensionNames([
-    'runtimeType',
-    'sublist'
-  ]);
-  _native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
-    static new(length) {
-      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Float32List);
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeFloat32List._create1(source);
-    }
-    static _create1(arg) {
-      return new Float32Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Float32Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Float32Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
-  dart.setSignature(_native_typed_data.NativeFloat32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [ListOfdouble()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Float32Array, _native_typed_data.NativeFloat32List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    'sublist'
-  ]);
-  _native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
-    static new(length) {
-      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Float64List);
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeFloat64List._create1(source);
-    }
-    static _create1(arg) {
-      return new Float64Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Float64Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Float64Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
-  dart.setSignature(_native_typed_data.NativeFloat64List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [ListOfdouble()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Float64Array, _native_typed_data.NativeFloat64List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Int16List);
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeInt16List._create1(source);
-    }
-    static _create1(arg) {
-      return new Int16Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Int16Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Int16Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
-  dart.setSignature(_native_typed_data.NativeInt16List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [_native_typed_data.NativeByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Int16Array, _native_typed_data.NativeInt16List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Int32List);
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeInt32List._create1(source);
-    }
-    static _create1(arg) {
-      return new Int32Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Int32Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Int32Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
-  dart.setSignature(_native_typed_data.NativeInt32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Int32Array, _native_typed_data.NativeInt32List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Int8List);
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeInt8List._create1(source);
-    }
-    static _create1(arg) {
-      return new Int8Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Int8Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Int8Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
-  dart.setSignature(_native_typed_data.NativeInt8List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(typed_data.Int8List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Int8Array, _native_typed_data.NativeInt8List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(list) {
-      return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Uint16List);
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeUint16List._create1(source);
-    }
-    static _create1(arg) {
-      return new Uint16Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Uint16Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Uint16Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
-  dart.setSignature(_native_typed_data.NativeUint16List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Uint16Array, _native_typed_data.NativeUint16List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Uint32List);
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeUint32List._create1(source);
-    }
-    static _create1(arg) {
-      return new Uint32Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Uint32Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Uint32Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
-  dart.setSignature(_native_typed_data.NativeUint32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Uint32Array, _native_typed_data.NativeUint32List);
-  dart.defineExtensionNames([
-    'runtimeType',
-    'length',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Uint8ClampedList);
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    set [dartx.length](value) {
-      super[dartx.length] = value;
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeUint8ClampedList._create1(source);
-    }
-    static _create1(arg) {
-      return new Uint8ClampedArray(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Uint8ClampedArray(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Uint8ClampedArray(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
-  dart.setSignature(_native_typed_data.NativeUint8ClampedList, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Uint8ClampedArray, _native_typed_data.NativeUint8ClampedList);
-  dart.registerExtension(dart.global.CanvasPixelArray, _native_typed_data.NativeUint8ClampedList);
-  dart.defineExtensionNames([
-    'runtimeType',
-    'length',
-    '_get',
-    'sublist'
-  ]);
-  _native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
-    static new(length) {
-      return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
-    }
-    static view(buffer, offsetInBytes, length) {
-      _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
-      return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
-    }
-    get [dartx.runtimeType]() {
-      return dart.wrapType(typed_data.Uint8List);
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    set [dartx.length](value) {
-      super[dartx.length] = value;
-    }
-    [dartx._get](index) {
-      _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
-      return this[index];
-    }
-    [dartx.sublist](start, end) {
-      if (end === void 0) end = null;
-      end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
-      let source = this.subarray(start, end);
-      return _native_typed_data.NativeUint8List._create1(source);
-    }
-    static _create1(arg) {
-      return new Uint8Array(arg);
-    }
-    static _create2(arg1, arg2) {
-      return new Uint8Array(arg1, arg2);
-    }
-    static _create3(arg1, arg2, arg3) {
-      return new Uint8Array(arg1, arg2, arg3);
-    }
-  };
-  _native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
-  dart.setSignature(_native_typed_data.NativeUint8List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [core.int]),
-      fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [ListOfint()]),
-      view: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [typed_data.ByteBuffer, core.int, core.int])
-    }),
-    methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
-    statics: () => ({
-      _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic]),
-      _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic]),
-      _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create1', '_create2', '_create3']
-  });
-  dart.registerExtension(dart.global.Uint8Array, _native_typed_data.NativeUint8List);
-  _native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
-    static _truncate(x) {
-      _native_typed_data.NativeFloat32x4._list[dartx._set](0, core.num._check(x));
-      return _native_typed_data.NativeFloat32x4._list[dartx._get](0);
-    }
-    new(x, y, z, w) {
-      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
-      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
-      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
-      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
-      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
-      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
-      if (!(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
-      if (!(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
-    }
-    splat(v) {
-      NativeFloat32x4.prototype.new.call(this, v, v, v, v);
-    }
-    zero() {
-      NativeFloat32x4.prototype._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
-    }
-    static fromInt32x4Bits(i) {
-      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](0, i.x);
-      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](1, i.y);
-      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](2, i.z);
-      _native_typed_data.NativeFloat32x4._uint32view[dartx._set](3, i.w);
-      return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[dartx._get](0), _native_typed_data.NativeFloat32x4._list[dartx._get](1), _native_typed_data.NativeFloat32x4._list[dartx._get](2), _native_typed_data.NativeFloat32x4._list[dartx._get](3));
-    }
-    fromFloat64x2(v) {
-      NativeFloat32x4.prototype._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
-    }
-    _doubles(x, y, z, w) {
-      this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
-      this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
-      this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
-      this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
-    }
-    _truncated(x, y, z, w) {
-      this.x = x;
-      this.y = y;
-      this.z = z;
-      this.w = w;
-    }
-    toString() {
-      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
-    }
-    ['+'](other) {
-      let _x = dart.notNull(this.x) + dart.notNull(other.x);
-      let _y = dart.notNull(this.y) + dart.notNull(other.y);
-      let _z = dart.notNull(this.z) + dart.notNull(other.z);
-      let _w = dart.notNull(this.w) + dart.notNull(other.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    _negate() {
-      return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
-    }
-    ['-'](other) {
-      let _x = dart.notNull(this.x) - dart.notNull(other.x);
-      let _y = dart.notNull(this.y) - dart.notNull(other.y);
-      let _z = dart.notNull(this.z) - dart.notNull(other.z);
-      let _w = dart.notNull(this.w) - dart.notNull(other.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    ['*'](other) {
-      let _x = dart.notNull(this.x) * dart.notNull(other.x);
-      let _y = dart.notNull(this.y) * dart.notNull(other.y);
-      let _z = dart.notNull(this.z) * dart.notNull(other.z);
-      let _w = dart.notNull(this.w) * dart.notNull(other.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    ['/'](other) {
-      let _x = dart.notNull(this.x) / dart.notNull(other.x);
-      let _y = dart.notNull(this.y) / dart.notNull(other.y);
-      let _z = dart.notNull(this.z) / dart.notNull(other.z);
-      let _w = dart.notNull(this.w) / dart.notNull(other.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    lessThan(other) {
-      let _cx = dart.notNull(this.x) < dart.notNull(other.x);
-      let _cy = dart.notNull(this.y) < dart.notNull(other.y);
-      let _cz = dart.notNull(this.z) < dart.notNull(other.z);
-      let _cw = dart.notNull(this.w) < dart.notNull(other.w);
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    lessThanOrEqual(other) {
-      let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
-      let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
-      let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
-      let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    greaterThan(other) {
-      let _cx = dart.notNull(this.x) > dart.notNull(other.x);
-      let _cy = dart.notNull(this.y) > dart.notNull(other.y);
-      let _cz = dart.notNull(this.z) > dart.notNull(other.z);
-      let _cw = dart.notNull(this.w) > dart.notNull(other.w);
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    greaterThanOrEqual(other) {
-      let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
-      let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
-      let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
-      let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    equal(other) {
-      let _cx = this.x == other.x;
-      let _cy = this.y == other.y;
-      let _cz = this.z == other.z;
-      let _cw = this.w == other.w;
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    notEqual(other) {
-      let _cx = this.x != other.x;
-      let _cy = this.y != other.y;
-      let _cz = this.z != other.z;
-      let _cw = this.w != other.w;
-      return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
-    }
-    scale(s) {
-      let _x = dart.notNull(s) * dart.notNull(this.x);
-      let _y = dart.notNull(s) * dart.notNull(this.y);
-      let _z = dart.notNull(s) * dart.notNull(this.z);
-      let _w = dart.notNull(s) * dart.notNull(this.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    abs() {
-      let _x = this.x[dartx.abs]();
-      let _y = this.y[dartx.abs]();
-      let _z = this.z[dartx.abs]();
-      let _w = this.w[dartx.abs]();
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    clamp(lowerLimit, upperLimit) {
-      let _lx = lowerLimit.x;
-      let _ly = lowerLimit.y;
-      let _lz = lowerLimit.z;
-      let _lw = lowerLimit.w;
-      let _ux = upperLimit.x;
-      let _uy = upperLimit.y;
-      let _uz = upperLimit.z;
-      let _uw = upperLimit.w;
-      let _x = this.x;
-      let _y = this.y;
-      let _z = this.z;
-      let _w = this.w;
-      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
-      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
-      _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
-      _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
-      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
-      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
-      _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
-      _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    get signMask() {
-      let view = _native_typed_data.NativeFloat32x4._uint32view;
-      let mx = null, my = null, mz = null, mw = null;
-      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
-      mx = (dart.notNull(view[dartx._get](0)) & 2147483648) >>> 31;
-      my = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 30;
-      mz = (dart.notNull(view[dartx._get](2)) & 2147483648) >>> 29;
-      mw = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 28;
-      return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', my), '|', mz), '|', mw));
-    }
-    shuffle(mask) {
-      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
-        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
-      }
-      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
-      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
-      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
-      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
-      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    shuffleMix(other, mask) {
-      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
-        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
-      }
-      _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
-      let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
-      let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](0, other.x);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](1, other.y);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](2, other.z);
-      _native_typed_data.NativeFloat32x4._list[dartx._set](3, other.w);
-      let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
-      let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    withX(newX) {
-      return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
-    }
-    withY(newY) {
-      return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
-    }
-    withZ(newZ) {
-      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
-    }
-    withW(newW) {
-      return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
-    }
-    min(other) {
-      let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
-      let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
-      let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
-      let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    max(other) {
-      let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
-      let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
-      let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
-      let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
-      return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
-    }
-    sqrt() {
-      let _x = math.sqrt(this.x);
-      let _y = math.sqrt(this.y);
-      let _z = math.sqrt(this.z);
-      let _w = math.sqrt(this.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    reciprocal() {
-      let _x = 1.0 / dart.notNull(this.x);
-      let _y = 1.0 / dart.notNull(this.y);
-      let _z = 1.0 / dart.notNull(this.z);
-      let _w = 1.0 / dart.notNull(this.w);
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-    reciprocalSqrt() {
-      let _x = math.sqrt(1.0 / dart.notNull(this.x));
-      let _y = math.sqrt(1.0 / dart.notNull(this.y));
-      let _z = math.sqrt(1.0 / dart.notNull(this.z));
-      let _w = math.sqrt(1.0 / dart.notNull(this.w));
-      return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'splat');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'zero');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'fromFloat64x2');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_doubles');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_truncated');
-  _native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
-  dart.setSignature(_native_typed_data.NativeFloat32x4, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
-      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double]),
-      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, []),
-      fromInt32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Int32x4]),
-      fromFloat64x2: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Float64x2]),
-      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
-      _truncated: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double])
-    }),
-    fields: () => ({
-      x: core.double,
-      y: core.double,
-      z: core.double,
-      w: core.double
-    }),
-    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      '+': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      _negate: dart.definiteFunctionType(typed_data.Float32x4, []),
-      '-': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      '*': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      '/': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      lessThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      lessThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      greaterThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      greaterThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      equal: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      notEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
-      scale: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      abs: dart.definiteFunctionType(typed_data.Float32x4, []),
-      clamp: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
-      shuffle: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
-      shuffleMix: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
-      withX: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      withY: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      withZ: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      withW: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
-      min: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      max: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
-      sqrt: dart.definiteFunctionType(typed_data.Float32x4, []),
-      reciprocal: dart.definiteFunctionType(typed_data.Float32x4, []),
-      reciprocalSqrt: dart.definiteFunctionType(typed_data.Float32x4, [])
-    }),
-    sfields: () => ({
-      _list: _native_typed_data.NativeFloat32List,
-      _uint32view: typed_data.Uint32List
-    }),
-    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
-    names: ['_truncate']
-  });
-  dart.defineLazy(_native_typed_data.NativeFloat32x4, {
-    get _list() {
-      return _native_typed_data.NativeFloat32List.new(4);
-    },
-    get _uint32view() {
-      return _native_typed_data.NativeFloat32x4._list[dartx.buffer][dartx.asUint32List]();
-    }
-  });
-  _native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
-    static _truncate(x) {
-      _native_typed_data.NativeInt32x4._list[dartx._set](0, core.int._check(x));
-      return _native_typed_data.NativeInt32x4._list[dartx._get](0);
-    }
-    new(x, y, z, w) {
-      this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
-      this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
-      this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
-      this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
-      if (x != this.x && !(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
-      if (y != this.y && !(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
-      if (z != this.z && !(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
-      if (w != this.w && !(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
-    }
-    bool(x, y, z, w) {
-      this.x = dart.test(x) ? -1 : 0;
-      this.y = dart.test(y) ? -1 : 0;
-      this.z = dart.test(z) ? -1 : 0;
-      this.w = dart.test(w) ? -1 : 0;
-    }
-    static fromFloat32x4Bits(f) {
-      let floatList = _native_typed_data.NativeFloat32x4._list;
-      floatList[dartx._set](0, f.x);
-      floatList[dartx._set](1, f.y);
-      floatList[dartx._set](2, f.z);
-      floatList[dartx._set](3, f.w);
-      let view = _native_typed_data.NativeInt32List._check(floatList[dartx.buffer][dartx.asInt32List]());
-      return new _native_typed_data.NativeInt32x4._truncated(view[dartx._get](0), view[dartx._get](1), view[dartx._get](2), view[dartx._get](3));
-    }
-    _truncated(x, y, z, w) {
-      this.x = x;
-      this.y = y;
-      this.z = z;
-      this.w = w;
-    }
-    toString() {
-      return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
-    }
-    ['|'](other) {
-      return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
-    }
-    ['&'](other) {
-      return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
-    }
-    ['^'](other) {
-      return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
-    }
-    ['+'](other) {
-      return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
-    }
-    ['-'](other) {
-      return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
-    }
-    _negate() {
-      return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
-    }
-    get signMask() {
-      let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
-      let my = (dart.notNull(this.y) & 2147483648) >>> 31;
-      let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
-      let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
-      return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
-    }
-    shuffle(mask) {
-      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
-        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
-      }
-      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
-      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
-      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
-      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
-      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
-      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
-      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
-      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
-      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
-    }
-    shuffleMix(other, mask) {
-      if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
-        dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
-      }
-      _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
-      _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
-      _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
-      _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
-      let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
-      let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
-      _native_typed_data.NativeInt32x4._list[dartx._set](0, other.x);
-      _native_typed_data.NativeInt32x4._list[dartx._set](1, other.y);
-      _native_typed_data.NativeInt32x4._list[dartx._set](2, other.z);
-      _native_typed_data.NativeInt32x4._list[dartx._set](3, other.w);
-      let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
-      let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
-      return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
-    }
-    withX(x) {
-      let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
-      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
-    }
-    withY(y) {
-      let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
-    }
-    withZ(z) {
-      let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
-    }
-    withW(w) {
-      let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
-    }
-    get flagX() {
-      return this.x != 0;
-    }
-    get flagY() {
-      return this.y != 0;
-    }
-    get flagZ() {
-      return this.z != 0;
-    }
-    get flagW() {
-      return this.w != 0;
-    }
-    withFlagX(flagX) {
-      let _x = dart.test(flagX) ? -1 : 0;
-      return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
-    }
-    withFlagY(flagY) {
-      let _y = dart.test(flagY) ? -1 : 0;
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
-    }
-    withFlagZ(flagZ) {
-      let _z = dart.test(flagZ) ? -1 : 0;
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
-    }
-    withFlagW(flagW) {
-      let _w = dart.test(flagW) ? -1 : 0;
-      return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
-    }
-    select(trueValue, falseValue) {
-      let floatList = _native_typed_data.NativeFloat32x4._list;
-      let intView = _native_typed_data.NativeFloat32x4._uint32view;
-      floatList[dartx._set](0, trueValue.x);
-      floatList[dartx._set](1, trueValue.y);
-      floatList[dartx._set](2, trueValue.z);
-      floatList[dartx._set](3, trueValue.w);
-      let stx = intView[dartx._get](0);
-      let sty = intView[dartx._get](1);
-      let stz = intView[dartx._get](2);
-      let stw = intView[dartx._get](3);
-      floatList[dartx._set](0, falseValue.x);
-      floatList[dartx._set](1, falseValue.y);
-      floatList[dartx._set](2, falseValue.z);
-      floatList[dartx._set](3, falseValue.w);
-      let sfx = intView[dartx._get](0);
-      let sfy = intView[dartx._get](1);
-      let sfz = intView[dartx._get](2);
-      let sfw = intView[dartx._get](3);
-      let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
-      let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
-      let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
-      let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
-      intView[dartx._set](0, _x);
-      intView[dartx._set](1, _y);
-      intView[dartx._set](2, _z);
-      intView[dartx._set](3, _w);
-      return new _native_typed_data.NativeFloat32x4._truncated(floatList[dartx._get](0), floatList[dartx._get](1), floatList[dartx._get](2), floatList[dartx._get](3));
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, 'bool');
-  dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, '_truncated');
-  _native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
-  dart.setSignature(_native_typed_data.NativeInt32x4, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int]),
-      bool: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.bool, core.bool, core.bool, core.bool]),
-      fromFloat32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [typed_data.Float32x4]),
-      _truncated: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int])
-    }),
-    fields: () => ({
-      x: core.int,
-      y: core.int,
-      z: core.int,
-      w: core.int
-    }),
-    getters: () => ({
-      signMask: dart.definiteFunctionType(core.int, []),
-      flagX: dart.definiteFunctionType(core.bool, []),
-      flagY: dart.definiteFunctionType(core.bool, []),
-      flagZ: dart.definiteFunctionType(core.bool, []),
-      flagW: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      '|': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
-      '&': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
-      '^': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
-      '+': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
-      '-': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
-      _negate: dart.definiteFunctionType(typed_data.Int32x4, []),
-      shuffle: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      shuffleMix: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
-      withX: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      withY: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      withZ: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      withW: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
-      withFlagX: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
-      withFlagY: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
-      withFlagZ: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
-      withFlagW: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
-      select: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
-    }),
-    sfields: () => ({_list: _native_typed_data.NativeInt32List}),
-    statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
-    names: ['_truncate']
-  });
-  dart.defineLazy(_native_typed_data.NativeInt32x4, {
-    get _list() {
-      return _native_typed_data.NativeInt32List.new(4);
-    }
-  });
-  _native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
-    new(x, y) {
-      this.x = x;
-      this.y = y;
-      if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError(this.x));
-      if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError(this.y));
-    }
-    splat(v) {
-      NativeFloat64x2.prototype.new.call(this, v, v);
-    }
-    zero() {
-      NativeFloat64x2.prototype.splat.call(this, 0.0);
-    }
-    fromFloat32x4(v) {
-      NativeFloat64x2.prototype.new.call(this, v.x, v.y);
-    }
-    _doubles(x, y) {
-      this.x = x;
-      this.y = y;
-    }
-    toString() {
-      return dart.str`[${this.x}, ${this.y}]`;
-    }
-    ['+'](other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
-    }
-    _negate() {
-      return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
-    }
-    ['-'](other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
-    }
-    ['*'](other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
-    }
-    ['/'](other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
-    }
-    scale(s) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
-    }
-    abs() {
-      return new _native_typed_data.NativeFloat64x2._doubles(this.x[dartx.abs](), this.y[dartx.abs]());
-    }
-    clamp(lowerLimit, upperLimit) {
-      let _lx = lowerLimit.x;
-      let _ly = lowerLimit.y;
-      let _ux = upperLimit.x;
-      let _uy = upperLimit.y;
-      let _x = this.x;
-      let _y = this.y;
-      _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
-      _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
-      _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
-      _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
-      return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
-    }
-    get signMask() {
-      let view = _native_typed_data.NativeFloat64x2._uint32View;
-      _native_typed_data.NativeFloat64x2._list[dartx._set](0, this.x);
-      _native_typed_data.NativeFloat64x2._list[dartx._set](1, this.y);
-      let mx = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 31;
-      let my = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 31;
-      return (mx | my << 1) >>> 0;
-    }
-    withX(x) {
-      if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
-      return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
-    }
-    withY(y) {
-      if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
-      return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
-    }
-    min(other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
-    }
-    max(other) {
-      return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
-    }
-    sqrt() {
-      return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
-    }
-  };
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'splat');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'zero');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'fromFloat32x4');
-  dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, '_doubles');
-  _native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
-  dart.setSignature(_native_typed_data.NativeFloat64x2, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double]),
-      splat: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double]),
-      zero: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, []),
-      fromFloat32x4: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [typed_data.Float32x4]),
-      _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double])
-    }),
-    fields: () => ({
-      x: core.double,
-      y: core.double
-    }),
-    getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      '+': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      _negate: dart.definiteFunctionType(typed_data.Float64x2, []),
-      '-': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      '*': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      '/': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      scale: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
-      abs: dart.definiteFunctionType(typed_data.Float64x2, []),
-      clamp: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
-      withX: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
-      withY: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
-      min: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      max: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
-      sqrt: dart.definiteFunctionType(typed_data.Float64x2, [])
-    }),
-    sfields: () => ({
-      _list: _native_typed_data.NativeFloat64List,
-      _uint32View: _native_typed_data.NativeUint32List
-    })
-  });
-  dart.defineLazy(_native_typed_data.NativeFloat64x2, {
-    get _list() {
-      return _native_typed_data.NativeFloat64List.new(2);
-    },
-    set _list(_) {},
-    get _uint32View() {
-      return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list[dartx.buffer][dartx.asUint32List]());
-    },
-    set _uint32View(_) {}
-  });
-  _native_typed_data._isInvalidArrayIndex = function(index) {
-    return index >>> 0 !== index;
-  };
-  dart.lazyFn(_native_typed_data._isInvalidArrayIndex, () => intTobool());
-  _native_typed_data._checkValidIndex = function(index, list, length) {
-    if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
-      dart.throw(_js_helper.diagnoseIndexError(list, index));
-    }
-  };
-  dart.lazyFn(_native_typed_data._checkValidIndex, () => intAndListAndintTovoid());
-  _native_typed_data._checkValidRange = function(start, end, length) {
-    if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
-      dart.throw(_js_helper.diagnoseRangeError(start, end, length));
-    }
-    if (end == null) return length;
-    return end;
-  };
-  dart.fn(_native_typed_data._checkValidRange, intAndintAndintToint());
-  async._Callback = dart.typedef('_Callback', () => dart.functionType(dart.void, []));
-  async._TakeCallback = dart.typedef('_TakeCallback', () => dart.functionType(dart.void, [async._Callback]));
-  async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
-    if (async.ZoneBinaryCallback.is(errorHandler)) {
-      return dart.dcall(errorHandler, error, stackTrace);
-    } else {
-      let unaryErrorHandler = async.ZoneUnaryCallback._check(errorHandler);
-      return dart.dcall(unaryErrorHandler, error);
-    }
-  };
-  dart.lazyFn(async._invokeErrorHandler, () => FunctionAndObjectAndStackTraceTodynamic());
-  async._registerErrorHandler = function(R) {
-    return (errorHandler, zone) => {
-      if (async.ZoneBinaryCallback.is(errorHandler)) {
-        return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
-      } else {
-        return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
-      }
-    };
-  };
-  dart.lazyFn(async._registerErrorHandler, () => FunctionAndZoneToFunction());
-  async.AsyncError = class AsyncError extends core.Object {
-    new(error, stackTrace) {
-      this.error = error;
-      this.stackTrace = stackTrace;
-    }
-    toString() {
-      return dart.str`${this.error}`;
-    }
-  };
-  async.AsyncError[dart.implements] = () => [core.Error];
-  dart.setSignature(async.AsyncError, {
-    constructors: () => ({new: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace])}),
-    fields: () => ({
-      error: core.Object,
-      stackTrace: core.StackTrace
-    })
-  });
-  async._UncaughtAsyncError = class _UncaughtAsyncError extends async.AsyncError {
-    new(error, stackTrace) {
-      super.new(error, async._UncaughtAsyncError._getBestStackTrace(error, stackTrace));
-    }
-    static _getBestStackTrace(error, stackTrace) {
-      if (stackTrace != null) return stackTrace;
-      if (core.Error.is(error)) {
-        return error.stackTrace;
-      }
-      return null;
-    }
-    toString() {
-      let result = dart.str`Uncaught Error: ${this.error}`;
-      if (this.stackTrace != null) {
-        result = result + dart.str`\nStack Trace:\n${this.stackTrace}`;
-      }
-      return result;
-    }
-  };
-  dart.setSignature(async._UncaughtAsyncError, {
-    constructors: () => ({new: dart.definiteFunctionType(async._UncaughtAsyncError, [dart.dynamic, core.StackTrace])}),
-    statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
-    names: ['_getBestStackTrace']
-  });
-  const _controller$ = Symbol('_controller');
-  const _subscribe = Symbol('_subscribe');
-  const _createSubscription = Symbol('_createSubscription');
-  const _onListen = Symbol('_onListen');
-  async._StreamImpl$ = dart.generic(T => {
-    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _StreamImpl extends async.Stream$(T) {
-      new() {
-        super.new();
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        cancelOnError = core.identical(true, cancelOnError);
-        let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
-        this[_onListen](subscription);
-        return subscription;
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
-      }
-      [_onListen](subscription) {}
-    }
-    dart.setSignature(_StreamImpl, {
-      methods: () => ({
-        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
-        [_onListen]: dart.definiteFunctionType(dart.void, [async.StreamSubscription])
-      })
-    });
-    return _StreamImpl;
-  });
-  async._StreamImpl = _StreamImpl();
-  async._ControllerStream$ = dart.generic(T => {
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    class _ControllerStream extends async._StreamImpl$(T) {
-      new(controller) {
-        this[_controller$] = controller;
-        super.new();
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
-      }
-      get hashCode() {
-        return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
-      }
-      ['=='](other) {
-        if (core.identical(this, other)) return true;
-        if (!async._ControllerStream.is(other)) return false;
-        let otherStream = async._ControllerStream._check(other);
-        return core.identical(otherStream[_controller$], this[_controller$]);
-      }
-    }
-    dart.setSignature(_ControllerStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
-      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
-      methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
-    });
-    return _ControllerStream;
-  });
-  async._ControllerStream = _ControllerStream();
-  async._BroadcastStream$ = dart.generic(T => {
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    class _BroadcastStream extends async._ControllerStream$(T) {
-      new(controller) {
-        super.new(controller);
-      }
-      get isBroadcast() {
-        return true;
-      }
-    }
-    dart.setSignature(_BroadcastStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStream$(T), [_StreamControllerLifecycleOfT()])})
-    });
-    return _BroadcastStream;
-  });
-  async._BroadcastStream = _BroadcastStream();
-  const _eventState = Symbol('_eventState');
-  const _next$ = Symbol('_next');
-  const _previous$ = Symbol('_previous');
-  const _expectsEvent = Symbol('_expectsEvent');
-  const _toggleEventId = Symbol('_toggleEventId');
-  const _isFiring = Symbol('_isFiring');
-  const _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring');
-  const _removeAfterFiring = Symbol('_removeAfterFiring');
-  const _onPause = Symbol('_onPause');
-  const _onResume = Symbol('_onResume');
-  const _recordCancel = Symbol('_recordCancel');
-  const _onCancel = Symbol('_onCancel');
-  const _recordPause = Symbol('_recordPause');
-  const _recordResume = Symbol('_recordResume');
-  const _zone = Symbol('_zone');
-  const _state = Symbol('_state');
-  const _onData = Symbol('_onData');
-  const _onError = Symbol('_onError');
-  const _onDone = Symbol('_onDone');
-  const _cancelFuture = Symbol('_cancelFuture');
-  const _pending = Symbol('_pending');
-  const _setPendingEvents = Symbol('_setPendingEvents');
-  const _isCanceled = Symbol('_isCanceled');
-  const _isPaused = Symbol('_isPaused');
-  const _isInputPaused = Symbol('_isInputPaused');
-  const _inCallback = Symbol('_inCallback');
-  const _guardCallback = Symbol('_guardCallback');
-  const _decrementPauseCount = Symbol('_decrementPauseCount');
-  const _hasPending = Symbol('_hasPending');
-  const _mayResumeInput = Symbol('_mayResumeInput');
-  const _cancel = Symbol('_cancel');
-  const _isClosed$ = Symbol('_isClosed');
-  const _waitsForCancel = Symbol('_waitsForCancel');
-  const _canFire = Symbol('_canFire');
-  const _cancelOnError = Symbol('_cancelOnError');
-  const _incrementPauseCount = Symbol('_incrementPauseCount');
-  const _sendData = Symbol('_sendData');
-  const _addPending = Symbol('_addPending');
-  const _sendError = Symbol('_sendError');
-  const _sendDone = Symbol('_sendDone');
-  let const$5;
-  const _close$ = Symbol('_close');
-  const _checkState = Symbol('_checkState');
-  async._BufferingStreamSubscription$ = dart.generic(T => {
-    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
-    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
-    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _BufferingStreamSubscription extends core.Object {
-      new(onData, onError, onDone, cancelOnError) {
-        this[_zone] = async.Zone.current;
-        this[_state] = dart.test(cancelOnError) ? async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR : 0;
-        this[_onData] = null;
-        this[_onError] = null;
-        this[_onDone] = null;
-        this[_cancelFuture] = null;
-        this[_pending] = null;
-        this.onData(onData);
-        this.onError(onError);
-        this.onDone(onDone);
-      }
-      [_setPendingEvents](pendingEvents) {
-        _PendingEventsOfT()._check(pendingEvents);
-        dart.assert(this[_pending] == null);
-        if (pendingEvents == null) return;
-        this[_pending] = pendingEvents;
-        if (!dart.test(pendingEvents.isEmpty)) {
-          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
-          this[_pending].schedule(this);
-        }
-      }
-      onData(handleData) {
-        if (handleData == null) handleData = async._nullDataHandler;
-        this[_onData] = this[_zone].registerUnaryCallback(dart.dynamic, T)(handleData);
-      }
-      onError(handleError) {
-        if (handleError == null) handleError = async._nullErrorHandler;
-        this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
-      }
-      onDone(handleDone) {
-        if (handleDone == null) handleDone = async._nullDoneHandler;
-        this[_onDone] = this[_zone].registerCallback(dart.void)(handleDone);
-      }
-      pause(resumeSignal) {
-        if (resumeSignal === void 0) resumeSignal = null;
-        if (dart.test(this[_isCanceled])) return;
-        let wasPaused = this[_isPaused];
-        let wasInputPaused = this[_isInputPaused];
-        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
-        if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
-        if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
-      }
-      resume() {
-        if (dart.test(this[_isCanceled])) return;
-        if (dart.test(this[_isPaused])) {
-          this[_decrementPauseCount]();
-          if (!dart.test(this[_isPaused])) {
-            if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
-              this[_pending].schedule(this);
-            } else {
-              dart.assert(this[_mayResumeInput]);
-              this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-              if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
-            }
-          }
-        }
-      }
-      cancel() {
-        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (dart.test(this[_isCanceled])) return this[_cancelFuture];
-        this[_cancel]();
-        return this[_cancelFuture];
-      }
-      asFuture(E) {
-        return futureValue => {
-          if (futureValue === void 0) futureValue = null;
-          let result = new (async._Future$(E))();
-          this[_onDone] = dart.fn(() => {
-            result[_complete](futureValue);
-          }, VoidToNull());
-          this[_onError] = dart.fn((error, stackTrace) => {
-            this.cancel();
-            result[_completeError](error, core.StackTrace._check(stackTrace));
-          }, dynamicAnddynamicToNull());
-          return result;
-        };
-      }
-      get [_isInputPaused]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
-      }
-      get [_isClosed$]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
-      }
-      get [_isCanceled]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCELED) != 0;
-      }
-      get [_waitsForCancel]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) != 0;
-      }
-      get [_inCallback]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_IN_CALLBACK) != 0;
-      }
-      get [_hasPending]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_HAS_PENDING) != 0;
-      }
-      get [_isPaused]() {
-        return dart.notNull(this[_state]) >= async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
-      }
-      get [_canFire]() {
-        return dart.notNull(this[_state]) < async._BufferingStreamSubscription._STATE_IN_CALLBACK;
-      }
-      get [_mayResumeInput]() {
-        return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
-      }
-      get [_cancelOnError]() {
-        return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR) != 0;
-      }
-      get isPaused() {
-        return this[_isPaused];
-      }
-      [_cancel]() {
-        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED) >>> 0;
-        if (dart.test(this[_hasPending])) {
-          this[_pending].cancelSchedule();
-        }
-        if (!dart.test(this[_inCallback])) this[_pending] = null;
-        this[_cancelFuture] = this[_onCancel]();
-      }
-      [_incrementPauseCount]() {
-        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-      }
-      [_decrementPauseCount]() {
-        dart.assert(this[_isPaused]);
-        this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
-      }
-      [_add$](data) {
-        T._check(data);
-        dart.assert(!dart.test(this[_isClosed$]));
-        if (dart.test(this[_isCanceled])) return;
-        if (dart.test(this[_canFire])) {
-          this[_sendData](data);
-        } else {
-          this[_addPending](new (_DelayedDataOfT())(data));
-        }
-      }
-      [_addError](error, stackTrace) {
-        if (dart.test(this[_isCanceled])) return;
-        if (dart.test(this[_canFire])) {
-          this[_sendError](error, stackTrace);
-        } else {
-          this[_addPending](new async._DelayedError(error, stackTrace));
-        }
-      }
-      [_close$]() {
-        dart.assert(!dart.test(this[_isClosed$]));
-        if (dart.test(this[_isCanceled])) return;
-        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
-        if (dart.test(this[_canFire])) {
-          this[_sendDone]();
-        } else {
-          this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
-        }
-      }
-      [_onPause]() {
-        dart.assert(this[_isInputPaused]);
-      }
-      [_onResume]() {
-        dart.assert(!dart.test(this[_isInputPaused]));
-      }
-      [_onCancel]() {
-        dart.assert(this[_isCanceled]);
-        return null;
-      }
-      [_addPending](event) {
-        let pending = _StreamImplEventsOfT()._check(this[_pending]);
-        if (this[_pending] == null) {
-          pending = this[_pending] = new (_StreamImplEventsOfT())();
-        }
-        pending.add(event);
-        if (!dart.test(this[_hasPending])) {
-          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
-          if (!dart.test(this[_isPaused])) {
-            this[_pending].schedule(this);
-          }
-        }
-      }
-      [_sendData](data) {
-        T._check(data);
-        dart.assert(!dart.test(this[_isCanceled]));
-        dart.assert(!dart.test(this[_isPaused]));
-        dart.assert(!dart.test(this[_inCallback]));
-        let wasInputPaused = this[_isInputPaused];
-        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        this[_zone].runUnaryGuarded(dart.void, T)(this[_onData], data);
-        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        this[_checkState](wasInputPaused);
-      }
-      [_sendError](error, stackTrace) {
-        dart.assert(!dart.test(this[_isCanceled]));
-        dart.assert(!dart.test(this[_isPaused]));
-        dart.assert(!dart.test(this[_inCallback]));
-        let wasInputPaused = this[_isInputPaused];
-        const sendError = (function() {
-          if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
-          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-          if (ZoneBinaryCallbackOfdynamic$Object$StackTrace().is(this[_onError])) {
-            let errorCallback = ZoneBinaryCallbackOfdynamic$Object$StackTrace().as(this[_onError]);
-            this[_zone].runBinaryGuarded(dart.dynamic, core.Object, core.StackTrace)(errorCallback, error, stackTrace);
-          } else {
-            this[_zone].runUnaryGuarded(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(this[_onError]), error);
-          }
-          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        }).bind(this);
-        dart.fn(sendError, VoidTovoid$());
-        if (dart.test(this[_cancelOnError])) {
-          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-          this[_cancel]();
-          if (async.Future.is(this[_cancelFuture])) {
-            this[_cancelFuture].whenComplete(sendError);
-          } else {
-            sendError();
-          }
-        } else {
-          sendError();
-          this[_checkState](wasInputPaused);
-        }
-      }
-      [_sendDone]() {
-        dart.assert(!dart.test(this[_isCanceled]));
-        dart.assert(!dart.test(this[_isPaused]));
-        dart.assert(!dart.test(this[_inCallback]));
-        const sendDone = (function() {
-          if (!dart.test(this[_waitsForCancel])) return;
-          this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED | async._BufferingStreamSubscription._STATE_CLOSED | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-          this[_zone].runGuarded(dart.void)(this[_onDone]);
-          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        }).bind(this);
-        dart.fn(sendDone, VoidTovoid$());
-        this[_cancel]();
-        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (async.Future.is(this[_cancelFuture])) {
-          this[_cancelFuture].whenComplete(sendDone);
-        } else {
-          sendDone();
-        }
-      }
-      [_guardCallback](callback) {
-        dart.assert(!dart.test(this[_inCallback]));
-        let wasInputPaused = this[_isInputPaused];
-        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        callback();
-        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        this[_checkState](wasInputPaused);
-      }
-      [_checkState](wasInputPaused) {
-        dart.assert(!dart.test(this[_inCallback]));
-        if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
-          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
-          if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
-            this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-          }
-        }
-        while (true) {
-          if (dart.test(this[_isCanceled])) {
-            this[_pending] = null;
-            return;
-          }
-          let isInputPaused = this[_isInputPaused];
-          if (wasInputPaused == isInputPaused) break;
-          this[_state] = (dart.notNull(this[_state]) ^ async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-          if (dart.test(isInputPaused)) {
-            this[_onPause]();
-          } else {
-            this[_onResume]();
-          }
-          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-          wasInputPaused = isInputPaused;
-        }
-        if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
-          this[_pending].schedule(this);
-        }
-      }
-    }
-    dart.addTypeTests(_BufferingStreamSubscription);
-    _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
-    dart.setSignature(_BufferingStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BufferingStreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-      fields: () => ({
-        [_onData]: TTovoid(),
-        [_onError]: core.Function,
-        [_onDone]: async._DoneHandler,
-        [_zone]: async.Zone,
-        [_state]: core.int,
-        [_cancelFuture]: async.Future,
-        [_pending]: _PendingEventsOfT()
-      }),
-      getters: () => ({
-        [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
-        [_isClosed$]: dart.definiteFunctionType(core.bool, []),
-        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
-        [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
-        [_inCallback]: dart.definiteFunctionType(core.bool, []),
-        [_hasPending]: dart.definiteFunctionType(core.bool, []),
-        [_isPaused]: dart.definiteFunctionType(core.bool, []),
-        [_canFire]: dart.definiteFunctionType(core.bool, []),
-        [_mayResumeInput]: dart.definiteFunctionType(core.bool, []),
-        [_cancelOnError]: dart.definiteFunctionType(core.bool, []),
-        isPaused: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        [_setPendingEvents]: dart.definiteFunctionType(dart.void, [_PendingEventsOfT()]),
-        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
-        onError: dart.definiteFunctionType(dart.void, [core.Function]),
-        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-        resume: dart.definiteFunctionType(dart.void, []),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
-        [_cancel]: dart.definiteFunctionType(dart.void, []),
-        [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
-        [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
-        [_add$]: dart.definiteFunctionType(dart.void, [T]),
-        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_close$]: dart.definiteFunctionType(dart.void, []),
-        [_onPause]: dart.definiteFunctionType(dart.void, []),
-        [_onResume]: dart.definiteFunctionType(dart.void, []),
-        [_onCancel]: dart.definiteFunctionType(async.Future, []),
-        [_addPending]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
-        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
-        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, []),
-        [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
-      }),
-      sfields: () => ({
-        _STATE_CANCEL_ON_ERROR: core.int,
-        _STATE_CLOSED: core.int,
-        _STATE_INPUT_PAUSED: core.int,
-        _STATE_CANCELED: core.int,
-        _STATE_WAIT_FOR_CANCEL: core.int,
-        _STATE_IN_CALLBACK: core.int,
-        _STATE_HAS_PENDING: core.int,
-        _STATE_PAUSE_COUNT: core.int,
-        _STATE_PAUSE_COUNT_SHIFT: core.int
-      })
-    });
-    return _BufferingStreamSubscription;
-  });
-  async._BufferingStreamSubscription = _BufferingStreamSubscription();
-  async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR = 1;
-  async._BufferingStreamSubscription._STATE_CLOSED = 2;
-  async._BufferingStreamSubscription._STATE_INPUT_PAUSED = 4;
-  async._BufferingStreamSubscription._STATE_CANCELED = 8;
-  async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL = 16;
-  async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
-  async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
-  async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
-  async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
-  async._ControllerSubscription$ = dart.generic(T => {
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
-      new(controller, onData, onError, onDone, cancelOnError) {
-        this[_controller$] = controller;
-        super.new(onData, onError, onDone, cancelOnError);
-      }
-      [_onCancel]() {
-        return this[_controller$][_recordCancel](this);
-      }
-      [_onPause]() {
-        this[_controller$][_recordPause](this);
-      }
-      [_onResume]() {
-        this[_controller$][_recordResume](this);
-      }
-    }
-    dart.setSignature(_ControllerSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-      fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
-    });
-    return _ControllerSubscription;
-  });
-  async._ControllerSubscription = _ControllerSubscription();
-  async._BroadcastSubscription$ = dart.generic(T => {
-    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _BroadcastSubscription extends async._ControllerSubscription$(T) {
-      new(controller, onData, onError, onDone, cancelOnError) {
-        this[_eventState] = 0;
-        this[_next$] = null;
-        this[_previous$] = null;
-        super.new(controller, onData, onError, onDone, cancelOnError);
-        this[_next$] = this[_previous$] = this;
-      }
-      [_expectsEvent](eventId) {
-        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
-      }
-      [_toggleEventId]() {
-        this[_eventState] = (dart.notNull(this[_eventState]) ^ async._BroadcastSubscription._STATE_EVENT_ID) >>> 0;
-      }
-      get [_isFiring]() {
-        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_FIRING) != 0;
-      }
-      [_setRemoveAfterFiring]() {
-        dart.assert(this[_isFiring]);
-        this[_eventState] = (dart.notNull(this[_eventState]) | async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) >>> 0;
-      }
-      get [_removeAfterFiring]() {
-        return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) != 0;
-      }
-      [_onPause]() {}
-      [_onResume]() {}
-    }
-    dart.setSignature(_BroadcastSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-      fields: () => ({
-        [_eventState]: core.int,
-        [_next$]: _BroadcastSubscriptionOfT(),
-        [_previous$]: _BroadcastSubscriptionOfT()
-      }),
-      getters: () => ({
-        [_isFiring]: dart.definiteFunctionType(core.bool, []),
-        [_removeAfterFiring]: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        [_expectsEvent]: dart.definiteFunctionType(core.bool, [core.int]),
-        [_toggleEventId]: dart.definiteFunctionType(dart.void, []),
-        [_setRemoveAfterFiring]: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _STATE_EVENT_ID: core.int,
-        _STATE_FIRING: core.int,
-        _STATE_REMOVE_AFTER_FIRING: core.int
-      })
-    });
-    return _BroadcastSubscription;
-  });
-  async._BroadcastSubscription = _BroadcastSubscription();
-  async._BroadcastSubscription._STATE_EVENT_ID = 1;
-  async._BroadcastSubscription._STATE_FIRING = 2;
-  async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING = 4;
-  const _firstSubscription = Symbol('_firstSubscription');
-  const _lastSubscription = Symbol('_lastSubscription');
-  const _addStreamState = Symbol('_addStreamState');
-  const _doneFuture = Symbol('_doneFuture');
-  const _isEmpty = Symbol('_isEmpty');
-  const _hasOneListener = Symbol('_hasOneListener');
-  const _isAddingStream = Symbol('_isAddingStream');
-  const _mayAddEvent = Symbol('_mayAddEvent');
-  const _ensureDoneFuture = Symbol('_ensureDoneFuture');
-  const _addListener = Symbol('_addListener');
-  const _removeListener = Symbol('_removeListener');
-  const _callOnCancel = Symbol('_callOnCancel');
-  const _addEventError = Symbol('_addEventError');
-  const _forEachListener = Symbol('_forEachListener');
-  const _mayComplete = Symbol('_mayComplete');
-  const _asyncComplete = Symbol('_asyncComplete');
-  async._BroadcastStreamController$ = dart.generic(T => {
-    let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
-    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
-    let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
-    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
-    let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
-    class _BroadcastStreamController extends core.Object {
-      new(onListen, onCancel) {
-        this.onListen = onListen;
-        this.onCancel = onCancel;
-        this[_state] = async._BroadcastStreamController._STATE_INITIAL;
-        this[_firstSubscription] = null;
-        this[_lastSubscription] = null;
-        this[_addStreamState] = null;
-        this[_doneFuture] = null;
-      }
-      get onPause() {
-        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
-      }
-      set onPause(onPauseHandler) {
-        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
-      }
-      get onResume() {
-        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
-      }
-      set onResume(onResumeHandler) {
-        dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
-      }
-      get stream() {
-        return new (_BroadcastStreamOfT())(this);
-      }
-      get sink() {
-        return new (_StreamSinkWrapperOfT())(this);
-      }
-      get isClosed() {
-        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_CLOSED) != 0;
-      }
-      get isPaused() {
-        return false;
-      }
-      get hasListener() {
-        return !dart.test(this[_isEmpty]);
-      }
-      get [_hasOneListener]() {
-        dart.assert(!dart.test(this[_isEmpty]));
-        return core.identical(this[_firstSubscription], this[_lastSubscription]);
-      }
-      get [_isFiring]() {
-        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_FIRING) != 0;
-      }
-      get [_isAddingStream]() {
-        return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_ADDSTREAM) != 0;
-      }
-      get [_mayAddEvent]() {
-        return dart.notNull(this[_state]) < async._BroadcastStreamController._STATE_CLOSED;
-      }
-      [_ensureDoneFuture]() {
-        if (this[_doneFuture] != null) return this[_doneFuture];
-        return this[_doneFuture] = new async._Future();
-      }
-      get [_isEmpty]() {
-        return this[_firstSubscription] == null;
-      }
-      [_addListener](subscription) {
-        _BroadcastSubscriptionOfT()._check(subscription);
-        dart.assert(core.identical(subscription[_next$], subscription));
-        subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
-        let oldLast = this[_lastSubscription];
-        this[_lastSubscription] = subscription;
-        subscription[_next$] = null;
-        subscription[_previous$] = oldLast;
-        if (oldLast == null) {
-          this[_firstSubscription] = subscription;
-        } else {
-          oldLast[_next$] = subscription;
-        }
-      }
-      [_removeListener](subscription) {
-        _BroadcastSubscriptionOfT()._check(subscription);
-        dart.assert(core.identical(subscription[_controller$], this));
-        dart.assert(!core.identical(subscription[_next$], subscription));
-        let previous = subscription[_previous$];
-        let next = subscription[_next$];
-        if (previous == null) {
-          this[_firstSubscription] = next;
-        } else {
-          previous[_next$] = next;
-        }
-        if (next == null) {
-          this[_lastSubscription] = previous;
-        } else {
-          next[_previous$] = previous;
-        }
-        subscription[_next$] = subscription[_previous$] = subscription;
-      }
-      [_subscribe](onData, onError, onDone, cancelOnError) {
-        if (dart.test(this.isClosed)) {
-          if (onDone == null) onDone = async._nullDoneHandler;
-          return new (_DoneStreamSubscriptionOfT())(onDone);
-        }
-        let subscription = new (_BroadcastSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
-        this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
-        if (core.identical(this[_firstSubscription], this[_lastSubscription])) {
-          async._runGuarded(this.onListen);
-        }
-        return subscription;
-      }
-      [_recordCancel](sub) {
-        StreamSubscriptionOfT()._check(sub);
-        let subscription = _BroadcastSubscriptionOfT()._check(sub);
-        if (core.identical(subscription[_next$], subscription)) return null;
-        if (dart.test(subscription[_isFiring])) {
-          subscription[_setRemoveAfterFiring]();
-        } else {
-          this[_removeListener](subscription);
-          if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
-            this[_callOnCancel]();
-          }
-        }
-        return null;
-      }
-      [_recordPause](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-      }
-      [_recordResume](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-      }
-      [_addEventError]() {
-        if (dart.test(this.isClosed)) {
-          return new core.StateError("Cannot add new events after calling close");
-        }
-        dart.assert(this[_isAddingStream]);
-        return new core.StateError("Cannot add new events while doing an addStream");
-      }
-      add(data) {
-        T._check(data);
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
-        this[_sendData](data);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        error = async._nonNullError(error);
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
-        let replacement = async.Zone.current.errorCallback(error, stackTrace);
-        if (replacement != null) {
-          error = async._nonNullError(replacement.error);
-          stackTrace = replacement.stackTrace;
-        }
-        this[_sendError](error, stackTrace);
-      }
-      close() {
-        if (dart.test(this.isClosed)) {
-          dart.assert(this[_doneFuture] != null);
-          return this[_doneFuture];
-        }
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
-        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
-        let doneFuture = this[_ensureDoneFuture]();
-        this[_sendDone]();
-        return doneFuture;
-      }
-      get done() {
-        return this[_ensureDoneFuture]();
-      }
-      addStream(stream, opts) {
-        StreamOfT()._check(stream);
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
-        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
-        this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
-        return this[_addStreamState].addStreamFuture;
-      }
-      [_add$](data) {
-        T._check(data);
-        this[_sendData](data);
-      }
-      [_addError](error, stackTrace) {
-        this[_sendError](error, stackTrace);
-      }
-      [_close$]() {
-        dart.assert(this[_isAddingStream]);
-        let addState = this[_addStreamState];
-        this[_addStreamState] = null;
-        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
-        addState.complete();
-      }
-      [_forEachListener](action) {
-        if (dart.test(this[_isFiring])) {
-          dart.throw(new core.StateError("Cannot fire new event. Controller is already firing an event"));
-        }
-        if (dart.test(this[_isEmpty])) return;
-        let id = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
-        this[_state] = (dart.notNull(this[_state]) ^ (async._BroadcastStreamController._STATE_EVENT_ID | async._BroadcastStreamController._STATE_FIRING)) >>> 0;
-        let subscription = this[_firstSubscription];
-        while (subscription != null) {
-          if (dart.test(subscription[_expectsEvent](id))) {
-            subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
-            action(subscription);
-            subscription[_toggleEventId]();
-            let next = subscription[_next$];
-            if (dart.test(subscription[_removeAfterFiring])) {
-              this[_removeListener](subscription);
-            }
-            subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
-            subscription = next;
-          } else {
-            subscription = subscription[_next$];
-          }
-        }
-        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
-        if (dart.test(this[_isEmpty])) {
-          this[_callOnCancel]();
-        }
-      }
-      [_callOnCancel]() {
-        dart.assert(this[_isEmpty]);
-        if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
-          this[_doneFuture][_asyncComplete](null);
-        }
-        async._runGuarded(this.onCancel);
-      }
-    }
-    dart.addTypeTests(_BroadcastStreamController);
-    _BroadcastStreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
-    dart.setSignature(_BroadcastStreamController, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStreamController$(T), [async.ControllerCallback, async.ControllerCancelCallback])}),
-      fields: () => ({
-        onListen: async.ControllerCallback,
-        onCancel: async.ControllerCancelCallback,
-        [_state]: core.int,
-        [_firstSubscription]: _BroadcastSubscriptionOfT(),
-        [_lastSubscription]: _BroadcastSubscriptionOfT(),
-        [_addStreamState]: _AddStreamStateOfT(),
-        [_doneFuture]: async._Future
-      }),
-      getters: () => ({
-        onPause: dart.definiteFunctionType(async.ControllerCallback, []),
-        onResume: dart.definiteFunctionType(async.ControllerCallback, []),
-        stream: dart.definiteFunctionType(async.Stream$(T), []),
-        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
-        isClosed: dart.definiteFunctionType(core.bool, []),
-        isPaused: dart.definiteFunctionType(core.bool, []),
-        hasListener: dart.definiteFunctionType(core.bool, []),
-        [_hasOneListener]: dart.definiteFunctionType(core.bool, []),
-        [_isFiring]: dart.definiteFunctionType(core.bool, []),
-        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
-        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
-        [_isEmpty]: dart.definiteFunctionType(core.bool, []),
-        done: dart.definiteFunctionType(async.Future, [])
-      }),
-      setters: () => ({
-        onPause: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        onResume: dart.definiteFunctionType(dart.void, [VoidTovoid()])
-      }),
-      methods: () => ({
-        [_ensureDoneFuture]: dart.definiteFunctionType(async._Future, []),
-        [_addListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
-        [_removeListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
-        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
-        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
-        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
-        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
-        [_addEventError]: dart.definiteFunctionType(core.Error, []),
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        close: dart.definiteFunctionType(async.Future, []),
-        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
-        [_add$]: dart.definiteFunctionType(dart.void, [T]),
-        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_close$]: dart.definiteFunctionType(dart.void, []),
-        [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
-        [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _STATE_INITIAL: core.int,
-        _STATE_EVENT_ID: core.int,
-        _STATE_FIRING: core.int,
-        _STATE_CLOSED: core.int,
-        _STATE_ADDSTREAM: core.int
-      })
-    });
-    return _BroadcastStreamController;
-  });
-  async._BroadcastStreamController = _BroadcastStreamController();
-  async._BroadcastStreamController._STATE_INITIAL = 0;
-  async._BroadcastStreamController._STATE_EVENT_ID = 1;
-  async._BroadcastStreamController._STATE_FIRING = 2;
-  async._BroadcastStreamController._STATE_CLOSED = 4;
-  async._BroadcastStreamController._STATE_ADDSTREAM = 8;
-  async._SyncBroadcastStreamController$ = dart.generic(T => {
-    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
-    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-    let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
-    class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
-      new(onListen, onCancel) {
-        super.new(onListen, onCancel);
-      }
-      get [_mayAddEvent]() {
-        return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
-      }
-      [_addEventError]() {
-        if (dart.test(this[_isFiring])) {
-          return new core.StateError("Cannot fire new event. Controller is already firing an event");
-        }
-        return super[_addEventError]();
-      }
-      [_sendData](data) {
-        T._check(data);
-        if (dart.test(this[_isEmpty])) return;
-        if (dart.test(this[_hasOneListener])) {
-          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
-          let subscription = this[_firstSubscription];
-          subscription[_add$](data);
-          this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
-          if (dart.test(this[_isEmpty])) {
-            this[_callOnCancel]();
-          }
-          return;
-        }
-        this[_forEachListener](dart.fn(subscription => {
-          subscription[_add$](data);
-        }, _BufferingStreamSubscriptionOfTToNull()));
-      }
-      [_sendError](error, stackTrace) {
-        if (dart.test(this[_isEmpty])) return;
-        this[_forEachListener](dart.fn(subscription => {
-          subscription[_addError](error, stackTrace);
-        }, _BufferingStreamSubscriptionOfTToNull()));
-      }
-      [_sendDone]() {
-        if (!dart.test(this[_isEmpty])) {
-          this[_forEachListener](dart.fn(subscription => {
-            subscription[_close$]();
-          }, _BufferingStreamSubscriptionOfTToNull()));
-        } else {
-          dart.assert(this[_doneFuture] != null);
-          dart.assert(this[_doneFuture][_mayComplete]);
-          this[_doneFuture][_asyncComplete](null);
-        }
-      }
-    }
-    _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
-    dart.setSignature(_SyncBroadcastStreamController, {
-      constructors: () => ({new: dart.definiteFunctionType(async._SyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
-      methods: () => ({
-        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
-        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _SyncBroadcastStreamController;
-  });
-  async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
-  let const$6;
-  async._AsyncBroadcastStreamController$ = dart.generic(T => {
-    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
-    class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
-      new(onListen, onCancel) {
-        super.new(onListen, onCancel);
-      }
-      [_sendData](data) {
-        T._check(data);
-        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
-          subscription[_addPending](new (_DelayedDataOfT())(data));
-        }
-      }
-      [_sendError](error, stackTrace) {
-        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
-          subscription[_addPending](new async._DelayedError(error, stackTrace));
-        }
-      }
-      [_sendDone]() {
-        if (!dart.test(this[_isEmpty])) {
-          for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
-            subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
-          }
-        } else {
-          dart.assert(this[_doneFuture] != null);
-          dart.assert(this[_doneFuture][_mayComplete]);
-          this[_doneFuture][_asyncComplete](null);
-        }
-      }
-    }
-    dart.setSignature(_AsyncBroadcastStreamController, {
-      constructors: () => ({new: dart.definiteFunctionType(async._AsyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
-      methods: () => ({
-        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
-        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _AsyncBroadcastStreamController;
-  });
-  async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
-  const _addPendingEvent = Symbol('_addPendingEvent');
-  let const$7;
-  async._AsBroadcastStreamController$ = dart.generic(T => {
-    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
-    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
-      new(onListen, onCancel) {
-        this[_pending] = null;
-        super.new(onListen, onCancel);
-      }
-      get [_hasPending]() {
-        return this[_pending] != null && !dart.test(this[_pending].isEmpty);
-      }
-      [_addPendingEvent](event) {
-        if (this[_pending] == null) {
-          this[_pending] = new (_StreamImplEventsOfT())();
-        }
-        this[_pending].add(event);
-      }
-      add(data) {
-        T._check(data);
-        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
-          this[_addPendingEvent](new (_DelayedDataOfT())(data));
-          return;
-        }
-        super.add(data);
-        while (dart.test(this[_hasPending])) {
-          this[_pending].handleNext(this);
-        }
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
-          this[_addPendingEvent](new async._DelayedError(error, stackTrace));
-          return;
-        }
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
-        this[_sendError](error, stackTrace);
-        while (dart.test(this[_hasPending])) {
-          this[_pending].handleNext(this);
-        }
-      }
-      close() {
-        if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
-          this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
-          this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
-          return super.done;
-        }
-        let result = super.close();
-        dart.assert(!dart.test(this[_hasPending]));
-        return result;
-      }
-      [_callOnCancel]() {
-        if (dart.test(this[_hasPending])) {
-          this[_pending].clear();
-          this[_pending] = null;
-        }
-        super[_callOnCancel]();
-      }
-    }
-    _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
-    dart.setSignature(_AsBroadcastStreamController, {
-      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
-      fields: () => ({[_pending]: _StreamImplEventsOfT()}),
-      getters: () => ({[_hasPending]: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({[_addPendingEvent]: dart.definiteFunctionType(dart.void, [async._DelayedEvent])})
-    });
-    return _AsBroadcastStreamController;
-  });
-  async._AsBroadcastStreamController = _AsBroadcastStreamController();
-  const _pauseCount = Symbol('_pauseCount');
-  const _resume = Symbol('_resume');
-  async._DoneSubscription$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _DoneSubscription extends core.Object {
-      new() {
-        this[_pauseCount] = 0;
-      }
-      onData(handleData) {}
-      onError(handleError) {}
-      onDone(handleDone) {}
-      pause(resumeSignal) {
-        if (resumeSignal === void 0) resumeSignal = null;
-        if (resumeSignal != null) resumeSignal.then(dart.void)(dart.bind(this, _resume));
-        this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
-      }
-      resume() {
-        this[_resume](null);
-      }
-      [_resume](_) {
-        if (dart.notNull(this[_pauseCount]) > 0) {
-          this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
-        }
-      }
-      cancel() {
-        return new async._Future.immediate(null);
-      }
-      get isPaused() {
-        return dart.notNull(this[_pauseCount]) > 0;
-      }
-      asFuture(E) {
-        return value => {
-          if (value === void 0) value = null;
-          return new (async._Future$(E))();
-        };
-      }
-    }
-    dart.addTypeTests(_DoneSubscription);
-    _DoneSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
-    dart.setSignature(_DoneSubscription, {
-      fields: () => ({[_pauseCount]: core.int}),
-      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
-        onError: dart.definiteFunctionType(dart.void, [core.Function]),
-        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-        resume: dart.definiteFunctionType(dart.void, []),
-        [_resume]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
-      })
-    });
-    return _DoneSubscription;
-  });
-  async._DoneSubscription = _DoneSubscription();
-  async.DeferredLibrary = class DeferredLibrary extends core.Object {
-    new(libraryName, opts) {
-      let uri = opts && 'uri' in opts ? opts.uri : null;
-      this.libraryName = libraryName;
-      this.uri = uri;
-    }
-    load() {
-      dart.throw('DeferredLibrary not supported. ' + 'please use the `import "lib.dart" deferred as lib` syntax.');
-    }
-  };
-  dart.setSignature(async.DeferredLibrary, {
-    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLibrary, [core.String], {uri: core.String})}),
-    fields: () => ({
-      libraryName: core.String,
-      uri: core.String
-    }),
-    methods: () => ({load: dart.definiteFunctionType(async.Future$(core.Null), [])})
-  });
-  const _s = Symbol('_s');
-  async.DeferredLoadException = class DeferredLoadException extends core.Object {
-    new(s) {
-      this[_s] = s;
-    }
-    toString() {
-      return dart.str`DeferredLoadException: '${this[_s]}'`;
-    }
-  };
-  async.DeferredLoadException[dart.implements] = () => [core.Exception];
-  dart.setSignature(async.DeferredLoadException, {
-    constructors: () => ({new: dart.definiteFunctionType(async.DeferredLoadException, [core.String])}),
-    fields: () => ({[_s]: core.String})
-  });
-  async.FutureOr$ = dart.generic(T => {
-    class FutureOr extends core.Object {
-      _() {
-        dart.throw(new core.UnsupportedError("FutureOr can't be instantiated"));
-      }
-    }
-    dart.addTypeTests(FutureOr);
-    dart.defineNamedConstructor(FutureOr, '_');
-    dart.setSignature(FutureOr, {
-      constructors: () => ({_: dart.definiteFunctionType(async.FutureOr$(T), [])})
-    });
-    return FutureOr;
-  });
-  async.FutureOr = FutureOr();
-  const _completeWithValue = Symbol('_completeWithValue');
-  let const$8;
-  async.Future$ = dart.flattenFutures(dart.generic(T => {
-    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
-    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
-    class Future extends core.Object {
-      static new(computation) {
-        let result = new (_FutureOfT())();
-        async.Timer.run(dart.fn(() => {
-          try {
-            result[_complete](computation());
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._completeWithErrorCallback(result, e, s);
-          }
-
-        }, VoidToNull()));
-        return result;
-      }
-      static microtask(computation) {
-        let result = new (_FutureOfT())();
-        async.scheduleMicrotask(dart.fn(() => {
-          try {
-            result[_complete](computation());
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._completeWithErrorCallback(result, e, s);
-          }
-
-        }, VoidToNull()));
-        return result;
-      }
-      static sync(computation) {
-        try {
-          let result = computation();
-          return FutureOfT().value(result);
-        } catch (error) {
-          let stackTrace = dart.stackTrace(error);
-          return FutureOfT().error(error, stackTrace);
-        }
-
-      }
-      static value(value) {
-        if (value === void 0) value = null;
-        return new (_FutureOfT()).immediate(value);
-      }
-      static error(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        error = async._nonNullError(error);
-        if (!core.identical(async.Zone.current, async._ROOT_ZONE)) {
-          let replacement = async.Zone.current.errorCallback(error, stackTrace);
-          if (replacement != null) {
-            error = async._nonNullError(replacement.error);
-            stackTrace = replacement.stackTrace;
-          }
-        }
-        return new (_FutureOfT()).immediateError(error, stackTrace);
-      }
-      static delayed(duration, computation) {
-        if (computation === void 0) computation = null;
-        let result = new (_FutureOfT())();
-        async.Timer.new(duration, dart.fn(() => {
-          try {
-            result[_complete](dart.nullSafe(computation, _ => _()));
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._completeWithErrorCallback(result, e, s);
-          }
-
-        }, VoidToNull()));
-        return result;
-      }
-      static wait(T) {
-        return (futures, opts) => {
-          let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
-          let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
-          let result = new (async._Future$(core.List$(T)))();
-          let values = null;
-          let remaining = 0;
-          let error = null;
-          let stackTrace = null;
-          function handleError(theError, theStackTrace) {
-            remaining--;
-            if (values != null) {
-              if (cleanUp != null) {
-                for (let value of values) {
-                  if (value != null) {
-                    async.Future.sync(dart.fn(() => {
-                      cleanUp(value);
-                    }, VoidToNull()));
-                  }
-                }
-              }
-              values = null;
-              if (remaining == 0 || dart.test(eagerError)) {
-                result[_completeError](theError, core.StackTrace._check(theStackTrace));
-              } else {
-                error = theError;
-                stackTrace = core.StackTrace._check(theStackTrace);
-              }
-            } else if (remaining == 0 && !dart.test(eagerError)) {
-              result[_completeError](error, stackTrace);
-            }
-          }
-          dart.fn(handleError, dynamicAnddynamicTovoid$());
-          try {
-            for (let future of futures) {
-              let pos = remaining;
-              future.then(dart.dynamic)(dart.fn(value => {
-                remaining--;
-                if (values != null) {
-                  values[dartx._set](pos, value);
-                  if (remaining == 0) {
-                    result[_completeWithValue](values);
-                  }
-                } else {
-                  if (cleanUp != null && value != null) {
-                    async.Future.sync(dart.fn(() => {
-                      cleanUp(value);
-                    }, VoidToNull()));
-                  }
-                  if (remaining == 0 && !dart.test(eagerError)) {
-                    result[_completeError](error, stackTrace);
-                  }
-                }
-              }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
-              remaining++;
-            }
-            if (remaining == 0) {
-              return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
-            }
-            values = core.List$(T).new(remaining);
-          } catch (e) {
-            let st = dart.stackTrace(e);
-            if (remaining == 0 || dart.test(eagerError)) {
-              return async.Future$(core.List$(T)).error(e, st);
-            } else {
-              error = e;
-              stackTrace = st;
-            }
-          }
-
-          return result;
-        };
-      }
-      static any(T) {
-        return futures => {
-          let completer = async.Completer$(T).sync();
-          let onValue = dart.fn(value => {
-            if (!dart.test(completer.isCompleted)) completer.complete(value);
-          }, dart.definiteFunctionType(core.Null, [T]));
-          let onError = dart.fn((error, stack) => {
-            if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
-          }, dynamicAnddynamicToNull());
-          for (let future of futures) {
-            future.then(dart.dynamic)(onValue, {onError: onError});
-          }
-          return completer.future;
-        };
-      }
-      static forEach(input, f) {
-        let iterator = input[dartx.iterator];
-        return async.Future.doWhile(dart.fn(() => {
-          if (!dart.test(iterator.moveNext())) return false;
-          return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
-        }, VoidToObject$()));
-      }
-      static doWhile(f) {
-        let doneSignal = new async._Future();
-        let nextIteration = null;
-        nextIteration = async.Zone.current.bindUnaryCallback(dart.dynamic, core.bool)(dart.fn(keepGoing => {
-          if (dart.test(keepGoing)) {
-            async.Future.sync(f).then(dart.dynamic)(dynamicToFutureOr()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
-          } else {
-            doneSignal[_complete](null);
-          }
-        }, boolToNull()), {runGuarded: true});
-        dart.dcall(nextIteration, true);
-        return doneSignal;
-      }
-    }
-    dart.addTypeTests(Future);
-    dart.setSignature(Future, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
-        microtask: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
-        sync: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
-        value: dart.definiteFunctionType(async.Future$(T), [], [dart.dynamic]),
-        error: dart.definiteFunctionType(async.Future$(T), [core.Object], [core.StackTrace]),
-        delayed: dart.definiteFunctionType(async.Future$(T), [core.Duration], [VoidTodynamic()])
-      }),
-      sfields: () => ({_nullFuture: async._Future}),
-      statics: () => ({
-        wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
-        any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
-        forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
-        doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
-      }),
-      names: ['wait', 'any', 'forEach', 'doWhile']
-    });
-    return Future;
-  }));
-  async.Future = Future();
-  dart.defineLazy(async.Future, {
-    get _nullFuture() {
-      return async._Future._check(async.Future.value(null));
-    }
-  });
-  async.TimeoutException = class TimeoutException extends core.Object {
-    new(message, duration) {
-      if (duration === void 0) duration = null;
-      this.message = message;
-      this.duration = duration;
-    }
-    toString() {
-      let result = "TimeoutException";
-      if (this.duration != null) result = dart.str`TimeoutException after ${this.duration}`;
-      if (this.message != null) result = dart.str`${result}: ${this.message}`;
-      return result;
-    }
-  };
-  async.TimeoutException[dart.implements] = () => [core.Exception];
-  dart.setSignature(async.TimeoutException, {
-    constructors: () => ({new: dart.definiteFunctionType(async.TimeoutException, [core.String], [core.Duration])}),
-    fields: () => ({
-      message: core.String,
-      duration: core.Duration
-    })
-  });
-  async.Completer$ = dart.generic(T => {
-    let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
-    let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
-    class Completer extends core.Object {
-      static new() {
-        return new (_AsyncCompleterOfT())();
-      }
-      static sync() {
-        return new (_SyncCompleterOfT())();
-      }
-    }
-    dart.addTypeTests(Completer);
-    dart.setSignature(Completer, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async.Completer$(T), []),
-        sync: dart.definiteFunctionType(async.Completer$(T), [])
-      })
-    });
-    return Completer;
-  });
-  async.Completer = Completer();
-  async._completeWithErrorCallback = function(result, error, stackTrace) {
-    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
-    if (replacement != null) {
-      error = async._nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    result[_completeError](error, core.StackTrace._check(stackTrace));
-  };
-  dart.lazyFn(async._completeWithErrorCallback, () => _FutureAnddynamicAnddynamicTovoid());
-  async._nonNullError = function(error) {
-    return error != null ? error : new core.NullThrownError();
-  };
-  dart.fn(async._nonNullError, ObjectToObject());
-  async._FutureOnValue$ = dart.generic((S, T) => {
-    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
-    return _FutureOnValue;
-  });
-  async._FutureOnValue = _FutureOnValue();
-  async._FutureErrorTest = dart.typedef('_FutureErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
-  async._FutureAction = dart.typedef('_FutureAction', () => dart.functionType(dart.dynamic, []));
-  async._Completer$ = dart.generic(T => {
-    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
-    let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
-    class _Completer extends core.Object {
-      new() {
-        this.future = new (_FutureOfT())();
-      }
-      completeError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        error = async._nonNullError(error);
-        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
-        let replacement = async.Zone.current.errorCallback(error, stackTrace);
-        if (replacement != null) {
-          error = async._nonNullError(replacement.error);
-          stackTrace = replacement.stackTrace;
-        }
-        this[_completeError](error, stackTrace);
-      }
-      get isCompleted() {
-        return !dart.test(this.future[_mayComplete]);
-      }
-    }
-    dart.addTypeTests(_Completer);
-    _Completer[dart.implements] = () => [CompleterOfT()];
-    dart.setSignature(_Completer, {
-      fields: () => ({future: _FutureOfT()}),
-      getters: () => ({isCompleted: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({completeError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
-    });
-    return _Completer;
-  });
-  async._Completer = _Completer();
-  const _asyncCompleteError = Symbol('_asyncCompleteError');
-  async._AsyncCompleter$ = dart.generic(T => {
-    class _AsyncCompleter extends async._Completer$(T) {
-      new() {
-        super.new();
-      }
-      complete(value) {
-        if (value === void 0) value = null;
-        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
-        this.future[_asyncComplete](value);
-      }
-      [_completeError](error, stackTrace) {
-        this.future[_asyncCompleteError](error, stackTrace);
-      }
-    }
-    dart.setSignature(_AsyncCompleter, {
-      methods: () => ({
-        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
-        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
-      })
-    });
-    return _AsyncCompleter;
-  });
-  async._AsyncCompleter = _AsyncCompleter();
-  async._SyncCompleter$ = dart.generic(T => {
-    class _SyncCompleter extends async._Completer$(T) {
-      new() {
-        super.new();
-      }
-      complete(value) {
-        if (value === void 0) value = null;
-        if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
-        this.future[_complete](value);
-      }
-      [_completeError](error, stackTrace) {
-        this.future[_completeError](error, stackTrace);
-      }
-    }
-    dart.setSignature(_SyncCompleter, {
-      methods: () => ({
-        complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
-        [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
-      })
-    });
-    return _SyncCompleter;
-  });
-  async._SyncCompleter = _SyncCompleter();
-  const _nextListener = Symbol('_nextListener');
-  const _onValue = Symbol('_onValue');
-  const _errorTest = Symbol('_errorTest');
-  const _whenCompleteAction = Symbol('_whenCompleteAction');
-  async._FutureListener$ = dart.generic((S, T) => {
-    let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
-    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
-    class _FutureListener extends core.Object {
-      then(result, onValue, errorCallback) {
-        this.result = result;
-        this.callback = onValue;
-        this.errorCallback = errorCallback;
-        this.state = errorCallback == null ? async._FutureListener.STATE_THEN : async._FutureListener.STATE_THEN_ONERROR;
-        this[_nextListener] = null;
-      }
-      catchError(result, errorCallback, test) {
-        this.result = result;
-        this.errorCallback = errorCallback;
-        this.callback = test;
-        this.state = test == null ? async._FutureListener.STATE_CATCHERROR : async._FutureListener.STATE_CATCHERROR_TEST;
-        this[_nextListener] = null;
-      }
-      whenComplete(result, onComplete) {
-        this.result = result;
-        this.callback = onComplete;
-        this.errorCallback = null;
-        this.state = async._FutureListener.STATE_WHENCOMPLETE;
-        this[_nextListener] = null;
-      }
-      get [_zone]() {
-        return this.result[_zone];
-      }
-      get handlesValue() {
-        return (dart.notNull(this.state) & async._FutureListener.MASK_VALUE) != 0;
-      }
-      get handlesError() {
-        return (dart.notNull(this.state) & async._FutureListener.MASK_ERROR) != 0;
-      }
-      get hasErrorTest() {
-        return this.state == async._FutureListener.STATE_CATCHERROR_TEST;
-      }
-      get handlesComplete() {
-        return this.state == async._FutureListener.STATE_WHENCOMPLETE;
-      }
-      get [_onValue]() {
-        dart.assert(this.handlesValue);
-        return _FutureOnValueOfS$T().as(this.callback);
-      }
-      get [_onError]() {
-        return this.errorCallback;
-      }
-      get [_errorTest]() {
-        dart.assert(this.hasErrorTest);
-        return async._FutureErrorTest.as(this.callback);
-      }
-      get [_whenCompleteAction]() {
-        dart.assert(this.handlesComplete);
-        return async._FutureAction.as(this.callback);
-      }
-      get hasErrorCallback() {
-        dart.assert(this.handlesError);
-        return this[_onError] != null;
-      }
-      handleValue(sourceResult) {
-        S._check(sourceResult);
-        return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
-      }
-      matchesErrorTest(asyncError) {
-        if (!dart.test(this.hasErrorTest)) return true;
-        let test = this[_errorTest];
-        return this[_zone].runUnary(core.bool, dart.dynamic)(this[_errorTest], asyncError.error);
-      }
-      handleError(asyncError) {
-        dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
-        if (async.ZoneBinaryCallback.is(this.errorCallback)) {
-          let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
-          return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
-        } else {
-          return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
-        }
-      }
-      handleWhenComplete() {
-        dart.assert(!dart.test(this.handlesError));
-        return this[_zone].run(dart.dynamic)(this[_whenCompleteAction]);
-      }
-    }
-    dart.addTypeTests(_FutureListener);
-    dart.defineNamedConstructor(_FutureListener, 'then');
-    dart.defineNamedConstructor(_FutureListener, 'catchError');
-    dart.defineNamedConstructor(_FutureListener, 'whenComplete');
-    dart.setSignature(_FutureListener, {
-      constructors: () => ({
-        then: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), _FutureOnValueOfS$T(), core.Function]),
-        catchError: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), core.Function, async._FutureErrorTest]),
-        whenComplete: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), async._FutureAction])
-      }),
-      fields: () => ({
-        [_nextListener]: async._FutureListener,
-        result: _FutureOfT(),
-        state: core.int,
-        callback: core.Function,
-        errorCallback: core.Function
-      }),
-      getters: () => ({
-        [_zone]: dart.definiteFunctionType(async.Zone, []),
-        handlesValue: dart.definiteFunctionType(core.bool, []),
-        handlesError: dart.definiteFunctionType(core.bool, []),
-        hasErrorTest: dart.definiteFunctionType(core.bool, []),
-        handlesComplete: dart.definiteFunctionType(core.bool, []),
-        [_onValue]: dart.definiteFunctionType(async._FutureOnValue$(S, T), []),
-        [_onError]: dart.definiteFunctionType(core.Function, []),
-        [_errorTest]: dart.definiteFunctionType(async._FutureErrorTest, []),
-        [_whenCompleteAction]: dart.definiteFunctionType(async._FutureAction, []),
-        hasErrorCallback: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
-        matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
-        handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
-        handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
-      }),
-      sfields: () => ({
-        MASK_VALUE: core.int,
-        MASK_ERROR: core.int,
-        MASK_TEST_ERROR: core.int,
-        MASK_WHENCOMPLETE: core.int,
-        STATE_CHAIN: core.int,
-        STATE_THEN: core.int,
-        STATE_THEN_ONERROR: core.int,
-        STATE_CATCHERROR: core.int,
-        STATE_CATCHERROR_TEST: core.int,
-        STATE_WHENCOMPLETE: core.int
-      })
-    });
-    return _FutureListener;
-  });
-  async._FutureListener = _FutureListener();
-  async._FutureListener.MASK_VALUE = 1;
-  async._FutureListener.MASK_ERROR = 2;
-  async._FutureListener.MASK_TEST_ERROR = 4;
-  async._FutureListener.MASK_WHENCOMPLETE = 8;
-  async._FutureListener.STATE_CHAIN = 0;
-  async._FutureListener.STATE_THEN_ONERROR = 3;
-  async._FutureListener.STATE_CATCHERROR_TEST = 6;
-  dart.defineLazy(async._FutureListener, {
-    get STATE_THEN() {
-      return async._FutureListener.MASK_VALUE;
-    },
-    get STATE_CATCHERROR() {
-      return async._FutureListener.MASK_ERROR;
-    },
-    get STATE_WHENCOMPLETE() {
-      return async._FutureListener.MASK_WHENCOMPLETE;
-    }
-  });
-  const _resultOrListeners = Symbol('_resultOrListeners');
-  const _isPendingComplete = Symbol('_isPendingComplete');
-  const _mayAddListener = Symbol('_mayAddListener');
-  const _isChained = Symbol('_isChained');
-  const _isComplete = Symbol('_isComplete');
-  const _hasError = Symbol('_hasError');
-  const _setChained = Symbol('_setChained');
-  const _thenNoZoneRegistration = Symbol('_thenNoZoneRegistration');
-  const _setPendingComplete = Symbol('_setPendingComplete');
-  const _clearPendingComplete = Symbol('_clearPendingComplete');
-  const _error = Symbol('_error');
-  const _chainSource = Symbol('_chainSource');
-  const _setValue = Symbol('_setValue');
-  const _setErrorObject = Symbol('_setErrorObject');
-  const _setError = Symbol('_setError');
-  const _cloneResult = Symbol('_cloneResult');
-  const _prependListeners = Symbol('_prependListeners');
-  const _reverseListeners = Symbol('_reverseListeners');
-  const _removeListeners = Symbol('_removeListeners');
-  async._Future$ = dart.flattenFutures(dart.generic(T => {
-    let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
-    let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
-    let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
-    let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
-    class _Future extends core.Object {
-      new() {
-        this[_zone] = async.Zone.current;
-        this[_state] = async._Future._INCOMPLETE;
-        this[_resultOrListeners] = null;
-      }
-      immediate(value) {
-        this[_zone] = async.Zone.current;
-        this[_state] = async._Future._INCOMPLETE;
-        this[_resultOrListeners] = null;
-        this[_asyncComplete](value);
-      }
-      immediateError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_zone] = async.Zone.current;
-        this[_state] = async._Future._INCOMPLETE;
-        this[_resultOrListeners] = null;
-        this[_asyncCompleteError](error, stackTrace);
-      }
-      get [_mayComplete]() {
-        return this[_state] == async._Future._INCOMPLETE;
-      }
-      get [_isPendingComplete]() {
-        return this[_state] == async._Future._PENDING_COMPLETE;
-      }
-      get [_mayAddListener]() {
-        return dart.notNull(this[_state]) <= async._Future._PENDING_COMPLETE;
-      }
-      get [_isChained]() {
-        return this[_state] == async._Future._CHAINED;
-      }
-      get [_isComplete]() {
-        return dart.notNull(this[_state]) >= async._Future._VALUE;
-      }
-      get [_hasError]() {
-        return this[_state] == async._Future._ERROR;
-      }
-      [_setChained](source) {
-        dart.assert(this[_mayAddListener]);
-        this[_state] = async._Future._CHAINED;
-        this[_resultOrListeners] = source;
-      }
-      then(E) {
-        return (f, opts) => {
-          let onError = opts && 'onError' in opts ? opts.onError : null;
-          let currentZone = async.Zone.current;
-          let registered = null;
-          if (!core.identical(currentZone, async._ROOT_ZONE)) {
-            f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
-            if (onError != null) {
-              onError = async._registerErrorHandler(T)(onError, currentZone);
-            }
-          }
-          return this[_thenNoZoneRegistration](E)(f, onError);
-        };
-      }
-      [_thenNoZoneRegistration](E) {
-        return (f, onError) => {
-          let result = new (async._Future$(E))();
-          this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
-          return result;
-        };
-      }
-      catchError(onError, opts) {
-        let test = opts && 'test' in opts ? opts.test : null;
-        let result = new (_FutureOfT())();
-        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
-          onError = async._registerErrorHandler(T)(onError, result[_zone]);
-          if (test != null) test = result[_zone].registerUnaryCallback(core.bool, dart.dynamic)(test);
-        }
-        this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
-        return result;
-      }
-      whenComplete(action) {
-        let result = new (_FutureOfT())();
-        if (!core.identical(result[_zone], async._ROOT_ZONE)) {
-          action = result[_zone].registerCallback(dart.dynamic)(action);
-        }
-        this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
-        return result;
-      }
-      asStream() {
-        return StreamOfT().fromFuture(this);
-      }
-      [_setPendingComplete]() {
-        dart.assert(this[_mayComplete]);
-        this[_state] = async._Future._PENDING_COMPLETE;
-      }
-      [_clearPendingComplete]() {
-        dart.assert(this[_isPendingComplete]);
-        this[_state] = async._Future._INCOMPLETE;
-      }
-      get [_error]() {
-        dart.assert(this[_hasError]);
-        return async.AsyncError._check(this[_resultOrListeners]);
-      }
-      get [_chainSource]() {
-        dart.assert(this[_isChained]);
-        return async._Future._check(this[_resultOrListeners]);
-      }
-      [_setValue](value) {
-        T._check(value);
-        dart.assert(!dart.test(this[_isComplete]));
-        this[_state] = async._Future._VALUE;
-        this[_resultOrListeners] = value;
-      }
-      [_setErrorObject](error) {
-        dart.assert(!dart.test(this[_isComplete]));
-        this[_state] = async._Future._ERROR;
-        this[_resultOrListeners] = error;
-      }
-      [_setError](error, stackTrace) {
-        this[_setErrorObject](new async.AsyncError(error, stackTrace));
-      }
-      [_cloneResult](source) {
-        dart.assert(!dart.test(this[_isComplete]));
-        dart.assert(source[_isComplete]);
-        this[_state] = source[_state];
-        this[_resultOrListeners] = source[_resultOrListeners];
-      }
-      [_addListener](listener) {
-        dart.assert(listener[_nextListener] == null);
-        if (dart.test(this[_mayAddListener])) {
-          listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
-          this[_resultOrListeners] = listener;
-        } else {
-          if (dart.test(this[_isChained])) {
-            let source = this[_chainSource];
-            if (!dart.test(source[_isComplete])) {
-              source[_addListener](listener);
-              return;
-            }
-            this[_cloneResult](source);
-          }
-          dart.assert(this[_isComplete]);
-          this[_zone].scheduleMicrotask(dart.fn(() => {
-            async._Future._propagateToListeners(this, listener);
-          }, VoidToNull()));
-        }
-      }
-      [_prependListeners](listeners) {
-        if (listeners == null) return;
-        if (dart.test(this[_mayAddListener])) {
-          let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
-          this[_resultOrListeners] = listeners;
-          if (existingListeners != null) {
-            let cursor = listeners;
-            while (cursor[_nextListener] != null) {
-              cursor = cursor[_nextListener];
-            }
-            cursor[_nextListener] = existingListeners;
-          }
-        } else {
-          if (dart.test(this[_isChained])) {
-            let source = this[_chainSource];
-            if (!dart.test(source[_isComplete])) {
-              source[_prependListeners](listeners);
-              return;
-            }
-            this[_cloneResult](source);
-          }
-          dart.assert(this[_isComplete]);
-          listeners = this[_reverseListeners](listeners);
-          this[_zone].scheduleMicrotask(dart.fn(() => {
-            async._Future._propagateToListeners(this, listeners);
-          }, VoidToNull()));
-        }
-      }
-      [_removeListeners]() {
-        dart.assert(!dart.test(this[_isComplete]));
-        let current = async._FutureListener._check(this[_resultOrListeners]);
-        this[_resultOrListeners] = null;
-        return this[_reverseListeners](current);
-      }
-      [_reverseListeners](listeners) {
-        let prev = null;
-        let current = listeners;
-        while (current != null) {
-          let next = current[_nextListener];
-          current[_nextListener] = prev;
-          prev = current;
-          current = next;
-        }
-        return prev;
-      }
-      static _chainForeignFuture(source, target) {
-        dart.assert(!dart.test(target[_isComplete]));
-        dart.assert(!async._Future.is(source));
-        target[_setPendingComplete]();
-        try {
-          source.then(dart.dynamic)(dart.fn(value => {
-            dart.assert(target[_isPendingComplete]);
-            target[_clearPendingComplete]();
-            target[_complete](value);
-          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
-              if (stackTrace === void 0) stackTrace = null;
-              dart.assert(target[_isPendingComplete]);
-              target[_completeError](error, core.StackTrace._check(stackTrace));
-            }, dynamic__ToNull())});
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async.scheduleMicrotask(dart.fn(() => {
-            target[_completeError](e, s);
-          }, VoidToNull()));
-        }
-
-      }
-      static _chainCoreFuture(source, target) {
-        dart.assert(target[_mayAddListener]);
-        while (dart.test(source[_isChained])) {
-          source = source[_chainSource];
-        }
-        if (dart.test(source[_isComplete])) {
-          let listeners = target[_removeListeners]();
-          target[_cloneResult](source);
-          async._Future._propagateToListeners(target, listeners);
-        } else {
-          let listeners = async._FutureListener._check(target[_resultOrListeners]);
-          target[_setChained](source);
-          source[_prependListeners](listeners);
-        }
-      }
-      [_complete](value) {
-        dart.assert(!dart.test(this[_isComplete]));
-        if (async.Future.is(value)) {
-          if (async._Future.is(value)) {
-            async._Future._chainCoreFuture(value, this);
-          } else {
-            async._Future._chainForeignFuture(value, this);
-          }
-        } else {
-          let listeners = this[_removeListeners]();
-          this[_setValue](T.as(value));
-          async._Future._propagateToListeners(this, listeners);
-        }
-      }
-      [_completeWithValue](value) {
-        T._check(value);
-        dart.assert(!dart.test(this[_isComplete]));
-        dart.assert(!async.Future.is(value));
-        let listeners = this[_removeListeners]();
-        this[_setValue](value);
-        async._Future._propagateToListeners(this, listeners);
-      }
-      [_completeError](error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        dart.assert(!dart.test(this[_isComplete]));
-        let listeners = this[_removeListeners]();
-        this[_setError](error, stackTrace);
-        async._Future._propagateToListeners(this, listeners);
-      }
-      [_asyncComplete](value) {
-        dart.assert(!dart.test(this[_isComplete]));
-        if (async.Future.is(value)) {
-          let typedFuture = FutureOfT().as(value);
-          if (async._Future.is(typedFuture)) {
-            let coreFuture = _FutureOfT()._check(typedFuture);
-            if (dart.test(coreFuture[_hasError])) {
-              this[_setPendingComplete]();
-              this[_zone].scheduleMicrotask(dart.fn(() => {
-                async._Future._chainCoreFuture(coreFuture, this);
-              }, VoidToNull()));
-            } else {
-              async._Future._chainCoreFuture(coreFuture, this);
-            }
-          } else {
-            async._Future._chainForeignFuture(typedFuture, this);
-          }
-          return;
-        }
-        let typedValue = T.as(value);
-        this[_setPendingComplete]();
-        this[_zone].scheduleMicrotask(dart.fn(() => {
-          this[_completeWithValue](typedValue);
-        }, VoidToNull()));
-      }
-      [_asyncCompleteError](error, stackTrace) {
-        dart.assert(!dart.test(this[_isComplete]));
-        this[_setPendingComplete]();
-        this[_zone].scheduleMicrotask(dart.fn(() => {
-          this[_completeError](error, stackTrace);
-        }, VoidToNull()));
-      }
-      static _propagateToListeners(source, listeners) {
-        while (true) {
-          dart.assert(source[_isComplete]);
-          let hasError = source[_hasError];
-          if (listeners == null) {
-            if (dart.test(hasError)) {
-              let asyncError = source[_error];
-              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
-            }
-            return;
-          }
-          while (listeners[_nextListener] != null) {
-            let listener = listeners;
-            listeners = listener[_nextListener];
-            listener[_nextListener] = null;
-            async._Future._propagateToListeners(source, listener);
-          }
-          let listener = listeners;
-          let sourceResult = source[_resultOrListeners];
-          let listenerHasError = hasError;
-          let listenerValueOrError = sourceResult;
-          if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
-            let zone = listener[_zone];
-            if (dart.test(hasError) && !dart.test(source[_zone].inSameErrorZone(zone))) {
-              let asyncError = source[_error];
-              source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
-              return;
-            }
-            let oldZone = null;
-            if (!core.identical(async.Zone.current, zone)) {
-              oldZone = async.Zone._enter(zone);
-            }
-            function handleWhenCompleteCallback() {
-              dart.assert(!dart.test(listener.handlesValue));
-              dart.assert(!dart.test(listener.handlesError));
-              let completeResult = null;
-              try {
-                completeResult = listener.handleWhenComplete();
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                if (dart.test(hasError) && core.identical(source[_error].error, e)) {
-                  listenerValueOrError = source[_error];
-                } else {
-                  listenerValueOrError = new async.AsyncError(e, s);
-                }
-                listenerHasError = true;
-                return;
-              }
-
-              if (async.Future.is(completeResult)) {
-                if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
-                  if (dart.test(completeResult[_hasError])) {
-                    listenerValueOrError = completeResult[_error];
-                    listenerHasError = true;
-                  }
-                  return;
-                }
-                let originalSource = source;
-                listenerValueOrError = completeResult.then(dart.dynamic)(dart.fn(_ => originalSource, dynamicTo_Future()));
-                listenerHasError = false;
-              }
-            }
-            dart.fn(handleWhenCompleteCallback, VoidTovoid$());
-            function handleValueCallback() {
-              try {
-                listenerValueOrError = listener.handleValue(sourceResult);
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                listenerValueOrError = new async.AsyncError(e, s);
-                listenerHasError = true;
-              }
-
-            }
-            dart.fn(handleValueCallback, VoidTovoid$());
-            function handleError() {
-              try {
-                let asyncError = source[_error];
-                if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
-                  listenerValueOrError = listener.handleError(asyncError);
-                  listenerHasError = false;
-                }
-              } catch (e) {
-                let s = dart.stackTrace(e);
-                if (core.identical(source[_error].error, e)) {
-                  listenerValueOrError = source[_error];
-                } else {
-                  listenerValueOrError = new async.AsyncError(e, s);
-                }
-                listenerHasError = true;
-              }
-
-            }
-            dart.fn(handleError, VoidTovoid$());
-            if (dart.test(listener.handlesComplete)) {
-              handleWhenCompleteCallback();
-            } else if (!dart.test(hasError)) {
-              if (dart.test(listener.handlesValue)) {
-                handleValueCallback();
-              }
-            } else {
-              if (dart.test(listener.handlesError)) {
-                handleError();
-              }
-            }
-            if (oldZone != null) async.Zone._leave(oldZone);
-            if (async.Future.is(listenerValueOrError)) {
-              let chainSource = async.Future._check(listenerValueOrError);
-              let result = listener.result;
-              if (async._Future.is(chainSource)) {
-                if (dart.test(chainSource[_isComplete])) {
-                  listeners = result[_removeListeners]();
-                  result[_cloneResult](chainSource);
-                  source = chainSource;
-                  continue;
-                } else {
-                  async._Future._chainCoreFuture(chainSource, result);
-                }
-              } else {
-                async._Future._chainForeignFuture(chainSource, result);
-              }
-              return;
-            }
-          }
-          let result = listener.result;
-          listeners = result[_removeListeners]();
-          if (!dart.test(listenerHasError)) {
-            result[_setValue](listenerValueOrError);
-          } else {
-            let asyncError = async.AsyncError._check(listenerValueOrError);
-            result[_setErrorObject](asyncError);
-          }
-          source = result;
-        }
-      }
-      timeout(timeLimit, opts) {
-        let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
-        if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
-        let result = new (_FutureOfT())();
-        let timer = null;
-        if (onTimeout == null) {
-          timer = async.Timer.new(timeLimit, dart.fn(() => {
-            result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
-          }, VoidToNull()));
-        } else {
-          let zone = async.Zone.current;
-          onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
-          timer = async.Timer.new(timeLimit, dart.fn(() => {
+      }, TToNull()), {onError: dart.bind(result, _completeError), onDone: dart.fn(() => {
+          if (!seenFirst) {
             try {
-              result[_complete](zone.run(dart.dynamic)(onTimeout));
+              dart.throw(_internal.IterableElementError.noElement());
             } catch (e) {
               let s = dart.stackTrace(e);
-              result[_completeError](e, s);
-            }
-
-          }, VoidToNull()));
-        }
-        this.then(dart.dynamic)(dart.fn(v => {
-          if (dart.test(timer.isActive)) {
-            timer.cancel();
-            result[_completeWithValue](v);
-          }
-        }, TToNull()), {onError: dart.fn((e, s) => {
-            if (dart.test(timer.isActive)) {
-              timer.cancel();
-              result[_completeError](e, core.StackTrace._check(s));
-            }
-          }, dynamicAnddynamicToNull())});
-        return result;
-      }
-    }
-    dart.addTypeTests(_Future);
-    dart.defineNamedConstructor(_Future, 'immediate');
-    dart.defineNamedConstructor(_Future, 'immediateError');
-    _Future[dart.implements] = () => [FutureOfT()];
-    dart.setSignature(_Future, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async._Future$(T), []),
-        immediate: dart.definiteFunctionType(async._Future$(T), [dart.dynamic]),
-        immediateError: dart.definiteFunctionType(async._Future$(T), [dart.dynamic], [core.StackTrace])
-      }),
-      fields: () => ({
-        [_state]: core.int,
-        [_zone]: async.Zone,
-        [_resultOrListeners]: dart.dynamic
-      }),
-      getters: () => ({
-        [_mayComplete]: dart.definiteFunctionType(core.bool, []),
-        [_isPendingComplete]: dart.definiteFunctionType(core.bool, []),
-        [_mayAddListener]: dart.definiteFunctionType(core.bool, []),
-        [_isChained]: dart.definiteFunctionType(core.bool, []),
-        [_isComplete]: dart.definiteFunctionType(core.bool, []),
-        [_hasError]: dart.definiteFunctionType(core.bool, []),
-        [_error]: dart.definiteFunctionType(async.AsyncError, []),
-        [_chainSource]: dart.definiteFunctionType(async._Future, [])
-      }),
-      methods: () => ({
-        [_setChained]: dart.definiteFunctionType(dart.void, [async._Future]),
-        then: dart.definiteFunctionType(E => [async.Future$(E), [dart.functionType(async.FutureOr$(E), [T])], {onError: core.Function}]),
-        [_thenNoZoneRegistration]: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic(), core.Function]]),
-        catchError: dart.definiteFunctionType(async.Future$(T), [core.Function], {test: dynamicTobool()}),
-        whenComplete: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
-        asStream: dart.definiteFunctionType(async.Stream$(T), []),
-        [_setPendingComplete]: dart.definiteFunctionType(dart.void, []),
-        [_clearPendingComplete]: dart.definiteFunctionType(dart.void, []),
-        [_setValue]: dart.definiteFunctionType(dart.void, [T]),
-        [_setErrorObject]: dart.definiteFunctionType(dart.void, [async.AsyncError]),
-        [_setError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_cloneResult]: dart.definiteFunctionType(dart.void, [async._Future]),
-        [_addListener]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
-        [_prependListeners]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
-        [_removeListeners]: dart.definiteFunctionType(async._FutureListener, []),
-        [_reverseListeners]: dart.definiteFunctionType(async._FutureListener, [async._FutureListener]),
-        [_complete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-        [_completeWithValue]: dart.definiteFunctionType(dart.void, [T]),
-        [_completeError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-        [_asyncComplete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-        [_asyncCompleteError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
-        timeout: dart.definiteFunctionType(async.Future$(T), [core.Duration], {onTimeout: VoidTodynamic()})
-      }),
-      sfields: () => ({
-        _INCOMPLETE: core.int,
-        _PENDING_COMPLETE: core.int,
-        _CHAINED: core.int,
-        _VALUE: core.int,
-        _ERROR: core.int
-      }),
-      statics: () => ({
-        _chainForeignFuture: dart.definiteFunctionType(dart.void, [async.Future, async._Future]),
-        _chainCoreFuture: dart.definiteFunctionType(dart.void, [async._Future, async._Future]),
-        _propagateToListeners: dart.definiteFunctionType(dart.void, [async._Future, async._FutureListener])
-      }),
-      names: ['_chainForeignFuture', '_chainCoreFuture', '_propagateToListeners']
-    });
-    return _Future;
-  }));
-  async._Future = _Future();
-  async._Future._INCOMPLETE = 0;
-  async._Future._PENDING_COMPLETE = 1;
-  async._Future._CHAINED = 2;
-  async._Future._VALUE = 4;
-  async._Future._ERROR = 8;
-  async._AsyncCallback = dart.typedef('_AsyncCallback', () => dart.functionType(dart.void, []));
-  async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {
-    new(callback) {
-      this.callback = callback;
-      this.next = null;
-    }
-  };
-  dart.setSignature(async._AsyncCallbackEntry, {
-    constructors: () => ({new: dart.definiteFunctionType(async._AsyncCallbackEntry, [async._AsyncCallback])}),
-    fields: () => ({
-      callback: async._AsyncCallback,
-      next: async._AsyncCallbackEntry
-    })
-  });
-  async._nextCallback = null;
-  async._lastCallback = null;
-  async._lastPriorityCallback = null;
-  async._isInCallbackLoop = false;
-  async._microtaskLoop = function() {
-    while (async._nextCallback != null) {
-      async._lastPriorityCallback = null;
-      let entry = async._nextCallback;
-      async._nextCallback = entry.next;
-      if (async._nextCallback == null) async._lastCallback = null;
-      entry.callback();
-    }
-  };
-  dart.fn(async._microtaskLoop, VoidTovoid$());
-  async._startMicrotaskLoop = function() {
-    async._isInCallbackLoop = true;
-    try {
-      async._microtaskLoop();
-    } finally {
-      async._lastPriorityCallback = null;
-      async._isInCallbackLoop = false;
-      if (async._nextCallback != null) {
-        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
-      }
-    }
-  };
-  dart.fn(async._startMicrotaskLoop, VoidTovoid$());
-  async._scheduleAsyncCallback = function(callback) {
-    let newEntry = new async._AsyncCallbackEntry(callback);
-    if (async._nextCallback == null) {
-      async._nextCallback = async._lastCallback = newEntry;
-      if (!dart.test(async._isInCallbackLoop)) {
-        async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
-      }
-    } else {
-      async._lastCallback.next = newEntry;
-      async._lastCallback = newEntry;
-    }
-  };
-  dart.fn(async._scheduleAsyncCallback, _AsyncCallbackTovoid());
-  async._schedulePriorityAsyncCallback = function(callback) {
-    if (async._nextCallback == null) {
-      async._scheduleAsyncCallback(callback);
-      async._lastPriorityCallback = async._lastCallback;
-      return;
-    }
-    let entry = new async._AsyncCallbackEntry(callback);
-    if (async._lastPriorityCallback == null) {
-      entry.next = async._nextCallback;
-      async._nextCallback = async._lastPriorityCallback = entry;
-    } else {
-      entry.next = async._lastPriorityCallback.next;
-      async._lastPriorityCallback.next = entry;
-      async._lastPriorityCallback = entry;
-      if (entry.next == null) {
-        async._lastCallback = entry;
-      }
-    }
-  };
-  dart.fn(async._schedulePriorityAsyncCallback, _AsyncCallbackTovoid());
-  const _scheduleMicrotask = Symbol('_scheduleMicrotask');
-  async.scheduleMicrotask = function(callback) {
-    let currentZone = async._Zone._check(async.Zone.current);
-    if (core.identical(async._ROOT_ZONE, currentZone)) {
-      async._rootScheduleMicrotask(null, null, async._ROOT_ZONE, callback);
-      return;
-    }
-    let implementation = currentZone[_scheduleMicrotask];
-    if (core.identical(async._ROOT_ZONE, implementation.zone) && dart.test(async._ROOT_ZONE.inSameErrorZone(currentZone))) {
-      async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.void)(callback));
-      return;
-    }
-    async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
-  };
-  dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
-  async._AsyncRun = class _AsyncRun extends core.Object {
-    static _scheduleImmediate(callback) {
-      async._AsyncRun._scheduleImmediateClosure(callback);
-    }
-    static _initializeScheduleImmediate() {
-      if (_isolate_helper.global.scheduleImmediate != null) {
-        return async._AsyncRun._scheduleImmediateJsOverride;
-      }
-      if (_isolate_helper.global.MutationObserver != null && _isolate_helper.global.document != null) {
-        let div = _isolate_helper.global.document.createElement("div");
-        let span = _isolate_helper.global.document.createElement("span");
-        let storedCallback = null;
-        function internalCallback(_) {
-          _isolate_helper.leaveJsAsync();
-          let f = storedCallback;
-          storedCallback = null;
-          f();
-        }
-        dart.fn(internalCallback, dynamicToNull$());
-        ;
-        let observer = new _isolate_helper.global.MutationObserver(internalCallback);
-        observer.observe(div, {childList: true});
-        return dart.fn(callback => {
-          dart.assert(storedCallback == null);
-          _isolate_helper.enterJsAsync();
-          storedCallback = callback;
-          div.firstChild ? div.removeChild(span) : div.appendChild(span);
-        }, FnToNull());
-      } else if (_isolate_helper.global.setImmediate != null) {
-        return async._AsyncRun._scheduleImmediateWithSetImmediate;
-      }
-      return async._AsyncRun._scheduleImmediateWithTimer;
-    }
-    static _scheduleImmediateJsOverride(callback) {
-      function internalCallback() {
-        _isolate_helper.leaveJsAsync();
-        callback();
-      }
-      dart.fn(internalCallback, VoidToNull());
-      ;
-      _isolate_helper.enterJsAsync();
-      _isolate_helper.global.scheduleImmediate(internalCallback);
-    }
-    static _scheduleImmediateWithSetImmediate(callback) {
-      function internalCallback() {
-        _isolate_helper.leaveJsAsync();
-        callback();
-      }
-      dart.fn(internalCallback, VoidToNull());
-      ;
-      _isolate_helper.enterJsAsync();
-      _isolate_helper.global.setImmediate(internalCallback);
-    }
-    static _scheduleImmediateWithTimer(callback) {
-      async.Timer._createTimer(core.Duration.ZERO, callback);
-    }
-  };
-  dart.setSignature(async._AsyncRun, {
-    sfields: () => ({_scheduleImmediateClosure: async._TakeCallback}),
-    statics: () => ({
-      _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      _initializeScheduleImmediate: dart.definiteFunctionType(async._TakeCallback, []),
-      _scheduleImmediateJsOverride: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      _scheduleImmediateWithSetImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      _scheduleImmediateWithTimer: dart.definiteFunctionType(dart.void, [VoidTovoid()])
-    }),
-    names: ['_scheduleImmediate', '_initializeScheduleImmediate', '_scheduleImmediateJsOverride', '_scheduleImmediateWithSetImmediate', '_scheduleImmediateWithTimer']
-  });
-  dart.defineLazy(async._AsyncRun, {
-    get _scheduleImmediateClosure() {
-      return async._AsyncRun._initializeScheduleImmediate();
-    }
-  });
-  async._TimerCallback = dart.typedef('_TimerCallback', () => dart.functionType(dart.void, []));
-  async.StreamSubscription$ = dart.generic(T => {
-    class StreamSubscription extends core.Object {}
-    dart.addTypeTests(StreamSubscription);
-    return StreamSubscription;
-  });
-  async.StreamSubscription = StreamSubscription();
-  async.EventSink$ = dart.generic(T => {
-    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
-    class EventSink extends core.Object {}
-    dart.addTypeTests(EventSink);
-    EventSink[dart.implements] = () => [SinkOfT()];
-    return EventSink;
-  });
-  async.EventSink = EventSink();
-  const _stream = Symbol('_stream');
-  async.StreamView$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class StreamView extends async.Stream$(T) {
-      new(stream) {
-        this[_stream] = stream;
-        super._internal();
-      }
-      get isBroadcast() {
-        return this[_stream].isBroadcast;
-      }
-      asBroadcastStream(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-      }
-    }
-    dart.setSignature(StreamView, {
-      constructors: () => ({new: dart.definiteFunctionType(async.StreamView$(T), [StreamOfT()])}),
-      fields: () => ({[_stream]: StreamOfT()}),
-      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-    });
-    return StreamView;
-  });
-  async.StreamView = StreamView();
-  async.StreamConsumer$ = dart.generic(S => {
-    class StreamConsumer extends core.Object {}
-    dart.addTypeTests(StreamConsumer);
-    return StreamConsumer;
-  });
-  async.StreamConsumer = StreamConsumer();
-  async.StreamSink$ = dart.generic(S => {
-    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
-    let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
-    class StreamSink extends core.Object {}
-    dart.addTypeTests(StreamSink);
-    StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
-    return StreamSink;
-  });
-  async.StreamSink = StreamSink();
-  async.StreamTransformer$ = dart.generic((S, T) => {
-    let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
-    let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.functionType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
-    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
-    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
-    class StreamTransformer extends core.Object {
-      static new(transformer) {
-        return new (_StreamSubscriptionTransformerOfS$T())(transformer);
-      }
-      static fromHandlers(opts) {
-        return new (_StreamHandlerTransformerOfS$T())(opts);
-      }
-    }
-    dart.addTypeTests(StreamTransformer);
-    dart.setSignature(StreamTransformer, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async.StreamTransformer$(S, T), [StreamOfSAndboolToStreamSubscriptionOfT()]),
-        fromHandlers: dart.definiteFunctionType(async.StreamTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})
-      })
-    });
-    return StreamTransformer;
-  });
-  async.StreamTransformer = StreamTransformer();
-  async.StreamIterator$ = dart.generic(T => {
-    let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class StreamIterator extends core.Object {
-      static new(stream) {
-        return new (_StreamIteratorImplOfT())(stream);
-      }
-    }
-    dart.addTypeTests(StreamIterator);
-    dart.setSignature(StreamIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(async.StreamIterator$(T), [StreamOfT()])})
-    });
-    return StreamIterator;
-  });
-  async.StreamIterator = StreamIterator();
-  async._ControllerEventSinkWrapper$ = dart.generic(T => {
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    class _ControllerEventSinkWrapper extends core.Object {
-      new(sink) {
-        this[_sink] = sink;
-      }
-      add(data) {
-        T._check(data);
-        this[_sink].add(data);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_sink].addError(error, stackTrace);
-      }
-      close() {
-        this[_sink].close();
-      }
-    }
-    dart.addTypeTests(_ControllerEventSinkWrapper);
-    _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
-    dart.setSignature(_ControllerEventSinkWrapper, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ControllerEventSinkWrapper$(T), [async.EventSink])}),
-      fields: () => ({[_sink]: async.EventSink}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _ControllerEventSinkWrapper;
-  });
-  async._ControllerEventSinkWrapper = _ControllerEventSinkWrapper();
-  async.ControllerCallback = dart.typedef('ControllerCallback', () => dart.functionType(dart.void, []));
-  async.ControllerCancelCallback = dart.typedef('ControllerCancelCallback', () => dart.functionType(dart.dynamic, []));
-  async.StreamController$ = dart.generic(T => {
-    let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
-    let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
-    let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
-    let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
-    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
-    class StreamController extends core.Object {
-      static new(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onPause = opts && 'onPause' in opts ? opts.onPause : null;
-        let onResume = opts && 'onResume' in opts ? opts.onResume : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        let sync = opts && 'sync' in opts ? opts.sync : false;
-        return dart.test(sync) ? new (_SyncStreamControllerOfT())(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT())(onListen, onPause, onResume, onCancel);
-      }
-      static broadcast(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        let sync = opts && 'sync' in opts ? opts.sync : false;
-        return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT())(onListen, onCancel);
-      }
-    }
-    dart.addTypeTests(StreamController);
-    StreamController[dart.implements] = () => [StreamSinkOfT()];
-    dart.setSignature(StreamController, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onPause: VoidTovoid(), onResume: VoidTovoid(), onCancel: VoidTodynamic(), sync: core.bool}),
-        broadcast: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onCancel: VoidTovoid(), sync: core.bool})
-      })
-    });
-    return StreamController;
-  });
-  async.StreamController = StreamController();
-  async.SynchronousStreamController$ = dart.generic(T => {
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    class SynchronousStreamController extends core.Object {}
-    dart.addTypeTests(SynchronousStreamController);
-    SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
-    return SynchronousStreamController;
-  });
-  async.SynchronousStreamController = SynchronousStreamController();
-  async._StreamControllerLifecycle$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    class _StreamControllerLifecycle extends core.Object {
-      [_recordPause](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-      }
-      [_recordResume](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-      }
-      [_recordCancel](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-        return null;
-      }
-    }
-    dart.addTypeTests(_StreamControllerLifecycle);
-    dart.setSignature(_StreamControllerLifecycle, {
-      methods: () => ({
-        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
-        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
-        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()])
-      })
-    });
-    return _StreamControllerLifecycle;
-  });
-  async._StreamControllerLifecycle = _StreamControllerLifecycle();
-  const _varData = Symbol('_varData');
-  const _isInitialState = Symbol('_isInitialState');
-  const _subscription = Symbol('_subscription');
-  const _pendingEvents = Symbol('_pendingEvents');
-  const _ensurePendingEvents = Symbol('_ensurePendingEvents');
-  const _badEventState = Symbol('_badEventState');
-  let const$9;
-  async._StreamController$ = dart.generic(T => {
-    let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
-    let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
-    let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
-    let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
-    let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
-    let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _StreamController extends core.Object {
-      new(onListen, onPause, onResume, onCancel) {
-        this.onListen = onListen;
-        this.onPause = onPause;
-        this.onResume = onResume;
-        this.onCancel = onCancel;
-        this[_varData] = null;
-        this[_state] = async._StreamController._STATE_INITIAL;
-        this[_doneFuture] = null;
-      }
-      get stream() {
-        return new (_ControllerStreamOfT())(this);
-      }
-      get sink() {
-        return new (_StreamSinkWrapperOfT())(this);
-      }
-      get [_isCanceled]() {
-        return (dart.notNull(this[_state]) & async._StreamController._STATE_CANCELED) != 0;
-      }
-      get hasListener() {
-        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIBED) != 0;
-      }
-      get [_isInitialState]() {
-        return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIPTION_MASK) == async._StreamController._STATE_INITIAL;
-      }
-      get isClosed() {
-        return (dart.notNull(this[_state]) & async._StreamController._STATE_CLOSED) != 0;
-      }
-      get isPaused() {
-        return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
-      }
-      get [_isAddingStream]() {
-        return (dart.notNull(this[_state]) & async._StreamController._STATE_ADDSTREAM) != 0;
-      }
-      get [_mayAddEvent]() {
-        return dart.notNull(this[_state]) < async._StreamController._STATE_CLOSED;
-      }
-      get [_pendingEvents]() {
-        dart.assert(this[_isInitialState]);
-        if (!dart.test(this[_isAddingStream])) {
-          return _PendingEventsOfT().as(this[_varData]);
-        }
-        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-        return _PendingEventsOfT().as(state.varData);
-      }
-      [_ensurePendingEvents]() {
-        dart.assert(this[_isInitialState]);
-        if (!dart.test(this[_isAddingStream])) {
-          if (this[_varData] == null) this[_varData] = new (_StreamImplEventsOfT())();
-          return _StreamImplEventsOfT().as(this[_varData]);
-        }
-        let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-        if (state.varData == null) state.varData = new (_StreamImplEventsOfT())();
-        return _StreamImplEventsOfT().as(state.varData);
-      }
-      get [_subscription]() {
-        dart.assert(this.hasListener);
-        if (dart.test(this[_isAddingStream])) {
-          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-          return _ControllerSubscriptionOfT().as(addState.varData);
-        }
-        return _ControllerSubscriptionOfT().as(this[_varData]);
-      }
-      [_badEventState]() {
-        if (dart.test(this.isClosed)) {
-          return new core.StateError("Cannot add event after closing");
-        }
-        dart.assert(this[_isAddingStream]);
-        return new core.StateError("Cannot add event while adding a stream");
-      }
-      addStream(source, opts) {
-        StreamOfT()._check(source);
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
-        if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
-        let addState = new (_StreamControllerAddStreamStateOfT())(this, this[_varData], source, cancelOnError);
-        this[_varData] = addState;
-        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_ADDSTREAM) >>> 0;
-        return addState.addStreamFuture;
-      }
-      get done() {
-        return this[_ensureDoneFuture]();
-      }
-      [_ensureDoneFuture]() {
-        if (this[_doneFuture] == null) {
-          this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future();
-        }
-        return this[_doneFuture];
-      }
-      add(value) {
-        T._check(value);
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
-        this[_add$](value);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
-        error = async._nonNullError(error);
-        let replacement = async.Zone.current.errorCallback(error, stackTrace);
-        if (replacement != null) {
-          error = async._nonNullError(replacement.error);
-          stackTrace = replacement.stackTrace;
-        }
-        this[_addError](error, stackTrace);
-      }
-      close() {
-        if (dart.test(this.isClosed)) {
-          return this[_ensureDoneFuture]();
-        }
-        if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
-        this[_closeUnchecked]();
-        return this[_ensureDoneFuture]();
-      }
-      [_closeUnchecked]() {
-        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_CLOSED) >>> 0;
-        if (dart.test(this.hasListener)) {
-          this[_sendDone]();
-        } else if (dart.test(this[_isInitialState])) {
-          this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
-        }
-      }
-      [_add$](value) {
-        T._check(value);
-        if (dart.test(this.hasListener)) {
-          this[_sendData](value);
-        } else if (dart.test(this[_isInitialState])) {
-          this[_ensurePendingEvents]().add(new (_DelayedDataOfT())(value));
-        }
-      }
-      [_addError](error, stackTrace) {
-        if (dart.test(this.hasListener)) {
-          this[_sendError](error, stackTrace);
-        } else if (dart.test(this[_isInitialState])) {
-          this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
-        }
-      }
-      [_close$]() {
-        dart.assert(this[_isAddingStream]);
-        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-        this[_varData] = addState.varData;
-        this[_state] = (dart.notNull(this[_state]) & ~async._StreamController._STATE_ADDSTREAM) >>> 0;
-        addState.complete();
-      }
-      [_subscribe](onData, onError, onDone, cancelOnError) {
-        if (!dart.test(this[_isInitialState])) {
-          dart.throw(new core.StateError("Stream has already been listened to."));
-        }
-        let subscription = new (_ControllerSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
-        let pendingEvents = this[_pendingEvents];
-        this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_SUBSCRIBED) >>> 0;
-        if (dart.test(this[_isAddingStream])) {
-          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-          addState.varData = subscription;
-          addState.resume();
-        } else {
-          this[_varData] = subscription;
-        }
-        subscription[_setPendingEvents](pendingEvents);
-        subscription[_guardCallback](dart.fn(() => {
-          async._runGuarded(this.onListen);
-        }, VoidToNull()));
-        return subscription;
-      }
-      [_recordCancel](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-        let result = null;
-        if (dart.test(this[_isAddingStream])) {
-          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-          result = addState.cancel();
-        }
-        this[_varData] = null;
-        this[_state] = (dart.notNull(this[_state]) & ~(async._StreamController._STATE_SUBSCRIBED | async._StreamController._STATE_ADDSTREAM) | async._StreamController._STATE_CANCELED) >>> 0;
-        if (this.onCancel != null) {
-          if (result == null) {
-            try {
-              result = async.Future._check(this.onCancel());
-            } catch (e) {
-              let s = dart.stackTrace(e);
-              result = new async._Future();
-              result[_asyncCompleteError](e, s);
+              async._completeWithErrorCallback(result, e, s);
             }
 
           } else {
-            result = result.whenComplete(this.onCancel);
+            result[_complete](value);
           }
-        }
-        const complete = (function() {
-          if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
-            this[_doneFuture][_asyncComplete](null);
-          }
-        }).bind(this);
-        dart.fn(complete, VoidTovoid$());
-        if (result != null) {
-          result = result.whenComplete(complete);
-        } else {
-          complete();
-        }
+        }, VoidToNull()), cancelOnError: true});
+      return result;
+    }
+    fold(S) {
+      return (initialValue, combine) => {
+        let result = new (async._Future$(S))();
+        let value = initialValue;
+        let subscription = null;
+        subscription = this.listen(dart.fn(element => {
+          async._runUserCode(dart.fn(() => combine(value, element), dart.definiteFunctionType(S, [])), dart.fn(newValue => {
+            value = newValue;
+          }, dart.definiteFunctionType(core.Null, [S])), async._cancelAndErrorClosure(subscription, result));
+        }, TToNull()), {onError: dart.fn((e, st) => {
+            result[_completeError](e, core.StackTrace._check(st));
+          }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
+            result[_complete](value);
+          }, VoidToNull()), cancelOnError: true});
         return result;
-      }
-      [_recordPause](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-        if (dart.test(this[_isAddingStream])) {
-          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-          addState.pause();
+      };
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      let result = new (_FutureOfString())();
+      let buffer = new core.StringBuffer();
+      let subscription = null;
+      let first = true;
+      subscription = this.listen(dart.fn(element => {
+        if (!first) {
+          buffer.write(separator);
         }
-        async._runGuarded(this.onPause);
-      }
-      [_recordResume](subscription) {
-        StreamSubscriptionOfT()._check(subscription);
-        if (dart.test(this[_isAddingStream])) {
-          let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
-          addState.resume();
-        }
-        async._runGuarded(this.onResume);
-      }
-    }
-    dart.addTypeTests(_StreamController);
-    _StreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
-    dart.setSignature(_StreamController, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamController$(T), [async.ControllerCallback, async.ControllerCallback, async.ControllerCallback, async.ControllerCancelCallback])}),
-      fields: () => ({
-        [_varData]: dart.dynamic,
-        [_state]: core.int,
-        [_doneFuture]: async._Future,
-        onListen: async.ControllerCallback,
-        onPause: async.ControllerCallback,
-        onResume: async.ControllerCallback,
-        onCancel: async.ControllerCancelCallback
-      }),
-      getters: () => ({
-        stream: dart.definiteFunctionType(async.Stream$(T), []),
-        sink: dart.definiteFunctionType(async.StreamSink$(T), []),
-        [_isCanceled]: dart.definiteFunctionType(core.bool, []),
-        hasListener: dart.definiteFunctionType(core.bool, []),
-        [_isInitialState]: dart.definiteFunctionType(core.bool, []),
-        isClosed: dart.definiteFunctionType(core.bool, []),
-        isPaused: dart.definiteFunctionType(core.bool, []),
-        [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
-        [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
-        [_pendingEvents]: dart.definiteFunctionType(async._PendingEvents$(T), []),
-        [_subscription]: dart.definiteFunctionType(async._ControllerSubscription$(T), []),
-        done: dart.definiteFunctionType(async.Future, [])
-      }),
-      methods: () => ({
-        [_ensurePendingEvents]: dart.definiteFunctionType(async._StreamImplEvents$(T), []),
-        [_badEventState]: dart.definiteFunctionType(core.Error, []),
-        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
-        [_ensureDoneFuture]: dart.definiteFunctionType(async.Future, []),
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        close: dart.definiteFunctionType(async.Future, []),
-        [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
-        [_add$]: dart.definiteFunctionType(dart.void, [T]),
-        [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_close$]: dart.definiteFunctionType(dart.void, []),
-        [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
-        [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
-        [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
-        [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()])
-      }),
-      sfields: () => ({
-        _STATE_INITIAL: core.int,
-        _STATE_SUBSCRIBED: core.int,
-        _STATE_CANCELED: core.int,
-        _STATE_SUBSCRIPTION_MASK: core.int,
-        _STATE_CLOSED: core.int,
-        _STATE_ADDSTREAM: core.int
-      })
-    });
-    return _StreamController;
-  });
-  async._StreamController = _StreamController();
-  async._StreamController._STATE_INITIAL = 0;
-  async._StreamController._STATE_SUBSCRIBED = 1;
-  async._StreamController._STATE_CANCELED = 2;
-  async._StreamController._STATE_SUBSCRIPTION_MASK = 3;
-  async._StreamController._STATE_CLOSED = 4;
-  async._StreamController._STATE_ADDSTREAM = 8;
-  async._SyncStreamControllerDispatch$ = dart.generic(T => {
-    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
-    class _SyncStreamControllerDispatch extends core.Object {
-      [_sendData](data) {
-        T._check(data);
-        this[_subscription][_add$](data);
-      }
-      [_sendError](error, stackTrace) {
-        this[_subscription][_addError](error, stackTrace);
-      }
-      [_sendDone]() {
-        this[_subscription][_close$]();
-      }
-    }
-    dart.addTypeTests(_SyncStreamControllerDispatch);
-    _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
-    dart.setSignature(_SyncStreamControllerDispatch, {
-      methods: () => ({
-        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
-        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _SyncStreamControllerDispatch;
-  });
-  async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
-  let const$10;
-  async._AsyncStreamControllerDispatch$ = dart.generic(T => {
-    let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
-    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    class _AsyncStreamControllerDispatch extends core.Object {
-      [_sendData](data) {
-        T._check(data);
-        this[_subscription][_addPending](new (_DelayedDataOfT())(data));
-      }
-      [_sendError](error, stackTrace) {
-        this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
-      }
-      [_sendDone]() {
-        this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
-      }
-    }
-    dart.addTypeTests(_AsyncStreamControllerDispatch);
-    _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
-    dart.setSignature(_AsyncStreamControllerDispatch, {
-      methods: () => ({
-        [_sendData]: dart.definiteFunctionType(dart.void, [T]),
-        [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _AsyncStreamControllerDispatch;
-  });
-  async._AsyncStreamControllerDispatch = _AsyncStreamControllerDispatch();
-  async._AsyncStreamController$ = dart.generic(T => {
-    class _AsyncStreamController extends dart.mixin(async._StreamController$(T), async._AsyncStreamControllerDispatch$(T)) {
-      new(onListen, onPause, onResume, onCancel) {
-        super.new(onListen, onPause, onResume, onCancel);
-      }
-    }
-    return _AsyncStreamController;
-  });
-  async._AsyncStreamController = _AsyncStreamController();
-  async._SyncStreamController$ = dart.generic(T => {
-    class _SyncStreamController extends dart.mixin(async._StreamController$(T), async._SyncStreamControllerDispatch$(T)) {
-      new(onListen, onPause, onResume, onCancel) {
-        super.new(onListen, onPause, onResume, onCancel);
-      }
-    }
-    return _SyncStreamController;
-  });
-  async._SyncStreamController = _SyncStreamController();
-  async._NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
-  async._runGuarded = function(notificationHandler) {
-    if (notificationHandler == null) return null;
-    try {
-      let result = notificationHandler();
-      if (async.Future.is(result)) return result;
-      return null;
-    } catch (e) {
-      let s = dart.stackTrace(e);
-      async.Zone.current.handleUncaughtError(dart.dynamic)(e, s);
-    }
-
-  };
-  dart.fn(async._runGuarded, _NotificationHandlerToFuture());
-  const _target = Symbol('_target');
-  async._StreamSinkWrapper$ = dart.generic(T => {
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
-    class _StreamSinkWrapper extends core.Object {
-      new(target) {
-        this[_target] = target;
-      }
-      add(data) {
-        T._check(data);
-        this[_target].add(data);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_target].addError(error, stackTrace);
-      }
-      close() {
-        return this[_target].close();
-      }
-      addStream(source, opts) {
-        StreamOfT()._check(source);
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
-        return this[_target].addStream(source, {cancelOnError: cancelOnError});
-      }
-      get done() {
-        return this[_target].done;
-      }
-    }
-    dart.addTypeTests(_StreamSinkWrapper);
-    _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
-    dart.setSignature(_StreamSinkWrapper, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkWrapper$(T), [async.StreamController])}),
-      fields: () => ({[_target]: async.StreamController}),
-      getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        close: dart.definiteFunctionType(async.Future, []),
-        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool})
-      })
-    });
-    return _StreamSinkWrapper;
-  });
-  async._StreamSinkWrapper = _StreamSinkWrapper();
-  async._AddStreamState$ = dart.generic(T => {
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    class _AddStreamState extends core.Object {
-      new(controller, source, cancelOnError) {
-        this.addStreamFuture = new async._Future();
-        this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
-      }
-      static makeErrorHandler(controller) {
-        return dart.fn((e, s) => {
-          controller[_addError](e, s);
-          controller[_close$]();
-        }, dynamicAndStackTraceToNull());
-      }
-      pause() {
-        this.addSubscription.pause();
-      }
-      resume() {
-        this.addSubscription.resume();
-      }
-      cancel() {
-        let cancel = this.addSubscription.cancel();
-        if (cancel == null) {
-          this.addStreamFuture[_asyncComplete](null);
-          return null;
-        }
-        return cancel.whenComplete(dart.fn(() => {
-          this.addStreamFuture[_asyncComplete](null);
-        }, VoidToNull()));
-      }
-      complete() {
-        this.addStreamFuture[_asyncComplete](null);
-      }
-    }
-    dart.addTypeTests(_AddStreamState);
-    dart.setSignature(_AddStreamState, {
-      constructors: () => ({new: dart.definiteFunctionType(async._AddStreamState$(T), [_EventSinkOfT(), async.Stream, core.bool])}),
-      fields: () => ({
-        addStreamFuture: async._Future,
-        addSubscription: async.StreamSubscription
-      }),
-      methods: () => ({
-        pause: dart.definiteFunctionType(dart.void, []),
-        resume: dart.definiteFunctionType(dart.void, []),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        complete: dart.definiteFunctionType(dart.void, [])
-      }),
-      statics: () => ({makeErrorHandler: dart.definiteFunctionType(dart.dynamic, [async._EventSink])}),
-      names: ['makeErrorHandler']
-    });
-    return _AddStreamState;
-  });
-  async._AddStreamState = _AddStreamState();
-  async._StreamControllerAddStreamState$ = dart.generic(T => {
-    let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
-    class _StreamControllerAddStreamState extends async._AddStreamState$(T) {
-      new(controller, varData, source, cancelOnError) {
-        this.varData = varData;
-        super.new(controller, source, cancelOnError);
-        if (dart.test(controller.isPaused)) {
-          this.addSubscription.pause();
-        }
-      }
-    }
-    dart.setSignature(_StreamControllerAddStreamState, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamControllerAddStreamState$(T), [_StreamControllerOfT(), dart.dynamic, async.Stream, core.bool])}),
-      fields: () => ({varData: dart.dynamic})
-    });
-    return _StreamControllerAddStreamState;
-  });
-  async._StreamControllerAddStreamState = _StreamControllerAddStreamState();
-  async._EventSink$ = dart.generic(T => {
-    class _EventSink extends core.Object {}
-    dart.addTypeTests(_EventSink);
-    return _EventSink;
-  });
-  async._EventSink = _EventSink();
-  async._EventDispatch$ = dart.generic(T => {
-    class _EventDispatch extends core.Object {}
-    dart.addTypeTests(_EventDispatch);
-    return _EventDispatch;
-  });
-  async._EventDispatch = _EventDispatch();
-  async._EventGenerator$ = dart.generic(T => {
-    const _EventGenerator = dart.typedef('_EventGenerator', () => dart.functionType(async._PendingEvents$(T), []));
-    return _EventGenerator;
-  });
-  async._EventGenerator = _EventGenerator();
-  const _isUsed = Symbol('_isUsed');
-  async._GeneratedStreamImpl$ = dart.generic(T => {
-    let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let _EventGeneratorOfT = () => (_EventGeneratorOfT = dart.constFn(async._EventGenerator$(T)))();
-    class _GeneratedStreamImpl extends async._StreamImpl$(T) {
-      new(pending) {
-        this[_pending] = pending;
-        this[_isUsed] = false;
-        super.new();
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        if (dart.test(this[_isUsed])) dart.throw(new core.StateError("Stream has already been listened to."));
-        this[_isUsed] = true;
-        let _ = new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
-        _[_setPendingEvents](this[_pending]());
-        return _;
-      }
-    }
-    dart.setSignature(_GeneratedStreamImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(async._GeneratedStreamImpl$(T), [_EventGeneratorOfT()])}),
-      fields: () => ({
-        [_pending]: _EventGeneratorOfT(),
-        [_isUsed]: core.bool
-      })
-    });
-    return _GeneratedStreamImpl;
-  });
-  async._GeneratedStreamImpl = _GeneratedStreamImpl();
-  const _iterator$ = Symbol('_iterator');
-  const _eventScheduled = Symbol('_eventScheduled');
-  async._PendingEvents$ = dart.generic(T => {
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    class _PendingEvents extends core.Object {
-      new() {
-        this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
-      }
-      get isScheduled() {
-        return this[_state] == async._PendingEvents._STATE_SCHEDULED;
-      }
-      get [_eventScheduled]() {
-        return dart.notNull(this[_state]) >= async._PendingEvents._STATE_SCHEDULED;
-      }
-      schedule(dispatch) {
-        _EventDispatchOfT()._check(dispatch);
-        if (dart.test(this.isScheduled)) return;
-        dart.assert(!dart.test(this.isEmpty));
-        if (dart.test(this[_eventScheduled])) {
-          dart.assert(this[_state] == async._PendingEvents._STATE_CANCELED);
-          this[_state] = async._PendingEvents._STATE_SCHEDULED;
-          return;
-        }
-        async.scheduleMicrotask(dart.fn(() => {
-          let oldState = this[_state];
-          this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
-          if (oldState == async._PendingEvents._STATE_CANCELED) return;
-          this.handleNext(dispatch);
-        }, VoidToNull()));
-        this[_state] = async._PendingEvents._STATE_SCHEDULED;
-      }
-      cancelSchedule() {
-        if (dart.test(this.isScheduled)) this[_state] = async._PendingEvents._STATE_CANCELED;
-      }
-    }
-    dart.addTypeTests(_PendingEvents);
-    dart.setSignature(_PendingEvents, {
-      fields: () => ({[_state]: core.int}),
-      getters: () => ({
-        isScheduled: dart.definiteFunctionType(core.bool, []),
-        [_eventScheduled]: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        schedule: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
-        cancelSchedule: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _STATE_UNSCHEDULED: core.int,
-        _STATE_SCHEDULED: core.int,
-        _STATE_CANCELED: core.int
-      })
-    });
-    return _PendingEvents;
-  });
-  async._PendingEvents = _PendingEvents();
-  async._PendingEvents._STATE_UNSCHEDULED = 0;
-  async._PendingEvents._STATE_SCHEDULED = 1;
-  async._PendingEvents._STATE_CANCELED = 3;
-  async._IterablePendingEvents$ = dart.generic(T => {
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
-    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
-    class _IterablePendingEvents extends async._PendingEvents$(T) {
-      new(data) {
-        this[_iterator$] = data[dartx.iterator];
-        super.new();
-      }
-      get isEmpty() {
-        return this[_iterator$] == null;
-      }
-      handleNext(dispatch) {
-        _EventDispatchOfT()._check(dispatch);
-        if (this[_iterator$] == null) {
-          dart.throw(new core.StateError("No events pending."));
-        }
-        let isDone = null;
+        first = false;
         try {
-          isDone = !dart.test(this[_iterator$].moveNext());
+          buffer.write(element);
         } catch (e) {
           let s = dart.stackTrace(e);
-          this[_iterator$] = null;
-          dispatch[_sendError](e, s);
-          return;
+          async._cancelAndErrorWithReplacement(subscription, result, e, s);
         }
 
-        if (!dart.test(isDone)) {
-          dispatch[_sendData](this[_iterator$].current);
-        } else {
-          this[_iterator$] = null;
-          dispatch[_sendDone]();
-        }
-      }
-      clear() {
-        if (dart.test(this.isScheduled)) this.cancelSchedule();
-        this[_iterator$] = null;
-      }
+      }, TToNull()), {onError: dart.fn(e => {
+          result[_completeError](e);
+        }, dynamicToNull$()), onDone: dart.fn(() => {
+          result[_complete](buffer.toString());
+        }, VoidToNull()), cancelOnError: true});
+      return result;
     }
-    dart.setSignature(_IterablePendingEvents, {
-      constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
-      fields: () => ({[_iterator$]: IteratorOfT()}),
-      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
-        clear: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _IterablePendingEvents;
-  });
-  async._IterablePendingEvents = _IterablePendingEvents();
-  async._DataHandler$ = dart.generic(T => {
-    const _DataHandler = dart.typedef('_DataHandler', () => dart.functionType(dart.void, [T]));
-    return _DataHandler;
-  });
-  async._DataHandler = _DataHandler();
-  async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
-  async._nullDataHandler = function(value) {
-  };
-  dart.fn(async._nullDataHandler, dynamicTovoid$());
-  async._nullErrorHandler = function(error, stackTrace) {
-    if (stackTrace === void 0) stackTrace = null;
-    async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
-  };
-  dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
-  async._nullDoneHandler = function() {
-  };
-  dart.fn(async._nullDoneHandler, VoidTovoid$());
-  async._DelayedEvent$ = dart.generic(T => {
-    class _DelayedEvent extends core.Object {
-      new() {
-        this.next = null;
-      }
-    }
-    dart.addTypeTests(_DelayedEvent);
-    dart.setSignature(_DelayedEvent, {
-      fields: () => ({next: async._DelayedEvent})
-    });
-    return _DelayedEvent;
-  });
-  async._DelayedEvent = _DelayedEvent();
-  async._DelayedData$ = dart.generic(T => {
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    class _DelayedData extends async._DelayedEvent$(T) {
-      new(value) {
-        this.value = value;
-        super.new();
-      }
-      perform(dispatch) {
-        _EventDispatchOfT()._check(dispatch);
-        dispatch[_sendData](this.value);
-      }
-    }
-    dart.setSignature(_DelayedData, {
-      constructors: () => ({new: dart.definiteFunctionType(async._DelayedData$(T), [T])}),
-      fields: () => ({value: T}),
-      methods: () => ({perform: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()])})
-    });
-    return _DelayedData;
-  });
-  async._DelayedData = _DelayedData();
-  async._DelayedError = class _DelayedError extends async._DelayedEvent {
-    new(error, stackTrace) {
-      this.error = error;
-      this.stackTrace = stackTrace;
-      super.new();
-    }
-    perform(dispatch) {
-      dispatch[_sendError](this.error, this.stackTrace);
-    }
-  };
-  dart.addSimpleTypeTests(async._DelayedError);
-  dart.setSignature(async._DelayedError, {
-    constructors: () => ({new: dart.definiteFunctionType(async._DelayedError, [dart.dynamic, core.StackTrace])}),
-    fields: () => ({
-      error: dart.dynamic,
-      stackTrace: core.StackTrace
-    }),
-    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
-  });
-  async._DelayedDone = class _DelayedDone extends core.Object {
-    new() {
-    }
-    perform(dispatch) {
-      dispatch[_sendDone]();
-    }
-    get next() {
-      return null;
-    }
-    set next(_) {
-      dart.throw(new core.StateError("No events after a done."));
-    }
-  };
-  async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
-  dart.setSignature(async._DelayedDone, {
-    constructors: () => ({new: dart.definiteFunctionType(async._DelayedDone, [])}),
-    getters: () => ({next: dart.definiteFunctionType(async._DelayedEvent, [])}),
-    setters: () => ({next: dart.definiteFunctionType(dart.void, [async._DelayedEvent])}),
-    methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
-  });
-  async._StreamImplEvents$ = dart.generic(T => {
-    let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
-    class _StreamImplEvents extends async._PendingEvents$(T) {
-      new() {
-        this.firstPendingEvent = null;
-        this.lastPendingEvent = null;
-        super.new();
-      }
-      get isEmpty() {
-        return this.lastPendingEvent == null;
-      }
-      add(event) {
-        if (this.lastPendingEvent == null) {
-          this.firstPendingEvent = this.lastPendingEvent = event;
-        } else {
-          this.lastPendingEvent = this.lastPendingEvent.next = event;
-        }
-      }
-      handleNext(dispatch) {
-        _EventDispatchOfT()._check(dispatch);
-        dart.assert(!dart.test(this.isScheduled));
-        let event = this.firstPendingEvent;
-        this.firstPendingEvent = event.next;
-        if (this.firstPendingEvent == null) {
-          this.lastPendingEvent = null;
-        }
-        event.perform(dispatch);
-      }
-      clear() {
-        if (dart.test(this.isScheduled)) this.cancelSchedule();
-        this.firstPendingEvent = this.lastPendingEvent = null;
-      }
-    }
-    dart.setSignature(_StreamImplEvents, {
-      fields: () => ({
-        firstPendingEvent: async._DelayedEvent,
-        lastPendingEvent: async._DelayedEvent
-      }),
-      getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
-        handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
-        clear: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _StreamImplEvents;
-  });
-  async._StreamImplEvents = _StreamImplEvents();
-  const _unlink = Symbol('_unlink');
-  const _insertBefore = Symbol('_insertBefore');
-  async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
-    new() {
-      this[_next$] = null;
-      this[_previous$] = null;
-    }
-    [_unlink]() {
-      this[_previous$][_next$] = this[_next$];
-      this[_next$][_previous$] = this[_previous$];
-      this[_next$] = this[_previous$] = this;
-    }
-    [_insertBefore](newNext) {
-      let newPrevious = newNext[_previous$];
-      newPrevious[_next$] = this;
-      newNext[_previous$] = this[_previous$];
-      this[_previous$][_next$] = newNext;
-      this[_previous$] = newPrevious;
-    }
-  };
-  dart.setSignature(async._BroadcastLinkedList, {
-    fields: () => ({
-      [_next$]: async._BroadcastLinkedList,
-      [_previous$]: async._BroadcastLinkedList
-    }),
-    methods: () => ({
-      [_unlink]: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
-    })
-  });
-  async._BroadcastCallback$ = dart.generic(T => {
-    const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
-    return _BroadcastCallback;
-  });
-  async._BroadcastCallback = _BroadcastCallback();
-  const _schedule = Symbol('_schedule');
-  const _isSent = Symbol('_isSent');
-  const _isScheduled = Symbol('_isScheduled');
-  async._DoneStreamSubscription$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _DoneStreamSubscription extends core.Object {
-      new(onDone) {
-        this[_onDone] = onDone;
-        this[_zone] = async.Zone.current;
-        this[_state] = 0;
-        this[_schedule]();
-      }
-      get [_isSent]() {
-        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._DONE_SENT) != 0;
-      }
-      get [_isScheduled]() {
-        return (dart.notNull(this[_state]) & async._DoneStreamSubscription._SCHEDULED) != 0;
-      }
-      get isPaused() {
-        return dart.notNull(this[_state]) >= async._DoneStreamSubscription._PAUSED;
-      }
-      [_schedule]() {
-        if (dart.test(this[_isScheduled])) return;
-        this[_zone].scheduleMicrotask(dart.bind(this, _sendDone));
-        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._SCHEDULED) >>> 0;
-      }
-      onData(handleData) {}
-      onError(handleError) {}
-      onDone(handleDone) {
-        this[_onDone] = handleDone;
-      }
-      pause(resumeSignal) {
-        if (resumeSignal === void 0) resumeSignal = null;
-        this[_state] = dart.notNull(this[_state]) + async._DoneStreamSubscription._PAUSED;
-        if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
-      }
-      resume() {
-        if (dart.test(this.isPaused)) {
-          this[_state] = dart.notNull(this[_state]) - async._DoneStreamSubscription._PAUSED;
-          if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
-            this[_schedule]();
+    contains(needle) {
+      let future = new (_FutureOfbool())();
+      let subscription = null;
+      subscription = this.listen(dart.fn(element => {
+        async._runUserCode(dart.fn(() => dart.equals(element, needle), VoidTobool()), dart.fn(isMatch => {
+          if (dart.test(isMatch)) {
+            async._cancelAndValue(subscription, future, true);
           }
-        }
-      }
-      cancel() {
-        return null;
-      }
-      asFuture(E) {
-        return futureValue => {
-          if (futureValue === void 0) futureValue = null;
-          let result = new (async._Future$(E))();
-          this[_onDone] = dart.fn(() => {
-            result[_completeWithValue](null);
-          }, VoidToNull());
-          return result;
-        };
-      }
-      [_sendDone]() {
-        this[_state] = (dart.notNull(this[_state]) & ~async._DoneStreamSubscription._SCHEDULED) >>> 0;
-        if (dart.test(this.isPaused)) return;
-        this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._DONE_SENT) >>> 0;
-        if (this[_onDone] != null) this[_zone].runGuarded(dart.void)(this[_onDone]);
-      }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](false);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
     }
-    dart.addTypeTests(_DoneStreamSubscription);
-    _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
-    dart.setSignature(_DoneStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._DoneStreamSubscription$(T), [async._DoneHandler])}),
-      fields: () => ({
-        [_zone]: async.Zone,
-        [_state]: core.int,
-        [_onDone]: async._DoneHandler
-      }),
-      getters: () => ({
-        [_isSent]: dart.definiteFunctionType(core.bool, []),
-        [_isScheduled]: dart.definiteFunctionType(core.bool, []),
-        isPaused: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        [_schedule]: dart.definiteFunctionType(dart.void, []),
-        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
-        onError: dart.definiteFunctionType(dart.void, [core.Function]),
-        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-        resume: dart.definiteFunctionType(dart.void, []),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
-        [_sendDone]: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _DONE_SENT: core.int,
-        _SCHEDULED: core.int,
-        _PAUSED: core.int
-      })
-    });
-    return _DoneStreamSubscription;
-  });
-  async._DoneStreamSubscription = _DoneStreamSubscription();
-  async._DoneStreamSubscription._DONE_SENT = 1;
-  async._DoneStreamSubscription._SCHEDULED = 2;
-  async._DoneStreamSubscription._PAUSED = 4;
-  const _source$ = Symbol('_source');
-  const _onListenHandler = Symbol('_onListenHandler');
-  const _onCancelHandler = Symbol('_onCancelHandler');
-  const _cancelSubscription = Symbol('_cancelSubscription');
-  const _pauseSubscription = Symbol('_pauseSubscription');
-  const _resumeSubscription = Symbol('_resumeSubscription');
-  const _isSubscriptionPaused = Symbol('_isSubscriptionPaused');
-  async._AsBroadcastStream$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
-    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
-    let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
-    class _AsBroadcastStream extends async.Stream$(T) {
-      new(source, onListenHandler, onCancelHandler) {
-        this[_source$] = source;
-        this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
-        this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
-        this[_zone] = async.Zone.current;
-        this[_controller$] = null;
-        this[_subscription] = null;
-        super.new();
-        this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
-      }
-      get isBroadcast() {
-        return true;
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
-          return new (_DoneStreamSubscriptionOfT())(onDone);
-        }
-        if (this[_subscription] == null) {
-          this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
-        }
-        cancelOnError = core.identical(true, cancelOnError);
-        return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
-      }
-      [_onCancel]() {
-        let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
-        if (this[_onCancelHandler] != null) {
-          this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
-        }
-        if (shutdown) {
-          if (this[_subscription] != null) {
-            this[_subscription].cancel();
-            this[_subscription] = null;
+    forEach(action) {
+      let future = new async._Future();
+      let subscription = null;
+      subscription = this.listen(dart.fn(element => {
+        async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
+        }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](null);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    every(test) {
+      let future = new (_FutureOfbool())();
+      let subscription = null;
+      subscription = this.listen(dart.fn(element => {
+        async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
+          if (!dart.test(isMatch)) {
+            async._cancelAndValue(subscription, future, false);
           }
-        }
-      }
-      [_onListen]() {
-        if (this[_onListenHandler] != null) {
-          this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
-        }
-      }
-      [_cancelSubscription]() {
-        if (this[_subscription] == null) return;
-        let subscription = this[_subscription];
-        this[_subscription] = null;
-        this[_controller$] = null;
-        subscription.cancel();
-      }
-      [_pauseSubscription](resumeSignal) {
-        if (this[_subscription] == null) return;
-        this[_subscription].pause(resumeSignal);
-      }
-      [_resumeSubscription]() {
-        if (this[_subscription] == null) return;
-        this[_subscription].resume();
-      }
-      get [_isSubscriptionPaused]() {
-        if (this[_subscription] == null) return false;
-        return this[_subscription].isPaused;
-      }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](true);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
     }
-    dart.setSignature(_AsBroadcastStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
-      fields: () => ({
-        [_source$]: StreamOfT(),
-        [_onListenHandler]: _BroadcastCallbackOfT(),
-        [_onCancelHandler]: _BroadcastCallbackOfT(),
-        [_zone]: async.Zone,
-        [_controller$]: _AsBroadcastStreamControllerOfT(),
-        [_subscription]: StreamSubscriptionOfT()
-      }),
-      getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-        [_onCancel]: dart.definiteFunctionType(dart.void, []),
-        [_onListen]: dart.definiteFunctionType(dart.void, []),
-        [_cancelSubscription]: dart.definiteFunctionType(dart.void, []),
-        [_pauseSubscription]: dart.definiteFunctionType(dart.void, [async.Future]),
-        [_resumeSubscription]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _AsBroadcastStream;
-  });
-  async._AsBroadcastStream = _AsBroadcastStream();
-  async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _BroadcastSubscriptionWrapper extends core.Object {
-      new(stream) {
-        this[_stream] = stream;
-      }
-      onData(handleData) {
-        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
-      }
-      onError(handleError) {
-        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
-      }
-      onDone(handleDone) {
-        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
-      }
-      pause(resumeSignal) {
-        if (resumeSignal === void 0) resumeSignal = null;
-        this[_stream][_pauseSubscription](resumeSignal);
-      }
-      resume() {
-        this[_stream][_resumeSubscription]();
-      }
-      cancel() {
-        this[_stream][_cancelSubscription]();
-        return null;
-      }
-      get isPaused() {
-        return this[_stream][_isSubscriptionPaused];
-      }
-      asFuture(E) {
-        return futureValue => {
-          if (futureValue === void 0) futureValue = null;
-          dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
-        };
-      }
-    }
-    dart.addTypeTests(_BroadcastSubscriptionWrapper);
-    _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
-    dart.setSignature(_BroadcastSubscriptionWrapper, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscriptionWrapper$(T), [async._AsBroadcastStream])}),
-      fields: () => ({[_stream]: async._AsBroadcastStream}),
-      getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
-        onError: dart.definiteFunctionType(dart.void, [core.Function]),
-        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-        resume: dart.definiteFunctionType(dart.void, []),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
-      })
-    });
-    return _BroadcastSubscriptionWrapper;
-  });
-  async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-  const _current$1 = Symbol('_current');
-  const _futureOrPrefetch = Symbol('_futureOrPrefetch');
-  const _clear = Symbol('_clear');
-  async._StreamIteratorImpl$ = dart.generic(T => {
-    let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _StreamIteratorImpl extends core.Object {
-      new(stream) {
-        this[_subscription] = null;
-        this[_current$1] = null;
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
-      }
-      get current() {
-        return this[_current$1];
-      }
-      moveNext() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
-          return new (_FutureOfbool()).immediate(false);
-        }
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          dart.throw(new core.StateError("Already waiting for next."));
-        }
-        if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
-          this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-          this[_current$1] = null;
-          let result = new (_FutureOfbool())();
-          this[_futureOrPrefetch] = result;
-          return result;
-        } else {
-          dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
-          switch (this[_state]) {
-            case async._StreamIteratorImpl._STATE_EXTRA_DATA:
-            {
-              this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-              this[_current$1] = T.as(this[_futureOrPrefetch]);
-              this[_futureOrPrefetch] = null;
-              this[_subscription].resume();
-              return new (_FutureOfbool()).immediate(true);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
-            {
-              let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
-              this[_clear]();
-              return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_DONE:
-            {
-              this[_clear]();
-              return new (_FutureOfbool()).immediate(false);
-            }
+    any(test) {
+      let future = new (_FutureOfbool())();
+      let subscription = null;
+      subscription = this.listen(dart.fn(element => {
+        async._runUserCode(dart.fn(() => test(element), VoidTobool()), dart.fn(isMatch => {
+          if (dart.test(isMatch)) {
+            async._cancelAndValue(subscription, future, true);
           }
-        }
-      }
-      [_clear]() {
-        this[_subscription] = null;
-        this[_futureOrPrefetch] = null;
-        this[_current$1] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_DONE;
-      }
-      cancel() {
-        let subscription = this[_subscription];
-        if (subscription == null) return null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-        } else {
-          this[_clear]();
-        }
-        return subscription.cancel();
-      }
-      [_onData](data) {
-        T._check(data);
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          this[_current$1] = data;
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_futureOrPrefetch] = null;
-          this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-          hasNext[_complete](true);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = data;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
-      }
-      [_onError](error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_completeError](error, stackTrace);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
-      }
-      [_onDone]() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-          return;
-        }
-        this[_subscription].pause();
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
-      }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](false);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
     }
-    dart.addTypeTests(_StreamIteratorImpl);
-    _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
-    dart.setSignature(_StreamIteratorImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
-      fields: () => ({
-        [_subscription]: async.StreamSubscription,
-        [_current$1]: T,
-        [_futureOrPrefetch]: dart.dynamic,
-        [_state]: core.int
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({
-        moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
-        [_clear]: dart.definiteFunctionType(dart.void, []),
-        cancel: dart.definiteFunctionType(async.Future, []),
-        [_onData]: dart.definiteFunctionType(dart.void, [T]),
-        [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        [_onDone]: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _STATE_FOUND: core.int,
-        _STATE_DONE: core.int,
-        _STATE_MOVING: core.int,
-        _STATE_EXTRA_DATA: core.int,
-        _STATE_EXTRA_ERROR: core.int,
-        _STATE_EXTRA_DONE: core.int
-      })
-    });
-    return _StreamIteratorImpl;
-  });
-  async._StreamIteratorImpl = _StreamIteratorImpl();
-  async._StreamIteratorImpl._STATE_FOUND = 0;
-  async._StreamIteratorImpl._STATE_DONE = 1;
-  async._StreamIteratorImpl._STATE_MOVING = 2;
-  async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
-  async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
-  async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
-  async._EmptyStream$ = dart.generic(T => {
-    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _EmptyStream extends async.Stream$(T) {
-      new() {
-        super._internal();
-      }
-      get isBroadcast() {
-        return true;
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        return new (_DoneStreamSubscriptionOfT())(onDone);
-      }
-    }
-    dart.setSignature(_EmptyStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._EmptyStream$(T), [])}),
-      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-    });
-    return _EmptyStream;
-  });
-  async._EmptyStream = _EmptyStream();
-  async._runUserCode = function(userCode, onSuccess, onError) {
-    try {
-      dart.dcall(onSuccess, userCode());
-    } catch (e) {
-      let s = dart.stackTrace(e);
-      let replacement = async.Zone.current.errorCallback(e, s);
-      if (replacement == null) {
-        dart.dcall(onError, e, s);
-      } else {
-        let error = async._nonNullError(replacement.error);
-        let stackTrace = replacement.stackTrace;
-        dart.dcall(onError, error, stackTrace);
-      }
-    }
-
-  };
-  dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
-  async._cancelAndError = function(subscription, future, error, stackTrace) {
-    let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
-      cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
-    } else {
-      future[_completeError](error, stackTrace);
-    }
-  };
-  dart.lazyFn(async._cancelAndError, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
-  async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
-    let replacement = async.Zone.current.errorCallback(error, stackTrace);
-    if (replacement != null) {
-      error = async._nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    async._cancelAndError(subscription, future, error, stackTrace);
-  };
-  dart.lazyFn(async._cancelAndErrorWithReplacement, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
-  async._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [dart.dynamic, core.StackTrace]));
-  async._cancelAndErrorClosure = function(subscription, future) {
-    return dart.fn((error, stackTrace) => {
-      async._cancelAndError(subscription, future, error, stackTrace);
-    }, dynamicAndStackTraceToNull());
-  };
-  dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
-  async._cancelAndValue = function(subscription, future, value) {
-    let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
-      cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
-    } else {
-      future[_complete](value);
-    }
-  };
-  dart.fn(async._cancelAndValue, StreamSubscriptionAnd_FutureAnddynamicTovoid());
-  const _handleData = Symbol('_handleData');
-  const _handleError = Symbol('_handleError');
-  const _handleDone = Symbol('_handleDone');
-  async._ForwardingStream$ = dart.generic((S, T) => {
-    let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _ForwardingStream extends async.Stream$(T) {
-      new(source) {
-        this[_source$] = source;
-        super.new();
-      }
-      get isBroadcast() {
-        return this[_source$].isBroadcast;
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        cancelOnError = core.identical(true, cancelOnError);
-        return this[_createSubscription](onData, onError, onDone, cancelOnError);
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return new (_ForwardingStreamSubscriptionOfS$T())(this, onData, onError, onDone, cancelOnError);
-      }
-      [_handleData](data, sink) {
-        S._check(data);
-        _EventSinkOfT()._check(sink);
-        sink[_add$](T.as(data));
-      }
-      [_handleError](error, stackTrace, sink) {
-        _EventSinkOfT()._check(sink);
-        sink[_addError](error, stackTrace);
-      }
-      [_handleDone](sink) {
-        _EventSinkOfT()._check(sink);
-        sink[_close$]();
-      }
-    }
-    dart.setSignature(_ForwardingStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
-      fields: () => ({[_source$]: StreamOfS()}),
-      methods: () => ({
-        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-        [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
-        [_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()]),
-        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, _EventSinkOfT()]),
-        [_handleDone]: dart.definiteFunctionType(dart.void, [_EventSinkOfT()])
-      })
-    });
-    return _ForwardingStream;
-  });
-  async._ForwardingStream = _ForwardingStream();
-  async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
-    let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
-    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
-      new(stream, onData, onError, onDone, cancelOnError) {
-        this[_stream] = stream;
-        this[_subscription] = null;
-        super.new(onData, onError, onDone, cancelOnError);
-        this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
-      }
-      [_add$](data) {
-        T._check(data);
-        if (dart.test(this[_isClosed$])) return;
-        super[_add$](data);
-      }
-      [_addError](error, stackTrace) {
-        if (dart.test(this[_isClosed$])) return;
-        super[_addError](error, stackTrace);
-      }
-      [_onPause]() {
-        if (this[_subscription] == null) return;
-        this[_subscription].pause();
-      }
-      [_onResume]() {
-        if (this[_subscription] == null) return;
-        this[_subscription].resume();
-      }
-      [_onCancel]() {
-        if (this[_subscription] != null) {
-          let subscription = this[_subscription];
-          this[_subscription] = null;
-          return subscription.cancel();
-        }
-        return null;
-      }
-      [_handleData](data) {
-        S._check(data);
-        this[_stream][_handleData](data, this);
-      }
-      [_handleError](error, stackTrace) {
-        this[_stream][_handleError](error, stackTrace, this);
-      }
-      [_handleDone]() {
-        this[_stream][_handleDone](this);
-      }
-    }
-    dart.setSignature(_ForwardingStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStreamSubscription$(S, T), [_ForwardingStreamOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-      fields: () => ({
-        [_stream]: _ForwardingStreamOfS$T(),
-        [_subscription]: StreamSubscriptionOfS()
-      }),
-      methods: () => ({
-        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
-        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
-        [_handleDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _ForwardingStreamSubscription;
-  });
-  async._ForwardingStreamSubscription = _ForwardingStreamSubscription();
-  async._Predicate$ = dart.generic(T => {
-    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
-    return _Predicate;
-  });
-  async._Predicate = _Predicate();
-  async._addErrorWithReplacement = function(sink, error, stackTrace) {
-    let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
-    if (replacement != null) {
-      error = async._nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    sink[_addError](error, core.StackTrace._check(stackTrace));
-  };
-  dart.fn(async._addErrorWithReplacement, _EventSinkAnddynamicAnddynamicTovoid());
-  const _test = Symbol('_test');
-  async._WhereStream$ = dart.generic(T => {
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _WhereStream extends async._ForwardingStream$(T, T) {
-      new(source, test) {
-        this[_test] = test;
-        super.new(source);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let satisfies = null;
-        try {
-          satisfies = this[_test](inputEvent);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async._addErrorWithReplacement(sink, e, s);
-          return;
-        }
-
-        if (dart.test(satisfies)) {
-          sink[_add$](inputEvent);
-        }
-      }
-    }
-    dart.setSignature(_WhereStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._WhereStream$(T), [StreamOfT(), _PredicateOfT()])}),
-      fields: () => ({[_test]: _PredicateOfT()})
-    });
-    return _WhereStream;
-  });
-  async._WhereStream = _WhereStream();
-  async._Transformation$ = dart.generic((S, T) => {
-    const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
-    return _Transformation;
-  });
-  async._Transformation = _Transformation$();
-  const _transform = Symbol('_transform');
-  async._MapStream$ = dart.generic((S, T) => {
-    let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    class _MapStream extends async._ForwardingStream$(S, T) {
-      new(source, transform) {
-        this[_transform] = transform;
-        super.new(source);
-      }
-      [_handleData](inputEvent, sink) {
-        S._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let outputEvent = null;
-        try {
-          outputEvent = this[_transform](inputEvent);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async._addErrorWithReplacement(sink, e, s);
-          return;
-        }
-
-        sink[_add$](outputEvent);
-      }
-    }
-    dart.setSignature(_MapStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._MapStream$(S, T), [StreamOfS(), _TransformationOfS$T()])}),
-      fields: () => ({[_transform]: _TransformationOfS$T()})
-    });
-    return _MapStream;
-  });
-  async._MapStream = _MapStream();
-  const _expand = Symbol('_expand');
-  async._ExpandStream$ = dart.generic((S, T) => {
-    let _TransformationOfS$IterableOfT = () => (_TransformationOfS$IterableOfT = dart.constFn(async._Transformation$(S, IterableOfT())))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
-    class _ExpandStream extends async._ForwardingStream$(S, T) {
-      new(source, expand) {
-        this[_expand] = expand;
-        super.new(source);
-      }
-      [_handleData](inputEvent, sink) {
-        S._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        try {
-          for (let value of this[_expand](inputEvent)) {
-            sink[_add$](value);
-          }
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async._addErrorWithReplacement(sink, e, s);
-        }
-
-      }
-    }
-    dart.setSignature(_ExpandStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ExpandStream$(S, T), [StreamOfS(), _TransformationOfS$IterableOfT()])}),
-      fields: () => ({[_expand]: _TransformationOfS$IterableOfT()})
-    });
-    return _ExpandStream;
-  });
-  async._ExpandStream = _ExpandStream();
-  async._ErrorTest = dart.typedef('_ErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
-  async._HandleErrorStream$ = dart.generic(T => {
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _HandleErrorStream extends async._ForwardingStream$(T, T) {
-      new(source, onError, test) {
-        this[_transform] = onError;
-        this[_test] = test;
-        super.new(source);
-      }
-      [_handleError](error, stackTrace, sink) {
-        _EventSinkOfT()._check(sink);
-        let matches = true;
-        if (this[_test] != null) {
-          try {
-            matches = dart.dcall(this[_test], error);
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._addErrorWithReplacement(sink, e, s);
-            return;
-          }
-
-        }
-        if (dart.test(matches)) {
-          try {
-            async._invokeErrorHandler(this[_transform], error, stackTrace);
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            if (core.identical(e, error)) {
-              sink[_addError](error, stackTrace);
-            } else {
-              async._addErrorWithReplacement(sink, e, s);
-            }
-            return;
-          }
-
-        } else {
-          sink[_addError](error, stackTrace);
-        }
-      }
-    }
-    dart.setSignature(_HandleErrorStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._HandleErrorStream$(T), [StreamOfT(), core.Function, dynamicTobool()])}),
-      fields: () => ({
-        [_transform]: core.Function,
-        [_test]: async._ErrorTest
-      }),
-      methods: () => ({[_handleError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace, _EventSinkOfT()])})
-    });
-    return _HandleErrorStream;
-  });
-  async._HandleErrorStream = _HandleErrorStream();
-  const _count = Symbol('_count');
-  async._TakeStream$ = dart.generic(T => {
-    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _TakeStream extends async._ForwardingStream$(T, T) {
-      new(source, count) {
-        this[_count] = count;
-        super.new(source);
-        if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let subscription = _StateStreamSubscriptionOfT()._check(sink);
-        let count = subscription[_count];
-        if (dart.notNull(count) > 0) {
-          sink[_add$](inputEvent);
-          count = dart.notNull(count) - 1;
-          subscription[_count] = count;
-          if (count == 0) {
-            sink[_close$]();
-          }
-        }
-      }
-    }
-    dart.setSignature(_TakeStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._TakeStream$(T), [StreamOfT(), core.int])}),
-      fields: () => ({[_count]: core.int})
-    });
-    return _TakeStream;
-  });
-  async._TakeStream = _TakeStream();
-  const _sharedState = Symbol('_sharedState');
-  const _flag = Symbol('_flag');
-  async._StateStreamSubscription$ = dart.generic(T => {
-    let _ForwardingStreamOfT$T = () => (_ForwardingStreamOfT$T = dart.constFn(async._ForwardingStream$(T, T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
-      new(stream, onData, onError, onDone, cancelOnError, sharedState) {
-        this[_sharedState] = sharedState;
-        super.new(stream, onData, onError, onDone, cancelOnError);
-      }
-      get [_flag]() {
-        return core.bool._check(this[_sharedState]);
-      }
-      set [_flag](flag) {
-        this[_sharedState] = flag;
-      }
-      get [_count]() {
-        return core.int._check(this[_sharedState]);
-      }
-      set [_count](count) {
-        this[_sharedState] = count;
-      }
-    }
-    dart.setSignature(_StateStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StateStreamSubscription$(T), [_ForwardingStreamOfT$T(), TTovoid(), core.Function, VoidTovoid(), core.bool, dart.dynamic])}),
-      fields: () => ({[_sharedState]: dart.dynamic}),
-      getters: () => ({
-        [_flag]: dart.definiteFunctionType(core.bool, []),
-        [_count]: dart.definiteFunctionType(core.int, [])
-      }),
-      setters: () => ({
-        [_flag]: dart.definiteFunctionType(dart.void, [core.bool]),
-        [_count]: dart.definiteFunctionType(dart.void, [core.int])
-      })
-    });
-    return _StateStreamSubscription;
-  });
-  async._StateStreamSubscription = _StateStreamSubscription();
-  async._TakeWhileStream$ = dart.generic(T => {
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _TakeWhileStream extends async._ForwardingStream$(T, T) {
-      new(source, test) {
-        this[_test] = test;
-        super.new(source);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let satisfies = null;
-        try {
-          satisfies = this[_test](inputEvent);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async._addErrorWithReplacement(sink, e, s);
-          sink[_close$]();
-          return;
-        }
-
-        if (dart.test(satisfies)) {
-          sink[_add$](inputEvent);
-        } else {
-          sink[_close$]();
-        }
-      }
-    }
-    dart.setSignature(_TakeWhileStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._TakeWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
-      fields: () => ({[_test]: _PredicateOfT()})
-    });
-    return _TakeWhileStream;
-  });
-  async._TakeWhileStream = _TakeWhileStream();
-  async._SkipStream$ = dart.generic(T => {
-    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _SkipStream extends async._ForwardingStream$(T, T) {
-      new(source, count) {
-        this[_count] = count;
-        super.new(source);
-        if (!(typeof count == 'number') || dart.notNull(count) < 0) dart.throw(new core.ArgumentError(count));
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let subscription = _StateStreamSubscriptionOfT()._check(sink);
-        let count = subscription[_count];
-        if (dart.notNull(count) > 0) {
-          subscription[_count] = dart.notNull(count) - 1;
-          return;
-        }
-        sink[_add$](inputEvent);
-      }
-    }
-    dart.setSignature(_SkipStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._SkipStream$(T), [StreamOfT(), core.int])}),
-      fields: () => ({[_count]: core.int})
-    });
-    return _SkipStream;
-  });
-  async._SkipStream = _SkipStream();
-  async._SkipWhileStream$ = dart.generic(T => {
-    let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _SkipWhileStream extends async._ForwardingStream$(T, T) {
-      new(source, test) {
-        this[_test] = test;
-        super.new(source);
-      }
-      [_createSubscription](onData, onError, onDone, cancelOnError) {
-        return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, false);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        let subscription = _StateStreamSubscriptionOfT()._check(sink);
-        let hasFailed = subscription[_flag];
-        if (dart.test(hasFailed)) {
-          sink[_add$](inputEvent);
-          return;
-        }
-        let satisfies = null;
-        try {
-          satisfies = this[_test](inputEvent);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          async._addErrorWithReplacement(sink, e, s);
-          subscription[_flag] = true;
-          return;
-        }
-
-        if (!dart.test(satisfies)) {
-          subscription[_flag] = true;
-          sink[_add$](inputEvent);
-        }
-      }
-    }
-    dart.setSignature(_SkipWhileStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._SkipWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
-      fields: () => ({[_test]: _PredicateOfT()})
-    });
-    return _SkipWhileStream;
-  });
-  async._SkipWhileStream = _SkipWhileStream();
-  async._Equality$ = dart.generic(T => {
-    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [T, T]));
-    return _Equality;
-  });
-  async._Equality = _Equality();
-  const _equals = Symbol('_equals');
-  async._DistinctStream$ = dart.generic(T => {
-    let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
-    let _EqualityOfT = () => (_EqualityOfT = dart.constFn(async._Equality$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class _DistinctStream extends async._ForwardingStream$(T, T) {
-      new(source, equals) {
-        this[_previous$] = async._DistinctStream._SENTINEL;
-        this[_equals] = equals;
-        super.new(source);
-      }
-      [_handleData](inputEvent, sink) {
-        T._check(inputEvent);
-        _EventSinkOfT()._check(sink);
-        if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
-          this[_previous$] = inputEvent;
-          return sink[_add$](inputEvent);
-        } else {
-          let isEqual = null;
-          try {
-            if (this[_equals] == null) {
-              isEqual = dart.equals(this[_previous$], inputEvent);
-            } else {
-              isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
-            }
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            async._addErrorWithReplacement(sink, e, s);
-            return null;
-          }
-
-          if (!dart.test(isEqual)) {
-            sink[_add$](inputEvent);
-            this[_previous$] = inputEvent;
-          }
-        }
-      }
-    }
-    dart.setSignature(_DistinctStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
-      fields: () => ({
-        [_equals]: _EqualityOfT(),
-        [_previous$]: core.Object
-      }),
-      sfields: () => ({_SENTINEL: core.Object})
-    });
-    return _DistinctStream;
-  });
-  async._DistinctStream = _DistinctStream();
-  dart.defineLazy(async._DistinctStream, {
-    get _SENTINEL() {
-      return new core.Object();
-    },
-    set _SENTINEL(_) {}
-  });
-  async._EventSinkWrapper$ = dart.generic(T => {
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    class _EventSinkWrapper extends core.Object {
-      new(sink) {
-        this[_sink] = sink;
-      }
-      add(data) {
-        T._check(data);
-        this[_sink][_add$](data);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_sink][_addError](error, stackTrace);
-      }
-      close() {
-        this[_sink][_close$]();
-      }
-    }
-    dart.addTypeTests(_EventSinkWrapper);
-    _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
-    dart.setSignature(_EventSinkWrapper, {
-      constructors: () => ({new: dart.definiteFunctionType(async._EventSinkWrapper$(T), [async._EventSink])}),
-      fields: () => ({[_sink]: async._EventSink}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _EventSinkWrapper;
-  });
-  async._EventSinkWrapper = _EventSinkWrapper();
-  const _transformerSink = Symbol('_transformerSink');
-  const _isSubscribed = Symbol('_isSubscribed');
-  async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
-    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
-    let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
-    let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
-      new(source, mapper, onData, onError, onDone, cancelOnError) {
-        this[_transformerSink] = null;
-        this[_subscription] = null;
-        super.new(onData, onError, onDone, cancelOnError);
-        let eventSink = new (_EventSinkWrapperOfT())(this);
-        this[_transformerSink] = mapper(eventSink);
-        this[_subscription] = source.listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
-      }
-      get [_isSubscribed]() {
-        return this[_subscription] != null;
-      }
-      [_add$](data) {
-        T._check(data);
-        if (dart.test(this[_isClosed$])) {
-          dart.throw(new core.StateError("Stream is already closed"));
-        }
-        super[_add$](data);
-      }
-      [_addError](error, stackTrace) {
-        if (dart.test(this[_isClosed$])) {
-          dart.throw(new core.StateError("Stream is already closed"));
-        }
-        super[_addError](error, stackTrace);
-      }
-      [_close$]() {
-        if (dart.test(this[_isClosed$])) {
-          dart.throw(new core.StateError("Stream is already closed"));
-        }
-        super[_close$]();
-      }
-      [_onPause]() {
-        if (dart.test(this[_isSubscribed])) this[_subscription].pause();
-      }
-      [_onResume]() {
-        if (dart.test(this[_isSubscribed])) this[_subscription].resume();
-      }
-      [_onCancel]() {
-        if (dart.test(this[_isSubscribed])) {
-          let subscription = this[_subscription];
-          this[_subscription] = null;
-          subscription.cancel();
-        }
-        return null;
-      }
-      [_handleData](data) {
-        S._check(data);
-        try {
-          this[_transformerSink].add(data);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          this[_addError](e, s);
-        }
-
-      }
-      [_handleError](error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        try {
-          this[_transformerSink].addError(error, core.StackTrace._check(stackTrace));
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          if (core.identical(e, error)) {
-            this[_addError](error, core.StackTrace._check(stackTrace));
-          } else {
-            this[_addError](e, s);
-          }
-        }
-
-      }
-      [_handleDone]() {
-        try {
-          this[_subscription] = null;
-          this[_transformerSink].close();
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          this[_addError](e, s);
-        }
-
-      }
-    }
-    dart.setSignature(_SinkTransformerStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(async._SinkTransformerStreamSubscription$(S, T), [StreamOfS(), _SinkMapperOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-      fields: () => ({
-        [_transformerSink]: EventSinkOfS(),
-        [_subscription]: StreamSubscriptionOfS()
-      }),
-      getters: () => ({[_isSubscribed]: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        [_handleData]: dart.definiteFunctionType(dart.void, [S]),
-        [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic]),
-        [_handleDone]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _SinkTransformerStreamSubscription;
-  });
-  async._SinkTransformerStreamSubscription = _SinkTransformerStreamSubscription();
-  async._SinkMapper$ = dart.generic((S, T) => {
-    const _SinkMapper = dart.typedef('_SinkMapper', () => dart.functionType(async.EventSink$(S), [async.EventSink$(T)]));
-    return _SinkMapper;
-  });
-  async._SinkMapper = _SinkMapper();
-  const _sinkMapper = Symbol('_sinkMapper');
-  async._StreamSinkTransformer$ = dart.generic((S, T) => {
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
-    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
-    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
-    class _StreamSinkTransformer extends core.Object {
-      new(sinkMapper) {
-        this[_sinkMapper] = sinkMapper;
-      }
-      bind(stream) {
-        StreamOfS()._check(stream);
-        return new (_BoundSinkStreamOfS$T())(stream, this[_sinkMapper]);
-      }
-    }
-    dart.addTypeTests(_StreamSinkTransformer);
-    _StreamSinkTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
-    dart.setSignature(_StreamSinkTransformer, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkTransformer$(S, T), [_SinkMapperOfS$T()])}),
-      fields: () => ({[_sinkMapper]: _SinkMapperOfS$T()}),
-      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
-    });
-    return _StreamSinkTransformer;
-  });
-  async._StreamSinkTransformer = _StreamSinkTransformer();
-  async._BoundSinkStream$ = dart.generic((S, T) => {
-    let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
-    let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _BoundSinkStream extends async.Stream$(T) {
-      get isBroadcast() {
-        return this[_stream].isBroadcast;
-      }
-      new(stream, sinkMapper) {
-        this[_stream] = stream;
-        this[_sinkMapper] = sinkMapper;
-        super.new();
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        cancelOnError = core.identical(true, cancelOnError);
-        let subscription = new (_SinkTransformerStreamSubscriptionOfS$T())(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
-        return subscription;
-      }
-    }
-    dart.setSignature(_BoundSinkStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BoundSinkStream$(S, T), [StreamOfS(), _SinkMapperOfS$T()])}),
-      fields: () => ({
-        [_sinkMapper]: _SinkMapperOfS$T(),
-        [_stream]: StreamOfS()
-      }),
-      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-    });
-    return _BoundSinkStream;
-  });
-  async._BoundSinkStream = _BoundSinkStream();
-  async._TransformDataHandler$ = dart.generic((S, T) => {
-    const _TransformDataHandler = dart.typedef('_TransformDataHandler', () => dart.functionType(dart.void, [S, async.EventSink$(T)]));
-    return _TransformDataHandler;
-  });
-  async._TransformDataHandler = _TransformDataHandler();
-  async._TransformErrorHandler$ = dart.generic(T => {
-    const _TransformErrorHandler = dart.typedef('_TransformErrorHandler', () => dart.functionType(dart.void, [core.Object, core.StackTrace, async.EventSink$(T)]));
-    return _TransformErrorHandler;
-  });
-  async._TransformErrorHandler = _TransformErrorHandler();
-  async._TransformDoneHandler$ = dart.generic(T => {
-    const _TransformDoneHandler = dart.typedef('_TransformDoneHandler', () => dart.functionType(dart.void, [async.EventSink$(T)]));
-    return _TransformDoneHandler;
-  });
-  async._TransformDoneHandler = _TransformDoneHandler();
-  async._HandlerEventSink$ = dart.generic((S, T) => {
-    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
-    let _TransformDataHandlerOfS$T = () => (_TransformDataHandlerOfS$T = dart.constFn(async._TransformDataHandler$(S, T)))();
-    let _TransformErrorHandlerOfT = () => (_TransformErrorHandlerOfT = dart.constFn(async._TransformErrorHandler$(T)))();
-    let _TransformDoneHandlerOfT = () => (_TransformDoneHandlerOfT = dart.constFn(async._TransformDoneHandler$(T)))();
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    class _HandlerEventSink extends core.Object {
-      new(handleData, handleError, handleDone, sink) {
-        this[_handleData] = handleData;
-        this[_handleError] = handleError;
-        this[_handleDone] = handleDone;
-        this[_sink] = sink;
-      }
-      add(data) {
-        S._check(data);
-        this[_handleData](data, this[_sink]);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_handleError](error, stackTrace, this[_sink]);
-      }
-      close() {
-        this[_handleDone](this[_sink]);
-      }
-    }
-    dart.addTypeTests(_HandlerEventSink);
-    _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
-    dart.setSignature(_HandlerEventSink, {
-      constructors: () => ({new: dart.definiteFunctionType(async._HandlerEventSink$(S, T), [_TransformDataHandlerOfS$T(), _TransformErrorHandlerOfT(), _TransformDoneHandlerOfT(), EventSinkOfT()])}),
-      fields: () => ({
-        [_handleData]: _TransformDataHandlerOfS$T(),
-        [_handleError]: _TransformErrorHandlerOfT(),
-        [_handleDone]: _TransformDoneHandlerOfT(),
-        [_sink]: EventSinkOfT()
-      }),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [S]),
-        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _HandlerEventSink;
-  });
-  async._HandlerEventSink = _HandlerEventSink();
-  async._StreamHandlerTransformer$ = dart.generic((S, T) => {
-    let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
-    let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
-    let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.definiteFunctionType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
-    class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
-      new(opts) {
-        let handleData = opts && 'handleData' in opts ? opts.handleData : null;
-        let handleError = opts && 'handleError' in opts ? opts.handleError : null;
-        let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
-        super.new(dart.fn(outputSink => {
-          if (handleData == null) handleData = async._StreamHandlerTransformer._defaultHandleData;
-          if (handleError == null) handleError = async._StreamHandlerTransformer._defaultHandleError;
-          if (handleDone == null) handleDone = async._StreamHandlerTransformer._defaultHandleDone;
-          return new (_HandlerEventSinkOfS$T())(handleData, handleError, handleDone, outputSink);
-        }, EventSinkOfTTo_HandlerEventSinkOfS$T()));
-      }
-      bind(stream) {
-        StreamOfS()._check(stream);
-        return super.bind(stream);
-      }
-      static _defaultHandleData(data, sink) {
-        sink.add(data);
-      }
-      static _defaultHandleError(error, stackTrace, sink) {
-        sink.addError(error, stackTrace);
-      }
-      static _defaultHandleDone(sink) {
-        sink.close();
-      }
-    }
-    dart.setSignature(_StreamHandlerTransformer, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamHandlerTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})}),
-      statics: () => ({
-        _defaultHandleData: dart.definiteFunctionType(dart.void, [dart.dynamic, async.EventSink]),
-        _defaultHandleError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, async.EventSink]),
-        _defaultHandleDone: dart.definiteFunctionType(dart.void, [async.EventSink])
-      }),
-      names: ['_defaultHandleData', '_defaultHandleError', '_defaultHandleDone']
-    });
-    return _StreamHandlerTransformer;
-  });
-  async._StreamHandlerTransformer = _StreamHandlerTransformer();
-  async._SubscriptionTransformer$ = dart.generic((S, T) => {
-    const _SubscriptionTransformer = dart.typedef('_SubscriptionTransformer', () => dart.functionType(async.StreamSubscription$(T), [async.Stream$(S), core.bool]));
-    return _SubscriptionTransformer;
-  });
-  async._SubscriptionTransformer = _SubscriptionTransformer();
-  const _transformer = Symbol('_transformer');
-  async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
-    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
-    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
-    class _StreamSubscriptionTransformer extends core.Object {
-      new(transformer) {
-        this[_transformer] = transformer;
-      }
-      bind(stream) {
-        StreamOfS()._check(stream);
-        return new (_BoundSubscriptionStreamOfS$T())(stream, this[_transformer]);
-      }
-    }
-    dart.addTypeTests(_StreamSubscriptionTransformer);
-    _StreamSubscriptionTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
-    dart.setSignature(_StreamSubscriptionTransformer, {
-      constructors: () => ({new: dart.definiteFunctionType(async._StreamSubscriptionTransformer$(S, T), [_SubscriptionTransformerOfS$T()])}),
-      fields: () => ({[_transformer]: _SubscriptionTransformerOfS$T()}),
-      methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
-    });
-    return _StreamSubscriptionTransformer;
-  });
-  async._StreamSubscriptionTransformer = _StreamSubscriptionTransformer();
-  async._BoundSubscriptionStream$ = dart.generic((S, T) => {
-    let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _BoundSubscriptionStream extends async.Stream$(T) {
-      new(stream, transformer) {
-        this[_stream] = stream;
-        this[_transformer] = transformer;
-        super.new();
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        cancelOnError = core.identical(true, cancelOnError);
-        let result = this[_transformer](this[_stream], cancelOnError);
-        result.onData(onData);
-        result.onError(onError);
-        result.onDone(onDone);
-        return result;
-      }
-    }
-    dart.setSignature(_BoundSubscriptionStream, {
-      constructors: () => ({new: dart.definiteFunctionType(async._BoundSubscriptionStream$(S, T), [StreamOfS(), _SubscriptionTransformerOfS$T()])}),
-      fields: () => ({
-        [_transformer]: _SubscriptionTransformerOfS$T(),
-        [_stream]: StreamOfS()
-      }),
-      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-    });
-    return _BoundSubscriptionStream;
-  });
-  async._BoundSubscriptionStream = _BoundSubscriptionStream();
-  async.Timer = class Timer extends core.Object {
-    static new(duration, callback) {
-      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
-        return async.Zone.current.createTimer(duration, callback);
-      }
-      return async.Zone.current.createTimer(duration, async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
-    }
-    static periodic(duration, callback) {
-      if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
-        return async.Zone.current.createPeriodicTimer(duration, callback);
-      }
-      let boundCallback = async.Zone.current.bindUnaryCallback(dart.dynamic, async.Timer)(callback, {runGuarded: true});
-      return async.Zone.current.createPeriodicTimer(duration, boundCallback);
-    }
-    static run(callback) {
-      async.Timer.new(core.Duration.ZERO, callback);
-    }
-    static _createTimer(duration, callback) {
-      let milliseconds = duration.inMilliseconds;
-      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
-      return new _isolate_helper.TimerImpl(milliseconds, callback);
-    }
-    static _createPeriodicTimer(duration, callback) {
-      let milliseconds = duration.inMilliseconds;
-      if (dart.notNull(milliseconds) < 0) milliseconds = 0;
-      return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
-    }
-  };
-  dart.setSignature(async.Timer, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
-      periodic: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
-    }),
-    statics: () => ({
-      run: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      _createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
-      _createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
-    }),
-    names: ['run', '_createTimer', '_createPeriodicTimer']
-  });
-  async.ZoneCallback$ = dart.generic(R => {
-    const ZoneCallback = dart.typedef('ZoneCallback', () => dart.functionType(R, []));
-    return ZoneCallback;
-  });
-  async.ZoneCallback = ZoneCallback();
-  async.ZoneUnaryCallback$ = dart.generic((R, T) => {
-    const ZoneUnaryCallback = dart.typedef('ZoneUnaryCallback', () => dart.functionType(R, [T]));
-    return ZoneUnaryCallback;
-  });
-  async.ZoneUnaryCallback = ZoneUnaryCallback();
-  async.ZoneBinaryCallback$ = dart.generic((R, T1, T2) => {
-    const ZoneBinaryCallback = dart.typedef('ZoneBinaryCallback', () => dart.functionType(R, [T1, T2]));
-    return ZoneBinaryCallback;
-  });
-  async.ZoneBinaryCallback = ZoneBinaryCallback();
-  async.HandleUncaughtErrorHandler$ = dart.generic(R => {
-    const HandleUncaughtErrorHandler = dart.typedef('HandleUncaughtErrorHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]));
-    return HandleUncaughtErrorHandler;
-  });
-  async.HandleUncaughtErrorHandler = HandleUncaughtErrorHandler();
-  async.RunHandler$ = dart.generic(R => {
-    const RunHandler = dart.typedef('RunHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
-    return RunHandler;
-  });
-  async.RunHandler = RunHandler();
-  async.RunUnaryHandler$ = dart.generic((R, T) => {
-    const RunUnaryHandler = dart.typedef('RunUnaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]));
-    return RunUnaryHandler;
-  });
-  async.RunUnaryHandler = RunUnaryHandler();
-  async.RunBinaryHandler$ = dart.generic((R, T1, T2) => {
-    const RunBinaryHandler = dart.typedef('RunBinaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]));
-    return RunBinaryHandler;
-  });
-  async.RunBinaryHandler = RunBinaryHandler();
-  async.RegisterCallbackHandler$ = dart.generic(R => {
-    const RegisterCallbackHandler = dart.typedef('RegisterCallbackHandler', () => dart.functionType(async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
-    return RegisterCallbackHandler;
-  });
-  async.RegisterCallbackHandler = RegisterCallbackHandler();
-  async.RegisterUnaryCallbackHandler$ = dart.generic((R, T) => {
-    const RegisterUnaryCallbackHandler = dart.typedef('RegisterUnaryCallbackHandler', () => dart.functionType(async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]));
-    return RegisterUnaryCallbackHandler;
-  });
-  async.RegisterUnaryCallbackHandler = RegisterUnaryCallbackHandler();
-  async.RegisterBinaryCallbackHandler$ = dart.generic((R, T1, T2) => {
-    const RegisterBinaryCallbackHandler = dart.typedef('RegisterBinaryCallbackHandler', () => dart.functionType(async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]));
-    return RegisterBinaryCallbackHandler;
-  });
-  async.RegisterBinaryCallbackHandler = RegisterBinaryCallbackHandler();
-  async.ErrorCallbackHandler = dart.typedef('ErrorCallbackHandler', () => dart.functionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace]));
-  async.ScheduleMicrotaskHandler = dart.typedef('ScheduleMicrotaskHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()]));
-  async.CreateTimerHandler = dart.typedef('CreateTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()]));
-  async.CreatePeriodicTimerHandler = dart.typedef('CreatePeriodicTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()]));
-  async.PrintHandler = dart.typedef('PrintHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String]));
-  async.ForkHandler = dart.typedef('ForkHandler', () => dart.functionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map]));
-  async._ZoneFunction$ = dart.generic(T => {
-    class _ZoneFunction extends core.Object {
-      new(zone, func) {
-        this.zone = zone;
-        this.function = func;
-      }
-    }
-    dart.addTypeTests(_ZoneFunction);
-    dart.setSignature(_ZoneFunction, {
-      constructors: () => ({new: dart.definiteFunctionType(async._ZoneFunction$(T), [async._Zone, T])}),
-      fields: () => ({
-        zone: async._Zone,
-        function: T
-      })
-    });
-    return _ZoneFunction;
-  });
-  async._ZoneFunction = _ZoneFunction();
-  async.ZoneSpecification = class ZoneSpecification extends core.Object {
-    static new(opts) {
-      return new async._ZoneSpecification(opts);
-    }
-    static from(other, opts) {
-      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
-      let run = opts && 'run' in opts ? opts.run : null;
-      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
-      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
-      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
-      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
-      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
-      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
-      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
-      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
-      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
-      let print = opts && 'print' in opts ? opts.print : null;
-      let fork = opts && 'fork' in opts ? opts.fork : null;
-      return async.ZoneSpecification.new({handleUncaughtError: (handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError), run: (run != null ? run : other.run), runUnary: (runUnary != null ? runUnary : other.runUnary), runBinary: (runBinary != null ? runBinary : other.runBinary), registerCallback: (registerCallback != null ? registerCallback : other.registerCallback), registerUnaryCallback: (registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback), registerBinaryCallback: (registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback), errorCallback: (errorCallback != null ? errorCallback : other.errorCallback), scheduleMicrotask: (scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask), createTimer: (createTimer != null ? createTimer : other.createTimer), createPeriodicTimer: (createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer), print: (print != null ? print : other.print), fork: (fork != null ? fork : other.fork)});
-    }
-  };
-  dart.setSignature(async.ZoneSpecification, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(async.ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler}),
-      from: dart.definiteFunctionType(async.ZoneSpecification, [async.ZoneSpecification], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})
-    })
-  });
-  async._ZoneSpecification = class _ZoneSpecification extends core.Object {
-    new(opts) {
-      let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
-      let run = opts && 'run' in opts ? opts.run : null;
-      let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
-      let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
-      let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
-      let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
-      let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
-      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
-      let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
-      let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
-      let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
-      let print = opts && 'print' in opts ? opts.print : null;
-      let fork = opts && 'fork' in opts ? opts.fork : null;
-      this.handleUncaughtError = handleUncaughtError;
-      this.run = run;
-      this.runUnary = runUnary;
-      this.runBinary = runBinary;
-      this.registerCallback = registerCallback;
-      this.registerUnaryCallback = registerUnaryCallback;
-      this.registerBinaryCallback = registerBinaryCallback;
-      this.errorCallback = errorCallback;
-      this.scheduleMicrotask = scheduleMicrotask;
-      this.createTimer = createTimer;
-      this.createPeriodicTimer = createPeriodicTimer;
-      this.print = print;
-      this.fork = fork;
-    }
-  };
-  async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
-  dart.setSignature(async._ZoneSpecification, {
-    constructors: () => ({new: dart.definiteFunctionType(async._ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})}),
-    fields: () => ({
-      handleUncaughtError: async.HandleUncaughtErrorHandler,
-      run: async.RunHandler,
-      runUnary: async.RunUnaryHandler,
-      runBinary: async.RunBinaryHandler,
-      registerCallback: async.RegisterCallbackHandler,
-      registerUnaryCallback: async.RegisterUnaryCallbackHandler,
-      registerBinaryCallback: async.RegisterBinaryCallbackHandler,
-      errorCallback: async.ErrorCallbackHandler,
-      scheduleMicrotask: async.ScheduleMicrotaskHandler,
-      createTimer: async.CreateTimerHandler,
-      createPeriodicTimer: async.CreatePeriodicTimerHandler,
-      print: async.PrintHandler,
-      fork: async.ForkHandler
-    })
-  });
-  async.ZoneDelegate = class ZoneDelegate extends core.Object {};
-  async.Zone = class Zone extends core.Object {
-    _() {
-    }
-    static get current() {
-      return async.Zone._current;
-    }
-    static _enter(zone) {
-      dart.assert(zone != null);
-      dart.assert(!core.identical(zone, async.Zone._current));
-      let previous = async.Zone._current;
-      async.Zone._current = zone;
-      return previous;
-    }
-    static _leave(previous) {
-      dart.assert(previous != null);
-      async.Zone._current = previous;
-    }
-  };
-  dart.defineNamedConstructor(async.Zone, '_');
-  dart.setSignature(async.Zone, {
-    constructors: () => ({_: dart.definiteFunctionType(async.Zone, [])}),
-    sfields: () => ({
-      ROOT: async.Zone,
-      _current: async.Zone
-    }),
-    sgetters: () => ({current: dart.definiteFunctionType(async.Zone, [])}),
-    statics: () => ({
-      _enter: dart.definiteFunctionType(async.Zone, [async.Zone]),
-      _leave: dart.definiteFunctionType(dart.void, [async.Zone])
-    }),
-    names: ['_enter', '_leave']
-  });
-  dart.defineLazy(async.Zone, {
-    get ROOT() {
-      return async._ROOT_ZONE;
-    },
-    get _current() {
-      return async._ROOT_ZONE;
-    },
-    set _current(_) {}
-  });
-  const _delegate = Symbol('_delegate');
-  async._parentDelegate = function(zone) {
-    if (zone.parent == null) return null;
-    return zone.parent[_delegate];
-  };
-  dart.lazyFn(async._parentDelegate, () => _ZoneToZoneDelegate());
-  const _delegationTarget = Symbol('_delegationTarget');
-  const _handleUncaughtError = Symbol('_handleUncaughtError');
-  const _run = Symbol('_run');
-  const _runUnary = Symbol('_runUnary');
-  const _runBinary = Symbol('_runBinary');
-  const _registerCallback = Symbol('_registerCallback');
-  const _registerUnaryCallback = Symbol('_registerUnaryCallback');
-  const _registerBinaryCallback = Symbol('_registerBinaryCallback');
-  const _errorCallback = Symbol('_errorCallback');
-  const _createTimer = Symbol('_createTimer');
-  const _createPeriodicTimer = Symbol('_createPeriodicTimer');
-  const _print = Symbol('_print');
-  const _fork = Symbol('_fork');
-  async._ZoneDelegate = class _ZoneDelegate extends core.Object {
-    new(delegationTarget) {
-      this[_delegationTarget] = delegationTarget;
-    }
-    handleUncaughtError(R) {
-      return (zone, error, stackTrace) => {
-        let implementation = this[_delegationTarget][_handleUncaughtError];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, error, stackTrace));
-      };
-    }
-    run(R) {
-      return (zone, f) => {
-        let implementation = this[_delegationTarget][_run];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return R.as(handler(implZone, async._parentDelegate(implZone), zone, f));
-      };
-    }
-    runUnary(R, T) {
-      return (zone, f, arg) => {
-        let implementation = this[_delegationTarget][_runUnary];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg));
-      };
-    }
-    runBinary(R, T1, T2) {
-      return (zone, f, arg1, arg2) => {
-        let implementation = this[_delegationTarget][_runBinary];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2));
-      };
-    }
-    registerCallback(R) {
-      return (zone, f) => {
-        let implementation = this[_delegationTarget][_registerCallback];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return async.ZoneCallback$(R).as(handler(implZone, async._parentDelegate(implZone), zone, f));
-      };
-    }
-    registerUnaryCallback(R, T) {
-      return (zone, f) => {
-        let implementation = this[_delegationTarget][_registerUnaryCallback];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return async.ZoneUnaryCallback$(R, T).as(handler(implZone, async._parentDelegate(implZone), zone, f));
-      };
-    }
-    registerBinaryCallback(R, T1, T2) {
-      return (zone, f) => {
-        let implementation = this[_delegationTarget][_registerBinaryCallback];
-        let implZone = implementation.zone;
-        let handler = implementation.function;
-        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implZone, async._parentDelegate(implZone), zone, f));
-      };
-    }
-    errorCallback(zone, error, stackTrace) {
-      let implementation = this[_delegationTarget][_errorCallback];
-      let implZone = implementation.zone;
-      if (core.identical(implZone, async._ROOT_ZONE)) return null;
-      let handler = implementation.function;
-      return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
-    }
-    scheduleMicrotask(zone, f) {
-      let implementation = this[_delegationTarget][_scheduleMicrotask];
-      let implZone = implementation.zone;
-      let handler = implementation.function;
-      handler(implZone, async._parentDelegate(implZone), zone, f);
-    }
-    createTimer(zone, duration, f) {
-      let implementation = this[_delegationTarget][_createTimer];
-      let implZone = implementation.zone;
-      let handler = implementation.function;
-      return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
-    }
-    createPeriodicTimer(zone, period, f) {
-      let implementation = this[_delegationTarget][_createPeriodicTimer];
-      let implZone = implementation.zone;
-      let handler = implementation.function;
-      return handler(implZone, async._parentDelegate(implZone), zone, period, f);
-    }
-    print(zone, line) {
-      let implementation = this[_delegationTarget][_print];
-      let implZone = implementation.zone;
-      let handler = implementation.function;
-      handler(implZone, async._parentDelegate(implZone), zone, line);
-    }
-    fork(zone, specification, zoneValues) {
-      let implementation = this[_delegationTarget][_fork];
-      let implZone = implementation.zone;
-      let handler = implementation.function;
-      return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
-    }
-  };
-  async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
-  dart.setSignature(async._ZoneDelegate, {
-    constructors: () => ({new: dart.definiteFunctionType(async._ZoneDelegate, [async._Zone])}),
-    fields: () => ({[_delegationTarget]: async._Zone}),
-    methods: () => ({
-      handleUncaughtError: dart.definiteFunctionType(R => [R, [async.Zone, dart.dynamic, core.StackTrace]]),
-      run: dart.definiteFunctionType(R => [R, [async.Zone, dart.functionType(R, [])]]),
-      runUnary: dart.definiteFunctionType((R, T) => [R, [async.Zone, dart.functionType(R, [T]), T]]),
-      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, dart.functionType(R, [T1, T2]), T1, T2]]),
-      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, dart.functionType(R, [])]]),
-      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, dart.functionType(R, [T])]]),
-      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, dart.functionType(R, [T1, T2])]]),
-      errorCallback: dart.definiteFunctionType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
-      scheduleMicrotask: dart.definiteFunctionType(dart.void, [async.Zone, VoidTodynamic()]),
-      createTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, VoidTovoid()]),
-      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, TimerTovoid()]),
-      print: dart.definiteFunctionType(dart.void, [async.Zone, core.String]),
-      fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
-    })
-  });
-  const _map$ = Symbol('_map');
-  async._Zone = class _Zone extends core.Object {
-    new() {
-    }
-    inSameErrorZone(otherZone) {
-      return core.identical(this, otherZone) || core.identical(this.errorZone, otherZone.errorZone);
-    }
-  };
-  async._Zone[dart.implements] = () => [async.Zone];
-  dart.setSignature(async._Zone, {
-    constructors: () => ({new: dart.definiteFunctionType(async._Zone, [])}),
-    methods: () => ({inSameErrorZone: dart.definiteFunctionType(core.bool, [async.Zone])})
-  });
-  const _delegateCache = Symbol('_delegateCache');
-  async._CustomZone = class _CustomZone extends async._Zone {
-    get [_delegate]() {
-      if (this[_delegateCache] != null) return this[_delegateCache];
-      this[_delegateCache] = new async._ZoneDelegate(this);
-      return this[_delegateCache];
-    }
-    new(parent, specification, map) {
-      this.parent = parent;
-      this[_map$] = map;
-      this[_run] = null;
-      this[_runUnary] = null;
-      this[_runBinary] = null;
-      this[_registerCallback] = null;
-      this[_registerUnaryCallback] = null;
-      this[_registerBinaryCallback] = null;
-      this[_errorCallback] = null;
-      this[_scheduleMicrotask] = null;
-      this[_createTimer] = null;
-      this[_createPeriodicTimer] = null;
-      this[_print] = null;
-      this[_fork] = null;
-      this[_handleUncaughtError] = null;
-      this[_delegateCache] = null;
-      super.new();
-      this[_run] = specification.run != null ? new (_ZoneFunctionOfRunHandler())(this, specification.run) : this.parent[_run];
-      this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfRunUnaryHandler())(this, specification.runUnary) : this.parent[_runUnary];
-      this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfRunBinaryHandler())(this, specification.runBinary) : this.parent[_runBinary];
-      this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfRegisterCallbackHandler())(this, specification.registerCallback) : this.parent[_registerCallback];
-      this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
-      this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
-      this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfErrorCallbackHandler())(this, specification.errorCallback) : this.parent[_errorCallback];
-      this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfScheduleMicrotaskHandler())(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
-      this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfCreateTimerHandler())(this, specification.createTimer) : this.parent[_createTimer];
-      this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfCreatePeriodicTimerHandler())(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
-      this[_print] = specification.print != null ? new (_ZoneFunctionOfPrintHandler())(this, specification.print) : this.parent[_print];
-      this[_fork] = specification.fork != null ? new (_ZoneFunctionOfForkHandler())(this, specification.fork) : this.parent[_fork];
-      this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfHandleUncaughtErrorHandler())(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
-    }
-    get errorZone() {
-      return this[_handleUncaughtError].zone;
-    }
-    runGuarded(R) {
-      return f => {
-        try {
-          return this.run(R)(f);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    runUnaryGuarded(R, T) {
-      return (f, arg) => {
-        try {
-          return this.runUnary(R, T)(f, arg);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    runBinaryGuarded(R, T1, T2) {
-      return (f, arg1, arg2) => {
-        try {
-          return this.runBinary(R, T1, T2)(f, arg1, arg2);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    bindCallback(R) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        let registered = this.registerCallback(R)(f);
-        if (dart.test(runGuarded)) {
-          return dart.fn(() => this.runGuarded(R)(registered), dart.definiteFunctionType(R, []));
-        } else {
-          return dart.fn(() => this.run(R)(registered), dart.definiteFunctionType(R, []));
-        }
-      };
-    }
-    bindUnaryCallback(R, T) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        let registered = this.registerUnaryCallback(R, T)(f);
-        if (dart.test(runGuarded)) {
-          return dart.fn(arg => this.runUnaryGuarded(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
-        } else {
-          return dart.fn(arg => this.runUnary(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
-        }
-      };
-    }
-    bindBinaryCallback(R, T1, T2) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        let registered = this.registerBinaryCallback(R, T1, T2)(f);
-        if (dart.test(runGuarded)) {
-          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
-        } else {
-          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
-        }
-      };
-    }
-    _get(key) {
-      let result = this[_map$][dartx._get](key);
-      if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
-      if (this.parent != null) {
-        let value = this.parent._get(key);
-        if (value != null) {
-          this[_map$][dartx._set](key, value);
-        }
-        return value;
-      }
-      dart.assert(dart.equals(this, async._ROOT_ZONE));
-      return null;
-    }
-    handleUncaughtError(R) {
-      return (error, stackTrace) => {
-        let implementation = this[_handleUncaughtError];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, error, stackTrace));
-      };
-    }
-    fork(opts) {
-      let specification = opts && 'specification' in opts ? opts.specification : null;
-      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
-      let implementation = this[_fork];
-      dart.assert(implementation != null);
-      let parentDelegate = async._parentDelegate(implementation.zone);
-      let handler = implementation.function;
-      return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
-    }
-    run(R) {
-      return f => {
-        let implementation = this[_run];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return R.as(handler(implementation.zone, parentDelegate, this, f));
-      };
-    }
-    runUnary(R, T) {
-      return (f, arg) => {
-        let implementation = this[_runUnary];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg));
-      };
-    }
-    runBinary(R, T1, T2) {
-      return (f, arg1, arg2) => {
-        let implementation = this[_runBinary];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg1, arg2));
-      };
-    }
-    registerCallback(R) {
-      return callback => {
-        let implementation = this[_registerCallback];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return async.ZoneCallback$(R).as(handler(implementation.zone, parentDelegate, this, callback));
-      };
-    }
-    registerUnaryCallback(R, T) {
-      return callback => {
-        let implementation = this[_registerUnaryCallback];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return async.ZoneUnaryCallback$(R, T).as(handler(implementation.zone, parentDelegate, this, callback));
-      };
-    }
-    registerBinaryCallback(R, T1, T2) {
-      return callback => {
-        let implementation = this[_registerBinaryCallback];
-        dart.assert(implementation != null);
-        let parentDelegate = async._parentDelegate(implementation.zone);
-        let handler = implementation.function;
-        return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implementation.zone, parentDelegate, this, callback));
-      };
-    }
-    errorCallback(error, stackTrace) {
-      let implementation = this[_errorCallback];
-      dart.assert(implementation != null);
-      let implementationZone = implementation.zone;
-      if (core.identical(implementationZone, async._ROOT_ZONE)) return null;
-      let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
-      let handler = implementation.function;
-      return handler(implementationZone, parentDelegate, this, error, stackTrace);
-    }
-    scheduleMicrotask(f) {
-      let implementation = this[_scheduleMicrotask];
-      dart.assert(implementation != null);
-      let parentDelegate = async._parentDelegate(implementation.zone);
-      let handler = implementation.function;
-      return handler(implementation.zone, parentDelegate, this, f);
-    }
-    createTimer(duration, f) {
-      let implementation = this[_createTimer];
-      dart.assert(implementation != null);
-      let parentDelegate = async._parentDelegate(implementation.zone);
-      let handler = implementation.function;
-      return handler(implementation.zone, parentDelegate, this, duration, f);
-    }
-    createPeriodicTimer(duration, f) {
-      let implementation = this[_createPeriodicTimer];
-      dart.assert(implementation != null);
-      let parentDelegate = async._parentDelegate(implementation.zone);
-      let handler = implementation.function;
-      return handler(implementation.zone, parentDelegate, this, duration, f);
-    }
-    print(line) {
-      let implementation = this[_print];
-      dart.assert(implementation != null);
-      let parentDelegate = async._parentDelegate(implementation.zone);
-      let handler = implementation.function;
-      return handler(implementation.zone, parentDelegate, this, line);
-    }
-  };
-  dart.setSignature(async._CustomZone, {
-    constructors: () => ({new: dart.definiteFunctionType(async._CustomZone, [async._Zone, async.ZoneSpecification, core.Map])}),
-    fields: () => ({
-      [_run]: _ZoneFunctionOfRunHandler(),
-      [_runUnary]: _ZoneFunctionOfRunUnaryHandler(),
-      [_runBinary]: _ZoneFunctionOfRunBinaryHandler(),
-      [_registerCallback]: _ZoneFunctionOfRegisterCallbackHandler(),
-      [_registerUnaryCallback]: _ZoneFunctionOfRegisterUnaryCallbackHandler(),
-      [_registerBinaryCallback]: _ZoneFunctionOfRegisterBinaryCallbackHandler(),
-      [_errorCallback]: _ZoneFunctionOfErrorCallbackHandler(),
-      [_scheduleMicrotask]: _ZoneFunctionOfScheduleMicrotaskHandler(),
-      [_createTimer]: _ZoneFunctionOfCreateTimerHandler(),
-      [_createPeriodicTimer]: _ZoneFunctionOfCreatePeriodicTimerHandler(),
-      [_print]: _ZoneFunctionOfPrintHandler(),
-      [_fork]: _ZoneFunctionOfForkHandler(),
-      [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
-      [_delegateCache]: async.ZoneDelegate,
-      parent: async._Zone,
-      [_map$]: core.Map
-    }),
-    getters: () => ({
-      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
-      errorZone: dart.definiteFunctionType(async.Zone, [])
-    }),
-    methods: () => ({
-      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
-      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
-      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
-      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
-      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
-      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
-      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
-      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
-      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
-      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
-      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
-      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
-      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
-      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
-      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
-      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
-      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
-      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
-      print: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  async._rootHandleUncaughtError = function(R) {
-    return (self, parent, zone, error, stackTrace) => {
-      async._schedulePriorityAsyncCallback(dart.fn(() => {
-        if (error == null) error = new core.NullThrownError();
-        if (stackTrace == null) dart.throw(error);
-        async._rethrow(error, stackTrace);
-      }, VoidToNull()));
-    };
-  };
-  dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
-  async._rethrow = function(error, stackTrace) {
-    error.stack = dart.toString(stackTrace);
-    throw error;
-  };
-  dart.lazyFn(async._rethrow, () => ObjectAndStackTraceTovoid());
-  async._rootRun = function(R) {
-    return (self, parent, zone, f) => {
-      if (dart.equals(async.Zone._current, zone)) return f();
-      let old = async.Zone._enter(zone);
-      try {
-        return f();
-      } finally {
-        async.Zone._leave(old);
-      }
-    };
-  };
-  dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
-  async._rootRunUnary = function(R, T) {
-    return (self, parent, zone, f, arg) => {
-      if (dart.equals(async.Zone._current, zone)) return f(arg);
-      let old = async.Zone._enter(zone);
-      try {
-        return f(arg);
-      } finally {
-        async.Zone._leave(old);
-      }
-    };
-  };
-  dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
-  async._rootRunBinary = function(R, T1, T2) {
-    return (self, parent, zone, f, arg1, arg2) => {
-      if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
-      let old = async.Zone._enter(zone);
-      try {
-        return f(arg1, arg2);
-      } finally {
-        async.Zone._leave(old);
-      }
-    };
-  };
-  dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
-  async._rootRegisterCallback = function(R) {
-    return (self, parent, zone, f) => {
-      return f;
-    };
-  };
-  dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR());
-  async._rootRegisterUnaryCallback = function(R, T) {
-    return (self, parent, zone, f) => {
-      return f;
-    };
-  };
-  dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T());
-  async._rootRegisterBinaryCallback = function(R, T1, T2) {
-    return (self, parent, zone, f) => {
-      return f;
-    };
-  };
-  dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2());
-  async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
-    return null;
-  };
-  dart.lazyFn(async._rootErrorCallback, () => ZoneAndZoneDelegateAndZone__ToAsyncError());
-  async._rootScheduleMicrotask = function(self, parent, zone, f) {
-    if (!core.identical(async._ROOT_ZONE, zone)) {
-      let hasErrorHandler = !dart.test(async._ROOT_ZONE.inSameErrorZone(zone));
-      f = zone.bindCallback(dart.dynamic)(f, {runGuarded: hasErrorHandler});
-      zone = async._ROOT_ZONE;
-    }
-    async._scheduleAsyncCallback(f);
-  };
-  dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid());
-  async._rootCreateTimer = function(self, parent, zone, duration, callback) {
-    if (!core.identical(async._ROOT_ZONE, zone)) {
-      callback = zone.bindCallback(dart.void)(callback);
-    }
-    return async.Timer._createTimer(duration, callback);
-  };
-  dart.lazyFn(async._rootCreateTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
-  async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
-    if (!core.identical(async._ROOT_ZONE, zone)) {
-      callback = zone.bindUnaryCallback(dart.dynamic, async.Timer)(callback);
-    }
-    return async.Timer._createPeriodicTimer(duration, callback);
-  };
-  dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
-  async._rootPrint = function(self, parent, zone, line) {
-    _internal.printToConsole(line);
-  };
-  dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
-  async._printToZone = function(line) {
-    async.Zone.current.print(line);
-  };
-  dart.lazyFn(async._printToZone, () => StringTovoid$());
-  let const$11;
-  async._rootFork = function(self, parent, zone, specification, zoneValues) {
-    _internal.printToZone = async._printToZone;
-    if (specification == null) {
-      specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
-    } else if (!async._ZoneSpecification.is(specification)) {
-      dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
-    }
-    let valueMap = null;
-    if (zoneValues == null) {
-      if (async._Zone.is(zone)) {
-        valueMap = zone[_map$];
-      } else {
-        valueMap = collection.HashMap.new();
-      }
-    } else {
-      valueMap = collection.HashMap.from(zoneValues);
-    }
-    return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
-  };
-  dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
-  let const$12;
-  let const$13;
-  let const$14;
-  let const$15;
-  let const$16;
-  let const$17;
-  let const$18;
-  let const$19;
-  let const$20;
-  let const$21;
-  let const$22;
-  let const$23;
-  let const$24;
-  async._RootZone = class _RootZone extends async._Zone {
-    new() {
-      super.new();
-    }
-    get [_run]() {
-      return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
-    }
-    get [_runUnary]() {
-      return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
-    }
-    get [_runBinary]() {
-      return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
-    }
-    get [_registerCallback]() {
-      return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
-    }
-    get [_registerUnaryCallback]() {
-      return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
-    }
-    get [_registerBinaryCallback]() {
-      return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
-    }
-    get [_errorCallback]() {
-      return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
-    }
-    get [_scheduleMicrotask]() {
-      return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
-    }
-    get [_createTimer]() {
-      return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
-    }
-    get [_createPeriodicTimer]() {
-      return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
-    }
-    get [_print]() {
-      return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
-    }
-    get [_fork]() {
-      return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
-    }
-    get [_handleUncaughtError]() {
-      return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
-    }
-    get parent() {
-      return null;
-    }
-    get [_map$]() {
-      return async._RootZone._rootMap;
-    }
-    get [_delegate]() {
-      if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
-      return async._RootZone._rootDelegate = new async._ZoneDelegate(this);
-    }
-    get errorZone() {
-      return this;
-    }
-    runGuarded(R) {
-      return f => {
-        try {
-          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
-            return f();
-          }
-          return async._rootRun(R)(null, null, this, f);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    runUnaryGuarded(R, T) {
-      return (f, arg) => {
-        try {
-          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
-            return f(arg);
-          }
-          return async._rootRunUnary(R, T)(null, null, this, f, arg);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    runBinaryGuarded(R, T1, T2) {
-      return (f, arg1, arg2) => {
-        try {
-          if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
-            return f(arg1, arg2);
-          }
-          return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          return this.handleUncaughtError(R)(e, s);
-        }
-
-      };
-    }
-    bindCallback(R) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        if (dart.test(runGuarded)) {
-          return dart.fn(() => this.runGuarded(R)(f), dart.definiteFunctionType(R, []));
-        } else {
-          return dart.fn(() => this.run(R)(f), dart.definiteFunctionType(R, []));
-        }
-      };
-    }
-    bindUnaryCallback(R, T) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        if (dart.test(runGuarded)) {
-          return dart.fn(arg => this.runUnaryGuarded(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
-        } else {
-          return dart.fn(arg => this.runUnary(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
-        }
-      };
-    }
-    bindBinaryCallback(R, T1, T2) {
-      return (f, opts) => {
-        let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
-        if (dart.test(runGuarded)) {
-          return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
-        } else {
-          return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
-        }
-      };
-    }
-    _get(key) {
-      return null;
-    }
-    handleUncaughtError(R) {
-      return (error, stackTrace) => {
-        return async._rootHandleUncaughtError(R)(null, null, this, error, stackTrace);
-      };
-    }
-    fork(opts) {
-      let specification = opts && 'specification' in opts ? opts.specification : null;
-      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
-      return async._rootFork(null, null, this, specification, zoneValues);
-    }
-    run(R) {
-      return f => {
-        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f();
-        return async._rootRun(R)(null, null, this, f);
-      };
-    }
-    runUnary(R, T) {
-      return (f, arg) => {
-        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg);
-        return async._rootRunUnary(R, T)(null, null, this, f, arg);
-      };
-    }
-    runBinary(R, T1, T2) {
-      return (f, arg1, arg2) => {
-        if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg1, arg2);
-        return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
-      };
-    }
-    registerCallback(R) {
-      return f => {
-        return f;
-      };
-    }
-    registerUnaryCallback(R, T) {
-      return f => {
-        return f;
-      };
-    }
-    registerBinaryCallback(R, T1, T2) {
-      return f => {
-        return f;
-      };
-    }
-    errorCallback(error, stackTrace) {
-      return null;
-    }
-    scheduleMicrotask(f) {
-      async._rootScheduleMicrotask(null, null, this, f);
-    }
-    createTimer(duration, f) {
-      return async.Timer._createTimer(duration, f);
-    }
-    createPeriodicTimer(duration, f) {
-      return async.Timer._createPeriodicTimer(duration, f);
-    }
-    print(line) {
-      _internal.printToConsole(line);
-    }
-  };
-  dart.setSignature(async._RootZone, {
-    constructors: () => ({new: dart.definiteFunctionType(async._RootZone, [])}),
-    getters: () => ({
-      [_run]: dart.definiteFunctionType(async._ZoneFunction$(async.RunHandler), []),
-      [_runUnary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunUnaryHandler), []),
-      [_runBinary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunBinaryHandler), []),
-      [_registerCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterCallbackHandler), []),
-      [_registerUnaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterUnaryCallbackHandler), []),
-      [_registerBinaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterBinaryCallbackHandler), []),
-      [_errorCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.ErrorCallbackHandler), []),
-      [_scheduleMicrotask]: dart.definiteFunctionType(async._ZoneFunction$(async.ScheduleMicrotaskHandler), []),
-      [_createTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreateTimerHandler), []),
-      [_createPeriodicTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreatePeriodicTimerHandler), []),
-      [_print]: dart.definiteFunctionType(async._ZoneFunction$(async.PrintHandler), []),
-      [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
-      [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
-      parent: dart.definiteFunctionType(async._Zone, []),
-      [_map$]: dart.definiteFunctionType(core.Map, []),
-      [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
-      errorZone: dart.definiteFunctionType(async.Zone, [])
-    }),
-    methods: () => ({
-      runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
-      runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
-      runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
-      bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
-      bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
-      bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
-      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
-      handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
-      fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
-      run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
-      runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
-      runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
-      registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
-      registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
-      registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
-      errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
-      scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
-      createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
-      print: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    sfields: () => ({
-      _rootMap: core.Map,
-      _rootDelegate: async.ZoneDelegate
-    })
-  });
-  async._RootZone._rootDelegate = null;
-  dart.defineLazy(async._RootZone, {
-    get _rootMap() {
-      return collection.HashMap.new();
-    },
-    set _rootMap(_) {}
-  });
-  async._ROOT_ZONE = dart.const(new async._RootZone());
-  async.runZoned = function(R) {
-    return (body, opts) => {
-      let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
-      let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let errorHandler = null;
-      if (onError != null) {
-        errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
-          try {
-            if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
-              return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
-            }
-            return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
-          } catch (e) {
-            let s = dart.stackTrace(e);
-            if (core.identical(e, error)) {
-              return parent.handleUncaughtError(dart.dynamic)(zone, error, stackTrace);
-            } else {
-              return parent.handleUncaughtError(dart.dynamic)(zone, e, s);
-            }
-          }
-
-        }, ZoneAndZoneDelegateAndZone__Todynamic());
-      }
-      if (zoneSpecification == null) {
-        zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
-      } else if (errorHandler != null) {
-        zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
-      }
-      let zone = async.Zone.current.fork({specification: zoneSpecification, zoneValues: zoneValues});
-      if (onError != null) {
-        return zone.runGuarded(R)(body);
-      } else {
-        return zone.run(R)(body);
-      }
-    };
-  };
-  dart.lazyFn(async.runZoned, () => Fn__ToR());
-  collection._USE_ES6_MAPS = true;
-  const _length$1 = Symbol('_length');
-  const _strings$ = Symbol('_strings');
-  const _nums$ = Symbol('_nums');
-  const _rest$ = Symbol('_rest');
-  const _keys = Symbol('_keys');
-  const _containsKey = Symbol('_containsKey');
-  const _getBucket$ = Symbol('_getBucket');
-  const _findBucketIndex = Symbol('_findBucketIndex');
-  const _computeKeys = Symbol('_computeKeys');
-  const _get = Symbol('_get');
-  const _addHashTableEntry$ = Symbol('_addHashTableEntry');
-  const _set = Symbol('_set');
-  const _computeHashCode = Symbol('_computeHashCode');
-  const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
-  const _remove = Symbol('_remove');
-  collection._HashMap$ = dart.generic((K, V) => {
-    let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
-    let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
-    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
-    let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
-    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
-    class _HashMap extends core.Object {
-      new() {
-        this[_length$1] = 0;
-        this[_strings$] = null;
-        this[_nums$] = null;
-        this[_rest$] = null;
-        this[_keys] = null;
-      }
-      get length() {
-        return this[_length$1];
-      }
-      get isEmpty() {
-        return this[_length$1] == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      get keys() {
-        return new (_HashMapKeyIterableOfK())(this);
-      }
-      get values() {
-        return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
-      }
-      containsKey(key) {
-        if (dart.test(collection._HashMap._isStringKey(key))) {
-          let strings = this[_strings$];
-          return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
-        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-          let nums = this[_nums$];
-          return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
-        } else {
-          return this[_containsKey](key);
-        }
-      }
-      [_containsKey](key) {
-        let rest = this[_rest$];
-        if (rest == null) return false;
-        let bucket = this[_getBucket$](rest, key);
-        return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
-      }
-      containsValue(value) {
-        return this[_computeKeys]()[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        other[dartx.forEach](dart.fn((key, value) => {
-          this._set(key, value);
-        }, KAndVToNull()));
-      }
-      _get(key) {
-        if (dart.test(collection._HashMap._isStringKey(key))) {
-          let strings = this[_strings$];
-          return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
-        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-          let nums = this[_nums$];
-          return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
-        } else {
-          return this[_get](key);
-        }
-      }
-      [_get](key) {
-        let rest = this[_rest$];
-        if (rest == null) return null;
-        let bucket = this[_getBucket$](rest, key);
-        let index = this[_findBucketIndex](bucket, key);
-        return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        if (dart.test(collection._HashMap._isStringKey(key))) {
-          let strings = this[_strings$];
-          if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
-          this[_addHashTableEntry$](strings, key, value);
-        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-          let nums = this[_nums$];
-          if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
-          this[_addHashTableEntry$](nums, key, value);
-        } else {
-          this[_set](key, value);
-        }
-        return value;
-      }
-      [_set](key, value) {
-        K._check(key);
-        V._check(value);
-        let rest = this[_rest$];
-        if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
-        let hash = this[_computeHashCode](key);
-        let bucket = rest[hash];
-        if (bucket == null) {
-          collection._HashMap._setTableEntry(rest, hash, [key, value]);
-          this[_length$1] = dart.notNull(this[_length$1]) + 1;
-          this[_keys] = null;
-        } else {
-          let index = this[_findBucketIndex](bucket, key);
-          if (dart.notNull(index) >= 0) {
-            bucket[dart.notNull(index) + 1] = value;
-          } else {
-            bucket.push(key, value);
-            this[_length$1] = dart.notNull(this[_length$1]) + 1;
-            this[_keys] = null;
-          }
-        }
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        if (dart.test(this.containsKey(key))) return this._get(key);
-        let value = ifAbsent();
-        this._set(key, value);
-        return value;
-      }
-      remove(key) {
-        if (dart.test(collection._HashMap._isStringKey(key))) {
-          return this[_removeHashTableEntry$](this[_strings$], key);
-        } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-          return this[_removeHashTableEntry$](this[_nums$], key);
-        } else {
-          return this[_remove](key);
-        }
-      }
-      [_remove](key) {
-        let rest = this[_rest$];
-        if (rest == null) return null;
-        let bucket = this[_getBucket$](rest, key);
-        let index = this[_findBucketIndex](bucket, key);
-        if (dart.notNull(index) < 0) return null;
-        this[_length$1] = dart.notNull(this[_length$1]) - 1;
-        this[_keys] = null;
-        return bucket.splice(index, 2)[1];
-      }
-      clear() {
-        if (dart.notNull(this[_length$1]) > 0) {
-          this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
-          this[_length$1] = 0;
-        }
-      }
-      forEach(action) {
-        let keys = this[_computeKeys]();
-        for (let i = 0, length = keys[dartx.length]; i < dart.notNull(length); i++) {
-          let key = keys[i];
-          action(K._check(key), this._get(key));
-          if (keys !== this[_keys]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-      }
-      [_computeKeys]() {
-        if (this[_keys] != null) return this[_keys];
-        let result = ListOfK().new(this[_length$1]);
-        let index = 0;
-        let strings = this[_strings$];
-        if (strings != null) {
-          let names = Object.getOwnPropertyNames(strings);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let key = names[i];
-            result[index] = key;
-            index++;
-          }
-        }
-        let nums = this[_nums$];
-        if (nums != null) {
-          let names = Object.getOwnPropertyNames(nums);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let key = +names[i];
-            result[index] = key;
-            index++;
-          }
-        }
-        let rest = this[_rest$];
-        if (rest != null) {
-          let names = Object.getOwnPropertyNames(rest);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let key = names[i];
-            let bucket = rest[key];
-            let length = bucket.length;
-            for (let i = 0; i < length; i = i + 2) {
-              let key = bucket[i];
-              result[index] = key;
-              index++;
-            }
-          }
-        }
-        dart.assert(index == this[_length$1]);
-        return this[_keys] = result;
-      }
-      [_addHashTableEntry$](table, key, value) {
-        K._check(key);
-        V._check(value);
-        if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
-          this[_length$1] = dart.notNull(this[_length$1]) + 1;
-          this[_keys] = null;
-        }
-        collection._HashMap._setTableEntry(table, key, value);
-      }
-      [_removeHashTableEntry$](table, key) {
-        if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
-          let value = V._check(collection._HashMap._getTableEntry(table, key));
-          collection._HashMap._deleteTableEntry(table, key);
-          this[_length$1] = dart.notNull(this[_length$1]) - 1;
-          this[_keys] = null;
-          return value;
-        } else {
-          return null;
-        }
-      }
-      static _isStringKey(key) {
-        return typeof key == 'string' && key != '__proto__';
-      }
-      static _isNumericKey(key) {
-        return typeof key == 'number' && (key & 0x3ffffff) === key;
-      }
-      [_computeHashCode](key) {
-        return dart.hashCode(key) & 0x3ffffff;
-      }
-      static _hasTableEntry(table, key) {
-        let entry = table[key];
-        return entry != null;
-      }
-      static _getTableEntry(table, key) {
-        let entry = table[key];
-        return entry === table ? null : entry;
-      }
-      static _setTableEntry(table, key, value) {
-        if (value == null) {
-          table[key] = table;
-        } else {
-          table[key] = value;
-        }
-      }
-      static _deleteTableEntry(table, key) {
-        delete table[key];
-      }
-      [_getBucket$](table, key) {
-        let hash = this[_computeHashCode](key);
-        return table[hash];
-      }
-      [_findBucketIndex](bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i = i + 2) {
-          if (dart.equals(bucket[i], key)) return i;
-        }
-        return -1;
-      }
-      static _newHashTable() {
-        let table = Object.create(null);
-        let temporaryKey = '<non-identifier-key>';
-        collection._HashMap._setTableEntry(table, temporaryKey, table);
-        collection._HashMap._deleteTableEntry(table, temporaryKey);
-        return table;
-      }
-    }
-    dart.addTypeTests(_HashMap);
-    _HashMap[dart.implements] = () => [HashMapOfK$V()];
-    dart.setSignature(_HashMap, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
-      fields: () => ({
-        [_length$1]: core.int,
-        [_strings$]: dart.dynamic,
-        [_nums$]: dart.dynamic,
-        [_rest$]: dart.dynamic,
-        [_keys]: ListOfK()
-      }),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        keys: dart.definiteFunctionType(core.Iterable$(K), []),
-        values: dart.definiteFunctionType(core.Iterable$(V), [])
-      }),
-      methods: () => ({
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        _get: dart.definiteFunctionType(V, [core.Object]),
-        [_get]: dart.definiteFunctionType(V, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [K, V]),
-        [_set]: dart.definiteFunctionType(dart.void, [K, V]),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
-        remove: dart.definiteFunctionType(V, [core.Object]),
-        [_remove]: dart.definiteFunctionType(V, [core.Object]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
-        [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
-        [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
-        [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
-        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
-        [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
-        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
-      }),
-      statics: () => ({
-        _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-        _getTableEntry: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
-      }),
-      names: ['_isStringKey', '_isNumericKey', '_hasTableEntry', '_getTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
-    });
-    dart.defineExtensionMembers(_HashMap, [
-      'containsKey',
-      'containsValue',
-      'addAll',
-      '_get',
-      '_set',
-      'putIfAbsent',
-      'remove',
-      'clear',
-      'forEach',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'keys',
-      'values'
-    ]);
-    return _HashMap;
-  });
-  collection._HashMap = _HashMap();
-  collection._IdentityHashMap$ = dart.generic((K, V) => {
-    class _IdentityHashMap extends collection._HashMap$(K, V) {
-      new() {
-        super.new();
-      }
-      [_computeHashCode](key) {
-        return core.identityHashCode(key) & 0x3ffffff;
-      }
-      [_findBucketIndex](bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i = i + 2) {
-          if (core.identical(bucket[i], key)) return i;
-        }
-        return -1;
-      }
-    }
-    return _IdentityHashMap;
-  });
-  collection._IdentityHashMap = _IdentityHashMap();
-  const _equals$ = Symbol('_equals');
-  const _hashCode = Symbol('_hashCode');
-  const _validKey = Symbol('_validKey');
-  collection._CustomHashMap$ = dart.generic((K, V) => {
-    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
-    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
-    class _CustomHashMap extends collection._HashMap$(K, V) {
-      new(equals, hashCode, validKey) {
-        this[_equals$] = equals;
-        this[_hashCode] = hashCode;
-        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
-        super.new();
-      }
-      _get(key) {
-        if (!dart.test(this[_validKey](key))) return null;
-        return super[_get](key);
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        super[_set](key, value);
-        return value;
-      }
-      containsKey(key) {
-        if (!dart.test(this[_validKey](key))) return false;
-        return super[_containsKey](key);
-      }
-      remove(key) {
-        if (!dart.test(this[_validKey](key))) return null;
-        return super[_remove](key);
-      }
-      [_computeHashCode](key) {
-        return this[_hashCode](K._check(key)) & 0x3ffffff;
-      }
-      [_findBucketIndex](bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i = i + 2) {
-          if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
-        }
-        return -1;
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-    }
-    dart.setSignature(_CustomHashMap, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
-      fields: () => ({
-        [_equals$]: _EqualityOfK(),
-        [_hashCode]: _HasherOfK(),
-        [_validKey]: _PredicateOfObject()
-      })
-    });
-    dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
-    return _CustomHashMap;
-  });
-  collection._CustomHashMap = _CustomHashMap();
-  const _map$0 = Symbol('_map');
-  collection._HashMapKeyIterable$ = dart.generic(E => {
-    let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-    class _HashMapKeyIterable extends core.Iterable$(E) {
-      new(map) {
-        this[_map$0] = map;
-        super.new();
-      }
-      get length() {
-        return this[_map$0][_length$1];
-      }
-      get isEmpty() {
-        return this[_map$0][_length$1] == 0;
-      }
-      get iterator() {
-        return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
-      }
-      contains(element) {
-        return this[_map$0].containsKey(element);
-      }
-      forEach(f) {
-        let keys = this[_map$0][_computeKeys]();
-        for (let i = 0, length = keys.length; i < length; i++) {
-          f(keys[i]);
-          if (keys !== this[_map$0][_keys]) {
-            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
-          }
-        }
-      }
-    }
-    _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_HashMapKeyIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
-      fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(_HashMapKeyIterable, [
-      'contains',
-      'forEach',
-      'length',
-      'isEmpty',
-      'iterator'
-    ]);
-    return _HashMapKeyIterable;
-  });
-  collection._HashMapKeyIterable = _HashMapKeyIterable();
-  const _offset = Symbol('_offset');
-  const _current$2 = Symbol('_current');
-  collection._HashMapKeyIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    class _HashMapKeyIterator extends core.Object {
-      new(map, keys) {
-        this[_map$0] = map;
-        this[_keys] = keys;
-        this[_offset] = 0;
-        this[_current$2] = null;
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        let keys = this[_keys];
-        let offset = this[_offset];
-        if (keys !== this[_map$0][_keys]) {
-          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
-        } else if (dart.notNull(offset) >= keys.length) {
-          this[_current$2] = null;
-          return false;
-        } else {
-          this[_current$2] = keys[offset];
-          this[_offset] = dart.notNull(offset) + 1;
-          return true;
-        }
-      }
-    }
-    dart.addTypeTests(_HashMapKeyIterator);
-    _HashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_HashMapKeyIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
-      fields: () => ({
-        [_map$0]: _HashMapOfE$dynamic(),
-        [_keys]: ListOfE(),
-        [_offset]: core.int,
-        [_current$2]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _HashMapKeyIterator;
-  });
-  collection._HashMapKeyIterator = _HashMapKeyIterator();
-  collection._LinkedIdentityHashMap$ = dart.generic((K, V) => {
-    let _Es6LinkedIdentityHashMapOfK$V = () => (_Es6LinkedIdentityHashMapOfK$V = dart.constFn(collection._Es6LinkedIdentityHashMap$(K, V)))();
-    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
-    class _LinkedIdentityHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
-      static get _supportsEs6Maps() {
-        return true;
-      }
-      static es6() {
-        return collection._USE_ES6_MAPS && dart.test(collection._LinkedIdentityHashMap._supportsEs6Maps) ? new (_Es6LinkedIdentityHashMapOfK$V())() : new (_LinkedIdentityHashMapOfK$V())();
-      }
-      new() {
-        super.new();
-      }
-      internalComputeHashCode(key) {
-        return core.identityHashCode(key) & 0x3ffffff;
-      }
-      internalFindBucketIndex(bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (core.identical(cell.hashMapCellKey, key)) return i;
-        }
-        return -1;
-      }
-    }
-    dart.setSignature(_LinkedIdentityHashMap, {
-      constructors: () => ({
-        es6: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), []),
-        new: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), [])
-      }),
-      sgetters: () => ({_supportsEs6Maps: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _LinkedIdentityHashMap;
-  });
-  collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
-  const _modifications$ = Symbol('_modifications');
-  const _modified$ = Symbol('_modified');
-  collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
-    let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
-    let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
-    class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
-      new() {
-        this[_map$0] = new Map();
-        this[_modifications$] = 0;
-        super.new();
-      }
-      get length() {
-        return this[_map$0].size;
-      }
-      get isEmpty() {
-        return this.length == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      get keys() {
-        return new (_Es6MapIterableOfK())(this, true);
-      }
-      get values() {
-        return new (_Es6MapIterableOfV())(this, false);
-      }
-      containsKey(key) {
-        return this[_map$0].has(key);
-      }
-      containsValue(value) {
-        return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        other[dartx.forEach](dart.fn((key, value) => {
-          this._set(key, value);
-        }, KAndVToNull()));
-      }
-      _get(key) {
-        return this[_map$0].get(key);
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        this[_map$0].set(key, value);
-        this[_modified$]();
-        return value;
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        if (dart.test(this.containsKey(key))) return this._get(key);
-        let value = ifAbsent();
-        this._set(key, value);
-        return value;
-      }
-      remove(key) {
-        let value = this._get(key);
-        this[_map$0].delete(key);
-        this[_modified$]();
-        return value;
-      }
-      clear() {
-        this[_map$0].clear();
-        this[_modified$]();
-      }
-      forEach(action) {
-        let jsEntries = this[_map$0].entries();
-        let modifications = this[_modifications$];
-        while (true) {
-          let next = jsEntries.next();
-          let done = next.done;
-          if (done) break;
-          let entry = next.value;
-          let key = entry[0];
-          let value = entry[1];
-          action(K._check(key), V._check(value));
-          if (modifications != this[_modifications$]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-        }
-      }
-      [_modified$]() {
-        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-    }
-    _Es6LinkedIdentityHashMap[dart.implements] = () => [InternalMapOfK$V()];
-    dart.setSignature(_Es6LinkedIdentityHashMap, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
-      fields: () => ({
-        [_map$0]: dart.dynamic,
-        [_modifications$]: core.int
-      }),
-      methods: () => ({[_modified$]: dart.definiteFunctionType(dart.void, [])})
-    });
-    dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
-      'containsKey',
-      'containsValue',
-      'addAll',
-      '_get',
-      '_set',
-      'putIfAbsent',
-      'remove',
-      'clear',
-      'forEach',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'keys',
-      'values'
-    ]);
-    return _Es6LinkedIdentityHashMap;
-  });
-  collection._Es6LinkedIdentityHashMap = _Es6LinkedIdentityHashMap();
-  const _isKeys = Symbol('_isKeys');
-  collection._Es6MapIterable$ = dart.generic(E => {
-    let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class _Es6MapIterable extends core.Iterable$(E) {
-      new(map, isKeys) {
-        this[_map$0] = map;
-        this[_isKeys] = isKeys;
-        super.new();
-      }
-      get length() {
-        return core.int._check(dart.dload(this[_map$0], 'length'));
-      }
-      get isEmpty() {
-        return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
-      }
-      get iterator() {
-        return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
-      }
-      contains(element) {
-        return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
-      }
-      forEach(f) {
-        let jsIterator = null;
-        if (dart.test(this[_isKeys])) {
-          jsIterator = dart.dload(this[_map$0], _map$0).keys();
-        } else {
-          jsIterator = dart.dload(this[_map$0], _map$0).values();
-        }
-        let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
-        while (true) {
-          let next = jsIterator.next();
-          let done = next.done;
-          if (done) break;
-          let value = next.value;
-          f(E._check(value));
-          if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
-            dart.throw(new core.ConcurrentModificationError(this[_map$0]));
-          }
-        }
-      }
-    }
-    _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_Es6MapIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
-      fields: () => ({
-        [_map$0]: dart.dynamic,
-        [_isKeys]: core.bool
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
-    });
-    dart.defineExtensionMembers(_Es6MapIterable, [
-      'contains',
-      'forEach',
-      'length',
-      'isEmpty',
-      'iterator'
-    ]);
-    return _Es6MapIterable;
-  });
-  collection._Es6MapIterable = _Es6MapIterable();
-  const _jsIterator$ = Symbol('_jsIterator');
-  const _next$0 = Symbol('_next');
-  const _done = Symbol('_done');
-  collection._Es6MapIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class _Es6MapIterator extends core.Object {
-      new(map, modifications, isKeys) {
-        this[_map$0] = map;
-        this[_modifications$] = modifications;
-        this[_isKeys] = isKeys;
-        this[_jsIterator$] = null;
-        this[_next$0] = null;
-        this[_current$2] = null;
-        this[_done] = null;
-        if (dart.test(this[_isKeys])) {
-          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
-        } else {
-          this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
-        }
-        this[_done] = false;
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
-          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
-        }
-        if (dart.test(this[_done])) return false;
-        this[_next$0] = this[_jsIterator$].next();
-        let done = this[_next$0].done;
-        if (done) {
-          this[_current$2] = null;
-          this[_done] = true;
-          return false;
-        } else {
-          this[_current$2] = this[_next$0].value;
-          return true;
-        }
-      }
-    }
-    dart.addTypeTests(_Es6MapIterator);
-    _Es6MapIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_Es6MapIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
-      fields: () => ({
-        [_map$0]: dart.dynamic,
-        [_modifications$]: core.int,
-        [_isKeys]: core.bool,
-        [_jsIterator$]: dart.dynamic,
-        [_next$0]: dart.dynamic,
-        [_current$2]: E,
-        [_done]: core.bool
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _Es6MapIterator;
-  });
-  collection._Es6MapIterator = _Es6MapIterator();
-  collection._LinkedCustomHashMap$ = dart.generic((K, V) => {
-    let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
-    let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
-    class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
-      new(equals, hashCode, validKey) {
-        this[_equals$] = equals;
-        this[_hashCode] = hashCode;
-        this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
-        super.new();
-      }
-      _get(key) {
-        if (!dart.test(this[_validKey](key))) return null;
-        return super.internalGet(key);
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        super.internalSet(key, value);
-        return value;
-      }
-      containsKey(key) {
-        if (!dart.test(this[_validKey](key))) return false;
-        return super.internalContainsKey(key);
-      }
-      remove(key) {
-        if (!dart.test(this[_validKey](key))) return null;
-        return super.internalRemove(key);
-      }
-      internalComputeHashCode(key) {
-        return this[_hashCode](K._check(key)) & 0x3ffffff;
-      }
-      internalFindBucketIndex(bucket, key) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
-        }
-        return -1;
-      }
-    }
-    dart.setSignature(_LinkedCustomHashMap, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
-      fields: () => ({
-        [_equals$]: _EqualityOfK(),
-        [_hashCode]: _HasherOfK(),
-        [_validKey]: _PredicateOfObject()
-      })
-    });
-    dart.defineExtensionMembers(_LinkedCustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
-    return _LinkedCustomHashMap;
-  });
-  collection._LinkedCustomHashMap = _LinkedCustomHashMap();
-  const _elements = Symbol('_elements');
-  const _newSet = Symbol('_newSet');
-  const _computeElements = Symbol('_computeElements');
-  const _contains = Symbol('_contains');
-  const _lookup = Symbol('_lookup');
-  const _add$0 = Symbol('_add');
-  collection.SetMixin$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
-    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
-    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
-    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class SetMixin extends core.Object {
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
-      get isEmpty() {
-        return this.length == 0;
-      }
-      get isNotEmpty() {
-        return this.length != 0;
-      }
-      clear() {
-        this.removeAll(this.toList());
-      }
-      addAll(elements) {
-        IterableOfE()._check(elements);
-        for (let element of elements)
-          this.add(element);
-      }
-      removeAll(elements) {
-        for (let element of elements)
-          this.remove(element);
-      }
-      retainAll(elements) {
-        let toRemove = this.toSet();
-        for (let o of elements) {
-          toRemove.remove(o);
-        }
-        this.removeAll(toRemove);
-      }
-      removeWhere(test) {
-        let toRemove = [];
-        for (let element of this) {
-          if (dart.test(test(element))) toRemove[dartx.add](element);
-        }
-        this.removeAll(toRemove);
-      }
-      retainWhere(test) {
-        let toRemove = [];
-        for (let element of this) {
-          if (!dart.test(test(element))) toRemove[dartx.add](element);
-        }
-        this.removeAll(toRemove);
-      }
-      containsAll(other) {
-        for (let o of other) {
-          if (!dart.test(this.contains(o))) return false;
-        }
-        return true;
-      }
-      union(other) {
-        SetOfE()._check(other);
-        let _ = this.toSet();
-        _.addAll(other);
-        return _;
-      }
-      intersection(other) {
-        let result = this.toSet();
-        for (let element of this) {
-          if (!dart.test(other.contains(element))) result.remove(element);
-        }
-        return result;
-      }
-      difference(other) {
-        let result = this.toSet();
-        for (let element of this) {
-          if (dart.test(other.contains(element))) result.remove(element);
-        }
-        return result;
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let result = dart.test(growable) ? (() => {
-          let _ = ListOfE().new();
-          _[dartx.length] = this.length;
-          return _;
-        })() : ListOfE().new(this.length);
-        let i = 0;
-        for (let element of this)
-          result[dartx._set](i++, element);
-        return result;
-      }
-      map(T) {
-        return f => {
-          return new (_internal.EfficientLengthMappedIterable$(E, T))(this, f);
-        };
-      }
-      get single() {
-        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
-        let it = this.iterator;
-        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
-        let result = it.current;
-        return result;
-      }
-      toString() {
-        return collection.IterableBase.iterableToFullString(this, '{', '}');
-      }
-      where(f) {
-        return new (WhereIterableOfE())(this, f);
-      }
-      expand(T) {
-        return f => {
-          return new (_internal.ExpandIterable$(E, T))(this, f);
-        };
-      }
-      forEach(f) {
-        for (let element of this)
-          f(element);
-      }
-      reduce(combine) {
-        EAndEToE()._check(combine);
-        let iterator = this.iterator;
-        if (!dart.test(iterator.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let value = iterator.current;
-        while (dart.test(iterator.moveNext())) {
-          value = combine(value, iterator.current);
-        }
-        return value;
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          for (let element of this)
-            value = combine(value, element);
-          return value;
-        };
-      }
-      every(f) {
-        for (let element of this) {
-          if (!dart.test(f(element))) return false;
-        }
-        return true;
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        let iterator = this.iterator;
-        if (!dart.test(iterator.moveNext())) return "";
-        let buffer = new core.StringBuffer();
-        if (separator == null || separator == "") {
-          do {
-            buffer.write(dart.str`${iterator.current}`);
-          } while (dart.test(iterator.moveNext()));
-        } else {
-          buffer.write(dart.str`${iterator.current}`);
-          while (dart.test(iterator.moveNext())) {
-            buffer.write(separator);
-            buffer.write(dart.str`${iterator.current}`);
-          }
-        }
-        return buffer.toString();
-      }
-      any(test) {
-        for (let element of this) {
-          if (dart.test(test(element))) return true;
-        }
-        return false;
-      }
-      take(n) {
-        return TakeIterableOfE().new(this, n);
-      }
-      takeWhile(test) {
-        return new (TakeWhileIterableOfE())(this, test);
-      }
-      skip(n) {
-        return SkipIterableOfE().new(this, n);
-      }
-      skipWhile(test) {
-        return new (SkipWhileIterableOfE())(this, test);
-      }
-      get first() {
-        let it = this.iterator;
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        return it.current;
-      }
-      get last() {
-        let it = this.iterator;
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let result = null;
-        do {
-          result = it.current;
-        } while (dart.test(it.moveNext()));
-        return result;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        for (let element of this) {
-          if (dart.test(test(element))) return element;
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test) {
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            if (foundMatching) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      elementAt(index) {
-        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
-        core.RangeError.checkNotNegative(index, "index");
-        let elementIndex = 0;
-        for (let element of this) {
-          if (index == elementIndex) return element;
-          elementIndex++;
-        }
-        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
-      }
-    }
-    dart.addTypeTests(SetMixin);
-    SetMixin[dart.implements] = () => [SetOfE()];
-    dart.setSignature(SetMixin, {
-      getters: () => ({
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        single: dart.definiteFunctionType(E, []),
-        first: dart.definiteFunctionType(E, []),
-        last: dart.definiteFunctionType(E, [])
-      }),
-      methods: () => ({
-        clear: dart.definiteFunctionType(dart.void, []),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
-        retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
-        union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
-        intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
-        difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
-        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
-        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
-        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
-        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
-        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
-        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
-        every: dart.definiteFunctionType(core.bool, [ETobool()]),
-        join: dart.definiteFunctionType(core.String, [], [core.String]),
-        any: dart.definiteFunctionType(core.bool, [ETobool()]),
-        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
-        elementAt: dart.definiteFunctionType(E, [core.int])
-      })
-    });
-    dart.defineExtensionMembers(SetMixin, [
-      'toList',
-      'map',
-      'toString',
-      'where',
-      'expand',
-      'forEach',
-      'reduce',
-      'fold',
-      'every',
-      'join',
-      'any',
-      'take',
-      'takeWhile',
-      'skip',
-      'skipWhile',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'elementAt',
-      'isEmpty',
-      'isNotEmpty',
-      'single',
-      'first',
-      'last'
-    ]);
-    return SetMixin;
-  });
-  collection.SetMixin = SetMixin();
-  collection.SetBase$ = dart.generic(E => {
-    class SetBase extends collection.SetMixin$(E) {
-      static setToString(set) {
-        return collection.IterableBase.iterableToFullString(set, '{', '}');
-      }
-    }
-    dart.setSignature(SetBase, {
-      statics: () => ({setToString: dart.definiteFunctionType(core.String, [core.Set])}),
-      names: ['setToString']
-    });
-    return SetBase;
-  });
-  collection.SetBase = SetBase();
-  collection._HashSetBase$ = dart.generic(E => {
-    class _HashSetBase extends collection.SetBase$(E) {
-      difference(other) {
-        let result = this[_newSet]();
-        for (let element of this) {
-          if (!dart.test(other.contains(element))) result.add(element);
-        }
-        return result;
-      }
-      intersection(other) {
-        let result = this[_newSet]();
-        for (let element of this) {
-          if (dart.test(other.contains(element))) result.add(element);
-        }
-        return result;
-      }
-      toSet() {
-        return (() => {
-          let _ = this[_newSet]();
-          _.addAll(this);
-          return _;
-        })();
-      }
-    }
-    dart.setSignature(_HashSetBase, {
-      methods: () => ({toSet: dart.definiteFunctionType(core.Set$(E), [])})
-    });
-    dart.defineExtensionMembers(_HashSetBase, ['toSet']);
-    return _HashSetBase;
-  });
-  collection._HashSetBase = _HashSetBase();
-  collection._HashSet$ = dart.generic(E => {
-    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
-    let _HashSetIteratorOfE = () => (_HashSetIteratorOfE = dart.constFn(collection._HashSetIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
-    class _HashSet extends collection._HashSetBase$(E) {
-      new() {
-        this[_length$1] = 0;
-        this[_strings$] = null;
-        this[_nums$] = null;
-        this[_rest$] = null;
-        this[_elements] = null;
-      }
-      [_newSet]() {
-        return new (_HashSetOfE())();
-      }
-      get iterator() {
-        return new (_HashSetIteratorOfE())(this, this[_computeElements]());
-      }
-      get length() {
-        return this[_length$1];
-      }
-      get isEmpty() {
-        return this[_length$1] == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      contains(object) {
-        if (dart.test(collection._HashSet._isStringElement(object))) {
-          let strings = this[_strings$];
-          return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
-        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
-          let nums = this[_nums$];
-          return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
-        } else {
-          return this[_contains](object);
-        }
-      }
-      [_contains](object) {
-        let rest = this[_rest$];
-        if (rest == null) return false;
-        let bucket = this[_getBucket$](rest, object);
-        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
-      }
-      lookup(object) {
-        if (dart.test(collection._HashSet._isStringElement(object)) || dart.test(collection._HashSet._isNumericElement(object))) {
-          return E._check(dart.test(this.contains(object)) ? object : null);
-        }
-        return this[_lookup](object);
-      }
-      [_lookup](object) {
-        let rest = this[_rest$];
-        if (rest == null) return null;
-        let bucket = this[_getBucket$](rest, object);
-        let index = this[_findBucketIndex](bucket, object);
-        if (dart.notNull(index) < 0) return null;
-        return bucket[dartx._get](index);
-      }
-      add(element) {
-        E._check(element);
-        if (dart.test(collection._HashSet._isStringElement(element))) {
-          let strings = this[_strings$];
-          if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
-          return this[_addHashTableEntry$](strings, element);
-        } else if (dart.test(collection._HashSet._isNumericElement(element))) {
-          let nums = this[_nums$];
-          if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
-          return this[_addHashTableEntry$](nums, element);
-        } else {
-          return this[_add$0](element);
-        }
-      }
-      [_add$0](element) {
-        E._check(element);
-        let rest = this[_rest$];
-        if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
-        let hash = this[_computeHashCode](element);
-        let bucket = rest[hash];
-        if (bucket == null) {
-          collection._HashSet._setTableEntry(rest, hash, [element]);
-        } else {
-          let index = this[_findBucketIndex](bucket, element);
-          if (dart.notNull(index) >= 0) return false;
-          bucket.push(element);
-        }
-        this[_length$1] = dart.notNull(this[_length$1]) + 1;
-        this[_elements] = null;
-        return true;
-      }
-      addAll(objects) {
-        IterableOfE()._check(objects);
-        for (let each of objects) {
-          this.add(each);
-        }
-      }
-      remove(object) {
-        if (dart.test(collection._HashSet._isStringElement(object))) {
-          return this[_removeHashTableEntry$](this[_strings$], object);
-        } else if (dart.test(collection._HashSet._isNumericElement(object))) {
-          return this[_removeHashTableEntry$](this[_nums$], object);
-        } else {
-          return this[_remove](object);
-        }
-      }
-      [_remove](object) {
-        let rest = this[_rest$];
-        if (rest == null) return false;
-        let bucket = this[_getBucket$](rest, object);
-        let index = this[_findBucketIndex](bucket, object);
-        if (dart.notNull(index) < 0) return false;
-        this[_length$1] = dart.notNull(this[_length$1]) - 1;
-        this[_elements] = null;
-        bucket.splice(index, 1);
-        return true;
-      }
-      clear() {
-        if (dart.notNull(this[_length$1]) > 0) {
-          this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
-          this[_length$1] = 0;
-        }
-      }
-      [_computeElements]() {
-        if (this[_elements] != null) return this[_elements];
-        let result = ListOfE().new(this[_length$1]);
-        let index = 0;
-        let strings = this[_strings$];
-        if (strings != null) {
-          let names = Object.getOwnPropertyNames(strings);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let element = names[i];
-            result[index] = element;
-            index++;
-          }
-        }
-        let nums = this[_nums$];
-        if (nums != null) {
-          let names = Object.getOwnPropertyNames(nums);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let element = +names[i];
-            result[index] = element;
-            index++;
-          }
-        }
-        let rest = this[_rest$];
-        if (rest != null) {
-          let names = Object.getOwnPropertyNames(rest);
-          let entries = names.length;
-          for (let i = 0; i < entries; i++) {
-            let entry = names[i];
-            let bucket = rest[entry];
-            let length = bucket.length;
-            for (let i = 0; i < length; i++) {
-              result[index] = bucket[i];
-              index++;
-            }
-          }
-        }
-        dart.assert(index == this[_length$1]);
-        return this[_elements] = result;
-      }
-      [_addHashTableEntry$](table, element) {
-        E._check(element);
-        if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
-        collection._HashSet._setTableEntry(table, element, 0);
-        this[_length$1] = dart.notNull(this[_length$1]) + 1;
-        this[_elements] = null;
-        return true;
-      }
-      [_removeHashTableEntry$](table, element) {
-        if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
-          collection._HashSet._deleteTableEntry(table, element);
-          this[_length$1] = dart.notNull(this[_length$1]) - 1;
-          this[_elements] = null;
-          return true;
-        } else {
-          return false;
-        }
-      }
-      static _isStringElement(element) {
-        return typeof element == 'string' && element != '__proto__';
-      }
-      static _isNumericElement(element) {
-        return typeof element == 'number' && (element & 0x3ffffff) === element;
-      }
-      [_computeHashCode](element) {
-        return dart.hashCode(element) & 0x3ffffff;
-      }
-      static _hasTableEntry(table, key) {
-        let entry = table[key];
-        return entry != null;
-      }
-      static _setTableEntry(table, key, value) {
-        dart.assert(value != null);
-        table[key] = value;
-      }
-      static _deleteTableEntry(table, key) {
-        delete table[key];
-      }
-      [_getBucket$](table, element) {
-        let hash = this[_computeHashCode](element);
-        return table[hash];
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          if (dart.equals(bucket[i], element)) return i;
-        }
-        return -1;
-      }
-      static _newHashTable() {
-        let table = Object.create(null);
-        let temporaryKey = '<non-identifier-key>';
-        collection._HashSet._setTableEntry(table, temporaryKey, table);
-        collection._HashSet._deleteTableEntry(table, temporaryKey);
-        return table;
-      }
-    }
-    _HashSet[dart.implements] = () => [HashSetOfE()];
-    dart.setSignature(_HashSet, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
-      fields: () => ({
-        [_length$1]: core.int,
-        [_strings$]: dart.dynamic,
-        [_nums$]: dart.dynamic,
-        [_rest$]: dart.dynamic,
-        [_elements]: ListOfE()
-      }),
-      getters: () => ({
-        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
-        length: dart.definiteFunctionType(core.int, [])
-      }),
-      methods: () => ({
-        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
-        contains: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
-        lookup: dart.definiteFunctionType(E, [core.Object]),
-        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
-        add: dart.definiteFunctionType(core.bool, [E]),
-        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
-        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
-        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
-        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
-        [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
-        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
-      }),
-      statics: () => ({
-        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
-      }),
-      names: ['_isStringElement', '_isNumericElement', '_hasTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
-    });
-    dart.defineExtensionMembers(_HashSet, [
-      'contains',
-      'iterator',
-      'length',
-      'isEmpty',
-      'isNotEmpty'
-    ]);
-    return _HashSet;
-  });
-  collection._HashSet = _HashSet();
-  collection._IdentityHashSet$ = dart.generic(E => {
-    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
-    class _IdentityHashSet extends collection._HashSet$(E) {
-      new() {
-        super.new();
-      }
-      [_newSet]() {
-        return new (_IdentityHashSetOfE())();
-      }
-      [_computeHashCode](key) {
-        return core.identityHashCode(key) & 0x3ffffff;
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          if (core.identical(bucket[i], element)) return i;
-        }
-        return -1;
-      }
-    }
-    return _IdentityHashSet;
-  });
-  collection._IdentityHashSet = _IdentityHashSet();
-  const _equality = Symbol('_equality');
-  const _hasher = Symbol('_hasher');
-  collection._CustomHashSet$ = dart.generic(E => {
-    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
-    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
-    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
-    class _CustomHashSet extends collection._HashSet$(E) {
-      new(equality, hasher, validKey) {
-        this[_equality] = equality;
-        this[_hasher] = hasher;
-        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
-        super.new();
-      }
-      [_newSet]() {
-        return new (_CustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          if (dart.test(this[_equality](bucket[i], E._check(element)))) return i;
-        }
-        return -1;
-      }
-      [_computeHashCode](element) {
-        return this[_hasher](E._check(element)) & 0x3ffffff;
-      }
-      add(object) {
-        E._check(object);
-        return super[_add$0](object);
-      }
-      contains(object) {
-        if (!dart.test(this[_validKey](object))) return false;
-        return super[_contains](object);
-      }
-      lookup(object) {
-        if (!dart.test(this[_validKey](object))) return null;
-        return super[_lookup](object);
-      }
-      remove(object) {
-        if (!dart.test(this[_validKey](object))) return false;
-        return super[_remove](object);
-      }
-    }
-    dart.setSignature(_CustomHashSet, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
-      fields: () => ({
-        [_equality]: _EqualityOfE(),
-        [_hasher]: _HasherOfE(),
-        [_validKey]: _PredicateOfObject()
-      })
-    });
-    dart.defineExtensionMembers(_CustomHashSet, ['contains']);
-    return _CustomHashSet;
-  });
-  collection._CustomHashSet = _CustomHashSet();
-  collection._HashSetIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    class _HashSetIterator extends core.Object {
-      new(set, elements) {
-        this[_set] = set;
-        this[_elements] = elements;
-        this[_offset] = 0;
-        this[_current$2] = null;
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        let elements = this[_elements];
-        let offset = this[_offset];
-        if (elements !== dart.dload(this[_set], _elements)) {
-          dart.throw(new core.ConcurrentModificationError(this[_set]));
-        } else if (dart.notNull(offset) >= elements.length) {
-          this[_current$2] = null;
-          return false;
-        } else {
-          this[_current$2] = elements[offset];
-          this[_offset] = dart.notNull(offset) + 1;
-          return true;
-        }
-      }
-    }
-    dart.addTypeTests(_HashSetIterator);
-    _HashSetIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_HashSetIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._HashSetIterator$(E), [dart.dynamic, ListOfE()])}),
-      fields: () => ({
-        [_set]: dart.dynamic,
-        [_elements]: ListOfE(),
-        [_offset]: core.int,
-        [_current$2]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _HashSetIterator;
-  });
-  collection._HashSetIterator = _HashSetIterator();
-  const _first$ = Symbol('_first');
-  const _last$ = Symbol('_last');
-  const _unsupported = Symbol('_unsupported');
-  const _getTableEntry = Symbol('_getTableEntry');
-  const _element = Symbol('_element');
-  const _newLinkedCell$ = Symbol('_newLinkedCell');
-  const _unlinkCell$ = Symbol('_unlinkCell');
-  const _filterWhere = Symbol('_filterWhere');
-  const _previous$0 = Symbol('_previous');
-  collection._LinkedHashSet$ = dart.generic(E => {
-    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
-    let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
-    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
-    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class _LinkedHashSet extends collection._HashSetBase$(E) {
-      new() {
-        this[_length$1] = 0;
-        this[_strings$] = null;
-        this[_nums$] = null;
-        this[_rest$] = null;
-        this[_first$] = null;
-        this[_last$] = null;
-        this[_modifications$] = 0;
-      }
-      [_newSet]() {
-        return new (_LinkedHashSetOfE())();
-      }
-      [_unsupported](operation) {
-        dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
-      }
-      get iterator() {
-        return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
-      }
-      get length() {
-        return this[_length$1];
-      }
-      get isEmpty() {
-        return this[_length$1] == 0;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      contains(object) {
-        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
-          let strings = this[_strings$];
-          if (strings == null) return false;
-          let cell = this[_getTableEntry](strings, object);
-          return cell != null;
-        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
-          let nums = this[_nums$];
-          if (nums == null) return false;
-          let cell = this[_getTableEntry](nums, object);
-          return cell != null;
-        } else {
-          return this[_contains](object);
-        }
-      }
-      [_contains](object) {
-        let rest = this[_rest$];
-        if (rest == null) return false;
-        let bucket = this[_getBucket$](rest, object);
-        return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
-      }
-      lookup(object) {
-        if (dart.test(collection._LinkedHashSet._isStringElement(object)) || dart.test(collection._LinkedHashSet._isNumericElement(object))) {
-          return E._check(dart.test(this.contains(object)) ? object : null);
-        } else {
-          return this[_lookup](object);
-        }
-      }
-      [_lookup](object) {
-        let rest = this[_rest$];
-        if (rest == null) return null;
-        let bucket = this[_getBucket$](rest, object);
-        let index = this[_findBucketIndex](bucket, object);
-        if (dart.notNull(index) < 0) return null;
-        return bucket[dartx._get](index)[_element];
-      }
-      forEach(action) {
-        let cell = this[_first$];
-        let modifications = this[_modifications$];
-        while (cell != null) {
-          action(cell[_element]);
-          if (modifications != this[_modifications$]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          cell = cell[_next$0];
-        }
-      }
-      get first() {
-        if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
-        return this[_first$][_element];
-      }
-      get last() {
-        if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
-        return this[_last$][_element];
-      }
-      add(element) {
-        E._check(element);
-        if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
-          let strings = this[_strings$];
-          if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
-          return this[_addHashTableEntry$](strings, element);
-        } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
-          let nums = this[_nums$];
-          if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
-          return this[_addHashTableEntry$](nums, element);
-        } else {
-          return this[_add$0](element);
-        }
-      }
-      [_add$0](element) {
-        E._check(element);
-        let rest = this[_rest$];
-        if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
-        let hash = this[_computeHashCode](element);
-        let bucket = rest[hash];
-        if (bucket == null) {
-          let cell = this[_newLinkedCell$](element);
-          collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
-        } else {
-          let index = this[_findBucketIndex](bucket, element);
-          if (dart.notNull(index) >= 0) return false;
-          let cell = this[_newLinkedCell$](element);
-          bucket.push(cell);
-        }
-        return true;
-      }
-      remove(object) {
-        if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
-          return this[_removeHashTableEntry$](this[_strings$], object);
-        } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
-          return this[_removeHashTableEntry$](this[_nums$], object);
-        } else {
-          return this[_remove](object);
-        }
-      }
-      [_remove](object) {
-        let rest = this[_rest$];
-        if (rest == null) return false;
-        let bucket = this[_getBucket$](rest, object);
-        let index = this[_findBucketIndex](bucket, object);
-        if (dart.notNull(index) < 0) return false;
-        let cell = bucket.splice(index, 1)[0];
-        this[_unlinkCell$](cell);
-        return true;
-      }
-      removeWhere(test) {
-        this[_filterWhere](test, true);
-      }
-      retainWhere(test) {
-        this[_filterWhere](test, false);
-      }
-      [_filterWhere](test, removeMatching) {
-        let cell = this[_first$];
-        while (cell != null) {
-          let element = cell[_element];
-          let next = cell[_next$0];
-          let modifications = this[_modifications$];
-          let shouldRemove = removeMatching == test(element);
-          if (modifications != this[_modifications$]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          if (shouldRemove) this.remove(element);
-          cell = next;
-        }
-      }
-      clear() {
-        if (dart.notNull(this[_length$1]) > 0) {
-          this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
-          this[_length$1] = 0;
-          this[_modified$]();
-        }
-      }
-      [_addHashTableEntry$](table, element) {
-        E._check(element);
-        let cell = this[_getTableEntry](table, element);
-        if (cell != null) return false;
-        collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
-        return true;
-      }
-      [_removeHashTableEntry$](table, element) {
-        if (table == null) return false;
-        let cell = this[_getTableEntry](table, element);
-        if (cell == null) return false;
-        this[_unlinkCell$](cell);
-        collection._LinkedHashSet._deleteTableEntry(table, element);
-        return true;
-      }
-      [_modified$]() {
-        this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
-      }
-      [_newLinkedCell$](element) {
-        E._check(element);
-        let cell = new (_LinkedHashSetCellOfE())(element);
-        if (this[_first$] == null) {
-          this[_first$] = this[_last$] = cell;
-        } else {
-          let last = this[_last$];
-          cell[_previous$0] = last;
-          this[_last$] = last[_next$0] = cell;
-        }
-        this[_length$1] = dart.notNull(this[_length$1]) + 1;
-        this[_modified$]();
-        return cell;
-      }
-      [_unlinkCell$](cell) {
-        _LinkedHashSetCellOfE()._check(cell);
-        let previous = cell[_previous$0];
-        let next = cell[_next$0];
-        if (previous == null) {
-          dart.assert(dart.equals(cell, this[_first$]));
-          this[_first$] = next;
-        } else {
-          previous[_next$0] = next;
-        }
-        if (next == null) {
-          dart.assert(dart.equals(cell, this[_last$]));
-          this[_last$] = previous;
-        } else {
-          next[_previous$0] = previous;
-        }
-        this[_length$1] = dart.notNull(this[_length$1]) - 1;
-        this[_modified$]();
-      }
-      static _isStringElement(element) {
-        return typeof element == 'string' && element != '__proto__';
-      }
-      static _isNumericElement(element) {
-        return typeof element == 'number' && (element & 0x3ffffff) === element;
-      }
-      [_computeHashCode](element) {
-        return dart.hashCode(element) & 0x3ffffff;
-      }
-      [_getTableEntry](table, key) {
-        return table[key];
-      }
-      static _setTableEntry(table, key, value) {
-        dart.assert(value != null);
-        table[key] = value;
-      }
-      static _deleteTableEntry(table, key) {
-        delete table[key];
-      }
-      [_getBucket$](table, element) {
-        let hash = this[_computeHashCode](element);
-        return table[hash];
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (dart.equals(cell[_element], element)) return i;
-        }
-        return -1;
-      }
-      static _newHashTable() {
-        let table = Object.create(null);
-        let temporaryKey = '<non-identifier-key>';
-        collection._LinkedHashSet._setTableEntry(table, temporaryKey, table);
-        collection._LinkedHashSet._deleteTableEntry(table, temporaryKey);
-        return table;
-      }
-    }
-    _LinkedHashSet[dart.implements] = () => [LinkedHashSetOfE()];
-    dart.setSignature(_LinkedHashSet, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
-      fields: () => ({
-        [_length$1]: core.int,
-        [_strings$]: dart.dynamic,
-        [_nums$]: dart.dynamic,
-        [_rest$]: dart.dynamic,
-        [_first$]: _LinkedHashSetCellOfE(),
-        [_last$]: _LinkedHashSetCellOfE(),
-        [_modifications$]: core.int
-      }),
-      getters: () => ({
-        iterator: dart.definiteFunctionType(core.Iterator$(E), []),
-        length: dart.definiteFunctionType(core.int, [])
-      }),
-      methods: () => ({
-        [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
-        [_unsupported]: dart.definiteFunctionType(dart.void, [core.String]),
-        contains: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
-        lookup: dart.definiteFunctionType(E, [core.Object]),
-        [_lookup]: dart.definiteFunctionType(E, [core.Object]),
-        add: dart.definiteFunctionType(core.bool, [E]),
-        [_add$0]: dart.definiteFunctionType(core.bool, [E]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
-        [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
-        [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
-        [_modified$]: dart.definiteFunctionType(dart.void, []),
-        [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
-        [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
-        [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
-        [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
-        [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
-        [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
-      }),
-      statics: () => ({
-        _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-        _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-        _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-        _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
-      }),
-      names: ['_isStringElement', '_isNumericElement', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
-    });
-    dart.defineExtensionMembers(_LinkedHashSet, [
-      'contains',
-      'forEach',
-      'iterator',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last'
-    ]);
-    return _LinkedHashSet;
-  });
-  collection._LinkedHashSet = _LinkedHashSet();
-  collection._LinkedIdentityHashSet$ = dart.generic(E => {
-    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
-    class _LinkedIdentityHashSet extends collection._LinkedHashSet$(E) {
-      new() {
-        super.new();
-      }
-      [_newSet]() {
-        return new (_LinkedIdentityHashSetOfE())();
-      }
-      [_computeHashCode](key) {
-        return core.identityHashCode(key) & 0x3ffffff;
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (core.identical(cell[_element], element)) return i;
-        }
-        return -1;
-      }
-    }
-    return _LinkedIdentityHashSet;
-  });
-  collection._LinkedIdentityHashSet = _LinkedIdentityHashSet();
-  collection._LinkedCustomHashSet$ = dart.generic(E => {
-    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
-    let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
-    let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
-    class _LinkedCustomHashSet extends collection._LinkedHashSet$(E) {
-      new(equality, hasher, validKey) {
-        this[_equality] = equality;
-        this[_hasher] = hasher;
-        this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
-        super.new();
-      }
-      [_newSet]() {
-        return new (_LinkedCustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
-      }
-      [_findBucketIndex](bucket, element) {
-        if (bucket == null) return -1;
-        let length = bucket.length;
-        for (let i = 0; i < length; i++) {
-          let cell = bucket[i];
-          if (dart.test(this[_equality](cell[_element], E._check(element)))) return i;
-        }
-        return -1;
-      }
-      [_computeHashCode](element) {
-        return this[_hasher](E._check(element)) & 0x3ffffff;
-      }
-      add(element) {
-        E._check(element);
-        return super[_add$0](element);
-      }
-      contains(object) {
-        if (!dart.test(this[_validKey](object))) return false;
-        return super[_contains](object);
-      }
-      lookup(object) {
-        if (!dart.test(this[_validKey](object))) return null;
-        return super[_lookup](object);
-      }
-      remove(object) {
-        if (!dart.test(this[_validKey](object))) return false;
-        return super[_remove](object);
-      }
-      containsAll(elements) {
-        for (let element of elements) {
-          if (!dart.test(this[_validKey](element)) || !dart.test(this.contains(element))) return false;
-        }
-        return true;
-      }
-      removeAll(elements) {
-        for (let element of elements) {
-          if (dart.test(this[_validKey](element))) {
-            super[_remove](element);
-          }
-        }
-      }
-    }
-    dart.setSignature(_LinkedCustomHashSet, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
-      fields: () => ({
-        [_equality]: _EqualityOfE(),
-        [_hasher]: _HasherOfE(),
-        [_validKey]: _PredicateOfObject()
-      })
-    });
-    dart.defineExtensionMembers(_LinkedCustomHashSet, ['contains']);
-    return _LinkedCustomHashSet;
-  });
-  collection._LinkedCustomHashSet = _LinkedCustomHashSet();
-  collection._LinkedHashSetCell$ = dart.generic(E => {
-    let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
-    class _LinkedHashSetCell extends core.Object {
-      new(element) {
-        this[_element] = element;
-        this[_next$0] = null;
-        this[_previous$0] = null;
-      }
-    }
-    dart.addTypeTests(_LinkedHashSetCell);
-    dart.setSignature(_LinkedHashSetCell, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
-      fields: () => ({
-        [_element]: E,
-        [_next$0]: _LinkedHashSetCellOfE(),
-        [_previous$0]: _LinkedHashSetCellOfE()
-      })
-    });
-    return _LinkedHashSetCell;
-  });
-  collection._LinkedHashSetCell = _LinkedHashSetCell();
-  const _cell$ = Symbol('_cell');
-  collection._LinkedHashSetIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class _LinkedHashSetIterator extends core.Object {
-      new(set, modifications) {
-        this[_set] = set;
-        this[_modifications$] = modifications;
-        this[_cell$] = null;
-        this[_current$2] = null;
-        this[_cell$] = this[_set][_first$];
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        if (this[_modifications$] != this[_set][_modifications$]) {
-          dart.throw(new core.ConcurrentModificationError(this[_set]));
-        } else if (this[_cell$] == null) {
-          this[_current$2] = null;
-          return false;
-        } else {
-          this[_current$2] = E._check(this[_cell$][_element]);
-          this[_cell$] = this[_cell$][_next$0];
-          return true;
-        }
-      }
-    }
-    dart.addTypeTests(_LinkedHashSetIterator);
-    _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_LinkedHashSetIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [collection._LinkedHashSet, core.int])}),
-      fields: () => ({
-        [_set]: collection._LinkedHashSet,
-        [_modifications$]: core.int,
-        [_cell$]: collection._LinkedHashSetCell,
-        [_current$2]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _LinkedHashSetIterator;
-  });
-  collection._LinkedHashSetIterator = _LinkedHashSetIterator();
-  const _source$0 = Symbol('_source');
-  collection.UnmodifiableListView$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
-      new(source) {
-        this[_source$0] = source;
-      }
-      get length() {
-        return this[_source$0][dartx.length];
-      }
-      set length(value) {
-        super.length = value;
-      }
-      _get(index) {
-        return this[_source$0][dartx.elementAt](index);
-      }
-    }
-    dart.setSignature(UnmodifiableListView, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
-      fields: () => ({[_source$0]: IterableOfE()}),
-      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-      methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
-    });
-    dart.defineExtensionMembers(UnmodifiableListView, ['_get', 'length']);
-    return UnmodifiableListView;
-  });
-  collection.UnmodifiableListView = UnmodifiableListView();
-  collection._defaultEquals = function(a, b) {
-    return dart.equals(a, b);
-  };
-  dart.lazyFn(collection._defaultEquals, () => dynamicAnddynamicTobool());
-  collection._defaultHashCode = function(a) {
-    return dart.hashCode(a);
-  };
-  dart.fn(collection._defaultHashCode, dynamicToint());
-  collection._Equality$ = dart.generic(K => {
-    const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
-    return _Equality;
-  });
-  collection._Equality = _Equality$();
-  collection._Hasher$ = dart.generic(K => {
-    const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
-    return _Hasher;
-  });
-  collection._Hasher = _Hasher();
-  collection.HashMap$ = dart.generic((K, V) => {
-    let _HashMapOfK$V = () => (_HashMapOfK$V = dart.constFn(collection._HashMap$(K, V)))();
-    let _IdentityHashMapOfK$V = () => (_IdentityHashMapOfK$V = dart.constFn(collection._IdentityHashMap$(K, V)))();
-    let _CustomHashMapOfK$V = () => (_CustomHashMapOfK$V = dart.constFn(collection._CustomHashMap$(K, V)))();
-    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
-    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
-    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
-    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
-    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
-    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    class HashMap extends core.Object {
-      static new(opts) {
-        let equals = opts && 'equals' in opts ? opts.equals : null;
-        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
-        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
-        if (isValidKey == null) {
-          if (hashCode == null) {
-            if (equals == null) {
-              return new (_HashMapOfK$V())();
-            }
-            hashCode = collection._defaultHashCode;
-          } else {
-            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
-              return new (_IdentityHashMapOfK$V())();
-            }
-            if (equals == null) {
-              equals = collection._defaultEquals;
-            }
-          }
-        } else {
-          if (hashCode == null) {
-            hashCode = collection._defaultHashCode;
-          }
-          if (equals == null) {
-            equals = collection._defaultEquals;
-          }
-        }
-        return new (_CustomHashMapOfK$V())(equals, hashCode, isValidKey);
-      }
-      static identity() {
-        return new (_IdentityHashMapOfK$V())();
-      }
-      static from(other) {
-        let result = HashMapOfK$V().new();
-        other[dartx.forEach](dart.fn((k, v) => {
-          result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicToNull()));
-        return result;
-      }
-      static fromIterable(iterable, opts) {
-        let key = opts && 'key' in opts ? opts.key : null;
-        let value = opts && 'value' in opts ? opts.value : null;
-        let map = HashMapOfK$V().new();
-        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
-        return map;
-      }
-      static fromIterables(keys, values) {
-        let map = HashMapOfK$V().new();
-        collection.Maps._fillMapWithIterables(map, keys, values);
-        return map;
-      }
-    }
-    dart.addTypeTests(HashMap);
-    HashMap[dart.implements] = () => [MapOfK$V()];
-    dart.setSignature(HashMap, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.HashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
-        identity: dart.definiteFunctionType(collection.HashMap$(K, V), []),
-        from: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Map]),
-        fromIterable: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
-        fromIterables: dart.definiteFunctionType(collection.HashMap$(K, V), [IterableOfK(), IterableOfV()])
-      })
-    });
-    return HashMap;
-  });
-  collection.HashMap = HashMap();
-  collection.HashSet$ = dart.generic(E => {
-    let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
-    let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
-    let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
-    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
-    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
-    class HashSet extends core.Object {
-      static new(opts) {
-        let equals = opts && 'equals' in opts ? opts.equals : null;
-        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
-        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
-        if (isValidKey == null) {
-          if (hashCode == null) {
-            if (equals == null) {
-              return new (_HashSetOfE())();
-            }
-            hashCode = collection._defaultHashCode;
-          } else {
-            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
-              return new (_IdentityHashSetOfE())();
-            }
-            if (equals == null) {
-              equals = collection._defaultEquals;
-            }
-          }
-        } else {
-          if (hashCode == null) {
-            hashCode = collection._defaultHashCode;
-          }
-          if (equals == null) {
-            equals = collection._defaultEquals;
-          }
-        }
-        return new (_CustomHashSetOfE())(equals, hashCode, isValidKey);
-      }
-      static identity() {
-        return new (_IdentityHashSetOfE())();
-      }
-      static from(elements) {
-        let result = HashSetOfE().new();
-        for (let e of elements) {
-          let element = E.as(e);
-          result.add(element);
-        }
-        return result;
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
-    }
-    dart.addTypeTests(HashSet);
-    HashSet[dart.implements] = () => [SetOfE()];
-    dart.setSignature(HashSet, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.HashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
-        identity: dart.definiteFunctionType(collection.HashSet$(E), []),
-        from: dart.definiteFunctionType(collection.HashSet$(E), [core.Iterable])
-      })
-    });
-    return HashSet;
-  });
-  collection.HashSet = HashSet();
-  collection.IterableMixin$ = dart.generic(E => {
-    let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
-    let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
-    let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
-    let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
-    let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
-    let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class IterableMixin extends core.Object {
-      map(T) {
-        return f => {
-          return _internal.MappedIterable$(E, T).new(this, f);
-        };
-      }
-      where(f) {
-        return new (WhereIterableOfE())(this, f);
-      }
-      expand(T) {
-        return f => {
-          return new (_internal.ExpandIterable$(E, T))(this, f);
-        };
-      }
-      contains(element) {
-        for (let e of this) {
-          if (dart.equals(e, element)) return true;
-        }
-        return false;
-      }
-      forEach(f) {
-        for (let element of this)
-          f(element);
-      }
-      reduce(combine) {
-        EAndEToE()._check(combine);
-        let iterator = this.iterator;
-        if (!dart.test(iterator.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let value = iterator.current;
-        while (dart.test(iterator.moveNext())) {
-          value = combine(value, iterator.current);
-        }
-        return value;
-      }
-      fold(T) {
-        return (initialValue, combine) => {
-          let value = initialValue;
-          for (let element of this)
-            value = combine(value, element);
-          return value;
-        };
-      }
-      every(f) {
-        for (let element of this) {
-          if (!dart.test(f(element))) return false;
-        }
-        return true;
-      }
-      join(separator) {
-        if (separator === void 0) separator = "";
-        let iterator = this.iterator;
-        if (!dart.test(iterator.moveNext())) return "";
-        let buffer = new core.StringBuffer();
-        if (separator == null || separator == "") {
-          do {
-            buffer.write(dart.str`${iterator.current}`);
-          } while (dart.test(iterator.moveNext()));
-        } else {
-          buffer.write(dart.str`${iterator.current}`);
-          while (dart.test(iterator.moveNext())) {
-            buffer.write(separator);
-            buffer.write(dart.str`${iterator.current}`);
-          }
-        }
-        return buffer.toString();
-      }
-      any(f) {
-        for (let element of this) {
-          if (dart.test(f(element))) return true;
-        }
-        return false;
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        return ListOfE().from(this, {growable: growable});
-      }
-      toSet() {
-        return SetOfE().from(this);
-      }
-      get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
-        let count = 0;
-        let it = this[dartx.iterator];
-        while (dart.test(it.moveNext())) {
-          count++;
-        }
-        return count;
-      }
-      get isEmpty() {
-        return !dart.test(this[dartx.iterator].moveNext());
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      take(count) {
-        return TakeIterableOfE().new(this, count);
-      }
-      takeWhile(test) {
-        return new (TakeWhileIterableOfE())(this, test);
-      }
-      skip(count) {
-        return SkipIterableOfE().new(this, count);
-      }
-      skipWhile(test) {
-        return new (SkipWhileIterableOfE())(this, test);
-      }
-      get first() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        return it.current;
-      }
-      get last() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) {
-          dart.throw(_internal.IterableElementError.noElement());
-        }
-        let result = null;
-        do {
-          result = it.current;
-        } while (dart.test(it.moveNext()));
-        return result;
-      }
-      get single() {
-        let it = this[dartx.iterator];
-        if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
-        let result = it.current;
-        if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
-        return result;
-      }
-      firstWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        for (let element of this) {
-          if (dart.test(test(element))) return element;
-        }
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      lastWhere(test, opts) {
-        let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-        VoidToE()._check(orElse);
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        if (orElse != null) return orElse();
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      singleWhere(test) {
-        let result = null;
-        let foundMatching = false;
-        for (let element of this) {
-          if (dart.test(test(element))) {
-            if (foundMatching) {
-              dart.throw(_internal.IterableElementError.tooMany());
-            }
-            result = element;
-            foundMatching = true;
-          }
-        }
-        if (foundMatching) return result;
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      elementAt(index) {
-        if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
-        core.RangeError.checkNotNegative(index, "index");
-        let elementIndex = 0;
-        for (let element of this) {
-          if (index == elementIndex) return element;
-          elementIndex++;
-        }
-        dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
-      }
-      toString() {
-        return collection.IterableBase.iterableToShortString(this, '(', ')');
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
-    }
-    dart.addTypeTests(IterableMixin);
-    IterableMixin[dart.implements] = () => [IterableOfE()];
-    dart.setSignature(IterableMixin, {
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        first: dart.definiteFunctionType(E, []),
-        last: dart.definiteFunctionType(E, []),
-        single: dart.definiteFunctionType(E, [])
-      }),
-      methods: () => ({
-        map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
-        where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
-        contains: dart.definiteFunctionType(core.bool, [core.Object]),
-        forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
-        reduce: dart.definiteFunctionType(E, [EAndEToE()]),
-        fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
-        every: dart.definiteFunctionType(core.bool, [ETobool()]),
-        join: dart.definiteFunctionType(core.String, [], [core.String]),
-        any: dart.definiteFunctionType(core.bool, [ETobool()]),
-        toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
-        toSet: dart.definiteFunctionType(core.Set$(E), []),
-        take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
-        skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
-        firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
-        singleWhere: dart.definiteFunctionType(E, [ETobool()]),
-        elementAt: dart.definiteFunctionType(E, [core.int])
-      })
-    });
-    dart.defineExtensionMembers(IterableMixin, [
-      'map',
-      'where',
-      'expand',
-      'contains',
-      'forEach',
-      'reduce',
-      'fold',
-      'every',
-      'join',
-      'any',
-      'toList',
-      'toSet',
-      'take',
-      'takeWhile',
-      'skip',
-      'skipWhile',
-      'firstWhere',
-      'lastWhere',
-      'singleWhere',
-      'elementAt',
-      'toString',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last',
-      'single'
-    ]);
-    return IterableMixin;
-  });
-  collection.IterableMixin = IterableMixin();
-  dart.defineLazy(collection, {
-    get _toStringVisiting() {
-      return [];
-    }
-  });
-  collection._isToStringVisiting = function(o) {
-    for (let i = 0; i < dart.notNull(collection._toStringVisiting[dartx.length]); i++) {
-      if (core.identical(o, collection._toStringVisiting[dartx._get](i))) return true;
-    }
-    return false;
-  };
-  dart.lazyFn(collection._isToStringVisiting, () => ObjectTobool());
-  collection._iterablePartsToStrings = function(iterable, parts) {
-    let LENGTH_LIMIT = 80;
-    let HEAD_COUNT = 3;
-    let TAIL_COUNT = 2;
-    let MAX_COUNT = 100;
-    let OVERHEAD = 2;
-    let ELLIPSIS_SIZE = 3;
-    let length = 0;
-    let count = 0;
-    let it = iterable[dartx.iterator];
-    while (dart.notNull(length) < LENGTH_LIMIT || count < HEAD_COUNT) {
-      if (!dart.test(it.moveNext())) return;
-      let next = dart.str`${it.current}`;
-      parts[dartx.add](next);
-      length = dart.notNull(length) + (dart.notNull(next[dartx.length]) + OVERHEAD);
-      count++;
-    }
-    let penultimateString = null;
-    let ultimateString = null;
-    let penultimate = null;
-    let ultimate = null;
-    if (!dart.test(it.moveNext())) {
-      if (count <= HEAD_COUNT + TAIL_COUNT) return;
-      ultimateString = core.String._check(parts[dartx.removeLast]());
-      penultimateString = core.String._check(parts[dartx.removeLast]());
-    } else {
-      penultimate = it.current;
-      count++;
-      if (!dart.test(it.moveNext())) {
-        if (count <= HEAD_COUNT + 1) {
-          parts[dartx.add](dart.str`${penultimate}`);
-          return;
-        }
-        ultimateString = dart.str`${penultimate}`;
-        penultimateString = core.String._check(parts[dartx.removeLast]());
-        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + OVERHEAD);
-      } else {
-        ultimate = it.current;
+    get length() {
+      let future = new (_FutureOfint())();
+      let count = 0;
+      this.listen(dart.fn(_ => {
         count++;
-        dart.assert(count < MAX_COUNT);
-        while (dart.test(it.moveNext())) {
-          penultimate = ultimate;
-          ultimate = it.current;
-          count++;
-          if (count > MAX_COUNT) {
-            while (dart.notNull(length) > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD && count > HEAD_COUNT) {
-              length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
-              count--;
-            }
-            parts[dartx.add]("...");
-            return;
-          }
-        }
-        penultimateString = dart.str`${penultimate}`;
-        ultimateString = dart.str`${ultimate}`;
-        length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + dart.notNull(penultimateString[dartx.length]) + 2 * OVERHEAD);
-      }
-    }
-    let elision = null;
-    if (count > dart.notNull(parts[dartx.length]) + TAIL_COUNT) {
-      elision = "...";
-      length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
-    }
-    while (dart.notNull(length) > LENGTH_LIMIT && dart.notNull(parts[dartx.length]) > HEAD_COUNT) {
-      length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
-      if (elision == null) {
-        elision = "...";
-        length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
-      }
-    }
-    if (elision != null) {
-      parts[dartx.add](elision);
-    }
-    parts[dartx.add](penultimateString);
-    parts[dartx.add](ultimateString);
-  };
-  dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
-  const _iterator$0 = Symbol('_iterator');
-  const _state$ = Symbol('_state');
-  const _move = Symbol('_move');
-  collection.HasNextIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class HasNextIterator extends core.Object {
-      new(iterator) {
-        this[_iterator$0] = iterator;
-        this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
-      }
-      get hasNext() {
-        if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
-        return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
-      }
-      next() {
-        if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
-        dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
-        let result = this[_iterator$0].current;
-        this[_move]();
-        return result;
-      }
-      [_move]() {
-        if (dart.test(this[_iterator$0].moveNext())) {
-          this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
-        } else {
-          this[_state$] = collection.HasNextIterator._NO_NEXT;
-        }
-      }
-    }
-    dart.addTypeTests(HasNextIterator);
-    dart.setSignature(HasNextIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
-      fields: () => ({
-        [_iterator$0]: IteratorOfE(),
-        [_state$]: core.int
-      }),
-      getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
-      methods: () => ({
-        next: dart.definiteFunctionType(E, []),
-        [_move]: dart.definiteFunctionType(dart.void, [])
-      }),
-      sfields: () => ({
-        _HAS_NEXT_AND_NEXT_IN_CURRENT: core.int,
-        _NO_NEXT: core.int,
-        _NOT_MOVED_YET: core.int
-      })
-    });
-    return HasNextIterator;
-  });
-  collection.HasNextIterator = HasNextIterator();
-  collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
-  collection.HasNextIterator._NO_NEXT = 1;
-  collection.HasNextIterator._NOT_MOVED_YET = 2;
-  collection.LinkedHashMap$ = dart.generic((K, V) => {
-    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
-    let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
-    let _LinkedCustomHashMapOfK$V = () => (_LinkedCustomHashMapOfK$V = dart.constFn(collection._LinkedCustomHashMap$(K, V)))();
-    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
-    let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
-    let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
-    let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
-    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
-    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
-    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
-    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    class LinkedHashMap extends core.Object {
-      static new(opts) {
-        let equals = opts && 'equals' in opts ? opts.equals : null;
-        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
-        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
-        if (isValidKey == null) {
-          if (hashCode == null) {
-            if (equals == null) {
-              return JsLinkedHashMapOfK$V().es6();
-            }
-            hashCode = collection._defaultHashCode;
-          } else {
-            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
-              return _LinkedIdentityHashMapOfK$V().es6();
-            }
-            if (equals == null) {
-              equals = collection._defaultEquals;
-            }
-          }
-        } else {
-          if (hashCode == null) {
-            hashCode = collection._defaultHashCode;
-          }
-          if (equals == null) {
-            equals = collection._defaultEquals;
-          }
-        }
-        return new (_LinkedCustomHashMapOfK$V())(equals, hashCode, isValidKey);
-      }
-      static identity() {
-        return _LinkedIdentityHashMapOfK$V().es6();
-      }
-      static from(other) {
-        let result = LinkedHashMapOfK$V().new();
-        other[dartx.forEach](dart.fn((k, v) => {
-          result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicToNull()));
-        return result;
-      }
-      static fromIterable(iterable, opts) {
-        let key = opts && 'key' in opts ? opts.key : null;
-        let value = opts && 'value' in opts ? opts.value : null;
-        let map = LinkedHashMapOfK$V().new();
-        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
-        return map;
-      }
-      static fromIterables(keys, values) {
-        let map = LinkedHashMapOfK$V().new();
-        collection.Maps._fillMapWithIterables(map, keys, values);
-        return map;
-      }
-    }
-    dart.addTypeTests(LinkedHashMap);
-    LinkedHashMap[dart.implements] = () => [HashMapOfK$V()];
-    dart.setSignature(LinkedHashMap, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
-        identity: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), []),
-        from: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Map]),
-        fromIterable: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
-        fromIterables: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [IterableOfK(), IterableOfV()])
-      })
-    });
-    return LinkedHashMap;
-  });
-  collection.LinkedHashMap = LinkedHashMap();
-  collection.LinkedHashSet$ = dart.generic(E => {
-    let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
-    let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
-    let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
-    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-    let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
-    let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
-    let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
-    class LinkedHashSet extends core.Object {
-      static new(opts) {
-        let equals = opts && 'equals' in opts ? opts.equals : null;
-        let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
-        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
-        if (isValidKey == null) {
-          if (hashCode == null) {
-            if (equals == null) {
-              return new (_LinkedHashSetOfE())();
-            }
-            hashCode = collection._defaultHashCode;
-          } else {
-            if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
-              return new (_LinkedIdentityHashSetOfE())();
-            }
-            if (equals == null) {
-              equals = collection._defaultEquals;
-            }
-          }
-        } else {
-          if (hashCode == null) {
-            hashCode = collection._defaultHashCode;
-          }
-          if (equals == null) {
-            equals = collection._defaultEquals;
-          }
-        }
-        return new (_LinkedCustomHashSetOfE())(equals, hashCode, isValidKey);
-      }
-      static identity() {
-        return new (_LinkedIdentityHashSetOfE())();
-      }
-      static from(elements) {
-        let result = LinkedHashSetOfE().new();
-        for (let element of elements) {
-          let e = E.as(element);
-          result.add(e);
-        }
-        return result;
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
-    }
-    dart.addTypeTests(LinkedHashSet);
-    LinkedHashSet[dart.implements] = () => [HashSetOfE()];
-    dart.setSignature(LinkedHashSet, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.LinkedHashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
-        identity: dart.definiteFunctionType(collection.LinkedHashSet$(E), []),
-        from: dart.definiteFunctionType(collection.LinkedHashSet$(E), [core.Iterable])
-      })
-    });
-    return LinkedHashSet;
-  });
-  collection.LinkedHashSet = LinkedHashSet();
-  const _modificationCount = Symbol('_modificationCount');
-  const _insertBefore$ = Symbol('_insertBefore');
-  const _list = Symbol('_list');
-  const _unlink$ = Symbol('_unlink');
-  collection.LinkedList$ = dart.generic(E => {
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class LinkedList extends core.Iterable$(E) {
-      new() {
-        this[_modificationCount] = 0;
-        this[_length$1] = 0;
-        this[_first$] = null;
-        super.new();
-      }
-      addFirst(entry) {
-        E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: true});
-        this[_first$] = entry;
-      }
-      add(entry) {
-        E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: false});
-      }
-      addAll(entries) {
-        IterableOfE()._check(entries);
-        entries[dartx.forEach](dart.bind(this, 'add'));
-      }
-      remove(entry) {
-        E._check(entry);
-        if (!dart.equals(entry[_list], this)) return false;
-        this[_unlink$](entry);
-        return true;
-      }
-      get iterator() {
-        return new (_LinkedListIteratorOfE())(this);
-      }
-      get length() {
-        return this[_length$1];
-      }
-      clear() {
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        if (dart.test(this.isEmpty)) return;
-        let next = this[_first$];
-        do {
-          let entry = next;
-          next = entry[_next$0];
-          entry[_next$0] = entry[_previous$0] = entry[_list] = null;
-        } while (!core.identical(next, this[_first$]));
-        this[_first$] = null;
-        this[_length$1] = 0;
-      }
-      get first() {
-        if (dart.test(this.isEmpty)) {
-          dart.throw(new core.StateError('No such element'));
-        }
-        return this[_first$];
-      }
-      get last() {
-        if (dart.test(this.isEmpty)) {
-          dart.throw(new core.StateError('No such element'));
-        }
-        return this[_first$][_previous$0];
-      }
-      get single() {
-        if (dart.test(this.isEmpty)) {
-          dart.throw(new core.StateError('No such element'));
-        }
-        if (dart.notNull(this[_length$1]) > 1) {
-          dart.throw(new core.StateError('Too many elements'));
-        }
-        return this[_first$];
-      }
-      forEach(action) {
-        let modificationCount = this[_modificationCount];
-        if (dart.test(this.isEmpty)) return;
-        let current = this[_first$];
-        do {
-          action(current);
-          if (modificationCount != this[_modificationCount]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          current = current[_next$0];
-        } while (!core.identical(current, this[_first$]));
-      }
-      get isEmpty() {
-        return this[_length$1] == 0;
-      }
-      [_insertBefore$](entry, newEntry, opts) {
-        E._check(entry);
-        E._check(newEntry);
-        let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
-        if (newEntry.list != null) {
-          dart.throw(new core.StateError('LinkedListEntry is already in a LinkedList'));
-        }
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        newEntry[_list] = this;
-        if (dart.test(this.isEmpty)) {
-          dart.assert(entry == null);
-          newEntry[_previous$0] = newEntry[_next$0] = newEntry;
-          this[_first$] = newEntry;
-          this[_length$1] = dart.notNull(this[_length$1]) + 1;
-          return;
-        }
-        let predecessor = entry[_previous$0];
-        let successor = entry;
-        newEntry[_previous$0] = predecessor;
-        newEntry[_next$0] = successor;
-        predecessor[_next$0] = newEntry;
-        successor[_previous$0] = newEntry;
-        if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
-          this[_first$] = newEntry;
-        }
-        this[_length$1] = dart.notNull(this[_length$1]) + 1;
-      }
-      [_unlink$](entry) {
-        E._check(entry);
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        entry[_next$0][_previous$0] = entry[_previous$0];
-        let next = entry[_previous$0][_next$0] = entry[_next$0];
-        this[_length$1] = dart.notNull(this[_length$1]) - 1;
-        entry[_list] = entry[_next$0] = entry[_previous$0] = null;
-        if (dart.test(this.isEmpty)) {
-          this[_first$] = null;
-        } else if (core.identical(entry, this[_first$])) {
-          this[_first$] = next;
-        }
-      }
-    }
-    dart.setSignature(LinkedList, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
-      fields: () => ({
-        [_modificationCount]: core.int,
-        [_length$1]: core.int,
-        [_first$]: E
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({
-        addFirst: dart.definiteFunctionType(dart.void, [E]),
-        add: dart.definiteFunctionType(dart.void, [E]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        remove: dart.definiteFunctionType(core.bool, [E]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [E])
-      })
-    });
-    dart.defineExtensionMembers(LinkedList, [
-      'forEach',
-      'iterator',
-      'length',
-      'first',
-      'last',
-      'single',
-      'isEmpty'
-    ]);
-    return LinkedList;
-  });
-  collection.LinkedList = LinkedList();
-  const _visitedFirst = Symbol('_visitedFirst');
-  collection._LinkedListIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
-    let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
-    class _LinkedListIterator extends core.Object {
-      new(list) {
-        this[_list] = list;
-        this[_modificationCount] = list[_modificationCount];
-        this[_next$0] = list[_first$];
-        this[_visitedFirst] = false;
-        this[_current$2] = null;
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        if (this[_modificationCount] != this[_list][_modificationCount]) {
-          dart.throw(new core.ConcurrentModificationError(this));
-        }
-        if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
-          this[_current$2] = null;
-          return false;
-        }
-        this[_visitedFirst] = true;
-        this[_current$2] = E._check(this[_next$0]);
-        this[_next$0] = this[_next$0][_next$0];
-        return true;
-      }
-    }
-    dart.addTypeTests(_LinkedListIterator);
-    _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_LinkedListIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._LinkedListIterator$(E), [LinkedListOfE()])}),
-      fields: () => ({
-        [_list]: LinkedListOfE(),
-        [_modificationCount]: core.int,
-        [_current$2]: E,
-        [_next$0]: LinkedListEntryOfE(),
-        [_visitedFirst]: core.bool
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _LinkedListIterator;
-  });
-  collection._LinkedListIterator = _LinkedListIterator();
-  collection.LinkedListEntry$ = dart.generic(E => {
-    let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
-    class LinkedListEntry extends core.Object {
-      new() {
-        this[_list] = null;
-        this[_next$0] = null;
-        this[_previous$0] = null;
-      }
-      get list() {
-        return this[_list];
-      }
-      unlink() {
-        this[_list][_unlink$](E._check(this));
-      }
-      get next() {
-        if (core.identical(this, this[_next$0])) return null;
-        return this[_next$0];
-      }
-      get previous() {
-        if (core.identical(this, this[_previous$0])) return null;
-        return this[_previous$0];
-      }
-      insertAfter(entry) {
-        E._check(entry);
-        this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
-      }
-      insertBefore(entry) {
-        E._check(entry);
-        this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
-      }
-    }
-    dart.addTypeTests(LinkedListEntry);
-    dart.setSignature(LinkedListEntry, {
-      fields: () => ({
-        [_list]: LinkedListOfE(),
-        [_next$0]: E,
-        [_previous$0]: E
-      }),
-      getters: () => ({
-        list: dart.definiteFunctionType(collection.LinkedList$(E), []),
-        next: dart.definiteFunctionType(E, []),
-        previous: dart.definiteFunctionType(E, [])
-      }),
-      methods: () => ({
-        unlink: dart.definiteFunctionType(dart.void, []),
-        insertAfter: dart.definiteFunctionType(dart.void, [E]),
-        insertBefore: dart.definiteFunctionType(dart.void, [E])
-      })
-    });
-    return LinkedListEntry;
-  });
-  collection.LinkedListEntry = LinkedListEntry();
-  collection.MapMixin$ = dart.generic((K, V) => {
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    class MapMixin extends core.Object {
-      forEach(action) {
-        for (let key of this.keys) {
-          action(key, this._get(key));
-        }
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        for (let key of other[dartx.keys]) {
-          this._set(key, other[dartx._get](key));
-        }
-      }
-      containsValue(value) {
-        for (let key of this.keys) {
-          if (dart.equals(this._get(key), value)) return true;
-        }
-        return false;
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        if (dart.test(this.containsKey(key))) {
-          return this._get(key);
-        }
-        return this._set(key, ifAbsent());
-      }
-      containsKey(key) {
-        return this.keys[dartx.contains](key);
-      }
-      get length() {
-        return this.keys[dartx.length];
-      }
-      get isEmpty() {
-        return this.keys[dartx.isEmpty];
-      }
-      get isNotEmpty() {
-        return this.keys[dartx.isNotEmpty];
-      }
-      get values() {
-        return new (_MapBaseValueIterableOfK$V())(this);
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-    }
-    dart.addTypeTests(MapMixin);
-    MapMixin[dart.implements] = () => [MapOfK$V()];
-    dart.setSignature(MapMixin, {
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        values: dart.definiteFunctionType(core.Iterable$(V), [])
-      }),
-      methods: () => ({
-        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object])
-      })
-    });
-    dart.defineExtensionMembers(MapMixin, [
-      'forEach',
-      'addAll',
-      'containsValue',
-      'putIfAbsent',
-      'containsKey',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'values'
-    ]);
-    return MapMixin;
-  });
-  collection.MapMixin = MapMixin();
-  collection.MapBase$ = dart.generic((K, V) => {
-    class MapBase extends dart.mixin(core.Object, collection.MapMixin$(K, V)) {}
-    return MapBase;
-  });
-  collection.MapBase = MapBase();
-  collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    class _UnmodifiableMapMixin extends core.Object {
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
-        return value;
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
-      }
-      clear() {
-        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
-      }
-      remove(key) {
-        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
-      }
-    }
-    dart.addTypeTests(_UnmodifiableMapMixin);
-    _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
-    dart.setSignature(_UnmodifiableMapMixin, {
-      methods: () => ({
-        _set: dart.definiteFunctionType(dart.void, [K, V]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        remove: dart.definiteFunctionType(V, [core.Object]),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()])
-      })
-    });
-    dart.defineExtensionMembers(_UnmodifiableMapMixin, [
-      '_set',
-      'addAll',
-      'clear',
-      'remove',
-      'putIfAbsent'
-    ]);
-    return _UnmodifiableMapMixin;
-  });
-  collection._UnmodifiableMapMixin = _UnmodifiableMapMixin();
-  collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
-    class UnmodifiableMapBase extends dart.mixin(collection.MapBase$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
-      new() {
-        super.new();
-      }
-    }
-    return UnmodifiableMapBase;
-  });
-  collection.UnmodifiableMapBase = UnmodifiableMapBase();
-  collection._MapBaseValueIterable$ = dart.generic((K, V) => {
-    let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    class _MapBaseValueIterable extends core.Iterable$(V) {
-      new(map) {
-        this[_map$0] = map;
-        super.new();
-      }
-      get length() {
-        return this[_map$0][dartx.length];
-      }
-      get isEmpty() {
-        return this[_map$0][dartx.isEmpty];
-      }
-      get isNotEmpty() {
-        return this[_map$0][dartx.isNotEmpty];
-      }
-      get first() {
-        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
-      }
-      get single() {
-        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
-      }
-      get last() {
-        return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
-      }
-      get iterator() {
-        return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
-      }
-    }
-    _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_MapBaseValueIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
-      fields: () => ({[_map$0]: MapOfK$V()}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
-    });
-    dart.defineExtensionMembers(_MapBaseValueIterable, [
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'single',
-      'last',
-      'iterator'
-    ]);
-    return _MapBaseValueIterable;
-  });
-  collection._MapBaseValueIterable = _MapBaseValueIterable();
-  collection._MapBaseValueIterator$ = dart.generic((K, V) => {
-    let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
-    class _MapBaseValueIterator extends core.Object {
-      new(map) {
-        this[_map$0] = map;
-        this[_keys] = map[dartx.keys][dartx.iterator];
-        this[_current$2] = null;
-      }
-      moveNext() {
-        if (dart.test(this[_keys].moveNext())) {
-          this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
-          return true;
-        }
-        this[_current$2] = null;
-        return false;
-      }
-      get current() {
-        return this[_current$2];
-      }
-    }
-    dart.addTypeTests(_MapBaseValueIterator);
-    _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
-    dart.setSignature(_MapBaseValueIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
-      fields: () => ({
-        [_keys]: IteratorOfK(),
-        [_map$0]: MapOfK$V(),
-        [_current$2]: V
-      }),
-      getters: () => ({current: dart.definiteFunctionType(V, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _MapBaseValueIterator;
-  });
-  collection._MapBaseValueIterator = _MapBaseValueIterator();
-  collection.MapView$ = dart.generic((K, V) => {
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    class MapView extends core.Object {
-      new(map) {
-        this[_map$0] = map;
-      }
-      _get(key) {
-        return this[_map$0][dartx._get](key);
-      }
-      _set(key, value) {
-        K._check(key);
-        V._check(value);
-        this[_map$0][dartx._set](key, value);
-        return value;
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        this[_map$0][dartx.addAll](other);
-      }
-      clear() {
-        this[_map$0][dartx.clear]();
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
-      }
-      containsKey(key) {
-        return this[_map$0][dartx.containsKey](key);
-      }
-      containsValue(value) {
-        return this[_map$0][dartx.containsValue](value);
-      }
-      forEach(action) {
-        this[_map$0][dartx.forEach](action);
-      }
-      get isEmpty() {
-        return this[_map$0][dartx.isEmpty];
-      }
-      get isNotEmpty() {
-        return this[_map$0][dartx.isNotEmpty];
-      }
-      get length() {
-        return this[_map$0][dartx.length];
-      }
-      get keys() {
-        return this[_map$0][dartx.keys];
-      }
-      remove(key) {
-        return this[_map$0][dartx.remove](key);
-      }
-      toString() {
-        return dart.toString(this[_map$0]);
-      }
-      get values() {
-        return this[_map$0][dartx.values];
-      }
-    }
-    dart.addTypeTests(MapView);
-    MapView[dart.implements] = () => [MapOfK$V()];
-    dart.setSignature(MapView, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
-      fields: () => ({[_map$0]: MapOfK$V()}),
-      getters: () => ({
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        length: dart.definiteFunctionType(core.int, []),
-        keys: dart.definiteFunctionType(core.Iterable$(K), []),
-        values: dart.definiteFunctionType(core.Iterable$(V), [])
-      }),
-      methods: () => ({
-        _get: dart.definiteFunctionType(V, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [K, V]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
-        remove: dart.definiteFunctionType(V, [core.Object])
-      })
-    });
-    dart.defineExtensionMembers(MapView, [
-      '_get',
-      '_set',
-      'addAll',
-      'clear',
-      'putIfAbsent',
-      'containsKey',
-      'containsValue',
-      'forEach',
-      'remove',
-      'isEmpty',
-      'isNotEmpty',
-      'length',
-      'keys',
-      'values'
-    ]);
-    return MapView;
-  });
-  collection.MapView = MapView();
-  collection.UnmodifiableMapView$ = dart.generic((K, V) => {
-    class UnmodifiableMapView extends dart.mixin(collection.MapView$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
-      new(map) {
-        super.new(map);
-      }
-    }
-    return UnmodifiableMapView;
-  });
-  collection.UnmodifiableMapView = UnmodifiableMapView();
-  collection.Maps = class Maps extends core.Object {
-    static containsValue(map, value) {
-      for (let v of map[dartx.values]) {
-        if (dart.equals(v, value)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    static containsKey(map, key) {
-      for (let k of map[dartx.keys]) {
-        if (dart.equals(k, key)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    static putIfAbsent(map, key, ifAbsent) {
-      if (dart.test(map[dartx.containsKey](key))) {
-        return map[dartx._get](key);
-      }
-      let v = ifAbsent();
-      map[dartx._set](key, v);
-      return v;
-    }
-    static clear(map) {
-      for (let k of map[dartx.keys][dartx.toList]()) {
-        map[dartx.remove](k);
-      }
-    }
-    static forEach(map, f) {
-      for (let k of map[dartx.keys]) {
-        dart.dcall(f, k, map[dartx._get](k));
-      }
-    }
-    static getValues(map) {
-      return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
-    }
-    static length(map) {
-      return map[dartx.keys][dartx.length];
-    }
-    static isEmpty(map) {
-      return map[dartx.keys][dartx.isEmpty];
-    }
-    static isNotEmpty(map) {
-      return map[dartx.keys][dartx.isNotEmpty];
-    }
-    static mapToString(m) {
-      if (dart.test(collection._isToStringVisiting(m))) {
-        return '{...}';
-      }
-      let result = new core.StringBuffer();
-      try {
-        collection._toStringVisiting[dartx.add](m);
-        result.write('{');
-        let first = true;
-        m[dartx.forEach](dart.fn((k, v) => {
-          if (!first) {
-            result.write(', ');
-          }
-          first = false;
-          result.write(k);
-          result.write(': ');
-          result.write(v);
-        }, dynamicAnddynamicToNull()));
-        result.write('}');
-      } finally {
-        dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
-        collection._toStringVisiting[dartx.removeLast]();
-      }
-      return result.toString();
-    }
-    static _id(x) {
-      return x;
-    }
-    static _fillMapWithMappedIterable(map, iterable, key, value) {
-      if (key == null) key = collection.Maps._id;
-      if (value == null) value = collection.Maps._id;
-      for (let element of iterable) {
-        map[dartx._set](dart.dcall(key, element), dart.dcall(value, element));
-      }
-    }
-    static _fillMapWithIterables(map, keys, values) {
-      let keyIterator = keys[dartx.iterator];
-      let valueIterator = values[dartx.iterator];
-      let hasNextKey = keyIterator.moveNext();
-      let hasNextValue = valueIterator.moveNext();
-      while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
-        map[dartx._set](keyIterator.current, valueIterator.current);
-        hasNextKey = keyIterator.moveNext();
-        hasNextValue = valueIterator.moveNext();
-      }
-      if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
-        dart.throw(new core.ArgumentError("Iterables do not have same length."));
-      }
-    }
-  };
-  dart.setSignature(collection.Maps, {
-    statics: () => ({
-      containsValue: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
-      containsKey: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
-      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [core.Map, dart.dynamic, VoidTodynamic()]),
-      clear: dart.definiteFunctionType(dart.dynamic, [core.Map]),
-      forEach: dart.definiteFunctionType(dart.dynamic, [core.Map, dynamicAnddynamicTovoid()]),
-      getValues: dart.definiteFunctionType(core.Iterable, [core.Map]),
-      length: dart.definiteFunctionType(core.int, [core.Map]),
-      isEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
-      mapToString: dart.definiteFunctionType(core.String, [core.Map]),
-      _id: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _fillMapWithMappedIterable: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, dynamicTodynamic(), dynamicTodynamic()]),
-      _fillMapWithIterables: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, core.Iterable])
-    }),
-    names: ['containsValue', 'containsKey', 'putIfAbsent', 'clear', 'forEach', 'getValues', 'length', 'isEmpty', 'isNotEmpty', 'mapToString', '_id', '_fillMapWithMappedIterable', '_fillMapWithIterables']
-  });
-  collection.Queue$ = dart.generic(E => {
-    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class Queue extends core.Object {
-      static new() {
-        return new (ListQueueOfE())();
-      }
-      static from(elements) {
-        return ListQueueOfE().from(elements);
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
-    }
-    dart.addTypeTests(Queue);
-    Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
-    dart.setSignature(Queue, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.Queue$(E), []),
-        from: dart.definiteFunctionType(collection.Queue$(E), [core.Iterable])
-      })
-    });
-    return Queue;
-  });
-  collection.Queue = Queue();
-  const _previousLink = Symbol('_previousLink');
-  const _nextLink = Symbol('_nextLink');
-  const _link = Symbol('_link');
-  collection._DoubleLink$ = dart.generic(E => {
-    class _DoubleLink extends core.Object {
-      new() {
-        this[_previousLink] = null;
-        this[_nextLink] = null;
-      }
-      [_link](previous, next) {
-        E._check(previous);
-        E._check(next);
-        this[_nextLink] = next;
-        this[_previousLink] = previous;
-        if (previous != null) previous[_nextLink] = this;
-        if (next != null) next[_previousLink] = this;
-      }
-      [_unlink$]() {
-        if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
-        if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
-        this[_nextLink] = null;
-        this[_previousLink] = null;
-      }
-    }
-    dart.addTypeTests(_DoubleLink);
-    dart.setSignature(_DoubleLink, {
-      fields: () => ({
-        [_previousLink]: E,
-        [_nextLink]: E
-      }),
-      methods: () => ({
-        [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _DoubleLink;
-  });
-  collection._DoubleLink = _DoubleLink();
-  collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-    class DoubleLinkedQueueEntry extends core.Object {
-      static new(element) {
-        return new (_UserDoubleLinkedQueueEntryOfE())(element);
-      }
-    }
-    dart.addTypeTests(DoubleLinkedQueueEntry);
-    dart.setSignature(DoubleLinkedQueueEntry, {
-      constructors: () => ({new: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [E])})
-    });
-    return DoubleLinkedQueueEntry;
-  });
-  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
-  collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-    class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
-      new(element) {
-        this.element = element;
-        super.new();
-      }
-      append(e) {
-        E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
-      }
-      prepend(e) {
-        E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
-      }
-      remove() {
-        this[_unlink$]();
-        return this.element;
-      }
-      previousEntry() {
-        return this[_previousLink];
-      }
-      nextEntry() {
-        return this[_nextLink];
-      }
-    }
-    _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-    dart.setSignature(_UserDoubleLinkedQueueEntry, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._UserDoubleLinkedQueueEntry$(E), [E])}),
-      fields: () => ({element: E}),
-      methods: () => ({
-        append: dart.definiteFunctionType(dart.void, [E]),
-        prepend: dart.definiteFunctionType(dart.void, [E]),
-        remove: dart.definiteFunctionType(E, []),
-        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
-      })
-    });
-    return _UserDoubleLinkedQueueEntry;
-  }, _UserDoubleLinkedQueueEntry => {
-    dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
-  });
-  collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
-  const _queue = Symbol('_queue');
-  const _append = Symbol('_append');
-  const _prepend = Symbol('_prepend');
-  const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
-  collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
-    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    class _DoubleLinkedQueueEntry extends collection._DoubleLink {
-      new(queue) {
-        this[_queue] = queue;
-        super.new();
-      }
-      [_append](e) {
-        E._check(e);
-        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this, this[_nextLink]);
-      }
-      [_prepend](e) {
-        E._check(e);
-        new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
-      }
-      nextEntry() {
-        return this[_nextLink][_asNonSentinelEntry]();
-      }
-      previousEntry() {
-        return this[_previousLink][_asNonSentinelEntry]();
-      }
-    }
-    dart.setSignature(_DoubleLinkedQueueEntry, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueEntry$(E), [DoubleLinkedQueueOfE()])}),
-      fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
-      methods: () => ({
-        [_append]: dart.definiteFunctionType(dart.void, [E]),
-        [_prepend]: dart.definiteFunctionType(dart.void, [E]),
-        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
-      })
-    });
-    return _DoubleLinkedQueueEntry;
-  }, _DoubleLinkedQueueEntry => {
-    dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
-  });
-  collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
-  const _elementCount = Symbol('_elementCount');
-  collection._DoubleLinkedQueueElement$ = dart.generic(E => {
-    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
-      new(element, queue) {
-        this.element = element;
-        super.new(queue);
-      }
-      append(e) {
-        E._check(e);
-        this[_append](e);
-        if (this[_queue] != null) {
-          let o = this[_queue];
-          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
-        }
-      }
-      prepend(e) {
-        E._check(e);
-        this[_prepend](e);
-        if (this[_queue] != null) {
-          let o = this[_queue];
-          o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
-        }
-      }
-      [_remove]() {
-        this[_queue] = null;
-        this[_unlink$]();
-        return this.element;
-      }
-      remove() {
-        if (this[_queue] != null) {
-          let o = this[_queue];
-          o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
-        }
-        return this[_remove]();
-      }
-      [_asNonSentinelEntry]() {
-        return this;
-      }
-    }
-    _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-    dart.setSignature(_DoubleLinkedQueueElement, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [E, DoubleLinkedQueueOfE()])}),
-      fields: () => ({element: E}),
-      methods: () => ({
-        append: dart.definiteFunctionType(dart.void, [E]),
-        prepend: dart.definiteFunctionType(dart.void, [E]),
-        [_remove]: dart.definiteFunctionType(E, []),
-        remove: dart.definiteFunctionType(E, []),
-        [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
-      })
-    });
-    return _DoubleLinkedQueueElement;
-  });
-  collection._DoubleLinkedQueueElement = _DoubleLinkedQueueElement();
-  collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
-    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
-      new(queue) {
-        super.new(queue);
-        this[_previousLink] = this;
-        this[_nextLink] = this;
-      }
-      [_asNonSentinelEntry]() {
-        return null;
-      }
-      [_remove]() {
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-      get element() {
-        dart.throw(_internal.IterableElementError.noElement());
-      }
-    }
-    dart.setSignature(_DoubleLinkedQueueSentinel, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueSentinel$(E), [DoubleLinkedQueueOfE()])}),
-      getters: () => ({element: dart.definiteFunctionType(E, [])}),
-      methods: () => ({
-        [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        [_remove]: dart.definiteFunctionType(E, [])
-      })
-    });
-    return _DoubleLinkedQueueSentinel;
-  });
-  collection._DoubleLinkedQueueSentinel = _DoubleLinkedQueueSentinel();
-  const _sentinel = Symbol('_sentinel');
-  collection.DoubleLinkedQueue$ = dart.generic(E => {
-    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-    let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
-    let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
-    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-    let DoubleLinkedQueueEntryOfETovoid = () => (DoubleLinkedQueueEntryOfETovoid = dart.constFn(dart.functionType(dart.void, [DoubleLinkedQueueEntryOfE()])))();
-    class DoubleLinkedQueue extends core.Iterable$(E) {
-      new() {
-        this[_sentinel] = null;
-        this[_elementCount] = 0;
-        super.new();
-        this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE())(this);
-      }
-      static from(elements) {
-        let list = new (DoubleLinkedQueueOfE())();
-        for (let e of elements) {
-          let element = E.as(e);
-          list.addLast(element);
-        }
-        return DoubleLinkedQueueOfE()._check(list);
-      }
-      get length() {
-        return this[_elementCount];
-      }
-      addLast(value) {
-        E._check(value);
-        this[_sentinel][_prepend](value);
-        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
-      }
-      addFirst(value) {
-        E._check(value);
-        this[_sentinel][_append](value);
-        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
-      }
-      add(value) {
-        E._check(value);
-        this[_sentinel][_prepend](value);
-        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        for (let value of iterable) {
-          this[_sentinel][_prepend](value);
-          this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
-        }
-      }
-      removeLast() {
-        let lastEntry = this[_sentinel][_previousLink];
-        let result = lastEntry[_remove]();
-        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
-        return result;
-      }
-      removeFirst() {
-        let firstEntry = this[_sentinel][_nextLink];
-        let result = firstEntry[_remove]();
-        this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
-        return result;
-      }
-      remove(o) {
-        let entry = this[_sentinel][_nextLink];
-        while (!core.identical(entry, this[_sentinel])) {
-          if (dart.equals(entry.element, o)) {
-            entry[_remove]();
-            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
-            return true;
-          }
-          entry = entry[_nextLink];
-        }
-        return false;
-      }
-      [_filter](test, removeMatching) {
-        let entry = this[_sentinel][_nextLink];
-        while (!core.identical(entry, this[_sentinel])) {
-          let next = entry[_nextLink];
-          if (core.identical(removeMatching, test(entry.element))) {
-            entry[_remove]();
-            this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
-          }
-          entry = next;
-        }
-      }
-      removeWhere(test) {
-        this[_filter](test, true);
-      }
-      retainWhere(test) {
-        this[_filter](test, false);
-      }
-      get first() {
-        let firstEntry = this[_sentinel][_nextLink];
-        return firstEntry.element;
-      }
-      get last() {
-        let lastEntry = this[_sentinel][_previousLink];
-        return lastEntry.element;
-      }
-      get single() {
-        if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
-          let entry = this[_sentinel][_nextLink];
-          return entry.element;
-        }
-        dart.throw(_internal.IterableElementError.tooMany());
-      }
-      lastEntry() {
-        return this[_sentinel].previousEntry();
-      }
-      firstEntry() {
-        return this[_sentinel].nextEntry();
-      }
-      get isEmpty() {
-        return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
-      }
-      clear() {
-        this[_sentinel][_nextLink] = this[_sentinel];
-        this[_sentinel][_previousLink] = this[_sentinel];
-        this[_elementCount] = 0;
-      }
-      forEachEntry(f) {
-        let entry = this[_sentinel][_nextLink];
-        while (!core.identical(entry, this[_sentinel])) {
-          let nextEntry = entry[_nextLink];
-          let element = _DoubleLinkedQueueElementOfE()._check(entry);
-          f(element);
-          entry = nextEntry;
-        }
-      }
-      get iterator() {
-        return new (_DoubleLinkedQueueIteratorOfE())(this[_sentinel]);
-      }
-      toString() {
-        return collection.IterableBase.iterableToFullString(this, '{', '}');
-      }
-    }
-    DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
-    dart.setSignature(DoubleLinkedQueue, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), []),
-        from: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), [core.Iterable])
-      }),
-      fields: () => ({
-        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
-        [_elementCount]: core.int
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [])}),
-      methods: () => ({
-        addLast: dart.definiteFunctionType(dart.void, [E]),
-        addFirst: dart.definiteFunctionType(dart.void, [E]),
-        add: dart.definiteFunctionType(dart.void, [E]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        removeLast: dart.definiteFunctionType(E, []),
-        removeFirst: dart.definiteFunctionType(E, []),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        clear: dart.definiteFunctionType(dart.void, []),
-        forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
-      })
-    });
-    dart.defineExtensionMembers(DoubleLinkedQueue, [
-      'toString',
-      'length',
-      'first',
-      'last',
-      'single',
-      'isEmpty',
-      'iterator'
-    ]);
-    return DoubleLinkedQueue;
-  });
-  collection.DoubleLinkedQueue = DoubleLinkedQueue();
-  const _nextEntry = Symbol('_nextEntry');
-  collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
-    let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
-    class _DoubleLinkedQueueIterator extends core.Object {
-      new(sentinel) {
-        this[_sentinel] = sentinel;
-        this[_nextEntry] = sentinel[_nextLink];
-        this[_current$2] = null;
-      }
-      moveNext() {
-        if (core.identical(this[_nextEntry], this[_sentinel])) {
-          this[_current$2] = null;
-          this[_nextEntry] = null;
-          this[_sentinel] = null;
-          return false;
-        }
-        let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
-        if (elementEntry[_queue] == null) {
-          dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
-        }
-        this[_current$2] = elementEntry.element;
-        this[_nextEntry] = elementEntry[_nextLink];
-        return true;
-      }
-      get current() {
-        return this[_current$2];
-      }
-    }
-    dart.addTypeTests(_DoubleLinkedQueueIterator);
-    _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_DoubleLinkedQueueIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
-      fields: () => ({
-        [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
-        [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-        [_current$2]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _DoubleLinkedQueueIterator;
-  });
-  collection._DoubleLinkedQueueIterator = _DoubleLinkedQueueIterator();
-  const _head = Symbol('_head');
-  const _tail = Symbol('_tail');
-  const _table = Symbol('_table');
-  const _checkModification = Symbol('_checkModification');
-  const _writeToList = Symbol('_writeToList');
-  const _preGrow = Symbol('_preGrow');
-  const _grow = Symbol('_grow');
-  collection.ListQueue$ = dart.generic(E => {
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-    let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
-    let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListQueue extends core.Iterable$(E) {
-      new(initialCapacity) {
-        if (initialCapacity === void 0) initialCapacity = null;
-        this[_head] = 0;
-        this[_tail] = 0;
-        this[_table] = null;
-        this[_modificationCount] = 0;
-        super.new();
-        if (initialCapacity == null || dart.notNull(initialCapacity) < collection.ListQueue._INITIAL_CAPACITY) {
-          initialCapacity = collection.ListQueue._INITIAL_CAPACITY;
-        } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
-          initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
-        }
-        dart.assert(collection.ListQueue._isPowerOf2(initialCapacity));
-        this[_table] = ListOfE().new(initialCapacity);
-      }
-      static from(elements) {
-        if (core.List.is(elements)) {
-          let length = elements[dartx.length];
-          let queue = new (ListQueueOfE())(dart.notNull(length) + 1);
-          dart.assert(dart.notNull(queue[_table][dartx.length]) > dart.notNull(length));
-          for (let i = 0; i < dart.notNull(length); i++) {
-            queue[_table][dartx._set](i, E.as(elements[dartx._get](i)));
-          }
-          queue[_tail] = length;
-          return queue;
-        } else {
-          let capacity = collection.ListQueue._INITIAL_CAPACITY;
-          if (_internal.EfficientLength.is(elements)) {
-            capacity = elements[dartx.length];
-          }
-          let result = new (ListQueueOfE())(capacity);
-          for (let element of elements) {
-            result.addLast(E.as(element));
-          }
-          return result;
-        }
-      }
-      get iterator() {
-        return new (_ListQueueIteratorOfE())(this);
-      }
-      forEach(action) {
-        let modificationCount = this[_modificationCount];
-        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
-          action(this[_table][dartx._get](i));
-          this[_checkModification](modificationCount);
-        }
-      }
-      get isEmpty() {
-        return this[_head] == this[_tail];
-      }
-      get length() {
-        return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-      }
-      get first() {
-        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
-        return this[_table][dartx._get](this[_head]);
-      }
-      get last() {
-        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
-        return this[_table][dartx._get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
-      }
-      get single() {
-        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
-        if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
-        return this[_table][dartx._get](this[_head]);
-      }
-      elementAt(index) {
-        core.RangeError.checkValidIndex(index, this);
-        return this[_table][dartx._get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
-      }
-      toList(opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let list = null;
-        if (dart.test(growable)) {
-          list = ListOfE().new();
-          list[dartx.length] = this.length;
-        } else {
-          list = ListOfE().new(this.length);
-        }
-        this[_writeToList](list);
-        return list;
-      }
-      add(value) {
-        E._check(value);
-        this[_add$0](value);
-      }
-      addAll(elements) {
-        IterableOfE()._check(elements);
-        if (ListOfE().is(elements)) {
-          let list = elements;
-          let addCount = list[dartx.length];
-          let length = this.length;
-          if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][dartx.length])) {
-            this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
-            this[_table][dartx.setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
-            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
-          } else {
-            let endSpace = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_tail]);
-            if (dart.notNull(addCount) < endSpace) {
-              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
-              this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
-            } else {
-              let preSpace = dart.notNull(addCount) - endSpace;
-              this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
-              this[_table][dartx.setRange](0, preSpace, list, endSpace);
-              this[_tail] = preSpace;
-            }
-          }
-          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        } else {
-          for (let element of elements)
-            this[_add$0](element);
-        }
-      }
-      remove(value) {
-        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
-          let element = this[_table][dartx._get](i);
-          if (dart.equals(element, value)) {
-            this[_remove](i);
-            this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-            return true;
-          }
-        }
-        return false;
-      }
-      [_filterWhere](test, removeMatching) {
-        let modificationCount = this[_modificationCount];
-        let i = this[_head];
-        while (i != this[_tail]) {
-          let element = this[_table][dartx._get](i);
-          let remove = core.identical(removeMatching, test(element));
-          this[_checkModification](modificationCount);
-          if (remove) {
-            i = this[_remove](i);
-            modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-          } else {
-            i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-          }
-        }
-      }
-      removeWhere(test) {
-        this[_filterWhere](test, true);
-      }
-      retainWhere(test) {
-        this[_filterWhere](test, false);
-      }
-      clear() {
-        if (this[_head] != this[_tail]) {
-          for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
-            this[_table][dartx._set](i, null);
-          }
-          this[_head] = this[_tail] = 0;
-          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        }
-      }
-      toString() {
-        return collection.IterableBase.iterableToFullString(this, "{", "}");
-      }
-      addLast(value) {
-        E._check(value);
-        this[_add$0](value);
-      }
-      addFirst(value) {
-        E._check(value);
-        this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-        this[_table][dartx._set](this[_head], value);
-        if (this[_head] == this[_tail]) this[_grow]();
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-      }
-      removeFirst() {
-        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        let result = this[_table][dartx._get](this[_head]);
-        this[_table][dartx._set](this[_head], null);
-        this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-        return result;
-      }
-      removeLast() {
-        if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-        let result = this[_table][dartx._get](this[_tail]);
-        this[_table][dartx._set](this[_tail], null);
-        return result;
-      }
-      static _isPowerOf2(number) {
-        return (dart.notNull(number) & dart.notNull(number) - 1) == 0;
-      }
-      static _nextPowerOf2(number) {
-        dart.assert(dart.notNull(number) > 0);
-        number = (dart.notNull(number) << 1 >>> 0) - 1;
-        for (;;) {
-          let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
-          if (nextNumber == 0) return number;
-          number = nextNumber;
-        }
-      }
-      [_checkModification](expectedModificationCount) {
-        if (expectedModificationCount != this[_modificationCount]) {
-          dart.throw(new core.ConcurrentModificationError(this));
-        }
-      }
-      [_add$0](element) {
-        E._check(element);
-        this[_table][dartx._set](this[_tail], element);
-        this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
-        if (this[_head] == this[_tail]) this[_grow]();
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-      }
-      [_remove](offset) {
-        let mask = dart.notNull(this[_table][dartx.length]) - 1;
-        let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
-        let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
-        if (startDistance < endDistance) {
-          let i = offset;
-          while (i != this[_head]) {
-            let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
-            this[_table][dartx._set](i, this[_table][dartx._get](prevOffset));
-            i = prevOffset;
-          }
-          this[_table][dartx._set](this[_head], null);
-          this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
-          return (dart.notNull(offset) + 1 & mask) >>> 0;
-        } else {
-          this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
-          let i = offset;
-          while (i != this[_tail]) {
-            let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
-            this[_table][dartx._set](i, this[_table][dartx._get](nextOffset));
-            i = nextOffset;
-          }
-          this[_table][dartx._set](this[_tail], null);
-          return offset;
-        }
-      }
-      [_grow]() {
-        let newTable = ListOfE().new(dart.notNull(this[_table][dartx.length]) * 2);
-        let split = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
-        newTable[dartx.setRange](0, split, this[_table], this[_head]);
-        newTable[dartx.setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
-        this[_head] = 0;
-        this[_tail] = this[_table][dartx.length];
-        this[_table] = newTable;
-      }
-      [_writeToList](target) {
-        ListOfE()._check(target);
-        dart.assert(dart.notNull(target[dartx.length]) >= dart.notNull(this.length));
-        if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
-          let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
-          target[dartx.setRange](0, length, this[_table], this[_head]);
-          return length;
-        } else {
-          let firstPartSize = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
-          target[dartx.setRange](0, firstPartSize, this[_table], this[_head]);
-          target[dartx.setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
-          return dart.notNull(this[_tail]) + firstPartSize;
-        }
-      }
-      [_preGrow](newElementCount) {
-        dart.assert(dart.notNull(newElementCount) >= dart.notNull(this.length));
-        newElementCount = dart.notNull(newElementCount) + newElementCount[dartx['>>']](1);
-        let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
-        let newTable = ListOfE().new(newCapacity);
-        this[_tail] = this[_writeToList](newTable);
-        this[_table] = newTable;
-        this[_head] = 0;
-      }
-    }
-    ListQueue[dart.implements] = () => [QueueOfE()];
-    dart.setSignature(ListQueue, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.ListQueue$(E), [], [core.int]),
-        from: dart.definiteFunctionType(collection.ListQueue$(E), [core.Iterable])
-      }),
-      fields: () => ({
-        [_table]: ListOfE(),
-        [_head]: core.int,
-        [_tail]: core.int,
-        [_modificationCount]: core.int
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [E]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        addLast: dart.definiteFunctionType(dart.void, [E]),
-        addFirst: dart.definiteFunctionType(dart.void, [E]),
-        removeFirst: dart.definiteFunctionType(E, []),
-        removeLast: dart.definiteFunctionType(E, []),
-        [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
-        [_add$0]: dart.definiteFunctionType(dart.void, [E]),
-        [_remove]: dart.definiteFunctionType(core.int, [core.int]),
-        [_grow]: dart.definiteFunctionType(dart.void, []),
-        [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
-        [_preGrow]: dart.definiteFunctionType(dart.void, [core.int])
-      }),
-      sfields: () => ({_INITIAL_CAPACITY: core.int}),
-      statics: () => ({
-        _isPowerOf2: dart.definiteFunctionType(core.bool, [core.int]),
-        _nextPowerOf2: dart.definiteFunctionType(core.int, [core.int])
-      }),
-      names: ['_isPowerOf2', '_nextPowerOf2']
-    });
-    dart.defineExtensionMembers(ListQueue, [
-      'forEach',
-      'elementAt',
-      'toList',
-      'toString',
-      'iterator',
-      'isEmpty',
-      'length',
-      'first',
-      'last',
-      'single'
-    ]);
-    return ListQueue;
-  });
-  collection.ListQueue = ListQueue();
-  collection.ListQueue._INITIAL_CAPACITY = 8;
-  const _end = Symbol('_end');
-  const _position = Symbol('_position');
-  collection._ListQueueIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-    class _ListQueueIterator extends core.Object {
-      new(queue) {
-        this[_queue] = queue;
-        this[_end] = queue[_tail];
-        this[_modificationCount] = queue[_modificationCount];
-        this[_position] = queue[_head];
-        this[_current$2] = null;
-      }
-      get current() {
-        return this[_current$2];
-      }
-      moveNext() {
-        this[_queue][_checkModification](this[_modificationCount]);
-        if (this[_position] == this[_end]) {
-          this[_current$2] = null;
-          return false;
-        }
-        this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
-        this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
-        return true;
-      }
-    }
-    dart.addTypeTests(_ListQueueIterator);
-    _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_ListQueueIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._ListQueueIterator$(E), [ListQueueOfE()])}),
-      fields: () => ({
-        [_queue]: ListQueueOfE(),
-        [_end]: core.int,
-        [_modificationCount]: core.int,
-        [_position]: core.int,
-        [_current$2]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _ListQueueIterator;
-  });
-  collection._ListQueueIterator = _ListQueueIterator();
-  collection._Predicate$ = dart.generic(T => {
-    const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
-    return _Predicate;
-  });
-  collection._Predicate = _Predicate$();
-  collection._SplayTreeNode$ = dart.generic(K => {
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    class _SplayTreeNode extends core.Object {
-      new(key) {
-        this.key = key;
-        this.left = null;
-        this.right = null;
-      }
-    }
-    dart.addTypeTests(_SplayTreeNode);
-    dart.setSignature(_SplayTreeNode, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeNode$(K), [K])}),
-      fields: () => ({
-        key: K,
-        left: _SplayTreeNodeOfK(),
-        right: _SplayTreeNodeOfK()
-      })
-    });
-    return _SplayTreeNode;
-  });
-  collection._SplayTreeNode = _SplayTreeNode();
-  collection._SplayTreeMapNode$ = dart.generic((K, V) => {
-    class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {
-      new(key, value) {
-        this.value = value;
-        super.new(key);
-      }
-    }
-    dart.setSignature(_SplayTreeMapNode, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeMapNode$(K, V), [K, V])}),
-      fields: () => ({value: V})
-    });
-    return _SplayTreeMapNode;
-  });
-  collection._SplayTreeMapNode = _SplayTreeMapNode();
-  const _count$ = Symbol('_count');
-  const _splayCount = Symbol('_splayCount');
-  const _root = Symbol('_root');
-  const _dummy = Symbol('_dummy');
-  const _comparator = Symbol('_comparator');
-  const _compare = Symbol('_compare');
-  const _splay = Symbol('_splay');
-  const _splayMin = Symbol('_splayMin');
-  const _splayMax = Symbol('_splayMax');
-  const _addNewRoot = Symbol('_addNewRoot');
-  const _clear$ = Symbol('_clear');
-  collection._SplayTree$ = dart.generic((K, Node) => {
-    class _SplayTree extends core.Object {
-      new() {
-        this[_count$] = 0;
-        this[_modificationCount] = 0;
-        this[_splayCount] = 0;
-      }
-      [_splay](key) {
-        K._check(key);
-        if (this[_root] == null) return -1;
-        let left = this[_dummy];
-        let right = this[_dummy];
-        let current = this[_root];
-        let comp = null;
-        while (true) {
-          comp = this[_compare](current.key, key);
-          if (dart.notNull(comp) > 0) {
-            if (current.left == null) break;
-            comp = this[_compare](current.left.key, key);
-            if (dart.notNull(comp) > 0) {
-              let tmp = current.left;
-              current.left = tmp.right;
-              tmp.right = current;
-              current = Node._check(tmp);
-              if (current.left == null) break;
-            }
-            right.left = current;
-            right = current;
-            current = Node._check(current.left);
-          } else if (dart.notNull(comp) < 0) {
-            if (current.right == null) break;
-            comp = this[_compare](current.right.key, key);
-            if (dart.notNull(comp) < 0) {
-              let tmp = Node._check(current.right);
-              current.right = tmp.left;
-              tmp.left = current;
-              current = tmp;
-              if (current.right == null) break;
-            }
-            left.right = current;
-            left = current;
-            current = Node._check(current.right);
-          } else {
-            break;
-          }
-        }
-        left.right = current.left;
-        right.left = current.right;
-        current.left = this[_dummy].right;
-        current.right = this[_dummy].left;
-        this[_root] = current;
-        this[_dummy].right = null;
-        this[_dummy].left = null;
-        this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
-        return comp;
-      }
-      [_splayMin](node) {
-        Node._check(node);
-        let current = node;
-        while (current.left != null) {
-          let left = Node._check(current.left);
-          current.left = left.right;
-          left.right = current;
-          current = left;
-        }
-        return current;
-      }
-      [_splayMax](node) {
-        Node._check(node);
-        let current = node;
-        while (current.right != null) {
-          let right = Node._check(current.right);
-          current.right = right.left;
-          right.left = current;
-          current = right;
-        }
-        return current;
-      }
-      [_remove](key) {
-        K._check(key);
-        if (this[_root] == null) return null;
-        let comp = this[_splay](key);
-        if (comp != 0) return null;
-        let result = this[_root];
-        this[_count$] = dart.notNull(this[_count$]) - 1;
-        if (this[_root].left == null) {
-          this[_root] = Node._check(this[_root].right);
-        } else {
-          let right = Node._check(this[_root].right);
-          this[_root] = this[_splayMax](Node._check(this[_root].left));
-          this[_root].right = right;
-        }
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        return result;
-      }
-      [_addNewRoot](node, comp) {
-        Node._check(node);
-        this[_count$] = dart.notNull(this[_count$]) + 1;
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        if (this[_root] == null) {
-          this[_root] = node;
-          return;
-        }
-        if (dart.notNull(comp) < 0) {
-          node.left = this[_root];
-          node.right = this[_root].right;
-          this[_root].right = null;
-        } else {
-          node.right = this[_root];
-          node.left = this[_root].left;
-          this[_root].left = null;
-        }
-        this[_root] = node;
-      }
-      get [_first$]() {
-        if (this[_root] == null) return null;
-        this[_root] = this[_splayMin](this[_root]);
-        return this[_root];
-      }
-      get [_last$]() {
-        if (this[_root] == null) return null;
-        this[_root] = this[_splayMax](this[_root]);
-        return this[_root];
-      }
-      [_clear$]() {
-        this[_root] = null;
-        this[_count$] = 0;
-        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-      }
-    }
-    dart.addTypeTests(_SplayTree);
-    dart.setSignature(_SplayTree, {
-      fields: () => ({
-        [_count$]: core.int,
-        [_modificationCount]: core.int,
-        [_splayCount]: core.int
-      }),
-      getters: () => ({
-        [_first$]: dart.definiteFunctionType(Node, []),
-        [_last$]: dart.definiteFunctionType(Node, [])
-      }),
-      methods: () => ({
-        [_splay]: dart.definiteFunctionType(core.int, [K]),
-        [_splayMin]: dart.definiteFunctionType(Node, [Node]),
-        [_splayMax]: dart.definiteFunctionType(Node, [Node]),
-        [_remove]: dart.definiteFunctionType(Node, [K]),
-        [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-        [_clear$]: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _SplayTree;
-  });
-  collection._SplayTree = _SplayTree();
-  collection._TypeTest$ = dart.generic(T => {
-    class _TypeTest extends core.Object {
-      test(v) {
-        return T.is(v);
-      }
-    }
-    dart.addTypeTests(_TypeTest);
-    dart.setSignature(_TypeTest, {
-      methods: () => ({test: dart.definiteFunctionType(core.bool, [dart.dynamic])})
-    });
-    return _TypeTest;
-  });
-  collection._TypeTest = _TypeTest();
-  collection.SplayTreeMap$ = dart.generic((K, V) => {
-    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
-    let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
-    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
-    let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
-    let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
-    let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
-    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
-    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
-    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
-    class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
-      new(compare, isValidKey) {
-        if (compare === void 0) compare = null;
-        if (isValidKey === void 0) isValidKey = null;
-        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
-        this[_comparator] = (() => {
-          let l = compare;
-          return l != null ? l : ComparatorOfK().as(core.Comparable.compare);
-        })();
-        this[_validKey] = (() => {
-          let l = isValidKey;
-          return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
-        })();
-        this[_root] = null;
-        super.new();
-      }
-      static from(other, compare, isValidKey) {
-        if (compare === void 0) compare = null;
-        if (isValidKey === void 0) isValidKey = null;
-        let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
-        other[dartx.forEach](dart.fn((k, v) => {
-          result._set(K.as(k), V.as(v));
-        }, dynamicAnddynamicToNull()));
-        return result;
-      }
-      static fromIterable(iterable, opts) {
-        let key = opts && 'key' in opts ? opts.key : null;
-        let value = opts && 'value' in opts ? opts.value : null;
-        let compare = opts && 'compare' in opts ? opts.compare : null;
-        let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
-        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
-        collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
-        return map;
-      }
-      static fromIterables(keys, values, compare, isValidKey) {
-        if (compare === void 0) compare = null;
-        if (isValidKey === void 0) isValidKey = null;
-        let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
-        collection.Maps._fillMapWithIterables(map, keys, values);
-        return map;
-      }
-      [_compare](key1, key2) {
-        K._check(key1);
-        K._check(key2);
-        return this[_comparator](key1, key2);
-      }
-      _internal() {
-        this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
-        this[_root] = null;
-        this[_comparator] = null;
-        this[_validKey] = null;
-        super.new();
-      }
-      _get(key) {
-        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
-        if (this[_root] != null) {
-          let comp = this[_splay](K.as(key));
-          if (comp == 0) {
-            return this[_root].value;
-          }
-        }
-        return null;
-      }
-      remove(key) {
-        if (!dart.test(dart.dcall(this[_validKey], key))) return null;
-        let mapRoot = this[_remove](K.as(key));
-        if (mapRoot != null) return mapRoot.value;
-        return null;
-      }
-      _set(key, value) {
-        (() => {
-          K._check(key);
-          V._check(value);
-          if (key == null) dart.throw(new core.ArgumentError(key));
-          let comp = this[_splay](key);
-          if (comp == 0) {
-            this[_root].value = value;
-            return;
-          }
-          this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
-        })();
-        return value;
-      }
-      putIfAbsent(key, ifAbsent) {
-        K._check(key);
-        VoidToV()._check(ifAbsent);
-        if (key == null) dart.throw(new core.ArgumentError(key));
-        let comp = this[_splay](key);
-        if (comp == 0) {
-          return this[_root].value;
-        }
-        let modificationCount = this[_modificationCount];
-        let splayCount = this[_splayCount];
-        let value = ifAbsent();
-        if (modificationCount != this[_modificationCount]) {
-          dart.throw(new core.ConcurrentModificationError(this));
-        }
-        if (splayCount != this[_splayCount]) {
-          comp = this[_splay](key);
-          dart.assert(comp != 0);
-        }
-        this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
-        return value;
-      }
-      addAll(other) {
-        MapOfK$V()._check(other);
-        other[dartx.forEach](dart.fn((key, value) => {
-          this._set(key, value);
-        }, KAndVToNull()));
-      }
-      get isEmpty() {
-        return this[_root] == null;
-      }
-      get isNotEmpty() {
-        return !dart.test(this.isEmpty);
-      }
-      forEach(f) {
-        let nodes = new (_SplayTreeNodeIteratorOfK())(this);
-        while (dart.test(nodes.moveNext())) {
-          let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
-          f(node.key, node.value);
-        }
-      }
-      get length() {
-        return this[_count$];
-      }
-      clear() {
-        this[_clear$]();
-      }
-      containsKey(key) {
-        return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
-      }
-      containsValue(value) {
-        let found = false;
-        let initialSplayCount = this[_splayCount];
-        const visit = (function(node) {
-          while (node != null) {
-            if (dart.equals(node.value, value)) return true;
-            if (initialSplayCount != this[_splayCount]) {
-              dart.throw(new core.ConcurrentModificationError(this));
-            }
-            if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
-            node = collection._SplayTreeMapNode._check(node.left);
-          }
-          return false;
-        }).bind(this);
-        dart.fn(visit, _SplayTreeMapNodeTobool());
-        return visit(this[_root]);
-      }
-      get keys() {
-        return new (_SplayTreeKeyIterableOfK())(this);
-      }
-      get values() {
-        return new (_SplayTreeValueIterableOfK$V())(this);
-      }
-      toString() {
-        return collection.Maps.mapToString(this);
-      }
-      firstKey() {
-        if (this[_root] == null) return null;
-        return this[_first$].key;
-      }
-      lastKey() {
-        if (this[_root] == null) return null;
-        return this[_last$].key;
-      }
-      lastKeyBefore(key) {
-        K._check(key);
-        if (key == null) dart.throw(new core.ArgumentError(key));
-        if (this[_root] == null) return null;
-        let comp = this[_splay](key);
-        if (dart.notNull(comp) < 0) return this[_root].key;
-        let node = this[_root].left;
-        if (node == null) return null;
-        while (node.right != null) {
-          node = node.right;
-        }
-        return node.key;
-      }
-      firstKeyAfter(key) {
-        K._check(key);
-        if (key == null) dart.throw(new core.ArgumentError(key));
-        if (this[_root] == null) return null;
-        let comp = this[_splay](key);
-        if (dart.notNull(comp) > 0) return this[_root].key;
-        let node = this[_root].right;
-        if (node == null) return null;
-        while (node.left != null) {
-          node = node.left;
-        }
-        return node.key;
-      }
-    }
-    dart.defineNamedConstructor(SplayTreeMap, '_internal');
-    SplayTreeMap[dart.implements] = () => [MapOfK$V()];
-    dart.setSignature(SplayTreeMap, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [], [ComparatorOfK(), dynamicTobool()]),
-        from: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Map], [ComparatorOfK(), dynamicTobool()]),
-        fromIterable: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV(), compare: ComparatorOfK(), isValidKey: dynamicTobool()}),
-        fromIterables: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [IterableOfK(), IterableOfV()], [ComparatorOfK(), dynamicTobool()]),
-        _internal: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [])
-      }),
-      fields: () => ({
-        [_root]: _SplayTreeMapNodeOfK$V(),
-        [_dummy]: _SplayTreeMapNodeOfK$V(),
-        [_comparator]: ComparatorOfK(),
-        [_validKey]: collection._Predicate
-      }),
-      getters: () => ({
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, []),
-        length: dart.definiteFunctionType(core.int, []),
-        keys: dart.definiteFunctionType(core.Iterable$(K), []),
-        values: dart.definiteFunctionType(core.Iterable$(V), [])
-      }),
-      methods: () => ({
-        [_compare]: dart.definiteFunctionType(core.int, [K, K]),
-        _get: dart.definiteFunctionType(V, [core.Object]),
-        remove: dart.definiteFunctionType(V, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [K, V]),
-        putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
-        addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
-        forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        firstKey: dart.definiteFunctionType(K, []),
-        lastKey: dart.definiteFunctionType(K, []),
-        lastKeyBefore: dart.definiteFunctionType(K, [K]),
-        firstKeyAfter: dart.definiteFunctionType(K, [K])
-      })
-    });
-    dart.defineExtensionMembers(SplayTreeMap, [
-      '_get',
-      'remove',
-      '_set',
-      'putIfAbsent',
-      'addAll',
-      'forEach',
-      'clear',
-      'containsKey',
-      'containsValue',
-      'isEmpty',
-      'isNotEmpty',
-      'length',
-      'keys',
-      'values'
-    ]);
-    return SplayTreeMap;
-  });
-  collection.SplayTreeMap = SplayTreeMap();
-  const _workList = Symbol('_workList');
-  const _tree = Symbol('_tree');
-  const _currentNode = Symbol('_currentNode');
-  const _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
-  const _getValue = Symbol('_getValue');
-  const _rebuildWorkList = Symbol('_rebuildWorkList');
-  collection._SplayTreeIterator$ = dart.generic((K, T) => {
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
-    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
-    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
-    class _SplayTreeIterator extends core.Object {
-      new(tree) {
-        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
-        this[_tree] = tree;
-        this[_modificationCount] = tree[_modificationCount];
-        this[_splayCount] = tree[_splayCount];
-        this[_currentNode] = null;
-        this[_findLeftMostDescendent](tree[_root]);
-      }
-      startAt(tree, startKey) {
-        this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
-        this[_tree] = tree;
-        this[_modificationCount] = tree[_modificationCount];
-        this[_splayCount] = null;
-        this[_currentNode] = null;
-        if (tree[_root] == null) return;
-        let compare = tree[_splay](startKey);
-        this[_splayCount] = tree[_splayCount];
-        if (dart.notNull(compare) < 0) {
-          this[_findLeftMostDescendent](tree[_root].right);
-        } else {
-          this[_workList][dartx.add](tree[_root]);
-        }
-      }
-      get current() {
-        if (this[_currentNode] == null) return null;
-        return this[_getValue](this[_currentNode]);
-      }
-      [_findLeftMostDescendent](node) {
-        _SplayTreeNodeOfK()._check(node);
-        while (node != null) {
-          this[_workList][dartx.add](node);
-          node = node.left;
-        }
-      }
-      [_rebuildWorkList](currentNode) {
-        _SplayTreeNodeOfK()._check(currentNode);
-        dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
-        this[_workList][dartx.clear]();
-        if (currentNode == null) {
-          this[_findLeftMostDescendent](this[_tree][_root]);
-        } else {
-          this[_tree][_splay](currentNode.key);
-          this[_findLeftMostDescendent](this[_tree][_root].right);
-          dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
-        }
-      }
-      moveNext() {
-        if (this[_modificationCount] != this[_tree][_modificationCount]) {
-          dart.throw(new core.ConcurrentModificationError(this[_tree]));
-        }
-        if (dart.test(this[_workList][dartx.isEmpty])) {
-          this[_currentNode] = null;
-          return false;
-        }
-        if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
-          this[_rebuildWorkList](this[_currentNode]);
-        }
-        this[_currentNode] = this[_workList][dartx.removeLast]();
-        this[_findLeftMostDescendent](this[_currentNode].right);
-        return true;
-      }
-    }
-    dart.addTypeTests(_SplayTreeIterator);
-    dart.defineNamedConstructor(_SplayTreeIterator, 'startAt');
-    _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
-    dart.setSignature(_SplayTreeIterator, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
-        startAt: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
-      }),
-      fields: () => ({
-        [_tree]: _SplayTreeOfK$_SplayTreeNodeOfK(),
-        [_workList]: ListOf_SplayTreeNodeOfK(),
-        [_modificationCount]: core.int,
-        [_splayCount]: core.int,
-        [_currentNode]: _SplayTreeNodeOfK()
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({
-        [_findLeftMostDescendent]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
-        [_rebuildWorkList]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
-        moveNext: dart.definiteFunctionType(core.bool, [])
-      })
-    });
-    return _SplayTreeIterator;
-  });
-  collection._SplayTreeIterator = _SplayTreeIterator();
-  const _copyNode = Symbol('_copyNode');
-  collection._SplayTreeKeyIterable$ = dart.generic(K => {
-    let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
-    let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    class _SplayTreeKeyIterable extends core.Iterable$(K) {
-      new(tree) {
-        this[_tree] = tree;
-        super.new();
-      }
-      get length() {
-        return this[_tree][_count$];
-      }
-      get isEmpty() {
-        return this[_tree][_count$] == 0;
-      }
-      get iterator() {
-        return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
-      }
-      toSet() {
-        let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
-        set[_count$] = this[_tree][_count$];
-        set[_root] = set[_copyNode](this[_tree][_root]);
-        return set;
-      }
-    }
-    _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_SplayTreeKeyIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterable$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
-      fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
-    });
-    dart.defineExtensionMembers(_SplayTreeKeyIterable, ['toSet', 'length', 'isEmpty', 'iterator']);
-    return _SplayTreeKeyIterable;
-  });
-  collection._SplayTreeKeyIterable = _SplayTreeKeyIterable();
-  collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
-    let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
-    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-    class _SplayTreeValueIterable extends core.Iterable$(V) {
-      new(map) {
-        this[_map$0] = map;
-        super.new();
-      }
-      get length() {
-        return this[_map$0][_count$];
-      }
-      get isEmpty() {
-        return this[_map$0][_count$] == 0;
-      }
-      get iterator() {
-        return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
-      }
-    }
-    _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_SplayTreeValueIterable, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
-      fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
-    });
-    dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
-    return _SplayTreeValueIterable;
-  });
-  collection._SplayTreeValueIterable = _SplayTreeValueIterable();
-  collection._SplayTreeKeyIterator$ = dart.generic(K => {
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
-      new(map) {
-        super.new(map);
-      }
-      [_getValue](node) {
-        _SplayTreeNodeOfK()._check(node);
-        return node.key;
-      }
-    }
-    dart.setSignature(_SplayTreeKeyIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
-      methods: () => ({[_getValue]: dart.definiteFunctionType(K, [_SplayTreeNodeOfK()])})
-    });
-    return _SplayTreeKeyIterator;
-  });
-  collection._SplayTreeKeyIterator = _SplayTreeKeyIterator();
-  collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
-    let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-    class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
-      new(map) {
-        super.new(map);
-      }
-      [_getValue](node) {
-        _SplayTreeNodeOfK()._check(node);
-        let mapNode = _SplayTreeMapNodeOfK$V().as(node);
-        return mapNode.value;
-      }
-    }
-    dart.setSignature(_SplayTreeValueIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterator$(K, V), [SplayTreeMapOfK$V()])}),
-      methods: () => ({[_getValue]: dart.definiteFunctionType(V, [_SplayTreeNodeOfK()])})
-    });
-    return _SplayTreeValueIterator;
-  });
-  collection._SplayTreeValueIterator = _SplayTreeValueIterator();
-  collection._SplayTreeNodeIterator$ = dart.generic(K => {
-    let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
-    let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
-      new(tree) {
-        super.new(tree);
-      }
-      startAt(tree, startKey) {
-        super.startAt(tree, startKey);
-      }
-      [_getValue](node) {
-        _SplayTreeNodeOfK()._check(node);
-        return node;
-      }
-    }
-    dart.defineNamedConstructor(_SplayTreeNodeIterator, 'startAt');
-    dart.setSignature(_SplayTreeNodeIterator, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
-        startAt: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
-      }),
-      methods: () => ({[_getValue]: dart.definiteFunctionType(collection._SplayTreeNode$(K), [_SplayTreeNodeOfK()])})
-    });
-    return _SplayTreeNodeIterator;
-  });
-  collection._SplayTreeNodeIterator = _SplayTreeNodeIterator();
-  const _clone = Symbol('_clone');
-  collection.SplayTreeSet$ = dart.generic(E => {
-    let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
-    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
-    let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
-    let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
-    class SplayTreeSet extends dart.mixin(collection._SplayTree$(E, collection._SplayTreeNode$(E)), collection.IterableMixin$(E), collection.SetMixin$(E)) {
-      new(compare, isValidKey) {
-        if (compare === void 0) compare = null;
-        if (isValidKey === void 0) isValidKey = null;
-        this[_dummy] = new (_SplayTreeNodeOfE())(null);
-        this[_comparator] = (() => {
-          let l = compare;
-          return l != null ? l : ComparatorOfE().as(core.Comparable.compare);
-        })();
-        this[_validKey] = (() => {
-          let l = isValidKey;
-          return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
-        })();
-        this[_root] = null;
-        super.new();
-      }
-      static from(elements, compare, isValidKey) {
-        if (compare === void 0) compare = null;
-        if (isValidKey === void 0) isValidKey = null;
-        let result = new (SplayTreeSetOfE())(compare, isValidKey);
-        for (let element of elements) {
-          let e = E.as(element);
-          result.add(e);
-        }
-        return result;
-      }
-      [_compare](e1, e2) {
-        E._check(e1);
-        E._check(e2);
-        return this[_comparator](e1, e2);
-      }
-      get iterator() {
-        return new (_SplayTreeKeyIteratorOfE())(this);
-      }
-      get length() {
-        return this[_count$];
-      }
-      get isEmpty() {
-        return this[_root] == null;
-      }
-      get isNotEmpty() {
-        return this[_root] != null;
-      }
-      get first() {
-        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this[_first$].key;
-      }
-      get last() {
-        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
-        return this[_last$].key;
-      }
-      get single() {
-        if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
-        if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
-        return this[_root].key;
-      }
-      contains(object) {
-        return dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0;
-      }
-      add(element) {
-        E._check(element);
-        let compare = this[_splay](element);
-        if (compare == 0) return false;
-        this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
-        return true;
-      }
-      remove(object) {
-        if (!dart.test(dart.dcall(this[_validKey], object))) return false;
-        return this[_remove](E.as(object)) != null;
-      }
-      addAll(elements) {
-        IterableOfE()._check(elements);
-        for (let element of elements) {
-          let compare = this[_splay](element);
-          if (compare != 0) {
-            this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
-          }
-        }
-      }
-      removeAll(elements) {
-        for (let element of elements) {
-          if (dart.test(dart.dcall(this[_validKey], element))) this[_remove](E.as(element));
-        }
-      }
-      retainAll(elements) {
-        let retainSet = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
-        let modificationCount = this[_modificationCount];
-        for (let object of elements) {
-          if (modificationCount != this[_modificationCount]) {
-            dart.throw(new core.ConcurrentModificationError(this));
-          }
-          if (dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0) {
-            retainSet.add(this[_root].key);
-          }
-        }
-        if (retainSet[_count$] != this[_count$]) {
-          this[_root] = retainSet[_root];
-          this[_count$] = retainSet[_count$];
-          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-        }
-      }
-      lookup(object) {
-        if (!dart.test(dart.dcall(this[_validKey], object))) return null;
-        let comp = this[_splay](E.as(object));
-        if (comp != 0) return null;
-        return this[_root].key;
-      }
-      intersection(other) {
-        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
-        for (let element of this) {
-          if (dart.test(other.contains(element))) result.add(element);
-        }
-        return result;
-      }
-      difference(other) {
-        let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
-        for (let element of this) {
-          if (!dart.test(other.contains(element))) result.add(element);
-        }
-        return result;
-      }
-      union(other) {
-        SetOfE()._check(other);
-        let _ = this[_clone]();
-        _.addAll(other);
-        return _;
-      }
-      [_clone]() {
-        let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
-        set[_count$] = this[_count$];
-        set[_root] = this[_copyNode](this[_root]);
-        return set;
-      }
-      [_copyNode](node) {
-        _SplayTreeNodeOfE()._check(node);
-        if (node == null) return null;
-        let _ = new (_SplayTreeNodeOfE())(node.key);
-        _.left = this[_copyNode](node.left);
-        _.right = this[_copyNode](node.right);
-        return _;
-      }
-      clear() {
-        this[_clear$]();
-      }
-      toSet() {
-        return this[_clone]();
-      }
-      toString() {
-        return collection.IterableBase.iterableToFullString(this, '{', '}');
-      }
-    }
-    dart.setSignature(SplayTreeSet, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(collection.SplayTreeSet$(E), [], [ComparatorOfE(), dynamicTobool()]),
-        from: dart.definiteFunctionType(collection.SplayTreeSet$(E), [core.Iterable], [ComparatorOfE(), dynamicTobool()])
-      }),
-      fields: () => ({
-        [_root]: _SplayTreeNodeOfE(),
-        [_dummy]: _SplayTreeNodeOfE(),
-        [_comparator]: ComparatorOfE(),
-        [_validKey]: collection._Predicate
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({
-        [_compare]: dart.definiteFunctionType(core.int, [E, E]),
-        add: dart.definiteFunctionType(core.bool, [E]),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        lookup: dart.definiteFunctionType(E, [core.Object]),
-        [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
-        [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()])
-      })
-    });
-    dart.defineExtensionMembers(SplayTreeSet, [
-      'contains',
-      'toSet',
-      'toString',
-      'iterator',
-      'length',
-      'isEmpty',
-      'isNotEmpty',
-      'first',
-      'last',
-      'single'
-    ]);
-    return SplayTreeSet;
-  });
-  collection.SplayTreeSet = SplayTreeSet();
-  const _processed = Symbol('_processed');
-  const _computeKeys$ = Symbol('_computeKeys');
-  const _original = Symbol('_original');
-  convert._convertJsonToDart = function(json, reviver) {
-    dart.assert(reviver != null);
-    function walk(e) {
-      if (e == null || typeof e != "object") {
-        return e;
-      }
-      if (Object.getPrototypeOf(e) === Array.prototype) {
-        for (let i = 0; i < e.length; i++) {
-          let item = e[i];
-          e[i] = dart.dcall(reviver, i, walk(item));
-        }
-        return e;
-      }
-      let map = new convert._JsonMap(e);
-      let processed = map[_processed];
-      let keys = map[_computeKeys$]();
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        let key = keys[dartx._get](i);
-        let revived = dart.dcall(reviver, key, walk(e[key]));
-        processed[key] = revived;
-      }
-      map[_original] = processed;
-      return map;
-    }
-    dart.fn(walk, dynamicTodynamic$());
-    return dart.dcall(reviver, null, walk(json));
-  };
-  dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
-  convert._convertJsonToDartLazy = function(object) {
-    if (object == null) return null;
-    if (typeof object != "object") {
-      return object;
-    }
-    if (Object.getPrototypeOf(object) !== Array.prototype) {
-      return new convert._JsonMap(object);
-    }
-    for (let i = 0; i < object.length; i++) {
-      let item = object[i];
-      object[i] = convert._convertJsonToDartLazy(item);
-    }
-    return object;
-  };
-  dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
-  const _data = Symbol('_data');
-  const _isUpgraded = Symbol('_isUpgraded');
-  const _upgradedMap = Symbol('_upgradedMap');
-  const _process$ = Symbol('_process');
-  const _upgrade = Symbol('_upgrade');
-  convert._JsonMap = class _JsonMap extends core.Object {
-    new(original) {
-      this[_processed] = convert._JsonMap._newJavaScriptObject();
-      this[_original] = original;
-      this[_data] = null;
-    }
-    _get(key) {
-      if (dart.test(this[_isUpgraded])) {
-        return this[_upgradedMap][dartx._get](key);
-      } else if (!(typeof key == 'string')) {
-        return null;
-      } else {
-        let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
-        if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process$](core.String._check(key));
-        return result;
-      }
-    }
-    get length() {
-      return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](count);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
     }
     get isEmpty() {
-      return this.length == 0;
+      let future = new (_FutureOfbool())();
+      let subscription = null;
+      subscription = this.listen(dart.fn(_ => {
+        async._cancelAndValue(subscription, future, false);
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](true);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    toList() {
+      let result = JSArrayOfT().of([]);
+      let future = new (_FutureOfListOfT())();
+      this.listen(dart.fn(data => {
+        result[dartx.add](data);
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](result);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    toSet() {
+      let result = SetOfT().new();
+      let future = new (_FutureOfSetOfT())();
+      this.listen(dart.fn(data => {
+        result.add(data);
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_complete](result);
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    drain(E) {
+      return futureValue => {
+        if (futureValue === void 0) futureValue = null;
+        return this.listen(null, {cancelOnError: true}).asFuture(E)(futureValue);
+      };
+    }
+    take(count) {
+      return new (_TakeStreamOfT())(this, count);
+    }
+    takeWhile(test) {
+      return new (_TakeWhileStreamOfT())(this, test);
+    }
+    skip(count) {
+      return new (_SkipStreamOfT())(this, count);
+    }
+    skipWhile(test) {
+      return new (_SkipWhileStreamOfT())(this, test);
+    }
+    distinct(equals) {
+      if (equals === void 0) equals = null;
+      return new (_DistinctStreamOfT())(this, equals);
+    }
+    get first() {
+      let future = new (_FutureOfT())();
+      let subscription = null;
+      subscription = this.listen(dart.fn(value => {
+        async._cancelAndValue(subscription, future, value);
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    get last() {
+      let future = new (_FutureOfT())();
+      let result = null;
+      let foundResult = false;
+      this.listen(dart.fn(value => {
+        foundResult = true;
+        result = value;
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          if (foundResult) {
+            future[_complete](result);
+            return;
+          }
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    get single() {
+      let future = new (_FutureOfT())();
+      let result = null;
+      let foundResult = false;
+      let subscription = null;
+      subscription = this.listen(dart.fn(value => {
+        if (foundResult) {
+          try {
+            dart.throw(_internal.IterableElementError.tooMany());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._cancelAndErrorWithReplacement(subscription, future, e, s);
+          }
+
+          return;
+        }
+        foundResult = true;
+        result = value;
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          if (foundResult) {
+            future[_complete](result);
+            return;
+          }
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    firstWhere(test, opts) {
+      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
+      let future = new async._Future();
+      let subscription = null;
+      subscription = this.listen(dart.fn(value => {
+        async._runUserCode(dart.fn(() => test(value), VoidTobool()), dart.fn(isMatch => {
+          if (dart.test(isMatch)) {
+            async._cancelAndValue(subscription, future, value);
+          }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          if (defaultValue != null) {
+            async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
+            return;
+          }
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    lastWhere(test, opts) {
+      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
+      let future = new async._Future();
+      let result = null;
+      let foundResult = false;
+      let subscription = null;
+      subscription = this.listen(dart.fn(value => {
+        async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
+          if (dart.test(isMatch)) {
+            foundResult = true;
+            result = value;
+          }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          if (foundResult) {
+            future[_complete](result);
+            return;
+          }
+          if (defaultValue != null) {
+            async._runUserCode(defaultValue, dart.bind(future, _complete), dart.bind(future, _completeError));
+            return;
+          }
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    singleWhere(test) {
+      let future = new (_FutureOfT())();
+      let result = null;
+      let foundResult = false;
+      let subscription = null;
+      subscription = this.listen(dart.fn(value => {
+        async._runUserCode(dart.fn(() => true == test(value), VoidTobool()), dart.fn(isMatch => {
+          if (dart.test(isMatch)) {
+            if (foundResult) {
+              try {
+                dart.throw(_internal.IterableElementError.tooMany());
+              } catch (e) {
+                let s = dart.stackTrace(e);
+                async._cancelAndErrorWithReplacement(subscription, future, e, s);
+              }
+
+              return;
+            }
+            foundResult = true;
+            result = value;
+          }
+        }, boolToNull()), async._cancelAndErrorClosure(subscription, future));
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          if (foundResult) {
+            future[_complete](result);
+            return;
+          }
+          try {
+            dart.throw(_internal.IterableElementError.noElement());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            async._completeWithErrorCallback(future, e, s);
+          }
+
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    elementAt(index) {
+      if (!(typeof index == 'number') || dart.notNull(index) < 0) dart.throw(new core.ArgumentError(index));
+      let future = new (_FutureOfT())();
+      let subscription = null;
+      let elementIndex = 0;
+      subscription = this.listen(dart.fn(value => {
+        if (index == elementIndex) {
+          async._cancelAndValue(subscription, future, value);
+          return;
+        }
+        elementIndex = elementIndex + 1;
+      }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
+          future[_completeError](core.RangeError.index(index, this, "index", null, elementIndex));
+        }, VoidToNull()), cancelOnError: true});
+      return future;
+    }
+    timeout(timeLimit, opts) {
+      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
+      let controller = null;
+      let subscription = null;
+      let timer = null;
+      let zone = null;
+      let timeout = null;
+      function onData(event) {
+        timer.cancel();
+        controller.add(event);
+        timer = zone.createTimer(timeLimit, timeout);
+      }
+      dart.fn(onData, TTovoid$());
+      function onError(error, stackTrace) {
+        timer.cancel();
+        dart.assert(async._StreamController.is(controller) || async._BroadcastStreamController.is(controller));
+        let eventSink = controller;
+        dart.dsend(eventSink, _addError, error, stackTrace);
+        timer = zone.createTimer(timeLimit, timeout);
+      }
+      dart.fn(onError, dynamicAndStackTraceTovoid());
+      function onDone() {
+        timer.cancel();
+        controller.close();
+      }
+      dart.fn(onDone, VoidTovoid$());
+      const onListen = (function() {
+        zone = async.Zone.current;
+        if (onTimeout == null) {
+          timeout = dart.fn(() => {
+            controller.addError(new async.TimeoutException("No stream event", timeLimit), null);
+          }, VoidToNull());
+        } else {
+          let registeredOnTimeout = zone.registerUnaryCallback(dart.dynamic, EventSinkOfT())(onTimeout);
+          let wrapper = new async._ControllerEventSinkWrapper(null);
+          timeout = dart.fn(() => {
+            wrapper[_sink] = controller;
+            zone.runUnaryGuarded(dart.dynamic, EventSinkOfT())(registeredOnTimeout, wrapper);
+            wrapper[_sink] = null;
+          }, VoidToNull());
+        }
+        subscription = this.listen(onData, {onError: onError, onDone: onDone});
+        timer = zone.createTimer(timeLimit, timeout);
+      }).bind(this);
+      dart.fn(onListen, VoidTovoid$());
+      function onCancel() {
+        timer.cancel();
+        let result = subscription.cancel();
+        subscription = null;
+        return result;
+      }
+      dart.fn(onCancel, VoidToFuture());
+      controller = dart.test(this.isBroadcast) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_SyncStreamControllerOfT())(onListen, dart.fn(() => {
+        timer.cancel();
+        subscription.pause();
+      }, VoidToNull()), dart.fn(() => {
+        subscription.resume();
+        timer = zone.createTimer(timeLimit, timeout);
+      }, VoidToNull()), onCancel);
+      return controller.stream;
+    }
+  }
+  dart.addTypeTests(Stream);
+  dart.defineNamedConstructor(Stream, '_internal');
+  dart.setSignature(Stream, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async.Stream$(T), []),
+      _internal: dart.definiteFunctionType(async.Stream$(T), []),
+      empty: dart.definiteFunctionType(async.Stream$(T), []),
+      fromFuture: dart.definiteFunctionType(async.Stream$(T), [FutureOfT()]),
+      fromFutures: dart.definiteFunctionType(async.Stream$(T), [IterableOfFutureOfT()]),
+      fromIterable: dart.definiteFunctionType(async.Stream$(T), [IterableOfT()]),
+      periodic: dart.definiteFunctionType(async.Stream$(T), [core.Duration], [intToT()]),
+      eventTransformed: dart.definiteFunctionType(async.Stream$(T), [async.Stream, EventSinkOfTToEventSink()])
+    }),
+    getters: () => ({
+      isBroadcast: dart.definiteFunctionType(core.bool, []),
+      length: dart.definiteFunctionType(async.Future$(core.int), []),
+      isEmpty: dart.definiteFunctionType(async.Future$(core.bool), []),
+      first: dart.definiteFunctionType(async.Future$(T), []),
+      last: dart.definiteFunctionType(async.Future$(T), []),
+      single: dart.definiteFunctionType(async.Future$(T), [])
+    }),
+    methods: () => ({
+      asBroadcastStream: dart.definiteFunctionType(async.Stream$(T), [], {onListen: StreamSubscriptionOfTTovoid(), onCancel: StreamSubscriptionOfTTovoid()}),
+      where: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
+      map: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(S, [T])]]),
+      asyncMap: dart.definiteFunctionType(E => [async.Stream$(E), [TTodynamic()]]),
+      asyncExpand: dart.definiteFunctionType(E => [async.Stream$(E), [dart.functionType(async.Stream$(E), [T])]]),
+      handleError: dart.definiteFunctionType(async.Stream$(T), [core.Function], {test: dynamicTobool()}),
+      expand: dart.definiteFunctionType(S => [async.Stream$(S), [dart.functionType(core.Iterable$(S), [T])]]),
+      pipe: dart.definiteFunctionType(async.Future, [StreamConsumerOfT()]),
+      transform: dart.definiteFunctionType(S => [async.Stream$(S), [async.StreamTransformer$(T, S)]]),
+      reduce: dart.definiteFunctionType(async.Future$(T), [TAndTToT()]),
+      fold: dart.definiteFunctionType(S => [async.Future$(S), [S, dart.functionType(S, [S, T])]]),
+      join: dart.definiteFunctionType(async.Future$(core.String), [], [core.String]),
+      contains: dart.definiteFunctionType(async.Future$(core.bool), [core.Object]),
+      forEach: dart.definiteFunctionType(async.Future, [TTovoid()]),
+      every: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
+      any: dart.definiteFunctionType(async.Future$(core.bool), [TTobool()]),
+      toList: dart.definiteFunctionType(async.Future$(core.List$(T)), []),
+      toSet: dart.definiteFunctionType(async.Future$(core.Set$(T)), []),
+      drain: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
+      take: dart.definiteFunctionType(async.Stream$(T), [core.int]),
+      takeWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
+      skip: dart.definiteFunctionType(async.Stream$(T), [core.int]),
+      skipWhile: dart.definiteFunctionType(async.Stream$(T), [TTobool()]),
+      distinct: dart.definiteFunctionType(async.Stream$(T), [], [TAndTTobool()]),
+      firstWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
+      lastWhere: dart.definiteFunctionType(async.Future, [TTobool()], {defaultValue: VoidToObject()}),
+      singleWhere: dart.definiteFunctionType(async.Future$(T), [TTobool()]),
+      elementAt: dart.definiteFunctionType(async.Future$(T), [core.int]),
+      timeout: dart.definiteFunctionType(async.Stream$(T), [core.Duration], {onTimeout: EventSinkOfTTovoid()})
+    })
+  });
+  return Stream;
+});
+async.Stream = Stream();
+_isolate_helper.ReceivePortImpl = class ReceivePortImpl extends async.Stream {
+  new() {
+    ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl(null));
+  }
+  weak() {
+    ReceivePortImpl.prototype.fromRawReceivePort.call(this, new _isolate_helper.RawReceivePortImpl.weak(null));
+  }
+  fromRawReceivePort(rawPort) {
+    this[_rawPort] = rawPort;
+    this[_controller] = null;
+    super.new();
+    this[_controller] = async.StreamController.new({onCancel: dart.bind(this, 'close'), sync: true});
+    this[_rawPort].handler = dart.bind(this[_controller], 'add');
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  close() {
+    this[_rawPort].close();
+    this[_controller].close();
+  }
+  get sendPort() {
+    return this[_rawPort].sendPort;
+  }
+};
+dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
+dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
+dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
+_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
+dart.setSignature(_isolate_helper.ReceivePortImpl, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
+    weak: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, []),
+    fromRawReceivePort: dart.definiteFunctionType(_isolate_helper.ReceivePortImpl, [isolate.RawReceivePort])
+  }),
+  fields: () => ({
+    [_rawPort]: isolate.RawReceivePort,
+    [_controller]: async.StreamController
+  }),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _once = Symbol('_once');
+const _inEventLoop = Symbol('_inEventLoop');
+const _handle = Symbol('_handle');
+_isolate_helper.TimerImpl = class TimerImpl extends core.Object {
+  new(milliseconds, callback) {
+    this[_once] = true;
+    this[_inEventLoop] = false;
+    this[_handle] = null;
+    if (milliseconds == 0 && (!dart.test(_isolate_helper.hasTimer()) || dart.test(_isolate_helper._globalState.isWorker))) {
+      const internalCallback = (function() {
+        this[_handle] = null;
+        callback();
+      }).bind(this);
+      dart.fn(internalCallback, VoidTovoid$());
+      this[_handle] = 1;
+      _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
+      this[_inEventLoop] = true;
+    } else if (dart.test(_isolate_helper.hasTimer())) {
+      const internalCallback = (function() {
+        this[_handle] = null;
+        _isolate_helper.leaveJsAsync();
+        callback();
+      }).bind(this);
+      dart.fn(internalCallback, VoidTovoid$());
+      _isolate_helper.enterJsAsync();
+      this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
+    } else {
+      dart.assert(dart.notNull(milliseconds) > 0);
+      dart.throw(new core.UnsupportedError("Timer greater than 0."));
+    }
+  }
+  periodic(milliseconds, callback) {
+    this[_once] = false;
+    this[_inEventLoop] = false;
+    this[_handle] = null;
+    if (dart.test(_isolate_helper.hasTimer())) {
+      _isolate_helper.enterJsAsync();
+      this[_handle] = _isolate_helper.global.setInterval(dart.fn(() => {
+        callback(this);
+      }, VoidToNull()), milliseconds);
+    } else {
+      dart.throw(new core.UnsupportedError("Periodic timer."));
+    }
+  }
+  cancel() {
+    if (dart.test(_isolate_helper.hasTimer())) {
+      if (dart.test(this[_inEventLoop])) {
+        dart.throw(new core.UnsupportedError("Timer in event loop cannot be canceled."));
+      }
+      if (this[_handle] == null) return;
+      _isolate_helper.leaveJsAsync();
+      if (dart.test(this[_once])) {
+        _isolate_helper.global.clearTimeout(this[_handle]);
+      } else {
+        _isolate_helper.global.clearInterval(this[_handle]);
+      }
+      this[_handle] = null;
+    } else {
+      dart.throw(new core.UnsupportedError("Canceling a timer."));
+    }
+  }
+  get isActive() {
+    return this[_handle] != null;
+  }
+};
+dart.defineNamedConstructor(_isolate_helper.TimerImpl, 'periodic');
+_isolate_helper.TimerImpl[dart.implements] = () => [async.Timer];
+dart.setSignature(_isolate_helper.TimerImpl, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, VoidTovoid()]),
+    periodic: dart.definiteFunctionType(_isolate_helper.TimerImpl, [core.int, TimerTovoid()])
+  }),
+  fields: () => ({
+    [_once]: core.bool,
+    [_inEventLoop]: core.bool,
+    [_handle]: core.int
+  }),
+  getters: () => ({isActive: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({cancel: dart.definiteFunctionType(dart.void, [])})
+});
+_isolate_helper.hasTimer = function() {
+  return _isolate_helper.global.setTimeout != null;
+};
+dart.lazyFn(_isolate_helper.hasTimer, () => VoidTobool());
+_isolate_helper.CapabilityImpl = class CapabilityImpl extends core.Object {
+  new() {
+    CapabilityImpl.prototype._internal.call(this, _js_helper.random64());
+  }
+  _internal(id) {
+    this[_id] = id;
+  }
+  get hashCode() {
+    let hash = this[_id];
+    hash = (hash[dartx['>>']](0) ^ (dart.notNull(hash) / 4294967296)[dartx.truncate]()) >>> 0;
+    hash = ((~dart.notNull(hash) >>> 0) + (dart.notNull(hash) << 15 >>> 0) & 4294967295) >>> 0;
+    hash = (dart.notNull(hash) ^ hash[dartx['>>']](12)) >>> 0;
+    hash = (dart.notNull(hash) * 5 & 4294967295) >>> 0;
+    hash = (dart.notNull(hash) ^ hash[dartx['>>']](4)) >>> 0;
+    hash = (dart.notNull(hash) * 2057 & 4294967295) >>> 0;
+    hash = (dart.notNull(hash) ^ hash[dartx['>>']](16)) >>> 0;
+    return hash;
+  }
+  ['=='](other) {
+    if (core.identical(other, this)) return true;
+    if (_isolate_helper.CapabilityImpl.is(other)) {
+      return core.identical(this[_id], other[_id]);
+    }
+    return false;
+  }
+};
+dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
+_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
+dart.setSignature(_isolate_helper.CapabilityImpl, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, []),
+    _internal: dart.definiteFunctionType(_isolate_helper.CapabilityImpl, [core.int])
+  }),
+  fields: () => ({[_id]: core.int}),
+  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
+});
+_isolate_helper._serializeMessage = function(message) {
+  return new _isolate_helper._Serializer().serialize(message);
+};
+dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
+_isolate_helper._deserializeMessage = function(message) {
+  return new _isolate_helper._Deserializer().deserialize(message);
+};
+dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
+_isolate_helper._clone = function(message) {
+  let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
+  let deserializer = new _isolate_helper._Deserializer();
+  return deserializer.deserialize(serializer.serialize(message));
+};
+dart.fn(_isolate_helper._clone, dynamicTodynamic$());
+const _serializeSendPorts = Symbol('_serializeSendPorts');
+_isolate_helper._Serializer = class _Serializer extends core.Object {
+  new(opts) {
+    let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
+    this.serializedObjectIds = MapOfdynamic$int().identity();
+    this[_serializeSendPorts] = core.bool._check(serializeSendPorts);
+  }
+  serialize(x) {
+    if (dart.test(this.isPrimitive(x))) return this.serializePrimitive(x);
+    let serializationId = this.serializedObjectIds[dartx._get](x);
+    if (serializationId != null) return this.makeRef(serializationId);
+    serializationId = this.serializedObjectIds[dartx.length];
+    this.serializedObjectIds[dartx._set](x, serializationId);
+    if (_native_typed_data.NativeByteBuffer.is(x)) return this.serializeByteBuffer(x);
+    if (_native_typed_data.NativeTypedData.is(x)) return this.serializeTypedData(x);
+    if (_interceptors.JSIndexable.is(x)) return this.serializeJSIndexable(x);
+    if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
+    if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
+    if (_interceptors.Interceptor.is(x)) this.unsupported(x);
+    if (isolate.RawReceivePort.is(x)) {
+      this.unsupported(x, "RawReceivePorts can't be transmitted:");
+    }
+    if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
+    if (_isolate_helper._WorkerSendPort.is(x)) return this.serializeWorkerSendPort(x);
+    if (core.Function.is(x)) return this.serializeClosure(x);
+    return this.serializeDartObject(x);
+  }
+  unsupported(x, message) {
+    if (message === void 0) message = null;
+    if (message == null) message = "Can't transmit:";
+    dart.throw(new core.UnsupportedError(dart.str`${message} ${x}`));
+  }
+  makeRef(serializationId) {
+    return JSArrayOfObject().of(["ref", serializationId]);
+  }
+  isPrimitive(x) {
+    return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
+  }
+  serializePrimitive(primitive) {
+    return primitive;
+  }
+  serializeByteBuffer(buffer) {
+    return JSArrayOfObject().of(["buffer", buffer]);
+  }
+  serializeTypedData(data) {
+    return JSArrayOfObject().of(["typed", data]);
+  }
+  serializeJSIndexable(indexable) {
+    dart.assert(!(typeof indexable == 'string'));
+    let serialized = core.List._check(this.serializeArray(_interceptors.JSArray._check(indexable)));
+    if (_interceptors.JSFixedArray.is(indexable)) return JSArrayOfObject().of(["fixed", serialized]);
+    if (_interceptors.JSExtendableArray.is(indexable)) return JSArrayOfObject().of(["extendable", serialized]);
+    if (_interceptors.JSMutableArray.is(indexable)) return JSArrayOfObject().of(["mutable", serialized]);
+    if (_interceptors.JSArray.is(indexable)) return JSArrayOfObject().of(["const", serialized]);
+    this.unsupported(indexable, "Can't serialize indexable: ");
+    return null;
+  }
+  serializeArray(x) {
+    let serialized = [];
+    serialized[dartx.length] = x[dartx.length];
+    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
+      serialized[dartx._set](i, this.serialize(x[dartx._get](i)));
+    }
+    return serialized;
+  }
+  serializeArrayInPlace(x) {
+    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
+      x[dartx._set](i, this.serialize(x[dartx._get](i)));
+    }
+    return x;
+  }
+  serializeMap(x) {
+    let serializeTearOff = dart.bind(this, 'serialize');
+    return JSArrayOfObject().of(['map', x.keys[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList](), x.values[dartx.map](dart.dynamic)(dynamicTodynamic()._check(serializeTearOff))[dartx.toList]()]);
+  }
+  serializeJSObject(x) {
+    if (!!x.constructor && x.constructor !== Object) {
+      this.unsupported(x, "Only plain JS Objects are supported:");
+    }
+    let keys = Object.keys(x);
+    let values = [];
+    values[dartx.length] = keys[dartx.length];
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      values[dartx._set](i, this.serialize(x[keys[dartx._get](i)]));
+    }
+    return JSArrayOfObject().of(['js-object', keys, values]);
+  }
+  serializeWorkerSendPort(x) {
+    if (dart.test(this[_serializeSendPorts])) {
+      return JSArrayOfObject().of(['sendport', x[_workerId], x[_isolateId], x[_receivePortId]]);
+    }
+    return JSArrayOfObject().of(['raw sendport', x]);
+  }
+  serializeJsSendPort(x) {
+    if (dart.test(this[_serializeSendPorts])) {
+      let workerId = _isolate_helper._globalState.currentManagerId;
+      return JSArrayOfObject().of(['sendport', workerId, x[_isolateId], x[_receivePort][_id]]);
+    }
+    return JSArrayOfObject().of(['raw sendport', x]);
+  }
+  serializeCapability(x) {
+    return JSArrayOfObject().of(['capability', x[_id]]);
+  }
+  serializeClosure(x) {
+    let name = _isolate_helper.IsolateNatives._getJSFunctionName(x);
+    if (name == null) {
+      this.unsupported(x, "Closures can't be transmitted:");
+    }
+    return JSArrayOfString().of(['function', name]);
+  }
+  serializeDartObject(x) {
+    let classExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_ID_EXTRACTOR);
+    let fieldsExtractor = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.CLASS_FIELDS_EXTRACTOR);
+    let classId = classExtractor(x);
+    let fields = fieldsExtractor(x);
+    return ['dart', classId, this.serializeArrayInPlace(_interceptors.JSArray._check(fields))];
+  }
+};
+dart.setSignature(_isolate_helper._Serializer, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Serializer, [], {serializeSendPorts: dart.dynamic})}),
+  fields: () => ({
+    [_serializeSendPorts]: core.bool,
+    serializedObjectIds: MapOfdynamic$int()
+  }),
+  methods: () => ({
+    serialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    unsupported: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.String]),
+    makeRef: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    serializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    serializeByteBuffer: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeByteBuffer]),
+    serializeTypedData: dart.definiteFunctionType(dart.dynamic, [_native_typed_data.NativeTypedData]),
+    serializeJSIndexable: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSIndexable]),
+    serializeArray: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
+    serializeArrayInPlace: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSArray]),
+    serializeMap: dart.definiteFunctionType(dart.dynamic, [_js_helper.InternalMap]),
+    serializeJSObject: dart.definiteFunctionType(dart.dynamic, [_interceptors.JSObject]),
+    serializeWorkerSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._WorkerSendPort]),
+    serializeJsSendPort: dart.definiteFunctionType(dart.dynamic, [_isolate_helper._NativeJsSendPort]),
+    serializeCapability: dart.definiteFunctionType(dart.dynamic, [_isolate_helper.CapabilityImpl]),
+    serializeClosure: dart.definiteFunctionType(dart.dynamic, [core.Function]),
+    serializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  })
+});
+const _adjustSendPorts = Symbol('_adjustSendPorts');
+_isolate_helper._Deserializer = class _Deserializer extends core.Object {
+  new(opts) {
+    let adjustSendPorts = opts && 'adjustSendPorts' in opts ? opts.adjustSendPorts : true;
+    this.deserializedObjects = core.List.new();
+    this[_adjustSendPorts] = core.bool._check(adjustSendPorts);
+  }
+  deserialize(x) {
+    if (dart.test(this.isPrimitive(x))) return this.deserializePrimitive(x);
+    if (!_interceptors.JSArray.is(x)) dart.throw(new core.ArgumentError(dart.str`Bad serialized message: ${x}`));
+    switch (dart.dload(x, 'first')) {
+      case "ref":
+      {
+        return this.deserializeRef(x);
+      }
+      case "buffer":
+      {
+        return this.deserializeByteBuffer(x);
+      }
+      case "typed":
+      {
+        return this.deserializeTypedData(x);
+      }
+      case "fixed":
+      {
+        return this.deserializeFixed(x);
+      }
+      case "extendable":
+      {
+        return this.deserializeExtendable(x);
+      }
+      case "mutable":
+      {
+        return this.deserializeMutable(x);
+      }
+      case "const":
+      {
+        return this.deserializeConst(x);
+      }
+      case "map":
+      {
+        return this.deserializeMap(_js_helper.InternalMap._check(x));
+      }
+      case "sendport":
+      {
+        return this.deserializeSendPort(x);
+      }
+      case "raw sendport":
+      {
+        return this.deserializeRawSendPort(x);
+      }
+      case "js-object":
+      {
+        return this.deserializeJSObject(x);
+      }
+      case "function":
+      {
+        return this.deserializeClosure(x);
+      }
+      case "dart":
+      {
+        return this.deserializeDartObject(x);
+      }
+      default:
+      {
+        dart.throw(dart.str`couldn't deserialize: ${x}`);
+      }
+    }
+  }
+  isPrimitive(x) {
+    return x == null || typeof x == 'string' || typeof x == 'number' || typeof x == 'boolean';
+  }
+  deserializePrimitive(x) {
+    return x;
+  }
+  deserializeRef(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'ref'));
+    let serializationId = core.int._check(dart.dindex(x, 1));
+    return this.deserializedObjects[dartx._get](serializationId);
+  }
+  deserializeByteBuffer(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'buffer'));
+    let result = _native_typed_data.NativeByteBuffer._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return result;
+  }
+  deserializeTypedData(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'typed'));
+    let result = _native_typed_data.NativeTypedData._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return result;
+  }
+  deserializeArrayInPlace(x) {
+    for (let i = 0; i < dart.notNull(x[dartx.length]); i++) {
+      x[dartx._set](i, this.deserialize(x[dartx._get](i)));
+    }
+    return x;
+  }
+  deserializeFixed(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'fixed'));
+    let result = core.List._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
+  }
+  deserializeExtendable(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'extendable'));
+    let result = core.List._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return _interceptors.JSArray.markGrowable(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
+  }
+  deserializeMutable(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'mutable'));
+    let result = core.List._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return this.deserializeArrayInPlace(_interceptors.JSArray._check(result));
+  }
+  deserializeConst(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'const'));
+    let result = core.List._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return _interceptors.JSArray.markFixed(this.deserializeArrayInPlace(_interceptors.JSArray._check(result)));
+  }
+  deserializeMap(x) {
+    dart.assert(dart.equals(x._get(0), 'map'));
+    let keys = core.List._check(x._get(1));
+    let values = core.List._check(x._get(2));
+    let result = dart.map();
+    this.deserializedObjects[dartx.add](result);
+    keys = keys[dartx.map](dart.dynamic)(dart.bind(this, 'deserialize'))[dartx.toList]();
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      result[dartx._set](keys[dartx._get](i), this.deserialize(values[dartx._get](i)));
+    }
+    return result;
+  }
+  deserializeSendPort(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'sendport'));
+    let managerId = core.int._check(dart.dindex(x, 1));
+    let isolateId = core.int._check(dart.dindex(x, 2));
+    let receivePortId = core.int._check(dart.dindex(x, 3));
+    let result = null;
+    if (managerId == _isolate_helper._globalState.currentManagerId) {
+      let isolate = _isolate_helper._globalState.isolates[dartx._get](isolateId);
+      if (isolate == null) return null;
+      let receivePort = isolate.lookup(receivePortId);
+      if (receivePort == null) return null;
+      result = new _isolate_helper._NativeJsSendPort(receivePort, isolateId);
+    } else {
+      result = new _isolate_helper._WorkerSendPort(managerId, isolateId, receivePortId);
+    }
+    this.deserializedObjects[dartx.add](result);
+    return result;
+  }
+  deserializeRawSendPort(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
+    let result = isolate.SendPort._check(dart.dindex(x, 1));
+    this.deserializedObjects[dartx.add](result);
+    return result;
+  }
+  deserializeJSObject(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'js-object'));
+    let keys = core.List._check(dart.dindex(x, 1));
+    let values = core.List._check(dart.dindex(x, 2));
+    let o = {};
+    this.deserializedObjects[dartx.add](o);
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      o[keys[dartx._get](i)] = this.deserialize(values[dartx._get](i));
+    }
+    return o;
+  }
+  deserializeClosure(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'function'));
+    let name = core.String._check(dart.dindex(x, 1));
+    let result = core.Function._check(_isolate_helper.IsolateNatives._getJSFunctionFromName(name));
+    this.deserializedObjects[dartx.add](result);
+    return result;
+  }
+  deserializeDartObject(x) {
+    dart.assert(dart.equals(dart.dindex(x, 0), 'dart'));
+    let classId = core.String._check(dart.dindex(x, 1));
+    let fields = core.List._check(dart.dindex(x, 2));
+    let instanceFromClassId = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INSTANCE_FROM_CLASS_ID);
+    let initializeObject = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.INITIALIZE_EMPTY_INSTANCE);
+    let emptyInstance = instanceFromClassId(classId);
+    this.deserializedObjects[dartx.add](emptyInstance);
+    this.deserializeArrayInPlace(_interceptors.JSArray._check(fields));
+    return initializeObject(classId, emptyInstance, fields);
+  }
+};
+dart.setSignature(_isolate_helper._Deserializer, {
+  constructors: () => ({new: dart.definiteFunctionType(_isolate_helper._Deserializer, [], {adjustSendPorts: dart.dynamic})}),
+  fields: () => ({
+    [_adjustSendPorts]: core.bool,
+    deserializedObjects: core.List
+  }),
+  methods: () => ({
+    deserialize: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    isPrimitive: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    deserializePrimitive: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    deserializeRef: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    deserializeByteBuffer: dart.definiteFunctionType(_native_typed_data.NativeByteBuffer, [dart.dynamic]),
+    deserializeTypedData: dart.definiteFunctionType(_native_typed_data.NativeTypedData, [dart.dynamic]),
+    deserializeArrayInPlace: dart.definiteFunctionType(core.List, [_interceptors.JSArray]),
+    deserializeFixed: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    deserializeExtendable: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
+    deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+    deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+    deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
+    deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  })
+});
+_js_embedded_names.DISPATCH_PROPERTY_NAME = "dispatchPropertyName";
+_js_embedded_names.TYPE_INFORMATION = 'typeInformation';
+_js_embedded_names.GLOBAL_FUNCTIONS = 'globalFunctions';
+_js_embedded_names.STATICS = 'statics';
+_js_embedded_names.INTERCEPTED_NAMES = 'interceptedNames';
+_js_embedded_names.MANGLED_GLOBAL_NAMES = 'mangledGlobalNames';
+_js_embedded_names.MANGLED_NAMES = 'mangledNames';
+_js_embedded_names.LIBRARIES = 'libraries';
+_js_embedded_names.FINISHED_CLASSES = 'finishedClasses';
+_js_embedded_names.ALL_CLASSES = 'allClasses';
+_js_embedded_names.METADATA = 'metadata';
+_js_embedded_names.INTERCEPTORS_BY_TAG = 'interceptorsByTag';
+_js_embedded_names.LEAF_TAGS = 'leafTags';
+_js_embedded_names.LAZIES = 'lazies';
+_js_embedded_names.GET_ISOLATE_TAG = 'getIsolateTag';
+_js_embedded_names.ISOLATE_TAG = 'isolateTag';
+_js_embedded_names.CURRENT_SCRIPT = 'currentScript';
+_js_embedded_names.DEFERRED_LIBRARY_URIS = 'deferredLibraryUris';
+_js_embedded_names.DEFERRED_LIBRARY_HASHES = 'deferredLibraryHashes';
+_js_embedded_names.INITIALIZE_LOADED_HUNK = 'initializeLoadedHunk';
+_js_embedded_names.IS_HUNK_LOADED = 'isHunkLoaded';
+_js_embedded_names.IS_HUNK_INITIALIZED = 'isHunkInitialized';
+_js_embedded_names.DEFERRED_INITIALIZED = 'deferredInitialized';
+_js_embedded_names.CLASS_ID_EXTRACTOR = 'classIdExtractor';
+_js_embedded_names.CLASS_FIELDS_EXTRACTOR = 'classFieldsExtractor';
+_js_embedded_names.INSTANCE_FROM_CLASS_ID = "instanceFromClassId";
+_js_embedded_names.INITIALIZE_EMPTY_INSTANCE = "initializeEmptyInstance";
+_js_embedded_names.TYPEDEF_TYPE_PROPERTY_NAME = "$typedefType";
+_js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
+_js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
+_js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
+_js_helper._Patch = class _Patch extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_js_helper._Patch, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._Patch, [])})
+});
+_js_helper.patch = dart.const(new _js_helper._Patch());
+_js_helper.InternalMap$ = dart.generic((K, V) => {
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  class InternalMap extends core.Object {}
+  dart.addTypeTests(InternalMap);
+  InternalMap[dart.implements] = () => [MapOfK$V()];
+  return InternalMap;
+});
+_js_helper.InternalMap = InternalMap();
+_js_helper.Primitives = class Primitives extends core.Object {
+  static initializeStatics(id) {
+    _js_helper.Primitives.mirrorFunctionCacheName = dart.notNull(_js_helper.Primitives.mirrorFunctionCacheName) + dart.str`_${id}`;
+    _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
+  }
+  static objectHashCode(object) {
+    let hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  }
+  static _parseIntError(source, handleError) {
+    if (handleError == null) dart.throw(new core.FormatException(source));
+    return handleError(source);
+  }
+  static parseInt(source, radix, handleError) {
+    _js_helper.checkString(source);
+    let re = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i;
+    let match = re.exec(source);
+    let digitsIndex = 1;
+    let hexIndex = 2;
+    let decimalIndex = 3;
+    let nonDecimalHexIndex = 4;
+    if (match == null) {
+      return _js_helper.Primitives._parseIntError(source, handleError);
+    }
+    let decimalMatch = match[dartx._get](decimalIndex);
+    if (radix == null) {
+      if (decimalMatch != null) {
+        return parseInt(source, 10);
+      }
+      if (match[dartx._get](hexIndex) != null) {
+        return parseInt(source, 16);
+      }
+      return _js_helper.Primitives._parseIntError(source, handleError);
+    }
+    if (!(typeof radix == 'number')) {
+      dart.throw(new core.ArgumentError.value(radix, 'radix', 'is not an integer'));
+    }
+    if (dart.notNull(radix) < 2 || dart.notNull(radix) > 36) {
+      dart.throw(new core.RangeError.range(radix, 2, 36, 'radix'));
+    }
+    if (radix == 10 && decimalMatch != null) {
+      return parseInt(source, 10);
+    }
+    if (dart.notNull(radix) < 10 || decimalMatch == null) {
+      let maxCharCode = null;
+      if (dart.notNull(radix) <= 10) {
+        maxCharCode = 48 - 1 + dart.notNull(radix);
+      } else {
+        maxCharCode = 97 - 10 - 1 + dart.notNull(radix);
+      }
+      dart.assert(typeof match[dartx._get](digitsIndex) == 'string');
+      let digitsPart = match[digitsIndex];
+      for (let i = 0; i < dart.notNull(digitsPart[dartx.length]); i++) {
+        let characterCode = (dart.notNull(digitsPart[dartx.codeUnitAt](i)) | 32) >>> 0;
+        if (characterCode > dart.notNull(maxCharCode)) {
+          return _js_helper.Primitives._parseIntError(source, handleError);
+        }
+      }
+    }
+    return parseInt(source, radix);
+  }
+  static _parseDoubleError(source, handleError) {
+    if (handleError == null) {
+      dart.throw(new core.FormatException('Invalid double', source));
+    }
+    return handleError(source);
+  }
+  static parseDouble(source, handleError) {
+    _js_helper.checkString(source);
+    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source)) {
+      return _js_helper.Primitives._parseDoubleError(source, handleError);
+    }
+    let result = parseFloat(source);
+    if (dart.test(result[dartx.isNaN])) {
+      let trimmed = source[dartx.trim]();
+      if (trimmed == 'NaN' || trimmed == '+NaN' || trimmed == '-NaN') {
+        return result;
+      }
+      return _js_helper.Primitives._parseDoubleError(source, handleError);
+    }
+    return result;
+  }
+  static objectTypeName(object) {
+    return dart.toString(_js_helper.getRuntimeType(object));
+  }
+  static objectToString(object) {
+    let name = dart.typeName(dart.getReifiedType(object));
+    return dart.str`Instance of '${name}'`;
+  }
+  static dateNow() {
+    return Date.now();
+  }
+  static initTicker() {
+    if (_js_helper.Primitives.timerFrequency != null) return;
+    _js_helper.Primitives.timerFrequency = 1000;
+    _js_helper.Primitives.timerTicks = _js_helper.Primitives.dateNow;
+    if (typeof window == "undefined") return;
+    let jsWindow = window;
+    if (jsWindow == null) return;
+    let performance = jsWindow.performance;
+    if (performance == null) return;
+    if (typeof performance.now != "function") return;
+    _js_helper.Primitives.timerFrequency = 1000000;
+    _js_helper.Primitives.timerTicks = dart.fn(() => (1000 * performance.now())[dartx.floor](), VoidToint());
+  }
+  static get isD8() {
+    return typeof version == "function" && typeof os == "object" && "system" in os;
+  }
+  static get isJsshell() {
+    return typeof version == "function" && typeof system == "function";
+  }
+  static currentUri() {
+    if (!!self.location) {
+      return self.location.href;
+    }
+    return null;
+  }
+  static _fromCharCodeApply(array) {
+    let kMaxApply = 500;
+    let end = array[dartx.length];
+    if (dart.notNull(end) <= kMaxApply) {
+      return String.fromCharCode.apply(null, array);
+    }
+    let result = '';
+    for (let i = 0; i < dart.notNull(end); i = i + kMaxApply) {
+      let chunkEnd = i + kMaxApply < dart.notNull(end) ? i + kMaxApply : end;
+      result = result + String.fromCharCode.apply(null, array.slice(i, chunkEnd));
+    }
+    return result;
+  }
+  static stringFromCodePoints(codePoints) {
+    let a = JSArrayOfint().of([]);
+    for (let i of codePoints) {
+      if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
+      if (dart.notNull(i) <= 65535) {
+        a[dartx.add](i);
+      } else if (dart.notNull(i) <= 1114111) {
+        a[dartx.add](55296 + (dart.notNull(i) - 65536 >> 10 & 1023));
+        a[dartx.add](56320 + (dart.notNull(i) & 1023));
+      } else {
+        dart.throw(_js_helper.argumentErrorValue(i));
+      }
+    }
+    return _js_helper.Primitives._fromCharCodeApply(a);
+  }
+  static stringFromCharCodes(charCodes) {
+    for (let i of charCodes) {
+      if (!(typeof i == 'number')) dart.throw(_js_helper.argumentErrorValue(i));
+      if (dart.notNull(i) < 0) dart.throw(_js_helper.argumentErrorValue(i));
+      if (dart.notNull(i) > 65535) return _js_helper.Primitives.stringFromCodePoints(charCodes);
+    }
+    return _js_helper.Primitives._fromCharCodeApply(charCodes);
+  }
+  static stringFromNativeUint8List(charCodes, start, end) {
+    let kMaxApply = 500;
+    if (dart.notNull(end) <= kMaxApply && start == 0 && end == charCodes[dartx.length]) {
+      return String.fromCharCode.apply(null, charCodes);
+    }
+    let result = '';
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + kMaxApply) {
+      let chunkEnd = dart.notNull(i) + kMaxApply < dart.notNull(end) ? dart.notNull(i) + kMaxApply : end;
+      result = result + String.fromCharCode.apply(null, charCodes.subarray(i, chunkEnd));
+    }
+    return result;
+  }
+  static stringFromCharCode(charCode) {
+    if (0 <= dart.notNull(charCode)) {
+      if (dart.notNull(charCode) <= 65535) {
+        return String.fromCharCode(charCode);
+      }
+      if (dart.notNull(charCode) <= 1114111) {
+        let bits = dart.notNull(charCode) - 65536;
+        let low = 56320 | bits & 1023;
+        let high = (55296 | bits[dartx['>>']](10)) >>> 0;
+        return String.fromCharCode(high, low);
+      }
+    }
+    dart.throw(new core.RangeError.range(charCode, 0, 1114111));
+  }
+  static stringConcatUnchecked(string1, string2) {
+    return _foreign_helper.JS_STRING_CONCAT(string1, string2);
+  }
+  static flattenString(str) {
+    return str.charCodeAt(0) == 0 ? str : str;
+  }
+  static getTimeZoneName(receiver) {
+    let d = _js_helper.Primitives.lazyAsJsDate(receiver);
+    let match = /\((.*)\)/.exec(d.toString());
+    if (match != null) return core.String._check(match[dartx._get](1));
+    match = /^[A-Z,a-z]{3}\s[A-Z,a-z]{3}\s\d+\s\d{2}:\d{2}:\d{2}\s([A-Z]{3,5})\s\d{4}$/.exec(d.toString());
+    if (match != null) return core.String._check(match[dartx._get](1));
+    match = /(?:GMT|UTC)[+-]\d{4}/.exec(d.toString());
+    if (match != null) return core.String._check(match[dartx._get](0));
+    return "";
+  }
+  static getTimeZoneOffsetInMinutes(receiver) {
+    return -_js_helper.Primitives.lazyAsJsDate(receiver).getTimezoneOffset();
+  }
+  static valueFromDecomposedDate(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
+    let MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
+    _js_helper.checkInt(years);
+    _js_helper.checkInt(month);
+    _js_helper.checkInt(day);
+    _js_helper.checkInt(hours);
+    _js_helper.checkInt(minutes);
+    _js_helper.checkInt(seconds);
+    _js_helper.checkInt(milliseconds);
+    _js_helper.checkBool(isUtc);
+    let jsMonth = dart.notNull(month) - 1;
+    let value = null;
+    if (dart.test(isUtc)) {
+      value = Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds);
+    } else {
+      value = new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
+    }
+    if (dart.test(value[dartx.isNaN]) || dart.notNull(value) < -MAX_MILLISECONDS_SINCE_EPOCH || dart.notNull(value) > MAX_MILLISECONDS_SINCE_EPOCH) {
+      return null;
+    }
+    if (dart.notNull(years) <= 0 || dart.notNull(years) < 100) return core.num._check(_js_helper.Primitives.patchUpY2K(value, years, isUtc));
+    return value;
+  }
+  static patchUpY2K(value, years, isUtc) {
+    let date = new Date(value);
+    if (dart.test(isUtc)) {
+      date.setUTCFullYear(years);
+    } else {
+      date.setFullYear(years);
+    }
+    return date.valueOf();
+  }
+  static lazyAsJsDate(receiver) {
+    if (receiver.date === void 0) {
+      receiver.date = new Date(receiver.millisecondsSinceEpoch);
+    }
+    return receiver.date;
+  }
+  static getYear(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCFullYear() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getFullYear() + 0;
+  }
+  static getMonth(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMonth() + 1 : _js_helper.Primitives.lazyAsJsDate(receiver).getMonth() + 1;
+  }
+  static getDay(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDate() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDate() + 0;
+  }
+  static getHours(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCHours() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getHours() + 0;
+  }
+  static getMinutes(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMinutes() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMinutes() + 0;
+  }
+  static getSeconds(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCSeconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getSeconds() + 0;
+  }
+  static getMilliseconds(receiver) {
+    return dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCMilliseconds() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getMilliseconds() + 0;
+  }
+  static getWeekday(receiver) {
+    let weekday = dart.test(receiver.isUtc) ? _js_helper.Primitives.lazyAsJsDate(receiver).getUTCDay() + 0 : _js_helper.Primitives.lazyAsJsDate(receiver).getDay() + 0;
+    return (weekday + 6)[dartx['%']](7) + 1;
+  }
+  static valueFromDateString(str) {
+    if (!(typeof str == 'string')) dart.throw(_js_helper.argumentErrorValue(str));
+    let value = Date.parse(str);
+    if (dart.test(value[dartx.isNaN])) dart.throw(_js_helper.argumentErrorValue(str));
+    return value;
+  }
+  static getProperty(object, key) {
+    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
+      dart.throw(_js_helper.argumentErrorValue(object));
+    }
+    return object[key];
+  }
+  static setProperty(object, key, value) {
+    if (object == null || typeof object == 'boolean' || typeof object == 'number' || typeof object == 'string') {
+      dart.throw(_js_helper.argumentErrorValue(object));
+    }
+    object[key] = value;
+  }
+  static extractStackTrace(error) {
+    return _js_helper.getTraceFromException(error.$thrownJsError);
+  }
+};
+dart.setSignature(_js_helper.Primitives, {
+  sfields: () => ({
+    mirrorFunctionCacheName: core.String,
+    mirrorInvokeCacheName: core.String,
+    DOLLAR_CHAR_VALUE: core.int,
+    timerFrequency: core.int,
+    timerTicks: core.Function
+  }),
+  sgetters: () => ({
+    isD8: dart.definiteFunctionType(core.bool, []),
+    isJsshell: dart.definiteFunctionType(core.bool, [])
+  }),
+  statics: () => ({
+    initializeStatics: dart.definiteFunctionType(dart.void, [core.int]),
+    objectHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
+    _parseIntError: dart.definiteFunctionType(core.int, [core.String, StringToint()]),
+    parseInt: dart.definiteFunctionType(core.int, [core.String, core.int, StringToint()]),
+    _parseDoubleError: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
+    parseDouble: dart.definiteFunctionType(core.double, [core.String, StringTodouble()]),
+    objectTypeName: dart.definiteFunctionType(core.String, [core.Object]),
+    objectToString: dart.definiteFunctionType(core.String, [core.Object]),
+    dateNow: dart.definiteFunctionType(core.int, []),
+    initTicker: dart.definiteFunctionType(dart.void, []),
+    currentUri: dart.definiteFunctionType(core.String, []),
+    _fromCharCodeApply: dart.definiteFunctionType(core.String, [ListOfint()]),
+    stringFromCodePoints: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
+    stringFromCharCodes: dart.definiteFunctionType(core.String, [JSArrayOfint()]),
+    stringFromNativeUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
+    stringFromCharCode: dart.definiteFunctionType(core.String, [core.int]),
+    stringConcatUnchecked: dart.definiteFunctionType(core.String, [core.String, core.String]),
+    flattenString: dart.definiteFunctionType(core.String, [core.String]),
+    getTimeZoneName: dart.definiteFunctionType(core.String, [core.DateTime]),
+    getTimeZoneOffsetInMinutes: dart.definiteFunctionType(core.int, [core.DateTime]),
+    valueFromDecomposedDate: dart.definiteFunctionType(core.num, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
+    patchUpY2K: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    lazyAsJsDate: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getYear: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getMonth: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getDay: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getHours: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getMinutes: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getSeconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getMilliseconds: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    getWeekday: dart.definiteFunctionType(dart.dynamic, [core.DateTime]),
+    valueFromDateString: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    setProperty: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    extractStackTrace: dart.definiteFunctionType(core.StackTrace, [core.Error])
+  }),
+  names: ['initializeStatics', 'objectHashCode', '_parseIntError', 'parseInt', '_parseDoubleError', 'parseDouble', 'objectTypeName', 'objectToString', 'dateNow', 'initTicker', 'currentUri', '_fromCharCodeApply', 'stringFromCodePoints', 'stringFromCharCodes', 'stringFromNativeUint8List', 'stringFromCharCode', 'stringConcatUnchecked', 'flattenString', 'getTimeZoneName', 'getTimeZoneOffsetInMinutes', 'valueFromDecomposedDate', 'patchUpY2K', 'lazyAsJsDate', 'getYear', 'getMonth', 'getDay', 'getHours', 'getMinutes', 'getSeconds', 'getMilliseconds', 'getWeekday', 'valueFromDateString', 'getProperty', 'setProperty', 'extractStackTrace']
+});
+_js_helper.Primitives.mirrorFunctionCacheName = '$cachedFunction';
+_js_helper.Primitives.mirrorInvokeCacheName = '$cachedInvocation';
+_js_helper.Primitives.DOLLAR_CHAR_VALUE = 36;
+_js_helper.Primitives.timerFrequency = null;
+_js_helper.Primitives.timerTicks = null;
+_js_helper.diagnoseIndexError = function(indexable, index) {
+  if (!(typeof index == 'number')) return new core.ArgumentError.value(index, 'index');
+  let length = core.int._check(dart.dload(indexable, 'length'));
+  if (dart.test(dart.dsend(index, '<', 0)) || dart.test(dart.dsend(index, '>=', length))) {
+    return core.RangeError.index(core.int._check(index), indexable, 'index', null, length);
+  }
+  return new core.RangeError.value(core.num._check(index), 'index');
+};
+dart.lazyFn(_js_helper.diagnoseIndexError, () => dynamicAnddynamicToError());
+_js_helper.diagnoseRangeError = function(start, end, length) {
+  if (!(typeof start == 'number')) {
+    return new core.ArgumentError.value(start, 'start');
+  }
+  if (dart.test(dart.dsend(start, '<', 0)) || dart.test(dart.dsend(start, '>', length))) {
+    return new core.RangeError.range(core.num._check(start), 0, core.int._check(length), 'start');
+  }
+  if (end != null) {
+    if (!(typeof end == 'number')) {
+      return new core.ArgumentError.value(end, 'end');
+    }
+    if (dart.test(dart.dsend(end, '<', start)) || dart.test(dart.dsend(end, '>', length))) {
+      return new core.RangeError.range(core.num._check(end), core.int._check(start), core.int._check(length), 'end');
+    }
+  }
+  return new core.ArgumentError.value(end, "end");
+};
+dart.lazyFn(_js_helper.diagnoseRangeError, () => dynamicAnddynamicAnddynamicToError());
+_js_helper.stringLastIndexOfUnchecked = function(receiver, element, start) {
+  return receiver.lastIndexOf(element, start);
+};
+dart.fn(_js_helper.stringLastIndexOfUnchecked, dynamicAnddynamicAnddynamicTodynamic());
+_js_helper.argumentErrorValue = function(object) {
+  return new core.ArgumentError.value(object);
+};
+dart.lazyFn(_js_helper.argumentErrorValue, () => dynamicToArgumentError());
+_js_helper.checkNull = function(object) {
+  if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
+  return object;
+};
+dart.fn(_js_helper.checkNull, dynamicTodynamic$());
+_js_helper.checkNum = function(value) {
+  if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
+  return value;
+};
+dart.fn(_js_helper.checkNum, dynamicTodynamic$());
+_js_helper.checkInt = function(value) {
+  if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
+  return value;
+};
+dart.fn(_js_helper.checkInt, dynamicTodynamic$());
+_js_helper.checkBool = function(value) {
+  if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
+  return value;
+};
+dart.fn(_js_helper.checkBool, dynamicTodynamic$());
+_js_helper.checkString = function(value) {
+  if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
+  return value;
+};
+dart.fn(_js_helper.checkString, dynamicTodynamic$());
+_js_helper.throwRuntimeError = function(message) {
+  dart.throw(new _js_helper.RuntimeError(message));
+};
+dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
+_js_helper.throwAbstractClassInstantiationError = function(className) {
+  dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
+};
+dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
+_js_helper.throwConcurrentModificationError = function(collection) {
+  dart.throw(new core.ConcurrentModificationError(collection));
+};
+dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
+const _message = Symbol('_message');
+const _method = Symbol('_method');
+core.Error = class Error extends core.Object {
+  new() {
+  }
+  static safeToString(object) {
+    if (typeof object == 'number' || typeof object == 'boolean' || null == object) {
+      return dart.toString(object);
+    }
+    if (typeof object == 'string') {
+      return core.Error._stringToSafeString(object);
+    }
+    return core.Error._objectToString(object);
+  }
+  static _stringToSafeString(string) {
+    return _js_helper.jsonEncodeNative(string);
+  }
+  static _objectToString(object) {
+    return _js_helper.Primitives.objectToString(object);
+  }
+  get stackTrace() {
+    return _js_helper.Primitives.extractStackTrace(this);
+  }
+};
+dart.setSignature(core.Error, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Error, [])}),
+  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])}),
+  statics: () => ({
+    safeToString: dart.definiteFunctionType(core.String, [core.Object]),
+    _stringToSafeString: dart.definiteFunctionType(core.String, [core.String]),
+    _objectToString: dart.definiteFunctionType(core.String, [core.Object])
+  }),
+  names: ['safeToString', '_stringToSafeString', '_objectToString']
+});
+_js_helper.NullError = class NullError extends core.Error {
+  new(message, match) {
+    this[_message] = message;
+    this[_method] = core.String._check(match == null ? null : match.method);
+    super.new();
+  }
+  toString() {
+    if (this[_method] == null) return dart.str`NullError: ${this[_message]}`;
+    return dart.str`NullError: method not found: '${this[_method]}' on null`;
+  }
+};
+_js_helper.NullError[dart.implements] = () => [core.NoSuchMethodError];
+dart.setSignature(_js_helper.NullError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NullError, [core.String, dart.dynamic])}),
+  fields: () => ({
+    [_message]: core.String,
+    [_method]: core.String
+  })
+});
+const _receiver = Symbol('_receiver');
+_js_helper.JsNoSuchMethodError = class JsNoSuchMethodError extends core.Error {
+  new(message, match) {
+    this[_message] = message;
+    this[_method] = core.String._check(match == null ? null : match.method);
+    this[_receiver] = core.String._check(match == null ? null : match.receiver);
+    super.new();
+  }
+  toString() {
+    if (this[_method] == null) return dart.str`NoSuchMethodError: ${this[_message]}`;
+    if (this[_receiver] == null) {
+      return dart.str`NoSuchMethodError: method not found: '${this[_method]}' (${this[_message]})`;
+    }
+    return "NoSuchMethodError: " + dart.str`method not found: '${this[_method]}' on '${this[_receiver]}' (${this[_message]})`;
+  }
+};
+_js_helper.JsNoSuchMethodError[dart.implements] = () => [core.NoSuchMethodError];
+dart.setSignature(_js_helper.JsNoSuchMethodError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsNoSuchMethodError, [core.String, dart.dynamic])}),
+  fields: () => ({
+    [_message]: core.String,
+    [_method]: core.String,
+    [_receiver]: core.String
+  })
+});
+_js_helper.UnknownJsTypeError = class UnknownJsTypeError extends core.Error {
+  new(message) {
+    this[_message] = message;
+    super.new();
+  }
+  toString() {
+    return dart.test(this[_message][dartx.isEmpty]) ? 'Error' : dart.str`Error: ${this[_message]}`;
+  }
+};
+dart.setSignature(_js_helper.UnknownJsTypeError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.UnknownJsTypeError, [core.String])}),
+  fields: () => ({[_message]: core.String})
+});
+_js_helper.getTraceFromException = function(exception) {
+  return new _js_helper._StackTrace(exception);
+};
+dart.lazyFn(_js_helper.getTraceFromException, () => dynamicToStackTrace());
+const _exception = Symbol('_exception');
+const _trace = Symbol('_trace');
+_js_helper._StackTrace = class _StackTrace extends core.Object {
+  new(exception) {
+    this[_exception] = exception;
+    this[_trace] = null;
+  }
+  toString() {
+    if (this[_trace] != null) return this[_trace];
+    let trace = null;
+    if (this[_exception] !== null && typeof this[_exception] === "object") {
+      trace = this[_exception].stack;
+    }
+    return this[_trace] = trace == null ? '' : trace;
+  }
+};
+_js_helper._StackTrace[dart.implements] = () => [core.StackTrace];
+dart.setSignature(_js_helper._StackTrace, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StackTrace, [dart.dynamic])}),
+  fields: () => ({
+    [_exception]: dart.dynamic,
+    [_trace]: core.String
+  })
+});
+_js_helper.objectHashCode = function(object) {
+  if (object == null || typeof object != 'object') {
+    return dart.hashCode(object);
+  } else {
+    return _js_helper.Primitives.objectHashCode(object);
+  }
+};
+dart.fn(_js_helper.objectHashCode, dynamicToint());
+_js_helper.fillLiteralMap = function(keyValuePairs, result) {
+  let index = 0;
+  let length = _js_helper.getLength(keyValuePairs);
+  while (index < dart.notNull(length)) {
+    let key = _js_helper.getIndex(keyValuePairs, index++);
+    let value = _js_helper.getIndex(keyValuePairs, index++);
+    result[dartx._set](key, value);
+  }
+  return result;
+};
+dart.lazyFn(_js_helper.fillLiteralMap, () => dynamicAndMapTodynamic());
+_js_helper.jsHasOwnProperty = function(jsObject, property) {
+  return jsObject.hasOwnProperty(property);
+};
+dart.lazyFn(_js_helper.jsHasOwnProperty, () => dynamicAndStringTobool());
+_js_helper.jsPropertyAccess = function(jsObject, property) {
+  return jsObject[property];
+};
+dart.lazyFn(_js_helper.jsPropertyAccess, () => dynamicAndStringTodynamic());
+_js_helper.getFallThroughError = function() {
+  return new _js_helper.FallThroughErrorImplementation();
+};
+dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
+_js_helper.Creates = class Creates extends core.Object {
+  new(types) {
+    this.types = types;
+  }
+};
+dart.setSignature(_js_helper.Creates, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Creates, [core.String])}),
+  fields: () => ({types: core.String})
+});
+_js_helper.Returns = class Returns extends core.Object {
+  new(types) {
+    this.types = types;
+  }
+};
+dart.setSignature(_js_helper.Returns, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Returns, [core.String])}),
+  fields: () => ({types: core.String})
+});
+_js_helper.JSName = class JSName extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_js_helper.JSName, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSName, [core.String])}),
+  fields: () => ({name: core.String})
+});
+_js_helper.JavaScriptIndexingBehavior = class JavaScriptIndexingBehavior extends core.Object {};
+_js_helper.TypeErrorImplementation = class TypeErrorImplementation extends core.Error {
+  new(value, actualType, expectedType) {
+    this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}'`;
+    super.new();
+  }
+  fromMessage(message) {
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return this.message;
+  }
+};
+dart.defineNamedConstructor(_js_helper.TypeErrorImplementation, 'fromMessage');
+_js_helper.TypeErrorImplementation[dart.implements] = () => [core.TypeError];
+dart.setSignature(_js_helper.TypeErrorImplementation, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.Object, core.Object, core.Object]),
+    fromMessage: dart.definiteFunctionType(_js_helper.TypeErrorImplementation, [core.String])
+  }),
+  fields: () => ({message: core.String})
+});
+_js_helper.CastErrorImplementation = class CastErrorImplementation extends core.Error {
+  new(value, actualType, expectedType) {
+    this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` incompatible type '${expectedType}'`;
+    super.new();
+  }
+  toString() {
+    return this.message;
+  }
+};
+_js_helper.CastErrorImplementation[dart.implements] = () => [core.CastError];
+dart.setSignature(_js_helper.CastErrorImplementation, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.CastErrorImplementation, [core.Object, core.Object, core.Object])}),
+  fields: () => ({message: core.String})
+});
+_js_helper.StrongModeTypeError = class StrongModeTypeError extends core.Error {
+  new(value, actualType, expectedType) {
+    this.message = dart.str`Type '${actualType}' is not a subtype ` + dart.str`of type '${expectedType}' in strong mode`;
+    super.new();
+  }
+  toString() {
+    return this.message;
+  }
+};
+_js_helper.StrongModeTypeError[dart.implements] = () => [core.TypeError, core.StrongModeError];
+dart.setSignature(_js_helper.StrongModeTypeError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeTypeError, [core.Object, core.Object, core.Object])}),
+  fields: () => ({message: core.String})
+});
+_js_helper.StrongModeCastError = class StrongModeCastError extends core.Error {
+  new(value, actualType, expectedType) {
+    this.message = dart.str`CastError: Casting value of type '${actualType}' to` + dart.str` type '${expectedType}' which is incompatible in strong mode`;
+    super.new();
+  }
+  toString() {
+    return this.message;
+  }
+};
+_js_helper.StrongModeCastError[dart.implements] = () => [core.CastError, core.StrongModeError];
+dart.setSignature(_js_helper.StrongModeCastError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeCastError, [core.Object, core.Object, core.Object])}),
+  fields: () => ({message: core.String})
+});
+_js_helper.StrongModeErrorImplementation = class StrongModeErrorImplementation extends core.Error {
+  new(message) {
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return this.message;
+  }
+};
+_js_helper.StrongModeErrorImplementation[dart.implements] = () => [core.StrongModeError];
+dart.setSignature(_js_helper.StrongModeErrorImplementation, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StrongModeErrorImplementation, [core.String])}),
+  fields: () => ({message: core.String})
+});
+core.FallThroughError = class FallThroughError extends core.Error {
+  new() {
+    super.new();
+  }
+};
+dart.setSignature(core.FallThroughError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.FallThroughError, [])})
+});
+_js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
+  new() {
+    super.new();
+  }
+  toString() {
+    return "Switch case fall-through.";
+  }
+};
+dart.setSignature(_js_helper.FallThroughErrorImplementation, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.FallThroughErrorImplementation, [])})
+});
+_js_helper.RuntimeError = class RuntimeError extends core.Error {
+  new(message) {
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return dart.str`RuntimeError: ${this.message}`;
+  }
+};
+dart.setSignature(_js_helper.RuntimeError, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.RuntimeError, [dart.dynamic])}),
+  fields: () => ({message: dart.dynamic})
+});
+core.AssertionError = class AssertionError extends core.Error {
+  new() {
+    super.new();
+  }
+  toString() {
+    return "Assertion failed";
+  }
+};
+dart.setSignature(core.AssertionError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.AssertionError, [])})
+});
+_js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
+  new(message) {
+    this[_message] = message;
+    super.new();
+  }
+  toString() {
+    return dart.str`Assertion failed: ${this[_message]}`;
+  }
+};
+dart.setSignature(_js_helper.AssertionErrorWithMessage, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.AssertionErrorWithMessage, [core.Object])}),
+  fields: () => ({[_message]: core.Object})
+});
+_js_helper.random64 = function() {
+  let int32a = Math.random() * 0x100000000 >>> 0;
+  let int32b = Math.random() * 0x100000000 >>> 0;
+  return int32a + int32b * 4294967296;
+};
+dart.fn(_js_helper.random64, VoidToint());
+_js_helper.jsonEncodeNative = function(string) {
+  return JSON.stringify(string);
+};
+dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
+const _jsIterator = Symbol('_jsIterator');
+const _current$0 = Symbol('_current');
+_js_helper.SyncIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class SyncIterator extends core.Object {
+    new(jsIterator) {
+      this[_jsIterator] = jsIterator;
+      this[_current$0] = null;
+    }
+    get current() {
+      return this[_current$0];
+    }
+    moveNext() {
+      let ret = this[_jsIterator].next();
+      this[_current$0] = ret.value;
+      return !ret.done;
+    }
+  }
+  dart.addTypeTests(SyncIterator);
+  SyncIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(SyncIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
+    fields: () => ({
+      [_jsIterator]: dart.dynamic,
+      [_current$0]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return SyncIterator;
+});
+_js_helper.SyncIterator = SyncIterator();
+const _generator = Symbol('_generator');
+const _args = Symbol('_args');
+collection.IterableBase$ = dart.generic(E => {
+  class IterableBase extends core.Iterable$(E) {
+    new() {
+      super.new();
+    }
+    static iterableToShortString(iterable, leftDelimiter, rightDelimiter) {
+      if (leftDelimiter === void 0) leftDelimiter = '(';
+      if (rightDelimiter === void 0) rightDelimiter = ')';
+      if (dart.test(collection._isToStringVisiting(iterable))) {
+        if (leftDelimiter == "(" && rightDelimiter == ")") {
+          return "(...)";
+        }
+        return dart.str`${leftDelimiter}...${rightDelimiter}`;
+      }
+      let parts = [];
+      collection._toStringVisiting[dartx.add](iterable);
+      try {
+        collection._iterablePartsToStrings(iterable, parts);
+      } finally {
+        dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
+        collection._toStringVisiting[dartx.removeLast]();
+      }
+      return (() => {
+        let _ = new core.StringBuffer(leftDelimiter);
+        _.writeAll(parts, ", ");
+        _.write(rightDelimiter);
+        return _;
+      })().toString();
+    }
+    static iterableToFullString(iterable, leftDelimiter, rightDelimiter) {
+      if (leftDelimiter === void 0) leftDelimiter = '(';
+      if (rightDelimiter === void 0) rightDelimiter = ')';
+      if (dart.test(collection._isToStringVisiting(iterable))) {
+        return dart.str`${leftDelimiter}...${rightDelimiter}`;
+      }
+      let buffer = new core.StringBuffer(leftDelimiter);
+      collection._toStringVisiting[dartx.add](iterable);
+      try {
+        buffer.writeAll(iterable, ", ");
+      } finally {
+        dart.assert(core.identical(collection._toStringVisiting[dartx.last], iterable));
+        collection._toStringVisiting[dartx.removeLast]();
+      }
+      buffer.write(rightDelimiter);
+      return buffer.toString();
+    }
+  }
+  dart.setSignature(IterableBase, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.IterableBase$(E), [])}),
+    statics: () => ({
+      iterableToShortString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String]),
+      iterableToFullString: dart.definiteFunctionType(core.String, [core.Iterable], [core.String, core.String])
+    }),
+    names: ['iterableToShortString', 'iterableToFullString']
+  });
+  return IterableBase;
+});
+collection.IterableBase = IterableBase();
+_js_helper.SyncIterable$ = dart.generic(E => {
+  let SyncIteratorOfE = () => (SyncIteratorOfE = dart.constFn(_js_helper.SyncIterator$(E)))();
+  class SyncIterable extends collection.IterableBase$(E) {
+    new(generator, args) {
+      this[_generator] = generator;
+      this[_args] = args;
+      super.new();
+    }
+    [_jsIterator]() {
+      return this[_generator](...this[_args]);
+    }
+    get iterator() {
+      return new (SyncIteratorOfE())(this[_jsIterator]());
+    }
+  }
+  dart.setSignature(SyncIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterable$(E), [dart.dynamic, dart.dynamic])}),
+    fields: () => ({
+      [_generator]: dart.dynamic,
+      [_args]: dart.dynamic
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({[_jsIterator]: dart.definiteFunctionType(dart.dynamic, [])})
+  });
+  dart.defineExtensionMembers(SyncIterable, ['iterator']);
+  return SyncIterable;
+});
+_js_helper.SyncIterable = SyncIterable();
+_js_helper.BooleanConversionAssertionError = class BooleanConversionAssertionError extends core.AssertionError {
+  new() {
+    super.new();
+  }
+  toString() {
+    return 'Failed assertion: boolean expression must not be null';
+  }
+};
+_js_helper.NoThrows = class NoThrows extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_js_helper.NoThrows, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoThrows, [])})
+});
+_js_helper.NoInline = class NoInline extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_js_helper.NoInline, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.NoInline, [])})
+});
+_js_helper.Native = class Native extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_js_helper.Native, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.Native, [core.String])}),
+  fields: () => ({name: core.String})
+});
+_js_helper.JsPeerInterface = class JsPeerInterface extends core.Object {
+  new(opts) {
+    let name = opts && 'name' in opts ? opts.name : null;
+    this.name = name;
+  }
+};
+dart.setSignature(_js_helper.JsPeerInterface, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JsPeerInterface, [], {name: core.String})}),
+  fields: () => ({name: core.String})
+});
+_js_helper.SupportJsExtensionMethods = class SupportJsExtensionMethods extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_js_helper.SupportJsExtensionMethods, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
+});
+const _length$0 = Symbol('_length');
+const _strings = Symbol('_strings');
+const _nums = Symbol('_nums');
+const _rest = Symbol('_rest');
+const _first = Symbol('_first');
+const _last = Symbol('_last');
+const _modifications = Symbol('_modifications');
+const _containsTableEntry = Symbol('_containsTableEntry');
+const _getBucket = Symbol('_getBucket');
+const _getTableCell = Symbol('_getTableCell');
+const _newHashTable = Symbol('_newHashTable');
+const _addHashTableEntry = Symbol('_addHashTableEntry');
+const _getTableBucket = Symbol('_getTableBucket');
+const _newLinkedCell = Symbol('_newLinkedCell');
+const _setTableEntry = Symbol('_setTableEntry');
+const _removeHashTableEntry = Symbol('_removeHashTableEntry');
+const _unlinkCell = Symbol('_unlinkCell');
+const _modified = Symbol('_modified');
+const _next = Symbol('_next');
+const _deleteTableEntry = Symbol('_deleteTableEntry');
+const _previous = Symbol('_previous');
+_js_helper.JsLinkedHashMap$ = dart.generic((K, V) => {
+  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
+  let LinkedHashMapKeyIterableOfK = () => (LinkedHashMapKeyIterableOfK = dart.constFn(_js_helper.LinkedHashMapKeyIterable$(K)))();
+  let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
+  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
+  let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
+  let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
+  class JsLinkedHashMap extends core.Object {
+    new() {
+      this[_length$0] = 0;
+      this[_strings] = null;
+      this[_nums] = null;
+      this[_rest] = null;
+      this[_first] = null;
+      this[_last] = null;
+      this[_modifications] = 0;
+    }
+    static es6() {
+      return new (JsLinkedHashMapOfK$V())();
+    }
+    get length() {
+      return this[_length$0];
+    }
+    get isEmpty() {
+      return this[_length$0] == 0;
     }
     get isNotEmpty() {
-      return dart.notNull(this.length) > 0;
+      return !dart.test(this.isEmpty);
     }
     get keys() {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.keys];
-      return new convert._JsonMapKeyIterable(this);
+      return new (LinkedHashMapKeyIterableOfK())(this);
     }
     get values() {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
-      return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
+      return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
+    }
+    containsKey(key) {
+      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
+        let strings = this[_strings];
+        if (strings == null) return false;
+        return this[_containsTableEntry](strings, key);
+      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
+        let nums = this[_nums];
+        if (nums == null) return false;
+        return this[_containsTableEntry](nums, key);
+      } else {
+        return this.internalContainsKey(key);
+      }
+    }
+    internalContainsKey(key) {
+      let rest = this[_rest];
+      if (rest == null) return false;
+      let bucket = this[_getBucket](rest, key);
+      return dart.notNull(this.internalFindBucketIndex(bucket, key)) >= 0;
+    }
+    containsValue(value) {
+      return this.keys[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => {
+        this._set(key, value);
+      }, KAndVToNull()));
+    }
+    _get(key) {
+      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
+        let strings = this[_strings];
+        if (strings == null) return null;
+        let cell = this[_getTableCell](strings, key);
+        return cell == null ? null : cell.hashMapCellValue;
+      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
+        let nums = this[_nums];
+        if (nums == null) return null;
+        let cell = this[_getTableCell](nums, key);
+        return cell == null ? null : cell.hashMapCellValue;
+      } else {
+        return this.internalGet(key);
+      }
+    }
+    internalGet(key) {
+      let rest = this[_rest];
+      if (rest == null) return null;
+      let bucket = this[_getBucket](rest, key);
+      let index = this.internalFindBucketIndex(bucket, key);
+      if (dart.notNull(index) < 0) return null;
+      let cell = bucket[index];
+      return cell.hashMapCellValue;
     }
     _set(key, value) {
-      if (dart.test(this[_isUpgraded])) {
-        this[_upgradedMap][dartx._set](key, value);
-      } else if (dart.test(this.containsKey(key))) {
-        let processed = this[_processed];
-        convert._JsonMap._setProperty(processed, core.String._check(key), value);
-        let original = this[_original];
-        if (!core.identical(original, processed)) {
-          convert._JsonMap._setProperty(original, core.String._check(key), null);
-        }
+      K._check(key);
+      V._check(value);
+      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
+        let strings = this[_strings];
+        if (strings == null) this[_strings] = strings = this[_newHashTable]();
+        this[_addHashTableEntry](strings, key, value);
+      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
+        let nums = this[_nums];
+        if (nums == null) this[_nums] = nums = this[_newHashTable]();
+        this[_addHashTableEntry](nums, key, value);
       } else {
-        this[_upgrade]()[dartx._set](key, value);
+        this.internalSet(key, value);
       }
       return value;
     }
-    addAll(other) {
-      other[dartx.forEach](dart.fn((key, value) => {
-        this._set(key, value);
-      }, dynamicAnddynamicToNull()));
-    }
-    containsValue(value) {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
-      let keys = this[_computeKeys$]();
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        let key = keys[dartx._get](i);
-        if (dart.equals(this._get(key), value)) return true;
+    internalSet(key, value) {
+      K._check(key);
+      V._check(value);
+      let rest = this[_rest];
+      if (rest == null) this[_rest] = rest = this[_newHashTable]();
+      let hash = this.internalComputeHashCode(key);
+      let bucket = this[_getTableBucket](rest, hash);
+      if (bucket == null) {
+        let cell = this[_newLinkedCell](key, value);
+        this[_setTableEntry](rest, hash, [cell]);
+      } else {
+        let index = this.internalFindBucketIndex(bucket, key);
+        if (dart.notNull(index) >= 0) {
+          let cell = bucket[index];
+          cell.hashMapCellValue = value;
+        } else {
+          let cell = this[_newLinkedCell](key, value);
+          bucket.push(cell);
+        }
       }
-      return false;
-    }
-    containsKey(key) {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsKey](key);
-      if (!(typeof key == 'string')) return false;
-      return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
     }
     putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
       if (dart.test(this.containsKey(key))) return this._get(key);
       let value = ifAbsent();
       this._set(key, value);
       return value;
     }
     remove(key) {
-      if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
-      return this[_upgrade]()[dartx.remove](key);
+      if (dart.test(_js_helper.JsLinkedHashMap._isStringKey(key))) {
+        return this[_removeHashTableEntry](this[_strings], key);
+      } else if (dart.test(_js_helper.JsLinkedHashMap._isNumericKey(key))) {
+        return this[_removeHashTableEntry](this[_nums], key);
+      } else {
+        return this.internalRemove(key);
+      }
+    }
+    internalRemove(key) {
+      let rest = this[_rest];
+      if (rest == null) return null;
+      let bucket = this[_getBucket](rest, key);
+      let index = this.internalFindBucketIndex(bucket, key);
+      if (dart.notNull(index) < 0) return null;
+      let cell = bucket.splice(index, 1)[0];
+      this[_unlinkCell](cell);
+      return cell.hashMapCellValue;
     }
     clear() {
-      if (dart.test(this[_isUpgraded])) {
-        this[_upgradedMap][dartx.clear]();
-      } else {
-        if (this[_data] != null) {
-          dart.dsend(this[_data], 'clear');
-        }
-        this[_original] = this[_processed] = null;
-        this[_data] = dart.map();
+      if (dart.notNull(this[_length$0]) > 0) {
+        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
+        this[_length$0] = 0;
+        this[_modified]();
       }
     }
-    forEach(f) {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
-      let keys = this[_computeKeys$]();
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        let key = keys[dartx._get](i);
-        let value = convert._JsonMap._getProperty(this[_processed], key);
-        if (dart.test(convert._JsonMap._isUnprocessed(value))) {
-          value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
-          convert._JsonMap._setProperty(this[_processed], key, value);
-        }
-        dart.dcall(f, key, value);
-        if (!core.identical(keys, this[_data])) {
+    forEach(action) {
+      let cell = this[_first];
+      let modifications = this[_modifications];
+      while (cell != null) {
+        action(cell.hashMapCellKey, cell.hashMapCellValue);
+        if (modifications != this[_modifications]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
+        cell = cell[_next];
       }
     }
+    [_addHashTableEntry](table, key, value) {
+      K._check(key);
+      V._check(value);
+      let cell = this[_getTableCell](table, key);
+      if (cell == null) {
+        this[_setTableEntry](table, key, this[_newLinkedCell](key, value));
+      } else {
+        cell.hashMapCellValue = value;
+      }
+    }
+    [_removeHashTableEntry](table, key) {
+      if (table == null) return null;
+      let cell = this[_getTableCell](table, key);
+      if (cell == null) return null;
+      this[_unlinkCell](cell);
+      this[_deleteTableEntry](table, key);
+      return cell.hashMapCellValue;
+    }
+    [_modified]() {
+      this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
+    }
+    [_newLinkedCell](key, value) {
+      K._check(key);
+      V._check(value);
+      let cell = new (LinkedHashMapCellOfK$V())(key, value);
+      if (this[_first] == null) {
+        this[_first] = this[_last] = cell;
+      } else {
+        let last = this[_last];
+        cell[_previous] = last;
+        this[_last] = last[_next] = cell;
+      }
+      this[_length$0] = dart.notNull(this[_length$0]) + 1;
+      this[_modified]();
+      return cell;
+    }
+    [_unlinkCell](cell) {
+      LinkedHashMapCellOfK$V()._check(cell);
+      let previous = cell[_previous];
+      let next = cell[_next];
+      if (previous == null) {
+        dart.assert(dart.equals(cell, this[_first]));
+        this[_first] = next;
+      } else {
+        previous[_next] = next;
+      }
+      if (next == null) {
+        dart.assert(dart.equals(cell, this[_last]));
+        this[_last] = previous;
+      } else {
+        next[_previous] = previous;
+      }
+      this[_length$0] = dart.notNull(this[_length$0]) - 1;
+      this[_modified]();
+    }
+    static _isStringKey(key) {
+      return typeof key == 'string';
+    }
+    static _isNumericKey(key) {
+      return typeof key == 'number' && (key & 0x3ffffff) === key;
+    }
+    internalComputeHashCode(key) {
+      return dart.hashCode(key) & 0x3ffffff;
+    }
+    [_getBucket](table, key) {
+      let hash = this.internalComputeHashCode(key);
+      return this[_getTableBucket](table, hash);
+    }
+    internalFindBucketIndex(bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (dart.equals(cell.hashMapCellKey, key)) return i;
+      }
+      return -1;
+    }
     toString() {
       return collection.Maps.mapToString(this);
     }
-    get [_isUpgraded]() {
-      return this[_processed] == null;
+    [_getTableCell](table, key) {
+      return table[key];
     }
-    get [_upgradedMap]() {
-      dart.assert(this[_isUpgraded]);
-      return this[_data];
+    [_getTableBucket](table, key) {
+      return table[key];
     }
-    [_computeKeys$]() {
-      dart.assert(!dart.test(this[_isUpgraded]));
-      let keys = core.List._check(this[_data]);
-      if (keys == null) {
-        keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
-      }
-      return keys;
+    [_setTableEntry](table, key, value) {
+      dart.assert(value != null);
+      table[key] = value;
     }
-    [_upgrade]() {
-      if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
-      let result = dart.map();
-      let keys = this[_computeKeys$]();
-      for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
-        let key = keys[dartx._get](i);
-        result[dartx._set](key, this._get(key));
-      }
-      if (dart.test(keys[dartx.isEmpty])) {
-        keys[dartx.add](null);
-      } else {
-        keys[dartx.clear]();
-      }
-      this[_original] = this[_processed] = null;
-      this[_data] = result;
-      dart.assert(this[_isUpgraded]);
-      return result;
+    [_deleteTableEntry](table, key) {
+      delete table[key];
     }
-    [_process$](key) {
-      if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
-      let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
-      return convert._JsonMap._setProperty(this[_processed], key, result);
+    [_containsTableEntry](table, key) {
+      let cell = this[_getTableCell](table, key);
+      return cell != null;
     }
-    static _hasProperty(object, key) {
-      return Object.prototype.hasOwnProperty.call(object, key);
+    [_newHashTable]() {
+      let table = Object.create(null);
+      let temporaryKey = '<non-identifier-key>';
+      this[_setTableEntry](table, temporaryKey, table);
+      this[_deleteTableEntry](table, temporaryKey);
+      return table;
     }
-    static _getProperty(object, key) {
-      return object[key];
-    }
-    static _setProperty(object, key, value) {
-      return object[key] = value;
-    }
-    static _getPropertyNames(object) {
-      return Object.keys(object);
-    }
-    static _isUnprocessed(object) {
-      return typeof object == "undefined";
-    }
-    static _newJavaScriptObject() {
-      return Object.create(null);
-    }
-  };
-  convert._JsonMap[dart.implements] = () => [collection.LinkedHashMap];
-  dart.setSignature(convert._JsonMap, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMap, [dart.dynamic])}),
+  }
+  dart.addTypeTests(JsLinkedHashMap);
+  JsLinkedHashMap[dart.implements] = () => [LinkedHashMapOfK$V(), InternalMapOfK$V()];
+  dart.setSignature(JsLinkedHashMap, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), []),
+      es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
+    }),
     fields: () => ({
-      [_original]: dart.dynamic,
-      [_processed]: dart.dynamic,
-      [_data]: dart.dynamic
+      [_length$0]: core.int,
+      [_strings]: dart.dynamic,
+      [_nums]: dart.dynamic,
+      [_rest]: dart.dynamic,
+      [_first]: LinkedHashMapCellOfK$V(),
+      [_last]: LinkedHashMapCellOfK$V(),
+      [_modifications]: core.int
     }),
     getters: () => ({
       length: dart.definiteFunctionType(core.int, []),
       isEmpty: dart.definiteFunctionType(core.bool, []),
       isNotEmpty: dart.definiteFunctionType(core.bool, []),
-      keys: dart.definiteFunctionType(core.Iterable, []),
-      values: dart.definiteFunctionType(core.Iterable, []),
-      [_isUpgraded]: dart.definiteFunctionType(core.bool, []),
-      [_upgradedMap]: dart.definiteFunctionType(core.Map, [])
+      keys: dart.definiteFunctionType(core.Iterable$(K), []),
+      values: dart.definiteFunctionType(core.Iterable$(V), [])
     }),
     methods: () => ({
-      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
-      _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
-      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
       containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
-      remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+      internalContainsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      _get: dart.definiteFunctionType(V, [core.Object]),
+      internalGet: dart.definiteFunctionType(V, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [K, V]),
+      internalSet: dart.definiteFunctionType(dart.void, [K, V]),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
+      remove: dart.definiteFunctionType(V, [core.Object]),
+      internalRemove: dart.definiteFunctionType(V, [core.Object]),
       clear: dart.definiteFunctionType(dart.void, []),
-      forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
-      [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
-      [_upgrade]: dart.definiteFunctionType(core.Map, []),
-      [_process$]: dart.definiteFunctionType(dart.dynamic, [core.String])
+      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
+      [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
+      [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
+      [_modified]: dart.definiteFunctionType(dart.void, []),
+      [_newLinkedCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V]),
+      [_unlinkCell]: dart.definiteFunctionType(dart.void, [LinkedHashMapCellOfK$V()]),
+      internalComputeHashCode: dart.definiteFunctionType(core.int, [dart.dynamic]),
+      [_getBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
+      internalFindBucketIndex: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
+      [_getTableCell]: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [dart.dynamic, dart.dynamic]),
+      [_getTableBucket]: dart.definiteFunctionType(core.List$(_js_helper.LinkedHashMapCell$(K, V)), [dart.dynamic, dart.dynamic]),
+      [_setTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+      [_deleteTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+      [_containsTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+      [_newHashTable]: dart.definiteFunctionType(dart.dynamic, [])
     }),
     statics: () => ({
-      _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
-      _getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String]),
-      _setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
-      _getPropertyNames: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      _isUnprocessed: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      _newJavaScriptObject: dart.definiteFunctionType(dart.dynamic, [])
+      _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic])
     }),
-    names: ['_hasProperty', '_getProperty', '_setProperty', '_getPropertyNames', '_isUnprocessed', '_newJavaScriptObject']
+    names: ['_isStringKey', '_isNumericKey']
   });
-  dart.defineExtensionMembers(convert._JsonMap, [
+  dart.defineExtensionMembers(JsLinkedHashMap, [
+    'containsKey',
+    'containsValue',
+    'addAll',
     '_get',
     '_set',
-    'addAll',
-    'containsValue',
-    'containsKey',
     'putIfAbsent',
     'remove',
     'clear',
@@ -29255,2908 +12874,19189 @@
     'keys',
     'values'
   ]);
-  const _parent = Symbol('_parent');
-  convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable {
-    new(parent) {
-      this[_parent] = parent;
+  return JsLinkedHashMap;
+});
+_js_helper.JsLinkedHashMap = JsLinkedHashMap();
+_js_helper.Es6LinkedHashMap$ = dart.generic((K, V) => {
+  class Es6LinkedHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
+    new() {
+      super.new();
+    }
+    [_getTableCell](table, key) {
+      return table.get(key);
+    }
+    [_getTableBucket](table, key) {
+      return table.get(key);
+    }
+    [_setTableEntry](table, key, value) {
+      table.set(key, value);
+    }
+    [_deleteTableEntry](table, key) {
+      table.delete(key);
+    }
+    [_containsTableEntry](table, key) {
+      return table.has(key);
+    }
+    [_newHashTable]() {
+      return new Map();
+    }
+  }
+  return Es6LinkedHashMap;
+});
+_js_helper.Es6LinkedHashMap = Es6LinkedHashMap();
+_js_helper.LinkedHashMapCell$ = dart.generic((K, V) => {
+  let LinkedHashMapCellOfK$V = () => (LinkedHashMapCellOfK$V = dart.constFn(_js_helper.LinkedHashMapCell$(K, V)))();
+  class LinkedHashMapCell extends core.Object {
+    new(hashMapCellKey, hashMapCellValue) {
+      this.hashMapCellKey = hashMapCellKey;
+      this.hashMapCellValue = hashMapCellValue;
+      this[_next] = null;
+      this[_previous] = null;
+    }
+  }
+  dart.addTypeTests(LinkedHashMapCell);
+  dart.setSignature(LinkedHashMapCell, {
+    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapCell$(K, V), [K, V])}),
+    fields: () => ({
+      hashMapCellKey: K,
+      hashMapCellValue: V,
+      [_next]: LinkedHashMapCellOfK$V(),
+      [_previous]: LinkedHashMapCellOfK$V()
+    })
+  });
+  return LinkedHashMapCell;
+});
+_js_helper.LinkedHashMapCell = LinkedHashMapCell();
+const _map = Symbol('_map');
+_js_helper.LinkedHashMapKeyIterable$ = dart.generic(E => {
+  let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
+  class LinkedHashMapKeyIterable extends core.Iterable$(E) {
+    new(map) {
+      this[_map] = map;
       super.new();
     }
     get length() {
-      return this[_parent].length;
+      return this[_map][_length$0];
     }
-    elementAt(index) {
-      return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
+    get isEmpty() {
+      return this[_map][_length$0] == 0;
     }
     get iterator() {
-      return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
+      return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
     }
-    contains(key) {
-      return this[_parent].containsKey(key);
+    contains(element) {
+      return this[_map].containsKey(element);
     }
-  };
-  dart.addSimpleTypeTests(convert._JsonMapKeyIterable);
-  dart.setSignature(convert._JsonMapKeyIterable, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonMapKeyIterable, [convert._JsonMap])}),
-    fields: () => ({[_parent]: convert._JsonMap}),
-    methods: () => ({elementAt: dart.definiteFunctionType(core.String, [core.int])})
-  });
-  dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
-  const _reviver = Symbol('_reviver');
-  const _sink$ = Symbol('_sink');
-  const _stringSink = Symbol('_stringSink');
-  convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
-    add(str) {
-      this.addSlice(str, 0, str[dartx.length], false);
-    }
-    asUtf8Sink(allowMalformed) {
-      return new convert._Utf8ConversionSink(this, allowMalformed);
-    }
-    asStringSink() {
-      return new convert._StringConversionSinkAsStringSinkAdapter(this);
-    }
-  };
-  convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
-  dart.setSignature(convert.StringConversionSinkMixin, {
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [core.String]),
-      asUtf8Sink: dart.definiteFunctionType(convert.ByteConversionSink, [core.bool]),
-      asStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [])
-    })
-  });
-  convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
-  convert._StringSinkConversionSink = class _StringSinkConversionSink extends convert.StringConversionSinkBase {
-    new(stringSink) {
-      this[_stringSink] = stringSink;
-    }
-    close() {}
-    addSlice(str, start, end, isLast) {
-      if (start != 0 || end != str[dartx.length]) {
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          this[_stringSink].writeCharCode(str[dartx.codeUnitAt](i));
+    forEach(f) {
+      let cell = this[_map][_first];
+      let modifications = this[_map][_modifications];
+      while (cell != null) {
+        f(cell.hashMapCellKey);
+        if (modifications != this[_map][_modifications]) {
+          dart.throw(new core.ConcurrentModificationError(this[_map]));
         }
-      } else {
-        this[_stringSink].write(str);
+        cell = cell[_next];
       }
-      if (dart.test(isLast)) this.close();
     }
-    add(str) {
-      this[_stringSink].write(str);
-    }
-    asUtf8Sink(allowMalformed) {
-      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
-    }
-    asStringSink() {
-      return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
-    }
-  };
-  dart.setSignature(convert._StringSinkConversionSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._StringSinkConversionSink, [core.StringSink])}),
-    fields: () => ({[_stringSink]: core.StringSink}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
-    })
+  }
+  LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(LinkedHashMapKeyIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterable$(E), [JsLinkedHashMapOfE$dynamic()])}),
+    fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
-  convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
-    new(reviver, sink) {
-      this[_reviver] = reviver;
-      this[_sink$] = sink;
-      super.new(new core.StringBuffer());
+  dart.defineExtensionMembers(LinkedHashMapKeyIterable, [
+    'contains',
+    'forEach',
+    'length',
+    'isEmpty',
+    'iterator'
+  ]);
+  return LinkedHashMapKeyIterable;
+});
+_js_helper.LinkedHashMapKeyIterable = LinkedHashMapKeyIterable();
+const _cell = Symbol('_cell');
+_js_helper.LinkedHashMapKeyIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
+  let LinkedHashMapCellOfE$dynamic = () => (LinkedHashMapCellOfE$dynamic = dart.constFn(_js_helper.LinkedHashMapCell$(E, dart.dynamic)))();
+  class LinkedHashMapKeyIterator extends core.Object {
+    new(map, modifications) {
+      this[_map] = map;
+      this[_modifications] = modifications;
+      this[_cell] = null;
+      this[_current$0] = null;
+      this[_cell] = this[_map][_first];
     }
-    close() {
-      super.close();
-      let buffer = core.StringBuffer._check(this[_stringSink]);
-      let accumulated = dart.toString(buffer);
-      buffer.clear();
-      let decoded = convert._parseJson(accumulated, this[_reviver]);
-      this[_sink$].add(decoded);
-      this[_sink$].close();
+    get current() {
+      return this[_current$0];
     }
-  };
-  dart.setSignature(convert._JsonDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
+    moveNext() {
+      if (this[_modifications] != this[_map][_modifications]) {
+        dart.throw(new core.ConcurrentModificationError(this[_map]));
+      } else if (this[_cell] == null) {
+        this[_current$0] = null;
+        return false;
+      } else {
+        this[_current$0] = this[_cell].hashMapCellKey;
+        this[_cell] = this[_cell][_next];
+        return true;
+      }
+    }
+  }
+  dart.addTypeTests(LinkedHashMapKeyIterator);
+  LinkedHashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(LinkedHashMapKeyIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(_js_helper.LinkedHashMapKeyIterator$(E), [JsLinkedHashMapOfE$dynamic(), core.int])}),
     fields: () => ({
-      [_reviver]: convert._Reviver,
-      [_sink$]: SinkOfObject()
-    })
+      [_map]: JsLinkedHashMapOfE$dynamic(),
+      [_modifications]: core.int,
+      [_cell]: LinkedHashMapCellOfE$dynamic(),
+      [_current$0]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
   });
-  const _allowInvalid = Symbol('_allowInvalid');
-  let const$25;
-  let const$26;
-  let const$27;
-  let const$28;
-  let const$29;
-  convert.Codec$ = dart.generic((S, T) => {
-    let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
-    class Codec extends core.Object {
-      new() {
+  return LinkedHashMapKeyIterator;
+});
+_js_helper.LinkedHashMapKeyIterator = LinkedHashMapKeyIterator();
+_js_helper.defineProperty = function(obj, property, value) {
+  Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+};
+dart.lazyFn(_js_helper.defineProperty, () => dynamicAndStringAnddynamicTovoid());
+_js_helper.convertDartClosureToJS = function(F) {
+  return (closure, arity) => {
+    return closure;
+  };
+};
+dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
+_js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
+};
+dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
+_js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
+};
+dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
+_js_helper.makeLeafDispatchRecord = function(interceptor) {
+};
+dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
+const _nativeRegExp = Symbol('_nativeRegExp');
+_js_helper.regExpGetNative = function(regexp) {
+  return regexp[_nativeRegExp];
+};
+dart.lazyFn(_js_helper.regExpGetNative, () => JSSyntaxRegExpTodynamic());
+const _nativeGlobalVersion = Symbol('_nativeGlobalVersion');
+_js_helper.regExpGetGlobalNative = function(regexp) {
+  let nativeRegexp = regexp[_nativeGlobalVersion];
+  nativeRegexp.lastIndex = 0;
+  return nativeRegexp;
+};
+dart.lazyFn(_js_helper.regExpGetGlobalNative, () => JSSyntaxRegExpTodynamic());
+const _nativeAnchoredVersion = Symbol('_nativeAnchoredVersion');
+_js_helper.regExpCaptureCount = function(regexp) {
+  let nativeAnchoredRegExp = regexp[_nativeAnchoredVersion];
+  let match = nativeAnchoredRegExp.exec('');
+  return core.int._check(dart.dsend(dart.dload(match, 'length'), '-', 2));
+};
+dart.lazyFn(_js_helper.regExpCaptureCount, () => JSSyntaxRegExpToint());
+const _nativeGlobalRegExp = Symbol('_nativeGlobalRegExp');
+const _nativeAnchoredRegExp = Symbol('_nativeAnchoredRegExp');
+const _isMultiLine = Symbol('_isMultiLine');
+const _isCaseSensitive = Symbol('_isCaseSensitive');
+const _execGlobal = Symbol('_execGlobal');
+const _execAnchored = Symbol('_execAnchored');
+_js_helper.JSSyntaxRegExp = class JSSyntaxRegExp extends core.Object {
+  toString() {
+    return dart.str`RegExp/${this.pattern}/`;
+  }
+  new(source, opts) {
+    let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
+    let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
+    this.pattern = source;
+    this[_nativeRegExp] = _js_helper.JSSyntaxRegExp.makeNative(source, multiLine, caseSensitive, false);
+    this[_nativeGlobalRegExp] = null;
+    this[_nativeAnchoredRegExp] = null;
+  }
+  get [_nativeGlobalVersion]() {
+    if (this[_nativeGlobalRegExp] != null) return this[_nativeGlobalRegExp];
+    return this[_nativeGlobalRegExp] = _js_helper.JSSyntaxRegExp.makeNative(this.pattern, this[_isMultiLine], this[_isCaseSensitive], true);
+  }
+  get [_nativeAnchoredVersion]() {
+    if (this[_nativeAnchoredRegExp] != null) return this[_nativeAnchoredRegExp];
+    return this[_nativeAnchoredRegExp] = _js_helper.JSSyntaxRegExp.makeNative(dart.str`${this.pattern}|()`, this[_isMultiLine], this[_isCaseSensitive], true);
+  }
+  get [_isMultiLine]() {
+    return this[_nativeRegExp].multiline;
+  }
+  get [_isCaseSensitive]() {
+    return !this[_nativeRegExp].ignoreCase;
+  }
+  static makeNative(source, multiLine, caseSensitive, global) {
+    _js_helper.checkString(source);
+    let m = dart.test(multiLine) ? 'm' : '';
+    let i = dart.test(caseSensitive) ? '' : 'i';
+    let g = dart.test(global) ? 'g' : '';
+    let regexp = (function() {
+      try {
+        return new RegExp(source, m + i + g);
+      } catch (e) {
+        return e;
       }
-      encode(input) {
-        S._check(input);
-        return this.encoder.convert(input);
-      }
-      decode(encoded) {
-        T._check(encoded);
-        return this.decoder.convert(encoded);
-      }
-      fuse(R) {
-        return other => {
-          convert.Codec$(T, R)._check(other);
-          return new (convert._FusedCodec$(S, T, R))(this, other);
-        };
-      }
-      get inverted() {
-        return new (_InvertedCodecOfT$S())(this);
-      }
+
+    })();
+    if (regexp instanceof RegExp) return regexp;
+    let errorMessage = String(regexp);
+    dart.throw(new core.FormatException(dart.str`Illegal RegExp pattern: ${source}, ${errorMessage}`));
+  }
+  firstMatch(string) {
+    let m = this[_nativeRegExp].exec(_js_helper.checkString(string));
+    if (m == null) return null;
+    return new _js_helper._MatchImplementation(this, m);
+  }
+  hasMatch(string) {
+    return this[_nativeRegExp].test(_js_helper.checkString(string));
+  }
+  stringMatch(string) {
+    let match = this.firstMatch(string);
+    if (match != null) return match.group(0);
+    return null;
+  }
+  allMatches(string, start) {
+    if (start === void 0) start = 0;
+    _js_helper.checkString(string);
+    _js_helper.checkInt(start);
+    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
     }
-    dart.addTypeTests(Codec);
-    dart.setSignature(Codec, {
-      constructors: () => ({new: dart.definiteFunctionType(convert.Codec$(S, T), [])}),
-      getters: () => ({inverted: dart.definiteFunctionType(convert.Codec$(T, S), [])}),
-      methods: () => ({
-        encode: dart.definiteFunctionType(T, [S]),
-        decode: dart.definiteFunctionType(S, [T]),
-        fuse: dart.definiteFunctionType(R => [convert.Codec$(S, R), [convert.Codec$(T, R)]])
-      })
-    });
-    return Codec;
-  });
-  convert.Codec = Codec();
-  core.String = class String extends core.Object {
-    static fromCharCodes(charCodes, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (_interceptors.JSArray.is(charCodes)) {
-        return core.String._stringFromJSArray(JSArrayOfint()._check(charCodes), start, end);
-      }
-      if (_native_typed_data.NativeUint8List.is(charCodes)) {
-        return core.String._stringFromUint8List(charCodes, start, end);
-      }
-      return core.String._stringFromIterable(charCodes, start, end);
+    return new _js_helper._AllMatchesIterable(this, string, start);
+  }
+  [_execGlobal](string, start) {
+    let regexp = this[_nativeGlobalVersion];
+    regexp.lastIndex = start;
+    let match = regexp.exec(string);
+    if (match == null) return null;
+    return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
+  }
+  [_execAnchored](string, start) {
+    let regexp = this[_nativeAnchoredVersion];
+    regexp.lastIndex = start;
+    let match = regexp.exec(string);
+    if (match == null) return null;
+    if (match[dartx._get](dart.notNull(match[dartx.length]) - 1) != null) return null;
+    match[dartx.length] = dart.notNull(match[dartx.length]) - 1;
+    return new _js_helper._MatchImplementation(this, ListOfString()._check(match));
+  }
+  matchAsPrefix(string, start) {
+    if (start === void 0) start = 0;
+    if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(string[dartx.length])) {
+      dart.throw(new core.RangeError.range(start, 0, string[dartx.length]));
     }
-    static fromCharCode(charCode) {
-      return _js_helper.Primitives.stringFromCharCode(charCode);
+    return this[_execAnchored](string, start);
+  }
+  get isMultiLine() {
+    return this[_isMultiLine];
+  }
+  get isCaseSensitive() {
+    return this[_isCaseSensitive];
+  }
+};
+_js_helper.JSSyntaxRegExp[dart.implements] = () => [core.RegExp];
+dart.setSignature(_js_helper.JSSyntaxRegExp, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.JSSyntaxRegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})}),
+  fields: () => ({
+    pattern: core.String,
+    [_nativeRegExp]: dart.dynamic,
+    [_nativeGlobalRegExp]: dart.dynamic,
+    [_nativeAnchoredRegExp]: dart.dynamic
+  }),
+  getters: () => ({
+    [_nativeGlobalVersion]: dart.definiteFunctionType(dart.dynamic, []),
+    [_nativeAnchoredVersion]: dart.definiteFunctionType(dart.dynamic, []),
+    [_isMultiLine]: dart.definiteFunctionType(core.bool, []),
+    [_isCaseSensitive]: dart.definiteFunctionType(core.bool, []),
+    isMultiLine: dart.definiteFunctionType(core.bool, []),
+    isCaseSensitive: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    firstMatch: dart.definiteFunctionType(core.Match, [core.String]),
+    hasMatch: dart.definiteFunctionType(core.bool, [core.String]),
+    stringMatch: dart.definiteFunctionType(core.String, [core.String]),
+    allMatches: dart.definiteFunctionType(core.Iterable$(core.Match), [core.String], [core.int]),
+    [_execGlobal]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
+    [_execAnchored]: dart.definiteFunctionType(core.Match, [core.String, core.int]),
+    matchAsPrefix: dart.definiteFunctionType(core.Match, [core.String], [core.int])
+  }),
+  statics: () => ({makeNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool, core.bool, core.bool])}),
+  names: ['makeNative']
+});
+dart.defineExtensionMembers(_js_helper.JSSyntaxRegExp, ['allMatches', 'matchAsPrefix']);
+const _match = Symbol('_match');
+_js_helper._MatchImplementation = class _MatchImplementation extends core.Object {
+  new(pattern, match) {
+    this.pattern = pattern;
+    this[_match] = match;
+    dart.assert(typeof this[_match].input == 'string');
+    dart.assert(typeof this[_match].index == 'number');
+  }
+  get input() {
+    return this[_match].input;
+  }
+  get start() {
+    return this[_match].index;
+  }
+  get end() {
+    return dart.notNull(this.start) + dart.notNull(this[_match][dartx._get](0)[dartx.length]);
+  }
+  group(index) {
+    return this[_match][dartx._get](index);
+  }
+  _get(index) {
+    return this.group(index);
+  }
+  get groupCount() {
+    return dart.notNull(this[_match][dartx.length]) - 1;
+  }
+  groups(groups) {
+    let out = JSArrayOfString().of([]);
+    for (let i of groups) {
+      out[dartx.add](this.group(i));
     }
-    static fromEnvironment(name, opts) {
-      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
-      dart.throw(new core.UnsupportedError('String.fromEnvironment can only be used as a const constructor'));
-    }
-    static _stringFromJSArray(list, start, endOrNull) {
-      let len = list[dartx.length];
-      let end = core.RangeError.checkValidRange(start, endOrNull, len);
-      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
-        list = JSArrayOfint()._check(list[dartx.sublist](start, end));
-      }
-      return _js_helper.Primitives.stringFromCharCodes(list);
-    }
-    static _stringFromUint8List(charCodes, start, endOrNull) {
-      let len = charCodes[dartx.length];
-      let end = core.RangeError.checkValidRange(start, endOrNull, len);
-      return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
-    }
-    static _stringFromIterable(charCodes, start, end) {
-      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[dartx.length]));
-      if (end != null && dart.notNull(end) < dart.notNull(start)) {
-        dart.throw(new core.RangeError.range(end, start, charCodes[dartx.length]));
-      }
-      let it = charCodes[dartx.iterator];
-      for (let i = 0; i < dart.notNull(start); i++) {
-        if (!dart.test(it.moveNext())) {
-          dart.throw(new core.RangeError.range(start, 0, i));
+    return out;
+  }
+};
+_js_helper._MatchImplementation[dart.implements] = () => [core.Match];
+dart.setSignature(_js_helper._MatchImplementation, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._MatchImplementation, [core.Pattern, ListOfString()])}),
+  fields: () => ({
+    pattern: core.Pattern,
+    [_match]: ListOfString()
+  }),
+  getters: () => ({
+    input: dart.definiteFunctionType(core.String, []),
+    start: dart.definiteFunctionType(core.int, []),
+    end: dart.definiteFunctionType(core.int, []),
+    groupCount: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    group: dart.definiteFunctionType(core.String, [core.int]),
+    _get: dart.definiteFunctionType(core.String, [core.int]),
+    groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
+  })
+});
+const _re = Symbol('_re');
+const _string$ = Symbol('_string');
+const _start$ = Symbol('_start');
+core.Match = class Match extends core.Object {};
+_js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
+  new(re, string, start) {
+    this[_re] = re;
+    this[_string$] = string;
+    this[_start$] = start;
+    super.new();
+  }
+  get iterator() {
+    return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
+  }
+};
+dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
+dart.setSignature(_js_helper._AllMatchesIterable, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
+  fields: () => ({
+    [_re]: _js_helper.JSSyntaxRegExp,
+    [_string$]: core.String,
+    [_start$]: core.int
+  }),
+  getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
+});
+dart.defineExtensionMembers(_js_helper._AllMatchesIterable, ['iterator']);
+const _regExp = Symbol('_regExp');
+const _nextIndex = Symbol('_nextIndex');
+_js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
+  new(regExp, string, nextIndex) {
+    this[_regExp] = regExp;
+    this[_string$] = string;
+    this[_nextIndex] = nextIndex;
+    this[_current$0] = null;
+  }
+  get current() {
+    return this[_current$0];
+  }
+  moveNext() {
+    if (this[_string$] == null) return false;
+    if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
+      let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
+      if (match != null) {
+        this[_current$0] = match;
+        let nextIndex = match.end;
+        if (match.start == nextIndex) {
+          nextIndex = dart.notNull(nextIndex) + 1;
         }
+        this[_nextIndex] = nextIndex;
+        return true;
       }
-      let list = JSArrayOfint().of([]);
-      if (end == null) {
-        while (dart.test(it.moveNext()))
-          list[dartx.add](it.current);
+    }
+    this[_current$0] = null;
+    this[_string$] = null;
+    return false;
+  }
+};
+_js_helper._AllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
+dart.setSignature(_js_helper._AllMatchesIterator, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
+  fields: () => ({
+    [_regExp]: _js_helper.JSSyntaxRegExp,
+    [_string$]: core.String,
+    [_nextIndex]: core.int,
+    [_current$0]: core.Match
+  }),
+  getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
+  methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+});
+_js_helper.firstMatchAfter = function(regExp, string, start) {
+  return regExp[_execGlobal](string, start);
+};
+dart.lazyFn(_js_helper.firstMatchAfter, () => JSSyntaxRegExpAndStringAndintToMatch());
+_js_helper.stringIndexOfStringUnchecked = function(receiver, other, startIndex) {
+  return receiver.indexOf(other, startIndex);
+};
+dart.fn(_js_helper.stringIndexOfStringUnchecked, dynamicAnddynamicAnddynamicToint());
+_js_helper.substring1Unchecked = function(receiver, startIndex) {
+  return receiver.substring(startIndex);
+};
+dart.lazyFn(_js_helper.substring1Unchecked, () => dynamicAnddynamicToString());
+_js_helper.substring2Unchecked = function(receiver, startIndex, endIndex) {
+  return receiver.substring(startIndex, endIndex);
+};
+dart.lazyFn(_js_helper.substring2Unchecked, () => dynamicAnddynamicAnddynamicToString());
+_js_helper.stringContainsStringUnchecked = function(receiver, other, startIndex) {
+  return dart.notNull(_js_helper.stringIndexOfStringUnchecked(receiver, other, startIndex)) >= 0;
+};
+dart.lazyFn(_js_helper.stringContainsStringUnchecked, () => dynamicAnddynamicAnddynamicTobool());
+_js_helper.StringMatch = class StringMatch extends core.Object {
+  new(start, input, pattern) {
+    this.start = start;
+    this.input = input;
+    this.pattern = pattern;
+  }
+  get end() {
+    return dart.notNull(this.start) + dart.notNull(this.pattern[dartx.length]);
+  }
+  _get(g) {
+    return this.group(g);
+  }
+  get groupCount() {
+    return 0;
+  }
+  group(group_) {
+    if (group_ != 0) {
+      dart.throw(new core.RangeError.value(group_));
+    }
+    return this.pattern;
+  }
+  groups(groups_) {
+    let result = ListOfString().new();
+    for (let g of groups_) {
+      result[dartx.add](this.group(g));
+    }
+    return result;
+  }
+};
+_js_helper.StringMatch[dart.implements] = () => [core.Match];
+dart.setSignature(_js_helper.StringMatch, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper.StringMatch, [core.int, core.String, core.String])}),
+  fields: () => ({
+    start: core.int,
+    input: core.String,
+    pattern: core.String
+  }),
+  getters: () => ({
+    end: dart.definiteFunctionType(core.int, []),
+    groupCount: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(core.String, [core.int]),
+    group: dart.definiteFunctionType(core.String, [core.int]),
+    groups: dart.definiteFunctionType(core.List$(core.String), [ListOfint()])
+  })
+});
+_js_helper.allMatchesInStringUnchecked = function(pattern, string, startIndex) {
+  return new _js_helper._StringAllMatchesIterable(string, pattern, startIndex);
+};
+dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
+const _input = Symbol('_input');
+const _pattern = Symbol('_pattern');
+const _index$0 = Symbol('_index');
+_js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
+  new(input, pattern, index) {
+    this[_input] = input;
+    this[_pattern] = pattern;
+    this[_index$0] = index;
+    super.new();
+  }
+  get iterator() {
+    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
+  }
+  get first() {
+    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
+    if (dart.notNull(index) >= 0) {
+      return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
+    }
+    dart.throw(_internal.IterableElementError.noElement());
+  }
+};
+dart.addSimpleTypeTests(_js_helper._StringAllMatchesIterable);
+dart.setSignature(_js_helper._StringAllMatchesIterable, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterable, [core.String, core.String, core.int])}),
+  fields: () => ({
+    [_input]: core.String,
+    [_pattern]: core.String,
+    [_index$0]: core.int
+  }),
+  getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
+});
+dart.defineExtensionMembers(_js_helper._StringAllMatchesIterable, ['iterator', 'first']);
+_js_helper._StringAllMatchesIterator = class _StringAllMatchesIterator extends core.Object {
+  new(input, pattern, index) {
+    this[_input] = input;
+    this[_pattern] = pattern;
+    this[_index$0] = index;
+    this[_current$0] = null;
+  }
+  moveNext() {
+    if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
+      this[_current$0] = null;
+      return false;
+    }
+    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
+    if (dart.notNull(index) < 0) {
+      this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
+      this[_current$0] = null;
+      return false;
+    }
+    let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
+    this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
+    if (end == this[_index$0]) end++;
+    this[_index$0] = end;
+    return true;
+  }
+  get current() {
+    return this[_current$0];
+  }
+};
+_js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
+dart.setSignature(_js_helper._StringAllMatchesIterator, {
+  constructors: () => ({new: dart.definiteFunctionType(_js_helper._StringAllMatchesIterator, [core.String, core.String, core.int])}),
+  fields: () => ({
+    [_input]: core.String,
+    [_pattern]: core.String,
+    [_index$0]: core.int,
+    [_current$0]: core.Match
+  }),
+  getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
+  methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+});
+_js_helper.stringContainsUnchecked = function(receiver, other, startIndex) {
+  if (typeof other == 'string') {
+    return _js_helper.stringContainsStringUnchecked(receiver, other, startIndex);
+  } else if (_js_helper.JSSyntaxRegExp.is(other)) {
+    return other.hasMatch(receiver[dartx.substring](startIndex));
+  } else {
+    let substr = receiver[dartx.substring](startIndex);
+    return core.bool._check(dart.dload(dart.dsend(other, 'allMatches', substr), 'isNotEmpty'));
+  }
+};
+dart.lazyFn(_js_helper.stringContainsUnchecked, () => StringAnddynamicAndintTobool());
+_js_helper.stringReplaceJS = function(receiver, replacer, replacement) {
+  replacement = replacement.replace(/\$/g, "$$$$");
+  return receiver.replace(replacer, replacement);
+};
+dart.lazyFn(_js_helper.stringReplaceJS, () => dynamicAnddynamicAnddynamicToString());
+_js_helper.stringReplaceFirstRE = function(receiver, regexp, replacement, startIndex) {
+  let match = regexp[_execGlobal](receiver, startIndex);
+  if (match == null) return receiver;
+  let start = match.start;
+  let end = match.end;
+  return _js_helper.stringReplaceRangeUnchecked(receiver, start, end, replacement);
+};
+dart.lazyFn(_js_helper.stringReplaceFirstRE, () => StringAndJSSyntaxRegExpAndString__ToString());
+_js_helper.quoteStringForRegExp = function(string) {
+  return string.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&");
+};
+dart.lazyFn(_js_helper.quoteStringForRegExp, () => dynamicToString());
+_js_helper.stringReplaceAllUnchecked = function(receiver, pattern, replacement) {
+  _js_helper.checkString(replacement);
+  if (typeof pattern == 'string') {
+    if (pattern == "") {
+      if (receiver == "") {
+        return replacement;
       } else {
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          if (!dart.test(it.moveNext())) {
-            dart.throw(new core.RangeError.range(end, start, i));
-          }
-          list[dartx.add](it.current);
-        }
-      }
-      return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
-    }
-  };
-  core.String.is = function is_String(o) {
-    return typeof o == "string";
-  };
-  core.String.as = function as_String(o) {
-    if (typeof o == "string" || o == null) return o;
-    return dart.as(o, core.String);
-  };
-  core.String._check = function check_String(o) {
-    if (typeof o == "string" || o == null) return o;
-    return dart.check(o, core.String);
-  };
-  core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
-  dart.setSignature(core.String, {
-    constructors: () => ({
-      fromCharCodes: dart.definiteFunctionType(core.String, [IterableOfint()], [core.int, core.int]),
-      fromCharCode: dart.definiteFunctionType(core.String, [core.int]),
-      fromEnvironment: dart.definiteFunctionType(core.String, [core.String], {defaultValue: core.String})
-    }),
-    statics: () => ({
-      _stringFromJSArray: dart.definiteFunctionType(core.String, [JSArrayOfint(), core.int, core.int]),
-      _stringFromUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
-      _stringFromIterable: dart.definiteFunctionType(core.String, [IterableOfint(), core.int, core.int])
-    }),
-    names: ['_stringFromJSArray', '_stringFromUint8List', '_stringFromIterable']
-  });
-  core.List$ = dart.generic(E => {
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
-    class List extends core.Object {
-      static new(length) {
-        if (length === void 0) length = null;
-        let list = null;
-        if (length == null) {
-          list = [];
-        } else {
-          if (!(typeof length == 'number') || dart.notNull(length) < 0) {
-            dart.throw(new core.ArgumentError(dart.str`Length must be a non-negative integer: ${length}`));
-          }
-          list = _interceptors.JSArray.markFixedList(new Array(length));
-        }
-        return JSArrayOfE().typed(list);
-      }
-      static filled(length, fill) {
-        let result = ListOfE().new(length);
-        if (length != 0 && fill != null) {
-          for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
-            result[dartx._set](i, fill);
-          }
-        }
-        return result;
-      }
-      static from(elements, opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let list = ListOfE().new();
-        for (let e of elements) {
-          list[dartx.add](E._check(e));
-        }
-        if (dart.test(growable)) return list;
-        return _internal.makeListFixedLength(E)(list);
-      }
-      static generate(length, generator, opts) {
-        let growable = opts && 'growable' in opts ? opts.growable : true;
-        let result = null;
-        if (dart.test(growable)) {
-          result = JSArrayOfE().of([]);
-          result[dartx.length] = length;
-        } else {
-          result = ListOfE().new(length);
-        }
+        let result = new core.StringBuffer();
+        let length = receiver[dartx.length];
+        result.write(replacement);
         for (let i = 0; i < dart.notNull(length); i++) {
-          result[dartx._set](i, generator(i));
+          result.write(receiver[dartx._get](i));
+          result.write(replacement);
         }
-        return result;
+        return result.toString();
       }
-      static unmodifiable(elements) {
-        let result = ListOfE().from(elements, {growable: false});
-        return _internal.makeFixedListUnmodifiable(E)(result);
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
+    } else {
+      let quoted = _js_helper.quoteStringForRegExp(pattern);
+      let replacer = new RegExp(quoted, 'g');
+      return _js_helper.stringReplaceJS(receiver, replacer, replacement);
+    }
+  } else if (_js_helper.JSSyntaxRegExp.is(pattern)) {
+    let re = _js_helper.regExpGetGlobalNative(pattern);
+    return _js_helper.stringReplaceJS(receiver, re, replacement);
+  } else {
+    _js_helper.checkNull(pattern);
+    dart.throw("String.replaceAll(Pattern) UNIMPLEMENTED");
+  }
+};
+dart.lazyFn(_js_helper.stringReplaceAllUnchecked, () => StringAndPatternAndStringToString());
+_js_helper._matchString = function(match) {
+  return match._get(0);
+};
+dart.lazyFn(_js_helper._matchString, () => MatchToString$());
+_js_helper._stringIdentity = function(string) {
+  return string;
+};
+dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
+_js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
+  if (onMatch == null) onMatch = _js_helper._matchString;
+  if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
+  if (typeof pattern == 'string') {
+    return _js_helper.stringReplaceAllStringFuncUnchecked(receiver, pattern, onMatch, onNonMatch);
+  }
+  if (!core.Pattern.is(pattern)) {
+    dart.throw(new core.ArgumentError.value(pattern, 'pattern', 'is not a Pattern'));
+  }
+  let buffer = new core.StringBuffer();
+  let startIndex = 0;
+  for (let match of pattern[dartx.allMatches](receiver)) {
+    buffer.write(onNonMatch(receiver[dartx.substring](startIndex, match.start)));
+    buffer.write(onMatch(match));
+    startIndex = match.end;
+  }
+  buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
+  return buffer.toString();
+};
+dart.lazyFn(_js_helper.stringReplaceAllFuncUnchecked, () => StringAndPatternAndFn__ToString());
+_js_helper.stringReplaceAllEmptyFuncUnchecked = function(receiver, onMatch, onNonMatch) {
+  let buffer = new core.StringBuffer();
+  let length = receiver[dartx.length];
+  let i = 0;
+  buffer.write(onNonMatch(""));
+  while (i < dart.notNull(length)) {
+    buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
+    let code = receiver[dartx.codeUnitAt](i);
+    if ((dart.notNull(code) & ~1023) == 55296 && dart.notNull(length) > i + 1) {
+      code = receiver[dartx.codeUnitAt](i + 1);
+      if ((dart.notNull(code) & ~1023) == 56320) {
+        buffer.write(onNonMatch(receiver[dartx.substring](i, i + 2)));
+        i = i + 2;
+        continue;
       }
     }
-    dart.addTypeTests(List);
-    List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
-    dart.setSignature(List, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(core.List$(E), [], [core.int]),
-        filled: dart.definiteFunctionType(core.List$(E), [core.int, E]),
-        from: dart.definiteFunctionType(core.List$(E), [core.Iterable], {growable: core.bool}),
-        generate: dart.definiteFunctionType(core.List$(E), [core.int, intToE()], {growable: core.bool}),
-        unmodifiable: dart.definiteFunctionType(core.List$(E), [core.Iterable])
-      })
-    });
-    return List;
-  });
-  core.List = List();
-  convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
+    buffer.write(onNonMatch(receiver[dartx._get](i)));
+    i++;
+  }
+  buffer.write(onMatch(new _js_helper.StringMatch(i, receiver, "")));
+  buffer.write(onNonMatch(""));
+  return buffer.toString();
+};
+dart.lazyFn(_js_helper.stringReplaceAllEmptyFuncUnchecked, () => StringAndFnAndFnToString());
+_js_helper.stringReplaceAllStringFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
+  let patternLength = pattern[dartx.length];
+  if (patternLength == 0) {
+    return _js_helper.stringReplaceAllEmptyFuncUnchecked(receiver, onMatch, onNonMatch);
+  }
+  let length = receiver[dartx.length];
+  let buffer = new core.StringBuffer();
+  let startIndex = 0;
+  while (startIndex < dart.notNull(length)) {
+    let position = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
+    if (position == -1) {
+      break;
+    }
+    buffer.write(onNonMatch(receiver[dartx.substring](startIndex, position)));
+    buffer.write(onMatch(new _js_helper.StringMatch(position, receiver, pattern)));
+    startIndex = dart.notNull(position) + dart.notNull(patternLength);
+  }
+  buffer.write(onNonMatch(receiver[dartx.substring](startIndex)));
+  return buffer.toString();
+};
+dart.lazyFn(_js_helper.stringReplaceAllStringFuncUnchecked, () => StringAndStringAndFn__ToString());
+_js_helper.stringReplaceFirstUnchecked = function(receiver, pattern, replacement, startIndex) {
+  if (typeof pattern == 'string') {
+    let index = _js_helper.stringIndexOfStringUnchecked(receiver, pattern, startIndex);
+    if (dart.notNull(index) < 0) return receiver;
+    let end = dart.notNull(index) + dart.notNull(pattern[dartx.length]);
+    return _js_helper.stringReplaceRangeUnchecked(receiver, index, end, replacement);
+  }
+  if (_js_helper.JSSyntaxRegExp.is(pattern)) {
+    return startIndex == 0 ? _js_helper.stringReplaceJS(receiver, _js_helper.regExpGetNative(pattern), replacement) : _js_helper.stringReplaceFirstRE(receiver, pattern, replacement, startIndex);
+  }
+  _js_helper.checkNull(pattern);
+  let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
+  if (!dart.test(matches.moveNext())) return receiver;
+  let match = matches.current;
+  return receiver[dartx.replaceRange](match.start, match.end, replacement);
+};
+dart.lazyFn(_js_helper.stringReplaceFirstUnchecked, () => StringAndPatternAndString__ToString());
+_js_helper.stringReplaceFirstMappedUnchecked = function(receiver, pattern, replace, startIndex) {
+  let matches = pattern[dartx.allMatches](receiver, startIndex)[dartx.iterator];
+  if (!dart.test(matches.moveNext())) return receiver;
+  let match = matches.current;
+  let replacement = dart.str`${replace(match)}`;
+  return receiver[dartx.replaceRange](match.start, match.end, replacement);
+};
+dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
+_js_helper.stringJoinUnchecked = function(array, separator) {
+  return array.join(separator);
+};
+dart.lazyFn(_js_helper.stringJoinUnchecked, () => dynamicAnddynamicToString());
+_js_helper.stringReplaceRangeUnchecked = function(receiver, start, end, replacement) {
+  let prefix = receiver.substring(0, start);
+  let suffix = receiver.substring(end);
+  return dart.str`${prefix}${replacement}${suffix}`;
+};
+dart.lazyFn(_js_helper.stringReplaceRangeUnchecked, () => StringAndintAndint__ToString());
+_js_helper.getRuntimeType = function(object) {
+  return dart.getReifiedType(object);
+};
+dart.fn(_js_helper.getRuntimeType, dynamicToType());
+_js_helper.getIndex = function(array, index) {
+  dart.assert(_js_helper.isJsArray(array));
+  return array[index];
+};
+dart.fn(_js_helper.getIndex, dynamicAndintTodynamic());
+_js_helper.getLength = function(array) {
+  dart.assert(_js_helper.isJsArray(array));
+  return array.length;
+};
+dart.fn(_js_helper.getLength, dynamicToint());
+_js_helper.isJsArray = function(value) {
+  return _interceptors.JSArray.is(value);
+};
+dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
+_js_mirrors.getName = function(symbol) {
+  return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+};
+dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
+_js_mirrors.getSymbol = function(name, library) {
+  return dart.throw(new core.UnimplementedError("MirrorSystem.getSymbol unimplemented"));
+};
+dart.lazyFn(_js_mirrors.getSymbol, () => dynamicAnddynamicToSymbol());
+dart.defineLazy(_js_mirrors, {
+  get currentJsMirrorSystem() {
+    return dart.throw(new core.UnimplementedError("MirrorSystem.currentJsMirrorSystem unimplemented"));
+  }
+});
+dart.defineLazy(_js_mirrors, {
+  get _typeMirror() {
+    return Symbol("_typeMirror");
+  }
+});
+_js_mirrors.reflect = function(reflectee) {
+  if (core.Function.is(reflectee)) {
+    return new _js_mirrors.JsClosureMirror._(reflectee);
+  } else {
+    return new _js_mirrors.JsInstanceMirror._(reflectee);
+  }
+};
+dart.lazyFn(_js_mirrors.reflect, () => dynamicToInstanceMirror());
+_js_mirrors.reflectType = function(key) {
+  let unwrapped = _js_mirrors._unwrap(key);
+  let property = Object.getOwnPropertyDescriptor(unwrapped, _js_mirrors._typeMirror);
+  if (property != null) {
+    return property.value;
+  }
+  let mirror = new _js_mirrors.JsClassMirror._(key);
+  unwrapped[_js_mirrors._typeMirror] = mirror;
+  return mirror;
+};
+dart.lazyFn(_js_mirrors.reflectType, () => TypeToTypeMirror());
+dart.defineLazy(_js_mirrors, {
+  get _dart() {
+    return dart;
+  }
+});
+_js_mirrors._dload = function(obj, name) {
+  return _js_mirrors._dart.dloadMirror(obj, name);
+};
+dart.lazyFn(_js_mirrors._dload, () => dynamicAndStringTodynamic());
+_js_mirrors._dput = function(obj, name, val) {
+  _js_mirrors._dart.dputMirror(obj, name, val);
+};
+dart.lazyFn(_js_mirrors._dput, () => dynamicAndStringAnddynamicTovoid());
+_js_mirrors._dcall = function(obj, args) {
+  return _js_mirrors._dart.dcall(obj, ...args);
+};
+dart.lazyFn(_js_mirrors._dcall, () => dynamicAndListTodynamic());
+_js_mirrors._dsend = function(obj, name, args) {
+  return _js_mirrors._dart.dsend(obj, name, ...args);
+};
+dart.lazyFn(_js_mirrors._dsend, () => dynamicAndStringAndListTodynamic());
+_js_mirrors._getGenericClass = function(obj) {
+  return _js_mirrors._dart.getGenericClass(obj);
+};
+dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
+_js_mirrors._getGenericArgs = function(obj) {
+  return _js_mirrors._dart.getGenericArgs(obj);
+};
+dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
+_js_mirrors._defaultConstructorType = function(type) {
+  return _js_mirrors._dart.definiteFunctionType(type, []);
+};
+dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
+_js_mirrors._getMixins = function(type) {
+  return _js_mirrors._dart.getMixins(type, []);
+};
+dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
+_js_mirrors._Lazy$ = dart.generic(T => {
+  const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
+  return _Lazy;
+});
+_js_mirrors._Lazy = _Lazy();
+_js_mirrors._getESSymbol = function(symbol) {
+  return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+};
+dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
+_js_mirrors._getMember = function(symbol) {
+  let privateSymbol = _js_mirrors._getESSymbol(symbol);
+  if (privateSymbol != null) {
+    return privateSymbol;
+  }
+  let name = _js_mirrors.getName(symbol);
+  switch (name) {
+    case '[]':
+    {
+      name = '_get';
+      break;
+    }
+    case '[]=':
+    {
+      name = '_set';
+      break;
+    }
+    case 'unary-':
+    {
+      name = '_negate';
+      break;
+    }
+    case 'constructor':
+    case 'prototype':
+    {
+      name = dart.str`_${name}`;
+      break;
+    }
+  }
+  return name;
+};
+dart.lazyFn(_js_mirrors._getMember, () => SymbolTodynamic());
+_js_mirrors._getNameForESSymbol = function(member) {
+  dart.assert(typeof member == "symbol");
+  let str = dart.toString(member);
+  dart.assert(dart.test(str[dartx.startsWith]('Symbol(')) && dart.test(str[dartx.endsWith](')')));
+  return str[dartx.substring](7, dart.notNull(str[dartx.length]) - 1);
+};
+dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
+_js_mirrors._getSymbolForESSymbol = function(member) {
+  let name = _js_mirrors._getNameForESSymbol(member);
+  return new _internal.Symbol.es6(name, member);
+};
+dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
+_js_mirrors._getSymbolForMember = function(member) {
+  if (typeof member == 'string') {
+    return core.Symbol.new(member);
+  } else {
+    let name = _js_mirrors._getNameForESSymbol(member);
+    return new _internal.Symbol.es6(name, member);
+  }
+};
+dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
+_js_mirrors._toDartMap = function(data) {
+  if (data == null) return dart.map({}, core.Symbol, dart.dynamic);
+  let map = MapOfSymbol$dynamic().new();
+  let publicMembers = Object.getOwnPropertyNames(data);
+  for (let member of core.Iterable._check(publicMembers)) {
+    let symbol = core.Symbol.new(core.String._check(member));
+    map[dartx._set](symbol, data[member]);
+  }
+  let privateMembers = Object.getOwnPropertySymbols(data);
+  for (let member of core.Iterable._check(privateMembers)) {
+    let symbol = _js_mirrors._getSymbolForESSymbol(member);
+    map[dartx._set](symbol, data[member]);
+  }
+  return map;
+};
+dart.lazyFn(_js_mirrors._toDartMap, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getConstructors = function(obj) {
+  let sig = _js_mirrors._dart.getConstructorSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getConstructors, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getFields = function(obj) {
+  let sig = _js_mirrors._dart.getFieldSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getFields, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getMethods = function(obj) {
+  let sig = _js_mirrors._dart.getMethodSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getMethods, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getGetters = function(obj) {
+  let sig = _js_mirrors._dart.getGetterSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getGetters, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getSetters = function(obj) {
+  let sig = _js_mirrors._dart.getSetterSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getSetters, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getStaticFields = function(obj) {
+  let sig = _js_mirrors._dart.getStaticFieldSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getStaticFields, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getStatics = function(obj) {
+  let sig = _js_mirrors._dart.getStaticSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getStatics, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getStaticGetters = function(obj) {
+  let sig = _js_mirrors._dart.getStaticGetterSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getStaticGetters, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._getStaticSetters = function(obj) {
+  let sig = _js_mirrors._dart.getStaticSetterSig(obj);
+  return _js_mirrors._toDartMap(sig);
+};
+dart.lazyFn(_js_mirrors._getStaticSetters, () => dynamicToMapOfSymbol$dynamic());
+_js_mirrors._unwrap = function(obj) {
+  return _js_mirrors._dart.unwrapType(obj);
+};
+dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
+_js_mirrors._wrap = function(obj) {
+  return _js_mirrors._dart.wrapType(obj);
+};
+dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
+_js_mirrors._runtimeType = function(obj) {
+  return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
+};
+dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
+_js_mirrors._unimplemented = function(t, i) {
+  dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
+};
+dart.fn(_js_mirrors._unimplemented, TypeAndInvocationTodynamic());
+_js_mirrors._toJsMap = function(map) {
+  let obj = {};
+  map[dartx.forEach](dart.fn((key, value) => {
+    obj[_js_mirrors.getName(key)] = value;
+  }, SymbolAnddynamicToNull()));
+  return obj;
+};
+dart.lazyFn(_js_mirrors._toJsMap, () => MapOfSymbol$dynamicTodynamic());
+_js_mirrors.JsMirror = class JsMirror extends core.Object {
+  noSuchMethod(i) {
+    _js_mirrors._unimplemented(this.runtimeType, i);
+  }
+};
+_js_mirrors.JsMirror[dart.implements] = () => [mirrors.Mirror];
+_js_mirrors.JsCombinatorMirror = class JsCombinatorMirror extends _js_mirrors.JsMirror {
+  get identifiers() {
+    return ListOfSymbol()._check(this.noSuchMethod(new dart.InvocationImpl('identifiers', [], {isGetter: true})));
+  }
+  get isShow() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isShow', [], {isGetter: true})));
+  }
+  get isHide() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isHide', [], {isGetter: true})));
+  }
+};
+_js_mirrors.JsCombinatorMirror[dart.implements] = () => [mirrors.CombinatorMirror];
+_js_mirrors.JsDeclarationMirror = class JsDeclarationMirror extends _js_mirrors.JsMirror {
+  get simpleName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('simpleName', [], {isGetter: true})));
+  }
+  get qualifiedName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
+  }
+  get owner() {
+    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
+  }
+  get isPrivate() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
+  }
+  get isTopLevel() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  get metadata() {
+    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
+  }
+};
+_js_mirrors.JsDeclarationMirror[dart.implements] = () => [mirrors.DeclarationMirror];
+_js_mirrors.JsIsolateMirror = class JsIsolateMirror extends _js_mirrors.JsMirror {
+  get debugName() {
+    return core.String._check(this.noSuchMethod(new dart.InvocationImpl('debugName', [], {isGetter: true})));
+  }
+  get isCurrent() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isCurrent', [], {isGetter: true})));
+  }
+  get rootLibrary() {
+    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('rootLibrary', [], {isGetter: true})));
+  }
+};
+_js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
+_js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
+  get isImport() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
+  }
+  get isExport() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
+  }
+  get sourceLibrary() {
+    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
+  }
+  get targetLibrary() {
+    return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('targetLibrary', [], {isGetter: true})));
+  }
+  get prefix() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('prefix', [], {isGetter: true})));
+  }
+  get combinators() {
+    return ListOfCombinatorMirror()._check(this.noSuchMethod(new dart.InvocationImpl('combinators', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  get metadata() {
+    return ListOfInstanceMirror()._check(this.noSuchMethod(new dart.InvocationImpl('metadata', [], {isGetter: true})));
+  }
+};
+_js_mirrors.JsLibraryDependencyMirror[dart.implements] = () => [mirrors.LibraryDependencyMirror];
+_js_mirrors.JsObjectMirror = class JsObjectMirror extends _js_mirrors.JsMirror {
+  invoke(...args) {
+    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('invoke', args, {isMethod: true})));
+  }
+  getField(...args) {
+    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('getField', args, {isMethod: true})));
+  }
+  setField(...args) {
+    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
+  }
+};
+_js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
+const _getAccessor = Symbol('_getAccessor');
+_js_mirrors.JsInstanceMirror = class JsInstanceMirror extends _js_mirrors.JsObjectMirror {
+  get hasReflectee() {
+    return true;
+  }
+  get type() {
+    if (this.reflectee == null) return mirrors.reflectClass(dart.wrapType(core.Null));
+    return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._runtimeType(this.reflectee))));
+  }
+  _(reflectee) {
+    this.reflectee = reflectee;
+  }
+  ['=='](other) {
+    return _js_mirrors.JsInstanceMirror.is(other) && core.identical(this.reflectee, other.reflectee);
+  }
+  get hashCode() {
+    return (dart.notNull(core.identityHashCode(this.reflectee)) ^ 909522486) >>> 0;
+  }
+  [_getAccessor](reflectee, symbol, args, namedArgs) {
+    if (args === void 0) args = null;
+    if (namedArgs === void 0) namedArgs = null;
+    return _js_mirrors._getMember(symbol);
+  }
+  getField(symbol) {
+    let name = this[_getAccessor](this.reflectee, symbol);
+    let field = _js_mirrors._dload(this.reflectee, core.String._check(name));
+    return _js_mirrors.reflect(field);
+  }
+  setField(symbol, value) {
+    let name = this[_getAccessor](this.reflectee, symbol);
+    _js_mirrors._dput(this.reflectee, core.String._check(name), value);
+    return _js_mirrors.reflect(value);
+  }
+  invoke(symbol, args, namedArgs) {
+    if (namedArgs === void 0) namedArgs = null;
+    let name = this[_getAccessor](this.reflectee, symbol, args, namedArgs);
+    if (namedArgs != null) {
+      args = core.List.from(args);
+      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
+    }
+    let result = _js_mirrors._dsend(this.reflectee, core.String._check(name), args);
+    return _js_mirrors.reflect(result);
+  }
+  toString() {
+    return dart.str`InstanceMirror on '${this.reflectee}'`;
+  }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsInstanceMirror, '_');
+_js_mirrors.JsInstanceMirror[dart.implements] = () => [mirrors.InstanceMirror];
+dart.setSignature(_js_mirrors.JsInstanceMirror, {
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsInstanceMirror, [dart.dynamic])}),
+  fields: () => ({reflectee: dart.dynamic}),
+  getters: () => ({
+    hasReflectee: dart.definiteFunctionType(core.bool, []),
+    type: dart.definiteFunctionType(mirrors.ClassMirror, [])
+  }),
+  methods: () => ({
+    '==': dart.definiteFunctionType(core.bool, [core.Object]),
+    [_getAccessor]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Symbol], [core.List, MapOfSymbol$dynamic()]),
+    getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
+    setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
+    invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
+  })
+});
+_js_mirrors.JsClosureMirror = class JsClosureMirror extends _js_mirrors.JsInstanceMirror {
+  _(reflectee) {
+    super._(reflectee);
+  }
+  apply(args, namedArgs) {
+    if (namedArgs === void 0) namedArgs = null;
+    if (namedArgs != null) {
+      args = core.List.from(args);
+      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
+    }
+    let result = _js_mirrors._dcall(this.reflectee, args);
+    return _js_mirrors.reflect(result);
+  }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
+  get function() {
+    return mirrors.MethodMirror._check(this.noSuchMethod(new dart.InvocationImpl('function', [], {isGetter: true})));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsClosureMirror, '_');
+_js_mirrors.JsClosureMirror[dart.implements] = () => [mirrors.ClosureMirror];
+dart.setSignature(_js_mirrors.JsClosureMirror, {
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
+  methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
+});
+const _metadata$ = Symbol('_metadata');
+const _cls = Symbol('_cls');
+let const$0;
+const _declarations = Symbol('_declarations');
+const _raw = Symbol('_raw');
+const _mixin = Symbol('_mixin');
+const _typeArguments = Symbol('_typeArguments');
+let const$1;
+_js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
+  get metadata() {
+    if (this[_metadata$] == null) {
+      let unwrapped = _js_mirrors._unwrap(this[_cls]);
+      let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
+      this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
+    }
+    return this[_metadata$];
+  }
+  get declarations() {
+    if (this[_declarations] == null) {
+      this[_declarations] = MapOfSymbol$DeclarationMirror().new();
+      let unwrapped = _js_mirrors._unwrap(this[_cls]);
+      let constructors = _js_mirrors._getConstructors(unwrapped);
+      constructors[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      if (dart.test(constructors[dartx.isEmpty])) {
+        let name = 'new';
+        let ft = _js_mirrors._defaultConstructorType(_js_mirrors._unwrap(this[_cls]));
+        let symbol = core.Symbol.new(name);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._constructor(this, symbol, ft));
+      }
+      let fields = _js_mirrors._getFields(unwrapped);
+      fields[dartx.forEach](dart.fn((symbol, t) => {
+        let metadata = [];
+        if (core.List.is(t)) {
+          metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
+          t = dart.dindex(t, 0);
+        }
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+      }, SymbolAnddynamicToNull()));
+      let methods = _js_mirrors._getMethods(unwrapped);
+      methods[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      let getters = _js_mirrors._getGetters(unwrapped);
+      getters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      let setters = _js_mirrors._getSetters(unwrapped);
+      setters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
+        symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      let staticFields = _js_mirrors._getStaticFields(unwrapped);
+      staticFields[dartx.forEach](dart.fn((symbol, t) => {
+        let name = _js_mirrors.getName(symbol);
+        let metadata = [];
+        if (core.List.is(t)) {
+          metadata = core.List._check(dart.dsend(dart.dsend(t, 'skip', 1), 'toList'));
+          t = dart.dindex(t, 0);
+        }
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsVariableMirror._(symbol, core.Type._check(_js_mirrors._wrap(t)), metadata));
+      }, SymbolAnddynamicToNull()));
+      let statics = _js_mirrors._getStatics(unwrapped);
+      statics[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      let staticGetters = _js_mirrors._getStaticGetters(unwrapped);
+      staticGetters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      let staticSetters = _js_mirrors._getStaticSetters(unwrapped);
+      staticSetters[dartx.forEach](dart.fn((symbol, ft) => {
+        let name = _js_mirrors.getName(symbol);
+        this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._staticMethod(this, symbol, ft));
+      }, SymbolAnddynamicToNull()));
+      this[_declarations] = MapOfSymbol$DeclarationMirror().unmodifiable(this[_declarations]);
+    }
+    return this[_declarations];
+  }
+  _(cls) {
+    this[_cls] = cls;
+    this[_raw] = _js_mirrors._getGenericClass(_js_mirrors._unwrap(cls));
+    this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
+    this[_mixin] = null;
+    this[_typeArguments] = null;
+    this[_metadata$] = null;
+    this[_declarations] = null;
+    let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
+    if (typeArgs == null) {
+      this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
+    } else {
+      this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
+    }
+  }
+  newInstance(constructorName, args, namedArgs) {
+    if (namedArgs === void 0) namedArgs = null;
+    let name = _js_mirrors.getName(constructorName);
+    dart.assert(namedArgs == null || dart.test(namedArgs[dartx.isEmpty]));
+    let instance = name == 'new' || name == '' ? new (_js_mirrors._unwrap(this[_cls]))(...args) : new (_js_mirrors._unwrap(this[_cls]))[name](...args);
+    return _js_mirrors.reflect(instance);
+  }
+  getField(symbol) {
+    let name = _js_mirrors.getName(symbol);
+    return _js_mirrors.reflect(_js_mirrors._unwrap(this[_cls])[name]);
+  }
+  setField(symbol, value) {
+    let name = _js_mirrors.getName(symbol);
+    _js_mirrors._unwrap(this[_cls])[name] = value;
+    return _js_mirrors.reflect(value);
+  }
+  invoke(symbol, args, namedArgs) {
+    if (namedArgs === void 0) namedArgs = null;
+    let name = _js_mirrors.getName(symbol);
+    if (namedArgs != null) {
+      args = core.List.from(args);
+      args[dartx.add](_js_mirrors._toJsMap(namedArgs));
+    }
+    let result = _js_mirrors._unwrap(this[_cls])[name](...args);
+    return _js_mirrors.reflect(result);
+  }
+  get superinterfaces() {
+    let interfaceThunk = _js_mirrors._unwrap(this[_cls])[dart.implements];
+    if (interfaceThunk == null) {
+      return JSArrayOfClassMirror().of([]);
+    } else {
+      let interfaces = interfaceThunk();
+      return ListOfClassMirror()._check(interfaces[dartx.map](mirrors.TypeMirror)(dart.fn(t => _js_mirrors.reflectType(t), TypeToTypeMirror()))[dartx.toList]());
+    }
+  }
+  get hasReflectedType() {
+    return true;
+  }
+  get reflectedType() {
+    return this[_cls];
+  }
+  get isOriginalDeclaration() {
+    return this[_raw] == null;
+  }
+  get typeArguments() {
+    return this[_typeArguments];
+  }
+  get originalDeclaration() {
+    if (this[_raw] == null) {
+      return this;
+    }
+    dart.throw(new core.UnimplementedError("ClassMirror.originalDeclaration unimplemented"));
+  }
+  get superclass() {
+    if (dart.equals(this[_cls], dart.wrapType(core.Object))) {
+      return null;
+    } else {
+      return mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(_js_mirrors._unwrap(this[_cls]).__proto__))));
+    }
+  }
+  get mixin() {
+    if (this[_mixin] != null) {
+      return this[_mixin];
+    }
+    let mixins = _js_mirrors._getMixins(_js_mirrors._unwrap(this[_cls]));
+    if (mixins == null || dart.test(dart.dload(mixins, 'isEmpty'))) {
+      this[_mixin] = this;
+      return this[_mixin];
+    }
+    if (dart.test(dart.dsend(dart.dload(mixins, 'length'), '>', 1))) {
+      dart.throw(new core.UnsupportedError("ClassMirror.mixin not yet supported for " + dart.str`classes (${this[_cls]}) with multiple mixins`));
+    }
+    this[_mixin] = mirrors.ClassMirror._check(_js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(dart.dindex(mixins, 0)))));
+    return this[_mixin];
+  }
+  toString() {
+    return dart.str`ClassMirror on '${this[_cls]}'`;
+  }
+  get qualifiedName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
+  }
+  get owner() {
+    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
+  }
+  get isPrivate() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
+  }
+  get isTopLevel() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  isSubtypeOf(...args) {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubtypeOf', args, {isMethod: true})));
+  }
+  isAssignableTo(...args) {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAssignableTo', args, {isMethod: true})));
+  }
+  get typeVariables() {
+    return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
+  }
+  isSubclassOf(...args) {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
+  }
+  get isAbstract() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
+  }
+  get instanceMembers() {
+    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
+  }
+  get staticMembers() {
+    return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('staticMembers', [], {isGetter: true})));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsClassMirror, '_');
+_js_mirrors.JsClassMirror[dart.implements] = () => [mirrors.ClassMirror];
+dart.setSignature(_js_mirrors.JsClassMirror, {
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClassMirror, [core.Type])}),
+  fields: () => ({
+    [_cls]: core.Type,
+    simpleName: core.Symbol,
+    [_raw]: dart.dynamic,
+    [_mixin]: mirrors.ClassMirror,
+    [_typeArguments]: ListOfTypeMirror(),
+    [_metadata$]: ListOfInstanceMirror(),
+    [_declarations]: MapOfSymbol$DeclarationMirror()
+  }),
+  getters: () => ({
+    metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), []),
+    declarations: dart.definiteFunctionType(core.Map$(core.Symbol, mirrors.DeclarationMirror), []),
+    superinterfaces: dart.definiteFunctionType(core.List$(mirrors.ClassMirror), []),
+    hasReflectedType: dart.definiteFunctionType(core.bool, []),
+    reflectedType: dart.definiteFunctionType(core.Type, []),
+    isOriginalDeclaration: dart.definiteFunctionType(core.bool, []),
+    typeArguments: dart.definiteFunctionType(core.List$(mirrors.TypeMirror), []),
+    originalDeclaration: dart.definiteFunctionType(mirrors.TypeMirror, []),
+    superclass: dart.definiteFunctionType(mirrors.ClassMirror, []),
+    mixin: dart.definiteFunctionType(mirrors.ClassMirror, [])
+  }),
+  methods: () => ({
+    newInstance: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()]),
+    getField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol]),
+    setField: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.Object]),
+    invoke: dart.definiteFunctionType(mirrors.InstanceMirror, [core.Symbol, core.List], [MapOfSymbol$dynamic()])
+  })
+});
+const _symbol = Symbol('_symbol');
+const _name$0 = Symbol('_name');
+_js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
+  get simpleName() {
+    return this[_symbol];
+  }
+  _(symbol, t, annotations) {
+    this[_symbol] = symbol;
+    this[_name$0] = _js_mirrors.getName(symbol);
+    this.type = _js_mirrors.reflectType(t);
+    this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
+    this.isStatic = false;
+    this.isFinal = false;
+  }
+  toString() {
+    return dart.str`VariableMirror on '${this[_name$0]}'`;
+  }
+  get qualifiedName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
+  }
+  get owner() {
+    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
+  }
+  get isPrivate() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
+  }
+  get isTopLevel() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  get isConst() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsVariableMirror, '_');
+_js_mirrors.JsVariableMirror[dart.implements] = () => [mirrors.VariableMirror];
+dart.setSignature(_js_mirrors.JsVariableMirror, {
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
+  fields: () => ({
+    [_symbol]: core.Symbol,
+    [_name$0]: core.String,
+    type: mirrors.TypeMirror,
+    metadata: ListOfInstanceMirror(),
+    isStatic: core.bool,
+    isFinal: core.bool
+  }),
+  getters: () => ({simpleName: dart.definiteFunctionType(core.Symbol, [])})
+});
+_js_mirrors.JsParameterMirror = class JsParameterMirror extends _js_mirrors.JsVariableMirror {
+  _(member, t, annotations) {
+    super._(member, t, annotations);
+  }
+  toString() {
+    return dart.str`ParameterMirror on '${this[_name$0]}'`;
+  }
+  get qualifiedName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
+  }
+  get owner() {
+    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
+  }
+  get isPrivate() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isPrivate', [], {isGetter: true})));
+  }
+  get isTopLevel() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  get isConst() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConst', [], {isGetter: true})));
+  }
+  get isOptional() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOptional', [], {isGetter: true})));
+  }
+  get isNamed() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isNamed', [], {isGetter: true})));
+  }
+  get hasDefaultValue() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('hasDefaultValue', [], {isGetter: true})));
+  }
+  get defaultValue() {
+    return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('defaultValue', [], {isGetter: true})));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsParameterMirror, '_');
+_js_mirrors.JsParameterMirror[dart.implements] = () => [mirrors.ParameterMirror];
+dart.setSignature(_js_mirrors.JsParameterMirror, {
+  constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsParameterMirror, [core.Symbol, core.Type, core.List])})
+});
+const _params = Symbol('_params');
+const _createParameterMirrorList = Symbol('_createParameterMirrorList');
+let const$2;
+let const$3;
+let const$4;
+_js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
+  get isSetter() {
+    return this[_name$0][dartx.endsWith]('=');
+  }
+  get isPrivate() {
+    return this[_name$0][dartx.startsWith]('_');
+  }
+  get simpleName() {
+    return this[_symbol];
+  }
+  _constructor(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name$0] = _js_mirrors.getName(symbol);
+    this.isConstructor = true;
+    this.isStatic = false;
+    this[_params] = null;
+    this[_metadata$] = null;
+    this.isFinal = false;
+    this[_createParameterMirrorList](ftype);
+  }
+  _instanceMethod(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name$0] = _js_mirrors.getName(symbol);
+    this.isConstructor = false;
+    this.isStatic = false;
+    this[_params] = null;
+    this[_metadata$] = null;
+    this.isFinal = false;
+    this[_createParameterMirrorList](ftype);
+  }
+  _staticMethod(cls, symbol, ftype) {
+    this[_symbol] = symbol;
+    this[_name$0] = _js_mirrors.getName(symbol);
+    this.isConstructor = false;
+    this.isStatic = true;
+    this[_params] = null;
+    this[_metadata$] = null;
+    this.isFinal = false;
+    this[_createParameterMirrorList](ftype);
+  }
+  get constructorName() {
+    return dart.test(this.isConstructor) ? this[_symbol] : null;
+  }
+  get parameters() {
+    return this[_params];
+  }
+  get metadata() {
+    return this[_metadata$];
+  }
+  [_createParameterMirrorList](ftype) {
+    if (ftype == null) {
+      this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
+      this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
+      return;
+    }
+    if (!core.Function.is(ftype) && core.List.is(ftype)) {
+      this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
+      ftype = dart.dindex(ftype, 0);
+    } else {
+      this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
+    }
+    if (typeof ftype == "function") {
+      ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
+    }
+    let args = core.List._check(dart.dload(ftype, 'args'));
+    let opts = core.List._check(dart.dload(ftype, 'optionals'));
+    let params = ListOfParameterMirror().new(dart.notNull(args[dartx.length]) + dart.notNull(opts[dartx.length]));
+    for (let i = 0; i < dart.notNull(args[dartx.length]); ++i) {
+      let type = args[dartx._get](i);
+      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), i);
+      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+      params[dartx._set](i, param);
+    }
+    for (let i = 0; i < dart.notNull(opts[dartx.length]); ++i) {
+      let type = opts[dartx._get](i);
+      let metadata = dart.dindex(dart.dload(ftype, 'metadata'), dart.notNull(args[dartx.length]) + i);
+      let param = new _js_mirrors.JsParameterMirror._(core.Symbol.new(''), core.Type._check(_js_mirrors._wrap(type)), core.List._check(metadata));
+      params[dartx._set](i + dart.notNull(args[dartx.length]), param);
+    }
+    this[_params] = ListOfParameterMirror().unmodifiable(params);
+  }
+  toString() {
+    return dart.str`MethodMirror on '${this[_name$0]}'`;
+  }
+  get qualifiedName() {
+    return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
+  }
+  get owner() {
+    return mirrors.DeclarationMirror._check(this.noSuchMethod(new dart.InvocationImpl('owner', [], {isGetter: true})));
+  }
+  get isTopLevel() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isTopLevel', [], {isGetter: true})));
+  }
+  get location() {
+    return mirrors.SourceLocation._check(this.noSuchMethod(new dart.InvocationImpl('location', [], {isGetter: true})));
+  }
+  get returnType() {
+    return mirrors.TypeMirror._check(this.noSuchMethod(new dart.InvocationImpl('returnType', [], {isGetter: true})));
+  }
+  get source() {
+    return core.String._check(this.noSuchMethod(new dart.InvocationImpl('source', [], {isGetter: true})));
+  }
+  get isAbstract() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
+  }
+  get isSynthetic() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSynthetic', [], {isGetter: true})));
+  }
+  get isRegularMethod() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRegularMethod', [], {isGetter: true})));
+  }
+  get isOperator() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isOperator', [], {isGetter: true})));
+  }
+  get isGetter() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGetter', [], {isGetter: true})));
+  }
+  get isConstConstructor() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isConstConstructor', [], {isGetter: true})));
+  }
+  get isGenerativeConstructor() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isGenerativeConstructor', [], {isGetter: true})));
+  }
+  get isRedirectingConstructor() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isRedirectingConstructor', [], {isGetter: true})));
+  }
+  get isFactoryConstructor() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isFactoryConstructor', [], {isGetter: true})));
+  }
+};
+dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_constructor');
+dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_instanceMethod');
+dart.defineNamedConstructor(_js_mirrors.JsMethodMirror, '_staticMethod');
+_js_mirrors.JsMethodMirror[dart.implements] = () => [mirrors.MethodMirror];
+dart.setSignature(_js_mirrors.JsMethodMirror, {
+  constructors: () => ({
+    _constructor: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+    _instanceMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic]),
+    _staticMethod: dart.definiteFunctionType(_js_mirrors.JsMethodMirror, [_js_mirrors.JsClassMirror, core.Symbol, dart.dynamic])
+  }),
+  fields: () => ({
+    [_symbol]: core.Symbol,
+    [_name$0]: core.String,
+    [_params]: ListOfParameterMirror(),
+    [_metadata$]: ListOfInstanceMirror(),
+    isConstructor: core.bool,
+    isStatic: core.bool,
+    isFinal: core.bool
+  }),
+  getters: () => ({
+    isSetter: dart.definiteFunctionType(core.bool, []),
+    isPrivate: dart.definiteFunctionType(core.bool, []),
+    simpleName: dart.definiteFunctionType(core.Symbol, []),
+    constructorName: dart.definiteFunctionType(core.Symbol, []),
+    parameters: dart.definiteFunctionType(core.List$(mirrors.ParameterMirror), []),
+    metadata: dart.definiteFunctionType(core.List$(mirrors.InstanceMirror), [])
+  }),
+  methods: () => ({[_createParameterMirrorList]: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+});
+_js_primitives.printString = function(string) {
+  if (typeof dartPrint == "function") {
+    dartPrint(string);
+    return;
+  }
+  if (typeof console == "object" && typeof console.log != "undefined") {
+    console.log(string);
+    return;
+  }
+  if (typeof window == "object") {
+    return;
+  }
+  if (typeof print == "function") {
+    print(string);
+    return;
+  }
+  throw "Unable to print message: " + String(string);
+};
+dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
+_metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
+  new(browserName, minimumVersion) {
+    if (minimumVersion === void 0) minimumVersion = null;
+    this.browserName = browserName;
+    this.minimumVersion = minimumVersion;
+  }
+};
+dart.setSignature(_metadata.SupportedBrowser, {
+  constructors: () => ({new: dart.definiteFunctionType(_metadata.SupportedBrowser, [core.String], [core.String])}),
+  fields: () => ({
+    browserName: core.String,
+    minimumVersion: core.String
+  }),
+  sfields: () => ({
+    CHROME: core.String,
+    FIREFOX: core.String,
+    IE: core.String,
+    OPERA: core.String,
+    SAFARI: core.String
+  })
+});
+_metadata.SupportedBrowser.CHROME = "Chrome";
+_metadata.SupportedBrowser.FIREFOX = "Firefox";
+_metadata.SupportedBrowser.IE = "Internet Explorer";
+_metadata.SupportedBrowser.OPERA = "Opera";
+_metadata.SupportedBrowser.SAFARI = "Safari";
+_metadata.Experimental = class Experimental extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_metadata.Experimental, {
+  constructors: () => ({new: dart.definiteFunctionType(_metadata.Experimental, [])})
+});
+_metadata.DomName = class DomName extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_metadata.DomName, {
+  constructors: () => ({new: dart.definiteFunctionType(_metadata.DomName, [core.String])}),
+  fields: () => ({name: core.String})
+});
+_metadata.DocsEditable = class DocsEditable extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_metadata.DocsEditable, {
+  constructors: () => ({new: dart.definiteFunctionType(_metadata.DocsEditable, [])})
+});
+_metadata.Unstable = class Unstable extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(_metadata.Unstable, {
+  constructors: () => ({new: dart.definiteFunctionType(_metadata.Unstable, [])})
+});
+dart.defineExtensionNames([
+  'lengthInBytes',
+  'runtimeType',
+  'asUint8List',
+  'asInt8List',
+  'asUint8ClampedList',
+  'asUint16List',
+  'asInt16List',
+  'asUint32List',
+  'asInt32List',
+  'asUint64List',
+  'asInt64List',
+  'asInt32x4List',
+  'asFloat32List',
+  'asFloat64List',
+  'asFloat32x4List',
+  'asFloat64x2List',
+  'asByteData'
+]);
+_native_typed_data.NativeByteBuffer = class NativeByteBuffer extends core.Object {
+  get [dartx.lengthInBytes]() {
+    return this.byteLength;
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.ByteBuffer);
+  }
+  [dartx.asUint8List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeUint8List.view(this, offsetInBytes, length);
+  }
+  [dartx.asInt8List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeInt8List.view(this, offsetInBytes, length);
+  }
+  [dartx.asUint8ClampedList](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeUint8ClampedList.view(this, offsetInBytes, length);
+  }
+  [dartx.asUint16List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeUint16List.view(this, offsetInBytes, length);
+  }
+  [dartx.asInt16List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeInt16List.view(this, offsetInBytes, length);
+  }
+  [dartx.asUint32List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeUint32List.view(this, offsetInBytes, length);
+  }
+  [dartx.asInt32List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeInt32List.view(this, offsetInBytes, length);
+  }
+  [dartx.asUint64List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
+  }
+  [dartx.asInt64List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
+  }
+  [dartx.asInt32x4List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    let storage = _native_typed_data.NativeInt32List._check(this[dartx.asInt32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
+    return new _native_typed_data.NativeInt32x4List._externalStorage(storage);
+  }
+  [dartx.asFloat32List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeFloat32List.view(this, offsetInBytes, length);
+  }
+  [dartx.asFloat64List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeFloat64List.view(this, offsetInBytes, length);
+  }
+  [dartx.asFloat32x4List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    let storage = _native_typed_data.NativeFloat32List._check(this[dartx.asFloat32List](offsetInBytes, length != null ? dart.notNull(length) * 4 : null));
+    return new _native_typed_data.NativeFloat32x4List._externalStorage(storage);
+  }
+  [dartx.asFloat64x2List](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    let storage = _native_typed_data.NativeFloat64List._check(this[dartx.asFloat64List](offsetInBytes, length != null ? dart.notNull(length) * 2 : null));
+    return new _native_typed_data.NativeFloat64x2List._externalStorage(storage);
+  }
+  [dartx.asByteData](offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return _native_typed_data.NativeByteData.view(this, offsetInBytes, length);
+  }
+};
+_native_typed_data.NativeByteBuffer[dart.implements] = () => [typed_data.ByteBuffer];
+dart.setSignature(_native_typed_data.NativeByteBuffer, {
+  getters: () => ({[dartx.lengthInBytes]: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    [dartx.asUint8List]: dart.definiteFunctionType(typed_data.Uint8List, [], [core.int, core.int]),
+    [dartx.asInt8List]: dart.definiteFunctionType(typed_data.Int8List, [], [core.int, core.int]),
+    [dartx.asUint8ClampedList]: dart.definiteFunctionType(typed_data.Uint8ClampedList, [], [core.int, core.int]),
+    [dartx.asUint16List]: dart.definiteFunctionType(typed_data.Uint16List, [], [core.int, core.int]),
+    [dartx.asInt16List]: dart.definiteFunctionType(typed_data.Int16List, [], [core.int, core.int]),
+    [dartx.asUint32List]: dart.definiteFunctionType(typed_data.Uint32List, [], [core.int, core.int]),
+    [dartx.asInt32List]: dart.definiteFunctionType(typed_data.Int32List, [], [core.int, core.int]),
+    [dartx.asUint64List]: dart.definiteFunctionType(typed_data.Uint64List, [], [core.int, core.int]),
+    [dartx.asInt64List]: dart.definiteFunctionType(typed_data.Int64List, [], [core.int, core.int]),
+    [dartx.asInt32x4List]: dart.definiteFunctionType(typed_data.Int32x4List, [], [core.int, core.int]),
+    [dartx.asFloat32List]: dart.definiteFunctionType(typed_data.Float32List, [], [core.int, core.int]),
+    [dartx.asFloat64List]: dart.definiteFunctionType(typed_data.Float64List, [], [core.int, core.int]),
+    [dartx.asFloat32x4List]: dart.definiteFunctionType(typed_data.Float32x4List, [], [core.int, core.int]),
+    [dartx.asFloat64x2List]: dart.definiteFunctionType(typed_data.Float64x2List, [], [core.int, core.int]),
+    [dartx.asByteData]: dart.definiteFunctionType(typed_data.ByteData, [], [core.int, core.int])
+  })
+});
+dart.registerExtension(dart.global.ArrayBuffer, _native_typed_data.NativeByteBuffer);
+const _storage = Symbol('_storage');
+typed_data.Float32x4 = class Float32x4 extends core.Object {
+  static new(x, y, z, w) {
+    return new _native_typed_data.NativeFloat32x4(x, y, z, w);
+  }
+  static splat(v) {
+    return new _native_typed_data.NativeFloat32x4.splat(v);
+  }
+  static zero() {
+    return new _native_typed_data.NativeFloat32x4.zero();
+  }
+  static fromInt32x4Bits(x) {
+    return _native_typed_data.NativeFloat32x4.fromInt32x4Bits(x);
+  }
+  static fromFloat64x2(v) {
+    return new _native_typed_data.NativeFloat32x4.fromFloat64x2(v);
+  }
+};
+dart.setSignature(typed_data.Float32x4, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float32x4, [core.double, core.double, core.double, core.double]),
+    splat: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    zero: dart.definiteFunctionType(typed_data.Float32x4, []),
+    fromInt32x4Bits: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Int32x4]),
+    fromFloat64x2: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float64x2])
+  }),
+  sfields: () => ({
+    XXXX: core.int,
+    XXXY: core.int,
+    XXXZ: core.int,
+    XXXW: core.int,
+    XXYX: core.int,
+    XXYY: core.int,
+    XXYZ: core.int,
+    XXYW: core.int,
+    XXZX: core.int,
+    XXZY: core.int,
+    XXZZ: core.int,
+    XXZW: core.int,
+    XXWX: core.int,
+    XXWY: core.int,
+    XXWZ: core.int,
+    XXWW: core.int,
+    XYXX: core.int,
+    XYXY: core.int,
+    XYXZ: core.int,
+    XYXW: core.int,
+    XYYX: core.int,
+    XYYY: core.int,
+    XYYZ: core.int,
+    XYYW: core.int,
+    XYZX: core.int,
+    XYZY: core.int,
+    XYZZ: core.int,
+    XYZW: core.int,
+    XYWX: core.int,
+    XYWY: core.int,
+    XYWZ: core.int,
+    XYWW: core.int,
+    XZXX: core.int,
+    XZXY: core.int,
+    XZXZ: core.int,
+    XZXW: core.int,
+    XZYX: core.int,
+    XZYY: core.int,
+    XZYZ: core.int,
+    XZYW: core.int,
+    XZZX: core.int,
+    XZZY: core.int,
+    XZZZ: core.int,
+    XZZW: core.int,
+    XZWX: core.int,
+    XZWY: core.int,
+    XZWZ: core.int,
+    XZWW: core.int,
+    XWXX: core.int,
+    XWXY: core.int,
+    XWXZ: core.int,
+    XWXW: core.int,
+    XWYX: core.int,
+    XWYY: core.int,
+    XWYZ: core.int,
+    XWYW: core.int,
+    XWZX: core.int,
+    XWZY: core.int,
+    XWZZ: core.int,
+    XWZW: core.int,
+    XWWX: core.int,
+    XWWY: core.int,
+    XWWZ: core.int,
+    XWWW: core.int,
+    YXXX: core.int,
+    YXXY: core.int,
+    YXXZ: core.int,
+    YXXW: core.int,
+    YXYX: core.int,
+    YXYY: core.int,
+    YXYZ: core.int,
+    YXYW: core.int,
+    YXZX: core.int,
+    YXZY: core.int,
+    YXZZ: core.int,
+    YXZW: core.int,
+    YXWX: core.int,
+    YXWY: core.int,
+    YXWZ: core.int,
+    YXWW: core.int,
+    YYXX: core.int,
+    YYXY: core.int,
+    YYXZ: core.int,
+    YYXW: core.int,
+    YYYX: core.int,
+    YYYY: core.int,
+    YYYZ: core.int,
+    YYYW: core.int,
+    YYZX: core.int,
+    YYZY: core.int,
+    YYZZ: core.int,
+    YYZW: core.int,
+    YYWX: core.int,
+    YYWY: core.int,
+    YYWZ: core.int,
+    YYWW: core.int,
+    YZXX: core.int,
+    YZXY: core.int,
+    YZXZ: core.int,
+    YZXW: core.int,
+    YZYX: core.int,
+    YZYY: core.int,
+    YZYZ: core.int,
+    YZYW: core.int,
+    YZZX: core.int,
+    YZZY: core.int,
+    YZZZ: core.int,
+    YZZW: core.int,
+    YZWX: core.int,
+    YZWY: core.int,
+    YZWZ: core.int,
+    YZWW: core.int,
+    YWXX: core.int,
+    YWXY: core.int,
+    YWXZ: core.int,
+    YWXW: core.int,
+    YWYX: core.int,
+    YWYY: core.int,
+    YWYZ: core.int,
+    YWYW: core.int,
+    YWZX: core.int,
+    YWZY: core.int,
+    YWZZ: core.int,
+    YWZW: core.int,
+    YWWX: core.int,
+    YWWY: core.int,
+    YWWZ: core.int,
+    YWWW: core.int,
+    ZXXX: core.int,
+    ZXXY: core.int,
+    ZXXZ: core.int,
+    ZXXW: core.int,
+    ZXYX: core.int,
+    ZXYY: core.int,
+    ZXYZ: core.int,
+    ZXYW: core.int,
+    ZXZX: core.int,
+    ZXZY: core.int,
+    ZXZZ: core.int,
+    ZXZW: core.int,
+    ZXWX: core.int,
+    ZXWY: core.int,
+    ZXWZ: core.int,
+    ZXWW: core.int,
+    ZYXX: core.int,
+    ZYXY: core.int,
+    ZYXZ: core.int,
+    ZYXW: core.int,
+    ZYYX: core.int,
+    ZYYY: core.int,
+    ZYYZ: core.int,
+    ZYYW: core.int,
+    ZYZX: core.int,
+    ZYZY: core.int,
+    ZYZZ: core.int,
+    ZYZW: core.int,
+    ZYWX: core.int,
+    ZYWY: core.int,
+    ZYWZ: core.int,
+    ZYWW: core.int,
+    ZZXX: core.int,
+    ZZXY: core.int,
+    ZZXZ: core.int,
+    ZZXW: core.int,
+    ZZYX: core.int,
+    ZZYY: core.int,
+    ZZYZ: core.int,
+    ZZYW: core.int,
+    ZZZX: core.int,
+    ZZZY: core.int,
+    ZZZZ: core.int,
+    ZZZW: core.int,
+    ZZWX: core.int,
+    ZZWY: core.int,
+    ZZWZ: core.int,
+    ZZWW: core.int,
+    ZWXX: core.int,
+    ZWXY: core.int,
+    ZWXZ: core.int,
+    ZWXW: core.int,
+    ZWYX: core.int,
+    ZWYY: core.int,
+    ZWYZ: core.int,
+    ZWYW: core.int,
+    ZWZX: core.int,
+    ZWZY: core.int,
+    ZWZZ: core.int,
+    ZWZW: core.int,
+    ZWWX: core.int,
+    ZWWY: core.int,
+    ZWWZ: core.int,
+    ZWWW: core.int,
+    WXXX: core.int,
+    WXXY: core.int,
+    WXXZ: core.int,
+    WXXW: core.int,
+    WXYX: core.int,
+    WXYY: core.int,
+    WXYZ: core.int,
+    WXYW: core.int,
+    WXZX: core.int,
+    WXZY: core.int,
+    WXZZ: core.int,
+    WXZW: core.int,
+    WXWX: core.int,
+    WXWY: core.int,
+    WXWZ: core.int,
+    WXWW: core.int,
+    WYXX: core.int,
+    WYXY: core.int,
+    WYXZ: core.int,
+    WYXW: core.int,
+    WYYX: core.int,
+    WYYY: core.int,
+    WYYZ: core.int,
+    WYYW: core.int,
+    WYZX: core.int,
+    WYZY: core.int,
+    WYZZ: core.int,
+    WYZW: core.int,
+    WYWX: core.int,
+    WYWY: core.int,
+    WYWZ: core.int,
+    WYWW: core.int,
+    WZXX: core.int,
+    WZXY: core.int,
+    WZXZ: core.int,
+    WZXW: core.int,
+    WZYX: core.int,
+    WZYY: core.int,
+    WZYZ: core.int,
+    WZYW: core.int,
+    WZZX: core.int,
+    WZZY: core.int,
+    WZZZ: core.int,
+    WZZW: core.int,
+    WZWX: core.int,
+    WZWY: core.int,
+    WZWZ: core.int,
+    WZWW: core.int,
+    WWXX: core.int,
+    WWXY: core.int,
+    WWXZ: core.int,
+    WWXW: core.int,
+    WWYX: core.int,
+    WWYY: core.int,
+    WWYZ: core.int,
+    WWYW: core.int,
+    WWZX: core.int,
+    WWZY: core.int,
+    WWZZ: core.int,
+    WWZW: core.int,
+    WWWX: core.int,
+    WWWY: core.int,
+    WWWZ: core.int,
+    WWWW: core.int
+  })
+});
+typed_data.Float32x4.XXXX = 0;
+typed_data.Float32x4.XXXY = 64;
+typed_data.Float32x4.XXXZ = 128;
+typed_data.Float32x4.XXXW = 192;
+typed_data.Float32x4.XXYX = 16;
+typed_data.Float32x4.XXYY = 80;
+typed_data.Float32x4.XXYZ = 144;
+typed_data.Float32x4.XXYW = 208;
+typed_data.Float32x4.XXZX = 32;
+typed_data.Float32x4.XXZY = 96;
+typed_data.Float32x4.XXZZ = 160;
+typed_data.Float32x4.XXZW = 224;
+typed_data.Float32x4.XXWX = 48;
+typed_data.Float32x4.XXWY = 112;
+typed_data.Float32x4.XXWZ = 176;
+typed_data.Float32x4.XXWW = 240;
+typed_data.Float32x4.XYXX = 4;
+typed_data.Float32x4.XYXY = 68;
+typed_data.Float32x4.XYXZ = 132;
+typed_data.Float32x4.XYXW = 196;
+typed_data.Float32x4.XYYX = 20;
+typed_data.Float32x4.XYYY = 84;
+typed_data.Float32x4.XYYZ = 148;
+typed_data.Float32x4.XYYW = 212;
+typed_data.Float32x4.XYZX = 36;
+typed_data.Float32x4.XYZY = 100;
+typed_data.Float32x4.XYZZ = 164;
+typed_data.Float32x4.XYZW = 228;
+typed_data.Float32x4.XYWX = 52;
+typed_data.Float32x4.XYWY = 116;
+typed_data.Float32x4.XYWZ = 180;
+typed_data.Float32x4.XYWW = 244;
+typed_data.Float32x4.XZXX = 8;
+typed_data.Float32x4.XZXY = 72;
+typed_data.Float32x4.XZXZ = 136;
+typed_data.Float32x4.XZXW = 200;
+typed_data.Float32x4.XZYX = 24;
+typed_data.Float32x4.XZYY = 88;
+typed_data.Float32x4.XZYZ = 152;
+typed_data.Float32x4.XZYW = 216;
+typed_data.Float32x4.XZZX = 40;
+typed_data.Float32x4.XZZY = 104;
+typed_data.Float32x4.XZZZ = 168;
+typed_data.Float32x4.XZZW = 232;
+typed_data.Float32x4.XZWX = 56;
+typed_data.Float32x4.XZWY = 120;
+typed_data.Float32x4.XZWZ = 184;
+typed_data.Float32x4.XZWW = 248;
+typed_data.Float32x4.XWXX = 12;
+typed_data.Float32x4.XWXY = 76;
+typed_data.Float32x4.XWXZ = 140;
+typed_data.Float32x4.XWXW = 204;
+typed_data.Float32x4.XWYX = 28;
+typed_data.Float32x4.XWYY = 92;
+typed_data.Float32x4.XWYZ = 156;
+typed_data.Float32x4.XWYW = 220;
+typed_data.Float32x4.XWZX = 44;
+typed_data.Float32x4.XWZY = 108;
+typed_data.Float32x4.XWZZ = 172;
+typed_data.Float32x4.XWZW = 236;
+typed_data.Float32x4.XWWX = 60;
+typed_data.Float32x4.XWWY = 124;
+typed_data.Float32x4.XWWZ = 188;
+typed_data.Float32x4.XWWW = 252;
+typed_data.Float32x4.YXXX = 1;
+typed_data.Float32x4.YXXY = 65;
+typed_data.Float32x4.YXXZ = 129;
+typed_data.Float32x4.YXXW = 193;
+typed_data.Float32x4.YXYX = 17;
+typed_data.Float32x4.YXYY = 81;
+typed_data.Float32x4.YXYZ = 145;
+typed_data.Float32x4.YXYW = 209;
+typed_data.Float32x4.YXZX = 33;
+typed_data.Float32x4.YXZY = 97;
+typed_data.Float32x4.YXZZ = 161;
+typed_data.Float32x4.YXZW = 225;
+typed_data.Float32x4.YXWX = 49;
+typed_data.Float32x4.YXWY = 113;
+typed_data.Float32x4.YXWZ = 177;
+typed_data.Float32x4.YXWW = 241;
+typed_data.Float32x4.YYXX = 5;
+typed_data.Float32x4.YYXY = 69;
+typed_data.Float32x4.YYXZ = 133;
+typed_data.Float32x4.YYXW = 197;
+typed_data.Float32x4.YYYX = 21;
+typed_data.Float32x4.YYYY = 85;
+typed_data.Float32x4.YYYZ = 149;
+typed_data.Float32x4.YYYW = 213;
+typed_data.Float32x4.YYZX = 37;
+typed_data.Float32x4.YYZY = 101;
+typed_data.Float32x4.YYZZ = 165;
+typed_data.Float32x4.YYZW = 229;
+typed_data.Float32x4.YYWX = 53;
+typed_data.Float32x4.YYWY = 117;
+typed_data.Float32x4.YYWZ = 181;
+typed_data.Float32x4.YYWW = 245;
+typed_data.Float32x4.YZXX = 9;
+typed_data.Float32x4.YZXY = 73;
+typed_data.Float32x4.YZXZ = 137;
+typed_data.Float32x4.YZXW = 201;
+typed_data.Float32x4.YZYX = 25;
+typed_data.Float32x4.YZYY = 89;
+typed_data.Float32x4.YZYZ = 153;
+typed_data.Float32x4.YZYW = 217;
+typed_data.Float32x4.YZZX = 41;
+typed_data.Float32x4.YZZY = 105;
+typed_data.Float32x4.YZZZ = 169;
+typed_data.Float32x4.YZZW = 233;
+typed_data.Float32x4.YZWX = 57;
+typed_data.Float32x4.YZWY = 121;
+typed_data.Float32x4.YZWZ = 185;
+typed_data.Float32x4.YZWW = 249;
+typed_data.Float32x4.YWXX = 13;
+typed_data.Float32x4.YWXY = 77;
+typed_data.Float32x4.YWXZ = 141;
+typed_data.Float32x4.YWXW = 205;
+typed_data.Float32x4.YWYX = 29;
+typed_data.Float32x4.YWYY = 93;
+typed_data.Float32x4.YWYZ = 157;
+typed_data.Float32x4.YWYW = 221;
+typed_data.Float32x4.YWZX = 45;
+typed_data.Float32x4.YWZY = 109;
+typed_data.Float32x4.YWZZ = 173;
+typed_data.Float32x4.YWZW = 237;
+typed_data.Float32x4.YWWX = 61;
+typed_data.Float32x4.YWWY = 125;
+typed_data.Float32x4.YWWZ = 189;
+typed_data.Float32x4.YWWW = 253;
+typed_data.Float32x4.ZXXX = 2;
+typed_data.Float32x4.ZXXY = 66;
+typed_data.Float32x4.ZXXZ = 130;
+typed_data.Float32x4.ZXXW = 194;
+typed_data.Float32x4.ZXYX = 18;
+typed_data.Float32x4.ZXYY = 82;
+typed_data.Float32x4.ZXYZ = 146;
+typed_data.Float32x4.ZXYW = 210;
+typed_data.Float32x4.ZXZX = 34;
+typed_data.Float32x4.ZXZY = 98;
+typed_data.Float32x4.ZXZZ = 162;
+typed_data.Float32x4.ZXZW = 226;
+typed_data.Float32x4.ZXWX = 50;
+typed_data.Float32x4.ZXWY = 114;
+typed_data.Float32x4.ZXWZ = 178;
+typed_data.Float32x4.ZXWW = 242;
+typed_data.Float32x4.ZYXX = 6;
+typed_data.Float32x4.ZYXY = 70;
+typed_data.Float32x4.ZYXZ = 134;
+typed_data.Float32x4.ZYXW = 198;
+typed_data.Float32x4.ZYYX = 22;
+typed_data.Float32x4.ZYYY = 86;
+typed_data.Float32x4.ZYYZ = 150;
+typed_data.Float32x4.ZYYW = 214;
+typed_data.Float32x4.ZYZX = 38;
+typed_data.Float32x4.ZYZY = 102;
+typed_data.Float32x4.ZYZZ = 166;
+typed_data.Float32x4.ZYZW = 230;
+typed_data.Float32x4.ZYWX = 54;
+typed_data.Float32x4.ZYWY = 118;
+typed_data.Float32x4.ZYWZ = 182;
+typed_data.Float32x4.ZYWW = 246;
+typed_data.Float32x4.ZZXX = 10;
+typed_data.Float32x4.ZZXY = 74;
+typed_data.Float32x4.ZZXZ = 138;
+typed_data.Float32x4.ZZXW = 202;
+typed_data.Float32x4.ZZYX = 26;
+typed_data.Float32x4.ZZYY = 90;
+typed_data.Float32x4.ZZYZ = 154;
+typed_data.Float32x4.ZZYW = 218;
+typed_data.Float32x4.ZZZX = 42;
+typed_data.Float32x4.ZZZY = 106;
+typed_data.Float32x4.ZZZZ = 170;
+typed_data.Float32x4.ZZZW = 234;
+typed_data.Float32x4.ZZWX = 58;
+typed_data.Float32x4.ZZWY = 122;
+typed_data.Float32x4.ZZWZ = 186;
+typed_data.Float32x4.ZZWW = 250;
+typed_data.Float32x4.ZWXX = 14;
+typed_data.Float32x4.ZWXY = 78;
+typed_data.Float32x4.ZWXZ = 142;
+typed_data.Float32x4.ZWXW = 206;
+typed_data.Float32x4.ZWYX = 30;
+typed_data.Float32x4.ZWYY = 94;
+typed_data.Float32x4.ZWYZ = 158;
+typed_data.Float32x4.ZWYW = 222;
+typed_data.Float32x4.ZWZX = 46;
+typed_data.Float32x4.ZWZY = 110;
+typed_data.Float32x4.ZWZZ = 174;
+typed_data.Float32x4.ZWZW = 238;
+typed_data.Float32x4.ZWWX = 62;
+typed_data.Float32x4.ZWWY = 126;
+typed_data.Float32x4.ZWWZ = 190;
+typed_data.Float32x4.ZWWW = 254;
+typed_data.Float32x4.WXXX = 3;
+typed_data.Float32x4.WXXY = 67;
+typed_data.Float32x4.WXXZ = 131;
+typed_data.Float32x4.WXXW = 195;
+typed_data.Float32x4.WXYX = 19;
+typed_data.Float32x4.WXYY = 83;
+typed_data.Float32x4.WXYZ = 147;
+typed_data.Float32x4.WXYW = 211;
+typed_data.Float32x4.WXZX = 35;
+typed_data.Float32x4.WXZY = 99;
+typed_data.Float32x4.WXZZ = 163;
+typed_data.Float32x4.WXZW = 227;
+typed_data.Float32x4.WXWX = 51;
+typed_data.Float32x4.WXWY = 115;
+typed_data.Float32x4.WXWZ = 179;
+typed_data.Float32x4.WXWW = 243;
+typed_data.Float32x4.WYXX = 7;
+typed_data.Float32x4.WYXY = 71;
+typed_data.Float32x4.WYXZ = 135;
+typed_data.Float32x4.WYXW = 199;
+typed_data.Float32x4.WYYX = 23;
+typed_data.Float32x4.WYYY = 87;
+typed_data.Float32x4.WYYZ = 151;
+typed_data.Float32x4.WYYW = 215;
+typed_data.Float32x4.WYZX = 39;
+typed_data.Float32x4.WYZY = 103;
+typed_data.Float32x4.WYZZ = 167;
+typed_data.Float32x4.WYZW = 231;
+typed_data.Float32x4.WYWX = 55;
+typed_data.Float32x4.WYWY = 119;
+typed_data.Float32x4.WYWZ = 183;
+typed_data.Float32x4.WYWW = 247;
+typed_data.Float32x4.WZXX = 11;
+typed_data.Float32x4.WZXY = 75;
+typed_data.Float32x4.WZXZ = 139;
+typed_data.Float32x4.WZXW = 203;
+typed_data.Float32x4.WZYX = 27;
+typed_data.Float32x4.WZYY = 91;
+typed_data.Float32x4.WZYZ = 155;
+typed_data.Float32x4.WZYW = 219;
+typed_data.Float32x4.WZZX = 43;
+typed_data.Float32x4.WZZY = 107;
+typed_data.Float32x4.WZZZ = 171;
+typed_data.Float32x4.WZZW = 235;
+typed_data.Float32x4.WZWX = 59;
+typed_data.Float32x4.WZWY = 123;
+typed_data.Float32x4.WZWZ = 187;
+typed_data.Float32x4.WZWW = 251;
+typed_data.Float32x4.WWXX = 15;
+typed_data.Float32x4.WWXY = 79;
+typed_data.Float32x4.WWXZ = 143;
+typed_data.Float32x4.WWXW = 207;
+typed_data.Float32x4.WWYX = 31;
+typed_data.Float32x4.WWYY = 95;
+typed_data.Float32x4.WWYZ = 159;
+typed_data.Float32x4.WWYW = 223;
+typed_data.Float32x4.WWZX = 47;
+typed_data.Float32x4.WWZY = 111;
+typed_data.Float32x4.WWZZ = 175;
+typed_data.Float32x4.WWZW = 239;
+typed_data.Float32x4.WWWX = 63;
+typed_data.Float32x4.WWWY = 127;
+typed_data.Float32x4.WWWZ = 191;
+typed_data.Float32x4.WWWW = 255;
+_native_typed_data.NativeFloat32x4List = class NativeFloat32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float32x4), _internal.FixedLengthListMixin$(typed_data.Float32x4)) {
+  new(length) {
+    this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(length) * 4);
+  }
+  _externalStorage(storage) {
+    this[_storage] = storage;
+  }
+  _slowFromList(list) {
+    this[_storage] = _native_typed_data.NativeFloat32List.new(dart.notNull(list[dartx.length]) * 4);
+    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
+      let e = list[dartx._get](i);
+      this[_storage][dartx._set](i * 4 + 0, e.x);
+      this[_storage][dartx._set](i * 4 + 1, e.y);
+      this[_storage][dartx._set](i * 4 + 2, e.z);
+      this[_storage][dartx._set](i * 4 + 3, e.w);
+    }
+  }
+  get runtimeType() {
+    return dart.wrapType(typed_data.Float32x4List);
+  }
+  static fromList(list) {
+    if (_native_typed_data.NativeFloat32x4List.is(list)) {
+      return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List.fromList(list[_storage]));
+    } else {
+      return new _native_typed_data.NativeFloat32x4List._slowFromList(list);
+    }
+  }
+  get buffer() {
+    return this[_storage][dartx.buffer];
+  }
+  get lengthInBytes() {
+    return this[_storage][dartx.lengthInBytes];
+  }
+  get offsetInBytes() {
+    return this[_storage][dartx.offsetInBytes];
+  }
+  get elementSizeInBytes() {
+    return typed_data.Float32x4List.BYTES_PER_ELEMENT;
+  }
+  get length() {
+    return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _get(index) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
+    let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
+    let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
+    let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  _set(index, value) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
+    return value;
+  }
+  sublist(start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this.length);
+    return new _native_typed_data.NativeFloat32x4List._externalStorage(_native_typed_data.NativeFloat32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_externalStorage');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4List, '_slowFromList');
+_native_typed_data.NativeFloat32x4List[dart.implements] = () => [typed_data.Float32x4List];
+dart.setSignature(_native_typed_data.NativeFloat32x4List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [core.int]),
+    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [_native_typed_data.NativeFloat32List]),
+    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4List, [ListOfFloat32x4()])
+  }),
+  fields: () => ({[_storage]: _native_typed_data.NativeFloat32List}),
+  getters: () => ({
+    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
+    lengthInBytes: dart.definiteFunctionType(core.int, []),
+    offsetInBytes: dart.definiteFunctionType(core.int, []),
+    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
+    length: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32x4])
+  })
+});
+dart.defineExtensionMembers(_native_typed_data.NativeFloat32x4List, [
+  '_get',
+  '_set',
+  'sublist',
+  'buffer',
+  'lengthInBytes',
+  'offsetInBytes',
+  'elementSizeInBytes',
+  'length'
+]);
+typed_data.Int32x4 = class Int32x4 extends core.Object {
+  static new(x, y, z, w) {
+    return new _native_typed_data.NativeInt32x4(x, y, z, w);
+  }
+  static bool(x, y, z, w) {
+    return new _native_typed_data.NativeInt32x4.bool(x, y, z, w);
+  }
+  static fromFloat32x4Bits(x) {
+    return _native_typed_data.NativeInt32x4.fromFloat32x4Bits(x);
+  }
+};
+dart.setSignature(typed_data.Int32x4, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int32x4, [core.int, core.int, core.int, core.int]),
+    bool: dart.definiteFunctionType(typed_data.Int32x4, [core.bool, core.bool, core.bool, core.bool]),
+    fromFloat32x4Bits: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4])
+  }),
+  sfields: () => ({
+    XXXX: core.int,
+    XXXY: core.int,
+    XXXZ: core.int,
+    XXXW: core.int,
+    XXYX: core.int,
+    XXYY: core.int,
+    XXYZ: core.int,
+    XXYW: core.int,
+    XXZX: core.int,
+    XXZY: core.int,
+    XXZZ: core.int,
+    XXZW: core.int,
+    XXWX: core.int,
+    XXWY: core.int,
+    XXWZ: core.int,
+    XXWW: core.int,
+    XYXX: core.int,
+    XYXY: core.int,
+    XYXZ: core.int,
+    XYXW: core.int,
+    XYYX: core.int,
+    XYYY: core.int,
+    XYYZ: core.int,
+    XYYW: core.int,
+    XYZX: core.int,
+    XYZY: core.int,
+    XYZZ: core.int,
+    XYZW: core.int,
+    XYWX: core.int,
+    XYWY: core.int,
+    XYWZ: core.int,
+    XYWW: core.int,
+    XZXX: core.int,
+    XZXY: core.int,
+    XZXZ: core.int,
+    XZXW: core.int,
+    XZYX: core.int,
+    XZYY: core.int,
+    XZYZ: core.int,
+    XZYW: core.int,
+    XZZX: core.int,
+    XZZY: core.int,
+    XZZZ: core.int,
+    XZZW: core.int,
+    XZWX: core.int,
+    XZWY: core.int,
+    XZWZ: core.int,
+    XZWW: core.int,
+    XWXX: core.int,
+    XWXY: core.int,
+    XWXZ: core.int,
+    XWXW: core.int,
+    XWYX: core.int,
+    XWYY: core.int,
+    XWYZ: core.int,
+    XWYW: core.int,
+    XWZX: core.int,
+    XWZY: core.int,
+    XWZZ: core.int,
+    XWZW: core.int,
+    XWWX: core.int,
+    XWWY: core.int,
+    XWWZ: core.int,
+    XWWW: core.int,
+    YXXX: core.int,
+    YXXY: core.int,
+    YXXZ: core.int,
+    YXXW: core.int,
+    YXYX: core.int,
+    YXYY: core.int,
+    YXYZ: core.int,
+    YXYW: core.int,
+    YXZX: core.int,
+    YXZY: core.int,
+    YXZZ: core.int,
+    YXZW: core.int,
+    YXWX: core.int,
+    YXWY: core.int,
+    YXWZ: core.int,
+    YXWW: core.int,
+    YYXX: core.int,
+    YYXY: core.int,
+    YYXZ: core.int,
+    YYXW: core.int,
+    YYYX: core.int,
+    YYYY: core.int,
+    YYYZ: core.int,
+    YYYW: core.int,
+    YYZX: core.int,
+    YYZY: core.int,
+    YYZZ: core.int,
+    YYZW: core.int,
+    YYWX: core.int,
+    YYWY: core.int,
+    YYWZ: core.int,
+    YYWW: core.int,
+    YZXX: core.int,
+    YZXY: core.int,
+    YZXZ: core.int,
+    YZXW: core.int,
+    YZYX: core.int,
+    YZYY: core.int,
+    YZYZ: core.int,
+    YZYW: core.int,
+    YZZX: core.int,
+    YZZY: core.int,
+    YZZZ: core.int,
+    YZZW: core.int,
+    YZWX: core.int,
+    YZWY: core.int,
+    YZWZ: core.int,
+    YZWW: core.int,
+    YWXX: core.int,
+    YWXY: core.int,
+    YWXZ: core.int,
+    YWXW: core.int,
+    YWYX: core.int,
+    YWYY: core.int,
+    YWYZ: core.int,
+    YWYW: core.int,
+    YWZX: core.int,
+    YWZY: core.int,
+    YWZZ: core.int,
+    YWZW: core.int,
+    YWWX: core.int,
+    YWWY: core.int,
+    YWWZ: core.int,
+    YWWW: core.int,
+    ZXXX: core.int,
+    ZXXY: core.int,
+    ZXXZ: core.int,
+    ZXXW: core.int,
+    ZXYX: core.int,
+    ZXYY: core.int,
+    ZXYZ: core.int,
+    ZXYW: core.int,
+    ZXZX: core.int,
+    ZXZY: core.int,
+    ZXZZ: core.int,
+    ZXZW: core.int,
+    ZXWX: core.int,
+    ZXWY: core.int,
+    ZXWZ: core.int,
+    ZXWW: core.int,
+    ZYXX: core.int,
+    ZYXY: core.int,
+    ZYXZ: core.int,
+    ZYXW: core.int,
+    ZYYX: core.int,
+    ZYYY: core.int,
+    ZYYZ: core.int,
+    ZYYW: core.int,
+    ZYZX: core.int,
+    ZYZY: core.int,
+    ZYZZ: core.int,
+    ZYZW: core.int,
+    ZYWX: core.int,
+    ZYWY: core.int,
+    ZYWZ: core.int,
+    ZYWW: core.int,
+    ZZXX: core.int,
+    ZZXY: core.int,
+    ZZXZ: core.int,
+    ZZXW: core.int,
+    ZZYX: core.int,
+    ZZYY: core.int,
+    ZZYZ: core.int,
+    ZZYW: core.int,
+    ZZZX: core.int,
+    ZZZY: core.int,
+    ZZZZ: core.int,
+    ZZZW: core.int,
+    ZZWX: core.int,
+    ZZWY: core.int,
+    ZZWZ: core.int,
+    ZZWW: core.int,
+    ZWXX: core.int,
+    ZWXY: core.int,
+    ZWXZ: core.int,
+    ZWXW: core.int,
+    ZWYX: core.int,
+    ZWYY: core.int,
+    ZWYZ: core.int,
+    ZWYW: core.int,
+    ZWZX: core.int,
+    ZWZY: core.int,
+    ZWZZ: core.int,
+    ZWZW: core.int,
+    ZWWX: core.int,
+    ZWWY: core.int,
+    ZWWZ: core.int,
+    ZWWW: core.int,
+    WXXX: core.int,
+    WXXY: core.int,
+    WXXZ: core.int,
+    WXXW: core.int,
+    WXYX: core.int,
+    WXYY: core.int,
+    WXYZ: core.int,
+    WXYW: core.int,
+    WXZX: core.int,
+    WXZY: core.int,
+    WXZZ: core.int,
+    WXZW: core.int,
+    WXWX: core.int,
+    WXWY: core.int,
+    WXWZ: core.int,
+    WXWW: core.int,
+    WYXX: core.int,
+    WYXY: core.int,
+    WYXZ: core.int,
+    WYXW: core.int,
+    WYYX: core.int,
+    WYYY: core.int,
+    WYYZ: core.int,
+    WYYW: core.int,
+    WYZX: core.int,
+    WYZY: core.int,
+    WYZZ: core.int,
+    WYZW: core.int,
+    WYWX: core.int,
+    WYWY: core.int,
+    WYWZ: core.int,
+    WYWW: core.int,
+    WZXX: core.int,
+    WZXY: core.int,
+    WZXZ: core.int,
+    WZXW: core.int,
+    WZYX: core.int,
+    WZYY: core.int,
+    WZYZ: core.int,
+    WZYW: core.int,
+    WZZX: core.int,
+    WZZY: core.int,
+    WZZZ: core.int,
+    WZZW: core.int,
+    WZWX: core.int,
+    WZWY: core.int,
+    WZWZ: core.int,
+    WZWW: core.int,
+    WWXX: core.int,
+    WWXY: core.int,
+    WWXZ: core.int,
+    WWXW: core.int,
+    WWYX: core.int,
+    WWYY: core.int,
+    WWYZ: core.int,
+    WWYW: core.int,
+    WWZX: core.int,
+    WWZY: core.int,
+    WWZZ: core.int,
+    WWZW: core.int,
+    WWWX: core.int,
+    WWWY: core.int,
+    WWWZ: core.int,
+    WWWW: core.int
+  })
+});
+typed_data.Int32x4.XXXX = 0;
+typed_data.Int32x4.XXXY = 64;
+typed_data.Int32x4.XXXZ = 128;
+typed_data.Int32x4.XXXW = 192;
+typed_data.Int32x4.XXYX = 16;
+typed_data.Int32x4.XXYY = 80;
+typed_data.Int32x4.XXYZ = 144;
+typed_data.Int32x4.XXYW = 208;
+typed_data.Int32x4.XXZX = 32;
+typed_data.Int32x4.XXZY = 96;
+typed_data.Int32x4.XXZZ = 160;
+typed_data.Int32x4.XXZW = 224;
+typed_data.Int32x4.XXWX = 48;
+typed_data.Int32x4.XXWY = 112;
+typed_data.Int32x4.XXWZ = 176;
+typed_data.Int32x4.XXWW = 240;
+typed_data.Int32x4.XYXX = 4;
+typed_data.Int32x4.XYXY = 68;
+typed_data.Int32x4.XYXZ = 132;
+typed_data.Int32x4.XYXW = 196;
+typed_data.Int32x4.XYYX = 20;
+typed_data.Int32x4.XYYY = 84;
+typed_data.Int32x4.XYYZ = 148;
+typed_data.Int32x4.XYYW = 212;
+typed_data.Int32x4.XYZX = 36;
+typed_data.Int32x4.XYZY = 100;
+typed_data.Int32x4.XYZZ = 164;
+typed_data.Int32x4.XYZW = 228;
+typed_data.Int32x4.XYWX = 52;
+typed_data.Int32x4.XYWY = 116;
+typed_data.Int32x4.XYWZ = 180;
+typed_data.Int32x4.XYWW = 244;
+typed_data.Int32x4.XZXX = 8;
+typed_data.Int32x4.XZXY = 72;
+typed_data.Int32x4.XZXZ = 136;
+typed_data.Int32x4.XZXW = 200;
+typed_data.Int32x4.XZYX = 24;
+typed_data.Int32x4.XZYY = 88;
+typed_data.Int32x4.XZYZ = 152;
+typed_data.Int32x4.XZYW = 216;
+typed_data.Int32x4.XZZX = 40;
+typed_data.Int32x4.XZZY = 104;
+typed_data.Int32x4.XZZZ = 168;
+typed_data.Int32x4.XZZW = 232;
+typed_data.Int32x4.XZWX = 56;
+typed_data.Int32x4.XZWY = 120;
+typed_data.Int32x4.XZWZ = 184;
+typed_data.Int32x4.XZWW = 248;
+typed_data.Int32x4.XWXX = 12;
+typed_data.Int32x4.XWXY = 76;
+typed_data.Int32x4.XWXZ = 140;
+typed_data.Int32x4.XWXW = 204;
+typed_data.Int32x4.XWYX = 28;
+typed_data.Int32x4.XWYY = 92;
+typed_data.Int32x4.XWYZ = 156;
+typed_data.Int32x4.XWYW = 220;
+typed_data.Int32x4.XWZX = 44;
+typed_data.Int32x4.XWZY = 108;
+typed_data.Int32x4.XWZZ = 172;
+typed_data.Int32x4.XWZW = 236;
+typed_data.Int32x4.XWWX = 60;
+typed_data.Int32x4.XWWY = 124;
+typed_data.Int32x4.XWWZ = 188;
+typed_data.Int32x4.XWWW = 252;
+typed_data.Int32x4.YXXX = 1;
+typed_data.Int32x4.YXXY = 65;
+typed_data.Int32x4.YXXZ = 129;
+typed_data.Int32x4.YXXW = 193;
+typed_data.Int32x4.YXYX = 17;
+typed_data.Int32x4.YXYY = 81;
+typed_data.Int32x4.YXYZ = 145;
+typed_data.Int32x4.YXYW = 209;
+typed_data.Int32x4.YXZX = 33;
+typed_data.Int32x4.YXZY = 97;
+typed_data.Int32x4.YXZZ = 161;
+typed_data.Int32x4.YXZW = 225;
+typed_data.Int32x4.YXWX = 49;
+typed_data.Int32x4.YXWY = 113;
+typed_data.Int32x4.YXWZ = 177;
+typed_data.Int32x4.YXWW = 241;
+typed_data.Int32x4.YYXX = 5;
+typed_data.Int32x4.YYXY = 69;
+typed_data.Int32x4.YYXZ = 133;
+typed_data.Int32x4.YYXW = 197;
+typed_data.Int32x4.YYYX = 21;
+typed_data.Int32x4.YYYY = 85;
+typed_data.Int32x4.YYYZ = 149;
+typed_data.Int32x4.YYYW = 213;
+typed_data.Int32x4.YYZX = 37;
+typed_data.Int32x4.YYZY = 101;
+typed_data.Int32x4.YYZZ = 165;
+typed_data.Int32x4.YYZW = 229;
+typed_data.Int32x4.YYWX = 53;
+typed_data.Int32x4.YYWY = 117;
+typed_data.Int32x4.YYWZ = 181;
+typed_data.Int32x4.YYWW = 245;
+typed_data.Int32x4.YZXX = 9;
+typed_data.Int32x4.YZXY = 73;
+typed_data.Int32x4.YZXZ = 137;
+typed_data.Int32x4.YZXW = 201;
+typed_data.Int32x4.YZYX = 25;
+typed_data.Int32x4.YZYY = 89;
+typed_data.Int32x4.YZYZ = 153;
+typed_data.Int32x4.YZYW = 217;
+typed_data.Int32x4.YZZX = 41;
+typed_data.Int32x4.YZZY = 105;
+typed_data.Int32x4.YZZZ = 169;
+typed_data.Int32x4.YZZW = 233;
+typed_data.Int32x4.YZWX = 57;
+typed_data.Int32x4.YZWY = 121;
+typed_data.Int32x4.YZWZ = 185;
+typed_data.Int32x4.YZWW = 249;
+typed_data.Int32x4.YWXX = 13;
+typed_data.Int32x4.YWXY = 77;
+typed_data.Int32x4.YWXZ = 141;
+typed_data.Int32x4.YWXW = 205;
+typed_data.Int32x4.YWYX = 29;
+typed_data.Int32x4.YWYY = 93;
+typed_data.Int32x4.YWYZ = 157;
+typed_data.Int32x4.YWYW = 221;
+typed_data.Int32x4.YWZX = 45;
+typed_data.Int32x4.YWZY = 109;
+typed_data.Int32x4.YWZZ = 173;
+typed_data.Int32x4.YWZW = 237;
+typed_data.Int32x4.YWWX = 61;
+typed_data.Int32x4.YWWY = 125;
+typed_data.Int32x4.YWWZ = 189;
+typed_data.Int32x4.YWWW = 253;
+typed_data.Int32x4.ZXXX = 2;
+typed_data.Int32x4.ZXXY = 66;
+typed_data.Int32x4.ZXXZ = 130;
+typed_data.Int32x4.ZXXW = 194;
+typed_data.Int32x4.ZXYX = 18;
+typed_data.Int32x4.ZXYY = 82;
+typed_data.Int32x4.ZXYZ = 146;
+typed_data.Int32x4.ZXYW = 210;
+typed_data.Int32x4.ZXZX = 34;
+typed_data.Int32x4.ZXZY = 98;
+typed_data.Int32x4.ZXZZ = 162;
+typed_data.Int32x4.ZXZW = 226;
+typed_data.Int32x4.ZXWX = 50;
+typed_data.Int32x4.ZXWY = 114;
+typed_data.Int32x4.ZXWZ = 178;
+typed_data.Int32x4.ZXWW = 242;
+typed_data.Int32x4.ZYXX = 6;
+typed_data.Int32x4.ZYXY = 70;
+typed_data.Int32x4.ZYXZ = 134;
+typed_data.Int32x4.ZYXW = 198;
+typed_data.Int32x4.ZYYX = 22;
+typed_data.Int32x4.ZYYY = 86;
+typed_data.Int32x4.ZYYZ = 150;
+typed_data.Int32x4.ZYYW = 214;
+typed_data.Int32x4.ZYZX = 38;
+typed_data.Int32x4.ZYZY = 102;
+typed_data.Int32x4.ZYZZ = 166;
+typed_data.Int32x4.ZYZW = 230;
+typed_data.Int32x4.ZYWX = 54;
+typed_data.Int32x4.ZYWY = 118;
+typed_data.Int32x4.ZYWZ = 182;
+typed_data.Int32x4.ZYWW = 246;
+typed_data.Int32x4.ZZXX = 10;
+typed_data.Int32x4.ZZXY = 74;
+typed_data.Int32x4.ZZXZ = 138;
+typed_data.Int32x4.ZZXW = 202;
+typed_data.Int32x4.ZZYX = 26;
+typed_data.Int32x4.ZZYY = 90;
+typed_data.Int32x4.ZZYZ = 154;
+typed_data.Int32x4.ZZYW = 218;
+typed_data.Int32x4.ZZZX = 42;
+typed_data.Int32x4.ZZZY = 106;
+typed_data.Int32x4.ZZZZ = 170;
+typed_data.Int32x4.ZZZW = 234;
+typed_data.Int32x4.ZZWX = 58;
+typed_data.Int32x4.ZZWY = 122;
+typed_data.Int32x4.ZZWZ = 186;
+typed_data.Int32x4.ZZWW = 250;
+typed_data.Int32x4.ZWXX = 14;
+typed_data.Int32x4.ZWXY = 78;
+typed_data.Int32x4.ZWXZ = 142;
+typed_data.Int32x4.ZWXW = 206;
+typed_data.Int32x4.ZWYX = 30;
+typed_data.Int32x4.ZWYY = 94;
+typed_data.Int32x4.ZWYZ = 158;
+typed_data.Int32x4.ZWYW = 222;
+typed_data.Int32x4.ZWZX = 46;
+typed_data.Int32x4.ZWZY = 110;
+typed_data.Int32x4.ZWZZ = 174;
+typed_data.Int32x4.ZWZW = 238;
+typed_data.Int32x4.ZWWX = 62;
+typed_data.Int32x4.ZWWY = 126;
+typed_data.Int32x4.ZWWZ = 190;
+typed_data.Int32x4.ZWWW = 254;
+typed_data.Int32x4.WXXX = 3;
+typed_data.Int32x4.WXXY = 67;
+typed_data.Int32x4.WXXZ = 131;
+typed_data.Int32x4.WXXW = 195;
+typed_data.Int32x4.WXYX = 19;
+typed_data.Int32x4.WXYY = 83;
+typed_data.Int32x4.WXYZ = 147;
+typed_data.Int32x4.WXYW = 211;
+typed_data.Int32x4.WXZX = 35;
+typed_data.Int32x4.WXZY = 99;
+typed_data.Int32x4.WXZZ = 163;
+typed_data.Int32x4.WXZW = 227;
+typed_data.Int32x4.WXWX = 51;
+typed_data.Int32x4.WXWY = 115;
+typed_data.Int32x4.WXWZ = 179;
+typed_data.Int32x4.WXWW = 243;
+typed_data.Int32x4.WYXX = 7;
+typed_data.Int32x4.WYXY = 71;
+typed_data.Int32x4.WYXZ = 135;
+typed_data.Int32x4.WYXW = 199;
+typed_data.Int32x4.WYYX = 23;
+typed_data.Int32x4.WYYY = 87;
+typed_data.Int32x4.WYYZ = 151;
+typed_data.Int32x4.WYYW = 215;
+typed_data.Int32x4.WYZX = 39;
+typed_data.Int32x4.WYZY = 103;
+typed_data.Int32x4.WYZZ = 167;
+typed_data.Int32x4.WYZW = 231;
+typed_data.Int32x4.WYWX = 55;
+typed_data.Int32x4.WYWY = 119;
+typed_data.Int32x4.WYWZ = 183;
+typed_data.Int32x4.WYWW = 247;
+typed_data.Int32x4.WZXX = 11;
+typed_data.Int32x4.WZXY = 75;
+typed_data.Int32x4.WZXZ = 139;
+typed_data.Int32x4.WZXW = 203;
+typed_data.Int32x4.WZYX = 27;
+typed_data.Int32x4.WZYY = 91;
+typed_data.Int32x4.WZYZ = 155;
+typed_data.Int32x4.WZYW = 219;
+typed_data.Int32x4.WZZX = 43;
+typed_data.Int32x4.WZZY = 107;
+typed_data.Int32x4.WZZZ = 171;
+typed_data.Int32x4.WZZW = 235;
+typed_data.Int32x4.WZWX = 59;
+typed_data.Int32x4.WZWY = 123;
+typed_data.Int32x4.WZWZ = 187;
+typed_data.Int32x4.WZWW = 251;
+typed_data.Int32x4.WWXX = 15;
+typed_data.Int32x4.WWXY = 79;
+typed_data.Int32x4.WWXZ = 143;
+typed_data.Int32x4.WWXW = 207;
+typed_data.Int32x4.WWYX = 31;
+typed_data.Int32x4.WWYY = 95;
+typed_data.Int32x4.WWYZ = 159;
+typed_data.Int32x4.WWYW = 223;
+typed_data.Int32x4.WWZX = 47;
+typed_data.Int32x4.WWZY = 111;
+typed_data.Int32x4.WWZZ = 175;
+typed_data.Int32x4.WWZW = 239;
+typed_data.Int32x4.WWWX = 63;
+typed_data.Int32x4.WWWY = 127;
+typed_data.Int32x4.WWWZ = 191;
+typed_data.Int32x4.WWWW = 255;
+_native_typed_data.NativeInt32x4List = class NativeInt32x4List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Int32x4), _internal.FixedLengthListMixin$(typed_data.Int32x4)) {
+  new(length) {
+    this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(length) * 4);
+  }
+  _externalStorage(storage) {
+    this[_storage] = storage;
+  }
+  _slowFromList(list) {
+    this[_storage] = _native_typed_data.NativeInt32List.new(dart.notNull(list[dartx.length]) * 4);
+    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
+      let e = list[dartx._get](i);
+      this[_storage][dartx._set](i * 4 + 0, e.x);
+      this[_storage][dartx._set](i * 4 + 1, e.y);
+      this[_storage][dartx._set](i * 4 + 2, e.z);
+      this[_storage][dartx._set](i * 4 + 3, e.w);
+    }
+  }
+  get runtimeType() {
+    return dart.wrapType(typed_data.Int32x4List);
+  }
+  static fromList(list) {
+    if (_native_typed_data.NativeInt32x4List.is(list)) {
+      return new _native_typed_data.NativeInt32x4List._externalStorage(_native_typed_data.NativeInt32List.fromList(list[_storage]));
+    } else {
+      return new _native_typed_data.NativeInt32x4List._slowFromList(list);
+    }
+  }
+  get buffer() {
+    return this[_storage][dartx.buffer];
+  }
+  get lengthInBytes() {
+    return this[_storage][dartx.lengthInBytes];
+  }
+  get offsetInBytes() {
+    return this[_storage][dartx.offsetInBytes];
+  }
+  get elementSizeInBytes() {
+    return typed_data.Int32x4List.BYTES_PER_ELEMENT;
+  }
+  get length() {
+    return (dart.notNull(this[_storage][dartx.length]) / 4)[dartx.truncate]();
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _get(index) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    let _x = this[_storage][dartx._get](dart.notNull(index) * 4 + 0);
+    let _y = this[_storage][dartx._get](dart.notNull(index) * 4 + 1);
+    let _z = this[_storage][dartx._get](dart.notNull(index) * 4 + 2);
+    let _w = this[_storage][dartx._get](dart.notNull(index) * 4 + 3);
+    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
+  }
+  _set(index, value) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 0, value.x);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 1, value.y);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 2, value.z);
+    this[_storage][dartx._set](dart.notNull(index) * 4 + 3, value.w);
+    return value;
+  }
+  sublist(start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this.length);
+    return new _native_typed_data.NativeInt32x4List._externalStorage(typed_data.Int32List._check(this[_storage][dartx.sublist](dart.notNull(start) * 4, dart.notNull(end) * 4)));
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_externalStorage');
+dart.defineNamedConstructor(_native_typed_data.NativeInt32x4List, '_slowFromList');
+_native_typed_data.NativeInt32x4List[dart.implements] = () => [typed_data.Int32x4List];
+dart.setSignature(_native_typed_data.NativeInt32x4List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [core.int]),
+    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [typed_data.Int32List]),
+    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32x4List, [ListOfInt32x4()])
+  }),
+  fields: () => ({[_storage]: typed_data.Int32List}),
+  getters: () => ({
+    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
+    lengthInBytes: dart.definiteFunctionType(core.int, []),
+    offsetInBytes: dart.definiteFunctionType(core.int, []),
+    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
+    length: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Int32x4])
+  })
+});
+dart.defineExtensionMembers(_native_typed_data.NativeInt32x4List, [
+  '_get',
+  '_set',
+  'sublist',
+  'buffer',
+  'lengthInBytes',
+  'offsetInBytes',
+  'elementSizeInBytes',
+  'length'
+]);
+typed_data.Float64x2 = class Float64x2 extends core.Object {
+  static new(x, y) {
+    return new _native_typed_data.NativeFloat64x2(x, y);
+  }
+  static splat(v) {
+    return new _native_typed_data.NativeFloat64x2.splat(v);
+  }
+  static zero() {
+    return new _native_typed_data.NativeFloat64x2.zero();
+  }
+  static fromFloat32x4(v) {
+    return new _native_typed_data.NativeFloat64x2.fromFloat32x4(v);
+  }
+};
+dart.setSignature(typed_data.Float64x2, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float64x2, [core.double, core.double]),
+    splat: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
+    zero: dart.definiteFunctionType(typed_data.Float64x2, []),
+    fromFloat32x4: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float32x4])
+  })
+});
+_native_typed_data.NativeFloat64x2List = class NativeFloat64x2List extends dart.mixin(core.Object, collection.ListMixin$(typed_data.Float64x2), _internal.FixedLengthListMixin$(typed_data.Float64x2)) {
+  new(length) {
+    this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(length) * 2);
+  }
+  _externalStorage(storage) {
+    this[_storage] = storage;
+  }
+  _slowFromList(list) {
+    this[_storage] = _native_typed_data.NativeFloat64List.new(dart.notNull(list[dartx.length]) * 2);
+    for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
+      let e = list[dartx._get](i);
+      this[_storage][dartx._set](i * 2 + 0, e.x);
+      this[_storage][dartx._set](i * 2 + 1, e.y);
+    }
+  }
+  static fromList(list) {
+    if (_native_typed_data.NativeFloat64x2List.is(list)) {
+      return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List.fromList(list[_storage]));
+    } else {
+      return new _native_typed_data.NativeFloat64x2List._slowFromList(list);
+    }
+  }
+  get runtimeType() {
+    return dart.wrapType(typed_data.Float64x2List);
+  }
+  get buffer() {
+    return this[_storage][dartx.buffer];
+  }
+  get lengthInBytes() {
+    return this[_storage][dartx.lengthInBytes];
+  }
+  get offsetInBytes() {
+    return this[_storage][dartx.offsetInBytes];
+  }
+  get elementSizeInBytes() {
+    return typed_data.Float64x2List.BYTES_PER_ELEMENT;
+  }
+  get length() {
+    return (dart.notNull(this[_storage][dartx.length]) / 2)[dartx.truncate]();
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _get(index) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    let _x = this[_storage][dartx._get](dart.notNull(index) * 2 + 0);
+    let _y = this[_storage][dartx._get](dart.notNull(index) * 2 + 1);
+    return typed_data.Float64x2.new(_x, _y);
+  }
+  _set(index, value) {
+    _native_typed_data._checkValidIndex(index, this, this.length);
+    this[_storage][dartx._set](dart.notNull(index) * 2 + 0, value.x);
+    this[_storage][dartx._set](dart.notNull(index) * 2 + 1, value.y);
+    return value;
+  }
+  sublist(start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this.length);
+    return new _native_typed_data.NativeFloat64x2List._externalStorage(_native_typed_data.NativeFloat64List._check(this[_storage][dartx.sublist](dart.notNull(start) * 2, dart.notNull(end) * 2)));
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_externalStorage');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2List, '_slowFromList');
+_native_typed_data.NativeFloat64x2List[dart.implements] = () => [typed_data.Float64x2List];
+dart.setSignature(_native_typed_data.NativeFloat64x2List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [core.int]),
+    _externalStorage: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [_native_typed_data.NativeFloat64List]),
+    _slowFromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2List, [ListOfFloat64x2()])
+  }),
+  fields: () => ({[_storage]: _native_typed_data.NativeFloat64List}),
+  getters: () => ({
+    buffer: dart.definiteFunctionType(typed_data.ByteBuffer, []),
+    lengthInBytes: dart.definiteFunctionType(core.int, []),
+    offsetInBytes: dart.definiteFunctionType(core.int, []),
+    elementSizeInBytes: dart.definiteFunctionType(core.int, []),
+    length: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(typed_data.Float64x2, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float64x2])
+  })
+});
+dart.defineExtensionMembers(_native_typed_data.NativeFloat64x2List, [
+  '_get',
+  '_set',
+  'sublist',
+  'buffer',
+  'lengthInBytes',
+  'offsetInBytes',
+  'elementSizeInBytes',
+  'length'
+]);
+const _invalidPosition = Symbol('_invalidPosition');
+const _checkPosition = Symbol('_checkPosition');
+dart.defineExtensionNames([
+  'buffer',
+  'lengthInBytes',
+  'offsetInBytes',
+  'elementSizeInBytes'
+]);
+_native_typed_data.NativeTypedData = class NativeTypedData extends core.Object {
+  get [dartx.buffer]() {
+    return this.buffer;
+  }
+  get [dartx.lengthInBytes]() {
+    return this.byteLength;
+  }
+  get [dartx.offsetInBytes]() {
+    return this.byteOffset;
+  }
+  get [dartx.elementSizeInBytes]() {
+    return this.BYTES_PER_ELEMENT;
+  }
+  [_invalidPosition](position, length, name) {
+    if (!(typeof position == 'number')) {
+      dart.throw(new core.ArgumentError.value(position, name, 'Invalid list position'));
+    } else {
+      dart.throw(new core.RangeError.range(position, 0, length, name));
+    }
+  }
+  [_checkPosition](position, length, name) {
+    if (position >>> 0 !== position || position > dart.notNull(length)) {
+      this[_invalidPosition](position, length, name);
+    }
+  }
+};
+_native_typed_data.NativeTypedData[dart.implements] = () => [typed_data.TypedData];
+dart.setSignature(_native_typed_data.NativeTypedData, {
+  getters: () => ({
+    [dartx.buffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
+    [dartx.lengthInBytes]: dart.definiteFunctionType(core.int, []),
+    [dartx.offsetInBytes]: dart.definiteFunctionType(core.int, []),
+    [dartx.elementSizeInBytes]: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    [_invalidPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
+    [_checkPosition]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String])
+  })
+});
+dart.registerExtension(dart.global.ArrayBufferView, _native_typed_data.NativeTypedData);
+_native_typed_data._checkLength = function(length) {
+  if (!(typeof length == 'number')) dart.throw(new core.ArgumentError(dart.str`Invalid length ${length}`));
+  return core.int._check(length);
+};
+dart.fn(_native_typed_data._checkLength, dynamicToint());
+_native_typed_data._checkViewArguments = function(buffer, offsetInBytes, length) {
+  if (!_native_typed_data.NativeByteBuffer.is(buffer)) {
+    dart.throw(new core.ArgumentError('Invalid view buffer'));
+  }
+  if (!(typeof offsetInBytes == 'number')) {
+    dart.throw(new core.ArgumentError(dart.str`Invalid view offsetInBytes ${offsetInBytes}`));
+  }
+  if (length != null && !(typeof length == 'number')) {
+    dart.throw(new core.ArgumentError(dart.str`Invalid view length ${length}`));
+  }
+};
+dart.fn(_native_typed_data._checkViewArguments, dynamicAnddynamicAnddynamicTovoid());
+_native_typed_data._ensureNativeList = function(list) {
+  if (_interceptors.JSIndexable.is(list)) return list;
+  let result = core.List.new(list[dartx.length]);
+  for (let i = 0; i < dart.notNull(list[dartx.length]); i++) {
+    result[dartx._set](i, list[dartx._get](i));
+  }
+  return result;
+};
+dart.lazyFn(_native_typed_data._ensureNativeList, () => ListToList());
+const _getFloat32 = Symbol('_getFloat32');
+const _getFloat64 = Symbol('_getFloat64');
+const _getInt16 = Symbol('_getInt16');
+const _getInt32 = Symbol('_getInt32');
+const _getUint16 = Symbol('_getUint16');
+const _getUint32 = Symbol('_getUint32');
+const _setFloat32 = Symbol('_setFloat32');
+const _setFloat64 = Symbol('_setFloat64');
+const _setInt16 = Symbol('_setInt16');
+const _setInt32 = Symbol('_setInt32');
+const _setUint16 = Symbol('_setUint16');
+const _setUint32 = Symbol('_setUint32');
+dart.defineExtensionNames([
+  'runtimeType',
+  'elementSizeInBytes',
+  'getFloat32',
+  'getFloat64',
+  'getInt16',
+  'getInt32',
+  'getInt64',
+  'getInt8',
+  'getUint16',
+  'getUint32',
+  'getUint64',
+  'getUint8',
+  'setFloat32',
+  'setFloat64',
+  'setInt16',
+  'setInt32',
+  'setInt64',
+  'setInt8',
+  'setUint16',
+  'setUint32',
+  'setUint64',
+  'setUint8'
+]);
+_native_typed_data.NativeByteData = class NativeByteData extends _native_typed_data.NativeTypedData {
+  static new(length) {
+    return _native_typed_data.NativeByteData._create1(_native_typed_data._checkLength(length));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeByteData._create2(buffer, offsetInBytes) : _native_typed_data.NativeByteData._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.ByteData);
+  }
+  get [dartx.elementSizeInBytes]() {
+    return 1;
+  }
+  [dartx.getFloat32](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getFloat32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getFloat32](...args) {
+    return this.getFloat32.apply(this, args);
+  }
+  [dartx.getFloat64](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getFloat64](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getFloat64](...args) {
+    return this.getFloat64.apply(this, args);
+  }
+  [dartx.getInt16](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getInt16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getInt16](...args) {
+    return this.getInt16.apply(this, args);
+  }
+  [dartx.getInt32](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getInt32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getInt32](...args) {
+    return this.getInt32.apply(this, args);
+  }
+  [dartx.getInt64](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
+  }
+  [dartx.getInt8](...args) {
+    return this.getInt8.apply(this, args);
+  }
+  [dartx.getUint16](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getUint16](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getUint16](...args) {
+    return this.getUint16.apply(this, args);
+  }
+  [dartx.getUint32](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_getUint32](byteOffset, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_getUint32](...args) {
+    return this.getUint32.apply(this, args);
+  }
+  [dartx.getUint64](byteOffset, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
+  }
+  [dartx.getUint8](...args) {
+    return this.getUint8.apply(this, args);
+  }
+  [dartx.setFloat32](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setFloat32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setFloat32](...args) {
+    return this.setFloat32.apply(this, args);
+  }
+  [dartx.setFloat64](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setFloat64](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setFloat64](...args) {
+    return this.setFloat64.apply(this, args);
+  }
+  [dartx.setInt16](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setInt16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setInt16](...args) {
+    return this.setInt16.apply(this, args);
+  }
+  [dartx.setInt32](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setInt32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setInt32](...args) {
+    return this.setInt32.apply(this, args);
+  }
+  [dartx.setInt64](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    dart.throw(new core.UnsupportedError('Int64 accessor not supported by dart2js.'));
+  }
+  [dartx.setInt8](...args) {
+    return this.setInt8.apply(this, args);
+  }
+  [dartx.setUint16](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setUint16](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setUint16](...args) {
+    return this.setUint16.apply(this, args);
+  }
+  [dartx.setUint32](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    return this[_setUint32](byteOffset, value, dart.equals(typed_data.Endianness.LITTLE_ENDIAN, endian));
+  }
+  [_setUint32](...args) {
+    return this.setUint32.apply(this, args);
+  }
+  [dartx.setUint64](byteOffset, value, endian) {
+    if (endian === void 0) endian = typed_data.Endianness.BIG_ENDIAN;
+    dart.throw(new core.UnsupportedError('Uint64 accessor not supported by dart2js.'));
+  }
+  [dartx.setUint8](...args) {
+    return this.setUint8.apply(this, args);
+  }
+  static _create1(arg) {
+    return new DataView(new ArrayBuffer(arg));
+  }
+  static _create2(arg1, arg2) {
+    return new DataView(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new DataView(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeByteData[dart.implements] = () => [typed_data.ByteData];
+dart.setSignature(_native_typed_data.NativeByteData, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeByteData, [core.int]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeByteData, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({
+    [dartx.getFloat32]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
+    [_getFloat32]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
+    [dartx.getFloat64]: dart.definiteFunctionType(core.double, [core.int], [typed_data.Endianness]),
+    [_getFloat64]: dart.definiteFunctionType(core.double, [core.int], [core.bool]),
+    [dartx.getInt16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [_getInt16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
+    [dartx.getInt32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [_getInt32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
+    [dartx.getInt64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [dartx.getInt8]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.getUint16]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [_getUint16]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
+    [dartx.getUint32]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [_getUint32]: dart.definiteFunctionType(core.int, [core.int], [core.bool]),
+    [dartx.getUint64]: dart.definiteFunctionType(core.int, [core.int], [typed_data.Endianness]),
+    [dartx.getUint8]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
+    [_setFloat32]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
+    [dartx.setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [typed_data.Endianness]),
+    [_setFloat64]: dart.definiteFunctionType(dart.void, [core.int, core.num], [core.bool]),
+    [dartx.setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [_setInt16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
+    [dartx.setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [_setInt32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
+    [dartx.setInt64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [dartx.setInt8]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [_setUint16]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
+    [dartx.setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [_setUint32]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.bool]),
+    [dartx.setUint64]: dart.definiteFunctionType(dart.void, [core.int, core.int], [typed_data.Endianness]),
+    [dartx.setUint8]: dart.definiteFunctionType(dart.void, [core.int, core.int])
+  }),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeByteData, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.DataView, _native_typed_data.NativeByteData);
+const _setRangeFast = Symbol('_setRangeFast');
+_native_typed_data.NativeTypedArray = class NativeTypedArray extends _native_typed_data.NativeTypedData {
+  [_setRangeFast](start, end, source, skipCount) {
+    let targetLength = this[dartx.length];
+    this[_checkPosition](start, targetLength, "start");
+    this[_checkPosition](end, targetLength, "end");
+    if (dart.notNull(start) > dart.notNull(end)) dart.throw(new core.RangeError.range(start, 0, end));
+    let count = dart.notNull(end) - dart.notNull(start);
+    if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
+    let sourceLength = source[dartx.length];
+    if (dart.notNull(sourceLength) - dart.notNull(skipCount) < count) {
+      dart.throw(new core.StateError('Not enough elements'));
+    }
+    if (skipCount != 0 || sourceLength != count) {
+      source = source.subarray(skipCount, dart.notNull(skipCount) + count);
+    }
+    this.set(source, start);
+  }
+};
+_native_typed_data.NativeTypedArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior];
+dart.setSignature(_native_typed_data.NativeTypedArray, {
+  methods: () => ({[_setRangeFast]: dart.definiteFunctionType(dart.void, [core.int, core.int, _native_typed_data.NativeTypedArray, core.int])})
+});
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'setRange'
+]);
+_native_typed_data.NativeTypedArrayOfDouble = class NativeTypedArrayOfDouble extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.double), _internal.FixedLengthListMixin$(core.double)) {
+  get length() {
+    return this.length;
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _get(index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  _set(index, value) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    this[index] = value;
+    return value;
+  }
+  setRange(start, end, iterable, skipCount) {
+    if (skipCount === void 0) skipCount = 0;
+    if (_native_typed_data.NativeTypedArrayOfDouble.is(iterable)) {
+      this[_setRangeFast](start, end, iterable, skipCount);
+      return;
+    }
+    super[dartx.setRange](start, end, iterable, skipCount);
+  }
+};
+dart.setSignature(_native_typed_data.NativeTypedArrayOfDouble, {
+  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    _get: dart.definiteFunctionType(core.double, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, core.num])
+  })
+});
+dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfDouble, ['_get', '_set', 'setRange', 'length']);
+dart.defineExtensionNames([
+  'length',
+  '_set',
+  'setRange'
+]);
+_native_typed_data.NativeTypedArrayOfInt = class NativeTypedArrayOfInt extends dart.mixin(_native_typed_data.NativeTypedArray, collection.ListMixin$(core.int), _internal.FixedLengthListMixin$(core.int)) {
+  get length() {
+    return this.length;
+  }
+  set length(value) {
+    super.length = value;
+  }
+  _set(index, value) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    this[index] = value;
+    return value;
+  }
+  setRange(start, end, iterable, skipCount) {
+    if (skipCount === void 0) skipCount = 0;
+    if (_native_typed_data.NativeTypedArrayOfInt.is(iterable)) {
+      this[_setRangeFast](start, end, iterable, skipCount);
+      return;
+    }
+    super[dartx.setRange](start, end, iterable, skipCount);
+  }
+};
+_native_typed_data.NativeTypedArrayOfInt[dart.implements] = () => [ListOfint()];
+dart.setSignature(_native_typed_data.NativeTypedArrayOfInt, {
+  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({_set: dart.definiteFunctionType(dart.void, [core.int, core.int])})
+});
+dart.defineExtensionMembers(_native_typed_data.NativeTypedArrayOfInt, ['_set', 'setRange', 'length']);
+dart.defineExtensionNames([
+  'runtimeType',
+  'sublist'
+]);
+_native_typed_data.NativeFloat32List = class NativeFloat32List extends _native_typed_data.NativeTypedArrayOfDouble {
+  static new(length) {
+    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat32List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeFloat32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat32List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Float32List);
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeFloat32List._create1(source);
+  }
+  static _create1(arg) {
+    return new Float32Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Float32Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Float32Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeFloat32List[dart.implements] = () => [typed_data.Float32List];
+dart.setSignature(_native_typed_data.NativeFloat32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [ListOfdouble()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat32List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Float32Array, _native_typed_data.NativeFloat32List);
+dart.defineExtensionNames([
+  'runtimeType',
+  'sublist'
+]);
+_native_typed_data.NativeFloat64List = class NativeFloat64List extends _native_typed_data.NativeTypedArrayOfDouble {
+  static new(length) {
+    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat64List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeFloat64List._create2(buffer, offsetInBytes) : _native_typed_data.NativeFloat64List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Float64List);
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeFloat64List._create1(source);
+  }
+  static _create1(arg) {
+    return new Float64Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Float64Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Float64Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeFloat64List[dart.implements] = () => [typed_data.Float64List];
+dart.setSignature(_native_typed_data.NativeFloat64List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [ListOfdouble()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeFloat64List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Float64Array, _native_typed_data.NativeFloat64List);
+dart.defineExtensionNames([
+  'runtimeType',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeInt16List = class NativeInt16List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeInt16List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt16List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeInt16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt16List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Int16List);
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeInt16List._create1(source);
+  }
+  static _create1(arg) {
+    return new Int16Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Int16Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Int16Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeInt16List[dart.implements] = () => [typed_data.Int16List];
+dart.setSignature(_native_typed_data.NativeInt16List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [_native_typed_data.NativeByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeInt16List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Int16Array, _native_typed_data.NativeInt16List);
+dart.defineExtensionNames([
+  'runtimeType',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeInt32List = class NativeInt32List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeInt32List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt32List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeInt32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt32List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Int32List);
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeInt32List._create1(source);
+  }
+  static _create1(arg) {
+    return new Int32Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Int32Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Int32Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeInt32List[dart.implements] = () => [typed_data.Int32List];
+dart.setSignature(_native_typed_data.NativeInt32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeInt32List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Int32Array, _native_typed_data.NativeInt32List);
+dart.defineExtensionNames([
+  'runtimeType',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeInt8List = class NativeInt8List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeInt8List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt8List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return _native_typed_data.NativeInt8List._check(length == null ? _native_typed_data.NativeInt8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeInt8List._create3(buffer, offsetInBytes, length));
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Int8List);
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeInt8List._create1(source);
+  }
+  static _create1(arg) {
+    return new Int8Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Int8Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Int8Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeInt8List[dart.implements] = () => [typed_data.Int8List];
+dart.setSignature(_native_typed_data.NativeInt8List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeInt8List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(typed_data.Int8List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Int8Array, _native_typed_data.NativeInt8List);
+dart.defineExtensionNames([
+  'runtimeType',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeUint16List = class NativeUint16List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeUint16List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(list) {
+    return _native_typed_data.NativeUint16List._create1(_native_typed_data._ensureNativeList(list));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeUint16List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint16List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Uint16List);
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeUint16List._create1(source);
+  }
+  static _create1(arg) {
+    return new Uint16Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Uint16Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Uint16Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeUint16List[dart.implements] = () => [typed_data.Uint16List];
+dart.setSignature(_native_typed_data.NativeUint16List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint16List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Uint16Array, _native_typed_data.NativeUint16List);
+dart.defineExtensionNames([
+  'runtimeType',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeUint32List = class NativeUint32List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeUint32List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint32List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeUint32List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint32List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Uint32List);
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeUint32List._create1(source);
+  }
+  static _create1(arg) {
+    return new Uint32Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Uint32Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Uint32Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeUint32List[dart.implements] = () => [typed_data.Uint32List];
+dart.setSignature(_native_typed_data.NativeUint32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint32List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Uint32Array, _native_typed_data.NativeUint32List);
+dart.defineExtensionNames([
+  'runtimeType',
+  'length',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeUint8ClampedList = class NativeUint8ClampedList extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint8ClampedList._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeUint8ClampedList._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8ClampedList._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Uint8ClampedList);
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  set [dartx.length](value) {
+    super[dartx.length] = value;
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeUint8ClampedList._create1(source);
+  }
+  static _create1(arg) {
+    return new Uint8ClampedArray(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Uint8ClampedArray(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Uint8ClampedArray(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeUint8ClampedList[dart.implements] = () => [typed_data.Uint8ClampedList];
+dart.setSignature(_native_typed_data.NativeUint8ClampedList, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8ClampedList, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Uint8ClampedArray, _native_typed_data.NativeUint8ClampedList);
+dart.registerExtension(dart.global.CanvasPixelArray, _native_typed_data.NativeUint8ClampedList);
+dart.defineExtensionNames([
+  'runtimeType',
+  'length',
+  '_get',
+  'sublist'
+]);
+_native_typed_data.NativeUint8List = class NativeUint8List extends _native_typed_data.NativeTypedArrayOfInt {
+  static new(length) {
+    return _native_typed_data.NativeUint8List._create1(_native_typed_data._checkLength(length));
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint8List._create1(_native_typed_data._ensureNativeList(elements));
+  }
+  static view(buffer, offsetInBytes, length) {
+    _native_typed_data._checkViewArguments(buffer, offsetInBytes, length);
+    return length == null ? _native_typed_data.NativeUint8List._create2(buffer, offsetInBytes) : _native_typed_data.NativeUint8List._create3(buffer, offsetInBytes, length);
+  }
+  get [dartx.runtimeType]() {
+    return dart.wrapType(typed_data.Uint8List);
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  set [dartx.length](value) {
+    super[dartx.length] = value;
+  }
+  [dartx._get](index) {
+    _native_typed_data._checkValidIndex(index, this, this[dartx.length]);
+    return this[index];
+  }
+  [dartx.sublist](start, end) {
+    if (end === void 0) end = null;
+    end = _native_typed_data._checkValidRange(start, end, this[dartx.length]);
+    let source = this.subarray(start, end);
+    return _native_typed_data.NativeUint8List._create1(source);
+  }
+  static _create1(arg) {
+    return new Uint8Array(arg);
+  }
+  static _create2(arg1, arg2) {
+    return new Uint8Array(arg1, arg2);
+  }
+  static _create3(arg1, arg2, arg3) {
+    return new Uint8Array(arg1, arg2, arg3);
+  }
+};
+_native_typed_data.NativeUint8List[dart.implements] = () => [typed_data.Uint8List];
+dart.setSignature(_native_typed_data.NativeUint8List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [core.int]),
+    fromList: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [ListOfint()]),
+    view: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [typed_data.ByteBuffer, core.int, core.int])
+  }),
+  methods: () => ({[dartx._get]: dart.definiteFunctionType(core.int, [core.int])}),
+  statics: () => ({
+    _create1: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic]),
+    _create2: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic]),
+    _create3: dart.definiteFunctionType(_native_typed_data.NativeUint8List, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create1', '_create2', '_create3']
+});
+dart.registerExtension(dart.global.Uint8Array, _native_typed_data.NativeUint8List);
+_native_typed_data.NativeFloat32x4 = class NativeFloat32x4 extends core.Object {
+  static _truncate(x) {
+    _native_typed_data.NativeFloat32x4._list[dartx._set](0, core.num._check(x));
+    return _native_typed_data.NativeFloat32x4._list[dartx._get](0);
+  }
+  new(x, y, z, w) {
+    this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
+    this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
+    this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
+    this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
+    if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
+    if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
+    if (!(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
+    if (!(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
+  }
+  splat(v) {
+    NativeFloat32x4.prototype.new.call(this, v, v, v, v);
+  }
+  zero() {
+    NativeFloat32x4.prototype._truncated.call(this, 0.0, 0.0, 0.0, 0.0);
+  }
+  static fromInt32x4Bits(i) {
+    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](0, i.x);
+    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](1, i.y);
+    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](2, i.z);
+    _native_typed_data.NativeFloat32x4._uint32view[dartx._set](3, i.w);
+    return new _native_typed_data.NativeFloat32x4._truncated(_native_typed_data.NativeFloat32x4._list[dartx._get](0), _native_typed_data.NativeFloat32x4._list[dartx._get](1), _native_typed_data.NativeFloat32x4._list[dartx._get](2), _native_typed_data.NativeFloat32x4._list[dartx._get](3));
+  }
+  fromFloat64x2(v) {
+    NativeFloat32x4.prototype._truncated.call(this, core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.x)), core.double._check(_native_typed_data.NativeFloat32x4._truncate(v.y)), 0.0, 0.0);
+  }
+  _doubles(x, y, z, w) {
+    this.x = core.double._check(_native_typed_data.NativeFloat32x4._truncate(x));
+    this.y = core.double._check(_native_typed_data.NativeFloat32x4._truncate(y));
+    this.z = core.double._check(_native_typed_data.NativeFloat32x4._truncate(z));
+    this.w = core.double._check(_native_typed_data.NativeFloat32x4._truncate(w));
+  }
+  _truncated(x, y, z, w) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.w = w;
+  }
+  toString() {
+    return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
+  }
+  ['+'](other) {
+    let _x = dart.notNull(this.x) + dart.notNull(other.x);
+    let _y = dart.notNull(this.y) + dart.notNull(other.y);
+    let _z = dart.notNull(this.z) + dart.notNull(other.z);
+    let _w = dart.notNull(this.w) + dart.notNull(other.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  _negate() {
+    return new _native_typed_data.NativeFloat32x4._truncated(-dart.notNull(this.x), -dart.notNull(this.y), -dart.notNull(this.z), -dart.notNull(this.w));
+  }
+  ['-'](other) {
+    let _x = dart.notNull(this.x) - dart.notNull(other.x);
+    let _y = dart.notNull(this.y) - dart.notNull(other.y);
+    let _z = dart.notNull(this.z) - dart.notNull(other.z);
+    let _w = dart.notNull(this.w) - dart.notNull(other.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  ['*'](other) {
+    let _x = dart.notNull(this.x) * dart.notNull(other.x);
+    let _y = dart.notNull(this.y) * dart.notNull(other.y);
+    let _z = dart.notNull(this.z) * dart.notNull(other.z);
+    let _w = dart.notNull(this.w) * dart.notNull(other.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  ['/'](other) {
+    let _x = dart.notNull(this.x) / dart.notNull(other.x);
+    let _y = dart.notNull(this.y) / dart.notNull(other.y);
+    let _z = dart.notNull(this.z) / dart.notNull(other.z);
+    let _w = dart.notNull(this.w) / dart.notNull(other.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  lessThan(other) {
+    let _cx = dart.notNull(this.x) < dart.notNull(other.x);
+    let _cy = dart.notNull(this.y) < dart.notNull(other.y);
+    let _cz = dart.notNull(this.z) < dart.notNull(other.z);
+    let _cw = dart.notNull(this.w) < dart.notNull(other.w);
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  lessThanOrEqual(other) {
+    let _cx = dart.notNull(this.x) <= dart.notNull(other.x);
+    let _cy = dart.notNull(this.y) <= dart.notNull(other.y);
+    let _cz = dart.notNull(this.z) <= dart.notNull(other.z);
+    let _cw = dart.notNull(this.w) <= dart.notNull(other.w);
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  greaterThan(other) {
+    let _cx = dart.notNull(this.x) > dart.notNull(other.x);
+    let _cy = dart.notNull(this.y) > dart.notNull(other.y);
+    let _cz = dart.notNull(this.z) > dart.notNull(other.z);
+    let _cw = dart.notNull(this.w) > dart.notNull(other.w);
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  greaterThanOrEqual(other) {
+    let _cx = dart.notNull(this.x) >= dart.notNull(other.x);
+    let _cy = dart.notNull(this.y) >= dart.notNull(other.y);
+    let _cz = dart.notNull(this.z) >= dart.notNull(other.z);
+    let _cw = dart.notNull(this.w) >= dart.notNull(other.w);
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  equal(other) {
+    let _cx = this.x == other.x;
+    let _cy = this.y == other.y;
+    let _cz = this.z == other.z;
+    let _cw = this.w == other.w;
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  notEqual(other) {
+    let _cx = this.x != other.x;
+    let _cy = this.y != other.y;
+    let _cz = this.z != other.z;
+    let _cw = this.w != other.w;
+    return new _native_typed_data.NativeInt32x4._truncated(_cx ? -1 : 0, _cy ? -1 : 0, _cz ? -1 : 0, _cw ? -1 : 0);
+  }
+  scale(s) {
+    let _x = dart.notNull(s) * dart.notNull(this.x);
+    let _y = dart.notNull(s) * dart.notNull(this.y);
+    let _z = dart.notNull(s) * dart.notNull(this.z);
+    let _w = dart.notNull(s) * dart.notNull(this.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  abs() {
+    let _x = this.x[dartx.abs]();
+    let _y = this.y[dartx.abs]();
+    let _z = this.z[dartx.abs]();
+    let _w = this.w[dartx.abs]();
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  clamp(lowerLimit, upperLimit) {
+    let _lx = lowerLimit.x;
+    let _ly = lowerLimit.y;
+    let _lz = lowerLimit.z;
+    let _lw = lowerLimit.w;
+    let _ux = upperLimit.x;
+    let _uy = upperLimit.y;
+    let _uz = upperLimit.z;
+    let _uw = upperLimit.w;
+    let _x = this.x;
+    let _y = this.y;
+    let _z = this.z;
+    let _w = this.w;
+    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
+    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
+    _z = dart.notNull(_z) > dart.notNull(_uz) ? _uz : _z;
+    _w = dart.notNull(_w) > dart.notNull(_uw) ? _uw : _w;
+    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
+    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
+    _z = dart.notNull(_z) < dart.notNull(_lz) ? _lz : _z;
+    _w = dart.notNull(_w) < dart.notNull(_lw) ? _lw : _w;
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  get signMask() {
+    let view = _native_typed_data.NativeFloat32x4._uint32view;
+    let mx = null, my = null, mz = null, mw = null;
+    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
+    mx = (dart.notNull(view[dartx._get](0)) & 2147483648) >>> 31;
+    my = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 30;
+    mz = (dart.notNull(view[dartx._get](2)) & 2147483648) >>> 29;
+    mw = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 28;
+    return core.int._check(dart.dsend(dart.dsend(dart.dsend(mx, '|', my), '|', mz), '|', mw));
+  }
+  shuffle(mask) {
+    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
+      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
+    }
+    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
+    let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
+    let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
+    let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
+    let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  shuffleMix(other, mask) {
+    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
+      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
+    }
+    _native_typed_data.NativeFloat32x4._list[dartx._set](0, this.x);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](1, this.y);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](2, this.z);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](3, this.w);
+    let _x = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) & 3);
+    let _y = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](0, other.x);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](1, other.y);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](2, other.z);
+    _native_typed_data.NativeFloat32x4._list[dartx._set](3, other.w);
+    let _z = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
+    let _w = _native_typed_data.NativeFloat32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  withX(newX) {
+    return new _native_typed_data.NativeFloat32x4._truncated(core.double._check(_native_typed_data.NativeFloat32x4._truncate(newX)), this.y, this.z, this.w);
+  }
+  withY(newY) {
+    return new _native_typed_data.NativeFloat32x4._truncated(this.x, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newY)), this.z, this.w);
+  }
+  withZ(newZ) {
+    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newZ)), this.w);
+  }
+  withW(newW) {
+    return new _native_typed_data.NativeFloat32x4._truncated(this.x, this.y, this.z, core.double._check(_native_typed_data.NativeFloat32x4._truncate(newW)));
+  }
+  min(other) {
+    let _x = dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x;
+    let _y = dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y;
+    let _z = dart.notNull(this.z) < dart.notNull(other.z) ? this.z : other.z;
+    let _w = dart.notNull(this.w) < dart.notNull(other.w) ? this.w : other.w;
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  max(other) {
+    let _x = dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x;
+    let _y = dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y;
+    let _z = dart.notNull(this.z) > dart.notNull(other.z) ? this.z : other.z;
+    let _w = dart.notNull(this.w) > dart.notNull(other.w) ? this.w : other.w;
+    return new _native_typed_data.NativeFloat32x4._truncated(_x, _y, _z, _w);
+  }
+  sqrt() {
+    let _x = math.sqrt(this.x);
+    let _y = math.sqrt(this.y);
+    let _z = math.sqrt(this.z);
+    let _w = math.sqrt(this.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  reciprocal() {
+    let _x = 1.0 / dart.notNull(this.x);
+    let _y = 1.0 / dart.notNull(this.y);
+    let _z = 1.0 / dart.notNull(this.z);
+    let _w = 1.0 / dart.notNull(this.w);
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+  reciprocalSqrt() {
+    let _x = math.sqrt(1.0 / dart.notNull(this.x));
+    let _y = math.sqrt(1.0 / dart.notNull(this.y));
+    let _z = math.sqrt(1.0 / dart.notNull(this.z));
+    let _w = math.sqrt(1.0 / dart.notNull(this.w));
+    return new _native_typed_data.NativeFloat32x4._doubles(_x, _y, _z, _w);
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'splat');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'zero');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, 'fromFloat64x2');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_doubles');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat32x4, '_truncated');
+_native_typed_data.NativeFloat32x4[dart.implements] = () => [typed_data.Float32x4];
+dart.setSignature(_native_typed_data.NativeFloat32x4, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
+    splat: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double]),
+    zero: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, []),
+    fromInt32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Int32x4]),
+    fromFloat64x2: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [typed_data.Float64x2]),
+    _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double]),
+    _truncated: dart.definiteFunctionType(_native_typed_data.NativeFloat32x4, [core.double, core.double, core.double, core.double])
+  }),
+  fields: () => ({
+    x: core.double,
+    y: core.double,
+    z: core.double,
+    w: core.double
+  }),
+  getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    '+': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    _negate: dart.definiteFunctionType(typed_data.Float32x4, []),
+    '-': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    '*': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    '/': dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    lessThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    lessThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    greaterThan: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    greaterThanOrEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    equal: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    notEqual: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Float32x4]),
+    scale: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    abs: dart.definiteFunctionType(typed_data.Float32x4, []),
+    clamp: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4]),
+    shuffle: dart.definiteFunctionType(typed_data.Float32x4, [core.int]),
+    shuffleMix: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, core.int]),
+    withX: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    withY: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    withZ: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    withW: dart.definiteFunctionType(typed_data.Float32x4, [core.double]),
+    min: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    max: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4]),
+    sqrt: dart.definiteFunctionType(typed_data.Float32x4, []),
+    reciprocal: dart.definiteFunctionType(typed_data.Float32x4, []),
+    reciprocalSqrt: dart.definiteFunctionType(typed_data.Float32x4, [])
+  }),
+  sfields: () => ({
+    _list: _native_typed_data.NativeFloat32List,
+    _uint32view: typed_data.Uint32List
+  }),
+  statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
+  names: ['_truncate']
+});
+dart.defineLazy(_native_typed_data.NativeFloat32x4, {
+  get _list() {
+    return _native_typed_data.NativeFloat32List.new(4);
+  },
+  get _uint32view() {
+    return _native_typed_data.NativeFloat32x4._list[dartx.buffer][dartx.asUint32List]();
+  }
+});
+_native_typed_data.NativeInt32x4 = class NativeInt32x4 extends core.Object {
+  static _truncate(x) {
+    _native_typed_data.NativeInt32x4._list[dartx._set](0, core.int._check(x));
+    return _native_typed_data.NativeInt32x4._list[dartx._get](0);
+  }
+  new(x, y, z, w) {
+    this.x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
+    this.y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
+    this.z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
+    this.w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
+    if (x != this.x && !(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
+    if (y != this.y && !(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
+    if (z != this.z && !(typeof z == 'number')) dart.throw(new core.ArgumentError(z));
+    if (w != this.w && !(typeof w == 'number')) dart.throw(new core.ArgumentError(w));
+  }
+  bool(x, y, z, w) {
+    this.x = dart.test(x) ? -1 : 0;
+    this.y = dart.test(y) ? -1 : 0;
+    this.z = dart.test(z) ? -1 : 0;
+    this.w = dart.test(w) ? -1 : 0;
+  }
+  static fromFloat32x4Bits(f) {
+    let floatList = _native_typed_data.NativeFloat32x4._list;
+    floatList[dartx._set](0, f.x);
+    floatList[dartx._set](1, f.y);
+    floatList[dartx._set](2, f.z);
+    floatList[dartx._set](3, f.w);
+    let view = _native_typed_data.NativeInt32List._check(floatList[dartx.buffer][dartx.asInt32List]());
+    return new _native_typed_data.NativeInt32x4._truncated(view[dartx._get](0), view[dartx._get](1), view[dartx._get](2), view[dartx._get](3));
+  }
+  _truncated(x, y, z, w) {
+    this.x = x;
+    this.y = y;
+    this.z = z;
+    this.w = w;
+  }
+  toString() {
+    return dart.str`[${this.x}, ${this.y}, ${this.z}, ${this.w}]`;
+  }
+  ['|'](other) {
+    return new _native_typed_data.NativeInt32x4._truncated(this.x | other.x, this.y | other.y, this.z | other.z, this.w | other.w);
+  }
+  ['&'](other) {
+    return new _native_typed_data.NativeInt32x4._truncated(this.x & other.x, this.y & other.y, this.z & other.z, this.w & other.w);
+  }
+  ['^'](other) {
+    return new _native_typed_data.NativeInt32x4._truncated(this.x ^ other.x, this.y ^ other.y, this.z ^ other.z, this.w ^ other.w);
+  }
+  ['+'](other) {
+    return new _native_typed_data.NativeInt32x4._truncated(this.x + other.x | 0, this.y + other.y | 0, this.z + other.z | 0, this.w + other.w | 0);
+  }
+  ['-'](other) {
+    return new _native_typed_data.NativeInt32x4._truncated(this.x - other.x | 0, this.y - other.y | 0, this.z - other.z | 0, this.w - other.w | 0);
+  }
+  _negate() {
+    return new _native_typed_data.NativeInt32x4._truncated(-this.x | 0, -this.y | 0, -this.z | 0, -this.w | 0);
+  }
+  get signMask() {
+    let mx = (dart.notNull(this.x) & 2147483648) >>> 31;
+    let my = (dart.notNull(this.y) & 2147483648) >>> 31;
+    let mz = (dart.notNull(this.z) & 2147483648) >>> 31;
+    let mw = (dart.notNull(this.w) & 2147483648) >>> 31;
+    return (mx | my << 1 | mz << 2 | mw << 3) >>> 0;
+  }
+  shuffle(mask) {
+    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
+      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
+    }
+    _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
+    _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
+    _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
+    _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
+    let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
+    let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
+    let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
+    let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
+    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
+  }
+  shuffleMix(other, mask) {
+    if (dart.notNull(mask) < 0 || dart.notNull(mask) > 255) {
+      dart.throw(new core.RangeError.range(mask, 0, 255, "mask"));
+    }
+    _native_typed_data.NativeInt32x4._list[dartx._set](0, this.x);
+    _native_typed_data.NativeInt32x4._list[dartx._set](1, this.y);
+    _native_typed_data.NativeInt32x4._list[dartx._set](2, this.z);
+    _native_typed_data.NativeInt32x4._list[dartx._set](3, this.w);
+    let _x = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) & 3);
+    let _y = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 2 & 3);
+    _native_typed_data.NativeInt32x4._list[dartx._set](0, other.x);
+    _native_typed_data.NativeInt32x4._list[dartx._set](1, other.y);
+    _native_typed_data.NativeInt32x4._list[dartx._set](2, other.z);
+    _native_typed_data.NativeInt32x4._list[dartx._set](3, other.w);
+    let _z = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 4 & 3);
+    let _w = _native_typed_data.NativeInt32x4._list[dartx._get](dart.notNull(mask) >> 6 & 3);
+    return new _native_typed_data.NativeInt32x4._truncated(_x, _y, _z, _w);
+  }
+  withX(x) {
+    let _x = core.int._check(_native_typed_data.NativeInt32x4._truncate(x));
+    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
+  }
+  withY(y) {
+    let _y = core.int._check(_native_typed_data.NativeInt32x4._truncate(y));
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
+  }
+  withZ(z) {
+    let _z = core.int._check(_native_typed_data.NativeInt32x4._truncate(z));
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
+  }
+  withW(w) {
+    let _w = core.int._check(_native_typed_data.NativeInt32x4._truncate(w));
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
+  }
+  get flagX() {
+    return this.x != 0;
+  }
+  get flagY() {
+    return this.y != 0;
+  }
+  get flagZ() {
+    return this.z != 0;
+  }
+  get flagW() {
+    return this.w != 0;
+  }
+  withFlagX(flagX) {
+    let _x = dart.test(flagX) ? -1 : 0;
+    return new _native_typed_data.NativeInt32x4._truncated(_x, this.y, this.z, this.w);
+  }
+  withFlagY(flagY) {
+    let _y = dart.test(flagY) ? -1 : 0;
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, _y, this.z, this.w);
+  }
+  withFlagZ(flagZ) {
+    let _z = dart.test(flagZ) ? -1 : 0;
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, _z, this.w);
+  }
+  withFlagW(flagW) {
+    let _w = dart.test(flagW) ? -1 : 0;
+    return new _native_typed_data.NativeInt32x4._truncated(this.x, this.y, this.z, _w);
+  }
+  select(trueValue, falseValue) {
+    let floatList = _native_typed_data.NativeFloat32x4._list;
+    let intView = _native_typed_data.NativeFloat32x4._uint32view;
+    floatList[dartx._set](0, trueValue.x);
+    floatList[dartx._set](1, trueValue.y);
+    floatList[dartx._set](2, trueValue.z);
+    floatList[dartx._set](3, trueValue.w);
+    let stx = intView[dartx._get](0);
+    let sty = intView[dartx._get](1);
+    let stz = intView[dartx._get](2);
+    let stw = intView[dartx._get](3);
+    floatList[dartx._set](0, falseValue.x);
+    floatList[dartx._set](1, falseValue.y);
+    floatList[dartx._set](2, falseValue.z);
+    floatList[dartx._set](3, falseValue.w);
+    let sfx = intView[dartx._get](0);
+    let sfy = intView[dartx._get](1);
+    let sfz = intView[dartx._get](2);
+    let sfw = intView[dartx._get](3);
+    let _x = (dart.notNull(this.x) & dart.notNull(stx) | ~dart.notNull(this.x) & dart.notNull(sfx)) >>> 0;
+    let _y = (dart.notNull(this.y) & dart.notNull(sty) | ~dart.notNull(this.y) & dart.notNull(sfy)) >>> 0;
+    let _z = (dart.notNull(this.z) & dart.notNull(stz) | ~dart.notNull(this.z) & dart.notNull(sfz)) >>> 0;
+    let _w = (dart.notNull(this.w) & dart.notNull(stw) | ~dart.notNull(this.w) & dart.notNull(sfw)) >>> 0;
+    intView[dartx._set](0, _x);
+    intView[dartx._set](1, _y);
+    intView[dartx._set](2, _z);
+    intView[dartx._set](3, _w);
+    return new _native_typed_data.NativeFloat32x4._truncated(floatList[dartx._get](0), floatList[dartx._get](1), floatList[dartx._get](2), floatList[dartx._get](3));
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, 'bool');
+dart.defineNamedConstructor(_native_typed_data.NativeInt32x4, '_truncated');
+_native_typed_data.NativeInt32x4[dart.implements] = () => [typed_data.Int32x4];
+dart.setSignature(_native_typed_data.NativeInt32x4, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int]),
+    bool: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.bool, core.bool, core.bool, core.bool]),
+    fromFloat32x4Bits: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [typed_data.Float32x4]),
+    _truncated: dart.definiteFunctionType(_native_typed_data.NativeInt32x4, [core.int, core.int, core.int, core.int])
+  }),
+  fields: () => ({
+    x: core.int,
+    y: core.int,
+    z: core.int,
+    w: core.int
+  }),
+  getters: () => ({
+    signMask: dart.definiteFunctionType(core.int, []),
+    flagX: dart.definiteFunctionType(core.bool, []),
+    flagY: dart.definiteFunctionType(core.bool, []),
+    flagZ: dart.definiteFunctionType(core.bool, []),
+    flagW: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    '|': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
+    '&': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
+    '^': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
+    '+': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
+    '-': dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4]),
+    _negate: dart.definiteFunctionType(typed_data.Int32x4, []),
+    shuffle: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    shuffleMix: dart.definiteFunctionType(typed_data.Int32x4, [typed_data.Int32x4, core.int]),
+    withX: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    withY: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    withZ: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    withW: dart.definiteFunctionType(typed_data.Int32x4, [core.int]),
+    withFlagX: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
+    withFlagY: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
+    withFlagZ: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
+    withFlagW: dart.definiteFunctionType(typed_data.Int32x4, [core.bool]),
+    select: dart.definiteFunctionType(typed_data.Float32x4, [typed_data.Float32x4, typed_data.Float32x4])
+  }),
+  sfields: () => ({_list: _native_typed_data.NativeInt32List}),
+  statics: () => ({_truncate: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
+  names: ['_truncate']
+});
+dart.defineLazy(_native_typed_data.NativeInt32x4, {
+  get _list() {
+    return _native_typed_data.NativeInt32List.new(4);
+  }
+});
+_native_typed_data.NativeFloat64x2 = class NativeFloat64x2 extends core.Object {
+  new(x, y) {
+    this.x = x;
+    this.y = y;
+    if (!(typeof this.x == 'number')) dart.throw(new core.ArgumentError(this.x));
+    if (!(typeof this.y == 'number')) dart.throw(new core.ArgumentError(this.y));
+  }
+  splat(v) {
+    NativeFloat64x2.prototype.new.call(this, v, v);
+  }
+  zero() {
+    NativeFloat64x2.prototype.splat.call(this, 0.0);
+  }
+  fromFloat32x4(v) {
+    NativeFloat64x2.prototype.new.call(this, v.x, v.y);
+  }
+  _doubles(x, y) {
+    this.x = x;
+    this.y = y;
+  }
+  toString() {
+    return dart.str`[${this.x}, ${this.y}]`;
+  }
+  ['+'](other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
+  }
+  _negate() {
+    return new _native_typed_data.NativeFloat64x2._doubles(-dart.notNull(this.x), -dart.notNull(this.y));
+  }
+  ['-'](other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
+  }
+  ['*'](other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(other.x), dart.notNull(this.y) * dart.notNull(other.y));
+  }
+  ['/'](other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) / dart.notNull(other.x), dart.notNull(this.y) / dart.notNull(other.y));
+  }
+  scale(s) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) * dart.notNull(s), dart.notNull(this.y) * dart.notNull(s));
+  }
+  abs() {
+    return new _native_typed_data.NativeFloat64x2._doubles(this.x[dartx.abs](), this.y[dartx.abs]());
+  }
+  clamp(lowerLimit, upperLimit) {
+    let _lx = lowerLimit.x;
+    let _ly = lowerLimit.y;
+    let _ux = upperLimit.x;
+    let _uy = upperLimit.y;
+    let _x = this.x;
+    let _y = this.y;
+    _x = dart.notNull(_x) > dart.notNull(_ux) ? _ux : _x;
+    _y = dart.notNull(_y) > dart.notNull(_uy) ? _uy : _y;
+    _x = dart.notNull(_x) < dart.notNull(_lx) ? _lx : _x;
+    _y = dart.notNull(_y) < dart.notNull(_ly) ? _ly : _y;
+    return new _native_typed_data.NativeFloat64x2._doubles(_x, _y);
+  }
+  get signMask() {
+    let view = _native_typed_data.NativeFloat64x2._uint32View;
+    _native_typed_data.NativeFloat64x2._list[dartx._set](0, this.x);
+    _native_typed_data.NativeFloat64x2._list[dartx._set](1, this.y);
+    let mx = (dart.notNull(view[dartx._get](1)) & 2147483648) >>> 31;
+    let my = (dart.notNull(view[dartx._get](3)) & 2147483648) >>> 31;
+    return (mx | my << 1) >>> 0;
+  }
+  withX(x) {
+    if (!(typeof x == 'number')) dart.throw(new core.ArgumentError(x));
+    return new _native_typed_data.NativeFloat64x2._doubles(x, this.y);
+  }
+  withY(y) {
+    if (!(typeof y == 'number')) dart.throw(new core.ArgumentError(y));
+    return new _native_typed_data.NativeFloat64x2._doubles(this.x, y);
+  }
+  min(other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) < dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) < dart.notNull(other.y) ? this.y : other.y);
+  }
+  max(other) {
+    return new _native_typed_data.NativeFloat64x2._doubles(dart.notNull(this.x) > dart.notNull(other.x) ? this.x : other.x, dart.notNull(this.y) > dart.notNull(other.y) ? this.y : other.y);
+  }
+  sqrt() {
+    return new _native_typed_data.NativeFloat64x2._doubles(math.sqrt(this.x), math.sqrt(this.y));
+  }
+};
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'splat');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'zero');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, 'fromFloat32x4');
+dart.defineNamedConstructor(_native_typed_data.NativeFloat64x2, '_doubles');
+_native_typed_data.NativeFloat64x2[dart.implements] = () => [typed_data.Float64x2];
+dart.setSignature(_native_typed_data.NativeFloat64x2, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double]),
+    splat: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double]),
+    zero: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, []),
+    fromFloat32x4: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [typed_data.Float32x4]),
+    _doubles: dart.definiteFunctionType(_native_typed_data.NativeFloat64x2, [core.double, core.double])
+  }),
+  fields: () => ({
+    x: core.double,
+    y: core.double
+  }),
+  getters: () => ({signMask: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    '+': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    _negate: dart.definiteFunctionType(typed_data.Float64x2, []),
+    '-': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    '*': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    '/': dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    scale: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
+    abs: dart.definiteFunctionType(typed_data.Float64x2, []),
+    clamp: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2, typed_data.Float64x2]),
+    withX: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
+    withY: dart.definiteFunctionType(typed_data.Float64x2, [core.double]),
+    min: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    max: dart.definiteFunctionType(typed_data.Float64x2, [typed_data.Float64x2]),
+    sqrt: dart.definiteFunctionType(typed_data.Float64x2, [])
+  }),
+  sfields: () => ({
+    _list: _native_typed_data.NativeFloat64List,
+    _uint32View: _native_typed_data.NativeUint32List
+  })
+});
+dart.defineLazy(_native_typed_data.NativeFloat64x2, {
+  get _list() {
+    return _native_typed_data.NativeFloat64List.new(2);
+  },
+  set _list(_) {},
+  get _uint32View() {
+    return _native_typed_data.NativeUint32List._check(_native_typed_data.NativeFloat64x2._list[dartx.buffer][dartx.asUint32List]());
+  },
+  set _uint32View(_) {}
+});
+_native_typed_data._isInvalidArrayIndex = function(index) {
+  return index >>> 0 !== index;
+};
+dart.lazyFn(_native_typed_data._isInvalidArrayIndex, () => intTobool());
+_native_typed_data._checkValidIndex = function(index, list, length) {
+  if (dart.test(_native_typed_data._isInvalidArrayIndex(index)) || index >= dart.notNull(length)) {
+    dart.throw(_js_helper.diagnoseIndexError(list, index));
+  }
+};
+dart.lazyFn(_native_typed_data._checkValidIndex, () => intAndListAndintTovoid());
+_native_typed_data._checkValidRange = function(start, end, length) {
+  if (dart.test(_native_typed_data._isInvalidArrayIndex(start)) || (end == null ? dart.notNull(start) > dart.notNull(length) : dart.test(_native_typed_data._isInvalidArrayIndex(end)) || dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length))) {
+    dart.throw(_js_helper.diagnoseRangeError(start, end, length));
+  }
+  if (end == null) return length;
+  return end;
+};
+dart.fn(_native_typed_data._checkValidRange, intAndintAndintToint());
+async._Callback = dart.typedef('_Callback', () => dart.functionType(dart.void, []));
+async._TakeCallback = dart.typedef('_TakeCallback', () => dart.functionType(dart.void, [async._Callback]));
+async._invokeErrorHandler = function(errorHandler, error, stackTrace) {
+  if (async.ZoneBinaryCallback.is(errorHandler)) {
+    return dart.dcall(errorHandler, error, stackTrace);
+  } else {
+    let unaryErrorHandler = async.ZoneUnaryCallback._check(errorHandler);
+    return dart.dcall(unaryErrorHandler, error);
+  }
+};
+dart.lazyFn(async._invokeErrorHandler, () => FunctionAndObjectAndStackTraceTodynamic());
+async._registerErrorHandler = function(R) {
+  return (errorHandler, zone) => {
+    if (async.ZoneBinaryCallback.is(errorHandler)) {
+      return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
+    } else {
+      return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
+    }
+  };
+};
+dart.lazyFn(async._registerErrorHandler, () => FunctionAndZoneToFunction());
+async.AsyncError = class AsyncError extends core.Object {
+  new(error, stackTrace) {
+    this.error = error;
+    this.stackTrace = stackTrace;
+  }
+  toString() {
+    return dart.str`${this.error}`;
+  }
+};
+async.AsyncError[dart.implements] = () => [core.Error];
+dart.setSignature(async.AsyncError, {
+  constructors: () => ({new: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace])}),
+  fields: () => ({
+    error: core.Object,
+    stackTrace: core.StackTrace
+  })
+});
+async._UncaughtAsyncError = class _UncaughtAsyncError extends async.AsyncError {
+  new(error, stackTrace) {
+    super.new(error, async._UncaughtAsyncError._getBestStackTrace(error, stackTrace));
+  }
+  static _getBestStackTrace(error, stackTrace) {
+    if (stackTrace != null) return stackTrace;
+    if (core.Error.is(error)) {
+      return error.stackTrace;
+    }
+    return null;
+  }
+  toString() {
+    let result = dart.str`Uncaught Error: ${this.error}`;
+    if (this.stackTrace != null) {
+      result = result + dart.str`\nStack Trace:\n${this.stackTrace}`;
+    }
+    return result;
+  }
+};
+dart.setSignature(async._UncaughtAsyncError, {
+  constructors: () => ({new: dart.definiteFunctionType(async._UncaughtAsyncError, [dart.dynamic, core.StackTrace])}),
+  statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
+  names: ['_getBestStackTrace']
+});
+const _controller$ = Symbol('_controller');
+const _subscribe = Symbol('_subscribe');
+const _createSubscription = Symbol('_createSubscription');
+const _onListen = Symbol('_onListen');
+async._StreamImpl$ = dart.generic(T => {
+  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _StreamImpl extends async.Stream$(T) {
     new() {
       super.new();
     }
-    decodeStream(byteStream) {
-      return byteStream.transform(core.String)(this.decoder).fold(dart.dynamic)(new core.StringBuffer(), dart.fn((buffer, string) => ((() => {
-        dart.dsend(buffer, 'write', string);
-        return buffer;
-      })()), dynamicAndStringTodynamic())).then(core.String)(dart.fn(buffer => dart.toString(buffer), dynamicToString()));
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      cancelOnError = core.identical(true, cancelOnError);
+      let subscription = this[_createSubscription](onData, onError, onDone, cancelOnError);
+      this[_onListen](subscription);
+      return subscription;
     }
-    static getByName(name) {
-      if (name == null) return null;
-      name = name[dartx.toLowerCase]();
-      return convert.Encoding._nameToEncoding[dartx._get](name);
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
     }
-  };
-  dart.addSimpleTypeTests(convert.Encoding);
-  dart.setSignature(convert.Encoding, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Encoding, [])}),
-    methods: () => ({decodeStream: dart.definiteFunctionType(async.Future$(core.String), [StreamOfListOfint()])}),
-    sfields: () => ({_nameToEncoding: MapOfString$Encoding()}),
-    statics: () => ({getByName: dart.definiteFunctionType(convert.Encoding, [core.String])}),
-    names: ['getByName']
+    [_onListen](subscription) {}
+  }
+  dart.setSignature(_StreamImpl, {
+    methods: () => ({
+      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+      [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
+      [_onListen]: dart.definiteFunctionType(dart.void, [async.StreamSubscription])
+    })
   });
-  dart.defineLazy(convert.Encoding, {
-    get _nameToEncoding() {
-      return dart.map({"iso_8859-1:1987": convert.LATIN1, "iso-ir-100": convert.LATIN1, "iso_8859-1": convert.LATIN1, "iso-8859-1": convert.LATIN1, latin1: convert.LATIN1, l1: convert.LATIN1, ibm819: convert.LATIN1, cp819: convert.LATIN1, csisolatin1: convert.LATIN1, "iso-ir-6": convert.ASCII, "ansi_x3.4-1968": convert.ASCII, "ansi_x3.4-1986": convert.ASCII, "iso_646.irv:1991": convert.ASCII, "iso646-us": convert.ASCII, "us-ascii": convert.ASCII, us: convert.ASCII, ibm367: convert.ASCII, cp367: convert.ASCII, csascii: convert.ASCII, ascii: convert.ASCII, csutf8: convert.UTF8, "utf-8": convert.UTF8}, core.String, convert.Encoding);
-    },
-    set _nameToEncoding(_) {}
-  });
-  convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
-    new(opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
-      this[_allowInvalid] = allowInvalid;
+  return _StreamImpl;
+});
+async._StreamImpl = _StreamImpl();
+async._ControllerStream$ = dart.generic(T => {
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  class _ControllerStream extends async._StreamImpl$(T) {
+    new(controller) {
+      this[_controller$] = controller;
       super.new();
     }
-    get name() {
-      return "us-ascii";
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
     }
-    decode(bytes, opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
-      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
-      if (dart.test(allowInvalid)) {
-        return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
-      } else {
-        return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
-      }
+    get hashCode() {
+      return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
     }
-    get encoder() {
-      return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
+    ['=='](other) {
+      if (core.identical(this, other)) return true;
+      if (!async._ControllerStream.is(other)) return false;
+      let otherStream = async._ControllerStream._check(other);
+      return core.identical(otherStream[_controller$], this[_controller$]);
     }
-    get decoder() {
-      return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
-    }
-  };
-  dart.setSignature(convert.AsciiCodec, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiCodec, [], {allowInvalid: core.bool})}),
-    fields: () => ({[_allowInvalid]: core.bool}),
-    getters: () => ({
-      name: dart.definiteFunctionType(core.String, []),
-      encoder: dart.definiteFunctionType(convert.AsciiEncoder, []),
-      decoder: dart.definiteFunctionType(convert.AsciiDecoder, [])
-    }),
-    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
+  }
+  dart.setSignature(_ControllerStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
+    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
+    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
   });
-  convert.ASCII = dart.const(new convert.AsciiCodec());
-  convert._ASCII_MASK = 127;
-  const _subsetMask = Symbol('_subsetMask');
-  convert.Converter$ = dart.generic((S, T) => {
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let _ConverterStreamEventSinkOfS$dynamic = () => (_ConverterStreamEventSinkOfS$dynamic = dart.constFn(convert._ConverterStreamEventSink$(S, dart.dynamic)))();
-    let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
-    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let EventSinkTo_ConverterStreamEventSinkOfS$dynamic = () => (EventSinkTo_ConverterStreamEventSinkOfS$dynamic = dart.constFn(dart.definiteFunctionType(_ConverterStreamEventSinkOfS$dynamic(), [async.EventSink])))();
-    class Converter extends core.Object {
-      new() {
-      }
-      fuse(TT) {
-        return other => {
-          convert.Converter$(T, TT)._check(other);
-          return new (convert._FusedConverter$(S, T, TT))(this, other);
-        };
-      }
-      startChunkedConversion(sink) {
-        SinkOfT()._check(sink);
-        dart.throw(new core.UnsupportedError(dart.str`This converter does not support chunked conversions: ${this}`));
-      }
-      bind(stream) {
-        StreamOfS()._check(stream);
-        return StreamOfT().eventTransformed(stream, dart.fn(sink => new (_ConverterStreamEventSinkOfS$dynamic())(this, sink), EventSinkTo_ConverterStreamEventSinkOfS$dynamic()));
-      }
+  return _ControllerStream;
+});
+async._ControllerStream = _ControllerStream();
+async._BroadcastStream$ = dart.generic(T => {
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  class _BroadcastStream extends async._ControllerStream$(T) {
+    new(controller) {
+      super.new(controller);
     }
-    dart.addTypeTests(Converter);
-    Converter[dart.implements] = () => [StreamTransformerOfS$T()];
-    dart.setSignature(Converter, {
-      constructors: () => ({new: dart.definiteFunctionType(convert.Converter$(S, T), [])}),
-      methods: () => ({
-        fuse: dart.definiteFunctionType(TT => [convert.Converter$(S, TT), [convert.Converter$(T, TT)]]),
-        startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()]),
-        bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])
-      })
-    });
-    return Converter;
+    get isBroadcast() {
+      return true;
+    }
+  }
+  dart.setSignature(_BroadcastStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStream$(T), [_StreamControllerLifecycleOfT()])})
   });
-  convert.Converter = Converter();
-  convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
-    new(subsetMask) {
-      this[_subsetMask] = subsetMask;
-      super.new();
+  return _BroadcastStream;
+});
+async._BroadcastStream = _BroadcastStream();
+const _eventState = Symbol('_eventState');
+const _next$ = Symbol('_next');
+const _previous$ = Symbol('_previous');
+const _expectsEvent = Symbol('_expectsEvent');
+const _toggleEventId = Symbol('_toggleEventId');
+const _isFiring = Symbol('_isFiring');
+const _setRemoveAfterFiring = Symbol('_setRemoveAfterFiring');
+const _removeAfterFiring = Symbol('_removeAfterFiring');
+const _onPause = Symbol('_onPause');
+const _onResume = Symbol('_onResume');
+const _recordCancel = Symbol('_recordCancel');
+const _onCancel = Symbol('_onCancel');
+const _recordPause = Symbol('_recordPause');
+const _recordResume = Symbol('_recordResume');
+const _zone = Symbol('_zone');
+const _state = Symbol('_state');
+const _onData = Symbol('_onData');
+const _onError = Symbol('_onError');
+const _onDone = Symbol('_onDone');
+const _cancelFuture = Symbol('_cancelFuture');
+const _pending = Symbol('_pending');
+const _setPendingEvents = Symbol('_setPendingEvents');
+const _isCanceled = Symbol('_isCanceled');
+const _isPaused = Symbol('_isPaused');
+const _isInputPaused = Symbol('_isInputPaused');
+const _inCallback = Symbol('_inCallback');
+const _guardCallback = Symbol('_guardCallback');
+const _decrementPauseCount = Symbol('_decrementPauseCount');
+const _hasPending = Symbol('_hasPending');
+const _mayResumeInput = Symbol('_mayResumeInput');
+const _cancel = Symbol('_cancel');
+const _isClosed$ = Symbol('_isClosed');
+const _waitsForCancel = Symbol('_waitsForCancel');
+const _canFire = Symbol('_canFire');
+const _cancelOnError = Symbol('_cancelOnError');
+const _incrementPauseCount = Symbol('_incrementPauseCount');
+const _sendData = Symbol('_sendData');
+const _addPending = Symbol('_addPending');
+const _sendError = Symbol('_sendError');
+const _sendDone = Symbol('_sendDone');
+let const$5;
+const _close$ = Symbol('_close');
+const _checkState = Symbol('_checkState');
+async._BufferingStreamSubscription$ = dart.generic(T => {
+  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
+  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
+  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _BufferingStreamSubscription extends core.Object {
+    new(onData, onError, onDone, cancelOnError) {
+      this[_zone] = async.Zone.current;
+      this[_state] = dart.test(cancelOnError) ? async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR : 0;
+      this[_onData] = null;
+      this[_onError] = null;
+      this[_onDone] = null;
+      this[_cancelFuture] = null;
+      this[_pending] = null;
+      this.onData(onData);
+      this.onError(onError);
+      this.onDone(onDone);
     }
-    convert(string, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let stringLength = string[dartx.length];
-      core.RangeError.checkValidRange(start, end, stringLength);
-      if (end == null) end = stringLength;
-      let length = dart.notNull(end) - dart.notNull(start);
-      let result = typed_data.Uint8List.new(length);
-      for (let i = 0; i < length; i++) {
-        let codeUnit = string[dartx.codeUnitAt](dart.notNull(start) + i);
-        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
-          dart.throw(new core.ArgumentError("String contains invalid characters."));
+    [_setPendingEvents](pendingEvents) {
+      _PendingEventsOfT()._check(pendingEvents);
+      dart.assert(this[_pending] == null);
+      if (pendingEvents == null) return;
+      this[_pending] = pendingEvents;
+      if (!dart.test(pendingEvents.isEmpty)) {
+        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
+        this[_pending].schedule(this);
+      }
+    }
+    onData(handleData) {
+      if (handleData == null) handleData = async._nullDataHandler;
+      this[_onData] = this[_zone].registerUnaryCallback(dart.dynamic, T)(handleData);
+    }
+    onError(handleError) {
+      if (handleError == null) handleError = async._nullErrorHandler;
+      this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
+    }
+    onDone(handleDone) {
+      if (handleDone == null) handleDone = async._nullDoneHandler;
+      this[_onDone] = this[_zone].registerCallback(dart.void)(handleDone);
+    }
+    pause(resumeSignal) {
+      if (resumeSignal === void 0) resumeSignal = null;
+      if (dart.test(this[_isCanceled])) return;
+      let wasPaused = this[_isPaused];
+      let wasInputPaused = this[_isInputPaused];
+      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
+      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
+      if (!dart.test(wasPaused) && this[_pending] != null) this[_pending].cancelSchedule();
+      if (!dart.test(wasInputPaused) && !dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onPause));
+    }
+    resume() {
+      if (dart.test(this[_isCanceled])) return;
+      if (dart.test(this[_isPaused])) {
+        this[_decrementPauseCount]();
+        if (!dart.test(this[_isPaused])) {
+          if (dart.test(this[_hasPending]) && !dart.test(this[_pending].isEmpty)) {
+            this[_pending].schedule(this);
+          } else {
+            dart.assert(this[_mayResumeInput]);
+            this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
+            if (!dart.test(this[_inCallback])) this[_guardCallback](dart.bind(this, _onResume));
+          }
         }
-        result[dartx._set](i, codeUnit);
+      }
+    }
+    cancel() {
+      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
+      if (dart.test(this[_isCanceled])) return this[_cancelFuture];
+      this[_cancel]();
+      return this[_cancelFuture];
+    }
+    asFuture(E) {
+      return futureValue => {
+        if (futureValue === void 0) futureValue = null;
+        let result = new (async._Future$(E))();
+        this[_onDone] = dart.fn(() => {
+          result[_complete](futureValue);
+        }, VoidToNull());
+        this[_onError] = dart.fn((error, stackTrace) => {
+          this.cancel();
+          result[_completeError](error, core.StackTrace._check(stackTrace));
+        }, dynamicAnddynamicToNull());
+        return result;
+      };
+    }
+    get [_isInputPaused]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
+    }
+    get [_isClosed$]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
+    }
+    get [_isCanceled]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCELED) != 0;
+    }
+    get [_waitsForCancel]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) != 0;
+    }
+    get [_inCallback]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_IN_CALLBACK) != 0;
+    }
+    get [_hasPending]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_HAS_PENDING) != 0;
+    }
+    get [_isPaused]() {
+      return dart.notNull(this[_state]) >= async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
+    }
+    get [_canFire]() {
+      return dart.notNull(this[_state]) < async._BufferingStreamSubscription._STATE_IN_CALLBACK;
+    }
+    get [_mayResumeInput]() {
+      return !dart.test(this[_isPaused]) && (this[_pending] == null || dart.test(this[_pending].isEmpty));
+    }
+    get [_cancelOnError]() {
+      return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR) != 0;
+    }
+    get isPaused() {
+      return this[_isPaused];
+    }
+    [_cancel]() {
+      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED) >>> 0;
+      if (dart.test(this[_hasPending])) {
+        this[_pending].cancelSchedule();
+      }
+      if (!dart.test(this[_inCallback])) this[_pending] = null;
+      this[_cancelFuture] = this[_onCancel]();
+    }
+    [_incrementPauseCount]() {
+      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
+    }
+    [_decrementPauseCount]() {
+      dart.assert(this[_isPaused]);
+      this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
+    }
+    [_add$](data) {
+      T._check(data);
+      dart.assert(!dart.test(this[_isClosed$]));
+      if (dart.test(this[_isCanceled])) return;
+      if (dart.test(this[_canFire])) {
+        this[_sendData](data);
+      } else {
+        this[_addPending](new (_DelayedDataOfT())(data));
+      }
+    }
+    [_addError](error, stackTrace) {
+      if (dart.test(this[_isCanceled])) return;
+      if (dart.test(this[_canFire])) {
+        this[_sendError](error, stackTrace);
+      } else {
+        this[_addPending](new async._DelayedError(error, stackTrace));
+      }
+    }
+    [_close$]() {
+      dart.assert(!dart.test(this[_isClosed$]));
+      if (dart.test(this[_isCanceled])) return;
+      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
+      if (dart.test(this[_canFire])) {
+        this[_sendDone]();
+      } else {
+        this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
+      }
+    }
+    [_onPause]() {
+      dart.assert(this[_isInputPaused]);
+    }
+    [_onResume]() {
+      dart.assert(!dart.test(this[_isInputPaused]));
+    }
+    [_onCancel]() {
+      dart.assert(this[_isCanceled]);
+      return null;
+    }
+    [_addPending](event) {
+      let pending = _StreamImplEventsOfT()._check(this[_pending]);
+      if (this[_pending] == null) {
+        pending = this[_pending] = new (_StreamImplEventsOfT())();
+      }
+      pending.add(event);
+      if (!dart.test(this[_hasPending])) {
+        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
+        if (!dart.test(this[_isPaused])) {
+          this[_pending].schedule(this);
+        }
+      }
+    }
+    [_sendData](data) {
+      T._check(data);
+      dart.assert(!dart.test(this[_isCanceled]));
+      dart.assert(!dart.test(this[_isPaused]));
+      dart.assert(!dart.test(this[_inCallback]));
+      let wasInputPaused = this[_isInputPaused];
+      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      this[_zone].runUnaryGuarded(dart.void, T)(this[_onData], data);
+      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      this[_checkState](wasInputPaused);
+    }
+    [_sendError](error, stackTrace) {
+      dart.assert(!dart.test(this[_isCanceled]));
+      dart.assert(!dart.test(this[_isPaused]));
+      dart.assert(!dart.test(this[_inCallback]));
+      let wasInputPaused = this[_isInputPaused];
+      const sendError = (function() {
+        if (dart.test(this[_isCanceled]) && !dart.test(this[_waitsForCancel])) return;
+        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+        if (ZoneBinaryCallbackOfdynamic$Object$StackTrace().is(this[_onError])) {
+          let errorCallback = ZoneBinaryCallbackOfdynamic$Object$StackTrace().as(this[_onError]);
+          this[_zone].runBinaryGuarded(dart.dynamic, core.Object, core.StackTrace)(errorCallback, error, stackTrace);
+        } else {
+          this[_zone].runUnaryGuarded(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(this[_onError]), error);
+        }
+        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      }).bind(this);
+      dart.fn(sendError, VoidTovoid$());
+      if (dart.test(this[_cancelOnError])) {
+        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
+        this[_cancel]();
+        if (async.Future.is(this[_cancelFuture])) {
+          this[_cancelFuture].whenComplete(sendError);
+        } else {
+          sendError();
+        }
+      } else {
+        sendError();
+        this[_checkState](wasInputPaused);
+      }
+    }
+    [_sendDone]() {
+      dart.assert(!dart.test(this[_isCanceled]));
+      dart.assert(!dart.test(this[_isPaused]));
+      dart.assert(!dart.test(this[_inCallback]));
+      const sendDone = (function() {
+        if (!dart.test(this[_waitsForCancel])) return;
+        this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CANCELED | async._BufferingStreamSubscription._STATE_CLOSED | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+        this[_zone].runGuarded(dart.void)(this[_onDone]);
+        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      }).bind(this);
+      dart.fn(sendDone, VoidTovoid$());
+      this[_cancel]();
+      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
+      if (async.Future.is(this[_cancelFuture])) {
+        this[_cancelFuture].whenComplete(sendDone);
+      } else {
+        sendDone();
+      }
+    }
+    [_guardCallback](callback) {
+      dart.assert(!dart.test(this[_inCallback]));
+      let wasInputPaused = this[_isInputPaused];
+      this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      callback();
+      this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+      this[_checkState](wasInputPaused);
+    }
+    [_checkState](wasInputPaused) {
+      dart.assert(!dart.test(this[_inCallback]));
+      if (dart.test(this[_hasPending]) && dart.test(this[_pending].isEmpty)) {
+        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_HAS_PENDING) >>> 0;
+        if (dart.test(this[_isInputPaused]) && dart.test(this[_mayResumeInput])) {
+          this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
+        }
+      }
+      while (true) {
+        if (dart.test(this[_isCanceled])) {
+          this[_pending] = null;
+          return;
+        }
+        let isInputPaused = this[_isInputPaused];
+        if (wasInputPaused == isInputPaused) break;
+        this[_state] = (dart.notNull(this[_state]) ^ async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+        if (dart.test(isInputPaused)) {
+          this[_onPause]();
+        } else {
+          this[_onResume]();
+        }
+        this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
+        wasInputPaused = isInputPaused;
+      }
+      if (dart.test(this[_hasPending]) && !dart.test(this[_isPaused])) {
+        this[_pending].schedule(this);
+      }
+    }
+  }
+  dart.addTypeTests(_BufferingStreamSubscription);
+  _BufferingStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT(), _EventSinkOfT(), _EventDispatchOfT()];
+  dart.setSignature(_BufferingStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BufferingStreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool])}),
+    fields: () => ({
+      [_onData]: TTovoid(),
+      [_onError]: core.Function,
+      [_onDone]: async._DoneHandler,
+      [_zone]: async.Zone,
+      [_state]: core.int,
+      [_cancelFuture]: async.Future,
+      [_pending]: _PendingEventsOfT()
+    }),
+    getters: () => ({
+      [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
+      [_isClosed$]: dart.definiteFunctionType(core.bool, []),
+      [_isCanceled]: dart.definiteFunctionType(core.bool, []),
+      [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
+      [_inCallback]: dart.definiteFunctionType(core.bool, []),
+      [_hasPending]: dart.definiteFunctionType(core.bool, []),
+      [_isPaused]: dart.definiteFunctionType(core.bool, []),
+      [_canFire]: dart.definiteFunctionType(core.bool, []),
+      [_mayResumeInput]: dart.definiteFunctionType(core.bool, []),
+      [_cancelOnError]: dart.definiteFunctionType(core.bool, []),
+      isPaused: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      [_setPendingEvents]: dart.definiteFunctionType(dart.void, [_PendingEventsOfT()]),
+      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
+      onError: dart.definiteFunctionType(dart.void, [core.Function]),
+      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+      resume: dart.definiteFunctionType(dart.void, []),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
+      [_cancel]: dart.definiteFunctionType(dart.void, []),
+      [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
+      [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
+      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
+      [_onPause]: dart.definiteFunctionType(dart.void, []),
+      [_onResume]: dart.definiteFunctionType(dart.void, []),
+      [_onCancel]: dart.definiteFunctionType(async.Future, []),
+      [_addPending]: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
+      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
+      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, []),
+      [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
+    }),
+    sfields: () => ({
+      _STATE_CANCEL_ON_ERROR: core.int,
+      _STATE_CLOSED: core.int,
+      _STATE_INPUT_PAUSED: core.int,
+      _STATE_CANCELED: core.int,
+      _STATE_WAIT_FOR_CANCEL: core.int,
+      _STATE_IN_CALLBACK: core.int,
+      _STATE_HAS_PENDING: core.int,
+      _STATE_PAUSE_COUNT: core.int,
+      _STATE_PAUSE_COUNT_SHIFT: core.int
+    })
+  });
+  return _BufferingStreamSubscription;
+});
+async._BufferingStreamSubscription = _BufferingStreamSubscription();
+async._BufferingStreamSubscription._STATE_CANCEL_ON_ERROR = 1;
+async._BufferingStreamSubscription._STATE_CLOSED = 2;
+async._BufferingStreamSubscription._STATE_INPUT_PAUSED = 4;
+async._BufferingStreamSubscription._STATE_CANCELED = 8;
+async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL = 16;
+async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
+async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
+async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
+async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
+async._ControllerSubscription$ = dart.generic(T => {
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
+    new(controller, onData, onError, onDone, cancelOnError) {
+      this[_controller$] = controller;
+      super.new(onData, onError, onDone, cancelOnError);
+    }
+    [_onCancel]() {
+      return this[_controller$][_recordCancel](this);
+    }
+    [_onPause]() {
+      this[_controller$][_recordPause](this);
+    }
+    [_onResume]() {
+      this[_controller$][_recordResume](this);
+    }
+  }
+  dart.setSignature(_ControllerSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
+    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
+  });
+  return _ControllerSubscription;
+});
+async._ControllerSubscription = _ControllerSubscription();
+async._BroadcastSubscription$ = dart.generic(T => {
+  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _BroadcastSubscription extends async._ControllerSubscription$(T) {
+    new(controller, onData, onError, onDone, cancelOnError) {
+      this[_eventState] = 0;
+      this[_next$] = null;
+      this[_previous$] = null;
+      super.new(controller, onData, onError, onDone, cancelOnError);
+      this[_next$] = this[_previous$] = this;
+    }
+    [_expectsEvent](eventId) {
+      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
+    }
+    [_toggleEventId]() {
+      this[_eventState] = (dart.notNull(this[_eventState]) ^ async._BroadcastSubscription._STATE_EVENT_ID) >>> 0;
+    }
+    get [_isFiring]() {
+      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_FIRING) != 0;
+    }
+    [_setRemoveAfterFiring]() {
+      dart.assert(this[_isFiring]);
+      this[_eventState] = (dart.notNull(this[_eventState]) | async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) >>> 0;
+    }
+    get [_removeAfterFiring]() {
+      return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING) != 0;
+    }
+    [_onPause]() {}
+    [_onResume]() {}
+  }
+  dart.setSignature(_BroadcastSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
+    fields: () => ({
+      [_eventState]: core.int,
+      [_next$]: _BroadcastSubscriptionOfT(),
+      [_previous$]: _BroadcastSubscriptionOfT()
+    }),
+    getters: () => ({
+      [_isFiring]: dart.definiteFunctionType(core.bool, []),
+      [_removeAfterFiring]: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      [_expectsEvent]: dart.definiteFunctionType(core.bool, [core.int]),
+      [_toggleEventId]: dart.definiteFunctionType(dart.void, []),
+      [_setRemoveAfterFiring]: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _STATE_EVENT_ID: core.int,
+      _STATE_FIRING: core.int,
+      _STATE_REMOVE_AFTER_FIRING: core.int
+    })
+  });
+  return _BroadcastSubscription;
+});
+async._BroadcastSubscription = _BroadcastSubscription();
+async._BroadcastSubscription._STATE_EVENT_ID = 1;
+async._BroadcastSubscription._STATE_FIRING = 2;
+async._BroadcastSubscription._STATE_REMOVE_AFTER_FIRING = 4;
+const _firstSubscription = Symbol('_firstSubscription');
+const _lastSubscription = Symbol('_lastSubscription');
+const _addStreamState = Symbol('_addStreamState');
+const _doneFuture = Symbol('_doneFuture');
+const _isEmpty = Symbol('_isEmpty');
+const _hasOneListener = Symbol('_hasOneListener');
+const _isAddingStream = Symbol('_isAddingStream');
+const _mayAddEvent = Symbol('_mayAddEvent');
+const _ensureDoneFuture = Symbol('_ensureDoneFuture');
+const _addListener = Symbol('_addListener');
+const _removeListener = Symbol('_removeListener');
+const _callOnCancel = Symbol('_callOnCancel');
+const _addEventError = Symbol('_addEventError');
+const _forEachListener = Symbol('_forEachListener');
+const _mayComplete = Symbol('_mayComplete');
+const _asyncComplete = Symbol('_asyncComplete');
+async._BroadcastStreamController$ = dart.generic(T => {
+  let _BroadcastStreamOfT = () => (_BroadcastStreamOfT = dart.constFn(async._BroadcastStream$(T)))();
+  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
+  let _BroadcastSubscriptionOfT = () => (_BroadcastSubscriptionOfT = dart.constFn(async._BroadcastSubscription$(T)))();
+  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let _AddStreamStateOfT = () => (_AddStreamStateOfT = dart.constFn(async._AddStreamState$(T)))();
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
+  let _BufferingStreamSubscriptionOfTTovoid = () => (_BufferingStreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [_BufferingStreamSubscriptionOfT()])))();
+  class _BroadcastStreamController extends core.Object {
+    new(onListen, onCancel) {
+      this.onListen = onListen;
+      this.onCancel = onCancel;
+      this[_state] = async._BroadcastStreamController._STATE_INITIAL;
+      this[_firstSubscription] = null;
+      this[_lastSubscription] = null;
+      this[_addStreamState] = null;
+      this[_doneFuture] = null;
+    }
+    get onPause() {
+      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
+    }
+    set onPause(onPauseHandler) {
+      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
+    }
+    get onResume() {
+      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
+    }
+    set onResume(onResumeHandler) {
+      dart.throw(new core.UnsupportedError("Broadcast stream controllers do not support pause callbacks"));
+    }
+    get stream() {
+      return new (_BroadcastStreamOfT())(this);
+    }
+    get sink() {
+      return new (_StreamSinkWrapperOfT())(this);
+    }
+    get isClosed() {
+      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_CLOSED) != 0;
+    }
+    get isPaused() {
+      return false;
+    }
+    get hasListener() {
+      return !dart.test(this[_isEmpty]);
+    }
+    get [_hasOneListener]() {
+      dart.assert(!dart.test(this[_isEmpty]));
+      return core.identical(this[_firstSubscription], this[_lastSubscription]);
+    }
+    get [_isFiring]() {
+      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_FIRING) != 0;
+    }
+    get [_isAddingStream]() {
+      return (dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_ADDSTREAM) != 0;
+    }
+    get [_mayAddEvent]() {
+      return dart.notNull(this[_state]) < async._BroadcastStreamController._STATE_CLOSED;
+    }
+    [_ensureDoneFuture]() {
+      if (this[_doneFuture] != null) return this[_doneFuture];
+      return this[_doneFuture] = new async._Future();
+    }
+    get [_isEmpty]() {
+      return this[_firstSubscription] == null;
+    }
+    [_addListener](subscription) {
+      _BroadcastSubscriptionOfT()._check(subscription);
+      dart.assert(core.identical(subscription[_next$], subscription));
+      subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
+      let oldLast = this[_lastSubscription];
+      this[_lastSubscription] = subscription;
+      subscription[_next$] = null;
+      subscription[_previous$] = oldLast;
+      if (oldLast == null) {
+        this[_firstSubscription] = subscription;
+      } else {
+        oldLast[_next$] = subscription;
+      }
+    }
+    [_removeListener](subscription) {
+      _BroadcastSubscriptionOfT()._check(subscription);
+      dart.assert(core.identical(subscription[_controller$], this));
+      dart.assert(!core.identical(subscription[_next$], subscription));
+      let previous = subscription[_previous$];
+      let next = subscription[_next$];
+      if (previous == null) {
+        this[_firstSubscription] = next;
+      } else {
+        previous[_next$] = next;
+      }
+      if (next == null) {
+        this[_lastSubscription] = previous;
+      } else {
+        next[_previous$] = previous;
+      }
+      subscription[_next$] = subscription[_previous$] = subscription;
+    }
+    [_subscribe](onData, onError, onDone, cancelOnError) {
+      if (dart.test(this.isClosed)) {
+        if (onDone == null) onDone = async._nullDoneHandler;
+        return new (_DoneStreamSubscriptionOfT())(onDone);
+      }
+      let subscription = new (_BroadcastSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
+      this[_addListener](_BroadcastSubscriptionOfT()._check(subscription));
+      if (core.identical(this[_firstSubscription], this[_lastSubscription])) {
+        async._runGuarded(this.onListen);
+      }
+      return subscription;
+    }
+    [_recordCancel](sub) {
+      StreamSubscriptionOfT()._check(sub);
+      let subscription = _BroadcastSubscriptionOfT()._check(sub);
+      if (core.identical(subscription[_next$], subscription)) return null;
+      if (dart.test(subscription[_isFiring])) {
+        subscription[_setRemoveAfterFiring]();
+      } else {
+        this[_removeListener](subscription);
+        if (!dart.test(this[_isFiring]) && dart.test(this[_isEmpty])) {
+          this[_callOnCancel]();
+        }
+      }
+      return null;
+    }
+    [_recordPause](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+    }
+    [_recordResume](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+    }
+    [_addEventError]() {
+      if (dart.test(this.isClosed)) {
+        return new core.StateError("Cannot add new events after calling close");
+      }
+      dart.assert(this[_isAddingStream]);
+      return new core.StateError("Cannot add new events while doing an addStream");
+    }
+    add(data) {
+      T._check(data);
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
+      this[_sendData](data);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      error = async._nonNullError(error);
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
+      let replacement = async.Zone.current.errorCallback(error, stackTrace);
+      if (replacement != null) {
+        error = async._nonNullError(replacement.error);
+        stackTrace = replacement.stackTrace;
+      }
+      this[_sendError](error, stackTrace);
+    }
+    close() {
+      if (dart.test(this.isClosed)) {
+        dart.assert(this[_doneFuture] != null);
+        return this[_doneFuture];
+      }
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
+      this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
+      let doneFuture = this[_ensureDoneFuture]();
+      this[_sendDone]();
+      return doneFuture;
+    }
+    get done() {
+      return this[_ensureDoneFuture]();
+    }
+    addStream(stream, opts) {
+      StreamOfT()._check(stream);
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
+      this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
+      this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
+      return this[_addStreamState].addStreamFuture;
+    }
+    [_add$](data) {
+      T._check(data);
+      this[_sendData](data);
+    }
+    [_addError](error, stackTrace) {
+      this[_sendError](error, stackTrace);
+    }
+    [_close$]() {
+      dart.assert(this[_isAddingStream]);
+      let addState = this[_addStreamState];
+      this[_addStreamState] = null;
+      this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_ADDSTREAM) >>> 0;
+      addState.complete();
+    }
+    [_forEachListener](action) {
+      if (dart.test(this[_isFiring])) {
+        dart.throw(new core.StateError("Cannot fire new event. Controller is already firing an event"));
+      }
+      if (dart.test(this[_isEmpty])) return;
+      let id = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
+      this[_state] = (dart.notNull(this[_state]) ^ (async._BroadcastStreamController._STATE_EVENT_ID | async._BroadcastStreamController._STATE_FIRING)) >>> 0;
+      let subscription = this[_firstSubscription];
+      while (subscription != null) {
+        if (dart.test(subscription[_expectsEvent](id))) {
+          subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
+          action(subscription);
+          subscription[_toggleEventId]();
+          let next = subscription[_next$];
+          if (dart.test(subscription[_removeAfterFiring])) {
+            this[_removeListener](subscription);
+          }
+          subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
+          subscription = next;
+        } else {
+          subscription = subscription[_next$];
+        }
+      }
+      this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
+      if (dart.test(this[_isEmpty])) {
+        this[_callOnCancel]();
+      }
+    }
+    [_callOnCancel]() {
+      dart.assert(this[_isEmpty]);
+      if (dart.test(this.isClosed) && dart.test(this[_doneFuture][_mayComplete])) {
+        this[_doneFuture][_asyncComplete](null);
+      }
+      async._runGuarded(this.onCancel);
+    }
+  }
+  dart.addTypeTests(_BroadcastStreamController);
+  _BroadcastStreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
+  dart.setSignature(_BroadcastStreamController, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastStreamController$(T), [async.ControllerCallback, async.ControllerCancelCallback])}),
+    fields: () => ({
+      onListen: async.ControllerCallback,
+      onCancel: async.ControllerCancelCallback,
+      [_state]: core.int,
+      [_firstSubscription]: _BroadcastSubscriptionOfT(),
+      [_lastSubscription]: _BroadcastSubscriptionOfT(),
+      [_addStreamState]: _AddStreamStateOfT(),
+      [_doneFuture]: async._Future
+    }),
+    getters: () => ({
+      onPause: dart.definiteFunctionType(async.ControllerCallback, []),
+      onResume: dart.definiteFunctionType(async.ControllerCallback, []),
+      stream: dart.definiteFunctionType(async.Stream$(T), []),
+      sink: dart.definiteFunctionType(async.StreamSink$(T), []),
+      isClosed: dart.definiteFunctionType(core.bool, []),
+      isPaused: dart.definiteFunctionType(core.bool, []),
+      hasListener: dart.definiteFunctionType(core.bool, []),
+      [_hasOneListener]: dart.definiteFunctionType(core.bool, []),
+      [_isFiring]: dart.definiteFunctionType(core.bool, []),
+      [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
+      [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
+      [_isEmpty]: dart.definiteFunctionType(core.bool, []),
+      done: dart.definiteFunctionType(async.Future, [])
+    }),
+    setters: () => ({
+      onPause: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      onResume: dart.definiteFunctionType(dart.void, [VoidTovoid()])
+    }),
+    methods: () => ({
+      [_ensureDoneFuture]: dart.definiteFunctionType(async._Future, []),
+      [_addListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
+      [_removeListener]: dart.definiteFunctionType(dart.void, [_BroadcastSubscriptionOfT()]),
+      [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
+      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
+      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
+      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
+      [_addEventError]: dart.definiteFunctionType(core.Error, []),
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      close: dart.definiteFunctionType(async.Future, []),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
+      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
+      [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
+      [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _STATE_INITIAL: core.int,
+      _STATE_EVENT_ID: core.int,
+      _STATE_FIRING: core.int,
+      _STATE_CLOSED: core.int,
+      _STATE_ADDSTREAM: core.int
+    })
+  });
+  return _BroadcastStreamController;
+});
+async._BroadcastStreamController = _BroadcastStreamController();
+async._BroadcastStreamController._STATE_INITIAL = 0;
+async._BroadcastStreamController._STATE_EVENT_ID = 1;
+async._BroadcastStreamController._STATE_FIRING = 2;
+async._BroadcastStreamController._STATE_CLOSED = 4;
+async._BroadcastStreamController._STATE_ADDSTREAM = 8;
+async._SyncBroadcastStreamController$ = dart.generic(T => {
+  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
+  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
+  let _BufferingStreamSubscriptionOfTToNull = () => (_BufferingStreamSubscriptionOfTToNull = dart.constFn(dart.definiteFunctionType(core.Null, [_BufferingStreamSubscriptionOfT()])))();
+  class _SyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
+    new(onListen, onCancel) {
+      super.new(onListen, onCancel);
+    }
+    get [_mayAddEvent]() {
+      return dart.test(super[_mayAddEvent]) && !dart.test(this[_isFiring]);
+    }
+    [_addEventError]() {
+      if (dart.test(this[_isFiring])) {
+        return new core.StateError("Cannot fire new event. Controller is already firing an event");
+      }
+      return super[_addEventError]();
+    }
+    [_sendData](data) {
+      T._check(data);
+      if (dart.test(this[_isEmpty])) return;
+      if (dart.test(this[_hasOneListener])) {
+        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
+        let subscription = this[_firstSubscription];
+        subscription[_add$](data);
+        this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
+        if (dart.test(this[_isEmpty])) {
+          this[_callOnCancel]();
+        }
+        return;
+      }
+      this[_forEachListener](dart.fn(subscription => {
+        subscription[_add$](data);
+      }, _BufferingStreamSubscriptionOfTToNull()));
+    }
+    [_sendError](error, stackTrace) {
+      if (dart.test(this[_isEmpty])) return;
+      this[_forEachListener](dart.fn(subscription => {
+        subscription[_addError](error, stackTrace);
+      }, _BufferingStreamSubscriptionOfTToNull()));
+    }
+    [_sendDone]() {
+      if (!dart.test(this[_isEmpty])) {
+        this[_forEachListener](dart.fn(subscription => {
+          subscription[_close$]();
+        }, _BufferingStreamSubscriptionOfTToNull()));
+      } else {
+        dart.assert(this[_doneFuture] != null);
+        dart.assert(this[_doneFuture][_mayComplete]);
+        this[_doneFuture][_asyncComplete](null);
+      }
+    }
+  }
+  _SyncBroadcastStreamController[dart.implements] = () => [SynchronousStreamControllerOfT()];
+  dart.setSignature(_SyncBroadcastStreamController, {
+    constructors: () => ({new: dart.definiteFunctionType(async._SyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
+    methods: () => ({
+      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
+      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _SyncBroadcastStreamController;
+});
+async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
+let const$6;
+async._AsyncBroadcastStreamController$ = dart.generic(T => {
+  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
+  class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
+    new(onListen, onCancel) {
+      super.new(onListen, onCancel);
+    }
+    [_sendData](data) {
+      T._check(data);
+      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
+        subscription[_addPending](new (_DelayedDataOfT())(data));
+      }
+    }
+    [_sendError](error, stackTrace) {
+      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
+        subscription[_addPending](new async._DelayedError(error, stackTrace));
+      }
+    }
+    [_sendDone]() {
+      if (!dart.test(this[_isEmpty])) {
+        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
+          subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
+        }
+      } else {
+        dart.assert(this[_doneFuture] != null);
+        dart.assert(this[_doneFuture][_mayComplete]);
+        this[_doneFuture][_asyncComplete](null);
+      }
+    }
+  }
+  dart.setSignature(_AsyncBroadcastStreamController, {
+    constructors: () => ({new: dart.definiteFunctionType(async._AsyncBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
+    methods: () => ({
+      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
+      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _AsyncBroadcastStreamController;
+});
+async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
+const _addPendingEvent = Symbol('_addPendingEvent');
+let const$7;
+async._AsBroadcastStreamController$ = dart.generic(T => {
+  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
+  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  class _AsBroadcastStreamController extends async._SyncBroadcastStreamController$(T) {
+    new(onListen, onCancel) {
+      this[_pending] = null;
+      super.new(onListen, onCancel);
+    }
+    get [_hasPending]() {
+      return this[_pending] != null && !dart.test(this[_pending].isEmpty);
+    }
+    [_addPendingEvent](event) {
+      if (this[_pending] == null) {
+        this[_pending] = new (_StreamImplEventsOfT())();
+      }
+      this[_pending].add(event);
+    }
+    add(data) {
+      T._check(data);
+      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
+        this[_addPendingEvent](new (_DelayedDataOfT())(data));
+        return;
+      }
+      super.add(data);
+      while (dart.test(this[_hasPending])) {
+        this[_pending].handleNext(this);
+      }
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
+        this[_addPendingEvent](new async._DelayedError(error, stackTrace));
+        return;
+      }
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_addEventError]());
+      this[_sendError](error, stackTrace);
+      while (dart.test(this[_hasPending])) {
+        this[_pending].handleNext(this);
+      }
+    }
+    close() {
+      if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
+        this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
+        this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
+        return super.done;
+      }
+      let result = super.close();
+      dart.assert(!dart.test(this[_hasPending]));
+      return result;
+    }
+    [_callOnCancel]() {
+      if (dart.test(this[_hasPending])) {
+        this[_pending].clear();
+        this[_pending] = null;
+      }
+      super[_callOnCancel]();
+    }
+  }
+  _AsBroadcastStreamController[dart.implements] = () => [_EventDispatchOfT()];
+  dart.setSignature(_AsBroadcastStreamController, {
+    constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStreamController$(T), [VoidTovoid(), VoidTovoid()])}),
+    fields: () => ({[_pending]: _StreamImplEventsOfT()}),
+    getters: () => ({[_hasPending]: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({[_addPendingEvent]: dart.definiteFunctionType(dart.void, [async._DelayedEvent])})
+  });
+  return _AsBroadcastStreamController;
+});
+async._AsBroadcastStreamController = _AsBroadcastStreamController();
+const _pauseCount = Symbol('_pauseCount');
+const _resume = Symbol('_resume');
+async._DoneSubscription$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _DoneSubscription extends core.Object {
+    new() {
+      this[_pauseCount] = 0;
+    }
+    onData(handleData) {}
+    onError(handleError) {}
+    onDone(handleDone) {}
+    pause(resumeSignal) {
+      if (resumeSignal === void 0) resumeSignal = null;
+      if (resumeSignal != null) resumeSignal.then(dart.void)(dart.bind(this, _resume));
+      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
+    }
+    resume() {
+      this[_resume](null);
+    }
+    [_resume](_) {
+      if (dart.notNull(this[_pauseCount]) > 0) {
+        this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
+      }
+    }
+    cancel() {
+      return new async._Future.immediate(null);
+    }
+    get isPaused() {
+      return dart.notNull(this[_pauseCount]) > 0;
+    }
+    asFuture(E) {
+      return value => {
+        if (value === void 0) value = null;
+        return new (async._Future$(E))();
+      };
+    }
+  }
+  dart.addTypeTests(_DoneSubscription);
+  _DoneSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
+  dart.setSignature(_DoneSubscription, {
+    fields: () => ({[_pauseCount]: core.int}),
+    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
+      onError: dart.definiteFunctionType(dart.void, [core.Function]),
+      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+      resume: dart.definiteFunctionType(dart.void, []),
+      [_resume]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
+    })
+  });
+  return _DoneSubscription;
+});
+async._DoneSubscription = _DoneSubscription();
+async.DeferredLibrary = class DeferredLibrary extends core.Object {
+  new(libraryName, opts) {
+    let uri = opts && 'uri' in opts ? opts.uri : null;
+    this.libraryName = libraryName;
+    this.uri = uri;
+  }
+  load() {
+    dart.throw('DeferredLibrary not supported. ' + 'please use the `import "lib.dart" deferred as lib` syntax.');
+  }
+};
+dart.setSignature(async.DeferredLibrary, {
+  constructors: () => ({new: dart.definiteFunctionType(async.DeferredLibrary, [core.String], {uri: core.String})}),
+  fields: () => ({
+    libraryName: core.String,
+    uri: core.String
+  }),
+  methods: () => ({load: dart.definiteFunctionType(async.Future$(core.Null), [])})
+});
+const _s = Symbol('_s');
+async.DeferredLoadException = class DeferredLoadException extends core.Object {
+  new(s) {
+    this[_s] = s;
+  }
+  toString() {
+    return dart.str`DeferredLoadException: '${this[_s]}'`;
+  }
+};
+async.DeferredLoadException[dart.implements] = () => [core.Exception];
+dart.setSignature(async.DeferredLoadException, {
+  constructors: () => ({new: dart.definiteFunctionType(async.DeferredLoadException, [core.String])}),
+  fields: () => ({[_s]: core.String})
+});
+async.FutureOr$ = dart.generic(T => {
+  class FutureOr extends core.Object {
+    _() {
+      dart.throw(new core.UnsupportedError("FutureOr can't be instantiated"));
+    }
+  }
+  dart.addTypeTests(FutureOr);
+  dart.defineNamedConstructor(FutureOr, '_');
+  dart.setSignature(FutureOr, {
+    constructors: () => ({_: dart.definiteFunctionType(async.FutureOr$(T), [])})
+  });
+  return FutureOr;
+});
+async.FutureOr = FutureOr();
+const _completeWithValue = Symbol('_completeWithValue');
+let const$8;
+async.Future$ = dart.flattenFutures(dart.generic(T => {
+  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
+  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
+  class Future extends core.Object {
+    static new(computation) {
+      let result = new (_FutureOfT())();
+      async.Timer.run(dart.fn(() => {
+        try {
+          result[_complete](computation());
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          async._completeWithErrorCallback(result, e, s);
+        }
+
+      }, VoidToNull()));
+      return result;
+    }
+    static microtask(computation) {
+      let result = new (_FutureOfT())();
+      async.scheduleMicrotask(dart.fn(() => {
+        try {
+          result[_complete](computation());
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          async._completeWithErrorCallback(result, e, s);
+        }
+
+      }, VoidToNull()));
+      return result;
+    }
+    static sync(computation) {
+      try {
+        let result = computation();
+        return FutureOfT().value(result);
+      } catch (error) {
+        let stackTrace = dart.stackTrace(error);
+        return FutureOfT().error(error, stackTrace);
+      }
+
+    }
+    static value(value) {
+      if (value === void 0) value = null;
+      return new (_FutureOfT()).immediate(value);
+    }
+    static error(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      error = async._nonNullError(error);
+      if (!core.identical(async.Zone.current, async._ROOT_ZONE)) {
+        let replacement = async.Zone.current.errorCallback(error, stackTrace);
+        if (replacement != null) {
+          error = async._nonNullError(replacement.error);
+          stackTrace = replacement.stackTrace;
+        }
+      }
+      return new (_FutureOfT()).immediateError(error, stackTrace);
+    }
+    static delayed(duration, computation) {
+      if (computation === void 0) computation = null;
+      let result = new (_FutureOfT())();
+      async.Timer.new(duration, dart.fn(() => {
+        try {
+          result[_complete](dart.nullSafe(computation, _ => _()));
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          async._completeWithErrorCallback(result, e, s);
+        }
+
+      }, VoidToNull()));
+      return result;
+    }
+    static wait(T) {
+      return (futures, opts) => {
+        let eagerError = opts && 'eagerError' in opts ? opts.eagerError : false;
+        let cleanUp = opts && 'cleanUp' in opts ? opts.cleanUp : null;
+        let result = new (async._Future$(core.List$(T)))();
+        let values = null;
+        let remaining = 0;
+        let error = null;
+        let stackTrace = null;
+        function handleError(theError, theStackTrace) {
+          remaining--;
+          if (values != null) {
+            if (cleanUp != null) {
+              for (let value of values) {
+                if (value != null) {
+                  async.Future.sync(dart.fn(() => {
+                    cleanUp(value);
+                  }, VoidToNull()));
+                }
+              }
+            }
+            values = null;
+            if (remaining == 0 || dart.test(eagerError)) {
+              result[_completeError](theError, core.StackTrace._check(theStackTrace));
+            } else {
+              error = theError;
+              stackTrace = core.StackTrace._check(theStackTrace);
+            }
+          } else if (remaining == 0 && !dart.test(eagerError)) {
+            result[_completeError](error, stackTrace);
+          }
+        }
+        dart.fn(handleError, dynamicAnddynamicTovoid$());
+        try {
+          for (let future of futures) {
+            let pos = remaining;
+            future.then(dart.dynamic)(dart.fn(value => {
+              remaining--;
+              if (values != null) {
+                values[dartx._set](pos, value);
+                if (remaining == 0) {
+                  result[_completeWithValue](values);
+                }
+              } else {
+                if (cleanUp != null && value != null) {
+                  async.Future.sync(dart.fn(() => {
+                    cleanUp(value);
+                  }, VoidToNull()));
+                }
+                if (remaining == 0 && !dart.test(eagerError)) {
+                  result[_completeError](error, stackTrace);
+                }
+              }
+            }, dart.definiteFunctionType(core.Null, [T])), {onError: handleError});
+            remaining++;
+          }
+          if (remaining == 0) {
+            return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
+          }
+          values = core.List$(T).new(remaining);
+        } catch (e) {
+          let st = dart.stackTrace(e);
+          if (remaining == 0 || dart.test(eagerError)) {
+            return async.Future$(core.List$(T)).error(e, st);
+          } else {
+            error = e;
+            stackTrace = st;
+          }
+        }
+
+        return result;
+      };
+    }
+    static any(T) {
+      return futures => {
+        let completer = async.Completer$(T).sync();
+        let onValue = dart.fn(value => {
+          if (!dart.test(completer.isCompleted)) completer.complete(value);
+        }, dart.definiteFunctionType(core.Null, [T]));
+        let onError = dart.fn((error, stack) => {
+          if (!dart.test(completer.isCompleted)) completer.completeError(error, core.StackTrace._check(stack));
+        }, dynamicAnddynamicToNull());
+        for (let future of futures) {
+          future.then(dart.dynamic)(onValue, {onError: onError});
+        }
+        return completer.future;
+      };
+    }
+    static forEach(T) {
+      return (input, f) => {
+        let iterator = input[dartx.iterator];
+        return async.Future.doWhile(dart.fn(() => {
+          if (!dart.test(iterator.moveNext())) return false;
+          return async.Future.sync(dart.fn(() => f(iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
+        }, VoidToObject$()));
+      };
+    }
+    static doWhile(f) {
+      let doneSignal = new async._Future();
+      let nextIteration = null;
+      nextIteration = async.Zone.current.bindUnaryCallback(dart.dynamic, core.bool)(dart.fn(keepGoing => {
+        if (dart.test(keepGoing)) {
+          async.Future.sync(f).then(dart.dynamic)(dynamicToFutureOr()._check(nextIteration), {onError: dart.bind(doneSignal, _completeError)});
+        } else {
+          doneSignal[_complete](null);
+        }
+      }, boolToNull()), {runGuarded: true});
+      dart.dcall(nextIteration, true);
+      return doneSignal;
+    }
+  }
+  dart.addTypeTests(Future);
+  dart.setSignature(Future, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
+      microtask: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
+      sync: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
+      value: dart.definiteFunctionType(async.Future$(T), [], [dart.dynamic]),
+      error: dart.definiteFunctionType(async.Future$(T), [core.Object], [core.StackTrace]),
+      delayed: dart.definiteFunctionType(async.Future$(T), [core.Duration], [VoidTodynamic()])
+    }),
+    sfields: () => ({_nullFuture: async._Future}),
+    statics: () => ({
+      wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
+      any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
+      forEach: dart.definiteFunctionType(T => [async.Future, [core.Iterable$(T), dart.functionType(dart.dynamic, [T])]]),
+      doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
+    }),
+    names: ['wait', 'any', 'forEach', 'doWhile']
+  });
+  return Future;
+}));
+async.Future = Future();
+dart.defineLazy(async.Future, {
+  get _nullFuture() {
+    return async._Future._check(async.Future.value(null));
+  }
+});
+async.TimeoutException = class TimeoutException extends core.Object {
+  new(message, duration) {
+    if (duration === void 0) duration = null;
+    this.message = message;
+    this.duration = duration;
+  }
+  toString() {
+    let result = "TimeoutException";
+    if (this.duration != null) result = dart.str`TimeoutException after ${this.duration}`;
+    if (this.message != null) result = dart.str`${result}: ${this.message}`;
+    return result;
+  }
+};
+async.TimeoutException[dart.implements] = () => [core.Exception];
+dart.setSignature(async.TimeoutException, {
+  constructors: () => ({new: dart.definiteFunctionType(async.TimeoutException, [core.String], [core.Duration])}),
+  fields: () => ({
+    message: core.String,
+    duration: core.Duration
+  })
+});
+async.Completer$ = dart.generic(T => {
+  let _AsyncCompleterOfT = () => (_AsyncCompleterOfT = dart.constFn(async._AsyncCompleter$(T)))();
+  let _SyncCompleterOfT = () => (_SyncCompleterOfT = dart.constFn(async._SyncCompleter$(T)))();
+  class Completer extends core.Object {
+    static new() {
+      return new (_AsyncCompleterOfT())();
+    }
+    static sync() {
+      return new (_SyncCompleterOfT())();
+    }
+  }
+  dart.addTypeTests(Completer);
+  dart.setSignature(Completer, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async.Completer$(T), []),
+      sync: dart.definiteFunctionType(async.Completer$(T), [])
+    })
+  });
+  return Completer;
+});
+async.Completer = Completer();
+async._completeWithErrorCallback = function(result, error, stackTrace) {
+  let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
+  if (replacement != null) {
+    error = async._nonNullError(replacement.error);
+    stackTrace = replacement.stackTrace;
+  }
+  result[_completeError](error, core.StackTrace._check(stackTrace));
+};
+dart.lazyFn(async._completeWithErrorCallback, () => _FutureAnddynamicAnddynamicTovoid());
+async._nonNullError = function(error) {
+  return error != null ? error : new core.NullThrownError();
+};
+dart.fn(async._nonNullError, ObjectToObject());
+async._FutureOnValue$ = dart.generic((S, T) => {
+  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
+  return _FutureOnValue;
+});
+async._FutureOnValue = _FutureOnValue();
+async._FutureErrorTest = dart.typedef('_FutureErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
+async._FutureAction = dart.typedef('_FutureAction', () => dart.functionType(dart.dynamic, []));
+async._Completer$ = dart.generic(T => {
+  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
+  let CompleterOfT = () => (CompleterOfT = dart.constFn(async.Completer$(T)))();
+  class _Completer extends core.Object {
+    new() {
+      this.future = new (_FutureOfT())();
+    }
+    completeError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      error = async._nonNullError(error);
+      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
+      let replacement = async.Zone.current.errorCallback(error, stackTrace);
+      if (replacement != null) {
+        error = async._nonNullError(replacement.error);
+        stackTrace = replacement.stackTrace;
+      }
+      this[_completeError](error, stackTrace);
+    }
+    get isCompleted() {
+      return !dart.test(this.future[_mayComplete]);
+    }
+  }
+  dart.addTypeTests(_Completer);
+  _Completer[dart.implements] = () => [CompleterOfT()];
+  dart.setSignature(_Completer, {
+    fields: () => ({future: _FutureOfT()}),
+    getters: () => ({isCompleted: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({completeError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
+  });
+  return _Completer;
+});
+async._Completer = _Completer();
+const _asyncCompleteError = Symbol('_asyncCompleteError');
+async._AsyncCompleter$ = dart.generic(T => {
+  class _AsyncCompleter extends async._Completer$(T) {
+    new() {
+      super.new();
+    }
+    complete(value) {
+      if (value === void 0) value = null;
+      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
+      this.future[_asyncComplete](value);
+    }
+    [_completeError](error, stackTrace) {
+      this.future[_asyncCompleteError](error, stackTrace);
+    }
+  }
+  dart.setSignature(_AsyncCompleter, {
+    methods: () => ({
+      complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+      [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
+    })
+  });
+  return _AsyncCompleter;
+});
+async._AsyncCompleter = _AsyncCompleter();
+async._SyncCompleter$ = dart.generic(T => {
+  class _SyncCompleter extends async._Completer$(T) {
+    new() {
+      super.new();
+    }
+    complete(value) {
+      if (value === void 0) value = null;
+      if (!dart.test(this.future[_mayComplete])) dart.throw(new core.StateError("Future already completed"));
+      this.future[_complete](value);
+    }
+    [_completeError](error, stackTrace) {
+      this.future[_completeError](error, stackTrace);
+    }
+  }
+  dart.setSignature(_SyncCompleter, {
+    methods: () => ({
+      complete: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+      [_completeError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])
+    })
+  });
+  return _SyncCompleter;
+});
+async._SyncCompleter = _SyncCompleter();
+const _nextListener = Symbol('_nextListener');
+const _onValue = Symbol('_onValue');
+const _errorTest = Symbol('_errorTest');
+const _whenCompleteAction = Symbol('_whenCompleteAction');
+async._FutureListener$ = dart.generic((S, T) => {
+  let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
+  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
+  class _FutureListener extends core.Object {
+    then(result, onValue, errorCallback) {
+      this.result = result;
+      this.callback = onValue;
+      this.errorCallback = errorCallback;
+      this.state = errorCallback == null ? async._FutureListener.STATE_THEN : async._FutureListener.STATE_THEN_ONERROR;
+      this[_nextListener] = null;
+    }
+    catchError(result, errorCallback, test) {
+      this.result = result;
+      this.errorCallback = errorCallback;
+      this.callback = test;
+      this.state = test == null ? async._FutureListener.STATE_CATCHERROR : async._FutureListener.STATE_CATCHERROR_TEST;
+      this[_nextListener] = null;
+    }
+    whenComplete(result, onComplete) {
+      this.result = result;
+      this.callback = onComplete;
+      this.errorCallback = null;
+      this.state = async._FutureListener.STATE_WHENCOMPLETE;
+      this[_nextListener] = null;
+    }
+    get [_zone]() {
+      return this.result[_zone];
+    }
+    get handlesValue() {
+      return (dart.notNull(this.state) & async._FutureListener.MASK_VALUE) != 0;
+    }
+    get handlesError() {
+      return (dart.notNull(this.state) & async._FutureListener.MASK_ERROR) != 0;
+    }
+    get hasErrorTest() {
+      return this.state == async._FutureListener.STATE_CATCHERROR_TEST;
+    }
+    get handlesComplete() {
+      return this.state == async._FutureListener.STATE_WHENCOMPLETE;
+    }
+    get [_onValue]() {
+      dart.assert(this.handlesValue);
+      return _FutureOnValueOfS$T().as(this.callback);
+    }
+    get [_onError]() {
+      return this.errorCallback;
+    }
+    get [_errorTest]() {
+      dart.assert(this.hasErrorTest);
+      return async._FutureErrorTest.as(this.callback);
+    }
+    get [_whenCompleteAction]() {
+      dart.assert(this.handlesComplete);
+      return async._FutureAction.as(this.callback);
+    }
+    get hasErrorCallback() {
+      dart.assert(this.handlesError);
+      return this[_onError] != null;
+    }
+    handleValue(sourceResult) {
+      S._check(sourceResult);
+      return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
+    }
+    matchesErrorTest(asyncError) {
+      if (!dart.test(this.hasErrorTest)) return true;
+      let test = this[_errorTest];
+      return this[_zone].runUnary(core.bool, dart.dynamic)(this[_errorTest], asyncError.error);
+    }
+    handleError(asyncError) {
+      dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
+      if (async.ZoneBinaryCallback.is(this.errorCallback)) {
+        let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
+        return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
+      } else {
+        return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
+      }
+    }
+    handleWhenComplete() {
+      dart.assert(!dart.test(this.handlesError));
+      return this[_zone].run(dart.dynamic)(this[_whenCompleteAction]);
+    }
+  }
+  dart.addTypeTests(_FutureListener);
+  dart.defineNamedConstructor(_FutureListener, 'then');
+  dart.defineNamedConstructor(_FutureListener, 'catchError');
+  dart.defineNamedConstructor(_FutureListener, 'whenComplete');
+  dart.setSignature(_FutureListener, {
+    constructors: () => ({
+      then: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), _FutureOnValueOfS$T(), core.Function]),
+      catchError: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), core.Function, async._FutureErrorTest]),
+      whenComplete: dart.definiteFunctionType(async._FutureListener$(S, T), [_FutureOfT(), async._FutureAction])
+    }),
+    fields: () => ({
+      [_nextListener]: async._FutureListener,
+      result: _FutureOfT(),
+      state: core.int,
+      callback: core.Function,
+      errorCallback: core.Function
+    }),
+    getters: () => ({
+      [_zone]: dart.definiteFunctionType(async.Zone, []),
+      handlesValue: dart.definiteFunctionType(core.bool, []),
+      handlesError: dart.definiteFunctionType(core.bool, []),
+      hasErrorTest: dart.definiteFunctionType(core.bool, []),
+      handlesComplete: dart.definiteFunctionType(core.bool, []),
+      [_onValue]: dart.definiteFunctionType(async._FutureOnValue$(S, T), []),
+      [_onError]: dart.definiteFunctionType(core.Function, []),
+      [_errorTest]: dart.definiteFunctionType(async._FutureErrorTest, []),
+      [_whenCompleteAction]: dart.definiteFunctionType(async._FutureAction, []),
+      hasErrorCallback: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
+      matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
+      handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
+      handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
+    }),
+    sfields: () => ({
+      MASK_VALUE: core.int,
+      MASK_ERROR: core.int,
+      MASK_TEST_ERROR: core.int,
+      MASK_WHENCOMPLETE: core.int,
+      STATE_CHAIN: core.int,
+      STATE_THEN: core.int,
+      STATE_THEN_ONERROR: core.int,
+      STATE_CATCHERROR: core.int,
+      STATE_CATCHERROR_TEST: core.int,
+      STATE_WHENCOMPLETE: core.int
+    })
+  });
+  return _FutureListener;
+});
+async._FutureListener = _FutureListener();
+async._FutureListener.MASK_VALUE = 1;
+async._FutureListener.MASK_ERROR = 2;
+async._FutureListener.MASK_TEST_ERROR = 4;
+async._FutureListener.MASK_WHENCOMPLETE = 8;
+async._FutureListener.STATE_CHAIN = 0;
+async._FutureListener.STATE_THEN_ONERROR = 3;
+async._FutureListener.STATE_CATCHERROR_TEST = 6;
+dart.defineLazy(async._FutureListener, {
+  get STATE_THEN() {
+    return async._FutureListener.MASK_VALUE;
+  },
+  get STATE_CATCHERROR() {
+    return async._FutureListener.MASK_ERROR;
+  },
+  get STATE_WHENCOMPLETE() {
+    return async._FutureListener.MASK_WHENCOMPLETE;
+  }
+});
+const _resultOrListeners = Symbol('_resultOrListeners');
+const _isPendingComplete = Symbol('_isPendingComplete');
+const _mayAddListener = Symbol('_mayAddListener');
+const _isChained = Symbol('_isChained');
+const _isComplete = Symbol('_isComplete');
+const _hasError = Symbol('_hasError');
+const _setChained = Symbol('_setChained');
+const _thenNoZoneRegistration = Symbol('_thenNoZoneRegistration');
+const _setPendingComplete = Symbol('_setPendingComplete');
+const _clearPendingComplete = Symbol('_clearPendingComplete');
+const _error = Symbol('_error');
+const _chainSource = Symbol('_chainSource');
+const _setValue = Symbol('_setValue');
+const _setErrorObject = Symbol('_setErrorObject');
+const _setError = Symbol('_setError');
+const _cloneResult = Symbol('_cloneResult');
+const _prependListeners = Symbol('_prependListeners');
+const _reverseListeners = Symbol('_reverseListeners');
+const _removeListeners = Symbol('_removeListeners');
+async._Future$ = dart.flattenFutures(dart.generic(T => {
+  let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
+  let _FutureListenerOfT$T = () => (_FutureListenerOfT$T = dart.constFn(async._FutureListener$(T, T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
+  let TTodynamic = () => (TTodynamic = dart.constFn(dart.functionType(dart.dynamic, [T])))();
+  let TToNull = () => (TToNull = dart.constFn(dart.definiteFunctionType(core.Null, [T])))();
+  class _Future extends core.Object {
+    new() {
+      this[_zone] = async.Zone.current;
+      this[_state] = async._Future._INCOMPLETE;
+      this[_resultOrListeners] = null;
+    }
+    immediate(value) {
+      this[_zone] = async.Zone.current;
+      this[_state] = async._Future._INCOMPLETE;
+      this[_resultOrListeners] = null;
+      this[_asyncComplete](value);
+    }
+    immediateError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_zone] = async.Zone.current;
+      this[_state] = async._Future._INCOMPLETE;
+      this[_resultOrListeners] = null;
+      this[_asyncCompleteError](error, stackTrace);
+    }
+    get [_mayComplete]() {
+      return this[_state] == async._Future._INCOMPLETE;
+    }
+    get [_isPendingComplete]() {
+      return this[_state] == async._Future._PENDING_COMPLETE;
+    }
+    get [_mayAddListener]() {
+      return dart.notNull(this[_state]) <= async._Future._PENDING_COMPLETE;
+    }
+    get [_isChained]() {
+      return this[_state] == async._Future._CHAINED;
+    }
+    get [_isComplete]() {
+      return dart.notNull(this[_state]) >= async._Future._VALUE;
+    }
+    get [_hasError]() {
+      return this[_state] == async._Future._ERROR;
+    }
+    [_setChained](source) {
+      dart.assert(this[_mayAddListener]);
+      this[_state] = async._Future._CHAINED;
+      this[_resultOrListeners] = source;
+    }
+    then(E) {
+      return (f, opts) => {
+        let onError = opts && 'onError' in opts ? opts.onError : null;
+        let currentZone = async.Zone.current;
+        let registered = null;
+        if (!core.identical(currentZone, async._ROOT_ZONE)) {
+          f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
+          if (onError != null) {
+            onError = async._registerErrorHandler(T)(onError, currentZone);
+          }
+        }
+        return this[_thenNoZoneRegistration](E)(f, onError);
+      };
+    }
+    [_thenNoZoneRegistration](E) {
+      return (f, onError) => {
+        let result = new (async._Future$(E))();
+        this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
+        return result;
+      };
+    }
+    catchError(onError, opts) {
+      let test = opts && 'test' in opts ? opts.test : null;
+      let result = new (_FutureOfT())();
+      if (!core.identical(result[_zone], async._ROOT_ZONE)) {
+        onError = async._registerErrorHandler(T)(onError, result[_zone]);
+        if (test != null) test = result[_zone].registerUnaryCallback(core.bool, dart.dynamic)(test);
+      }
+      this[_addListener](new (_FutureListenerOfT$T()).catchError(result, onError, test));
+      return result;
+    }
+    whenComplete(action) {
+      let result = new (_FutureOfT())();
+      if (!core.identical(result[_zone], async._ROOT_ZONE)) {
+        action = result[_zone].registerCallback(dart.dynamic)(action);
+      }
+      this[_addListener](new (_FutureListenerOfT$T()).whenComplete(result, action));
+      return result;
+    }
+    asStream() {
+      return StreamOfT().fromFuture(this);
+    }
+    [_setPendingComplete]() {
+      dart.assert(this[_mayComplete]);
+      this[_state] = async._Future._PENDING_COMPLETE;
+    }
+    [_clearPendingComplete]() {
+      dart.assert(this[_isPendingComplete]);
+      this[_state] = async._Future._INCOMPLETE;
+    }
+    get [_error]() {
+      dart.assert(this[_hasError]);
+      return async.AsyncError._check(this[_resultOrListeners]);
+    }
+    get [_chainSource]() {
+      dart.assert(this[_isChained]);
+      return async._Future._check(this[_resultOrListeners]);
+    }
+    [_setValue](value) {
+      T._check(value);
+      dart.assert(!dart.test(this[_isComplete]));
+      this[_state] = async._Future._VALUE;
+      this[_resultOrListeners] = value;
+    }
+    [_setErrorObject](error) {
+      dart.assert(!dart.test(this[_isComplete]));
+      this[_state] = async._Future._ERROR;
+      this[_resultOrListeners] = error;
+    }
+    [_setError](error, stackTrace) {
+      this[_setErrorObject](new async.AsyncError(error, stackTrace));
+    }
+    [_cloneResult](source) {
+      dart.assert(!dart.test(this[_isComplete]));
+      dart.assert(source[_isComplete]);
+      this[_state] = source[_state];
+      this[_resultOrListeners] = source[_resultOrListeners];
+    }
+    [_addListener](listener) {
+      dart.assert(listener[_nextListener] == null);
+      if (dart.test(this[_mayAddListener])) {
+        listener[_nextListener] = async._FutureListener._check(this[_resultOrListeners]);
+        this[_resultOrListeners] = listener;
+      } else {
+        if (dart.test(this[_isChained])) {
+          let source = this[_chainSource];
+          if (!dart.test(source[_isComplete])) {
+            source[_addListener](listener);
+            return;
+          }
+          this[_cloneResult](source);
+        }
+        dart.assert(this[_isComplete]);
+        this[_zone].scheduleMicrotask(dart.fn(() => {
+          async._Future._propagateToListeners(this, listener);
+        }, VoidToNull()));
+      }
+    }
+    [_prependListeners](listeners) {
+      if (listeners == null) return;
+      if (dart.test(this[_mayAddListener])) {
+        let existingListeners = async._FutureListener._check(this[_resultOrListeners]);
+        this[_resultOrListeners] = listeners;
+        if (existingListeners != null) {
+          let cursor = listeners;
+          while (cursor[_nextListener] != null) {
+            cursor = cursor[_nextListener];
+          }
+          cursor[_nextListener] = existingListeners;
+        }
+      } else {
+        if (dart.test(this[_isChained])) {
+          let source = this[_chainSource];
+          if (!dart.test(source[_isComplete])) {
+            source[_prependListeners](listeners);
+            return;
+          }
+          this[_cloneResult](source);
+        }
+        dart.assert(this[_isComplete]);
+        listeners = this[_reverseListeners](listeners);
+        this[_zone].scheduleMicrotask(dart.fn(() => {
+          async._Future._propagateToListeners(this, listeners);
+        }, VoidToNull()));
+      }
+    }
+    [_removeListeners]() {
+      dart.assert(!dart.test(this[_isComplete]));
+      let current = async._FutureListener._check(this[_resultOrListeners]);
+      this[_resultOrListeners] = null;
+      return this[_reverseListeners](current);
+    }
+    [_reverseListeners](listeners) {
+      let prev = null;
+      let current = listeners;
+      while (current != null) {
+        let next = current[_nextListener];
+        current[_nextListener] = prev;
+        prev = current;
+        current = next;
+      }
+      return prev;
+    }
+    static _chainForeignFuture(source, target) {
+      dart.assert(!dart.test(target[_isComplete]));
+      dart.assert(!async._Future.is(source));
+      target[_setPendingComplete]();
+      try {
+        source.then(dart.dynamic)(dart.fn(value => {
+          dart.assert(target[_isPendingComplete]);
+          target[_clearPendingComplete]();
+          target[_complete](value);
+        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
+            if (stackTrace === void 0) stackTrace = null;
+            dart.assert(target[_isPendingComplete]);
+            target[_completeError](error, core.StackTrace._check(stackTrace));
+          }, dynamic__ToNull())});
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async.scheduleMicrotask(dart.fn(() => {
+          target[_completeError](e, s);
+        }, VoidToNull()));
+      }
+
+    }
+    static _chainCoreFuture(source, target) {
+      dart.assert(target[_mayAddListener]);
+      while (dart.test(source[_isChained])) {
+        source = source[_chainSource];
+      }
+      if (dart.test(source[_isComplete])) {
+        let listeners = target[_removeListeners]();
+        target[_cloneResult](source);
+        async._Future._propagateToListeners(target, listeners);
+      } else {
+        let listeners = async._FutureListener._check(target[_resultOrListeners]);
+        target[_setChained](source);
+        source[_prependListeners](listeners);
+      }
+    }
+    [_complete](value) {
+      dart.assert(!dart.test(this[_isComplete]));
+      if (async.Future.is(value)) {
+        if (async._Future.is(value)) {
+          async._Future._chainCoreFuture(value, this);
+        } else {
+          async._Future._chainForeignFuture(value, this);
+        }
+      } else {
+        let listeners = this[_removeListeners]();
+        this[_setValue](T.as(value));
+        async._Future._propagateToListeners(this, listeners);
+      }
+    }
+    [_completeWithValue](value) {
+      T._check(value);
+      dart.assert(!dart.test(this[_isComplete]));
+      dart.assert(!async.Future.is(value));
+      let listeners = this[_removeListeners]();
+      this[_setValue](value);
+      async._Future._propagateToListeners(this, listeners);
+    }
+    [_completeError](error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      dart.assert(!dart.test(this[_isComplete]));
+      let listeners = this[_removeListeners]();
+      this[_setError](error, stackTrace);
+      async._Future._propagateToListeners(this, listeners);
+    }
+    [_asyncComplete](value) {
+      dart.assert(!dart.test(this[_isComplete]));
+      if (async.Future.is(value)) {
+        let typedFuture = FutureOfT().as(value);
+        if (async._Future.is(typedFuture)) {
+          let coreFuture = _FutureOfT()._check(typedFuture);
+          if (dart.test(coreFuture[_hasError])) {
+            this[_setPendingComplete]();
+            this[_zone].scheduleMicrotask(dart.fn(() => {
+              async._Future._chainCoreFuture(coreFuture, this);
+            }, VoidToNull()));
+          } else {
+            async._Future._chainCoreFuture(coreFuture, this);
+          }
+        } else {
+          async._Future._chainForeignFuture(typedFuture, this);
+        }
+        return;
+      }
+      let typedValue = T.as(value);
+      this[_setPendingComplete]();
+      this[_zone].scheduleMicrotask(dart.fn(() => {
+        this[_completeWithValue](typedValue);
+      }, VoidToNull()));
+    }
+    [_asyncCompleteError](error, stackTrace) {
+      dart.assert(!dart.test(this[_isComplete]));
+      this[_setPendingComplete]();
+      this[_zone].scheduleMicrotask(dart.fn(() => {
+        this[_completeError](error, stackTrace);
+      }, VoidToNull()));
+    }
+    static _propagateToListeners(source, listeners) {
+      while (true) {
+        dart.assert(source[_isComplete]);
+        let hasError = source[_hasError];
+        if (listeners == null) {
+          if (dart.test(hasError)) {
+            let asyncError = source[_error];
+            source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
+          }
+          return;
+        }
+        while (listeners[_nextListener] != null) {
+          let listener = listeners;
+          listeners = listener[_nextListener];
+          listener[_nextListener] = null;
+          async._Future._propagateToListeners(source, listener);
+        }
+        let listener = listeners;
+        let sourceResult = source[_resultOrListeners];
+        let listenerHasError = hasError;
+        let listenerValueOrError = sourceResult;
+        if (dart.test(hasError) || dart.test(listener.handlesValue) || dart.test(listener.handlesComplete)) {
+          let zone = listener[_zone];
+          if (dart.test(hasError) && !dart.test(source[_zone].inSameErrorZone(zone))) {
+            let asyncError = source[_error];
+            source[_zone].handleUncaughtError(dart.dynamic)(asyncError.error, asyncError.stackTrace);
+            return;
+          }
+          let oldZone = null;
+          if (!core.identical(async.Zone.current, zone)) {
+            oldZone = async.Zone._enter(zone);
+          }
+          function handleWhenCompleteCallback() {
+            dart.assert(!dart.test(listener.handlesValue));
+            dart.assert(!dart.test(listener.handlesError));
+            let completeResult = null;
+            try {
+              completeResult = listener.handleWhenComplete();
+            } catch (e) {
+              let s = dart.stackTrace(e);
+              if (dart.test(hasError) && core.identical(source[_error].error, e)) {
+                listenerValueOrError = source[_error];
+              } else {
+                listenerValueOrError = new async.AsyncError(e, s);
+              }
+              listenerHasError = true;
+              return;
+            }
+
+            if (async.Future.is(completeResult)) {
+              if (async._Future.is(completeResult) && dart.test(completeResult[_isComplete])) {
+                if (dart.test(completeResult[_hasError])) {
+                  listenerValueOrError = completeResult[_error];
+                  listenerHasError = true;
+                }
+                return;
+              }
+              let originalSource = source;
+              listenerValueOrError = completeResult.then(dart.dynamic)(dart.fn(_ => originalSource, dynamicTo_Future()));
+              listenerHasError = false;
+            }
+          }
+          dart.fn(handleWhenCompleteCallback, VoidTovoid$());
+          function handleValueCallback() {
+            try {
+              listenerValueOrError = listener.handleValue(sourceResult);
+            } catch (e) {
+              let s = dart.stackTrace(e);
+              listenerValueOrError = new async.AsyncError(e, s);
+              listenerHasError = true;
+            }
+
+          }
+          dart.fn(handleValueCallback, VoidTovoid$());
+          function handleError() {
+            try {
+              let asyncError = source[_error];
+              if (dart.test(listener.matchesErrorTest(asyncError)) && dart.test(listener.hasErrorCallback)) {
+                listenerValueOrError = listener.handleError(asyncError);
+                listenerHasError = false;
+              }
+            } catch (e) {
+              let s = dart.stackTrace(e);
+              if (core.identical(source[_error].error, e)) {
+                listenerValueOrError = source[_error];
+              } else {
+                listenerValueOrError = new async.AsyncError(e, s);
+              }
+              listenerHasError = true;
+            }
+
+          }
+          dart.fn(handleError, VoidTovoid$());
+          if (dart.test(listener.handlesComplete)) {
+            handleWhenCompleteCallback();
+          } else if (!dart.test(hasError)) {
+            if (dart.test(listener.handlesValue)) {
+              handleValueCallback();
+            }
+          } else {
+            if (dart.test(listener.handlesError)) {
+              handleError();
+            }
+          }
+          if (oldZone != null) async.Zone._leave(oldZone);
+          if (async.Future.is(listenerValueOrError)) {
+            let chainSource = async.Future._check(listenerValueOrError);
+            let result = listener.result;
+            if (async._Future.is(chainSource)) {
+              if (dart.test(chainSource[_isComplete])) {
+                listeners = result[_removeListeners]();
+                result[_cloneResult](chainSource);
+                source = chainSource;
+                continue;
+              } else {
+                async._Future._chainCoreFuture(chainSource, result);
+              }
+            } else {
+              async._Future._chainForeignFuture(chainSource, result);
+            }
+            return;
+          }
+        }
+        let result = listener.result;
+        listeners = result[_removeListeners]();
+        if (!dart.test(listenerHasError)) {
+          result[_setValue](listenerValueOrError);
+        } else {
+          let asyncError = async.AsyncError._check(listenerValueOrError);
+          result[_setErrorObject](asyncError);
+        }
+        source = result;
+      }
+    }
+    timeout(timeLimit, opts) {
+      let onTimeout = opts && 'onTimeout' in opts ? opts.onTimeout : null;
+      if (dart.test(this[_isComplete])) return new (_FutureOfT()).immediate(this);
+      let result = new (_FutureOfT())();
+      let timer = null;
+      if (onTimeout == null) {
+        timer = async.Timer.new(timeLimit, dart.fn(() => {
+          result[_completeError](new async.TimeoutException("Future not completed", timeLimit));
+        }, VoidToNull()));
+      } else {
+        let zone = async.Zone.current;
+        onTimeout = zone.registerCallback(dart.dynamic)(onTimeout);
+        timer = async.Timer.new(timeLimit, dart.fn(() => {
+          try {
+            result[_complete](zone.run(dart.dynamic)(onTimeout));
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            result[_completeError](e, s);
+          }
+
+        }, VoidToNull()));
+      }
+      this.then(dart.dynamic)(dart.fn(v => {
+        if (dart.test(timer.isActive)) {
+          timer.cancel();
+          result[_completeWithValue](v);
+        }
+      }, TToNull()), {onError: dart.fn((e, s) => {
+          if (dart.test(timer.isActive)) {
+            timer.cancel();
+            result[_completeError](e, core.StackTrace._check(s));
+          }
+        }, dynamicAnddynamicToNull())});
+      return result;
+    }
+  }
+  dart.addTypeTests(_Future);
+  dart.defineNamedConstructor(_Future, 'immediate');
+  dart.defineNamedConstructor(_Future, 'immediateError');
+  _Future[dart.implements] = () => [FutureOfT()];
+  dart.setSignature(_Future, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async._Future$(T), []),
+      immediate: dart.definiteFunctionType(async._Future$(T), [dart.dynamic]),
+      immediateError: dart.definiteFunctionType(async._Future$(T), [dart.dynamic], [core.StackTrace])
+    }),
+    fields: () => ({
+      [_state]: core.int,
+      [_zone]: async.Zone,
+      [_resultOrListeners]: dart.dynamic
+    }),
+    getters: () => ({
+      [_mayComplete]: dart.definiteFunctionType(core.bool, []),
+      [_isPendingComplete]: dart.definiteFunctionType(core.bool, []),
+      [_mayAddListener]: dart.definiteFunctionType(core.bool, []),
+      [_isChained]: dart.definiteFunctionType(core.bool, []),
+      [_isComplete]: dart.definiteFunctionType(core.bool, []),
+      [_hasError]: dart.definiteFunctionType(core.bool, []),
+      [_error]: dart.definiteFunctionType(async.AsyncError, []),
+      [_chainSource]: dart.definiteFunctionType(async._Future, [])
+    }),
+    methods: () => ({
+      [_setChained]: dart.definiteFunctionType(dart.void, [async._Future]),
+      then: dart.definiteFunctionType(E => [async.Future$(E), [dart.functionType(async.FutureOr$(E), [T])], {onError: core.Function}]),
+      [_thenNoZoneRegistration]: dart.definiteFunctionType(E => [async.Future$(E), [TTodynamic(), core.Function]]),
+      catchError: dart.definiteFunctionType(async.Future$(T), [core.Function], {test: dynamicTobool()}),
+      whenComplete: dart.definiteFunctionType(async.Future$(T), [VoidTodynamic()]),
+      asStream: dart.definiteFunctionType(async.Stream$(T), []),
+      [_setPendingComplete]: dart.definiteFunctionType(dart.void, []),
+      [_clearPendingComplete]: dart.definiteFunctionType(dart.void, []),
+      [_setValue]: dart.definiteFunctionType(dart.void, [T]),
+      [_setErrorObject]: dart.definiteFunctionType(dart.void, [async.AsyncError]),
+      [_setError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_cloneResult]: dart.definiteFunctionType(dart.void, [async._Future]),
+      [_addListener]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
+      [_prependListeners]: dart.definiteFunctionType(dart.void, [async._FutureListener]),
+      [_removeListeners]: dart.definiteFunctionType(async._FutureListener, []),
+      [_reverseListeners]: dart.definiteFunctionType(async._FutureListener, [async._FutureListener]),
+      [_complete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      [_completeWithValue]: dart.definiteFunctionType(dart.void, [T]),
+      [_completeError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+      [_asyncComplete]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      [_asyncCompleteError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
+      timeout: dart.definiteFunctionType(async.Future$(T), [core.Duration], {onTimeout: VoidTodynamic()})
+    }),
+    sfields: () => ({
+      _INCOMPLETE: core.int,
+      _PENDING_COMPLETE: core.int,
+      _CHAINED: core.int,
+      _VALUE: core.int,
+      _ERROR: core.int
+    }),
+    statics: () => ({
+      _chainForeignFuture: dart.definiteFunctionType(dart.void, [async.Future, async._Future]),
+      _chainCoreFuture: dart.definiteFunctionType(dart.void, [async._Future, async._Future]),
+      _propagateToListeners: dart.definiteFunctionType(dart.void, [async._Future, async._FutureListener])
+    }),
+    names: ['_chainForeignFuture', '_chainCoreFuture', '_propagateToListeners']
+  });
+  return _Future;
+}));
+async._Future = _Future();
+async._Future._INCOMPLETE = 0;
+async._Future._PENDING_COMPLETE = 1;
+async._Future._CHAINED = 2;
+async._Future._VALUE = 4;
+async._Future._ERROR = 8;
+async._AsyncCallback = dart.typedef('_AsyncCallback', () => dart.functionType(dart.void, []));
+async._AsyncCallbackEntry = class _AsyncCallbackEntry extends core.Object {
+  new(callback) {
+    this.callback = callback;
+    this.next = null;
+  }
+};
+dart.setSignature(async._AsyncCallbackEntry, {
+  constructors: () => ({new: dart.definiteFunctionType(async._AsyncCallbackEntry, [async._AsyncCallback])}),
+  fields: () => ({
+    callback: async._AsyncCallback,
+    next: async._AsyncCallbackEntry
+  })
+});
+async._nextCallback = null;
+async._lastCallback = null;
+async._lastPriorityCallback = null;
+async._isInCallbackLoop = false;
+async._microtaskLoop = function() {
+  while (async._nextCallback != null) {
+    async._lastPriorityCallback = null;
+    let entry = async._nextCallback;
+    async._nextCallback = entry.next;
+    if (async._nextCallback == null) async._lastCallback = null;
+    entry.callback();
+  }
+};
+dart.fn(async._microtaskLoop, VoidTovoid$());
+async._startMicrotaskLoop = function() {
+  async._isInCallbackLoop = true;
+  try {
+    async._microtaskLoop();
+  } finally {
+    async._lastPriorityCallback = null;
+    async._isInCallbackLoop = false;
+    if (async._nextCallback != null) {
+      async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
+    }
+  }
+};
+dart.fn(async._startMicrotaskLoop, VoidTovoid$());
+async._scheduleAsyncCallback = function(callback) {
+  let newEntry = new async._AsyncCallbackEntry(callback);
+  if (async._nextCallback == null) {
+    async._nextCallback = async._lastCallback = newEntry;
+    if (!dart.test(async._isInCallbackLoop)) {
+      async._AsyncRun._scheduleImmediate(async._startMicrotaskLoop);
+    }
+  } else {
+    async._lastCallback.next = newEntry;
+    async._lastCallback = newEntry;
+  }
+};
+dart.fn(async._scheduleAsyncCallback, _AsyncCallbackTovoid());
+async._schedulePriorityAsyncCallback = function(callback) {
+  if (async._nextCallback == null) {
+    async._scheduleAsyncCallback(callback);
+    async._lastPriorityCallback = async._lastCallback;
+    return;
+  }
+  let entry = new async._AsyncCallbackEntry(callback);
+  if (async._lastPriorityCallback == null) {
+    entry.next = async._nextCallback;
+    async._nextCallback = async._lastPriorityCallback = entry;
+  } else {
+    entry.next = async._lastPriorityCallback.next;
+    async._lastPriorityCallback.next = entry;
+    async._lastPriorityCallback = entry;
+    if (entry.next == null) {
+      async._lastCallback = entry;
+    }
+  }
+};
+dart.fn(async._schedulePriorityAsyncCallback, _AsyncCallbackTovoid());
+const _scheduleMicrotask = Symbol('_scheduleMicrotask');
+async.scheduleMicrotask = function(callback) {
+  let currentZone = async._Zone._check(async.Zone.current);
+  if (core.identical(async._ROOT_ZONE, currentZone)) {
+    async._rootScheduleMicrotask(null, null, async._ROOT_ZONE, callback);
+    return;
+  }
+  let implementation = currentZone[_scheduleMicrotask];
+  if (core.identical(async._ROOT_ZONE, implementation.zone) && dart.test(async._ROOT_ZONE.inSameErrorZone(currentZone))) {
+    async._rootScheduleMicrotask(null, null, currentZone, currentZone.registerCallback(dart.void)(callback));
+    return;
+  }
+  async.Zone.current.scheduleMicrotask(async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
+};
+dart.fn(async.scheduleMicrotask, _AsyncCallbackTovoid());
+async._AsyncRun = class _AsyncRun extends core.Object {
+  static _scheduleImmediate(callback) {
+    async._AsyncRun._scheduleImmediateClosure(callback);
+  }
+  static _initializeScheduleImmediate() {
+    if (_isolate_helper.global.scheduleImmediate != null) {
+      return async._AsyncRun._scheduleImmediateJsOverride;
+    }
+    if (_isolate_helper.global.MutationObserver != null && _isolate_helper.global.document != null) {
+      let div = _isolate_helper.global.document.createElement("div");
+      let span = _isolate_helper.global.document.createElement("span");
+      let storedCallback = null;
+      function internalCallback(_) {
+        _isolate_helper.leaveJsAsync();
+        let f = storedCallback;
+        storedCallback = null;
+        f();
+      }
+      dart.fn(internalCallback, dynamicToNull$());
+      ;
+      let observer = new _isolate_helper.global.MutationObserver(internalCallback);
+      observer.observe(div, {childList: true});
+      return dart.fn(callback => {
+        dart.assert(storedCallback == null);
+        _isolate_helper.enterJsAsync();
+        storedCallback = callback;
+        div.firstChild ? div.removeChild(span) : div.appendChild(span);
+      }, FnToNull());
+    } else if (_isolate_helper.global.setImmediate != null) {
+      return async._AsyncRun._scheduleImmediateWithSetImmediate;
+    }
+    return async._AsyncRun._scheduleImmediateWithTimer;
+  }
+  static _scheduleImmediateJsOverride(callback) {
+    function internalCallback() {
+      _isolate_helper.leaveJsAsync();
+      callback();
+    }
+    dart.fn(internalCallback, VoidToNull());
+    ;
+    _isolate_helper.enterJsAsync();
+    _isolate_helper.global.scheduleImmediate(internalCallback);
+  }
+  static _scheduleImmediateWithSetImmediate(callback) {
+    function internalCallback() {
+      _isolate_helper.leaveJsAsync();
+      callback();
+    }
+    dart.fn(internalCallback, VoidToNull());
+    ;
+    _isolate_helper.enterJsAsync();
+    _isolate_helper.global.setImmediate(internalCallback);
+  }
+  static _scheduleImmediateWithTimer(callback) {
+    async.Timer._createTimer(core.Duration.ZERO, callback);
+  }
+};
+dart.setSignature(async._AsyncRun, {
+  sfields: () => ({_scheduleImmediateClosure: async._TakeCallback}),
+  statics: () => ({
+    _scheduleImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    _initializeScheduleImmediate: dart.definiteFunctionType(async._TakeCallback, []),
+    _scheduleImmediateJsOverride: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    _scheduleImmediateWithSetImmediate: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    _scheduleImmediateWithTimer: dart.definiteFunctionType(dart.void, [VoidTovoid()])
+  }),
+  names: ['_scheduleImmediate', '_initializeScheduleImmediate', '_scheduleImmediateJsOverride', '_scheduleImmediateWithSetImmediate', '_scheduleImmediateWithTimer']
+});
+dart.defineLazy(async._AsyncRun, {
+  get _scheduleImmediateClosure() {
+    return async._AsyncRun._initializeScheduleImmediate();
+  }
+});
+async._TimerCallback = dart.typedef('_TimerCallback', () => dart.functionType(dart.void, []));
+async.StreamSubscription$ = dart.generic(T => {
+  class StreamSubscription extends core.Object {}
+  dart.addTypeTests(StreamSubscription);
+  return StreamSubscription;
+});
+async.StreamSubscription = StreamSubscription();
+async.EventSink$ = dart.generic(T => {
+  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
+  class EventSink extends core.Object {}
+  dart.addTypeTests(EventSink);
+  EventSink[dart.implements] = () => [SinkOfT()];
+  return EventSink;
+});
+async.EventSink = EventSink();
+const _stream = Symbol('_stream');
+async.StreamView$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class StreamView extends async.Stream$(T) {
+    new(stream) {
+      this[_stream] = stream;
+      super._internal();
+    }
+    get isBroadcast() {
+      return this[_stream].isBroadcast;
+    }
+    asBroadcastStream(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      return this[_stream].asBroadcastStream({onListen: onListen, onCancel: onCancel});
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }
+  }
+  dart.setSignature(StreamView, {
+    constructors: () => ({new: dart.definiteFunctionType(async.StreamView$(T), [StreamOfT()])}),
+    fields: () => ({[_stream]: StreamOfT()}),
+    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+  });
+  return StreamView;
+});
+async.StreamView = StreamView();
+async.StreamConsumer$ = dart.generic(S => {
+  class StreamConsumer extends core.Object {}
+  dart.addTypeTests(StreamConsumer);
+  return StreamConsumer;
+});
+async.StreamConsumer = StreamConsumer();
+async.StreamSink$ = dart.generic(S => {
+  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
+  let StreamConsumerOfS = () => (StreamConsumerOfS = dart.constFn(async.StreamConsumer$(S)))();
+  class StreamSink extends core.Object {}
+  dart.addTypeTests(StreamSink);
+  StreamSink[dart.implements] = () => [EventSinkOfS(), StreamConsumerOfS()];
+  return StreamSink;
+});
+async.StreamSink = StreamSink();
+async.StreamTransformer$ = dart.generic((S, T) => {
+  let _StreamSubscriptionTransformerOfS$T = () => (_StreamSubscriptionTransformerOfS$T = dart.constFn(async._StreamSubscriptionTransformer$(S, T)))();
+  let _StreamHandlerTransformerOfS$T = () => (_StreamHandlerTransformerOfS$T = dart.constFn(async._StreamHandlerTransformer$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let StreamOfSAndboolToStreamSubscriptionOfT = () => (StreamOfSAndboolToStreamSubscriptionOfT = dart.constFn(dart.functionType(StreamSubscriptionOfT(), [StreamOfS(), core.bool])))();
+  let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
+  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
+  class StreamTransformer extends core.Object {
+    static new(transformer) {
+      return new (_StreamSubscriptionTransformerOfS$T())(transformer);
+    }
+    static fromHandlers(opts) {
+      return new (_StreamHandlerTransformerOfS$T())(opts);
+    }
+  }
+  dart.addTypeTests(StreamTransformer);
+  dart.setSignature(StreamTransformer, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async.StreamTransformer$(S, T), [StreamOfSAndboolToStreamSubscriptionOfT()]),
+      fromHandlers: dart.definiteFunctionType(async.StreamTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})
+    })
+  });
+  return StreamTransformer;
+});
+async.StreamTransformer = StreamTransformer();
+async.StreamIterator$ = dart.generic(T => {
+  let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class StreamIterator extends core.Object {
+    static new(stream) {
+      return new (_StreamIteratorImplOfT())(stream);
+    }
+  }
+  dart.addTypeTests(StreamIterator);
+  dart.setSignature(StreamIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(async.StreamIterator$(T), [StreamOfT()])})
+  });
+  return StreamIterator;
+});
+async.StreamIterator = StreamIterator();
+async._ControllerEventSinkWrapper$ = dart.generic(T => {
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  class _ControllerEventSinkWrapper extends core.Object {
+    new(sink) {
+      this[_sink] = sink;
+    }
+    add(data) {
+      T._check(data);
+      this[_sink].add(data);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_sink].addError(error, stackTrace);
+    }
+    close() {
+      this[_sink].close();
+    }
+  }
+  dart.addTypeTests(_ControllerEventSinkWrapper);
+  _ControllerEventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
+  dart.setSignature(_ControllerEventSinkWrapper, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ControllerEventSinkWrapper$(T), [async.EventSink])}),
+    fields: () => ({[_sink]: async.EventSink}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _ControllerEventSinkWrapper;
+});
+async._ControllerEventSinkWrapper = _ControllerEventSinkWrapper();
+async.ControllerCallback = dart.typedef('ControllerCallback', () => dart.functionType(dart.void, []));
+async.ControllerCancelCallback = dart.typedef('ControllerCancelCallback', () => dart.functionType(dart.dynamic, []));
+async.StreamController$ = dart.generic(T => {
+  let _SyncStreamControllerOfT = () => (_SyncStreamControllerOfT = dart.constFn(async._SyncStreamController$(T)))();
+  let _AsyncStreamControllerOfT = () => (_AsyncStreamControllerOfT = dart.constFn(async._AsyncStreamController$(T)))();
+  let _SyncBroadcastStreamControllerOfT = () => (_SyncBroadcastStreamControllerOfT = dart.constFn(async._SyncBroadcastStreamController$(T)))();
+  let _AsyncBroadcastStreamControllerOfT = () => (_AsyncBroadcastStreamControllerOfT = dart.constFn(async._AsyncBroadcastStreamController$(T)))();
+  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
+  class StreamController extends core.Object {
+    static new(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onPause = opts && 'onPause' in opts ? opts.onPause : null;
+      let onResume = opts && 'onResume' in opts ? opts.onResume : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      let sync = opts && 'sync' in opts ? opts.sync : false;
+      return dart.test(sync) ? new (_SyncStreamControllerOfT())(onListen, onPause, onResume, onCancel) : new (_AsyncStreamControllerOfT())(onListen, onPause, onResume, onCancel);
+    }
+    static broadcast(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      let sync = opts && 'sync' in opts ? opts.sync : false;
+      return dart.test(sync) ? new (_SyncBroadcastStreamControllerOfT())(onListen, onCancel) : new (_AsyncBroadcastStreamControllerOfT())(onListen, onCancel);
+    }
+  }
+  dart.addTypeTests(StreamController);
+  StreamController[dart.implements] = () => [StreamSinkOfT()];
+  dart.setSignature(StreamController, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onPause: VoidTovoid(), onResume: VoidTovoid(), onCancel: VoidTodynamic(), sync: core.bool}),
+      broadcast: dart.definiteFunctionType(async.StreamController$(T), [], {onListen: VoidTovoid(), onCancel: VoidTovoid(), sync: core.bool})
+    })
+  });
+  return StreamController;
+});
+async.StreamController = StreamController();
+async.SynchronousStreamController$ = dart.generic(T => {
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  class SynchronousStreamController extends core.Object {}
+  dart.addTypeTests(SynchronousStreamController);
+  SynchronousStreamController[dart.implements] = () => [StreamControllerOfT()];
+  return SynchronousStreamController;
+});
+async.SynchronousStreamController = SynchronousStreamController();
+async._StreamControllerLifecycle$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  class _StreamControllerLifecycle extends core.Object {
+    [_recordPause](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+    }
+    [_recordResume](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+    }
+    [_recordCancel](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+      return null;
+    }
+  }
+  dart.addTypeTests(_StreamControllerLifecycle);
+  dart.setSignature(_StreamControllerLifecycle, {
+    methods: () => ({
+      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
+      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
+      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()])
+    })
+  });
+  return _StreamControllerLifecycle;
+});
+async._StreamControllerLifecycle = _StreamControllerLifecycle();
+const _varData = Symbol('_varData');
+const _isInitialState = Symbol('_isInitialState');
+const _subscription = Symbol('_subscription');
+const _pendingEvents = Symbol('_pendingEvents');
+const _ensurePendingEvents = Symbol('_ensurePendingEvents');
+const _badEventState = Symbol('_badEventState');
+let const$9;
+async._StreamController$ = dart.generic(T => {
+  let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
+  let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
+  let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
+  let _StreamControllerAddStreamStateOfT = () => (_StreamControllerAddStreamStateOfT = dart.constFn(async._StreamControllerAddStreamState$(T)))();
+  let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
+  let _ControllerSubscriptionOfT = () => (_ControllerSubscriptionOfT = dart.constFn(async._ControllerSubscription$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _StreamController extends core.Object {
+    new(onListen, onPause, onResume, onCancel) {
+      this.onListen = onListen;
+      this.onPause = onPause;
+      this.onResume = onResume;
+      this.onCancel = onCancel;
+      this[_varData] = null;
+      this[_state] = async._StreamController._STATE_INITIAL;
+      this[_doneFuture] = null;
+    }
+    get stream() {
+      return new (_ControllerStreamOfT())(this);
+    }
+    get sink() {
+      return new (_StreamSinkWrapperOfT())(this);
+    }
+    get [_isCanceled]() {
+      return (dart.notNull(this[_state]) & async._StreamController._STATE_CANCELED) != 0;
+    }
+    get hasListener() {
+      return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIBED) != 0;
+    }
+    get [_isInitialState]() {
+      return (dart.notNull(this[_state]) & async._StreamController._STATE_SUBSCRIPTION_MASK) == async._StreamController._STATE_INITIAL;
+    }
+    get isClosed() {
+      return (dart.notNull(this[_state]) & async._StreamController._STATE_CLOSED) != 0;
+    }
+    get isPaused() {
+      return dart.test(this.hasListener) ? this[_subscription][_isInputPaused] : !dart.test(this[_isCanceled]);
+    }
+    get [_isAddingStream]() {
+      return (dart.notNull(this[_state]) & async._StreamController._STATE_ADDSTREAM) != 0;
+    }
+    get [_mayAddEvent]() {
+      return dart.notNull(this[_state]) < async._StreamController._STATE_CLOSED;
+    }
+    get [_pendingEvents]() {
+      dart.assert(this[_isInitialState]);
+      if (!dart.test(this[_isAddingStream])) {
+        return _PendingEventsOfT().as(this[_varData]);
+      }
+      let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+      return _PendingEventsOfT().as(state.varData);
+    }
+    [_ensurePendingEvents]() {
+      dart.assert(this[_isInitialState]);
+      if (!dart.test(this[_isAddingStream])) {
+        if (this[_varData] == null) this[_varData] = new (_StreamImplEventsOfT())();
+        return _StreamImplEventsOfT().as(this[_varData]);
+      }
+      let state = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+      if (state.varData == null) state.varData = new (_StreamImplEventsOfT())();
+      return _StreamImplEventsOfT().as(state.varData);
+    }
+    get [_subscription]() {
+      dart.assert(this.hasListener);
+      if (dart.test(this[_isAddingStream])) {
+        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+        return _ControllerSubscriptionOfT().as(addState.varData);
+      }
+      return _ControllerSubscriptionOfT().as(this[_varData]);
+    }
+    [_badEventState]() {
+      if (dart.test(this.isClosed)) {
+        return new core.StateError("Cannot add event after closing");
+      }
+      dart.assert(this[_isAddingStream]);
+      return new core.StateError("Cannot add event while adding a stream");
+    }
+    addStream(source, opts) {
+      StreamOfT()._check(source);
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
+      if (dart.test(this[_isCanceled])) return new async._Future.immediate(null);
+      let addState = new (_StreamControllerAddStreamStateOfT())(this, this[_varData], source, cancelOnError);
+      this[_varData] = addState;
+      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_ADDSTREAM) >>> 0;
+      return addState.addStreamFuture;
+    }
+    get done() {
+      return this[_ensureDoneFuture]();
+    }
+    [_ensureDoneFuture]() {
+      if (this[_doneFuture] == null) {
+        this[_doneFuture] = dart.test(this[_isCanceled]) ? async.Future._nullFuture : new async._Future();
+      }
+      return this[_doneFuture];
+    }
+    add(value) {
+      T._check(value);
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
+      this[_add$](value);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
+      error = async._nonNullError(error);
+      let replacement = async.Zone.current.errorCallback(error, stackTrace);
+      if (replacement != null) {
+        error = async._nonNullError(replacement.error);
+        stackTrace = replacement.stackTrace;
+      }
+      this[_addError](error, stackTrace);
+    }
+    close() {
+      if (dart.test(this.isClosed)) {
+        return this[_ensureDoneFuture]();
+      }
+      if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
+      this[_closeUnchecked]();
+      return this[_ensureDoneFuture]();
+    }
+    [_closeUnchecked]() {
+      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_CLOSED) >>> 0;
+      if (dart.test(this.hasListener)) {
+        this[_sendDone]();
+      } else if (dart.test(this[_isInitialState])) {
+        this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
+      }
+    }
+    [_add$](value) {
+      T._check(value);
+      if (dart.test(this.hasListener)) {
+        this[_sendData](value);
+      } else if (dart.test(this[_isInitialState])) {
+        this[_ensurePendingEvents]().add(new (_DelayedDataOfT())(value));
+      }
+    }
+    [_addError](error, stackTrace) {
+      if (dart.test(this.hasListener)) {
+        this[_sendError](error, stackTrace);
+      } else if (dart.test(this[_isInitialState])) {
+        this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
+      }
+    }
+    [_close$]() {
+      dart.assert(this[_isAddingStream]);
+      let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+      this[_varData] = addState.varData;
+      this[_state] = (dart.notNull(this[_state]) & ~async._StreamController._STATE_ADDSTREAM) >>> 0;
+      addState.complete();
+    }
+    [_subscribe](onData, onError, onDone, cancelOnError) {
+      if (!dart.test(this[_isInitialState])) {
+        dart.throw(new core.StateError("Stream has already been listened to."));
+      }
+      let subscription = new (_ControllerSubscriptionOfT())(this, onData, onError, onDone, cancelOnError);
+      let pendingEvents = this[_pendingEvents];
+      this[_state] = (dart.notNull(this[_state]) | async._StreamController._STATE_SUBSCRIBED) >>> 0;
+      if (dart.test(this[_isAddingStream])) {
+        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+        addState.varData = subscription;
+        addState.resume();
+      } else {
+        this[_varData] = subscription;
+      }
+      subscription[_setPendingEvents](pendingEvents);
+      subscription[_guardCallback](dart.fn(() => {
+        async._runGuarded(this.onListen);
+      }, VoidToNull()));
+      return subscription;
+    }
+    [_recordCancel](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+      let result = null;
+      if (dart.test(this[_isAddingStream])) {
+        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+        result = addState.cancel();
+      }
+      this[_varData] = null;
+      this[_state] = (dart.notNull(this[_state]) & ~(async._StreamController._STATE_SUBSCRIBED | async._StreamController._STATE_ADDSTREAM) | async._StreamController._STATE_CANCELED) >>> 0;
+      if (this.onCancel != null) {
+        if (result == null) {
+          try {
+            result = async.Future._check(this.onCancel());
+          } catch (e) {
+            let s = dart.stackTrace(e);
+            result = new async._Future();
+            result[_asyncCompleteError](e, s);
+          }
+
+        } else {
+          result = result.whenComplete(this.onCancel);
+        }
+      }
+      const complete = (function() {
+        if (this[_doneFuture] != null && dart.test(this[_doneFuture][_mayComplete])) {
+          this[_doneFuture][_asyncComplete](null);
+        }
+      }).bind(this);
+      dart.fn(complete, VoidTovoid$());
+      if (result != null) {
+        result = result.whenComplete(complete);
+      } else {
+        complete();
       }
       return result;
     }
-    startChunkedConversion(sink) {
-      if (!convert.ByteConversionSink.is(sink)) {
-        sink = convert.ByteConversionSink.from(sink);
+    [_recordPause](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+      if (dart.test(this[_isAddingStream])) {
+        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+        addState.pause();
       }
-      return new convert._UnicodeSubsetEncoderSink(this[_subsetMask], convert.ByteConversionSink._check(sink));
+      async._runGuarded(this.onPause);
     }
-    bind(stream) {
-      return super.bind(stream);
-    }
-  };
-  dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
-  dart.setSignature(convert._UnicodeSubsetEncoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoder, [core.int])}),
-    fields: () => ({[_subsetMask]: core.int}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
-    })
-  });
-  convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {
-    new() {
-      super.new(convert._ASCII_MASK);
-    }
-  };
-  dart.setSignature(convert.AsciiEncoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiEncoder, [])})
-  });
-  convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
-    new(subsetMask, sink) {
-      this[_subsetMask] = subsetMask;
-      this[_sink$] = sink;
-    }
-    close() {
-      this[_sink$].close();
-    }
-    addSlice(source, start, end, isLast) {
-      core.RangeError.checkValidRange(start, end, source[dartx.length]);
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let codeUnit = source[dartx.codeUnitAt](i);
-        if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
-          dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
-        }
+    [_recordResume](subscription) {
+      StreamSubscriptionOfT()._check(subscription);
+      if (dart.test(this[_isAddingStream])) {
+        let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
+        addState.resume();
       }
-      this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
-      if (dart.test(isLast)) {
-        this.close();
-      }
+      async._runGuarded(this.onResume);
     }
-  };
-  dart.setSignature(convert._UnicodeSubsetEncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
+  }
+  dart.addTypeTests(_StreamController);
+  _StreamController[dart.implements] = () => [StreamControllerOfT(), _StreamControllerLifecycleOfT(), _EventSinkOfT(), _EventDispatchOfT()];
+  dart.setSignature(_StreamController, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamController$(T), [async.ControllerCallback, async.ControllerCallback, async.ControllerCallback, async.ControllerCancelCallback])}),
     fields: () => ({
-      [_sink$]: convert.ByteConversionSink,
-      [_subsetMask]: core.int
+      [_varData]: dart.dynamic,
+      [_state]: core.int,
+      [_doneFuture]: async._Future,
+      onListen: async.ControllerCallback,
+      onPause: async.ControllerCallback,
+      onResume: async.ControllerCallback,
+      onCancel: async.ControllerCancelCallback
+    }),
+    getters: () => ({
+      stream: dart.definiteFunctionType(async.Stream$(T), []),
+      sink: dart.definiteFunctionType(async.StreamSink$(T), []),
+      [_isCanceled]: dart.definiteFunctionType(core.bool, []),
+      hasListener: dart.definiteFunctionType(core.bool, []),
+      [_isInitialState]: dart.definiteFunctionType(core.bool, []),
+      isClosed: dart.definiteFunctionType(core.bool, []),
+      isPaused: dart.definiteFunctionType(core.bool, []),
+      [_isAddingStream]: dart.definiteFunctionType(core.bool, []),
+      [_mayAddEvent]: dart.definiteFunctionType(core.bool, []),
+      [_pendingEvents]: dart.definiteFunctionType(async._PendingEvents$(T), []),
+      [_subscription]: dart.definiteFunctionType(async._ControllerSubscription$(T), []),
+      done: dart.definiteFunctionType(async.Future, [])
     }),
     methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+      [_ensurePendingEvents]: dart.definiteFunctionType(async._StreamImplEvents$(T), []),
+      [_badEventState]: dart.definiteFunctionType(core.Error, []),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
+      [_ensureDoneFuture]: dart.definiteFunctionType(async.Future, []),
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      close: dart.definiteFunctionType(async.Future, []),
+      [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
+      [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
+      [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
+      [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
+      [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
+      [_recordResume]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()])
+    }),
+    sfields: () => ({
+      _STATE_INITIAL: core.int,
+      _STATE_SUBSCRIBED: core.int,
+      _STATE_CANCELED: core.int,
+      _STATE_SUBSCRIPTION_MASK: core.int,
+      _STATE_CLOSED: core.int,
+      _STATE_ADDSTREAM: core.int
     })
   });
-  const _convertInvalid = Symbol('_convertInvalid');
-  convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
-    new(allowInvalid, subsetMask) {
-      this[_allowInvalid] = allowInvalid;
-      this[_subsetMask] = subsetMask;
+  return _StreamController;
+});
+async._StreamController = _StreamController();
+async._StreamController._STATE_INITIAL = 0;
+async._StreamController._STATE_SUBSCRIBED = 1;
+async._StreamController._STATE_CANCELED = 2;
+async._StreamController._STATE_SUBSCRIPTION_MASK = 3;
+async._StreamController._STATE_CLOSED = 4;
+async._StreamController._STATE_ADDSTREAM = 8;
+async._SyncStreamControllerDispatch$ = dart.generic(T => {
+  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
+  let SynchronousStreamControllerOfT = () => (SynchronousStreamControllerOfT = dart.constFn(async.SynchronousStreamController$(T)))();
+  class _SyncStreamControllerDispatch extends core.Object {
+    [_sendData](data) {
+      T._check(data);
+      this[_subscription][_add$](data);
+    }
+    [_sendError](error, stackTrace) {
+      this[_subscription][_addError](error, stackTrace);
+    }
+    [_sendDone]() {
+      this[_subscription][_close$]();
+    }
+  }
+  dart.addTypeTests(_SyncStreamControllerDispatch);
+  _SyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT(), SynchronousStreamControllerOfT()];
+  dart.setSignature(_SyncStreamControllerDispatch, {
+    methods: () => ({
+      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
+      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _SyncStreamControllerDispatch;
+});
+async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
+let const$10;
+async._AsyncStreamControllerDispatch$ = dart.generic(T => {
+  let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
+  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
+  class _AsyncStreamControllerDispatch extends core.Object {
+    [_sendData](data) {
+      T._check(data);
+      this[_subscription][_addPending](new (_DelayedDataOfT())(data));
+    }
+    [_sendError](error, stackTrace) {
+      this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
+    }
+    [_sendDone]() {
+      this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
+    }
+  }
+  dart.addTypeTests(_AsyncStreamControllerDispatch);
+  _AsyncStreamControllerDispatch[dart.implements] = () => [_StreamControllerOfT()];
+  dart.setSignature(_AsyncStreamControllerDispatch, {
+    methods: () => ({
+      [_sendData]: dart.definiteFunctionType(dart.void, [T]),
+      [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _AsyncStreamControllerDispatch;
+});
+async._AsyncStreamControllerDispatch = _AsyncStreamControllerDispatch();
+async._AsyncStreamController$ = dart.generic(T => {
+  class _AsyncStreamController extends dart.mixin(async._StreamController$(T), async._AsyncStreamControllerDispatch$(T)) {
+    new(onListen, onPause, onResume, onCancel) {
+      super.new(onListen, onPause, onResume, onCancel);
+    }
+  }
+  return _AsyncStreamController;
+});
+async._AsyncStreamController = _AsyncStreamController();
+async._SyncStreamController$ = dart.generic(T => {
+  class _SyncStreamController extends dart.mixin(async._StreamController$(T), async._SyncStreamControllerDispatch$(T)) {
+    new(onListen, onPause, onResume, onCancel) {
+      super.new(onListen, onPause, onResume, onCancel);
+    }
+  }
+  return _SyncStreamController;
+});
+async._SyncStreamController = _SyncStreamController();
+async._NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
+async._runGuarded = function(notificationHandler) {
+  if (notificationHandler == null) return null;
+  try {
+    let result = notificationHandler();
+    if (async.Future.is(result)) return result;
+    return null;
+  } catch (e) {
+    let s = dart.stackTrace(e);
+    async.Zone.current.handleUncaughtError(dart.dynamic)(e, s);
+  }
+
+};
+dart.fn(async._runGuarded, _NotificationHandlerToFuture());
+const _target = Symbol('_target');
+async._StreamSinkWrapper$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
+  class _StreamSinkWrapper extends core.Object {
+    new(target) {
+      this[_target] = target;
+    }
+    add(data) {
+      T._check(data);
+      this[_target].add(data);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_target].addError(error, stackTrace);
+    }
+    close() {
+      return this[_target].close();
+    }
+    addStream(source, opts) {
+      StreamOfT()._check(source);
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : true;
+      return this[_target].addStream(source, {cancelOnError: cancelOnError});
+    }
+    get done() {
+      return this[_target].done;
+    }
+  }
+  dart.addTypeTests(_StreamSinkWrapper);
+  _StreamSinkWrapper[dart.implements] = () => [StreamSinkOfT()];
+  dart.setSignature(_StreamSinkWrapper, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkWrapper$(T), [async.StreamController])}),
+    fields: () => ({[_target]: async.StreamController}),
+    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      close: dart.definiteFunctionType(async.Future, []),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool})
+    })
+  });
+  return _StreamSinkWrapper;
+});
+async._StreamSinkWrapper = _StreamSinkWrapper();
+async._AddStreamState$ = dart.generic(T => {
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  class _AddStreamState extends core.Object {
+    new(controller, source, cancelOnError) {
+      this.addStreamFuture = new async._Future();
+      this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
+    }
+    static makeErrorHandler(controller) {
+      return dart.fn((e, s) => {
+        controller[_addError](e, s);
+        controller[_close$]();
+      }, dynamicAndStackTraceToNull());
+    }
+    pause() {
+      this.addSubscription.pause();
+    }
+    resume() {
+      this.addSubscription.resume();
+    }
+    cancel() {
+      let cancel = this.addSubscription.cancel();
+      if (cancel == null) {
+        this.addStreamFuture[_asyncComplete](null);
+        return null;
+      }
+      return cancel.whenComplete(dart.fn(() => {
+        this.addStreamFuture[_asyncComplete](null);
+      }, VoidToNull()));
+    }
+    complete() {
+      this.addStreamFuture[_asyncComplete](null);
+    }
+  }
+  dart.addTypeTests(_AddStreamState);
+  dart.setSignature(_AddStreamState, {
+    constructors: () => ({new: dart.definiteFunctionType(async._AddStreamState$(T), [_EventSinkOfT(), async.Stream, core.bool])}),
+    fields: () => ({
+      addStreamFuture: async._Future,
+      addSubscription: async.StreamSubscription
+    }),
+    methods: () => ({
+      pause: dart.definiteFunctionType(dart.void, []),
+      resume: dart.definiteFunctionType(dart.void, []),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      complete: dart.definiteFunctionType(dart.void, [])
+    }),
+    statics: () => ({makeErrorHandler: dart.definiteFunctionType(dart.dynamic, [async._EventSink])}),
+    names: ['makeErrorHandler']
+  });
+  return _AddStreamState;
+});
+async._AddStreamState = _AddStreamState();
+async._StreamControllerAddStreamState$ = dart.generic(T => {
+  let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
+  class _StreamControllerAddStreamState extends async._AddStreamState$(T) {
+    new(controller, varData, source, cancelOnError) {
+      this.varData = varData;
+      super.new(controller, source, cancelOnError);
+      if (dart.test(controller.isPaused)) {
+        this.addSubscription.pause();
+      }
+    }
+  }
+  dart.setSignature(_StreamControllerAddStreamState, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamControllerAddStreamState$(T), [_StreamControllerOfT(), dart.dynamic, async.Stream, core.bool])}),
+    fields: () => ({varData: dart.dynamic})
+  });
+  return _StreamControllerAddStreamState;
+});
+async._StreamControllerAddStreamState = _StreamControllerAddStreamState();
+async._EventSink$ = dart.generic(T => {
+  class _EventSink extends core.Object {}
+  dart.addTypeTests(_EventSink);
+  return _EventSink;
+});
+async._EventSink = _EventSink();
+async._EventDispatch$ = dart.generic(T => {
+  class _EventDispatch extends core.Object {}
+  dart.addTypeTests(_EventDispatch);
+  return _EventDispatch;
+});
+async._EventDispatch = _EventDispatch();
+async._EventGenerator$ = dart.generic(T => {
+  const _EventGenerator = dart.typedef('_EventGenerator', () => dart.functionType(async._PendingEvents$(T), []));
+  return _EventGenerator;
+});
+async._EventGenerator = _EventGenerator();
+const _isUsed = Symbol('_isUsed');
+async._GeneratedStreamImpl$ = dart.generic(T => {
+  let _BufferingStreamSubscriptionOfT = () => (_BufferingStreamSubscriptionOfT = dart.constFn(async._BufferingStreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let _EventGeneratorOfT = () => (_EventGeneratorOfT = dart.constFn(async._EventGenerator$(T)))();
+  class _GeneratedStreamImpl extends async._StreamImpl$(T) {
+    new(pending) {
+      this[_pending] = pending;
+      this[_isUsed] = false;
       super.new();
     }
-    convert(bytes, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let byteCount = bytes[dartx.length];
-      core.RangeError.checkValidRange(start, end, byteCount);
-      if (end == null) end = byteCount;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let byte = bytes[dartx._get](i);
-        if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) != 0) {
-          if (!dart.test(this[_allowInvalid])) {
-            dart.throw(new core.FormatException(dart.str`Invalid value in input: ${byte}`));
-          }
-          return this[_convertInvalid](bytes, start, end);
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      if (dart.test(this[_isUsed])) dart.throw(new core.StateError("Stream has already been listened to."));
+      this[_isUsed] = true;
+      let _ = new (_BufferingStreamSubscriptionOfT())(onData, onError, onDone, cancelOnError);
+      _[_setPendingEvents](this[_pending]());
+      return _;
+    }
+  }
+  dart.setSignature(_GeneratedStreamImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(async._GeneratedStreamImpl$(T), [_EventGeneratorOfT()])}),
+    fields: () => ({
+      [_pending]: _EventGeneratorOfT(),
+      [_isUsed]: core.bool
+    })
+  });
+  return _GeneratedStreamImpl;
+});
+async._GeneratedStreamImpl = _GeneratedStreamImpl();
+const _iterator$ = Symbol('_iterator');
+const _eventScheduled = Symbol('_eventScheduled');
+async._PendingEvents$ = dart.generic(T => {
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  class _PendingEvents extends core.Object {
+    new() {
+      this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
+    }
+    get isScheduled() {
+      return this[_state] == async._PendingEvents._STATE_SCHEDULED;
+    }
+    get [_eventScheduled]() {
+      return dart.notNull(this[_state]) >= async._PendingEvents._STATE_SCHEDULED;
+    }
+    schedule(dispatch) {
+      _EventDispatchOfT()._check(dispatch);
+      if (dart.test(this.isScheduled)) return;
+      dart.assert(!dart.test(this.isEmpty));
+      if (dart.test(this[_eventScheduled])) {
+        dart.assert(this[_state] == async._PendingEvents._STATE_CANCELED);
+        this[_state] = async._PendingEvents._STATE_SCHEDULED;
+        return;
+      }
+      async.scheduleMicrotask(dart.fn(() => {
+        let oldState = this[_state];
+        this[_state] = async._PendingEvents._STATE_UNSCHEDULED;
+        if (oldState == async._PendingEvents._STATE_CANCELED) return;
+        this.handleNext(dispatch);
+      }, VoidToNull()));
+      this[_state] = async._PendingEvents._STATE_SCHEDULED;
+    }
+    cancelSchedule() {
+      if (dart.test(this.isScheduled)) this[_state] = async._PendingEvents._STATE_CANCELED;
+    }
+  }
+  dart.addTypeTests(_PendingEvents);
+  dart.setSignature(_PendingEvents, {
+    fields: () => ({[_state]: core.int}),
+    getters: () => ({
+      isScheduled: dart.definiteFunctionType(core.bool, []),
+      [_eventScheduled]: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      schedule: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
+      cancelSchedule: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _STATE_UNSCHEDULED: core.int,
+      _STATE_SCHEDULED: core.int,
+      _STATE_CANCELED: core.int
+    })
+  });
+  return _PendingEvents;
+});
+async._PendingEvents = _PendingEvents();
+async._PendingEvents._STATE_UNSCHEDULED = 0;
+async._PendingEvents._STATE_SCHEDULED = 1;
+async._PendingEvents._STATE_CANCELED = 3;
+async._IterablePendingEvents$ = dart.generic(T => {
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
+  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
+  class _IterablePendingEvents extends async._PendingEvents$(T) {
+    new(data) {
+      this[_iterator$] = data[dartx.iterator];
+      super.new();
+    }
+    get isEmpty() {
+      return this[_iterator$] == null;
+    }
+    handleNext(dispatch) {
+      _EventDispatchOfT()._check(dispatch);
+      if (this[_iterator$] == null) {
+        dart.throw(new core.StateError("No events pending."));
+      }
+      let isDone = null;
+      try {
+        isDone = !dart.test(this[_iterator$].moveNext());
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        this[_iterator$] = null;
+        dispatch[_sendError](e, s);
+        return;
+      }
+
+      if (!dart.test(isDone)) {
+        dispatch[_sendData](this[_iterator$].current);
+      } else {
+        this[_iterator$] = null;
+        dispatch[_sendDone]();
+      }
+    }
+    clear() {
+      if (dart.test(this.isScheduled)) this.cancelSchedule();
+      this[_iterator$] = null;
+    }
+  }
+  dart.setSignature(_IterablePendingEvents, {
+    constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
+    fields: () => ({[_iterator$]: IteratorOfT()}),
+    getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
+      clear: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _IterablePendingEvents;
+});
+async._IterablePendingEvents = _IterablePendingEvents();
+async._DataHandler$ = dart.generic(T => {
+  const _DataHandler = dart.typedef('_DataHandler', () => dart.functionType(dart.void, [T]));
+  return _DataHandler;
+});
+async._DataHandler = _DataHandler();
+async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
+async._nullDataHandler = function(value) {
+};
+dart.fn(async._nullDataHandler, dynamicTovoid$());
+async._nullErrorHandler = function(error, stackTrace) {
+  if (stackTrace === void 0) stackTrace = null;
+  async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
+};
+dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
+async._nullDoneHandler = function() {
+};
+dart.fn(async._nullDoneHandler, VoidTovoid$());
+async._DelayedEvent$ = dart.generic(T => {
+  class _DelayedEvent extends core.Object {
+    new() {
+      this.next = null;
+    }
+  }
+  dart.addTypeTests(_DelayedEvent);
+  dart.setSignature(_DelayedEvent, {
+    fields: () => ({next: async._DelayedEvent})
+  });
+  return _DelayedEvent;
+});
+async._DelayedEvent = _DelayedEvent();
+async._DelayedData$ = dart.generic(T => {
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  class _DelayedData extends async._DelayedEvent$(T) {
+    new(value) {
+      this.value = value;
+      super.new();
+    }
+    perform(dispatch) {
+      _EventDispatchOfT()._check(dispatch);
+      dispatch[_sendData](this.value);
+    }
+  }
+  dart.setSignature(_DelayedData, {
+    constructors: () => ({new: dart.definiteFunctionType(async._DelayedData$(T), [T])}),
+    fields: () => ({value: T}),
+    methods: () => ({perform: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()])})
+  });
+  return _DelayedData;
+});
+async._DelayedData = _DelayedData();
+async._DelayedError = class _DelayedError extends async._DelayedEvent {
+  new(error, stackTrace) {
+    this.error = error;
+    this.stackTrace = stackTrace;
+    super.new();
+  }
+  perform(dispatch) {
+    dispatch[_sendError](this.error, this.stackTrace);
+  }
+};
+dart.addSimpleTypeTests(async._DelayedError);
+dart.setSignature(async._DelayedError, {
+  constructors: () => ({new: dart.definiteFunctionType(async._DelayedError, [dart.dynamic, core.StackTrace])}),
+  fields: () => ({
+    error: dart.dynamic,
+    stackTrace: core.StackTrace
+  }),
+  methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
+});
+async._DelayedDone = class _DelayedDone extends core.Object {
+  new() {
+  }
+  perform(dispatch) {
+    dispatch[_sendDone]();
+  }
+  get next() {
+    return null;
+  }
+  set next(_) {
+    dart.throw(new core.StateError("No events after a done."));
+  }
+};
+async._DelayedDone[dart.implements] = () => [async._DelayedEvent];
+dart.setSignature(async._DelayedDone, {
+  constructors: () => ({new: dart.definiteFunctionType(async._DelayedDone, [])}),
+  getters: () => ({next: dart.definiteFunctionType(async._DelayedEvent, [])}),
+  setters: () => ({next: dart.definiteFunctionType(dart.void, [async._DelayedEvent])}),
+  methods: () => ({perform: dart.definiteFunctionType(dart.void, [async._EventDispatch])})
+});
+async._StreamImplEvents$ = dart.generic(T => {
+  let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
+  class _StreamImplEvents extends async._PendingEvents$(T) {
+    new() {
+      this.firstPendingEvent = null;
+      this.lastPendingEvent = null;
+      super.new();
+    }
+    get isEmpty() {
+      return this.lastPendingEvent == null;
+    }
+    add(event) {
+      if (this.lastPendingEvent == null) {
+        this.firstPendingEvent = this.lastPendingEvent = event;
+      } else {
+        this.lastPendingEvent = this.lastPendingEvent.next = event;
+      }
+    }
+    handleNext(dispatch) {
+      _EventDispatchOfT()._check(dispatch);
+      dart.assert(!dart.test(this.isScheduled));
+      let event = this.firstPendingEvent;
+      this.firstPendingEvent = event.next;
+      if (this.firstPendingEvent == null) {
+        this.lastPendingEvent = null;
+      }
+      event.perform(dispatch);
+    }
+    clear() {
+      if (dart.test(this.isScheduled)) this.cancelSchedule();
+      this.firstPendingEvent = this.lastPendingEvent = null;
+    }
+  }
+  dart.setSignature(_StreamImplEvents, {
+    fields: () => ({
+      firstPendingEvent: async._DelayedEvent,
+      lastPendingEvent: async._DelayedEvent
+    }),
+    getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [async._DelayedEvent]),
+      handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
+      clear: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _StreamImplEvents;
+});
+async._StreamImplEvents = _StreamImplEvents();
+const _unlink = Symbol('_unlink');
+const _insertBefore = Symbol('_insertBefore');
+async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
+  new() {
+    this[_next$] = null;
+    this[_previous$] = null;
+  }
+  [_unlink]() {
+    this[_previous$][_next$] = this[_next$];
+    this[_next$][_previous$] = this[_previous$];
+    this[_next$] = this[_previous$] = this;
+  }
+  [_insertBefore](newNext) {
+    let newPrevious = newNext[_previous$];
+    newPrevious[_next$] = this;
+    newNext[_previous$] = this[_previous$];
+    this[_previous$][_next$] = newNext;
+    this[_previous$] = newPrevious;
+  }
+};
+dart.setSignature(async._BroadcastLinkedList, {
+  fields: () => ({
+    [_next$]: async._BroadcastLinkedList,
+    [_previous$]: async._BroadcastLinkedList
+  }),
+  methods: () => ({
+    [_unlink]: dart.definiteFunctionType(dart.void, []),
+    [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
+  })
+});
+async._BroadcastCallback$ = dart.generic(T => {
+  const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
+  return _BroadcastCallback;
+});
+async._BroadcastCallback = _BroadcastCallback();
+const _schedule = Symbol('_schedule');
+const _isSent = Symbol('_isSent');
+const _isScheduled = Symbol('_isScheduled');
+async._DoneStreamSubscription$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _DoneStreamSubscription extends core.Object {
+    new(onDone) {
+      this[_onDone] = onDone;
+      this[_zone] = async.Zone.current;
+      this[_state] = 0;
+      this[_schedule]();
+    }
+    get [_isSent]() {
+      return (dart.notNull(this[_state]) & async._DoneStreamSubscription._DONE_SENT) != 0;
+    }
+    get [_isScheduled]() {
+      return (dart.notNull(this[_state]) & async._DoneStreamSubscription._SCHEDULED) != 0;
+    }
+    get isPaused() {
+      return dart.notNull(this[_state]) >= async._DoneStreamSubscription._PAUSED;
+    }
+    [_schedule]() {
+      if (dart.test(this[_isScheduled])) return;
+      this[_zone].scheduleMicrotask(dart.bind(this, _sendDone));
+      this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._SCHEDULED) >>> 0;
+    }
+    onData(handleData) {}
+    onError(handleError) {}
+    onDone(handleDone) {
+      this[_onDone] = handleDone;
+    }
+    pause(resumeSignal) {
+      if (resumeSignal === void 0) resumeSignal = null;
+      this[_state] = dart.notNull(this[_state]) + async._DoneStreamSubscription._PAUSED;
+      if (resumeSignal != null) resumeSignal.whenComplete(dart.bind(this, 'resume'));
+    }
+    resume() {
+      if (dart.test(this.isPaused)) {
+        this[_state] = dart.notNull(this[_state]) - async._DoneStreamSubscription._PAUSED;
+        if (!dart.test(this.isPaused) && !dart.test(this[_isSent])) {
+          this[_schedule]();
         }
       }
-      return core.String.fromCharCodes(bytes, start, end);
     }
-    [_convertInvalid](bytes, start, end) {
+    cancel() {
+      return null;
+    }
+    asFuture(E) {
+      return futureValue => {
+        if (futureValue === void 0) futureValue = null;
+        let result = new (async._Future$(E))();
+        this[_onDone] = dart.fn(() => {
+          result[_completeWithValue](null);
+        }, VoidToNull());
+        return result;
+      };
+    }
+    [_sendDone]() {
+      this[_state] = (dart.notNull(this[_state]) & ~async._DoneStreamSubscription._SCHEDULED) >>> 0;
+      if (dart.test(this.isPaused)) return;
+      this[_state] = (dart.notNull(this[_state]) | async._DoneStreamSubscription._DONE_SENT) >>> 0;
+      if (this[_onDone] != null) this[_zone].runGuarded(dart.void)(this[_onDone]);
+    }
+  }
+  dart.addTypeTests(_DoneStreamSubscription);
+  _DoneStreamSubscription[dart.implements] = () => [StreamSubscriptionOfT()];
+  dart.setSignature(_DoneStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._DoneStreamSubscription$(T), [async._DoneHandler])}),
+    fields: () => ({
+      [_zone]: async.Zone,
+      [_state]: core.int,
+      [_onDone]: async._DoneHandler
+    }),
+    getters: () => ({
+      [_isSent]: dart.definiteFunctionType(core.bool, []),
+      [_isScheduled]: dart.definiteFunctionType(core.bool, []),
+      isPaused: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      [_schedule]: dart.definiteFunctionType(dart.void, []),
+      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
+      onError: dart.definiteFunctionType(dart.void, [core.Function]),
+      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+      resume: dart.definiteFunctionType(dart.void, []),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
+      [_sendDone]: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _DONE_SENT: core.int,
+      _SCHEDULED: core.int,
+      _PAUSED: core.int
+    })
+  });
+  return _DoneStreamSubscription;
+});
+async._DoneStreamSubscription = _DoneStreamSubscription();
+async._DoneStreamSubscription._DONE_SENT = 1;
+async._DoneStreamSubscription._SCHEDULED = 2;
+async._DoneStreamSubscription._PAUSED = 4;
+const _source$ = Symbol('_source');
+const _onListenHandler = Symbol('_onListenHandler');
+const _onCancelHandler = Symbol('_onCancelHandler');
+const _cancelSubscription = Symbol('_cancelSubscription');
+const _pauseSubscription = Symbol('_pauseSubscription');
+const _resumeSubscription = Symbol('_resumeSubscription');
+const _isSubscriptionPaused = Symbol('_isSubscriptionPaused');
+async._AsBroadcastStream$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let _AsBroadcastStreamControllerOfT = () => (_AsBroadcastStreamControllerOfT = dart.constFn(async._AsBroadcastStreamController$(T)))();
+  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
+  let _BroadcastSubscriptionWrapperOfT = () => (_BroadcastSubscriptionWrapperOfT = dart.constFn(async._BroadcastSubscriptionWrapper$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
+  class _AsBroadcastStream extends async.Stream$(T) {
+    new(source, onListenHandler, onCancelHandler) {
+      this[_source$] = source;
+      this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
+      this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
+      this[_zone] = async.Zone.current;
+      this[_controller$] = null;
+      this[_subscription] = null;
+      super.new();
+      this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
+    }
+    get isBroadcast() {
+      return true;
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
+        return new (_DoneStreamSubscriptionOfT())(onDone);
+      }
+      if (this[_subscription] == null) {
+        this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
+      }
+      cancelOnError = core.identical(true, cancelOnError);
+      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
+    }
+    [_onCancel]() {
+      let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
+      if (this[_onCancelHandler] != null) {
+        this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
+      }
+      if (shutdown) {
+        if (this[_subscription] != null) {
+          this[_subscription].cancel();
+          this[_subscription] = null;
+        }
+      }
+    }
+    [_onListen]() {
+      if (this[_onListenHandler] != null) {
+        this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onListenHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
+      }
+    }
+    [_cancelSubscription]() {
+      if (this[_subscription] == null) return;
+      let subscription = this[_subscription];
+      this[_subscription] = null;
+      this[_controller$] = null;
+      subscription.cancel();
+    }
+    [_pauseSubscription](resumeSignal) {
+      if (this[_subscription] == null) return;
+      this[_subscription].pause(resumeSignal);
+    }
+    [_resumeSubscription]() {
+      if (this[_subscription] == null) return;
+      this[_subscription].resume();
+    }
+    get [_isSubscriptionPaused]() {
+      if (this[_subscription] == null) return false;
+      return this[_subscription].isPaused;
+    }
+  }
+  dart.setSignature(_AsBroadcastStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
+    fields: () => ({
+      [_source$]: StreamOfT(),
+      [_onListenHandler]: _BroadcastCallbackOfT(),
+      [_onCancelHandler]: _BroadcastCallbackOfT(),
+      [_zone]: async.Zone,
+      [_controller$]: _AsBroadcastStreamControllerOfT(),
+      [_subscription]: StreamSubscriptionOfT()
+    }),
+    getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+      [_onCancel]: dart.definiteFunctionType(dart.void, []),
+      [_onListen]: dart.definiteFunctionType(dart.void, []),
+      [_cancelSubscription]: dart.definiteFunctionType(dart.void, []),
+      [_pauseSubscription]: dart.definiteFunctionType(dart.void, [async.Future]),
+      [_resumeSubscription]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _AsBroadcastStream;
+});
+async._AsBroadcastStream = _AsBroadcastStream();
+async._BroadcastSubscriptionWrapper$ = dart.generic(T => {
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _BroadcastSubscriptionWrapper extends core.Object {
+    new(stream) {
+      this[_stream] = stream;
+    }
+    onData(handleData) {
+      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
+    }
+    onError(handleError) {
+      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
+    }
+    onDone(handleDone) {
+      dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
+    }
+    pause(resumeSignal) {
+      if (resumeSignal === void 0) resumeSignal = null;
+      this[_stream][_pauseSubscription](resumeSignal);
+    }
+    resume() {
+      this[_stream][_resumeSubscription]();
+    }
+    cancel() {
+      this[_stream][_cancelSubscription]();
+      return null;
+    }
+    get isPaused() {
+      return this[_stream][_isSubscriptionPaused];
+    }
+    asFuture(E) {
+      return futureValue => {
+        if (futureValue === void 0) futureValue = null;
+        dart.throw(new core.UnsupportedError("Cannot change handlers of asBroadcastStream source subscription."));
+      };
+    }
+  }
+  dart.addTypeTests(_BroadcastSubscriptionWrapper);
+  _BroadcastSubscriptionWrapper[dart.implements] = () => [StreamSubscriptionOfT()];
+  dart.setSignature(_BroadcastSubscriptionWrapper, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscriptionWrapper$(T), [async._AsBroadcastStream])}),
+    fields: () => ({[_stream]: async._AsBroadcastStream}),
+    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
+      onError: dart.definiteFunctionType(dart.void, [core.Function]),
+      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+      resume: dart.definiteFunctionType(dart.void, []),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
+    })
+  });
+  return _BroadcastSubscriptionWrapper;
+});
+async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
+const _current$1 = Symbol('_current');
+const _futureOrPrefetch = Symbol('_futureOrPrefetch');
+const _clear = Symbol('_clear');
+async._StreamIteratorImpl$ = dart.generic(T => {
+  let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _StreamIteratorImpl extends core.Object {
+    new(stream) {
+      this[_subscription] = null;
+      this[_current$1] = null;
+      this[_futureOrPrefetch] = null;
+      this[_state] = async._StreamIteratorImpl._STATE_FOUND;
+      this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+    }
+    get current() {
+      return this[_current$1];
+    }
+    moveNext() {
+      if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
+        return new (_FutureOfbool()).immediate(false);
+      }
+      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        dart.throw(new core.StateError("Already waiting for next."));
+      }
+      if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
+        this[_state] = async._StreamIteratorImpl._STATE_MOVING;
+        this[_current$1] = null;
+        let result = new (_FutureOfbool())();
+        this[_futureOrPrefetch] = result;
+        return result;
+      } else {
+        dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
+        switch (this[_state]) {
+          case async._StreamIteratorImpl._STATE_EXTRA_DATA:
+          {
+            this[_state] = async._StreamIteratorImpl._STATE_FOUND;
+            this[_current$1] = T.as(this[_futureOrPrefetch]);
+            this[_futureOrPrefetch] = null;
+            this[_subscription].resume();
+            return new (_FutureOfbool()).immediate(true);
+          }
+          case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
+          {
+            let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
+            this[_clear]();
+            return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
+          }
+          case async._StreamIteratorImpl._STATE_EXTRA_DONE:
+          {
+            this[_clear]();
+            return new (_FutureOfbool()).immediate(false);
+          }
+        }
+      }
+    }
+    [_clear]() {
+      this[_subscription] = null;
+      this[_futureOrPrefetch] = null;
+      this[_current$1] = null;
+      this[_state] = async._StreamIteratorImpl._STATE_DONE;
+    }
+    cancel() {
+      let subscription = this[_subscription];
+      if (subscription == null) return null;
+      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
+        this[_clear]();
+        hasNext[_complete](false);
+      } else {
+        this[_clear]();
+      }
+      return subscription.cancel();
+    }
+    [_onData](data) {
+      T._check(data);
+      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        this[_current$1] = data;
+        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
+        this[_futureOrPrefetch] = null;
+        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
+        hasNext[_complete](true);
+        return;
+      }
+      this[_subscription].pause();
+      dart.assert(this[_futureOrPrefetch] == null);
+      this[_futureOrPrefetch] = data;
+      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
+    }
+    [_onError](error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
+        this[_clear]();
+        hasNext[_completeError](error, stackTrace);
+        return;
+      }
+      this[_subscription].pause();
+      dart.assert(this[_futureOrPrefetch] == null);
+      this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
+      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
+    }
+    [_onDone]() {
+      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
+        this[_clear]();
+        hasNext[_complete](false);
+        return;
+      }
+      this[_subscription].pause();
+      this[_futureOrPrefetch] = null;
+      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
+    }
+  }
+  dart.addTypeTests(_StreamIteratorImpl);
+  _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
+  dart.setSignature(_StreamIteratorImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
+    fields: () => ({
+      [_subscription]: async.StreamSubscription,
+      [_current$1]: T,
+      [_futureOrPrefetch]: dart.dynamic,
+      [_state]: core.int
+    }),
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({
+      moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
+      [_clear]: dart.definiteFunctionType(dart.void, []),
+      cancel: dart.definiteFunctionType(async.Future, []),
+      [_onData]: dart.definiteFunctionType(dart.void, [T]),
+      [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      [_onDone]: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _STATE_FOUND: core.int,
+      _STATE_DONE: core.int,
+      _STATE_MOVING: core.int,
+      _STATE_EXTRA_DATA: core.int,
+      _STATE_EXTRA_ERROR: core.int,
+      _STATE_EXTRA_DONE: core.int
+    })
+  });
+  return _StreamIteratorImpl;
+});
+async._StreamIteratorImpl = _StreamIteratorImpl();
+async._StreamIteratorImpl._STATE_FOUND = 0;
+async._StreamIteratorImpl._STATE_DONE = 1;
+async._StreamIteratorImpl._STATE_MOVING = 2;
+async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
+async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
+async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
+async._EmptyStream$ = dart.generic(T => {
+  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _EmptyStream extends async.Stream$(T) {
+    new() {
+      super._internal();
+    }
+    get isBroadcast() {
+      return true;
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      return new (_DoneStreamSubscriptionOfT())(onDone);
+    }
+  }
+  dart.setSignature(_EmptyStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._EmptyStream$(T), [])}),
+    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+  });
+  return _EmptyStream;
+});
+async._EmptyStream = _EmptyStream();
+async._runUserCode = function(userCode, onSuccess, onError) {
+  try {
+    dart.dcall(onSuccess, userCode());
+  } catch (e) {
+    let s = dart.stackTrace(e);
+    let replacement = async.Zone.current.errorCallback(e, s);
+    if (replacement == null) {
+      dart.dcall(onError, e, s);
+    } else {
+      let error = async._nonNullError(replacement.error);
+      let stackTrace = replacement.stackTrace;
+      dart.dcall(onError, error, stackTrace);
+    }
+  }
+
+};
+dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
+async._cancelAndError = function(subscription, future, error, stackTrace) {
+  let cancelFuture = subscription.cancel();
+  if (async.Future.is(cancelFuture)) {
+    cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
+  } else {
+    future[_completeError](error, stackTrace);
+  }
+};
+dart.lazyFn(async._cancelAndError, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
+async._cancelAndErrorWithReplacement = function(subscription, future, error, stackTrace) {
+  let replacement = async.Zone.current.errorCallback(error, stackTrace);
+  if (replacement != null) {
+    error = async._nonNullError(replacement.error);
+    stackTrace = replacement.stackTrace;
+  }
+  async._cancelAndError(subscription, future, error, stackTrace);
+};
+dart.lazyFn(async._cancelAndErrorWithReplacement, () => StreamSubscriptionAnd_FutureAnddynamic__Tovoid());
+async._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [dart.dynamic, core.StackTrace]));
+async._cancelAndErrorClosure = function(subscription, future) {
+  return dart.fn((error, stackTrace) => {
+    async._cancelAndError(subscription, future, error, stackTrace);
+  }, dynamicAndStackTraceToNull());
+};
+dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
+async._cancelAndValue = function(subscription, future, value) {
+  let cancelFuture = subscription.cancel();
+  if (async.Future.is(cancelFuture)) {
+    cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
+  } else {
+    future[_complete](value);
+  }
+};
+dart.fn(async._cancelAndValue, StreamSubscriptionAnd_FutureAnddynamicTovoid());
+const _handleData = Symbol('_handleData');
+const _handleError = Symbol('_handleError');
+const _handleDone = Symbol('_handleDone');
+async._ForwardingStream$ = dart.generic((S, T) => {
+  let _ForwardingStreamSubscriptionOfS$T = () => (_ForwardingStreamSubscriptionOfS$T = dart.constFn(async._ForwardingStreamSubscription$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _ForwardingStream extends async.Stream$(T) {
+    new(source) {
+      this[_source$] = source;
+      super.new();
+    }
+    get isBroadcast() {
+      return this[_source$].isBroadcast;
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      cancelOnError = core.identical(true, cancelOnError);
+      return this[_createSubscription](onData, onError, onDone, cancelOnError);
+    }
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return new (_ForwardingStreamSubscriptionOfS$T())(this, onData, onError, onDone, cancelOnError);
+    }
+    [_handleData](data, sink) {
+      S._check(data);
+      _EventSinkOfT()._check(sink);
+      sink[_add$](T.as(data));
+    }
+    [_handleError](error, stackTrace, sink) {
+      _EventSinkOfT()._check(sink);
+      sink[_addError](error, stackTrace);
+    }
+    [_handleDone](sink) {
+      _EventSinkOfT()._check(sink);
+      sink[_close$]();
+    }
+  }
+  dart.setSignature(_ForwardingStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
+    fields: () => ({[_source$]: StreamOfS()}),
+    methods: () => ({
+      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+      [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
+      [_handleData]: dart.definiteFunctionType(dart.void, [S, _EventSinkOfT()]),
+      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, _EventSinkOfT()]),
+      [_handleDone]: dart.definiteFunctionType(dart.void, [_EventSinkOfT()])
+    })
+  });
+  return _ForwardingStream;
+});
+async._ForwardingStream = _ForwardingStream();
+async._ForwardingStreamSubscription$ = dart.generic((S, T) => {
+  let _ForwardingStreamOfS$T = () => (_ForwardingStreamOfS$T = dart.constFn(async._ForwardingStream$(S, T)))();
+  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _ForwardingStreamSubscription extends async._BufferingStreamSubscription$(T) {
+    new(stream, onData, onError, onDone, cancelOnError) {
+      this[_stream] = stream;
+      this[_subscription] = null;
+      super.new(onData, onError, onDone, cancelOnError);
+      this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
+    }
+    [_add$](data) {
+      T._check(data);
+      if (dart.test(this[_isClosed$])) return;
+      super[_add$](data);
+    }
+    [_addError](error, stackTrace) {
+      if (dart.test(this[_isClosed$])) return;
+      super[_addError](error, stackTrace);
+    }
+    [_onPause]() {
+      if (this[_subscription] == null) return;
+      this[_subscription].pause();
+    }
+    [_onResume]() {
+      if (this[_subscription] == null) return;
+      this[_subscription].resume();
+    }
+    [_onCancel]() {
+      if (this[_subscription] != null) {
+        let subscription = this[_subscription];
+        this[_subscription] = null;
+        return subscription.cancel();
+      }
+      return null;
+    }
+    [_handleData](data) {
+      S._check(data);
+      this[_stream][_handleData](data, this);
+    }
+    [_handleError](error, stackTrace) {
+      this[_stream][_handleError](error, stackTrace, this);
+    }
+    [_handleDone]() {
+      this[_stream][_handleDone](this);
+    }
+  }
+  dart.setSignature(_ForwardingStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStreamSubscription$(S, T), [_ForwardingStreamOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
+    fields: () => ({
+      [_stream]: _ForwardingStreamOfS$T(),
+      [_subscription]: StreamSubscriptionOfS()
+    }),
+    methods: () => ({
+      [_handleData]: dart.definiteFunctionType(dart.void, [S]),
+      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
+      [_handleDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _ForwardingStreamSubscription;
+});
+async._ForwardingStreamSubscription = _ForwardingStreamSubscription();
+async._Predicate$ = dart.generic(T => {
+  const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
+  return _Predicate;
+});
+async._Predicate = _Predicate();
+async._addErrorWithReplacement = function(sink, error, stackTrace) {
+  let replacement = async.Zone.current.errorCallback(error, core.StackTrace._check(stackTrace));
+  if (replacement != null) {
+    error = async._nonNullError(replacement.error);
+    stackTrace = replacement.stackTrace;
+  }
+  sink[_addError](error, core.StackTrace._check(stackTrace));
+};
+dart.fn(async._addErrorWithReplacement, _EventSinkAnddynamicAnddynamicTovoid());
+const _test = Symbol('_test');
+async._WhereStream$ = dart.generic(T => {
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _WhereStream extends async._ForwardingStream$(T, T) {
+    new(source, test) {
+      this[_test] = test;
+      super.new(source);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let satisfies = null;
+      try {
+        satisfies = this[_test](inputEvent);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async._addErrorWithReplacement(sink, e, s);
+        return;
+      }
+
+      if (dart.test(satisfies)) {
+        sink[_add$](inputEvent);
+      }
+    }
+  }
+  dart.setSignature(_WhereStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._WhereStream$(T), [StreamOfT(), _PredicateOfT()])}),
+    fields: () => ({[_test]: _PredicateOfT()})
+  });
+  return _WhereStream;
+});
+async._WhereStream = _WhereStream();
+async._Transformation$ = dart.generic((S, T) => {
+  const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
+  return _Transformation;
+});
+async._Transformation = _Transformation$();
+const _transform = Symbol('_transform');
+async._MapStream$ = dart.generic((S, T) => {
+  let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  class _MapStream extends async._ForwardingStream$(S, T) {
+    new(source, transform) {
+      this[_transform] = transform;
+      super.new(source);
+    }
+    [_handleData](inputEvent, sink) {
+      S._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let outputEvent = null;
+      try {
+        outputEvent = this[_transform](inputEvent);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async._addErrorWithReplacement(sink, e, s);
+        return;
+      }
+
+      sink[_add$](outputEvent);
+    }
+  }
+  dart.setSignature(_MapStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._MapStream$(S, T), [StreamOfS(), _TransformationOfS$T()])}),
+    fields: () => ({[_transform]: _TransformationOfS$T()})
+  });
+  return _MapStream;
+});
+async._MapStream = _MapStream();
+const _expand = Symbol('_expand');
+async._ExpandStream$ = dart.generic((S, T) => {
+  let _TransformationOfS$IterableOfT = () => (_TransformationOfS$IterableOfT = dart.constFn(async._Transformation$(S, IterableOfT())))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
+  class _ExpandStream extends async._ForwardingStream$(S, T) {
+    new(source, expand) {
+      this[_expand] = expand;
+      super.new(source);
+    }
+    [_handleData](inputEvent, sink) {
+      S._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      try {
+        for (let value of this[_expand](inputEvent)) {
+          sink[_add$](value);
+        }
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async._addErrorWithReplacement(sink, e, s);
+      }
+
+    }
+  }
+  dart.setSignature(_ExpandStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ExpandStream$(S, T), [StreamOfS(), _TransformationOfS$IterableOfT()])}),
+    fields: () => ({[_expand]: _TransformationOfS$IterableOfT()})
+  });
+  return _ExpandStream;
+});
+async._ExpandStream = _ExpandStream();
+async._ErrorTest = dart.typedef('_ErrorTest', () => dart.functionType(core.bool, [dart.dynamic]));
+async._HandleErrorStream$ = dart.generic(T => {
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _HandleErrorStream extends async._ForwardingStream$(T, T) {
+    new(source, onError, test) {
+      this[_transform] = onError;
+      this[_test] = test;
+      super.new(source);
+    }
+    [_handleError](error, stackTrace, sink) {
+      _EventSinkOfT()._check(sink);
+      let matches = true;
+      if (this[_test] != null) {
+        try {
+          matches = dart.dcall(this[_test], error);
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          async._addErrorWithReplacement(sink, e, s);
+          return;
+        }
+
+      }
+      if (dart.test(matches)) {
+        try {
+          async._invokeErrorHandler(this[_transform], error, stackTrace);
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          if (core.identical(e, error)) {
+            sink[_addError](error, stackTrace);
+          } else {
+            async._addErrorWithReplacement(sink, e, s);
+          }
+          return;
+        }
+
+      } else {
+        sink[_addError](error, stackTrace);
+      }
+    }
+  }
+  dart.setSignature(_HandleErrorStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._HandleErrorStream$(T), [StreamOfT(), core.Function, dynamicTobool()])}),
+    fields: () => ({
+      [_transform]: core.Function,
+      [_test]: async._ErrorTest
+    }),
+    methods: () => ({[_handleError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace, _EventSinkOfT()])})
+  });
+  return _HandleErrorStream;
+});
+async._HandleErrorStream = _HandleErrorStream();
+const _count = Symbol('_count');
+async._TakeStream$ = dart.generic(T => {
+  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _TakeStream extends async._ForwardingStream$(T, T) {
+    new(source, count) {
+      this[_count] = count;
+      super.new(source);
+      if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
+    }
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let subscription = _StateStreamSubscriptionOfT()._check(sink);
+      let count = subscription[_count];
+      if (dart.notNull(count) > 0) {
+        sink[_add$](inputEvent);
+        count = dart.notNull(count) - 1;
+        subscription[_count] = count;
+        if (count == 0) {
+          sink[_close$]();
+        }
+      }
+    }
+  }
+  dart.setSignature(_TakeStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._TakeStream$(T), [StreamOfT(), core.int])}),
+    fields: () => ({[_count]: core.int})
+  });
+  return _TakeStream;
+});
+async._TakeStream = _TakeStream();
+const _sharedState = Symbol('_sharedState');
+const _flag = Symbol('_flag');
+async._StateStreamSubscription$ = dart.generic(T => {
+  let _ForwardingStreamOfT$T = () => (_ForwardingStreamOfT$T = dart.constFn(async._ForwardingStream$(T, T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _StateStreamSubscription extends async._ForwardingStreamSubscription$(T, T) {
+    new(stream, onData, onError, onDone, cancelOnError, sharedState) {
+      this[_sharedState] = sharedState;
+      super.new(stream, onData, onError, onDone, cancelOnError);
+    }
+    get [_flag]() {
+      return core.bool._check(this[_sharedState]);
+    }
+    set [_flag](flag) {
+      this[_sharedState] = flag;
+    }
+    get [_count]() {
+      return core.int._check(this[_sharedState]);
+    }
+    set [_count](count) {
+      this[_sharedState] = count;
+    }
+  }
+  dart.setSignature(_StateStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StateStreamSubscription$(T), [_ForwardingStreamOfT$T(), TTovoid(), core.Function, VoidTovoid(), core.bool, dart.dynamic])}),
+    fields: () => ({[_sharedState]: dart.dynamic}),
+    getters: () => ({
+      [_flag]: dart.definiteFunctionType(core.bool, []),
+      [_count]: dart.definiteFunctionType(core.int, [])
+    }),
+    setters: () => ({
+      [_flag]: dart.definiteFunctionType(dart.void, [core.bool]),
+      [_count]: dart.definiteFunctionType(dart.void, [core.int])
+    })
+  });
+  return _StateStreamSubscription;
+});
+async._StateStreamSubscription = _StateStreamSubscription();
+async._TakeWhileStream$ = dart.generic(T => {
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _TakeWhileStream extends async._ForwardingStream$(T, T) {
+    new(source, test) {
+      this[_test] = test;
+      super.new(source);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let satisfies = null;
+      try {
+        satisfies = this[_test](inputEvent);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async._addErrorWithReplacement(sink, e, s);
+        sink[_close$]();
+        return;
+      }
+
+      if (dart.test(satisfies)) {
+        sink[_add$](inputEvent);
+      } else {
+        sink[_close$]();
+      }
+    }
+  }
+  dart.setSignature(_TakeWhileStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._TakeWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
+    fields: () => ({[_test]: _PredicateOfT()})
+  });
+  return _TakeWhileStream;
+});
+async._TakeWhileStream = _TakeWhileStream();
+async._SkipStream$ = dart.generic(T => {
+  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _SkipStream extends async._ForwardingStream$(T, T) {
+    new(source, count) {
+      this[_count] = count;
+      super.new(source);
+      if (!(typeof count == 'number') || dart.notNull(count) < 0) dart.throw(new core.ArgumentError(count));
+    }
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let subscription = _StateStreamSubscriptionOfT()._check(sink);
+      let count = subscription[_count];
+      if (dart.notNull(count) > 0) {
+        subscription[_count] = dart.notNull(count) - 1;
+        return;
+      }
+      sink[_add$](inputEvent);
+    }
+  }
+  dart.setSignature(_SkipStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._SkipStream$(T), [StreamOfT(), core.int])}),
+    fields: () => ({[_count]: core.int})
+  });
+  return _SkipStream;
+});
+async._SkipStream = _SkipStream();
+async._SkipWhileStream$ = dart.generic(T => {
+  let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let _PredicateOfT = () => (_PredicateOfT = dart.constFn(async._Predicate$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _SkipWhileStream extends async._ForwardingStream$(T, T) {
+    new(source, test) {
+      this[_test] = test;
+      super.new(source);
+    }
+    [_createSubscription](onData, onError, onDone, cancelOnError) {
+      return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, false);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      let subscription = _StateStreamSubscriptionOfT()._check(sink);
+      let hasFailed = subscription[_flag];
+      if (dart.test(hasFailed)) {
+        sink[_add$](inputEvent);
+        return;
+      }
+      let satisfies = null;
+      try {
+        satisfies = this[_test](inputEvent);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        async._addErrorWithReplacement(sink, e, s);
+        subscription[_flag] = true;
+        return;
+      }
+
+      if (!dart.test(satisfies)) {
+        subscription[_flag] = true;
+        sink[_add$](inputEvent);
+      }
+    }
+  }
+  dart.setSignature(_SkipWhileStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._SkipWhileStream$(T), [StreamOfT(), _PredicateOfT()])}),
+    fields: () => ({[_test]: _PredicateOfT()})
+  });
+  return _SkipWhileStream;
+});
+async._SkipWhileStream = _SkipWhileStream();
+async._Equality$ = dart.generic(T => {
+  const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [T, T]));
+  return _Equality;
+});
+async._Equality = _Equality();
+const _equals = Symbol('_equals');
+async._DistinctStream$ = dart.generic(T => {
+  let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
+  let _EqualityOfT = () => (_EqualityOfT = dart.constFn(async._Equality$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class _DistinctStream extends async._ForwardingStream$(T, T) {
+    new(source, equals) {
+      this[_previous$] = async._DistinctStream._SENTINEL;
+      this[_equals] = equals;
+      super.new(source);
+    }
+    [_handleData](inputEvent, sink) {
+      T._check(inputEvent);
+      _EventSinkOfT()._check(sink);
+      if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
+        this[_previous$] = inputEvent;
+        return sink[_add$](inputEvent);
+      } else {
+        let isEqual = null;
+        try {
+          if (this[_equals] == null) {
+            isEqual = dart.equals(this[_previous$], inputEvent);
+          } else {
+            isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
+          }
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          async._addErrorWithReplacement(sink, e, s);
+          return null;
+        }
+
+        if (!dart.test(isEqual)) {
+          sink[_add$](inputEvent);
+          this[_previous$] = inputEvent;
+        }
+      }
+    }
+  }
+  dart.setSignature(_DistinctStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
+    fields: () => ({
+      [_equals]: _EqualityOfT(),
+      [_previous$]: core.Object
+    }),
+    sfields: () => ({_SENTINEL: core.Object})
+  });
+  return _DistinctStream;
+});
+async._DistinctStream = _DistinctStream();
+dart.defineLazy(async._DistinctStream, {
+  get _SENTINEL() {
+    return new core.Object();
+  },
+  set _SENTINEL(_) {}
+});
+async._EventSinkWrapper$ = dart.generic(T => {
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  class _EventSinkWrapper extends core.Object {
+    new(sink) {
+      this[_sink] = sink;
+    }
+    add(data) {
+      T._check(data);
+      this[_sink][_add$](data);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_sink][_addError](error, stackTrace);
+    }
+    close() {
+      this[_sink][_close$]();
+    }
+  }
+  dart.addTypeTests(_EventSinkWrapper);
+  _EventSinkWrapper[dart.implements] = () => [EventSinkOfT()];
+  dart.setSignature(_EventSinkWrapper, {
+    constructors: () => ({new: dart.definiteFunctionType(async._EventSinkWrapper$(T), [async._EventSink])}),
+    fields: () => ({[_sink]: async._EventSink}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _EventSinkWrapper;
+});
+async._EventSinkWrapper = _EventSinkWrapper();
+const _transformerSink = Symbol('_transformerSink');
+const _isSubscribed = Symbol('_isSubscribed');
+async._SinkTransformerStreamSubscription$ = dart.generic((S, T) => {
+  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
+  let StreamSubscriptionOfS = () => (StreamSubscriptionOfS = dart.constFn(async.StreamSubscription$(S)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
+  let _EventSinkWrapperOfT = () => (_EventSinkWrapperOfT = dart.constFn(async._EventSinkWrapper$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _SinkTransformerStreamSubscription extends async._BufferingStreamSubscription$(T) {
+    new(source, mapper, onData, onError, onDone, cancelOnError) {
+      this[_transformerSink] = null;
+      this[_subscription] = null;
+      super.new(onData, onError, onDone, cancelOnError);
+      let eventSink = new (_EventSinkWrapperOfT())(this);
+      this[_transformerSink] = mapper(eventSink);
+      this[_subscription] = source.listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
+    }
+    get [_isSubscribed]() {
+      return this[_subscription] != null;
+    }
+    [_add$](data) {
+      T._check(data);
+      if (dart.test(this[_isClosed$])) {
+        dart.throw(new core.StateError("Stream is already closed"));
+      }
+      super[_add$](data);
+    }
+    [_addError](error, stackTrace) {
+      if (dart.test(this[_isClosed$])) {
+        dart.throw(new core.StateError("Stream is already closed"));
+      }
+      super[_addError](error, stackTrace);
+    }
+    [_close$]() {
+      if (dart.test(this[_isClosed$])) {
+        dart.throw(new core.StateError("Stream is already closed"));
+      }
+      super[_close$]();
+    }
+    [_onPause]() {
+      if (dart.test(this[_isSubscribed])) this[_subscription].pause();
+    }
+    [_onResume]() {
+      if (dart.test(this[_isSubscribed])) this[_subscription].resume();
+    }
+    [_onCancel]() {
+      if (dart.test(this[_isSubscribed])) {
+        let subscription = this[_subscription];
+        this[_subscription] = null;
+        subscription.cancel();
+      }
+      return null;
+    }
+    [_handleData](data) {
+      S._check(data);
+      try {
+        this[_transformerSink].add(data);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        this[_addError](e, s);
+      }
+
+    }
+    [_handleError](error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      try {
+        this[_transformerSink].addError(error, core.StackTrace._check(stackTrace));
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        if (core.identical(e, error)) {
+          this[_addError](error, core.StackTrace._check(stackTrace));
+        } else {
+          this[_addError](e, s);
+        }
+      }
+
+    }
+    [_handleDone]() {
+      try {
+        this[_subscription] = null;
+        this[_transformerSink].close();
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        this[_addError](e, s);
+      }
+
+    }
+  }
+  dart.setSignature(_SinkTransformerStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(async._SinkTransformerStreamSubscription$(S, T), [StreamOfS(), _SinkMapperOfS$T(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
+    fields: () => ({
+      [_transformerSink]: EventSinkOfS(),
+      [_subscription]: StreamSubscriptionOfS()
+    }),
+    getters: () => ({[_isSubscribed]: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      [_handleData]: dart.definiteFunctionType(dart.void, [S]),
+      [_handleError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic]),
+      [_handleDone]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _SinkTransformerStreamSubscription;
+});
+async._SinkTransformerStreamSubscription = _SinkTransformerStreamSubscription();
+async._SinkMapper$ = dart.generic((S, T) => {
+  const _SinkMapper = dart.typedef('_SinkMapper', () => dart.functionType(async.EventSink$(S), [async.EventSink$(T)]));
+  return _SinkMapper;
+});
+async._SinkMapper = _SinkMapper();
+const _sinkMapper = Symbol('_sinkMapper');
+async._StreamSinkTransformer$ = dart.generic((S, T) => {
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _BoundSinkStreamOfS$T = () => (_BoundSinkStreamOfS$T = dart.constFn(async._BoundSinkStream$(S, T)))();
+  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
+  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
+  class _StreamSinkTransformer extends core.Object {
+    new(sinkMapper) {
+      this[_sinkMapper] = sinkMapper;
+    }
+    bind(stream) {
+      StreamOfS()._check(stream);
+      return new (_BoundSinkStreamOfS$T())(stream, this[_sinkMapper]);
+    }
+  }
+  dart.addTypeTests(_StreamSinkTransformer);
+  _StreamSinkTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
+  dart.setSignature(_StreamSinkTransformer, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamSinkTransformer$(S, T), [_SinkMapperOfS$T()])}),
+    fields: () => ({[_sinkMapper]: _SinkMapperOfS$T()}),
+    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
+  });
+  return _StreamSinkTransformer;
+});
+async._StreamSinkTransformer = _StreamSinkTransformer();
+async._BoundSinkStream$ = dart.generic((S, T) => {
+  let _SinkTransformerStreamSubscriptionOfS$T = () => (_SinkTransformerStreamSubscriptionOfS$T = dart.constFn(async._SinkTransformerStreamSubscription$(S, T)))();
+  let _SinkMapperOfS$T = () => (_SinkMapperOfS$T = dart.constFn(async._SinkMapper$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _BoundSinkStream extends async.Stream$(T) {
+    get isBroadcast() {
+      return this[_stream].isBroadcast;
+    }
+    new(stream, sinkMapper) {
+      this[_stream] = stream;
+      this[_sinkMapper] = sinkMapper;
+      super.new();
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      cancelOnError = core.identical(true, cancelOnError);
+      let subscription = new (_SinkTransformerStreamSubscriptionOfS$T())(this[_stream], this[_sinkMapper], onData, onError, onDone, cancelOnError);
+      return subscription;
+    }
+  }
+  dart.setSignature(_BoundSinkStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BoundSinkStream$(S, T), [StreamOfS(), _SinkMapperOfS$T()])}),
+    fields: () => ({
+      [_sinkMapper]: _SinkMapperOfS$T(),
+      [_stream]: StreamOfS()
+    }),
+    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+  });
+  return _BoundSinkStream;
+});
+async._BoundSinkStream = _BoundSinkStream();
+async._TransformDataHandler$ = dart.generic((S, T) => {
+  const _TransformDataHandler = dart.typedef('_TransformDataHandler', () => dart.functionType(dart.void, [S, async.EventSink$(T)]));
+  return _TransformDataHandler;
+});
+async._TransformDataHandler = _TransformDataHandler();
+async._TransformErrorHandler$ = dart.generic(T => {
+  const _TransformErrorHandler = dart.typedef('_TransformErrorHandler', () => dart.functionType(dart.void, [core.Object, core.StackTrace, async.EventSink$(T)]));
+  return _TransformErrorHandler;
+});
+async._TransformErrorHandler = _TransformErrorHandler();
+async._TransformDoneHandler$ = dart.generic(T => {
+  const _TransformDoneHandler = dart.typedef('_TransformDoneHandler', () => dart.functionType(dart.void, [async.EventSink$(T)]));
+  return _TransformDoneHandler;
+});
+async._TransformDoneHandler = _TransformDoneHandler();
+async._HandlerEventSink$ = dart.generic((S, T) => {
+  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
+  let _TransformDataHandlerOfS$T = () => (_TransformDataHandlerOfS$T = dart.constFn(async._TransformDataHandler$(S, T)))();
+  let _TransformErrorHandlerOfT = () => (_TransformErrorHandlerOfT = dart.constFn(async._TransformErrorHandler$(T)))();
+  let _TransformDoneHandlerOfT = () => (_TransformDoneHandlerOfT = dart.constFn(async._TransformDoneHandler$(T)))();
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  class _HandlerEventSink extends core.Object {
+    new(handleData, handleError, handleDone, sink) {
+      this[_handleData] = handleData;
+      this[_handleError] = handleError;
+      this[_handleDone] = handleDone;
+      this[_sink] = sink;
+    }
+    add(data) {
+      S._check(data);
+      this[_handleData](data, this[_sink]);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_handleError](error, stackTrace, this[_sink]);
+    }
+    close() {
+      this[_handleDone](this[_sink]);
+    }
+  }
+  dart.addTypeTests(_HandlerEventSink);
+  _HandlerEventSink[dart.implements] = () => [EventSinkOfS()];
+  dart.setSignature(_HandlerEventSink, {
+    constructors: () => ({new: dart.definiteFunctionType(async._HandlerEventSink$(S, T), [_TransformDataHandlerOfS$T(), _TransformErrorHandlerOfT(), _TransformDoneHandlerOfT(), EventSinkOfT()])}),
+    fields: () => ({
+      [_handleData]: _TransformDataHandlerOfS$T(),
+      [_handleError]: _TransformErrorHandlerOfT(),
+      [_handleDone]: _TransformDoneHandlerOfT(),
+      [_sink]: EventSinkOfT()
+    }),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [S]),
+      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _HandlerEventSink;
+});
+async._HandlerEventSink = _HandlerEventSink();
+async._StreamHandlerTransformer$ = dart.generic((S, T) => {
+  let _HandlerEventSinkOfS$T = () => (_HandlerEventSinkOfS$T = dart.constFn(async._HandlerEventSink$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let SAndEventSinkOfTTovoid = () => (SAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [S, EventSinkOfT()])))();
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  let ObjectAndStackTraceAndEventSinkOfTTovoid = () => (ObjectAndStackTraceAndEventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [core.Object, core.StackTrace, EventSinkOfT()])))();
+  let EventSinkOfTTovoid = () => (EventSinkOfTTovoid = dart.constFn(dart.functionType(dart.void, [EventSinkOfT()])))();
+  let EventSinkOfTTo_HandlerEventSinkOfS$T = () => (EventSinkOfTTo_HandlerEventSinkOfS$T = dart.constFn(dart.definiteFunctionType(_HandlerEventSinkOfS$T(), [EventSinkOfT()])))();
+  class _StreamHandlerTransformer extends async._StreamSinkTransformer$(S, T) {
+    new(opts) {
+      let handleData = opts && 'handleData' in opts ? opts.handleData : null;
+      let handleError = opts && 'handleError' in opts ? opts.handleError : null;
+      let handleDone = opts && 'handleDone' in opts ? opts.handleDone : null;
+      super.new(dart.fn(outputSink => {
+        if (handleData == null) handleData = async._StreamHandlerTransformer._defaultHandleData;
+        if (handleError == null) handleError = async._StreamHandlerTransformer._defaultHandleError;
+        if (handleDone == null) handleDone = async._StreamHandlerTransformer._defaultHandleDone;
+        return new (_HandlerEventSinkOfS$T())(handleData, handleError, handleDone, outputSink);
+      }, EventSinkOfTTo_HandlerEventSinkOfS$T()));
+    }
+    bind(stream) {
+      StreamOfS()._check(stream);
+      return super.bind(stream);
+    }
+    static _defaultHandleData(data, sink) {
+      sink.add(data);
+    }
+    static _defaultHandleError(error, stackTrace, sink) {
+      sink.addError(error, stackTrace);
+    }
+    static _defaultHandleDone(sink) {
+      sink.close();
+    }
+  }
+  dart.setSignature(_StreamHandlerTransformer, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamHandlerTransformer$(S, T), [], {handleData: SAndEventSinkOfTTovoid(), handleError: ObjectAndStackTraceAndEventSinkOfTTovoid(), handleDone: EventSinkOfTTovoid()})}),
+    statics: () => ({
+      _defaultHandleData: dart.definiteFunctionType(dart.void, [dart.dynamic, async.EventSink]),
+      _defaultHandleError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace, async.EventSink]),
+      _defaultHandleDone: dart.definiteFunctionType(dart.void, [async.EventSink])
+    }),
+    names: ['_defaultHandleData', '_defaultHandleError', '_defaultHandleDone']
+  });
+  return _StreamHandlerTransformer;
+});
+async._StreamHandlerTransformer = _StreamHandlerTransformer();
+async._SubscriptionTransformer$ = dart.generic((S, T) => {
+  const _SubscriptionTransformer = dart.typedef('_SubscriptionTransformer', () => dart.functionType(async.StreamSubscription$(T), [async.Stream$(S), core.bool]));
+  return _SubscriptionTransformer;
+});
+async._SubscriptionTransformer = _SubscriptionTransformer();
+const _transformer = Symbol('_transformer');
+async._StreamSubscriptionTransformer$ = dart.generic((S, T) => {
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _BoundSubscriptionStreamOfS$T = () => (_BoundSubscriptionStreamOfS$T = dart.constFn(async._BoundSubscriptionStream$(S, T)))();
+  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
+  let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
+  class _StreamSubscriptionTransformer extends core.Object {
+    new(transformer) {
+      this[_transformer] = transformer;
+    }
+    bind(stream) {
+      StreamOfS()._check(stream);
+      return new (_BoundSubscriptionStreamOfS$T())(stream, this[_transformer]);
+    }
+  }
+  dart.addTypeTests(_StreamSubscriptionTransformer);
+  _StreamSubscriptionTransformer[dart.implements] = () => [StreamTransformerOfS$T()];
+  dart.setSignature(_StreamSubscriptionTransformer, {
+    constructors: () => ({new: dart.definiteFunctionType(async._StreamSubscriptionTransformer$(S, T), [_SubscriptionTransformerOfS$T()])}),
+    fields: () => ({[_transformer]: _SubscriptionTransformerOfS$T()}),
+    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])})
+  });
+  return _StreamSubscriptionTransformer;
+});
+async._StreamSubscriptionTransformer = _StreamSubscriptionTransformer();
+async._BoundSubscriptionStream$ = dart.generic((S, T) => {
+  let _SubscriptionTransformerOfS$T = () => (_SubscriptionTransformerOfS$T = dart.constFn(async._SubscriptionTransformer$(S, T)))();
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _BoundSubscriptionStream extends async.Stream$(T) {
+    new(stream, transformer) {
+      this[_stream] = stream;
+      this[_transformer] = transformer;
+      super.new();
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      cancelOnError = core.identical(true, cancelOnError);
+      let result = this[_transformer](this[_stream], cancelOnError);
+      result.onData(onData);
+      result.onError(onError);
+      result.onDone(onDone);
+      return result;
+    }
+  }
+  dart.setSignature(_BoundSubscriptionStream, {
+    constructors: () => ({new: dart.definiteFunctionType(async._BoundSubscriptionStream$(S, T), [StreamOfS(), _SubscriptionTransformerOfS$T()])}),
+    fields: () => ({
+      [_transformer]: _SubscriptionTransformerOfS$T(),
+      [_stream]: StreamOfS()
+    }),
+    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+  });
+  return _BoundSubscriptionStream;
+});
+async._BoundSubscriptionStream = _BoundSubscriptionStream();
+async.Timer = class Timer extends core.Object {
+  static new(duration, callback) {
+    if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
+      return async.Zone.current.createTimer(duration, callback);
+    }
+    return async.Zone.current.createTimer(duration, async.Zone.current.bindCallback(dart.void)(callback, {runGuarded: true}));
+  }
+  static periodic(duration, callback) {
+    if (dart.equals(async.Zone.current, async.Zone.ROOT)) {
+      return async.Zone.current.createPeriodicTimer(duration, callback);
+    }
+    let boundCallback = async.Zone.current.bindUnaryCallback(dart.dynamic, async.Timer)(callback, {runGuarded: true});
+    return async.Zone.current.createPeriodicTimer(duration, boundCallback);
+  }
+  static run(callback) {
+    async.Timer.new(core.Duration.ZERO, callback);
+  }
+  static _createTimer(duration, callback) {
+    let milliseconds = duration.inMilliseconds;
+    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
+    return new _isolate_helper.TimerImpl(milliseconds, callback);
+  }
+  static _createPeriodicTimer(duration, callback) {
+    let milliseconds = duration.inMilliseconds;
+    if (dart.notNull(milliseconds) < 0) milliseconds = 0;
+    return new _isolate_helper.TimerImpl.periodic(milliseconds, callback);
+  }
+};
+dart.setSignature(async.Timer, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
+    periodic: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
+  }),
+  statics: () => ({
+    run: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    _createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
+    _createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()])
+  }),
+  names: ['run', '_createTimer', '_createPeriodicTimer']
+});
+async.ZoneCallback$ = dart.generic(R => {
+  const ZoneCallback = dart.typedef('ZoneCallback', () => dart.functionType(R, []));
+  return ZoneCallback;
+});
+async.ZoneCallback = ZoneCallback();
+async.ZoneUnaryCallback$ = dart.generic((R, T) => {
+  const ZoneUnaryCallback = dart.typedef('ZoneUnaryCallback', () => dart.functionType(R, [T]));
+  return ZoneUnaryCallback;
+});
+async.ZoneUnaryCallback = ZoneUnaryCallback();
+async.ZoneBinaryCallback$ = dart.generic((R, T1, T2) => {
+  const ZoneBinaryCallback = dart.typedef('ZoneBinaryCallback', () => dart.functionType(R, [T1, T2]));
+  return ZoneBinaryCallback;
+});
+async.ZoneBinaryCallback = ZoneBinaryCallback();
+async.HandleUncaughtErrorHandler$ = dart.generic(R => {
+  const HandleUncaughtErrorHandler = dart.typedef('HandleUncaughtErrorHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]));
+  return HandleUncaughtErrorHandler;
+});
+async.HandleUncaughtErrorHandler = HandleUncaughtErrorHandler();
+async.RunHandler$ = dart.generic(R => {
+  const RunHandler = dart.typedef('RunHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
+  return RunHandler;
+});
+async.RunHandler = RunHandler();
+async.RunUnaryHandler$ = dart.generic((R, T) => {
+  const RunUnaryHandler = dart.typedef('RunUnaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]));
+  return RunUnaryHandler;
+});
+async.RunUnaryHandler = RunUnaryHandler();
+async.RunBinaryHandler$ = dart.generic((R, T1, T2) => {
+  const RunBinaryHandler = dart.typedef('RunBinaryHandler', () => dart.functionType(R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]));
+  return RunBinaryHandler;
+});
+async.RunBinaryHandler = RunBinaryHandler();
+async.RegisterCallbackHandler$ = dart.generic(R => {
+  const RegisterCallbackHandler = dart.typedef('RegisterCallbackHandler', () => dart.functionType(async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]));
+  return RegisterCallbackHandler;
+});
+async.RegisterCallbackHandler = RegisterCallbackHandler();
+async.RegisterUnaryCallbackHandler$ = dart.generic((R, T) => {
+  const RegisterUnaryCallbackHandler = dart.typedef('RegisterUnaryCallbackHandler', () => dart.functionType(async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]));
+  return RegisterUnaryCallbackHandler;
+});
+async.RegisterUnaryCallbackHandler = RegisterUnaryCallbackHandler();
+async.RegisterBinaryCallbackHandler$ = dart.generic((R, T1, T2) => {
+  const RegisterBinaryCallbackHandler = dart.typedef('RegisterBinaryCallbackHandler', () => dart.functionType(async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]));
+  return RegisterBinaryCallbackHandler;
+});
+async.RegisterBinaryCallbackHandler = RegisterBinaryCallbackHandler();
+async.ErrorCallbackHandler = dart.typedef('ErrorCallbackHandler', () => dart.functionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace]));
+async.ScheduleMicrotaskHandler = dart.typedef('ScheduleMicrotaskHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTovoid()]));
+async.CreateTimerHandler = dart.typedef('CreateTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()]));
+async.CreatePeriodicTimerHandler = dart.typedef('CreatePeriodicTimerHandler', () => dart.functionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()]));
+async.PrintHandler = dart.typedef('PrintHandler', () => dart.functionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String]));
+async.ForkHandler = dart.typedef('ForkHandler', () => dart.functionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map]));
+async._ZoneFunction$ = dart.generic(T => {
+  class _ZoneFunction extends core.Object {
+    new(zone, func) {
+      this.zone = zone;
+      this.function = func;
+    }
+  }
+  dart.addTypeTests(_ZoneFunction);
+  dart.setSignature(_ZoneFunction, {
+    constructors: () => ({new: dart.definiteFunctionType(async._ZoneFunction$(T), [async._Zone, T])}),
+    fields: () => ({
+      zone: async._Zone,
+      function: T
+    })
+  });
+  return _ZoneFunction;
+});
+async._ZoneFunction = _ZoneFunction();
+async.ZoneSpecification = class ZoneSpecification extends core.Object {
+  static new(opts) {
+    return new async._ZoneSpecification(opts);
+  }
+  static from(other, opts) {
+    let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
+    let run = opts && 'run' in opts ? opts.run : null;
+    let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
+    let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
+    let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
+    let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
+    let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
+    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
+    let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
+    let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
+    let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
+    let print = opts && 'print' in opts ? opts.print : null;
+    let fork = opts && 'fork' in opts ? opts.fork : null;
+    return async.ZoneSpecification.new({handleUncaughtError: (handleUncaughtError != null ? handleUncaughtError : other.handleUncaughtError), run: (run != null ? run : other.run), runUnary: (runUnary != null ? runUnary : other.runUnary), runBinary: (runBinary != null ? runBinary : other.runBinary), registerCallback: (registerCallback != null ? registerCallback : other.registerCallback), registerUnaryCallback: (registerUnaryCallback != null ? registerUnaryCallback : other.registerUnaryCallback), registerBinaryCallback: (registerBinaryCallback != null ? registerBinaryCallback : other.registerBinaryCallback), errorCallback: (errorCallback != null ? errorCallback : other.errorCallback), scheduleMicrotask: (scheduleMicrotask != null ? scheduleMicrotask : other.scheduleMicrotask), createTimer: (createTimer != null ? createTimer : other.createTimer), createPeriodicTimer: (createPeriodicTimer != null ? createPeriodicTimer : other.createPeriodicTimer), print: (print != null ? print : other.print), fork: (fork != null ? fork : other.fork)});
+  }
+};
+dart.setSignature(async.ZoneSpecification, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(async.ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler}),
+    from: dart.definiteFunctionType(async.ZoneSpecification, [async.ZoneSpecification], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})
+  })
+});
+async._ZoneSpecification = class _ZoneSpecification extends core.Object {
+  new(opts) {
+    let handleUncaughtError = opts && 'handleUncaughtError' in opts ? opts.handleUncaughtError : null;
+    let run = opts && 'run' in opts ? opts.run : null;
+    let runUnary = opts && 'runUnary' in opts ? opts.runUnary : null;
+    let runBinary = opts && 'runBinary' in opts ? opts.runBinary : null;
+    let registerCallback = opts && 'registerCallback' in opts ? opts.registerCallback : null;
+    let registerUnaryCallback = opts && 'registerUnaryCallback' in opts ? opts.registerUnaryCallback : null;
+    let registerBinaryCallback = opts && 'registerBinaryCallback' in opts ? opts.registerBinaryCallback : null;
+    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
+    let scheduleMicrotask = opts && 'scheduleMicrotask' in opts ? opts.scheduleMicrotask : null;
+    let createTimer = opts && 'createTimer' in opts ? opts.createTimer : null;
+    let createPeriodicTimer = opts && 'createPeriodicTimer' in opts ? opts.createPeriodicTimer : null;
+    let print = opts && 'print' in opts ? opts.print : null;
+    let fork = opts && 'fork' in opts ? opts.fork : null;
+    this.handleUncaughtError = handleUncaughtError;
+    this.run = run;
+    this.runUnary = runUnary;
+    this.runBinary = runBinary;
+    this.registerCallback = registerCallback;
+    this.registerUnaryCallback = registerUnaryCallback;
+    this.registerBinaryCallback = registerBinaryCallback;
+    this.errorCallback = errorCallback;
+    this.scheduleMicrotask = scheduleMicrotask;
+    this.createTimer = createTimer;
+    this.createPeriodicTimer = createPeriodicTimer;
+    this.print = print;
+    this.fork = fork;
+  }
+};
+async._ZoneSpecification[dart.implements] = () => [async.ZoneSpecification];
+dart.setSignature(async._ZoneSpecification, {
+  constructors: () => ({new: dart.definiteFunctionType(async._ZoneSpecification, [], {handleUncaughtError: async.HandleUncaughtErrorHandler, run: async.RunHandler, runUnary: async.RunUnaryHandler, runBinary: async.RunBinaryHandler, registerCallback: async.RegisterCallbackHandler, registerUnaryCallback: async.RegisterUnaryCallbackHandler, registerBinaryCallback: async.RegisterBinaryCallbackHandler, errorCallback: async.ErrorCallbackHandler, scheduleMicrotask: async.ScheduleMicrotaskHandler, createTimer: async.CreateTimerHandler, createPeriodicTimer: async.CreatePeriodicTimerHandler, print: async.PrintHandler, fork: async.ForkHandler})}),
+  fields: () => ({
+    handleUncaughtError: async.HandleUncaughtErrorHandler,
+    run: async.RunHandler,
+    runUnary: async.RunUnaryHandler,
+    runBinary: async.RunBinaryHandler,
+    registerCallback: async.RegisterCallbackHandler,
+    registerUnaryCallback: async.RegisterUnaryCallbackHandler,
+    registerBinaryCallback: async.RegisterBinaryCallbackHandler,
+    errorCallback: async.ErrorCallbackHandler,
+    scheduleMicrotask: async.ScheduleMicrotaskHandler,
+    createTimer: async.CreateTimerHandler,
+    createPeriodicTimer: async.CreatePeriodicTimerHandler,
+    print: async.PrintHandler,
+    fork: async.ForkHandler
+  })
+});
+async.ZoneDelegate = class ZoneDelegate extends core.Object {};
+async.Zone = class Zone extends core.Object {
+  _() {
+  }
+  static get current() {
+    return async.Zone._current;
+  }
+  static _enter(zone) {
+    dart.assert(zone != null);
+    dart.assert(!core.identical(zone, async.Zone._current));
+    let previous = async.Zone._current;
+    async.Zone._current = zone;
+    return previous;
+  }
+  static _leave(previous) {
+    dart.assert(previous != null);
+    async.Zone._current = previous;
+  }
+};
+dart.defineNamedConstructor(async.Zone, '_');
+dart.setSignature(async.Zone, {
+  constructors: () => ({_: dart.definiteFunctionType(async.Zone, [])}),
+  sfields: () => ({
+    ROOT: async.Zone,
+    _current: async.Zone
+  }),
+  sgetters: () => ({current: dart.definiteFunctionType(async.Zone, [])}),
+  statics: () => ({
+    _enter: dart.definiteFunctionType(async.Zone, [async.Zone]),
+    _leave: dart.definiteFunctionType(dart.void, [async.Zone])
+  }),
+  names: ['_enter', '_leave']
+});
+dart.defineLazy(async.Zone, {
+  get ROOT() {
+    return async._ROOT_ZONE;
+  },
+  get _current() {
+    return async._ROOT_ZONE;
+  },
+  set _current(_) {}
+});
+const _delegate = Symbol('_delegate');
+async._parentDelegate = function(zone) {
+  if (zone.parent == null) return null;
+  return zone.parent[_delegate];
+};
+dart.lazyFn(async._parentDelegate, () => _ZoneToZoneDelegate());
+const _delegationTarget = Symbol('_delegationTarget');
+const _handleUncaughtError = Symbol('_handleUncaughtError');
+const _run = Symbol('_run');
+const _runUnary = Symbol('_runUnary');
+const _runBinary = Symbol('_runBinary');
+const _registerCallback = Symbol('_registerCallback');
+const _registerUnaryCallback = Symbol('_registerUnaryCallback');
+const _registerBinaryCallback = Symbol('_registerBinaryCallback');
+const _errorCallback = Symbol('_errorCallback');
+const _createTimer = Symbol('_createTimer');
+const _createPeriodicTimer = Symbol('_createPeriodicTimer');
+const _print = Symbol('_print');
+const _fork = Symbol('_fork');
+async._ZoneDelegate = class _ZoneDelegate extends core.Object {
+  new(delegationTarget) {
+    this[_delegationTarget] = delegationTarget;
+  }
+  handleUncaughtError(R) {
+    return (zone, error, stackTrace) => {
+      let implementation = this[_delegationTarget][_handleUncaughtError];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, error, stackTrace));
+    };
+  }
+  run(R) {
+    return (zone, f) => {
+      let implementation = this[_delegationTarget][_run];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return R.as(handler(implZone, async._parentDelegate(implZone), zone, f));
+    };
+  }
+  runUnary(R, T) {
+    return (zone, f, arg) => {
+      let implementation = this[_delegationTarget][_runUnary];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg));
+    };
+  }
+  runBinary(R, T1, T2) {
+    return (zone, f, arg1, arg2) => {
+      let implementation = this[_delegationTarget][_runBinary];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implZone, async._parentDelegate(implZone), zone, f, arg1, arg2));
+    };
+  }
+  registerCallback(R) {
+    return (zone, f) => {
+      let implementation = this[_delegationTarget][_registerCallback];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return async.ZoneCallback$(R).as(handler(implZone, async._parentDelegate(implZone), zone, f));
+    };
+  }
+  registerUnaryCallback(R, T) {
+    return (zone, f) => {
+      let implementation = this[_delegationTarget][_registerUnaryCallback];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return async.ZoneUnaryCallback$(R, T).as(handler(implZone, async._parentDelegate(implZone), zone, f));
+    };
+  }
+  registerBinaryCallback(R, T1, T2) {
+    return (zone, f) => {
+      let implementation = this[_delegationTarget][_registerBinaryCallback];
+      let implZone = implementation.zone;
+      let handler = implementation.function;
+      return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implZone, async._parentDelegate(implZone), zone, f));
+    };
+  }
+  errorCallback(zone, error, stackTrace) {
+    let implementation = this[_delegationTarget][_errorCallback];
+    let implZone = implementation.zone;
+    if (core.identical(implZone, async._ROOT_ZONE)) return null;
+    let handler = implementation.function;
+    return handler(implZone, async._parentDelegate(implZone), zone, error, stackTrace);
+  }
+  scheduleMicrotask(zone, f) {
+    let implementation = this[_delegationTarget][_scheduleMicrotask];
+    let implZone = implementation.zone;
+    let handler = implementation.function;
+    handler(implZone, async._parentDelegate(implZone), zone, f);
+  }
+  createTimer(zone, duration, f) {
+    let implementation = this[_delegationTarget][_createTimer];
+    let implZone = implementation.zone;
+    let handler = implementation.function;
+    return handler(implZone, async._parentDelegate(implZone), zone, duration, f);
+  }
+  createPeriodicTimer(zone, period, f) {
+    let implementation = this[_delegationTarget][_createPeriodicTimer];
+    let implZone = implementation.zone;
+    let handler = implementation.function;
+    return handler(implZone, async._parentDelegate(implZone), zone, period, f);
+  }
+  print(zone, line) {
+    let implementation = this[_delegationTarget][_print];
+    let implZone = implementation.zone;
+    let handler = implementation.function;
+    handler(implZone, async._parentDelegate(implZone), zone, line);
+  }
+  fork(zone, specification, zoneValues) {
+    let implementation = this[_delegationTarget][_fork];
+    let implZone = implementation.zone;
+    let handler = implementation.function;
+    return handler(implZone, async._parentDelegate(implZone), zone, specification, zoneValues);
+  }
+};
+async._ZoneDelegate[dart.implements] = () => [async.ZoneDelegate];
+dart.setSignature(async._ZoneDelegate, {
+  constructors: () => ({new: dart.definiteFunctionType(async._ZoneDelegate, [async._Zone])}),
+  fields: () => ({[_delegationTarget]: async._Zone}),
+  methods: () => ({
+    handleUncaughtError: dart.definiteFunctionType(R => [R, [async.Zone, dart.dynamic, core.StackTrace]]),
+    run: dart.definiteFunctionType(R => [R, [async.Zone, dart.functionType(R, [])]]),
+    runUnary: dart.definiteFunctionType((R, T) => [R, [async.Zone, dart.functionType(R, [T]), T]]),
+    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, dart.functionType(R, [T1, T2]), T1, T2]]),
+    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, dart.functionType(R, [])]]),
+    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, dart.functionType(R, [T])]]),
+    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, dart.functionType(R, [T1, T2])]]),
+    errorCallback: dart.definiteFunctionType(async.AsyncError, [async.Zone, core.Object, core.StackTrace]),
+    scheduleMicrotask: dart.definiteFunctionType(dart.void, [async.Zone, VoidTodynamic()]),
+    createTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, VoidTovoid()]),
+    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [async.Zone, core.Duration, TimerTovoid()]),
+    print: dart.definiteFunctionType(dart.void, [async.Zone, core.String]),
+    fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
+  })
+});
+const _map$ = Symbol('_map');
+async._Zone = class _Zone extends core.Object {
+  new() {
+  }
+  inSameErrorZone(otherZone) {
+    return core.identical(this, otherZone) || core.identical(this.errorZone, otherZone.errorZone);
+  }
+};
+async._Zone[dart.implements] = () => [async.Zone];
+dart.setSignature(async._Zone, {
+  constructors: () => ({new: dart.definiteFunctionType(async._Zone, [])}),
+  methods: () => ({inSameErrorZone: dart.definiteFunctionType(core.bool, [async.Zone])})
+});
+const _delegateCache = Symbol('_delegateCache');
+async._CustomZone = class _CustomZone extends async._Zone {
+  get [_delegate]() {
+    if (this[_delegateCache] != null) return this[_delegateCache];
+    this[_delegateCache] = new async._ZoneDelegate(this);
+    return this[_delegateCache];
+  }
+  new(parent, specification, map) {
+    this.parent = parent;
+    this[_map$] = map;
+    this[_run] = null;
+    this[_runUnary] = null;
+    this[_runBinary] = null;
+    this[_registerCallback] = null;
+    this[_registerUnaryCallback] = null;
+    this[_registerBinaryCallback] = null;
+    this[_errorCallback] = null;
+    this[_scheduleMicrotask] = null;
+    this[_createTimer] = null;
+    this[_createPeriodicTimer] = null;
+    this[_print] = null;
+    this[_fork] = null;
+    this[_handleUncaughtError] = null;
+    this[_delegateCache] = null;
+    super.new();
+    this[_run] = specification.run != null ? new (_ZoneFunctionOfRunHandler())(this, specification.run) : this.parent[_run];
+    this[_runUnary] = specification.runUnary != null ? new (_ZoneFunctionOfRunUnaryHandler())(this, specification.runUnary) : this.parent[_runUnary];
+    this[_runBinary] = specification.runBinary != null ? new (_ZoneFunctionOfRunBinaryHandler())(this, specification.runBinary) : this.parent[_runBinary];
+    this[_registerCallback] = specification.registerCallback != null ? new (_ZoneFunctionOfRegisterCallbackHandler())(this, specification.registerCallback) : this.parent[_registerCallback];
+    this[_registerUnaryCallback] = specification.registerUnaryCallback != null ? new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(this, specification.registerUnaryCallback) : this.parent[_registerUnaryCallback];
+    this[_registerBinaryCallback] = specification.registerBinaryCallback != null ? new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(this, specification.registerBinaryCallback) : this.parent[_registerBinaryCallback];
+    this[_errorCallback] = specification.errorCallback != null ? new (_ZoneFunctionOfErrorCallbackHandler())(this, specification.errorCallback) : this.parent[_errorCallback];
+    this[_scheduleMicrotask] = specification.scheduleMicrotask != null ? new (_ZoneFunctionOfScheduleMicrotaskHandler())(this, specification.scheduleMicrotask) : this.parent[_scheduleMicrotask];
+    this[_createTimer] = specification.createTimer != null ? new (_ZoneFunctionOfCreateTimerHandler())(this, specification.createTimer) : this.parent[_createTimer];
+    this[_createPeriodicTimer] = specification.createPeriodicTimer != null ? new (_ZoneFunctionOfCreatePeriodicTimerHandler())(this, specification.createPeriodicTimer) : this.parent[_createPeriodicTimer];
+    this[_print] = specification.print != null ? new (_ZoneFunctionOfPrintHandler())(this, specification.print) : this.parent[_print];
+    this[_fork] = specification.fork != null ? new (_ZoneFunctionOfForkHandler())(this, specification.fork) : this.parent[_fork];
+    this[_handleUncaughtError] = specification.handleUncaughtError != null ? new (_ZoneFunctionOfHandleUncaughtErrorHandler())(this, specification.handleUncaughtError) : this.parent[_handleUncaughtError];
+  }
+  get errorZone() {
+    return this[_handleUncaughtError].zone;
+  }
+  runGuarded(R) {
+    return f => {
+      try {
+        return this.run(R)(f);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  runUnaryGuarded(R, T) {
+    return (f, arg) => {
+      try {
+        return this.runUnary(R, T)(f, arg);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  runBinaryGuarded(R, T1, T2) {
+    return (f, arg1, arg2) => {
+      try {
+        return this.runBinary(R, T1, T2)(f, arg1, arg2);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  bindCallback(R) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      let registered = this.registerCallback(R)(f);
+      if (dart.test(runGuarded)) {
+        return dart.fn(() => this.runGuarded(R)(registered), dart.definiteFunctionType(R, []));
+      } else {
+        return dart.fn(() => this.run(R)(registered), dart.definiteFunctionType(R, []));
+      }
+    };
+  }
+  bindUnaryCallback(R, T) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      let registered = this.registerUnaryCallback(R, T)(f);
+      if (dart.test(runGuarded)) {
+        return dart.fn(arg => this.runUnaryGuarded(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
+      } else {
+        return dart.fn(arg => this.runUnary(R, T)(registered, arg), dart.definiteFunctionType(R, [T]));
+      }
+    };
+  }
+  bindBinaryCallback(R, T1, T2) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      let registered = this.registerBinaryCallback(R, T1, T2)(f);
+      if (dart.test(runGuarded)) {
+        return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
+      } else {
+        return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(registered, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
+      }
+    };
+  }
+  _get(key) {
+    let result = this[_map$][dartx._get](key);
+    if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
+    if (this.parent != null) {
+      let value = this.parent._get(key);
+      if (value != null) {
+        this[_map$][dartx._set](key, value);
+      }
+      return value;
+    }
+    dart.assert(dart.equals(this, async._ROOT_ZONE));
+    return null;
+  }
+  handleUncaughtError(R) {
+    return (error, stackTrace) => {
+      let implementation = this[_handleUncaughtError];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, error, stackTrace));
+    };
+  }
+  fork(opts) {
+    let specification = opts && 'specification' in opts ? opts.specification : null;
+    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
+    let implementation = this[_fork];
+    dart.assert(implementation != null);
+    let parentDelegate = async._parentDelegate(implementation.zone);
+    let handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, specification, zoneValues);
+  }
+  run(R) {
+    return f => {
+      let implementation = this[_run];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return R.as(handler(implementation.zone, parentDelegate, this, f));
+    };
+  }
+  runUnary(R, T) {
+    return (f, arg) => {
+      let implementation = this[_runUnary];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg));
+    };
+  }
+  runBinary(R, T1, T2) {
+    return (f, arg1, arg2) => {
+      let implementation = this[_runBinary];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return R.as(dart.dcall(handler, implementation.zone, parentDelegate, this, f, arg1, arg2));
+    };
+  }
+  registerCallback(R) {
+    return callback => {
+      let implementation = this[_registerCallback];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return async.ZoneCallback$(R).as(handler(implementation.zone, parentDelegate, this, callback));
+    };
+  }
+  registerUnaryCallback(R, T) {
+    return callback => {
+      let implementation = this[_registerUnaryCallback];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return async.ZoneUnaryCallback$(R, T).as(handler(implementation.zone, parentDelegate, this, callback));
+    };
+  }
+  registerBinaryCallback(R, T1, T2) {
+    return callback => {
+      let implementation = this[_registerBinaryCallback];
+      dart.assert(implementation != null);
+      let parentDelegate = async._parentDelegate(implementation.zone);
+      let handler = implementation.function;
+      return async.ZoneBinaryCallback$(R, T1, T2).as(handler(implementation.zone, parentDelegate, this, callback));
+    };
+  }
+  errorCallback(error, stackTrace) {
+    let implementation = this[_errorCallback];
+    dart.assert(implementation != null);
+    let implementationZone = implementation.zone;
+    if (core.identical(implementationZone, async._ROOT_ZONE)) return null;
+    let parentDelegate = async._parentDelegate(async._Zone._check(implementationZone));
+    let handler = implementation.function;
+    return handler(implementationZone, parentDelegate, this, error, stackTrace);
+  }
+  scheduleMicrotask(f) {
+    let implementation = this[_scheduleMicrotask];
+    dart.assert(implementation != null);
+    let parentDelegate = async._parentDelegate(implementation.zone);
+    let handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, f);
+  }
+  createTimer(duration, f) {
+    let implementation = this[_createTimer];
+    dart.assert(implementation != null);
+    let parentDelegate = async._parentDelegate(implementation.zone);
+    let handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, duration, f);
+  }
+  createPeriodicTimer(duration, f) {
+    let implementation = this[_createPeriodicTimer];
+    dart.assert(implementation != null);
+    let parentDelegate = async._parentDelegate(implementation.zone);
+    let handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, duration, f);
+  }
+  print(line) {
+    let implementation = this[_print];
+    dart.assert(implementation != null);
+    let parentDelegate = async._parentDelegate(implementation.zone);
+    let handler = implementation.function;
+    return handler(implementation.zone, parentDelegate, this, line);
+  }
+};
+dart.setSignature(async._CustomZone, {
+  constructors: () => ({new: dart.definiteFunctionType(async._CustomZone, [async._Zone, async.ZoneSpecification, core.Map])}),
+  fields: () => ({
+    [_run]: _ZoneFunctionOfRunHandler(),
+    [_runUnary]: _ZoneFunctionOfRunUnaryHandler(),
+    [_runBinary]: _ZoneFunctionOfRunBinaryHandler(),
+    [_registerCallback]: _ZoneFunctionOfRegisterCallbackHandler(),
+    [_registerUnaryCallback]: _ZoneFunctionOfRegisterUnaryCallbackHandler(),
+    [_registerBinaryCallback]: _ZoneFunctionOfRegisterBinaryCallbackHandler(),
+    [_errorCallback]: _ZoneFunctionOfErrorCallbackHandler(),
+    [_scheduleMicrotask]: _ZoneFunctionOfScheduleMicrotaskHandler(),
+    [_createTimer]: _ZoneFunctionOfCreateTimerHandler(),
+    [_createPeriodicTimer]: _ZoneFunctionOfCreatePeriodicTimerHandler(),
+    [_print]: _ZoneFunctionOfPrintHandler(),
+    [_fork]: _ZoneFunctionOfForkHandler(),
+    [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
+    [_delegateCache]: async.ZoneDelegate,
+    parent: async._Zone,
+    [_map$]: core.Map
+  }),
+  getters: () => ({
+    [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
+    errorZone: dart.definiteFunctionType(async.Zone, [])
+  }),
+  methods: () => ({
+    runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
+    runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
+    runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
+    bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
+    bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
+    bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
+    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
+    fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
+    run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
+    runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
+    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
+    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
+    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
+    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
+    errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
+    scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
+    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
+    print: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+async._rootHandleUncaughtError = function(R) {
+  return (self, parent, zone, error, stackTrace) => {
+    async._schedulePriorityAsyncCallback(dart.fn(() => {
+      if (error == null) error = new core.NullThrownError();
+      if (stackTrace == null) dart.throw(error);
+      async._rethrow(error, stackTrace);
+    }, VoidToNull()));
+  };
+};
+dart.lazyFn(async._rootHandleUncaughtError, () => ZoneAndZoneDelegateAndZone__ToR());
+async._rethrow = function(error, stackTrace) {
+  error.stack = dart.toString(stackTrace);
+  throw error;
+};
+dart.lazyFn(async._rethrow, () => ObjectAndStackTraceTovoid());
+async._rootRun = function(R) {
+  return (self, parent, zone, f) => {
+    if (dart.equals(async.Zone._current, zone)) return f();
+    let old = async.Zone._enter(zone);
+    try {
+      return f();
+    } finally {
+      async.Zone._leave(old);
+    }
+  };
+};
+dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
+async._rootRunUnary = function(R, T) {
+  return (self, parent, zone, f, arg) => {
+    if (dart.equals(async.Zone._current, zone)) return f(arg);
+    let old = async.Zone._enter(zone);
+    try {
+      return f(arg);
+    } finally {
+      async.Zone._leave(old);
+    }
+  };
+};
+dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
+async._rootRunBinary = function(R, T1, T2) {
+  return (self, parent, zone, f, arg1, arg2) => {
+    if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
+    let old = async.Zone._enter(zone);
+    try {
+      return f(arg1, arg2);
+    } finally {
+      async.Zone._leave(old);
+    }
+  };
+};
+dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
+async._rootRegisterCallback = function(R) {
+  return (self, parent, zone, f) => {
+    return f;
+  };
+};
+dart.fn(async._rootRegisterCallback, ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR());
+async._rootRegisterUnaryCallback = function(R, T) {
+  return (self, parent, zone, f) => {
+    return f;
+  };
+};
+dart.fn(async._rootRegisterUnaryCallback, ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T());
+async._rootRegisterBinaryCallback = function(R, T1, T2) {
+  return (self, parent, zone, f) => {
+    return f;
+  };
+};
+dart.fn(async._rootRegisterBinaryCallback, ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2());
+async._rootErrorCallback = function(self, parent, zone, error, stackTrace) {
+  return null;
+};
+dart.lazyFn(async._rootErrorCallback, () => ZoneAndZoneDelegateAndZone__ToAsyncError());
+async._rootScheduleMicrotask = function(self, parent, zone, f) {
+  if (!core.identical(async._ROOT_ZONE, zone)) {
+    let hasErrorHandler = !dart.test(async._ROOT_ZONE.inSameErrorZone(zone));
+    f = zone.bindCallback(dart.dynamic)(f, {runGuarded: hasErrorHandler});
+    zone = async._ROOT_ZONE;
+  }
+  async._scheduleAsyncCallback(f);
+};
+dart.fn(async._rootScheduleMicrotask, ZoneAndZoneDelegateAndZone__Tovoid());
+async._rootCreateTimer = function(self, parent, zone, duration, callback) {
+  if (!core.identical(async._ROOT_ZONE, zone)) {
+    callback = zone.bindCallback(dart.void)(callback);
+  }
+  return async.Timer._createTimer(duration, callback);
+};
+dart.lazyFn(async._rootCreateTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
+async._rootCreatePeriodicTimer = function(self, parent, zone, duration, callback) {
+  if (!core.identical(async._ROOT_ZONE, zone)) {
+    callback = zone.bindUnaryCallback(dart.dynamic, async.Timer)(callback);
+  }
+  return async.Timer._createPeriodicTimer(duration, callback);
+};
+dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
+async._rootPrint = function(self, parent, zone, line) {
+  _internal.printToConsole(line);
+};
+dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
+async._printToZone = function(line) {
+  async.Zone.current.print(line);
+};
+dart.lazyFn(async._printToZone, () => StringTovoid$());
+let const$11;
+async._rootFork = function(self, parent, zone, specification, zoneValues) {
+  _internal.printToZone = async._printToZone;
+  if (specification == null) {
+    specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
+  } else if (!async._ZoneSpecification.is(specification)) {
+    dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
+  }
+  let valueMap = null;
+  if (zoneValues == null) {
+    if (async._Zone.is(zone)) {
+      valueMap = zone[_map$];
+    } else {
+      valueMap = collection.HashMap.new();
+    }
+  } else {
+    valueMap = collection.HashMap.from(zoneValues);
+  }
+  return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
+};
+dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
+let const$12;
+let const$13;
+let const$14;
+let const$15;
+let const$16;
+let const$17;
+let const$18;
+let const$19;
+let const$20;
+let const$21;
+let const$22;
+let const$23;
+let const$24;
+async._RootZone = class _RootZone extends async._Zone {
+  new() {
+    super.new();
+  }
+  get [_run]() {
+    return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
+  }
+  get [_runUnary]() {
+    return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
+  }
+  get [_runBinary]() {
+    return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
+  }
+  get [_registerCallback]() {
+    return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
+  }
+  get [_registerUnaryCallback]() {
+    return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
+  }
+  get [_registerBinaryCallback]() {
+    return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
+  }
+  get [_errorCallback]() {
+    return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
+  }
+  get [_scheduleMicrotask]() {
+    return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
+  }
+  get [_createTimer]() {
+    return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
+  }
+  get [_createPeriodicTimer]() {
+    return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
+  }
+  get [_print]() {
+    return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
+  }
+  get [_fork]() {
+    return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
+  }
+  get [_handleUncaughtError]() {
+    return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
+  }
+  get parent() {
+    return null;
+  }
+  get [_map$]() {
+    return async._RootZone._rootMap;
+  }
+  get [_delegate]() {
+    if (async._RootZone._rootDelegate != null) return async._RootZone._rootDelegate;
+    return async._RootZone._rootDelegate = new async._ZoneDelegate(this);
+  }
+  get errorZone() {
+    return this;
+  }
+  runGuarded(R) {
+    return f => {
+      try {
+        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
+          return f();
+        }
+        return async._rootRun(R)(null, null, this, f);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  runUnaryGuarded(R, T) {
+    return (f, arg) => {
+      try {
+        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
+          return f(arg);
+        }
+        return async._rootRunUnary(R, T)(null, null, this, f, arg);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  runBinaryGuarded(R, T1, T2) {
+    return (f, arg1, arg2) => {
+      try {
+        if (core.identical(async._ROOT_ZONE, async.Zone._current)) {
+          return f(arg1, arg2);
+        }
+        return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        return this.handleUncaughtError(R)(e, s);
+      }
+
+    };
+  }
+  bindCallback(R) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      if (dart.test(runGuarded)) {
+        return dart.fn(() => this.runGuarded(R)(f), dart.definiteFunctionType(R, []));
+      } else {
+        return dart.fn(() => this.run(R)(f), dart.definiteFunctionType(R, []));
+      }
+    };
+  }
+  bindUnaryCallback(R, T) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      if (dart.test(runGuarded)) {
+        return dart.fn(arg => this.runUnaryGuarded(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
+      } else {
+        return dart.fn(arg => this.runUnary(R, T)(f, arg), dart.definiteFunctionType(R, [T]));
+      }
+    };
+  }
+  bindBinaryCallback(R, T1, T2) {
+    return (f, opts) => {
+      let runGuarded = opts && 'runGuarded' in opts ? opts.runGuarded : true;
+      if (dart.test(runGuarded)) {
+        return dart.fn((arg1, arg2) => this.runBinaryGuarded(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
+      } else {
+        return dart.fn((arg1, arg2) => this.runBinary(R, T1, T2)(f, arg1, arg2), dart.definiteFunctionType(R, [T1, T2]));
+      }
+    };
+  }
+  _get(key) {
+    return null;
+  }
+  handleUncaughtError(R) {
+    return (error, stackTrace) => {
+      return async._rootHandleUncaughtError(R)(null, null, this, error, stackTrace);
+    };
+  }
+  fork(opts) {
+    let specification = opts && 'specification' in opts ? opts.specification : null;
+    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
+    return async._rootFork(null, null, this, specification, zoneValues);
+  }
+  run(R) {
+    return f => {
+      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f();
+      return async._rootRun(R)(null, null, this, f);
+    };
+  }
+  runUnary(R, T) {
+    return (f, arg) => {
+      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg);
+      return async._rootRunUnary(R, T)(null, null, this, f, arg);
+    };
+  }
+  runBinary(R, T1, T2) {
+    return (f, arg1, arg2) => {
+      if (core.identical(async.Zone._current, async._ROOT_ZONE)) return f(arg1, arg2);
+      return async._rootRunBinary(R, T1, T2)(null, null, this, f, arg1, arg2);
+    };
+  }
+  registerCallback(R) {
+    return f => {
+      return f;
+    };
+  }
+  registerUnaryCallback(R, T) {
+    return f => {
+      return f;
+    };
+  }
+  registerBinaryCallback(R, T1, T2) {
+    return f => {
+      return f;
+    };
+  }
+  errorCallback(error, stackTrace) {
+    return null;
+  }
+  scheduleMicrotask(f) {
+    async._rootScheduleMicrotask(null, null, this, f);
+  }
+  createTimer(duration, f) {
+    return async.Timer._createTimer(duration, f);
+  }
+  createPeriodicTimer(duration, f) {
+    return async.Timer._createPeriodicTimer(duration, f);
+  }
+  print(line) {
+    _internal.printToConsole(line);
+  }
+};
+dart.setSignature(async._RootZone, {
+  constructors: () => ({new: dart.definiteFunctionType(async._RootZone, [])}),
+  getters: () => ({
+    [_run]: dart.definiteFunctionType(async._ZoneFunction$(async.RunHandler), []),
+    [_runUnary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunUnaryHandler), []),
+    [_runBinary]: dart.definiteFunctionType(async._ZoneFunction$(async.RunBinaryHandler), []),
+    [_registerCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterCallbackHandler), []),
+    [_registerUnaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterUnaryCallbackHandler), []),
+    [_registerBinaryCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.RegisterBinaryCallbackHandler), []),
+    [_errorCallback]: dart.definiteFunctionType(async._ZoneFunction$(async.ErrorCallbackHandler), []),
+    [_scheduleMicrotask]: dart.definiteFunctionType(async._ZoneFunction$(async.ScheduleMicrotaskHandler), []),
+    [_createTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreateTimerHandler), []),
+    [_createPeriodicTimer]: dart.definiteFunctionType(async._ZoneFunction$(async.CreatePeriodicTimerHandler), []),
+    [_print]: dart.definiteFunctionType(async._ZoneFunction$(async.PrintHandler), []),
+    [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
+    [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
+    parent: dart.definiteFunctionType(async._Zone, []),
+    [_map$]: dart.definiteFunctionType(core.Map, []),
+    [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
+    errorZone: dart.definiteFunctionType(async.Zone, [])
+  }),
+  methods: () => ({
+    runGuarded: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
+    runUnaryGuarded: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
+    runBinaryGuarded: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
+    bindCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])], {runGuarded: core.bool}]),
+    bindUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])], {runGuarded: core.bool}]),
+    bindBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])], {runGuarded: core.bool}]),
+    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    handleUncaughtError: dart.definiteFunctionType(R => [R, [dart.dynamic, core.StackTrace]]),
+    fork: dart.definiteFunctionType(async.Zone, [], {specification: async.ZoneSpecification, zoneValues: core.Map}),
+    run: dart.definiteFunctionType(R => [R, [dart.functionType(R, [])]]),
+    runUnary: dart.definiteFunctionType((R, T) => [R, [dart.functionType(R, [T]), T]]),
+    runBinary: dart.definiteFunctionType((R, T1, T2) => [R, [dart.functionType(R, [T1, T2]), T1, T2]]),
+    registerCallback: dart.definiteFunctionType(R => [async.ZoneCallback$(R), [dart.functionType(R, [])]]),
+    registerUnaryCallback: dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [dart.functionType(R, [T])]]),
+    registerBinaryCallback: dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [dart.functionType(R, [T1, T2])]]),
+    errorCallback: dart.definiteFunctionType(async.AsyncError, [core.Object, core.StackTrace]),
+    scheduleMicrotask: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    createTimer: dart.definiteFunctionType(async.Timer, [core.Duration, VoidTovoid()]),
+    createPeriodicTimer: dart.definiteFunctionType(async.Timer, [core.Duration, TimerTovoid()]),
+    print: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  sfields: () => ({
+    _rootMap: core.Map,
+    _rootDelegate: async.ZoneDelegate
+  })
+});
+async._RootZone._rootDelegate = null;
+dart.defineLazy(async._RootZone, {
+  get _rootMap() {
+    return collection.HashMap.new();
+  },
+  set _rootMap(_) {}
+});
+async._ROOT_ZONE = dart.const(new async._RootZone());
+async.runZoned = function(R) {
+  return (body, opts) => {
+    let zoneValues = opts && 'zoneValues' in opts ? opts.zoneValues : null;
+    let zoneSpecification = opts && 'zoneSpecification' in opts ? opts.zoneSpecification : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let errorHandler = null;
+    if (onError != null) {
+      errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
+        try {
+          if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
+            return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
+          }
+          return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
+        } catch (e) {
+          let s = dart.stackTrace(e);
+          if (core.identical(e, error)) {
+            return parent.handleUncaughtError(dart.dynamic)(zone, error, stackTrace);
+          } else {
+            return parent.handleUncaughtError(dart.dynamic)(zone, e, s);
+          }
+        }
+
+      }, ZoneAndZoneDelegateAndZone__Todynamic());
+    }
+    if (zoneSpecification == null) {
+      zoneSpecification = async.ZoneSpecification.new({handleUncaughtError: errorHandler});
+    } else if (errorHandler != null) {
+      zoneSpecification = async.ZoneSpecification.from(zoneSpecification, {handleUncaughtError: errorHandler});
+    }
+    let zone = async.Zone.current.fork({specification: zoneSpecification, zoneValues: zoneValues});
+    if (onError != null) {
+      return zone.runGuarded(R)(body);
+    } else {
+      return zone.run(R)(body);
+    }
+  };
+};
+dart.lazyFn(async.runZoned, () => Fn__ToR());
+collection._USE_ES6_MAPS = true;
+const _length$1 = Symbol('_length');
+const _strings$ = Symbol('_strings');
+const _nums$ = Symbol('_nums');
+const _rest$ = Symbol('_rest');
+const _keys = Symbol('_keys');
+const _containsKey = Symbol('_containsKey');
+const _getBucket$ = Symbol('_getBucket');
+const _findBucketIndex = Symbol('_findBucketIndex');
+const _computeKeys = Symbol('_computeKeys');
+const _get = Symbol('_get');
+const _addHashTableEntry$ = Symbol('_addHashTableEntry');
+const _set = Symbol('_set');
+const _computeHashCode = Symbol('_computeHashCode');
+const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
+const _remove = Symbol('_remove');
+collection._HashMap$ = dart.generic((K, V) => {
+  let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
+  let MappedIterableOfK$V = () => (MappedIterableOfK$V = dart.constFn(_internal.MappedIterable$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let ListOfK = () => (ListOfK = dart.constFn(core.List$(K)))();
+  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  let KToV = () => (KToV = dart.constFn(dart.definiteFunctionType(V, [K])))();
+  let KTobool = () => (KTobool = dart.constFn(dart.definiteFunctionType(core.bool, [K])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
+  class _HashMap extends core.Object {
+    new() {
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
+      this[_keys] = null;
+    }
+    get length() {
+      return this[_length$1];
+    }
+    get isEmpty() {
+      return this[_length$1] == 0;
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    get keys() {
+      return new (_HashMapKeyIterableOfK())(this);
+    }
+    get values() {
+      return MappedIterableOfK$V().new(this.keys, dart.fn(each => this._get(each), KToV()));
+    }
+    containsKey(key) {
+      if (dart.test(collection._HashMap._isStringKey(key))) {
+        let strings = this[_strings$];
+        return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
+      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
+        let nums = this[_nums$];
+        return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
+      } else {
+        return this[_containsKey](key);
+      }
+    }
+    [_containsKey](key) {
+      let rest = this[_rest$];
+      if (rest == null) return false;
+      let bucket = this[_getBucket$](rest, key);
+      return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
+    }
+    containsValue(value) {
+      return this[_computeKeys]()[dartx.any](dart.fn(each => dart.equals(this._get(each), value), KTobool()));
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => {
+        this._set(key, value);
+      }, KAndVToNull()));
+    }
+    _get(key) {
+      if (dart.test(collection._HashMap._isStringKey(key))) {
+        let strings = this[_strings$];
+        return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
+      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
+        let nums = this[_nums$];
+        return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
+      } else {
+        return this[_get](key);
+      }
+    }
+    [_get](key) {
+      let rest = this[_rest$];
+      if (rest == null) return null;
+      let bucket = this[_getBucket$](rest, key);
+      let index = this[_findBucketIndex](bucket, key);
+      return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
+    }
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      if (dart.test(collection._HashMap._isStringKey(key))) {
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
+        this[_addHashTableEntry$](strings, key, value);
+      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
+        this[_addHashTableEntry$](nums, key, value);
+      } else {
+        this[_set](key, value);
+      }
+      return value;
+    }
+    [_set](key, value) {
+      K._check(key);
+      V._check(value);
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
+      let hash = this[_computeHashCode](key);
+      let bucket = rest[hash];
+      if (bucket == null) {
+        collection._HashMap._setTableEntry(rest, hash, [key, value]);
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
+        this[_keys] = null;
+      } else {
+        let index = this[_findBucketIndex](bucket, key);
+        if (dart.notNull(index) >= 0) {
+          bucket[dart.notNull(index) + 1] = value;
+        } else {
+          bucket.push(key, value);
+          this[_length$1] = dart.notNull(this[_length$1]) + 1;
+          this[_keys] = null;
+        }
+      }
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      if (dart.test(this.containsKey(key))) return this._get(key);
+      let value = ifAbsent();
+      this._set(key, value);
+      return value;
+    }
+    remove(key) {
+      if (dart.test(collection._HashMap._isStringKey(key))) {
+        return this[_removeHashTableEntry$](this[_strings$], key);
+      } else if (dart.test(collection._HashMap._isNumericKey(key))) {
+        return this[_removeHashTableEntry$](this[_nums$], key);
+      } else {
+        return this[_remove](key);
+      }
+    }
+    [_remove](key) {
+      let rest = this[_rest$];
+      if (rest == null) return null;
+      let bucket = this[_getBucket$](rest, key);
+      let index = this[_findBucketIndex](bucket, key);
+      if (dart.notNull(index) < 0) return null;
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      this[_keys] = null;
+      return bucket.splice(index, 2)[1];
+    }
+    clear() {
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
+        this[_length$1] = 0;
+      }
+    }
+    forEach(action) {
+      let keys = this[_computeKeys]();
+      for (let i = 0, length = keys[dartx.length]; i < dart.notNull(length); i++) {
+        let key = keys[i];
+        action(K._check(key), this._get(key));
+        if (keys !== this[_keys]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+    }
+    [_computeKeys]() {
+      if (this[_keys] != null) return this[_keys];
+      let result = ListOfK().new(this[_length$1]);
+      let index = 0;
+      let strings = this[_strings$];
+      if (strings != null) {
+        let names = Object.getOwnPropertyNames(strings);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let key = names[i];
+          result[index] = key;
+          index++;
+        }
+      }
+      let nums = this[_nums$];
+      if (nums != null) {
+        let names = Object.getOwnPropertyNames(nums);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let key = +names[i];
+          result[index] = key;
+          index++;
+        }
+      }
+      let rest = this[_rest$];
+      if (rest != null) {
+        let names = Object.getOwnPropertyNames(rest);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let key = names[i];
+          let bucket = rest[key];
+          let length = bucket.length;
+          for (let i = 0; i < length; i = i + 2) {
+            let key = bucket[i];
+            result[index] = key;
+            index++;
+          }
+        }
+      }
+      dart.assert(index == this[_length$1]);
+      return this[_keys] = result;
+    }
+    [_addHashTableEntry$](table, key, value) {
+      K._check(key);
+      V._check(value);
+      if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
+        this[_keys] = null;
+      }
+      collection._HashMap._setTableEntry(table, key, value);
+    }
+    [_removeHashTableEntry$](table, key) {
+      if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
+        let value = V._check(collection._HashMap._getTableEntry(table, key));
+        collection._HashMap._deleteTableEntry(table, key);
+        this[_length$1] = dart.notNull(this[_length$1]) - 1;
+        this[_keys] = null;
+        return value;
+      } else {
+        return null;
+      }
+    }
+    static _isStringKey(key) {
+      return typeof key == 'string' && key != '__proto__';
+    }
+    static _isNumericKey(key) {
+      return typeof key == 'number' && (key & 0x3ffffff) === key;
+    }
+    [_computeHashCode](key) {
+      return dart.hashCode(key) & 0x3ffffff;
+    }
+    static _hasTableEntry(table, key) {
+      let entry = table[key];
+      return entry != null;
+    }
+    static _getTableEntry(table, key) {
+      let entry = table[key];
+      return entry === table ? null : entry;
+    }
+    static _setTableEntry(table, key, value) {
+      if (value == null) {
+        table[key] = table;
+      } else {
+        table[key] = value;
+      }
+    }
+    static _deleteTableEntry(table, key) {
+      delete table[key];
+    }
+    [_getBucket$](table, key) {
+      let hash = this[_computeHashCode](key);
+      return table[hash];
+    }
+    [_findBucketIndex](bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i = i + 2) {
+        if (dart.equals(bucket[i], key)) return i;
+      }
+      return -1;
+    }
+    static _newHashTable() {
+      let table = Object.create(null);
+      let temporaryKey = '<non-identifier-key>';
+      collection._HashMap._setTableEntry(table, temporaryKey, table);
+      collection._HashMap._deleteTableEntry(table, temporaryKey);
+      return table;
+    }
+  }
+  dart.addTypeTests(_HashMap);
+  _HashMap[dart.implements] = () => [HashMapOfK$V()];
+  dart.setSignature(_HashMap, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
+    fields: () => ({
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
+      [_keys]: ListOfK()
+    }),
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      keys: dart.definiteFunctionType(core.Iterable$(K), []),
+      values: dart.definiteFunctionType(core.Iterable$(V), [])
+    }),
+    methods: () => ({
+      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      _get: dart.definiteFunctionType(V, [core.Object]),
+      [_get]: dart.definiteFunctionType(V, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [K, V]),
+      [_set]: dart.definiteFunctionType(dart.void, [K, V]),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
+      remove: dart.definiteFunctionType(V, [core.Object]),
+      [_remove]: dart.definiteFunctionType(V, [core.Object]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
+      [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
+      [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
+      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
+      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
+    }),
+    statics: () => ({
+      _isStringKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _isNumericKey: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+      _getTableEntry: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
+    }),
+    names: ['_isStringKey', '_isNumericKey', '_hasTableEntry', '_getTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
+  });
+  dart.defineExtensionMembers(_HashMap, [
+    'containsKey',
+    'containsValue',
+    'addAll',
+    '_get',
+    '_set',
+    'putIfAbsent',
+    'remove',
+    'clear',
+    'forEach',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'keys',
+    'values'
+  ]);
+  return _HashMap;
+});
+collection._HashMap = _HashMap();
+collection._IdentityHashMap$ = dart.generic((K, V) => {
+  class _IdentityHashMap extends collection._HashMap$(K, V) {
+    new() {
+      super.new();
+    }
+    [_computeHashCode](key) {
+      return core.identityHashCode(key) & 0x3ffffff;
+    }
+    [_findBucketIndex](bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i = i + 2) {
+        if (core.identical(bucket[i], key)) return i;
+      }
+      return -1;
+    }
+  }
+  return _IdentityHashMap;
+});
+collection._IdentityHashMap = _IdentityHashMap();
+const _equals$ = Symbol('_equals');
+const _hashCode = Symbol('_hashCode');
+const _validKey = Symbol('_validKey');
+collection._CustomHashMap$ = dart.generic((K, V) => {
+  let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
+  let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
+  class _CustomHashMap extends collection._HashMap$(K, V) {
+    new(equals, hashCode, validKey) {
+      this[_equals$] = equals;
+      this[_hashCode] = hashCode;
+      this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
+      super.new();
+    }
+    _get(key) {
+      if (!dart.test(this[_validKey](key))) return null;
+      return super[_get](key);
+    }
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      super[_set](key, value);
+      return value;
+    }
+    containsKey(key) {
+      if (!dart.test(this[_validKey](key))) return false;
+      return super[_containsKey](key);
+    }
+    remove(key) {
+      if (!dart.test(this[_validKey](key))) return null;
+      return super[_remove](key);
+    }
+    [_computeHashCode](key) {
+      return this[_hashCode](K._check(key)) & 0x3ffffff;
+    }
+    [_findBucketIndex](bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i = i + 2) {
+        if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
+      }
+      return -1;
+    }
+    toString() {
+      return collection.Maps.mapToString(this);
+    }
+  }
+  dart.setSignature(_CustomHashMap, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
+    fields: () => ({
+      [_equals$]: _EqualityOfK(),
+      [_hashCode]: _HasherOfK(),
+      [_validKey]: _PredicateOfObject()
+    })
+  });
+  dart.defineExtensionMembers(_CustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
+  return _CustomHashMap;
+});
+collection._CustomHashMap = _CustomHashMap();
+const _map$0 = Symbol('_map');
+collection._HashMapKeyIterable$ = dart.generic(E => {
+  let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
+  class _HashMapKeyIterable extends core.Iterable$(E) {
+    new(map) {
+      this[_map$0] = map;
+      super.new();
+    }
+    get length() {
+      return this[_map$0][_length$1];
+    }
+    get isEmpty() {
+      return this[_map$0][_length$1] == 0;
+    }
+    get iterator() {
+      return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
+    }
+    contains(element) {
+      return this[_map$0].containsKey(element);
+    }
+    forEach(f) {
+      let keys = this[_map$0][_computeKeys]();
+      for (let i = 0, length = keys.length; i < length; i++) {
+        f(keys[i]);
+        if (keys !== this[_map$0][_keys]) {
+          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
+        }
+      }
+    }
+  }
+  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_HashMapKeyIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
+    fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
+  });
+  dart.defineExtensionMembers(_HashMapKeyIterable, [
+    'contains',
+    'forEach',
+    'length',
+    'isEmpty',
+    'iterator'
+  ]);
+  return _HashMapKeyIterable;
+});
+collection._HashMapKeyIterable = _HashMapKeyIterable();
+const _offset = Symbol('_offset');
+const _current$2 = Symbol('_current');
+collection._HashMapKeyIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  class _HashMapKeyIterator extends core.Object {
+    new(map, keys) {
+      this[_map$0] = map;
+      this[_keys] = keys;
+      this[_offset] = 0;
+      this[_current$2] = null;
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      let keys = this[_keys];
+      let offset = this[_offset];
+      if (keys !== this[_map$0][_keys]) {
+        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
+      } else if (dart.notNull(offset) >= keys.length) {
+        this[_current$2] = null;
+        return false;
+      } else {
+        this[_current$2] = keys[offset];
+        this[_offset] = dart.notNull(offset) + 1;
+        return true;
+      }
+    }
+  }
+  dart.addTypeTests(_HashMapKeyIterator);
+  _HashMapKeyIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_HashMapKeyIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
+    fields: () => ({
+      [_map$0]: _HashMapOfE$dynamic(),
+      [_keys]: ListOfE(),
+      [_offset]: core.int,
+      [_current$2]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _HashMapKeyIterator;
+});
+collection._HashMapKeyIterator = _HashMapKeyIterator();
+collection._LinkedIdentityHashMap$ = dart.generic((K, V) => {
+  let _Es6LinkedIdentityHashMapOfK$V = () => (_Es6LinkedIdentityHashMapOfK$V = dart.constFn(collection._Es6LinkedIdentityHashMap$(K, V)))();
+  let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
+  class _LinkedIdentityHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
+    static get _supportsEs6Maps() {
+      return true;
+    }
+    static es6() {
+      return collection._USE_ES6_MAPS && dart.test(collection._LinkedIdentityHashMap._supportsEs6Maps) ? new (_Es6LinkedIdentityHashMapOfK$V())() : new (_LinkedIdentityHashMapOfK$V())();
+    }
+    new() {
+      super.new();
+    }
+    internalComputeHashCode(key) {
+      return core.identityHashCode(key) & 0x3ffffff;
+    }
+    internalFindBucketIndex(bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (core.identical(cell.hashMapCellKey, key)) return i;
+      }
+      return -1;
+    }
+  }
+  dart.setSignature(_LinkedIdentityHashMap, {
+    constructors: () => ({
+      es6: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), []),
+      new: dart.definiteFunctionType(collection._LinkedIdentityHashMap$(K, V), [])
+    }),
+    sgetters: () => ({_supportsEs6Maps: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _LinkedIdentityHashMap;
+});
+collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
+const _modifications$ = Symbol('_modifications');
+const _modified$ = Symbol('_modified');
+collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
+  let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let InternalMapOfK$V = () => (InternalMapOfK$V = dart.constFn(_js_helper.InternalMap$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let _Es6MapIterableOfV = () => (_Es6MapIterableOfV = dart.constFn(collection._Es6MapIterable$(V)))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
+  let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
+  class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
+    new() {
+      this[_map$0] = new Map();
+      this[_modifications$] = 0;
+      super.new();
+    }
+    get length() {
+      return this[_map$0].size;
+    }
+    get isEmpty() {
+      return this.length == 0;
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    get keys() {
+      return new (_Es6MapIterableOfK())(this, true);
+    }
+    get values() {
+      return new (_Es6MapIterableOfV())(this, false);
+    }
+    containsKey(key) {
+      return this[_map$0].has(key);
+    }
+    containsValue(value) {
+      return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => {
+        this._set(key, value);
+      }, KAndVToNull()));
+    }
+    _get(key) {
+      return this[_map$0].get(key);
+    }
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      this[_map$0].set(key, value);
+      this[_modified$]();
+      return value;
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      if (dart.test(this.containsKey(key))) return this._get(key);
+      let value = ifAbsent();
+      this._set(key, value);
+      return value;
+    }
+    remove(key) {
+      let value = this._get(key);
+      this[_map$0].delete(key);
+      this[_modified$]();
+      return value;
+    }
+    clear() {
+      this[_map$0].clear();
+      this[_modified$]();
+    }
+    forEach(action) {
+      let jsEntries = this[_map$0].entries();
+      let modifications = this[_modifications$];
+      while (true) {
+        let next = jsEntries.next();
+        let done = next.done;
+        if (done) break;
+        let entry = next.value;
+        let key = entry[0];
+        let value = entry[1];
+        action(K._check(key), V._check(value));
+        if (modifications != this[_modifications$]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+      }
+    }
+    [_modified$]() {
+      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
+    }
+    toString() {
+      return collection.Maps.mapToString(this);
+    }
+  }
+  _Es6LinkedIdentityHashMap[dart.implements] = () => [InternalMapOfK$V()];
+  dart.setSignature(_Es6LinkedIdentityHashMap, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
+    fields: () => ({
+      [_map$0]: dart.dynamic,
+      [_modifications$]: core.int
+    }),
+    methods: () => ({[_modified$]: dart.definiteFunctionType(dart.void, [])})
+  });
+  dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
+    'containsKey',
+    'containsValue',
+    'addAll',
+    '_get',
+    '_set',
+    'putIfAbsent',
+    'remove',
+    'clear',
+    'forEach',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'keys',
+    'values'
+  ]);
+  return _Es6LinkedIdentityHashMap;
+});
+collection._Es6LinkedIdentityHashMap = _Es6LinkedIdentityHashMap();
+const _isKeys = Symbol('_isKeys');
+collection._Es6MapIterable$ = dart.generic(E => {
+  let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  class _Es6MapIterable extends core.Iterable$(E) {
+    new(map, isKeys) {
+      this[_map$0] = map;
+      this[_isKeys] = isKeys;
+      super.new();
+    }
+    get length() {
+      return core.int._check(dart.dload(this[_map$0], 'length'));
+    }
+    get isEmpty() {
+      return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
+    }
+    get iterator() {
+      return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
+    }
+    contains(element) {
+      return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
+    }
+    forEach(f) {
+      let jsIterator = null;
+      if (dart.test(this[_isKeys])) {
+        jsIterator = dart.dload(this[_map$0], _map$0).keys();
+      } else {
+        jsIterator = dart.dload(this[_map$0], _map$0).values();
+      }
+      let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
+      while (true) {
+        let next = jsIterator.next();
+        let done = next.done;
+        if (done) break;
+        let value = next.value;
+        f(E._check(value));
+        if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
+          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
+        }
+      }
+    }
+  }
+  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_Es6MapIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
+    fields: () => ({
+      [_map$0]: dart.dynamic,
+      [_isKeys]: core.bool
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
+  });
+  dart.defineExtensionMembers(_Es6MapIterable, [
+    'contains',
+    'forEach',
+    'length',
+    'isEmpty',
+    'iterator'
+  ]);
+  return _Es6MapIterable;
+});
+collection._Es6MapIterable = _Es6MapIterable();
+const _jsIterator$ = Symbol('_jsIterator');
+const _next$0 = Symbol('_next');
+const _done = Symbol('_done');
+collection._Es6MapIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class _Es6MapIterator extends core.Object {
+    new(map, modifications, isKeys) {
+      this[_map$0] = map;
+      this[_modifications$] = modifications;
+      this[_isKeys] = isKeys;
+      this[_jsIterator$] = null;
+      this[_next$0] = null;
+      this[_current$2] = null;
+      this[_done] = null;
+      if (dart.test(this[_isKeys])) {
+        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
+      } else {
+        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
+      }
+      this[_done] = false;
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
+        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
+      }
+      if (dart.test(this[_done])) return false;
+      this[_next$0] = this[_jsIterator$].next();
+      let done = this[_next$0].done;
+      if (done) {
+        this[_current$2] = null;
+        this[_done] = true;
+        return false;
+      } else {
+        this[_current$2] = this[_next$0].value;
+        return true;
+      }
+    }
+  }
+  dart.addTypeTests(_Es6MapIterator);
+  _Es6MapIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_Es6MapIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
+    fields: () => ({
+      [_map$0]: dart.dynamic,
+      [_modifications$]: core.int,
+      [_isKeys]: core.bool,
+      [_jsIterator$]: dart.dynamic,
+      [_next$0]: dart.dynamic,
+      [_current$2]: E,
+      [_done]: core.bool
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _Es6MapIterator;
+});
+collection._Es6MapIterator = _Es6MapIterator();
+collection._LinkedCustomHashMap$ = dart.generic((K, V) => {
+  let _EqualityOfK = () => (_EqualityOfK = dart.constFn(collection._Equality$(K)))();
+  let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
+  class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
+    new(equals, hashCode, validKey) {
+      this[_equals$] = equals;
+      this[_hashCode] = hashCode;
+      this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
+      super.new();
+    }
+    _get(key) {
+      if (!dart.test(this[_validKey](key))) return null;
+      return super.internalGet(key);
+    }
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      super.internalSet(key, value);
+      return value;
+    }
+    containsKey(key) {
+      if (!dart.test(this[_validKey](key))) return false;
+      return super.internalContainsKey(key);
+    }
+    remove(key) {
+      if (!dart.test(this[_validKey](key))) return null;
+      return super.internalRemove(key);
+    }
+    internalComputeHashCode(key) {
+      return this[_hashCode](K._check(key)) & 0x3ffffff;
+    }
+    internalFindBucketIndex(bucket, key) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
+      }
+      return -1;
+    }
+  }
+  dart.setSignature(_LinkedCustomHashMap, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
+    fields: () => ({
+      [_equals$]: _EqualityOfK(),
+      [_hashCode]: _HasherOfK(),
+      [_validKey]: _PredicateOfObject()
+    })
+  });
+  dart.defineExtensionMembers(_LinkedCustomHashMap, ['_get', '_set', 'containsKey', 'remove']);
+  return _LinkedCustomHashMap;
+});
+collection._LinkedCustomHashMap = _LinkedCustomHashMap();
+const _elements = Symbol('_elements');
+const _newSet = Symbol('_newSet');
+const _computeElements = Symbol('_computeElements');
+const _contains = Symbol('_contains');
+const _lookup = Symbol('_lookup');
+const _add$0 = Symbol('_add');
+collection.SetMixin$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
+  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
+  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
+  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  class SetMixin extends core.Object {
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this.iterator);
+    }
+    get isEmpty() {
+      return this.length == 0;
+    }
+    get isNotEmpty() {
+      return this.length != 0;
+    }
+    clear() {
+      this.removeAll(this.toList());
+    }
+    addAll(elements) {
+      IterableOfE()._check(elements);
+      for (let element of elements)
+        this.add(element);
+    }
+    removeAll(elements) {
+      for (let element of elements)
+        this.remove(element);
+    }
+    retainAll(elements) {
+      let toRemove = this.toSet();
+      for (let o of elements) {
+        toRemove.remove(o);
+      }
+      this.removeAll(toRemove);
+    }
+    removeWhere(test) {
+      let toRemove = [];
+      for (let element of this) {
+        if (dart.test(test(element))) toRemove[dartx.add](element);
+      }
+      this.removeAll(toRemove);
+    }
+    retainWhere(test) {
+      let toRemove = [];
+      for (let element of this) {
+        if (!dart.test(test(element))) toRemove[dartx.add](element);
+      }
+      this.removeAll(toRemove);
+    }
+    containsAll(other) {
+      for (let o of other) {
+        if (!dart.test(this.contains(o))) return false;
+      }
+      return true;
+    }
+    union(other) {
+      SetOfE()._check(other);
+      let _ = this.toSet();
+      _.addAll(other);
+      return _;
+    }
+    intersection(other) {
+      let result = this.toSet();
+      for (let element of this) {
+        if (!dart.test(other.contains(element))) result.remove(element);
+      }
+      return result;
+    }
+    difference(other) {
+      let result = this.toSet();
+      for (let element of this) {
+        if (dart.test(other.contains(element))) result.remove(element);
+      }
+      return result;
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let result = dart.test(growable) ? (() => {
+        let _ = ListOfE().new();
+        _[dartx.length] = this.length;
+        return _;
+      })() : ListOfE().new(this.length);
+      let i = 0;
+      for (let element of this)
+        result[dartx._set](i++, element);
+      return result;
+    }
+    map(T) {
+      return f => {
+        return new (_internal.EfficientLengthMappedIterable$(E, T))(this, f);
+      };
+    }
+    get single() {
+      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      let it = this.iterator;
+      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
+      let result = it.current;
+      return result;
+    }
+    toString() {
+      return collection.IterableBase.iterableToFullString(this, '{', '}');
+    }
+    where(f) {
+      return new (WhereIterableOfE())(this, f);
+    }
+    expand(T) {
+      return f => {
+        return new (_internal.ExpandIterable$(E, T))(this, f);
+      };
+    }
+    forEach(f) {
+      for (let element of this)
+        f(element);
+    }
+    reduce(combine) {
+      EAndEToE()._check(combine);
+      let iterator = this.iterator;
+      if (!dart.test(iterator.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      let value = iterator.current;
+      while (dart.test(iterator.moveNext())) {
+        value = combine(value, iterator.current);
+      }
+      return value;
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        for (let element of this)
+          value = combine(value, element);
+        return value;
+      };
+    }
+    every(f) {
+      for (let element of this) {
+        if (!dart.test(f(element))) return false;
+      }
+      return true;
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      let iterator = this.iterator;
+      if (!dart.test(iterator.moveNext())) return "";
       let buffer = new core.StringBuffer();
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let value = bytes[dartx._get](i);
-        if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) != 0) value = 65533;
-        buffer.writeCharCode(value);
+      if (separator == null || separator == "") {
+        do {
+          buffer.write(dart.str`${iterator.current}`);
+        } while (dart.test(iterator.moveNext()));
+      } else {
+        buffer.write(dart.str`${iterator.current}`);
+        while (dart.test(iterator.moveNext())) {
+          buffer.write(separator);
+          buffer.write(dart.str`${iterator.current}`);
+        }
       }
       return buffer.toString();
     }
-    bind(stream) {
-      return super.bind(stream);
-    }
-  };
-  dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
-  dart.setSignature(convert._UnicodeSubsetDecoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetDecoder, [core.bool, core.int])}),
-    fields: () => ({
-      [_allowInvalid]: core.bool,
-      [_subsetMask]: core.int
-    }),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
-      [_convertInvalid]: dart.definiteFunctionType(core.String, [ListOfint(), core.int, core.int])
-    })
-  });
-  convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
-    new(opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
-      super.new(allowInvalid, convert._ASCII_MASK);
-    }
-    startChunkedConversion(sink) {
-      let stringSink = null;
-      if (convert.StringConversionSink.is(sink)) {
-        stringSink = sink;
-      } else {
-        stringSink = convert.StringConversionSink.from(sink);
+    any(test) {
+      for (let element of this) {
+        if (dart.test(test(element))) return true;
       }
-      if (dart.test(this[_allowInvalid])) {
-        return new convert._ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
-      } else {
-        return new convert._SimpleAsciiDecoderSink(stringSink);
+      return false;
+    }
+    take(n) {
+      return TakeIterableOfE().new(this, n);
+    }
+    takeWhile(test) {
+      return new (TakeWhileIterableOfE())(this, test);
+    }
+    skip(n) {
+      return SkipIterableOfE().new(this, n);
+    }
+    skipWhile(test) {
+      return new (SkipWhileIterableOfE())(this, test);
+    }
+    get first() {
+      let it = this.iterator;
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
       }
+      return it.current;
     }
-  };
-  dart.setSignature(convert.AsciiDecoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})})
-  });
-  const _utf8Sink = Symbol('_utf8Sink');
-  let const$30;
-  convert.ChunkedConversionSink$ = dart.generic(T => {
-    let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
-    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
-    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
-    let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.functionType(dart.void, [ListOfT()])))();
-    class ChunkedConversionSink extends core.Object {
-      new() {
+    get last() {
+      let it = this.iterator;
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
       }
-      static withCallback(callback) {
-        return new (_SimpleCallbackSinkOfT())(callback);
-      }
-    }
-    dart.addTypeTests(ChunkedConversionSink);
-    ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
-    dart.setSignature(ChunkedConversionSink, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), []),
-        withCallback: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), [ListOfTTovoid()])
-      })
-    });
-    return ChunkedConversionSink;
-  });
-  convert.ChunkedConversionSink = ChunkedConversionSink();
-  convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
-    new() {
-      super.new();
-    }
-    static withCallback(callback) {
-      return new convert._ByteCallbackSink(callback);
-    }
-    static from(sink) {
-      return new convert._ByteAdapterSink(sink);
-    }
-  };
-  dart.addSimpleTypeTests(convert.ByteConversionSink);
-  dart.setSignature(convert.ByteConversionSink, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.ByteConversionSink, []),
-      withCallback: dart.definiteFunctionType(convert.ByteConversionSink, [ListOfintTovoid()]),
-      from: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
-    })
-  });
-  convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
-    new() {
-      super.new();
-    }
-    addSlice(chunk, start, end, isLast) {
-      this.add(chunk[dartx.sublist](start, end));
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.setSignature(convert.ByteConversionSinkBase, {
-    methods: () => ({addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
-  });
-  convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
-    new(utf8Sink) {
-      this[_utf8Sink] = utf8Sink;
-      super.new();
-    }
-    close() {
-      this[_utf8Sink].close();
-    }
-    add(source) {
-      this.addSlice(source, 0, source[dartx.length], false);
-    }
-    addSlice(source, start, end, isLast) {
-      core.RangeError.checkValidRange(start, end, source[dartx.length]);
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
-          if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
-          this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
-          start = dart.notNull(i) + 1;
-        }
-      }
-      if (dart.notNull(start) < dart.notNull(end)) {
-        this[_utf8Sink].addSlice(source, start, end, isLast);
-      } else if (dart.test(isLast)) {
-        this.close();
-      }
-    }
-  };
-  dart.setSignature(convert._ErrorHandlingAsciiDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._ErrorHandlingAsciiDecoderSink, [convert.ByteConversionSink])}),
-    fields: () => ({[_utf8Sink]: convert.ByteConversionSink}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()])
-    })
-  });
-  convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
-    new(sink) {
-      this[_sink$] = sink;
-      super.new();
-    }
-    close() {
-      this[_sink$].close();
-    }
-    add(source) {
-      for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
-        if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
-          dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
-        }
-      }
-      this[_sink$].add(core.String.fromCharCodes(source));
-    }
-    addSlice(source, start, end, isLast) {
-      let length = source[dartx.length];
-      core.RangeError.checkValidRange(start, end, length);
-      if (dart.notNull(start) < dart.notNull(end)) {
-        if (start != 0 || end != length) {
-          source = source[dartx.sublist](start, end);
-        }
-        this.add(source);
-      }
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.setSignature(convert._SimpleAsciiDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
-    fields: () => ({[_sink$]: core.Sink}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()])
-    })
-  });
-  const _urlSafe = Symbol('_urlSafe');
-  convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
-    new() {
-      this[_urlSafe] = false;
-      super.new();
-    }
-    urlSafe() {
-      this[_urlSafe] = true;
-      super.new();
-    }
-    convert(input) {
-      if (dart.test(input[dartx.isEmpty])) return "";
-      let encoder = new convert._Base64Encoder(this[_urlSafe]);
-      let buffer = encoder.encode(input, 0, input[dartx.length], true);
-      return core.String.fromCharCodes(buffer);
-    }
-    startChunkedConversion(sink) {
-      if (convert.StringConversionSink.is(sink)) {
-        return new convert._Utf8Base64EncoderSink(sink.asUtf8Sink(false), this[_urlSafe]);
-      }
-      return new convert._AsciiBase64EncoderSink(sink, this[_urlSafe]);
-    }
-  };
-  dart.addSimpleTypeTests(convert.Base64Encoder);
-  dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
-  dart.setSignature(convert.Base64Encoder, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.Base64Encoder, []),
-      urlSafe: dart.definiteFunctionType(convert.Base64Encoder, [])
-    }),
-    fields: () => ({[_urlSafe]: core.bool}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [ListOfint()]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
-    })
-  });
-  let const$31;
-  const _encoder = Symbol('_encoder');
-  let const$32;
-  let const$33;
-  convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
-    new() {
-      this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
-      super.new();
-    }
-    urlSafe() {
-      this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
-      super.new();
-    }
-    get encoder() {
-      return this[_encoder];
-    }
-    get decoder() {
-      return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
-    }
-  };
-  dart.addSimpleTypeTests(convert.Base64Codec);
-  dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
-  dart.setSignature(convert.Base64Codec, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.Base64Codec, []),
-      urlSafe: dart.definiteFunctionType(convert.Base64Codec, [])
-    }),
-    fields: () => ({[_encoder]: convert.Base64Encoder}),
-    getters: () => ({
-      encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
-      decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
-    })
-  });
-  convert.BASE64 = dart.const(new convert.Base64Codec());
-  convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
-  convert._paddingChar = 61;
-  const _alphabet = Symbol('_alphabet');
-  const _state$0 = Symbol('_state');
-  convert._Base64Encoder = class _Base64Encoder extends core.Object {
-    new(urlSafe) {
-      this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
-      this[_state$0] = 0;
-    }
-    static _encodeState(count, bits) {
-      dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
-      return (dart.notNull(bits) << convert._Base64Encoder._valueShift | dart.notNull(count)) >>> 0;
-    }
-    static _stateBits(state) {
-      return state[dartx['>>']](convert._Base64Encoder._valueShift);
-    }
-    static _stateCount(state) {
-      return dart.notNull(state) & convert._Base64Encoder._countMask;
-    }
-    createBuffer(bufferLength) {
-      return typed_data.Uint8List.new(bufferLength);
-    }
-    encode(bytes, start, end, isLast) {
-      dart.assert(0 <= dart.notNull(start));
-      dart.assert(dart.notNull(start) <= dart.notNull(end));
-      dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
-      let length = dart.notNull(end) - dart.notNull(start);
-      let count = convert._Base64Encoder._stateCount(this[_state$0]);
-      let byteCount = dart.notNull(count) + length;
-      let fullChunks = (byteCount / 3)[dartx.truncate]();
-      let partialChunkLength = byteCount - fullChunks * 3;
-      let bufferLength = fullChunks * 4;
-      if (dart.test(isLast) && partialChunkLength > 0) {
-        bufferLength = bufferLength + 4;
-      }
-      let output = this.createBuffer(bufferLength);
-      this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
-      if (bufferLength > 0) return output;
-      return null;
-    }
-    static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
-      let bits = convert._Base64Encoder._stateBits(state);
-      let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
-      let byteOr = 0;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let byte = bytes[dartx._get](i);
-        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
-        bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
-        expectedChars--;
-        if (expectedChars == 0) {
-          output[dartx._set]((() => {
-            let x = outputIndex;
-            outputIndex = dart.notNull(x) + 1;
-            return x;
-          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 18 & convert._Base64Encoder._sixBitMask));
-          output[dartx._set]((() => {
-            let x = outputIndex;
-            outputIndex = dart.notNull(x) + 1;
-            return x;
-          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 12 & convert._Base64Encoder._sixBitMask));
-          output[dartx._set]((() => {
-            let x = outputIndex;
-            outputIndex = dart.notNull(x) + 1;
-            return x;
-          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 6 & convert._Base64Encoder._sixBitMask));
-          output[dartx._set]((() => {
-            let x = outputIndex;
-            outputIndex = dart.notNull(x) + 1;
-            return x;
-          })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) & convert._Base64Encoder._sixBitMask));
-          expectedChars = 3;
-          bits = 0;
-        }
-      }
-      if (dart.notNull(byteOr) >= 0 && dart.notNull(byteOr) <= 255) {
-        if (dart.test(isLast) && expectedChars < 3) {
-          convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
-          return 0;
-        }
-        return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
-      }
-      let i = start;
-      while (dart.notNull(i) < dart.notNull(end)) {
-        let byte = bytes[dartx._get](i);
-        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
-        i = dart.notNull(i) + 1;
-      }
-      dart.throw(new core.ArgumentError.value(bytes, dart.str`Not a byte value at index ${i}: 0x${bytes[dartx._get](i)[dartx.toRadixString](16)}`));
-    }
-    static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
-      dart.assert(dart.notNull(count) > 0);
-      if (count == 1) {
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 2 & convert._Base64Encoder._sixBitMask));
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 4 & convert._Base64Encoder._sixBitMask));
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), convert._paddingChar);
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), convert._paddingChar);
-      } else {
-        dart.assert(count == 2);
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 10 & convert._Base64Encoder._sixBitMask));
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 4 & convert._Base64Encoder._sixBitMask));
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 2 & convert._Base64Encoder._sixBitMask));
-        output[dartx._set]((() => {
-          let x = outputIndex;
-          outputIndex = dart.notNull(x) + 1;
-          return x;
-        })(), convert._paddingChar);
-      }
-    }
-  };
-  dart.setSignature(convert._Base64Encoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
-    fields: () => ({
-      [_state$0]: core.int,
-      [_alphabet]: core.String
-    }),
-    methods: () => ({
-      createBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
-      encode: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint(), core.int, core.int, core.bool])
-    }),
-    sfields: () => ({
-      _base64Alphabet: core.String,
-      _base64urlAlphabet: core.String,
-      _valueShift: core.int,
-      _countMask: core.int,
-      _sixBitMask: core.int
-    }),
-    statics: () => ({
-      _encodeState: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
-      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
-      encodeChunk: dart.definiteFunctionType(core.int, [core.String, ListOfint(), core.int, core.int, core.bool, typed_data.Uint8List, core.int, core.int]),
-      writeFinalChunk: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List, core.int, core.int, core.int])
-    }),
-    names: ['_encodeState', '_stateBits', '_stateCount', 'encodeChunk', 'writeFinalChunk']
-  });
-  convert._Base64Encoder._base64Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-  convert._Base64Encoder._base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-  convert._Base64Encoder._valueShift = 2;
-  convert._Base64Encoder._countMask = 3;
-  convert._Base64Encoder._sixBitMask = 63;
-  convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
-    new(urlSafe) {
-      this.bufferCache = null;
-      super.new(urlSafe);
-    }
-    createBuffer(bufferLength) {
-      if (this.bufferCache == null || dart.notNull(this.bufferCache[dartx.length]) < dart.notNull(bufferLength)) {
-        this.bufferCache = typed_data.Uint8List.new(bufferLength);
-      }
-      return typed_data.Uint8List.view(this.bufferCache[dartx.buffer], 0, bufferLength);
-    }
-  };
-  dart.setSignature(convert._BufferCachingBase64Encoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
-    fields: () => ({bufferCache: typed_data.Uint8List})
-  });
-  const _add$1 = Symbol('_add');
-  convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
-    new() {
-      super.new();
-    }
-    add(source) {
-      this[_add$1](source, 0, source[dartx.length], false);
-    }
-    close() {
-      this[_add$1](null, 0, 0, true);
-    }
-    addSlice(source, start, end, isLast) {
-      if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
-      core.RangeError.checkValidRange(start, end, source[dartx.length]);
-      this[_add$1](source, start, end, isLast);
-    }
-  };
-  dart.setSignature(convert._Base64EncoderSink, {
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
-    new(sink, urlSafe) {
-      this[_sink$] = sink;
-      this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
-      super.new();
-    }
-    [_add$1](source, start, end, isLast) {
-      let buffer = this[_encoder].encode(source, start, end, isLast);
-      if (buffer != null) {
-        let string = core.String.fromCharCodes(buffer);
-        this[_sink$].add(string);
-      }
-      if (dart.test(isLast)) {
-        this[_sink$].close();
-      }
-    }
-  };
-  dart.setSignature(convert._AsciiBase64EncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
-    fields: () => ({
-      [_sink$]: SinkOfString(),
-      [_encoder]: convert._Base64Encoder
-    }),
-    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
-  });
-  convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
-    new(sink, urlSafe) {
-      this[_sink$] = sink;
-      this[_encoder] = new convert._Base64Encoder(urlSafe);
-      super.new();
-    }
-    [_add$1](source, start, end, isLast) {
-      let buffer = this[_encoder].encode(source, start, end, isLast);
-      if (buffer != null) {
-        this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
-      }
-    }
-  };
-  dart.setSignature(convert._Utf8Base64EncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
-    fields: () => ({
-      [_sink$]: convert.ByteConversionSink,
-      [_encoder]: convert._Base64Encoder
-    }),
-    methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
-  });
-  convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
-    new() {
-      super.new();
-    }
-    convert(input, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      end = core.RangeError.checkValidRange(start, end, input[dartx.length]);
-      if (start == end) return typed_data.Uint8List.new(0);
-      let decoder = new convert._Base64Decoder();
-      let buffer = decoder.decode(input, start, end);
-      decoder.close(input, end);
-      return buffer;
-    }
-    startChunkedConversion(sink) {
-      return new convert._Base64DecoderSink(sink);
-    }
-  };
-  dart.addSimpleTypeTests(convert.Base64Decoder);
-  dart.setSignature(convert.Base64Decoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Base64Decoder, [])}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
-    })
-  });
-  convert._Base64Decoder = class _Base64Decoder extends core.Object {
-    new() {
-      this[_state$0] = 0;
-    }
-    static _encodeCharacterState(count, bits) {
-      dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
-      return (dart.notNull(bits) << convert._Base64Decoder._valueShift | dart.notNull(count)) >>> 0;
-    }
-    static _stateCount(state) {
-      dart.assert(dart.notNull(state) >= 0);
-      return dart.notNull(state) & convert._Base64Decoder._countMask;
-    }
-    static _stateBits(state) {
-      dart.assert(dart.notNull(state) >= 0);
-      return state[dartx['>>']](convert._Base64Decoder._valueShift);
-    }
-    static _encodePaddingState(expectedPadding) {
-      dart.assert(dart.notNull(expectedPadding) >= 0);
-      dart.assert(dart.notNull(expectedPadding) <= 5);
-      return -dart.notNull(expectedPadding) - 1;
-    }
-    static _statePadding(state) {
-      dart.assert(dart.notNull(state) < 0);
-      return -dart.notNull(state) - 1;
-    }
-    static _hasSeenPadding(state) {
-      return dart.notNull(state) < 0;
-    }
-    decode(input, start, end) {
-      dart.assert(0 <= dart.notNull(start));
-      dart.assert(dart.notNull(start) <= dart.notNull(end));
-      dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
-      if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
-        this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
-        return null;
-      }
-      if (start == end) return typed_data.Uint8List.new(0);
-      let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
-      this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
-      return buffer;
-    }
-    close(input, end) {
-      if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
-        dart.throw(new core.FormatException("Missing padding character", input, end));
-      }
-      if (dart.notNull(this[_state$0]) > 0) {
-        dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
-      }
-      this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
-    }
-    static decodeChunk(input, start, end, output, outIndex, state) {
-      dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
-      let asciiMask = 127;
-      let asciiMax = 127;
-      let eightBitMask = 255;
-      let bitsPerCharacter = 6;
-      let bits = convert._Base64Decoder._stateBits(state);
-      let count = convert._Base64Decoder._stateCount(state);
-      let charOr = 0;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let char = input[dartx.codeUnitAt](i);
-        charOr = (dart.notNull(charOr) | dart.notNull(char)) >>> 0;
-        let code = convert._Base64Decoder._inverseAlphabet[dartx._get]((dart.notNull(char) & asciiMask) >>> 0);
-        if (dart.notNull(code) >= 0) {
-          bits = (bits[dartx['<<']](bitsPerCharacter) | dart.notNull(code)) & 16777215;
-          count = dart.notNull(count) + 1 & 3;
-          if (count == 0) {
-            dart.assert(dart.notNull(outIndex) + 3 <= dart.notNull(output[dartx.length]));
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), (bits[dartx['>>']](16) & eightBitMask) >>> 0);
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), (bits[dartx['>>']](8) & eightBitMask) >>> 0);
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), (dart.notNull(bits) & eightBitMask) >>> 0);
-            bits = 0;
-          }
-          continue;
-        } else if (code == convert._Base64Decoder._padding && dart.notNull(count) > 1) {
-          if (dart.notNull(charOr) < 0 || dart.notNull(charOr) > asciiMax) break;
-          if (count == 3) {
-            if ((dart.notNull(bits) & 3) != 0) {
-              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
-            }
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), bits[dartx['>>']](10));
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), bits[dartx['>>']](2));
-          } else {
-            if ((dart.notNull(bits) & 15) != 0) {
-              dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
-            }
-            output[dartx._set]((() => {
-              let x = outIndex;
-              outIndex = dart.notNull(x) + 1;
-              return x;
-            })(), bits[dartx['>>']](4));
-          }
-          let expectedPadding = (3 - dart.notNull(count)) * 3;
-          if (char == convert._Base64Decoder._char_percent) {
-            expectedPadding = expectedPadding + 2;
-          }
-          state = convert._Base64Decoder._encodePaddingState(expectedPadding);
-          return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
-        }
-        dart.throw(new core.FormatException("Invalid character", input, i));
-      }
-      if (dart.notNull(charOr) >= 0 && dart.notNull(charOr) <= asciiMax) {
-        return convert._Base64Decoder._encodeCharacterState(count, bits);
-      }
-      let i = null;
-      for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let char = input[dartx.codeUnitAt](i);
-        if (dart.notNull(char) < 0 || dart.notNull(char) > asciiMax) break;
-      }
-      dart.throw(new core.FormatException("Invalid character", input, i));
-    }
-    static _allocateBuffer(input, start, end, state) {
-      dart.assert(dart.notNull(state) >= 0);
-      let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
-      let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
-      let bufferLength = length[dartx['>>']](2) * 3;
-      let remainderLength = length & 3;
-      if (remainderLength != 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
-        bufferLength = bufferLength + (remainderLength - 1);
-      }
-      if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
-      return null;
-    }
-    static _trimPaddingChars(input, start, end) {
-      let padding = 0;
-      let index = end;
-      let newEnd = end;
-      while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
-        index = dart.notNull(index) - 1;
-        let char = input[dartx.codeUnitAt](index);
-        if (char == convert._paddingChar) {
-          padding++;
-          newEnd = index;
-          continue;
-        }
-        if ((dart.notNull(char) | 32) == convert._Base64Decoder._char_d) {
-          if (index == start) break;
-          index = dart.notNull(index) - 1;
-          char = input[dartx.codeUnitAt](index);
-        }
-        if (char == convert._Base64Decoder._char_3) {
-          if (index == start) break;
-          index = dart.notNull(index) - 1;
-          char = input[dartx.codeUnitAt](index);
-        }
-        if (char == convert._Base64Decoder._char_percent) {
-          padding++;
-          newEnd = index;
-          continue;
-        }
-        break;
-      }
-      return newEnd;
-    }
-    static _checkPadding(input, start, end, state) {
-      dart.assert(convert._Base64Decoder._hasSeenPadding(state));
-      if (start == end) return state;
-      let expectedPadding = convert._Base64Decoder._statePadding(state);
-      dart.assert(dart.notNull(expectedPadding) >= 0);
-      dart.assert(dart.notNull(expectedPadding) < 6);
-      while (dart.notNull(expectedPadding) > 0) {
-        let char = input[dartx.codeUnitAt](start);
-        if (expectedPadding == 3) {
-          if (char == convert._paddingChar) {
-            expectedPadding = dart.notNull(expectedPadding) - 3;
-            start = dart.notNull(start) + 1;
-            break;
-          }
-          if (char == convert._Base64Decoder._char_percent) {
-            expectedPadding = dart.notNull(expectedPadding) - 1;
-            start = dart.notNull(start) + 1;
-            if (start == end) break;
-            char = input[dartx.codeUnitAt](start);
-          } else {
-            break;
-          }
-        }
-        let expectedPartialPadding = expectedPadding;
-        if (dart.notNull(expectedPartialPadding) > 3) {
-          expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
-        }
-        if (expectedPartialPadding == 2) {
-          if (char != convert._Base64Decoder._char_3) break;
-          start = dart.notNull(start) + 1;
-          expectedPadding = dart.notNull(expectedPadding) - 1;
-          if (start == end) break;
-          char = input[dartx.codeUnitAt](start);
-        }
-        if ((dart.notNull(char) | 32) != convert._Base64Decoder._char_d) break;
-        start = dart.notNull(start) + 1;
-        expectedPadding = dart.notNull(expectedPadding) - 1;
-        if (start == end) break;
-      }
-      if (start != end) {
-        dart.throw(new core.FormatException("Invalid padding character", input, start));
-      }
-      return convert._Base64Decoder._encodePaddingState(expectedPadding);
-    }
-  };
-  dart.setSignature(convert._Base64Decoder, {
-    fields: () => ({[_state$0]: core.int}),
-    methods: () => ({
-      decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
-      close: dart.definiteFunctionType(dart.void, [core.String, core.int])
-    }),
-    sfields: () => ({
-      _valueShift: core.int,
-      _countMask: core.int,
-      _invalid: core.int,
-      _padding: core.int,
-      __: core.int,
-      _p: core.int,
-      _inverseAlphabet: ListOfint(),
-      _char_percent: core.int,
-      _char_3: core.int,
-      _char_d: core.int
-    }),
-    statics: () => ({
-      _encodeCharacterState: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      _stateCount: dart.definiteFunctionType(core.int, [core.int]),
-      _stateBits: dart.definiteFunctionType(core.int, [core.int]),
-      _encodePaddingState: dart.definiteFunctionType(core.int, [core.int]),
-      _statePadding: dart.definiteFunctionType(core.int, [core.int]),
-      _hasSeenPadding: dart.definiteFunctionType(core.bool, [core.int]),
-      decodeChunk: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, typed_data.Uint8List, core.int, core.int]),
-      _allocateBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int, core.int]),
-      _trimPaddingChars: dart.definiteFunctionType(core.int, [core.String, core.int, core.int]),
-      _checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int])
-    }),
-    names: ['_encodeCharacterState', '_stateCount', '_stateBits', '_encodePaddingState', '_statePadding', '_hasSeenPadding', 'decodeChunk', '_allocateBuffer', '_trimPaddingChars', '_checkPadding']
-  });
-  convert._Base64Decoder._valueShift = 2;
-  convert._Base64Decoder._countMask = 3;
-  convert._Base64Decoder._invalid = -2;
-  convert._Base64Decoder._padding = -1;
-  convert._Base64Decoder._char_percent = 37;
-  convert._Base64Decoder._char_3 = 51;
-  convert._Base64Decoder._char_d = 100;
-  dart.defineLazy(convert._Base64Decoder, {
-    get __() {
-      return convert._Base64Decoder._invalid;
-    },
-    get _p() {
-      return convert._Base64Decoder._padding;
-    },
-    get _inverseAlphabet() {
-      return typed_data.Int8List.fromList(JSArrayOfint().of([convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 63, convert._Base64Decoder.__, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__]));
-    }
-  });
-  const _decoder = Symbol('_decoder');
-  convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
-    new(sink) {
-      this[_decoder] = new convert._Base64Decoder();
-      this[_sink$] = sink;
-    }
-    add(string) {
-      if (dart.test(string[dartx.isEmpty])) return;
-      let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
-      if (buffer != null) this[_sink$].add(buffer);
-    }
-    close() {
-      this[_decoder].close(null, null);
-      this[_sink$].close();
-    }
-    addSlice(string, start, end, isLast) {
-      end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
-      if (start == end) return;
-      let buffer = this[_decoder].decode(string, start, end);
-      if (buffer != null) this[_sink$].add(buffer);
-      if (dart.test(isLast)) {
-        this[_decoder].close(string, end);
-        this[_sink$].close();
-      }
-    }
-  };
-  dart.setSignature(convert._Base64DecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
-    fields: () => ({
-      [_sink$]: SinkOfListOfint(),
-      [_decoder]: convert._Base64Decoder
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
-    })
-  });
-  convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
-    new(sink) {
-      this[_sink$] = sink;
-      super.new();
-    }
-    add(chunk) {
-      this[_sink$].add(chunk);
-    }
-    close() {
-      this[_sink$].close();
-    }
-  };
-  dart.setSignature(convert._ByteAdapterSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
-    fields: () => ({[_sink$]: SinkOfListOfint()}),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _buffer = Symbol('_buffer');
-  const _callback = Symbol('_callback');
-  const _bufferIndex = Symbol('_bufferIndex');
-  convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
-    new(callback) {
-      this[_buffer] = typed_data.Uint8List.new(convert._ByteCallbackSink._INITIAL_BUFFER_SIZE);
-      this[_callback] = callback;
-      this[_bufferIndex] = 0;
-      super.new();
-    }
-    add(chunk) {
-      let freeCount = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_bufferIndex]);
-      if (dart.notNull(chunk[dartx.length]) > freeCount) {
-        let oldLength = this[_buffer][dartx.length];
-        let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[dartx.length]) + dart.notNull(oldLength))) * 2;
-        let grown = typed_data.Uint8List.new(newLength);
-        grown[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
-        this[_buffer] = grown;
-      }
-      this[_buffer][dartx.setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]), chunk);
-      this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]);
-    }
-    static _roundToPowerOf2(v) {
-      dart.assert(dart.notNull(v) > 0);
-      v = dart.notNull(v) - 1;
-      v = (dart.notNull(v) | v[dartx['>>']](1)) >>> 0;
-      v = (dart.notNull(v) | v[dartx['>>']](2)) >>> 0;
-      v = (dart.notNull(v) | v[dartx['>>']](4)) >>> 0;
-      v = (dart.notNull(v) | v[dartx['>>']](8)) >>> 0;
-      v = (dart.notNull(v) | v[dartx['>>']](16)) >>> 0;
-      v = dart.notNull(v) + 1;
-      return v;
-    }
-    close() {
-      this[_callback](this[_buffer][dartx.sublist](0, this[_bufferIndex]));
-    }
-  };
-  dart.setSignature(convert._ByteCallbackSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._ByteCallbackSink, [ListOfintTovoid()])}),
-    fields: () => ({
-      [_callback]: ListOfintTovoid(),
-      [_buffer]: ListOfint(),
-      [_bufferIndex]: core.int
-    }),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [IterableOfint()]),
-      close: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({_INITIAL_BUFFER_SIZE: core.int}),
-    statics: () => ({_roundToPowerOf2: dart.definiteFunctionType(core.int, [core.int])}),
-    names: ['_roundToPowerOf2']
-  });
-  convert._ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024;
-  convert._ChunkedConversionCallback$ = dart.generic(T => {
-    const _ChunkedConversionCallback = dart.typedef('_ChunkedConversionCallback', () => dart.functionType(dart.void, [T]));
-    return _ChunkedConversionCallback;
-  });
-  convert._ChunkedConversionCallback = _ChunkedConversionCallback();
-  convert.ChunkedConverter$ = dart.generic((S, T, S2, T2) => {
-    let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
-    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
-    class ChunkedConverter extends convert.Converter$(S, T) {
-      new() {
-        super.new();
-      }
-      bind(other) {
-        return super.bind(StreamOfS()._check(other));
-      }
-      startChunkedConversion(sink) {
-        return super.startChunkedConversion(SinkOfT()._check(sink));
-      }
-    }
-    dart.setSignature(ChunkedConverter, {
-      constructors: () => ({new: dart.definiteFunctionType(convert.ChunkedConverter$(S, T, S2, T2), [])}),
-      methods: () => ({
-        bind: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-        startChunkedConversion: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-      })
-    });
-    return ChunkedConverter;
-  });
-  convert.ChunkedConverter = ChunkedConverter();
-  const _accumulated = Symbol('_accumulated');
-  convert._SimpleCallbackSink$ = dart.generic(T => {
-    let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
-    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
-    let _ChunkedConversionCallbackOfListOfT = () => (_ChunkedConversionCallbackOfListOfT = dart.constFn(convert._ChunkedConversionCallback$(ListOfT())))();
-    class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
-      new(callback) {
-        this[_accumulated] = JSArrayOfT().of([]);
-        this[_callback] = callback;
-        super.new();
-      }
-      add(chunk) {
-        T._check(chunk);
-        this[_accumulated][dartx.add](chunk);
-      }
-      close() {
-        this[_callback](this[_accumulated]);
-      }
-    }
-    dart.setSignature(_SimpleCallbackSink, {
-      constructors: () => ({new: dart.definiteFunctionType(convert._SimpleCallbackSink$(T), [_ChunkedConversionCallbackOfListOfT()])}),
-      fields: () => ({
-        [_callback]: _ChunkedConversionCallbackOfListOfT(),
-        [_accumulated]: ListOfT()
-      }),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [T]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _SimpleCallbackSink;
-  });
-  convert._SimpleCallbackSink = _SimpleCallbackSink();
-  const _eventSink = Symbol('_eventSink');
-  const _chunkedSink = Symbol('_chunkedSink');
-  convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
-    let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
-    let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
-    let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
-    let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
-    class _ConverterStreamEventSink extends core.Object {
-      new(converter, sink) {
-        this[_eventSink] = sink;
-        this[_chunkedSink] = converter.startChunkedConversion(sink);
-      }
-      add(o) {
-        S._check(o);
-        this[_chunkedSink].add(o);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_eventSink].addError(error, stackTrace);
-      }
-      close() {
-        this[_chunkedSink].close();
-      }
-    }
-    dart.addTypeTests(_ConverterStreamEventSink);
-    _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
-    dart.setSignature(_ConverterStreamEventSink, {
-      constructors: () => ({new: dart.definiteFunctionType(convert._ConverterStreamEventSink$(S, T), [ConverterOfS$T(), EventSinkOfT()])}),
-      fields: () => ({
-        [_eventSink]: EventSinkOfT(),
-        [_chunkedSink]: SinkOfS()
-      }),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [S]),
-        addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _ConverterStreamEventSink;
-  });
-  convert._ConverterStreamEventSink = _ConverterStreamEventSink();
-  const _second = Symbol('_second');
-  const _first$0 = Symbol('_first');
-  convert._FusedCodec$ = dart.generic((S, M, T) => {
-    let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
-    let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
-    class _FusedCodec extends convert.Codec$(S, T) {
-      get encoder() {
-        return this[_first$0].encoder.fuse(T)(this[_second].encoder);
-      }
-      get decoder() {
-        return this[_second].decoder.fuse(S)(this[_first$0].decoder);
-      }
-      new(first, second) {
-        this[_first$0] = first;
-        this[_second] = second;
-        super.new();
-      }
-    }
-    dart.setSignature(_FusedCodec, {
-      constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
-      fields: () => ({
-        [_first$0]: CodecOfS$M(),
-        [_second]: CodecOfM$T()
-      }),
-      getters: () => ({
-        encoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
-        decoder: dart.definiteFunctionType(convert.Converter$(T, S), [])
-      })
-    });
-    return _FusedCodec;
-  });
-  convert._FusedCodec = _FusedCodec();
-  const _codec = Symbol('_codec');
-  convert._InvertedCodec$ = dart.generic((T, S) => {
-    let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
-    class _InvertedCodec extends convert.Codec$(T, S) {
-      new(codec) {
-        this[_codec] = codec;
-        super.new();
-      }
-      get encoder() {
-        return this[_codec].decoder;
-      }
-      get decoder() {
-        return this[_codec].encoder;
-      }
-      get inverted() {
-        return this[_codec];
-      }
-    }
-    dart.setSignature(_InvertedCodec, {
-      constructors: () => ({new: dart.definiteFunctionType(convert._InvertedCodec$(T, S), [CodecOfS$T()])}),
-      fields: () => ({[_codec]: CodecOfS$T()}),
-      getters: () => ({
-        encoder: dart.definiteFunctionType(convert.Converter$(T, S), []),
-        decoder: dart.definiteFunctionType(convert.Converter$(S, T), [])
-      })
-    });
-    return _InvertedCodec;
-  });
-  convert._InvertedCodec = _InvertedCodec();
-  convert._FusedConverter$ = dart.generic((S, M, T) => {
-    let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
-    let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
-    let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
-    class _FusedConverter extends convert.Converter$(S, T) {
-      new(first, second) {
-        this[_first$0] = first;
-        this[_second] = second;
-        super.new();
-      }
-      convert(input) {
-        S._check(input);
-        return this[_second].convert(this[_first$0].convert(input));
-      }
-      startChunkedConversion(sink) {
-        SinkOfT()._check(sink);
-        return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
-      }
-    }
-    dart.setSignature(_FusedConverter, {
-      constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
-      fields: () => ({
-        [_first$0]: ConverterOfS$M(),
-        [_second]: ConverterOfM$T()
-      }),
-      methods: () => ({convert: dart.definiteFunctionType(T, [S])})
-    });
-    return _FusedConverter;
-  });
-  convert._FusedConverter = _FusedConverter();
-  const _name$1 = Symbol('_name');
-  let const$34;
-  let const$35;
-  let const$36;
-  let const$37;
-  let const$38;
-  let const$39;
-  let const$40;
-  let const$41;
-  convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
-    _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
-      this[_name$1] = name;
-      this.escapeLtGt = escapeLtGt;
-      this.escapeQuot = escapeQuot;
-      this.escapeApos = escapeApos;
-      this.escapeSlash = escapeSlash;
-    }
-    new(opts) {
-      let name = opts && 'name' in opts ? opts.name : "custom";
-      let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
-      let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
-      let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
-      let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
-      this.escapeLtGt = escapeLtGt;
-      this.escapeQuot = escapeQuot;
-      this.escapeApos = escapeApos;
-      this.escapeSlash = escapeSlash;
-      this[_name$1] = name;
-    }
-    toString() {
-      return this[_name$1];
-    }
-  };
-  dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
-  dart.setSignature(convert.HtmlEscapeMode, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(convert.HtmlEscapeMode, [core.String, core.bool, core.bool, core.bool, core.bool]),
-      new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
-    }),
-    fields: () => ({
-      [_name$1]: core.String,
-      escapeLtGt: core.bool,
-      escapeQuot: core.bool,
-      escapeApos: core.bool,
-      escapeSlash: core.bool
-    }),
-    sfields: () => ({
-      UNKNOWN: convert.HtmlEscapeMode,
-      ATTRIBUTE: convert.HtmlEscapeMode,
-      SQ_ATTRIBUTE: convert.HtmlEscapeMode,
-      ELEMENT: convert.HtmlEscapeMode
-    })
-  });
-  dart.defineLazy(convert.HtmlEscapeMode, {
-    get UNKNOWN() {
-      return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
-    },
-    get ATTRIBUTE() {
-      return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
-    },
-    get SQ_ATTRIBUTE() {
-      return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
-    },
-    get ELEMENT() {
-      return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
-    }
-  });
-  const _convert = Symbol('_convert');
-  convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
-    new(mode) {
-      if (mode === void 0) mode = convert.HtmlEscapeMode.UNKNOWN;
-      this.mode = mode;
-      super.new();
-    }
-    convert(text) {
-      let val = this[_convert](text, 0, text[dartx.length]);
-      return val == null ? text : val;
-    }
-    [_convert](text, start, end) {
       let result = null;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let ch = text[dartx._get](i);
-        let replacement = null;
-        switch (ch) {
-          case '&':
-          {
-            replacement = '&amp;';
-            break;
-          }
-          case '"':
-          {
-            if (dart.test(this.mode.escapeQuot)) replacement = '&quot;';
-            break;
-          }
-          case "'":
-          {
-            if (dart.test(this.mode.escapeApos)) replacement = '&#39;';
-            break;
-          }
-          case '<':
-          {
-            if (dart.test(this.mode.escapeLtGt)) replacement = '&lt;';
-            break;
-          }
-          case '>':
-          {
-            if (dart.test(this.mode.escapeLtGt)) replacement = '&gt;';
-            break;
-          }
-          case '/':
-          {
-            if (dart.test(this.mode.escapeSlash)) replacement = '&#47;';
-            break;
-          }
-        }
-        if (replacement != null) {
-          if (result == null) result = new core.StringBuffer();
-          if (dart.notNull(i) > dart.notNull(start)) result.write(text[dartx.substring](start, i));
-          result.write(replacement);
-          start = dart.notNull(i) + 1;
+      do {
+        result = it.current;
+      } while (dart.test(it.moveNext()));
+      return result;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      for (let element of this) {
+        if (dart.test(test(element))) return element;
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          result = element;
+          foundMatching = true;
         }
       }
-      if (result == null) return null;
-      if (dart.notNull(end) > dart.notNull(start)) result.write(text[dartx.substring](start, end));
-      return dart.toString(result);
+      if (foundMatching) return result;
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
     }
-    startChunkedConversion(sink) {
-      if (!convert.StringConversionSink.is(sink)) {
-        sink = convert.StringConversionSink.from(sink);
+    singleWhere(test) {
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          if (foundMatching) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          result = element;
+          foundMatching = true;
+        }
       }
-      return new convert._HtmlEscapeSink(this, convert.StringConversionSink._check(sink));
+      if (foundMatching) return result;
+      dart.throw(_internal.IterableElementError.noElement());
     }
-  };
-  dart.addSimpleTypeTests(convert.HtmlEscape);
-  dart.setSignature(convert.HtmlEscape, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.HtmlEscape, [], [convert.HtmlEscapeMode])}),
-    fields: () => ({mode: convert.HtmlEscapeMode}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [core.String]),
-      [_convert]: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()])
-    })
-  });
-  convert.HTML_ESCAPE = dart.const(new convert.HtmlEscape());
-  const _escape = Symbol('_escape');
-  convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
-    new(escape, sink) {
-      this[_escape] = escape;
-      this[_sink$] = sink;
-    }
-    addSlice(chunk, start, end, isLast) {
-      let val = this[_escape][_convert](chunk, start, end);
-      if (val == null) {
-        this[_sink$].addSlice(chunk, start, end, isLast);
-      } else {
-        this[_sink$].add(val);
-        if (dart.test(isLast)) this[_sink$].close();
+    elementAt(index) {
+      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
+      core.RangeError.checkNotNegative(index, "index");
+      let elementIndex = 0;
+      for (let element of this) {
+        if (index == elementIndex) return element;
+        elementIndex++;
       }
+      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
     }
-    close() {
-      this[_sink$].close();
-    }
-  };
-  dart.setSignature(convert._HtmlEscapeSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
-    fields: () => ({
-      [_escape]: convert.HtmlEscape,
-      [_sink$]: convert.StringConversionSink
-    }),
-    methods: () => ({
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
-    new(unsupportedObject, opts) {
-      let cause = opts && 'cause' in opts ? opts.cause : null;
-      this.unsupportedObject = unsupportedObject;
-      this.cause = cause;
-      super.new();
-    }
-    toString() {
-      if (this.cause != null) {
-        return "Converting object to an encodable object failed.";
-      } else {
-        return "Converting object did not return an encodable object.";
-      }
-    }
-  };
-  dart.setSignature(convert.JsonUnsupportedObjectError, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUnsupportedObjectError, [dart.dynamic], {cause: dart.dynamic})}),
-    fields: () => ({
-      unsupportedObject: dart.dynamic,
-      cause: dart.dynamic
-    })
-  });
-  convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
-    new(object) {
-      super.new(object);
-    }
-    toString() {
-      return "Cyclic error in JSON stringify";
-    }
-  };
-  dart.setSignature(convert.JsonCyclicError, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
-  });
-  const _toEncodable = Symbol('_toEncodable');
-  let const$42;
-  let const$43;
-  convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
-    new(opts) {
-      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
-      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
-      this[_reviver] = reviver;
-      this[_toEncodable] = toEncodable;
-      super.new();
-    }
-    withReviver(reviver) {
-      JsonCodec.prototype.new.call(this, {reviver: reviver});
-    }
-    decode(source, opts) {
-      let reviver = opts && 'reviver' in opts ? opts.reviver : null;
-      if (reviver == null) reviver = this[_reviver];
-      if (reviver == null) return this.decoder.convert(source);
-      return new convert.JsonDecoder(reviver).convert(source);
-    }
-    encode(value, opts) {
-      let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
-      if (toEncodable == null) toEncodable = this[_toEncodable];
-      if (toEncodable == null) return this.encoder.convert(value);
-      return new convert.JsonEncoder(toEncodable).convert(value);
-    }
-    get encoder() {
-      if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
-      return new convert.JsonEncoder(this[_toEncodable]);
-    }
-    get decoder() {
-      if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
-      return new convert.JsonDecoder(this[_reviver]);
-    }
-  };
-  dart.addSimpleTypeTests(convert.JsonCodec);
-  dart.defineNamedConstructor(convert.JsonCodec, 'withReviver');
-  dart.setSignature(convert.JsonCodec, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.JsonCodec, [], {reviver: dynamicAnddynamicTodynamic(), toEncodable: dynamicTodynamic()}),
-      withReviver: dart.definiteFunctionType(convert.JsonCodec, [dynamicAnddynamicTodynamic()])
-    }),
-    fields: () => ({
-      [_reviver]: convert._Reviver,
-      [_toEncodable]: convert._ToEncodable
-    }),
+  }
+  dart.addTypeTests(SetMixin);
+  SetMixin[dart.implements] = () => [SetOfE()];
+  dart.setSignature(SetMixin, {
     getters: () => ({
-      encoder: dart.definiteFunctionType(convert.JsonEncoder, []),
-      decoder: dart.definiteFunctionType(convert.JsonDecoder, [])
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      single: dart.definiteFunctionType(E, []),
+      first: dart.definiteFunctionType(E, []),
+      last: dart.definiteFunctionType(E, [])
     }),
     methods: () => ({
-      decode: dart.definiteFunctionType(dart.dynamic, [core.String], {reviver: dynamicAnddynamicTodynamic()}),
-      encode: dart.definiteFunctionType(core.String, [core.Object], {toEncodable: dynamicTodynamic()})
+      clear: dart.definiteFunctionType(dart.void, []),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
+      retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
+      union: dart.definiteFunctionType(core.Set$(E), [SetOfE()]),
+      intersection: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
+      difference: dart.definiteFunctionType(core.Set$(E), [SetOfObject()]),
+      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
+      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
+      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
+      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
+      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
+      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
+      every: dart.definiteFunctionType(core.bool, [ETobool()]),
+      join: dart.definiteFunctionType(core.String, [], [core.String]),
+      any: dart.definiteFunctionType(core.bool, [ETobool()]),
+      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
+      elementAt: dart.definiteFunctionType(E, [core.int])
     })
   });
-  convert.JSON = dart.const(new convert.JsonCodec());
-  convert._Reviver = dart.typedef('_Reviver', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
-  convert._ToEncodable = dart.typedef('_ToEncodable', () => dart.functionType(dart.dynamic, [dart.dynamic]));
-  convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
-    new(toEncodable) {
-      if (toEncodable === void 0) toEncodable = null;
-      this.indent = null;
-      this[_toEncodable] = toEncodable;
-      super.new();
+  dart.defineExtensionMembers(SetMixin, [
+    'toList',
+    'map',
+    'toString',
+    'where',
+    'expand',
+    'forEach',
+    'reduce',
+    'fold',
+    'every',
+    'join',
+    'any',
+    'take',
+    'takeWhile',
+    'skip',
+    'skipWhile',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'elementAt',
+    'isEmpty',
+    'isNotEmpty',
+    'single',
+    'first',
+    'last'
+  ]);
+  return SetMixin;
+});
+collection.SetMixin = SetMixin();
+collection.SetBase$ = dart.generic(E => {
+  class SetBase extends collection.SetMixin$(E) {
+    static setToString(set) {
+      return collection.IterableBase.iterableToFullString(set, '{', '}');
     }
-    withIndent(indent, toEncodable) {
-      if (toEncodable === void 0) toEncodable = null;
-      this.indent = indent;
-      this[_toEncodable] = toEncodable;
-      super.new();
-    }
-    convert(object) {
-      return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
-    }
-    startChunkedConversion(sink) {
-      if (!convert.StringConversionSink.is(sink)) {
-        sink = convert.StringConversionSink.from(sink);
-      } else if (convert._Utf8EncoderSink.is(sink)) {
-        return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
-      }
-      return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
-    }
-    bind(stream) {
-      return super.bind(stream);
-    }
-    fuse(T) {
-      return other => {
-        if (convert.Utf8Encoder.is(other)) {
-          return convert.Converter$(core.Object, T).as(new convert.JsonUtf8Encoder(this.indent, this[_toEncodable]));
-        }
-        return super.fuse(T)(other);
-      };
-    }
-  };
-  dart.addSimpleTypeTests(convert.JsonEncoder);
-  dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
-  dart.setSignature(convert.JsonEncoder, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.JsonEncoder, [], [dynamicTodynamic()]),
-      withIndent: dart.definiteFunctionType(convert.JsonEncoder, [core.String], [dynamicTodynamic()])
-    }),
-    fields: () => ({
-      indent: core.String,
-      [_toEncodable]: convert._ToEncodable
-    }),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [core.Object]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfString()])
-    })
+  }
+  dart.setSignature(SetBase, {
+    statics: () => ({setToString: dart.definiteFunctionType(core.String, [core.Set])}),
+    names: ['setToString']
   });
-  const _indent = Symbol('_indent');
-  const _bufferSize = Symbol('_bufferSize');
-  convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
-    new(indent, toEncodable, bufferSize) {
-      if (indent === void 0) indent = null;
-      if (toEncodable === void 0) toEncodable = null;
-      if (bufferSize === void 0) bufferSize = convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE;
-      this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
-      this[_toEncodable] = toEncodable;
-      this[_bufferSize] = bufferSize;
-      super.new();
-    }
-    static _utf8Encode(string) {
-      if (string == null) return null;
-      if (dart.test(string[dartx.isEmpty])) return typed_data.Uint8List.new(0);
-      checkAscii: {
-        for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
-          if (dart.notNull(string[dartx.codeUnitAt](i)) >= 128) break checkAscii;
-        }
-        return string[dartx.codeUnits];
-      }
-      return convert.UTF8.encode(string);
-    }
-    convert(object) {
-      let bytes = JSArrayOfListOfint().of([]);
-      function addChunk(chunk, start, end) {
-        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[dartx.length])) {
-          let length = dart.notNull(end) - dart.notNull(start);
-          chunk = typed_data.Uint8List.view(chunk[dartx.buffer], dart.notNull(chunk[dartx.offsetInBytes]) + dart.notNull(start), length);
-        }
-        bytes[dartx.add](chunk);
-      }
-      dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
-      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
-      if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
-      let length = 0;
-      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
-        length = dart.notNull(length) + dart.notNull(bytes[dartx._get](i)[dartx.length]);
-      }
-      let result = typed_data.Uint8List.new(length);
-      for (let i = 0, offset = 0; i < dart.notNull(bytes[dartx.length]); i++) {
-        let byteList = bytes[dartx._get](i);
-        let end = offset + dart.notNull(byteList[dartx.length]);
-        result[dartx.setRange](offset, end, byteList);
-        offset = end;
+  return SetBase;
+});
+collection.SetBase = SetBase();
+collection._HashSetBase$ = dart.generic(E => {
+  class _HashSetBase extends collection.SetBase$(E) {
+    difference(other) {
+      let result = this[_newSet]();
+      for (let element of this) {
+        if (!dart.test(other.contains(element))) result.add(element);
       }
       return result;
     }
-    startChunkedConversion(sink) {
-      let byteSink = null;
-      if (convert.ByteConversionSink.is(sink)) {
-        byteSink = sink;
-      } else {
-        byteSink = convert.ByteConversionSink.from(sink);
+    intersection(other) {
+      let result = this[_newSet]();
+      for (let element of this) {
+        if (dart.test(other.contains(element))) result.add(element);
       }
-      return new convert._JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
+      return result;
     }
-    bind(stream) {
-      return super.bind(stream);
-    }
-  };
-  dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
-  dart.setSignature(convert.JsonUtf8Encoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.JsonUtf8Encoder, [], [core.String, dynamicTodynamic(), core.int])}),
-    fields: () => ({
-      [_indent]: ListOfint(),
-      [_toEncodable]: convert._ToEncodable,
-      [_bufferSize]: core.int
-    }),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [core.Object]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfListOfint()])
-    }),
-    sfields: () => ({DEFAULT_BUFFER_SIZE: core.int}),
-    statics: () => ({_utf8Encode: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
-    names: ['_utf8Encode']
-  });
-  convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256;
-  const _isDone = Symbol('_isDone');
-  convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
-    new(sink, toEncodable, indent) {
-      this[_sink$] = sink;
-      this[_toEncodable] = toEncodable;
-      this[_indent] = indent;
-      this[_isDone] = false;
-      super.new();
-    }
-    add(o) {
-      if (dart.test(this[_isDone])) {
-        dart.throw(new core.StateError("Only one call to add allowed"));
-      }
-      this[_isDone] = true;
-      let stringSink = this[_sink$].asStringSink();
-      convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
-      stringSink.close();
-    }
-    close() {}
-  };
-  dart.addSimpleTypeTests(convert._JsonEncoderSink);
-  dart.setSignature(convert._JsonEncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonEncoderSink, [convert.StringConversionSink, convert._ToEncodable, core.String])}),
-    fields: () => ({
-      [_indent]: core.String,
-      [_toEncodable]: convert._ToEncodable,
-      [_sink$]: convert.StringConversionSink,
-      [_isDone]: core.bool
-    }),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [core.Object]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _addChunk = Symbol('_addChunk');
-  convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
-    new(sink, toEncodable, indent, bufferSize) {
-      this[_sink$] = sink;
-      this[_toEncodable] = toEncodable;
-      this[_indent] = indent;
-      this[_bufferSize] = bufferSize;
-      this[_isDone] = false;
-      super.new();
-    }
-    [_addChunk](chunk, start, end) {
-      this[_sink$].addSlice(chunk, start, end, false);
-    }
-    add(object) {
-      if (dart.test(this[_isDone])) {
-        dart.throw(new core.StateError("Only one call to add allowed"));
-      }
-      this[_isDone] = true;
-      convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
-      this[_sink$].close();
-    }
-    close() {
-      if (!dart.test(this[_isDone])) {
-        this[_isDone] = true;
-        this[_sink$].close();
-      }
-    }
-  };
-  dart.addSimpleTypeTests(convert._JsonUtf8EncoderSink);
-  dart.setSignature(convert._JsonUtf8EncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
-    fields: () => ({
-      [_sink$]: convert.ByteConversionSink,
-      [_indent]: ListOfint(),
-      [_toEncodable]: convert._ToEncodable,
-      [_bufferSize]: core.int,
-      [_isDone]: core.bool
-    }),
-    methods: () => ({
-      [_addChunk]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int]),
-      add: dart.definiteFunctionType(dart.void, [core.Object]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
-    new(reviver) {
-      if (reviver === void 0) reviver = null;
-      this[_reviver] = reviver;
-      super.new();
-    }
-    convert(input) {
-      return convert._parseJson(input, this[_reviver]);
-    }
-    startChunkedConversion(sink) {
-      return new convert._JsonDecoderSink(this[_reviver], sink);
-    }
-    bind(stream) {
-      return super.bind(stream);
-    }
-  };
-  dart.addSimpleTypeTests(convert.JsonDecoder);
-  dart.setSignature(convert.JsonDecoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.JsonDecoder, [], [dynamicAnddynamicTodynamic()])}),
-    fields: () => ({[_reviver]: convert._Reviver}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfObject()])
-    })
-  });
-  convert._parseJson = function(source, reviver) {
-    if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
-    let parsed = null;
-    try {
-      parsed = JSON.parse(source);
-    } catch (e) {
-      dart.throw(new core.FormatException(String(e)));
-    }
-
-    if (reviver == null) {
-      return convert._convertJsonToDartLazy(parsed);
-    } else {
-      return convert._convertJsonToDart(parsed, reviver);
-    }
-  };
-  dart.fn(convert._parseJson, StringAndFnTodynamic());
-  convert._defaultToEncodable = function(object) {
-    return dart.dsend(object, 'toJson');
-  };
-  dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
-  const _seen = Symbol('_seen');
-  const _checkCycle = Symbol('_checkCycle');
-  const _removeSeen = Symbol('_removeSeen');
-  convert._JsonStringifier = class _JsonStringifier extends core.Object {
-    new(toEncodable) {
-      this[_seen] = core.List.new();
-      this[_toEncodable] = (() => {
-        let l = toEncodable;
-        return l != null ? l : convert._defaultToEncodable;
+    toSet() {
+      return (() => {
+        let _ = this[_newSet]();
+        _.addAll(this);
+        return _;
       })();
     }
-    static hexDigit(x) {
-      return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
+  }
+  dart.setSignature(_HashSetBase, {
+    methods: () => ({toSet: dart.definiteFunctionType(core.Set$(E), [])})
+  });
+  dart.defineExtensionMembers(_HashSetBase, ['toSet']);
+  return _HashSetBase;
+});
+collection._HashSetBase = _HashSetBase();
+collection._HashSet$ = dart.generic(E => {
+  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
+  let _HashSetIteratorOfE = () => (_HashSetIteratorOfE = dart.constFn(collection._HashSetIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
+  class _HashSet extends collection._HashSetBase$(E) {
+    new() {
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
+      this[_elements] = null;
     }
-    writeStringContent(s) {
-      let offset = 0;
-      let length = s[dartx.length];
-      for (let i = 0; i < dart.notNull(length); i++) {
-        let charCode = s[dartx.codeUnitAt](i);
-        if (dart.notNull(charCode) > convert._JsonStringifier.BACKSLASH) continue;
-        if (dart.notNull(charCode) < 32) {
-          if (i > offset) this.writeStringSlice(s, offset, i);
-          offset = i + 1;
-          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
-          switch (charCode) {
-            case convert._JsonStringifier.BACKSPACE:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_b);
-              break;
-            }
-            case convert._JsonStringifier.TAB:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_t);
-              break;
-            }
-            case convert._JsonStringifier.NEWLINE:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_n);
-              break;
-            }
-            case convert._JsonStringifier.FORM_FEED:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_f);
-              break;
-            }
-            case convert._JsonStringifier.CARRIAGE_RETURN:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_r);
-              break;
-            }
-            default:
-            {
-              this.writeCharCode(convert._JsonStringifier.CHAR_u);
-              this.writeCharCode(convert._JsonStringifier.CHAR_0);
-              this.writeCharCode(convert._JsonStringifier.CHAR_0);
-              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) >> 4 & 15));
-              this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) & 15));
-              break;
-            }
+    [_newSet]() {
+      return new (_HashSetOfE())();
+    }
+    get iterator() {
+      return new (_HashSetIteratorOfE())(this, this[_computeElements]());
+    }
+    get length() {
+      return this[_length$1];
+    }
+    get isEmpty() {
+      return this[_length$1] == 0;
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    contains(object) {
+      if (dart.test(collection._HashSet._isStringElement(object))) {
+        let strings = this[_strings$];
+        return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
+      } else if (dart.test(collection._HashSet._isNumericElement(object))) {
+        let nums = this[_nums$];
+        return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
+      } else {
+        return this[_contains](object);
+      }
+    }
+    [_contains](object) {
+      let rest = this[_rest$];
+      if (rest == null) return false;
+      let bucket = this[_getBucket$](rest, object);
+      return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
+    }
+    lookup(object) {
+      if (dart.test(collection._HashSet._isStringElement(object)) || dart.test(collection._HashSet._isNumericElement(object))) {
+        return E._check(dart.test(this.contains(object)) ? object : null);
+      }
+      return this[_lookup](object);
+    }
+    [_lookup](object) {
+      let rest = this[_rest$];
+      if (rest == null) return null;
+      let bucket = this[_getBucket$](rest, object);
+      let index = this[_findBucketIndex](bucket, object);
+      if (dart.notNull(index) < 0) return null;
+      return bucket[dartx._get](index);
+    }
+    add(element) {
+      E._check(element);
+      if (dart.test(collection._HashSet._isStringElement(element))) {
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
+        return this[_addHashTableEntry$](strings, element);
+      } else if (dart.test(collection._HashSet._isNumericElement(element))) {
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
+        return this[_addHashTableEntry$](nums, element);
+      } else {
+        return this[_add$0](element);
+      }
+    }
+    [_add$0](element) {
+      E._check(element);
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
+      let hash = this[_computeHashCode](element);
+      let bucket = rest[hash];
+      if (bucket == null) {
+        collection._HashSet._setTableEntry(rest, hash, [element]);
+      } else {
+        let index = this[_findBucketIndex](bucket, element);
+        if (dart.notNull(index) >= 0) return false;
+        bucket.push(element);
+      }
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
+      this[_elements] = null;
+      return true;
+    }
+    addAll(objects) {
+      IterableOfE()._check(objects);
+      for (let each of objects) {
+        this.add(each);
+      }
+    }
+    remove(object) {
+      if (dart.test(collection._HashSet._isStringElement(object))) {
+        return this[_removeHashTableEntry$](this[_strings$], object);
+      } else if (dart.test(collection._HashSet._isNumericElement(object))) {
+        return this[_removeHashTableEntry$](this[_nums$], object);
+      } else {
+        return this[_remove](object);
+      }
+    }
+    [_remove](object) {
+      let rest = this[_rest$];
+      if (rest == null) return false;
+      let bucket = this[_getBucket$](rest, object);
+      let index = this[_findBucketIndex](bucket, object);
+      if (dart.notNull(index) < 0) return false;
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      this[_elements] = null;
+      bucket.splice(index, 1);
+      return true;
+    }
+    clear() {
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
+        this[_length$1] = 0;
+      }
+    }
+    [_computeElements]() {
+      if (this[_elements] != null) return this[_elements];
+      let result = ListOfE().new(this[_length$1]);
+      let index = 0;
+      let strings = this[_strings$];
+      if (strings != null) {
+        let names = Object.getOwnPropertyNames(strings);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let element = names[i];
+          result[index] = element;
+          index++;
+        }
+      }
+      let nums = this[_nums$];
+      if (nums != null) {
+        let names = Object.getOwnPropertyNames(nums);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let element = +names[i];
+          result[index] = element;
+          index++;
+        }
+      }
+      let rest = this[_rest$];
+      if (rest != null) {
+        let names = Object.getOwnPropertyNames(rest);
+        let entries = names.length;
+        for (let i = 0; i < entries; i++) {
+          let entry = names[i];
+          let bucket = rest[entry];
+          let length = bucket.length;
+          for (let i = 0; i < length; i++) {
+            result[index] = bucket[i];
+            index++;
           }
-        } else if (charCode == convert._JsonStringifier.QUOTE || charCode == convert._JsonStringifier.BACKSLASH) {
-          if (i > offset) this.writeStringSlice(s, offset, i);
-          offset = i + 1;
-          this.writeCharCode(convert._JsonStringifier.BACKSLASH);
-          this.writeCharCode(charCode);
         }
       }
-      if (offset == 0) {
-        this.writeString(s);
-      } else if (offset < dart.notNull(length)) {
-        this.writeStringSlice(s, offset, length);
-      }
+      dart.assert(index == this[_length$1]);
+      return this[_elements] = result;
     }
-    [_checkCycle](object) {
-      for (let i = 0; i < dart.notNull(this[_seen][dartx.length]); i++) {
-        if (core.identical(object, this[_seen][dartx._get](i))) {
-          dart.throw(new convert.JsonCyclicError(object));
-        }
-      }
-      this[_seen][dartx.add](object);
+    [_addHashTableEntry$](table, element) {
+      E._check(element);
+      if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
+      collection._HashSet._setTableEntry(table, element, 0);
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
+      this[_elements] = null;
+      return true;
     }
-    [_removeSeen](object) {
-      dart.assert(!dart.test(this[_seen][dartx.isEmpty]));
-      dart.assert(core.identical(this[_seen][dartx.last], object));
-      this[_seen][dartx.removeLast]();
-    }
-    writeObject(object) {
-      if (dart.test(this.writeJsonValue(object))) return;
-      this[_checkCycle](object);
-      try {
-        let customJson = dart.dcall(this[_toEncodable], object);
-        if (!dart.test(this.writeJsonValue(customJson))) {
-          dart.throw(new convert.JsonUnsupportedObjectError(object));
-        }
-        this[_removeSeen](object);
-      } catch (e) {
-        dart.throw(new convert.JsonUnsupportedObjectError(object, {cause: e}));
-      }
-
-    }
-    writeJsonValue(object) {
-      if (typeof object == 'number') {
-        if (!dart.test(object[dartx.isFinite])) return false;
-        this.writeNumber(object);
+    [_removeHashTableEntry$](table, element) {
+      if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
+        collection._HashSet._deleteTableEntry(table, element);
+        this[_length$1] = dart.notNull(this[_length$1]) - 1;
+        this[_elements] = null;
         return true;
-      } else if (core.identical(object, true)) {
-        this.writeString('true');
-        return true;
-      } else if (core.identical(object, false)) {
-        this.writeString('false');
-        return true;
-      } else if (object == null) {
-        this.writeString('null');
-        return true;
-      } else if (typeof object == 'string') {
-        this.writeString('"');
-        this.writeStringContent(object);
-        this.writeString('"');
-        return true;
-      } else if (core.List.is(object)) {
-        this[_checkCycle](object);
-        this.writeList(object);
-        this[_removeSeen](object);
-        return true;
-      } else if (core.Map.is(object)) {
-        this[_checkCycle](object);
-        let success = this.writeMap(object);
-        this[_removeSeen](object);
-        return success;
       } else {
         return false;
       }
     }
-    writeList(list) {
-      this.writeString('[');
-      if (dart.notNull(list[dartx.length]) > 0) {
-        this.writeObject(list[dartx._get](0));
-        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
-          this.writeString(',');
-          this.writeObject(list[dartx._get](i));
-        }
-      }
-      this.writeString(']');
+    static _isStringElement(element) {
+      return typeof element == 'string' && element != '__proto__';
     }
-    writeMap(map) {
-      if (dart.test(map[dartx.isEmpty])) {
-        this.writeString("{}");
-        return true;
-      }
-      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
-      let i = 0;
-      let allStringKeys = true;
-      map[dartx.forEach](dart.fn((key, value) => {
-        if (!(typeof key == 'string')) {
-          allStringKeys = false;
-        }
-        keyValueList[dartx._set](i++, key);
-        keyValueList[dartx._set](i++, value);
-      }, dynamicAnddynamicToNull()));
-      if (!allStringKeys) return false;
-      this.writeString('{');
-      let separator = '"';
-      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
-        this.writeString(separator);
-        separator = ',"';
-        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
-        this.writeString('":');
-        this.writeObject(keyValueList[dartx._get](i + 1));
-      }
-      this.writeString('}');
-      return true;
+    static _isNumericElement(element) {
+      return typeof element == 'number' && (element & 0x3ffffff) === element;
     }
-  };
-  dart.setSignature(convert._JsonStringifier, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringifier, [dynamicTodynamic()])}),
+    [_computeHashCode](element) {
+      return dart.hashCode(element) & 0x3ffffff;
+    }
+    static _hasTableEntry(table, key) {
+      let entry = table[key];
+      return entry != null;
+    }
+    static _setTableEntry(table, key, value) {
+      dart.assert(value != null);
+      table[key] = value;
+    }
+    static _deleteTableEntry(table, key) {
+      delete table[key];
+    }
+    [_getBucket$](table, element) {
+      let hash = this[_computeHashCode](element);
+      return table[hash];
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        if (dart.equals(bucket[i], element)) return i;
+      }
+      return -1;
+    }
+    static _newHashTable() {
+      let table = Object.create(null);
+      let temporaryKey = '<non-identifier-key>';
+      collection._HashSet._setTableEntry(table, temporaryKey, table);
+      collection._HashSet._deleteTableEntry(table, temporaryKey);
+      return table;
+    }
+  }
+  _HashSet[dart.implements] = () => [HashSetOfE()];
+  dart.setSignature(_HashSet, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
     fields: () => ({
-      [_seen]: core.List,
-      [_toEncodable]: convert._ToEncodable
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
+      [_elements]: ListOfE()
+    }),
+    getters: () => ({
+      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
+      length: dart.definiteFunctionType(core.int, [])
     }),
     methods: () => ({
-      writeStringContent: dart.definiteFunctionType(dart.void, [core.String]),
-      [_checkCycle]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_removeSeen]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      writeObject: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      writeJsonValue: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      writeList: dart.definiteFunctionType(dart.void, [core.List]),
-      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
+      [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
+      contains: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
+      lookup: dart.definiteFunctionType(E, [core.Object]),
+      [_lookup]: dart.definiteFunctionType(E, [core.Object]),
+      add: dart.definiteFunctionType(core.bool, [E]),
+      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
+      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
+      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
+      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
     }),
-    sfields: () => ({
-      BACKSPACE: core.int,
-      TAB: core.int,
-      NEWLINE: core.int,
-      CARRIAGE_RETURN: core.int,
-      FORM_FEED: core.int,
-      QUOTE: core.int,
-      CHAR_0: core.int,
-      BACKSLASH: core.int,
-      CHAR_b: core.int,
-      CHAR_f: core.int,
-      CHAR_n: core.int,
-      CHAR_r: core.int,
-      CHAR_t: core.int,
-      CHAR_u: core.int
+    statics: () => ({
+      _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _hasTableEntry: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
     }),
-    statics: () => ({hexDigit: dart.definiteFunctionType(core.int, [core.int])}),
-    names: ['hexDigit']
+    names: ['_isStringElement', '_isNumericElement', '_hasTableEntry', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
   });
-  convert._JsonStringifier.BACKSPACE = 8;
-  convert._JsonStringifier.TAB = 9;
-  convert._JsonStringifier.NEWLINE = 10;
-  convert._JsonStringifier.CARRIAGE_RETURN = 13;
-  convert._JsonStringifier.FORM_FEED = 12;
-  convert._JsonStringifier.QUOTE = 34;
-  convert._JsonStringifier.CHAR_0 = 48;
-  convert._JsonStringifier.BACKSLASH = 92;
-  convert._JsonStringifier.CHAR_b = 98;
-  convert._JsonStringifier.CHAR_f = 102;
-  convert._JsonStringifier.CHAR_n = 110;
-  convert._JsonStringifier.CHAR_r = 114;
-  convert._JsonStringifier.CHAR_t = 116;
-  convert._JsonStringifier.CHAR_u = 117;
-  const _indentLevel = Symbol('_indentLevel');
-  convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
+  dart.defineExtensionMembers(_HashSet, [
+    'contains',
+    'iterator',
+    'length',
+    'isEmpty',
+    'isNotEmpty'
+  ]);
+  return _HashSet;
+});
+collection._HashSet = _HashSet();
+collection._IdentityHashSet$ = dart.generic(E => {
+  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
+  class _IdentityHashSet extends collection._HashSet$(E) {
     new() {
-      this[_indentLevel] = 0;
+      super.new();
     }
-    writeList(list) {
-      if (dart.test(list[dartx.isEmpty])) {
-        this.writeString('[]');
-      } else {
-        this.writeString('[\n');
-        this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
-        this.writeIndentation(this[_indentLevel]);
-        this.writeObject(list[dartx._get](0));
-        for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
-          this.writeString(',\n');
-          this.writeIndentation(this[_indentLevel]);
-          this.writeObject(list[dartx._get](i));
-        }
-        this.writeString('\n');
-        this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
-        this.writeIndentation(this[_indentLevel]);
-        this.writeString(']');
+    [_newSet]() {
+      return new (_IdentityHashSetOfE())();
+    }
+    [_computeHashCode](key) {
+      return core.identityHashCode(key) & 0x3ffffff;
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        if (core.identical(bucket[i], element)) return i;
       }
+      return -1;
     }
-    writeMap(map) {
-      if (dart.test(map[dartx.isEmpty])) {
-        this.writeString("{}");
+  }
+  return _IdentityHashSet;
+});
+collection._IdentityHashSet = _IdentityHashSet();
+const _equality = Symbol('_equality');
+const _hasher = Symbol('_hasher');
+collection._CustomHashSet$ = dart.generic(E => {
+  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
+  let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
+  let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
+  class _CustomHashSet extends collection._HashSet$(E) {
+    new(equality, hasher, validKey) {
+      this[_equality] = equality;
+      this[_hasher] = hasher;
+      this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
+      super.new();
+    }
+    [_newSet]() {
+      return new (_CustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        if (dart.test(this[_equality](bucket[i], E._check(element)))) return i;
+      }
+      return -1;
+    }
+    [_computeHashCode](element) {
+      return this[_hasher](E._check(element)) & 0x3ffffff;
+    }
+    add(object) {
+      E._check(object);
+      return super[_add$0](object);
+    }
+    contains(object) {
+      if (!dart.test(this[_validKey](object))) return false;
+      return super[_contains](object);
+    }
+    lookup(object) {
+      if (!dart.test(this[_validKey](object))) return null;
+      return super[_lookup](object);
+    }
+    remove(object) {
+      if (!dart.test(this[_validKey](object))) return false;
+      return super[_remove](object);
+    }
+  }
+  dart.setSignature(_CustomHashSet, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
+    fields: () => ({
+      [_equality]: _EqualityOfE(),
+      [_hasher]: _HasherOfE(),
+      [_validKey]: _PredicateOfObject()
+    })
+  });
+  dart.defineExtensionMembers(_CustomHashSet, ['contains']);
+  return _CustomHashSet;
+});
+collection._CustomHashSet = _CustomHashSet();
+collection._HashSetIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  class _HashSetIterator extends core.Object {
+    new(set, elements) {
+      this[_set] = set;
+      this[_elements] = elements;
+      this[_offset] = 0;
+      this[_current$2] = null;
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      let elements = this[_elements];
+      let offset = this[_offset];
+      if (elements !== dart.dload(this[_set], _elements)) {
+        dart.throw(new core.ConcurrentModificationError(this[_set]));
+      } else if (dart.notNull(offset) >= elements.length) {
+        this[_current$2] = null;
+        return false;
+      } else {
+        this[_current$2] = elements[offset];
+        this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
-      let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
-      let i = 0;
-      let allStringKeys = true;
-      map[dartx.forEach](dart.fn((key, value) => {
-        if (!(typeof key == 'string')) {
-          allStringKeys = false;
+    }
+  }
+  dart.addTypeTests(_HashSetIterator);
+  _HashSetIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_HashSetIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._HashSetIterator$(E), [dart.dynamic, ListOfE()])}),
+    fields: () => ({
+      [_set]: dart.dynamic,
+      [_elements]: ListOfE(),
+      [_offset]: core.int,
+      [_current$2]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _HashSetIterator;
+});
+collection._HashSetIterator = _HashSetIterator();
+const _first$ = Symbol('_first');
+const _last$ = Symbol('_last');
+const _unsupported = Symbol('_unsupported');
+const _getTableEntry = Symbol('_getTableEntry');
+const _element = Symbol('_element');
+const _newLinkedCell$ = Symbol('_newLinkedCell');
+const _unlinkCell$ = Symbol('_unlinkCell');
+const _filterWhere = Symbol('_filterWhere');
+const _previous$0 = Symbol('_previous');
+collection._LinkedHashSet$ = dart.generic(E => {
+  let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
+  let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
+  let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
+  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  class _LinkedHashSet extends collection._HashSetBase$(E) {
+    new() {
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
+      this[_first$] = null;
+      this[_last$] = null;
+      this[_modifications$] = 0;
+    }
+    [_newSet]() {
+      return new (_LinkedHashSetOfE())();
+    }
+    [_unsupported](operation) {
+      dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
+    }
+    get iterator() {
+      return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
+    }
+    get length() {
+      return this[_length$1];
+    }
+    get isEmpty() {
+      return this[_length$1] == 0;
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    contains(object) {
+      if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
+        let strings = this[_strings$];
+        if (strings == null) return false;
+        let cell = this[_getTableEntry](strings, object);
+        return cell != null;
+      } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
+        let nums = this[_nums$];
+        if (nums == null) return false;
+        let cell = this[_getTableEntry](nums, object);
+        return cell != null;
+      } else {
+        return this[_contains](object);
+      }
+    }
+    [_contains](object) {
+      let rest = this[_rest$];
+      if (rest == null) return false;
+      let bucket = this[_getBucket$](rest, object);
+      return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
+    }
+    lookup(object) {
+      if (dart.test(collection._LinkedHashSet._isStringElement(object)) || dart.test(collection._LinkedHashSet._isNumericElement(object))) {
+        return E._check(dart.test(this.contains(object)) ? object : null);
+      } else {
+        return this[_lookup](object);
+      }
+    }
+    [_lookup](object) {
+      let rest = this[_rest$];
+      if (rest == null) return null;
+      let bucket = this[_getBucket$](rest, object);
+      let index = this[_findBucketIndex](bucket, object);
+      if (dart.notNull(index) < 0) return null;
+      return bucket[dartx._get](index)[_element];
+    }
+    forEach(action) {
+      let cell = this[_first$];
+      let modifications = this[_modifications$];
+      while (cell != null) {
+        action(cell[_element]);
+        if (modifications != this[_modifications$]) {
+          dart.throw(new core.ConcurrentModificationError(this));
         }
-        keyValueList[dartx._set](i++, key);
-        keyValueList[dartx._set](i++, value);
+        cell = cell[_next$0];
+      }
+    }
+    get first() {
+      if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
+      return this[_first$][_element];
+    }
+    get last() {
+      if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
+      return this[_last$][_element];
+    }
+    add(element) {
+      E._check(element);
+      if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
+        return this[_addHashTableEntry$](strings, element);
+      } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
+        return this[_addHashTableEntry$](nums, element);
+      } else {
+        return this[_add$0](element);
+      }
+    }
+    [_add$0](element) {
+      E._check(element);
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
+      let hash = this[_computeHashCode](element);
+      let bucket = rest[hash];
+      if (bucket == null) {
+        let cell = this[_newLinkedCell$](element);
+        collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
+      } else {
+        let index = this[_findBucketIndex](bucket, element);
+        if (dart.notNull(index) >= 0) return false;
+        let cell = this[_newLinkedCell$](element);
+        bucket.push(cell);
+      }
+      return true;
+    }
+    remove(object) {
+      if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
+        return this[_removeHashTableEntry$](this[_strings$], object);
+      } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
+        return this[_removeHashTableEntry$](this[_nums$], object);
+      } else {
+        return this[_remove](object);
+      }
+    }
+    [_remove](object) {
+      let rest = this[_rest$];
+      if (rest == null) return false;
+      let bucket = this[_getBucket$](rest, object);
+      let index = this[_findBucketIndex](bucket, object);
+      if (dart.notNull(index) < 0) return false;
+      let cell = bucket.splice(index, 1)[0];
+      this[_unlinkCell$](cell);
+      return true;
+    }
+    removeWhere(test) {
+      this[_filterWhere](test, true);
+    }
+    retainWhere(test) {
+      this[_filterWhere](test, false);
+    }
+    [_filterWhere](test, removeMatching) {
+      let cell = this[_first$];
+      while (cell != null) {
+        let element = cell[_element];
+        let next = cell[_next$0];
+        let modifications = this[_modifications$];
+        let shouldRemove = removeMatching == test(element);
+        if (modifications != this[_modifications$]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        if (shouldRemove) this.remove(element);
+        cell = next;
+      }
+    }
+    clear() {
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
+        this[_length$1] = 0;
+        this[_modified$]();
+      }
+    }
+    [_addHashTableEntry$](table, element) {
+      E._check(element);
+      let cell = this[_getTableEntry](table, element);
+      if (cell != null) return false;
+      collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
+      return true;
+    }
+    [_removeHashTableEntry$](table, element) {
+      if (table == null) return false;
+      let cell = this[_getTableEntry](table, element);
+      if (cell == null) return false;
+      this[_unlinkCell$](cell);
+      collection._LinkedHashSet._deleteTableEntry(table, element);
+      return true;
+    }
+    [_modified$]() {
+      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
+    }
+    [_newLinkedCell$](element) {
+      E._check(element);
+      let cell = new (_LinkedHashSetCellOfE())(element);
+      if (this[_first$] == null) {
+        this[_first$] = this[_last$] = cell;
+      } else {
+        let last = this[_last$];
+        cell[_previous$0] = last;
+        this[_last$] = last[_next$0] = cell;
+      }
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
+      this[_modified$]();
+      return cell;
+    }
+    [_unlinkCell$](cell) {
+      _LinkedHashSetCellOfE()._check(cell);
+      let previous = cell[_previous$0];
+      let next = cell[_next$0];
+      if (previous == null) {
+        dart.assert(dart.equals(cell, this[_first$]));
+        this[_first$] = next;
+      } else {
+        previous[_next$0] = next;
+      }
+      if (next == null) {
+        dart.assert(dart.equals(cell, this[_last$]));
+        this[_last$] = previous;
+      } else {
+        next[_previous$0] = previous;
+      }
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      this[_modified$]();
+    }
+    static _isStringElement(element) {
+      return typeof element == 'string' && element != '__proto__';
+    }
+    static _isNumericElement(element) {
+      return typeof element == 'number' && (element & 0x3ffffff) === element;
+    }
+    [_computeHashCode](element) {
+      return dart.hashCode(element) & 0x3ffffff;
+    }
+    [_getTableEntry](table, key) {
+      return table[key];
+    }
+    static _setTableEntry(table, key, value) {
+      dart.assert(value != null);
+      table[key] = value;
+    }
+    static _deleteTableEntry(table, key) {
+      delete table[key];
+    }
+    [_getBucket$](table, element) {
+      let hash = this[_computeHashCode](element);
+      return table[hash];
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (dart.equals(cell[_element], element)) return i;
+      }
+      return -1;
+    }
+    static _newHashTable() {
+      let table = Object.create(null);
+      let temporaryKey = '<non-identifier-key>';
+      collection._LinkedHashSet._setTableEntry(table, temporaryKey, table);
+      collection._LinkedHashSet._deleteTableEntry(table, temporaryKey);
+      return table;
+    }
+  }
+  _LinkedHashSet[dart.implements] = () => [LinkedHashSetOfE()];
+  dart.setSignature(_LinkedHashSet, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
+    fields: () => ({
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
+      [_first$]: _LinkedHashSetCellOfE(),
+      [_last$]: _LinkedHashSetCellOfE(),
+      [_modifications$]: core.int
+    }),
+    getters: () => ({
+      iterator: dart.definiteFunctionType(core.Iterator$(E), []),
+      length: dart.definiteFunctionType(core.int, [])
+    }),
+    methods: () => ({
+      [_newSet]: dart.definiteFunctionType(core.Set$(E), []),
+      [_unsupported]: dart.definiteFunctionType(dart.void, [core.String]),
+      contains: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_contains]: dart.definiteFunctionType(core.bool, [core.Object]),
+      lookup: dart.definiteFunctionType(E, [core.Object]),
+      [_lookup]: dart.definiteFunctionType(E, [core.Object]),
+      add: dart.definiteFunctionType(core.bool, [E]),
+      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
+      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
+      [_modified$]: dart.definiteFunctionType(dart.void, []),
+      [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
+      [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
+      [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
+      [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
+      [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
+    }),
+    statics: () => ({
+      _isStringElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _isNumericElement: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      _setTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+      _deleteTableEntry: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+      _newHashTable: dart.definiteFunctionType(dart.dynamic, [])
+    }),
+    names: ['_isStringElement', '_isNumericElement', '_setTableEntry', '_deleteTableEntry', '_newHashTable']
+  });
+  dart.defineExtensionMembers(_LinkedHashSet, [
+    'contains',
+    'forEach',
+    'iterator',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last'
+  ]);
+  return _LinkedHashSet;
+});
+collection._LinkedHashSet = _LinkedHashSet();
+collection._LinkedIdentityHashSet$ = dart.generic(E => {
+  let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
+  class _LinkedIdentityHashSet extends collection._LinkedHashSet$(E) {
+    new() {
+      super.new();
+    }
+    [_newSet]() {
+      return new (_LinkedIdentityHashSetOfE())();
+    }
+    [_computeHashCode](key) {
+      return core.identityHashCode(key) & 0x3ffffff;
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (core.identical(cell[_element], element)) return i;
+      }
+      return -1;
+    }
+  }
+  return _LinkedIdentityHashSet;
+});
+collection._LinkedIdentityHashSet = _LinkedIdentityHashSet();
+collection._LinkedCustomHashSet$ = dart.generic(E => {
+  let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
+  let _EqualityOfE = () => (_EqualityOfE = dart.constFn(collection._Equality$(E)))();
+  let _HasherOfE = () => (_HasherOfE = dart.constFn(collection._Hasher$(E)))();
+  class _LinkedCustomHashSet extends collection._LinkedHashSet$(E) {
+    new(equality, hasher, validKey) {
+      this[_equality] = equality;
+      this[_hasher] = hasher;
+      this[_validKey] = validKey != null ? validKey : dart.fn(x => E.is(x), ObjectTobool());
+      super.new();
+    }
+    [_newSet]() {
+      return new (_LinkedCustomHashSetOfE())(this[_equality], this[_hasher], this[_validKey]);
+    }
+    [_findBucketIndex](bucket, element) {
+      if (bucket == null) return -1;
+      let length = bucket.length;
+      for (let i = 0; i < length; i++) {
+        let cell = bucket[i];
+        if (dart.test(this[_equality](cell[_element], E._check(element)))) return i;
+      }
+      return -1;
+    }
+    [_computeHashCode](element) {
+      return this[_hasher](E._check(element)) & 0x3ffffff;
+    }
+    add(element) {
+      E._check(element);
+      return super[_add$0](element);
+    }
+    contains(object) {
+      if (!dart.test(this[_validKey](object))) return false;
+      return super[_contains](object);
+    }
+    lookup(object) {
+      if (!dart.test(this[_validKey](object))) return null;
+      return super[_lookup](object);
+    }
+    remove(object) {
+      if (!dart.test(this[_validKey](object))) return false;
+      return super[_remove](object);
+    }
+    containsAll(elements) {
+      for (let element of elements) {
+        if (!dart.test(this[_validKey](element)) || !dart.test(this.contains(element))) return false;
+      }
+      return true;
+    }
+    removeAll(elements) {
+      for (let element of elements) {
+        if (dart.test(this[_validKey](element))) {
+          super[_remove](element);
+        }
+      }
+    }
+  }
+  dart.setSignature(_LinkedCustomHashSet, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashSet$(E), [_EqualityOfE(), _HasherOfE(), _PredicateOfObject()])}),
+    fields: () => ({
+      [_equality]: _EqualityOfE(),
+      [_hasher]: _HasherOfE(),
+      [_validKey]: _PredicateOfObject()
+    })
+  });
+  dart.defineExtensionMembers(_LinkedCustomHashSet, ['contains']);
+  return _LinkedCustomHashSet;
+});
+collection._LinkedCustomHashSet = _LinkedCustomHashSet();
+collection._LinkedHashSetCell$ = dart.generic(E => {
+  let _LinkedHashSetCellOfE = () => (_LinkedHashSetCellOfE = dart.constFn(collection._LinkedHashSetCell$(E)))();
+  class _LinkedHashSetCell extends core.Object {
+    new(element) {
+      this[_element] = element;
+      this[_next$0] = null;
+      this[_previous$0] = null;
+    }
+  }
+  dart.addTypeTests(_LinkedHashSetCell);
+  dart.setSignature(_LinkedHashSetCell, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
+    fields: () => ({
+      [_element]: E,
+      [_next$0]: _LinkedHashSetCellOfE(),
+      [_previous$0]: _LinkedHashSetCellOfE()
+    })
+  });
+  return _LinkedHashSetCell;
+});
+collection._LinkedHashSetCell = _LinkedHashSetCell();
+const _cell$ = Symbol('_cell');
+collection._LinkedHashSetIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class _LinkedHashSetIterator extends core.Object {
+    new(set, modifications) {
+      this[_set] = set;
+      this[_modifications$] = modifications;
+      this[_cell$] = null;
+      this[_current$2] = null;
+      this[_cell$] = this[_set][_first$];
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      if (this[_modifications$] != this[_set][_modifications$]) {
+        dart.throw(new core.ConcurrentModificationError(this[_set]));
+      } else if (this[_cell$] == null) {
+        this[_current$2] = null;
+        return false;
+      } else {
+        this[_current$2] = E._check(this[_cell$][_element]);
+        this[_cell$] = this[_cell$][_next$0];
+        return true;
+      }
+    }
+  }
+  dart.addTypeTests(_LinkedHashSetIterator);
+  _LinkedHashSetIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_LinkedHashSetIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [collection._LinkedHashSet, core.int])}),
+    fields: () => ({
+      [_set]: collection._LinkedHashSet,
+      [_modifications$]: core.int,
+      [_cell$]: collection._LinkedHashSetCell,
+      [_current$2]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _LinkedHashSetIterator;
+});
+collection._LinkedHashSetIterator = _LinkedHashSetIterator();
+const _source$0 = Symbol('_source');
+collection.UnmodifiableListView$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
+    new(source) {
+      this[_source$0] = source;
+    }
+    get length() {
+      return this[_source$0][dartx.length];
+    }
+    set length(value) {
+      super.length = value;
+    }
+    _get(index) {
+      return this[_source$0][dartx.elementAt](index);
+    }
+  }
+  dart.setSignature(UnmodifiableListView, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
+    fields: () => ({[_source$0]: IterableOfE()}),
+    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+    methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
+  });
+  dart.defineExtensionMembers(UnmodifiableListView, ['_get', 'length']);
+  return UnmodifiableListView;
+});
+collection.UnmodifiableListView = UnmodifiableListView();
+collection._defaultEquals = function(a, b) {
+  return dart.equals(a, b);
+};
+dart.lazyFn(collection._defaultEquals, () => dynamicAnddynamicTobool());
+collection._defaultHashCode = function(a) {
+  return dart.hashCode(a);
+};
+dart.fn(collection._defaultHashCode, dynamicToint());
+collection._Equality$ = dart.generic(K => {
+  const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
+  return _Equality;
+});
+collection._Equality = _Equality$();
+collection._Hasher$ = dart.generic(K => {
+  const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
+  return _Hasher;
+});
+collection._Hasher = _Hasher();
+collection.HashMap$ = dart.generic((K, V) => {
+  let _HashMapOfK$V = () => (_HashMapOfK$V = dart.constFn(collection._HashMap$(K, V)))();
+  let _IdentityHashMapOfK$V = () => (_IdentityHashMapOfK$V = dart.constFn(collection._IdentityHashMap$(K, V)))();
+  let _CustomHashMapOfK$V = () => (_CustomHashMapOfK$V = dart.constFn(collection._CustomHashMap$(K, V)))();
+  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
+  let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
+  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
+  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
+  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
+  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
+  class HashMap extends core.Object {
+    static new(opts) {
+      let equals = opts && 'equals' in opts ? opts.equals : null;
+      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
+      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
+      if (isValidKey == null) {
+        if (hashCode == null) {
+          if (equals == null) {
+            return new (_HashMapOfK$V())();
+          }
+          hashCode = collection._defaultHashCode;
+        } else {
+          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
+            return new (_IdentityHashMapOfK$V())();
+          }
+          if (equals == null) {
+            equals = collection._defaultEquals;
+          }
+        }
+      } else {
+        if (hashCode == null) {
+          hashCode = collection._defaultHashCode;
+        }
+        if (equals == null) {
+          equals = collection._defaultEquals;
+        }
+      }
+      return new (_CustomHashMapOfK$V())(equals, hashCode, isValidKey);
+    }
+    static identity() {
+      return new (_IdentityHashMapOfK$V())();
+    }
+    static from(other) {
+      let result = HashMapOfK$V().new();
+      other[dartx.forEach](dart.fn((k, v) => {
+        result._set(K.as(k), V.as(v));
       }, dynamicAnddynamicToNull()));
-      if (!allStringKeys) return false;
-      this.writeString('{\n');
+      return result;
+    }
+    static fromIterable(iterable, opts) {
+      let key = opts && 'key' in opts ? opts.key : null;
+      let value = opts && 'value' in opts ? opts.value : null;
+      let map = HashMapOfK$V().new();
+      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
+      return map;
+    }
+    static fromIterables(keys, values) {
+      let map = HashMapOfK$V().new();
+      collection.Maps._fillMapWithIterables(map, keys, values);
+      return map;
+    }
+  }
+  dart.addTypeTests(HashMap);
+  HashMap[dart.implements] = () => [MapOfK$V()];
+  dart.setSignature(HashMap, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.HashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
+      identity: dart.definiteFunctionType(collection.HashMap$(K, V), []),
+      from: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Map]),
+      fromIterable: dart.definiteFunctionType(collection.HashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
+      fromIterables: dart.definiteFunctionType(collection.HashMap$(K, V), [IterableOfK(), IterableOfV()])
+    })
+  });
+  return HashMap;
+});
+collection.HashMap = HashMap();
+collection.HashSet$ = dart.generic(E => {
+  let _HashSetOfE = () => (_HashSetOfE = dart.constFn(collection._HashSet$(E)))();
+  let _IdentityHashSetOfE = () => (_IdentityHashSetOfE = dart.constFn(collection._IdentityHashSet$(E)))();
+  let _CustomHashSetOfE = () => (_CustomHashSetOfE = dart.constFn(collection._CustomHashSet$(E)))();
+  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
+  let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
+  class HashSet extends core.Object {
+    static new(opts) {
+      let equals = opts && 'equals' in opts ? opts.equals : null;
+      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
+      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
+      if (isValidKey == null) {
+        if (hashCode == null) {
+          if (equals == null) {
+            return new (_HashSetOfE())();
+          }
+          hashCode = collection._defaultHashCode;
+        } else {
+          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
+            return new (_IdentityHashSetOfE())();
+          }
+          if (equals == null) {
+            equals = collection._defaultEquals;
+          }
+        }
+      } else {
+        if (hashCode == null) {
+          hashCode = collection._defaultHashCode;
+        }
+        if (equals == null) {
+          equals = collection._defaultEquals;
+        }
+      }
+      return new (_CustomHashSetOfE())(equals, hashCode, isValidKey);
+    }
+    static identity() {
+      return new (_IdentityHashSetOfE())();
+    }
+    static from(elements) {
+      let result = HashSetOfE().new();
+      for (let e of elements) {
+        let element = E.as(e);
+        result.add(element);
+      }
+      return result;
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this.iterator);
+    }
+  }
+  dart.addTypeTests(HashSet);
+  HashSet[dart.implements] = () => [SetOfE()];
+  dart.setSignature(HashSet, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.HashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
+      identity: dart.definiteFunctionType(collection.HashSet$(E), []),
+      from: dart.definiteFunctionType(collection.HashSet$(E), [core.Iterable])
+    })
+  });
+  return HashSet;
+});
+collection.HashSet = HashSet();
+collection.IterableMixin$ = dart.generic(E => {
+  let WhereIterableOfE = () => (WhereIterableOfE = dart.constFn(_internal.WhereIterable$(E)))();
+  let EAndEToE = () => (EAndEToE = dart.constFn(dart.functionType(E, [E, E])))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  let TakeIterableOfE = () => (TakeIterableOfE = dart.constFn(_internal.TakeIterable$(E)))();
+  let TakeWhileIterableOfE = () => (TakeWhileIterableOfE = dart.constFn(_internal.TakeWhileIterable$(E)))();
+  let SkipIterableOfE = () => (SkipIterableOfE = dart.constFn(_internal.SkipIterable$(E)))();
+  let SkipWhileIterableOfE = () => (SkipWhileIterableOfE = dart.constFn(_internal.SkipWhileIterable$(E)))();
+  let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  class IterableMixin extends core.Object {
+    map(T) {
+      return f => {
+        return _internal.MappedIterable$(E, T).new(this, f);
+      };
+    }
+    where(f) {
+      return new (WhereIterableOfE())(this, f);
+    }
+    expand(T) {
+      return f => {
+        return new (_internal.ExpandIterable$(E, T))(this, f);
+      };
+    }
+    contains(element) {
+      for (let e of this) {
+        if (dart.equals(e, element)) return true;
+      }
+      return false;
+    }
+    forEach(f) {
+      for (let element of this)
+        f(element);
+    }
+    reduce(combine) {
+      EAndEToE()._check(combine);
+      let iterator = this.iterator;
+      if (!dart.test(iterator.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      let value = iterator.current;
+      while (dart.test(iterator.moveNext())) {
+        value = combine(value, iterator.current);
+      }
+      return value;
+    }
+    fold(T) {
+      return (initialValue, combine) => {
+        let value = initialValue;
+        for (let element of this)
+          value = combine(value, element);
+        return value;
+      };
+    }
+    every(f) {
+      for (let element of this) {
+        if (!dart.test(f(element))) return false;
+      }
+      return true;
+    }
+    join(separator) {
+      if (separator === void 0) separator = "";
+      let iterator = this.iterator;
+      if (!dart.test(iterator.moveNext())) return "";
+      let buffer = new core.StringBuffer();
+      if (separator == null || separator == "") {
+        do {
+          buffer.write(dart.str`${iterator.current}`);
+        } while (dart.test(iterator.moveNext()));
+      } else {
+        buffer.write(dart.str`${iterator.current}`);
+        while (dart.test(iterator.moveNext())) {
+          buffer.write(separator);
+          buffer.write(dart.str`${iterator.current}`);
+        }
+      }
+      return buffer.toString();
+    }
+    any(f) {
+      for (let element of this) {
+        if (dart.test(f(element))) return true;
+      }
+      return false;
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      return ListOfE().from(this, {growable: growable});
+    }
+    toSet() {
+      return SetOfE().from(this);
+    }
+    get length() {
+      dart.assert(!_internal.EfficientLength.is(this));
+      let count = 0;
+      let it = this[dartx.iterator];
+      while (dart.test(it.moveNext())) {
+        count++;
+      }
+      return count;
+    }
+    get isEmpty() {
+      return !dart.test(this[dartx.iterator].moveNext());
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    take(count) {
+      return TakeIterableOfE().new(this, count);
+    }
+    takeWhile(test) {
+      return new (TakeWhileIterableOfE())(this, test);
+    }
+    skip(count) {
+      return SkipIterableOfE().new(this, count);
+    }
+    skipWhile(test) {
+      return new (SkipWhileIterableOfE())(this, test);
+    }
+    get first() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      return it.current;
+    }
+    get last() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) {
+        dart.throw(_internal.IterableElementError.noElement());
+      }
+      let result = null;
+      do {
+        result = it.current;
+      } while (dart.test(it.moveNext()));
+      return result;
+    }
+    get single() {
+      let it = this[dartx.iterator];
+      if (!dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.noElement());
+      let result = it.current;
+      if (dart.test(it.moveNext())) dart.throw(_internal.IterableElementError.tooMany());
+      return result;
+    }
+    firstWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      for (let element of this) {
+        if (dart.test(test(element))) return element;
+      }
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    lastWhere(test, opts) {
+      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+      VoidToE()._check(orElse);
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          result = element;
+          foundMatching = true;
+        }
+      }
+      if (foundMatching) return result;
+      if (orElse != null) return orElse();
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    singleWhere(test) {
+      let result = null;
+      let foundMatching = false;
+      for (let element of this) {
+        if (dart.test(test(element))) {
+          if (foundMatching) {
+            dart.throw(_internal.IterableElementError.tooMany());
+          }
+          result = element;
+          foundMatching = true;
+        }
+      }
+      if (foundMatching) return result;
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    elementAt(index) {
+      if (!(typeof index == 'number')) dart.throw(new core.ArgumentError.notNull("index"));
+      core.RangeError.checkNotNegative(index, "index");
+      let elementIndex = 0;
+      for (let element of this) {
+        if (index == elementIndex) return element;
+        elementIndex++;
+      }
+      dart.throw(core.RangeError.index(index, this, "index", null, elementIndex));
+    }
+    toString() {
+      return collection.IterableBase.iterableToShortString(this, '(', ')');
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this.iterator);
+    }
+  }
+  dart.addTypeTests(IterableMixin);
+  IterableMixin[dart.implements] = () => [IterableOfE()];
+  dart.setSignature(IterableMixin, {
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      first: dart.definiteFunctionType(E, []),
+      last: dart.definiteFunctionType(E, []),
+      single: dart.definiteFunctionType(E, [])
+    }),
+    methods: () => ({
+      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [E])]]),
+      where: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [E])]]),
+      contains: dart.definiteFunctionType(core.bool, [core.Object]),
+      forEach: dart.definiteFunctionType(dart.void, [ETovoid()]),
+      reduce: dart.definiteFunctionType(E, [EAndEToE()]),
+      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, E])]]),
+      every: dart.definiteFunctionType(core.bool, [ETobool()]),
+      join: dart.definiteFunctionType(core.String, [], [core.String]),
+      any: dart.definiteFunctionType(core.bool, [ETobool()]),
+      toList: dart.definiteFunctionType(core.List$(E), [], {growable: core.bool}),
+      toSet: dart.definiteFunctionType(core.Set$(E), []),
+      take: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      takeWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      skip: dart.definiteFunctionType(core.Iterable$(E), [core.int]),
+      skipWhile: dart.definiteFunctionType(core.Iterable$(E), [ETobool()]),
+      firstWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      lastWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()}),
+      singleWhere: dart.definiteFunctionType(E, [ETobool()]),
+      elementAt: dart.definiteFunctionType(E, [core.int])
+    })
+  });
+  dart.defineExtensionMembers(IterableMixin, [
+    'map',
+    'where',
+    'expand',
+    'contains',
+    'forEach',
+    'reduce',
+    'fold',
+    'every',
+    'join',
+    'any',
+    'toList',
+    'toSet',
+    'take',
+    'takeWhile',
+    'skip',
+    'skipWhile',
+    'firstWhere',
+    'lastWhere',
+    'singleWhere',
+    'elementAt',
+    'toString',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last',
+    'single'
+  ]);
+  return IterableMixin;
+});
+collection.IterableMixin = IterableMixin();
+dart.defineLazy(collection, {
+  get _toStringVisiting() {
+    return [];
+  }
+});
+collection._isToStringVisiting = function(o) {
+  for (let i = 0; i < dart.notNull(collection._toStringVisiting[dartx.length]); i++) {
+    if (core.identical(o, collection._toStringVisiting[dartx._get](i))) return true;
+  }
+  return false;
+};
+dart.lazyFn(collection._isToStringVisiting, () => ObjectTobool());
+collection._iterablePartsToStrings = function(iterable, parts) {
+  let LENGTH_LIMIT = 80;
+  let HEAD_COUNT = 3;
+  let TAIL_COUNT = 2;
+  let MAX_COUNT = 100;
+  let OVERHEAD = 2;
+  let ELLIPSIS_SIZE = 3;
+  let length = 0;
+  let count = 0;
+  let it = iterable[dartx.iterator];
+  while (dart.notNull(length) < LENGTH_LIMIT || count < HEAD_COUNT) {
+    if (!dart.test(it.moveNext())) return;
+    let next = dart.str`${it.current}`;
+    parts[dartx.add](next);
+    length = dart.notNull(length) + (dart.notNull(next[dartx.length]) + OVERHEAD);
+    count++;
+  }
+  let penultimateString = null;
+  let ultimateString = null;
+  let penultimate = null;
+  let ultimate = null;
+  if (!dart.test(it.moveNext())) {
+    if (count <= HEAD_COUNT + TAIL_COUNT) return;
+    ultimateString = core.String._check(parts[dartx.removeLast]());
+    penultimateString = core.String._check(parts[dartx.removeLast]());
+  } else {
+    penultimate = it.current;
+    count++;
+    if (!dart.test(it.moveNext())) {
+      if (count <= HEAD_COUNT + 1) {
+        parts[dartx.add](dart.str`${penultimate}`);
+        return;
+      }
+      ultimateString = dart.str`${penultimate}`;
+      penultimateString = core.String._check(parts[dartx.removeLast]());
+      length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + OVERHEAD);
+    } else {
+      ultimate = it.current;
+      count++;
+      dart.assert(count < MAX_COUNT);
+      while (dart.test(it.moveNext())) {
+        penultimate = ultimate;
+        ultimate = it.current;
+        count++;
+        if (count > MAX_COUNT) {
+          while (dart.notNull(length) > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD && count > HEAD_COUNT) {
+            length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
+            count--;
+          }
+          parts[dartx.add]("...");
+          return;
+        }
+      }
+      penultimateString = dart.str`${penultimate}`;
+      ultimateString = dart.str`${ultimate}`;
+      length = dart.notNull(length) + (dart.notNull(ultimateString[dartx.length]) + dart.notNull(penultimateString[dartx.length]) + 2 * OVERHEAD);
+    }
+  }
+  let elision = null;
+  if (count > dart.notNull(parts[dartx.length]) + TAIL_COUNT) {
+    elision = "...";
+    length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
+  }
+  while (dart.notNull(length) > LENGTH_LIMIT && dart.notNull(parts[dartx.length]) > HEAD_COUNT) {
+    length = dart.notNull(length) - dart.notNull(core.num._check(dart.dsend(dart.dload(parts[dartx.removeLast](), 'length'), '+', OVERHEAD)));
+    if (elision == null) {
+      elision = "...";
+      length = dart.notNull(length) + (ELLIPSIS_SIZE + OVERHEAD);
+    }
+  }
+  if (elision != null) {
+    parts[dartx.add](elision);
+  }
+  parts[dartx.add](penultimateString);
+  parts[dartx.add](ultimateString);
+};
+dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
+const _iterator$0 = Symbol('_iterator');
+const _state$ = Symbol('_state');
+const _move = Symbol('_move');
+collection.HasNextIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class HasNextIterator extends core.Object {
+    new(iterator) {
+      this[_iterator$0] = iterator;
+      this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
+    }
+    get hasNext() {
+      if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
+      return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
+    }
+    next() {
+      if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
+      dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
+      let result = this[_iterator$0].current;
+      this[_move]();
+      return result;
+    }
+    [_move]() {
+      if (dart.test(this[_iterator$0].moveNext())) {
+        this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
+      } else {
+        this[_state$] = collection.HasNextIterator._NO_NEXT;
+      }
+    }
+  }
+  dart.addTypeTests(HasNextIterator);
+  dart.setSignature(HasNextIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
+    fields: () => ({
+      [_iterator$0]: IteratorOfE(),
+      [_state$]: core.int
+    }),
+    getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
+    methods: () => ({
+      next: dart.definiteFunctionType(E, []),
+      [_move]: dart.definiteFunctionType(dart.void, [])
+    }),
+    sfields: () => ({
+      _HAS_NEXT_AND_NEXT_IN_CURRENT: core.int,
+      _NO_NEXT: core.int,
+      _NOT_MOVED_YET: core.int
+    })
+  });
+  return HasNextIterator;
+});
+collection.HasNextIterator = HasNextIterator();
+collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
+collection.HasNextIterator._NO_NEXT = 1;
+collection.HasNextIterator._NOT_MOVED_YET = 2;
+collection.LinkedHashMap$ = dart.generic((K, V) => {
+  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
+  let _LinkedIdentityHashMapOfK$V = () => (_LinkedIdentityHashMapOfK$V = dart.constFn(collection._LinkedIdentityHashMap$(K, V)))();
+  let _LinkedCustomHashMapOfK$V = () => (_LinkedCustomHashMapOfK$V = dart.constFn(collection._LinkedCustomHashMap$(K, V)))();
+  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
+  let HashMapOfK$V = () => (HashMapOfK$V = dart.constFn(collection.HashMap$(K, V)))();
+  let KAndKTobool = () => (KAndKTobool = dart.constFn(dart.functionType(core.bool, [K, K])))();
+  let KToint = () => (KToint = dart.constFn(dart.functionType(core.int, [K])))();
+  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
+  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
+  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
+  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
+  class LinkedHashMap extends core.Object {
+    static new(opts) {
+      let equals = opts && 'equals' in opts ? opts.equals : null;
+      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
+      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
+      if (isValidKey == null) {
+        if (hashCode == null) {
+          if (equals == null) {
+            return JsLinkedHashMapOfK$V().es6();
+          }
+          hashCode = collection._defaultHashCode;
+        } else {
+          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
+            return _LinkedIdentityHashMapOfK$V().es6();
+          }
+          if (equals == null) {
+            equals = collection._defaultEquals;
+          }
+        }
+      } else {
+        if (hashCode == null) {
+          hashCode = collection._defaultHashCode;
+        }
+        if (equals == null) {
+          equals = collection._defaultEquals;
+        }
+      }
+      return new (_LinkedCustomHashMapOfK$V())(equals, hashCode, isValidKey);
+    }
+    static identity() {
+      return _LinkedIdentityHashMapOfK$V().es6();
+    }
+    static from(other) {
+      let result = LinkedHashMapOfK$V().new();
+      other[dartx.forEach](dart.fn((k, v) => {
+        result._set(K.as(k), V.as(v));
+      }, dynamicAnddynamicToNull()));
+      return result;
+    }
+    static fromIterable(iterable, opts) {
+      let key = opts && 'key' in opts ? opts.key : null;
+      let value = opts && 'value' in opts ? opts.value : null;
+      let map = LinkedHashMapOfK$V().new();
+      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
+      return map;
+    }
+    static fromIterables(keys, values) {
+      let map = LinkedHashMapOfK$V().new();
+      collection.Maps._fillMapWithIterables(map, keys, values);
+      return map;
+    }
+  }
+  dart.addTypeTests(LinkedHashMap);
+  LinkedHashMap[dart.implements] = () => [HashMapOfK$V()];
+  dart.setSignature(LinkedHashMap, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [], {equals: KAndKTobool(), hashCode: KToint(), isValidKey: _PredicateOfObject()}),
+      identity: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), []),
+      from: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Map]),
+      fromIterable: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
+      fromIterables: dart.definiteFunctionType(collection.LinkedHashMap$(K, V), [IterableOfK(), IterableOfV()])
+    })
+  });
+  return LinkedHashMap;
+});
+collection.LinkedHashMap = LinkedHashMap();
+collection.LinkedHashSet$ = dart.generic(E => {
+  let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
+  let _LinkedIdentityHashSetOfE = () => (_LinkedIdentityHashSetOfE = dart.constFn(collection._LinkedIdentityHashSet$(E)))();
+  let _LinkedCustomHashSetOfE = () => (_LinkedCustomHashSetOfE = dart.constFn(collection._LinkedCustomHashSet$(E)))();
+  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
+  let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
+  let EAndETobool = () => (EAndETobool = dart.constFn(dart.functionType(core.bool, [E, E])))();
+  let EToint = () => (EToint = dart.constFn(dart.functionType(core.int, [E])))();
+  class LinkedHashSet extends core.Object {
+    static new(opts) {
+      let equals = opts && 'equals' in opts ? opts.equals : null;
+      let hashCode = opts && 'hashCode' in opts ? opts.hashCode : null;
+      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
+      if (isValidKey == null) {
+        if (hashCode == null) {
+          if (equals == null) {
+            return new (_LinkedHashSetOfE())();
+          }
+          hashCode = collection._defaultHashCode;
+        } else {
+          if (core.identical(core.identityHashCode, hashCode) && core.identical(core.identical, equals)) {
+            return new (_LinkedIdentityHashSetOfE())();
+          }
+          if (equals == null) {
+            equals = collection._defaultEquals;
+          }
+        }
+      } else {
+        if (hashCode == null) {
+          hashCode = collection._defaultHashCode;
+        }
+        if (equals == null) {
+          equals = collection._defaultEquals;
+        }
+      }
+      return new (_LinkedCustomHashSetOfE())(equals, hashCode, isValidKey);
+    }
+    static identity() {
+      return new (_LinkedIdentityHashSetOfE())();
+    }
+    static from(elements) {
+      let result = LinkedHashSetOfE().new();
+      for (let element of elements) {
+        let e = E.as(element);
+        result.add(e);
+      }
+      return result;
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this.iterator);
+    }
+  }
+  dart.addTypeTests(LinkedHashSet);
+  LinkedHashSet[dart.implements] = () => [HashSetOfE()];
+  dart.setSignature(LinkedHashSet, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.LinkedHashSet$(E), [], {equals: EAndETobool(), hashCode: EToint(), isValidKey: _PredicateOfObject()}),
+      identity: dart.definiteFunctionType(collection.LinkedHashSet$(E), []),
+      from: dart.definiteFunctionType(collection.LinkedHashSet$(E), [core.Iterable])
+    })
+  });
+  return LinkedHashSet;
+});
+collection.LinkedHashSet = LinkedHashSet();
+const _modificationCount = Symbol('_modificationCount');
+const _insertBefore$ = Symbol('_insertBefore');
+const _list = Symbol('_list');
+const _unlink$ = Symbol('_unlink');
+collection.LinkedList$ = dart.generic(E => {
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  class LinkedList extends core.Iterable$(E) {
+    new() {
+      this[_modificationCount] = 0;
+      this[_length$1] = 0;
+      this[_first$] = null;
+      super.new();
+    }
+    addFirst(entry) {
+      E._check(entry);
+      this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+      this[_first$] = entry;
+    }
+    add(entry) {
+      E._check(entry);
+      this[_insertBefore$](this[_first$], entry, {updateFirst: false});
+    }
+    addAll(entries) {
+      IterableOfE()._check(entries);
+      entries[dartx.forEach](dart.bind(this, 'add'));
+    }
+    remove(entry) {
+      E._check(entry);
+      if (!dart.equals(entry[_list], this)) return false;
+      this[_unlink$](entry);
+      return true;
+    }
+    get iterator() {
+      return new (_LinkedListIteratorOfE())(this);
+    }
+    get length() {
+      return this[_length$1];
+    }
+    clear() {
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      if (dart.test(this.isEmpty)) return;
+      let next = this[_first$];
+      do {
+        let entry = next;
+        next = entry[_next$0];
+        entry[_next$0] = entry[_previous$0] = entry[_list] = null;
+      } while (!core.identical(next, this[_first$]));
+      this[_first$] = null;
+      this[_length$1] = 0;
+    }
+    get first() {
+      if (dart.test(this.isEmpty)) {
+        dart.throw(new core.StateError('No such element'));
+      }
+      return this[_first$];
+    }
+    get last() {
+      if (dart.test(this.isEmpty)) {
+        dart.throw(new core.StateError('No such element'));
+      }
+      return this[_first$][_previous$0];
+    }
+    get single() {
+      if (dart.test(this.isEmpty)) {
+        dart.throw(new core.StateError('No such element'));
+      }
+      if (dart.notNull(this[_length$1]) > 1) {
+        dart.throw(new core.StateError('Too many elements'));
+      }
+      return this[_first$];
+    }
+    forEach(action) {
+      let modificationCount = this[_modificationCount];
+      if (dart.test(this.isEmpty)) return;
+      let current = this[_first$];
+      do {
+        action(current);
+        if (modificationCount != this[_modificationCount]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        current = current[_next$0];
+      } while (!core.identical(current, this[_first$]));
+    }
+    get isEmpty() {
+      return this[_length$1] == 0;
+    }
+    [_insertBefore$](entry, newEntry, opts) {
+      E._check(entry);
+      E._check(newEntry);
+      let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
+      if (newEntry.list != null) {
+        dart.throw(new core.StateError('LinkedListEntry is already in a LinkedList'));
+      }
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      newEntry[_list] = this;
+      if (dart.test(this.isEmpty)) {
+        dart.assert(entry == null);
+        newEntry[_previous$0] = newEntry[_next$0] = newEntry;
+        this[_first$] = newEntry;
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
+        return;
+      }
+      let predecessor = entry[_previous$0];
+      let successor = entry;
+      newEntry[_previous$0] = predecessor;
+      newEntry[_next$0] = successor;
+      predecessor[_next$0] = newEntry;
+      successor[_previous$0] = newEntry;
+      if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
+        this[_first$] = newEntry;
+      }
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
+    }
+    [_unlink$](entry) {
+      E._check(entry);
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      entry[_next$0][_previous$0] = entry[_previous$0];
+      let next = entry[_previous$0][_next$0] = entry[_next$0];
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      entry[_list] = entry[_next$0] = entry[_previous$0] = null;
+      if (dart.test(this.isEmpty)) {
+        this[_first$] = null;
+      } else if (core.identical(entry, this[_first$])) {
+        this[_first$] = next;
+      }
+    }
+  }
+  dart.setSignature(LinkedList, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
+    fields: () => ({
+      [_modificationCount]: core.int,
+      [_length$1]: core.int,
+      [_first$]: E
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({
+      addFirst: dart.definiteFunctionType(dart.void, [E]),
+      add: dart.definiteFunctionType(dart.void, [E]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      remove: dart.definiteFunctionType(core.bool, [E]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+      [_unlink$]: dart.definiteFunctionType(dart.void, [E])
+    })
+  });
+  dart.defineExtensionMembers(LinkedList, [
+    'forEach',
+    'iterator',
+    'length',
+    'first',
+    'last',
+    'single',
+    'isEmpty'
+  ]);
+  return LinkedList;
+});
+collection.LinkedList = LinkedList();
+const _visitedFirst = Symbol('_visitedFirst');
+collection._LinkedListIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
+  let LinkedListEntryOfE = () => (LinkedListEntryOfE = dart.constFn(collection.LinkedListEntry$(E)))();
+  class _LinkedListIterator extends core.Object {
+    new(list) {
+      this[_list] = list;
+      this[_modificationCount] = list[_modificationCount];
+      this[_next$0] = list[_first$];
+      this[_visitedFirst] = false;
+      this[_current$2] = null;
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      if (this[_modificationCount] != this[_list][_modificationCount]) {
+        dart.throw(new core.ConcurrentModificationError(this));
+      }
+      if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
+        this[_current$2] = null;
+        return false;
+      }
+      this[_visitedFirst] = true;
+      this[_current$2] = E._check(this[_next$0]);
+      this[_next$0] = this[_next$0][_next$0];
+      return true;
+    }
+  }
+  dart.addTypeTests(_LinkedListIterator);
+  _LinkedListIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_LinkedListIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._LinkedListIterator$(E), [LinkedListOfE()])}),
+    fields: () => ({
+      [_list]: LinkedListOfE(),
+      [_modificationCount]: core.int,
+      [_current$2]: E,
+      [_next$0]: LinkedListEntryOfE(),
+      [_visitedFirst]: core.bool
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _LinkedListIterator;
+});
+collection._LinkedListIterator = _LinkedListIterator();
+collection.LinkedListEntry$ = dart.generic(E => {
+  let LinkedListOfE = () => (LinkedListOfE = dart.constFn(collection.LinkedList$(E)))();
+  class LinkedListEntry extends core.Object {
+    new() {
+      this[_list] = null;
+      this[_next$0] = null;
+      this[_previous$0] = null;
+    }
+    get list() {
+      return this[_list];
+    }
+    unlink() {
+      this[_list][_unlink$](E._check(this));
+    }
+    get next() {
+      if (core.identical(this, this[_next$0])) return null;
+      return this[_next$0];
+    }
+    get previous() {
+      if (core.identical(this, this[_previous$0])) return null;
+      return this[_previous$0];
+    }
+    insertAfter(entry) {
+      E._check(entry);
+      this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
+    }
+    insertBefore(entry) {
+      E._check(entry);
+      this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
+    }
+  }
+  dart.addTypeTests(LinkedListEntry);
+  dart.setSignature(LinkedListEntry, {
+    fields: () => ({
+      [_list]: LinkedListOfE(),
+      [_next$0]: E,
+      [_previous$0]: E
+    }),
+    getters: () => ({
+      list: dart.definiteFunctionType(collection.LinkedList$(E), []),
+      next: dart.definiteFunctionType(E, []),
+      previous: dart.definiteFunctionType(E, [])
+    }),
+    methods: () => ({
+      unlink: dart.definiteFunctionType(dart.void, []),
+      insertAfter: dart.definiteFunctionType(dart.void, [E]),
+      insertBefore: dart.definiteFunctionType(dart.void, [E])
+    })
+  });
+  return LinkedListEntry;
+});
+collection.LinkedListEntry = LinkedListEntry();
+collection.MapMixin$ = dart.generic((K, V) => {
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let _MapBaseValueIterableOfK$V = () => (_MapBaseValueIterableOfK$V = dart.constFn(collection._MapBaseValueIterable$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  class MapMixin extends core.Object {
+    forEach(action) {
+      for (let key of this.keys) {
+        action(key, this._get(key));
+      }
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      for (let key of other[dartx.keys]) {
+        this._set(key, other[dartx._get](key));
+      }
+    }
+    containsValue(value) {
+      for (let key of this.keys) {
+        if (dart.equals(this._get(key), value)) return true;
+      }
+      return false;
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      if (dart.test(this.containsKey(key))) {
+        return this._get(key);
+      }
+      return this._set(key, ifAbsent());
+    }
+    containsKey(key) {
+      return this.keys[dartx.contains](key);
+    }
+    get length() {
+      return this.keys[dartx.length];
+    }
+    get isEmpty() {
+      return this.keys[dartx.isEmpty];
+    }
+    get isNotEmpty() {
+      return this.keys[dartx.isNotEmpty];
+    }
+    get values() {
+      return new (_MapBaseValueIterableOfK$V())(this);
+    }
+    toString() {
+      return collection.Maps.mapToString(this);
+    }
+  }
+  dart.addTypeTests(MapMixin);
+  MapMixin[dart.implements] = () => [MapOfK$V()];
+  dart.setSignature(MapMixin, {
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      values: dart.definiteFunctionType(core.Iterable$(V), [])
+    }),
+    methods: () => ({
+      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
+      containsKey: dart.definiteFunctionType(core.bool, [core.Object])
+    })
+  });
+  dart.defineExtensionMembers(MapMixin, [
+    'forEach',
+    'addAll',
+    'containsValue',
+    'putIfAbsent',
+    'containsKey',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'values'
+  ]);
+  return MapMixin;
+});
+collection.MapMixin = MapMixin();
+collection.MapBase$ = dart.generic((K, V) => {
+  class MapBase extends dart.mixin(core.Object, collection.MapMixin$(K, V)) {}
+  return MapBase;
+});
+collection.MapBase = MapBase();
+collection._UnmodifiableMapMixin$ = dart.generic((K, V) => {
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  class _UnmodifiableMapMixin extends core.Object {
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
+      return value;
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
+    }
+    clear() {
+      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
+    }
+    remove(key) {
+      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      dart.throw(new core.UnsupportedError("Cannot modify unmodifiable map"));
+    }
+  }
+  dart.addTypeTests(_UnmodifiableMapMixin);
+  _UnmodifiableMapMixin[dart.implements] = () => [MapOfK$V()];
+  dart.setSignature(_UnmodifiableMapMixin, {
+    methods: () => ({
+      _set: dart.definiteFunctionType(dart.void, [K, V]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      remove: dart.definiteFunctionType(V, [core.Object]),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()])
+    })
+  });
+  dart.defineExtensionMembers(_UnmodifiableMapMixin, [
+    '_set',
+    'addAll',
+    'clear',
+    'remove',
+    'putIfAbsent'
+  ]);
+  return _UnmodifiableMapMixin;
+});
+collection._UnmodifiableMapMixin = _UnmodifiableMapMixin();
+collection.UnmodifiableMapBase$ = dart.generic((K, V) => {
+  class UnmodifiableMapBase extends dart.mixin(collection.MapBase$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
+    new() {
+      super.new();
+    }
+  }
+  return UnmodifiableMapBase;
+});
+collection.UnmodifiableMapBase = UnmodifiableMapBase();
+collection._MapBaseValueIterable$ = dart.generic((K, V) => {
+  let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  class _MapBaseValueIterable extends core.Iterable$(V) {
+    new(map) {
+      this[_map$0] = map;
+      super.new();
+    }
+    get length() {
+      return this[_map$0][dartx.length];
+    }
+    get isEmpty() {
+      return this[_map$0][dartx.isEmpty];
+    }
+    get isNotEmpty() {
+      return this[_map$0][dartx.isNotEmpty];
+    }
+    get first() {
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
+    }
+    get single() {
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
+    }
+    get last() {
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
+    }
+    get iterator() {
+      return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
+    }
+  }
+  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_MapBaseValueIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
+    fields: () => ({[_map$0]: MapOfK$V()}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
+  });
+  dart.defineExtensionMembers(_MapBaseValueIterable, [
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'single',
+    'last',
+    'iterator'
+  ]);
+  return _MapBaseValueIterable;
+});
+collection._MapBaseValueIterable = _MapBaseValueIterable();
+collection._MapBaseValueIterator$ = dart.generic((K, V) => {
+  let IteratorOfK = () => (IteratorOfK = dart.constFn(core.Iterator$(K)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
+  class _MapBaseValueIterator extends core.Object {
+    new(map) {
+      this[_map$0] = map;
+      this[_keys] = map[dartx.keys][dartx.iterator];
+      this[_current$2] = null;
+    }
+    moveNext() {
+      if (dart.test(this[_keys].moveNext())) {
+        this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
+        return true;
+      }
+      this[_current$2] = null;
+      return false;
+    }
+    get current() {
+      return this[_current$2];
+    }
+  }
+  dart.addTypeTests(_MapBaseValueIterator);
+  _MapBaseValueIterator[dart.implements] = () => [IteratorOfV()];
+  dart.setSignature(_MapBaseValueIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
+    fields: () => ({
+      [_keys]: IteratorOfK(),
+      [_map$0]: MapOfK$V(),
+      [_current$2]: V
+    }),
+    getters: () => ({current: dart.definiteFunctionType(V, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _MapBaseValueIterator;
+});
+collection._MapBaseValueIterator = _MapBaseValueIterator();
+collection.MapView$ = dart.generic((K, V) => {
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  class MapView extends core.Object {
+    new(map) {
+      this[_map$0] = map;
+    }
+    _get(key) {
+      return this[_map$0][dartx._get](key);
+    }
+    _set(key, value) {
+      K._check(key);
+      V._check(value);
+      this[_map$0][dartx._set](key, value);
+      return value;
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      this[_map$0][dartx.addAll](other);
+    }
+    clear() {
+      this[_map$0][dartx.clear]();
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
+    }
+    containsKey(key) {
+      return this[_map$0][dartx.containsKey](key);
+    }
+    containsValue(value) {
+      return this[_map$0][dartx.containsValue](value);
+    }
+    forEach(action) {
+      this[_map$0][dartx.forEach](action);
+    }
+    get isEmpty() {
+      return this[_map$0][dartx.isEmpty];
+    }
+    get isNotEmpty() {
+      return this[_map$0][dartx.isNotEmpty];
+    }
+    get length() {
+      return this[_map$0][dartx.length];
+    }
+    get keys() {
+      return this[_map$0][dartx.keys];
+    }
+    remove(key) {
+      return this[_map$0][dartx.remove](key);
+    }
+    toString() {
+      return dart.toString(this[_map$0]);
+    }
+    get values() {
+      return this[_map$0][dartx.values];
+    }
+  }
+  dart.addTypeTests(MapView);
+  MapView[dart.implements] = () => [MapOfK$V()];
+  dart.setSignature(MapView, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
+    fields: () => ({[_map$0]: MapOfK$V()}),
+    getters: () => ({
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      length: dart.definiteFunctionType(core.int, []),
+      keys: dart.definiteFunctionType(core.Iterable$(K), []),
+      values: dart.definiteFunctionType(core.Iterable$(V), [])
+    }),
+    methods: () => ({
+      _get: dart.definiteFunctionType(V, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [K, V]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
+      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
+      remove: dart.definiteFunctionType(V, [core.Object])
+    })
+  });
+  dart.defineExtensionMembers(MapView, [
+    '_get',
+    '_set',
+    'addAll',
+    'clear',
+    'putIfAbsent',
+    'containsKey',
+    'containsValue',
+    'forEach',
+    'remove',
+    'isEmpty',
+    'isNotEmpty',
+    'length',
+    'keys',
+    'values'
+  ]);
+  return MapView;
+});
+collection.MapView = MapView();
+collection.UnmodifiableMapView$ = dart.generic((K, V) => {
+  class UnmodifiableMapView extends dart.mixin(collection.MapView$(K, V), collection._UnmodifiableMapMixin$(K, V)) {
+    new(map) {
+      super.new(map);
+    }
+  }
+  return UnmodifiableMapView;
+});
+collection.UnmodifiableMapView = UnmodifiableMapView();
+collection.Maps = class Maps extends core.Object {
+  static containsValue(map, value) {
+    for (let v of map[dartx.values]) {
+      if (dart.equals(v, value)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  static containsKey(map, key) {
+    for (let k of map[dartx.keys]) {
+      if (dart.equals(k, key)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  static putIfAbsent(map, key, ifAbsent) {
+    if (dart.test(map[dartx.containsKey](key))) {
+      return map[dartx._get](key);
+    }
+    let v = ifAbsent();
+    map[dartx._set](key, v);
+    return v;
+  }
+  static clear(map) {
+    for (let k of map[dartx.keys][dartx.toList]()) {
+      map[dartx.remove](k);
+    }
+  }
+  static forEach(map, f) {
+    for (let k of map[dartx.keys]) {
+      dart.dcall(f, k, map[dartx._get](k));
+    }
+  }
+  static getValues(map) {
+    return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
+  }
+  static length(map) {
+    return map[dartx.keys][dartx.length];
+  }
+  static isEmpty(map) {
+    return map[dartx.keys][dartx.isEmpty];
+  }
+  static isNotEmpty(map) {
+    return map[dartx.keys][dartx.isNotEmpty];
+  }
+  static mapToString(m) {
+    if (dart.test(collection._isToStringVisiting(m))) {
+      return '{...}';
+    }
+    let result = new core.StringBuffer();
+    try {
+      collection._toStringVisiting[dartx.add](m);
+      result.write('{');
+      let first = true;
+      m[dartx.forEach](dart.fn((k, v) => {
+        if (!first) {
+          result.write(', ');
+        }
+        first = false;
+        result.write(k);
+        result.write(': ');
+        result.write(v);
+      }, dynamicAnddynamicToNull()));
+      result.write('}');
+    } finally {
+      dart.assert(core.identical(collection._toStringVisiting[dartx.last], m));
+      collection._toStringVisiting[dartx.removeLast]();
+    }
+    return result.toString();
+  }
+  static _id(x) {
+    return x;
+  }
+  static _fillMapWithMappedIterable(map, iterable, key, value) {
+    if (key == null) key = collection.Maps._id;
+    if (value == null) value = collection.Maps._id;
+    for (let element of iterable) {
+      map[dartx._set](dart.dcall(key, element), dart.dcall(value, element));
+    }
+  }
+  static _fillMapWithIterables(map, keys, values) {
+    let keyIterator = keys[dartx.iterator];
+    let valueIterator = values[dartx.iterator];
+    let hasNextKey = keyIterator.moveNext();
+    let hasNextValue = valueIterator.moveNext();
+    while (dart.test(hasNextKey) && dart.test(hasNextValue)) {
+      map[dartx._set](keyIterator.current, valueIterator.current);
+      hasNextKey = keyIterator.moveNext();
+      hasNextValue = valueIterator.moveNext();
+    }
+    if (dart.test(hasNextKey) || dart.test(hasNextValue)) {
+      dart.throw(new core.ArgumentError("Iterables do not have same length."));
+    }
+  }
+};
+dart.setSignature(collection.Maps, {
+  statics: () => ({
+    containsValue: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
+    containsKey: dart.definiteFunctionType(core.bool, [core.Map, core.Object]),
+    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [core.Map, dart.dynamic, VoidTodynamic()]),
+    clear: dart.definiteFunctionType(dart.dynamic, [core.Map]),
+    forEach: dart.definiteFunctionType(dart.dynamic, [core.Map, dynamicAnddynamicTovoid()]),
+    getValues: dart.definiteFunctionType(core.Iterable, [core.Map]),
+    length: dart.definiteFunctionType(core.int, [core.Map]),
+    isEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [core.Map]),
+    mapToString: dart.definiteFunctionType(core.String, [core.Map]),
+    _id: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _fillMapWithMappedIterable: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, dynamicTodynamic(), dynamicTodynamic()]),
+    _fillMapWithIterables: dart.definiteFunctionType(dart.void, [core.Map, core.Iterable, core.Iterable])
+  }),
+  names: ['containsValue', 'containsKey', 'putIfAbsent', 'clear', 'forEach', 'getValues', 'length', 'isEmpty', 'isNotEmpty', 'mapToString', '_id', '_fillMapWithMappedIterable', '_fillMapWithIterables']
+});
+collection.Queue$ = dart.generic(E => {
+  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class Queue extends core.Object {
+    static new() {
+      return new (ListQueueOfE())();
+    }
+    static from(elements) {
+      return ListQueueOfE().from(elements);
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this.iterator);
+    }
+  }
+  dart.addTypeTests(Queue);
+  Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  dart.setSignature(Queue, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.Queue$(E), []),
+      from: dart.definiteFunctionType(collection.Queue$(E), [core.Iterable])
+    })
+  });
+  return Queue;
+});
+collection.Queue = Queue();
+const _previousLink = Symbol('_previousLink');
+const _nextLink = Symbol('_nextLink');
+const _link = Symbol('_link');
+collection._DoubleLink$ = dart.generic(E => {
+  class _DoubleLink extends core.Object {
+    new() {
+      this[_previousLink] = null;
+      this[_nextLink] = null;
+    }
+    [_link](previous, next) {
+      E._check(previous);
+      E._check(next);
+      this[_nextLink] = next;
+      this[_previousLink] = previous;
+      if (previous != null) previous[_nextLink] = this;
+      if (next != null) next[_previousLink] = this;
+    }
+    [_unlink$]() {
+      if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
+      if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
+      this[_nextLink] = null;
+      this[_previousLink] = null;
+    }
+  }
+  dart.addTypeTests(_DoubleLink);
+  dart.setSignature(_DoubleLink, {
+    fields: () => ({
+      [_previousLink]: E,
+      [_nextLink]: E
+    }),
+    methods: () => ({
+      [_link]: dart.definiteFunctionType(dart.void, [E, E]),
+      [_unlink$]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _DoubleLink;
+});
+collection._DoubleLink = _DoubleLink();
+collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
+  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
+  class DoubleLinkedQueueEntry extends core.Object {
+    static new(element) {
+      return new (_UserDoubleLinkedQueueEntryOfE())(element);
+    }
+  }
+  dart.addTypeTests(DoubleLinkedQueueEntry);
+  dart.setSignature(DoubleLinkedQueueEntry, {
+    constructors: () => ({new: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [E])})
+  });
+  return DoubleLinkedQueueEntry;
+});
+collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
+collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
+  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
+  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
+  class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
+    new(element) {
+      this.element = element;
+      super.new();
+    }
+    append(e) {
+      E._check(e);
+      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
+    }
+    prepend(e) {
+      E._check(e);
+      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
+    }
+    remove() {
+      this[_unlink$]();
+      return this.element;
+    }
+    previousEntry() {
+      return this[_previousLink];
+    }
+    nextEntry() {
+      return this[_nextLink];
+    }
+  }
+  _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
+  dart.setSignature(_UserDoubleLinkedQueueEntry, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._UserDoubleLinkedQueueEntry$(E), [E])}),
+    fields: () => ({element: E}),
+    methods: () => ({
+      append: dart.definiteFunctionType(dart.void, [E]),
+      prepend: dart.definiteFunctionType(dart.void, [E]),
+      remove: dart.definiteFunctionType(E, []),
+      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+    })
+  });
+  return _UserDoubleLinkedQueueEntry;
+}, _UserDoubleLinkedQueueEntry => {
+  dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
+});
+collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
+const _queue = Symbol('_queue');
+const _append = Symbol('_append');
+const _prepend = Symbol('_prepend');
+const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
+collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
+  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
+  class _DoubleLinkedQueueEntry extends collection._DoubleLink {
+    new(queue) {
+      this[_queue] = queue;
+      super.new();
+    }
+    [_append](e) {
+      E._check(e);
+      new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this, this[_nextLink]);
+    }
+    [_prepend](e) {
+      E._check(e);
+      new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
+    }
+    nextEntry() {
+      return this[_nextLink][_asNonSentinelEntry]();
+    }
+    previousEntry() {
+      return this[_previousLink][_asNonSentinelEntry]();
+    }
+  }
+  dart.setSignature(_DoubleLinkedQueueEntry, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueEntry$(E), [DoubleLinkedQueueOfE()])}),
+    fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
+    methods: () => ({
+      [_append]: dart.definiteFunctionType(dart.void, [E]),
+      [_prepend]: dart.definiteFunctionType(dart.void, [E]),
+      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+    })
+  });
+  return _DoubleLinkedQueueEntry;
+}, _DoubleLinkedQueueEntry => {
+  dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
+});
+collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
+const _elementCount = Symbol('_elementCount');
+collection._DoubleLinkedQueueElement$ = dart.generic(E => {
+  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
+  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
+  class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
+    new(element, queue) {
+      this.element = element;
+      super.new(queue);
+    }
+    append(e) {
+      E._check(e);
+      this[_append](e);
+      if (this[_queue] != null) {
+        let o = this[_queue];
+        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
+      }
+    }
+    prepend(e) {
+      E._check(e);
+      this[_prepend](e);
+      if (this[_queue] != null) {
+        let o = this[_queue];
+        o[_elementCount] = dart.notNull(o[_elementCount]) + 1;
+      }
+    }
+    [_remove]() {
+      this[_queue] = null;
+      this[_unlink$]();
+      return this.element;
+    }
+    remove() {
+      if (this[_queue] != null) {
+        let o = this[_queue];
+        o[_elementCount] = dart.notNull(o[_elementCount]) - 1;
+      }
+      return this[_remove]();
+    }
+    [_asNonSentinelEntry]() {
+      return this;
+    }
+  }
+  _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
+  dart.setSignature(_DoubleLinkedQueueElement, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [E, DoubleLinkedQueueOfE()])}),
+    fields: () => ({element: E}),
+    methods: () => ({
+      append: dart.definiteFunctionType(dart.void, [E]),
+      prepend: dart.definiteFunctionType(dart.void, [E]),
+      [_remove]: dart.definiteFunctionType(E, []),
+      remove: dart.definiteFunctionType(E, []),
+      [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
+    })
+  });
+  return _DoubleLinkedQueueElement;
+});
+collection._DoubleLinkedQueueElement = _DoubleLinkedQueueElement();
+collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
+  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
+  class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
+    new(queue) {
+      super.new(queue);
+      this[_previousLink] = this;
+      this[_nextLink] = this;
+    }
+    [_asNonSentinelEntry]() {
+      return null;
+    }
+    [_remove]() {
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+    get element() {
+      dart.throw(_internal.IterableElementError.noElement());
+    }
+  }
+  dart.setSignature(_DoubleLinkedQueueSentinel, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueSentinel$(E), [DoubleLinkedQueueOfE()])}),
+    getters: () => ({element: dart.definiteFunctionType(E, [])}),
+    methods: () => ({
+      [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      [_remove]: dart.definiteFunctionType(E, [])
+    })
+  });
+  return _DoubleLinkedQueueSentinel;
+});
+collection._DoubleLinkedQueueSentinel = _DoubleLinkedQueueSentinel();
+const _sentinel = Symbol('_sentinel');
+collection.DoubleLinkedQueue$ = dart.generic(E => {
+  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
+  let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+  let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
+  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
+  let DoubleLinkedQueueEntryOfETovoid = () => (DoubleLinkedQueueEntryOfETovoid = dart.constFn(dart.functionType(dart.void, [DoubleLinkedQueueEntryOfE()])))();
+  class DoubleLinkedQueue extends core.Iterable$(E) {
+    new() {
+      this[_sentinel] = null;
+      this[_elementCount] = 0;
+      super.new();
+      this[_sentinel] = new (_DoubleLinkedQueueSentinelOfE())(this);
+    }
+    static from(elements) {
+      let list = new (DoubleLinkedQueueOfE())();
+      for (let e of elements) {
+        let element = E.as(e);
+        list.addLast(element);
+      }
+      return DoubleLinkedQueueOfE()._check(list);
+    }
+    get length() {
+      return this[_elementCount];
+    }
+    addLast(value) {
+      E._check(value);
+      this[_sentinel][_prepend](value);
+      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
+    }
+    addFirst(value) {
+      E._check(value);
+      this[_sentinel][_append](value);
+      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
+    }
+    add(value) {
+      E._check(value);
+      this[_sentinel][_prepend](value);
+      this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
+    }
+    addAll(iterable) {
+      IterableOfE()._check(iterable);
+      for (let value of iterable) {
+        this[_sentinel][_prepend](value);
+        this[_elementCount] = dart.notNull(this[_elementCount]) + 1;
+      }
+    }
+    removeLast() {
+      let lastEntry = this[_sentinel][_previousLink];
+      let result = lastEntry[_remove]();
+      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
+      return result;
+    }
+    removeFirst() {
+      let firstEntry = this[_sentinel][_nextLink];
+      let result = firstEntry[_remove]();
+      this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
+      return result;
+    }
+    remove(o) {
+      let entry = this[_sentinel][_nextLink];
+      while (!core.identical(entry, this[_sentinel])) {
+        if (dart.equals(entry.element, o)) {
+          entry[_remove]();
+          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
+          return true;
+        }
+        entry = entry[_nextLink];
+      }
+      return false;
+    }
+    [_filter](test, removeMatching) {
+      let entry = this[_sentinel][_nextLink];
+      while (!core.identical(entry, this[_sentinel])) {
+        let next = entry[_nextLink];
+        if (core.identical(removeMatching, test(entry.element))) {
+          entry[_remove]();
+          this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
+        }
+        entry = next;
+      }
+    }
+    removeWhere(test) {
+      this[_filter](test, true);
+    }
+    retainWhere(test) {
+      this[_filter](test, false);
+    }
+    get first() {
+      let firstEntry = this[_sentinel][_nextLink];
+      return firstEntry.element;
+    }
+    get last() {
+      let lastEntry = this[_sentinel][_previousLink];
+      return lastEntry.element;
+    }
+    get single() {
+      if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
+        let entry = this[_sentinel][_nextLink];
+        return entry.element;
+      }
+      dart.throw(_internal.IterableElementError.tooMany());
+    }
+    lastEntry() {
+      return this[_sentinel].previousEntry();
+    }
+    firstEntry() {
+      return this[_sentinel].nextEntry();
+    }
+    get isEmpty() {
+      return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
+    }
+    clear() {
+      this[_sentinel][_nextLink] = this[_sentinel];
+      this[_sentinel][_previousLink] = this[_sentinel];
+      this[_elementCount] = 0;
+    }
+    forEachEntry(f) {
+      let entry = this[_sentinel][_nextLink];
+      while (!core.identical(entry, this[_sentinel])) {
+        let nextEntry = entry[_nextLink];
+        let element = _DoubleLinkedQueueElementOfE()._check(entry);
+        f(element);
+        entry = nextEntry;
+      }
+    }
+    get iterator() {
+      return new (_DoubleLinkedQueueIteratorOfE())(this[_sentinel]);
+    }
+    toString() {
+      return collection.IterableBase.iterableToFullString(this, '{', '}');
+    }
+  }
+  DoubleLinkedQueue[dart.implements] = () => [QueueOfE()];
+  dart.setSignature(DoubleLinkedQueue, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), []),
+      from: dart.definiteFunctionType(collection.DoubleLinkedQueue$(E), [core.Iterable])
+    }),
+    fields: () => ({
+      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
+      [_elementCount]: core.int
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [])}),
+    methods: () => ({
+      addLast: dart.definiteFunctionType(dart.void, [E]),
+      addFirst: dart.definiteFunctionType(dart.void, [E]),
+      add: dart.definiteFunctionType(dart.void, [E]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      removeLast: dart.definiteFunctionType(E, []),
+      removeFirst: dart.definiteFunctionType(E, []),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      clear: dart.definiteFunctionType(dart.void, []),
+      forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
+    })
+  });
+  dart.defineExtensionMembers(DoubleLinkedQueue, [
+    'toString',
+    'length',
+    'first',
+    'last',
+    'single',
+    'isEmpty',
+    'iterator'
+  ]);
+  return DoubleLinkedQueue;
+});
+collection.DoubleLinkedQueue = DoubleLinkedQueue();
+const _nextEntry = Symbol('_nextEntry');
+collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
+  let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
+  class _DoubleLinkedQueueIterator extends core.Object {
+    new(sentinel) {
+      this[_sentinel] = sentinel;
+      this[_nextEntry] = sentinel[_nextLink];
+      this[_current$2] = null;
+    }
+    moveNext() {
+      if (core.identical(this[_nextEntry], this[_sentinel])) {
+        this[_current$2] = null;
+        this[_nextEntry] = null;
+        this[_sentinel] = null;
+        return false;
+      }
+      let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
+      if (elementEntry[_queue] == null) {
+        dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
+      }
+      this[_current$2] = elementEntry.element;
+      this[_nextEntry] = elementEntry[_nextLink];
+      return true;
+    }
+    get current() {
+      return this[_current$2];
+    }
+  }
+  dart.addTypeTests(_DoubleLinkedQueueIterator);
+  _DoubleLinkedQueueIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_DoubleLinkedQueueIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._DoubleLinkedQueueIterator$(E), [_DoubleLinkedQueueSentinelOfE()])}),
+    fields: () => ({
+      [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
+      [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
+      [_current$2]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _DoubleLinkedQueueIterator;
+});
+collection._DoubleLinkedQueueIterator = _DoubleLinkedQueueIterator();
+const _head = Symbol('_head');
+const _tail = Symbol('_tail');
+const _table = Symbol('_table');
+const _checkModification = Symbol('_checkModification');
+const _writeToList = Symbol('_writeToList');
+const _preGrow = Symbol('_preGrow');
+const _grow = Symbol('_grow');
+collection.ListQueue$ = dart.generic(E => {
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
+  let _ListQueueIteratorOfE = () => (_ListQueueIteratorOfE = dart.constFn(collection._ListQueueIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
+  let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  class ListQueue extends core.Iterable$(E) {
+    new(initialCapacity) {
+      if (initialCapacity === void 0) initialCapacity = null;
+      this[_head] = 0;
+      this[_tail] = 0;
+      this[_table] = null;
+      this[_modificationCount] = 0;
+      super.new();
+      if (initialCapacity == null || dart.notNull(initialCapacity) < collection.ListQueue._INITIAL_CAPACITY) {
+        initialCapacity = collection.ListQueue._INITIAL_CAPACITY;
+      } else if (!dart.test(collection.ListQueue._isPowerOf2(initialCapacity))) {
+        initialCapacity = collection.ListQueue._nextPowerOf2(initialCapacity);
+      }
+      dart.assert(collection.ListQueue._isPowerOf2(initialCapacity));
+      this[_table] = ListOfE().new(initialCapacity);
+    }
+    static from(elements) {
+      if (core.List.is(elements)) {
+        let length = elements[dartx.length];
+        let queue = new (ListQueueOfE())(dart.notNull(length) + 1);
+        dart.assert(dart.notNull(queue[_table][dartx.length]) > dart.notNull(length));
+        for (let i = 0; i < dart.notNull(length); i++) {
+          queue[_table][dartx._set](i, E.as(elements[dartx._get](i)));
+        }
+        queue[_tail] = length;
+        return queue;
+      } else {
+        let capacity = collection.ListQueue._INITIAL_CAPACITY;
+        if (_internal.EfficientLength.is(elements)) {
+          capacity = elements[dartx.length];
+        }
+        let result = new (ListQueueOfE())(capacity);
+        for (let element of elements) {
+          result.addLast(E.as(element));
+        }
+        return result;
+      }
+    }
+    get iterator() {
+      return new (_ListQueueIteratorOfE())(this);
+    }
+    forEach(action) {
+      let modificationCount = this[_modificationCount];
+      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
+        action(this[_table][dartx._get](i));
+        this[_checkModification](modificationCount);
+      }
+    }
+    get isEmpty() {
+      return this[_head] == this[_tail];
+    }
+    get length() {
+      return (dart.notNull(this[_tail]) - dart.notNull(this[_head]) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+    }
+    get first() {
+      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
+      return this[_table][dartx._get](this[_head]);
+    }
+    get last() {
+      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
+      return this[_table][dartx._get]((dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
+    }
+    get single() {
+      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
+      if (dart.notNull(this.length) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      return this[_table][dartx._get](this[_head]);
+    }
+    elementAt(index) {
+      core.RangeError.checkValidIndex(index, this);
+      return this[_table][dartx._get]((dart.notNull(this[_head]) + dart.notNull(index) & dart.notNull(this[_table][dartx.length]) - 1) >>> 0);
+    }
+    toList(opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let list = null;
+      if (dart.test(growable)) {
+        list = ListOfE().new();
+        list[dartx.length] = this.length;
+      } else {
+        list = ListOfE().new(this.length);
+      }
+      this[_writeToList](list);
+      return list;
+    }
+    add(value) {
+      E._check(value);
+      this[_add$0](value);
+    }
+    addAll(elements) {
+      IterableOfE()._check(elements);
+      if (ListOfE().is(elements)) {
+        let list = elements;
+        let addCount = list[dartx.length];
+        let length = this.length;
+        if (dart.notNull(length) + dart.notNull(addCount) >= dart.notNull(this[_table][dartx.length])) {
+          this[_preGrow](dart.notNull(length) + dart.notNull(addCount));
+          this[_table][dartx.setRange](length, dart.notNull(length) + dart.notNull(addCount), list, 0);
+          this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
+        } else {
+          let endSpace = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_tail]);
+          if (dart.notNull(addCount) < endSpace) {
+            this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + dart.notNull(addCount), list, 0);
+            this[_tail] = dart.notNull(this[_tail]) + dart.notNull(addCount);
+          } else {
+            let preSpace = dart.notNull(addCount) - endSpace;
+            this[_table][dartx.setRange](this[_tail], dart.notNull(this[_tail]) + endSpace, list, 0);
+            this[_table][dartx.setRange](0, preSpace, list, endSpace);
+            this[_tail] = preSpace;
+          }
+        }
+        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      } else {
+        for (let element of elements)
+          this[_add$0](element);
+      }
+    }
+    remove(value) {
+      for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
+        let element = this[_table][dartx._get](i);
+        if (dart.equals(element, value)) {
+          this[_remove](i);
+          this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+          return true;
+        }
+      }
+      return false;
+    }
+    [_filterWhere](test, removeMatching) {
+      let modificationCount = this[_modificationCount];
+      let i = this[_head];
+      while (i != this[_tail]) {
+        let element = this[_table][dartx._get](i);
+        let remove = core.identical(removeMatching, test(element));
+        this[_checkModification](modificationCount);
+        if (remove) {
+          i = this[_remove](i);
+          modificationCount = this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+        } else {
+          i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+        }
+      }
+    }
+    removeWhere(test) {
+      this[_filterWhere](test, true);
+    }
+    retainWhere(test) {
+      this[_filterWhere](test, false);
+    }
+    clear() {
+      if (this[_head] != this[_tail]) {
+        for (let i = this[_head]; i != this[_tail]; i = (dart.notNull(i) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0) {
+          this[_table][dartx._set](i, null);
+        }
+        this[_head] = this[_tail] = 0;
+        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      }
+    }
+    toString() {
+      return collection.IterableBase.iterableToFullString(this, "{", "}");
+    }
+    addLast(value) {
+      E._check(value);
+      this[_add$0](value);
+    }
+    addFirst(value) {
+      E._check(value);
+      this[_head] = (dart.notNull(this[_head]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+      this[_table][dartx._set](this[_head], value);
+      if (this[_head] == this[_tail]) this[_grow]();
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+    }
+    removeFirst() {
+      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      let result = this[_table][dartx._get](this[_head]);
+      this[_table][dartx._set](this[_head], null);
+      this[_head] = (dart.notNull(this[_head]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+      return result;
+    }
+    removeLast() {
+      if (this[_head] == this[_tail]) dart.throw(_internal.IterableElementError.noElement());
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      this[_tail] = (dart.notNull(this[_tail]) - 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+      let result = this[_table][dartx._get](this[_tail]);
+      this[_table][dartx._set](this[_tail], null);
+      return result;
+    }
+    static _isPowerOf2(number) {
+      return (dart.notNull(number) & dart.notNull(number) - 1) == 0;
+    }
+    static _nextPowerOf2(number) {
+      dart.assert(dart.notNull(number) > 0);
+      number = (dart.notNull(number) << 1 >>> 0) - 1;
+      for (;;) {
+        let nextNumber = (dart.notNull(number) & dart.notNull(number) - 1) >>> 0;
+        if (nextNumber == 0) return number;
+        number = nextNumber;
+      }
+    }
+    [_checkModification](expectedModificationCount) {
+      if (expectedModificationCount != this[_modificationCount]) {
+        dart.throw(new core.ConcurrentModificationError(this));
+      }
+    }
+    [_add$0](element) {
+      E._check(element);
+      this[_table][dartx._set](this[_tail], element);
+      this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
+      if (this[_head] == this[_tail]) this[_grow]();
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+    }
+    [_remove](offset) {
+      let mask = dart.notNull(this[_table][dartx.length]) - 1;
+      let startDistance = (dart.notNull(offset) - dart.notNull(this[_head]) & mask) >>> 0;
+      let endDistance = (dart.notNull(this[_tail]) - dart.notNull(offset) & mask) >>> 0;
+      if (startDistance < endDistance) {
+        let i = offset;
+        while (i != this[_head]) {
+          let prevOffset = (dart.notNull(i) - 1 & mask) >>> 0;
+          this[_table][dartx._set](i, this[_table][dartx._get](prevOffset));
+          i = prevOffset;
+        }
+        this[_table][dartx._set](this[_head], null);
+        this[_head] = (dart.notNull(this[_head]) + 1 & mask) >>> 0;
+        return (dart.notNull(offset) + 1 & mask) >>> 0;
+      } else {
+        this[_tail] = (dart.notNull(this[_tail]) - 1 & mask) >>> 0;
+        let i = offset;
+        while (i != this[_tail]) {
+          let nextOffset = (dart.notNull(i) + 1 & mask) >>> 0;
+          this[_table][dartx._set](i, this[_table][dartx._get](nextOffset));
+          i = nextOffset;
+        }
+        this[_table][dartx._set](this[_tail], null);
+        return offset;
+      }
+    }
+    [_grow]() {
+      let newTable = ListOfE().new(dart.notNull(this[_table][dartx.length]) * 2);
+      let split = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
+      newTable[dartx.setRange](0, split, this[_table], this[_head]);
+      newTable[dartx.setRange](split, split + dart.notNull(this[_head]), this[_table], 0);
+      this[_head] = 0;
+      this[_tail] = this[_table][dartx.length];
+      this[_table] = newTable;
+    }
+    [_writeToList](target) {
+      ListOfE()._check(target);
+      dart.assert(dart.notNull(target[dartx.length]) >= dart.notNull(this.length));
+      if (dart.notNull(this[_head]) <= dart.notNull(this[_tail])) {
+        let length = dart.notNull(this[_tail]) - dart.notNull(this[_head]);
+        target[dartx.setRange](0, length, this[_table], this[_head]);
+        return length;
+      } else {
+        let firstPartSize = dart.notNull(this[_table][dartx.length]) - dart.notNull(this[_head]);
+        target[dartx.setRange](0, firstPartSize, this[_table], this[_head]);
+        target[dartx.setRange](firstPartSize, firstPartSize + dart.notNull(this[_tail]), this[_table], 0);
+        return dart.notNull(this[_tail]) + firstPartSize;
+      }
+    }
+    [_preGrow](newElementCount) {
+      dart.assert(dart.notNull(newElementCount) >= dart.notNull(this.length));
+      newElementCount = dart.notNull(newElementCount) + newElementCount[dartx['>>']](1);
+      let newCapacity = collection.ListQueue._nextPowerOf2(newElementCount);
+      let newTable = ListOfE().new(newCapacity);
+      this[_tail] = this[_writeToList](newTable);
+      this[_table] = newTable;
+      this[_head] = 0;
+    }
+  }
+  ListQueue[dart.implements] = () => [QueueOfE()];
+  dart.setSignature(ListQueue, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.ListQueue$(E), [], [core.int]),
+      from: dart.definiteFunctionType(collection.ListQueue$(E), [core.Iterable])
+    }),
+    fields: () => ({
+      [_table]: ListOfE(),
+      [_head]: core.int,
+      [_tail]: core.int,
+      [_modificationCount]: core.int
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [E]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      addLast: dart.definiteFunctionType(dart.void, [E]),
+      addFirst: dart.definiteFunctionType(dart.void, [E]),
+      removeFirst: dart.definiteFunctionType(E, []),
+      removeLast: dart.definiteFunctionType(E, []),
+      [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
+      [_add$0]: dart.definiteFunctionType(dart.void, [E]),
+      [_remove]: dart.definiteFunctionType(core.int, [core.int]),
+      [_grow]: dart.definiteFunctionType(dart.void, []),
+      [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
+      [_preGrow]: dart.definiteFunctionType(dart.void, [core.int])
+    }),
+    sfields: () => ({_INITIAL_CAPACITY: core.int}),
+    statics: () => ({
+      _isPowerOf2: dart.definiteFunctionType(core.bool, [core.int]),
+      _nextPowerOf2: dart.definiteFunctionType(core.int, [core.int])
+    }),
+    names: ['_isPowerOf2', '_nextPowerOf2']
+  });
+  dart.defineExtensionMembers(ListQueue, [
+    'forEach',
+    'elementAt',
+    'toList',
+    'toString',
+    'iterator',
+    'isEmpty',
+    'length',
+    'first',
+    'last',
+    'single'
+  ]);
+  return ListQueue;
+});
+collection.ListQueue = ListQueue();
+collection.ListQueue._INITIAL_CAPACITY = 8;
+const _end = Symbol('_end');
+const _position = Symbol('_position');
+collection._ListQueueIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
+  class _ListQueueIterator extends core.Object {
+    new(queue) {
+      this[_queue] = queue;
+      this[_end] = queue[_tail];
+      this[_modificationCount] = queue[_modificationCount];
+      this[_position] = queue[_head];
+      this[_current$2] = null;
+    }
+    get current() {
+      return this[_current$2];
+    }
+    moveNext() {
+      this[_queue][_checkModification](this[_modificationCount]);
+      if (this[_position] == this[_end]) {
+        this[_current$2] = null;
+        return false;
+      }
+      this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
+      this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
+      return true;
+    }
+  }
+  dart.addTypeTests(_ListQueueIterator);
+  _ListQueueIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_ListQueueIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._ListQueueIterator$(E), [ListQueueOfE()])}),
+    fields: () => ({
+      [_queue]: ListQueueOfE(),
+      [_end]: core.int,
+      [_modificationCount]: core.int,
+      [_position]: core.int,
+      [_current$2]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _ListQueueIterator;
+});
+collection._ListQueueIterator = _ListQueueIterator();
+collection._Predicate$ = dart.generic(T => {
+  const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
+  return _Predicate;
+});
+collection._Predicate = _Predicate$();
+collection._SplayTreeNode$ = dart.generic(K => {
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  class _SplayTreeNode extends core.Object {
+    new(key) {
+      this.key = key;
+      this.left = null;
+      this.right = null;
+    }
+  }
+  dart.addTypeTests(_SplayTreeNode);
+  dart.setSignature(_SplayTreeNode, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeNode$(K), [K])}),
+    fields: () => ({
+      key: K,
+      left: _SplayTreeNodeOfK(),
+      right: _SplayTreeNodeOfK()
+    })
+  });
+  return _SplayTreeNode;
+});
+collection._SplayTreeNode = _SplayTreeNode();
+collection._SplayTreeMapNode$ = dart.generic((K, V) => {
+  class _SplayTreeMapNode extends collection._SplayTreeNode$(K) {
+    new(key, value) {
+      this.value = value;
+      super.new(key);
+    }
+  }
+  dart.setSignature(_SplayTreeMapNode, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeMapNode$(K, V), [K, V])}),
+    fields: () => ({value: V})
+  });
+  return _SplayTreeMapNode;
+});
+collection._SplayTreeMapNode = _SplayTreeMapNode();
+const _count$ = Symbol('_count');
+const _splayCount = Symbol('_splayCount');
+const _root = Symbol('_root');
+const _dummy = Symbol('_dummy');
+const _comparator = Symbol('_comparator');
+const _compare = Symbol('_compare');
+const _splay = Symbol('_splay');
+const _splayMin = Symbol('_splayMin');
+const _splayMax = Symbol('_splayMax');
+const _addNewRoot = Symbol('_addNewRoot');
+const _clear$ = Symbol('_clear');
+collection._SplayTree$ = dart.generic((K, Node) => {
+  class _SplayTree extends core.Object {
+    new() {
+      this[_count$] = 0;
+      this[_modificationCount] = 0;
+      this[_splayCount] = 0;
+    }
+    [_splay](key) {
+      K._check(key);
+      if (this[_root] == null) return -1;
+      let left = this[_dummy];
+      let right = this[_dummy];
+      let current = this[_root];
+      let comp = null;
+      while (true) {
+        comp = this[_compare](current.key, key);
+        if (dart.notNull(comp) > 0) {
+          if (current.left == null) break;
+          comp = this[_compare](current.left.key, key);
+          if (dart.notNull(comp) > 0) {
+            let tmp = current.left;
+            current.left = tmp.right;
+            tmp.right = current;
+            current = Node._check(tmp);
+            if (current.left == null) break;
+          }
+          right.left = current;
+          right = current;
+          current = Node._check(current.left);
+        } else if (dart.notNull(comp) < 0) {
+          if (current.right == null) break;
+          comp = this[_compare](current.right.key, key);
+          if (dart.notNull(comp) < 0) {
+            let tmp = Node._check(current.right);
+            current.right = tmp.left;
+            tmp.left = current;
+            current = tmp;
+            if (current.right == null) break;
+          }
+          left.right = current;
+          left = current;
+          current = Node._check(current.right);
+        } else {
+          break;
+        }
+      }
+      left.right = current.left;
+      right.left = current.right;
+      current.left = this[_dummy].right;
+      current.right = this[_dummy].left;
+      this[_root] = current;
+      this[_dummy].right = null;
+      this[_dummy].left = null;
+      this[_splayCount] = dart.notNull(this[_splayCount]) + 1;
+      return comp;
+    }
+    [_splayMin](node) {
+      Node._check(node);
+      let current = node;
+      while (current.left != null) {
+        let left = Node._check(current.left);
+        current.left = left.right;
+        left.right = current;
+        current = left;
+      }
+      return current;
+    }
+    [_splayMax](node) {
+      Node._check(node);
+      let current = node;
+      while (current.right != null) {
+        let right = Node._check(current.right);
+        current.right = right.left;
+        right.left = current;
+        current = right;
+      }
+      return current;
+    }
+    [_remove](key) {
+      K._check(key);
+      if (this[_root] == null) return null;
+      let comp = this[_splay](key);
+      if (comp != 0) return null;
+      let result = this[_root];
+      this[_count$] = dart.notNull(this[_count$]) - 1;
+      if (this[_root].left == null) {
+        this[_root] = Node._check(this[_root].right);
+      } else {
+        let right = Node._check(this[_root].right);
+        this[_root] = this[_splayMax](Node._check(this[_root].left));
+        this[_root].right = right;
+      }
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      return result;
+    }
+    [_addNewRoot](node, comp) {
+      Node._check(node);
+      this[_count$] = dart.notNull(this[_count$]) + 1;
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      if (this[_root] == null) {
+        this[_root] = node;
+        return;
+      }
+      if (dart.notNull(comp) < 0) {
+        node.left = this[_root];
+        node.right = this[_root].right;
+        this[_root].right = null;
+      } else {
+        node.right = this[_root];
+        node.left = this[_root].left;
+        this[_root].left = null;
+      }
+      this[_root] = node;
+    }
+    get [_first$]() {
+      if (this[_root] == null) return null;
+      this[_root] = this[_splayMin](this[_root]);
+      return this[_root];
+    }
+    get [_last$]() {
+      if (this[_root] == null) return null;
+      this[_root] = this[_splayMax](this[_root]);
+      return this[_root];
+    }
+    [_clear$]() {
+      this[_root] = null;
+      this[_count$] = 0;
+      this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+    }
+  }
+  dart.addTypeTests(_SplayTree);
+  dart.setSignature(_SplayTree, {
+    fields: () => ({
+      [_count$]: core.int,
+      [_modificationCount]: core.int,
+      [_splayCount]: core.int
+    }),
+    getters: () => ({
+      [_first$]: dart.definiteFunctionType(Node, []),
+      [_last$]: dart.definiteFunctionType(Node, [])
+    }),
+    methods: () => ({
+      [_splay]: dart.definiteFunctionType(core.int, [K]),
+      [_splayMin]: dart.definiteFunctionType(Node, [Node]),
+      [_splayMax]: dart.definiteFunctionType(Node, [Node]),
+      [_remove]: dart.definiteFunctionType(Node, [K]),
+      [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
+      [_clear$]: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _SplayTree;
+});
+collection._SplayTree = _SplayTree();
+collection._TypeTest$ = dart.generic(T => {
+  class _TypeTest extends core.Object {
+    test(v) {
+      return T.is(v);
+    }
+  }
+  dart.addTypeTests(_TypeTest);
+  dart.setSignature(_TypeTest, {
+    methods: () => ({test: dart.definiteFunctionType(core.bool, [dart.dynamic])})
+  });
+  return _TypeTest;
+});
+collection._TypeTest = _TypeTest();
+collection.SplayTreeMap$ = dart.generic((K, V) => {
+  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
+  let ComparatorOfK = () => (ComparatorOfK = dart.constFn(core.Comparator$(K)))();
+  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let _SplayTreeNodeIteratorOfK = () => (_SplayTreeNodeIteratorOfK = dart.constFn(collection._SplayTreeNodeIterator$(K)))();
+  let _SplayTreeKeyIterableOfK = () => (_SplayTreeKeyIterableOfK = dart.constFn(collection._SplayTreeKeyIterable$(K)))();
+  let _SplayTreeValueIterableOfK$V = () => (_SplayTreeValueIterableOfK$V = dart.constFn(collection._SplayTreeValueIterable$(K, V)))();
+  let KAndVTovoid = () => (KAndVTovoid = dart.constFn(dart.functionType(dart.void, [K, V])))();
+  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
+  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
+  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
+  let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
+  class SplayTreeMap extends collection._SplayTree$(K, collection._SplayTreeMapNode$(K, V)) {
+    new(compare, isValidKey) {
+      if (compare === void 0) compare = null;
+      if (isValidKey === void 0) isValidKey = null;
+      this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
+      this[_comparator] = (() => {
+        let l = compare;
+        return l != null ? l : ComparatorOfK().as(core.Comparable.compare);
+      })();
+      this[_validKey] = (() => {
+        let l = isValidKey;
+        return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
+      })();
+      this[_root] = null;
+      super.new();
+    }
+    static from(other, compare, isValidKey) {
+      if (compare === void 0) compare = null;
+      if (isValidKey === void 0) isValidKey = null;
+      let result = new (SplayTreeMapOfK$V())(compare, isValidKey);
+      other[dartx.forEach](dart.fn((k, v) => {
+        result._set(K.as(k), V.as(v));
+      }, dynamicAnddynamicToNull()));
+      return result;
+    }
+    static fromIterable(iterable, opts) {
+      let key = opts && 'key' in opts ? opts.key : null;
+      let value = opts && 'value' in opts ? opts.value : null;
+      let compare = opts && 'compare' in opts ? opts.compare : null;
+      let isValidKey = opts && 'isValidKey' in opts ? opts.isValidKey : null;
+      let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
+      collection.Maps._fillMapWithMappedIterable(map, iterable, key, value);
+      return map;
+    }
+    static fromIterables(keys, values, compare, isValidKey) {
+      if (compare === void 0) compare = null;
+      if (isValidKey === void 0) isValidKey = null;
+      let map = new (SplayTreeMapOfK$V())(compare, isValidKey);
+      collection.Maps._fillMapWithIterables(map, keys, values);
+      return map;
+    }
+    [_compare](key1, key2) {
+      K._check(key1);
+      K._check(key2);
+      return this[_comparator](key1, key2);
+    }
+    _internal() {
+      this[_dummy] = new (_SplayTreeMapNodeOfK$V())(null, null);
+      this[_root] = null;
+      this[_comparator] = null;
+      this[_validKey] = null;
+      super.new();
+    }
+    _get(key) {
+      if (!dart.test(dart.dcall(this[_validKey], key))) return null;
+      if (this[_root] != null) {
+        let comp = this[_splay](K.as(key));
+        if (comp == 0) {
+          return this[_root].value;
+        }
+      }
+      return null;
+    }
+    remove(key) {
+      if (!dart.test(dart.dcall(this[_validKey], key))) return null;
+      let mapRoot = this[_remove](K.as(key));
+      if (mapRoot != null) return mapRoot.value;
+      return null;
+    }
+    _set(key, value) {
+      (() => {
+        K._check(key);
+        V._check(value);
+        if (key == null) dart.throw(new core.ArgumentError(key));
+        let comp = this[_splay](key);
+        if (comp == 0) {
+          this[_root].value = value;
+          return;
+        }
+        this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
+      })();
+      return value;
+    }
+    putIfAbsent(key, ifAbsent) {
+      K._check(key);
+      VoidToV()._check(ifAbsent);
+      if (key == null) dart.throw(new core.ArgumentError(key));
+      let comp = this[_splay](key);
+      if (comp == 0) {
+        return this[_root].value;
+      }
+      let modificationCount = this[_modificationCount];
+      let splayCount = this[_splayCount];
+      let value = ifAbsent();
+      if (modificationCount != this[_modificationCount]) {
+        dart.throw(new core.ConcurrentModificationError(this));
+      }
+      if (splayCount != this[_splayCount]) {
+        comp = this[_splay](key);
+        dart.assert(comp != 0);
+      }
+      this[_addNewRoot](new (_SplayTreeMapNodeOfK$V())(key, value), comp);
+      return value;
+    }
+    addAll(other) {
+      MapOfK$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => {
+        this._set(key, value);
+      }, KAndVToNull()));
+    }
+    get isEmpty() {
+      return this[_root] == null;
+    }
+    get isNotEmpty() {
+      return !dart.test(this.isEmpty);
+    }
+    forEach(f) {
+      let nodes = new (_SplayTreeNodeIteratorOfK())(this);
+      while (dart.test(nodes.moveNext())) {
+        let node = _SplayTreeMapNodeOfK$V()._check(nodes.current);
+        f(node.key, node.value);
+      }
+    }
+    get length() {
+      return this[_count$];
+    }
+    clear() {
+      this[_clear$]();
+    }
+    containsKey(key) {
+      return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
+    }
+    containsValue(value) {
+      let found = false;
+      let initialSplayCount = this[_splayCount];
+      const visit = (function(node) {
+        while (node != null) {
+          if (dart.equals(node.value, value)) return true;
+          if (initialSplayCount != this[_splayCount]) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          if (node.right != null && dart.test(visit(collection._SplayTreeMapNode._check(node.right)))) return true;
+          node = collection._SplayTreeMapNode._check(node.left);
+        }
+        return false;
+      }).bind(this);
+      dart.fn(visit, _SplayTreeMapNodeTobool());
+      return visit(this[_root]);
+    }
+    get keys() {
+      return new (_SplayTreeKeyIterableOfK())(this);
+    }
+    get values() {
+      return new (_SplayTreeValueIterableOfK$V())(this);
+    }
+    toString() {
+      return collection.Maps.mapToString(this);
+    }
+    firstKey() {
+      if (this[_root] == null) return null;
+      return this[_first$].key;
+    }
+    lastKey() {
+      if (this[_root] == null) return null;
+      return this[_last$].key;
+    }
+    lastKeyBefore(key) {
+      K._check(key);
+      if (key == null) dart.throw(new core.ArgumentError(key));
+      if (this[_root] == null) return null;
+      let comp = this[_splay](key);
+      if (dart.notNull(comp) < 0) return this[_root].key;
+      let node = this[_root].left;
+      if (node == null) return null;
+      while (node.right != null) {
+        node = node.right;
+      }
+      return node.key;
+    }
+    firstKeyAfter(key) {
+      K._check(key);
+      if (key == null) dart.throw(new core.ArgumentError(key));
+      if (this[_root] == null) return null;
+      let comp = this[_splay](key);
+      if (dart.notNull(comp) > 0) return this[_root].key;
+      let node = this[_root].right;
+      if (node == null) return null;
+      while (node.left != null) {
+        node = node.left;
+      }
+      return node.key;
+    }
+  }
+  dart.defineNamedConstructor(SplayTreeMap, '_internal');
+  SplayTreeMap[dart.implements] = () => [MapOfK$V()];
+  dart.setSignature(SplayTreeMap, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [], [ComparatorOfK(), dynamicTobool()]),
+      from: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Map], [ComparatorOfK(), dynamicTobool()]),
+      fromIterable: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV(), compare: ComparatorOfK(), isValidKey: dynamicTobool()}),
+      fromIterables: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [IterableOfK(), IterableOfV()], [ComparatorOfK(), dynamicTobool()]),
+      _internal: dart.definiteFunctionType(collection.SplayTreeMap$(K, V), [])
+    }),
+    fields: () => ({
+      [_root]: _SplayTreeMapNodeOfK$V(),
+      [_dummy]: _SplayTreeMapNodeOfK$V(),
+      [_comparator]: ComparatorOfK(),
+      [_validKey]: collection._Predicate
+    }),
+    getters: () => ({
+      isEmpty: dart.definiteFunctionType(core.bool, []),
+      isNotEmpty: dart.definiteFunctionType(core.bool, []),
+      length: dart.definiteFunctionType(core.int, []),
+      keys: dart.definiteFunctionType(core.Iterable$(K), []),
+      values: dart.definiteFunctionType(core.Iterable$(V), [])
+    }),
+    methods: () => ({
+      [_compare]: dart.definiteFunctionType(core.int, [K, K]),
+      _get: dart.definiteFunctionType(V, [core.Object]),
+      remove: dart.definiteFunctionType(V, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [K, V]),
+      putIfAbsent: dart.definiteFunctionType(V, [K, VoidToV()]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfK$V()]),
+      forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
+      clear: dart.definiteFunctionType(dart.void, []),
+      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      firstKey: dart.definiteFunctionType(K, []),
+      lastKey: dart.definiteFunctionType(K, []),
+      lastKeyBefore: dart.definiteFunctionType(K, [K]),
+      firstKeyAfter: dart.definiteFunctionType(K, [K])
+    })
+  });
+  dart.defineExtensionMembers(SplayTreeMap, [
+    '_get',
+    'remove',
+    '_set',
+    'putIfAbsent',
+    'addAll',
+    'forEach',
+    'clear',
+    'containsKey',
+    'containsValue',
+    'isEmpty',
+    'isNotEmpty',
+    'length',
+    'keys',
+    'values'
+  ]);
+  return SplayTreeMap;
+});
+collection.SplayTreeMap = SplayTreeMap();
+const _workList = Symbol('_workList');
+const _tree = Symbol('_tree');
+const _currentNode = Symbol('_currentNode');
+const _findLeftMostDescendent = Symbol('_findLeftMostDescendent');
+const _getValue = Symbol('_getValue');
+const _rebuildWorkList = Symbol('_rebuildWorkList');
+collection._SplayTreeIterator$ = dart.generic((K, T) => {
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  let JSArrayOf_SplayTreeNodeOfK = () => (JSArrayOf_SplayTreeNodeOfK = dart.constFn(_interceptors.JSArray$(_SplayTreeNodeOfK())))();
+  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
+  let ListOf_SplayTreeNodeOfK = () => (ListOf_SplayTreeNodeOfK = dart.constFn(core.List$(_SplayTreeNodeOfK())))();
+  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
+  class _SplayTreeIterator extends core.Object {
+    new(tree) {
+      this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
+      this[_tree] = tree;
+      this[_modificationCount] = tree[_modificationCount];
+      this[_splayCount] = tree[_splayCount];
+      this[_currentNode] = null;
+      this[_findLeftMostDescendent](tree[_root]);
+    }
+    startAt(tree, startKey) {
+      this[_workList] = JSArrayOf_SplayTreeNodeOfK().of([]);
+      this[_tree] = tree;
+      this[_modificationCount] = tree[_modificationCount];
+      this[_splayCount] = null;
+      this[_currentNode] = null;
+      if (tree[_root] == null) return;
+      let compare = tree[_splay](startKey);
+      this[_splayCount] = tree[_splayCount];
+      if (dart.notNull(compare) < 0) {
+        this[_findLeftMostDescendent](tree[_root].right);
+      } else {
+        this[_workList][dartx.add](tree[_root]);
+      }
+    }
+    get current() {
+      if (this[_currentNode] == null) return null;
+      return this[_getValue](this[_currentNode]);
+    }
+    [_findLeftMostDescendent](node) {
+      _SplayTreeNodeOfK()._check(node);
+      while (node != null) {
+        this[_workList][dartx.add](node);
+        node = node.left;
+      }
+    }
+    [_rebuildWorkList](currentNode) {
+      _SplayTreeNodeOfK()._check(currentNode);
+      dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
+      this[_workList][dartx.clear]();
+      if (currentNode == null) {
+        this[_findLeftMostDescendent](this[_tree][_root]);
+      } else {
+        this[_tree][_splay](currentNode.key);
+        this[_findLeftMostDescendent](this[_tree][_root].right);
+        dart.assert(!dart.test(this[_workList][dartx.isEmpty]));
+      }
+    }
+    moveNext() {
+      if (this[_modificationCount] != this[_tree][_modificationCount]) {
+        dart.throw(new core.ConcurrentModificationError(this[_tree]));
+      }
+      if (dart.test(this[_workList][dartx.isEmpty])) {
+        this[_currentNode] = null;
+        return false;
+      }
+      if (this[_tree][_splayCount] != this[_splayCount] && this[_currentNode] != null) {
+        this[_rebuildWorkList](this[_currentNode]);
+      }
+      this[_currentNode] = this[_workList][dartx.removeLast]();
+      this[_findLeftMostDescendent](this[_currentNode].right);
+      return true;
+    }
+  }
+  dart.addTypeTests(_SplayTreeIterator);
+  dart.defineNamedConstructor(_SplayTreeIterator, 'startAt');
+  _SplayTreeIterator[dart.implements] = () => [IteratorOfT()];
+  dart.setSignature(_SplayTreeIterator, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
+      startAt: dart.definiteFunctionType(collection._SplayTreeIterator$(K, T), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
+    }),
+    fields: () => ({
+      [_tree]: _SplayTreeOfK$_SplayTreeNodeOfK(),
+      [_workList]: ListOf_SplayTreeNodeOfK(),
+      [_modificationCount]: core.int,
+      [_splayCount]: core.int,
+      [_currentNode]: _SplayTreeNodeOfK()
+    }),
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({
+      [_findLeftMostDescendent]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
+      [_rebuildWorkList]: dart.definiteFunctionType(dart.void, [_SplayTreeNodeOfK()]),
+      moveNext: dart.definiteFunctionType(core.bool, [])
+    })
+  });
+  return _SplayTreeIterator;
+});
+collection._SplayTreeIterator = _SplayTreeIterator();
+const _copyNode = Symbol('_copyNode');
+collection._SplayTreeKeyIterable$ = dart.generic(K => {
+  let _SplayTreeKeyIteratorOfK = () => (_SplayTreeKeyIteratorOfK = dart.constFn(collection._SplayTreeKeyIterator$(K)))();
+  let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
+  class _SplayTreeKeyIterable extends core.Iterable$(K) {
+    new(tree) {
+      this[_tree] = tree;
+      super.new();
+    }
+    get length() {
+      return this[_tree][_count$];
+    }
+    get isEmpty() {
+      return this[_tree][_count$] == 0;
+    }
+    get iterator() {
+      return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
+    }
+    toSet() {
+      let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
+      set[_count$] = this[_tree][_count$];
+      set[_root] = set[_copyNode](this[_tree][_root]);
+      return set;
+    }
+  }
+  _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_SplayTreeKeyIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterable$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
+    fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
+  });
+  dart.defineExtensionMembers(_SplayTreeKeyIterable, ['toSet', 'length', 'isEmpty', 'iterator']);
+  return _SplayTreeKeyIterable;
+});
+collection._SplayTreeKeyIterable = _SplayTreeKeyIterable();
+collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
+  let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
+  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
+  class _SplayTreeValueIterable extends core.Iterable$(V) {
+    new(map) {
+      this[_map$0] = map;
+      super.new();
+    }
+    get length() {
+      return this[_map$0][_count$];
+    }
+    get isEmpty() {
+      return this[_map$0][_count$] == 0;
+    }
+    get iterator() {
+      return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
+    }
+  }
+  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_SplayTreeValueIterable, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
+    fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
+  });
+  dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
+  return _SplayTreeValueIterable;
+});
+collection._SplayTreeValueIterable = _SplayTreeValueIterable();
+collection._SplayTreeKeyIterator$ = dart.generic(K => {
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
+  class _SplayTreeKeyIterator extends collection._SplayTreeIterator$(K, K) {
+    new(map) {
+      super.new(map);
+    }
+    [_getValue](node) {
+      _SplayTreeNodeOfK()._check(node);
+      return node.key;
+    }
+  }
+  dart.setSignature(_SplayTreeKeyIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeKeyIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()])}),
+    methods: () => ({[_getValue]: dart.definiteFunctionType(K, [_SplayTreeNodeOfK()])})
+  });
+  return _SplayTreeKeyIterator;
+});
+collection._SplayTreeKeyIterator = _SplayTreeKeyIterator();
+collection._SplayTreeValueIterator$ = dart.generic((K, V) => {
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  let _SplayTreeMapNodeOfK$V = () => (_SplayTreeMapNodeOfK$V = dart.constFn(collection._SplayTreeMapNode$(K, V)))();
+  let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
+  class _SplayTreeValueIterator extends collection._SplayTreeIterator$(K, V) {
+    new(map) {
+      super.new(map);
+    }
+    [_getValue](node) {
+      _SplayTreeNodeOfK()._check(node);
+      let mapNode = _SplayTreeMapNodeOfK$V().as(node);
+      return mapNode.value;
+    }
+  }
+  dart.setSignature(_SplayTreeValueIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterator$(K, V), [SplayTreeMapOfK$V()])}),
+    methods: () => ({[_getValue]: dart.definiteFunctionType(V, [_SplayTreeNodeOfK()])})
+  });
+  return _SplayTreeValueIterator;
+});
+collection._SplayTreeValueIterator = _SplayTreeValueIterator();
+collection._SplayTreeNodeIterator$ = dart.generic(K => {
+  let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
+  let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
+  class _SplayTreeNodeIterator extends collection._SplayTreeIterator$(K, collection._SplayTreeNode$(K)) {
+    new(tree) {
+      super.new(tree);
+    }
+    startAt(tree, startKey) {
+      super.startAt(tree, startKey);
+    }
+    [_getValue](node) {
+      _SplayTreeNodeOfK()._check(node);
+      return node;
+    }
+  }
+  dart.defineNamedConstructor(_SplayTreeNodeIterator, 'startAt');
+  dart.setSignature(_SplayTreeNodeIterator, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK()]),
+      startAt: dart.definiteFunctionType(collection._SplayTreeNodeIterator$(K), [_SplayTreeOfK$_SplayTreeNodeOfK(), K])
+    }),
+    methods: () => ({[_getValue]: dart.definiteFunctionType(collection._SplayTreeNode$(K), [_SplayTreeNodeOfK()])})
+  });
+  return _SplayTreeNodeIterator;
+});
+collection._SplayTreeNodeIterator = _SplayTreeNodeIterator();
+const _clone = Symbol('_clone');
+collection.SplayTreeSet$ = dart.generic(E => {
+  let _SplayTreeNodeOfE = () => (_SplayTreeNodeOfE = dart.constFn(collection._SplayTreeNode$(E)))();
+  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
+  let SplayTreeSetOfE = () => (SplayTreeSetOfE = dart.constFn(collection.SplayTreeSet$(E)))();
+  let _SplayTreeKeyIteratorOfE = () => (_SplayTreeKeyIteratorOfE = dart.constFn(collection._SplayTreeKeyIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
+  class SplayTreeSet extends dart.mixin(collection._SplayTree$(E, collection._SplayTreeNode$(E)), collection.IterableMixin$(E), collection.SetMixin$(E)) {
+    new(compare, isValidKey) {
+      if (compare === void 0) compare = null;
+      if (isValidKey === void 0) isValidKey = null;
+      this[_dummy] = new (_SplayTreeNodeOfE())(null);
+      this[_comparator] = (() => {
+        let l = compare;
+        return l != null ? l : ComparatorOfE().as(core.Comparable.compare);
+      })();
+      this[_validKey] = (() => {
+        let l = isValidKey;
+        return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
+      })();
+      this[_root] = null;
+      super.new();
+    }
+    static from(elements, compare, isValidKey) {
+      if (compare === void 0) compare = null;
+      if (isValidKey === void 0) isValidKey = null;
+      let result = new (SplayTreeSetOfE())(compare, isValidKey);
+      for (let element of elements) {
+        let e = E.as(element);
+        result.add(e);
+      }
+      return result;
+    }
+    [_compare](e1, e2) {
+      E._check(e1);
+      E._check(e2);
+      return this[_comparator](e1, e2);
+    }
+    get iterator() {
+      return new (_SplayTreeKeyIteratorOfE())(this);
+    }
+    get length() {
+      return this[_count$];
+    }
+    get isEmpty() {
+      return this[_root] == null;
+    }
+    get isNotEmpty() {
+      return this[_root] != null;
+    }
+    get first() {
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[_first$].key;
+    }
+    get last() {
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[_last$].key;
+    }
+    get single() {
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      return this[_root].key;
+    }
+    contains(object) {
+      return dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0;
+    }
+    add(element) {
+      E._check(element);
+      let compare = this[_splay](element);
+      if (compare == 0) return false;
+      this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
+      return true;
+    }
+    remove(object) {
+      if (!dart.test(dart.dcall(this[_validKey], object))) return false;
+      return this[_remove](E.as(object)) != null;
+    }
+    addAll(elements) {
+      IterableOfE()._check(elements);
+      for (let element of elements) {
+        let compare = this[_splay](element);
+        if (compare != 0) {
+          this[_addNewRoot](new (_SplayTreeNodeOfE())(element), compare);
+        }
+      }
+    }
+    removeAll(elements) {
+      for (let element of elements) {
+        if (dart.test(dart.dcall(this[_validKey], element))) this[_remove](E.as(element));
+      }
+    }
+    retainAll(elements) {
+      let retainSet = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
+      let modificationCount = this[_modificationCount];
+      for (let object of elements) {
+        if (modificationCount != this[_modificationCount]) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        if (dart.test(dart.dcall(this[_validKey], object)) && this[_splay](E.as(object)) == 0) {
+          retainSet.add(this[_root].key);
+        }
+      }
+      if (retainSet[_count$] != this[_count$]) {
+        this[_root] = retainSet[_root];
+        this[_count$] = retainSet[_count$];
+        this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
+      }
+    }
+    lookup(object) {
+      if (!dart.test(dart.dcall(this[_validKey], object))) return null;
+      let comp = this[_splay](E.as(object));
+      if (comp != 0) return null;
+      return this[_root].key;
+    }
+    intersection(other) {
+      let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
+      for (let element of this) {
+        if (dart.test(other.contains(element))) result.add(element);
+      }
+      return result;
+    }
+    difference(other) {
+      let result = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
+      for (let element of this) {
+        if (!dart.test(other.contains(element))) result.add(element);
+      }
+      return result;
+    }
+    union(other) {
+      SetOfE()._check(other);
+      let _ = this[_clone]();
+      _.addAll(other);
+      return _;
+    }
+    [_clone]() {
+      let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
+      set[_count$] = this[_count$];
+      set[_root] = this[_copyNode](this[_root]);
+      return set;
+    }
+    [_copyNode](node) {
+      _SplayTreeNodeOfE()._check(node);
+      if (node == null) return null;
+      let _ = new (_SplayTreeNodeOfE())(node.key);
+      _.left = this[_copyNode](node.left);
+      _.right = this[_copyNode](node.right);
+      return _;
+    }
+    clear() {
+      this[_clear$]();
+    }
+    toSet() {
+      return this[_clone]();
+    }
+    toString() {
+      return collection.IterableBase.iterableToFullString(this, '{', '}');
+    }
+  }
+  dart.setSignature(SplayTreeSet, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(collection.SplayTreeSet$(E), [], [ComparatorOfE(), dynamicTobool()]),
+      from: dart.definiteFunctionType(collection.SplayTreeSet$(E), [core.Iterable], [ComparatorOfE(), dynamicTobool()])
+    }),
+    fields: () => ({
+      [_root]: _SplayTreeNodeOfE(),
+      [_dummy]: _SplayTreeNodeOfE(),
+      [_comparator]: ComparatorOfE(),
+      [_validKey]: collection._Predicate
+    }),
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({
+      [_compare]: dart.definiteFunctionType(core.int, [E, E]),
+      add: dart.definiteFunctionType(core.bool, [E]),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      lookup: dart.definiteFunctionType(E, [core.Object]),
+      [_clone]: dart.definiteFunctionType(collection.SplayTreeSet$(E), []),
+      [_copyNode]: dart.definiteFunctionType(collection._SplayTreeNode$(E), [_SplayTreeNodeOfE()])
+    })
+  });
+  dart.defineExtensionMembers(SplayTreeSet, [
+    'contains',
+    'toSet',
+    'toString',
+    'iterator',
+    'length',
+    'isEmpty',
+    'isNotEmpty',
+    'first',
+    'last',
+    'single'
+  ]);
+  return SplayTreeSet;
+});
+collection.SplayTreeSet = SplayTreeSet();
+const _processed = Symbol('_processed');
+const _computeKeys$ = Symbol('_computeKeys');
+const _original = Symbol('_original');
+convert._convertJsonToDart = function(json, reviver) {
+  dart.assert(reviver != null);
+  function walk(e) {
+    if (e == null || typeof e != "object") {
+      return e;
+    }
+    if (Object.getPrototypeOf(e) === Array.prototype) {
+      for (let i = 0; i < e.length; i++) {
+        let item = e[i];
+        e[i] = dart.dcall(reviver, i, walk(item));
+      }
+      return e;
+    }
+    let map = new convert._JsonMap(e);
+    let processed = map[_processed];
+    let keys = map[_computeKeys$]();
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      let key = keys[dartx._get](i);
+      let revived = dart.dcall(reviver, key, walk(e[key]));
+      processed[key] = revived;
+    }
+    map[_original] = processed;
+    return map;
+  }
+  dart.fn(walk, dynamicTodynamic$());
+  return dart.dcall(reviver, null, walk(json));
+};
+dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
+convert._convertJsonToDartLazy = function(object) {
+  if (object == null) return null;
+  if (typeof object != "object") {
+    return object;
+  }
+  if (Object.getPrototypeOf(object) !== Array.prototype) {
+    return new convert._JsonMap(object);
+  }
+  for (let i = 0; i < object.length; i++) {
+    let item = object[i];
+    object[i] = convert._convertJsonToDartLazy(item);
+  }
+  return object;
+};
+dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
+const _data = Symbol('_data');
+const _isUpgraded = Symbol('_isUpgraded');
+const _upgradedMap = Symbol('_upgradedMap');
+const _process$ = Symbol('_process');
+const _upgrade = Symbol('_upgrade');
+convert._JsonMap = class _JsonMap extends core.Object {
+  new(original) {
+    this[_processed] = convert._JsonMap._newJavaScriptObject();
+    this[_original] = original;
+    this[_data] = null;
+  }
+  _get(key) {
+    if (dart.test(this[_isUpgraded])) {
+      return this[_upgradedMap][dartx._get](key);
+    } else if (!(typeof key == 'string')) {
+      return null;
+    } else {
+      let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
+      if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process$](core.String._check(key));
+      return result;
+    }
+  }
+  get length() {
+    return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
+  }
+  get isEmpty() {
+    return this.length == 0;
+  }
+  get isNotEmpty() {
+    return dart.notNull(this.length) > 0;
+  }
+  get keys() {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.keys];
+    return new convert._JsonMapKeyIterable(this);
+  }
+  get values() {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
+    return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
+  }
+  _set(key, value) {
+    if (dart.test(this[_isUpgraded])) {
+      this[_upgradedMap][dartx._set](key, value);
+    } else if (dart.test(this.containsKey(key))) {
+      let processed = this[_processed];
+      convert._JsonMap._setProperty(processed, core.String._check(key), value);
+      let original = this[_original];
+      if (!core.identical(original, processed)) {
+        convert._JsonMap._setProperty(original, core.String._check(key), null);
+      }
+    } else {
+      this[_upgrade]()[dartx._set](key, value);
+    }
+    return value;
+  }
+  addAll(other) {
+    other[dartx.forEach](dart.fn((key, value) => {
+      this._set(key, value);
+    }, dynamicAnddynamicToNull()));
+  }
+  containsValue(value) {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
+    let keys = this[_computeKeys$]();
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      let key = keys[dartx._get](i);
+      if (dart.equals(this._get(key), value)) return true;
+    }
+    return false;
+  }
+  containsKey(key) {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsKey](key);
+    if (!(typeof key == 'string')) return false;
+    return convert._JsonMap._hasProperty(this[_original], core.String._check(key));
+  }
+  putIfAbsent(key, ifAbsent) {
+    if (dart.test(this.containsKey(key))) return this._get(key);
+    let value = ifAbsent();
+    this._set(key, value);
+    return value;
+  }
+  remove(key) {
+    if (!dart.test(this[_isUpgraded]) && !dart.test(this.containsKey(key))) return null;
+    return this[_upgrade]()[dartx.remove](key);
+  }
+  clear() {
+    if (dart.test(this[_isUpgraded])) {
+      this[_upgradedMap][dartx.clear]();
+    } else {
+      if (this[_data] != null) {
+        dart.dsend(this[_data], 'clear');
+      }
+      this[_original] = this[_processed] = null;
+      this[_data] = dart.map();
+    }
+  }
+  forEach(f) {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
+    let keys = this[_computeKeys$]();
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      let key = keys[dartx._get](i);
+      let value = convert._JsonMap._getProperty(this[_processed], key);
+      if (dart.test(convert._JsonMap._isUnprocessed(value))) {
+        value = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
+        convert._JsonMap._setProperty(this[_processed], key, value);
+      }
+      dart.dcall(f, key, value);
+      if (!core.identical(keys, this[_data])) {
+        dart.throw(new core.ConcurrentModificationError(this));
+      }
+    }
+  }
+  toString() {
+    return collection.Maps.mapToString(this);
+  }
+  get [_isUpgraded]() {
+    return this[_processed] == null;
+  }
+  get [_upgradedMap]() {
+    dart.assert(this[_isUpgraded]);
+    return this[_data];
+  }
+  [_computeKeys$]() {
+    dart.assert(!dart.test(this[_isUpgraded]));
+    let keys = core.List._check(this[_data]);
+    if (keys == null) {
+      keys = this[_data] = convert._JsonMap._getPropertyNames(this[_original]);
+    }
+    return keys;
+  }
+  [_upgrade]() {
+    if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
+    let result = dart.map();
+    let keys = this[_computeKeys$]();
+    for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
+      let key = keys[dartx._get](i);
+      result[dartx._set](key, this._get(key));
+    }
+    if (dart.test(keys[dartx.isEmpty])) {
+      keys[dartx.add](null);
+    } else {
+      keys[dartx.clear]();
+    }
+    this[_original] = this[_processed] = null;
+    this[_data] = result;
+    dart.assert(this[_isUpgraded]);
+    return result;
+  }
+  [_process$](key) {
+    if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
+    let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
+    return convert._JsonMap._setProperty(this[_processed], key, result);
+  }
+  static _hasProperty(object, key) {
+    return Object.prototype.hasOwnProperty.call(object, key);
+  }
+  static _getProperty(object, key) {
+    return object[key];
+  }
+  static _setProperty(object, key, value) {
+    return object[key] = value;
+  }
+  static _getPropertyNames(object) {
+    return Object.keys(object);
+  }
+  static _isUnprocessed(object) {
+    return typeof object == "undefined";
+  }
+  static _newJavaScriptObject() {
+    return Object.create(null);
+  }
+};
+convert._JsonMap[dart.implements] = () => [collection.LinkedHashMap];
+dart.setSignature(convert._JsonMap, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonMap, [dart.dynamic])}),
+  fields: () => ({
+    [_original]: dart.dynamic,
+    [_processed]: dart.dynamic,
+    [_data]: dart.dynamic
+  }),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, []),
+    keys: dart.definiteFunctionType(core.Iterable, []),
+    values: dart.definiteFunctionType(core.Iterable, []),
+    [_isUpgraded]: dart.definiteFunctionType(core.bool, []),
+    [_upgradedMap]: dart.definiteFunctionType(core.Map, [])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
+    remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
+    [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
+    [_upgrade]: dart.definiteFunctionType(core.Map, []),
+    [_process$]: dart.definiteFunctionType(dart.dynamic, [core.String])
+  }),
+  statics: () => ({
+    _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
+    _getProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String]),
+    _setProperty: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
+    _getPropertyNames: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    _isUnprocessed: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    _newJavaScriptObject: dart.definiteFunctionType(dart.dynamic, [])
+  }),
+  names: ['_hasProperty', '_getProperty', '_setProperty', '_getPropertyNames', '_isUnprocessed', '_newJavaScriptObject']
+});
+dart.defineExtensionMembers(convert._JsonMap, [
+  '_get',
+  '_set',
+  'addAll',
+  'containsValue',
+  'containsKey',
+  'putIfAbsent',
+  'remove',
+  'clear',
+  'forEach',
+  'length',
+  'isEmpty',
+  'isNotEmpty',
+  'keys',
+  'values'
+]);
+const _parent = Symbol('_parent');
+convert._JsonMapKeyIterable = class _JsonMapKeyIterable extends _internal.ListIterable {
+  new(parent) {
+    this[_parent] = parent;
+    super.new();
+  }
+  get length() {
+    return this[_parent].length;
+  }
+  elementAt(index) {
+    return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
+  }
+  get iterator() {
+    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
+  }
+  contains(key) {
+    return this[_parent].containsKey(key);
+  }
+};
+dart.addSimpleTypeTests(convert._JsonMapKeyIterable);
+dart.setSignature(convert._JsonMapKeyIterable, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonMapKeyIterable, [convert._JsonMap])}),
+  fields: () => ({[_parent]: convert._JsonMap}),
+  methods: () => ({elementAt: dart.definiteFunctionType(core.String, [core.int])})
+});
+dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
+const _reviver = Symbol('_reviver');
+const _sink$ = Symbol('_sink');
+const _stringSink = Symbol('_stringSink');
+convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
+  add(str) {
+    this.addSlice(str, 0, str[dartx.length], false);
+  }
+  asUtf8Sink(allowMalformed) {
+    return new convert._Utf8ConversionSink(this, allowMalformed);
+  }
+  asStringSink() {
+    return new convert._StringConversionSinkAsStringSinkAdapter(this);
+  }
+};
+convert.StringConversionSinkMixin[dart.implements] = () => [convert.StringConversionSink];
+dart.setSignature(convert.StringConversionSinkMixin, {
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [core.String]),
+    asUtf8Sink: dart.definiteFunctionType(convert.ByteConversionSink, [core.bool]),
+    asStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [])
+  })
+});
+convert.StringConversionSinkBase = class StringConversionSinkBase extends convert.StringConversionSinkMixin {};
+convert._StringSinkConversionSink = class _StringSinkConversionSink extends convert.StringConversionSinkBase {
+  new(stringSink) {
+    this[_stringSink] = stringSink;
+  }
+  close() {}
+  addSlice(str, start, end, isLast) {
+    if (start != 0 || end != str[dartx.length]) {
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        this[_stringSink].writeCharCode(str[dartx.codeUnitAt](i));
+      }
+    } else {
+      this[_stringSink].write(str);
+    }
+    if (dart.test(isLast)) this.close();
+  }
+  add(str) {
+    this[_stringSink].write(str);
+  }
+  asUtf8Sink(allowMalformed) {
+    return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
+  }
+  asStringSink() {
+    return convert.ClosableStringSink.fromStringSink(this[_stringSink], dart.bind(this, 'close'));
+  }
+};
+dart.setSignature(convert._StringSinkConversionSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._StringSinkConversionSink, [core.StringSink])}),
+  fields: () => ({[_stringSink]: core.StringSink}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+  })
+});
+convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
+  new(reviver, sink) {
+    this[_reviver] = reviver;
+    this[_sink$] = sink;
+    super.new(new core.StringBuffer());
+  }
+  close() {
+    super.close();
+    let buffer = core.StringBuffer._check(this[_stringSink]);
+    let accumulated = dart.toString(buffer);
+    buffer.clear();
+    let decoded = convert._parseJson(accumulated, this[_reviver]);
+    this[_sink$].add(decoded);
+    this[_sink$].close();
+  }
+};
+dart.setSignature(convert._JsonDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
+  fields: () => ({
+    [_reviver]: convert._Reviver,
+    [_sink$]: SinkOfObject()
+  })
+});
+const _allowInvalid = Symbol('_allowInvalid');
+let const$25;
+let const$26;
+let const$27;
+let const$28;
+let const$29;
+convert.Codec$ = dart.generic((S, T) => {
+  let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
+  class Codec extends core.Object {
+    new() {
+    }
+    encode(input) {
+      S._check(input);
+      return this.encoder.convert(input);
+    }
+    decode(encoded) {
+      T._check(encoded);
+      return this.decoder.convert(encoded);
+    }
+    fuse(R) {
+      return other => {
+        convert.Codec$(T, R)._check(other);
+        return new (convert._FusedCodec$(S, T, R))(this, other);
+      };
+    }
+    get inverted() {
+      return new (_InvertedCodecOfT$S())(this);
+    }
+  }
+  dart.addTypeTests(Codec);
+  dart.setSignature(Codec, {
+    constructors: () => ({new: dart.definiteFunctionType(convert.Codec$(S, T), [])}),
+    getters: () => ({inverted: dart.definiteFunctionType(convert.Codec$(T, S), [])}),
+    methods: () => ({
+      encode: dart.definiteFunctionType(T, [S]),
+      decode: dart.definiteFunctionType(S, [T]),
+      fuse: dart.definiteFunctionType(R => [convert.Codec$(S, R), [convert.Codec$(T, R)]])
+    })
+  });
+  return Codec;
+});
+convert.Codec = Codec();
+core.String = class String extends core.Object {
+  static fromCharCodes(charCodes, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (_interceptors.JSArray.is(charCodes)) {
+      return core.String._stringFromJSArray(JSArrayOfint()._check(charCodes), start, end);
+    }
+    if (_native_typed_data.NativeUint8List.is(charCodes)) {
+      return core.String._stringFromUint8List(charCodes, start, end);
+    }
+    return core.String._stringFromIterable(charCodes, start, end);
+  }
+  static fromCharCode(charCode) {
+    return _js_helper.Primitives.stringFromCharCode(charCode);
+  }
+  static fromEnvironment(name, opts) {
+    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : null;
+    dart.throw(new core.UnsupportedError('String.fromEnvironment can only be used as a const constructor'));
+  }
+  static _stringFromJSArray(list, start, endOrNull) {
+    let len = list[dartx.length];
+    let end = core.RangeError.checkValidRange(start, endOrNull, len);
+    if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(len)) {
+      list = JSArrayOfint()._check(list[dartx.sublist](start, end));
+    }
+    return _js_helper.Primitives.stringFromCharCodes(list);
+  }
+  static _stringFromUint8List(charCodes, start, endOrNull) {
+    let len = charCodes[dartx.length];
+    let end = core.RangeError.checkValidRange(start, endOrNull, len);
+    return _js_helper.Primitives.stringFromNativeUint8List(charCodes, start, end);
+  }
+  static _stringFromIterable(charCodes, start, end) {
+    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.range(start, 0, charCodes[dartx.length]));
+    if (end != null && dart.notNull(end) < dart.notNull(start)) {
+      dart.throw(new core.RangeError.range(end, start, charCodes[dartx.length]));
+    }
+    let it = charCodes[dartx.iterator];
+    for (let i = 0; i < dart.notNull(start); i++) {
+      if (!dart.test(it.moveNext())) {
+        dart.throw(new core.RangeError.range(start, 0, i));
+      }
+    }
+    let list = JSArrayOfint().of([]);
+    if (end == null) {
+      while (dart.test(it.moveNext()))
+        list[dartx.add](it.current);
+    } else {
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        if (!dart.test(it.moveNext())) {
+          dart.throw(new core.RangeError.range(end, start, i));
+        }
+        list[dartx.add](it.current);
+      }
+    }
+    return _js_helper.Primitives.stringFromCharCodes(JSArrayOfint()._check(list));
+  }
+};
+core.String.is = function is_String(o) {
+  return typeof o == "string";
+};
+core.String.as = function as_String(o) {
+  if (typeof o == "string" || o == null) return o;
+  return dart.as(o, core.String);
+};
+core.String._check = function check_String(o) {
+  if (typeof o == "string" || o == null) return o;
+  return dart.check(o, core.String);
+};
+core.String[dart.implements] = () => [ComparableOfString(), core.Pattern];
+dart.setSignature(core.String, {
+  constructors: () => ({
+    fromCharCodes: dart.definiteFunctionType(core.String, [IterableOfint()], [core.int, core.int]),
+    fromCharCode: dart.definiteFunctionType(core.String, [core.int]),
+    fromEnvironment: dart.definiteFunctionType(core.String, [core.String], {defaultValue: core.String})
+  }),
+  statics: () => ({
+    _stringFromJSArray: dart.definiteFunctionType(core.String, [JSArrayOfint(), core.int, core.int]),
+    _stringFromUint8List: dart.definiteFunctionType(core.String, [_native_typed_data.NativeUint8List, core.int, core.int]),
+    _stringFromIterable: dart.definiteFunctionType(core.String, [IterableOfint(), core.int, core.int])
+  }),
+  names: ['_stringFromJSArray', '_stringFromUint8List', '_stringFromIterable']
+});
+core.List$ = dart.generic(E => {
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let intToE = () => (intToE = dart.constFn(dart.functionType(E, [core.int])))();
+  class List extends core.Object {
+    static new(length) {
+      if (length === void 0) length = null;
+      let list = null;
+      if (length == null) {
+        list = [];
+      } else {
+        if (!(typeof length == 'number') || dart.notNull(length) < 0) {
+          dart.throw(new core.ArgumentError(dart.str`Length must be a non-negative integer: ${length}`));
+        }
+        list = _interceptors.JSArray.markFixedList(new Array(length));
+      }
+      return JSArrayOfE().typed(list);
+    }
+    static filled(length, fill) {
+      let result = ListOfE().new(length);
+      if (length != 0 && fill != null) {
+        for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
+          result[dartx._set](i, fill);
+        }
+      }
+      return result;
+    }
+    static from(elements, opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let list = ListOfE().new();
+      for (let e of elements) {
+        list[dartx.add](E._check(e));
+      }
+      if (dart.test(growable)) return list;
+      return _internal.makeListFixedLength(E)(list);
+    }
+    static generate(length, generator, opts) {
+      let growable = opts && 'growable' in opts ? opts.growable : true;
+      let result = null;
+      if (dart.test(growable)) {
+        result = JSArrayOfE().of([]);
+        result[dartx.length] = length;
+      } else {
+        result = ListOfE().new(length);
+      }
+      for (let i = 0; i < dart.notNull(length); i++) {
+        result[dartx._set](i, generator(i));
+      }
+      return result;
+    }
+    static unmodifiable(elements) {
+      let result = ListOfE().from(elements, {growable: false});
+      return _internal.makeFixedListUnmodifiable(E)(result);
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this[dartx.iterator]);
+    }
+  }
+  dart.addTypeTests(List);
+  List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  dart.setSignature(List, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(core.List$(E), [], [core.int]),
+      filled: dart.definiteFunctionType(core.List$(E), [core.int, E]),
+      from: dart.definiteFunctionType(core.List$(E), [core.Iterable], {growable: core.bool}),
+      generate: dart.definiteFunctionType(core.List$(E), [core.int, intToE()], {growable: core.bool}),
+      unmodifiable: dart.definiteFunctionType(core.List$(E), [core.Iterable])
+    })
+  });
+  return List;
+});
+core.List = List();
+convert.Encoding = class Encoding extends convert.Codec$(core.String, core.List$(core.int)) {
+  new() {
+    super.new();
+  }
+  decodeStream(byteStream) {
+    return byteStream.transform(core.String)(this.decoder).fold(dart.dynamic)(new core.StringBuffer(), dart.fn((buffer, string) => ((() => {
+      dart.dsend(buffer, 'write', string);
+      return buffer;
+    })()), dynamicAndStringTodynamic())).then(core.String)(dart.fn(buffer => dart.toString(buffer), dynamicToString()));
+  }
+  static getByName(name) {
+    if (name == null) return null;
+    name = name[dartx.toLowerCase]();
+    return convert.Encoding._nameToEncoding[dartx._get](name);
+  }
+};
+dart.addSimpleTypeTests(convert.Encoding);
+dart.setSignature(convert.Encoding, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Encoding, [])}),
+  methods: () => ({decodeStream: dart.definiteFunctionType(async.Future$(core.String), [StreamOfListOfint()])}),
+  sfields: () => ({_nameToEncoding: MapOfString$Encoding()}),
+  statics: () => ({getByName: dart.definiteFunctionType(convert.Encoding, [core.String])}),
+  names: ['getByName']
+});
+dart.defineLazy(convert.Encoding, {
+  get _nameToEncoding() {
+    return dart.map({"iso_8859-1:1987": convert.LATIN1, "iso-ir-100": convert.LATIN1, "iso_8859-1": convert.LATIN1, "iso-8859-1": convert.LATIN1, latin1: convert.LATIN1, l1: convert.LATIN1, ibm819: convert.LATIN1, cp819: convert.LATIN1, csisolatin1: convert.LATIN1, "iso-ir-6": convert.ASCII, "ansi_x3.4-1968": convert.ASCII, "ansi_x3.4-1986": convert.ASCII, "iso_646.irv:1991": convert.ASCII, "iso646-us": convert.ASCII, "us-ascii": convert.ASCII, us: convert.ASCII, ibm367: convert.ASCII, cp367: convert.ASCII, csascii: convert.ASCII, ascii: convert.ASCII, csutf8: convert.UTF8, "utf-8": convert.UTF8}, core.String, convert.Encoding);
+  },
+  set _nameToEncoding(_) {}
+});
+convert.AsciiCodec = class AsciiCodec extends convert.Encoding {
+  new(opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
+    this[_allowInvalid] = allowInvalid;
+    super.new();
+  }
+  get name() {
+    return "us-ascii";
+  }
+  decode(bytes, opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
+    if (allowInvalid == null) allowInvalid = this[_allowInvalid];
+    if (dart.test(allowInvalid)) {
+      return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
+    } else {
+      return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
+    }
+  }
+  get encoder() {
+    return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
+  }
+  get decoder() {
+    return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
+  }
+};
+dart.setSignature(convert.AsciiCodec, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiCodec, [], {allowInvalid: core.bool})}),
+  fields: () => ({[_allowInvalid]: core.bool}),
+  getters: () => ({
+    name: dart.definiteFunctionType(core.String, []),
+    encoder: dart.definiteFunctionType(convert.AsciiEncoder, []),
+    decoder: dart.definiteFunctionType(convert.AsciiDecoder, [])
+  }),
+  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
+});
+convert.ASCII = dart.const(new convert.AsciiCodec());
+convert._ASCII_MASK = 127;
+const _subsetMask = Symbol('_subsetMask');
+convert.Converter$ = dart.generic((S, T) => {
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let _ConverterStreamEventSinkOfS$dynamic = () => (_ConverterStreamEventSinkOfS$dynamic = dart.constFn(convert._ConverterStreamEventSink$(S, dart.dynamic)))();
+  let StreamTransformerOfS$T = () => (StreamTransformerOfS$T = dart.constFn(async.StreamTransformer$(S, T)))();
+  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let EventSinkTo_ConverterStreamEventSinkOfS$dynamic = () => (EventSinkTo_ConverterStreamEventSinkOfS$dynamic = dart.constFn(dart.definiteFunctionType(_ConverterStreamEventSinkOfS$dynamic(), [async.EventSink])))();
+  class Converter extends core.Object {
+    new() {
+    }
+    fuse(TT) {
+      return other => {
+        convert.Converter$(T, TT)._check(other);
+        return new (convert._FusedConverter$(S, T, TT))(this, other);
+      };
+    }
+    startChunkedConversion(sink) {
+      SinkOfT()._check(sink);
+      dart.throw(new core.UnsupportedError(dart.str`This converter does not support chunked conversions: ${this}`));
+    }
+    bind(stream) {
+      StreamOfS()._check(stream);
+      return StreamOfT().eventTransformed(stream, dart.fn(sink => new (_ConverterStreamEventSinkOfS$dynamic())(this, sink), EventSinkTo_ConverterStreamEventSinkOfS$dynamic()));
+    }
+  }
+  dart.addTypeTests(Converter);
+  Converter[dart.implements] = () => [StreamTransformerOfS$T()];
+  dart.setSignature(Converter, {
+    constructors: () => ({new: dart.definiteFunctionType(convert.Converter$(S, T), [])}),
+    methods: () => ({
+      fuse: dart.definiteFunctionType(TT => [convert.Converter$(S, TT), [convert.Converter$(T, TT)]]),
+      startChunkedConversion: dart.definiteFunctionType(core.Sink$(S), [SinkOfT()]),
+      bind: dart.definiteFunctionType(async.Stream$(T), [StreamOfS()])
+    })
+  });
+  return Converter;
+});
+convert.Converter = Converter();
+convert._UnicodeSubsetEncoder = class _UnicodeSubsetEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
+  new(subsetMask) {
+    this[_subsetMask] = subsetMask;
+    super.new();
+  }
+  convert(string, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let stringLength = string[dartx.length];
+    core.RangeError.checkValidRange(start, end, stringLength);
+    if (end == null) end = stringLength;
+    let length = dart.notNull(end) - dart.notNull(start);
+    let result = typed_data.Uint8List.new(length);
+    for (let i = 0; i < length; i++) {
+      let codeUnit = string[dartx.codeUnitAt](dart.notNull(start) + i);
+      if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
+        dart.throw(new core.ArgumentError("String contains invalid characters."));
+      }
+      result[dartx._set](i, codeUnit);
+    }
+    return result;
+  }
+  startChunkedConversion(sink) {
+    if (!convert.ByteConversionSink.is(sink)) {
+      sink = convert.ByteConversionSink.from(sink);
+    }
+    return new convert._UnicodeSubsetEncoderSink(this[_subsetMask], convert.ByteConversionSink._check(sink));
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+};
+dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
+dart.setSignature(convert._UnicodeSubsetEncoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoder, [core.int])}),
+  fields: () => ({[_subsetMask]: core.int}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
+  })
+});
+convert.AsciiEncoder = class AsciiEncoder extends convert._UnicodeSubsetEncoder {
+  new() {
+    super.new(convert._ASCII_MASK);
+  }
+};
+dart.setSignature(convert.AsciiEncoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiEncoder, [])})
+});
+convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
+  new(subsetMask, sink) {
+    this[_subsetMask] = subsetMask;
+    this[_sink$] = sink;
+  }
+  close() {
+    this[_sink$].close();
+  }
+  addSlice(source, start, end, isLast) {
+    core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let codeUnit = source[dartx.codeUnitAt](i);
+      if ((dart.notNull(codeUnit) & ~dart.notNull(this[_subsetMask])) != 0) {
+        dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
+      }
+    }
+    this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
+    if (dart.test(isLast)) {
+      this.close();
+    }
+  }
+};
+dart.setSignature(convert._UnicodeSubsetEncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
+  fields: () => ({
+    [_sink$]: convert.ByteConversionSink,
+    [_subsetMask]: core.int
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+  })
+});
+const _convertInvalid = Symbol('_convertInvalid');
+convert._UnicodeSubsetDecoder = class _UnicodeSubsetDecoder extends convert.Converter$(core.List$(core.int), core.String) {
+  new(allowInvalid, subsetMask) {
+    this[_allowInvalid] = allowInvalid;
+    this[_subsetMask] = subsetMask;
+    super.new();
+  }
+  convert(bytes, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let byteCount = bytes[dartx.length];
+    core.RangeError.checkValidRange(start, end, byteCount);
+    if (end == null) end = byteCount;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let byte = bytes[dartx._get](i);
+      if ((dart.notNull(byte) & ~dart.notNull(this[_subsetMask])) != 0) {
+        if (!dart.test(this[_allowInvalid])) {
+          dart.throw(new core.FormatException(dart.str`Invalid value in input: ${byte}`));
+        }
+        return this[_convertInvalid](bytes, start, end);
+      }
+    }
+    return core.String.fromCharCodes(bytes, start, end);
+  }
+  [_convertInvalid](bytes, start, end) {
+    let buffer = new core.StringBuffer();
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let value = bytes[dartx._get](i);
+      if ((dart.notNull(value) & ~dart.notNull(this[_subsetMask])) != 0) value = 65533;
+      buffer.writeCharCode(value);
+    }
+    return buffer.toString();
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+};
+dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
+dart.setSignature(convert._UnicodeSubsetDecoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetDecoder, [core.bool, core.int])}),
+  fields: () => ({
+    [_allowInvalid]: core.bool,
+    [_subsetMask]: core.int
+  }),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
+    [_convertInvalid]: dart.definiteFunctionType(core.String, [ListOfint(), core.int, core.int])
+  })
+});
+convert.AsciiDecoder = class AsciiDecoder extends convert._UnicodeSubsetDecoder {
+  new(opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
+    super.new(allowInvalid, convert._ASCII_MASK);
+  }
+  startChunkedConversion(sink) {
+    let stringSink = null;
+    if (convert.StringConversionSink.is(sink)) {
+      stringSink = sink;
+    } else {
+      stringSink = convert.StringConversionSink.from(sink);
+    }
+    if (dart.test(this[_allowInvalid])) {
+      return new convert._ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
+    } else {
+      return new convert._SimpleAsciiDecoderSink(stringSink);
+    }
+  }
+};
+dart.setSignature(convert.AsciiDecoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})})
+});
+const _utf8Sink = Symbol('_utf8Sink');
+let const$30;
+convert.ChunkedConversionSink$ = dart.generic(T => {
+  let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
+  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
+  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
+  let ListOfTTovoid = () => (ListOfTTovoid = dart.constFn(dart.functionType(dart.void, [ListOfT()])))();
+  class ChunkedConversionSink extends core.Object {
+    new() {
+    }
+    static withCallback(callback) {
+      return new (_SimpleCallbackSinkOfT())(callback);
+    }
+  }
+  dart.addTypeTests(ChunkedConversionSink);
+  ChunkedConversionSink[dart.implements] = () => [SinkOfT()];
+  dart.setSignature(ChunkedConversionSink, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), []),
+      withCallback: dart.definiteFunctionType(convert.ChunkedConversionSink$(T), [ListOfTTovoid()])
+    })
+  });
+  return ChunkedConversionSink;
+});
+convert.ChunkedConversionSink = ChunkedConversionSink();
+convert.ByteConversionSink = class ByteConversionSink extends convert.ChunkedConversionSink$(core.List$(core.int)) {
+  new() {
+    super.new();
+  }
+  static withCallback(callback) {
+    return new convert._ByteCallbackSink(callback);
+  }
+  static from(sink) {
+    return new convert._ByteAdapterSink(sink);
+  }
+};
+dart.addSimpleTypeTests(convert.ByteConversionSink);
+dart.setSignature(convert.ByteConversionSink, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.ByteConversionSink, []),
+    withCallback: dart.definiteFunctionType(convert.ByteConversionSink, [ListOfintTovoid()]),
+    from: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
+  })
+});
+convert.ByteConversionSinkBase = class ByteConversionSinkBase extends convert.ByteConversionSink {
+  new() {
+    super.new();
+  }
+  addSlice(chunk, start, end, isLast) {
+    this.add(chunk[dartx.sublist](start, end));
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.setSignature(convert.ByteConversionSinkBase, {
+  methods: () => ({addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
+});
+convert._ErrorHandlingAsciiDecoderSink = class _ErrorHandlingAsciiDecoderSink extends convert.ByteConversionSinkBase {
+  new(utf8Sink) {
+    this[_utf8Sink] = utf8Sink;
+    super.new();
+  }
+  close() {
+    this[_utf8Sink].close();
+  }
+  add(source) {
+    this.addSlice(source, 0, source[dartx.length], false);
+  }
+  addSlice(source, start, end, isLast) {
+    core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
+        if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
+        this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
+        start = dart.notNull(i) + 1;
+      }
+    }
+    if (dart.notNull(start) < dart.notNull(end)) {
+      this[_utf8Sink].addSlice(source, start, end, isLast);
+    } else if (dart.test(isLast)) {
+      this.close();
+    }
+  }
+};
+dart.setSignature(convert._ErrorHandlingAsciiDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._ErrorHandlingAsciiDecoderSink, [convert.ByteConversionSink])}),
+  fields: () => ({[_utf8Sink]: convert.ByteConversionSink}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()])
+  })
+});
+convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
+  new(sink) {
+    this[_sink$] = sink;
+    super.new();
+  }
+  close() {
+    this[_sink$].close();
+  }
+  add(source) {
+    for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
+      if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
+        dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
+      }
+    }
+    this[_sink$].add(core.String.fromCharCodes(source));
+  }
+  addSlice(source, start, end, isLast) {
+    let length = source[dartx.length];
+    core.RangeError.checkValidRange(start, end, length);
+    if (dart.notNull(start) < dart.notNull(end)) {
+      if (start != 0 || end != length) {
+        source = source[dartx.sublist](start, end);
+      }
+      this.add(source);
+    }
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.setSignature(convert._SimpleAsciiDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
+  fields: () => ({[_sink$]: core.Sink}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()])
+  })
+});
+const _urlSafe = Symbol('_urlSafe');
+convert.Base64Encoder = class Base64Encoder extends convert.Converter$(core.List$(core.int), core.String) {
+  new() {
+    this[_urlSafe] = false;
+    super.new();
+  }
+  urlSafe() {
+    this[_urlSafe] = true;
+    super.new();
+  }
+  convert(input) {
+    if (dart.test(input[dartx.isEmpty])) return "";
+    let encoder = new convert._Base64Encoder(this[_urlSafe]);
+    let buffer = encoder.encode(input, 0, input[dartx.length], true);
+    return core.String.fromCharCodes(buffer);
+  }
+  startChunkedConversion(sink) {
+    if (convert.StringConversionSink.is(sink)) {
+      return new convert._Utf8Base64EncoderSink(sink.asUtf8Sink(false), this[_urlSafe]);
+    }
+    return new convert._AsciiBase64EncoderSink(sink, this[_urlSafe]);
+  }
+};
+dart.addSimpleTypeTests(convert.Base64Encoder);
+dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
+dart.setSignature(convert.Base64Encoder, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.Base64Encoder, []),
+    urlSafe: dart.definiteFunctionType(convert.Base64Encoder, [])
+  }),
+  fields: () => ({[_urlSafe]: core.bool}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [ListOfint()]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
+  })
+});
+let const$31;
+const _encoder = Symbol('_encoder');
+let const$32;
+let const$33;
+convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
+  new() {
+    this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
+    super.new();
+  }
+  urlSafe() {
+    this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
+    super.new();
+  }
+  get encoder() {
+    return this[_encoder];
+  }
+  get decoder() {
+    return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
+  }
+};
+dart.addSimpleTypeTests(convert.Base64Codec);
+dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
+dart.setSignature(convert.Base64Codec, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.Base64Codec, []),
+    urlSafe: dart.definiteFunctionType(convert.Base64Codec, [])
+  }),
+  fields: () => ({[_encoder]: convert.Base64Encoder}),
+  getters: () => ({
+    encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
+    decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
+  })
+});
+convert.BASE64 = dart.const(new convert.Base64Codec());
+convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
+convert._paddingChar = 61;
+const _alphabet = Symbol('_alphabet');
+const _state$0 = Symbol('_state');
+convert._Base64Encoder = class _Base64Encoder extends core.Object {
+  new(urlSafe) {
+    this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
+    this[_state$0] = 0;
+  }
+  static _encodeState(count, bits) {
+    dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
+    return (dart.notNull(bits) << convert._Base64Encoder._valueShift | dart.notNull(count)) >>> 0;
+  }
+  static _stateBits(state) {
+    return state[dartx['>>']](convert._Base64Encoder._valueShift);
+  }
+  static _stateCount(state) {
+    return dart.notNull(state) & convert._Base64Encoder._countMask;
+  }
+  createBuffer(bufferLength) {
+    return typed_data.Uint8List.new(bufferLength);
+  }
+  encode(bytes, start, end, isLast) {
+    dart.assert(0 <= dart.notNull(start));
+    dart.assert(dart.notNull(start) <= dart.notNull(end));
+    dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
+    let length = dart.notNull(end) - dart.notNull(start);
+    let count = convert._Base64Encoder._stateCount(this[_state$0]);
+    let byteCount = dart.notNull(count) + length;
+    let fullChunks = (byteCount / 3)[dartx.truncate]();
+    let partialChunkLength = byteCount - fullChunks * 3;
+    let bufferLength = fullChunks * 4;
+    if (dart.test(isLast) && partialChunkLength > 0) {
+      bufferLength = bufferLength + 4;
+    }
+    let output = this.createBuffer(bufferLength);
+    this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
+    if (bufferLength > 0) return output;
+    return null;
+  }
+  static encodeChunk(alphabet, bytes, start, end, isLast, output, outputIndex, state) {
+    let bits = convert._Base64Encoder._stateBits(state);
+    let expectedChars = 3 - dart.notNull(convert._Base64Encoder._stateCount(state));
+    let byteOr = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let byte = bytes[dartx._get](i);
+      byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
+      bits = (dart.notNull(bits) << 8 | dart.notNull(byte)) & 16777215;
+      expectedChars--;
+      if (expectedChars == 0) {
+        output[dartx._set]((() => {
+          let x = outputIndex;
+          outputIndex = dart.notNull(x) + 1;
+          return x;
+        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 18 & convert._Base64Encoder._sixBitMask));
+        output[dartx._set]((() => {
+          let x = outputIndex;
+          outputIndex = dart.notNull(x) + 1;
+          return x;
+        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 12 & convert._Base64Encoder._sixBitMask));
+        output[dartx._set]((() => {
+          let x = outputIndex;
+          outputIndex = dart.notNull(x) + 1;
+          return x;
+        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 6 & convert._Base64Encoder._sixBitMask));
+        output[dartx._set]((() => {
+          let x = outputIndex;
+          outputIndex = dart.notNull(x) + 1;
+          return x;
+        })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) & convert._Base64Encoder._sixBitMask));
+        expectedChars = 3;
+        bits = 0;
+      }
+    }
+    if (dart.notNull(byteOr) >= 0 && dart.notNull(byteOr) <= 255) {
+      if (dart.test(isLast) && expectedChars < 3) {
+        convert._Base64Encoder.writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
+        return 0;
+      }
+      return convert._Base64Encoder._encodeState(3 - expectedChars, bits);
+    }
+    let i = start;
+    while (dart.notNull(i) < dart.notNull(end)) {
+      let byte = bytes[dartx._get](i);
+      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) break;
+      i = dart.notNull(i) + 1;
+    }
+    dart.throw(new core.ArgumentError.value(bytes, dart.str`Not a byte value at index ${i}: 0x${bytes[dartx._get](i)[dartx.toRadixString](16)}`));
+  }
+  static writeFinalChunk(alphabet, output, outputIndex, count, bits) {
+    dart.assert(dart.notNull(count) > 0);
+    if (count == 1) {
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 2 & convert._Base64Encoder._sixBitMask));
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 4 & convert._Base64Encoder._sixBitMask));
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), convert._paddingChar);
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), convert._paddingChar);
+    } else {
+      dart.assert(count == 2);
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 10 & convert._Base64Encoder._sixBitMask));
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) >> 4 & convert._Base64Encoder._sixBitMask));
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), alphabet[dartx.codeUnitAt](dart.notNull(bits) << 2 & convert._Base64Encoder._sixBitMask));
+      output[dartx._set]((() => {
+        let x = outputIndex;
+        outputIndex = dart.notNull(x) + 1;
+        return x;
+      })(), convert._paddingChar);
+    }
+  }
+};
+dart.setSignature(convert._Base64Encoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
+  fields: () => ({
+    [_state$0]: core.int,
+    [_alphabet]: core.String
+  }),
+  methods: () => ({
+    createBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
+    encode: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint(), core.int, core.int, core.bool])
+  }),
+  sfields: () => ({
+    _base64Alphabet: core.String,
+    _base64urlAlphabet: core.String,
+    _valueShift: core.int,
+    _countMask: core.int,
+    _sixBitMask: core.int
+  }),
+  statics: () => ({
+    _encodeState: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    _stateBits: dart.definiteFunctionType(core.int, [core.int]),
+    _stateCount: dart.definiteFunctionType(core.int, [core.int]),
+    encodeChunk: dart.definiteFunctionType(core.int, [core.String, ListOfint(), core.int, core.int, core.bool, typed_data.Uint8List, core.int, core.int]),
+    writeFinalChunk: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List, core.int, core.int, core.int])
+  }),
+  names: ['_encodeState', '_stateBits', '_stateCount', 'encodeChunk', 'writeFinalChunk']
+});
+convert._Base64Encoder._base64Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+convert._Base64Encoder._base64urlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+convert._Base64Encoder._valueShift = 2;
+convert._Base64Encoder._countMask = 3;
+convert._Base64Encoder._sixBitMask = 63;
+convert._BufferCachingBase64Encoder = class _BufferCachingBase64Encoder extends convert._Base64Encoder {
+  new(urlSafe) {
+    this.bufferCache = null;
+    super.new(urlSafe);
+  }
+  createBuffer(bufferLength) {
+    if (this.bufferCache == null || dart.notNull(this.bufferCache[dartx.length]) < dart.notNull(bufferLength)) {
+      this.bufferCache = typed_data.Uint8List.new(bufferLength);
+    }
+    return typed_data.Uint8List.view(this.bufferCache[dartx.buffer], 0, bufferLength);
+  }
+};
+dart.setSignature(convert._BufferCachingBase64Encoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
+  fields: () => ({bufferCache: typed_data.Uint8List})
+});
+const _add$1 = Symbol('_add');
+convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
+  new() {
+    super.new();
+  }
+  add(source) {
+    this[_add$1](source, 0, source[dartx.length], false);
+  }
+  close() {
+    this[_add$1](null, 0, 0, true);
+  }
+  addSlice(source, start, end, isLast) {
+    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
+    core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    this[_add$1](source, start, end, isLast);
+  }
+};
+dart.setSignature(convert._Base64EncoderSink, {
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
+  new(sink, urlSafe) {
+    this[_sink$] = sink;
+    this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
+    super.new();
+  }
+  [_add$1](source, start, end, isLast) {
+    let buffer = this[_encoder].encode(source, start, end, isLast);
+    if (buffer != null) {
+      let string = core.String.fromCharCodes(buffer);
+      this[_sink$].add(string);
+    }
+    if (dart.test(isLast)) {
+      this[_sink$].close();
+    }
+  }
+};
+dart.setSignature(convert._AsciiBase64EncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
+  fields: () => ({
+    [_sink$]: SinkOfString(),
+    [_encoder]: convert._Base64Encoder
+  }),
+  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
+});
+convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
+  new(sink, urlSafe) {
+    this[_sink$] = sink;
+    this[_encoder] = new convert._Base64Encoder(urlSafe);
+    super.new();
+  }
+  [_add$1](source, start, end, isLast) {
+    let buffer = this[_encoder].encode(source, start, end, isLast);
+    if (buffer != null) {
+      this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
+    }
+  }
+};
+dart.setSignature(convert._Utf8Base64EncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
+  fields: () => ({
+    [_sink$]: convert.ByteConversionSink,
+    [_encoder]: convert._Base64Encoder
+  }),
+  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
+});
+convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
+  new() {
+    super.new();
+  }
+  convert(input, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    end = core.RangeError.checkValidRange(start, end, input[dartx.length]);
+    if (start == end) return typed_data.Uint8List.new(0);
+    let decoder = new convert._Base64Decoder();
+    let buffer = decoder.decode(input, start, end);
+    decoder.close(input, end);
+    return buffer;
+  }
+  startChunkedConversion(sink) {
+    return new convert._Base64DecoderSink(sink);
+  }
+};
+dart.addSimpleTypeTests(convert.Base64Decoder);
+dart.setSignature(convert.Base64Decoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Base64Decoder, [])}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
+  })
+});
+convert._Base64Decoder = class _Base64Decoder extends core.Object {
+  new() {
+    this[_state$0] = 0;
+  }
+  static _encodeCharacterState(count, bits) {
+    dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
+    return (dart.notNull(bits) << convert._Base64Decoder._valueShift | dart.notNull(count)) >>> 0;
+  }
+  static _stateCount(state) {
+    dart.assert(dart.notNull(state) >= 0);
+    return dart.notNull(state) & convert._Base64Decoder._countMask;
+  }
+  static _stateBits(state) {
+    dart.assert(dart.notNull(state) >= 0);
+    return state[dartx['>>']](convert._Base64Decoder._valueShift);
+  }
+  static _encodePaddingState(expectedPadding) {
+    dart.assert(dart.notNull(expectedPadding) >= 0);
+    dart.assert(dart.notNull(expectedPadding) <= 5);
+    return -dart.notNull(expectedPadding) - 1;
+  }
+  static _statePadding(state) {
+    dart.assert(dart.notNull(state) < 0);
+    return -dart.notNull(state) - 1;
+  }
+  static _hasSeenPadding(state) {
+    return dart.notNull(state) < 0;
+  }
+  decode(input, start, end) {
+    dart.assert(0 <= dart.notNull(start));
+    dart.assert(dart.notNull(start) <= dart.notNull(end));
+    dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
+    if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
+      this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
+      return null;
+    }
+    if (start == end) return typed_data.Uint8List.new(0);
+    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
+    this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
+    return buffer;
+  }
+  close(input, end) {
+    if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
+      dart.throw(new core.FormatException("Missing padding character", input, end));
+    }
+    if (dart.notNull(this[_state$0]) > 0) {
+      dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
+    }
+    this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
+  }
+  static decodeChunk(input, start, end, output, outIndex, state) {
+    dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
+    let asciiMask = 127;
+    let asciiMax = 127;
+    let eightBitMask = 255;
+    let bitsPerCharacter = 6;
+    let bits = convert._Base64Decoder._stateBits(state);
+    let count = convert._Base64Decoder._stateCount(state);
+    let charOr = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = input[dartx.codeUnitAt](i);
+      charOr = (dart.notNull(charOr) | dart.notNull(char)) >>> 0;
+      let code = convert._Base64Decoder._inverseAlphabet[dartx._get]((dart.notNull(char) & asciiMask) >>> 0);
+      if (dart.notNull(code) >= 0) {
+        bits = (bits[dartx['<<']](bitsPerCharacter) | dart.notNull(code)) & 16777215;
+        count = dart.notNull(count) + 1 & 3;
+        if (count == 0) {
+          dart.assert(dart.notNull(outIndex) + 3 <= dart.notNull(output[dartx.length]));
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), (bits[dartx['>>']](16) & eightBitMask) >>> 0);
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), (bits[dartx['>>']](8) & eightBitMask) >>> 0);
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), (dart.notNull(bits) & eightBitMask) >>> 0);
+          bits = 0;
+        }
+        continue;
+      } else if (code == convert._Base64Decoder._padding && dart.notNull(count) > 1) {
+        if (dart.notNull(charOr) < 0 || dart.notNull(charOr) > asciiMax) break;
+        if (count == 3) {
+          if ((dart.notNull(bits) & 3) != 0) {
+            dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
+          }
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), bits[dartx['>>']](10));
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), bits[dartx['>>']](2));
+        } else {
+          if ((dart.notNull(bits) & 15) != 0) {
+            dart.throw(new core.FormatException("Invalid encoding before padding", input, i));
+          }
+          output[dartx._set]((() => {
+            let x = outIndex;
+            outIndex = dart.notNull(x) + 1;
+            return x;
+          })(), bits[dartx['>>']](4));
+        }
+        let expectedPadding = (3 - dart.notNull(count)) * 3;
+        if (char == convert._Base64Decoder._char_percent) {
+          expectedPadding = expectedPadding + 2;
+        }
+        state = convert._Base64Decoder._encodePaddingState(expectedPadding);
+        return convert._Base64Decoder._checkPadding(input, dart.notNull(i) + 1, end, state);
+      }
+      dart.throw(new core.FormatException("Invalid character", input, i));
+    }
+    if (dart.notNull(charOr) >= 0 && dart.notNull(charOr) <= asciiMax) {
+      return convert._Base64Decoder._encodeCharacterState(count, bits);
+    }
+    let i = null;
+    for (i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = input[dartx.codeUnitAt](i);
+      if (dart.notNull(char) < 0 || dart.notNull(char) > asciiMax) break;
+    }
+    dart.throw(new core.FormatException("Invalid character", input, i));
+  }
+  static _allocateBuffer(input, start, end, state) {
+    dart.assert(dart.notNull(state) >= 0);
+    let paddingStart = convert._Base64Decoder._trimPaddingChars(input, start, end);
+    let length = dart.notNull(convert._Base64Decoder._stateCount(state)) + (dart.notNull(paddingStart) - dart.notNull(start));
+    let bufferLength = length[dartx['>>']](2) * 3;
+    let remainderLength = length & 3;
+    if (remainderLength != 0 && dart.notNull(paddingStart) < dart.notNull(end)) {
+      bufferLength = bufferLength + (remainderLength - 1);
+    }
+    if (bufferLength > 0) return typed_data.Uint8List.new(bufferLength);
+    return null;
+  }
+  static _trimPaddingChars(input, start, end) {
+    let padding = 0;
+    let index = end;
+    let newEnd = end;
+    while (dart.notNull(index) > dart.notNull(start) && padding < 2) {
+      index = dart.notNull(index) - 1;
+      let char = input[dartx.codeUnitAt](index);
+      if (char == convert._paddingChar) {
+        padding++;
+        newEnd = index;
+        continue;
+      }
+      if ((dart.notNull(char) | 32) == convert._Base64Decoder._char_d) {
+        if (index == start) break;
+        index = dart.notNull(index) - 1;
+        char = input[dartx.codeUnitAt](index);
+      }
+      if (char == convert._Base64Decoder._char_3) {
+        if (index == start) break;
+        index = dart.notNull(index) - 1;
+        char = input[dartx.codeUnitAt](index);
+      }
+      if (char == convert._Base64Decoder._char_percent) {
+        padding++;
+        newEnd = index;
+        continue;
+      }
+      break;
+    }
+    return newEnd;
+  }
+  static _checkPadding(input, start, end, state) {
+    dart.assert(convert._Base64Decoder._hasSeenPadding(state));
+    if (start == end) return state;
+    let expectedPadding = convert._Base64Decoder._statePadding(state);
+    dart.assert(dart.notNull(expectedPadding) >= 0);
+    dart.assert(dart.notNull(expectedPadding) < 6);
+    while (dart.notNull(expectedPadding) > 0) {
+      let char = input[dartx.codeUnitAt](start);
+      if (expectedPadding == 3) {
+        if (char == convert._paddingChar) {
+          expectedPadding = dart.notNull(expectedPadding) - 3;
+          start = dart.notNull(start) + 1;
+          break;
+        }
+        if (char == convert._Base64Decoder._char_percent) {
+          expectedPadding = dart.notNull(expectedPadding) - 1;
+          start = dart.notNull(start) + 1;
+          if (start == end) break;
+          char = input[dartx.codeUnitAt](start);
+        } else {
+          break;
+        }
+      }
+      let expectedPartialPadding = expectedPadding;
+      if (dart.notNull(expectedPartialPadding) > 3) {
+        expectedPartialPadding = dart.notNull(expectedPartialPadding) - 3;
+      }
+      if (expectedPartialPadding == 2) {
+        if (char != convert._Base64Decoder._char_3) break;
+        start = dart.notNull(start) + 1;
+        expectedPadding = dart.notNull(expectedPadding) - 1;
+        if (start == end) break;
+        char = input[dartx.codeUnitAt](start);
+      }
+      if ((dart.notNull(char) | 32) != convert._Base64Decoder._char_d) break;
+      start = dart.notNull(start) + 1;
+      expectedPadding = dart.notNull(expectedPadding) - 1;
+      if (start == end) break;
+    }
+    if (start != end) {
+      dart.throw(new core.FormatException("Invalid padding character", input, start));
+    }
+    return convert._Base64Decoder._encodePaddingState(expectedPadding);
+  }
+};
+dart.setSignature(convert._Base64Decoder, {
+  fields: () => ({[_state$0]: core.int}),
+  methods: () => ({
+    decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
+    close: dart.definiteFunctionType(dart.void, [core.String, core.int])
+  }),
+  sfields: () => ({
+    _valueShift: core.int,
+    _countMask: core.int,
+    _invalid: core.int,
+    _padding: core.int,
+    __: core.int,
+    _p: core.int,
+    _inverseAlphabet: ListOfint(),
+    _char_percent: core.int,
+    _char_3: core.int,
+    _char_d: core.int
+  }),
+  statics: () => ({
+    _encodeCharacterState: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    _stateCount: dart.definiteFunctionType(core.int, [core.int]),
+    _stateBits: dart.definiteFunctionType(core.int, [core.int]),
+    _encodePaddingState: dart.definiteFunctionType(core.int, [core.int]),
+    _statePadding: dart.definiteFunctionType(core.int, [core.int]),
+    _hasSeenPadding: dart.definiteFunctionType(core.bool, [core.int]),
+    decodeChunk: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, typed_data.Uint8List, core.int, core.int]),
+    _allocateBuffer: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int, core.int]),
+    _trimPaddingChars: dart.definiteFunctionType(core.int, [core.String, core.int, core.int]),
+    _checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int])
+  }),
+  names: ['_encodeCharacterState', '_stateCount', '_stateBits', '_encodePaddingState', '_statePadding', '_hasSeenPadding', 'decodeChunk', '_allocateBuffer', '_trimPaddingChars', '_checkPadding']
+});
+convert._Base64Decoder._valueShift = 2;
+convert._Base64Decoder._countMask = 3;
+convert._Base64Decoder._invalid = -2;
+convert._Base64Decoder._padding = -1;
+convert._Base64Decoder._char_percent = 37;
+convert._Base64Decoder._char_3 = 51;
+convert._Base64Decoder._char_d = 100;
+dart.defineLazy(convert._Base64Decoder, {
+  get __() {
+    return convert._Base64Decoder._invalid;
+  },
+  get _p() {
+    return convert._Base64Decoder._padding;
+  },
+  get _inverseAlphabet() {
+    return typed_data.Int8List.fromList(JSArrayOfint().of([convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 62, convert._Base64Decoder.__, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder._p, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, 63, convert._Base64Decoder.__, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__, convert._Base64Decoder.__]));
+  }
+});
+const _decoder = Symbol('_decoder');
+convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
+  new(sink) {
+    this[_decoder] = new convert._Base64Decoder();
+    this[_sink$] = sink;
+  }
+  add(string) {
+    if (dart.test(string[dartx.isEmpty])) return;
+    let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
+    if (buffer != null) this[_sink$].add(buffer);
+  }
+  close() {
+    this[_decoder].close(null, null);
+    this[_sink$].close();
+  }
+  addSlice(string, start, end, isLast) {
+    end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
+    if (start == end) return;
+    let buffer = this[_decoder].decode(string, start, end);
+    if (buffer != null) this[_sink$].add(buffer);
+    if (dart.test(isLast)) {
+      this[_decoder].close(string, end);
+      this[_sink$].close();
+    }
+  }
+};
+dart.setSignature(convert._Base64DecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
+  fields: () => ({
+    [_sink$]: SinkOfListOfint(),
+    [_decoder]: convert._Base64Decoder
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+  })
+});
+convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
+  new(sink) {
+    this[_sink$] = sink;
+    super.new();
+  }
+  add(chunk) {
+    this[_sink$].add(chunk);
+  }
+  close() {
+    this[_sink$].close();
+  }
+};
+dart.setSignature(convert._ByteAdapterSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
+  fields: () => ({[_sink$]: SinkOfListOfint()}),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _buffer = Symbol('_buffer');
+const _callback = Symbol('_callback');
+const _bufferIndex = Symbol('_bufferIndex');
+convert._ByteCallbackSink = class _ByteCallbackSink extends convert.ByteConversionSinkBase {
+  new(callback) {
+    this[_buffer] = typed_data.Uint8List.new(convert._ByteCallbackSink._INITIAL_BUFFER_SIZE);
+    this[_callback] = callback;
+    this[_bufferIndex] = 0;
+    super.new();
+  }
+  add(chunk) {
+    let freeCount = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_bufferIndex]);
+    if (dart.notNull(chunk[dartx.length]) > freeCount) {
+      let oldLength = this[_buffer][dartx.length];
+      let newLength = dart.notNull(convert._ByteCallbackSink._roundToPowerOf2(dart.notNull(chunk[dartx.length]) + dart.notNull(oldLength))) * 2;
+      let grown = typed_data.Uint8List.new(newLength);
+      grown[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
+      this[_buffer] = grown;
+    }
+    this[_buffer][dartx.setRange](this[_bufferIndex], dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]), chunk);
+    this[_bufferIndex] = dart.notNull(this[_bufferIndex]) + dart.notNull(chunk[dartx.length]);
+  }
+  static _roundToPowerOf2(v) {
+    dart.assert(dart.notNull(v) > 0);
+    v = dart.notNull(v) - 1;
+    v = (dart.notNull(v) | v[dartx['>>']](1)) >>> 0;
+    v = (dart.notNull(v) | v[dartx['>>']](2)) >>> 0;
+    v = (dart.notNull(v) | v[dartx['>>']](4)) >>> 0;
+    v = (dart.notNull(v) | v[dartx['>>']](8)) >>> 0;
+    v = (dart.notNull(v) | v[dartx['>>']](16)) >>> 0;
+    v = dart.notNull(v) + 1;
+    return v;
+  }
+  close() {
+    this[_callback](this[_buffer][dartx.sublist](0, this[_bufferIndex]));
+  }
+};
+dart.setSignature(convert._ByteCallbackSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._ByteCallbackSink, [ListOfintTovoid()])}),
+  fields: () => ({
+    [_callback]: ListOfintTovoid(),
+    [_buffer]: ListOfint(),
+    [_bufferIndex]: core.int
+  }),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [IterableOfint()]),
+    close: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({_INITIAL_BUFFER_SIZE: core.int}),
+  statics: () => ({_roundToPowerOf2: dart.definiteFunctionType(core.int, [core.int])}),
+  names: ['_roundToPowerOf2']
+});
+convert._ByteCallbackSink._INITIAL_BUFFER_SIZE = 1024;
+convert._ChunkedConversionCallback$ = dart.generic(T => {
+  const _ChunkedConversionCallback = dart.typedef('_ChunkedConversionCallback', () => dart.functionType(dart.void, [T]));
+  return _ChunkedConversionCallback;
+});
+convert._ChunkedConversionCallback = _ChunkedConversionCallback();
+convert.ChunkedConverter$ = dart.generic((S, T, S2, T2) => {
+  let StreamOfS = () => (StreamOfS = dart.constFn(async.Stream$(S)))();
+  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
+  class ChunkedConverter extends convert.Converter$(S, T) {
+    new() {
+      super.new();
+    }
+    bind(other) {
+      return super.bind(StreamOfS()._check(other));
+    }
+    startChunkedConversion(sink) {
+      return super.startChunkedConversion(SinkOfT()._check(sink));
+    }
+  }
+  dart.setSignature(ChunkedConverter, {
+    constructors: () => ({new: dart.definiteFunctionType(convert.ChunkedConverter$(S, T, S2, T2), [])}),
+    methods: () => ({
+      bind: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+      startChunkedConversion: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+    })
+  });
+  return ChunkedConverter;
+});
+convert.ChunkedConverter = ChunkedConverter();
+const _accumulated = Symbol('_accumulated');
+convert._SimpleCallbackSink$ = dart.generic(T => {
+  let JSArrayOfT = () => (JSArrayOfT = dart.constFn(_interceptors.JSArray$(T)))();
+  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
+  let _ChunkedConversionCallbackOfListOfT = () => (_ChunkedConversionCallbackOfListOfT = dart.constFn(convert._ChunkedConversionCallback$(ListOfT())))();
+  class _SimpleCallbackSink extends convert.ChunkedConversionSink$(T) {
+    new(callback) {
+      this[_accumulated] = JSArrayOfT().of([]);
+      this[_callback] = callback;
+      super.new();
+    }
+    add(chunk) {
+      T._check(chunk);
+      this[_accumulated][dartx.add](chunk);
+    }
+    close() {
+      this[_callback](this[_accumulated]);
+    }
+  }
+  dart.setSignature(_SimpleCallbackSink, {
+    constructors: () => ({new: dart.definiteFunctionType(convert._SimpleCallbackSink$(T), [_ChunkedConversionCallbackOfListOfT()])}),
+    fields: () => ({
+      [_callback]: _ChunkedConversionCallbackOfListOfT(),
+      [_accumulated]: ListOfT()
+    }),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [T]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _SimpleCallbackSink;
+});
+convert._SimpleCallbackSink = _SimpleCallbackSink();
+const _eventSink = Symbol('_eventSink');
+const _chunkedSink = Symbol('_chunkedSink');
+convert._ConverterStreamEventSink$ = dart.generic((S, T) => {
+  let EventSinkOfS = () => (EventSinkOfS = dart.constFn(async.EventSink$(S)))();
+  let SinkOfS = () => (SinkOfS = dart.constFn(core.Sink$(S)))();
+  let ConverterOfS$T = () => (ConverterOfS$T = dart.constFn(convert.Converter$(S, T)))();
+  let EventSinkOfT = () => (EventSinkOfT = dart.constFn(async.EventSink$(T)))();
+  class _ConverterStreamEventSink extends core.Object {
+    new(converter, sink) {
+      this[_eventSink] = sink;
+      this[_chunkedSink] = converter.startChunkedConversion(sink);
+    }
+    add(o) {
+      S._check(o);
+      this[_chunkedSink].add(o);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_eventSink].addError(error, stackTrace);
+    }
+    close() {
+      this[_chunkedSink].close();
+    }
+  }
+  dart.addTypeTests(_ConverterStreamEventSink);
+  _ConverterStreamEventSink[dart.implements] = () => [EventSinkOfS()];
+  dart.setSignature(_ConverterStreamEventSink, {
+    constructors: () => ({new: dart.definiteFunctionType(convert._ConverterStreamEventSink$(S, T), [ConverterOfS$T(), EventSinkOfT()])}),
+    fields: () => ({
+      [_eventSink]: EventSinkOfT(),
+      [_chunkedSink]: SinkOfS()
+    }),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [S]),
+      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _ConverterStreamEventSink;
+});
+convert._ConverterStreamEventSink = _ConverterStreamEventSink();
+const _second = Symbol('_second');
+const _first$0 = Symbol('_first');
+convert._FusedCodec$ = dart.generic((S, M, T) => {
+  let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
+  let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
+  class _FusedCodec extends convert.Codec$(S, T) {
+    get encoder() {
+      return this[_first$0].encoder.fuse(T)(this[_second].encoder);
+    }
+    get decoder() {
+      return this[_second].decoder.fuse(S)(this[_first$0].decoder);
+    }
+    new(first, second) {
+      this[_first$0] = first;
+      this[_second] = second;
+      super.new();
+    }
+  }
+  dart.setSignature(_FusedCodec, {
+    constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
+    fields: () => ({
+      [_first$0]: CodecOfS$M(),
+      [_second]: CodecOfM$T()
+    }),
+    getters: () => ({
+      encoder: dart.definiteFunctionType(convert.Converter$(S, T), []),
+      decoder: dart.definiteFunctionType(convert.Converter$(T, S), [])
+    })
+  });
+  return _FusedCodec;
+});
+convert._FusedCodec = _FusedCodec();
+const _codec = Symbol('_codec');
+convert._InvertedCodec$ = dart.generic((T, S) => {
+  let CodecOfS$T = () => (CodecOfS$T = dart.constFn(convert.Codec$(S, T)))();
+  class _InvertedCodec extends convert.Codec$(T, S) {
+    new(codec) {
+      this[_codec] = codec;
+      super.new();
+    }
+    get encoder() {
+      return this[_codec].decoder;
+    }
+    get decoder() {
+      return this[_codec].encoder;
+    }
+    get inverted() {
+      return this[_codec];
+    }
+  }
+  dart.setSignature(_InvertedCodec, {
+    constructors: () => ({new: dart.definiteFunctionType(convert._InvertedCodec$(T, S), [CodecOfS$T()])}),
+    fields: () => ({[_codec]: CodecOfS$T()}),
+    getters: () => ({
+      encoder: dart.definiteFunctionType(convert.Converter$(T, S), []),
+      decoder: dart.definiteFunctionType(convert.Converter$(S, T), [])
+    })
+  });
+  return _InvertedCodec;
+});
+convert._InvertedCodec = _InvertedCodec();
+convert._FusedConverter$ = dart.generic((S, M, T) => {
+  let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
+  let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
+  let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
+  class _FusedConverter extends convert.Converter$(S, T) {
+    new(first, second) {
+      this[_first$0] = first;
+      this[_second] = second;
+      super.new();
+    }
+    convert(input) {
+      S._check(input);
+      return this[_second].convert(this[_first$0].convert(input));
+    }
+    startChunkedConversion(sink) {
+      SinkOfT()._check(sink);
+      return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
+    }
+  }
+  dart.setSignature(_FusedConverter, {
+    constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
+    fields: () => ({
+      [_first$0]: ConverterOfS$M(),
+      [_second]: ConverterOfM$T()
+    }),
+    methods: () => ({convert: dart.definiteFunctionType(T, [S])})
+  });
+  return _FusedConverter;
+});
+convert._FusedConverter = _FusedConverter();
+const _name$1 = Symbol('_name');
+let const$34;
+let const$35;
+let const$36;
+let const$37;
+let const$38;
+let const$39;
+let const$40;
+let const$41;
+convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
+  _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
+    this[_name$1] = name;
+    this.escapeLtGt = escapeLtGt;
+    this.escapeQuot = escapeQuot;
+    this.escapeApos = escapeApos;
+    this.escapeSlash = escapeSlash;
+  }
+  new(opts) {
+    let name = opts && 'name' in opts ? opts.name : "custom";
+    let escapeLtGt = opts && 'escapeLtGt' in opts ? opts.escapeLtGt : false;
+    let escapeQuot = opts && 'escapeQuot' in opts ? opts.escapeQuot : false;
+    let escapeApos = opts && 'escapeApos' in opts ? opts.escapeApos : false;
+    let escapeSlash = opts && 'escapeSlash' in opts ? opts.escapeSlash : false;
+    this.escapeLtGt = escapeLtGt;
+    this.escapeQuot = escapeQuot;
+    this.escapeApos = escapeApos;
+    this.escapeSlash = escapeSlash;
+    this[_name$1] = name;
+  }
+  toString() {
+    return this[_name$1];
+  }
+};
+dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
+dart.setSignature(convert.HtmlEscapeMode, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(convert.HtmlEscapeMode, [core.String, core.bool, core.bool, core.bool, core.bool]),
+    new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
+  }),
+  fields: () => ({
+    [_name$1]: core.String,
+    escapeLtGt: core.bool,
+    escapeQuot: core.bool,
+    escapeApos: core.bool,
+    escapeSlash: core.bool
+  }),
+  sfields: () => ({
+    UNKNOWN: convert.HtmlEscapeMode,
+    ATTRIBUTE: convert.HtmlEscapeMode,
+    SQ_ATTRIBUTE: convert.HtmlEscapeMode,
+    ELEMENT: convert.HtmlEscapeMode
+  })
+});
+dart.defineLazy(convert.HtmlEscapeMode, {
+  get UNKNOWN() {
+    return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
+  },
+  get ATTRIBUTE() {
+    return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
+  },
+  get SQ_ATTRIBUTE() {
+    return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
+  },
+  get ELEMENT() {
+    return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
+  }
+});
+const _convert = Symbol('_convert');
+convert.HtmlEscape = class HtmlEscape extends convert.Converter$(core.String, core.String) {
+  new(mode) {
+    if (mode === void 0) mode = convert.HtmlEscapeMode.UNKNOWN;
+    this.mode = mode;
+    super.new();
+  }
+  convert(text) {
+    let val = this[_convert](text, 0, text[dartx.length]);
+    return val == null ? text : val;
+  }
+  [_convert](text, start, end) {
+    let result = null;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let ch = text[dartx._get](i);
+      let replacement = null;
+      switch (ch) {
+        case '&':
+        {
+          replacement = '&amp;';
+          break;
+        }
+        case '"':
+        {
+          if (dart.test(this.mode.escapeQuot)) replacement = '&quot;';
+          break;
+        }
+        case "'":
+        {
+          if (dart.test(this.mode.escapeApos)) replacement = '&#39;';
+          break;
+        }
+        case '<':
+        {
+          if (dart.test(this.mode.escapeLtGt)) replacement = '&lt;';
+          break;
+        }
+        case '>':
+        {
+          if (dart.test(this.mode.escapeLtGt)) replacement = '&gt;';
+          break;
+        }
+        case '/':
+        {
+          if (dart.test(this.mode.escapeSlash)) replacement = '&#47;';
+          break;
+        }
+      }
+      if (replacement != null) {
+        if (result == null) result = new core.StringBuffer();
+        if (dart.notNull(i) > dart.notNull(start)) result.write(text[dartx.substring](start, i));
+        result.write(replacement);
+        start = dart.notNull(i) + 1;
+      }
+    }
+    if (result == null) return null;
+    if (dart.notNull(end) > dart.notNull(start)) result.write(text[dartx.substring](start, end));
+    return dart.toString(result);
+  }
+  startChunkedConversion(sink) {
+    if (!convert.StringConversionSink.is(sink)) {
+      sink = convert.StringConversionSink.from(sink);
+    }
+    return new convert._HtmlEscapeSink(this, convert.StringConversionSink._check(sink));
+  }
+};
+dart.addSimpleTypeTests(convert.HtmlEscape);
+dart.setSignature(convert.HtmlEscape, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.HtmlEscape, [], [convert.HtmlEscapeMode])}),
+  fields: () => ({mode: convert.HtmlEscapeMode}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [core.String]),
+    [_convert]: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()])
+  })
+});
+convert.HTML_ESCAPE = dart.const(new convert.HtmlEscape());
+const _escape = Symbol('_escape');
+convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
+  new(escape, sink) {
+    this[_escape] = escape;
+    this[_sink$] = sink;
+  }
+  addSlice(chunk, start, end, isLast) {
+    let val = this[_escape][_convert](chunk, start, end);
+    if (val == null) {
+      this[_sink$].addSlice(chunk, start, end, isLast);
+    } else {
+      this[_sink$].add(val);
+      if (dart.test(isLast)) this[_sink$].close();
+    }
+  }
+  close() {
+    this[_sink$].close();
+  }
+};
+dart.setSignature(convert._HtmlEscapeSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
+  fields: () => ({
+    [_escape]: convert.HtmlEscape,
+    [_sink$]: convert.StringConversionSink
+  }),
+  methods: () => ({
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+convert.JsonUnsupportedObjectError = class JsonUnsupportedObjectError extends core.Error {
+  new(unsupportedObject, opts) {
+    let cause = opts && 'cause' in opts ? opts.cause : null;
+    this.unsupportedObject = unsupportedObject;
+    this.cause = cause;
+    super.new();
+  }
+  toString() {
+    if (this.cause != null) {
+      return "Converting object to an encodable object failed.";
+    } else {
+      return "Converting object did not return an encodable object.";
+    }
+  }
+};
+dart.setSignature(convert.JsonUnsupportedObjectError, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.JsonUnsupportedObjectError, [dart.dynamic], {cause: dart.dynamic})}),
+  fields: () => ({
+    unsupportedObject: dart.dynamic,
+    cause: dart.dynamic
+  })
+});
+convert.JsonCyclicError = class JsonCyclicError extends convert.JsonUnsupportedObjectError {
+  new(object) {
+    super.new(object);
+  }
+  toString() {
+    return "Cyclic error in JSON stringify";
+  }
+};
+dart.setSignature(convert.JsonCyclicError, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
+});
+const _toEncodable = Symbol('_toEncodable');
+let const$42;
+let const$43;
+convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
+  new(opts) {
+    let reviver = opts && 'reviver' in opts ? opts.reviver : null;
+    let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
+    this[_reviver] = reviver;
+    this[_toEncodable] = toEncodable;
+    super.new();
+  }
+  withReviver(reviver) {
+    JsonCodec.prototype.new.call(this, {reviver: reviver});
+  }
+  decode(source, opts) {
+    let reviver = opts && 'reviver' in opts ? opts.reviver : null;
+    if (reviver == null) reviver = this[_reviver];
+    if (reviver == null) return this.decoder.convert(source);
+    return new convert.JsonDecoder(reviver).convert(source);
+  }
+  encode(value, opts) {
+    let toEncodable = opts && 'toEncodable' in opts ? opts.toEncodable : null;
+    if (toEncodable == null) toEncodable = this[_toEncodable];
+    if (toEncodable == null) return this.encoder.convert(value);
+    return new convert.JsonEncoder(toEncodable).convert(value);
+  }
+  get encoder() {
+    if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
+    return new convert.JsonEncoder(this[_toEncodable]);
+  }
+  get decoder() {
+    if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
+    return new convert.JsonDecoder(this[_reviver]);
+  }
+};
+dart.addSimpleTypeTests(convert.JsonCodec);
+dart.defineNamedConstructor(convert.JsonCodec, 'withReviver');
+dart.setSignature(convert.JsonCodec, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.JsonCodec, [], {reviver: dynamicAnddynamicTodynamic(), toEncodable: dynamicTodynamic()}),
+    withReviver: dart.definiteFunctionType(convert.JsonCodec, [dynamicAnddynamicTodynamic()])
+  }),
+  fields: () => ({
+    [_reviver]: convert._Reviver,
+    [_toEncodable]: convert._ToEncodable
+  }),
+  getters: () => ({
+    encoder: dart.definiteFunctionType(convert.JsonEncoder, []),
+    decoder: dart.definiteFunctionType(convert.JsonDecoder, [])
+  }),
+  methods: () => ({
+    decode: dart.definiteFunctionType(dart.dynamic, [core.String], {reviver: dynamicAnddynamicTodynamic()}),
+    encode: dart.definiteFunctionType(core.String, [core.Object], {toEncodable: dynamicTodynamic()})
+  })
+});
+convert.JSON = dart.const(new convert.JsonCodec());
+convert._Reviver = dart.typedef('_Reviver', () => dart.functionType(dart.dynamic, [dart.dynamic, dart.dynamic]));
+convert._ToEncodable = dart.typedef('_ToEncodable', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+convert.JsonEncoder = class JsonEncoder extends convert.Converter$(core.Object, core.String) {
+  new(toEncodable) {
+    if (toEncodable === void 0) toEncodable = null;
+    this.indent = null;
+    this[_toEncodable] = toEncodable;
+    super.new();
+  }
+  withIndent(indent, toEncodable) {
+    if (toEncodable === void 0) toEncodable = null;
+    this.indent = indent;
+    this[_toEncodable] = toEncodable;
+    super.new();
+  }
+  convert(object) {
+    return convert._JsonStringStringifier.stringify(object, this[_toEncodable], this.indent);
+  }
+  startChunkedConversion(sink) {
+    if (!convert.StringConversionSink.is(sink)) {
+      sink = convert.StringConversionSink.from(sink);
+    } else if (convert._Utf8EncoderSink.is(sink)) {
+      return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
+    }
+    return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+  fuse(T) {
+    return other => {
+      if (convert.Utf8Encoder.is(other)) {
+        return convert.Converter$(core.Object, T).as(new convert.JsonUtf8Encoder(this.indent, this[_toEncodable]));
+      }
+      return super.fuse(T)(other);
+    };
+  }
+};
+dart.addSimpleTypeTests(convert.JsonEncoder);
+dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
+dart.setSignature(convert.JsonEncoder, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.JsonEncoder, [], [dynamicTodynamic()]),
+    withIndent: dart.definiteFunctionType(convert.JsonEncoder, [core.String], [dynamicTodynamic()])
+  }),
+  fields: () => ({
+    indent: core.String,
+    [_toEncodable]: convert._ToEncodable
+  }),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [core.Object]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfString()])
+  })
+});
+const _indent = Symbol('_indent');
+const _bufferSize = Symbol('_bufferSize');
+convert.JsonUtf8Encoder = class JsonUtf8Encoder extends convert.Converter$(core.Object, core.List$(core.int)) {
+  new(indent, toEncodable, bufferSize) {
+    if (indent === void 0) indent = null;
+    if (toEncodable === void 0) toEncodable = null;
+    if (bufferSize === void 0) bufferSize = convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE;
+    this[_indent] = convert.JsonUtf8Encoder._utf8Encode(indent);
+    this[_toEncodable] = toEncodable;
+    this[_bufferSize] = bufferSize;
+    super.new();
+  }
+  static _utf8Encode(string) {
+    if (string == null) return null;
+    if (dart.test(string[dartx.isEmpty])) return typed_data.Uint8List.new(0);
+    checkAscii: {
+      for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
+        if (dart.notNull(string[dartx.codeUnitAt](i)) >= 128) break checkAscii;
+      }
+      return string[dartx.codeUnits];
+    }
+    return convert.UTF8.encode(string);
+  }
+  convert(object) {
+    let bytes = JSArrayOfListOfint().of([]);
+    function addChunk(chunk, start, end) {
+      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(chunk[dartx.length])) {
+        let length = dart.notNull(end) - dart.notNull(start);
+        chunk = typed_data.Uint8List.view(chunk[dartx.buffer], dart.notNull(chunk[dartx.offsetInBytes]) + dart.notNull(start), length);
+      }
+      bytes[dartx.add](chunk);
+    }
+    dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
+    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
+    if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
+    let length = 0;
+    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
+      length = dart.notNull(length) + dart.notNull(bytes[dartx._get](i)[dartx.length]);
+    }
+    let result = typed_data.Uint8List.new(length);
+    for (let i = 0, offset = 0; i < dart.notNull(bytes[dartx.length]); i++) {
+      let byteList = bytes[dartx._get](i);
+      let end = offset + dart.notNull(byteList[dartx.length]);
+      result[dartx.setRange](offset, end, byteList);
+      offset = end;
+    }
+    return result;
+  }
+  startChunkedConversion(sink) {
+    let byteSink = null;
+    if (convert.ByteConversionSink.is(sink)) {
+      byteSink = sink;
+    } else {
+      byteSink = convert.ByteConversionSink.from(sink);
+    }
+    return new convert._JsonUtf8EncoderSink(byteSink, this[_toEncodable], this[_indent], this[_bufferSize]);
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+};
+dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
+dart.setSignature(convert.JsonUtf8Encoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.JsonUtf8Encoder, [], [core.String, dynamicTodynamic(), core.int])}),
+  fields: () => ({
+    [_indent]: ListOfint(),
+    [_toEncodable]: convert._ToEncodable,
+    [_bufferSize]: core.int
+  }),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [core.Object]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ChunkedConversionSink$(core.Object), [SinkOfListOfint()])
+  }),
+  sfields: () => ({DEFAULT_BUFFER_SIZE: core.int}),
+  statics: () => ({_utf8Encode: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
+  names: ['_utf8Encode']
+});
+convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE = 256;
+const _isDone = Symbol('_isDone');
+convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
+  new(sink, toEncodable, indent) {
+    this[_sink$] = sink;
+    this[_toEncodable] = toEncodable;
+    this[_indent] = indent;
+    this[_isDone] = false;
+    super.new();
+  }
+  add(o) {
+    if (dart.test(this[_isDone])) {
+      dart.throw(new core.StateError("Only one call to add allowed"));
+    }
+    this[_isDone] = true;
+    let stringSink = this[_sink$].asStringSink();
+    convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
+    stringSink.close();
+  }
+  close() {}
+};
+dart.addSimpleTypeTests(convert._JsonEncoderSink);
+dart.setSignature(convert._JsonEncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonEncoderSink, [convert.StringConversionSink, convert._ToEncodable, core.String])}),
+  fields: () => ({
+    [_indent]: core.String,
+    [_toEncodable]: convert._ToEncodable,
+    [_sink$]: convert.StringConversionSink,
+    [_isDone]: core.bool
+  }),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [core.Object]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _addChunk = Symbol('_addChunk');
+convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
+  new(sink, toEncodable, indent, bufferSize) {
+    this[_sink$] = sink;
+    this[_toEncodable] = toEncodable;
+    this[_indent] = indent;
+    this[_bufferSize] = bufferSize;
+    this[_isDone] = false;
+    super.new();
+  }
+  [_addChunk](chunk, start, end) {
+    this[_sink$].addSlice(chunk, start, end, false);
+  }
+  add(object) {
+    if (dart.test(this[_isDone])) {
+      dart.throw(new core.StateError("Only one call to add allowed"));
+    }
+    this[_isDone] = true;
+    convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
+    this[_sink$].close();
+  }
+  close() {
+    if (!dart.test(this[_isDone])) {
+      this[_isDone] = true;
+      this[_sink$].close();
+    }
+  }
+};
+dart.addSimpleTypeTests(convert._JsonUtf8EncoderSink);
+dart.setSignature(convert._JsonUtf8EncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
+  fields: () => ({
+    [_sink$]: convert.ByteConversionSink,
+    [_indent]: ListOfint(),
+    [_toEncodable]: convert._ToEncodable,
+    [_bufferSize]: core.int,
+    [_isDone]: core.bool
+  }),
+  methods: () => ({
+    [_addChunk]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int]),
+    add: dart.definiteFunctionType(dart.void, [core.Object]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+convert.JsonDecoder = class JsonDecoder extends convert.Converter$(core.String, core.Object) {
+  new(reviver) {
+    if (reviver === void 0) reviver = null;
+    this[_reviver] = reviver;
+    super.new();
+  }
+  convert(input) {
+    return convert._parseJson(input, this[_reviver]);
+  }
+  startChunkedConversion(sink) {
+    return new convert._JsonDecoderSink(this[_reviver], sink);
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+};
+dart.addSimpleTypeTests(convert.JsonDecoder);
+dart.setSignature(convert.JsonDecoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.JsonDecoder, [], [dynamicAnddynamicTodynamic()])}),
+  fields: () => ({[_reviver]: convert._Reviver}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfObject()])
+  })
+});
+convert._parseJson = function(source, reviver) {
+  if (!(typeof source == 'string')) dart.throw(_js_helper.argumentErrorValue(source));
+  let parsed = null;
+  try {
+    parsed = JSON.parse(source);
+  } catch (e) {
+    dart.throw(new core.FormatException(String(e)));
+  }
+
+  if (reviver == null) {
+    return convert._convertJsonToDartLazy(parsed);
+  } else {
+    return convert._convertJsonToDart(parsed, reviver);
+  }
+};
+dart.fn(convert._parseJson, StringAndFnTodynamic());
+convert._defaultToEncodable = function(object) {
+  return dart.dsend(object, 'toJson');
+};
+dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
+const _seen = Symbol('_seen');
+const _checkCycle = Symbol('_checkCycle');
+const _removeSeen = Symbol('_removeSeen');
+convert._JsonStringifier = class _JsonStringifier extends core.Object {
+  new(toEncodable) {
+    this[_seen] = core.List.new();
+    this[_toEncodable] = (() => {
+      let l = toEncodable;
+      return l != null ? l : convert._defaultToEncodable;
+    })();
+  }
+  static hexDigit(x) {
+    return dart.notNull(x) < 10 ? 48 + dart.notNull(x) : 87 + dart.notNull(x);
+  }
+  writeStringContent(s) {
+    let offset = 0;
+    let length = s[dartx.length];
+    for (let i = 0; i < dart.notNull(length); i++) {
+      let charCode = s[dartx.codeUnitAt](i);
+      if (dart.notNull(charCode) > convert._JsonStringifier.BACKSLASH) continue;
+      if (dart.notNull(charCode) < 32) {
+        if (i > offset) this.writeStringSlice(s, offset, i);
+        offset = i + 1;
+        this.writeCharCode(convert._JsonStringifier.BACKSLASH);
+        switch (charCode) {
+          case convert._JsonStringifier.BACKSPACE:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_b);
+            break;
+          }
+          case convert._JsonStringifier.TAB:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_t);
+            break;
+          }
+          case convert._JsonStringifier.NEWLINE:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_n);
+            break;
+          }
+          case convert._JsonStringifier.FORM_FEED:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_f);
+            break;
+          }
+          case convert._JsonStringifier.CARRIAGE_RETURN:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_r);
+            break;
+          }
+          default:
+          {
+            this.writeCharCode(convert._JsonStringifier.CHAR_u);
+            this.writeCharCode(convert._JsonStringifier.CHAR_0);
+            this.writeCharCode(convert._JsonStringifier.CHAR_0);
+            this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) >> 4 & 15));
+            this.writeCharCode(convert._JsonStringifier.hexDigit(dart.notNull(charCode) & 15));
+            break;
+          }
+        }
+      } else if (charCode == convert._JsonStringifier.QUOTE || charCode == convert._JsonStringifier.BACKSLASH) {
+        if (i > offset) this.writeStringSlice(s, offset, i);
+        offset = i + 1;
+        this.writeCharCode(convert._JsonStringifier.BACKSLASH);
+        this.writeCharCode(charCode);
+      }
+    }
+    if (offset == 0) {
+      this.writeString(s);
+    } else if (offset < dart.notNull(length)) {
+      this.writeStringSlice(s, offset, length);
+    }
+  }
+  [_checkCycle](object) {
+    for (let i = 0; i < dart.notNull(this[_seen][dartx.length]); i++) {
+      if (core.identical(object, this[_seen][dartx._get](i))) {
+        dart.throw(new convert.JsonCyclicError(object));
+      }
+    }
+    this[_seen][dartx.add](object);
+  }
+  [_removeSeen](object) {
+    dart.assert(!dart.test(this[_seen][dartx.isEmpty]));
+    dart.assert(core.identical(this[_seen][dartx.last], object));
+    this[_seen][dartx.removeLast]();
+  }
+  writeObject(object) {
+    if (dart.test(this.writeJsonValue(object))) return;
+    this[_checkCycle](object);
+    try {
+      let customJson = dart.dcall(this[_toEncodable], object);
+      if (!dart.test(this.writeJsonValue(customJson))) {
+        dart.throw(new convert.JsonUnsupportedObjectError(object));
+      }
+      this[_removeSeen](object);
+    } catch (e) {
+      dart.throw(new convert.JsonUnsupportedObjectError(object, {cause: e}));
+    }
+
+  }
+  writeJsonValue(object) {
+    if (typeof object == 'number') {
+      if (!dart.test(object[dartx.isFinite])) return false;
+      this.writeNumber(object);
+      return true;
+    } else if (core.identical(object, true)) {
+      this.writeString('true');
+      return true;
+    } else if (core.identical(object, false)) {
+      this.writeString('false');
+      return true;
+    } else if (object == null) {
+      this.writeString('null');
+      return true;
+    } else if (typeof object == 'string') {
+      this.writeString('"');
+      this.writeStringContent(object);
+      this.writeString('"');
+      return true;
+    } else if (core.List.is(object)) {
+      this[_checkCycle](object);
+      this.writeList(object);
+      this[_removeSeen](object);
+      return true;
+    } else if (core.Map.is(object)) {
+      this[_checkCycle](object);
+      let success = this.writeMap(object);
+      this[_removeSeen](object);
+      return success;
+    } else {
+      return false;
+    }
+  }
+  writeList(list) {
+    this.writeString('[');
+    if (dart.notNull(list[dartx.length]) > 0) {
+      this.writeObject(list[dartx._get](0));
+      for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
+        this.writeString(',');
+        this.writeObject(list[dartx._get](i));
+      }
+    }
+    this.writeString(']');
+  }
+  writeMap(map) {
+    if (dart.test(map[dartx.isEmpty])) {
+      this.writeString("{}");
+      return true;
+    }
+    let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
+    let i = 0;
+    let allStringKeys = true;
+    map[dartx.forEach](dart.fn((key, value) => {
+      if (!(typeof key == 'string')) {
+        allStringKeys = false;
+      }
+      keyValueList[dartx._set](i++, key);
+      keyValueList[dartx._set](i++, value);
+    }, dynamicAnddynamicToNull()));
+    if (!allStringKeys) return false;
+    this.writeString('{');
+    let separator = '"';
+    for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
+      this.writeString(separator);
+      separator = ',"';
+      this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
+      this.writeString('":');
+      this.writeObject(keyValueList[dartx._get](i + 1));
+    }
+    this.writeString('}');
+    return true;
+  }
+};
+dart.setSignature(convert._JsonStringifier, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringifier, [dynamicTodynamic()])}),
+  fields: () => ({
+    [_seen]: core.List,
+    [_toEncodable]: convert._ToEncodable
+  }),
+  methods: () => ({
+    writeStringContent: dart.definiteFunctionType(dart.void, [core.String]),
+    [_checkCycle]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_removeSeen]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    writeObject: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    writeJsonValue: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    writeList: dart.definiteFunctionType(dart.void, [core.List]),
+    writeMap: dart.definiteFunctionType(core.bool, [core.Map])
+  }),
+  sfields: () => ({
+    BACKSPACE: core.int,
+    TAB: core.int,
+    NEWLINE: core.int,
+    CARRIAGE_RETURN: core.int,
+    FORM_FEED: core.int,
+    QUOTE: core.int,
+    CHAR_0: core.int,
+    BACKSLASH: core.int,
+    CHAR_b: core.int,
+    CHAR_f: core.int,
+    CHAR_n: core.int,
+    CHAR_r: core.int,
+    CHAR_t: core.int,
+    CHAR_u: core.int
+  }),
+  statics: () => ({hexDigit: dart.definiteFunctionType(core.int, [core.int])}),
+  names: ['hexDigit']
+});
+convert._JsonStringifier.BACKSPACE = 8;
+convert._JsonStringifier.TAB = 9;
+convert._JsonStringifier.NEWLINE = 10;
+convert._JsonStringifier.CARRIAGE_RETURN = 13;
+convert._JsonStringifier.FORM_FEED = 12;
+convert._JsonStringifier.QUOTE = 34;
+convert._JsonStringifier.CHAR_0 = 48;
+convert._JsonStringifier.BACKSLASH = 92;
+convert._JsonStringifier.CHAR_b = 98;
+convert._JsonStringifier.CHAR_f = 102;
+convert._JsonStringifier.CHAR_n = 110;
+convert._JsonStringifier.CHAR_r = 114;
+convert._JsonStringifier.CHAR_t = 116;
+convert._JsonStringifier.CHAR_u = 117;
+const _indentLevel = Symbol('_indentLevel');
+convert._JsonPrettyPrintMixin = class _JsonPrettyPrintMixin extends core.Object {
+  new() {
+    this[_indentLevel] = 0;
+  }
+  writeList(list) {
+    if (dart.test(list[dartx.isEmpty])) {
+      this.writeString('[]');
+    } else {
+      this.writeString('[\n');
       this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
-      let separator = "";
-      for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
-        this.writeString(separator);
-        separator = ",\n";
+      this.writeIndentation(this[_indentLevel]);
+      this.writeObject(list[dartx._get](0));
+      for (let i = 1; i < dart.notNull(list[dartx.length]); i++) {
+        this.writeString(',\n');
         this.writeIndentation(this[_indentLevel]);
-        this.writeString('"');
-        this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
-        this.writeString('": ');
-        this.writeObject(keyValueList[dartx._get](i + 1));
+        this.writeObject(list[dartx._get](i));
       }
       this.writeString('\n');
       this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
       this.writeIndentation(this[_indentLevel]);
-      this.writeString('}');
+      this.writeString(']');
+    }
+  }
+  writeMap(map) {
+    if (dart.test(map[dartx.isEmpty])) {
+      this.writeString("{}");
       return true;
     }
-  };
-  convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
-  dart.setSignature(convert._JsonPrettyPrintMixin, {
-    fields: () => ({[_indentLevel]: core.int}),
-    methods: () => ({
-      writeList: dart.definiteFunctionType(dart.void, [core.List]),
-      writeMap: dart.definiteFunctionType(core.bool, [core.Map])
-    })
-  });
-  convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
-    new(sink, _toEncodable) {
-      this[_sink$] = sink;
-      super.new(dynamicTodynamic()._check(_toEncodable));
-    }
-    static stringify(object, toEncodable, indent) {
-      let output = new core.StringBuffer();
-      convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
-      return output.toString();
-    }
-    static printOn(object, output, toEncodable, indent) {
-      let stringifier = null;
-      if (indent == null) {
-        stringifier = new convert._JsonStringStringifier(output, toEncodable);
-      } else {
-        stringifier = new convert._JsonStringStringifierPretty(output, toEncodable, indent);
+    let keyValueList = core.List.new(dart.notNull(map[dartx.length]) * 2);
+    let i = 0;
+    let allStringKeys = true;
+    map[dartx.forEach](dart.fn((key, value) => {
+      if (!(typeof key == 'string')) {
+        allStringKeys = false;
       }
-      dart.dsend(stringifier, 'writeObject', object);
+      keyValueList[dartx._set](i++, key);
+      keyValueList[dartx._set](i++, value);
+    }, dynamicAnddynamicToNull()));
+    if (!allStringKeys) return false;
+    this.writeString('{\n');
+    this[_indentLevel] = dart.notNull(this[_indentLevel]) + 1;
+    let separator = "";
+    for (let i = 0; i < dart.notNull(keyValueList[dartx.length]); i = i + 2) {
+      this.writeString(separator);
+      separator = ",\n";
+      this.writeIndentation(this[_indentLevel]);
+      this.writeString('"');
+      this.writeStringContent(core.String._check(keyValueList[dartx._get](i)));
+      this.writeString('": ');
+      this.writeObject(keyValueList[dartx._get](i + 1));
     }
-    writeNumber(number) {
-      this[_sink$].write(dart.toString(number));
+    this.writeString('\n');
+    this[_indentLevel] = dart.notNull(this[_indentLevel]) - 1;
+    this.writeIndentation(this[_indentLevel]);
+    this.writeString('}');
+    return true;
+  }
+};
+convert._JsonPrettyPrintMixin[dart.implements] = () => [convert._JsonStringifier];
+dart.setSignature(convert._JsonPrettyPrintMixin, {
+  fields: () => ({[_indentLevel]: core.int}),
+  methods: () => ({
+    writeList: dart.definiteFunctionType(dart.void, [core.List]),
+    writeMap: dart.definiteFunctionType(core.bool, [core.Map])
+  })
+});
+convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
+  new(sink, _toEncodable) {
+    this[_sink$] = sink;
+    super.new(dynamicTodynamic()._check(_toEncodable));
+  }
+  static stringify(object, toEncodable, indent) {
+    let output = new core.StringBuffer();
+    convert._JsonStringStringifier.printOn(object, output, toEncodable, indent);
+    return output.toString();
+  }
+  static printOn(object, output, toEncodable, indent) {
+    let stringifier = null;
+    if (indent == null) {
+      stringifier = new convert._JsonStringStringifier(output, toEncodable);
+    } else {
+      stringifier = new convert._JsonStringStringifierPretty(output, toEncodable, indent);
     }
-    writeString(string) {
-      this[_sink$].write(string);
+    dart.dsend(stringifier, 'writeObject', object);
+  }
+  writeNumber(number) {
+    this[_sink$].write(dart.toString(number));
+  }
+  writeString(string) {
+    this[_sink$].write(string);
+  }
+  writeStringSlice(string, start, end) {
+    this[_sink$].write(string[dartx.substring](start, end));
+  }
+  writeCharCode(charCode) {
+    this[_sink$].writeCharCode(charCode);
+  }
+};
+dart.setSignature(convert._JsonStringStringifier, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
+  fields: () => ({[_sink$]: core.StringSink}),
+  methods: () => ({
+    writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
+    writeString: dart.definiteFunctionType(dart.void, [core.String]),
+    writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  statics: () => ({
+    stringify: dart.definiteFunctionType(core.String, [dart.dynamic, dynamicTodynamic(), core.String]),
+    printOn: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StringSink, dynamicTodynamic(), core.String])
+  }),
+  names: ['stringify', 'printOn']
+});
+convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends dart.mixin(convert._JsonStringStringifier, convert._JsonPrettyPrintMixin) {
+  new(sink, toEncodable, indent) {
+    this[_indent] = indent;
+    super.new(sink, toEncodable);
+  }
+  writeIndentation(count) {
+    for (let i = 0; i < dart.notNull(count); i++)
+      this.writeString(this[_indent]);
+  }
+};
+dart.setSignature(convert._JsonStringStringifierPretty, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifierPretty, [core.StringSink, dynamicTodynamic(), core.String])}),
+  fields: () => ({[_indent]: core.String}),
+  methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
+});
+convert._AddChunk = dart.typedef('_AddChunk', () => dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int]));
+convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
+  new(toEncodable, bufferSize, addChunk) {
+    this.addChunk = addChunk;
+    this.bufferSize = bufferSize;
+    this.buffer = typed_data.Uint8List.new(bufferSize);
+    this.index = 0;
+    super.new(toEncodable);
+  }
+  static stringify(object, indent, toEncodable, bufferSize, addChunk) {
+    let stringifier = null;
+    if (indent != null) {
+      stringifier = new convert._JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
+    } else {
+      stringifier = new convert._JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
     }
-    writeStringSlice(string, start, end) {
-      this[_sink$].write(string[dartx.substring](start, end));
+    stringifier.writeObject(object);
+    stringifier.flush();
+  }
+  flush() {
+    if (dart.notNull(this.index) > 0) {
+      this.addChunk(this.buffer, 0, this.index);
     }
-    writeCharCode(charCode) {
-      this[_sink$].writeCharCode(charCode);
+    this.buffer = null;
+    this.index = 0;
+  }
+  writeNumber(number) {
+    this.writeAsciiString(dart.toString(number));
+  }
+  writeAsciiString(string) {
+    for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
+      let char = string[dartx.codeUnitAt](i);
+      dart.assert(dart.notNull(char) <= 127);
+      this.writeByte(char);
     }
-  };
-  dart.setSignature(convert._JsonStringStringifier, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
-    fields: () => ({[_sink$]: core.StringSink}),
-    methods: () => ({
-      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
-      writeString: dart.definiteFunctionType(dart.void, [core.String]),
-      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    statics: () => ({
-      stringify: dart.definiteFunctionType(core.String, [dart.dynamic, dynamicTodynamic(), core.String]),
-      printOn: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StringSink, dynamicTodynamic(), core.String])
-    }),
-    names: ['stringify', 'printOn']
-  });
-  convert._JsonStringStringifierPretty = class _JsonStringStringifierPretty extends dart.mixin(convert._JsonStringStringifier, convert._JsonPrettyPrintMixin) {
-    new(sink, toEncodable, indent) {
-      this[_indent] = indent;
-      super.new(sink, toEncodable);
-    }
-    writeIndentation(count) {
-      for (let i = 0; i < dart.notNull(count); i++)
-        this.writeString(this[_indent]);
-    }
-  };
-  dart.setSignature(convert._JsonStringStringifierPretty, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifierPretty, [core.StringSink, dynamicTodynamic(), core.String])}),
-    fields: () => ({[_indent]: core.String}),
-    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
-  });
-  convert._AddChunk = dart.typedef('_AddChunk', () => dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int]));
-  convert._JsonUtf8Stringifier = class _JsonUtf8Stringifier extends convert._JsonStringifier {
-    new(toEncodable, bufferSize, addChunk) {
-      this.addChunk = addChunk;
-      this.bufferSize = bufferSize;
-      this.buffer = typed_data.Uint8List.new(bufferSize);
-      this.index = 0;
-      super.new(toEncodable);
-    }
-    static stringify(object, indent, toEncodable, bufferSize, addChunk) {
-      let stringifier = null;
-      if (indent != null) {
-        stringifier = new convert._JsonUtf8StringifierPretty(toEncodable, indent, bufferSize, addChunk);
-      } else {
-        stringifier = new convert._JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
-      }
-      stringifier.writeObject(object);
-      stringifier.flush();
-    }
-    flush() {
-      if (dart.notNull(this.index) > 0) {
-        this.addChunk(this.buffer, 0, this.index);
-      }
-      this.buffer = null;
-      this.index = 0;
-    }
-    writeNumber(number) {
-      this.writeAsciiString(dart.toString(number));
-    }
-    writeAsciiString(string) {
-      for (let i = 0; i < dart.notNull(string[dartx.length]); i++) {
-        let char = string[dartx.codeUnitAt](i);
-        dart.assert(dart.notNull(char) <= 127);
+  }
+  writeString(string) {
+    this.writeStringSlice(string, 0, string[dartx.length]);
+  }
+  writeStringSlice(string, start, end) {
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = string[dartx.codeUnitAt](i);
+      if (dart.notNull(char) <= 127) {
         this.writeByte(char);
-      }
-    }
-    writeString(string) {
-      this.writeStringSlice(string, 0, string[dartx.length]);
-    }
-    writeStringSlice(string, start, end) {
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let char = string[dartx.codeUnitAt](i);
-        if (dart.notNull(char) <= 127) {
-          this.writeByte(char);
-        } else {
-          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
-            let nextChar = string[dartx.codeUnitAt](dart.notNull(i) + 1);
-            if ((dart.notNull(nextChar) & 64512) == 56320) {
-              char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull(nextChar) & 1023);
-              this.writeFourByteCharCode(char);
-              i = dart.notNull(i) + 1;
-              continue;
-            }
-          }
-          this.writeMultiByteCharCode(char);
-        }
-      }
-    }
-    writeCharCode(charCode) {
-      if (dart.notNull(charCode) <= 127) {
-        this.writeByte(charCode);
-        return;
-      }
-      this.writeMultiByteCharCode(charCode);
-    }
-    writeMultiByteCharCode(charCode) {
-      if (dart.notNull(charCode) <= 2047) {
-        this.writeByte((192 | charCode[dartx['>>']](6)) >>> 0);
-        this.writeByte(128 | dart.notNull(charCode) & 63);
-        return;
-      }
-      if (dart.notNull(charCode) <= 65535) {
-        this.writeByte((224 | charCode[dartx['>>']](12)) >>> 0);
-        this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
-        this.writeByte(128 | dart.notNull(charCode) & 63);
-        return;
-      }
-      this.writeFourByteCharCode(charCode);
-    }
-    writeFourByteCharCode(charCode) {
-      dart.assert(dart.notNull(charCode) <= 1114111);
-      this.writeByte((240 | charCode[dartx['>>']](18)) >>> 0);
-      this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
-      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
-      this.writeByte(128 | dart.notNull(charCode) & 63);
-    }
-    writeByte(byte) {
-      dart.assert(dart.notNull(byte) <= 255);
-      if (this.index == this.buffer[dartx.length]) {
-        this.addChunk(this.buffer, 0, this.index);
-        this.buffer = typed_data.Uint8List.new(this.bufferSize);
-        this.index = 0;
-      }
-      this.buffer[dartx._set]((() => {
-        let x = this.index;
-        this.index = dart.notNull(x) + 1;
-        return x;
-      })(), byte);
-    }
-  };
-  dart.setSignature(convert._JsonUtf8Stringifier, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8Stringifier, [dynamicTodynamic(), core.int, convert._AddChunk])}),
-    fields: () => ({
-      bufferSize: core.int,
-      addChunk: convert._AddChunk,
-      buffer: typed_data.Uint8List,
-      index: core.int
-    }),
-    methods: () => ({
-      flush: dart.definiteFunctionType(dart.void, []),
-      writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
-      writeAsciiString: dart.definiteFunctionType(dart.void, [core.String]),
-      writeString: dart.definiteFunctionType(dart.void, [core.String]),
-      writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      writeMultiByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      writeFourByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      writeByte: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    statics: () => ({stringify: dart.definiteFunctionType(dart.void, [core.Object, ListOfint(), dynamicTodynamic(), core.int, Uint8ListAndintAndintTovoid()])}),
-    names: ['stringify']
-  });
-  convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends dart.mixin(convert._JsonUtf8Stringifier, convert._JsonPrettyPrintMixin) {
-    new(toEncodable, indent, bufferSize, addChunk) {
-      this.indent = indent;
-      super.new(toEncodable, core.int._check(bufferSize), addChunk);
-    }
-    writeIndentation(count) {
-      let indent = this.indent;
-      let indentLength = indent[dartx.length];
-      if (indentLength == 1) {
-        let char = indent[dartx._get](0);
-        while (dart.notNull(count) > 0) {
-          this.writeByte(char);
-          count = dart.notNull(count) - 1;
-        }
-        return;
-      }
-      while (dart.notNull(count) > 0) {
-        count = dart.notNull(count) - 1;
-        let end = dart.notNull(this.index) + dart.notNull(indentLength);
-        if (end <= dart.notNull(this.buffer[dartx.length])) {
-          this.buffer[dartx.setRange](this.index, end, indent);
-          this.index = end;
-        } else {
-          for (let i = 0; i < dart.notNull(indentLength); i++) {
-            this.writeByte(indent[dartx._get](i));
-          }
-        }
-      }
-    }
-  };
-  dart.setSignature(convert._JsonUtf8StringifierPretty, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8StringifierPretty, [dynamicTodynamic(), ListOfint(), dart.dynamic, Uint8ListAndintAndintTovoid()])}),
-    fields: () => ({indent: ListOfint()}),
-    methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
-  });
-  let const$44;
-  let const$45;
-  let const$46;
-  let const$47;
-  let const$48;
-  convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
-    new(opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
-      this[_allowInvalid] = allowInvalid;
-      super.new();
-    }
-    get name() {
-      return "iso-8859-1";
-    }
-    decode(bytes, opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
-      if (allowInvalid == null) allowInvalid = this[_allowInvalid];
-      if (dart.test(allowInvalid)) {
-        return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
       } else {
-        return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
-      }
-    }
-    get encoder() {
-      return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
-    }
-    get decoder() {
-      return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
-    }
-  };
-  dart.setSignature(convert.Latin1Codec, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Codec, [], {allowInvalid: core.bool})}),
-    fields: () => ({[_allowInvalid]: core.bool}),
-    getters: () => ({
-      name: dart.definiteFunctionType(core.String, []),
-      encoder: dart.definiteFunctionType(convert.Latin1Encoder, []),
-      decoder: dart.definiteFunctionType(convert.Latin1Decoder, [])
-    }),
-    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
-  });
-  convert.LATIN1 = dart.const(new convert.Latin1Codec());
-  convert._LATIN1_MASK = 255;
-  convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {
-    new() {
-      super.new(convert._LATIN1_MASK);
-    }
-  };
-  dart.setSignature(convert.Latin1Encoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Encoder, [])})
-  });
-  convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
-    new(opts) {
-      let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
-      super.new(allowInvalid, convert._LATIN1_MASK);
-    }
-    startChunkedConversion(sink) {
-      let stringSink = null;
-      if (convert.StringConversionSink.is(sink)) {
-        stringSink = sink;
-      } else {
-        stringSink = convert.StringConversionSink.from(sink);
-      }
-      if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink(stringSink);
-      return new convert._Latin1AllowInvalidDecoderSink(stringSink);
-    }
-  };
-  dart.setSignature(convert.Latin1Decoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Decoder, [], {allowInvalid: core.bool})})
-  });
-  const _addSliceToSink = Symbol('_addSliceToSink');
-  convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
-    new(sink) {
-      this[_sink$] = sink;
-      super.new();
-    }
-    close() {
-      this[_sink$].close();
-      this[_sink$] = null;
-    }
-    add(source) {
-      this.addSlice(source, 0, source[dartx.length], false);
-    }
-    [_addSliceToSink](source, start, end, isLast) {
-      this[_sink$].add(core.String.fromCharCodes(source, start, end));
-      if (dart.test(isLast)) this.close();
-    }
-    addSlice(source, start, end, isLast) {
-      end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
-      if (start == end) return;
-      if (!typed_data.Uint8List.is(source)) {
-        convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
-      }
-      this[_addSliceToSink](source, start, end, isLast);
-    }
-    static _checkValidLatin1(source, start, end) {
-      let mask = 0;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        mask = (dart.notNull(mask) | dart.notNull(source[dartx._get](i))) >>> 0;
-      }
-      if (dart.notNull(mask) >= 0 && dart.notNull(mask) <= convert._LATIN1_MASK) {
-        return;
-      }
-      convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
-    }
-    static _reportInvalidLatin1(source, start, end) {
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let char = source[dartx._get](i);
-        if (dart.notNull(char) < 0 || dart.notNull(char) > convert._LATIN1_MASK) {
-          dart.throw(new core.FormatException("Source contains non-Latin-1 characters.", source, i));
-        }
-      }
-      dart.assert(false);
-    }
-  };
-  dart.setSignature(convert._Latin1DecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
-    fields: () => ({[_sink$]: convert.StringConversionSink}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      [_addSliceToSink]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
-    }),
-    statics: () => ({
-      _checkValidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int]),
-      _reportInvalidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
-    }),
-    names: ['_checkValidLatin1', '_reportInvalidLatin1']
-  });
-  let const$49;
-  convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
-    new(sink) {
-      super.new(sink);
-    }
-    addSlice(source, start, end, isLast) {
-      core.RangeError.checkValidRange(start, end, source[dartx.length]);
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let char = source[dartx._get](i);
-        if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
-          if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
-          this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
-          start = dart.notNull(i) + 1;
-        }
-      }
-      if (dart.notNull(start) < dart.notNull(end)) {
-        this[_addSliceToSink](source, start, end, isLast);
-      }
-      if (dart.test(isLast)) {
-        this.close();
-      }
-    }
-  };
-  dart.setSignature(convert._Latin1AllowInvalidDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Latin1AllowInvalidDecoderSink, [convert.StringConversionSink])})
-  });
-  convert._LF = 10;
-  convert._CR = 13;
-  convert.LineSplitter = class LineSplitter extends core.Object {
-    new() {
-    }
-    static split(lines, start, end) {
-      return dart.syncStar(function*(lines, start, end) {
-        if (start === void 0) start = 0;
-        if (end === void 0) end = null;
-        end = core.RangeError.checkValidRange(start, end, lines[dartx.length]);
-        let sliceStart = start;
-        let char = 0;
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          let previousChar = char;
-          char = lines[dartx.codeUnitAt](i);
-          if (char != convert._CR) {
-            if (char != convert._LF) continue;
-            if (previousChar == convert._CR) {
-              sliceStart = dart.notNull(i) + 1;
-              continue;
-            }
-          }
-          yield lines[dartx.substring](sliceStart, i);
-          sliceStart = dart.notNull(i) + 1;
-        }
-        if (dart.notNull(sliceStart) < dart.notNull(end)) {
-          yield lines[dartx.substring](sliceStart, end);
-        }
-      }, core.String, lines, start, end);
-    }
-    convert(data) {
-      let lines = JSArrayOfString().of([]);
-      let end = data[dartx.length];
-      let sliceStart = 0;
-      let char = 0;
-      for (let i = 0; i < dart.notNull(end); i++) {
-        let previousChar = char;
-        char = data[dartx.codeUnitAt](i);
-        if (char != convert._CR) {
-          if (char != convert._LF) continue;
-          if (previousChar == convert._CR) {
-            sliceStart = i + 1;
+        if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(i) + 1 < dart.notNull(end)) {
+          let nextChar = string[dartx.codeUnitAt](dart.notNull(i) + 1);
+          if ((dart.notNull(nextChar) & 64512) == 56320) {
+            char = 65536 + ((dart.notNull(char) & 1023) << 10) + (dart.notNull(nextChar) & 1023);
+            this.writeFourByteCharCode(char);
+            i = dart.notNull(i) + 1;
             continue;
           }
         }
-        lines[dartx.add](data[dartx.substring](sliceStart, i));
-        sliceStart = i + 1;
+        this.writeMultiByteCharCode(char);
       }
-      if (sliceStart < dart.notNull(end)) {
-        lines[dartx.add](data[dartx.substring](sliceStart, end));
+    }
+  }
+  writeCharCode(charCode) {
+    if (dart.notNull(charCode) <= 127) {
+      this.writeByte(charCode);
+      return;
+    }
+    this.writeMultiByteCharCode(charCode);
+  }
+  writeMultiByteCharCode(charCode) {
+    if (dart.notNull(charCode) <= 2047) {
+      this.writeByte((192 | charCode[dartx['>>']](6)) >>> 0);
+      this.writeByte(128 | dart.notNull(charCode) & 63);
+      return;
+    }
+    if (dart.notNull(charCode) <= 65535) {
+      this.writeByte((224 | charCode[dartx['>>']](12)) >>> 0);
+      this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
+      this.writeByte(128 | dart.notNull(charCode) & 63);
+      return;
+    }
+    this.writeFourByteCharCode(charCode);
+  }
+  writeFourByteCharCode(charCode) {
+    dart.assert(dart.notNull(charCode) <= 1114111);
+    this.writeByte((240 | charCode[dartx['>>']](18)) >>> 0);
+    this.writeByte(128 | dart.notNull(charCode) >> 12 & 63);
+    this.writeByte(128 | dart.notNull(charCode) >> 6 & 63);
+    this.writeByte(128 | dart.notNull(charCode) & 63);
+  }
+  writeByte(byte) {
+    dart.assert(dart.notNull(byte) <= 255);
+    if (this.index == this.buffer[dartx.length]) {
+      this.addChunk(this.buffer, 0, this.index);
+      this.buffer = typed_data.Uint8List.new(this.bufferSize);
+      this.index = 0;
+    }
+    this.buffer[dartx._set]((() => {
+      let x = this.index;
+      this.index = dart.notNull(x) + 1;
+      return x;
+    })(), byte);
+  }
+};
+dart.setSignature(convert._JsonUtf8Stringifier, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8Stringifier, [dynamicTodynamic(), core.int, convert._AddChunk])}),
+  fields: () => ({
+    bufferSize: core.int,
+    addChunk: convert._AddChunk,
+    buffer: typed_data.Uint8List,
+    index: core.int
+  }),
+  methods: () => ({
+    flush: dart.definiteFunctionType(dart.void, []),
+    writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
+    writeAsciiString: dart.definiteFunctionType(dart.void, [core.String]),
+    writeString: dart.definiteFunctionType(dart.void, [core.String]),
+    writeStringSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    writeMultiByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    writeFourByteCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    writeByte: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  statics: () => ({stringify: dart.definiteFunctionType(dart.void, [core.Object, ListOfint(), dynamicTodynamic(), core.int, Uint8ListAndintAndintTovoid()])}),
+  names: ['stringify']
+});
+convert._JsonUtf8StringifierPretty = class _JsonUtf8StringifierPretty extends dart.mixin(convert._JsonUtf8Stringifier, convert._JsonPrettyPrintMixin) {
+  new(toEncodable, indent, bufferSize, addChunk) {
+    this.indent = indent;
+    super.new(toEncodable, core.int._check(bufferSize), addChunk);
+  }
+  writeIndentation(count) {
+    let indent = this.indent;
+    let indentLength = indent[dartx.length];
+    if (indentLength == 1) {
+      let char = indent[dartx._get](0);
+      while (dart.notNull(count) > 0) {
+        this.writeByte(char);
+        count = dart.notNull(count) - 1;
       }
-      return lines;
+      return;
     }
-    startChunkedConversion(sink) {
-      if (!convert.StringConversionSink.is(sink)) {
-        sink = convert.StringConversionSink.from(sink);
-      }
-      return new convert._LineSplitterSink(convert.StringConversionSink._check(sink));
-    }
-    bind(stream) {
-      return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink(sink), EventSinkOfStringTo_LineSplitterEventSink()));
-    }
-  };
-  convert.LineSplitter[dart.implements] = () => [StreamTransformerOfString$String()];
-  dart.setSignature(convert.LineSplitter, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.LineSplitter, [])}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.String), [core.String]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
-      bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfString()])
-    }),
-    statics: () => ({split: dart.definiteFunctionType(core.Iterable$(core.String), [core.String], [core.int, core.int])}),
-    names: ['split']
-  });
-  const _carry = Symbol('_carry');
-  const _skipLeadingLF = Symbol('_skipLeadingLF');
-  const _addLines = Symbol('_addLines');
-  convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
-    new(sink) {
-      this[_sink$] = sink;
-      this[_carry] = null;
-      this[_skipLeadingLF] = false;
-    }
-    addSlice(chunk, start, end, isLast) {
-      end = core.RangeError.checkValidRange(start, end, chunk[dartx.length]);
-      if (dart.notNull(start) >= dart.notNull(end)) {
-        if (dart.test(isLast)) this.close();
-        return;
-      }
-      if (this[_carry] != null) {
-        dart.assert(!dart.test(this[_skipLeadingLF]));
-        chunk = dart.notNull(this[_carry]) + dart.notNull(chunk[dartx.substring](start, end));
-        start = 0;
-        end = chunk[dartx.length];
-        this[_carry] = null;
-      } else if (dart.test(this[_skipLeadingLF])) {
-        if (chunk[dartx.codeUnitAt](start) == convert._LF) {
-          start = dart.notNull(start) + 1;
+    while (dart.notNull(count) > 0) {
+      count = dart.notNull(count) - 1;
+      let end = dart.notNull(this.index) + dart.notNull(indentLength);
+      if (end <= dart.notNull(this.buffer[dartx.length])) {
+        this.buffer[dartx.setRange](this.index, end, indent);
+        this.index = end;
+      } else {
+        for (let i = 0; i < dart.notNull(indentLength); i++) {
+          this.writeByte(indent[dartx._get](i));
         }
-        this[_skipLeadingLF] = false;
       }
-      this[_addLines](chunk, start, end);
-      if (dart.test(isLast)) this.close();
     }
-    close() {
-      if (this[_carry] != null) {
-        this[_sink$].add(this[_carry]);
-        this[_carry] = null;
+  }
+};
+dart.setSignature(convert._JsonUtf8StringifierPretty, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8StringifierPretty, [dynamicTodynamic(), ListOfint(), dart.dynamic, Uint8ListAndintAndintTovoid()])}),
+  fields: () => ({indent: ListOfint()}),
+  methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
+});
+let const$44;
+let const$45;
+let const$46;
+let const$47;
+let const$48;
+convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
+  new(opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
+    this[_allowInvalid] = allowInvalid;
+    super.new();
+  }
+  get name() {
+    return "iso-8859-1";
+  }
+  decode(bytes, opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
+    if (allowInvalid == null) allowInvalid = this[_allowInvalid];
+    if (dart.test(allowInvalid)) {
+      return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
+    } else {
+      return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
+    }
+  }
+  get encoder() {
+    return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
+  }
+  get decoder() {
+    return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
+  }
+};
+dart.setSignature(convert.Latin1Codec, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Codec, [], {allowInvalid: core.bool})}),
+  fields: () => ({[_allowInvalid]: core.bool}),
+  getters: () => ({
+    name: dart.definiteFunctionType(core.String, []),
+    encoder: dart.definiteFunctionType(convert.Latin1Encoder, []),
+    decoder: dart.definiteFunctionType(convert.Latin1Decoder, [])
+  }),
+  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowInvalid: core.bool})})
+});
+convert.LATIN1 = dart.const(new convert.Latin1Codec());
+convert._LATIN1_MASK = 255;
+convert.Latin1Encoder = class Latin1Encoder extends convert._UnicodeSubsetEncoder {
+  new() {
+    super.new(convert._LATIN1_MASK);
+  }
+};
+dart.setSignature(convert.Latin1Encoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Encoder, [])})
+});
+convert.Latin1Decoder = class Latin1Decoder extends convert._UnicodeSubsetDecoder {
+  new(opts) {
+    let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
+    super.new(allowInvalid, convert._LATIN1_MASK);
+  }
+  startChunkedConversion(sink) {
+    let stringSink = null;
+    if (convert.StringConversionSink.is(sink)) {
+      stringSink = sink;
+    } else {
+      stringSink = convert.StringConversionSink.from(sink);
+    }
+    if (!dart.test(this[_allowInvalid])) return new convert._Latin1DecoderSink(stringSink);
+    return new convert._Latin1AllowInvalidDecoderSink(stringSink);
+  }
+};
+dart.setSignature(convert.Latin1Decoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Latin1Decoder, [], {allowInvalid: core.bool})})
+});
+const _addSliceToSink = Symbol('_addSliceToSink');
+convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
+  new(sink) {
+    this[_sink$] = sink;
+    super.new();
+  }
+  close() {
+    this[_sink$].close();
+    this[_sink$] = null;
+  }
+  add(source) {
+    this.addSlice(source, 0, source[dartx.length], false);
+  }
+  [_addSliceToSink](source, start, end, isLast) {
+    this[_sink$].add(core.String.fromCharCodes(source, start, end));
+    if (dart.test(isLast)) this.close();
+  }
+  addSlice(source, start, end, isLast) {
+    end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    if (start == end) return;
+    if (!typed_data.Uint8List.is(source)) {
+      convert._Latin1DecoderSink._checkValidLatin1(source, start, end);
+    }
+    this[_addSliceToSink](source, start, end, isLast);
+  }
+  static _checkValidLatin1(source, start, end) {
+    let mask = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      mask = (dart.notNull(mask) | dart.notNull(source[dartx._get](i))) >>> 0;
+    }
+    if (dart.notNull(mask) >= 0 && dart.notNull(mask) <= convert._LATIN1_MASK) {
+      return;
+    }
+    convert._Latin1DecoderSink._reportInvalidLatin1(source, start, end);
+  }
+  static _reportInvalidLatin1(source, start, end) {
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = source[dartx._get](i);
+      if (dart.notNull(char) < 0 || dart.notNull(char) > convert._LATIN1_MASK) {
+        dart.throw(new core.FormatException("Source contains non-Latin-1 characters.", source, i));
       }
-      this[_sink$].close();
     }
-    [_addLines](lines, start, end) {
+    dart.assert(false);
+  }
+};
+dart.setSignature(convert._Latin1DecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
+  fields: () => ({[_sink$]: convert.StringConversionSink}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    [_addSliceToSink]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
+  }),
+  statics: () => ({
+    _checkValidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int]),
+    _reportInvalidLatin1: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
+  }),
+  names: ['_checkValidLatin1', '_reportInvalidLatin1']
+});
+let const$49;
+convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
+  new(sink) {
+    super.new(sink);
+  }
+  addSlice(source, start, end, isLast) {
+    core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = source[dartx._get](i);
+      if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
+        if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
+        this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
+        start = dart.notNull(i) + 1;
+      }
+    }
+    if (dart.notNull(start) < dart.notNull(end)) {
+      this[_addSliceToSink](source, start, end, isLast);
+    }
+    if (dart.test(isLast)) {
+      this.close();
+    }
+  }
+};
+dart.setSignature(convert._Latin1AllowInvalidDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Latin1AllowInvalidDecoderSink, [convert.StringConversionSink])})
+});
+convert._LF = 10;
+convert._CR = 13;
+convert.LineSplitter = class LineSplitter extends core.Object {
+  new() {
+  }
+  static split(lines, start, end) {
+    return dart.syncStar(function*(lines, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      end = core.RangeError.checkValidRange(start, end, lines[dartx.length]);
       let sliceStart = start;
       let char = 0;
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
@@ -32169,5559 +32069,15965 @@
             continue;
           }
         }
-        this[_sink$].add(lines[dartx.substring](sliceStart, i));
+        yield lines[dartx.substring](sliceStart, i);
         sliceStart = dart.notNull(i) + 1;
       }
       if (dart.notNull(sliceStart) < dart.notNull(end)) {
-        this[_carry] = lines[dartx.substring](sliceStart, end);
-      } else {
-        this[_skipLeadingLF] = char == convert._CR;
+        yield lines[dartx.substring](sliceStart, end);
       }
-    }
-  };
-  dart.setSignature(convert._LineSplitterSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
-    fields: () => ({
-      [_sink$]: convert.StringConversionSink,
-      [_carry]: core.String,
-      [_skipLeadingLF]: core.bool
-    }),
-    methods: () => ({
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, []),
-      [_addLines]: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int])
-    })
-  });
-  convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
-    new(eventSink) {
-      this[_eventSink] = eventSink;
-      super.new(convert.StringConversionSink.from(eventSink));
-    }
-    addError(o, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      this[_eventSink].addError(o, stackTrace);
-    }
-  };
-  convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
-  dart.setSignature(convert._LineSplitterEventSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])}),
-    fields: () => ({[_eventSink]: EventSinkOfString()}),
-    methods: () => ({addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
-  });
-  convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
-    new() {
-      super.new();
-    }
-    static withCallback(callback) {
-      return new convert._StringCallbackSink(callback);
-    }
-    static from(sink) {
-      return new convert._StringAdapterSink(sink);
-    }
-    static fromStringSink(sink) {
-      return new convert._StringSinkConversionSink(sink);
-    }
-  };
-  dart.addSimpleTypeTests(convert.StringConversionSink);
-  dart.setSignature(convert.StringConversionSink, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert.StringConversionSink, []),
-      withCallback: dart.definiteFunctionType(convert.StringConversionSink, [StringTovoid()]),
-      from: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
-      fromStringSink: dart.definiteFunctionType(convert.StringConversionSink, [core.StringSink])
-    })
-  });
-  core.StringSink = class StringSink extends core.Object {};
-  convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
-    static fromStringSink(sink, onClose) {
-      return new convert._ClosableStringSink(sink, onClose);
-    }
-  };
-  dart.setSignature(convert.ClosableStringSink, {
-    constructors: () => ({fromStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [core.StringSink, VoidTovoid()])})
-  });
-  convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
-  convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
-    new(sink, callback) {
-      this[_sink$] = sink;
-      this[_callback] = callback;
-    }
-    close() {
-      this[_callback]();
-    }
-    writeCharCode(charCode) {
-      this[_sink$].writeCharCode(charCode);
-    }
-    write(o) {
-      this[_sink$].write(o);
-    }
-    writeln(o) {
-      if (o === void 0) o = "";
-      this[_sink$].writeln(o);
-    }
-    writeAll(objects, separator) {
-      if (separator === void 0) separator = "";
-      this[_sink$].writeAll(objects, separator);
-    }
-  };
-  convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
-  dart.setSignature(convert._ClosableStringSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
-    fields: () => ({
-      [_callback]: convert._StringSinkCloseCallback,
-      [_sink$]: core.StringSink
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String])
-    })
-  });
-  const _flush = Symbol('_flush');
-  convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
-    new(chunkedSink) {
-      this[_chunkedSink] = chunkedSink;
-      this[_buffer] = new core.StringBuffer();
-    }
-    close() {
-      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
-      this[_chunkedSink].close();
-    }
-    writeCharCode(charCode) {
-      this[_buffer].writeCharCode(charCode);
-      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
-    }
-    write(o) {
-      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
-      this[_chunkedSink].add(dart.toString(o));
-    }
-    writeln(o) {
-      if (o === void 0) o = "";
-      this[_buffer].writeln(o);
-      if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
-    }
-    writeAll(objects, separator) {
-      if (separator === void 0) separator = "";
-      if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
-      let iterator = objects[dartx.iterator];
-      if (!dart.test(iterator.moveNext())) return;
-      if (dart.test(separator[dartx.isEmpty])) {
-        do {
-          this[_chunkedSink].add(dart.toString(iterator.current));
-        } while (dart.test(iterator.moveNext()));
-      } else {
-        this[_chunkedSink].add(dart.toString(iterator.current));
-        while (dart.test(iterator.moveNext())) {
-          this.write(separator);
-          this[_chunkedSink].add(dart.toString(iterator.current));
+    }, core.String, lines, start, end);
+  }
+  convert(data) {
+    let lines = JSArrayOfString().of([]);
+    let end = data[dartx.length];
+    let sliceStart = 0;
+    let char = 0;
+    for (let i = 0; i < dart.notNull(end); i++) {
+      let previousChar = char;
+      char = data[dartx.codeUnitAt](i);
+      if (char != convert._CR) {
+        if (char != convert._LF) continue;
+        if (previousChar == convert._CR) {
+          sliceStart = i + 1;
+          continue;
         }
       }
+      lines[dartx.add](data[dartx.substring](sliceStart, i));
+      sliceStart = i + 1;
     }
-    [_flush]() {
+    if (sliceStart < dart.notNull(end)) {
+      lines[dartx.add](data[dartx.substring](sliceStart, end));
+    }
+    return lines;
+  }
+  startChunkedConversion(sink) {
+    if (!convert.StringConversionSink.is(sink)) {
+      sink = convert.StringConversionSink.from(sink);
+    }
+    return new convert._LineSplitterSink(convert.StringConversionSink._check(sink));
+  }
+  bind(stream) {
+    return StreamOfString().eventTransformed(stream, dart.fn(sink => new convert._LineSplitterEventSink(sink), EventSinkOfStringTo_LineSplitterEventSink()));
+  }
+};
+convert.LineSplitter[dart.implements] = () => [StreamTransformerOfString$String()];
+dart.setSignature(convert.LineSplitter, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.LineSplitter, [])}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.String), [core.String]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
+    bind: dart.definiteFunctionType(async.Stream$(core.String), [StreamOfString()])
+  }),
+  statics: () => ({split: dart.definiteFunctionType(core.Iterable$(core.String), [core.String], [core.int, core.int])}),
+  names: ['split']
+});
+const _carry = Symbol('_carry');
+const _skipLeadingLF = Symbol('_skipLeadingLF');
+const _addLines = Symbol('_addLines');
+convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
+  new(sink) {
+    this[_sink$] = sink;
+    this[_carry] = null;
+    this[_skipLeadingLF] = false;
+  }
+  addSlice(chunk, start, end, isLast) {
+    end = core.RangeError.checkValidRange(start, end, chunk[dartx.length]);
+    if (dart.notNull(start) >= dart.notNull(end)) {
+      if (dart.test(isLast)) this.close();
+      return;
+    }
+    if (this[_carry] != null) {
+      dart.assert(!dart.test(this[_skipLeadingLF]));
+      chunk = dart.notNull(this[_carry]) + dart.notNull(chunk[dartx.substring](start, end));
+      start = 0;
+      end = chunk[dartx.length];
+      this[_carry] = null;
+    } else if (dart.test(this[_skipLeadingLF])) {
+      if (chunk[dartx.codeUnitAt](start) == convert._LF) {
+        start = dart.notNull(start) + 1;
+      }
+      this[_skipLeadingLF] = false;
+    }
+    this[_addLines](chunk, start, end);
+    if (dart.test(isLast)) this.close();
+  }
+  close() {
+    if (this[_carry] != null) {
+      this[_sink$].add(this[_carry]);
+      this[_carry] = null;
+    }
+    this[_sink$].close();
+  }
+  [_addLines](lines, start, end) {
+    let sliceStart = start;
+    let char = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let previousChar = char;
+      char = lines[dartx.codeUnitAt](i);
+      if (char != convert._CR) {
+        if (char != convert._LF) continue;
+        if (previousChar == convert._CR) {
+          sliceStart = dart.notNull(i) + 1;
+          continue;
+        }
+      }
+      this[_sink$].add(lines[dartx.substring](sliceStart, i));
+      sliceStart = dart.notNull(i) + 1;
+    }
+    if (dart.notNull(sliceStart) < dart.notNull(end)) {
+      this[_carry] = lines[dartx.substring](sliceStart, end);
+    } else {
+      this[_skipLeadingLF] = char == convert._CR;
+    }
+  }
+};
+dart.setSignature(convert._LineSplitterSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
+  fields: () => ({
+    [_sink$]: convert.StringConversionSink,
+    [_carry]: core.String,
+    [_skipLeadingLF]: core.bool
+  }),
+  methods: () => ({
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, []),
+    [_addLines]: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int])
+  })
+});
+convert._LineSplitterEventSink = class _LineSplitterEventSink extends convert._LineSplitterSink {
+  new(eventSink) {
+    this[_eventSink] = eventSink;
+    super.new(convert.StringConversionSink.from(eventSink));
+  }
+  addError(o, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    this[_eventSink].addError(o, stackTrace);
+  }
+};
+convert._LineSplitterEventSink[dart.implements] = () => [EventSinkOfString()];
+dart.setSignature(convert._LineSplitterEventSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])}),
+  fields: () => ({[_eventSink]: EventSinkOfString()}),
+  methods: () => ({addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace])})
+});
+convert.StringConversionSink = class StringConversionSink extends convert.ChunkedConversionSink$(core.String) {
+  new() {
+    super.new();
+  }
+  static withCallback(callback) {
+    return new convert._StringCallbackSink(callback);
+  }
+  static from(sink) {
+    return new convert._StringAdapterSink(sink);
+  }
+  static fromStringSink(sink) {
+    return new convert._StringSinkConversionSink(sink);
+  }
+};
+dart.addSimpleTypeTests(convert.StringConversionSink);
+dart.setSignature(convert.StringConversionSink, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert.StringConversionSink, []),
+    withCallback: dart.definiteFunctionType(convert.StringConversionSink, [StringTovoid()]),
+    from: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfString()]),
+    fromStringSink: dart.definiteFunctionType(convert.StringConversionSink, [core.StringSink])
+  })
+});
+core.StringSink = class StringSink extends core.Object {};
+convert.ClosableStringSink = class ClosableStringSink extends core.StringSink {
+  static fromStringSink(sink, onClose) {
+    return new convert._ClosableStringSink(sink, onClose);
+  }
+};
+dart.setSignature(convert.ClosableStringSink, {
+  constructors: () => ({fromStringSink: dart.definiteFunctionType(convert.ClosableStringSink, [core.StringSink, VoidTovoid()])})
+});
+convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
+convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
+  new(sink, callback) {
+    this[_sink$] = sink;
+    this[_callback] = callback;
+  }
+  close() {
+    this[_callback]();
+  }
+  writeCharCode(charCode) {
+    this[_sink$].writeCharCode(charCode);
+  }
+  write(o) {
+    this[_sink$].write(o);
+  }
+  writeln(o) {
+    if (o === void 0) o = "";
+    this[_sink$].writeln(o);
+  }
+  writeAll(objects, separator) {
+    if (separator === void 0) separator = "";
+    this[_sink$].writeAll(objects, separator);
+  }
+};
+convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
+dart.setSignature(convert._ClosableStringSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
+  fields: () => ({
+    [_callback]: convert._StringSinkCloseCallback,
+    [_sink$]: core.StringSink
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String])
+  })
+});
+const _flush = Symbol('_flush');
+convert._StringConversionSinkAsStringSinkAdapter = class _StringConversionSinkAsStringSinkAdapter extends core.Object {
+  new(chunkedSink) {
+    this[_chunkedSink] = chunkedSink;
+    this[_buffer] = new core.StringBuffer();
+  }
+  close() {
+    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
+    this[_chunkedSink].close();
+  }
+  writeCharCode(charCode) {
+    this[_buffer].writeCharCode(charCode);
+    if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
+  }
+  write(o) {
+    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
+    this[_chunkedSink].add(dart.toString(o));
+  }
+  writeln(o) {
+    if (o === void 0) o = "";
+    this[_buffer].writeln(o);
+    if (dart.notNull(this[_buffer].length) > convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE) this[_flush]();
+  }
+  writeAll(objects, separator) {
+    if (separator === void 0) separator = "";
+    if (dart.test(this[_buffer].isNotEmpty)) this[_flush]();
+    let iterator = objects[dartx.iterator];
+    if (!dart.test(iterator.moveNext())) return;
+    if (dart.test(separator[dartx.isEmpty])) {
+      do {
+        this[_chunkedSink].add(dart.toString(iterator.current));
+      } while (dart.test(iterator.moveNext()));
+    } else {
+      this[_chunkedSink].add(dart.toString(iterator.current));
+      while (dart.test(iterator.moveNext())) {
+        this.write(separator);
+        this[_chunkedSink].add(dart.toString(iterator.current));
+      }
+    }
+  }
+  [_flush]() {
+    let accumulated = dart.toString(this[_buffer]);
+    this[_buffer].clear();
+    this[_chunkedSink].add(accumulated);
+  }
+};
+convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
+dart.setSignature(convert._StringConversionSinkAsStringSinkAdapter, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._StringConversionSinkAsStringSinkAdapter, [convert.StringConversionSink])}),
+  fields: () => ({
+    [_buffer]: core.StringBuffer,
+    [_chunkedSink]: convert.StringConversionSink
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
+    [_flush]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({_MIN_STRING_SIZE: core.int})
+});
+convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16;
+convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink {
+  new(callback) {
+    this[_callback] = callback;
+    super.new(new core.StringBuffer());
+  }
+  close() {
+    let buffer = core.StringBuffer._check(this[_stringSink]);
+    let accumulated = dart.toString(buffer);
+    buffer.clear();
+    this[_callback](accumulated);
+  }
+  asUtf8Sink(allowMalformed) {
+    return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
+  }
+};
+dart.setSignature(convert._StringCallbackSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._StringCallbackSink, [StringTovoid()])}),
+  fields: () => ({[_callback]: StringTovoid()})
+});
+convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
+  new(sink) {
+    this[_sink$] = sink;
+  }
+  add(str) {
+    this[_sink$].add(str);
+  }
+  addSlice(str, start, end, isLast) {
+    if (start == 0 && end == str[dartx.length]) {
+      this.add(str);
+    } else {
+      this.add(str[dartx.substring](start, end));
+    }
+    if (dart.test(isLast)) this.close();
+  }
+  close() {
+    this[_sink$].close();
+  }
+};
+dart.setSignature(convert._StringAdapterSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
+  fields: () => ({[_sink$]: SinkOfString()}),
+  methods: () => ({
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
+  new(sink, stringSink, allowMalformed) {
+    this[_sink$] = sink;
+    this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
+    super.new();
+  }
+  close() {
+    this[_decoder].close();
+    if (this[_sink$] != null) this[_sink$].close();
+  }
+  add(chunk) {
+    this.addSlice(chunk, 0, chunk[dartx.length], false);
+  }
+  addSlice(codeUnits, startIndex, endIndex, isLast) {
+    this[_decoder].convert(codeUnits, startIndex, endIndex);
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.setSignature(convert._Utf8StringSinkAdapter, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
+  fields: () => ({
+    [_decoder]: convert._Utf8Decoder,
+    [_sink$]: core.Sink
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
+  })
+});
+convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
+  new(sink, allowMalformed) {
+    _Utf8ConversionSink.prototype._.call(this, sink, new core.StringBuffer(), allowMalformed);
+  }
+  _(chunkedSink, stringBuffer, allowMalformed) {
+    this[_chunkedSink] = chunkedSink;
+    this[_decoder] = new convert._Utf8Decoder(stringBuffer, allowMalformed);
+    this[_buffer] = stringBuffer;
+    super.new();
+  }
+  close() {
+    this[_decoder].close();
+    if (dart.test(this[_buffer].isNotEmpty)) {
       let accumulated = dart.toString(this[_buffer]);
       this[_buffer].clear();
-      this[_chunkedSink].add(accumulated);
+      this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], true);
+    } else {
+      this[_chunkedSink].close();
     }
-  };
-  convert._StringConversionSinkAsStringSinkAdapter[dart.implements] = () => [convert.ClosableStringSink];
-  dart.setSignature(convert._StringConversionSinkAsStringSinkAdapter, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._StringConversionSinkAsStringSinkAdapter, [convert.StringConversionSink])}),
-    fields: () => ({
-      [_buffer]: core.StringBuffer,
-      [_chunkedSink]: convert.StringConversionSink
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
-      [_flush]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({_MIN_STRING_SIZE: core.int})
-  });
-  convert._StringConversionSinkAsStringSinkAdapter._MIN_STRING_SIZE = 16;
-  convert._StringCallbackSink = class _StringCallbackSink extends convert._StringSinkConversionSink {
-    new(callback) {
-      this[_callback] = callback;
-      super.new(new core.StringBuffer());
+  }
+  add(chunk) {
+    this.addSlice(chunk, 0, chunk[dartx.length], false);
+  }
+  addSlice(chunk, startIndex, endIndex, isLast) {
+    this[_decoder].convert(chunk, startIndex, endIndex);
+    if (dart.test(this[_buffer].isNotEmpty)) {
+      let accumulated = dart.toString(this[_buffer]);
+      this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], isLast);
+      this[_buffer].clear();
+      return;
     }
-    close() {
-      let buffer = core.StringBuffer._check(this[_stringSink]);
-      let accumulated = dart.toString(buffer);
-      buffer.clear();
-      this[_callback](accumulated);
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.defineNamedConstructor(convert._Utf8ConversionSink, '_');
+dart.setSignature(convert._Utf8ConversionSink, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.bool]),
+    _: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.StringBuffer, core.bool])
+  }),
+  fields: () => ({
+    [_decoder]: convert._Utf8Decoder,
+    [_chunkedSink]: convert.StringConversionSink,
+    [_buffer]: core.StringBuffer
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
+  })
+});
+convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
+convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
+const _allowMalformed = Symbol('_allowMalformed');
+let const$50;
+convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
+  new(opts) {
+    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
+    this[_allowMalformed] = allowMalformed;
+    super.new();
+  }
+  get name() {
+    return "utf-8";
+  }
+  decode(codeUnits, opts) {
+    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
+    if (allowMalformed == null) allowMalformed = this[_allowMalformed];
+    return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
+  }
+  get encoder() {
+    return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
+  }
+  get decoder() {
+    return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
+  }
+};
+dart.setSignature(convert.Utf8Codec, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Codec, [], {allowMalformed: core.bool})}),
+  fields: () => ({[_allowMalformed]: core.bool}),
+  getters: () => ({
+    name: dart.definiteFunctionType(core.String, []),
+    encoder: dart.definiteFunctionType(convert.Utf8Encoder, []),
+    decoder: dart.definiteFunctionType(convert.Utf8Decoder, [])
+  }),
+  methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowMalformed: core.bool})})
+});
+convert.UTF8 = dart.const(new convert.Utf8Codec());
+const _fillBuffer = Symbol('_fillBuffer');
+const _writeSurrogate = Symbol('_writeSurrogate');
+convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
+  new() {
+    super.new();
+  }
+  convert(string, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let stringLength = string[dartx.length];
+    core.RangeError.checkValidRange(start, end, stringLength);
+    if (end == null) end = stringLength;
+    let length = dart.notNull(end) - dart.notNull(start);
+    if (length == 0) return typed_data.Uint8List.new(0);
+    let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
+    let endPosition = encoder[_fillBuffer](string, start, end);
+    dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1);
+    if (endPosition != end) {
+      let lastCodeUnit = string[dartx.codeUnitAt](dart.notNull(end) - 1);
+      dart.assert(convert._isLeadSurrogate(lastCodeUnit));
+      let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
+      dart.assert(!dart.test(wasCombined));
     }
-    asUtf8Sink(allowMalformed) {
-      return new convert._Utf8StringSinkAdapter(this, this[_stringSink], allowMalformed);
+    return encoder[_buffer][dartx.sublist](0, encoder[_bufferIndex]);
+  }
+  startChunkedConversion(sink) {
+    if (!convert.ByteConversionSink.is(sink)) {
+      sink = convert.ByteConversionSink.from(sink);
     }
-  };
-  dart.setSignature(convert._StringCallbackSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._StringCallbackSink, [StringTovoid()])}),
-    fields: () => ({[_callback]: StringTovoid()})
-  });
-  convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
-    new(sink) {
-      this[_sink$] = sink;
+    return new convert._Utf8EncoderSink(convert.ByteConversionSink._check(sink));
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+};
+dart.addSimpleTypeTests(convert.Utf8Encoder);
+dart.setSignature(convert.Utf8Encoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Encoder, [])}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
+  })
+});
+convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
+  new() {
+    _Utf8Encoder.prototype.withBufferSize.call(this, convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE);
+  }
+  withBufferSize(bufferSize) {
+    this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
+    this[_carry] = 0;
+    this[_bufferIndex] = 0;
+  }
+  static _createBuffer(size) {
+    return typed_data.Uint8List.new(size);
+  }
+  [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
+    if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
+      let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
+      dart.assert(dart.notNull(rune) > convert._THREE_BYTE_LIMIT);
+      dart.assert(dart.notNull(rune) <= convert._FOUR_BYTE_LIMIT);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), (240 | rune[dartx['>>']](18)) >>> 0);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), 128 | dart.notNull(rune) >> 12 & 63);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), 128 | dart.notNull(rune) >> 6 & 63);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), 128 | dart.notNull(rune) & 63);
+      return true;
+    } else {
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), (224 | leadingSurrogate[dartx['>>']](12)) >>> 0);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
+      this[_buffer][dartx._set]((() => {
+        let x = this[_bufferIndex];
+        this[_bufferIndex] = dart.notNull(x) + 1;
+        return x;
+      })(), 128 | dart.notNull(leadingSurrogate) & 63);
+      return false;
     }
-    add(str) {
-      this[_sink$].add(str);
+  }
+  [_fillBuffer](str, start, end) {
+    if (start != end && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](dart.notNull(end) - 1)))) {
+      end = dart.notNull(end) - 1;
     }
-    addSlice(str, start, end, isLast) {
-      if (start == 0 && end == str[dartx.length]) {
-        this.add(str);
+    let stringIndex = null;
+    for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
+      let codeUnit = str[dartx.codeUnitAt](stringIndex);
+      if (dart.notNull(codeUnit) <= convert._ONE_BYTE_LIMIT) {
+        if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][dartx.length])) break;
+        this[_buffer][dartx._set]((() => {
+          let x = this[_bufferIndex];
+          this[_bufferIndex] = dart.notNull(x) + 1;
+          return x;
+        })(), codeUnit);
+      } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
+        if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][dartx.length])) break;
+        let nextCodeUnit = str[dartx.codeUnitAt](dart.notNull(stringIndex) + 1);
+        let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
+        if (dart.test(wasCombined)) {
+          stringIndex = dart.notNull(stringIndex) + 1;
+        }
       } else {
-        this.add(str[dartx.substring](start, end));
-      }
-      if (dart.test(isLast)) this.close();
-    }
-    close() {
-      this[_sink$].close();
-    }
-  };
-  dart.setSignature(convert._StringAdapterSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
-    fields: () => ({[_sink$]: SinkOfString()}),
-    methods: () => ({
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
-    new(sink, stringSink, allowMalformed) {
-      this[_sink$] = sink;
-      this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
-      super.new();
-    }
-    close() {
-      this[_decoder].close();
-      if (this[_sink$] != null) this[_sink$].close();
-    }
-    add(chunk) {
-      this.addSlice(chunk, 0, chunk[dartx.length], false);
-    }
-    addSlice(codeUnits, startIndex, endIndex, isLast) {
-      this[_decoder].convert(codeUnits, startIndex, endIndex);
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.setSignature(convert._Utf8StringSinkAdapter, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
-    fields: () => ({
-      [_decoder]: convert._Utf8Decoder,
-      [_sink$]: core.Sink
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
-    })
-  });
-  convert._Utf8ConversionSink = class _Utf8ConversionSink extends convert.ByteConversionSink {
-    new(sink, allowMalformed) {
-      _Utf8ConversionSink.prototype._.call(this, sink, new core.StringBuffer(), allowMalformed);
-    }
-    _(chunkedSink, stringBuffer, allowMalformed) {
-      this[_chunkedSink] = chunkedSink;
-      this[_decoder] = new convert._Utf8Decoder(stringBuffer, allowMalformed);
-      this[_buffer] = stringBuffer;
-      super.new();
-    }
-    close() {
-      this[_decoder].close();
-      if (dart.test(this[_buffer].isNotEmpty)) {
-        let accumulated = dart.toString(this[_buffer]);
-        this[_buffer].clear();
-        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], true);
-      } else {
-        this[_chunkedSink].close();
-      }
-    }
-    add(chunk) {
-      this.addSlice(chunk, 0, chunk[dartx.length], false);
-    }
-    addSlice(chunk, startIndex, endIndex, isLast) {
-      this[_decoder].convert(chunk, startIndex, endIndex);
-      if (dart.test(this[_buffer].isNotEmpty)) {
-        let accumulated = dart.toString(this[_buffer]);
-        this[_chunkedSink].addSlice(accumulated, 0, accumulated[dartx.length], isLast);
-        this[_buffer].clear();
-        return;
-      }
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.defineNamedConstructor(convert._Utf8ConversionSink, '_');
-  dart.setSignature(convert._Utf8ConversionSink, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.bool]),
-      _: dart.definiteFunctionType(convert._Utf8ConversionSink, [convert.StringConversionSink, core.StringBuffer, core.bool])
-    }),
-    fields: () => ({
-      [_decoder]: convert._Utf8Decoder,
-      [_chunkedSink]: convert.StringConversionSink,
-      [_buffer]: core.StringBuffer
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])
-    })
-  });
-  convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
-  convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
-  const _allowMalformed = Symbol('_allowMalformed');
-  let const$50;
-  convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
-    new(opts) {
-      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
-      this[_allowMalformed] = allowMalformed;
-      super.new();
-    }
-    get name() {
-      return "utf-8";
-    }
-    decode(codeUnits, opts) {
-      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : null;
-      if (allowMalformed == null) allowMalformed = this[_allowMalformed];
-      return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
-    }
-    get encoder() {
-      return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
-    }
-    get decoder() {
-      return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
-    }
-  };
-  dart.setSignature(convert.Utf8Codec, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Codec, [], {allowMalformed: core.bool})}),
-    fields: () => ({[_allowMalformed]: core.bool}),
-    getters: () => ({
-      name: dart.definiteFunctionType(core.String, []),
-      encoder: dart.definiteFunctionType(convert.Utf8Encoder, []),
-      decoder: dart.definiteFunctionType(convert.Utf8Decoder, [])
-    }),
-    methods: () => ({decode: dart.definiteFunctionType(core.String, [ListOfint()], {allowMalformed: core.bool})})
-  });
-  convert.UTF8 = dart.const(new convert.Utf8Codec());
-  const _fillBuffer = Symbol('_fillBuffer');
-  const _writeSurrogate = Symbol('_writeSurrogate');
-  convert.Utf8Encoder = class Utf8Encoder extends convert.Converter$(core.String, core.List$(core.int)) {
-    new() {
-      super.new();
-    }
-    convert(string, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let stringLength = string[dartx.length];
-      core.RangeError.checkValidRange(start, end, stringLength);
-      if (end == null) end = stringLength;
-      let length = dart.notNull(end) - dart.notNull(start);
-      if (length == 0) return typed_data.Uint8List.new(0);
-      let encoder = new convert._Utf8Encoder.withBufferSize(length * 3);
-      let endPosition = encoder[_fillBuffer](string, start, end);
-      dart.assert(dart.notNull(endPosition) >= dart.notNull(end) - 1);
-      if (endPosition != end) {
-        let lastCodeUnit = string[dartx.codeUnitAt](dart.notNull(end) - 1);
-        dart.assert(convert._isLeadSurrogate(lastCodeUnit));
-        let wasCombined = encoder[_writeSurrogate](lastCodeUnit, 0);
-        dart.assert(!dart.test(wasCombined));
-      }
-      return encoder[_buffer][dartx.sublist](0, encoder[_bufferIndex]);
-    }
-    startChunkedConversion(sink) {
-      if (!convert.ByteConversionSink.is(sink)) {
-        sink = convert.ByteConversionSink.from(sink);
-      }
-      return new convert._Utf8EncoderSink(convert.ByteConversionSink._check(sink));
-    }
-    bind(stream) {
-      return super.bind(stream);
-    }
-  };
-  dart.addSimpleTypeTests(convert.Utf8Encoder);
-  dart.setSignature(convert.Utf8Encoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Encoder, [])}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
-    })
-  });
-  convert._Utf8Encoder = class _Utf8Encoder extends core.Object {
-    new() {
-      _Utf8Encoder.prototype.withBufferSize.call(this, convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE);
-    }
-    withBufferSize(bufferSize) {
-      this[_buffer] = convert._Utf8Encoder._createBuffer(bufferSize);
-      this[_carry] = 0;
-      this[_bufferIndex] = 0;
-    }
-    static _createBuffer(size) {
-      return typed_data.Uint8List.new(size);
-    }
-    [_writeSurrogate](leadingSurrogate, nextCodeUnit) {
-      if (dart.test(convert._isTailSurrogate(nextCodeUnit))) {
-        let rune = convert._combineSurrogatePair(leadingSurrogate, nextCodeUnit);
-        dart.assert(dart.notNull(rune) > convert._THREE_BYTE_LIMIT);
-        dart.assert(dart.notNull(rune) <= convert._FOUR_BYTE_LIMIT);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), (240 | rune[dartx['>>']](18)) >>> 0);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), 128 | dart.notNull(rune) >> 12 & 63);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), 128 | dart.notNull(rune) >> 6 & 63);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), 128 | dart.notNull(rune) & 63);
-        return true;
-      } else {
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), (224 | leadingSurrogate[dartx['>>']](12)) >>> 0);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), 128 | dart.notNull(leadingSurrogate) >> 6 & 63);
-        this[_buffer][dartx._set]((() => {
-          let x = this[_bufferIndex];
-          this[_bufferIndex] = dart.notNull(x) + 1;
-          return x;
-        })(), 128 | dart.notNull(leadingSurrogate) & 63);
-        return false;
-      }
-    }
-    [_fillBuffer](str, start, end) {
-      if (start != end && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](dart.notNull(end) - 1)))) {
-        end = dart.notNull(end) - 1;
-      }
-      let stringIndex = null;
-      for (stringIndex = start; dart.notNull(stringIndex) < dart.notNull(end); stringIndex = dart.notNull(stringIndex) + 1) {
-        let codeUnit = str[dartx.codeUnitAt](stringIndex);
-        if (dart.notNull(codeUnit) <= convert._ONE_BYTE_LIMIT) {
-          if (dart.notNull(this[_bufferIndex]) >= dart.notNull(this[_buffer][dartx.length])) break;
+        let rune = codeUnit;
+        if (dart.notNull(rune) <= convert._TWO_BYTE_LIMIT) {
+          if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][dartx.length])) break;
           this[_buffer][dartx._set]((() => {
             let x = this[_bufferIndex];
             this[_bufferIndex] = dart.notNull(x) + 1;
             return x;
-          })(), codeUnit);
-        } else if (dart.test(convert._isLeadSurrogate(codeUnit))) {
-          if (dart.notNull(this[_bufferIndex]) + 3 >= dart.notNull(this[_buffer][dartx.length])) break;
-          let nextCodeUnit = str[dartx.codeUnitAt](dart.notNull(stringIndex) + 1);
-          let wasCombined = this[_writeSurrogate](codeUnit, nextCodeUnit);
-          if (dart.test(wasCombined)) {
-            stringIndex = dart.notNull(stringIndex) + 1;
-          }
+          })(), (192 | rune[dartx['>>']](6)) >>> 0);
+          this[_buffer][dartx._set]((() => {
+            let x = this[_bufferIndex];
+            this[_bufferIndex] = dart.notNull(x) + 1;
+            return x;
+          })(), 128 | dart.notNull(rune) & 63);
         } else {
-          let rune = codeUnit;
-          if (dart.notNull(rune) <= convert._TWO_BYTE_LIMIT) {
-            if (dart.notNull(this[_bufferIndex]) + 1 >= dart.notNull(this[_buffer][dartx.length])) break;
-            this[_buffer][dartx._set]((() => {
-              let x = this[_bufferIndex];
-              this[_bufferIndex] = dart.notNull(x) + 1;
-              return x;
-            })(), (192 | rune[dartx['>>']](6)) >>> 0);
-            this[_buffer][dartx._set]((() => {
-              let x = this[_bufferIndex];
-              this[_bufferIndex] = dart.notNull(x) + 1;
-              return x;
-            })(), 128 | dart.notNull(rune) & 63);
-          } else {
-            dart.assert(dart.notNull(rune) <= convert._THREE_BYTE_LIMIT);
-            if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][dartx.length])) break;
-            this[_buffer][dartx._set]((() => {
-              let x = this[_bufferIndex];
-              this[_bufferIndex] = dart.notNull(x) + 1;
-              return x;
-            })(), (224 | rune[dartx['>>']](12)) >>> 0);
-            this[_buffer][dartx._set]((() => {
-              let x = this[_bufferIndex];
-              this[_bufferIndex] = dart.notNull(x) + 1;
-              return x;
-            })(), 128 | dart.notNull(rune) >> 6 & 63);
-            this[_buffer][dartx._set]((() => {
-              let x = this[_bufferIndex];
-              this[_bufferIndex] = dart.notNull(x) + 1;
-              return x;
-            })(), 128 | dart.notNull(rune) & 63);
-          }
+          dart.assert(dart.notNull(rune) <= convert._THREE_BYTE_LIMIT);
+          if (dart.notNull(this[_bufferIndex]) + 2 >= dart.notNull(this[_buffer][dartx.length])) break;
+          this[_buffer][dartx._set]((() => {
+            let x = this[_bufferIndex];
+            this[_bufferIndex] = dart.notNull(x) + 1;
+            return x;
+          })(), (224 | rune[dartx['>>']](12)) >>> 0);
+          this[_buffer][dartx._set]((() => {
+            let x = this[_bufferIndex];
+            this[_bufferIndex] = dart.notNull(x) + 1;
+            return x;
+          })(), 128 | dart.notNull(rune) >> 6 & 63);
+          this[_buffer][dartx._set]((() => {
+            let x = this[_bufferIndex];
+            this[_bufferIndex] = dart.notNull(x) + 1;
+            return x;
+          })(), 128 | dart.notNull(rune) & 63);
         }
       }
-      return stringIndex;
     }
-  };
-  dart.defineNamedConstructor(convert._Utf8Encoder, 'withBufferSize');
-  dart.setSignature(convert._Utf8Encoder, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(convert._Utf8Encoder, []),
-      withBufferSize: dart.definiteFunctionType(convert._Utf8Encoder, [core.int])
-    }),
-    fields: () => ({
-      [_carry]: core.int,
-      [_bufferIndex]: core.int,
-      [_buffer]: ListOfint()
-    }),
-    methods: () => ({
-      [_writeSurrogate]: dart.definiteFunctionType(core.bool, [core.int, core.int]),
-      [_fillBuffer]: dart.definiteFunctionType(core.int, [core.String, core.int, core.int])
-    }),
-    sfields: () => ({_DEFAULT_BYTE_BUFFER_SIZE: core.int}),
-    statics: () => ({_createBuffer: dart.definiteFunctionType(core.List$(core.int), [core.int])}),
-    names: ['_createBuffer']
-  });
-  convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
-  convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
-    new(sink) {
-      this[_sink$] = sink;
-      super.new();
+    return stringIndex;
+  }
+};
+dart.defineNamedConstructor(convert._Utf8Encoder, 'withBufferSize');
+dart.setSignature(convert._Utf8Encoder, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(convert._Utf8Encoder, []),
+    withBufferSize: dart.definiteFunctionType(convert._Utf8Encoder, [core.int])
+  }),
+  fields: () => ({
+    [_carry]: core.int,
+    [_bufferIndex]: core.int,
+    [_buffer]: ListOfint()
+  }),
+  methods: () => ({
+    [_writeSurrogate]: dart.definiteFunctionType(core.bool, [core.int, core.int]),
+    [_fillBuffer]: dart.definiteFunctionType(core.int, [core.String, core.int, core.int])
+  }),
+  sfields: () => ({_DEFAULT_BYTE_BUFFER_SIZE: core.int}),
+  statics: () => ({_createBuffer: dart.definiteFunctionType(core.List$(core.int), [core.int])}),
+  names: ['_createBuffer']
+});
+convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
+convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
+  new(sink) {
+    this[_sink$] = sink;
+    super.new();
+  }
+  close() {
+    if (this[_carry] != 0) {
+      this.addSlice("", 0, 0, true);
+      return;
     }
-    close() {
-      if (this[_carry] != 0) {
-        this.addSlice("", 0, 0, true);
-        return;
-      }
-      this[_sink$].close();
+    this[_sink$].close();
+  }
+  addSlice(str, start, end, isLast) {
+    this[_bufferIndex] = 0;
+    if (start == end && !dart.test(isLast)) {
+      return;
     }
-    addSlice(str, start, end, isLast) {
-      this[_bufferIndex] = 0;
-      if (start == end && !dart.test(isLast)) {
-        return;
-      }
-      if (this[_carry] != 0) {
-        let nextCodeUnit = 0;
-        if (start != end) {
-          nextCodeUnit = str[dartx.codeUnitAt](start);
-        } else {
-          dart.assert(isLast);
-        }
-        let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
-        dart.assert(!dart.test(wasCombined) || start != end);
-        if (dart.test(wasCombined)) {
-          start = dart.notNull(start) + 1;
-        }
-        this[_carry] = 0;
-      }
-      do {
-        start = this[_fillBuffer](str, start, end);
-        let isLastSlice = dart.test(isLast) && start == end;
-        if (start == dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](start)))) {
-          if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][dartx.length]) - 3) {
-            let hasBeenCombined = this[_writeSurrogate](str[dartx.codeUnitAt](start), 0);
-            dart.assert(!dart.test(hasBeenCombined));
-          } else {
-            this[_carry] = str[dartx.codeUnitAt](start);
-          }
-          start = dart.notNull(start) + 1;
-        }
-        this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
-        this[_bufferIndex] = 0;
-      } while (dart.notNull(start) < dart.notNull(end));
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.setSignature(convert._Utf8EncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
-    fields: () => ({[_sink$]: convert.ByteConversionSink}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
-    })
-  });
-  convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
-    new(opts) {
-      let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
-      this[_allowMalformed] = allowMalformed;
-      super.new();
-    }
-    convert(codeUnits, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
-      if (result != null) {
-        return result;
-      }
-      let length = codeUnits[dartx.length];
-      core.RangeError.checkValidRange(start, end, length);
-      if (end == null) end = length;
-      let buffer = new core.StringBuffer();
-      let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
-      decoder.convert(codeUnits, start, end);
-      decoder.close();
-      return buffer.toString();
-    }
-    startChunkedConversion(sink) {
-      let stringSink = null;
-      if (convert.StringConversionSink.is(sink)) {
-        stringSink = sink;
+    if (this[_carry] != 0) {
+      let nextCodeUnit = 0;
+      if (start != end) {
+        nextCodeUnit = str[dartx.codeUnitAt](start);
       } else {
-        stringSink = convert.StringConversionSink.from(sink);
+        dart.assert(isLast);
       }
-      return stringSink.asUtf8Sink(this[_allowMalformed]);
+      let wasCombined = this[_writeSurrogate](this[_carry], nextCodeUnit);
+      dart.assert(!dart.test(wasCombined) || start != end);
+      if (dart.test(wasCombined)) {
+        start = dart.notNull(start) + 1;
+      }
+      this[_carry] = 0;
     }
-    bind(stream) {
-      return super.bind(stream);
+    do {
+      start = this[_fillBuffer](str, start, end);
+      let isLastSlice = dart.test(isLast) && start == end;
+      if (start == dart.notNull(end) - 1 && dart.test(convert._isLeadSurrogate(str[dartx.codeUnitAt](start)))) {
+        if (dart.test(isLast) && dart.notNull(this[_bufferIndex]) < dart.notNull(this[_buffer][dartx.length]) - 3) {
+          let hasBeenCombined = this[_writeSurrogate](str[dartx.codeUnitAt](start), 0);
+          dart.assert(!dart.test(hasBeenCombined));
+        } else {
+          this[_carry] = str[dartx.codeUnitAt](start);
+        }
+        start = dart.notNull(start) + 1;
+      }
+      this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
+      this[_bufferIndex] = 0;
+    } while (dart.notNull(start) < dart.notNull(end));
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.setSignature(convert._Utf8EncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
+  fields: () => ({[_sink$]: convert.ByteConversionSink}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+  })
+});
+convert.Utf8Decoder = class Utf8Decoder extends convert.Converter$(core.List$(core.int), core.String) {
+  new(opts) {
+    let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
+    this[_allowMalformed] = allowMalformed;
+    super.new();
+  }
+  convert(codeUnits, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let result = convert.Utf8Decoder._convertIntercepted(this[_allowMalformed], codeUnits, start, end);
+    if (result != null) {
+      return result;
     }
-    fuse(T) {
-      return next => {
-        return super.fuse(T)(next);
-      };
+    let length = codeUnits[dartx.length];
+    core.RangeError.checkValidRange(start, end, length);
+    if (end == null) end = length;
+    let buffer = new core.StringBuffer();
+    let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
+    decoder.convert(codeUnits, start, end);
+    decoder.close();
+    return buffer.toString();
+  }
+  startChunkedConversion(sink) {
+    let stringSink = null;
+    if (convert.StringConversionSink.is(sink)) {
+      stringSink = sink;
+    } else {
+      stringSink = convert.StringConversionSink.from(sink);
     }
-    static _convertIntercepted(allowMalformed, codeUnits, start, end) {
-      return null;
-    }
-  };
-  dart.addSimpleTypeTests(convert.Utf8Decoder);
-  dart.setSignature(convert.Utf8Decoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Decoder, [], {allowMalformed: core.bool})}),
-    fields: () => ({[_allowMalformed]: core.bool}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
-    }),
-    statics: () => ({_convertIntercepted: dart.definiteFunctionType(core.String, [core.bool, ListOfint(), core.int, core.int])}),
-    names: ['_convertIntercepted']
-  });
-  convert._ONE_BYTE_LIMIT = 127;
-  convert._TWO_BYTE_LIMIT = 2047;
-  convert._THREE_BYTE_LIMIT = 65535;
-  convert._FOUR_BYTE_LIMIT = 1114111;
-  convert._SURROGATE_MASK = 63488;
-  convert._SURROGATE_TAG_MASK = 64512;
-  convert._SURROGATE_VALUE_MASK = 1023;
-  convert._LEAD_SURROGATE_MIN = 55296;
-  convert._TAIL_SURROGATE_MIN = 56320;
-  convert._isLeadSurrogate = function(codeUnit) {
-    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._LEAD_SURROGATE_MIN;
-  };
-  dart.lazyFn(convert._isLeadSurrogate, () => intTobool());
-  convert._isTailSurrogate = function(codeUnit) {
-    return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._TAIL_SURROGATE_MIN;
-  };
-  dart.lazyFn(convert._isTailSurrogate, () => intTobool());
-  convert._combineSurrogatePair = function(lead, tail) {
-    return (65536 + ((dart.notNull(lead) & convert._SURROGATE_VALUE_MASK) << 10) | dart.notNull(tail) & convert._SURROGATE_VALUE_MASK) >>> 0;
-  };
-  dart.fn(convert._combineSurrogatePair, intAndintToint());
-  const _isFirstCharacter = Symbol('_isFirstCharacter');
-  const _value = Symbol('_value');
-  const _expectedUnits = Symbol('_expectedUnits');
-  const _extraUnits = Symbol('_extraUnits');
-  convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
-    new(stringSink, allowMalformed) {
-      this[_stringSink] = stringSink;
-      this[_allowMalformed] = allowMalformed;
-      this[_isFirstCharacter] = true;
+    return stringSink.asUtf8Sink(this[_allowMalformed]);
+  }
+  bind(stream) {
+    return super.bind(stream);
+  }
+  fuse(T) {
+    return next => {
+      return super.fuse(T)(next);
+    };
+  }
+  static _convertIntercepted(allowMalformed, codeUnits, start, end) {
+    return null;
+  }
+};
+dart.addSimpleTypeTests(convert.Utf8Decoder);
+dart.setSignature(convert.Utf8Decoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert.Utf8Decoder, [], {allowMalformed: core.bool})}),
+  fields: () => ({[_allowMalformed]: core.bool}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [ListOfint()], [core.int, core.int]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
+  }),
+  statics: () => ({_convertIntercepted: dart.definiteFunctionType(core.String, [core.bool, ListOfint(), core.int, core.int])}),
+  names: ['_convertIntercepted']
+});
+convert._ONE_BYTE_LIMIT = 127;
+convert._TWO_BYTE_LIMIT = 2047;
+convert._THREE_BYTE_LIMIT = 65535;
+convert._FOUR_BYTE_LIMIT = 1114111;
+convert._SURROGATE_MASK = 63488;
+convert._SURROGATE_TAG_MASK = 64512;
+convert._SURROGATE_VALUE_MASK = 1023;
+convert._LEAD_SURROGATE_MIN = 55296;
+convert._TAIL_SURROGATE_MIN = 56320;
+convert._isLeadSurrogate = function(codeUnit) {
+  return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._LEAD_SURROGATE_MIN;
+};
+dart.lazyFn(convert._isLeadSurrogate, () => intTobool());
+convert._isTailSurrogate = function(codeUnit) {
+  return (dart.notNull(codeUnit) & convert._SURROGATE_TAG_MASK) == convert._TAIL_SURROGATE_MIN;
+};
+dart.lazyFn(convert._isTailSurrogate, () => intTobool());
+convert._combineSurrogatePair = function(lead, tail) {
+  return (65536 + ((dart.notNull(lead) & convert._SURROGATE_VALUE_MASK) << 10) | dart.notNull(tail) & convert._SURROGATE_VALUE_MASK) >>> 0;
+};
+dart.fn(convert._combineSurrogatePair, intAndintToint());
+const _isFirstCharacter = Symbol('_isFirstCharacter');
+const _value = Symbol('_value');
+const _expectedUnits = Symbol('_expectedUnits');
+const _extraUnits = Symbol('_extraUnits');
+convert._Utf8Decoder = class _Utf8Decoder extends core.Object {
+  new(stringSink, allowMalformed) {
+    this[_stringSink] = stringSink;
+    this[_allowMalformed] = allowMalformed;
+    this[_isFirstCharacter] = true;
+    this[_value] = 0;
+    this[_expectedUnits] = 0;
+    this[_extraUnits] = 0;
+  }
+  get hasPartialInput() {
+    return dart.notNull(this[_expectedUnits]) > 0;
+  }
+  close() {
+    this.flush();
+  }
+  flush() {
+    if (dart.test(this.hasPartialInput)) {
+      if (!dart.test(this[_allowMalformed])) {
+        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
+      }
+      this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
       this[_value] = 0;
       this[_expectedUnits] = 0;
       this[_extraUnits] = 0;
     }
-    get hasPartialInput() {
-      return dart.notNull(this[_expectedUnits]) > 0;
-    }
-    close() {
-      this.flush();
-    }
-    flush() {
-      if (dart.test(this.hasPartialInput)) {
-        if (!dart.test(this[_allowMalformed])) {
-          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
-        }
-        this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
-        this[_value] = 0;
-        this[_expectedUnits] = 0;
-        this[_extraUnits] = 0;
+  }
+  convert(codeUnits, startIndex, endIndex) {
+    let value = this[_value];
+    let expectedUnits = this[_expectedUnits];
+    let extraUnits = this[_extraUnits];
+    this[_value] = 0;
+    this[_expectedUnits] = 0;
+    this[_extraUnits] = 0;
+    function scanOneByteCharacters(units, from) {
+      let to = endIndex;
+      let mask = convert._ONE_BYTE_LIMIT;
+      for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
+        let unit = dart.dindex(units, i);
+        if (!dart.equals(dart.dsend(unit, '&', mask), unit)) return dart.notNull(i) - dart.notNull(from);
       }
+      return dart.notNull(to) - dart.notNull(from);
     }
-    convert(codeUnits, startIndex, endIndex) {
-      let value = this[_value];
-      let expectedUnits = this[_expectedUnits];
-      let extraUnits = this[_extraUnits];
-      this[_value] = 0;
-      this[_expectedUnits] = 0;
-      this[_extraUnits] = 0;
-      function scanOneByteCharacters(units, from) {
-        let to = endIndex;
-        let mask = convert._ONE_BYTE_LIMIT;
-        for (let i = from; dart.notNull(i) < dart.notNull(to); i = dart.notNull(i) + 1) {
-          let unit = dart.dindex(units, i);
-          if (!dart.equals(dart.dsend(unit, '&', mask), unit)) return dart.notNull(i) - dart.notNull(from);
-        }
-        return dart.notNull(to) - dart.notNull(from);
-      }
-      dart.fn(scanOneByteCharacters, dynamicAndintToint());
-      const addSingleBytes = (function(from, to) {
-        dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNull(from) <= dart.notNull(endIndex));
-        dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull(to) <= dart.notNull(endIndex));
-        this[_stringSink].write(core.String.fromCharCodes(codeUnits, from, to));
-      }).bind(this);
-      dart.fn(addSingleBytes, intAndintTovoid());
-      let i = startIndex;
-      loop:
-        while (true) {
-          multibyte:
-            if (dart.notNull(expectedUnits) > 0) {
-              do {
-                if (i == endIndex) {
-                  break loop;
-                }
-                let unit = codeUnits[dartx._get](i);
-                if ((dart.notNull(unit) & 192) != 128) {
-                  expectedUnits = 0;
-                  if (!dart.test(this[_allowMalformed])) {
-                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
-                  }
-                  this[_isFirstCharacter] = false;
-                  this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
-                  break multibyte;
-                } else {
-                  value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
-                  expectedUnits = dart.notNull(expectedUnits) - 1;
-                  i = dart.notNull(i) + 1;
-                }
-              } while (dart.notNull(expectedUnits) > 0);
-              if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
+    dart.fn(scanOneByteCharacters, dynamicAndintToint());
+    const addSingleBytes = (function(from, to) {
+      dart.assert(dart.notNull(from) >= dart.notNull(startIndex) && dart.notNull(from) <= dart.notNull(endIndex));
+      dart.assert(dart.notNull(to) >= dart.notNull(startIndex) && dart.notNull(to) <= dart.notNull(endIndex));
+      this[_stringSink].write(core.String.fromCharCodes(codeUnits, from, to));
+    }).bind(this);
+    dart.fn(addSingleBytes, intAndintTovoid());
+    let i = startIndex;
+    loop:
+      while (true) {
+        multibyte:
+          if (dart.notNull(expectedUnits) > 0) {
+            do {
+              if (i == endIndex) {
+                break loop;
+              }
+              let unit = codeUnits[dartx._get](i);
+              if ((dart.notNull(unit) & 192) != 128) {
+                expectedUnits = 0;
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
                 }
-                expectedUnits = extraUnits = 0;
-                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
+                this[_isFirstCharacter] = false;
+                this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
+                break multibyte;
+              } else {
+                value = (dart.notNull(value) << 6 | dart.notNull(unit) & 63) >>> 0;
+                expectedUnits = dart.notNull(expectedUnits) - 1;
+                i = dart.notNull(i) + 1;
               }
-              if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
-                if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
-                }
-                value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
-              }
-              if (!dart.test(this[_isFirstCharacter]) || value != convert.UNICODE_BOM_CHARACTER_RUNE) {
-                this[_stringSink].writeCharCode(value);
-              }
-              this[_isFirstCharacter] = false;
-            }
-          while (dart.notNull(i) < dart.notNull(endIndex)) {
-            let oneBytes = scanOneByteCharacters(codeUnits, i);
-            if (dart.notNull(oneBytes) > 0) {
-              this[_isFirstCharacter] = false;
-              addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes));
-              i = dart.notNull(i) + dart.notNull(oneBytes);
-              if (i == endIndex) break;
-            }
-            let unit = codeUnits[dartx._get]((() => {
-              let x = i;
-              i = dart.notNull(x) + 1;
-              return x;
-            })());
-            if (dart.notNull(unit) < 0) {
+            } while (dart.notNull(expectedUnits) > 0);
+            if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
               }
-              this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
-            } else {
-              dart.assert(dart.notNull(unit) > convert._ONE_BYTE_LIMIT);
-              if ((dart.notNull(unit) & 224) == 192) {
-                value = dart.notNull(unit) & 31;
-                expectedUnits = extraUnits = 1;
-                continue loop;
-              }
-              if ((dart.notNull(unit) & 240) == 224) {
-                value = dart.notNull(unit) & 15;
-                expectedUnits = extraUnits = 2;
-                continue loop;
-              }
-              if ((dart.notNull(unit) & 248) == 240 && dart.notNull(unit) < 245) {
-                value = dart.notNull(unit) & 7;
-                expectedUnits = extraUnits = 3;
-                continue loop;
-              }
+              expectedUnits = extraUnits = 0;
+              value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
+            }
+            if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
               }
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
-              expectedUnits = extraUnits = 0;
-              this[_isFirstCharacter] = false;
+            }
+            if (!dart.test(this[_isFirstCharacter]) || value != convert.UNICODE_BOM_CHARACTER_RUNE) {
               this[_stringSink].writeCharCode(value);
             }
+            this[_isFirstCharacter] = false;
           }
-          break loop;
-        }
-      if (dart.notNull(expectedUnits) > 0) {
-        this[_value] = value;
-        this[_expectedUnits] = expectedUnits;
-        this[_extraUnits] = extraUnits;
-      }
-    }
-  };
-  dart.setSignature(convert._Utf8Decoder, {
-    constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Decoder, [core.StringSink, core.bool])}),
-    fields: () => ({
-      [_allowMalformed]: core.bool,
-      [_stringSink]: core.StringSink,
-      [_isFirstCharacter]: core.bool,
-      [_value]: core.int,
-      [_expectedUnits]: core.int,
-      [_extraUnits]: core.int
-    }),
-    getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      flush: dart.definiteFunctionType(dart.void, []),
-      convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
-    }),
-    sfields: () => ({_LIMITS: ListOfint()})
-  });
-  convert._Utf8Decoder._LIMITS = dart.constList([convert._ONE_BYTE_LIMIT, convert._TWO_BYTE_LIMIT, convert._THREE_BYTE_LIMIT, convert._FOUR_BYTE_LIMIT], core.int);
-  core._symbolToString = function(symbol) {
-    return _internal.Symbol.getName(_internal.Symbol._check(symbol));
-  };
-  dart.lazyFn(core._symbolToString, () => SymbolToString());
-  core.StrongModeError = class StrongModeError extends core.Error {
-    new() {
-      super.new();
-    }
-  };
-  core.Deprecated = class Deprecated extends core.Object {
-    new(expires) {
-      this.expires = expires;
-    }
-    toString() {
-      return dart.str`Deprecated feature. Will be removed ${this.expires}`;
-    }
-  };
-  dart.setSignature(core.Deprecated, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Deprecated, [core.String])}),
-    fields: () => ({expires: core.String})
-  });
-  core._Override = class _Override extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(core._Override, {
-    constructors: () => ({new: dart.definiteFunctionType(core._Override, [])})
-  });
-  core.deprecated = dart.const(new core.Deprecated("next release"));
-  core.override = dart.const(new core._Override());
-  core._Proxy = class _Proxy extends core.Object {
-    new() {
-    }
-  };
-  dart.setSignature(core._Proxy, {
-    constructors: () => ({new: dart.definiteFunctionType(core._Proxy, [])})
-  });
-  core.proxy = dart.const(new core._Proxy());
-  dart.defineExtensionNames([
-    'toString'
-  ]);
-  core.bool = class bool extends core.Object {
-    static fromEnvironment(name, opts) {
-      let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
-      dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
-    }
-    [dartx.toString]() {
-      return this ? "true" : "false";
-    }
-  };
-  core.bool.is = function is_bool(o) {
-    return o === true || o === false;
-  };
-  core.bool.as = function as_bool(o) {
-    if (o === true || o === false || o == null) return o;
-    return dart.as(o, core.bool);
-  };
-  core.bool._check = function check_bool(o) {
-    if (o === true || o === false || o == null) return o;
-    return dart.check(o, core.bool);
-  };
-  dart.setSignature(core.bool, {
-    constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.bool, [core.String], {defaultValue: core.bool})})
-  });
-  core.Comparator$ = dart.generic(T => {
-    const Comparator = dart.typedef('Comparator', () => dart.functionType(core.int, [T, T]));
-    return Comparator;
-  });
-  core.Comparator = Comparator();
-  core.Comparable$ = dart.generic(T => {
-    class Comparable extends core.Object {
-      static compare(a, b) {
-        return a[dartx.compareTo](b);
-      }
-    }
-    dart.addTypeTests(Comparable);
-    dart.setSignature(Comparable, {
-      statics: () => ({compare: dart.definiteFunctionType(core.int, [core.Comparable, core.Comparable])}),
-      names: ['compare']
-    });
-    return Comparable;
-  });
-  core.Comparable = Comparable();
-  const _value$ = Symbol('_value');
-  core.DateTime = class DateTime extends core.Object {
-    new(year, month, day, hour, minute, second, millisecond, microsecond) {
-      if (month === void 0) month = 1;
-      if (day === void 0) day = 1;
-      if (hour === void 0) hour = 0;
-      if (minute === void 0) minute = 0;
-      if (second === void 0) second = 0;
-      if (millisecond === void 0) millisecond = 0;
-      if (microsecond === void 0) microsecond = 0;
-      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
-    }
-    utc(year, month, day, hour, minute, second, millisecond, microsecond) {
-      if (month === void 0) month = 1;
-      if (day === void 0) day = 1;
-      if (hour === void 0) hour = 0;
-      if (minute === void 0) minute = 0;
-      if (second === void 0) second = 0;
-      if (millisecond === void 0) millisecond = 0;
-      if (microsecond === void 0) microsecond = 0;
-      DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
-    }
-    now() {
-      DateTime.prototype._now.call(this);
-    }
-    static parse(formattedString) {
-      let re = core.RegExp.new('^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)' + '(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{1,6}))?)?)?' + '( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$');
-      let match = re.firstMatch(formattedString);
-      if (match != null) {
-        function parseIntOrZero(matched) {
-          if (matched == null) return 0;
-          return core.int.parse(matched);
-        }
-        dart.fn(parseIntOrZero, StringToint$());
-        function parseMilliAndMicroseconds(matched) {
-          if (matched == null) return 0;
-          let length = matched[dartx.length];
-          dart.assert(dart.notNull(length) >= 1);
-          dart.assert(dart.notNull(length) <= 6);
-          let result = 0;
-          for (let i = 0; i < 6; i++) {
-            result = result * 10;
-            if (i < dart.notNull(matched[dartx.length])) {
-              result = result + ((dart.notNull(matched[dartx.codeUnitAt](i)) ^ 48) >>> 0);
+        while (dart.notNull(i) < dart.notNull(endIndex)) {
+          let oneBytes = scanOneByteCharacters(codeUnits, i);
+          if (dart.notNull(oneBytes) > 0) {
+            this[_isFirstCharacter] = false;
+            addSingleBytes(i, dart.notNull(i) + dart.notNull(oneBytes));
+            i = dart.notNull(i) + dart.notNull(oneBytes);
+            if (i == endIndex) break;
+          }
+          let unit = codeUnits[dartx._get]((() => {
+            let x = i;
+            i = dart.notNull(x) + 1;
+            return x;
+          })());
+          if (dart.notNull(unit) < 0) {
+            if (!dart.test(this[_allowMalformed])) {
+              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
             }
-          }
-          return result;
-        }
-        dart.fn(parseMilliAndMicroseconds, StringToint$());
-        let years = core.int.parse(match._get(1));
-        let month = core.int.parse(match._get(2));
-        let day = core.int.parse(match._get(3));
-        let hour = parseIntOrZero(match._get(4));
-        let minute = parseIntOrZero(match._get(5));
-        let second = parseIntOrZero(match._get(6));
-        let addOneMillisecond = false;
-        let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
-        let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
-        let microsecond = dart.asInt(milliAndMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_MILLISECOND));
-        let isUtc = false;
-        if (match._get(8) != null) {
-          isUtc = true;
-          if (match._get(9) != null) {
-            let sign = match._get(9) == '-' ? -1 : 1;
-            let hourDifference = core.int.parse(match._get(10));
-            let minuteDifference = parseIntOrZero(match._get(11));
-            minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
-            minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
+            this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
+          } else {
+            dart.assert(dart.notNull(unit) > convert._ONE_BYTE_LIMIT);
+            if ((dart.notNull(unit) & 224) == 192) {
+              value = dart.notNull(unit) & 31;
+              expectedUnits = extraUnits = 1;
+              continue loop;
+            }
+            if ((dart.notNull(unit) & 240) == 224) {
+              value = dart.notNull(unit) & 15;
+              expectedUnits = extraUnits = 2;
+              continue loop;
+            }
+            if ((dart.notNull(unit) & 248) == 240 && dart.notNull(unit) < 245) {
+              value = dart.notNull(unit) & 7;
+              expectedUnits = extraUnits = 3;
+              continue loop;
+            }
+            if (!dart.test(this[_allowMalformed])) {
+              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+            }
+            value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
+            expectedUnits = extraUnits = 0;
+            this[_isFirstCharacter] = false;
+            this[_stringSink].writeCharCode(value);
           }
         }
-        let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
-        if (value == null) {
-          dart.throw(new core.FormatException("Time out of range", formattedString));
+        break loop;
+      }
+    if (dart.notNull(expectedUnits) > 0) {
+      this[_value] = value;
+      this[_expectedUnits] = expectedUnits;
+      this[_extraUnits] = extraUnits;
+    }
+  }
+};
+dart.setSignature(convert._Utf8Decoder, {
+  constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Decoder, [core.StringSink, core.bool])}),
+  fields: () => ({
+    [_allowMalformed]: core.bool,
+    [_stringSink]: core.StringSink,
+    [_isFirstCharacter]: core.bool,
+    [_value]: core.int,
+    [_expectedUnits]: core.int,
+    [_extraUnits]: core.int
+  }),
+  getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    flush: dart.definiteFunctionType(dart.void, []),
+    convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
+  }),
+  sfields: () => ({_LIMITS: ListOfint()})
+});
+convert._Utf8Decoder._LIMITS = dart.constList([convert._ONE_BYTE_LIMIT, convert._TWO_BYTE_LIMIT, convert._THREE_BYTE_LIMIT, convert._FOUR_BYTE_LIMIT], core.int);
+core._symbolToString = function(symbol) {
+  return _internal.Symbol.getName(_internal.Symbol._check(symbol));
+};
+dart.lazyFn(core._symbolToString, () => SymbolToString());
+core.StrongModeError = class StrongModeError extends core.Error {
+  new() {
+    super.new();
+  }
+};
+core.Deprecated = class Deprecated extends core.Object {
+  new(expires) {
+    this.expires = expires;
+  }
+  toString() {
+    return dart.str`Deprecated feature. Will be removed ${this.expires}`;
+  }
+};
+dart.setSignature(core.Deprecated, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Deprecated, [core.String])}),
+  fields: () => ({expires: core.String})
+});
+core._Override = class _Override extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(core._Override, {
+  constructors: () => ({new: dart.definiteFunctionType(core._Override, [])})
+});
+core.deprecated = dart.const(new core.Deprecated("next release"));
+core.override = dart.const(new core._Override());
+core._Proxy = class _Proxy extends core.Object {
+  new() {
+  }
+};
+dart.setSignature(core._Proxy, {
+  constructors: () => ({new: dart.definiteFunctionType(core._Proxy, [])})
+});
+core.proxy = dart.const(new core._Proxy());
+dart.defineExtensionNames([
+  'toString'
+]);
+core.bool = class bool extends core.Object {
+  static fromEnvironment(name, opts) {
+    let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
+    dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
+  }
+  [dartx.toString]() {
+    return this ? "true" : "false";
+  }
+};
+core.bool.is = function is_bool(o) {
+  return o === true || o === false;
+};
+core.bool.as = function as_bool(o) {
+  if (o === true || o === false || o == null) return o;
+  return dart.as(o, core.bool);
+};
+core.bool._check = function check_bool(o) {
+  if (o === true || o === false || o == null) return o;
+  return dart.check(o, core.bool);
+};
+dart.setSignature(core.bool, {
+  constructors: () => ({fromEnvironment: dart.definiteFunctionType(core.bool, [core.String], {defaultValue: core.bool})})
+});
+core.Comparator$ = dart.generic(T => {
+  const Comparator = dart.typedef('Comparator', () => dart.functionType(core.int, [T, T]));
+  return Comparator;
+});
+core.Comparator = Comparator();
+core.Comparable$ = dart.generic(T => {
+  class Comparable extends core.Object {
+    static compare(a, b) {
+      return a[dartx.compareTo](b);
+    }
+  }
+  dart.addTypeTests(Comparable);
+  dart.setSignature(Comparable, {
+    statics: () => ({compare: dart.definiteFunctionType(core.int, [core.Comparable, core.Comparable])}),
+    names: ['compare']
+  });
+  return Comparable;
+});
+core.Comparable = Comparable();
+const _value$ = Symbol('_value');
+core.DateTime = class DateTime extends core.Object {
+  new(year, month, day, hour, minute, second, millisecond, microsecond) {
+    if (month === void 0) month = 1;
+    if (day === void 0) day = 1;
+    if (hour === void 0) hour = 0;
+    if (minute === void 0) minute = 0;
+    if (second === void 0) second = 0;
+    if (millisecond === void 0) millisecond = 0;
+    if (microsecond === void 0) microsecond = 0;
+    DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, false);
+  }
+  utc(year, month, day, hour, minute, second, millisecond, microsecond) {
+    if (month === void 0) month = 1;
+    if (day === void 0) day = 1;
+    if (hour === void 0) hour = 0;
+    if (minute === void 0) minute = 0;
+    if (second === void 0) second = 0;
+    if (millisecond === void 0) millisecond = 0;
+    if (microsecond === void 0) microsecond = 0;
+    DateTime.prototype._internal.call(this, year, month, day, hour, minute, second, millisecond, microsecond, true);
+  }
+  now() {
+    DateTime.prototype._now.call(this);
+  }
+  static parse(formattedString) {
+    let re = core.RegExp.new('^([+-]?\\d{4,6})-?(\\d\\d)-?(\\d\\d)' + '(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d{1,6}))?)?)?' + '( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$');
+    let match = re.firstMatch(formattedString);
+    if (match != null) {
+      function parseIntOrZero(matched) {
+        if (matched == null) return 0;
+        return core.int.parse(matched);
+      }
+      dart.fn(parseIntOrZero, StringToint$());
+      function parseMilliAndMicroseconds(matched) {
+        if (matched == null) return 0;
+        let length = matched[dartx.length];
+        dart.assert(dart.notNull(length) >= 1);
+        dart.assert(dart.notNull(length) <= 6);
+        let result = 0;
+        for (let i = 0; i < 6; i++) {
+          result = result * 10;
+          if (i < dart.notNull(matched[dartx.length])) {
+            result = result + ((dart.notNull(matched[dartx.codeUnitAt](i)) ^ 48) >>> 0);
+          }
         }
-        return new core.DateTime._withValue(value, {isUtc: isUtc});
-      } else {
-        dart.throw(new core.FormatException("Invalid date format", formattedString));
+        return result;
       }
-    }
-    fromMillisecondsSinceEpoch(millisecondsSinceEpoch, opts) {
-      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
-      DateTime.prototype._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
-    }
-    fromMicrosecondsSinceEpoch(microsecondsSinceEpoch, opts) {
-      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
-      DateTime.prototype._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
-    }
-    _withValue(value, opts) {
-      let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
-      this[_value$] = value;
-      this.isUtc = isUtc;
-      if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
-        dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
+      dart.fn(parseMilliAndMicroseconds, StringToint$());
+      let years = core.int.parse(match._get(1));
+      let month = core.int.parse(match._get(2));
+      let day = core.int.parse(match._get(3));
+      let hour = parseIntOrZero(match._get(4));
+      let minute = parseIntOrZero(match._get(5));
+      let second = parseIntOrZero(match._get(6));
+      let addOneMillisecond = false;
+      let milliAndMicroseconds = parseMilliAndMicroseconds(match._get(7));
+      let millisecond = (dart.notNull(milliAndMicroseconds) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
+      let microsecond = dart.asInt(milliAndMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_MILLISECOND));
+      let isUtc = false;
+      if (match._get(8) != null) {
+        isUtc = true;
+        if (match._get(9) != null) {
+          let sign = match._get(9) == '-' ? -1 : 1;
+          let hourDifference = core.int.parse(match._get(10));
+          let minuteDifference = parseIntOrZero(match._get(11));
+          minuteDifference = dart.notNull(minuteDifference) + 60 * dart.notNull(hourDifference);
+          minute = dart.notNull(minute) - sign * dart.notNull(minuteDifference);
+        }
       }
-      if (this.isUtc == null) dart.throw(new core.ArgumentError(this.isUtc));
-    }
-    ['=='](other) {
-      if (!core.DateTime.is(other)) return false;
-      return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
-    }
-    isBefore(other) {
-      return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
-    }
-    isAfter(other) {
-      return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
-    }
-    isAtSameMomentAs(other) {
-      return this[_value$] == other[_value$];
-    }
-    compareTo(other) {
-      return this[_value$][dartx.compareTo](other[_value$]);
-    }
-    get hashCode() {
-      return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
-    }
-    toLocal() {
-      if (dart.test(this.isUtc)) {
-        return new core.DateTime._withValue(this[_value$], {isUtc: false});
+      let value = core.DateTime._brokenDownDateToValue(years, month, day, hour, minute, second, millisecond, microsecond, isUtc);
+      if (value == null) {
+        dart.throw(new core.FormatException("Time out of range", formattedString));
       }
-      return this;
+      return new core.DateTime._withValue(value, {isUtc: isUtc});
+    } else {
+      dart.throw(new core.FormatException("Invalid date format", formattedString));
     }
-    toUtc() {
-      if (dart.test(this.isUtc)) return this;
-      return new core.DateTime._withValue(this[_value$], {isUtc: true});
+  }
+  fromMillisecondsSinceEpoch(millisecondsSinceEpoch, opts) {
+    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
+    DateTime.prototype._withValue.call(this, millisecondsSinceEpoch, {isUtc: isUtc});
+  }
+  fromMicrosecondsSinceEpoch(microsecondsSinceEpoch, opts) {
+    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : false;
+    DateTime.prototype._withValue.call(this, core.DateTime._microsecondInRoundedMilliseconds(microsecondsSinceEpoch), {isUtc: isUtc});
+  }
+  _withValue(value, opts) {
+    let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
+    this[_value$] = value;
+    this.isUtc = isUtc;
+    if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
+      dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
     }
-    static _fourDigits(n) {
-      let absN = n[dartx.abs]();
-      let sign = dart.notNull(n) < 0 ? "-" : "";
-      if (dart.notNull(absN) >= 1000) return dart.str`${n}`;
-      if (dart.notNull(absN) >= 100) return dart.str`${sign}0${absN}`;
-      if (dart.notNull(absN) >= 10) return dart.str`${sign}00${absN}`;
-      return dart.str`${sign}000${absN}`;
+    if (this.isUtc == null) dart.throw(new core.ArgumentError(this.isUtc));
+  }
+  ['=='](other) {
+    if (!core.DateTime.is(other)) return false;
+    return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
+  }
+  isBefore(other) {
+    return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
+  }
+  isAfter(other) {
+    return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
+  }
+  isAtSameMomentAs(other) {
+    return this[_value$] == other[_value$];
+  }
+  compareTo(other) {
+    return this[_value$][dartx.compareTo](other[_value$]);
+  }
+  get hashCode() {
+    return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
+  }
+  toLocal() {
+    if (dart.test(this.isUtc)) {
+      return new core.DateTime._withValue(this[_value$], {isUtc: false});
     }
-    static _sixDigits(n) {
-      dart.assert(dart.notNull(n) < -9999 || dart.notNull(n) > 9999);
-      let absN = n[dartx.abs]();
-      let sign = dart.notNull(n) < 0 ? "-" : "+";
-      if (dart.notNull(absN) >= 100000) return dart.str`${sign}${absN}`;
-      return dart.str`${sign}0${absN}`;
+    return this;
+  }
+  toUtc() {
+    if (dart.test(this.isUtc)) return this;
+    return new core.DateTime._withValue(this[_value$], {isUtc: true});
+  }
+  static _fourDigits(n) {
+    let absN = n[dartx.abs]();
+    let sign = dart.notNull(n) < 0 ? "-" : "";
+    if (dart.notNull(absN) >= 1000) return dart.str`${n}`;
+    if (dart.notNull(absN) >= 100) return dart.str`${sign}0${absN}`;
+    if (dart.notNull(absN) >= 10) return dart.str`${sign}00${absN}`;
+    return dart.str`${sign}000${absN}`;
+  }
+  static _sixDigits(n) {
+    dart.assert(dart.notNull(n) < -9999 || dart.notNull(n) > 9999);
+    let absN = n[dartx.abs]();
+    let sign = dart.notNull(n) < 0 ? "-" : "+";
+    if (dart.notNull(absN) >= 100000) return dart.str`${sign}${absN}`;
+    return dart.str`${sign}0${absN}`;
+  }
+  static _threeDigits(n) {
+    if (dart.notNull(n) >= 100) return dart.str`${n}`;
+    if (dart.notNull(n) >= 10) return dart.str`0${n}`;
+    return dart.str`00${n}`;
+  }
+  static _twoDigits(n) {
+    if (dart.notNull(n) >= 10) return dart.str`${n}`;
+    return dart.str`0${n}`;
+  }
+  toString() {
+    let y = core.DateTime._fourDigits(this.year);
+    let m = core.DateTime._twoDigits(this.month);
+    let d = core.DateTime._twoDigits(this.day);
+    let h = core.DateTime._twoDigits(this.hour);
+    let min = core.DateTime._twoDigits(this.minute);
+    let sec = core.DateTime._twoDigits(this.second);
+    let ms = core.DateTime._threeDigits(this.millisecond);
+    let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
+    if (dart.test(this.isUtc)) {
+      return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}Z`;
+    } else {
+      return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}`;
     }
-    static _threeDigits(n) {
-      if (dart.notNull(n) >= 100) return dart.str`${n}`;
-      if (dart.notNull(n) >= 10) return dart.str`0${n}`;
-      return dart.str`00${n}`;
+  }
+  toIso8601String() {
+    let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
+    let m = core.DateTime._twoDigits(this.month);
+    let d = core.DateTime._twoDigits(this.day);
+    let h = core.DateTime._twoDigits(this.hour);
+    let min = core.DateTime._twoDigits(this.minute);
+    let sec = core.DateTime._twoDigits(this.second);
+    let ms = core.DateTime._threeDigits(this.millisecond);
+    let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
+    if (dart.test(this.isUtc)) {
+      return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}Z`;
+    } else {
+      return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}`;
     }
-    static _twoDigits(n) {
+  }
+  add(duration) {
+    return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
+  }
+  subtract(duration) {
+    return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
+  }
+  difference(other) {
+    return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
+  }
+  _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
+    this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
+    this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
+  }
+  _now() {
+    this.isUtc = false;
+    this[_value$] = _js_helper.Primitives.dateNow();
+  }
+  static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
+    return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
+  }
+  get millisecondsSinceEpoch() {
+    return this[_value$];
+  }
+  get microsecondsSinceEpoch() {
+    return dart.notNull(this[_value$]) * 1000;
+  }
+  get timeZoneName() {
+    if (dart.test(this.isUtc)) return "UTC";
+    return _js_helper.Primitives.getTimeZoneName(this);
+  }
+  get timeZoneOffset() {
+    if (dart.test(this.isUtc)) return new core.Duration();
+    return new core.Duration({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
+  }
+  get year() {
+    return core.int._check(_js_helper.Primitives.getYear(this));
+  }
+  get month() {
+    return core.int._check(_js_helper.Primitives.getMonth(this));
+  }
+  get day() {
+    return core.int._check(_js_helper.Primitives.getDay(this));
+  }
+  get hour() {
+    return core.int._check(_js_helper.Primitives.getHours(this));
+  }
+  get minute() {
+    return core.int._check(_js_helper.Primitives.getMinutes(this));
+  }
+  get second() {
+    return core.int._check(_js_helper.Primitives.getSeconds(this));
+  }
+  get millisecond() {
+    return core.int._check(_js_helper.Primitives.getMilliseconds(this));
+  }
+  get microsecond() {
+    return 0;
+  }
+  get weekday() {
+    return core.int._check(_js_helper.Primitives.getWeekday(this));
+  }
+  static _microsecondInRoundedMilliseconds(microsecond) {
+    return (dart.notNull(microsecond) / 1000)[dartx.round]();
+  }
+};
+dart.defineNamedConstructor(core.DateTime, 'utc');
+dart.defineNamedConstructor(core.DateTime, 'now');
+dart.defineNamedConstructor(core.DateTime, 'fromMillisecondsSinceEpoch');
+dart.defineNamedConstructor(core.DateTime, 'fromMicrosecondsSinceEpoch');
+dart.defineNamedConstructor(core.DateTime, '_withValue');
+dart.defineNamedConstructor(core.DateTime, '_internal');
+dart.defineNamedConstructor(core.DateTime, '_now');
+core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
+dart.setSignature(core.DateTime, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
+    utc: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
+    now: dart.definiteFunctionType(core.DateTime, []),
+    fromMillisecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
+    fromMicrosecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
+    _withValue: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
+    _internal: dart.definiteFunctionType(core.DateTime, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
+    _now: dart.definiteFunctionType(core.DateTime, [])
+  }),
+  fields: () => ({
+    [_value$]: core.int,
+    isUtc: core.bool
+  }),
+  getters: () => ({
+    millisecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
+    microsecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
+    timeZoneName: dart.definiteFunctionType(core.String, []),
+    timeZoneOffset: dart.definiteFunctionType(core.Duration, []),
+    year: dart.definiteFunctionType(core.int, []),
+    month: dart.definiteFunctionType(core.int, []),
+    day: dart.definiteFunctionType(core.int, []),
+    hour: dart.definiteFunctionType(core.int, []),
+    minute: dart.definiteFunctionType(core.int, []),
+    second: dart.definiteFunctionType(core.int, []),
+    millisecond: dart.definiteFunctionType(core.int, []),
+    microsecond: dart.definiteFunctionType(core.int, []),
+    weekday: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    isBefore: dart.definiteFunctionType(core.bool, [core.DateTime]),
+    isAfter: dart.definiteFunctionType(core.bool, [core.DateTime]),
+    isAtSameMomentAs: dart.definiteFunctionType(core.bool, [core.DateTime]),
+    compareTo: dart.definiteFunctionType(core.int, [core.DateTime]),
+    toLocal: dart.definiteFunctionType(core.DateTime, []),
+    toUtc: dart.definiteFunctionType(core.DateTime, []),
+    toIso8601String: dart.definiteFunctionType(core.String, []),
+    add: dart.definiteFunctionType(core.DateTime, [core.Duration]),
+    subtract: dart.definiteFunctionType(core.DateTime, [core.Duration]),
+    difference: dart.definiteFunctionType(core.Duration, [core.DateTime])
+  }),
+  sfields: () => ({
+    MONDAY: core.int,
+    TUESDAY: core.int,
+    WEDNESDAY: core.int,
+    THURSDAY: core.int,
+    FRIDAY: core.int,
+    SATURDAY: core.int,
+    SUNDAY: core.int,
+    DAYS_PER_WEEK: core.int,
+    JANUARY: core.int,
+    FEBRUARY: core.int,
+    MARCH: core.int,
+    APRIL: core.int,
+    MAY: core.int,
+    JUNE: core.int,
+    JULY: core.int,
+    AUGUST: core.int,
+    SEPTEMBER: core.int,
+    OCTOBER: core.int,
+    NOVEMBER: core.int,
+    DECEMBER: core.int,
+    MONTHS_PER_YEAR: core.int,
+    _MAX_MILLISECONDS_SINCE_EPOCH: core.int
+  }),
+  statics: () => ({
+    parse: dart.definiteFunctionType(core.DateTime, [core.String]),
+    _fourDigits: dart.definiteFunctionType(core.String, [core.int]),
+    _sixDigits: dart.definiteFunctionType(core.String, [core.int]),
+    _threeDigits: dart.definiteFunctionType(core.String, [core.int]),
+    _twoDigits: dart.definiteFunctionType(core.String, [core.int]),
+    _brokenDownDateToValue: dart.definiteFunctionType(core.int, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
+    _microsecondInRoundedMilliseconds: dart.definiteFunctionType(core.int, [core.int])
+  }),
+  names: ['parse', '_fourDigits', '_sixDigits', '_threeDigits', '_twoDigits', '_brokenDownDateToValue', '_microsecondInRoundedMilliseconds']
+});
+dart.defineExtensionMembers(core.DateTime, ['compareTo']);
+core.DateTime.MONDAY = 1;
+core.DateTime.TUESDAY = 2;
+core.DateTime.WEDNESDAY = 3;
+core.DateTime.THURSDAY = 4;
+core.DateTime.FRIDAY = 5;
+core.DateTime.SATURDAY = 6;
+core.DateTime.SUNDAY = 7;
+core.DateTime.DAYS_PER_WEEK = 7;
+core.DateTime.JANUARY = 1;
+core.DateTime.FEBRUARY = 2;
+core.DateTime.MARCH = 3;
+core.DateTime.APRIL = 4;
+core.DateTime.MAY = 5;
+core.DateTime.JUNE = 6;
+core.DateTime.JULY = 7;
+core.DateTime.AUGUST = 8;
+core.DateTime.SEPTEMBER = 9;
+core.DateTime.OCTOBER = 10;
+core.DateTime.NOVEMBER = 11;
+core.DateTime.DECEMBER = 12;
+core.DateTime.MONTHS_PER_YEAR = 12;
+core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
+const _duration = Symbol('_duration');
+core.Duration = class Duration extends core.Object {
+  new(opts) {
+    let days = opts && 'days' in opts ? opts.days : 0;
+    let hours = opts && 'hours' in opts ? opts.hours : 0;
+    let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
+    let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
+    let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
+    let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
+    Duration.prototype._microseconds.call(this, core.Duration.MICROSECONDS_PER_DAY * dart.notNull(days) + core.Duration.MICROSECONDS_PER_HOUR * dart.notNull(hours) + core.Duration.MICROSECONDS_PER_MINUTE * dart.notNull(minutes) + core.Duration.MICROSECONDS_PER_SECOND * dart.notNull(seconds) + core.Duration.MICROSECONDS_PER_MILLISECOND * dart.notNull(milliseconds) + dart.notNull(microseconds));
+  }
+  _microseconds(duration) {
+    this[_duration] = duration;
+  }
+  ['+'](other) {
+    return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
+  }
+  ['-'](other) {
+    return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
+  }
+  ['*'](factor) {
+    return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[dartx.round]());
+  }
+  ['~/'](quotient) {
+    if (quotient == 0) dart.throw(new core.IntegerDivisionByZeroException());
+    return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[dartx.truncate]());
+  }
+  ['<'](other) {
+    return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
+  }
+  ['>'](other) {
+    return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
+  }
+  ['<='](other) {
+    return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
+  }
+  ['>='](other) {
+    return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
+  }
+  get inDays() {
+    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_DAY)[dartx.truncate]();
+  }
+  get inHours() {
+    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_HOUR)[dartx.truncate]();
+  }
+  get inMinutes() {
+    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MINUTE)[dartx.truncate]();
+  }
+  get inSeconds() {
+    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_SECOND)[dartx.truncate]();
+  }
+  get inMilliseconds() {
+    return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
+  }
+  get inMicroseconds() {
+    return this[_duration];
+  }
+  ['=='](other) {
+    if (!core.Duration.is(other)) return false;
+    return dart.equals(this[_duration], dart.dload(other, _duration));
+  }
+  get hashCode() {
+    return dart.hashCode(this[_duration]);
+  }
+  compareTo(other) {
+    return this[_duration][dartx.compareTo](other[_duration]);
+  }
+  toString() {
+    function sixDigits(n) {
+      if (dart.notNull(n) >= 100000) return dart.str`${n}`;
+      if (dart.notNull(n) >= 10000) return dart.str`0${n}`;
+      if (dart.notNull(n) >= 1000) return dart.str`00${n}`;
+      if (dart.notNull(n) >= 100) return dart.str`000${n}`;
+      if (dart.notNull(n) >= 10) return dart.str`0000${n}`;
+      return dart.str`00000${n}`;
+    }
+    dart.fn(sixDigits, intToString());
+    function twoDigits(n) {
       if (dart.notNull(n) >= 10) return dart.str`${n}`;
       return dart.str`0${n}`;
     }
-    toString() {
-      let y = core.DateTime._fourDigits(this.year);
-      let m = core.DateTime._twoDigits(this.month);
-      let d = core.DateTime._twoDigits(this.day);
-      let h = core.DateTime._twoDigits(this.hour);
-      let min = core.DateTime._twoDigits(this.minute);
-      let sec = core.DateTime._twoDigits(this.second);
-      let ms = core.DateTime._threeDigits(this.millisecond);
-      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
-      if (dart.test(this.isUtc)) {
-        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}Z`;
-      } else {
-        return dart.str`${y}-${m}-${d} ${h}:${min}:${sec}.${ms}${us}`;
+    dart.fn(twoDigits, intToString());
+    if (dart.notNull(this.inMicroseconds) < 0) {
+      return dart.str`-${this._negate()}`;
+    }
+    let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[dartx.remainder](core.Duration.MINUTES_PER_HOUR)));
+    let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[dartx.remainder](core.Duration.SECONDS_PER_MINUTE)));
+    let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_SECOND)));
+    return dart.str`${this.inHours}:${twoDigitMinutes}:${twoDigitSeconds}.${sixDigitUs}`;
+  }
+  get isNegative() {
+    return dart.notNull(this[_duration]) < 0;
+  }
+  abs() {
+    return new core.Duration._microseconds(this[_duration][dartx.abs]());
+  }
+  _negate() {
+    return new core.Duration._microseconds(-dart.notNull(this[_duration]));
+  }
+};
+dart.defineNamedConstructor(core.Duration, '_microseconds');
+core.Duration[dart.implements] = () => [ComparableOfDuration()];
+dart.setSignature(core.Duration, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.Duration, [], {days: core.int, hours: core.int, minutes: core.int, seconds: core.int, milliseconds: core.int, microseconds: core.int}),
+    _microseconds: dart.definiteFunctionType(core.Duration, [core.int])
+  }),
+  fields: () => ({[_duration]: core.int}),
+  getters: () => ({
+    inDays: dart.definiteFunctionType(core.int, []),
+    inHours: dart.definiteFunctionType(core.int, []),
+    inMinutes: dart.definiteFunctionType(core.int, []),
+    inSeconds: dart.definiteFunctionType(core.int, []),
+    inMilliseconds: dart.definiteFunctionType(core.int, []),
+    inMicroseconds: dart.definiteFunctionType(core.int, []),
+    isNegative: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    '+': dart.definiteFunctionType(core.Duration, [core.Duration]),
+    '-': dart.definiteFunctionType(core.Duration, [core.Duration]),
+    '*': dart.definiteFunctionType(core.Duration, [core.num]),
+    '~/': dart.definiteFunctionType(core.Duration, [core.int]),
+    '<': dart.definiteFunctionType(core.bool, [core.Duration]),
+    '>': dart.definiteFunctionType(core.bool, [core.Duration]),
+    '<=': dart.definiteFunctionType(core.bool, [core.Duration]),
+    '>=': dart.definiteFunctionType(core.bool, [core.Duration]),
+    compareTo: dart.definiteFunctionType(core.int, [core.Duration]),
+    abs: dart.definiteFunctionType(core.Duration, []),
+    _negate: dart.definiteFunctionType(core.Duration, [])
+  }),
+  sfields: () => ({
+    MICROSECONDS_PER_MILLISECOND: core.int,
+    MILLISECONDS_PER_SECOND: core.int,
+    SECONDS_PER_MINUTE: core.int,
+    MINUTES_PER_HOUR: core.int,
+    HOURS_PER_DAY: core.int,
+    MICROSECONDS_PER_SECOND: core.int,
+    MICROSECONDS_PER_MINUTE: core.int,
+    MICROSECONDS_PER_HOUR: core.int,
+    MICROSECONDS_PER_DAY: core.int,
+    MILLISECONDS_PER_MINUTE: core.int,
+    MILLISECONDS_PER_HOUR: core.int,
+    MILLISECONDS_PER_DAY: core.int,
+    SECONDS_PER_HOUR: core.int,
+    SECONDS_PER_DAY: core.int,
+    MINUTES_PER_DAY: core.int,
+    ZERO: core.Duration
+  })
+});
+dart.defineExtensionMembers(core.Duration, ['compareTo']);
+core.Duration.MICROSECONDS_PER_MILLISECOND = 1000;
+core.Duration.MILLISECONDS_PER_SECOND = 1000;
+core.Duration.SECONDS_PER_MINUTE = 60;
+core.Duration.MINUTES_PER_HOUR = 60;
+core.Duration.HOURS_PER_DAY = 24;
+dart.defineLazy(core.Duration, {
+  get MICROSECONDS_PER_SECOND() {
+    return core.Duration.MICROSECONDS_PER_MILLISECOND * core.Duration.MILLISECONDS_PER_SECOND;
+  },
+  get MICROSECONDS_PER_MINUTE() {
+    return core.Duration.MICROSECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
+  },
+  get MICROSECONDS_PER_HOUR() {
+    return core.Duration.MICROSECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
+  },
+  get MICROSECONDS_PER_DAY() {
+    return core.Duration.MICROSECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
+  },
+  get MILLISECONDS_PER_MINUTE() {
+    return core.Duration.MILLISECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
+  },
+  get MILLISECONDS_PER_HOUR() {
+    return core.Duration.MILLISECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
+  },
+  get MILLISECONDS_PER_DAY() {
+    return core.Duration.MILLISECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
+  },
+  get SECONDS_PER_HOUR() {
+    return core.Duration.SECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
+  },
+  get SECONDS_PER_DAY() {
+    return core.Duration.SECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
+  },
+  get MINUTES_PER_DAY() {
+    return core.Duration.MINUTES_PER_HOUR * core.Duration.HOURS_PER_DAY;
+  },
+  get ZERO() {
+    return dart.const(new core.Duration({seconds: 0}));
+  }
+});
+core.TypeError = class TypeError extends core.AssertionError {
+  new() {
+    super.new();
+  }
+};
+core.CastError = class CastError extends core.Error {
+  new() {
+    super.new();
+  }
+};
+core.NullThrownError = class NullThrownError extends core.Error {
+  new() {
+    super.new();
+  }
+  toString() {
+    return "Throw of null.";
+  }
+};
+const _hasValue = Symbol('_hasValue');
+const _errorName = Symbol('_errorName');
+const _errorExplanation = Symbol('_errorExplanation');
+core.ArgumentError = class ArgumentError extends core.Error {
+  new(message) {
+    if (message === void 0) message = null;
+    this.message = message;
+    this.invalidValue = null;
+    this[_hasValue] = false;
+    this.name = null;
+    super.new();
+  }
+  value(value, name, message) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    this.name = name;
+    this.message = message;
+    this.invalidValue = value;
+    this[_hasValue] = true;
+    super.new();
+  }
+  notNull(name) {
+    if (name === void 0) name = null;
+    this.name = name;
+    this[_hasValue] = false;
+    this.message = "Must not be null";
+    this.invalidValue = null;
+    super.new();
+  }
+  get [_errorName]() {
+    return dart.str`Invalid argument${!dart.test(this[_hasValue]) ? "(s)" : ""}`;
+  }
+  get [_errorExplanation]() {
+    return "";
+  }
+  toString() {
+    let nameString = "";
+    if (this.name != null) {
+      nameString = dart.str` (${this.name})`;
+    }
+    let message = this.message == null ? "" : dart.str`: ${this.message}`;
+    let prefix = dart.str`${this[_errorName]}${nameString}${message}`;
+    if (!dart.test(this[_hasValue])) return prefix;
+    let explanation = this[_errorExplanation];
+    let errorValue = core.Error.safeToString(this.invalidValue);
+    return dart.str`${prefix}${explanation}: ${errorValue}`;
+  }
+};
+dart.defineNamedConstructor(core.ArgumentError, 'value');
+dart.defineNamedConstructor(core.ArgumentError, 'notNull');
+dart.setSignature(core.ArgumentError, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.ArgumentError, [], [dart.dynamic]),
+    value: dart.definiteFunctionType(core.ArgumentError, [dart.dynamic], [core.String, core.String]),
+    notNull: dart.definiteFunctionType(core.ArgumentError, [], [core.String])
+  }),
+  fields: () => ({
+    [_hasValue]: core.bool,
+    invalidValue: dart.dynamic,
+    name: core.String,
+    message: dart.dynamic
+  }),
+  getters: () => ({
+    [_errorName]: dart.definiteFunctionType(core.String, []),
+    [_errorExplanation]: dart.definiteFunctionType(core.String, [])
+  })
+});
+core.RangeError = class RangeError extends core.ArgumentError {
+  new(message) {
+    this.start = null;
+    this.end = null;
+    super.new(message);
+  }
+  value(value, name, message) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    this.start = null;
+    this.end = null;
+    super.value(value, name, message != null ? message : "Value not in range");
+  }
+  range(invalidValue, minValue, maxValue, name, message) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    this.start = minValue;
+    this.end = maxValue;
+    super.value(invalidValue, name, message != null ? message : "Invalid value");
+  }
+  static index(index, indexable, name, message, length) {
+    return new core.IndexError(index, indexable, name, message, length);
+  }
+  static checkValueInInterval(value, minValue, maxValue, name, message) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
+      dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
+    }
+  }
+  static checkValidIndex(index, indexable, name, length, message) {
+    if (name === void 0) name = null;
+    if (length === void 0) length = null;
+    if (message === void 0) message = null;
+    if (length == null) length = core.int._check(dart.dload(indexable, 'length'));
+    if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
+      if (name == null) name = "index";
+      dart.throw(core.RangeError.index(index, indexable, name, message, length));
+    }
+  }
+  static checkValidRange(start, end, length, startName, endName, message) {
+    if (startName === void 0) startName = null;
+    if (endName === void 0) endName = null;
+    if (message === void 0) message = null;
+    if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
+      if (startName == null) startName = "start";
+      dart.throw(new core.RangeError.range(start, 0, length, startName, message));
+    }
+    if (end != null) {
+      if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
+        if (endName == null) endName = "end";
+        dart.throw(new core.RangeError.range(end, start, length, endName, message));
       }
+      return end;
     }
-    toIso8601String() {
-      let y = dart.notNull(this.year) >= -9999 && dart.notNull(this.year) <= 9999 ? core.DateTime._fourDigits(this.year) : core.DateTime._sixDigits(this.year);
-      let m = core.DateTime._twoDigits(this.month);
-      let d = core.DateTime._twoDigits(this.day);
-      let h = core.DateTime._twoDigits(this.hour);
-      let min = core.DateTime._twoDigits(this.minute);
-      let sec = core.DateTime._twoDigits(this.second);
-      let ms = core.DateTime._threeDigits(this.millisecond);
-      let us = this.microsecond == 0 ? "" : core.DateTime._threeDigits(this.microsecond);
-      if (dart.test(this.isUtc)) {
-        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}Z`;
-      } else {
-        return dart.str`${y}-${m}-${d}T${h}:${min}:${sec}.${ms}${us}`;
+    return length;
+  }
+  static checkNotNegative(value, name, message) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
+  }
+  get [_errorName]() {
+    return "RangeError";
+  }
+  get [_errorExplanation]() {
+    dart.assert(this[_hasValue]);
+    let explanation = "";
+    if (this.start == null) {
+      if (this.end != null) {
+        explanation = dart.str`: Not less than or equal to ${this.end}`;
       }
-    }
-    add(duration) {
-      return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
-    }
-    subtract(duration) {
-      return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
-    }
-    difference(other) {
-      return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
-    }
-    _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
-      this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
-      this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
-    }
-    _now() {
-      this.isUtc = false;
-      this[_value$] = _js_helper.Primitives.dateNow();
-    }
-    static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
-      return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
-    }
-    get millisecondsSinceEpoch() {
-      return this[_value$];
-    }
-    get microsecondsSinceEpoch() {
-      return dart.notNull(this[_value$]) * 1000;
-    }
-    get timeZoneName() {
-      if (dart.test(this.isUtc)) return "UTC";
-      return _js_helper.Primitives.getTimeZoneName(this);
-    }
-    get timeZoneOffset() {
-      if (dart.test(this.isUtc)) return new core.Duration();
-      return new core.Duration({minutes: _js_helper.Primitives.getTimeZoneOffsetInMinutes(this)});
-    }
-    get year() {
-      return core.int._check(_js_helper.Primitives.getYear(this));
-    }
-    get month() {
-      return core.int._check(_js_helper.Primitives.getMonth(this));
-    }
-    get day() {
-      return core.int._check(_js_helper.Primitives.getDay(this));
-    }
-    get hour() {
-      return core.int._check(_js_helper.Primitives.getHours(this));
-    }
-    get minute() {
-      return core.int._check(_js_helper.Primitives.getMinutes(this));
-    }
-    get second() {
-      return core.int._check(_js_helper.Primitives.getSeconds(this));
-    }
-    get millisecond() {
-      return core.int._check(_js_helper.Primitives.getMilliseconds(this));
-    }
-    get microsecond() {
-      return 0;
-    }
-    get weekday() {
-      return core.int._check(_js_helper.Primitives.getWeekday(this));
-    }
-    static _microsecondInRoundedMilliseconds(microsecond) {
-      return (dart.notNull(microsecond) / 1000)[dartx.round]();
-    }
-  };
-  dart.defineNamedConstructor(core.DateTime, 'utc');
-  dart.defineNamedConstructor(core.DateTime, 'now');
-  dart.defineNamedConstructor(core.DateTime, 'fromMillisecondsSinceEpoch');
-  dart.defineNamedConstructor(core.DateTime, 'fromMicrosecondsSinceEpoch');
-  dart.defineNamedConstructor(core.DateTime, '_withValue');
-  dart.defineNamedConstructor(core.DateTime, '_internal');
-  dart.defineNamedConstructor(core.DateTime, '_now');
-  core.DateTime[dart.implements] = () => [ComparableOfDateTime()];
-  dart.setSignature(core.DateTime, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
-      utc: dart.definiteFunctionType(core.DateTime, [core.int], [core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
-      now: dart.definiteFunctionType(core.DateTime, []),
-      fromMillisecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
-      fromMicrosecondsSinceEpoch: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
-      _withValue: dart.definiteFunctionType(core.DateTime, [core.int], {isUtc: core.bool}),
-      _internal: dart.definiteFunctionType(core.DateTime, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
-      _now: dart.definiteFunctionType(core.DateTime, [])
-    }),
-    fields: () => ({
-      [_value$]: core.int,
-      isUtc: core.bool
-    }),
-    getters: () => ({
-      millisecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
-      microsecondsSinceEpoch: dart.definiteFunctionType(core.int, []),
-      timeZoneName: dart.definiteFunctionType(core.String, []),
-      timeZoneOffset: dart.definiteFunctionType(core.Duration, []),
-      year: dart.definiteFunctionType(core.int, []),
-      month: dart.definiteFunctionType(core.int, []),
-      day: dart.definiteFunctionType(core.int, []),
-      hour: dart.definiteFunctionType(core.int, []),
-      minute: dart.definiteFunctionType(core.int, []),
-      second: dart.definiteFunctionType(core.int, []),
-      millisecond: dart.definiteFunctionType(core.int, []),
-      microsecond: dart.definiteFunctionType(core.int, []),
-      weekday: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      isBefore: dart.definiteFunctionType(core.bool, [core.DateTime]),
-      isAfter: dart.definiteFunctionType(core.bool, [core.DateTime]),
-      isAtSameMomentAs: dart.definiteFunctionType(core.bool, [core.DateTime]),
-      compareTo: dart.definiteFunctionType(core.int, [core.DateTime]),
-      toLocal: dart.definiteFunctionType(core.DateTime, []),
-      toUtc: dart.definiteFunctionType(core.DateTime, []),
-      toIso8601String: dart.definiteFunctionType(core.String, []),
-      add: dart.definiteFunctionType(core.DateTime, [core.Duration]),
-      subtract: dart.definiteFunctionType(core.DateTime, [core.Duration]),
-      difference: dart.definiteFunctionType(core.Duration, [core.DateTime])
-    }),
-    sfields: () => ({
-      MONDAY: core.int,
-      TUESDAY: core.int,
-      WEDNESDAY: core.int,
-      THURSDAY: core.int,
-      FRIDAY: core.int,
-      SATURDAY: core.int,
-      SUNDAY: core.int,
-      DAYS_PER_WEEK: core.int,
-      JANUARY: core.int,
-      FEBRUARY: core.int,
-      MARCH: core.int,
-      APRIL: core.int,
-      MAY: core.int,
-      JUNE: core.int,
-      JULY: core.int,
-      AUGUST: core.int,
-      SEPTEMBER: core.int,
-      OCTOBER: core.int,
-      NOVEMBER: core.int,
-      DECEMBER: core.int,
-      MONTHS_PER_YEAR: core.int,
-      _MAX_MILLISECONDS_SINCE_EPOCH: core.int
-    }),
-    statics: () => ({
-      parse: dart.definiteFunctionType(core.DateTime, [core.String]),
-      _fourDigits: dart.definiteFunctionType(core.String, [core.int]),
-      _sixDigits: dart.definiteFunctionType(core.String, [core.int]),
-      _threeDigits: dart.definiteFunctionType(core.String, [core.int]),
-      _twoDigits: dart.definiteFunctionType(core.String, [core.int]),
-      _brokenDownDateToValue: dart.definiteFunctionType(core.int, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.bool]),
-      _microsecondInRoundedMilliseconds: dart.definiteFunctionType(core.int, [core.int])
-    }),
-    names: ['parse', '_fourDigits', '_sixDigits', '_threeDigits', '_twoDigits', '_brokenDownDateToValue', '_microsecondInRoundedMilliseconds']
-  });
-  dart.defineExtensionMembers(core.DateTime, ['compareTo']);
-  core.DateTime.MONDAY = 1;
-  core.DateTime.TUESDAY = 2;
-  core.DateTime.WEDNESDAY = 3;
-  core.DateTime.THURSDAY = 4;
-  core.DateTime.FRIDAY = 5;
-  core.DateTime.SATURDAY = 6;
-  core.DateTime.SUNDAY = 7;
-  core.DateTime.DAYS_PER_WEEK = 7;
-  core.DateTime.JANUARY = 1;
-  core.DateTime.FEBRUARY = 2;
-  core.DateTime.MARCH = 3;
-  core.DateTime.APRIL = 4;
-  core.DateTime.MAY = 5;
-  core.DateTime.JUNE = 6;
-  core.DateTime.JULY = 7;
-  core.DateTime.AUGUST = 8;
-  core.DateTime.SEPTEMBER = 9;
-  core.DateTime.OCTOBER = 10;
-  core.DateTime.NOVEMBER = 11;
-  core.DateTime.DECEMBER = 12;
-  core.DateTime.MONTHS_PER_YEAR = 12;
-  core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
-  const _duration = Symbol('_duration');
-  core.Duration = class Duration extends core.Object {
-    new(opts) {
-      let days = opts && 'days' in opts ? opts.days : 0;
-      let hours = opts && 'hours' in opts ? opts.hours : 0;
-      let minutes = opts && 'minutes' in opts ? opts.minutes : 0;
-      let seconds = opts && 'seconds' in opts ? opts.seconds : 0;
-      let milliseconds = opts && 'milliseconds' in opts ? opts.milliseconds : 0;
-      let microseconds = opts && 'microseconds' in opts ? opts.microseconds : 0;
-      Duration.prototype._microseconds.call(this, core.Duration.MICROSECONDS_PER_DAY * dart.notNull(days) + core.Duration.MICROSECONDS_PER_HOUR * dart.notNull(hours) + core.Duration.MICROSECONDS_PER_MINUTE * dart.notNull(minutes) + core.Duration.MICROSECONDS_PER_SECOND * dart.notNull(seconds) + core.Duration.MICROSECONDS_PER_MILLISECOND * dart.notNull(milliseconds) + dart.notNull(microseconds));
-    }
-    _microseconds(duration) {
-      this[_duration] = duration;
-    }
-    ['+'](other) {
-      return new core.Duration._microseconds(dart.notNull(this[_duration]) + dart.notNull(other[_duration]));
-    }
-    ['-'](other) {
-      return new core.Duration._microseconds(dart.notNull(this[_duration]) - dart.notNull(other[_duration]));
-    }
-    ['*'](factor) {
-      return new core.Duration._microseconds((dart.notNull(this[_duration]) * dart.notNull(factor))[dartx.round]());
-    }
-    ['~/'](quotient) {
-      if (quotient == 0) dart.throw(new core.IntegerDivisionByZeroException());
-      return new core.Duration._microseconds((dart.notNull(this[_duration]) / dart.notNull(quotient))[dartx.truncate]());
-    }
-    ['<'](other) {
-      return dart.notNull(this[_duration]) < dart.notNull(other[_duration]);
-    }
-    ['>'](other) {
-      return dart.notNull(this[_duration]) > dart.notNull(other[_duration]);
-    }
-    ['<='](other) {
-      return dart.notNull(this[_duration]) <= dart.notNull(other[_duration]);
-    }
-    ['>='](other) {
-      return dart.notNull(this[_duration]) >= dart.notNull(other[_duration]);
-    }
-    get inDays() {
-      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_DAY)[dartx.truncate]();
-    }
-    get inHours() {
-      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_HOUR)[dartx.truncate]();
-    }
-    get inMinutes() {
-      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MINUTE)[dartx.truncate]();
-    }
-    get inSeconds() {
-      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_SECOND)[dartx.truncate]();
-    }
-    get inMilliseconds() {
-      return (dart.notNull(this[_duration]) / core.Duration.MICROSECONDS_PER_MILLISECOND)[dartx.truncate]();
-    }
-    get inMicroseconds() {
-      return this[_duration];
-    }
-    ['=='](other) {
-      if (!core.Duration.is(other)) return false;
-      return dart.equals(this[_duration], dart.dload(other, _duration));
-    }
-    get hashCode() {
-      return dart.hashCode(this[_duration]);
-    }
-    compareTo(other) {
-      return this[_duration][dartx.compareTo](other[_duration]);
-    }
-    toString() {
-      function sixDigits(n) {
-        if (dart.notNull(n) >= 100000) return dart.str`${n}`;
-        if (dart.notNull(n) >= 10000) return dart.str`0${n}`;
-        if (dart.notNull(n) >= 1000) return dart.str`00${n}`;
-        if (dart.notNull(n) >= 100) return dart.str`000${n}`;
-        if (dart.notNull(n) >= 10) return dart.str`0000${n}`;
-        return dart.str`00000${n}`;
-      }
-      dart.fn(sixDigits, intToString());
-      function twoDigits(n) {
-        if (dart.notNull(n) >= 10) return dart.str`${n}`;
-        return dart.str`0${n}`;
-      }
-      dart.fn(twoDigits, intToString());
-      if (dart.notNull(this.inMicroseconds) < 0) {
-        return dart.str`-${this._negate()}`;
-      }
-      let twoDigitMinutes = twoDigits(dart.asInt(this.inMinutes[dartx.remainder](core.Duration.MINUTES_PER_HOUR)));
-      let twoDigitSeconds = twoDigits(dart.asInt(this.inSeconds[dartx.remainder](core.Duration.SECONDS_PER_MINUTE)));
-      let sixDigitUs = sixDigits(dart.asInt(this.inMicroseconds[dartx.remainder](core.Duration.MICROSECONDS_PER_SECOND)));
-      return dart.str`${this.inHours}:${twoDigitMinutes}:${twoDigitSeconds}.${sixDigitUs}`;
-    }
-    get isNegative() {
-      return dart.notNull(this[_duration]) < 0;
-    }
-    abs() {
-      return new core.Duration._microseconds(this[_duration][dartx.abs]());
-    }
-    _negate() {
-      return new core.Duration._microseconds(-dart.notNull(this[_duration]));
-    }
-  };
-  dart.defineNamedConstructor(core.Duration, '_microseconds');
-  core.Duration[dart.implements] = () => [ComparableOfDuration()];
-  dart.setSignature(core.Duration, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.Duration, [], {days: core.int, hours: core.int, minutes: core.int, seconds: core.int, milliseconds: core.int, microseconds: core.int}),
-      _microseconds: dart.definiteFunctionType(core.Duration, [core.int])
-    }),
-    fields: () => ({[_duration]: core.int}),
-    getters: () => ({
-      inDays: dart.definiteFunctionType(core.int, []),
-      inHours: dart.definiteFunctionType(core.int, []),
-      inMinutes: dart.definiteFunctionType(core.int, []),
-      inSeconds: dart.definiteFunctionType(core.int, []),
-      inMilliseconds: dart.definiteFunctionType(core.int, []),
-      inMicroseconds: dart.definiteFunctionType(core.int, []),
-      isNegative: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      '+': dart.definiteFunctionType(core.Duration, [core.Duration]),
-      '-': dart.definiteFunctionType(core.Duration, [core.Duration]),
-      '*': dart.definiteFunctionType(core.Duration, [core.num]),
-      '~/': dart.definiteFunctionType(core.Duration, [core.int]),
-      '<': dart.definiteFunctionType(core.bool, [core.Duration]),
-      '>': dart.definiteFunctionType(core.bool, [core.Duration]),
-      '<=': dart.definiteFunctionType(core.bool, [core.Duration]),
-      '>=': dart.definiteFunctionType(core.bool, [core.Duration]),
-      compareTo: dart.definiteFunctionType(core.int, [core.Duration]),
-      abs: dart.definiteFunctionType(core.Duration, []),
-      _negate: dart.definiteFunctionType(core.Duration, [])
-    }),
-    sfields: () => ({
-      MICROSECONDS_PER_MILLISECOND: core.int,
-      MILLISECONDS_PER_SECOND: core.int,
-      SECONDS_PER_MINUTE: core.int,
-      MINUTES_PER_HOUR: core.int,
-      HOURS_PER_DAY: core.int,
-      MICROSECONDS_PER_SECOND: core.int,
-      MICROSECONDS_PER_MINUTE: core.int,
-      MICROSECONDS_PER_HOUR: core.int,
-      MICROSECONDS_PER_DAY: core.int,
-      MILLISECONDS_PER_MINUTE: core.int,
-      MILLISECONDS_PER_HOUR: core.int,
-      MILLISECONDS_PER_DAY: core.int,
-      SECONDS_PER_HOUR: core.int,
-      SECONDS_PER_DAY: core.int,
-      MINUTES_PER_DAY: core.int,
-      ZERO: core.Duration
-    })
-  });
-  dart.defineExtensionMembers(core.Duration, ['compareTo']);
-  core.Duration.MICROSECONDS_PER_MILLISECOND = 1000;
-  core.Duration.MILLISECONDS_PER_SECOND = 1000;
-  core.Duration.SECONDS_PER_MINUTE = 60;
-  core.Duration.MINUTES_PER_HOUR = 60;
-  core.Duration.HOURS_PER_DAY = 24;
-  dart.defineLazy(core.Duration, {
-    get MICROSECONDS_PER_SECOND() {
-      return core.Duration.MICROSECONDS_PER_MILLISECOND * core.Duration.MILLISECONDS_PER_SECOND;
-    },
-    get MICROSECONDS_PER_MINUTE() {
-      return core.Duration.MICROSECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
-    },
-    get MICROSECONDS_PER_HOUR() {
-      return core.Duration.MICROSECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
-    },
-    get MICROSECONDS_PER_DAY() {
-      return core.Duration.MICROSECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
-    },
-    get MILLISECONDS_PER_MINUTE() {
-      return core.Duration.MILLISECONDS_PER_SECOND * core.Duration.SECONDS_PER_MINUTE;
-    },
-    get MILLISECONDS_PER_HOUR() {
-      return core.Duration.MILLISECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
-    },
-    get MILLISECONDS_PER_DAY() {
-      return core.Duration.MILLISECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
-    },
-    get SECONDS_PER_HOUR() {
-      return core.Duration.SECONDS_PER_MINUTE * core.Duration.MINUTES_PER_HOUR;
-    },
-    get SECONDS_PER_DAY() {
-      return core.Duration.SECONDS_PER_HOUR * core.Duration.HOURS_PER_DAY;
-    },
-    get MINUTES_PER_DAY() {
-      return core.Duration.MINUTES_PER_HOUR * core.Duration.HOURS_PER_DAY;
-    },
-    get ZERO() {
-      return dart.const(new core.Duration({seconds: 0}));
-    }
-  });
-  core.TypeError = class TypeError extends core.AssertionError {
-    new() {
-      super.new();
-    }
-  };
-  core.CastError = class CastError extends core.Error {
-    new() {
-      super.new();
-    }
-  };
-  core.NullThrownError = class NullThrownError extends core.Error {
-    new() {
-      super.new();
-    }
-    toString() {
-      return "Throw of null.";
-    }
-  };
-  const _hasValue = Symbol('_hasValue');
-  const _errorName = Symbol('_errorName');
-  const _errorExplanation = Symbol('_errorExplanation');
-  core.ArgumentError = class ArgumentError extends core.Error {
-    new(message) {
-      if (message === void 0) message = null;
-      this.message = message;
-      this.invalidValue = null;
-      this[_hasValue] = false;
-      this.name = null;
-      super.new();
-    }
-    value(value, name, message) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      this.name = name;
-      this.message = message;
-      this.invalidValue = value;
-      this[_hasValue] = true;
-      super.new();
-    }
-    notNull(name) {
-      if (name === void 0) name = null;
-      this.name = name;
-      this[_hasValue] = false;
-      this.message = "Must not be null";
-      this.invalidValue = null;
-      super.new();
-    }
-    get [_errorName]() {
-      return dart.str`Invalid argument${!dart.test(this[_hasValue]) ? "(s)" : ""}`;
-    }
-    get [_errorExplanation]() {
-      return "";
-    }
-    toString() {
-      let nameString = "";
-      if (this.name != null) {
-        nameString = dart.str` (${this.name})`;
-      }
-      let message = this.message == null ? "" : dart.str`: ${this.message}`;
-      let prefix = dart.str`${this[_errorName]}${nameString}${message}`;
-      if (!dart.test(this[_hasValue])) return prefix;
-      let explanation = this[_errorExplanation];
-      let errorValue = core.Error.safeToString(this.invalidValue);
-      return dart.str`${prefix}${explanation}: ${errorValue}`;
-    }
-  };
-  dart.defineNamedConstructor(core.ArgumentError, 'value');
-  dart.defineNamedConstructor(core.ArgumentError, 'notNull');
-  dart.setSignature(core.ArgumentError, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.ArgumentError, [], [dart.dynamic]),
-      value: dart.definiteFunctionType(core.ArgumentError, [dart.dynamic], [core.String, core.String]),
-      notNull: dart.definiteFunctionType(core.ArgumentError, [], [core.String])
-    }),
-    fields: () => ({
-      [_hasValue]: core.bool,
-      invalidValue: dart.dynamic,
-      name: core.String,
-      message: dart.dynamic
-    }),
-    getters: () => ({
-      [_errorName]: dart.definiteFunctionType(core.String, []),
-      [_errorExplanation]: dart.definiteFunctionType(core.String, [])
-    })
-  });
-  core.RangeError = class RangeError extends core.ArgumentError {
-    new(message) {
-      this.start = null;
-      this.end = null;
-      super.new(message);
-    }
-    value(value, name, message) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      this.start = null;
-      this.end = null;
-      super.value(value, name, message != null ? message : "Value not in range");
-    }
-    range(invalidValue, minValue, maxValue, name, message) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      this.start = minValue;
-      this.end = maxValue;
-      super.value(invalidValue, name, message != null ? message : "Invalid value");
-    }
-    static index(index, indexable, name, message, length) {
-      return new core.IndexError(index, indexable, name, message, length);
-    }
-    static checkValueInInterval(value, minValue, maxValue, name, message) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      if (dart.notNull(value) < dart.notNull(minValue) || dart.notNull(value) > dart.notNull(maxValue)) {
-        dart.throw(new core.RangeError.range(value, minValue, maxValue, name, message));
-      }
-    }
-    static checkValidIndex(index, indexable, name, length, message) {
-      if (name === void 0) name = null;
-      if (length === void 0) length = null;
-      if (message === void 0) message = null;
-      if (length == null) length = core.int._check(dart.dload(indexable, 'length'));
-      if (0 > dart.notNull(index) || dart.notNull(index) >= dart.notNull(length)) {
-        if (name == null) name = "index";
-        dart.throw(core.RangeError.index(index, indexable, name, message, length));
-      }
-    }
-    static checkValidRange(start, end, length, startName, endName, message) {
-      if (startName === void 0) startName = null;
-      if (endName === void 0) endName = null;
-      if (message === void 0) message = null;
-      if (0 > dart.notNull(start) || dart.notNull(start) > dart.notNull(length)) {
-        if (startName == null) startName = "start";
-        dart.throw(new core.RangeError.range(start, 0, length, startName, message));
-      }
-      if (end != null) {
-        if (dart.notNull(start) > dart.notNull(end) || dart.notNull(end) > dart.notNull(length)) {
-          if (endName == null) endName = "end";
-          dart.throw(new core.RangeError.range(end, start, length, endName, message));
-        }
-        return end;
-      }
-      return length;
-    }
-    static checkNotNegative(value, name, message) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      if (dart.notNull(value) < 0) dart.throw(new core.RangeError.range(value, 0, null, name, message));
-    }
-    get [_errorName]() {
-      return "RangeError";
-    }
-    get [_errorExplanation]() {
-      dart.assert(this[_hasValue]);
-      let explanation = "";
-      if (this.start == null) {
-        if (this.end != null) {
-          explanation = dart.str`: Not less than or equal to ${this.end}`;
-        }
-      } else if (this.end == null) {
-        explanation = dart.str`: Not greater than or equal to ${this.start}`;
-      } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
-        explanation = dart.str`: Not in range ${this.start}..${this.end}, inclusive`;
-      } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
-        explanation = ": Valid value range is empty";
-      } else {
-        explanation = dart.str`: Only valid value is ${this.start}`;
-      }
-      return explanation;
-    }
-  };
-  dart.defineNamedConstructor(core.RangeError, 'value');
-  dart.defineNamedConstructor(core.RangeError, 'range');
-  dart.setSignature(core.RangeError, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.RangeError, [dart.dynamic]),
-      value: dart.definiteFunctionType(core.RangeError, [core.num], [core.String, core.String]),
-      range: dart.definiteFunctionType(core.RangeError, [core.num, core.int, core.int], [core.String, core.String]),
-      index: dart.definiteFunctionType(core.RangeError, [core.int, dart.dynamic], [core.String, core.String, core.int])
-    }),
-    fields: () => ({
-      start: core.num,
-      end: core.num
-    }),
-    statics: () => ({
-      checkValueInInterval: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.String, core.String]),
-      checkValidIndex: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic], [core.String, core.int, core.String]),
-      checkValidRange: dart.definiteFunctionType(core.int, [core.int, core.int, core.int], [core.String, core.String, core.String]),
-      checkNotNegative: dart.definiteFunctionType(dart.void, [core.int], [core.String, core.String])
-    }),
-    names: ['checkValueInInterval', 'checkValidIndex', 'checkValidRange', 'checkNotNegative']
-  });
-  core.IndexError = class IndexError extends core.ArgumentError {
-    new(invalidValue, indexable, name, message, length) {
-      if (name === void 0) name = null;
-      if (message === void 0) message = null;
-      if (length === void 0) length = null;
-      this.indexable = indexable;
-      this.length = core.int._check(length != null ? length : dart.dload(indexable, 'length'));
-      super.value(invalidValue, name, message != null ? message : "Index out of range");
-    }
-    get start() {
-      return 0;
-    }
-    get end() {
-      return dart.notNull(this.length) - 1;
-    }
-    get [_errorName]() {
-      return "RangeError";
-    }
-    get [_errorExplanation]() {
-      dart.assert(this[_hasValue]);
-      if (dart.test(dart.dsend(this.invalidValue, '<', 0))) {
-        return ": index must not be negative";
-      }
-      if (this.length == 0) {
-        return ": no indices are valid";
-      }
-      return dart.str`: index should be less than ${this.length}`;
-    }
-  };
-  core.IndexError[dart.implements] = () => [core.RangeError];
-  dart.setSignature(core.IndexError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.IndexError, [core.int, dart.dynamic], [core.String, core.String, core.int])}),
-    fields: () => ({
-      indexable: dart.dynamic,
-      length: core.int
-    }),
-    getters: () => ({
-      start: dart.definiteFunctionType(core.int, []),
-      end: dart.definiteFunctionType(core.int, [])
-    })
-  });
-  const _className = Symbol('_className');
-  core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
-    new(className) {
-      this[_className] = className;
-      super.new();
-    }
-    toString() {
-      return dart.str`Cannot instantiate abstract class: '${this[_className]}'`;
-    }
-  };
-  dart.setSignature(core.AbstractClassInstantiationError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
-    fields: () => ({[_className]: core.String})
-  });
-  const _receiver$ = Symbol('_receiver');
-  const _memberName = Symbol('_memberName');
-  const _arguments = Symbol('_arguments');
-  const _namedArguments = Symbol('_namedArguments');
-  const _existingArgumentNames = Symbol('_existingArgumentNames');
-  core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
-    new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
-      if (existingArgumentNames === void 0) existingArgumentNames = null;
-      this[_receiver$] = receiver;
-      this[_memberName] = memberName;
-      this[_arguments] = positionalArguments;
-      this[_namedArguments] = namedArguments;
-      this[_existingArgumentNames] = existingArgumentNames;
-      super.new();
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      let i = 0;
-      if (this[_arguments] != null) {
-        for (; i < dart.notNull(this[_arguments][dartx.length]); i++) {
-          if (i > 0) {
-            sb.write(", ");
-          }
-          sb.write(core.Error.safeToString(this[_arguments][dartx._get](i)));
-        }
-      }
-      if (this[_namedArguments] != null) {
-        this[_namedArguments][dartx.forEach](dart.fn((key, value) => {
-          if (i > 0) {
-            sb.write(", ");
-          }
-          sb.write(core._symbolToString(key));
-          sb.write(": ");
-          sb.write(core.Error.safeToString(value));
-          i++;
-        }, SymbolAnddynamicToNull()));
-      }
-      if (this[_existingArgumentNames] == null) {
-        return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
-      } else {
-        let actualParameters = sb.toString();
-        sb = new core.StringBuffer();
-        for (let i = 0; i < dart.notNull(this[_existingArgumentNames][dartx.length]); i++) {
-          if (i > 0) {
-            sb.write(", ");
-          }
-          sb.write(this[_existingArgumentNames][dartx._get](i));
-        }
-        let formalParameters = sb.toString();
-        return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
-      }
-    }
-  };
-  dart.setSignature(core.NoSuchMethodError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
-    fields: () => ({
-      [_receiver$]: core.Object,
-      [_memberName]: core.Symbol,
-      [_arguments]: core.List,
-      [_namedArguments]: MapOfSymbol$dynamic(),
-      [_existingArgumentNames]: core.List
-    })
-  });
-  core.UnsupportedError = class UnsupportedError extends core.Error {
-    new(message) {
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return dart.str`Unsupported operation: ${this.message}`;
-    }
-  };
-  dart.setSignature(core.UnsupportedError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.UnsupportedError, [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  core.UnimplementedError = class UnimplementedError extends core.Error {
-    new(message) {
-      if (message === void 0) message = null;
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return this.message != null ? dart.str`UnimplementedError: ${this.message}` : "UnimplementedError";
-    }
-  };
-  core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
-  dart.setSignature(core.UnimplementedError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.UnimplementedError, [], [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  core.StateError = class StateError extends core.Error {
-    new(message) {
-      this.message = message;
-      super.new();
-    }
-    toString() {
-      return dart.str`Bad state: ${this.message}`;
-    }
-  };
-  dart.setSignature(core.StateError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.StateError, [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
-    new(modifiedObject) {
-      if (modifiedObject === void 0) modifiedObject = null;
-      this.modifiedObject = modifiedObject;
-      super.new();
-    }
-    toString() {
-      if (this.modifiedObject == null) {
-        return "Concurrent modification during iteration.";
-      }
-      return "Concurrent modification during iteration: " + dart.str`${core.Error.safeToString(this.modifiedObject)}.`;
-    }
-  };
-  dart.setSignature(core.ConcurrentModificationError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.ConcurrentModificationError, [], [core.Object])}),
-    fields: () => ({modifiedObject: core.Object})
-  });
-  core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
-    new() {
-    }
-    toString() {
-      return "Out of Memory";
-    }
-    get stackTrace() {
-      return null;
-    }
-  };
-  core.OutOfMemoryError[dart.implements] = () => [core.Error];
-  dart.setSignature(core.OutOfMemoryError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.OutOfMemoryError, [])}),
-    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
-  });
-  core.StackOverflowError = class StackOverflowError extends core.Object {
-    new() {
-    }
-    toString() {
-      return "Stack Overflow";
-    }
-    get stackTrace() {
-      return null;
-    }
-  };
-  core.StackOverflowError[dart.implements] = () => [core.Error];
-  dart.setSignature(core.StackOverflowError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.StackOverflowError, [])}),
-    getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
-  });
-  core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
-    new(variableName) {
-      if (variableName === void 0) variableName = null;
-      this.variableName = variableName;
-      super.new();
-    }
-    toString() {
-      return this.variableName == null ? "Reading static variable during its initialization" : dart.str`Reading static variable '${this.variableName}' during its initialization`;
-    }
-  };
-  dart.setSignature(core.CyclicInitializationError, {
-    constructors: () => ({new: dart.definiteFunctionType(core.CyclicInitializationError, [], [core.String])}),
-    fields: () => ({variableName: core.String})
-  });
-  core.Exception = class Exception extends core.Object {
-    static new(message) {
-      if (message === void 0) message = null;
-      return new core._Exception(message);
-    }
-  };
-  dart.setSignature(core.Exception, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Exception, [], [dart.dynamic])})
-  });
-  core._Exception = class _Exception extends core.Object {
-    new(message) {
-      if (message === void 0) message = null;
-      this.message = message;
-    }
-    toString() {
-      if (this.message == null) return "Exception";
-      return dart.str`Exception: ${this.message}`;
-    }
-  };
-  core._Exception[dart.implements] = () => [core.Exception];
-  dart.setSignature(core._Exception, {
-    constructors: () => ({new: dart.definiteFunctionType(core._Exception, [], [dart.dynamic])}),
-    fields: () => ({message: dart.dynamic})
-  });
-  core.FormatException = class FormatException extends core.Object {
-    new(message, source, offset) {
-      if (message === void 0) message = "";
-      if (source === void 0) source = null;
-      if (offset === void 0) offset = null;
-      this.message = message;
-      this.source = source;
-      this.offset = offset;
-    }
-    toString() {
-      let report = "FormatException";
-      if (this.message != null && "" != this.message) {
-        report = dart.str`${report}: ${this.message}`;
-      }
-      let offset = this.offset;
-      if (!(typeof this.source == 'string')) {
-        if (offset != null) {
-          report = report + dart.str` (at offset ${offset})`;
-        }
-        return report;
-      }
-      if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > dart.notNull(core.num._check(dart.dload(this.source, 'length'))))) {
-        offset = null;
-      }
-      if (offset == null) {
-        let source = core.String._check(this.source);
-        if (dart.notNull(source[dartx.length]) > 78) {
-          source = dart.notNull(source[dartx.substring](0, 75)) + "...";
-        }
-        return dart.str`${report}\n${source}`;
-      }
-      let lineNum = 1;
-      let lineStart = 0;
-      let lastWasCR = null;
-      for (let i = 0; i < dart.notNull(offset); i++) {
-        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
-        if (char == 10) {
-          if (lineStart != i || !dart.test(lastWasCR)) {
-            lineNum++;
-          }
-          lineStart = i + 1;
-          lastWasCR = false;
-        } else if (char == 13) {
-          lineNum++;
-          lineStart = i + 1;
-          lastWasCR = true;
-        }
-      }
-      if (lineNum > 1) {
-        report = report + dart.str` (at line ${lineNum}, character ${dart.notNull(offset) - lineStart + 1})\n`;
-      } else {
-        report = report + dart.str` (at character ${dart.notNull(offset) + 1})\n`;
-      }
-      let lineEnd = core.int._check(dart.dload(this.source, 'length'));
-      for (let i = offset; dart.notNull(i) < dart.notNull(core.num._check(dart.dload(this.source, 'length'))); i = dart.notNull(i) + 1) {
-        let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
-        if (char == 10 || char == 13) {
-          lineEnd = i;
-          break;
-        }
-      }
-      let length = dart.notNull(lineEnd) - lineStart;
-      let start = lineStart;
-      let end = lineEnd;
-      let prefix = "";
-      let postfix = "";
-      if (length > 78) {
-        let index = dart.notNull(offset) - lineStart;
-        if (index < 75) {
-          end = start + 75;
-          postfix = "...";
-        } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
-          start = dart.notNull(end) - 75;
-          prefix = "...";
-        } else {
-          start = dart.notNull(offset) - 36;
-          end = dart.notNull(offset) + 36;
-          prefix = postfix = "...";
-        }
-      }
-      let slice = core.String._check(dart.dsend(this.source, 'substring', start, end));
-      let markOffset = dart.notNull(offset) - start + dart.notNull(prefix[dartx.length]);
-      return dart.str`${report}${prefix}${slice}${postfix}\n${" "[dartx['*']](markOffset)}^\n`;
-    }
-  };
-  core.FormatException[dart.implements] = () => [core.Exception];
-  dart.setSignature(core.FormatException, {
-    constructors: () => ({new: dart.definiteFunctionType(core.FormatException, [], [core.String, dart.dynamic, core.int])}),
-    fields: () => ({
-      message: core.String,
-      source: dart.dynamic,
-      offset: core.int
-    })
-  });
-  core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
-    new() {
-    }
-    toString() {
-      return "IntegerDivisionByZeroException";
-    }
-  };
-  core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
-  dart.setSignature(core.IntegerDivisionByZeroException, {
-    constructors: () => ({new: dart.definiteFunctionType(core.IntegerDivisionByZeroException, [])})
-  });
-  const _getKey = Symbol('_getKey');
-  core.Expando$ = dart.generic(T => {
-    class Expando extends core.Object {
-      new(name) {
-        if (name === void 0) name = null;
-        this.name = name;
-      }
-      toString() {
-        return dart.str`Expando:${this.name}`;
-      }
-      _get(object) {
-        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
-        return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
-      }
-      _set(object, value) {
-        T._check(value);
-        let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
-        if (values == null) {
-          values = new core.Object();
-          _js_helper.Primitives.setProperty(object, core.Expando._EXPANDO_PROPERTY_NAME, values);
-        }
-        _js_helper.Primitives.setProperty(values, this[_getKey](), value);
-        return value;
-      }
-      [_getKey]() {
-        let key = core.String._check(_js_helper.Primitives.getProperty(this, core.Expando._KEY_PROPERTY_NAME));
-        if (key == null) {
-          key = dart.str`expando\$key\$${(() => {
-            let x = core.Expando._keyCount;
-            core.Expando._keyCount = dart.notNull(x) + 1;
-            return x;
-          })()}`;
-          _js_helper.Primitives.setProperty(this, core.Expando._KEY_PROPERTY_NAME, key);
-        }
-        return key;
-      }
-    }
-    dart.addTypeTests(Expando);
-    dart.setSignature(Expando, {
-      constructors: () => ({new: dart.definiteFunctionType(core.Expando$(T), [], [core.String])}),
-      fields: () => ({name: core.String}),
-      methods: () => ({
-        _get: dart.definiteFunctionType(T, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [core.Object, T]),
-        [_getKey]: dart.definiteFunctionType(core.String, [])
-      }),
-      sfields: () => ({
-        _KEY_PROPERTY_NAME: core.String,
-        _EXPANDO_PROPERTY_NAME: core.String,
-        _keyCount: core.int
-      })
-    });
-    return Expando;
-  });
-  core.Expando = Expando();
-  core.Expando._KEY_PROPERTY_NAME = 'expando$key';
-  core.Expando._EXPANDO_PROPERTY_NAME = 'expando$values';
-  core.Expando._keyCount = 0;
-  core.Function = class Function extends core.Object {
-    static apply(f, positionalArguments, namedArguments) {
-      if (namedArguments === void 0) namedArguments = null;
-      return dart.dcall.apply(null, [f].concat(positionalArguments));
-    }
-    static _toMangledNames(namedArguments) {
-      let result = dart.map({}, core.String, dart.dynamic);
-      namedArguments[dartx.forEach](dart.fn((symbol, value) => {
-        result[dartx._set](core._symbolToString(symbol), value);
-      }, SymbolAnddynamicToNull()));
-      return result;
-    }
-  };
-  core.Function.is = function is_Function(o) {
-    return typeof o == "function";
-  };
-  core.Function.as = function as_Function(o) {
-    if (typeof o == "function" || o == null) return o;
-    return dart.as(o, core.Function);
-  };
-  core.Function._check = function check_String(o) {
-    if (typeof o == "function" || o == null) return o;
-    return dart.check(o, core.Function);
-  };
-  dart.setSignature(core.Function, {
-    statics: () => ({
-      apply: dart.definiteFunctionType(dart.dynamic, [core.Function, core.List], [MapOfSymbol$dynamic()]),
-      _toMangledNames: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [MapOfSymbol$dynamic()])
-    }),
-    names: ['apply', '_toMangledNames']
-  });
-  core.identical = function(a, b) {
-    return a == null ? b == null : a === b;
-  };
-  dart.fn(core.identical, ObjectAndObjectTobool());
-  core.identityHashCode = function(object) {
-    return _js_helper.objectHashCode(object);
-  };
-  dart.fn(core.identityHashCode, ObjectToint());
-  core._Generator$ = dart.generic(E => {
-    const _Generator = dart.typedef('_Generator', () => dart.functionType(E, [core.int]));
-    return _Generator;
-  });
-  core._Generator = _Generator();
-  const _end$ = Symbol('_end');
-  const _start$0 = Symbol('_start');
-  const _generator$ = Symbol('_generator');
-  core._GeneratorIterable$ = dart.generic(E => {
-    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
-    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-    class _GeneratorIterable extends core.Iterable$(E) {
-      new(end, generator) {
-        this[_end$] = end;
-        this[_start$0] = 0;
-        this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
-        super.new();
-      }
-      slice(start, end, generator) {
-        this[_start$0] = start;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        super.new();
-      }
-      get iterator() {
-        return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
-      }
-      get length() {
-        return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
-      }
-      skip(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return this;
-        let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
-        return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
-      }
-      take(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return new (EmptyIterableOfE())();
-        let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newEnd >= dart.notNull(this[_end$])) return this;
-        return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
-      }
-      static _id(n) {
-        return n;
-      }
-    }
-    dart.defineNamedConstructor(_GeneratorIterable, 'slice');
-    _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(_GeneratorIterable, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, _GeneratorOfE()]),
-        slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
-      }),
-      fields: () => ({
-        [_start$0]: core.int,
-        [_end$]: core.int,
-        [_generator$]: _GeneratorOfE()
-      }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
-      names: ['_id']
-    });
-    dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
-    return _GeneratorIterable;
-  });
-  core._GeneratorIterable = _GeneratorIterable();
-  const _index$1 = Symbol('_index');
-  const _current$3 = Symbol('_current');
-  core._GeneratorIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    class _GeneratorIterator extends core.Object {
-      new(index, end, generator) {
-        this[_index$1] = index;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        this[_current$3] = null;
-      }
-      moveNext() {
-        if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
-          this[_current$3] = this[_generator$](this[_index$1]);
-          this[_index$1] = dart.notNull(this[_index$1]) + 1;
-          return true;
-        } else {
-          this[_current$3] = null;
-          return false;
-        }
-      }
-      get current() {
-        return this[_current$3];
-      }
-    }
-    dart.addTypeTests(_GeneratorIterator);
-    _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_GeneratorIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
-      fields: () => ({
-        [_end$]: core.int,
-        [_generator$]: _GeneratorOfE(),
-        [_index$1]: core.int,
-        [_current$3]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _GeneratorIterator;
-  });
-  core._GeneratorIterator = _GeneratorIterator();
-  core.BidirectionalIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class BidirectionalIterator extends core.Object {}
-    dart.addTypeTests(BidirectionalIterator);
-    BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
-    return BidirectionalIterator;
-  });
-  core.BidirectionalIterator = BidirectionalIterator();
-  core.Map$ = dart.generic((K, V) => {
-    let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
-    let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
-    let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
-    let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
-    let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
-    let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
-    let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
-    class Map extends core.Object {
-      static new() {
-        return JsLinkedHashMapOfK$V().es6();
-      }
-      static from(other) {
-        return LinkedHashMapOfK$V().from(other);
-      }
-      static unmodifiable(other) {
-        return new (UnmodifiableMapViewOfK$V())(MapOfK$V().from(other));
-      }
-      static identity() {
-        return LinkedHashMapOfK$V().identity();
-      }
-      static fromIterable(iterable, opts) {
-        return LinkedHashMapOfK$V().fromIterable(iterable, opts);
-      }
-      static fromIterables(keys, values) {
-        return LinkedHashMapOfK$V().fromIterables(keys, values);
-      }
-    }
-    dart.addTypeTests(Map);
-    dart.setSignature(Map, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(core.Map$(K, V), []),
-        from: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
-        unmodifiable: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
-        identity: dart.definiteFunctionType(core.Map$(K, V), []),
-        fromIterable: dart.definiteFunctionType(core.Map$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
-        fromIterables: dart.definiteFunctionType(core.Map$(K, V), [IterableOfK(), IterableOfV()])
-      })
-    });
-    return Map;
-  });
-  core.Map = Map$();
-  core.Null = class Null extends core.Object {
-    static _uninstantiable() {
-      dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
-    }
-    toString() {
-      return "null";
-    }
-  };
-  core.Null.is = function is_Null(o) {
-    return o == null;
-  };
-  core.Null.as = function as_Null(o) {
-    if (o == null) return o;
-    return dart.as(o, core.Null);
-  };
-  core.Null._check = function check_Null(o) {
-    if (o == null) return o;
-    return dart.check(o, core.Null);
-  };
-  dart.setSignature(core.Null, {
-    constructors: () => ({_uninstantiable: dart.definiteFunctionType(core.Null, [])})
-  });
-  core.Pattern = class Pattern extends core.Object {};
-  core.print = function(object) {
-    let line = dart.str`${object}`;
-    if (_internal.printToZone == null) {
-      _internal.printToConsole(line);
+    } else if (this.end == null) {
+      explanation = dart.str`: Not greater than or equal to ${this.start}`;
+    } else if (dart.notNull(this.end) > dart.notNull(this.start)) {
+      explanation = dart.str`: Not in range ${this.start}..${this.end}, inclusive`;
+    } else if (dart.notNull(this.end) < dart.notNull(this.start)) {
+      explanation = ": Valid value range is empty";
     } else {
-      dart.dcall(_internal.printToZone, line);
+      explanation = dart.str`: Only valid value is ${this.start}`;
     }
-  };
-  dart.fn(core.print, ObjectTovoid());
-  core.RegExp = class RegExp extends core.Object {
-    static new(source, opts) {
-      let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
-      let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
-      return new _js_helper.JSSyntaxRegExp(source, {multiLine: multiLine, caseSensitive: caseSensitive});
+    return explanation;
+  }
+};
+dart.defineNamedConstructor(core.RangeError, 'value');
+dart.defineNamedConstructor(core.RangeError, 'range');
+dart.setSignature(core.RangeError, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.RangeError, [dart.dynamic]),
+    value: dart.definiteFunctionType(core.RangeError, [core.num], [core.String, core.String]),
+    range: dart.definiteFunctionType(core.RangeError, [core.num, core.int, core.int], [core.String, core.String]),
+    index: dart.definiteFunctionType(core.RangeError, [core.int, dart.dynamic], [core.String, core.String, core.int])
+  }),
+  fields: () => ({
+    start: core.num,
+    end: core.num
+  }),
+  statics: () => ({
+    checkValueInInterval: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.String, core.String]),
+    checkValidIndex: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic], [core.String, core.int, core.String]),
+    checkValidRange: dart.definiteFunctionType(core.int, [core.int, core.int, core.int], [core.String, core.String, core.String]),
+    checkNotNegative: dart.definiteFunctionType(dart.void, [core.int], [core.String, core.String])
+  }),
+  names: ['checkValueInInterval', 'checkValidIndex', 'checkValidRange', 'checkNotNegative']
+});
+core.IndexError = class IndexError extends core.ArgumentError {
+  new(invalidValue, indexable, name, message, length) {
+    if (name === void 0) name = null;
+    if (message === void 0) message = null;
+    if (length === void 0) length = null;
+    this.indexable = indexable;
+    this.length = core.int._check(length != null ? length : dart.dload(indexable, 'length'));
+    super.value(invalidValue, name, message != null ? message : "Index out of range");
+  }
+  get start() {
+    return 0;
+  }
+  get end() {
+    return dart.notNull(this.length) - 1;
+  }
+  get [_errorName]() {
+    return "RangeError";
+  }
+  get [_errorExplanation]() {
+    dart.assert(this[_hasValue]);
+    if (dart.test(dart.dsend(this.invalidValue, '<', 0))) {
+      return ": index must not be negative";
     }
-  };
-  core.RegExp[dart.implements] = () => [core.Pattern];
-  dart.setSignature(core.RegExp, {
-    constructors: () => ({new: dart.definiteFunctionType(core.RegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})})
-  });
-  core.Set$ = dart.generic(E => {
-    let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    class Set extends core.Iterable$(E) {
-      static new() {
-        return LinkedHashSetOfE().new();
-      }
-      static identity() {
-        return LinkedHashSetOfE().identity();
-      }
-      static from(elements) {
-        return LinkedHashSetOfE().from(elements);
+    if (this.length == 0) {
+      return ": no indices are valid";
+    }
+    return dart.str`: index should be less than ${this.length}`;
+  }
+};
+core.IndexError[dart.implements] = () => [core.RangeError];
+dart.setSignature(core.IndexError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.IndexError, [core.int, dart.dynamic], [core.String, core.String, core.int])}),
+  fields: () => ({
+    indexable: dart.dynamic,
+    length: core.int
+  }),
+  getters: () => ({
+    start: dart.definiteFunctionType(core.int, []),
+    end: dart.definiteFunctionType(core.int, [])
+  })
+});
+const _className = Symbol('_className');
+core.AbstractClassInstantiationError = class AbstractClassInstantiationError extends core.Error {
+  new(className) {
+    this[_className] = className;
+    super.new();
+  }
+  toString() {
+    return dart.str`Cannot instantiate abstract class: '${this[_className]}'`;
+  }
+};
+dart.setSignature(core.AbstractClassInstantiationError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
+  fields: () => ({[_className]: core.String})
+});
+const _receiver$ = Symbol('_receiver');
+const _memberName = Symbol('_memberName');
+const _arguments = Symbol('_arguments');
+const _namedArguments = Symbol('_namedArguments');
+const _existingArgumentNames = Symbol('_existingArgumentNames');
+core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
+  new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
+    if (existingArgumentNames === void 0) existingArgumentNames = null;
+    this[_receiver$] = receiver;
+    this[_memberName] = memberName;
+    this[_arguments] = positionalArguments;
+    this[_namedArguments] = namedArguments;
+    this[_existingArgumentNames] = existingArgumentNames;
+    super.new();
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    let i = 0;
+    if (this[_arguments] != null) {
+      for (; i < dart.notNull(this[_arguments][dartx.length]); i++) {
+        if (i > 0) {
+          sb.write(", ");
+        }
+        sb.write(core.Error.safeToString(this[_arguments][dartx._get](i)));
       }
     }
-    Set[dart.implements] = () => [_internal.EfficientLength];
-    dart.setSignature(Set, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(core.Set$(E), []),
-        identity: dart.definiteFunctionType(core.Set$(E), []),
-        from: dart.definiteFunctionType(core.Set$(E), [IterableOfE()])
-      })
-    });
-    return Set;
-  });
-  core.Set = Set();
-  core.Sink$ = dart.generic(T => {
-    class Sink extends core.Object {}
-    dart.addTypeTests(Sink);
-    return Sink;
-  });
-  core.Sink = Sink();
-  core.StackTrace = class StackTrace extends core.Object {
-    new() {
+    if (this[_namedArguments] != null) {
+      this[_namedArguments][dartx.forEach](dart.fn((key, value) => {
+        if (i > 0) {
+          sb.write(", ");
+        }
+        sb.write(core._symbolToString(key));
+        sb.write(": ");
+        sb.write(core.Error.safeToString(value));
+        i++;
+      }, SymbolAnddynamicToNull()));
     }
-    static fromString(stackTraceString) {
-      return new core._StringStackTrace(stackTraceString);
+    if (this[_existingArgumentNames] == null) {
+      return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
+    } else {
+      let actualParameters = sb.toString();
+      sb = new core.StringBuffer();
+      for (let i = 0; i < dart.notNull(this[_existingArgumentNames][dartx.length]); i++) {
+        if (i > 0) {
+          sb.write(", ");
+        }
+        sb.write(this[_existingArgumentNames][dartx._get](i));
+      }
+      let formalParameters = sb.toString();
+      return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
     }
-    static get current() {
-      return _js_helper.getTraceFromException(new Error());
+  }
+};
+dart.setSignature(core.NoSuchMethodError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
+  fields: () => ({
+    [_receiver$]: core.Object,
+    [_memberName]: core.Symbol,
+    [_arguments]: core.List,
+    [_namedArguments]: MapOfSymbol$dynamic(),
+    [_existingArgumentNames]: core.List
+  })
+});
+core.UnsupportedError = class UnsupportedError extends core.Error {
+  new(message) {
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return dart.str`Unsupported operation: ${this.message}`;
+  }
+};
+dart.setSignature(core.UnsupportedError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.UnsupportedError, [core.String])}),
+  fields: () => ({message: core.String})
+});
+core.UnimplementedError = class UnimplementedError extends core.Error {
+  new(message) {
+    if (message === void 0) message = null;
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return this.message != null ? dart.str`UnimplementedError: ${this.message}` : "UnimplementedError";
+  }
+};
+core.UnimplementedError[dart.implements] = () => [core.UnsupportedError];
+dart.setSignature(core.UnimplementedError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.UnimplementedError, [], [core.String])}),
+  fields: () => ({message: core.String})
+});
+core.StateError = class StateError extends core.Error {
+  new(message) {
+    this.message = message;
+    super.new();
+  }
+  toString() {
+    return dart.str`Bad state: ${this.message}`;
+  }
+};
+dart.setSignature(core.StateError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.StateError, [core.String])}),
+  fields: () => ({message: core.String})
+});
+core.ConcurrentModificationError = class ConcurrentModificationError extends core.Error {
+  new(modifiedObject) {
+    if (modifiedObject === void 0) modifiedObject = null;
+    this.modifiedObject = modifiedObject;
+    super.new();
+  }
+  toString() {
+    if (this.modifiedObject == null) {
+      return "Concurrent modification during iteration.";
     }
-  };
-  dart.setSignature(core.StackTrace, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.StackTrace, []),
-      fromString: dart.definiteFunctionType(core.StackTrace, [core.String])
-    }),
-    sgetters: () => ({current: dart.definiteFunctionType(core.StackTrace, [])})
-  });
-  const _stackTrace = Symbol('_stackTrace');
-  core._StringStackTrace = class _StringStackTrace extends core.Object {
-    new(stackTrace) {
-      this[_stackTrace] = stackTrace;
+    return "Concurrent modification during iteration: " + dart.str`${core.Error.safeToString(this.modifiedObject)}.`;
+  }
+};
+dart.setSignature(core.ConcurrentModificationError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.ConcurrentModificationError, [], [core.Object])}),
+  fields: () => ({modifiedObject: core.Object})
+});
+core.OutOfMemoryError = class OutOfMemoryError extends core.Object {
+  new() {
+  }
+  toString() {
+    return "Out of Memory";
+  }
+  get stackTrace() {
+    return null;
+  }
+};
+core.OutOfMemoryError[dart.implements] = () => [core.Error];
+dart.setSignature(core.OutOfMemoryError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.OutOfMemoryError, [])}),
+  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
+});
+core.StackOverflowError = class StackOverflowError extends core.Object {
+  new() {
+  }
+  toString() {
+    return "Stack Overflow";
+  }
+  get stackTrace() {
+    return null;
+  }
+};
+core.StackOverflowError[dart.implements] = () => [core.Error];
+dart.setSignature(core.StackOverflowError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.StackOverflowError, [])}),
+  getters: () => ({stackTrace: dart.definiteFunctionType(core.StackTrace, [])})
+});
+core.CyclicInitializationError = class CyclicInitializationError extends core.Error {
+  new(variableName) {
+    if (variableName === void 0) variableName = null;
+    this.variableName = variableName;
+    super.new();
+  }
+  toString() {
+    return this.variableName == null ? "Reading static variable during its initialization" : dart.str`Reading static variable '${this.variableName}' during its initialization`;
+  }
+};
+dart.setSignature(core.CyclicInitializationError, {
+  constructors: () => ({new: dart.definiteFunctionType(core.CyclicInitializationError, [], [core.String])}),
+  fields: () => ({variableName: core.String})
+});
+core.Exception = class Exception extends core.Object {
+  static new(message) {
+    if (message === void 0) message = null;
+    return new core._Exception(message);
+  }
+};
+dart.setSignature(core.Exception, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Exception, [], [dart.dynamic])})
+});
+core._Exception = class _Exception extends core.Object {
+  new(message) {
+    if (message === void 0) message = null;
+    this.message = message;
+  }
+  toString() {
+    if (this.message == null) return "Exception";
+    return dart.str`Exception: ${this.message}`;
+  }
+};
+core._Exception[dart.implements] = () => [core.Exception];
+dart.setSignature(core._Exception, {
+  constructors: () => ({new: dart.definiteFunctionType(core._Exception, [], [dart.dynamic])}),
+  fields: () => ({message: dart.dynamic})
+});
+core.FormatException = class FormatException extends core.Object {
+  new(message, source, offset) {
+    if (message === void 0) message = "";
+    if (source === void 0) source = null;
+    if (offset === void 0) offset = null;
+    this.message = message;
+    this.source = source;
+    this.offset = offset;
+  }
+  toString() {
+    let report = "FormatException";
+    if (this.message != null && "" != this.message) {
+      report = dart.str`${report}: ${this.message}`;
+    }
+    let offset = this.offset;
+    if (!(typeof this.source == 'string')) {
+      if (offset != null) {
+        report = report + dart.str` (at offset ${offset})`;
+      }
+      return report;
+    }
+    if (offset != null && (dart.notNull(offset) < 0 || dart.notNull(offset) > dart.notNull(core.num._check(dart.dload(this.source, 'length'))))) {
+      offset = null;
+    }
+    if (offset == null) {
+      let source = core.String._check(this.source);
+      if (dart.notNull(source[dartx.length]) > 78) {
+        source = dart.notNull(source[dartx.substring](0, 75)) + "...";
+      }
+      return dart.str`${report}\n${source}`;
+    }
+    let lineNum = 1;
+    let lineStart = 0;
+    let lastWasCR = null;
+    for (let i = 0; i < dart.notNull(offset); i++) {
+      let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
+      if (char == 10) {
+        if (lineStart != i || !dart.test(lastWasCR)) {
+          lineNum++;
+        }
+        lineStart = i + 1;
+        lastWasCR = false;
+      } else if (char == 13) {
+        lineNum++;
+        lineStart = i + 1;
+        lastWasCR = true;
+      }
+    }
+    if (lineNum > 1) {
+      report = report + dart.str` (at line ${lineNum}, character ${dart.notNull(offset) - lineStart + 1})\n`;
+    } else {
+      report = report + dart.str` (at character ${dart.notNull(offset) + 1})\n`;
+    }
+    let lineEnd = core.int._check(dart.dload(this.source, 'length'));
+    for (let i = offset; dart.notNull(i) < dart.notNull(core.num._check(dart.dload(this.source, 'length'))); i = dart.notNull(i) + 1) {
+      let char = core.int._check(dart.dsend(this.source, 'codeUnitAt', i));
+      if (char == 10 || char == 13) {
+        lineEnd = i;
+        break;
+      }
+    }
+    let length = dart.notNull(lineEnd) - lineStart;
+    let start = lineStart;
+    let end = lineEnd;
+    let prefix = "";
+    let postfix = "";
+    if (length > 78) {
+      let index = dart.notNull(offset) - lineStart;
+      if (index < 75) {
+        end = start + 75;
+        postfix = "...";
+      } else if (dart.notNull(end) - dart.notNull(offset) < 75) {
+        start = dart.notNull(end) - 75;
+        prefix = "...";
+      } else {
+        start = dart.notNull(offset) - 36;
+        end = dart.notNull(offset) + 36;
+        prefix = postfix = "...";
+      }
+    }
+    let slice = core.String._check(dart.dsend(this.source, 'substring', start, end));
+    let markOffset = dart.notNull(offset) - start + dart.notNull(prefix[dartx.length]);
+    return dart.str`${report}${prefix}${slice}${postfix}\n${" "[dartx['*']](markOffset)}^\n`;
+  }
+};
+core.FormatException[dart.implements] = () => [core.Exception];
+dart.setSignature(core.FormatException, {
+  constructors: () => ({new: dart.definiteFunctionType(core.FormatException, [], [core.String, dart.dynamic, core.int])}),
+  fields: () => ({
+    message: core.String,
+    source: dart.dynamic,
+    offset: core.int
+  })
+});
+core.IntegerDivisionByZeroException = class IntegerDivisionByZeroException extends core.Object {
+  new() {
+  }
+  toString() {
+    return "IntegerDivisionByZeroException";
+  }
+};
+core.IntegerDivisionByZeroException[dart.implements] = () => [core.Exception];
+dart.setSignature(core.IntegerDivisionByZeroException, {
+  constructors: () => ({new: dart.definiteFunctionType(core.IntegerDivisionByZeroException, [])})
+});
+const _getKey = Symbol('_getKey');
+core.Expando$ = dart.generic(T => {
+  class Expando extends core.Object {
+    new(name) {
+      if (name === void 0) name = null;
+      this.name = name;
     }
     toString() {
-      return this[_stackTrace];
+      return dart.str`Expando:${this.name}`;
     }
-  };
-  core._StringStackTrace[dart.implements] = () => [core.StackTrace];
-  dart.setSignature(core._StringStackTrace, {
-    constructors: () => ({new: dart.definiteFunctionType(core._StringStackTrace, [core.String])}),
-    fields: () => ({[_stackTrace]: core.String})
-  });
-  const _stop = Symbol('_stop');
-  core.Stopwatch = class Stopwatch extends core.Object {
-    get frequency() {
-      return core.Stopwatch._frequency;
+    _get(object) {
+      let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
+      return T._check(values == null ? null : _js_helper.Primitives.getProperty(values, this[_getKey]()));
     }
-    new() {
-      this[_start$0] = null;
-      this[_stop] = null;
-      core.Stopwatch._initTicker();
-    }
-    start() {
-      if (dart.test(this.isRunning)) return;
-      if (this[_start$0] == null) {
-        this[_start$0] = core.Stopwatch._now();
-      } else {
-        this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
-        this[_stop] = null;
+    _set(object, value) {
+      T._check(value);
+      let values = _js_helper.Primitives.getProperty(object, core.Expando._EXPANDO_PROPERTY_NAME);
+      if (values == null) {
+        values = new core.Object();
+        _js_helper.Primitives.setProperty(object, core.Expando._EXPANDO_PROPERTY_NAME, values);
       }
+      _js_helper.Primitives.setProperty(values, this[_getKey](), value);
+      return value;
     }
-    stop() {
-      if (!dart.test(this.isRunning)) return;
-      this[_stop] = core.Stopwatch._now();
-    }
-    reset() {
-      if (this[_start$0] == null) return;
-      this[_start$0] = core.Stopwatch._now();
-      if (this[_stop] != null) {
-        this[_stop] = this[_start$0];
+    [_getKey]() {
+      let key = core.String._check(_js_helper.Primitives.getProperty(this, core.Expando._KEY_PROPERTY_NAME));
+      if (key == null) {
+        key = dart.str`expando\$key\$${(() => {
+          let x = core.Expando._keyCount;
+          core.Expando._keyCount = dart.notNull(x) + 1;
+          return x;
+        })()}`;
+        _js_helper.Primitives.setProperty(this, core.Expando._KEY_PROPERTY_NAME, key);
       }
+      return key;
     }
-    get elapsedTicks() {
-      if (this[_start$0] == null) {
-        return 0;
-      }
-      return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
-    }
-    get elapsed() {
-      return new core.Duration({microseconds: this.elapsedMicroseconds});
-    }
-    get elapsedMicroseconds() {
-      return (dart.notNull(this.elapsedTicks) * 1000000 / dart.notNull(this.frequency))[dartx.truncate]();
-    }
-    get elapsedMilliseconds() {
-      return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
-    }
-    get isRunning() {
-      return this[_start$0] != null && this[_stop] == null;
-    }
-    static _initTicker() {
-      _js_helper.Primitives.initTicker();
-      core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
-    }
-    static _now() {
-      return core.int._check(dart.dsend(_js_helper.Primitives, 'timerTicks'));
-    }
-  };
-  dart.setSignature(core.Stopwatch, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
-    fields: () => ({
-      [_start$0]: core.int,
-      [_stop]: core.int
-    }),
-    getters: () => ({
-      frequency: dart.definiteFunctionType(core.int, []),
-      elapsedTicks: dart.definiteFunctionType(core.int, []),
-      elapsed: dart.definiteFunctionType(core.Duration, []),
-      elapsedMicroseconds: dart.definiteFunctionType(core.int, []),
-      elapsedMilliseconds: dart.definiteFunctionType(core.int, []),
-      isRunning: dart.definiteFunctionType(core.bool, [])
-    }),
+  }
+  dart.addTypeTests(Expando);
+  dart.setSignature(Expando, {
+    constructors: () => ({new: dart.definiteFunctionType(core.Expando$(T), [], [core.String])}),
+    fields: () => ({name: core.String}),
     methods: () => ({
-      start: dart.definiteFunctionType(dart.void, []),
-      stop: dart.definiteFunctionType(dart.void, []),
-      reset: dart.definiteFunctionType(dart.void, [])
+      _get: dart.definiteFunctionType(T, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [core.Object, T]),
+      [_getKey]: dart.definiteFunctionType(core.String, [])
     }),
-    sfields: () => ({_frequency: core.int}),
-    statics: () => ({
-      _initTicker: dart.definiteFunctionType(dart.void, []),
-      _now: dart.definiteFunctionType(core.int, [])
-    }),
-    names: ['_initTicker', '_now']
+    sfields: () => ({
+      _KEY_PROPERTY_NAME: core.String,
+      _EXPANDO_PROPERTY_NAME: core.String,
+      _keyCount: core.int
+    })
   });
-  core.Stopwatch._frequency = null;
-  core.Runes = class Runes extends core.Iterable$(core.int) {
-    new(string) {
-      this.string = string;
+  return Expando;
+});
+core.Expando = Expando();
+core.Expando._KEY_PROPERTY_NAME = 'expando$key';
+core.Expando._EXPANDO_PROPERTY_NAME = 'expando$values';
+core.Expando._keyCount = 0;
+core.Function = class Function extends core.Object {
+  static apply(f, positionalArguments, namedArguments) {
+    if (namedArguments === void 0) namedArguments = null;
+    return dart.dcall.apply(null, [f].concat(positionalArguments));
+  }
+  static _toMangledNames(namedArguments) {
+    let result = dart.map({}, core.String, dart.dynamic);
+    namedArguments[dartx.forEach](dart.fn((symbol, value) => {
+      result[dartx._set](core._symbolToString(symbol), value);
+    }, SymbolAnddynamicToNull()));
+    return result;
+  }
+};
+core.Function.is = function is_Function(o) {
+  return typeof o == "function";
+};
+core.Function.as = function as_Function(o) {
+  if (typeof o == "function" || o == null) return o;
+  return dart.as(o, core.Function);
+};
+core.Function._check = function check_String(o) {
+  if (typeof o == "function" || o == null) return o;
+  return dart.check(o, core.Function);
+};
+dart.setSignature(core.Function, {
+  statics: () => ({
+    apply: dart.definiteFunctionType(dart.dynamic, [core.Function, core.List], [MapOfSymbol$dynamic()]),
+    _toMangledNames: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [MapOfSymbol$dynamic()])
+  }),
+  names: ['apply', '_toMangledNames']
+});
+core.identical = function(a, b) {
+  return a == null ? b == null : a === b;
+};
+dart.fn(core.identical, ObjectAndObjectTobool());
+core.identityHashCode = function(object) {
+  return _js_helper.objectHashCode(object);
+};
+dart.fn(core.identityHashCode, ObjectToint());
+core._Generator$ = dart.generic(E => {
+  const _Generator = dart.typedef('_Generator', () => dart.functionType(E, [core.int]));
+  return _Generator;
+});
+core._Generator = _Generator();
+const _end$ = Symbol('_end');
+const _start$0 = Symbol('_start');
+const _generator$ = Symbol('_generator');
+core._GeneratorIterable$ = dart.generic(E => {
+  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
+  let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
+  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
+  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
+  class _GeneratorIterable extends core.Iterable$(E) {
+    new(end, generator) {
+      this[_end$] = end;
+      this[_start$0] = 0;
+      this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
+      super.new();
+    }
+    slice(start, end, generator) {
+      this[_start$0] = start;
+      this[_end$] = end;
+      this[_generator$] = generator;
       super.new();
     }
     get iterator() {
-      return new core.RuneIterator(this.string);
-    }
-    get last() {
-      if (this.string[dartx.length] == 0) {
-        dart.throw(new core.StateError('No elements.'));
-      }
-      let length = this.string[dartx.length];
-      let code = this.string[dartx.codeUnitAt](dart.notNull(length) - 1);
-      if (dart.test(core._isTrailSurrogate(code)) && dart.notNull(this.string[dartx.length]) > 1) {
-        let previousCode = this.string[dartx.codeUnitAt](dart.notNull(length) - 2);
-        if (dart.test(core._isLeadSurrogate(previousCode))) {
-          return core._combineSurrogatePair(previousCode, code);
-        }
-      }
-      return code;
-    }
-  };
-  dart.addSimpleTypeTests(core.Runes);
-  dart.setSignature(core.Runes, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Runes, [core.String])}),
-    fields: () => ({string: core.String}),
-    getters: () => ({iterator: dart.definiteFunctionType(core.RuneIterator, [])})
-  });
-  dart.defineExtensionMembers(core.Runes, ['iterator', 'last']);
-  core._isLeadSurrogate = function(code) {
-    return (dart.notNull(code) & 64512) == 55296;
-  };
-  dart.fn(core._isLeadSurrogate, intTobool());
-  core._isTrailSurrogate = function(code) {
-    return (dart.notNull(code) & 64512) == 56320;
-  };
-  dart.fn(core._isTrailSurrogate, intTobool());
-  core._combineSurrogatePair = function(start, end) {
-    return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
-  };
-  dart.fn(core._combineSurrogatePair, intAndintToint());
-  const _position$ = Symbol('_position');
-  const _nextPosition = Symbol('_nextPosition');
-  const _currentCodePoint = Symbol('_currentCodePoint');
-  const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
-  core.RuneIterator = class RuneIterator extends core.Object {
-    new(string) {
-      this.string = string;
-      this[_position$] = 0;
-      this[_nextPosition] = 0;
-      this[_currentCodePoint] = null;
-    }
-    at(string, index) {
-      this.string = string;
-      this[_position$] = index;
-      this[_nextPosition] = index;
-      this[_currentCodePoint] = null;
-      core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
-      this[_checkSplitSurrogate](index);
-    }
-    [_checkSplitSurrogate](index) {
-      if (dart.notNull(index) > 0 && dart.notNull(index) < dart.notNull(this.string[dartx.length]) && dart.test(core._isLeadSurrogate(this.string[dartx.codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[dartx.codeUnitAt](index)))) {
-        dart.throw(new core.ArgumentError(dart.str`Index inside surrogate pair: ${index}`));
-      }
-    }
-    get rawIndex() {
-      return this[_position$] != this[_nextPosition] ? this[_position$] : null;
-    }
-    set rawIndex(rawIndex) {
-      core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
-      this.reset(rawIndex);
-      this.moveNext();
-    }
-    reset(rawIndex) {
-      if (rawIndex === void 0) rawIndex = 0;
-      core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
-      this[_checkSplitSurrogate](rawIndex);
-      this[_position$] = this[_nextPosition] = rawIndex;
-      this[_currentCodePoint] = null;
-    }
-    get current() {
-      return this[_currentCodePoint];
-    }
-    get currentSize() {
-      return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
-    }
-    get currentAsString() {
-      if (this[_position$] == this[_nextPosition]) return null;
-      if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
-      return this.string[dartx.substring](this[_position$], this[_nextPosition]);
-    }
-    moveNext() {
-      this[_position$] = this[_nextPosition];
-      if (this[_position$] == this.string[dartx.length]) {
-        this[_currentCodePoint] = null;
-        return false;
-      }
-      let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
-      let nextPosition = dart.notNull(this[_position$]) + 1;
-      if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
-        let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
-        if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
-          this[_nextPosition] = nextPosition + 1;
-          this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
-          return true;
-        }
-      }
-      this[_nextPosition] = nextPosition;
-      this[_currentCodePoint] = codeUnit;
-      return true;
-    }
-    movePrevious() {
-      this[_nextPosition] = this[_position$];
-      if (this[_position$] == 0) {
-        this[_currentCodePoint] = null;
-        return false;
-      }
-      let position = dart.notNull(this[_position$]) - 1;
-      let codeUnit = this.string[dartx.codeUnitAt](position);
-      if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
-        let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
-        if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
-          this[_position$] = position - 1;
-          this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
-          return true;
-        }
-      }
-      this[_position$] = position;
-      this[_currentCodePoint] = codeUnit;
-      return true;
-    }
-  };
-  dart.defineNamedConstructor(core.RuneIterator, 'at');
-  core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
-  dart.setSignature(core.RuneIterator, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(core.RuneIterator, [core.String]),
-      at: dart.definiteFunctionType(core.RuneIterator, [core.String, core.int])
-    }),
-    fields: () => ({
-      string: core.String,
-      [_position$]: core.int,
-      [_nextPosition]: core.int,
-      [_currentCodePoint]: core.int
-    }),
-    getters: () => ({
-      rawIndex: dart.definiteFunctionType(core.int, []),
-      current: dart.definiteFunctionType(core.int, []),
-      currentSize: dart.definiteFunctionType(core.int, []),
-      currentAsString: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({rawIndex: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [_checkSplitSurrogate]: dart.definiteFunctionType(dart.void, [core.int]),
-      reset: dart.definiteFunctionType(dart.void, [], [core.int]),
-      moveNext: dart.definiteFunctionType(core.bool, []),
-      movePrevious: dart.definiteFunctionType(core.bool, [])
-    })
-  });
-  const _contents = Symbol('_contents');
-  const _writeString = Symbol('_writeString');
-  core.StringBuffer = class StringBuffer extends core.Object {
-    new(content) {
-      if (content === void 0) content = "";
-      this[_contents] = dart.str`${content}`;
+      return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
     }
     get length() {
-      return this[_contents][dartx.length];
+      return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
     }
-    get isEmpty() {
-      return this.length == 0;
+    skip(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      if (count == 0) return this;
+      let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
+      if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
+      return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
     }
-    get isNotEmpty() {
-      return !dart.test(this.isEmpty);
+    take(count) {
+      core.RangeError.checkNotNegative(count, "count");
+      if (count == 0) return new (EmptyIterableOfE())();
+      let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
+      if (newEnd >= dart.notNull(this[_end$])) return this;
+      return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
     }
-    write(obj) {
-      this[_writeString](dart.str`${obj}`);
+    static _id(n) {
+      return n;
     }
-    writeCharCode(charCode) {
-      this[_writeString](core.String.fromCharCode(charCode));
-    }
-    writeAll(objects, separator) {
-      if (separator === void 0) separator = "";
-      this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
-    }
-    writeln(obj) {
-      if (obj === void 0) obj = "";
-      this[_writeString](dart.str`${obj}\n`);
-    }
-    clear() {
-      this[_contents] = "";
-    }
-    toString() {
-      return _js_helper.Primitives.flattenString(this[_contents]);
-    }
-    [_writeString](str) {
-      this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
-    }
-    static _writeAll(string, objects, separator) {
-      let iterator = objects[dartx.iterator];
-      if (!dart.test(iterator.moveNext())) return string;
-      if (dart.test(separator[dartx.isEmpty])) {
-        do {
-          string = core.StringBuffer._writeOne(string, iterator.current);
-        } while (dart.test(iterator.moveNext()));
-      } else {
-        string = core.StringBuffer._writeOne(string, iterator.current);
-        while (dart.test(iterator.moveNext())) {
-          string = core.StringBuffer._writeOne(string, separator);
-          string = core.StringBuffer._writeOne(string, iterator.current);
-        }
-      }
-      return string;
-    }
-    static _writeOne(string, obj) {
-      return _js_helper.Primitives.stringConcatUnchecked(string, dart.str`${obj}`);
-    }
-  };
-  core.StringBuffer[dart.implements] = () => [core.StringSink];
-  dart.setSignature(core.StringBuffer, {
-    constructors: () => ({new: dart.definiteFunctionType(core.StringBuffer, [], [core.Object])}),
-    fields: () => ({[_contents]: core.String}),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }
+  dart.defineNamedConstructor(_GeneratorIterable, 'slice');
+  _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(_GeneratorIterable, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, _GeneratorOfE()]),
+      slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
     }),
-    methods: () => ({
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      clear: dart.definiteFunctionType(dart.void, []),
-      [_writeString]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+    fields: () => ({
+      [_start$0]: core.int,
+      [_end$]: core.int,
+      [_generator$]: _GeneratorOfE()
     }),
-    statics: () => ({
-      _writeAll: dart.definiteFunctionType(core.String, [core.String, core.Iterable, core.String]),
-      _writeOne: dart.definiteFunctionType(core.String, [core.String, core.Object])
-    }),
-    names: ['_writeAll', '_writeOne']
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
+    names: ['_id']
   });
-  core.Symbol = class Symbol extends core.Object {
-    static new(name) {
-      return new _internal.Symbol(name);
+  dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
+  return _GeneratorIterable;
+});
+core._GeneratorIterable = _GeneratorIterable();
+const _index$1 = Symbol('_index');
+const _current$3 = Symbol('_current');
+core._GeneratorIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
+  class _GeneratorIterator extends core.Object {
+    new(index, end, generator) {
+      this[_index$1] = index;
+      this[_end$] = end;
+      this[_generator$] = generator;
+      this[_current$3] = null;
     }
-  };
-  dart.setSignature(core.Symbol, {
-    constructors: () => ({new: dart.definiteFunctionType(core.Symbol, [core.String])})
-  });
-  const _userInfo = Symbol('_userInfo');
-  const _host = Symbol('_host');
-  const _port = Symbol('_port');
-  const _path = Symbol('_path');
-  const _query = Symbol('_query');
-  const _fragment = Symbol('_fragment');
-  const _pathSegments = Symbol('_pathSegments');
-  const _queryParameters = Symbol('_queryParameters');
-  const _queryParameterLists = Symbol('_queryParameterLists');
-  const _writeAuthority = Symbol('_writeAuthority');
-  let const$51;
-  const _mergePaths = Symbol('_mergePaths');
-  const _toWindowsFilePath = Symbol('_toWindowsFilePath');
-  const _toFilePath = Symbol('_toFilePath');
-  const _isPathAbsolute = Symbol('_isPathAbsolute');
-  core.Uri = class Uri extends core.Object {
-    _internal(scheme, userInfo, host, port, path, query, fragment) {
-      this.scheme = scheme;
-      this[_userInfo] = userInfo;
-      this[_host] = host;
-      this[_port] = port;
-      this[_path] = path;
-      this[_query] = query;
-      this[_fragment] = fragment;
-      this[_pathSegments] = null;
-      this[_queryParameters] = null;
-      this[_queryParameterLists] = null;
-    }
-    static new(opts) {
-      let scheme = opts && 'scheme' in opts ? opts.scheme : "";
-      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
-      let host = opts && 'host' in opts ? opts.host : null;
-      let port = opts && 'port' in opts ? opts.port : null;
-      let path = opts && 'path' in opts ? opts.path : null;
-      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
-      let query = opts && 'query' in opts ? opts.query : null;
-      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
-      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-      scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
-      userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
-      host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
-      if (query == "") query = null;
-      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-      fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
-      port = core.Uri._makePort(port, scheme);
-      let isFile = scheme == "file";
-      if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
-        host = "";
-      }
-      let hasAuthority = host != null;
-      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
-      if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
-        path = core.Uri._normalizeRelativePath(path);
+    moveNext() {
+      if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
+        this[_current$3] = this[_generator$](this[_index$1]);
+        this[_index$1] = dart.notNull(this[_index$1]) + 1;
+        return true;
       } else {
-        path = core.Uri._removeDotSegments(path);
+        this[_current$3] = null;
+        return false;
       }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
     }
-    static http(authority, unencodedPath, queryParameters) {
-      if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+    get current() {
+      return this[_current$3];
     }
-    static https(authority, unencodedPath, queryParameters) {
-      if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+  }
+  dart.addTypeTests(_GeneratorIterator);
+  _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_GeneratorIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
+    fields: () => ({
+      [_end$]: core.int,
+      [_generator$]: _GeneratorOfE(),
+      [_index$1]: core.int,
+      [_current$3]: E
+    }),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _GeneratorIterator;
+});
+core._GeneratorIterator = _GeneratorIterator();
+core.BidirectionalIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class BidirectionalIterator extends core.Object {}
+  dart.addTypeTests(BidirectionalIterator);
+  BidirectionalIterator[dart.implements] = () => [IteratorOfE()];
+  return BidirectionalIterator;
+});
+core.BidirectionalIterator = BidirectionalIterator();
+core.Map$ = dart.generic((K, V) => {
+  let JsLinkedHashMapOfK$V = () => (JsLinkedHashMapOfK$V = dart.constFn(_js_helper.JsLinkedHashMap$(K, V)))();
+  let LinkedHashMapOfK$V = () => (LinkedHashMapOfK$V = dart.constFn(collection.LinkedHashMap$(K, V)))();
+  let UnmodifiableMapViewOfK$V = () => (UnmodifiableMapViewOfK$V = dart.constFn(collection.UnmodifiableMapView$(K, V)))();
+  let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
+  let dynamicToK = () => (dynamicToK = dart.constFn(dart.functionType(K, [dart.dynamic])))();
+  let IterableOfK = () => (IterableOfK = dart.constFn(core.Iterable$(K)))();
+  let dynamicToV = () => (dynamicToV = dart.constFn(dart.functionType(V, [dart.dynamic])))();
+  let IterableOfV = () => (IterableOfV = dart.constFn(core.Iterable$(V)))();
+  class Map extends core.Object {
+    static new() {
+      return JsLinkedHashMapOfK$V().es6();
     }
-    get authority() {
-      if (!dart.test(this.hasAuthority)) return "";
-      let sb = new core.StringBuffer();
-      this[_writeAuthority](sb);
-      return sb.toString();
+    static from(other) {
+      return LinkedHashMapOfK$V().from(other);
     }
-    get userInfo() {
-      return this[_userInfo];
+    static unmodifiable(other) {
+      return new (UnmodifiableMapViewOfK$V())(MapOfK$V().from(other));
     }
-    get host() {
-      if (this[_host] == null) return "";
-      if (dart.test(this[_host][dartx.startsWith]('['))) {
-        return this[_host][dartx.substring](1, dart.notNull(this[_host][dartx.length]) - 1);
-      }
-      return this[_host];
+    static identity() {
+      return LinkedHashMapOfK$V().identity();
     }
-    get port() {
-      if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
-      return this[_port];
+    static fromIterable(iterable, opts) {
+      return LinkedHashMapOfK$V().fromIterable(iterable, opts);
     }
-    static _defaultPort(scheme) {
-      if (scheme == "http") return 80;
-      if (scheme == "https") return 443;
+    static fromIterables(keys, values) {
+      return LinkedHashMapOfK$V().fromIterables(keys, values);
+    }
+  }
+  dart.addTypeTests(Map);
+  dart.setSignature(Map, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(core.Map$(K, V), []),
+      from: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
+      unmodifiable: dart.definiteFunctionType(core.Map$(K, V), [core.Map]),
+      identity: dart.definiteFunctionType(core.Map$(K, V), []),
+      fromIterable: dart.definiteFunctionType(core.Map$(K, V), [core.Iterable], {key: dynamicToK(), value: dynamicToV()}),
+      fromIterables: dart.definiteFunctionType(core.Map$(K, V), [IterableOfK(), IterableOfV()])
+    })
+  });
+  return Map;
+});
+core.Map = Map$();
+core.Null = class Null extends core.Object {
+  static _uninstantiable() {
+    dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
+  }
+  toString() {
+    return "null";
+  }
+};
+core.Null.is = function is_Null(o) {
+  return o == null;
+};
+core.Null.as = function as_Null(o) {
+  if (o == null) return o;
+  return dart.as(o, core.Null);
+};
+core.Null._check = function check_Null(o) {
+  if (o == null) return o;
+  return dart.check(o, core.Null);
+};
+dart.setSignature(core.Null, {
+  constructors: () => ({_uninstantiable: dart.definiteFunctionType(core.Null, [])})
+});
+core.Pattern = class Pattern extends core.Object {};
+core.print = function(object) {
+  let line = dart.str`${object}`;
+  if (_internal.printToZone == null) {
+    _internal.printToConsole(line);
+  } else {
+    dart.dcall(_internal.printToZone, line);
+  }
+};
+dart.fn(core.print, ObjectTovoid());
+core.RegExp = class RegExp extends core.Object {
+  static new(source, opts) {
+    let multiLine = opts && 'multiLine' in opts ? opts.multiLine : false;
+    let caseSensitive = opts && 'caseSensitive' in opts ? opts.caseSensitive : true;
+    return new _js_helper.JSSyntaxRegExp(source, {multiLine: multiLine, caseSensitive: caseSensitive});
+  }
+};
+core.RegExp[dart.implements] = () => [core.Pattern];
+dart.setSignature(core.RegExp, {
+  constructors: () => ({new: dart.definiteFunctionType(core.RegExp, [core.String], {multiLine: core.bool, caseSensitive: core.bool})})
+});
+core.Set$ = dart.generic(E => {
+  let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  class Set extends core.Iterable$(E) {
+    static new() {
+      return LinkedHashSetOfE().new();
+    }
+    static identity() {
+      return LinkedHashSetOfE().identity();
+    }
+    static from(elements) {
+      return LinkedHashSetOfE().from(elements);
+    }
+  }
+  Set[dart.implements] = () => [_internal.EfficientLength];
+  dart.setSignature(Set, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(core.Set$(E), []),
+      identity: dart.definiteFunctionType(core.Set$(E), []),
+      from: dart.definiteFunctionType(core.Set$(E), [IterableOfE()])
+    })
+  });
+  return Set;
+});
+core.Set = Set();
+core.Sink$ = dart.generic(T => {
+  class Sink extends core.Object {}
+  dart.addTypeTests(Sink);
+  return Sink;
+});
+core.Sink = Sink();
+core.StackTrace = class StackTrace extends core.Object {
+  new() {
+  }
+  static fromString(stackTraceString) {
+    return new core._StringStackTrace(stackTraceString);
+  }
+  static get current() {
+    return _js_helper.getTraceFromException(new Error());
+  }
+};
+dart.setSignature(core.StackTrace, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.StackTrace, []),
+    fromString: dart.definiteFunctionType(core.StackTrace, [core.String])
+  }),
+  sgetters: () => ({current: dart.definiteFunctionType(core.StackTrace, [])})
+});
+const _stackTrace = Symbol('_stackTrace');
+core._StringStackTrace = class _StringStackTrace extends core.Object {
+  new(stackTrace) {
+    this[_stackTrace] = stackTrace;
+  }
+  toString() {
+    return this[_stackTrace];
+  }
+};
+core._StringStackTrace[dart.implements] = () => [core.StackTrace];
+dart.setSignature(core._StringStackTrace, {
+  constructors: () => ({new: dart.definiteFunctionType(core._StringStackTrace, [core.String])}),
+  fields: () => ({[_stackTrace]: core.String})
+});
+const _stop = Symbol('_stop');
+core.Stopwatch = class Stopwatch extends core.Object {
+  get frequency() {
+    return core.Stopwatch._frequency;
+  }
+  new() {
+    this[_start$0] = null;
+    this[_stop] = null;
+    core.Stopwatch._initTicker();
+  }
+  start() {
+    if (dart.test(this.isRunning)) return;
+    if (this[_start$0] == null) {
+      this[_start$0] = core.Stopwatch._now();
+    } else {
+      this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
+      this[_stop] = null;
+    }
+  }
+  stop() {
+    if (!dart.test(this.isRunning)) return;
+    this[_stop] = core.Stopwatch._now();
+  }
+  reset() {
+    if (this[_start$0] == null) return;
+    this[_start$0] = core.Stopwatch._now();
+    if (this[_stop] != null) {
+      this[_stop] = this[_start$0];
+    }
+  }
+  get elapsedTicks() {
+    if (this[_start$0] == null) {
       return 0;
     }
-    get path() {
-      return this[_path];
+    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
+  }
+  get elapsed() {
+    return new core.Duration({microseconds: this.elapsedMicroseconds});
+  }
+  get elapsedMicroseconds() {
+    return (dart.notNull(this.elapsedTicks) * 1000000 / dart.notNull(this.frequency))[dartx.truncate]();
+  }
+  get elapsedMilliseconds() {
+    return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
+  }
+  get isRunning() {
+    return this[_start$0] != null && this[_stop] == null;
+  }
+  static _initTicker() {
+    _js_helper.Primitives.initTicker();
+    core.Stopwatch._frequency = _js_helper.Primitives.timerFrequency;
+  }
+  static _now() {
+    return core.int._check(dart.dsend(_js_helper.Primitives, 'timerTicks'));
+  }
+};
+dart.setSignature(core.Stopwatch, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
+  fields: () => ({
+    [_start$0]: core.int,
+    [_stop]: core.int
+  }),
+  getters: () => ({
+    frequency: dart.definiteFunctionType(core.int, []),
+    elapsedTicks: dart.definiteFunctionType(core.int, []),
+    elapsed: dart.definiteFunctionType(core.Duration, []),
+    elapsedMicroseconds: dart.definiteFunctionType(core.int, []),
+    elapsedMilliseconds: dart.definiteFunctionType(core.int, []),
+    isRunning: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    start: dart.definiteFunctionType(dart.void, []),
+    stop: dart.definiteFunctionType(dart.void, []),
+    reset: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({_frequency: core.int}),
+  statics: () => ({
+    _initTicker: dart.definiteFunctionType(dart.void, []),
+    _now: dart.definiteFunctionType(core.int, [])
+  }),
+  names: ['_initTicker', '_now']
+});
+core.Stopwatch._frequency = null;
+core.Runes = class Runes extends core.Iterable$(core.int) {
+  new(string) {
+    this.string = string;
+    super.new();
+  }
+  get iterator() {
+    return new core.RuneIterator(this.string);
+  }
+  get last() {
+    if (this.string[dartx.length] == 0) {
+      dart.throw(new core.StateError('No elements.'));
     }
-    get query() {
-      return this[_query] == null ? "" : this[_query];
-    }
-    get fragment() {
-      return this[_fragment] == null ? "" : this[_fragment];
-    }
-    static parse(uri, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let EOI = -1;
-      let scheme = "";
-      let userinfo = "";
-      let host = null;
-      let port = null;
-      let path = null;
-      let query = null;
-      let fragment = null;
-      if (end == null) end = uri[dartx.length];
-      let index = start;
-      let pathStart = start;
-      let char = EOI;
-      function parseAuth() {
-        if (index == end) {
-          char = EOI;
-          return;
-        }
-        let authStart = index;
-        let lastColon = -1;
-        let lastAt = -1;
-        char = uri[dartx.codeUnitAt](index);
-        while (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          if (char == core.Uri._AT_SIGN) {
-            lastAt = index;
-            lastColon = -1;
-          } else if (char == core.Uri._COLON) {
-            lastColon = index;
-          } else if (char == core.Uri._LEFT_BRACKET) {
-            lastColon = -1;
-            let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
-            if (endBracket == -1) {
-              index = end;
-              char = EOI;
-              break;
-            } else {
-              index = endBracket;
-            }
-          }
-          index = dart.notNull(index) + 1;
-          char = EOI;
-        }
-        let hostStart = authStart;
-        let hostEnd = index;
-        if (dart.notNull(lastAt) >= 0) {
-          userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
-          hostStart = dart.notNull(lastAt) + 1;
-        }
-        if (dart.notNull(lastColon) >= 0) {
-          let portNumber = null;
-          if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
-            portNumber = 0;
-            for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
-              let digit = uri[dartx.codeUnitAt](i);
-              if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
-                core.Uri._fail(uri, i, "Invalid port number");
-              }
-              portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
-            }
-          }
-          port = core.Uri._makePort(portNumber, scheme);
-          hostEnd = lastColon;
-        }
-        host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
-        if (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-        }
+    let length = this.string[dartx.length];
+    let code = this.string[dartx.codeUnitAt](dart.notNull(length) - 1);
+    if (dart.test(core._isTrailSurrogate(code)) && dart.notNull(this.string[dartx.length]) > 1) {
+      let previousCode = this.string[dartx.codeUnitAt](dart.notNull(length) - 2);
+      if (dart.test(core._isLeadSurrogate(previousCode))) {
+        return core._combineSurrogatePair(previousCode, code);
       }
-      dart.fn(parseAuth, VoidTovoid$());
-      let NOT_IN_PATH = 0;
-      let IN_PATH = 1;
-      let ALLOW_AUTH = 2;
-      let state = NOT_IN_PATH;
-      let i = index;
-      while (dart.notNull(i) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](i);
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          state = NOT_IN_PATH;
+    }
+    return code;
+  }
+};
+dart.addSimpleTypeTests(core.Runes);
+dart.setSignature(core.Runes, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Runes, [core.String])}),
+  fields: () => ({string: core.String}),
+  getters: () => ({iterator: dart.definiteFunctionType(core.RuneIterator, [])})
+});
+dart.defineExtensionMembers(core.Runes, ['iterator', 'last']);
+core._isLeadSurrogate = function(code) {
+  return (dart.notNull(code) & 64512) == 55296;
+};
+dart.fn(core._isLeadSurrogate, intTobool());
+core._isTrailSurrogate = function(code) {
+  return (dart.notNull(code) & 64512) == 56320;
+};
+dart.fn(core._isTrailSurrogate, intTobool());
+core._combineSurrogatePair = function(start, end) {
+  return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
+};
+dart.fn(core._combineSurrogatePair, intAndintToint());
+const _position$ = Symbol('_position');
+const _nextPosition = Symbol('_nextPosition');
+const _currentCodePoint = Symbol('_currentCodePoint');
+const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
+core.RuneIterator = class RuneIterator extends core.Object {
+  new(string) {
+    this.string = string;
+    this[_position$] = 0;
+    this[_nextPosition] = 0;
+    this[_currentCodePoint] = null;
+  }
+  at(string, index) {
+    this.string = string;
+    this[_position$] = index;
+    this[_nextPosition] = index;
+    this[_currentCodePoint] = null;
+    core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
+    this[_checkSplitSurrogate](index);
+  }
+  [_checkSplitSurrogate](index) {
+    if (dart.notNull(index) > 0 && dart.notNull(index) < dart.notNull(this.string[dartx.length]) && dart.test(core._isLeadSurrogate(this.string[dartx.codeUnitAt](dart.notNull(index) - 1))) && dart.test(core._isTrailSurrogate(this.string[dartx.codeUnitAt](index)))) {
+      dart.throw(new core.ArgumentError(dart.str`Index inside surrogate pair: ${index}`));
+    }
+  }
+  get rawIndex() {
+    return this[_position$] != this[_nextPosition] ? this[_position$] : null;
+  }
+  set rawIndex(rawIndex) {
+    core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
+    this.reset(rawIndex);
+    this.moveNext();
+  }
+  reset(rawIndex) {
+    if (rawIndex === void 0) rawIndex = 0;
+    core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
+    this[_checkSplitSurrogate](rawIndex);
+    this[_position$] = this[_nextPosition] = rawIndex;
+    this[_currentCodePoint] = null;
+  }
+  get current() {
+    return this[_currentCodePoint];
+  }
+  get currentSize() {
+    return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
+  }
+  get currentAsString() {
+    if (this[_position$] == this[_nextPosition]) return null;
+    if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
+    return this.string[dartx.substring](this[_position$], this[_nextPosition]);
+  }
+  moveNext() {
+    this[_position$] = this[_nextPosition];
+    if (this[_position$] == this.string[dartx.length]) {
+      this[_currentCodePoint] = null;
+      return false;
+    }
+    let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
+    let nextPosition = dart.notNull(this[_position$]) + 1;
+    if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
+      let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
+      if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
+        this[_nextPosition] = nextPosition + 1;
+        this[_currentCodePoint] = core._combineSurrogatePair(codeUnit, nextCodeUnit);
+        return true;
+      }
+    }
+    this[_nextPosition] = nextPosition;
+    this[_currentCodePoint] = codeUnit;
+    return true;
+  }
+  movePrevious() {
+    this[_nextPosition] = this[_position$];
+    if (this[_position$] == 0) {
+      this[_currentCodePoint] = null;
+      return false;
+    }
+    let position = dart.notNull(this[_position$]) - 1;
+    let codeUnit = this.string[dartx.codeUnitAt](position);
+    if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
+      let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
+      if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
+        this[_position$] = position - 1;
+        this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
+        return true;
+      }
+    }
+    this[_position$] = position;
+    this[_currentCodePoint] = codeUnit;
+    return true;
+  }
+};
+dart.defineNamedConstructor(core.RuneIterator, 'at');
+core.RuneIterator[dart.implements] = () => [BidirectionalIteratorOfint()];
+dart.setSignature(core.RuneIterator, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(core.RuneIterator, [core.String]),
+    at: dart.definiteFunctionType(core.RuneIterator, [core.String, core.int])
+  }),
+  fields: () => ({
+    string: core.String,
+    [_position$]: core.int,
+    [_nextPosition]: core.int,
+    [_currentCodePoint]: core.int
+  }),
+  getters: () => ({
+    rawIndex: dart.definiteFunctionType(core.int, []),
+    current: dart.definiteFunctionType(core.int, []),
+    currentSize: dart.definiteFunctionType(core.int, []),
+    currentAsString: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({rawIndex: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [_checkSplitSurrogate]: dart.definiteFunctionType(dart.void, [core.int]),
+    reset: dart.definiteFunctionType(dart.void, [], [core.int]),
+    moveNext: dart.definiteFunctionType(core.bool, []),
+    movePrevious: dart.definiteFunctionType(core.bool, [])
+  })
+});
+const _contents = Symbol('_contents');
+const _writeString = Symbol('_writeString');
+core.StringBuffer = class StringBuffer extends core.Object {
+  new(content) {
+    if (content === void 0) content = "";
+    this[_contents] = dart.str`${content}`;
+  }
+  get length() {
+    return this[_contents][dartx.length];
+  }
+  get isEmpty() {
+    return this.length == 0;
+  }
+  get isNotEmpty() {
+    return !dart.test(this.isEmpty);
+  }
+  write(obj) {
+    this[_writeString](dart.str`${obj}`);
+  }
+  writeCharCode(charCode) {
+    this[_writeString](core.String.fromCharCode(charCode));
+  }
+  writeAll(objects, separator) {
+    if (separator === void 0) separator = "";
+    this[_contents] = core.StringBuffer._writeAll(this[_contents], objects, separator);
+  }
+  writeln(obj) {
+    if (obj === void 0) obj = "";
+    this[_writeString](dart.str`${obj}\n`);
+  }
+  clear() {
+    this[_contents] = "";
+  }
+  toString() {
+    return _js_helper.Primitives.flattenString(this[_contents]);
+  }
+  [_writeString](str) {
+    this[_contents] = _js_helper.Primitives.stringConcatUnchecked(this[_contents], core.String._check(str));
+  }
+  static _writeAll(string, objects, separator) {
+    let iterator = objects[dartx.iterator];
+    if (!dart.test(iterator.moveNext())) return string;
+    if (dart.test(separator[dartx.isEmpty])) {
+      do {
+        string = core.StringBuffer._writeOne(string, iterator.current);
+      } while (dart.test(iterator.moveNext()));
+    } else {
+      string = core.StringBuffer._writeOne(string, iterator.current);
+      while (dart.test(iterator.moveNext())) {
+        string = core.StringBuffer._writeOne(string, separator);
+        string = core.StringBuffer._writeOne(string, iterator.current);
+      }
+    }
+    return string;
+  }
+  static _writeOne(string, obj) {
+    return _js_helper.Primitives.stringConcatUnchecked(string, dart.str`${obj}`);
+  }
+};
+core.StringBuffer[dart.implements] = () => [core.StringSink];
+dart.setSignature(core.StringBuffer, {
+  constructors: () => ({new: dart.definiteFunctionType(core.StringBuffer, [], [core.Object])}),
+  fields: () => ({[_contents]: core.String}),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    [_writeString]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  statics: () => ({
+    _writeAll: dart.definiteFunctionType(core.String, [core.String, core.Iterable, core.String]),
+    _writeOne: dart.definiteFunctionType(core.String, [core.String, core.Object])
+  }),
+  names: ['_writeAll', '_writeOne']
+});
+core.Symbol = class Symbol extends core.Object {
+  static new(name) {
+    return new _internal.Symbol(name);
+  }
+};
+dart.setSignature(core.Symbol, {
+  constructors: () => ({new: dart.definiteFunctionType(core.Symbol, [core.String])})
+});
+const _userInfo = Symbol('_userInfo');
+const _host = Symbol('_host');
+const _port = Symbol('_port');
+const _path = Symbol('_path');
+const _query = Symbol('_query');
+const _fragment = Symbol('_fragment');
+const _pathSegments = Symbol('_pathSegments');
+const _queryParameters = Symbol('_queryParameters');
+const _queryParameterLists = Symbol('_queryParameterLists');
+const _writeAuthority = Symbol('_writeAuthority');
+let const$51;
+const _mergePaths = Symbol('_mergePaths');
+const _toWindowsFilePath = Symbol('_toWindowsFilePath');
+const _toFilePath = Symbol('_toFilePath');
+const _isPathAbsolute = Symbol('_isPathAbsolute');
+core.Uri = class Uri extends core.Object {
+  _internal(scheme, userInfo, host, port, path, query, fragment) {
+    this.scheme = scheme;
+    this[_userInfo] = userInfo;
+    this[_host] = host;
+    this[_port] = port;
+    this[_path] = path;
+    this[_query] = query;
+    this[_fragment] = fragment;
+    this[_pathSegments] = null;
+    this[_queryParameters] = null;
+    this[_queryParameterLists] = null;
+  }
+  static new(opts) {
+    let scheme = opts && 'scheme' in opts ? opts.scheme : "";
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
+    let host = opts && 'host' in opts ? opts.host : null;
+    let port = opts && 'port' in opts ? opts.port : null;
+    let path = opts && 'path' in opts ? opts.path : null;
+    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+    let query = opts && 'query' in opts ? opts.query : null;
+    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+    scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
+    userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
+    host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
+    if (query == "") query = null;
+    query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+    fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
+    port = core.Uri._makePort(port, scheme);
+    let isFile = scheme == "file";
+    if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
+      host = "";
+    }
+    let hasAuthority = host != null;
+    path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
+      path = core.Uri._normalizeRelativePath(path);
+    } else {
+      path = core.Uri._removeDotSegments(path);
+    }
+    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
+  static http(authority, unencodedPath, queryParameters) {
+    if (queryParameters === void 0) queryParameters = null;
+    return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+  }
+  static https(authority, unencodedPath, queryParameters) {
+    if (queryParameters === void 0) queryParameters = null;
+    return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+  }
+  get authority() {
+    if (!dart.test(this.hasAuthority)) return "";
+    let sb = new core.StringBuffer();
+    this[_writeAuthority](sb);
+    return sb.toString();
+  }
+  get userInfo() {
+    return this[_userInfo];
+  }
+  get host() {
+    if (this[_host] == null) return "";
+    if (dart.test(this[_host][dartx.startsWith]('['))) {
+      return this[_host][dartx.substring](1, dart.notNull(this[_host][dartx.length]) - 1);
+    }
+    return this[_host];
+  }
+  get port() {
+    if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
+    return this[_port];
+  }
+  static _defaultPort(scheme) {
+    if (scheme == "http") return 80;
+    if (scheme == "https") return 443;
+    return 0;
+  }
+  get path() {
+    return this[_path];
+  }
+  get query() {
+    return this[_query] == null ? "" : this[_query];
+  }
+  get fragment() {
+    return this[_fragment] == null ? "" : this[_fragment];
+  }
+  static parse(uri, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let EOI = -1;
+    let scheme = "";
+    let userinfo = "";
+    let host = null;
+    let port = null;
+    let path = null;
+    let query = null;
+    let fragment = null;
+    if (end == null) end = uri[dartx.length];
+    let index = start;
+    let pathStart = start;
+    let char = EOI;
+    function parseAuth() {
+      if (index == end) {
+        char = EOI;
+        return;
+      }
+      let authStart = index;
+      let lastColon = -1;
+      let lastAt = -1;
+      char = uri[dartx.codeUnitAt](index);
+      while (dart.notNull(index) < dart.notNull(end)) {
+        char = uri[dartx.codeUnitAt](index);
+        if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
           break;
         }
-        if (char == core.Uri._SLASH) {
-          state = i == start ? ALLOW_AUTH : IN_PATH;
-          break;
-        }
-        if (char == core.Uri._COLON) {
-          if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
-          scheme = core.Uri._makeScheme(uri, start, i);
-          i = dart.notNull(i) + 1;
-          pathStart = i;
-          if (i == end) {
+        if (char == core.Uri._AT_SIGN) {
+          lastAt = index;
+          lastColon = -1;
+        } else if (char == core.Uri._COLON) {
+          lastColon = index;
+        } else if (char == core.Uri._LEFT_BRACKET) {
+          lastColon = -1;
+          let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
+          if (endBracket == -1) {
+            index = end;
             char = EOI;
-            state = NOT_IN_PATH;
+            break;
           } else {
-            char = uri[dartx.codeUnitAt](i);
-            if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-              state = NOT_IN_PATH;
-            } else if (char == core.Uri._SLASH) {
-              state = ALLOW_AUTH;
-            } else {
-              state = IN_PATH;
-            }
+            index = endBracket;
           }
-          break;
         }
-        i = dart.notNull(i) + 1;
+        index = dart.notNull(index) + 1;
         char = EOI;
       }
-      index = i;
-      if (state == ALLOW_AUTH) {
-        dart.assert(char == core.Uri._SLASH);
-        index = dart.notNull(index) + 1;
-        if (index == end) {
+      let hostStart = authStart;
+      let hostEnd = index;
+      if (dart.notNull(lastAt) >= 0) {
+        userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
+        hostStart = dart.notNull(lastAt) + 1;
+      }
+      if (dart.notNull(lastColon) >= 0) {
+        let portNumber = null;
+        if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
+          portNumber = 0;
+          for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
+            let digit = uri[dartx.codeUnitAt](i);
+            if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
+              core.Uri._fail(uri, i, "Invalid port number");
+            }
+            portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
+          }
+        }
+        port = core.Uri._makePort(portNumber, scheme);
+        hostEnd = lastColon;
+      }
+      host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
+      if (dart.notNull(index) < dart.notNull(end)) {
+        char = uri[dartx.codeUnitAt](index);
+      }
+    }
+    dart.fn(parseAuth, VoidTovoid$());
+    let NOT_IN_PATH = 0;
+    let IN_PATH = 1;
+    let ALLOW_AUTH = 2;
+    let state = NOT_IN_PATH;
+    let i = index;
+    while (dart.notNull(i) < dart.notNull(end)) {
+      char = uri[dartx.codeUnitAt](i);
+      if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
+        state = NOT_IN_PATH;
+        break;
+      }
+      if (char == core.Uri._SLASH) {
+        state = i == start ? ALLOW_AUTH : IN_PATH;
+        break;
+      }
+      if (char == core.Uri._COLON) {
+        if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
+        scheme = core.Uri._makeScheme(uri, start, i);
+        i = dart.notNull(i) + 1;
+        pathStart = i;
+        if (i == end) {
           char = EOI;
           state = NOT_IN_PATH;
         } else {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH) {
-            index = dart.notNull(index) + 1;
-            parseAuth();
-            pathStart = index;
-          }
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
+          char = uri[dartx.codeUnitAt](i);
+          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
             state = NOT_IN_PATH;
+          } else if (char == core.Uri._SLASH) {
+            state = ALLOW_AUTH;
           } else {
             state = IN_PATH;
           }
         }
+        break;
       }
-      dart.assert(state == IN_PATH || state == NOT_IN_PATH);
-      if (state == IN_PATH) {
-        while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          char = EOI;
-        }
+      i = dart.notNull(i) + 1;
+      char = EOI;
+    }
+    index = i;
+    if (state == ALLOW_AUTH) {
+      dart.assert(char == core.Uri._SLASH);
+      index = dart.notNull(index) + 1;
+      if (index == end) {
+        char = EOI;
         state = NOT_IN_PATH;
-      }
-      dart.assert(state == NOT_IN_PATH);
-      let hasAuthority = host != null;
-      path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
-      if (char == core.Uri._QUESTION) {
-        let numberSignIndex = -1;
-        for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
-          if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
-            numberSignIndex = i;
-            break;
-          }
+      } else {
+        char = uri[dartx.codeUnitAt](index);
+        if (char == core.Uri._SLASH) {
+          index = dart.notNull(index) + 1;
+          parseAuth();
+          pathStart = index;
         }
-        if (numberSignIndex < 0) {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
+        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
+          state = NOT_IN_PATH;
         } else {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
-          fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
+          state = IN_PATH;
         }
-      } else if (char == core.Uri._NUMBER_SIGN) {
-        fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
       }
-      return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
     }
-    static _fail(uri, index, message) {
-      dart.throw(new core.FormatException(message, uri, index));
+    dart.assert(state == IN_PATH || state == NOT_IN_PATH);
+    if (state == IN_PATH) {
+      while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
+        char = uri[dartx.codeUnitAt](index);
+        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
+          break;
+        }
+        char = EOI;
+      }
+      state = NOT_IN_PATH;
     }
-    static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
-      let userInfo = "";
-      let host = null;
-      let port = null;
-      if (authority != null && dart.test(authority[dartx.isNotEmpty])) {
-        let hostStart = 0;
-        let hasUserInfo = false;
-        for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
-          if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
-            hasUserInfo = true;
-            userInfo = authority[dartx.substring](0, i);
-            hostStart = i + 1;
-            break;
-          }
+    dart.assert(state == NOT_IN_PATH);
+    let hasAuthority = host != null;
+    path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
+    if (char == core.Uri._QUESTION) {
+      let numberSignIndex = -1;
+      for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
+        if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
+          numberSignIndex = i;
+          break;
         }
-        let hostEnd = hostStart;
-        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
-          for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-            if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
-          }
-          if (hostEnd == authority[dartx.length]) {
-            dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
-          }
-          core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
-          hostEnd++;
-          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
-            dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
-          }
+      }
+      if (numberSignIndex < 0) {
+        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
+      } else {
+        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
+        fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
+      }
+    } else if (char == core.Uri._NUMBER_SIGN) {
+      fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
+    }
+    return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
+  }
+  static _fail(uri, index, message) {
+    dart.throw(new core.FormatException(message, uri, index));
+  }
+  static _makeHttpUri(scheme, authority, unencodedPath, queryParameters) {
+    let userInfo = "";
+    let host = null;
+    let port = null;
+    if (authority != null && dart.test(authority[dartx.isNotEmpty])) {
+      let hostStart = 0;
+      let hasUserInfo = false;
+      for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
+        if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
+          hasUserInfo = true;
+          userInfo = authority[dartx.substring](0, i);
+          hostStart = i + 1;
+          break;
         }
-        let hasPort = false;
+      }
+      let hostEnd = hostStart;
+      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
         for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
-            let portString = authority[dartx.substring](hostEnd + 1);
-            if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
-            break;
-          }
+          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
         }
-        host = authority[dartx.substring](hostStart, hostEnd);
-      }
-      return core.Uri.new({scheme: scheme, userInfo: userInfo, host: core.String._check(host), port: core.int._check(port), pathSegments: unencodedPath[dartx.split]("/"), queryParameters: queryParameters});
-    }
-    static file(path, opts) {
-      let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
-    }
-    static directory(path, opts) {
-      let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
-    }
-    static dataFromString(content, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let base64 = opts && 'base64' in opts ? opts.base64 : false;
-      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
-      return data.uri;
-    }
-    static dataFromBytes(bytes, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
-      return data.uri;
-    }
-    static get base() {
-      let uri = _js_helper.Primitives.currentUri();
-      if (uri != null) return core.Uri.parse(uri);
-      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
-    }
-    static get _isWindows() {
-      return false;
-    }
-    static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
-      segments[dartx.forEach](dart.fn(segment => {
-        if (dart.test(segment[dartx.contains]("/"))) {
-          if (dart.test(argumentError)) {
-            dart.throw(new core.ArgumentError(dart.str`Illegal path character ${segment}`));
-          } else {
-            dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
-          }
+        if (hostEnd == authority[dartx.length]) {
+          dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
         }
-      }, StringToNull()));
-    }
-    static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
-      if (firstSegment === void 0) firstSegment = 0;
-      for (let segment of segments[dartx.skip](firstSegment)) {
-        if (dart.test(segment[dartx.contains](core.RegExp.new('["*/:<>?\\\\|]')))) {
-          if (dart.test(argumentError)) {
-            dart.throw(new core.ArgumentError("Illegal character in path"));
-          } else {
-            dart.throw(new core.UnsupportedError("Illegal character in path"));
-          }
+        core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
+        hostEnd++;
+        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
+          dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
         }
       }
+      let hasPort = false;
+      for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
+        if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
+          let portString = authority[dartx.substring](hostEnd + 1);
+          if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
+          break;
+        }
+      }
+      host = authority[dartx.substring](hostStart, hostEnd);
     }
-    static _checkWindowsDriveLetter(charCode, argumentError) {
-      if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
-        return;
-      }
-      if (dart.test(argumentError)) {
-        dart.throw(new core.ArgumentError("Illegal drive letter " + core.String.fromCharCode(charCode)));
-      } else {
-        dart.throw(new core.UnsupportedError("Illegal drive letter " + core.String.fromCharCode(charCode)));
-      }
-    }
-    static _makeFileUri(path, slashTerminated) {
-      let sep = "/";
-      let segments = path[dartx.split](sep);
-      if (dart.test(slashTerminated) && dart.test(segments[dartx.isNotEmpty]) && dart.test(segments[dartx.last][dartx.isNotEmpty])) {
-        segments[dartx.add]("");
-      }
-      if (dart.test(path[dartx.startsWith](sep))) {
-        return core.Uri.new({scheme: "file", pathSegments: segments});
-      } else {
-        return core.Uri.new({pathSegments: segments});
-      }
-    }
-    static _makeWindowsFileUrl(path, slashTerminated) {
-      if (dart.test(path[dartx.startsWith]("\\\\?\\"))) {
-        if (dart.test(path[dartx.startsWith]("UNC\\", 4))) {
-          path = path[dartx.replaceRange](0, 7, '\\');
+    return core.Uri.new({scheme: scheme, userInfo: userInfo, host: core.String._check(host), port: core.int._check(port), pathSegments: unencodedPath[dartx.split]("/"), queryParameters: queryParameters});
+  }
+  static file(path, opts) {
+    let windows = opts && 'windows' in opts ? opts.windows : null;
+    windows = windows == null ? core.Uri._isWindows : windows;
+    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
+  }
+  static directory(path, opts) {
+    let windows = opts && 'windows' in opts ? opts.windows : null;
+    windows = windows == null ? core.Uri._isWindows : windows;
+    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
+  }
+  static dataFromString(content, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let base64 = opts && 'base64' in opts ? opts.base64 : false;
+    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
+    return data.uri;
+  }
+  static dataFromBytes(bytes, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
+    return data.uri;
+  }
+  static get base() {
+    let uri = _js_helper.Primitives.currentUri();
+    if (uri != null) return core.Uri.parse(uri);
+    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+  }
+  static get _isWindows() {
+    return false;
+  }
+  static _checkNonWindowsPathReservedCharacters(segments, argumentError) {
+    segments[dartx.forEach](dart.fn(segment => {
+      if (dart.test(segment[dartx.contains]("/"))) {
+        if (dart.test(argumentError)) {
+          dart.throw(new core.ArgumentError(dart.str`Illegal path character ${segment}`));
         } else {
-          path = path[dartx.substring](4);
-          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
-            dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
-          }
+          dart.throw(new core.UnsupportedError(dart.str`Illegal path character ${segment}`));
         }
-      } else {
-        path = path[dartx.replaceAll]("/", '\\');
       }
-      let sep = '\\';
-      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
-        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
-          dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
+    }, StringToNull()));
+  }
+  static _checkWindowsPathReservedCharacters(segments, argumentError, firstSegment) {
+    if (firstSegment === void 0) firstSegment = 0;
+    for (let segment of segments[dartx.skip](firstSegment)) {
+      if (dart.test(segment[dartx.contains](core.RegExp.new('["*/:<>?\\\\|]')))) {
+        if (dart.test(argumentError)) {
+          dart.throw(new core.ArgumentError("Illegal character in path"));
+        } else {
+          dart.throw(new core.UnsupportedError("Illegal character in path"));
         }
+      }
+    }
+  }
+  static _checkWindowsDriveLetter(charCode, argumentError) {
+    if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
+      return;
+    }
+    if (dart.test(argumentError)) {
+      dart.throw(new core.ArgumentError("Illegal drive letter " + core.String.fromCharCode(charCode)));
+    } else {
+      dart.throw(new core.UnsupportedError("Illegal drive letter " + core.String.fromCharCode(charCode)));
+    }
+  }
+  static _makeFileUri(path, slashTerminated) {
+    let sep = "/";
+    let segments = path[dartx.split](sep);
+    if (dart.test(slashTerminated) && dart.test(segments[dartx.isNotEmpty]) && dart.test(segments[dartx.last][dartx.isNotEmpty])) {
+      segments[dartx.add]("");
+    }
+    if (dart.test(path[dartx.startsWith](sep))) {
+      return core.Uri.new({scheme: "file", pathSegments: segments});
+    } else {
+      return core.Uri.new({pathSegments: segments});
+    }
+  }
+  static _makeWindowsFileUrl(path, slashTerminated) {
+    if (dart.test(path[dartx.startsWith]("\\\\?\\"))) {
+      if (dart.test(path[dartx.startsWith]("UNC\\", 4))) {
+        path = path[dartx.replaceRange](0, 7, '\\');
+      } else {
+        path = path[dartx.substring](4);
+        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+          dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
+        }
+      }
+    } else {
+      path = path[dartx.replaceAll]("/", '\\');
+    }
+    let sep = '\\';
+    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
+      core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
+      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+        dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
+      }
+      let pathSegments = path[dartx.split](sep);
+      if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
+        pathSegments[dartx.add]("");
+      }
+      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+      return core.Uri.new({scheme: "file", pathSegments: pathSegments});
+    }
+    if (dart.test(path[dartx.startsWith](sep))) {
+      if (dart.test(path[dartx.startsWith](sep, 1))) {
+        let pathStart = path[dartx.indexOf]('\\', 2);
+        let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
+        let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
+        let pathSegments = pathPart[dartx.split](sep);
+        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
+          pathSegments[dartx.add]("");
+        }
+        return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
+      } else {
         let pathSegments = path[dartx.split](sep);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         return core.Uri.new({scheme: "file", pathSegments: pathSegments});
       }
-      if (dart.test(path[dartx.startsWith](sep))) {
-        if (dart.test(path[dartx.startsWith](sep, 1))) {
-          let pathStart = path[dartx.indexOf]('\\', 2);
-          let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
-          let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
-          let pathSegments = pathPart[dartx.split](sep);
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
-          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
-            pathSegments[dartx.add]("");
-          }
-          return core.Uri.new({scheme: "file", host: hostPart, pathSegments: pathSegments});
-        } else {
-          let pathSegments = path[dartx.split](sep);
-          if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
-            pathSegments[dartx.add]("");
-          }
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
-          return core.Uri.new({scheme: "file", pathSegments: pathSegments});
-        }
-      } else {
-        let pathSegments = path[dartx.split](sep);
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
-        if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
-          pathSegments[dartx.add]("");
-        }
-        return core.Uri.new({pathSegments: pathSegments});
+    } else {
+      let pathSegments = path[dartx.split](sep);
+      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+      if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
+        pathSegments[dartx.add]("");
       }
+      return core.Uri.new({pathSegments: pathSegments});
     }
-    replace(opts) {
-      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
-      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
-      let host = opts && 'host' in opts ? opts.host : null;
-      let port = opts && 'port' in opts ? opts.port : null;
-      let path = opts && 'path' in opts ? opts.path : null;
-      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
-      let query = opts && 'query' in opts ? opts.query : null;
-      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
-      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-      let schemeChanged = false;
-      if (scheme != null) {
-        scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
-        schemeChanged = true;
-      } else {
-        scheme = this.scheme;
-      }
-      let isFile = scheme == "file";
-      if (userInfo != null) {
-        userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
-      } else {
-        userInfo = this[_userInfo];
-      }
-      if (port != null) {
+  }
+  replace(opts) {
+    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
+    let host = opts && 'host' in opts ? opts.host : null;
+    let port = opts && 'port' in opts ? opts.port : null;
+    let path = opts && 'path' in opts ? opts.path : null;
+    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+    let query = opts && 'query' in opts ? opts.query : null;
+    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+    let schemeChanged = false;
+    if (scheme != null) {
+      scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+      schemeChanged = true;
+    } else {
+      scheme = this.scheme;
+    }
+    let isFile = scheme == "file";
+    if (userInfo != null) {
+      userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+    } else {
+      userInfo = this[_userInfo];
+    }
+    if (port != null) {
+      port = core.Uri._makePort(port, scheme);
+    } else {
+      port = this[_port];
+      if (schemeChanged) {
         port = core.Uri._makePort(port, scheme);
-      } else {
-        port = this[_port];
-        if (schemeChanged) {
-          port = core.Uri._makePort(port, scheme);
+      }
+    }
+    if (host != null) {
+      host = core.Uri._makeHost(host, 0, host[dartx.length], false);
+    } else if (dart.test(this.hasAuthority)) {
+      host = this[_host];
+    } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
+      host = "";
+    }
+    let hasAuthority = host != null;
+    if (path != null || pathSegments != null) {
+      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    } else {
+      path = this[_path];
+      if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
+        path = "/" + dart.notNull(path);
+      }
+    }
+    if (query != null || queryParameters != null) {
+      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+    } else {
+      query = this[_query];
+    }
+    if (fragment != null) {
+      fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+    } else {
+      fragment = this[_fragment];
+    }
+    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
+  removeFragment() {
+    if (!dart.test(this.hasFragment)) return this;
+    return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
+  }
+  get pathSegments() {
+    let result = this[_pathSegments];
+    if (result != null) return result;
+    let pathToSplit = this.path;
+    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
+      pathToSplit = pathToSplit[dartx.substring](1);
+    }
+    result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
+    this[_pathSegments] = result;
+    return result;
+  }
+  get queryParameters() {
+    if (this[_queryParameters] == null) {
+      this[_queryParameters] = new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
+    }
+    return this[_queryParameters];
+  }
+  get queryParametersAll() {
+    if (this[_queryParameterLists] == null) {
+      let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
+      for (let key of queryParameterLists[dartx.keys]) {
+        queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+      }
+      this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
+    }
+    return this[_queryParameterLists];
+  }
+  normalizePath() {
+    let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
+    if (core.identical(path, this[_path])) return this;
+    return this.replace({path: path});
+  }
+  static _makePort(port, scheme) {
+    if (port != null && port == core.Uri._defaultPort(scheme)) return null;
+    return port;
+  }
+  static _makeHost(host, start, end, strictIPv6) {
+    if (host == null) return null;
+    if (start == end) return "";
+    if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
+      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
+        core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+      }
+      core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
+      return host[dartx.substring](start, end)[dartx.toLowerCase]();
+    }
+    if (!dart.test(strictIPv6)) {
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+          core.Uri.parseIPv6Address(host, start, end);
+          return dart.str`[${host}]`;
         }
       }
-      if (host != null) {
-        host = core.Uri._makeHost(host, 0, host[dartx.length], false);
-      } else if (dart.test(this.hasAuthority)) {
-        host = this[_host];
-      } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
-        host = "";
-      }
-      let hasAuthority = host != null;
-      if (path != null || pathSegments != null) {
-        path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
-      } else {
-        path = this[_path];
-        if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
-          path = "/" + dart.notNull(path);
+    }
+    return core.Uri._normalizeRegName(host, start, end);
+  }
+  static _isRegNameChar(char) {
+    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+  }
+  static _normalizeRegName(host, start, end) {
+    let buffer = null;
+    let sectionStart = start;
+    let index = start;
+    let isNormalized = true;
+    while (dart.notNull(index) < dart.notNull(end)) {
+      let char = host[dartx.codeUnitAt](index);
+      if (char == core.Uri._PERCENT) {
+        let replacement = core.Uri._normalizeEscape(host, index, true);
+        if (replacement == null && isNormalized) {
+          index = dart.notNull(index) + 3;
+          continue;
         }
-      }
-      if (query != null || queryParameters != null) {
-        query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-      } else {
-        query = this[_query];
-      }
-      if (fragment != null) {
-        fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
-      } else {
-        fragment = this[_fragment];
-      }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
-    }
-    removeFragment() {
-      if (!dart.test(this.hasFragment)) return this;
-      return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
-    }
-    get pathSegments() {
-      let result = this[_pathSegments];
-      if (result != null) return result;
-      let pathToSplit = this.path;
-      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
-        pathToSplit = pathToSplit[dartx.substring](1);
-      }
-      result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
-      this[_pathSegments] = result;
-      return result;
-    }
-    get queryParameters() {
-      if (this[_queryParameters] == null) {
-        this[_queryParameters] = new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
-      }
-      return this[_queryParameters];
-    }
-    get queryParametersAll() {
-      if (this[_queryParameterLists] == null) {
-        let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
-        for (let key of queryParameterLists[dartx.keys]) {
-          queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+        if (buffer == null) buffer = new core.StringBuffer();
+        let slice = host[dartx.substring](sectionStart, index);
+        if (!isNormalized) slice = slice[dartx.toLowerCase]();
+        buffer.write(slice);
+        let sourceLength = 3;
+        if (replacement == null) {
+          replacement = host[dartx.substring](index, dart.notNull(index) + 3);
+        } else if (replacement == "%") {
+          replacement = "%25";
+          sourceLength = 1;
         }
-        this[_queryParameterLists] = MapOfString$ListOfString().unmodifiable(queryParameterLists);
-      }
-      return this[_queryParameterLists];
-    }
-    normalizePath() {
-      let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
-      if (core.identical(path, this[_path])) return this;
-      return this.replace({path: path});
-    }
-    static _makePort(port, scheme) {
-      if (port != null && port == core.Uri._defaultPort(scheme)) return null;
-      return port;
-    }
-    static _makeHost(host, start, end, strictIPv6) {
-      if (host == null) return null;
-      if (start == end) return "";
-      if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
-        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
-          core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+        buffer.write(replacement);
+        index = dart.notNull(index) + sourceLength;
+        sectionStart = index;
+        isNormalized = true;
+      } else if (dart.test(core.Uri._isRegNameChar(char))) {
+        if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
+          if (buffer == null) buffer = new core.StringBuffer();
+          if (dart.notNull(sectionStart) < dart.notNull(index)) {
+            buffer.write(host[dartx.substring](sectionStart, index));
+            sectionStart = index;
+          }
+          isNormalized = false;
         }
-        core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
-        return host[dartx.substring](start, end)[dartx.toLowerCase]();
-      }
-      if (!dart.test(strictIPv6)) {
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-            core.Uri.parseIPv6Address(host, start, end);
-            return dart.str`[${host}]`;
+        index = dart.notNull(index) + 1;
+      } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
+        core.Uri._fail(host, index, "Invalid character");
+      } else {
+        let sourceLength = 1;
+        if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
+          let tail = host[dartx.codeUnitAt](dart.notNull(index) + 1);
+          if ((dart.notNull(tail) & 64512) == 56320) {
+            char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
+            sourceLength = 2;
           }
         }
+        if (buffer == null) buffer = new core.StringBuffer();
+        let slice = host[dartx.substring](sectionStart, index);
+        if (!isNormalized) slice = slice[dartx.toLowerCase]();
+        buffer.write(slice);
+        buffer.write(core.Uri._escapeChar(char));
+        index = dart.notNull(index) + sourceLength;
+        sectionStart = index;
       }
-      return core.Uri._normalizeRegName(host, start, end);
     }
-    static _isRegNameChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+    if (buffer == null) return host[dartx.substring](start, end);
+    if (dart.notNull(sectionStart) < dart.notNull(end)) {
+      let slice = host[dartx.substring](sectionStart, end);
+      if (!isNormalized) slice = slice[dartx.toLowerCase]();
+      buffer.write(slice);
     }
-    static _normalizeRegName(host, start, end) {
-      let buffer = null;
-      let sectionStart = start;
-      let index = start;
-      let isNormalized = true;
-      while (dart.notNull(index) < dart.notNull(end)) {
-        let char = host[dartx.codeUnitAt](index);
+    return dart.toString(buffer);
+  }
+  static _makeScheme(scheme, start, end) {
+    if (start == end) return "";
+    let firstCodeUnit = scheme[dartx.codeUnitAt](start);
+    if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
+      core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
+    }
+    let containsUpperCase = false;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let codeUnit = scheme[dartx.codeUnitAt](i);
+      if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
+        core.Uri._fail(scheme, i, "Illegal scheme character");
+      }
+      if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
+        containsUpperCase = true;
+      }
+    }
+    scheme = scheme[dartx.substring](start, end);
+    if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
+    return scheme;
+  }
+  static _makeUserInfo(userInfo, start, end) {
+    if (userInfo == null) return "";
+    return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+  }
+  static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
+    let isFile = scheme == "file";
+    let ensureLeadingSlash = isFile || dart.test(hasAuthority);
+    if (path == null && pathSegments == null) return isFile ? "/" : "";
+    if (path != null && pathSegments != null) {
+      dart.throw(new core.ArgumentError('Both path and pathSegments specified'));
+    }
+    let result = null;
+    if (path != null) {
+      result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
+    } else {
+      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
+    }
+    if (dart.test(dart.dload(result, 'isEmpty'))) {
+      if (isFile) return "/";
+    } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
+      result = "/" + dart.notNull(core.String._check(result));
+    }
+    result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
+    return core.String._check(result);
+  }
+  static _normalizePath(path, scheme, hasAuthority) {
+    if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
+      return core.Uri._normalizeRelativePath(path);
+    }
+    return core.Uri._removeDotSegments(path);
+  }
+  static _makeQuery(query, start, end, queryParameters) {
+    if (query == null && queryParameters == null) return null;
+    if (query != null && queryParameters != null) {
+      dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+    }
+    if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
+    let result = new core.StringBuffer();
+    let separator = "";
+    function writeParameter(key, value) {
+      result.write(separator);
+      separator = "&";
+      result.write(core.Uri.encodeQueryComponent(key));
+      if (value != null && dart.test(value[dartx.isNotEmpty])) {
+        result.write("=");
+        result.write(core.Uri.encodeQueryComponent(value));
+      }
+    }
+    dart.fn(writeParameter, StringAndStringTovoid$());
+    queryParameters[dartx.forEach](dart.fn((key, value) => {
+      if (value == null || typeof value == 'string') {
+        writeParameter(key, core.String._check(value));
+      } else {
+        let values = core.Iterable._check(value);
+        for (let value of values) {
+          core.String._check(value);
+          writeParameter(key, value);
+        }
+      }
+    }, StringAnddynamicToNull()));
+    return result.toString();
+  }
+  static _makeFragment(fragment, start, end) {
+    if (fragment == null) return null;
+    return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
+  }
+  static _stringOrNullLength(s) {
+    return s == null ? 0 : s[dartx.length];
+  }
+  static _normalizeEscape(source, index, lowerCase) {
+    dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
+    if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
+      return "%";
+    }
+    let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
+    let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
+    let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
+    let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
+    if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
+      return "%";
+    }
+    let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
+    if (dart.test(core.Uri._isUnreservedChar(value))) {
+      if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
+        value = (value | 32) >>> 0;
+      }
+      return core.String.fromCharCode(value);
+    }
+    if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
+      return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
+    }
+    return null;
+  }
+  static _parseHexDigit(char) {
+    let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
+    if (digit <= 9) return digit;
+    let lowerCase = (dart.notNull(char) | 32) >>> 0;
+    if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
+      return lowerCase - (core.Uri._LOWER_CASE_A - 10);
+    }
+    return -1;
+  }
+  static _escapeChar(char) {
+    dart.assert(dart.notNull(char) <= 1114111);
+    let codeUnits = null;
+    if (dart.notNull(char) < 128) {
+      codeUnits = ListOfint().new(3);
+      codeUnits[dartx._set](0, core.Uri._PERCENT);
+      codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
+      codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
+    } else {
+      let flag = 192;
+      let encodedBytes = 2;
+      if (dart.notNull(char) > 2047) {
+        flag = 224;
+        encodedBytes = 3;
+        if (dart.notNull(char) > 65535) {
+          encodedBytes = 4;
+          flag = 240;
+        }
+      }
+      codeUnits = ListOfint().new(3 * encodedBytes);
+      let index = 0;
+      while (--encodedBytes >= 0) {
+        let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
+        codeUnits[dartx._set](index, core.Uri._PERCENT);
+        codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
+        index = index + 3;
+        flag = 128;
+      }
+    }
+    return core.String.fromCharCodes(codeUnits);
+  }
+  static _normalize(component, start, end, charTable) {
+    let buffer = null;
+    let sectionStart = start;
+    let index = start;
+    while (dart.notNull(index) < dart.notNull(end)) {
+      let char = component[dartx.codeUnitAt](index);
+      if (dart.notNull(char) < 127 && (dart.notNull(charTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0) {
+        index = dart.notNull(index) + 1;
+      } else {
+        let replacement = null;
+        let sourceLength = null;
         if (char == core.Uri._PERCENT) {
-          let replacement = core.Uri._normalizeEscape(host, index, true);
-          if (replacement == null && isNormalized) {
+          replacement = core.Uri._normalizeEscape(component, index, false);
+          if (replacement == null) {
             index = dart.notNull(index) + 3;
             continue;
           }
-          if (buffer == null) buffer = new core.StringBuffer();
-          let slice = host[dartx.substring](sectionStart, index);
-          if (!isNormalized) slice = slice[dartx.toLowerCase]();
-          buffer.write(slice);
-          let sourceLength = 3;
-          if (replacement == null) {
-            replacement = host[dartx.substring](index, dart.notNull(index) + 3);
-          } else if (replacement == "%") {
+          if ("%" == replacement) {
             replacement = "%25";
             sourceLength = 1;
+          } else {
+            sourceLength = 3;
           }
-          buffer.write(replacement);
-          index = dart.notNull(index) + sourceLength;
-          sectionStart = index;
-          isNormalized = true;
-        } else if (dart.test(core.Uri._isRegNameChar(char))) {
-          if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
-            if (buffer == null) buffer = new core.StringBuffer();
-            if (dart.notNull(sectionStart) < dart.notNull(index)) {
-              buffer.write(host[dartx.substring](sectionStart, index));
-              sectionStart = index;
-            }
-            isNormalized = false;
-          }
-          index = dart.notNull(index) + 1;
         } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-          core.Uri._fail(host, index, "Invalid character");
+          core.Uri._fail(component, index, "Invalid character");
         } else {
-          let sourceLength = 1;
-          if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
-            let tail = host[dartx.codeUnitAt](dart.notNull(index) + 1);
-            if ((dart.notNull(tail) & 64512) == 56320) {
-              char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
-              sourceLength = 2;
+          sourceLength = 1;
+          if ((dart.notNull(char) & 64512) == 55296) {
+            if (dart.notNull(index) + 1 < dart.notNull(end)) {
+              let tail = component[dartx.codeUnitAt](dart.notNull(index) + 1);
+              if ((dart.notNull(tail) & 64512) == 56320) {
+                sourceLength = 2;
+                char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
+              }
             }
           }
-          if (buffer == null) buffer = new core.StringBuffer();
-          let slice = host[dartx.substring](sectionStart, index);
-          if (!isNormalized) slice = slice[dartx.toLowerCase]();
-          buffer.write(slice);
-          buffer.write(core.Uri._escapeChar(char));
-          index = dart.notNull(index) + sourceLength;
-          sectionStart = index;
+          replacement = core.Uri._escapeChar(char);
         }
+        if (buffer == null) buffer = new core.StringBuffer();
+        buffer.write(component[dartx.substring](sectionStart, index));
+        buffer.write(replacement);
+        index = dart.notNull(index) + dart.notNull(sourceLength);
+        sectionStart = index;
       }
-      if (buffer == null) return host[dartx.substring](start, end);
-      if (dart.notNull(sectionStart) < dart.notNull(end)) {
-        let slice = host[dartx.substring](sectionStart, end);
-        if (!isNormalized) slice = slice[dartx.toLowerCase]();
-        buffer.write(slice);
-      }
-      return dart.toString(buffer);
     }
-    static _makeScheme(scheme, start, end) {
-      if (start == end) return "";
-      let firstCodeUnit = scheme[dartx.codeUnitAt](start);
-      if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
-        core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
-      }
-      let containsUpperCase = false;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let codeUnit = scheme[dartx.codeUnitAt](i);
-        if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
-          core.Uri._fail(scheme, i, "Illegal scheme character");
-        }
-        if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
-          containsUpperCase = true;
-        }
-      }
-      scheme = scheme[dartx.substring](start, end);
-      if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
-      return scheme;
+    if (buffer == null) {
+      return component[dartx.substring](start, end);
     }
-    static _makeUserInfo(userInfo, start, end) {
-      if (userInfo == null) return "";
-      return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+    if (dart.notNull(sectionStart) < dart.notNull(end)) {
+      buffer.write(component[dartx.substring](sectionStart, end));
     }
-    static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
-      let isFile = scheme == "file";
-      let ensureLeadingSlash = isFile || dart.test(hasAuthority);
-      if (path == null && pathSegments == null) return isFile ? "/" : "";
-      if (path != null && pathSegments != null) {
-        dart.throw(new core.ArgumentError('Both path and pathSegments specified'));
-      }
-      let result = null;
-      if (path != null) {
-        result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
-      } else {
-        result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
-      }
-      if (dart.test(dart.dload(result, 'isEmpty'))) {
-        if (isFile) return "/";
-      } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
-        result = "/" + dart.notNull(core.String._check(result));
-      }
-      result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
-      return core.String._check(result);
+    return dart.toString(buffer);
+  }
+  static _isSchemeCharacter(ch) {
+    return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+  }
+  static _isGeneralDelimiter(ch) {
+    return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+  }
+  get isAbsolute() {
+    return this.scheme != "" && this.fragment == "";
+  }
+  [_mergePaths](base, reference) {
+    let backCount = 0;
+    let refStart = 0;
+    while (dart.test(reference[dartx.startsWith]("../", refStart))) {
+      refStart = refStart + 3;
+      backCount++;
     }
-    static _normalizePath(path, scheme, hasAuthority) {
-      if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
-        return core.Uri._normalizeRelativePath(path);
+    let baseEnd = base[dartx.lastIndexOf]('/');
+    while (dart.notNull(baseEnd) > 0 && backCount > 0) {
+      let newEnd = base[dartx.lastIndexOf]('/', dart.notNull(baseEnd) - 1);
+      if (dart.notNull(newEnd) < 0) {
+        break;
       }
-      return core.Uri._removeDotSegments(path);
+      let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
+      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
+        break;
+      }
+      baseEnd = newEnd;
+      backCount--;
     }
-    static _makeQuery(query, start, end, queryParameters) {
-      if (query == null && queryParameters == null) return null;
-      if (query != null && queryParameters != null) {
-        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
-      }
-      if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
-      let result = new core.StringBuffer();
-      let separator = "";
-      function writeParameter(key, value) {
-        result.write(separator);
-        separator = "&";
-        result.write(core.Uri.encodeQueryComponent(key));
-        if (value != null && dart.test(value[dartx.isNotEmpty])) {
-          result.write("=");
-          result.write(core.Uri.encodeQueryComponent(value));
-        }
-      }
-      dart.fn(writeParameter, StringAndStringTovoid$());
-      queryParameters[dartx.forEach](dart.fn((key, value) => {
-        if (value == null || typeof value == 'string') {
-          writeParameter(key, core.String._check(value));
-        } else {
-          let values = core.Iterable._check(value);
-          for (let value of values) {
-            core.String._check(value);
-            writeParameter(key, value);
+    return base[dartx.replaceRange](dart.notNull(baseEnd) + 1, null, reference[dartx.substring](refStart - 3 * backCount));
+  }
+  static _mayContainDotSegments(path) {
+    if (dart.test(path[dartx.startsWith]('.'))) return true;
+    let index = path[dartx.indexOf]("/.");
+    return index != -1;
+  }
+  static _removeDotSegments(path) {
+    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    dart.assert(path[dartx.isNotEmpty]);
+    let output = JSArrayOfString().of([]);
+    let appendSlash = false;
+    for (let segment of path[dartx.split]("/")) {
+      appendSlash = false;
+      if (segment == "..") {
+        if (dart.test(output[dartx.isNotEmpty])) {
+          output[dartx.removeLast]();
+          if (dart.test(output[dartx.isEmpty])) {
+            output[dartx.add]("");
           }
         }
-      }, StringAnddynamicToNull()));
-      return result.toString();
-    }
-    static _makeFragment(fragment, start, end) {
-      if (fragment == null) return null;
-      return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
-    }
-    static _stringOrNullLength(s) {
-      return s == null ? 0 : s[dartx.length];
-    }
-    static _normalizeEscape(source, index, lowerCase) {
-      dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
-      if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
-        return "%";
+        appendSlash = true;
+      } else if ("." == segment) {
+        appendSlash = true;
+      } else {
+        output[dartx.add](segment);
       }
-      let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
-      let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
-      let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
-      let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
-      if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
-        return "%";
-      }
-      let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
-      if (dart.test(core.Uri._isUnreservedChar(value))) {
-        if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
-          value = (value | 32) >>> 0;
+    }
+    if (appendSlash) output[dartx.add]("");
+    return output[dartx.join]("/");
+  }
+  static _normalizeRelativePath(path) {
+    dart.assert(!dart.test(path[dartx.startsWith]('/')));
+    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    dart.assert(path[dartx.isNotEmpty]);
+    let output = JSArrayOfString().of([]);
+    let appendSlash = false;
+    for (let segment of path[dartx.split]("/")) {
+      appendSlash = false;
+      if (".." == segment) {
+        if (!dart.test(output[dartx.isEmpty]) && output[dartx.last] != "..") {
+          output[dartx.removeLast]();
+          appendSlash = true;
+        } else {
+          output[dartx.add]("..");
         }
-        return core.String.fromCharCode(value);
+      } else if ("." == segment) {
+        appendSlash = true;
+      } else {
+        output[dartx.add](segment);
       }
-      if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
-        return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
-      }
-      return null;
     }
-    static _parseHexDigit(char) {
-      let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
-      if (digit <= 9) return digit;
-      let lowerCase = (dart.notNull(char) | 32) >>> 0;
-      if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
-        return lowerCase - (core.Uri._LOWER_CASE_A - 10);
+    if (dart.test(output[dartx.isEmpty]) || output[dartx.length] == 1 && dart.test(output[dartx._get](0)[dartx.isEmpty])) {
+      return "./";
+    }
+    if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
+    return output[dartx.join]("/");
+  }
+  resolve(reference) {
+    return this.resolveUri(core.Uri.parse(reference));
+  }
+  resolveUri(reference) {
+    let targetScheme = null;
+    let targetUserInfo = "";
+    let targetHost = null;
+    let targetPort = null;
+    let targetPath = null;
+    let targetQuery = null;
+    if (dart.test(reference.scheme[dartx.isNotEmpty])) {
+      targetScheme = reference.scheme;
+      if (dart.test(reference.hasAuthority)) {
+        targetUserInfo = reference.userInfo;
+        targetHost = reference.host;
+        targetPort = dart.test(reference.hasPort) ? reference.port : null;
+      }
+      targetPath = core.Uri._removeDotSegments(reference.path);
+      if (dart.test(reference.hasQuery)) {
+        targetQuery = reference.query;
+      }
+    } else {
+      targetScheme = this.scheme;
+      if (dart.test(reference.hasAuthority)) {
+        targetUserInfo = reference.userInfo;
+        targetHost = reference.host;
+        targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
+        targetPath = core.Uri._removeDotSegments(reference.path);
+        if (dart.test(reference.hasQuery)) targetQuery = reference.query;
+      } else {
+        targetUserInfo = this[_userInfo];
+        targetHost = this[_host];
+        targetPort = this[_port];
+        if (reference.path == "") {
+          targetPath = this[_path];
+          if (dart.test(reference.hasQuery)) {
+            targetQuery = reference.query;
+          } else {
+            targetQuery = this[_query];
+          }
+        } else {
+          if (dart.test(reference.hasAbsolutePath)) {
+            targetPath = core.Uri._removeDotSegments(reference.path);
+          } else {
+            if (dart.test(this.hasEmptyPath)) {
+              if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
+                targetPath = reference.path;
+              } else {
+                targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
+              }
+            } else {
+              let mergedPath = this[_mergePaths](this[_path], reference.path);
+              if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
+                targetPath = core.Uri._removeDotSegments(mergedPath);
+              } else {
+                targetPath = core.Uri._normalizeRelativePath(mergedPath);
+              }
+            }
+          }
+          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
+        }
+      }
+    }
+    let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
+    return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
+  }
+  get hasScheme() {
+    return this.scheme[dartx.isNotEmpty];
+  }
+  get hasAuthority() {
+    return this[_host] != null;
+  }
+  get hasPort() {
+    return this[_port] != null;
+  }
+  get hasQuery() {
+    return this[_query] != null;
+  }
+  get hasFragment() {
+    return this[_fragment] != null;
+  }
+  get hasEmptyPath() {
+    return this[_path][dartx.isEmpty];
+  }
+  get hasAbsolutePath() {
+    return this[_path][dartx.startsWith]('/');
+  }
+  get origin() {
+    if (this.scheme == "" || this[_host] == null || this[_host] == "") {
+      dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
+    }
+    if (this.scheme != "http" && this.scheme != "https") {
+      dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
+    }
+    if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
+    return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
+  }
+  toFilePath(opts) {
+    let windows = opts && 'windows' in opts ? opts.windows : null;
+    if (this.scheme != "" && this.scheme != "file") {
+      dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
+    }
+    if (this.query != "") {
+      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
+    }
+    if (this.fragment != "") {
+      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
+    }
+    if (windows == null) windows = core.Uri._isWindows;
+    return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
+  }
+  [_toFilePath]() {
+    if (this.host != "") {
+      dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
+    }
+    core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
+    let result = new core.StringBuffer();
+    if (dart.test(this[_isPathAbsolute])) result.write("/");
+    result.writeAll(this.pathSegments, "/");
+    return result.toString();
+  }
+  [_toWindowsFilePath]() {
+    let hasDriveLetter = false;
+    let segments = this.pathSegments;
+    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
+      core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
+      core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
+      hasDriveLetter = true;
+    } else {
+      core.Uri._checkWindowsPathReservedCharacters(segments, false);
+    }
+    let result = new core.StringBuffer();
+    if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
+    if (this.host != "") {
+      result.write("\\");
+      result.write(this.host);
+      result.write("\\");
+    }
+    result.writeAll(segments, "\\");
+    if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
+    return result.toString();
+  }
+  get [_isPathAbsolute]() {
+    if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
+    return this.path[dartx.startsWith]('/');
+  }
+  [_writeAuthority](ss) {
+    if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
+      ss.write(this[_userInfo]);
+      ss.write("@");
+    }
+    if (this[_host] != null) ss.write(this[_host]);
+    if (this[_port] != null) {
+      ss.write(":");
+      ss.write(this[_port]);
+    }
+  }
+  get data() {
+    return this.scheme == "data" ? core.UriData.fromUri(this) : null;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
+    if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
+      sb.write("//");
+      this[_writeAuthority](sb);
+    }
+    sb.write(this.path);
+    if (this[_query] != null) {
+      sb.write("?");
+      sb.write(this[_query]);
+    }
+    if (this[_fragment] != null) {
+      sb.write("#");
+      sb.write(this[_fragment]);
+    }
+    return sb.toString();
+  }
+  ['=='](other) {
+    if (!core.Uri.is(other)) return false;
+    let uri = core.Uri._check(other);
+    return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+  }
+  get hashCode() {
+    function combine(part, current) {
+      return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
+    }
+    dart.fn(combine, dynamicAnddynamicToint());
+    return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
+  }
+  static _addIfNonEmpty(sb, test, first, second) {
+    if ("" != test) {
+      sb.write(first);
+      sb.write(second);
+    }
+  }
+  static encodeComponent(component) {
+    return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
+  }
+  static encodeQueryComponent(component, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
+  }
+  static decodeComponent(encodedComponent) {
+    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
+  }
+  static decodeQueryComponent(encodedComponent, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
+  }
+  static encodeFull(uri) {
+    return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
+  }
+  static decodeFull(uri) {
+    return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
+  }
+  static splitQueryString(query, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
+      let index = element[dartx.indexOf]("=");
+      if (index == -1) {
+        if (element != "") {
+          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
+        }
+      } else if (index != 0) {
+        let key = element[dartx.substring](0, index);
+        let value = element[dartx.substring](dart.notNull(index) + 1);
+        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
+      }
+      return map;
+    }, MapOfString$StringAndStringToMapOfString$String()));
+  }
+  static _createList() {
+    return [];
+  }
+  static _splitQueryStringAll(query, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    let result = dart.map();
+    let i = 0;
+    let start = 0;
+    let equalsIndex = -1;
+    function parsePair(start, equalsIndex, end) {
+      let key = null;
+      let value = null;
+      if (start == end) return;
+      if (dart.notNull(equalsIndex) < 0) {
+        key = core.Uri._uriDecode(query, start, end, encoding, true);
+        value = "";
+      } else {
+        key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
+        value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
+      }
+      dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
+    }
+    dart.fn(parsePair, intAndintAndintTovoid());
+    let _equals = 61;
+    let _ampersand = 38;
+    while (i < dart.notNull(query[dartx.length])) {
+      let char = query[dartx.codeUnitAt](i);
+      if (char == _equals) {
+        if (equalsIndex < 0) equalsIndex = i;
+      } else if (char == _ampersand) {
+        parsePair(start, equalsIndex, i);
+        start = i + 1;
+        equalsIndex = -1;
+      }
+      i++;
+    }
+    parsePair(start, equalsIndex, i);
+    return result;
+  }
+  static parseIPv4Address(host) {
+    function error(msg) {
+      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
+    }
+    dart.fn(error, StringTovoid$());
+    let bytes = host[dartx.split]('.');
+    if (bytes[dartx.length] != 4) {
+      error('IPv4 address should contain exactly 4 parts');
+    }
+    return bytes[dartx.map](core.int)(dart.fn(byteString => {
+      let byte = core.int.parse(byteString);
+      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
+        error('each part must be in the range of `0..255`');
+      }
+      return byte;
+    }, StringToint$()))[dartx.toList]();
+  }
+  static parseIPv6Address(host, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (end == null) end = host[dartx.length];
+    function error(msg, position) {
+      if (position === void 0) position = null;
+      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
+    }
+    dart.fn(error, String__Tovoid());
+    function parseHex(start, end) {
+      if (dart.notNull(end) - dart.notNull(start) > 4) {
+        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
+      }
+      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
+      if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
+        error('each part must be in the range of `0x0..0xFFFF`', start);
+      }
+      return value;
+    }
+    dart.fn(parseHex, intAndintToint());
+    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
+    let parts = JSArrayOfint().of([]);
+    let wildcardSeen = false;
+    let partStart = start;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+        if (i == start) {
+          i = dart.notNull(i) + 1;
+          if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
+            error('invalid start colon.', i);
+          }
+          partStart = i;
+        }
+        if (i == partStart) {
+          if (wildcardSeen) {
+            error('only one wildcard `::` is allowed', i);
+          }
+          wildcardSeen = true;
+          parts[dartx.add](-1);
+        } else {
+          parts[dartx.add](parseHex(partStart, i));
+        }
+        partStart = dart.notNull(i) + 1;
+      }
+    }
+    if (parts[dartx.length] == 0) error('too few parts');
+    let atEnd = partStart == end;
+    let isLastWildcard = parts[dartx.last] == -1;
+    if (atEnd && !isLastWildcard) {
+      error('expected a part after last `:`', end);
+    }
+    if (!atEnd) {
+      try {
+        parts[dartx.add](parseHex(partStart, end));
+      } catch (e) {
+        try {
+          let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
+          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
+          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
+        } catch (e) {
+          error('invalid end of IPv6 address.', partStart);
+        }
+
+      }
+
+    }
+    if (wildcardSeen) {
+      if (dart.notNull(parts[dartx.length]) > 7) {
+        error('an address with a wildcard must have less than 7 parts');
+      }
+    } else if (parts[dartx.length] != 8) {
+      error('an address without a wildcard must contain exactly 8 parts');
+    }
+    let bytes = typed_data.Uint8List.new(16);
+    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
+      let value = parts[dartx._get](i);
+      if (value == -1) {
+        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
+        for (let j = 0; j < wildCardLength; j++) {
+          bytes[dartx._set](index, 0);
+          bytes[dartx._set](index + 1, 0);
+          index = index + 2;
+        }
+      } else {
+        bytes[dartx._set](index, value[dartx['>>']](8));
+        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
+        index = index + 2;
+      }
+    }
+    return bytes;
+  }
+  static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
+    if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
+      return text;
+    }
+    let result = new core.StringBuffer();
+    let bytes = encoding.encode(text);
+    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
+      let byte = bytes[dartx._get](i);
+      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
+        result.writeCharCode(byte);
+      } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
+        result.write('+');
+      } else {
+        let hexDigits = '0123456789ABCDEF';
+        result.write('%');
+        result.write(hexDigits[dartx._get](dart.notNull(byte) >> 4 & 15));
+        result.write(hexDigits[dartx._get](dart.notNull(byte) & 15));
+      }
+    }
+    return result.toString();
+  }
+  static _hexCharPairToByte(s, pos) {
+    let byte = 0;
+    for (let i = 0; i < 2; i++) {
+      let charCode = s[dartx.codeUnitAt](dart.notNull(pos) + i);
+      if (48 <= dart.notNull(charCode) && dart.notNull(charCode) <= 57) {
+        byte = byte * 16 + dart.notNull(charCode) - 48;
+      } else {
+        charCode = (dart.notNull(charCode) | 32) >>> 0;
+        if (97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 102) {
+          byte = byte * 16 + dart.notNull(charCode) - 87;
+        } else {
+          dart.throw(new core.ArgumentError("Invalid URL encoding"));
+        }
+      }
+    }
+    return byte;
+  }
+  static _uriDecode(text, start, end, encoding, plusToSpace) {
+    dart.assert(0 <= dart.notNull(start));
+    dart.assert(dart.notNull(start) <= dart.notNull(end));
+    dart.assert(dart.notNull(end) <= dart.notNull(text[dartx.length]));
+    dart.assert(encoding != null);
+    let simple = true;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let codeUnit = text[dartx.codeUnitAt](i);
+      if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+        simple = false;
+        break;
+      }
+    }
+    let bytes = null;
+    if (simple) {
+      if (dart.equals(convert.UTF8, encoding) || dart.equals(convert.LATIN1, encoding) || dart.equals(convert.ASCII, encoding)) {
+        return text[dartx.substring](start, end);
+      } else {
+        bytes = text[dartx.substring](start, end)[dartx.codeUnits];
+      }
+    } else {
+      bytes = ListOfint().new();
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let codeUnit = text[dartx.codeUnitAt](i);
+        if (dart.notNull(codeUnit) > 127) {
+          dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
+        }
+        if (codeUnit == core.Uri._PERCENT) {
+          if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
+            dart.throw(new core.ArgumentError('Truncated URI'));
+          }
+          bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
+          i = dart.notNull(i) + 2;
+        } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+          bytes[dartx.add](core.Uri._SPACE);
+        } else {
+          bytes[dartx.add](codeUnit);
+        }
+      }
+    }
+    return encoding.decode(bytes);
+  }
+  static _isAlphabeticCharacter(codeUnit) {
+    let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
+    return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
+  }
+  static _isUnreservedChar(char) {
+    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+  }
+};
+dart.defineNamedConstructor(core.Uri, '_internal');
+dart.setSignature(core.Uri, {
+  constructors: () => ({
+    _internal: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, core.int, core.String, core.String, core.String]),
+    new: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+    http: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
+    https: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
+    file: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
+    directory: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
+    dataFromString: dart.definiteFunctionType(core.Uri, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
+    dataFromBytes: dart.definiteFunctionType(core.Uri, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic})
+  }),
+  fields: () => ({
+    scheme: core.String,
+    [_userInfo]: core.String,
+    [_host]: core.String,
+    [_port]: core.int,
+    [_path]: core.String,
+    [_query]: core.String,
+    [_fragment]: core.String,
+    [_pathSegments]: ListOfString(),
+    [_queryParameters]: MapOfString$String(),
+    [_queryParameterLists]: MapOfString$ListOfString()
+  }),
+  getters: () => ({
+    authority: dart.definiteFunctionType(core.String, []),
+    userInfo: dart.definiteFunctionType(core.String, []),
+    host: dart.definiteFunctionType(core.String, []),
+    port: dart.definiteFunctionType(core.int, []),
+    path: dart.definiteFunctionType(core.String, []),
+    query: dart.definiteFunctionType(core.String, []),
+    fragment: dart.definiteFunctionType(core.String, []),
+    pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
+    queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
+    isAbsolute: dart.definiteFunctionType(core.bool, []),
+    hasScheme: dart.definiteFunctionType(core.bool, []),
+    hasAuthority: dart.definiteFunctionType(core.bool, []),
+    hasPort: dart.definiteFunctionType(core.bool, []),
+    hasQuery: dart.definiteFunctionType(core.bool, []),
+    hasFragment: dart.definiteFunctionType(core.bool, []),
+    hasEmptyPath: dart.definiteFunctionType(core.bool, []),
+    hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
+    origin: dart.definiteFunctionType(core.String, []),
+    [_isPathAbsolute]: dart.definiteFunctionType(core.bool, []),
+    data: dart.definiteFunctionType(core.UriData, [])
+  }),
+  methods: () => ({
+    replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+    removeFragment: dart.definiteFunctionType(core.Uri, []),
+    normalizePath: dart.definiteFunctionType(core.Uri, []),
+    [_mergePaths]: dart.definiteFunctionType(core.String, [core.String, core.String]),
+    resolve: dart.definiteFunctionType(core.Uri, [core.String]),
+    resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
+    toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
+    [_toFilePath]: dart.definiteFunctionType(core.String, []),
+    [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
+    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
+  }),
+  sfields: () => ({
+    _SPACE: core.int,
+    _DOUBLE_QUOTE: core.int,
+    _NUMBER_SIGN: core.int,
+    _PERCENT: core.int,
+    _ASTERISK: core.int,
+    _PLUS: core.int,
+    _DOT: core.int,
+    _SLASH: core.int,
+    _ZERO: core.int,
+    _NINE: core.int,
+    _COLON: core.int,
+    _LESS: core.int,
+    _GREATER: core.int,
+    _QUESTION: core.int,
+    _AT_SIGN: core.int,
+    _UPPER_CASE_A: core.int,
+    _UPPER_CASE_F: core.int,
+    _UPPER_CASE_Z: core.int,
+    _LEFT_BRACKET: core.int,
+    _BACKSLASH: core.int,
+    _RIGHT_BRACKET: core.int,
+    _LOWER_CASE_A: core.int,
+    _LOWER_CASE_F: core.int,
+    _LOWER_CASE_Z: core.int,
+    _BAR: core.int,
+    _hexDigits: core.String,
+    _unreservedTable: ListOfint(),
+    _unreserved2396Table: ListOfint(),
+    _encodeFullTable: ListOfint(),
+    _schemeTable: ListOfint(),
+    _schemeLowerTable: ListOfint(),
+    _subDelimitersTable: ListOfint(),
+    _genDelimitersTable: ListOfint(),
+    _userinfoTable: ListOfint(),
+    _regNameTable: ListOfint(),
+    _pathCharTable: ListOfint(),
+    _pathCharOrSlashTable: ListOfint(),
+    _queryCharTable: ListOfint(),
+    _needsNoEncoding: core.RegExp
+  }),
+  sgetters: () => ({
+    base: dart.definiteFunctionType(core.Uri, []),
+    _isWindows: dart.definiteFunctionType(core.bool, [])
+  }),
+  statics: () => ({
+    _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
+    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+    _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
+    _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
+    _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
+    _checkWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool], [core.int]),
+    _checkWindowsDriveLetter: dart.definiteFunctionType(dart.dynamic, [core.int, core.bool]),
+    _makeFileUri: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
+    _makeWindowsFileUrl: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
+    _makePort: dart.definiteFunctionType(core.int, [core.int, core.String]),
+    _makeHost: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.bool]),
+    _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
+    _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
+    _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
+    _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
+    _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
+    _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
+    _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
+    _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
+    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+    _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
+    _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
+    _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
+    _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
+    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
+    _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
+    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+    _createList: dart.definiteFunctionType(core.List, []),
+    _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
+    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
+    _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
+    _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
+    _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
+    _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
+    _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
+  }),
+  names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
+});
+core.Uri._SPACE = 32;
+core.Uri._DOUBLE_QUOTE = 34;
+core.Uri._NUMBER_SIGN = 35;
+core.Uri._PERCENT = 37;
+core.Uri._ASTERISK = 42;
+core.Uri._PLUS = 43;
+core.Uri._DOT = 46;
+core.Uri._SLASH = 47;
+core.Uri._ZERO = 48;
+core.Uri._NINE = 57;
+core.Uri._COLON = 58;
+core.Uri._LESS = 60;
+core.Uri._GREATER = 62;
+core.Uri._QUESTION = 63;
+core.Uri._AT_SIGN = 64;
+core.Uri._UPPER_CASE_A = 65;
+core.Uri._UPPER_CASE_F = 70;
+core.Uri._UPPER_CASE_Z = 90;
+core.Uri._LEFT_BRACKET = 91;
+core.Uri._BACKSLASH = 92;
+core.Uri._RIGHT_BRACKET = 93;
+core.Uri._LOWER_CASE_A = 97;
+core.Uri._LOWER_CASE_F = 102;
+core.Uri._LOWER_CASE_Z = 122;
+core.Uri._BAR = 124;
+core.Uri._hexDigits = "0123456789ABCDEF";
+core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
+core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
+core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
+core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
+core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
+core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
+core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
+core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
+core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
+core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
+core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
+core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
+dart.defineLazy(core.Uri, {
+  get _needsNoEncoding() {
+    return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
+  }
+});
+const _text = Symbol('_text');
+const _separatorIndices = Symbol('_separatorIndices');
+const _uriCache = Symbol('_uriCache');
+core.UriData = class UriData extends core.Object {
+  _(text, separatorIndices, uriCache) {
+    this[_text] = text;
+    this[_separatorIndices] = separatorIndices;
+    this[_uriCache] = uriCache;
+  }
+  static fromString(content, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let base64 = opts && 'base64' in opts ? opts.base64 : false;
+    let buffer = new core.StringBuffer();
+    let indices = JSArrayOfint().of([core.UriData._noScheme]);
+    let charsetName = null;
+    let encodingName = null;
+    if (parameters != null) charsetName = parameters[dartx._get]("charset");
+    if (encoding == null) {
+      if (charsetName != null) {
+        encoding = convert.Encoding.getByName(charsetName);
+      }
+    } else if (charsetName == null) {
+      encodingName = encoding.name;
+    }
+    let t = encoding;
+    t == null ? encoding = convert.ASCII : t;
+    core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
+    indices[dartx.add](buffer.length);
+    if (dart.test(base64)) {
+      buffer.write(';base64,');
+      indices[dartx.add](dart.notNull(buffer.length) - 1);
+      buffer.write(encoding.fuse(core.String)(convert.BASE64).encode(content));
+    } else {
+      buffer.write(',');
+      core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
+    }
+    return new core.UriData._(buffer.toString(), indices, null);
+  }
+  static fromBytes(bytes, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+    let buffer = new core.StringBuffer();
+    let indices = JSArrayOfint().of([core.UriData._noScheme]);
+    core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
+    indices[dartx.add](buffer.length);
+    if (dart.test(percentEncoded)) {
+      buffer.write(',');
+      core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
+    } else {
+      buffer.write(';base64,');
+      indices[dartx.add](dart.notNull(buffer.length) - 1);
+      convert.BASE64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[dartx.length], true);
+    }
+    return new core.UriData._(buffer.toString(), indices, null);
+  }
+  static fromUri(uri) {
+    if (uri.scheme != "data") {
+      dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
+    }
+    if (dart.test(uri.hasAuthority)) {
+      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
+    }
+    if (dart.test(uri.hasFragment)) {
+      dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
+    }
+    if (!dart.test(uri.hasQuery)) {
+      return core.UriData._parse(uri.path, 0, uri);
+    }
+    return core.UriData._parse(dart.str`${uri}`, 5, uri);
+  }
+  static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
+    if (mimeType == null || mimeType == "text/plain") {
+      mimeType = "";
+    }
+    if (dart.test(mimeType[dartx.isEmpty]) || core.identical(mimeType, "application/octet-stream")) {
+      buffer.write(mimeType);
+    } else {
+      let slashIndex = core.UriData._validateMimeType(mimeType);
+      if (dart.notNull(slashIndex) < 0) {
+        dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
+      }
+      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
+      buffer.write("/");
+      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
+    }
+    if (charsetName != null) {
+      if (indices != null) {
+        indices[dartx.add](buffer.length);
+        indices[dartx.add](dart.notNull(buffer.length) + 8);
+      }
+      buffer.write(";charset=");
+      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
+    }
+    dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
+      if (dart.test(key[dartx.isEmpty])) {
+        dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
+      }
+      if (dart.test(value[dartx.isEmpty])) {
+        dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", dart.str`parameters["${key}"]`));
+      }
+      if (indices != null) indices[dartx.add](buffer.length);
+      buffer.write(';');
+      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
+      if (indices != null) indices[dartx.add](buffer.length);
+      buffer.write('=');
+      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
+    }, StringAndStringToNull())));
+  }
+  static _validateMimeType(mimeType) {
+    let slashIndex = -1;
+    for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
+      let char = mimeType[dartx.codeUnitAt](i);
+      if (char != core.Uri._SLASH) continue;
+      if (slashIndex < 0) {
+        slashIndex = i;
+        continue;
       }
       return -1;
     }
-    static _escapeChar(char) {
-      dart.assert(dart.notNull(char) <= 1114111);
-      let codeUnits = null;
-      if (dart.notNull(char) < 128) {
-        codeUnits = ListOfint().new(3);
-        codeUnits[dartx._set](0, core.Uri._PERCENT);
-        codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
-        codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
-      } else {
-        let flag = 192;
-        let encodedBytes = 2;
-        if (dart.notNull(char) > 2047) {
-          flag = 224;
-          encodedBytes = 3;
-          if (dart.notNull(char) > 65535) {
-            encodedBytes = 4;
-            flag = 240;
-          }
-        }
-        codeUnits = ListOfint().new(3 * encodedBytes);
-        let index = 0;
-        while (--encodedBytes >= 0) {
-          let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
-          codeUnits[dartx._set](index, core.Uri._PERCENT);
-          codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
-          index = index + 3;
-          flag = 128;
-        }
-      }
-      return core.String.fromCharCodes(codeUnits);
+    return slashIndex;
+  }
+  static parse(uri) {
+    if (!dart.test(uri[dartx.startsWith]("data:"))) {
+      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
     }
-    static _normalize(component, start, end, charTable) {
-      let buffer = null;
-      let sectionStart = start;
-      let index = start;
-      while (dart.notNull(index) < dart.notNull(end)) {
-        let char = component[dartx.codeUnitAt](index);
-        if (dart.notNull(char) < 127 && (dart.notNull(charTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0) {
-          index = dart.notNull(index) + 1;
-        } else {
-          let replacement = null;
-          let sourceLength = null;
-          if (char == core.Uri._PERCENT) {
-            replacement = core.Uri._normalizeEscape(component, index, false);
-            if (replacement == null) {
-              index = dart.notNull(index) + 3;
-              continue;
-            }
-            if ("%" == replacement) {
-              replacement = "%25";
-              sourceLength = 1;
-            } else {
-              sourceLength = 3;
-            }
-          } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-            core.Uri._fail(component, index, "Invalid character");
-          } else {
-            sourceLength = 1;
-            if ((dart.notNull(char) & 64512) == 55296) {
-              if (dart.notNull(index) + 1 < dart.notNull(end)) {
-                let tail = component[dartx.codeUnitAt](dart.notNull(index) + 1);
-                if ((dart.notNull(tail) & 64512) == 56320) {
-                  sourceLength = 2;
-                  char = 65536 | (dart.notNull(char) & 1023) << 10 | dart.notNull(tail) & 1023;
-                }
-              }
-            }
-            replacement = core.Uri._escapeChar(char);
-          }
-          if (buffer == null) buffer = new core.StringBuffer();
-          buffer.write(component[dartx.substring](sectionStart, index));
-          buffer.write(replacement);
-          index = dart.notNull(index) + dart.notNull(sourceLength);
-          sectionStart = index;
-        }
-      }
-      if (buffer == null) {
-        return component[dartx.substring](start, end);
-      }
-      if (dart.notNull(sectionStart) < dart.notNull(end)) {
-        buffer.write(component[dartx.substring](sectionStart, end));
-      }
-      return dart.toString(buffer);
+    return core.UriData._parse(uri, 5, null);
+  }
+  get uri() {
+    if (this[_uriCache] != null) return this[_uriCache];
+    let path = this[_text];
+    let query = null;
+    let colonIndex = this[_separatorIndices][dartx._get](0);
+    let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
+    let end = null;
+    if (dart.notNull(queryIndex) >= 0) {
+      query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
+      end = queryIndex;
     }
-    static _isSchemeCharacter(ch) {
-      return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+    path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
+    this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
+    return this[_uriCache];
+  }
+  get mimeType() {
+    let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
+    let end = this[_separatorIndices][dartx._get](1);
+    if (start == end) return "text/plain";
+    return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
+  }
+  get charset() {
+    let parameterStart = 1;
+    let parameterEnd = dart.notNull(this[_separatorIndices][dartx.length]) - 1;
+    if (dart.test(this.isBase64)) {
+      parameterEnd = parameterEnd - 1;
     }
-    static _isGeneralDelimiter(ch) {
-      return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
-    }
-    get isAbsolute() {
-      return this.scheme != "" && this.fragment == "";
-    }
-    [_mergePaths](base, reference) {
-      let backCount = 0;
-      let refStart = 0;
-      while (dart.test(reference[dartx.startsWith]("../", refStart))) {
-        refStart = refStart + 3;
-        backCount++;
-      }
-      let baseEnd = base[dartx.lastIndexOf]('/');
-      while (dart.notNull(baseEnd) > 0 && backCount > 0) {
-        let newEnd = base[dartx.lastIndexOf]('/', dart.notNull(baseEnd) - 1);
-        if (dart.notNull(newEnd) < 0) {
-          break;
-        }
-        let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
-        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
-          break;
-        }
-        baseEnd = newEnd;
-        backCount--;
-      }
-      return base[dartx.replaceRange](dart.notNull(baseEnd) + 1, null, reference[dartx.substring](refStart - 3 * backCount));
-    }
-    static _mayContainDotSegments(path) {
-      if (dart.test(path[dartx.startsWith]('.'))) return true;
-      let index = path[dartx.indexOf]("/.");
-      return index != -1;
-    }
-    static _removeDotSegments(path) {
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
-      dart.assert(path[dartx.isNotEmpty]);
-      let output = JSArrayOfString().of([]);
-      let appendSlash = false;
-      for (let segment of path[dartx.split]("/")) {
-        appendSlash = false;
-        if (segment == "..") {
-          if (dart.test(output[dartx.isNotEmpty])) {
-            output[dartx.removeLast]();
-            if (dart.test(output[dartx.isEmpty])) {
-              output[dartx.add]("");
-            }
-          }
-          appendSlash = true;
-        } else if ("." == segment) {
-          appendSlash = true;
-        } else {
-          output[dartx.add](segment);
-        }
-      }
-      if (appendSlash) output[dartx.add]("");
-      return output[dartx.join]("/");
-    }
-    static _normalizeRelativePath(path) {
-      dart.assert(!dart.test(path[dartx.startsWith]('/')));
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
-      dart.assert(path[dartx.isNotEmpty]);
-      let output = JSArrayOfString().of([]);
-      let appendSlash = false;
-      for (let segment of path[dartx.split]("/")) {
-        appendSlash = false;
-        if (".." == segment) {
-          if (!dart.test(output[dartx.isEmpty]) && output[dartx.last] != "..") {
-            output[dartx.removeLast]();
-            appendSlash = true;
-          } else {
-            output[dartx.add]("..");
-          }
-        } else if ("." == segment) {
-          appendSlash = true;
-        } else {
-          output[dartx.add](segment);
-        }
-      }
-      if (dart.test(output[dartx.isEmpty]) || output[dartx.length] == 1 && dart.test(output[dartx._get](0)[dartx.isEmpty])) {
-        return "./";
-      }
-      if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
-      return output[dartx.join]("/");
-    }
-    resolve(reference) {
-      return this.resolveUri(core.Uri.parse(reference));
-    }
-    resolveUri(reference) {
-      let targetScheme = null;
-      let targetUserInfo = "";
-      let targetHost = null;
-      let targetPort = null;
-      let targetPath = null;
-      let targetQuery = null;
-      if (dart.test(reference.scheme[dartx.isNotEmpty])) {
-        targetScheme = reference.scheme;
-        if (dart.test(reference.hasAuthority)) {
-          targetUserInfo = reference.userInfo;
-          targetHost = reference.host;
-          targetPort = dart.test(reference.hasPort) ? reference.port : null;
-        }
-        targetPath = core.Uri._removeDotSegments(reference.path);
-        if (dart.test(reference.hasQuery)) {
-          targetQuery = reference.query;
-        }
-      } else {
-        targetScheme = this.scheme;
-        if (dart.test(reference.hasAuthority)) {
-          targetUserInfo = reference.userInfo;
-          targetHost = reference.host;
-          targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
-          targetPath = core.Uri._removeDotSegments(reference.path);
-          if (dart.test(reference.hasQuery)) targetQuery = reference.query;
-        } else {
-          targetUserInfo = this[_userInfo];
-          targetHost = this[_host];
-          targetPort = this[_port];
-          if (reference.path == "") {
-            targetPath = this[_path];
-            if (dart.test(reference.hasQuery)) {
-              targetQuery = reference.query;
-            } else {
-              targetQuery = this[_query];
-            }
-          } else {
-            if (dart.test(reference.hasAbsolutePath)) {
-              targetPath = core.Uri._removeDotSegments(reference.path);
-            } else {
-              if (dart.test(this.hasEmptyPath)) {
-                if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
-                  targetPath = reference.path;
-                } else {
-                  targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
-                }
-              } else {
-                let mergedPath = this[_mergePaths](this[_path], reference.path);
-                if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
-                  targetPath = core.Uri._removeDotSegments(mergedPath);
-                } else {
-                  targetPath = core.Uri._normalizeRelativePath(mergedPath);
-                }
-              }
-            }
-            if (dart.test(reference.hasQuery)) targetQuery = reference.query;
-          }
-        }
-      }
-      let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
-      return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
-    }
-    get hasScheme() {
-      return this.scheme[dartx.isNotEmpty];
-    }
-    get hasAuthority() {
-      return this[_host] != null;
-    }
-    get hasPort() {
-      return this[_port] != null;
-    }
-    get hasQuery() {
-      return this[_query] != null;
-    }
-    get hasFragment() {
-      return this[_fragment] != null;
-    }
-    get hasEmptyPath() {
-      return this[_path][dartx.isEmpty];
-    }
-    get hasAbsolutePath() {
-      return this[_path][dartx.startsWith]('/');
-    }
-    get origin() {
-      if (this.scheme == "" || this[_host] == null || this[_host] == "") {
-        dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
-      }
-      if (this.scheme != "http" && this.scheme != "https") {
-        dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
-      }
-      if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
-      return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
-    }
-    toFilePath(opts) {
-      let windows = opts && 'windows' in opts ? opts.windows : null;
-      if (this.scheme != "" && this.scheme != "file") {
-        dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
-      }
-      if (this.query != "") {
-        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
-      }
-      if (this.fragment != "") {
-        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
-      }
-      if (windows == null) windows = core.Uri._isWindows;
-      return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
-    }
-    [_toFilePath]() {
-      if (this.host != "") {
-        dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
-      }
-      core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
-      let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute])) result.write("/");
-      result.writeAll(this.pathSegments, "/");
-      return result.toString();
-    }
-    [_toWindowsFilePath]() {
-      let hasDriveLetter = false;
-      let segments = this.pathSegments;
-      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
-        core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
-        hasDriveLetter = true;
-      } else {
-        core.Uri._checkWindowsPathReservedCharacters(segments, false);
-      }
-      let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
-      if (this.host != "") {
-        result.write("\\");
-        result.write(this.host);
-        result.write("\\");
-      }
-      result.writeAll(segments, "\\");
-      if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
-      return result.toString();
-    }
-    get [_isPathAbsolute]() {
-      if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
-      return this.path[dartx.startsWith]('/');
-    }
-    [_writeAuthority](ss) {
-      if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
-        ss.write(this[_userInfo]);
-        ss.write("@");
-      }
-      if (this[_host] != null) ss.write(this[_host]);
-      if (this[_port] != null) {
-        ss.write(":");
-        ss.write(this[_port]);
+    for (let i = parameterStart; i < parameterEnd; i = i + 2) {
+      let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
+      let keyEnd = this[_separatorIndices][dartx._get](i + 1);
+      if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
+        return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
       }
     }
-    get data() {
-      return this.scheme == "data" ? core.UriData.fromUri(this) : null;
+    return "US-ASCII";
+  }
+  get isBase64() {
+    return this[_separatorIndices][dartx.length][dartx.isOdd];
+  }
+  get contentText() {
+    return this[_text][dartx.substring](dart.notNull(this[_separatorIndices][dartx.last]) + 1);
+  }
+  contentAsBytes() {
+    let text = this[_text];
+    let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
+    if (dart.test(this.isBase64)) {
+      return convert.BASE64.decoder.convert(text, start);
     }
-    toString() {
-      let sb = new core.StringBuffer();
-      core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
-      if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
-        sb.write("//");
-        this[_writeAuthority](sb);
-      }
-      sb.write(this.path);
-      if (this[_query] != null) {
-        sb.write("?");
-        sb.write(this[_query]);
-      }
-      if (this[_fragment] != null) {
-        sb.write("#");
-        sb.write(this[_fragment]);
-      }
-      return sb.toString();
-    }
-    ['=='](other) {
-      if (!core.Uri.is(other)) return false;
-      let uri = core.Uri._check(other);
-      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
-    }
-    get hashCode() {
-      function combine(part, current) {
-        return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
-      }
-      dart.fn(combine, dynamicAnddynamicToint());
-      return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
-    }
-    static _addIfNonEmpty(sb, test, first, second) {
-      if ("" != test) {
-        sb.write(first);
-        sb.write(second);
+    let percent = 37;
+    let length = dart.notNull(text[dartx.length]) - start;
+    for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
+      let codeUnit = text[dartx.codeUnitAt](i);
+      if (codeUnit == percent) {
+        i = i + 2;
+        length = length - 2;
       }
     }
-    static encodeComponent(component) {
-      return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
-    }
-    static encodeQueryComponent(component, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
-    }
-    static decodeComponent(encodedComponent) {
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
-    }
-    static decodeQueryComponent(encodedComponent, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
-    }
-    static encodeFull(uri) {
-      return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
-    }
-    static decodeFull(uri) {
-      return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
-    }
-    static splitQueryString(query, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
-        let index = element[dartx.indexOf]("=");
-        if (index == -1) {
-          if (element != "") {
-            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
-          }
-        } else if (index != 0) {
-          let key = element[dartx.substring](0, index);
-          let value = element[dartx.substring](dart.notNull(index) + 1);
-          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
-        }
-        return map;
-      }, MapOfString$StringAndStringToMapOfString$String()));
-    }
-    static _createList() {
-      return [];
-    }
-    static _splitQueryStringAll(query, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      let result = dart.map();
-      let i = 0;
-      let start = 0;
-      let equalsIndex = -1;
-      function parsePair(start, equalsIndex, end) {
-        let key = null;
-        let value = null;
-        if (start == end) return;
-        if (dart.notNull(equalsIndex) < 0) {
-          key = core.Uri._uriDecode(query, start, end, encoding, true);
-          value = "";
-        } else {
-          key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
-          value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
-        }
-        dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
-      }
-      dart.fn(parsePair, intAndintAndintTovoid());
-      let _equals = 61;
-      let _ampersand = 38;
-      while (i < dart.notNull(query[dartx.length])) {
-        let char = query[dartx.codeUnitAt](i);
-        if (char == _equals) {
-          if (equalsIndex < 0) equalsIndex = i;
-        } else if (char == _ampersand) {
-          parsePair(start, equalsIndex, i);
-          start = i + 1;
-          equalsIndex = -1;
-        }
-        i++;
-      }
-      parsePair(start, equalsIndex, i);
+    let result = typed_data.Uint8List.new(length);
+    if (length == text[dartx.length]) {
+      result[dartx.setRange](0, length, text[dartx.codeUnits], start);
       return result;
     }
-    static parseIPv4Address(host) {
-      function error(msg) {
-        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
-      }
-      dart.fn(error, StringTovoid$());
-      let bytes = host[dartx.split]('.');
-      if (bytes[dartx.length] != 4) {
-        error('IPv4 address should contain exactly 4 parts');
-      }
-      return bytes[dartx.map](core.int)(dart.fn(byteString => {
-        let byte = core.int.parse(byteString);
-        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-          error('each part must be in the range of `0..255`');
-        }
-        return byte;
-      }, StringToint$()))[dartx.toList]();
-    }
-    static parseIPv6Address(host, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (end == null) end = host[dartx.length];
-      function error(msg, position) {
-        if (position === void 0) position = null;
-        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
-      }
-      dart.fn(error, String__Tovoid());
-      function parseHex(start, end) {
-        if (dart.notNull(end) - dart.notNull(start) > 4) {
-          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-        }
-        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
-        if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
-          error('each part must be in the range of `0x0..0xFFFF`', start);
-        }
-        return value;
-      }
-      dart.fn(parseHex, intAndintToint());
-      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
-      let parts = JSArrayOfint().of([]);
-      let wildcardSeen = false;
-      let partStart = start;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-          if (i == start) {
-            i = dart.notNull(i) + 1;
-            if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
-              error('invalid start colon.', i);
-            }
-            partStart = i;
-          }
-          if (i == partStart) {
-            if (wildcardSeen) {
-              error('only one wildcard `::` is allowed', i);
-            }
-            wildcardSeen = true;
-            parts[dartx.add](-1);
-          } else {
-            parts[dartx.add](parseHex(partStart, i));
-          }
-          partStart = dart.notNull(i) + 1;
-        }
-      }
-      if (parts[dartx.length] == 0) error('too few parts');
-      let atEnd = partStart == end;
-      let isLastWildcard = parts[dartx.last] == -1;
-      if (atEnd && !isLastWildcard) {
-        error('expected a part after last `:`', end);
-      }
-      if (!atEnd) {
-        try {
-          parts[dartx.add](parseHex(partStart, end));
-        } catch (e) {
-          try {
-            let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
-            parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
-            parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
-          } catch (e) {
-            error('invalid end of IPv6 address.', partStart);
-          }
-
-        }
-
-      }
-      if (wildcardSeen) {
-        if (dart.notNull(parts[dartx.length]) > 7) {
-          error('an address with a wildcard must have less than 7 parts');
-        }
-      } else if (parts[dartx.length] != 8) {
-        error('an address without a wildcard must contain exactly 8 parts');
-      }
-      let bytes = typed_data.Uint8List.new(16);
-      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
-        let value = parts[dartx._get](i);
-        if (value == -1) {
-          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
-          for (let j = 0; j < wildCardLength; j++) {
-            bytes[dartx._set](index, 0);
-            bytes[dartx._set](index + 1, 0);
-            index = index + 2;
-          }
-        } else {
-          bytes[dartx._set](index, value[dartx['>>']](8));
-          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
-          index = index + 2;
-        }
-      }
-      return bytes;
-    }
-    static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
-      if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
-        return text;
-      }
-      let result = new core.StringBuffer();
-      let bytes = encoding.encode(text);
-      for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
-        let byte = bytes[dartx._get](i);
-        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
-          result.writeCharCode(byte);
-        } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
-          result.write('+');
-        } else {
-          let hexDigits = '0123456789ABCDEF';
-          result.write('%');
-          result.write(hexDigits[dartx._get](dart.notNull(byte) >> 4 & 15));
-          result.write(hexDigits[dartx._get](dart.notNull(byte) & 15));
-        }
-      }
-      return result.toString();
-    }
-    static _hexCharPairToByte(s, pos) {
-      let byte = 0;
-      for (let i = 0; i < 2; i++) {
-        let charCode = s[dartx.codeUnitAt](dart.notNull(pos) + i);
-        if (48 <= dart.notNull(charCode) && dart.notNull(charCode) <= 57) {
-          byte = byte * 16 + dart.notNull(charCode) - 48;
-        } else {
-          charCode = (dart.notNull(charCode) | 32) >>> 0;
-          if (97 <= dart.notNull(charCode) && dart.notNull(charCode) <= 102) {
-            byte = byte * 16 + dart.notNull(charCode) - 87;
-          } else {
-            dart.throw(new core.ArgumentError("Invalid URL encoding"));
-          }
-        }
-      }
-      return byte;
-    }
-    static _uriDecode(text, start, end, encoding, plusToSpace) {
-      dart.assert(0 <= dart.notNull(start));
-      dart.assert(dart.notNull(start) <= dart.notNull(end));
-      dart.assert(dart.notNull(end) <= dart.notNull(text[dartx.length]));
-      dart.assert(encoding != null);
-      let simple = true;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        let codeUnit = text[dartx.codeUnitAt](i);
-        if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-          simple = false;
-          break;
-        }
-      }
-      let bytes = null;
-      if (simple) {
-        if (dart.equals(convert.UTF8, encoding) || dart.equals(convert.LATIN1, encoding) || dart.equals(convert.ASCII, encoding)) {
-          return text[dartx.substring](start, end);
-        } else {
-          bytes = text[dartx.substring](start, end)[dartx.codeUnits];
-        }
+    let index = 0;
+    for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
+      let codeUnit = text[dartx.codeUnitAt](i);
+      if (codeUnit != percent) {
+        result[dartx._set](index++, codeUnit);
       } else {
-        bytes = ListOfint().new();
-        for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          let codeUnit = text[dartx.codeUnitAt](i);
-          if (dart.notNull(codeUnit) > 127) {
-            dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
-          }
-          if (codeUnit == core.Uri._PERCENT) {
-            if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
-              dart.throw(new core.ArgumentError('Truncated URI'));
-            }
-            bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
-            i = dart.notNull(i) + 2;
-          } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-            bytes[dartx.add](core.Uri._SPACE);
-          } else {
-            bytes[dartx.add](codeUnit);
+        if (i + 2 < dart.notNull(text[dartx.length])) {
+          let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
+          let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
+          if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
+            let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
+            result[dartx._set](index++, byte);
+            i = i + 2;
+            continue;
           }
         }
+        dart.throw(new core.FormatException("Invalid percent escape", text, i));
       }
-      return encoding.decode(bytes);
     }
-    static _isAlphabeticCharacter(codeUnit) {
-      let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
-      return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
-    }
-    static _isUnreservedChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
-    }
-  };
-  dart.defineNamedConstructor(core.Uri, '_internal');
-  dart.setSignature(core.Uri, {
-    constructors: () => ({
-      _internal: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, core.int, core.String, core.String, core.String]),
-      new: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
-      http: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
-      https: dart.definiteFunctionType(core.Uri, [core.String, core.String], [MapOfString$String()]),
-      file: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
-      directory: dart.definiteFunctionType(core.Uri, [core.String], {windows: core.bool}),
-      dataFromString: dart.definiteFunctionType(core.Uri, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
-      dataFromBytes: dart.definiteFunctionType(core.Uri, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic})
-    }),
-    fields: () => ({
-      scheme: core.String,
-      [_userInfo]: core.String,
-      [_host]: core.String,
-      [_port]: core.int,
-      [_path]: core.String,
-      [_query]: core.String,
-      [_fragment]: core.String,
-      [_pathSegments]: ListOfString(),
-      [_queryParameters]: MapOfString$String(),
-      [_queryParameterLists]: MapOfString$ListOfString()
-    }),
-    getters: () => ({
-      authority: dart.definiteFunctionType(core.String, []),
-      userInfo: dart.definiteFunctionType(core.String, []),
-      host: dart.definiteFunctionType(core.String, []),
-      port: dart.definiteFunctionType(core.int, []),
-      path: dart.definiteFunctionType(core.String, []),
-      query: dart.definiteFunctionType(core.String, []),
-      fragment: dart.definiteFunctionType(core.String, []),
-      pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
-      queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
-      isAbsolute: dart.definiteFunctionType(core.bool, []),
-      hasScheme: dart.definiteFunctionType(core.bool, []),
-      hasAuthority: dart.definiteFunctionType(core.bool, []),
-      hasPort: dart.definiteFunctionType(core.bool, []),
-      hasQuery: dart.definiteFunctionType(core.bool, []),
-      hasFragment: dart.definiteFunctionType(core.bool, []),
-      hasEmptyPath: dart.definiteFunctionType(core.bool, []),
-      hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
-      origin: dart.definiteFunctionType(core.String, []),
-      [_isPathAbsolute]: dart.definiteFunctionType(core.bool, []),
-      data: dart.definiteFunctionType(core.UriData, [])
-    }),
-    methods: () => ({
-      replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
-      removeFragment: dart.definiteFunctionType(core.Uri, []),
-      normalizePath: dart.definiteFunctionType(core.Uri, []),
-      [_mergePaths]: dart.definiteFunctionType(core.String, [core.String, core.String]),
-      resolve: dart.definiteFunctionType(core.Uri, [core.String]),
-      resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
-      toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
-      [_toFilePath]: dart.definiteFunctionType(core.String, []),
-      [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
-      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
-    }),
-    sfields: () => ({
-      _SPACE: core.int,
-      _DOUBLE_QUOTE: core.int,
-      _NUMBER_SIGN: core.int,
-      _PERCENT: core.int,
-      _ASTERISK: core.int,
-      _PLUS: core.int,
-      _DOT: core.int,
-      _SLASH: core.int,
-      _ZERO: core.int,
-      _NINE: core.int,
-      _COLON: core.int,
-      _LESS: core.int,
-      _GREATER: core.int,
-      _QUESTION: core.int,
-      _AT_SIGN: core.int,
-      _UPPER_CASE_A: core.int,
-      _UPPER_CASE_F: core.int,
-      _UPPER_CASE_Z: core.int,
-      _LEFT_BRACKET: core.int,
-      _BACKSLASH: core.int,
-      _RIGHT_BRACKET: core.int,
-      _LOWER_CASE_A: core.int,
-      _LOWER_CASE_F: core.int,
-      _LOWER_CASE_Z: core.int,
-      _BAR: core.int,
-      _hexDigits: core.String,
-      _unreservedTable: ListOfint(),
-      _unreserved2396Table: ListOfint(),
-      _encodeFullTable: ListOfint(),
-      _schemeTable: ListOfint(),
-      _schemeLowerTable: ListOfint(),
-      _subDelimitersTable: ListOfint(),
-      _genDelimitersTable: ListOfint(),
-      _userinfoTable: ListOfint(),
-      _regNameTable: ListOfint(),
-      _pathCharTable: ListOfint(),
-      _pathCharOrSlashTable: ListOfint(),
-      _queryCharTable: ListOfint(),
-      _needsNoEncoding: core.RegExp
-    }),
-    sgetters: () => ({
-      base: dart.definiteFunctionType(core.Uri, []),
-      _isWindows: dart.definiteFunctionType(core.bool, [])
-    }),
-    statics: () => ({
-      _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
-      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
-      _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
-      _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
-      _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
-      _checkWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool], [core.int]),
-      _checkWindowsDriveLetter: dart.definiteFunctionType(dart.dynamic, [core.int, core.bool]),
-      _makeFileUri: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
-      _makeWindowsFileUrl: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
-      _makePort: dart.definiteFunctionType(core.int, [core.int, core.String]),
-      _makeHost: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.bool]),
-      _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
-      _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
-      _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
-      _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
-      _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
-      _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
-      _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
-      _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
-      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
-      _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
-      _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
-      _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
-      _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
-      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
-      _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
-      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
-      _createList: dart.definiteFunctionType(core.List, []),
-      _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
-      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
-      _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
-      _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
-      _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
-      _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
-      _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
-    }),
-    names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
-  });
-  core.Uri._SPACE = 32;
-  core.Uri._DOUBLE_QUOTE = 34;
-  core.Uri._NUMBER_SIGN = 35;
-  core.Uri._PERCENT = 37;
-  core.Uri._ASTERISK = 42;
-  core.Uri._PLUS = 43;
-  core.Uri._DOT = 46;
-  core.Uri._SLASH = 47;
-  core.Uri._ZERO = 48;
-  core.Uri._NINE = 57;
-  core.Uri._COLON = 58;
-  core.Uri._LESS = 60;
-  core.Uri._GREATER = 62;
-  core.Uri._QUESTION = 63;
-  core.Uri._AT_SIGN = 64;
-  core.Uri._UPPER_CASE_A = 65;
-  core.Uri._UPPER_CASE_F = 70;
-  core.Uri._UPPER_CASE_Z = 90;
-  core.Uri._LEFT_BRACKET = 91;
-  core.Uri._BACKSLASH = 92;
-  core.Uri._RIGHT_BRACKET = 93;
-  core.Uri._LOWER_CASE_A = 97;
-  core.Uri._LOWER_CASE_F = 102;
-  core.Uri._LOWER_CASE_Z = 122;
-  core.Uri._BAR = 124;
-  core.Uri._hexDigits = "0123456789ABCDEF";
-  core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
-  core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
-  core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
-  core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
-  dart.defineLazy(core.Uri, {
-    get _needsNoEncoding() {
-      return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
-    }
-  });
-  const _text = Symbol('_text');
-  const _separatorIndices = Symbol('_separatorIndices');
-  const _uriCache = Symbol('_uriCache');
-  core.UriData = class UriData extends core.Object {
-    _(text, separatorIndices, uriCache) {
-      this[_text] = text;
-      this[_separatorIndices] = separatorIndices;
-      this[_uriCache] = uriCache;
-    }
-    static fromString(content, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let base64 = opts && 'base64' in opts ? opts.base64 : false;
-      let buffer = new core.StringBuffer();
-      let indices = JSArrayOfint().of([core.UriData._noScheme]);
-      let charsetName = null;
-      let encodingName = null;
-      if (parameters != null) charsetName = parameters[dartx._get]("charset");
+    dart.assert(index == result[dartx.length]);
+    return result;
+  }
+  contentAsString(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+    if (encoding == null) {
+      let charset = this.charset;
+      encoding = convert.Encoding.getByName(charset);
       if (encoding == null) {
-        if (charsetName != null) {
-          encoding = convert.Encoding.getByName(charsetName);
-        }
-      } else if (charsetName == null) {
-        encodingName = encoding.name;
+        dart.throw(new core.UnsupportedError(dart.str`Unknown charset: ${charset}`));
       }
-      let t = encoding;
-      t == null ? encoding = convert.ASCII : t;
-      core.UriData._writeUri(mimeType, encodingName, parameters, buffer, indices);
-      indices[dartx.add](buffer.length);
-      if (dart.test(base64)) {
-        buffer.write(';base64,');
-        indices[dartx.add](dart.notNull(buffer.length) - 1);
-        buffer.write(encoding.fuse(core.String)(convert.BASE64).encode(content));
-      } else {
-        buffer.write(',');
-        core.UriData._uriEncodeBytes(core.UriData._uricTable, encoding.encode(content), buffer);
-      }
-      return new core.UriData._(buffer.toString(), indices, null);
     }
-    static fromBytes(bytes, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-      let buffer = new core.StringBuffer();
-      let indices = JSArrayOfint().of([core.UriData._noScheme]);
-      core.UriData._writeUri(core.String._check(mimeType), null, parameters, buffer, indices);
-      indices[dartx.add](buffer.length);
-      if (dart.test(percentEncoded)) {
-        buffer.write(',');
-        core.UriData._uriEncodeBytes(core.UriData._uricTable, bytes, buffer);
-      } else {
-        buffer.write(';base64,');
-        indices[dartx.add](dart.notNull(buffer.length) - 1);
-        convert.BASE64.encoder.startChunkedConversion(convert.StringConversionSink.fromStringSink(buffer)).addSlice(bytes, 0, bytes[dartx.length], true);
-      }
-      return new core.UriData._(buffer.toString(), indices, null);
+    let text = this[_text];
+    let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
+    if (dart.test(this.isBase64)) {
+      let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
+      return converter.convert(text[dartx.substring](start));
     }
-    static fromUri(uri) {
-      if (uri.scheme != "data") {
-        dart.throw(new core.ArgumentError.value(uri, "uri", "Scheme must be 'data'"));
-      }
-      if (dart.test(uri.hasAuthority)) {
-        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have authority"));
-      }
-      if (dart.test(uri.hasFragment)) {
-        dart.throw(new core.ArgumentError.value(uri, "uri", "Data uri must not have a fragment part"));
-      }
-      if (!dart.test(uri.hasQuery)) {
-        return core.UriData._parse(uri.path, 0, uri);
-      }
-      return core.UriData._parse(dart.str`${uri}`, 5, uri);
+    return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
+  }
+  get parameters() {
+    let result = dart.map({}, core.String, core.String);
+    for (let i = 3; i < dart.notNull(this[_separatorIndices][dartx.length]); i = i + 2) {
+      let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
+      let equals = this[_separatorIndices][dartx._get](i - 1);
+      let end = this[_separatorIndices][dartx._get](i);
+      let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
+      let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
+      result[dartx._set](key, value);
     }
-    static _writeUri(mimeType, charsetName, parameters, buffer, indices) {
-      if (mimeType == null || mimeType == "text/plain") {
-        mimeType = "";
-      }
-      if (dart.test(mimeType[dartx.isEmpty]) || core.identical(mimeType, "application/octet-stream")) {
-        buffer.write(mimeType);
-      } else {
-        let slashIndex = core.UriData._validateMimeType(mimeType);
+    return result;
+  }
+  static _parse(text, start, sourceUri) {
+    dart.assert(start == 0 || start == 5);
+    dart.assert(start == 5 == text[dartx.startsWith]("data:"));
+    let comma = 44;
+    let slash = 47;
+    let semicolon = 59;
+    let equals = 61;
+    let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
+    let slashIndex = -1;
+    let char = null;
+    let i = start;
+    for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
+      char = text[dartx.codeUnitAt](i);
+      if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
+      if (dart.equals(char, slash)) {
         if (dart.notNull(slashIndex) < 0) {
-          dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
-        }
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
-        buffer.write("/");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
-      }
-      if (charsetName != null) {
-        if (indices != null) {
-          indices[dartx.add](buffer.length);
-          indices[dartx.add](dart.notNull(buffer.length) + 8);
-        }
-        buffer.write(";charset=");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
-      }
-      dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
-        if (dart.test(key[dartx.isEmpty])) {
-          dart.throw(new core.ArgumentError.value("", "Parameter names must not be empty"));
-        }
-        if (dart.test(value[dartx.isEmpty])) {
-          dart.throw(new core.ArgumentError.value("", "Parameter values must not be empty", dart.str`parameters["${key}"]`));
-        }
-        if (indices != null) indices[dartx.add](buffer.length);
-        buffer.write(';');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
-        if (indices != null) indices[dartx.add](buffer.length);
-        buffer.write('=');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
-      }, StringAndStringToNull())));
-    }
-    static _validateMimeType(mimeType) {
-      let slashIndex = -1;
-      for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
-        let char = mimeType[dartx.codeUnitAt](i);
-        if (char != core.Uri._SLASH) continue;
-        if (slashIndex < 0) {
           slashIndex = i;
           continue;
         }
-        return -1;
-      }
-      return slashIndex;
-    }
-    static parse(uri) {
-      if (!dart.test(uri[dartx.startsWith]("data:"))) {
-        dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
-      }
-      return core.UriData._parse(uri, 5, null);
-    }
-    get uri() {
-      if (this[_uriCache] != null) return this[_uriCache];
-      let path = this[_text];
-      let query = null;
-      let colonIndex = this[_separatorIndices][dartx._get](0);
-      let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
-      let end = null;
-      if (dart.notNull(queryIndex) >= 0) {
-        query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
-        end = queryIndex;
-      }
-      path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
-      this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
-      return this[_uriCache];
-    }
-    get mimeType() {
-      let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
-      let end = this[_separatorIndices][dartx._get](1);
-      if (start == end) return "text/plain";
-      return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
-    }
-    get charset() {
-      let parameterStart = 1;
-      let parameterEnd = dart.notNull(this[_separatorIndices][dartx.length]) - 1;
-      if (dart.test(this.isBase64)) {
-        parameterEnd = parameterEnd - 1;
-      }
-      for (let i = parameterStart; i < parameterEnd; i = i + 2) {
-        let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
-        let keyEnd = this[_separatorIndices][dartx._get](i + 1);
-        if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
-          return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
-        }
-      }
-      return "US-ASCII";
-    }
-    get isBase64() {
-      return this[_separatorIndices][dartx.length][dartx.isOdd];
-    }
-    get contentText() {
-      return this[_text][dartx.substring](dart.notNull(this[_separatorIndices][dartx.last]) + 1);
-    }
-    contentAsBytes() {
-      let text = this[_text];
-      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
-      if (dart.test(this.isBase64)) {
-        return convert.BASE64.decoder.convert(text, start);
-      }
-      let percent = 37;
-      let length = dart.notNull(text[dartx.length]) - start;
-      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
-        let codeUnit = text[dartx.codeUnitAt](i);
-        if (codeUnit == percent) {
-          i = i + 2;
-          length = length - 2;
-        }
-      }
-      let result = typed_data.Uint8List.new(length);
-      if (length == text[dartx.length]) {
-        result[dartx.setRange](0, length, text[dartx.codeUnits], start);
-        return result;
-      }
-      let index = 0;
-      for (let i = start; i < dart.notNull(text[dartx.length]); i++) {
-        let codeUnit = text[dartx.codeUnitAt](i);
-        if (codeUnit != percent) {
-          result[dartx._set](index++, codeUnit);
-        } else {
-          if (i + 2 < dart.notNull(text[dartx.length])) {
-            let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
-            let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
-            if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
-              let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
-              result[dartx._set](index++, byte);
-              i = i + 2;
-              continue;
-            }
-          }
-          dart.throw(new core.FormatException("Invalid percent escape", text, i));
-        }
-      }
-      dart.assert(index == result[dartx.length]);
-      return result;
-    }
-    contentAsString(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-      if (encoding == null) {
-        let charset = this.charset;
-        encoding = convert.Encoding.getByName(charset);
-        if (encoding == null) {
-          dart.throw(new core.UnsupportedError(dart.str`Unknown charset: ${charset}`));
-        }
-      }
-      let text = this[_text];
-      let start = dart.notNull(this[_separatorIndices][dartx.last]) + 1;
-      if (dart.test(this.isBase64)) {
-        let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
-        return converter.convert(text[dartx.substring](start));
-      }
-      return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
-    }
-    get parameters() {
-      let result = dart.map({}, core.String, core.String);
-      for (let i = 3; i < dart.notNull(this[_separatorIndices][dartx.length]); i = i + 2) {
-        let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
-        let equals = this[_separatorIndices][dartx._get](i - 1);
-        let end = this[_separatorIndices][dartx._get](i);
-        let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
-        let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
-        result[dartx._set](key, value);
-      }
-      return result;
-    }
-    static _parse(text, start, sourceUri) {
-      dart.assert(start == 0 || start == 5);
-      dart.assert(start == 5 == text[dartx.startsWith]("data:"));
-      let comma = 44;
-      let slash = 47;
-      let semicolon = 59;
-      let equals = 61;
-      let indices = JSArrayOfint().of([dart.notNull(start) - 1]);
-      let slashIndex = -1;
-      let char = null;
-      let i = start;
-      for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
-        char = text[dartx.codeUnitAt](i);
-        if (dart.equals(char, comma) || dart.equals(char, semicolon)) break;
-        if (dart.equals(char, slash)) {
-          if (dart.notNull(slashIndex) < 0) {
-            slashIndex = i;
-            continue;
-          }
-          dart.throw(new core.FormatException("Invalid MIME type", text, i));
-        }
-      }
-      if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
         dart.throw(new core.FormatException("Invalid MIME type", text, i));
       }
-      while (!dart.equals(char, comma)) {
-        indices[dartx.add](i);
-        i = dart.notNull(i) + 1;
-        let equalsIndex = -1;
-        for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
-          char = text[dartx.codeUnitAt](i);
-          if (dart.equals(char, equals)) {
-            if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
-          } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
-            break;
-          }
-        }
-        if (dart.notNull(equalsIndex) >= 0) {
-          indices[dartx.add](equalsIndex);
-        } else {
-          let lastSeparator = indices[dartx.last];
-          if (!dart.equals(char, comma) || i != dart.notNull(lastSeparator) + 7 || !dart.test(text[dartx.startsWith]("base64", dart.notNull(lastSeparator) + 1))) {
-            dart.throw(new core.FormatException("Expecting '='", text, i));
-          }
+    }
+    if (dart.notNull(slashIndex) < 0 && dart.notNull(i) > dart.notNull(start)) {
+      dart.throw(new core.FormatException("Invalid MIME type", text, i));
+    }
+    while (!dart.equals(char, comma)) {
+      indices[dartx.add](i);
+      i = dart.notNull(i) + 1;
+      let equalsIndex = -1;
+      for (; dart.notNull(i) < dart.notNull(text[dartx.length]); i = dart.notNull(i) + 1) {
+        char = text[dartx.codeUnitAt](i);
+        if (dart.equals(char, equals)) {
+          if (dart.notNull(equalsIndex) < 0) equalsIndex = i;
+        } else if (dart.equals(char, semicolon) || dart.equals(char, comma)) {
           break;
         }
       }
-      indices[dartx.add](i);
-      return new core.UriData._(text, indices, sourceUri);
+      if (dart.notNull(equalsIndex) >= 0) {
+        indices[dartx.add](equalsIndex);
+      } else {
+        let lastSeparator = indices[dartx.last];
+        if (!dart.equals(char, comma) || i != dart.notNull(lastSeparator) + 7 || !dart.test(text[dartx.startsWith]("base64", dart.notNull(lastSeparator) + 1))) {
+          dart.throw(new core.FormatException("Expecting '='", text, i));
+        }
+        break;
+      }
     }
-    static _uriEncodeBytes(canonicalTable, bytes, buffer) {
-      let byteOr = 0;
+    indices[dartx.add](i);
+    return new core.UriData._(text, indices, sourceUri);
+  }
+  static _uriEncodeBytes(canonicalTable, bytes, buffer) {
+    let byteOr = 0;
+    for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
+      let byte = bytes[dartx._get](i);
+      byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
+      if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
+        buffer.writeCharCode(byte);
+      } else {
+        buffer.writeCharCode(core.Uri._PERCENT);
+        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+      }
+    }
+    if ((dart.notNull(byteOr) & ~255) != 0) {
       for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
         let byte = bytes[dartx._get](i);
-        byteOr = (dart.notNull(byteOr) | dart.notNull(byte)) >>> 0;
-        if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
-          buffer.writeCharCode(byte);
-        } else {
-          buffer.writeCharCode(core.Uri._PERCENT);
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
+          dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
         }
       }
-      if ((dart.notNull(byteOr) & ~255) != 0) {
-        for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
-          let byte = bytes[dartx._get](i);
-          if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-            dart.throw(new core.ArgumentError.value(byte, "non-byte value"));
+    }
+  }
+  toString() {
+    return this[_separatorIndices][dartx._get](0) == core.UriData._noScheme ? dart.str`data:${this[_text]}` : this[_text];
+  }
+};
+dart.defineNamedConstructor(core.UriData, '_');
+dart.setSignature(core.UriData, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(core.UriData, [core.String, ListOfint(), core.Uri]),
+    fromString: dart.definiteFunctionType(core.UriData, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
+    fromBytes: dart.definiteFunctionType(core.UriData, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic}),
+    fromUri: dart.definiteFunctionType(core.UriData, [core.Uri])
+  }),
+  fields: () => ({
+    [_text]: core.String,
+    [_separatorIndices]: ListOfint(),
+    [_uriCache]: core.Uri
+  }),
+  getters: () => ({
+    uri: dart.definiteFunctionType(core.Uri, []),
+    mimeType: dart.definiteFunctionType(core.String, []),
+    charset: dart.definiteFunctionType(core.String, []),
+    isBase64: dart.definiteFunctionType(core.bool, []),
+    contentText: dart.definiteFunctionType(core.String, []),
+    parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+  }),
+  methods: () => ({
+    contentAsBytes: dart.definiteFunctionType(core.List$(core.int), []),
+    contentAsString: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding})
+  }),
+  sfields: () => ({
+    _noScheme: core.int,
+    _tokenCharTable: ListOfint(),
+    _uricTable: ListOfint()
+  }),
+  statics: () => ({
+    _writeUri: dart.definiteFunctionType(dart.void, [core.String, core.String, MapOfString$String(), core.StringBuffer, core.List]),
+    _validateMimeType: dart.definiteFunctionType(core.int, [core.String]),
+    parse: dart.definiteFunctionType(core.UriData, [core.String]),
+    _parse: dart.definiteFunctionType(core.UriData, [core.String, core.int, core.Uri]),
+    _uriEncodeBytes: dart.definiteFunctionType(dart.void, [ListOfint(), ListOfint(), core.StringSink])
+  }),
+  names: ['_writeUri', '_validateMimeType', 'parse', '_parse', '_uriEncodeBytes']
+});
+core.UriData._noScheme = -1;
+core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
+core.UriData._uricTable = core.Uri._queryCharTable;
+developer.debugger = function(opts) {
+  let when = opts && 'when' in opts ? opts.when : true;
+  let message = opts && 'message' in opts ? opts.message : null;
+  if (dart.test(when)) {
+    debugger;
+  }
+  return when;
+};
+dart.fn(developer.debugger, __Tobool());
+developer.inspect = function(object) {
+  return object;
+};
+dart.fn(developer.inspect, ObjectToObject());
+developer.log = function(message, opts) {
+  let time = opts && 'time' in opts ? opts.time : null;
+  let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
+  let level = opts && 'level' in opts ? opts.level : 0;
+  let name = opts && 'name' in opts ? opts.name : '';
+  let zone = opts && 'zone' in opts ? opts.zone : null;
+  let error = opts && 'error' in opts ? opts.error : null;
+  let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
+};
+dart.fn(developer.log, String__Tovoid$());
+dart.defineLazy(developer, {
+  get _extensions() {
+    return MapOfString$ServiceExtensionHandler().new();
+  }
+});
+developer._clockValue = 0;
+const _result = Symbol('_result');
+const _errorCode = Symbol('_errorCode');
+const _errorDetail = Symbol('_errorDetail');
+const _isError = Symbol('_isError');
+const _toString = Symbol('_toString');
+developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
+  result(result) {
+    this[_result] = result;
+    this[_errorCode] = null;
+    this[_errorDetail] = null;
+    if (!(typeof this[_result] == 'string')) {
+      dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+    }
+  }
+  error(errorCode, errorDetail) {
+    this[_result] = null;
+    this[_errorCode] = errorCode;
+    this[_errorDetail] = errorDetail;
+    developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
+    if (!(typeof this[_errorDetail] == 'string')) {
+      dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+    }
+  }
+  static _errorCodeMessage(errorCode) {
+    developer.ServiceExtensionResponse._validateErrorCode(errorCode);
+    if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
+      return "Invalid params";
+    }
+    return "Server error";
+  }
+  static _validateErrorCode(errorCode) {
+    if (!(typeof errorCode == 'number')) {
+      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+    }
+    if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
+      return;
+    }
+    if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
+      return;
+    }
+    dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+  }
+  [_isError]() {
+    return this[_errorCode] != null && this[_errorDetail] != null;
+  }
+  [_toString]() {
+    if (this[_result] != null) {
+      return this[_result];
+    } else {
+      dart.assert(this[_errorCode] != null);
+      dart.assert(this[_errorDetail] != null);
+      return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+    }
+  }
+};
+dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
+dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
+dart.setSignature(developer.ServiceExtensionResponse, {
+  constructors: () => ({
+    result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
+    error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
+  }),
+  fields: () => ({
+    [_result]: core.String,
+    [_errorCode]: core.int,
+    [_errorDetail]: core.String
+  }),
+  methods: () => ({
+    [_isError]: dart.definiteFunctionType(core.bool, []),
+    [_toString]: dart.definiteFunctionType(core.String, [])
+  }),
+  sfields: () => ({
+    kInvalidParams: core.int,
+    kExtensionError: core.int,
+    kExtensionErrorMax: core.int,
+    kExtensionErrorMin: core.int,
+    invalidParams: core.int,
+    extensionError: core.int,
+    extensionErrorMax: core.int,
+    extensionErrorMin: core.int
+  }),
+  statics: () => ({
+    _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
+    _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
+  }),
+  names: ['_errorCodeMessage', '_validateErrorCode']
+});
+developer.ServiceExtensionResponse.invalidParams = -32602;
+developer.ServiceExtensionResponse.extensionError = -32000;
+developer.ServiceExtensionResponse.extensionErrorMax = -32000;
+developer.ServiceExtensionResponse.extensionErrorMin = -32016;
+dart.defineLazy(developer.ServiceExtensionResponse, {
+  get kInvalidParams() {
+    return developer.ServiceExtensionResponse.invalidParams;
+  },
+  get kExtensionError() {
+    return developer.ServiceExtensionResponse.extensionError;
+  },
+  get kExtensionErrorMax() {
+    return developer.ServiceExtensionResponse.extensionErrorMax;
+  },
+  get kExtensionErrorMin() {
+    return developer.ServiceExtensionResponse.extensionErrorMin;
+  }
+});
+developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
+developer.registerExtension = function(method, handler) {
+  if (!(typeof method == 'string')) {
+    dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
+  }
+  if (!dart.test(method[dartx.startsWith]('ext.'))) {
+    dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
+  }
+  if (developer._lookupExtension(method) != null) {
+    dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
+  }
+  if (!developer.ServiceExtensionHandler.is(handler)) {
+    dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
+  }
+  developer._registerExtension(method, handler);
+};
+dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
+developer.postEvent = function(eventKind, eventData) {
+  if (!(typeof eventKind == 'string')) {
+    dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
+  }
+  if (!core.Map.is(eventData)) {
+    dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
+  }
+  let eventDataAsString = convert.JSON.encode(eventData);
+  developer._postEvent(eventKind, eventDataAsString);
+};
+dart.fn(developer.postEvent, StringAndMapTovoid());
+developer._postEvent = function(eventKind, eventData) {
+};
+dart.fn(developer._postEvent, StringAndStringTodynamic());
+developer._lookupExtension = function(method) {
+  return developer._extensions[dartx._get](method);
+};
+dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
+developer._registerExtension = function(method, handler) {
+  developer._extensions[dartx._set](method, handler);
+};
+dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
+developer.UserTag = class UserTag extends core.Object {
+  static new(label) {
+    return developer._FakeUserTag.new(label);
+  }
+  static get defaultTag() {
+    return developer._FakeUserTag._defaultTag;
+  }
+};
+dart.setSignature(developer.UserTag, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
+  sfields: () => ({MAX_USER_TAGS: core.int}),
+  sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
+});
+developer.UserTag.MAX_USER_TAGS = 64;
+developer._FakeUserTag = class _FakeUserTag extends core.Object {
+  real(label) {
+    this.label = label;
+  }
+  static new(label) {
+    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+    if (existingTag != null) {
+      return developer._FakeUserTag._check(existingTag);
+    }
+    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+    }
+    let instance = new developer._FakeUserTag.real(label);
+    developer._FakeUserTag._instances[dartx._set](label, instance);
+    return instance;
+  }
+  makeCurrent() {
+    let old = developer._currentTag;
+    developer._currentTag = this;
+    return old;
+  }
+};
+dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+dart.setSignature(developer._FakeUserTag, {
+  constructors: () => ({
+    real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
+    new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
+  }),
+  fields: () => ({label: core.String}),
+  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
+  sfields: () => ({
+    _instances: core.Map,
+    _defaultTag: developer.UserTag
+  })
+});
+dart.defineLazy(developer._FakeUserTag, {
+  get _instances() {
+    return dart.map();
+  },
+  set _instances(_) {},
+  get _defaultTag() {
+    return developer._FakeUserTag.new('Default');
+  }
+});
+dart.defineLazy(developer, {
+  get _currentTag() {
+    return developer._FakeUserTag._defaultTag;
+  },
+  set _currentTag(_) {}
+});
+developer.getCurrentTag = function() {
+  return developer._currentTag;
+};
+dart.fn(developer.getCurrentTag, VoidToUserTag());
+developer.Metric = class Metric extends core.Object {
+  new(name, description) {
+    this.name = name;
+    this.description = description;
+    if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
+      dart.throw(new core.ArgumentError('Invalid Metric name.'));
+    }
+  }
+};
+dart.setSignature(developer.Metric, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
+  fields: () => ({
+    name: core.String,
+    description: core.String
+  })
+});
+const _value$0 = Symbol('_value');
+const _toJSON = Symbol('_toJSON');
+developer.Gauge = class Gauge extends developer.Metric {
+  get value() {
+    return this[_value$0];
+  }
+  set value(v) {
+    if (dart.notNull(v) < dart.notNull(this.min)) {
+      v = this.min;
+    } else if (dart.notNull(v) > dart.notNull(this.max)) {
+      v = this.max;
+    }
+    this[_value$0] = v;
+  }
+  new(name, description, min, max) {
+    this.min = min;
+    this.max = max;
+    this[_value$0] = null;
+    super.new(name, description);
+    if (!(typeof this.min == 'number')) {
+      dart.throw(new core.ArgumentError('min must be a double'));
+    }
+    if (!(typeof this.max == 'number')) {
+      dart.throw(new core.ArgumentError('max must be a double'));
+    }
+    if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
+      dart.throw(new core.ArgumentError('min must be less than max'));
+    }
+    this[_value$0] = this.min;
+  }
+  [_toJSON]() {
+    let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
+    return map;
+  }
+};
+dart.setSignature(developer.Gauge, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
+  fields: () => ({
+    min: core.double,
+    max: core.double,
+    [_value$0]: core.double
+  }),
+  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+});
+developer.Counter = class Counter extends developer.Metric {
+  new(name, description) {
+    this[_value$0] = 0.0;
+    super.new(name, description);
+  }
+  get value() {
+    return this[_value$0];
+  }
+  set value(v) {
+    this[_value$0] = v;
+  }
+  [_toJSON]() {
+    let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
+    return map;
+  }
+};
+dart.setSignature(developer.Counter, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
+  fields: () => ({[_value$0]: core.double}),
+  getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
+  setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
+  methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
+});
+developer.Metrics = class Metrics extends core.Object {
+  static register(metric) {
+    if (!developer.Metric.is(metric)) {
+      dart.throw(new core.ArgumentError('metric must be a Metric'));
+    }
+    if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
+      dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+    }
+    developer.Metrics._metrics[dartx._set](metric.name, metric);
+  }
+  static deregister(metric) {
+    if (!developer.Metric.is(metric)) {
+      dart.throw(new core.ArgumentError('metric must be a Metric'));
+    }
+    developer.Metrics._metrics[dartx.remove](metric.name);
+  }
+  static _printMetric(id) {
+    let metric = developer.Metrics._metrics[dartx._get](id);
+    if (metric == null) {
+      return null;
+    }
+    return convert.JSON.encode(metric[_toJSON]());
+  }
+  static _printMetrics() {
+    let metrics = [];
+    for (let metric of developer.Metrics._metrics[dartx.values]) {
+      metrics[dartx.add](metric[_toJSON]());
+    }
+    let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
+    return convert.JSON.encode(map);
+  }
+};
+dart.setSignature(developer.Metrics, {
+  sfields: () => ({_metrics: MapOfString$Metric()}),
+  statics: () => ({
+    register: dart.definiteFunctionType(dart.void, [developer.Metric]),
+    deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
+    _printMetric: dart.definiteFunctionType(core.String, [core.String]),
+    _printMetrics: dart.definiteFunctionType(core.String, [])
+  }),
+  names: ['register', 'deregister', '_printMetric', '_printMetrics']
+});
+dart.defineLazy(developer.Metrics, {
+  get _metrics() {
+    return MapOfString$Metric().new();
+  }
+});
+developer._isProduct = false;
+developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
+developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
+const _appendArguments = Symbol('_appendArguments');
+developer.Timeline = class Timeline extends core.Object {
+  static startSync(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    if (!dart.test(developer._isDartStreamEnabled())) {
+      developer.Timeline._stack[dartx.add](null);
+      return;
+    }
+    let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
+    if (core.Map.is(arguments$)) {
+      block[_appendArguments](arguments$);
+    }
+    developer.Timeline._stack[dartx.add](block);
+  }
+  static finishSync() {
+    if (developer._isProduct) {
+      return;
+    }
+    if (developer.Timeline._stack[dartx.length] == 0) {
+      dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
+    }
+    let block = developer.Timeline._stack[dartx.removeLast]();
+    if (block == null) {
+      return;
+    }
+    block.finish();
+  }
+  static instantSync(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    if (!dart.test(developer._isDartStreamEnabled())) {
+      return;
+    }
+    let instantArguments = null;
+    if (core.Map.is(arguments$)) {
+      instantArguments = core.Map.from(arguments$);
+    }
+    developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
+  }
+  static timeSync(name, func, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    developer.Timeline.startSync(name, {arguments: arguments$});
+    try {
+      return func();
+    } finally {
+      developer.Timeline.finishSync();
+    }
+  }
+  static get now() {
+    return developer._getTraceClock();
+  }
+};
+dart.setSignature(developer.Timeline, {
+  sfields: () => ({
+    _stack: ListOf_SyncBlock(),
+    _isolateId: core.int,
+    _isolateIdString: core.String
+  }),
+  sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
+  statics: () => ({
+    startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    finishSync: dart.definiteFunctionType(dart.void, []),
+    instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
+  }),
+  names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
+});
+dart.defineLazy(developer.Timeline, {
+  get _stack() {
+    return ListOf_SyncBlock().new();
+  },
+  get _isolateId() {
+    return developer._getIsolateNum();
+  },
+  get _isolateIdString() {
+    return dart.toString(developer.Timeline._isolateId);
+  }
+});
+const _stack = Symbol('_stack');
+const _taskId = Symbol('_taskId');
+const _start$1 = Symbol('_start');
+const _finish = Symbol('_finish');
+developer.TimelineTask = class TimelineTask extends core.Object {
+  new() {
+    this[_stack] = JSArrayOf_AsyncBlock().of([]);
+    this[_taskId] = developer._getNextAsyncId();
+  }
+  withTaskId(taskId) {
+    this[_stack] = JSArrayOf_AsyncBlock().of([]);
+    this[_taskId] = taskId;
+    if (!(typeof taskId == 'number')) {
+      dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+    }
+  }
+  start(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    let block = new developer._AsyncBlock._(name, this[_taskId]);
+    if (core.Map.is(arguments$)) {
+      block[_appendArguments](arguments$);
+    }
+    this[_stack][dartx.add](block);
+    block[_start$1]();
+  }
+  instant(name, opts) {
+    let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
+    if (developer._isProduct) {
+      return;
+    }
+    if (!(typeof name == 'string')) {
+      dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
+    }
+    let instantArguments = null;
+    if (core.Map.is(arguments$)) {
+      instantArguments = core.Map.from(arguments$);
+    }
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
+  }
+  finish() {
+    if (developer._isProduct) {
+      return;
+    }
+    if (this[_stack][dartx.length] == 0) {
+      dart.throw(new core.StateError('Uneven calls to start and finish'));
+    }
+    let block = this[_stack][dartx.removeLast]();
+    block[_finish]();
+  }
+  pass() {
+    if (dart.notNull(this[_stack][dartx.length]) > 0) {
+      dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
+    }
+    let r = this[_taskId];
+    return r;
+  }
+};
+dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
+dart.setSignature(developer.TimelineTask, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(developer.TimelineTask, []),
+    withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
+  }),
+  fields: () => ({
+    [_taskId]: core.int,
+    [_stack]: ListOf_AsyncBlock()
+  }),
+  methods: () => ({
+    start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
+    finish: dart.definiteFunctionType(dart.void, []),
+    pass: dart.definiteFunctionType(core.int, [])
+  })
+});
+const _arguments$ = Symbol('_arguments');
+developer._AsyncBlock = class _AsyncBlock extends core.Object {
+  _(name, taskId) {
+    this.name = name;
+    this[_taskId] = taskId;
+    this.category = 'Dart';
+    this[_arguments$] = null;
+  }
+  [_start$1]() {
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+  }
+  [_finish]() {
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
+  }
+  [_appendArguments](arguments$) {
+    if (this[_arguments$] == null) {
+      this[_arguments$] = dart.map();
+    }
+    this[_arguments$][dartx.addAll](arguments$);
+  }
+};
+dart.defineNamedConstructor(developer._AsyncBlock, '_');
+dart.setSignature(developer._AsyncBlock, {
+  constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
+  fields: () => ({
+    category: core.String,
+    name: core.String,
+    [_taskId]: core.int,
+    [_arguments$]: core.Map
+  }),
+  methods: () => ({
+    [_start$1]: dart.definiteFunctionType(dart.void, []),
+    [_finish]: dart.definiteFunctionType(dart.void, []),
+    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+  })
+});
+const _startCpu = Symbol('_startCpu');
+developer._SyncBlock = class _SyncBlock extends core.Object {
+  _(name, start, startCpu) {
+    this.name = name;
+    this[_start$1] = start;
+    this[_startCpu] = startCpu;
+    this.category = 'Dart';
+    this[_arguments$] = null;
+  }
+  finish() {
+    developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+  }
+  [_appendArguments](arguments$) {
+    if (arguments$ == null) {
+      return;
+    }
+    if (this[_arguments$] == null) {
+      this[_arguments$] = dart.map();
+    }
+    this[_arguments$][dartx.addAll](arguments$);
+  }
+};
+dart.defineNamedConstructor(developer._SyncBlock, '_');
+dart.setSignature(developer._SyncBlock, {
+  constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
+  fields: () => ({
+    category: core.String,
+    name: core.String,
+    [_arguments$]: core.Map,
+    [_start$1]: core.int,
+    [_startCpu]: core.int
+  }),
+  methods: () => ({
+    finish: dart.definiteFunctionType(dart.void, []),
+    [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
+  })
+});
+developer._fastPathArguments = null;
+developer._argumentsAsJson = function(arguments$) {
+  if (arguments$ == null || arguments$[dartx.length] == 0) {
+    if (developer._fastPathArguments == null) {
+      developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
+    }
+    return developer._fastPathArguments;
+  }
+  arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
+  return convert.JSON.encode(arguments$);
+};
+dart.fn(developer._argumentsAsJson, MapToString());
+developer._isDartStreamEnabled = function() {
+  return false;
+};
+dart.fn(developer._isDartStreamEnabled, VoidTobool());
+developer._getNextAsyncId = function() {
+  return 0;
+};
+dart.fn(developer._getNextAsyncId, VoidToint());
+developer._getTraceClock = function() {
+  let x = developer._clockValue;
+  developer._clockValue = dart.notNull(x) + 1;
+  return x;
+};
+dart.fn(developer._getTraceClock, VoidToint());
+developer._getThreadCpuClock = function() {
+  return -1;
+};
+dart.fn(developer._getThreadCpuClock, VoidToint());
+developer._getIsolateNum = function() {
+  return 0;
+};
+dart.fn(developer._getIsolateNum, VoidToint());
+developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
+developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
+developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
+};
+dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
+developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
+  new(serverUri) {
+    this.majorVersion = developer._getServiceMajorVersion();
+    this.minorVersion = developer._getServiceMinorVersion();
+    this.serverUri = serverUri;
+  }
+  toString() {
+    if (this.serverUri != null) {
+      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
+    } else {
+      return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
+    }
+  }
+};
+dart.setSignature(developer.ServiceProtocolInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
+  fields: () => ({
+    majorVersion: core.int,
+    minorVersion: core.int,
+    serverUri: core.Uri
+  })
+});
+developer.Service = class Service extends core.Object {
+  static getInfo() {
+    return dart.async(function*() {
+      let receivePort = isolate.RawReceivePort.new();
+      let uriCompleter = CompleterOfUri().new();
+      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+      developer._getServerInfo(receivePort.sendPort);
+      let uri = (yield uriCompleter.future);
+      receivePort.close();
+      return new developer.ServiceProtocolInfo(uri);
+    }, developer.ServiceProtocolInfo);
+  }
+  static controlWebServer(opts) {
+    return dart.async(function*(opts) {
+      let enable = opts && 'enable' in opts ? opts.enable : false;
+      if (!(typeof enable == 'boolean')) {
+        dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+      }
+      let receivePort = isolate.RawReceivePort.new();
+      let uriCompleter = CompleterOfUri().new();
+      receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
+      developer._webServerControl(receivePort.sendPort, enable);
+      let uri = (yield uriCompleter.future);
+      receivePort.close();
+      return new developer.ServiceProtocolInfo(uri);
+    }, developer.ServiceProtocolInfo, opts);
+  }
+};
+dart.setSignature(developer.Service, {
+  statics: () => ({
+    getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
+    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+  }),
+  names: ['getInfo', 'controlWebServer']
+});
+developer._getServerInfo = function(sp) {
+  sp.send(null);
+};
+dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
+developer._webServerControl = function(sp, enable) {
+  sp.send(null);
+};
+dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
+developer._getServiceMajorVersion = function() {
+  return 0;
+};
+dart.fn(developer._getServiceMajorVersion, VoidToint());
+developer._getServiceMinorVersion = function() {
+  return 0;
+};
+dart.fn(developer._getServiceMinorVersion, VoidToint());
+io.BytesBuilder = class BytesBuilder extends core.Object {
+  static new(opts) {
+    let copy = opts && 'copy' in opts ? opts.copy : true;
+    if (dart.test(copy)) {
+      return new io._CopyingBytesBuilder();
+    } else {
+      return new io._BytesBuilder();
+    }
+  }
+};
+dart.setSignature(io.BytesBuilder, {
+  constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
+});
+const _length$2 = Symbol('_length');
+const _buffer$ = Symbol('_buffer');
+const _pow2roundup = Symbol('_pow2roundup');
+io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
+  new() {
+    this[_length$2] = 0;
+    this[_buffer$] = null;
+  }
+  add(bytes) {
+    let bytesLength = bytes[dartx.length];
+    if (bytesLength == 0) return;
+    let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
+    if (this[_buffer$] == null) {
+      let size = this[_pow2roundup](required);
+      size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
+      this[_buffer$] = typed_data.Uint8List.new(size);
+    } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
+      let size = dart.notNull(this[_pow2roundup](required)) * 2;
+      let newBuffer = typed_data.Uint8List.new(size);
+      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+      this[_buffer$] = newBuffer;
+    }
+    dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
+    if (typed_data.Uint8List.is(bytes)) {
+      this[_buffer$][dartx.setRange](this[_length$2], required, bytes);
+    } else {
+      for (let i = 0; i < dart.notNull(bytesLength); i++) {
+        this[_buffer$][dartx._set](dart.notNull(this[_length$2]) + i, bytes[dartx._get](i));
+      }
+    }
+    this[_length$2] = required;
+  }
+  addByte(byte) {
+    this.add(JSArrayOfint().of([byte]));
+  }
+  takeBytes() {
+    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
+    this.clear();
+    return buffer;
+  }
+  toBytes() {
+    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
+  }
+  get length() {
+    return this[_length$2];
+  }
+  get isEmpty() {
+    return this[_length$2] == 0;
+  }
+  get isNotEmpty() {
+    return this[_length$2] != 0;
+  }
+  clear() {
+    this[_length$2] = 0;
+    this[_buffer$] = null;
+  }
+  [_pow2roundup](x) {
+    x = dart.notNull(x) - 1;
+    x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
+    x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
+    x = (dart.notNull(x) | x[dartx['>>']](4)) >>> 0;
+    x = (dart.notNull(x) | x[dartx['>>']](8)) >>> 0;
+    x = (dart.notNull(x) | x[dartx['>>']](16)) >>> 0;
+    return dart.notNull(x) + 1;
+  }
+};
+io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
+dart.setSignature(io._CopyingBytesBuilder, {
+  fields: () => ({
+    [_length$2]: core.int,
+    [_buffer$]: typed_data.Uint8List
+  }),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addByte: dart.definiteFunctionType(dart.void, [core.int]),
+    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
+    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
+    clear: dart.definiteFunctionType(dart.void, []),
+    [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
+  }),
+  sfields: () => ({_INIT_SIZE: core.int})
+});
+io._CopyingBytesBuilder._INIT_SIZE = 1024;
+const _chunks = Symbol('_chunks');
+io._BytesBuilder = class _BytesBuilder extends core.Object {
+  new() {
+    this[_chunks] = JSArrayOfListOfint().of([]);
+    this[_length$2] = 0;
+  }
+  add(bytes) {
+    if (!typed_data.Uint8List.is(bytes)) {
+      bytes = typed_data.Uint8List.fromList(bytes);
+    }
+    this[_chunks][dartx.add](bytes);
+    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
+  }
+  addByte(byte) {
+    this.add(JSArrayOfint().of([byte]));
+  }
+  takeBytes() {
+    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    if (this[_chunks][dartx.length] == 1) {
+      let buffer = this[_chunks][dartx.single];
+      this.clear();
+      return buffer;
+    }
+    let buffer = typed_data.Uint8List.new(this[_length$2]);
+    let offset = 0;
+    for (let chunk of this[_chunks]) {
+      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
+      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
+    }
+    this.clear();
+    return buffer;
+  }
+  toBytes() {
+    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    let buffer = typed_data.Uint8List.new(this[_length$2]);
+    let offset = 0;
+    for (let chunk of this[_chunks]) {
+      buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
+      offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
+    }
+    return buffer;
+  }
+  get length() {
+    return this[_length$2];
+  }
+  get isEmpty() {
+    return this[_length$2] == 0;
+  }
+  get isNotEmpty() {
+    return this[_length$2] != 0;
+  }
+  clear() {
+    this[_length$2] = 0;
+    this[_chunks][dartx.clear]();
+  }
+};
+io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
+dart.setSignature(io._BytesBuilder, {
+  fields: () => ({
+    [_length$2]: core.int,
+    [_chunks]: ListOfListOfint()
+  }),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addByte: dart.definiteFunctionType(dart.void, [core.int]),
+    takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
+    toBytes: dart.definiteFunctionType(core.List$(core.int), []),
+    clear: dart.definiteFunctionType(dart.void, [])
+  })
+});
+io._SUCCESS_RESPONSE = 0;
+io._ILLEGAL_ARGUMENT_RESPONSE = 1;
+io._OSERROR_RESPONSE = 2;
+io._FILE_CLOSED_RESPONSE = 3;
+io._ERROR_RESPONSE_ERROR_TYPE = 0;
+io._OSERROR_RESPONSE_ERROR_CODE = 1;
+io._OSERROR_RESPONSE_MESSAGE = 2;
+io._isErrorResponse = function(response) {
+  return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
+};
+dart.fn(io._isErrorResponse, dynamicTobool$());
+io._exceptionFromResponse = function(response, message, path) {
+  dart.assert(io._isErrorResponse(response));
+  switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
+    case io._ILLEGAL_ARGUMENT_RESPONSE:
+    {
+      return new core.ArgumentError();
+    }
+    case io._OSERROR_RESPONSE:
+    {
+      let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
+      return new io.FileSystemException(message, path, err);
+    }
+    case io._FILE_CLOSED_RESPONSE:
+    {
+      return new io.FileSystemException("File closed", path);
+    }
+    default:
+    {
+      return core.Exception.new("Unknown error");
+    }
+  }
+};
+dart.fn(io._exceptionFromResponse, dynamicAndStringAndStringTodynamic());
+io.IOException = class IOException extends core.Object {
+  toString() {
+    return "IOException";
+  }
+};
+io.IOException[dart.implements] = () => [core.Exception];
+io.OSError = class OSError extends core.Object {
+  new(message, errorCode) {
+    if (message === void 0) message = "";
+    if (errorCode === void 0) errorCode = io.OSError.noErrorCode;
+    this.message = message;
+    this.errorCode = errorCode;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write("OS Error");
+    if (!dart.test(this.message[dartx.isEmpty])) {
+      sb.write(": ");
+      sb.write(this.message);
+      if (this.errorCode != io.OSError.noErrorCode) {
+        sb.write(", errno = ");
+        sb.write(dart.toString(this.errorCode));
+      }
+    } else if (this.errorCode != io.OSError.noErrorCode) {
+      sb.write(": errno = ");
+      sb.write(dart.toString(this.errorCode));
+    }
+    return sb.toString();
+  }
+};
+dart.setSignature(io.OSError, {
+  constructors: () => ({new: dart.definiteFunctionType(io.OSError, [], [core.String, core.int])}),
+  fields: () => ({
+    message: core.String,
+    errorCode: core.int
+  }),
+  sfields: () => ({noErrorCode: core.int})
+});
+io.OSError.noErrorCode = -1;
+io._BufferAndStart = class _BufferAndStart extends core.Object {
+  new(buffer, start) {
+    this.buffer = buffer;
+    this.start = start;
+  }
+};
+dart.setSignature(io._BufferAndStart, {
+  constructors: () => ({new: dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int])}),
+  fields: () => ({
+    buffer: core.List,
+    start: core.int
+  })
+});
+io._ensureFastAndSerializableByteData = function(buffer, start, end) {
+  if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
+    return new io._BufferAndStart(buffer, start);
+  }
+  let length = dart.notNull(end) - dart.notNull(start);
+  let newBuffer = typed_data.Uint8List.new(length);
+  let j = start;
+  for (let i = 0; i < length; i++) {
+    let value = core.int._check(buffer[dartx._get](j));
+    if (!(typeof value == 'number')) {
+      dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
+    }
+    newBuffer[dartx._set](i, value);
+    j = dart.notNull(j) + 1;
+  }
+  return new io._BufferAndStart(newBuffer, 0);
+};
+dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
+io._IOCrypto = class _IOCrypto extends core.Object {
+  static getRandomBytes(count) {
+    dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
+  }
+};
+dart.setSignature(io._IOCrypto, {
+  statics: () => ({getRandomBytes: dart.definiteFunctionType(typed_data.Uint8List, [core.int])}),
+  names: ['getRandomBytes']
+});
+io._CryptoUtils = class _CryptoUtils extends core.Object {
+  static bytesToHex(bytes) {
+    let result = new core.StringBuffer();
+    for (let part of bytes) {
+      result.write(dart.str`${dart.notNull(part) < 16 ? '0' : ''}${part[dartx.toRadixString](16)}`);
+    }
+    return result.toString();
+  }
+  static bytesToBase64(bytes, urlSafe, addLineSeparator) {
+    if (urlSafe === void 0) urlSafe = false;
+    if (addLineSeparator === void 0) addLineSeparator = false;
+    let len = bytes[dartx.length];
+    if (len == 0) {
+      return "";
+    }
+    let lookup = dart.test(urlSafe) ? io._CryptoUtils._encodeTableUrlSafe : io._CryptoUtils._encodeTable;
+    let remainderLength = dart.asInt(len[dartx.remainder](3));
+    let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
+    let outputLen = (dart.notNull(len) / 3)[dartx.truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
+    if (dart.test(addLineSeparator)) {
+      outputLen = outputLen + (((outputLen - 1) / io._CryptoUtils.LINE_LENGTH)[dartx.truncate]() << 1 >>> 0);
+    }
+    let out = ListOfint().new(outputLen);
+    let j = 0, i = 0, c = 0;
+    while (i < chunkLength) {
+      let x = (dart.notNull(bytes[dartx._get](i++)) << 16 & 16777215 | dart.notNull(bytes[dartx._get](i++)) << 8 & 16777215 | dart.notNull(bytes[dartx._get](i++))) >>> 0;
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](18)));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 12 & 63));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 6 & 63));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x & 63));
+      if (dart.test(addLineSeparator) && ++c == 19 && j < outputLen - 2) {
+        out[dartx._set](j++, io._CryptoUtils.CR);
+        out[dartx._set](j++, io._CryptoUtils.LF);
+        c = 0;
+      }
+    }
+    if (remainderLength == 1) {
+      let x = bytes[dartx._get](i);
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(x) << 4 & 63));
+      out[dartx._set](j++, io._CryptoUtils.PAD);
+      out[dartx._set](j++, io._CryptoUtils.PAD);
+    } else if (remainderLength == 2) {
+      let x = bytes[dartx._get](i);
+      let y = bytes[dartx._get](i + 1);
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
+      out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(y) << 2 & 63));
+      out[dartx._set](j++, io._CryptoUtils.PAD);
+    }
+    return core.String.fromCharCodes(out);
+  }
+  static base64StringToBytes(input, ignoreInvalidCharacters) {
+    if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
+    let len = input[dartx.length];
+    if (len == 0) {
+      return ListOfint().new(0);
+    }
+    let extrasLen = 0;
+    for (let i = 0; i < dart.notNull(len); i++) {
+      let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i));
+      if (dart.notNull(c) < 0) {
+        extrasLen++;
+        if (c == -2 && !dart.test(ignoreInvalidCharacters)) {
+          dart.throw(new core.FormatException(dart.str`Invalid character: ${input[dartx._get](i)}`));
+        }
+      }
+    }
+    if ((dart.notNull(len) - extrasLen)[dartx['%']](4) != 0) {
+      dart.throw(new core.FormatException(dart.str`Size of Base 64 characters in Input\n          must be a multiple of 4. Input: ${input}`));
+    }
+    let padLength = 0;
+    for (let i = dart.notNull(len) - 1; i >= 0; i--) {
+      let currentCodeUnit = input[dartx.codeUnitAt](i);
+      if (dart.notNull(io._CryptoUtils._decodeTable[dartx._get](currentCodeUnit)) > 0) break;
+      if (currentCodeUnit == io._CryptoUtils.PAD) padLength++;
+    }
+    let outputLen = ((dart.notNull(len) - extrasLen) * 6)[dartx['>>']](3) - padLength;
+    let out = ListOfint().new(outputLen);
+    for (let i = 0, o = 0; o < outputLen;) {
+      let x = 0;
+      for (let j = 4; j > 0;) {
+        let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i++));
+        if (dart.notNull(c) >= 0) {
+          x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
+          j--;
+        }
+      }
+      out[dartx._set](o++, x[dartx['>>']](16));
+      if (o < outputLen) {
+        out[dartx._set](o++, x >> 8 & 255);
+        if (o < outputLen) out[dartx._set](o++, x & 255);
+      }
+    }
+    return out;
+  }
+};
+dart.setSignature(io._CryptoUtils, {
+  sfields: () => ({
+    PAD: core.int,
+    CR: core.int,
+    LF: core.int,
+    LINE_LENGTH: core.int,
+    _encodeTable: core.String,
+    _encodeTableUrlSafe: core.String,
+    _decodeTable: ListOfint()
+  }),
+  statics: () => ({
+    bytesToHex: dart.definiteFunctionType(core.String, [ListOfint()]),
+    bytesToBase64: dart.definiteFunctionType(core.String, [ListOfint()], [core.bool, core.bool]),
+    base64StringToBytes: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.bool])
+  }),
+  names: ['bytesToHex', 'bytesToBase64', 'base64StringToBytes']
+});
+io._CryptoUtils.PAD = 61;
+io._CryptoUtils.CR = 13;
+io._CryptoUtils.LF = 10;
+io._CryptoUtils.LINE_LENGTH = 76;
+io._CryptoUtils._encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+io._CryptoUtils._encodeTableUrlSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+io._CryptoUtils._decodeTable = dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
+io._MASK_8 = 255;
+io._MASK_32 = 4294967295;
+io._BITS_PER_BYTE = 8;
+io._BYTES_PER_WORD = 4;
+const _chunkSizeInWords = Symbol('_chunkSizeInWords');
+const _digestSizeInWords = Symbol('_digestSizeInWords');
+const _bigEndianWords = Symbol('_bigEndianWords');
+const _pendingData = Symbol('_pendingData');
+const _lengthInBytes = Symbol('_lengthInBytes');
+const _currentChunk = Symbol('_currentChunk');
+const _h = Symbol('_h');
+const _digestCalled = Symbol('_digestCalled');
+const _iterate = Symbol('_iterate');
+const _resultAsBytes = Symbol('_resultAsBytes');
+const _finalizeData = Symbol('_finalizeData');
+const _add32 = Symbol('_add32');
+const _roundUp = Symbol('_roundUp');
+const _rotl32 = Symbol('_rotl32');
+const _wordToBytes = Symbol('_wordToBytes');
+const _bytesToChunk = Symbol('_bytesToChunk');
+const _updateHash = Symbol('_updateHash');
+io._HashBase = class _HashBase extends core.Object {
+  new(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
+    this[_chunkSizeInWords] = chunkSizeInWords;
+    this[_digestSizeInWords] = digestSizeInWords;
+    this[_bigEndianWords] = bigEndianWords;
+    this[_pendingData] = JSArrayOfint().of([]);
+    this[_lengthInBytes] = 0;
+    this[_currentChunk] = null;
+    this[_h] = null;
+    this[_digestCalled] = false;
+    this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
+    this[_h] = ListOfint().new(this[_digestSizeInWords]);
+  }
+  add(data) {
+    if (dart.test(this[_digestCalled])) {
+      dart.throw(new core.StateError('Hash update method called after digest was retrieved'));
+    }
+    this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[dartx.length]);
+    this[_pendingData][dartx.addAll](data);
+    this[_iterate]();
+  }
+  close() {
+    if (dart.test(this[_digestCalled])) {
+      return ListOfint()._check(this[_resultAsBytes]());
+    }
+    this[_digestCalled] = true;
+    this[_finalizeData]();
+    this[_iterate]();
+    dart.assert(this[_pendingData][dartx.length] == 0);
+    return ListOfint()._check(this[_resultAsBytes]());
+  }
+  get blockSize() {
+    return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
+  }
+  [_add32](x, y) {
+    return dart.dsend(dart.dsend(x, '+', y), '&', io._MASK_32);
+  }
+  [_roundUp](val, n) {
+    return dart.dsend(dart.dsend(dart.dsend(val, '+', n), '-', 1), '&', dart.dsend(n, '_negate'));
+  }
+  [_rotl32](val, shift) {
+    let mod_shift = dart.notNull(shift) & 31;
+    return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
+  }
+  [_resultAsBytes]() {
+    let result = [];
+    for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
+      result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
+    }
+    return result;
+  }
+  [_bytesToChunk](data, dataIndex) {
+    dart.assert(dart.notNull(data[dartx.length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD);
+    for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
+      let w3 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dataIndex) : data[dartx._get](dart.notNull(dataIndex) + 3);
+      let w2 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 1) : data[dartx._get](dart.notNull(dataIndex) + 2);
+      let w1 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 2) : data[dartx._get](dart.notNull(dataIndex) + 1);
+      let w0 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 3) : data[dartx._get](dataIndex);
+      dataIndex = dart.notNull(dataIndex) + 4;
+      let word = (dart.notNull(w3) & 255) << 24 >>> 0;
+      word = (word | (dart.notNull(w2) & io._MASK_8) << 16) >>> 0;
+      word = (word | (dart.notNull(w1) & io._MASK_8) << 8) >>> 0;
+      word = (word | dart.notNull(w0) & io._MASK_8) >>> 0;
+      this[_currentChunk][dartx._set](wordIndex, word);
+    }
+  }
+  [_wordToBytes](word) {
+    let bytes = ListOfint().new(io._BYTES_PER_WORD);
+    bytes[dartx._set](0, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 24 : 0) & io._MASK_8);
+    bytes[dartx._set](1, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 16 : 8) & io._MASK_8);
+    bytes[dartx._set](2, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 8 : 16) & io._MASK_8);
+    bytes[dartx._set](3, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 0 : 24) & io._MASK_8);
+    return bytes;
+  }
+  [_iterate]() {
+    let len = this[_pendingData][dartx.length];
+    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
+    if (dart.notNull(len) >= chunkSizeInBytes) {
+      let index = 0;
+      for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
+        this[_bytesToChunk](this[_pendingData], index);
+        this[_updateHash](this[_currentChunk]);
+      }
+      this[_pendingData] = this[_pendingData][dartx.sublist](index, len);
+    }
+  }
+  [_finalizeData]() {
+    this[_pendingData][dartx.add](128);
+    let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
+    let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
+    let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
+    let zeroPadding = dart.dsend(finalizedLength, '-', contentsLength);
+    for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
+      this[_pendingData][dartx.add](0);
+    }
+    let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
+    dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
+    if (dart.test(this[_bigEndianWords])) {
+      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+    } else {
+      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+    }
+  }
+};
+dart.setSignature(io._HashBase, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HashBase, [core.int, core.int, core.bool])}),
+  fields: () => ({
+    [_chunkSizeInWords]: core.int,
+    [_digestSizeInWords]: core.int,
+    [_bigEndianWords]: core.bool,
+    [_lengthInBytes]: core.int,
+    [_pendingData]: ListOfint(),
+    [_currentChunk]: ListOfint(),
+    [_h]: ListOfint(),
+    [_digestCalled]: core.bool
+  }),
+  getters: () => ({blockSize: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.dynamic, [ListOfint()]),
+    close: dart.definiteFunctionType(core.List$(core.int), []),
+    [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
+    [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
+    [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
+    [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
+  })
+});
+io._MD5 = class _MD5 extends io._HashBase {
+  new() {
+    super.new(16, 4, false);
+    this[_h][dartx._set](0, 1732584193);
+    this[_h][dartx._set](1, 4023233417);
+    this[_h][dartx._set](2, 2562383102);
+    this[_h][dartx._set](3, 271733878);
+  }
+  newInstance() {
+    return new io._MD5();
+  }
+  [_updateHash](m) {
+    dart.assert(m[dartx.length] == 16);
+    let a = this[_h][dartx._get](0);
+    let b = this[_h][dartx._get](1);
+    let c = this[_h][dartx._get](2);
+    let d = this[_h][dartx._get](3);
+    let t0 = null;
+    let t1 = null;
+    for (let i = 0; i < 64; i++) {
+      if (i < 16) {
+        t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & io._MASK_32 & dart.notNull(d)) >>> 0;
+        t1 = i;
+      } else if (i < 32) {
+        t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & io._MASK_32 & dart.notNull(c)) >>> 0;
+        t1 = (5 * i + 1)[dartx['%']](16);
+      } else if (i < 48) {
+        t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
+        t1 = (3 * i + 5)[dartx['%']](16);
+      } else {
+        t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & io._MASK_32)) >>> 0;
+        t1 = (7 * i)[dartx['%']](16);
+      }
+      let temp = d;
+      d = c;
+      c = b;
+      b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](io._MD5._k[dartx._get](i), m[dartx._get](core.int._check(t1))))), io._MD5._r[dartx._get](i))));
+      a = temp;
+    }
+    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
+    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
+    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
+    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
+  }
+};
+dart.setSignature(io._MD5, {
+  constructors: () => ({new: dart.definiteFunctionType(io._MD5, [])}),
+  methods: () => ({
+    newInstance: dart.definiteFunctionType(io._MD5, []),
+    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
+  }),
+  sfields: () => ({
+    _k: ListOfint(),
+    _r: ListOfint()
+  })
+});
+io._MD5._k = dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
+io._MD5._r = dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
+const _w = Symbol('_w');
+io._SHA1 = class _SHA1 extends io._HashBase {
+  new() {
+    this[_w] = ListOfint().new(80);
+    super.new(16, 5, true);
+    this[_h][dartx._set](0, 1732584193);
+    this[_h][dartx._set](1, 4023233417);
+    this[_h][dartx._set](2, 2562383102);
+    this[_h][dartx._set](3, 271733878);
+    this[_h][dartx._set](4, 3285377520);
+  }
+  newInstance() {
+    return new io._SHA1();
+  }
+  [_updateHash](m) {
+    dart.assert(m[dartx.length] == 16);
+    let a = this[_h][dartx._get](0);
+    let b = this[_h][dartx._get](1);
+    let c = this[_h][dartx._get](2);
+    let d = this[_h][dartx._get](3);
+    let e = this[_h][dartx._get](4);
+    for (let i = 0; i < 80; i++) {
+      if (i < 16) {
+        this[_w][dartx._set](i, m[dartx._get](i));
+      } else {
+        let n = (dart.notNull(this[_w][dartx._get](i - 3)) ^ dart.notNull(this[_w][dartx._get](i - 8)) ^ dart.notNull(this[_w][dartx._get](i - 14)) ^ dart.notNull(this[_w][dartx._get](i - 16))) >>> 0;
+        this[_w][dartx._set](i, this[_rotl32](n, 1));
+      }
+      let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][dartx._get](i));
+      if (i < 20) {
+        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
+      } else if (i < 40) {
+        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
+      } else if (i < 60) {
+        t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
+      } else {
+        t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
+      }
+      e = d;
+      d = c;
+      c = this[_rotl32](b, 30);
+      b = a;
+      a = core.int._check(dart.dsend(t, '&', io._MASK_32));
+    }
+    this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
+    this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
+    this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
+    this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
+    this[_h][dartx._set](4, core.int._check(this[_add32](e, this[_h][dartx._get](4))));
+  }
+};
+dart.setSignature(io._SHA1, {
+  constructors: () => ({new: dart.definiteFunctionType(io._SHA1, [])}),
+  fields: () => ({[_w]: ListOfint()}),
+  methods: () => ({
+    newInstance: dart.definiteFunctionType(io._SHA1, []),
+    [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
+  })
+});
+io.ZLibOption = class ZLibOption extends core.Object {};
+dart.setSignature(io.ZLibOption, {
+  sfields: () => ({
+    MIN_WINDOW_BITS: core.int,
+    MAX_WINDOW_BITS: core.int,
+    DEFAULT_WINDOW_BITS: core.int,
+    MIN_LEVEL: core.int,
+    MAX_LEVEL: core.int,
+    DEFAULT_LEVEL: core.int,
+    MIN_MEM_LEVEL: core.int,
+    MAX_MEM_LEVEL: core.int,
+    DEFAULT_MEM_LEVEL: core.int,
+    STRATEGY_FILTERED: core.int,
+    STRATEGY_HUFFMAN_ONLY: core.int,
+    STRATEGY_RLE: core.int,
+    STRATEGY_FIXED: core.int,
+    STRATEGY_DEFAULT: core.int
+  })
+});
+io.ZLibOption.MIN_WINDOW_BITS = 8;
+io.ZLibOption.MAX_WINDOW_BITS = 15;
+io.ZLibOption.DEFAULT_WINDOW_BITS = 15;
+io.ZLibOption.MIN_LEVEL = -1;
+io.ZLibOption.MAX_LEVEL = 9;
+io.ZLibOption.DEFAULT_LEVEL = 6;
+io.ZLibOption.MIN_MEM_LEVEL = 1;
+io.ZLibOption.MAX_MEM_LEVEL = 9;
+io.ZLibOption.DEFAULT_MEM_LEVEL = 8;
+io.ZLibOption.STRATEGY_FILTERED = 1;
+io.ZLibOption.STRATEGY_HUFFMAN_ONLY = 2;
+io.ZLibOption.STRATEGY_RLE = 3;
+io.ZLibOption.STRATEGY_FIXED = 4;
+io.ZLibOption.STRATEGY_DEFAULT = 0;
+io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
+  new(opts) {
+    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
+    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
+    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
+    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
+    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
+    let raw = opts && 'raw' in opts ? opts.raw : false;
+    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
+    this.level = level;
+    this.windowBits = windowBits;
+    this.memLevel = memLevel;
+    this.strategy = strategy;
+    this.dictionary = dictionary;
+    this.raw = raw;
+    this.gzip = gzip;
+    super.new();
+    io._validateZLibeLevel(this.level);
+    io._validateZLibMemLevel(this.memLevel);
+    io._validateZLibStrategy(this.strategy);
+    io._validateZLibWindowBits(this.windowBits);
+  }
+  _default() {
+    this.level = io.ZLibOption.DEFAULT_LEVEL;
+    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
+    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
+    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
+    this.raw = false;
+    this.gzip = false;
+    this.dictionary = null;
+    super.new();
+  }
+  get encoder() {
+    return new io.ZLibEncoder({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
+  }
+  get decoder() {
+    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
+  }
+};
+dart.addSimpleTypeTests(io.ZLibCodec);
+dart.defineNamedConstructor(io.ZLibCodec, '_default');
+dart.setSignature(io.ZLibCodec, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.ZLibCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
+    _default: dart.definiteFunctionType(io.ZLibCodec, [])
+  }),
+  fields: () => ({
+    gzip: core.bool,
+    level: core.int,
+    memLevel: core.int,
+    strategy: core.int,
+    windowBits: core.int,
+    raw: core.bool,
+    dictionary: ListOfint()
+  }),
+  getters: () => ({
+    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
+    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
+  })
+});
+io.ZLIB = dart.const(new io.ZLibCodec._default());
+io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
+  new(opts) {
+    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
+    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
+    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
+    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
+    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
+    let raw = opts && 'raw' in opts ? opts.raw : false;
+    let gzip = opts && 'gzip' in opts ? opts.gzip : true;
+    this.level = level;
+    this.windowBits = windowBits;
+    this.memLevel = memLevel;
+    this.strategy = strategy;
+    this.dictionary = dictionary;
+    this.raw = raw;
+    this.gzip = gzip;
+    super.new();
+    io._validateZLibeLevel(this.level);
+    io._validateZLibMemLevel(this.memLevel);
+    io._validateZLibStrategy(this.strategy);
+    io._validateZLibWindowBits(this.windowBits);
+  }
+  _default() {
+    this.level = io.ZLibOption.DEFAULT_LEVEL;
+    this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
+    this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
+    this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
+    this.raw = false;
+    this.gzip = true;
+    this.dictionary = null;
+    super.new();
+  }
+  get encoder() {
+    return new io.ZLibEncoder({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
+  }
+  get decoder() {
+    return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
+  }
+};
+dart.addSimpleTypeTests(io.GZipCodec);
+dart.defineNamedConstructor(io.GZipCodec, '_default');
+dart.setSignature(io.GZipCodec, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.GZipCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
+    _default: dart.definiteFunctionType(io.GZipCodec, [])
+  }),
+  fields: () => ({
+    gzip: core.bool,
+    level: core.int,
+    memLevel: core.int,
+    strategy: core.int,
+    windowBits: core.int,
+    dictionary: ListOfint(),
+    raw: core.bool
+  }),
+  getters: () => ({
+    encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
+    decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
+  })
+});
+io.GZIP = dart.const(new io.GZipCodec._default());
+io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
+  new(opts) {
+    let gzip = opts && 'gzip' in opts ? opts.gzip : false;
+    let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
+    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
+    let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
+    let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
+    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
+    let raw = opts && 'raw' in opts ? opts.raw : false;
+    this.gzip = gzip;
+    this.level = level;
+    this.windowBits = windowBits;
+    this.memLevel = memLevel;
+    this.strategy = strategy;
+    this.dictionary = dictionary;
+    this.raw = raw;
+    super.new();
+    io._validateZLibeLevel(this.level);
+    io._validateZLibMemLevel(this.memLevel);
+    io._validateZLibStrategy(this.strategy);
+    io._validateZLibWindowBits(this.windowBits);
+  }
+  convert(bytes) {
+    let sink = new io._BufferSink();
+    let _ = this.startChunkedConversion(sink);
+    _.add(bytes);
+    _.close();
+    return sink.builder.takeBytes();
+  }
+  startChunkedConversion(sink) {
+    if (!convert.ByteConversionSink.is(sink)) {
+      sink = convert.ByteConversionSink.from(sink);
+    }
+    return new io._ZLibEncoderSink(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
+  }
+};
+dart.addSimpleTypeTests(io.ZLibEncoder);
+dart.setSignature(io.ZLibEncoder, {
+  constructors: () => ({new: dart.definiteFunctionType(io.ZLibEncoder, [], {gzip: core.bool, level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool})}),
+  fields: () => ({
+    gzip: core.bool,
+    level: core.int,
+    memLevel: core.int,
+    strategy: core.int,
+    windowBits: core.int,
+    dictionary: ListOfint(),
+    raw: core.bool
+  }),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
+  })
+});
+io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
+  new(opts) {
+    let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
+    let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
+    let raw = opts && 'raw' in opts ? opts.raw : false;
+    this.windowBits = windowBits;
+    this.dictionary = dictionary;
+    this.raw = raw;
+    super.new();
+    io._validateZLibWindowBits(this.windowBits);
+  }
+  convert(bytes) {
+    let sink = new io._BufferSink();
+    let _ = this.startChunkedConversion(sink);
+    _.add(bytes);
+    _.close();
+    return sink.builder.takeBytes();
+  }
+  startChunkedConversion(sink) {
+    if (!convert.ByteConversionSink.is(sink)) {
+      sink = convert.ByteConversionSink.from(sink);
+    }
+    return new io._ZLibDecoderSink(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
+  }
+};
+dart.addSimpleTypeTests(io.ZLibDecoder);
+dart.setSignature(io.ZLibDecoder, {
+  constructors: () => ({new: dart.definiteFunctionType(io.ZLibDecoder, [], {windowBits: core.int, dictionary: ListOfint(), raw: core.bool})}),
+  fields: () => ({
+    windowBits: core.int,
+    dictionary: ListOfint(),
+    raw: core.bool
+  }),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
+  })
+});
+io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
+  new() {
+    this.builder = io.BytesBuilder.new({copy: false});
+    super.new();
+  }
+  add(chunk) {
+    this.builder.add(chunk);
+  }
+  addSlice(chunk, start, end, isLast) {
+    if (typed_data.Uint8List.is(chunk)) {
+      let list = chunk;
+      this.builder.add(typed_data.Uint8List.view(list[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+    } else {
+      this.builder.add(chunk[dartx.sublist](start, end));
+    }
+  }
+  close() {}
+};
+dart.setSignature(io._BufferSink, {
+  fields: () => ({builder: io.BytesBuilder}),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _sink$0 = Symbol('_sink');
+const _filter$ = Symbol('_filter');
+const _closed = Symbol('_closed');
+const _empty = Symbol('_empty');
+let const$52;
+io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
+  new(sink, filter) {
+    this[_sink$0] = sink;
+    this[_filter$] = filter;
+    this[_closed] = false;
+    this[_empty] = true;
+    super.new();
+  }
+  add(data) {
+    this.addSlice(data, 0, data[dartx.length], false);
+  }
+  addSlice(data, start, end, isLast) {
+    if (dart.test(this[_closed])) return;
+    if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
+    core.RangeError.checkValidRange(start, end, data[dartx.length]);
+    try {
+      this[_empty] = false;
+      let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
+      this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      let out = null;
+      while ((out = this[_filter$].processed({flush: false})) != null) {
+        this[_sink$0].add(ListOfint()._check(out));
+      }
+    } catch (e) {
+      this[_closed] = true;
+      throw e;
+    }
+
+    if (dart.test(isLast)) this.close();
+  }
+  close() {
+    if (dart.test(this[_closed])) return;
+    if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
+    try {
+      let out = null;
+      while ((out = this[_filter$].processed({end: true})) != null) {
+        this[_sink$0].add(ListOfint()._check(out));
+      }
+    } catch (e) {
+      this[_closed] = true;
+      dart.throw(e);
+    }
+
+    this[_closed] = true;
+    this[_sink$0].close();
+  }
+};
+dart.setSignature(io._FilterSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
+  fields: () => ({
+    [_filter$]: io._Filter,
+    [_sink$0]: convert.ByteConversionSink,
+    [_closed]: core.bool,
+    [_empty]: core.bool
+  }),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {
+  new(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
+    super.new(sink, io._Filter._newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
+  }
+};
+dart.setSignature(io._ZLibEncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ZLibEncoderSink, [convert.ByteConversionSink, core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool])})
+});
+io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {
+  new(sink, windowBits, dictionary, raw) {
+    super.new(sink, io._Filter._newZLibInflateFilter(windowBits, dictionary, raw));
+  }
+};
+dart.setSignature(io._ZLibDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ZLibDecoderSink, [convert.ByteConversionSink, core.int, ListOfint(), core.bool])})
+});
+io._Filter = class _Filter extends core.Object {
+  static _newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
+    dart.throw(new core.UnsupportedError("_newZLibDeflateFilter"));
+  }
+  static _newZLibInflateFilter(windowBits, dictionary, raw) {
+    dart.throw(new core.UnsupportedError("_newZLibInflateFilter"));
+  }
+};
+dart.setSignature(io._Filter, {
+  statics: () => ({
+    _newZLibDeflateFilter: dart.definiteFunctionType(io._Filter, [core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool]),
+    _newZLibInflateFilter: dart.definiteFunctionType(io._Filter, [core.int, ListOfint(), core.bool])
+  }),
+  names: ['_newZLibDeflateFilter', '_newZLibInflateFilter']
+});
+io._validateZLibWindowBits = function(windowBits) {
+  if (io.ZLibOption.MIN_WINDOW_BITS > dart.notNull(windowBits) || io.ZLibOption.MAX_WINDOW_BITS < dart.notNull(windowBits)) {
+    dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.MIN_WINDOW_BITS, io.ZLibOption.MAX_WINDOW_BITS));
+  }
+};
+dart.fn(io._validateZLibWindowBits, intTovoid());
+io._validateZLibeLevel = function(level) {
+  if (io.ZLibOption.MIN_LEVEL > dart.notNull(level) || io.ZLibOption.MAX_LEVEL < dart.notNull(level)) {
+    dart.throw(new core.RangeError.range(level, io.ZLibOption.MIN_LEVEL, io.ZLibOption.MAX_LEVEL));
+  }
+};
+dart.fn(io._validateZLibeLevel, intTovoid());
+io._validateZLibMemLevel = function(memLevel) {
+  if (io.ZLibOption.MIN_MEM_LEVEL > dart.notNull(memLevel) || io.ZLibOption.MAX_MEM_LEVEL < dart.notNull(memLevel)) {
+    dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.MIN_MEM_LEVEL, io.ZLibOption.MAX_MEM_LEVEL));
+  }
+};
+dart.fn(io._validateZLibMemLevel, intTovoid());
+let const$53;
+io._validateZLibStrategy = function(strategy) {
+  let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+  if (strategies[dartx.indexOf](strategy) == -1) {
+    dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
+  }
+};
+dart.fn(io._validateZLibStrategy, intTovoid());
+io.Directory = class Directory extends core.Object {
+  static new(path) {
+    return new io._Directory(path);
+  }
+  static fromUri(uri) {
+    return io.Directory.new(uri.toFilePath());
+  }
+  static get current() {
+    return io._Directory.current;
+  }
+  static set current(path) {
+    io._Directory.current = path;
+  }
+  static get systemTemp() {
+    return io._Directory.systemTemp;
+  }
+};
+io.Directory[dart.implements] = () => [io.FileSystemEntity];
+dart.setSignature(io.Directory, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.Directory, [core.String]),
+    fromUri: dart.definiteFunctionType(io.Directory, [core.Uri])
+  }),
+  fields: () => ({path: core.String}),
+  sgetters: () => ({
+    current: dart.definiteFunctionType(io.Directory, []),
+    systemTemp: dart.definiteFunctionType(io.Directory, [])
+  }),
+  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])})
+});
+const _isErrorResponse = Symbol('_isErrorResponse');
+const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
+const _absolutePath = Symbol('_absolutePath');
+const _computeExistingIndex = Symbol('_computeExistingIndex');
+const _delete = Symbol('_delete');
+const _deleteSync = Symbol('_deleteSync');
+const _type = Symbol('_type');
+io.FileSystemEntity = class FileSystemEntity extends core.Object {
+  get uri() {
+    return core.Uri.file(this.path);
+  }
+  resolveSymbolicLinks() {
+    return io._IOService._dispatch(io._FILE_RESOLVE_SYMBOLIC_LINKS, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
+      }
+      return FutureOrOfString()._check(response);
+    }, dynamicToFutureOrOfString()));
+  }
+  resolveSymbolicLinksSync() {
+    let result = io.FileSystemEntity._resolveSymbolicLinks(this.path);
+    io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
+    return core.String._check(result);
+  }
+  delete(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    return this[_delete]({recursive: recursive});
+  }
+  deleteSync(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    return this[_deleteSync]({recursive: recursive});
+  }
+  watch(opts) {
+    let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.ALL;
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    return io._FileSystemWatcher._watch(io.FileSystemEntity._trimTrailingPathSeparators(this.path), events, recursive);
+  }
+  static identical(path1, path2) {
+    return io._IOService._dispatch(io._FILE_IDENTICAL, JSArrayOfString().of([path1, path2])).then(core.bool)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, dart.str`Error in FileSystemEntity.identical(${path1}, ${path2})`, ""));
+      }
+      return FutureOrOfbool()._check(response);
+    }, dynamicToFutureOrOfbool()));
+  }
+  get isAbsolute() {
+    if (dart.test(io.Platform.isWindows)) {
+      return this.path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
+    } else {
+      return this.path[dartx.startsWith]('/');
+    }
+  }
+  get [_absolutePath]() {
+    if (dart.test(this.isAbsolute)) return this.path;
+    let current = io.Directory.current.path;
+    if (dart.test(current[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(current[dartx.endsWith]('\\'))) {
+      return dart.str`${current}${this.path}`;
+    } else {
+      return dart.str`${current}${io.Platform.pathSeparator}${this.path}`;
+    }
+  }
+  static identicalSync(path1, path2) {
+    let result = io.FileSystemEntity._identical(path1, path2);
+    io.FileSystemEntity._throwIfError(result, 'Error in FileSystemEntity.identicalSync');
+    return core.bool._check(result);
+  }
+  static get isWatchSupported() {
+    return io._FileSystemWatcher.isSupported;
+  }
+  static type(path, opts) {
+    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
+    return io.FileSystemEntity._getTypeAsync(path, followLinks).then(io.FileSystemEntityType)(io.FileSystemEntityType._lookup);
+  }
+  static typeSync(path, opts) {
+    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
+    return io.FileSystemEntityType._lookup(io.FileSystemEntity._getTypeSync(path, followLinks));
+  }
+  static isLink(path) {
+    return io.FileSystemEntity._getTypeAsync(path, false).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.LINK[_type], intTobool()));
+  }
+  static isFile(path) {
+    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.FILE[_type], intTobool()));
+  }
+  static isDirectory(path) {
+    return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.DIRECTORY[_type], intTobool()));
+  }
+  static isLinkSync(path) {
+    return io.FileSystemEntity._getTypeSync(path, false) == io.FileSystemEntityType.LINK[_type];
+  }
+  static isFileSync(path) {
+    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.FILE[_type];
+  }
+  static isDirectorySync(path) {
+    return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.DIRECTORY[_type];
+  }
+  static _getType(path, followLinks) {
+    dart.throw(new core.UnsupportedError("FileSystemEntity._getType"));
+  }
+  static _identical(path1, path2) {
+    dart.throw(new core.UnsupportedError("FileSystemEntity._identical"));
+  }
+  static _resolveSymbolicLinks(path) {
+    dart.throw(new core.UnsupportedError("FileSystemEntity._resolveSymbolicLinks"));
+  }
+  static parentOf(path) {
+    let rootEnd = -1;
+    if (dart.test(io.Platform.isWindows)) {
+      if (dart.test(path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern))) {
+        rootEnd = path[dartx.indexOf](core.RegExp.new('[/\\\\]'), 2);
+        if (rootEnd == -1) return path;
+      } else if (dart.test(path[dartx.startsWith]('\\')) || dart.test(path[dartx.startsWith]('/'))) {
+        rootEnd = 0;
+      }
+    } else if (dart.test(path[dartx.startsWith]('/'))) {
+      rootEnd = 0;
+    }
+    let pos = path[dartx.lastIndexOf](io.FileSystemEntity._parentRegExp);
+    if (dart.notNull(pos) > dart.notNull(rootEnd)) {
+      return path[dartx.substring](0, dart.notNull(pos) + 1);
+    } else if (dart.notNull(rootEnd) > -1) {
+      return path[dartx.substring](0, dart.notNull(rootEnd) + 1);
+    } else {
+      return '.';
+    }
+  }
+  get parent() {
+    return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
+  }
+  static _getTypeSync(path, followLinks) {
+    let result = io.FileSystemEntity._getType(path, followLinks);
+    io.FileSystemEntity._throwIfError(result, 'Error getting type of FileSystemEntity');
+    return core.int._check(result);
+  }
+  static _getTypeAsync(path, followLinks) {
+    return io._IOService._dispatch(io._FILE_TYPE, JSArrayOfObject().of([path, followLinks])).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Error getting type", path));
+      }
+      return FutureOrOfint()._check(response);
+    }, dynamicToFutureOrOfint()));
+  }
+  static _throwIfError(result, msg, path) {
+    if (path === void 0) path = null;
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException(msg, path, result));
+    } else if (core.ArgumentError.is(result)) {
+      dart.throw(result);
+    }
+  }
+  static _trimTrailingPathSeparators(path) {
+    if (!(typeof path == 'string')) return path;
+    if (dart.test(io.Platform.isWindows)) {
+      while (dart.notNull(path[dartx.length]) > 1 && (dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) || dart.test(path[dartx.endsWith]('/')))) {
+        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
+      }
+    } else {
+      while (dart.notNull(path[dartx.length]) > 1 && dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
+        path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
+      }
+    }
+    return path;
+  }
+  static _ensureTrailingPathSeparators(path) {
+    if (!(typeof path == 'string')) return path;
+    if (dart.test(path[dartx.isEmpty])) path = '.';
+    if (dart.test(io.Platform.isWindows)) {
+      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) && !dart.test(path[dartx.endsWith]('/'))) {
+        path = dart.str`${path}${io.Platform.pathSeparator}`;
+      }
+    } else {
+      while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
+        path = dart.str`${path}${io.Platform.pathSeparator}`;
+      }
+    }
+    return path;
+  }
+};
+dart.setSignature(io.FileSystemEntity, {
+  getters: () => ({
+    uri: dart.definiteFunctionType(core.Uri, []),
+    isAbsolute: dart.definiteFunctionType(core.bool, []),
+    [_absolutePath]: dart.definiteFunctionType(core.String, []),
+    parent: dart.definiteFunctionType(io.Directory, [])
+  }),
+  methods: () => ({
+    resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
+    resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
+    delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
+    deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
+  }),
+  sfields: () => ({
+    _absoluteWindowsPathPattern: core.RegExp,
+    _parentRegExp: core.RegExp
+  }),
+  sgetters: () => ({isWatchSupported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    identical: dart.definiteFunctionType(async.Future$(core.bool), [core.String, core.String]),
+    identicalSync: dart.definiteFunctionType(core.bool, [core.String, core.String]),
+    type: dart.definiteFunctionType(async.Future$(io.FileSystemEntityType), [core.String], {followLinks: core.bool}),
+    typeSync: dart.definiteFunctionType(io.FileSystemEntityType, [core.String], {followLinks: core.bool}),
+    isLink: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
+    isFile: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
+    isDirectory: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
+    isLinkSync: dart.definiteFunctionType(core.bool, [core.String]),
+    isFileSync: dart.definiteFunctionType(core.bool, [core.String]),
+    isDirectorySync: dart.definiteFunctionType(core.bool, [core.String]),
+    _getType: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
+    _identical: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _resolveSymbolicLinks: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    parentOf: dart.definiteFunctionType(core.String, [core.String]),
+    _getTypeSync: dart.definiteFunctionType(core.int, [core.String, core.bool]),
+    _getTypeAsync: dart.definiteFunctionType(async.Future$(core.int), [core.String, core.bool]),
+    _throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String]),
+    _trimTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String]),
+    _ensureTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String])
+  }),
+  names: ['identical', 'identicalSync', 'type', 'typeSync', 'isLink', 'isFile', 'isDirectory', 'isLinkSync', 'isFileSync', 'isDirectorySync', '_getType', '_identical', '_resolveSymbolicLinks', 'parentOf', '_getTypeSync', '_getTypeAsync', '_throwIfError', '_trimTrailingPathSeparators', '_ensureTrailingPathSeparators']
+});
+dart.defineLazy(io.FileSystemEntity, {
+  get _absoluteWindowsPathPattern() {
+    return core.RegExp.new('^(\\\\\\\\|[a-zA-Z]:[/\\\\])');
+  },
+  get _parentRegExp() {
+    return dart.test(io.Platform.isWindows) ? core.RegExp.new('[^/\\\\][/\\\\]+[^/\\\\]') : core.RegExp.new('[^/]/+[^/]');
+  }
+});
+io._Directory = class _Directory extends io.FileSystemEntity {
+  new(path) {
+    this.path = path;
+    if (!(typeof this.path == 'string')) {
+      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
+    }
+  }
+  static _current() {
+    dart.throw(new core.UnsupportedError("Directory._current"));
+  }
+  static _setCurrent(path) {
+    dart.throw(new core.UnsupportedError("Directory_SetCurrent"));
+  }
+  static _createTemp(path) {
+    dart.throw(new core.UnsupportedError("Directory._createTemp"));
+  }
+  static _systemTemp() {
+    dart.throw(new core.UnsupportedError("Directory._systemTemp"));
+  }
+  static _exists(path) {
+    dart.throw(new core.UnsupportedError("Directory._exists"));
+  }
+  static _create(path) {
+    dart.throw(new core.UnsupportedError("Directory._create"));
+  }
+  static _deleteNative(path, recursive) {
+    dart.throw(new core.UnsupportedError("Directory._deleteNative"));
+  }
+  static _rename(path, newPath) {
+    dart.throw(new core.UnsupportedError("Directory._rename"));
+  }
+  static _fillWithDirectoryListing(list, path, recursive, followLinks) {
+    dart.throw(new core.UnsupportedError("Directory._fillWithDirectoryListing"));
+  }
+  static get current() {
+    let result = io._Directory._current();
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Getting current working directory failed", "", result));
+    }
+    return new io._Directory(core.String._check(result));
+  }
+  static set current(path) {
+    if (io.Directory.is(path)) path = dart.dload(path, 'path');
+    let result = io._Directory._setCurrent(path);
+    if (core.ArgumentError.is(result)) dart.throw(result);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Setting current working directory failed", core.String._check(path), result));
+    }
+  }
+  get uri() {
+    return core.Uri.directory(this.path);
+  }
+  exists() {
+    return io._IOService._dispatch(io._DIRECTORY_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
+      }
+      return dart.equals(response, 1);
+    }, dynamicTobool$()));
+  }
+  existsSync() {
+    let result = io._Directory._exists(this.path);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Exists failed", this.path, result));
+    }
+    return dart.equals(result, 1);
+  }
+  get absolute() {
+    return io.Directory.new(this[_absolutePath]);
+  }
+  stat() {
+    return io.FileStat.stat(this.path);
+  }
+  statSync() {
+    return io.FileStat.statSync(this.path);
+  }
+  [_computeExistingIndex](dirsToCreate) {
+    let future = null;
+    let notFound = dirsToCreate[dartx.length];
+    for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
+      if (future == null) {
+        future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
+      } else {
+        future = dart.dsend(future, 'then', dart.fn(index => {
+          if (!dart.equals(index, notFound)) {
+            return async.Future.value(index);
+          }
+          return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
+        }, dynamicTodynamic$()));
+      }
+    }
+    if (future == null) {
+      return FutureOfint().value(notFound);
+    } else {
+      return FutureOfint()._check(future);
+    }
+  }
+  create(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      return this.exists().then(io.Directory)(dart.fn(exists => {
+        if (dart.test(exists)) return this;
+        if (this.path != this.parent.path) {
+          return this.parent.create({recursive: true}).then(io.Directory)(dart.fn(_ => this.create(), DirectoryToFutureOfDirectory()));
+        } else {
+          return this.create();
+        }
+      }, boolToFutureOrOfDirectory()));
+    } else {
+      return io._IOService._dispatch(io._DIRECTORY_CREATE, JSArrayOfString().of([this.path])).then(io._Directory)(dart.fn(response => {
+        if (dart.test(this[_isErrorResponse](response))) {
+          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
+        }
+        return this;
+      }, dynamicTo_Directory()));
+    }
+  }
+  createSync(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      if (dart.test(this.existsSync())) return;
+      if (this.path != this.parent.path) {
+        this.parent.createSync({recursive: true});
+      }
+    }
+    let result = io._Directory._create(this.path);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Creation failed", this.path, result));
+    }
+  }
+  static get systemTemp() {
+    return io.Directory.new(io._Directory._systemTemp());
+  }
+  createTemp(prefix) {
+    if (prefix === void 0) prefix = null;
+    if (prefix == null) prefix = '';
+    if (this.path == '') {
+      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
+    }
+    let fullPrefix = null;
+    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
+      fullPrefix = dart.str`${this.path}${prefix}`;
+    } else {
+      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
+    }
+    return io._IOService._dispatch(io._DIRECTORY_CREATE_TEMP, JSArrayOfString().of([fullPrefix])).then(io.Directory)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
+      }
+      return io.Directory.new(core.String._check(response));
+    }, dynamicToDirectory()));
+  }
+  createTempSync(prefix) {
+    if (prefix === void 0) prefix = null;
+    if (prefix == null) prefix = '';
+    if (this.path == '') {
+      dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
+    }
+    let fullPrefix = null;
+    if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
+      fullPrefix = dart.str`${this.path}${prefix}`;
+    } else {
+      fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
+    }
+    let result = io._Directory._createTemp(fullPrefix);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Creation of temporary directory failed", fullPrefix, result));
+    }
+    return io.Directory.new(core.String._check(result));
+  }
+  [_delete](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    return io._IOService._dispatch(io._DIRECTORY_DELETE, JSArrayOfObject().of([this.path, recursive])).then(io._Directory)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
+      }
+      return this;
+    }, dynamicTo_Directory()));
+  }
+  [_deleteSync](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    let result = io._Directory._deleteNative(this.path, recursive);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Deletion failed", this.path, result));
+    }
+  }
+  rename(newPath) {
+    return io._IOService._dispatch(io._DIRECTORY_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.Directory)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
+      }
+      return io.Directory.new(newPath);
+    }, dynamicToDirectory()));
+  }
+  renameSync(newPath) {
+    if (!(typeof newPath == 'string')) {
+      dart.throw(new core.ArgumentError());
+    }
+    let result = io._Directory._rename(this.path, newPath);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Rename failed", this.path, result));
+    }
+    return io.Directory.new(newPath);
+  }
+  list(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
+    return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
+  }
+  listSync(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
+    if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
+      dart.throw(new core.ArgumentError());
+    }
+    let result = JSArrayOfFileSystemEntity().of([]);
+    io._Directory._fillWithDirectoryListing(result, io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks);
+    return result;
+  }
+  toString() {
+    return dart.str`Directory: '${this.path}'`;
+  }
+  [_isErrorResponse](response) {
+    return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
+  }
+  [_exceptionOrErrorFromResponse](response, message) {
+    dart.assert(this[_isErrorResponse](response));
+    switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
+      case io._ILLEGAL_ARGUMENT_RESPONSE:
+      {
+        return new core.ArgumentError();
+      }
+      case io._OSERROR_RESPONSE:
+      {
+        let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
+        return new io.FileSystemException(message, this.path, err);
+      }
+      default:
+      {
+        return core.Exception.new("Unknown error");
+      }
+    }
+  }
+};
+io._Directory[dart.implements] = () => [io.Directory];
+dart.setSignature(io._Directory, {
+  constructors: () => ({new: dart.definiteFunctionType(io._Directory, [core.String])}),
+  fields: () => ({path: core.String}),
+  getters: () => ({absolute: dart.definiteFunctionType(io.Directory, [])}),
+  methods: () => ({
+    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
+    existsSync: dart.definiteFunctionType(core.bool, []),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+    statSync: dart.definiteFunctionType(io.FileStat, []),
+    [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
+    create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
+    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
+    createTempSync: dart.definiteFunctionType(io.Directory, [], [core.String]),
+    [_delete]: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
+    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    rename: dart.definiteFunctionType(async.Future$(io.Directory), [core.String]),
+    renameSync: dart.definiteFunctionType(io.Directory, [core.String]),
+    list: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
+    listSync: dart.definiteFunctionType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
+    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [_exceptionOrErrorFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])
+  }),
+  sgetters: () => ({
+    current: dart.definiteFunctionType(io.Directory, []),
+    systemTemp: dart.definiteFunctionType(io.Directory, [])
+  }),
+  ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
+  statics: () => ({
+    _current: dart.definiteFunctionType(dart.dynamic, []),
+    _setCurrent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _createTemp: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _systemTemp: dart.definiteFunctionType(core.String, []),
+    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
+    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _fillWithDirectoryListing: dart.definiteFunctionType(dart.void, [ListOfFileSystemEntity(), core.String, core.bool, core.bool])
+  }),
+  names: ['_current', '_setCurrent', '_createTemp', '_systemTemp', '_exists', '_create', '_deleteNative', '_rename', '_fillWithDirectoryListing']
+});
+io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
+  static new(pointer) {
+    dart.throw(new core.UnsupportedError("Directory._list"));
+  }
+};
+dart.setSignature(io._AsyncDirectoryListerOps, {
+  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryListerOps, [core.int])})
+});
+const _ops = Symbol('_ops');
+const _pointer = Symbol('_pointer');
+const _cleanup = Symbol('_cleanup');
+io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
+  new(path, recursive, followLinks) {
+    this.closeCompleter = async.Completer.new();
+    this.path = path;
+    this.recursive = recursive;
+    this.followLinks = followLinks;
+    this.controller = null;
+    this.canceled = false;
+    this.nextRunning = false;
+    this.closed = false;
+    this[_ops] = null;
+    this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
+  }
+  [_pointer]() {
+    return this[_ops] == null ? null : this[_ops].getPointer();
+  }
+  get stream() {
+    return this.controller.stream;
+  }
+  onListen() {
+    io._IOService._dispatch(io._DIRECTORY_LIST_START, JSArrayOfObject().of([this.path, this.recursive, this.followLinks])).then(dart.dynamic)(dart.fn(response => {
+      if (typeof response == 'number') {
+        this[_ops] = io._AsyncDirectoryListerOps.new(response);
+        this.next();
+      } else if (core.Error.is(response)) {
+        this.controller.addError(response, response.stackTrace);
+        this.close();
+      } else {
+        this.error(response);
+        this.close();
+      }
+    }, dynamicToNull$()));
+  }
+  onResume() {
+    if (!dart.test(this.nextRunning)) {
+      this.next();
+    }
+  }
+  onCancel() {
+    this.canceled = true;
+    if (!dart.test(this.nextRunning)) {
+      this.close();
+    }
+    return this.closeCompleter.future;
+  }
+  next() {
+    if (dart.test(this.canceled)) {
+      this.close();
+      return;
+    }
+    if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
+      return;
+    }
+    let pointer = this[_pointer]();
+    if (pointer == null) {
+      return;
+    }
+    this.nextRunning = true;
+    io._IOService._dispatch(io._DIRECTORY_LIST_NEXT, JSArrayOfint().of([pointer])).then(dart.dynamic)(dart.fn(result => {
+      this.nextRunning = false;
+      if (core.List.is(result)) {
+        this.next();
+        dart.assert(result[dartx.length][dartx['%']](2) == 0);
+        for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
+          dart.assert(i[dartx['%']](2) == 0);
+          switch (result[dartx._get](i++)) {
+            case io._AsyncDirectoryLister.LIST_FILE:
+            {
+              this.controller.add(io.File.new(core.String._check(result[dartx._get](i))));
+              break;
+            }
+            case io._AsyncDirectoryLister.LIST_DIRECTORY:
+            {
+              this.controller.add(io.Directory.new(core.String._check(result[dartx._get](i))));
+              break;
+            }
+            case io._AsyncDirectoryLister.LIST_LINK:
+            {
+              this.controller.add(io.Link.new(core.String._check(result[dartx._get](i))));
+              break;
+            }
+            case io._AsyncDirectoryLister.LIST_ERROR:
+            {
+              this.error(result[dartx._get](i));
+              break;
+            }
+            case io._AsyncDirectoryLister.LIST_DONE:
+            {
+              this.canceled = true;
+              return;
+            }
+          }
+        }
+      } else {
+        this.controller.addError(new io.FileSystemException("Internal error"));
+      }
+    }, dynamicToNull$()));
+  }
+  [_cleanup]() {
+    this.controller.close();
+    this.closeCompleter.complete();
+    this[_ops] = null;
+  }
+  close() {
+    if (dart.test(this.closed)) {
+      return;
+    }
+    if (dart.test(this.nextRunning)) {
+      return;
+    }
+    this.closed = true;
+    let pointer = this[_pointer]();
+    if (pointer == null) {
+      this[_cleanup]();
+    } else {
+      io._IOService._dispatch(io._DIRECTORY_LIST_STOP, JSArrayOfint().of([pointer])).whenComplete(dart.bind(this, _cleanup));
+    }
+  }
+  error(message) {
+    let errorType = dart.dindex(dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR), io._ERROR_RESPONSE_ERROR_TYPE);
+    if (dart.equals(errorType, io._ILLEGAL_ARGUMENT_RESPONSE)) {
+      this.controller.addError(new core.ArgumentError());
+    } else if (dart.equals(errorType, io._OSERROR_RESPONSE)) {
+      let responseError = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR);
+      let err = new io.OSError(core.String._check(dart.dindex(responseError, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(responseError, io._OSERROR_RESPONSE_ERROR_CODE)));
+      let errorPath = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_PATH);
+      if (errorPath == null) errorPath = this.path;
+      this.controller.addError(new io.FileSystemException("Directory listing failed", core.String._check(errorPath), err));
+    } else {
+      this.controller.addError(new io.FileSystemException("Internal error"));
+    }
+  }
+};
+dart.setSignature(io._AsyncDirectoryLister, {
+  constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryLister, [core.String, core.bool, core.bool])}),
+  fields: () => ({
+    path: core.String,
+    recursive: core.bool,
+    followLinks: core.bool,
+    controller: async.StreamController,
+    canceled: core.bool,
+    nextRunning: core.bool,
+    closed: core.bool,
+    [_ops]: io._AsyncDirectoryListerOps,
+    closeCompleter: async.Completer
+  }),
+  getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
+  methods: () => ({
+    [_pointer]: dart.definiteFunctionType(core.int, []),
+    onListen: dart.definiteFunctionType(dart.void, []),
+    onResume: dart.definiteFunctionType(dart.void, []),
+    onCancel: dart.definiteFunctionType(async.Future, []),
+    next: dart.definiteFunctionType(dart.void, []),
+    [_cleanup]: dart.definiteFunctionType(dart.void, []),
+    close: dart.definiteFunctionType(dart.void, []),
+    error: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  sfields: () => ({
+    LIST_FILE: core.int,
+    LIST_DIRECTORY: core.int,
+    LIST_LINK: core.int,
+    LIST_ERROR: core.int,
+    LIST_DONE: core.int,
+    RESPONSE_TYPE: core.int,
+    RESPONSE_PATH: core.int,
+    RESPONSE_COMPLETE: core.int,
+    RESPONSE_ERROR: core.int
+  })
+});
+io._AsyncDirectoryLister.LIST_FILE = 0;
+io._AsyncDirectoryLister.LIST_DIRECTORY = 1;
+io._AsyncDirectoryLister.LIST_LINK = 2;
+io._AsyncDirectoryLister.LIST_ERROR = 3;
+io._AsyncDirectoryLister.LIST_DONE = 4;
+io._AsyncDirectoryLister.RESPONSE_TYPE = 0;
+io._AsyncDirectoryLister.RESPONSE_PATH = 1;
+io._AsyncDirectoryLister.RESPONSE_COMPLETE = 1;
+io._AsyncDirectoryLister.RESPONSE_ERROR = 2;
+io._EventHandler = class _EventHandler extends core.Object {
+  static _sendData(sender, sendPort, data) {
+    dart.throw(new core.UnsupportedError("EventHandler._sendData"));
+  }
+};
+dart.setSignature(io._EventHandler, {
+  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
+  names: ['_sendData']
+});
+const _mode = Symbol('_mode');
+io.FileMode = class FileMode extends core.Object {
+  _internal(mode) {
+    this[_mode] = mode;
+  }
+};
+dart.defineNamedConstructor(io.FileMode, '_internal');
+dart.setSignature(io.FileMode, {
+  constructors: () => ({_internal: dart.definiteFunctionType(io.FileMode, [core.int])}),
+  fields: () => ({[_mode]: core.int}),
+  sfields: () => ({
+    READ: io.FileMode,
+    WRITE: io.FileMode,
+    APPEND: io.FileMode,
+    WRITE_ONLY: io.FileMode,
+    WRITE_ONLY_APPEND: io.FileMode
+  })
+});
+dart.defineLazy(io.FileMode, {
+  get READ() {
+    return dart.const(new io.FileMode._internal(0));
+  },
+  get WRITE() {
+    return dart.const(new io.FileMode._internal(1));
+  },
+  get APPEND() {
+    return dart.const(new io.FileMode._internal(2));
+  },
+  get WRITE_ONLY() {
+    return dart.const(new io.FileMode._internal(3));
+  },
+  get WRITE_ONLY_APPEND() {
+    return dart.const(new io.FileMode._internal(4));
+  }
+});
+io.READ = io.FileMode.READ;
+io.WRITE = io.FileMode.WRITE;
+io.APPEND = io.FileMode.APPEND;
+io.WRITE_ONLY = io.FileMode.WRITE_ONLY;
+io.WRITE_ONLY_APPEND = io.FileMode.WRITE_ONLY_APPEND;
+io.FileLock = class FileLock extends core.Object {
+  new(index) {
+    this.index = index;
+  }
+  toString() {
+    return {
+      0: "FileLock.SHARED",
+      1: "FileLock.EXCLUSIVE"
+    }[this.index];
+  }
+};
+dart.setSignature(io.FileLock, {
+  fields: () => ({index: core.int})
+});
+dart.defineEnumValues(io.FileLock, [
+  'SHARED',
+  'EXCLUSIVE'
+]);
+io.File = class File extends core.Object {
+  static new(path) {
+    return new io._File(path);
+  }
+  static fromUri(uri) {
+    return io.File.new(uri.toFilePath());
+  }
+};
+io.File[dart.implements] = () => [io.FileSystemEntity];
+dart.setSignature(io.File, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.File, [core.String]),
+    fromUri: dart.definiteFunctionType(io.File, [core.Uri])
+  })
+});
+io.RandomAccessFile = class RandomAccessFile extends core.Object {};
+io.FileSystemException = class FileSystemException extends core.Object {
+  new(message, path, osError) {
+    if (message === void 0) message = "";
+    if (path === void 0) path = "";
+    if (osError === void 0) osError = null;
+    this.message = message;
+    this.path = path;
+    this.osError = osError;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write("FileSystemException");
+    if (!dart.test(this.message[dartx.isEmpty])) {
+      sb.write(dart.str`: ${this.message}`);
+      if (this.path != null) {
+        sb.write(dart.str`, path = '${this.path}'`);
+      }
+      if (this.osError != null) {
+        sb.write(dart.str` (${this.osError})`);
+      }
+    } else if (this.osError != null) {
+      sb.write(dart.str`: ${this.osError}`);
+      if (this.path != null) {
+        sb.write(dart.str`, path = '${this.path}'`);
+      }
+    } else if (this.path != null) {
+      sb.write(dart.str`: ${this.path}`);
+    }
+    return sb.toString();
+  }
+};
+io.FileSystemException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.FileSystemException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.FileSystemException, [], [core.String, core.String, io.OSError])}),
+  fields: () => ({
+    message: core.String,
+    path: core.String,
+    osError: io.OSError
+  })
+});
+io._BLOCK_SIZE = 64 * 1024;
+const _closeCompleter = Symbol('_closeCompleter');
+const _path$ = Symbol('_path');
+const _position$0 = Symbol('_position');
+const _end$0 = Symbol('_end');
+const _controller$0 = Symbol('_controller');
+const _openedFile = Symbol('_openedFile');
+const _unsubscribed = Symbol('_unsubscribed');
+const _readInProgress = Symbol('_readInProgress');
+const _atEnd = Symbol('_atEnd');
+const _setupController = Symbol('_setupController');
+const _start$2 = Symbol('_start');
+const _readBlock = Symbol('_readBlock');
+const _closeFile = Symbol('_closeFile');
+io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
+  new(path, position, end) {
+    this[_closeCompleter] = async.Completer.new();
+    this[_path$] = path;
+    this[_position$0] = position;
+    this[_end$0] = end;
+    this[_controller$0] = null;
+    this[_openedFile] = null;
+    this[_unsubscribed] = false;
+    this[_readInProgress] = true;
+    this[_closed] = false;
+    this[_atEnd] = false;
+    super.new();
+    if (this[_position$0] == null) this[_position$0] = 0;
+  }
+  forStdin() {
+    this[_closeCompleter] = async.Completer.new();
+    this[_position$0] = 0;
+    this[_controller$0] = null;
+    this[_path$] = null;
+    this[_openedFile] = null;
+    this[_end$0] = null;
+    this[_unsubscribed] = false;
+    this[_readInProgress] = true;
+    this[_closed] = false;
+    this[_atEnd] = false;
+    super.new();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    this[_setupController]();
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  [_setupController]() {
+    this[_controller$0] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
+        this[_unsubscribed] = true;
+        return this[_closeFile]();
+      }, VoidToFuture())});
+  }
+  [_closeFile]() {
+    if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
+      return this[_closeCompleter].future;
+    }
+    this[_closed] = true;
+    const done = (function() {
+      this[_closeCompleter].complete();
+      this[_controller$0].close();
+    }).bind(this);
+    dart.fn(done, VoidTovoid$());
+    this[_openedFile].close().catchError(dart.bind(this[_controller$0], 'addError')).whenComplete(done);
+    return this[_closeCompleter].future;
+  }
+  [_readBlock]() {
+    if (dart.test(this[_readInProgress])) return;
+    if (dart.test(this[_atEnd])) {
+      this[_closeFile]();
+      return;
+    }
+    this[_readInProgress] = true;
+    let readBytes = io._BLOCK_SIZE;
+    if (this[_end$0] != null) {
+      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
+      if (dart.notNull(readBytes) < 0) {
+        this[_readInProgress] = false;
+        if (!dart.test(this[_unsubscribed])) {
+          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
+          this[_closeFile]();
+          this[_unsubscribed] = true;
+        }
+        return;
+      }
+    }
+    this[_openedFile].read(readBytes).then(dart.dynamic)(dart.fn(block => {
+      this[_readInProgress] = false;
+      if (dart.test(this[_unsubscribed])) {
+        this[_closeFile]();
+        return;
+      }
+      this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
+      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
+        this[_atEnd] = true;
+      }
+      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
+        this[_readBlock]();
+      }
+      this[_controller$0].add(block);
+      if (dart.test(this[_atEnd])) {
+        this[_closeFile]();
+      }
+    }, ListOfintToNull())).catchError(dart.fn((e, s) => {
+      if (!dart.test(this[_unsubscribed])) {
+        this[_controller$0].addError(e, core.StackTrace._check(s));
+        this[_closeFile]();
+        this[_unsubscribed] = true;
+      }
+    }, dynamicAnddynamicToNull()));
+  }
+  [_start$2]() {
+    if (dart.notNull(this[_position$0]) < 0) {
+      this[_controller$0].addError(new core.RangeError(dart.str`Bad start position: ${this[_position$0]}`));
+      this[_controller$0].close();
+      this[_closeCompleter].complete();
+      return;
+    }
+    const onReady = (function(file) {
+      this[_openedFile] = file;
+      this[_readInProgress] = false;
+      this[_readBlock]();
+    }).bind(this);
+    dart.fn(onReady, RandomAccessFileTovoid());
+    const onOpenFile = (function(file) {
+      if (dart.notNull(this[_position$0]) > 0) {
+        file.setPosition(this[_position$0]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
+            this[_controller$0].addError(e, core.StackTrace._check(s));
+            this[_readInProgress] = false;
+            this[_closeFile]();
+          }, dynamicAnddynamicToNull())});
+      } else {
+        onReady(file);
+      }
+    }).bind(this);
+    dart.fn(onOpenFile, RandomAccessFileTovoid());
+    const openFailed = (function(error, stackTrace) {
+      this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
+      this[_controller$0].close();
+      this[_closeCompleter].complete();
+    }).bind(this);
+    dart.fn(openFailed, dynamicAnddynamicTovoid$());
+    if (this[_path$] != null) {
+      io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+    } else {
+      try {
+        onOpenFile(io._File._openStdioSync(0));
+      } catch (e) {
+        let s = dart.stackTrace(e);
+        openFailed(e, s);
+      }
+
+    }
+  }
+};
+dart.addSimpleTypeTests(io._FileStream);
+dart.defineNamedConstructor(io._FileStream, 'forStdin');
+dart.setSignature(io._FileStream, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._FileStream, [core.String, core.int, core.int]),
+    forStdin: dart.definiteFunctionType(io._FileStream, [])
+  }),
+  fields: () => ({
+    [_controller$0]: StreamControllerOfListOfint(),
+    [_path$]: core.String,
+    [_openedFile]: io.RandomAccessFile,
+    [_position$0]: core.int,
+    [_end$0]: core.int,
+    [_closeCompleter]: async.Completer,
+    [_unsubscribed]: core.bool,
+    [_readInProgress]: core.bool,
+    [_closed]: core.bool,
+    [_atEnd]: core.bool
+  }),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    [_setupController]: dart.definiteFunctionType(dart.void, []),
+    [_closeFile]: dart.definiteFunctionType(async.Future, []),
+    [_readBlock]: dart.definiteFunctionType(dart.void, []),
+    [_start$2]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _file = Symbol('_file');
+const _openFuture = Symbol('_openFuture');
+io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
+  new(file, mode) {
+    this[_file] = file;
+    this[_openFuture] = null;
+    this[_openFuture] = this[_file].open({mode: mode});
+  }
+  fromStdio(fd) {
+    this[_file] = null;
+    this[_openFuture] = null;
+    dart.assert(1 <= dart.notNull(fd) && dart.notNull(fd) <= 2);
+    this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
+  }
+  addStream(stream) {
+    let completer = CompleterOfFile().sync();
+    this[_openFuture].then(dart.dynamic)(dart.fn(openedFile => {
+      let _subscription = null;
+      function error(e, stackTrace) {
+        if (stackTrace === void 0) stackTrace = null;
+        dart.dsend(_subscription, 'cancel');
+        openedFile.close();
+        completer.completeError(e, stackTrace);
+      }
+      dart.fn(error, dynamic__Tovoid());
+      _subscription = stream.listen(dart.fn(d => {
+        dart.dsend(_subscription, 'pause');
+        try {
+          openedFile.writeFrom(d, 0, d[dartx.length]).then(dart.dynamic)(dart.fn(_ => dart.dsend(_subscription, 'resume'), RandomAccessFileToFutureOr()), {onError: error});
+        } catch (e) {
+          let stackTrace = dart.stackTrace(e);
+          error(e, stackTrace);
+        }
+
+      }, ListOfintToNull()), {onDone: dart.fn(() => {
+          completer.complete(this[_file]);
+        }, VoidToNull()), onError: error, cancelOnError: true});
+    }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
+    return completer.future;
+  }
+  close() {
+    return this[_openFuture].then(io.File)(dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfRandomAccessFile()));
+  }
+};
+dart.addSimpleTypeTests(io._FileStreamConsumer);
+dart.defineNamedConstructor(io._FileStreamConsumer, 'fromStdio');
+dart.setSignature(io._FileStreamConsumer, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._FileStreamConsumer, [io.File, io.FileMode]),
+    fromStdio: dart.definiteFunctionType(io._FileStreamConsumer, [core.int])
+  }),
+  fields: () => ({
+    [_file]: io.File,
+    [_openFuture]: FutureOfRandomAccessFile()
+  }),
+  methods: () => ({
+    addStream: dart.definiteFunctionType(async.Future$(io.File), [StreamOfListOfint()]),
+    close: dart.definiteFunctionType(async.Future$(io.File), [])
+  })
+});
+const _tryDecode = Symbol('_tryDecode');
+let const$54;
+let const$55;
+io._File = class _File extends io.FileSystemEntity {
+  new(path) {
+    this.path = path;
+    if (!(typeof this.path == 'string')) {
+      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
+    }
+  }
+  exists() {
+    return io._IOService._dispatch(io._FILE_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
+      }
+      return FutureOrOfbool()._check(response);
+    }, dynamicToFutureOrOfbool()));
+  }
+  static _exists(path) {
+    dart.throw(new core.UnsupportedError("File._exists"));
+  }
+  existsSync() {
+    let result = io._File._exists(this.path);
+    io._File.throwIfError(result, "Cannot check existence of file", this.path);
+    return core.bool._check(result);
+  }
+  get absolute() {
+    return io.File.new(this[_absolutePath]);
+  }
+  stat() {
+    return io.FileStat.stat(this.path);
+  }
+  statSync() {
+    return io.FileStat.statSync(this.path);
+  }
+  create(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
+    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE, JSArrayOfString().of([this.path])), dynamicToFuture())).then(io._File)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
+      }
+      return this;
+    }, dynamicTo_File()));
+  }
+  static _create(path) {
+    dart.throw(new core.UnsupportedError("File._create"));
+  }
+  static _createLink(path, target) {
+    dart.throw(new core.UnsupportedError("File._createLink"));
+  }
+  static _linkTarget(path) {
+    dart.throw(new core.UnsupportedError("File._linkTarget"));
+  }
+  createSync(opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      this.parent.createSync({recursive: true});
+    }
+    let result = io._File._create(this.path);
+    io._File.throwIfError(result, "Cannot create file", this.path);
+  }
+  [_delete](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      return io.Directory.new(this.path).delete({recursive: true}).then(io._File)(dart.fn(_ => this, FileSystemEntityTo_File()));
+    }
+    return io._IOService._dispatch(io._FILE_DELETE, JSArrayOfString().of([this.path])).then(io._File)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
+      }
+      return this;
+    }, dynamicTo_File()));
+  }
+  static _deleteNative(path) {
+    dart.throw(new core.UnsupportedError("File._deleteNative"));
+  }
+  static _deleteLinkNative(path) {
+    dart.throw(new core.UnsupportedError("File._deleteLinkNative"));
+  }
+  [_deleteSync](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      return io.Directory.new(this.path).deleteSync({recursive: true});
+    }
+    let result = io._File._deleteNative(this.path);
+    io._File.throwIfError(result, "Cannot delete file", this.path);
+  }
+  rename(newPath) {
+    return io._IOService._dispatch(io._FILE_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot rename file to '${newPath}'`, this.path));
+      }
+      return io.File.new(newPath);
+    }, dynamicToFile()));
+  }
+  static _rename(oldPath, newPath) {
+    dart.throw(new core.UnsupportedError("File._rename"));
+  }
+  static _renameLink(oldPath, newPath) {
+    dart.throw(new core.UnsupportedError("File._renameLink"));
+  }
+  renameSync(newPath) {
+    let result = io._File._rename(this.path, newPath);
+    io._File.throwIfError(result, dart.str`Cannot rename file to '${newPath}'`, this.path);
+    return io.File.new(newPath);
+  }
+  copy(newPath) {
+    return io._IOService._dispatch(io._FILE_COPY, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, dart.str`Cannot copy file to '${newPath}'`, this.path));
+      }
+      return io.File.new(newPath);
+    }, dynamicToFile()));
+  }
+  static _copy(oldPath, newPath) {
+    dart.throw(new core.UnsupportedError("File._copy"));
+  }
+  copySync(newPath) {
+    let result = io._File._copy(this.path, newPath);
+    io._File.throwIfError(result, dart.str`Cannot copy file to '${newPath}'`, this.path);
+    return io.File.new(newPath);
+  }
+  open(opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
+    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
+      return FutureOfRandomAccessFile().error(new core.ArgumentError('Invalid file mode for this operation'));
+    }
+    return io._IOService._dispatch(io._FILE_OPEN, JSArrayOfObject().of([this.path, mode[_mode]])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
+      }
+      return new io._RandomAccessFile(core.int._check(response), this.path);
+    }, dynamicTo_RandomAccessFile()));
+  }
+  length() {
+    return io._IOService._dispatch(io._FILE_LENGTH_FROM_PATH, JSArrayOfString().of([this.path])).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
+      }
+      return FutureOrOfint()._check(response);
+    }, dynamicToFutureOrOfint()));
+  }
+  static _lengthFromPath(path) {
+    dart.throw(new core.UnsupportedError("File._lengthFromPath"));
+  }
+  lengthSync() {
+    let result = io._File._lengthFromPath(this.path);
+    io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
+    return core.int._check(result);
+  }
+  lastModified() {
+    return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
+      }
+      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
+    }, dynamicToDateTime()));
+  }
+  static _lastModified(path) {
+    dart.throw(new core.UnsupportedError("File._lastModified"));
+  }
+  lastModifiedSync() {
+    let ms = io._File._lastModified(this.path);
+    io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
+    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
+  }
+  static _open(path, mode) {
+    dart.throw(new core.UnsupportedError("File._open"));
+  }
+  openSync(opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
+    if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
+      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
+    }
+    let id = io._File._open(this.path, mode[_mode]);
+    io._File.throwIfError(id, "Cannot open file", this.path);
+    return new io._RandomAccessFile(core.int._check(id), this.path);
+  }
+  static _openStdio(fd) {
+    dart.throw(new core.UnsupportedError("File._openStdio"));
+  }
+  static _openStdioSync(fd) {
+    let id = io._File._openStdio(fd);
+    if (id == 0) {
+      dart.throw(new io.FileSystemException(dart.str`Cannot open stdio file for: ${fd}`));
+    }
+    return new io._RandomAccessFile(id, "");
+  }
+  openRead(start, end) {
+    if (start === void 0) start = null;
+    if (end === void 0) end = null;
+    return new io._FileStream(this.path, start, end);
+  }
+  openWrite(opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    if (!dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
+      dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
+    }
+    let consumer = new io._FileStreamConsumer(this, mode);
+    return io.IOSink.new(consumer, {encoding: encoding});
+  }
+  readAsBytes() {
+    function readDataChunked(file) {
+      let builder = io.BytesBuilder.new({copy: false});
+      let completer = async.Completer.new();
+      function read() {
+        dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
+          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
+            builder.add(ListOfint()._check(data));
+            read();
+          } else {
+            completer.complete(builder.takeBytes());
+          }
+        }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
+      }
+      dart.fn(read, VoidTovoid$());
+      read();
+      return FutureOfListOfint()._check(completer.future);
+    }
+    dart.fn(readDataChunked, dynamicToFutureOfListOfint());
+    return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
+      if (length == 0) {
+        return readDataChunked(file);
+      }
+      return file.read(length);
+    }, intToFutureOfListOfint())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint()));
+  }
+  readAsBytesSync() {
+    let opened = this.openSync();
+    try {
+      let data = null;
+      let length = opened.lengthSync();
+      if (length == 0) {
+        let builder = io.BytesBuilder.new({copy: false});
+        do {
+          data = opened.readSync(io._BLOCK_SIZE);
+          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
+        } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
+        data = builder.takeBytes();
+      } else {
+        data = opened.readSync(length);
+      }
+      return ListOfint()._check(data);
+    } finally {
+      opened.closeSync();
+    }
+  }
+  [_tryDecode](bytes, encoding) {
+    try {
+      return encoding.decode(bytes);
+    } catch (_) {
+      dart.throw(new io.FileSystemException(dart.str`Failed to decode data using encoding '${encoding.name}'`, this.path));
+    }
+
+  }
+  readAsString(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return this.readAsBytes().then(core.String)(dart.fn(bytes => this[_tryDecode](bytes, encoding), ListOfintToString()));
+  }
+  readAsStringSync(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return this[_tryDecode](this.readAsBytesSync(), encoding);
+  }
+  readAsLines(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
+  }
+  readAsLinesSync(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+  }
+  writeAsBytes(bytes, opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
+    let flush = opts && 'flush' in opts ? opts.flush : false;
+    return this.open({mode: mode}).then(io.File)(dart.fn(file => file.writeFrom(bytes, 0, bytes[dartx.length]).then(dart.dynamic)(dart.fn(_ => {
+      if (dart.test(flush)) return file.flush().then(io._File)(dart.fn(_ => this, RandomAccessFileTo_File()));
+      return this;
+    }, RandomAccessFileToObject())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOrOfFile()));
+  }
+  writeAsBytesSync(bytes, opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
+    let flush = opts && 'flush' in opts ? opts.flush : false;
+    let opened = this.openSync({mode: mode});
+    try {
+      opened.writeFromSync(bytes, 0, bytes[dartx.length]);
+      if (dart.test(flush)) opened.flushSync();
+    } finally {
+      opened.closeSync();
+    }
+  }
+  writeAsString(contents, opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    let flush = opts && 'flush' in opts ? opts.flush : false;
+    try {
+      return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
+    } catch (e) {
+      return FutureOfFile().error(e);
+    }
+
+  }
+  writeAsStringSync(contents, opts) {
+    let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    let flush = opts && 'flush' in opts ? opts.flush : false;
+    this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
+  }
+  toString() {
+    return dart.str`File: '${this.path}'`;
+  }
+  static throwIfError(result, msg, path) {
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException(msg, path, result));
+    }
+  }
+};
+io._File[dart.implements] = () => [io.File];
+dart.setSignature(io._File, {
+  constructors: () => ({new: dart.definiteFunctionType(io._File, [core.String])}),
+  fields: () => ({path: core.String}),
+  getters: () => ({absolute: dart.definiteFunctionType(io.File, [])}),
+  methods: () => ({
+    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
+    existsSync: dart.definiteFunctionType(core.bool, []),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+    statSync: dart.definiteFunctionType(io.FileStat, []),
+    create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
+    createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
+    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    rename: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
+    renameSync: dart.definiteFunctionType(io.File, [core.String]),
+    copy: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
+    copySync: dart.definiteFunctionType(io.File, [core.String]),
+    open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
+    length: dart.definiteFunctionType(async.Future$(core.int), []),
+    lengthSync: dart.definiteFunctionType(core.int, []),
+    lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
+    lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
+    openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
+    openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
+    openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
+    readAsBytes: dart.definiteFunctionType(async.Future$(core.List$(core.int)), []),
+    readAsBytesSync: dart.definiteFunctionType(core.List$(core.int), []),
+    [_tryDecode]: dart.definiteFunctionType(core.String, [ListOfint(), convert.Encoding]),
+    readAsString: dart.definiteFunctionType(async.Future$(core.String), [], {encoding: convert.Encoding}),
+    readAsStringSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding}),
+    readAsLines: dart.definiteFunctionType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
+    readAsLinesSync: dart.definiteFunctionType(core.List$(core.String), [], {encoding: convert.Encoding}),
+    writeAsBytes: dart.definiteFunctionType(async.Future$(io.File), [ListOfint()], {mode: io.FileMode, flush: core.bool}),
+    writeAsBytesSync: dart.definiteFunctionType(dart.void, [ListOfint()], {mode: io.FileMode, flush: core.bool}),
+    writeAsString: dart.definiteFunctionType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
+    writeAsStringSync: dart.definiteFunctionType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
+  }),
+  statics: () => ({
+    _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _createLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _linkTarget: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _deleteLinkNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
+    _openStdio: dart.definiteFunctionType(core.int, [core.int]),
+    _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
+    throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
+  }),
+  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
+});
+io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
+  static new(pointer) {
+    dart.throw(new core.UnsupportedError("RandomAccessFile"));
+  }
+};
+dart.setSignature(io._RandomAccessFileOps, {
+  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFileOps, [core.int])})
+});
+const _asyncDispatched = Symbol('_asyncDispatched');
+const _fileService = Symbol('_fileService');
+const _resourceInfo = Symbol('_resourceInfo');
+const _maybeConnectHandler = Symbol('_maybeConnectHandler');
+const _maybePerformCleanup = Symbol('_maybePerformCleanup');
+const _dispatch = Symbol('_dispatch');
+const _checkAvailable = Symbol('_checkAvailable');
+io._RandomAccessFile = class _RandomAccessFile extends core.Object {
+  new(pointer, path) {
+    this.path = path;
+    this[_asyncDispatched] = false;
+    this[_fileService] = null;
+    this[_resourceInfo] = null;
+    this[_ops] = null;
+    this.closed = false;
+    this[_ops] = io._RandomAccessFileOps.new(pointer);
+    this[_resourceInfo] = new io._FileResourceInfo(this);
+    this[_maybeConnectHandler]();
+  }
+  [_maybePerformCleanup]() {
+    if (dart.test(this.closed)) {
+      io._FileResourceInfo.FileClosed(this[_resourceInfo]);
+    }
+  }
+  [_maybeConnectHandler]() {
+    if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
+      developer.registerExtension('ext.dart.io.getOpenFiles', io._FileResourceInfo.getOpenFiles);
+      developer.registerExtension('ext.dart.io.getFileByID', io._FileResourceInfo.getFileInfoMapByID);
+      io._RandomAccessFile._connectedResourceHandler = true;
+    }
+  }
+  close() {
+    return this[_dispatch](io._FILE_CLOSE, [null], {markClosed: true}).then(io._RandomAccessFile)(dart.fn(result => {
+      if (!dart.equals(result, -1)) {
+        this.closed = dart.test(this.closed) || dart.equals(result, 0);
+        this[_maybePerformCleanup]();
+        return this;
+      } else {
+        dart.throw(new io.FileSystemException("Cannot close file", this.path));
+      }
+    }, dynamicTo_RandomAccessFile()));
+  }
+  closeSync() {
+    this[_checkAvailable]();
+    let id = this[_ops].close();
+    if (id == -1) {
+      dart.throw(new io.FileSystemException("Cannot close file", this.path));
+    }
+    this.closed = dart.test(this.closed) || id == 0;
+    this[_maybePerformCleanup]();
+  }
+  readByte() {
+    return this[_dispatch](io._FILE_READ_BYTE, [null]).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
+      }
+      this[_resourceInfo].addRead(1);
+      return FutureOrOfint()._check(response);
+    }, dynamicToFutureOrOfint()));
+  }
+  readByteSync() {
+    this[_checkAvailable]();
+    let result = this[_ops].readByte();
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("readByte failed", this.path, result));
+    }
+    this[_resourceInfo].addRead(1);
+    return core.int._check(result);
+  }
+  read(bytes) {
+    if (!(typeof bytes == 'number')) {
+      dart.throw(new core.ArgumentError(bytes));
+    }
+    return this[_dispatch](io._FILE_READ, JSArrayOfint().of([null, bytes])).then(ListOfint())(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
+      }
+      this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
+      return FutureOrOfListOfint()._check(dart.dindex(response, 1));
+    }, dynamicToFutureOrOfListOfint()));
+  }
+  readSync(bytes) {
+    this[_checkAvailable]();
+    if (!(typeof bytes == 'number')) {
+      dart.throw(new core.ArgumentError(bytes));
+    }
+    let result = this[_ops].read(bytes);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("readSync failed", this.path, result));
+    }
+    this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
+    return ListOfint()._check(result);
+  }
+  readInto(buffer, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
+    if (end == start) {
+      return FutureOfint().value(0);
+    }
+    let length = dart.notNull(end) - dart.notNull(start);
+    return this[_dispatch](io._FILE_READ_INTO, JSArrayOfint().of([null, length])).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
+      }
+      let read = dart.dindex(response, 1);
+      let data = dart.dindex(response, 2);
+      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
+      this[_resourceInfo].addRead(core.int._check(read));
+      return FutureOrOfint()._check(read);
+    }, dynamicToFutureOrOfint()));
+  }
+  readIntoSync(buffer, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    this[_checkAvailable]();
+    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
+    if (end == start) {
+      return 0;
+    }
+    let result = this[_ops].readInto(buffer, start, end);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("readInto failed", this.path, result));
+    }
+    this[_resourceInfo].addRead(core.int._check(result));
+    return core.int._check(result);
+  }
+  writeByte(value) {
+    if (!(typeof value == 'number')) {
+      dart.throw(new core.ArgumentError(value));
+    }
+    return this[_dispatch](io._FILE_WRITE_BYTE, JSArrayOfint().of([null, value])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
+      }
+      this[_resourceInfo].addWrite(1);
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  writeByteSync(value) {
+    this[_checkAvailable]();
+    if (!(typeof value == 'number')) {
+      dart.throw(new core.ArgumentError(value));
+    }
+    let result = this[_ops].writeByte(value);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("writeByte failed", this.path, result));
+    }
+    this[_resourceInfo].addWrite(1);
+    return core.int._check(result);
+  }
+  writeFrom(buffer, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError("Invalid arguments to writeFrom"));
+    }
+    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
+    if (end == start) {
+      return FutureOfRandomAccessFile().value(this);
+    }
+    let result = null;
+    try {
+      result = io._ensureFastAndSerializableByteData(buffer, start, end);
+    } catch (e) {
+      return FutureOfRandomAccessFile().error(e);
+    }
+
+    let request = core.List.new(4);
+    request[dartx._set](0, null);
+    request[dartx._set](1, result.buffer);
+    request[dartx._set](2, result.start);
+    request[dartx._set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
+    return this[_dispatch](io._FILE_WRITE_FROM, request).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
+      }
+      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  writeFromSync(buffer, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    this[_checkAvailable]();
+    if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError("Invalid arguments to writeFromSync"));
+    }
+    end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
+    if (end == start) {
+      return;
+    }
+    let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
+    let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
+    }
+    this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+  }
+  writeString(string, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    if (!convert.Encoding.is(encoding)) {
+      dart.throw(new core.ArgumentError(encoding));
+    }
+    let data = encoding.encode(string);
+    return this.writeFrom(data, 0, data[dartx.length]);
+  }
+  writeStringSync(string, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    if (!convert.Encoding.is(encoding)) {
+      dart.throw(new core.ArgumentError(encoding));
+    }
+    let data = encoding.encode(string);
+    this.writeFromSync(data, 0, data[dartx.length]);
+  }
+  position() {
+    return this[_dispatch](io._FILE_POSITION, [null]).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
+      }
+      return FutureOrOfint()._check(response);
+    }, dynamicToFutureOrOfint()));
+  }
+  positionSync() {
+    this[_checkAvailable]();
+    let result = this[_ops].position();
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("position failed", this.path, result));
+    }
+    return core.int._check(result);
+  }
+  setPosition(position) {
+    return this[_dispatch](io._FILE_SET_POSITION, JSArrayOfint().of([null, position])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
+      }
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  setPositionSync(position) {
+    this[_checkAvailable]();
+    let result = this[_ops].setPosition(position);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("setPosition failed", this.path, result));
+    }
+  }
+  truncate(length) {
+    return this[_dispatch](io._FILE_TRUNCATE, JSArrayOfint().of([null, length])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
+      }
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  truncateSync(length) {
+    this[_checkAvailable]();
+    let result = this[_ops].truncate(length);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("truncate failed", this.path, result));
+    }
+  }
+  length() {
+    return this[_dispatch](io._FILE_LENGTH, [null]).then(core.int)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
+      }
+      return FutureOrOfint()._check(response);
+    }, dynamicToFutureOrOfint()));
+  }
+  lengthSync() {
+    this[_checkAvailable]();
+    let result = this[_ops].length();
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("length failed", this.path, result));
+    }
+    return core.int._check(result);
+  }
+  flush() {
+    return this[_dispatch](io._FILE_FLUSH, [null]).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
+      }
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  flushSync() {
+    this[_checkAvailable]();
+    let result = this[_ops].flush();
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("flush failed", this.path, result));
+    }
+  }
+  lock(mode, start, end) {
+    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
+    if (start === void 0) start = 0;
+    if (end === void 0) end = -1;
+    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
+      dart.throw(new core.ArgumentError());
+    }
+    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
+      }
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  unlock(start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = -1;
+    if (!(typeof start == 'number') || !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    if (start == end) {
+      dart.throw(new core.ArgumentError());
+    }
+    return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, io._RandomAccessFile.LOCK_UNLOCK, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, 'unlock failed', this.path));
+      }
+      return this;
+    }, dynamicTo_RandomAccessFile()));
+  }
+  lockSync(mode, start, end) {
+    if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
+    if (start === void 0) start = 0;
+    if (end === void 0) end = -1;
+    this[_checkAvailable]();
+    if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
+      dart.throw(new core.ArgumentError());
+    }
+    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    let result = this[_ops].lock(lock, start, end);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException('lock failed', this.path, result));
+    }
+  }
+  unlockSync(start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = -1;
+    this[_checkAvailable]();
+    if (!(typeof start == 'number') || !(typeof end == 'number')) {
+      dart.throw(new core.ArgumentError());
+    }
+    if (start == end) {
+      dart.throw(new core.ArgumentError());
+    }
+    let result = this[_ops].lock(io._RandomAccessFile.LOCK_UNLOCK, start, end);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException('unlock failed', this.path, result));
+    }
+  }
+  [_pointer]() {
+    return this[_ops].getPointer();
+  }
+  [_dispatch](request, data, opts) {
+    let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
+    if (dart.test(this.closed)) {
+      return async.Future.error(new io.FileSystemException("File closed", this.path));
+    }
+    if (dart.test(this[_asyncDispatched])) {
+      let msg = "An async operation is currently pending";
+      return async.Future.error(new io.FileSystemException(msg, this.path));
+    }
+    if (dart.test(markClosed)) {
+      this.closed = true;
+    }
+    this[_asyncDispatched] = true;
+    data[dartx._set](0, this[_pointer]());
+    return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
+      this[_asyncDispatched] = false;
+    }, VoidToNull()));
+  }
+  [_checkAvailable]() {
+    if (dart.test(this[_asyncDispatched])) {
+      dart.throw(new io.FileSystemException("An async operation is currently pending", this.path));
+    }
+    if (dart.test(this.closed)) {
+      dart.throw(new io.FileSystemException("File closed", this.path));
+    }
+  }
+};
+io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
+dart.setSignature(io._RandomAccessFile, {
+  constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFile, [core.int, core.String])}),
+  fields: () => ({
+    path: core.String,
+    [_asyncDispatched]: core.bool,
+    [_fileService]: isolate.SendPort,
+    [_resourceInfo]: io._FileResourceInfo,
+    [_ops]: io._RandomAccessFileOps,
+    closed: core.bool
+  }),
+  methods: () => ({
+    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
+    [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
+    close: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
+    closeSync: dart.definiteFunctionType(dart.void, []),
+    readByte: dart.definiteFunctionType(async.Future$(core.int), []),
+    readByteSync: dart.definiteFunctionType(core.int, []),
+    read: dart.definiteFunctionType(async.Future$(core.List$(core.int)), [core.int]),
+    readSync: dart.definiteFunctionType(core.List$(core.int), [core.int]),
+    readInto: dart.definiteFunctionType(async.Future$(core.int), [ListOfint()], [core.int, core.int]),
+    readIntoSync: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
+    writeByte: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
+    writeByteSync: dart.definiteFunctionType(core.int, [core.int]),
+    writeFrom: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [ListOfint()], [core.int, core.int]),
+    writeFromSync: dart.definiteFunctionType(dart.void, [ListOfint()], [core.int, core.int]),
+    writeString: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
+    writeStringSync: dart.definiteFunctionType(dart.void, [core.String], {encoding: convert.Encoding}),
+    position: dart.definiteFunctionType(async.Future$(core.int), []),
+    positionSync: dart.definiteFunctionType(core.int, []),
+    setPosition: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
+    setPositionSync: dart.definiteFunctionType(dart.void, [core.int]),
+    truncate: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
+    truncateSync: dart.definiteFunctionType(dart.void, [core.int]),
+    length: dart.definiteFunctionType(async.Future$(core.int), []),
+    lengthSync: dart.definiteFunctionType(core.int, []),
+    flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
+    flushSync: dart.definiteFunctionType(dart.void, []),
+    lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
+    unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
+    lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
+    unlockSync: dart.definiteFunctionType(dart.void, [], [core.int, core.int]),
+    [_pointer]: dart.definiteFunctionType(core.int, []),
+    [_dispatch]: dart.definiteFunctionType(async.Future, [core.int, core.List], {markClosed: core.bool}),
+    [_checkAvailable]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    _connectedResourceHandler: core.bool,
+    LOCK_UNLOCK: core.int,
+    LOCK_SHARED: core.int,
+    LOCK_EXCLUSIVE: core.int
+  })
+});
+io._RandomAccessFile._connectedResourceHandler = false;
+io._RandomAccessFile.LOCK_UNLOCK = 0;
+io._RandomAccessFile.LOCK_SHARED = 1;
+io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
+let const$56;
+io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
+  _internal(type) {
+    this[_type] = type;
+  }
+  static _lookup(type) {
+    return io.FileSystemEntityType._typeList[dartx._get](type);
+  }
+  toString() {
+    return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+  }
+};
+dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
+dart.setSignature(io.FileSystemEntityType, {
+  constructors: () => ({_internal: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
+  fields: () => ({[_type]: core.int}),
+  sfields: () => ({
+    FILE: io.FileSystemEntityType,
+    DIRECTORY: io.FileSystemEntityType,
+    LINK: io.FileSystemEntityType,
+    NOT_FOUND: io.FileSystemEntityType,
+    _typeList: ListOfFileSystemEntityType()
+  }),
+  statics: () => ({_lookup: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
+  names: ['_lookup']
+});
+dart.defineLazy(io.FileSystemEntityType, {
+  get FILE() {
+    return dart.const(new io.FileSystemEntityType._internal(0));
+  },
+  get DIRECTORY() {
+    return dart.const(new io.FileSystemEntityType._internal(1));
+  },
+  get LINK() {
+    return dart.const(new io.FileSystemEntityType._internal(2));
+  },
+  get NOT_FOUND() {
+    return dart.const(new io.FileSystemEntityType._internal(3));
+  },
+  get _typeList() {
+    return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
+  }
+});
+let const$57;
+io.FileStat = class FileStat extends core.Object {
+  _internal(changed, modified, accessed, type, mode, size) {
+    this.changed = changed;
+    this.modified = modified;
+    this.accessed = accessed;
+    this.type = type;
+    this.mode = mode;
+    this.size = size;
+  }
+  _internalNotFound() {
+    this.changed = null;
+    this.modified = null;
+    this.accessed = null;
+    this.type = io.FileSystemEntityType.NOT_FOUND;
+    this.mode = 0;
+    this.size = -1;
+  }
+  static _statSync(path) {
+    dart.throw(new core.UnsupportedError("FileStat.stat"));
+  }
+  static statSync(path) {
+    if (dart.test(io.Platform.isWindows)) {
+      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
+    }
+    let data = io.FileStat._statSync(path);
+    if (io.OSError.is(data)) return io.FileStat._notFound;
+    return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, io.FileStat._TYPE))), core.int._check(dart.dindex(data, io.FileStat._MODE)), core.int._check(dart.dindex(data, io.FileStat._SIZE)));
+  }
+  static stat(path) {
+    if (dart.test(io.Platform.isWindows)) {
+      path = io.FileSystemEntity._trimTrailingPathSeparators(path);
+    }
+    return io._IOService._dispatch(io._FILE_STAT, JSArrayOfString().of([path])).then(io.FileStat)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        return io.FileStat._notFound;
+      }
+      let data = core.List._check(dart.dindex(response, 1));
+      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(data[dartx._get](io.FileStat._TYPE))), core.int._check(data[dartx._get](io.FileStat._MODE)), core.int._check(data[dartx._get](io.FileStat._SIZE)));
+    }, dynamicToFileStat()));
+  }
+  toString() {
+    return dart.str`FileStat: type ${this.type}\n          changed ${this.changed}\n          modified ${this.modified}\n          accessed ${this.accessed}\n          mode ${this.modeString()}\n          size ${this.size}`;
+  }
+  modeString() {
+    let permissions = dart.notNull(this.mode) & 4095;
+    let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+    let result = [];
+    if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
+    if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
+    if ((permissions & 512) != 0) result[dartx.add]("(sticky) ");
+    result[dartx.add](codes[dartx._get](permissions >> 6 & 7));
+    result[dartx.add](codes[dartx._get](permissions >> 3 & 7));
+    result[dartx.add](codes[dartx._get](permissions & 7));
+    return result[dartx.join]();
+  }
+};
+dart.defineNamedConstructor(io.FileStat, '_internal');
+dart.defineNamedConstructor(io.FileStat, '_internalNotFound');
+dart.setSignature(io.FileStat, {
+  constructors: () => ({
+    _internal: dart.definiteFunctionType(io.FileStat, [core.DateTime, core.DateTime, core.DateTime, io.FileSystemEntityType, core.int, core.int]),
+    _internalNotFound: dart.definiteFunctionType(io.FileStat, [])
+  }),
+  fields: () => ({
+    changed: core.DateTime,
+    modified: core.DateTime,
+    accessed: core.DateTime,
+    type: io.FileSystemEntityType,
+    mode: core.int,
+    size: core.int
+  }),
+  methods: () => ({modeString: dart.definiteFunctionType(core.String, [])}),
+  sfields: () => ({
+    _TYPE: core.int,
+    _CHANGED_TIME: core.int,
+    _MODIFIED_TIME: core.int,
+    _ACCESSED_TIME: core.int,
+    _MODE: core.int,
+    _SIZE: core.int,
+    _notFound: io.FileStat
+  }),
+  statics: () => ({
+    _statSync: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    statSync: dart.definiteFunctionType(io.FileStat, [core.String]),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), [core.String])
+  }),
+  names: ['_statSync', 'statSync', 'stat']
+});
+io.FileStat._TYPE = 0;
+io.FileStat._CHANGED_TIME = 1;
+io.FileStat._MODIFIED_TIME = 2;
+io.FileStat._ACCESSED_TIME = 3;
+io.FileStat._MODE = 4;
+io.FileStat._SIZE = 5;
+dart.defineLazy(io.FileStat, {
+  get _notFound() {
+    return dart.const(new io.FileStat._internalNotFound());
+  }
+});
+io.FileSystemEvent = class FileSystemEvent extends core.Object {
+  _(type, path, isDirectory) {
+    this.type = type;
+    this.path = path;
+    this.isDirectory = isDirectory;
+  }
+};
+dart.defineNamedConstructor(io.FileSystemEvent, '_');
+dart.setSignature(io.FileSystemEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemEvent, [core.int, core.String, core.bool])}),
+  fields: () => ({
+    type: core.int,
+    path: core.String,
+    isDirectory: core.bool
+  }),
+  sfields: () => ({
+    CREATE: core.int,
+    MODIFY: core.int,
+    DELETE: core.int,
+    MOVE: core.int,
+    ALL: core.int,
+    _MODIFY_ATTRIBUTES: core.int,
+    _DELETE_SELF: core.int,
+    _IS_DIR: core.int
+  })
+});
+io.FileSystemEvent.CREATE = 1 << 0;
+io.FileSystemEvent.MODIFY = 1 << 1;
+io.FileSystemEvent.DELETE = 1 << 2;
+io.FileSystemEvent.MOVE = 1 << 3;
+io.FileSystemEvent._MODIFY_ATTRIBUTES = 1 << 4;
+io.FileSystemEvent._DELETE_SELF = 1 << 5;
+io.FileSystemEvent._IS_DIR = 1 << 6;
+dart.defineLazy(io.FileSystemEvent, {
+  get ALL() {
+    return io.FileSystemEvent.CREATE | io.FileSystemEvent.MODIFY | io.FileSystemEvent.DELETE | io.FileSystemEvent.MOVE;
+  }
+});
+io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
+  _(path, isDirectory) {
+    super._(io.FileSystemEvent.CREATE, core.String._check(path), core.bool._check(isDirectory));
+  }
+  toString() {
+    return dart.str`FileSystemCreateEvent('${this.path}')`;
+  }
+};
+dart.defineNamedConstructor(io.FileSystemCreateEvent, '_');
+dart.setSignature(io.FileSystemCreateEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemCreateEvent, [dart.dynamic, dart.dynamic])})
+});
+io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
+  _(path, isDirectory, contentChanged) {
+    this.contentChanged = contentChanged;
+    super._(io.FileSystemEvent.MODIFY, core.String._check(path), core.bool._check(isDirectory));
+  }
+  toString() {
+    return dart.str`FileSystemModifyEvent('${this.path}', contentChanged=${this.contentChanged})`;
+  }
+};
+dart.defineNamedConstructor(io.FileSystemModifyEvent, '_');
+dart.setSignature(io.FileSystemModifyEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemModifyEvent, [dart.dynamic, dart.dynamic, core.bool])}),
+  fields: () => ({contentChanged: core.bool})
+});
+io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
+  _(path, isDirectory) {
+    super._(io.FileSystemEvent.DELETE, core.String._check(path), core.bool._check(isDirectory));
+  }
+  toString() {
+    return dart.str`FileSystemDeleteEvent('${this.path}')`;
+  }
+};
+dart.defineNamedConstructor(io.FileSystemDeleteEvent, '_');
+dart.setSignature(io.FileSystemDeleteEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemDeleteEvent, [dart.dynamic, dart.dynamic])})
+});
+io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
+  _(path, isDirectory, destination) {
+    this.destination = destination;
+    super._(io.FileSystemEvent.MOVE, core.String._check(path), core.bool._check(isDirectory));
+  }
+  toString() {
+    let buffer = new core.StringBuffer();
+    buffer.write(dart.str`FileSystemMoveEvent('${this.path}'`);
+    if (this.destination != null) buffer.write(dart.str`, '${this.destination}'`);
+    buffer.write(')');
+    return buffer.toString();
+  }
+};
+dart.defineNamedConstructor(io.FileSystemMoveEvent, '_');
+dart.setSignature(io.FileSystemMoveEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.FileSystemMoveEvent, [dart.dynamic, dart.dynamic, core.String])}),
+  fields: () => ({destination: core.String})
+});
+io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
+  static _watch(path, events, recursive) {
+    dart.throw(new core.UnsupportedError("_FileSystemWatcher.watch"));
+  }
+  static get isSupported() {
+    dart.throw(new core.UnsupportedError("_FileSystemWatcher.isSupported"));
+  }
+};
+dart.setSignature(io._FileSystemWatcher, {
+  sgetters: () => ({isSupported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({_watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool])}),
+  names: ['_watch']
+});
+io.HttpStatus = class HttpStatus extends core.Object {};
+dart.setSignature(io.HttpStatus, {
+  sfields: () => ({
+    CONTINUE: core.int,
+    SWITCHING_PROTOCOLS: core.int,
+    OK: core.int,
+    CREATED: core.int,
+    ACCEPTED: core.int,
+    NON_AUTHORITATIVE_INFORMATION: core.int,
+    NO_CONTENT: core.int,
+    RESET_CONTENT: core.int,
+    PARTIAL_CONTENT: core.int,
+    MULTIPLE_CHOICES: core.int,
+    MOVED_PERMANENTLY: core.int,
+    FOUND: core.int,
+    MOVED_TEMPORARILY: core.int,
+    SEE_OTHER: core.int,
+    NOT_MODIFIED: core.int,
+    USE_PROXY: core.int,
+    TEMPORARY_REDIRECT: core.int,
+    BAD_REQUEST: core.int,
+    UNAUTHORIZED: core.int,
+    PAYMENT_REQUIRED: core.int,
+    FORBIDDEN: core.int,
+    NOT_FOUND: core.int,
+    METHOD_NOT_ALLOWED: core.int,
+    NOT_ACCEPTABLE: core.int,
+    PROXY_AUTHENTICATION_REQUIRED: core.int,
+    REQUEST_TIMEOUT: core.int,
+    CONFLICT: core.int,
+    GONE: core.int,
+    LENGTH_REQUIRED: core.int,
+    PRECONDITION_FAILED: core.int,
+    REQUEST_ENTITY_TOO_LARGE: core.int,
+    REQUEST_URI_TOO_LONG: core.int,
+    UNSUPPORTED_MEDIA_TYPE: core.int,
+    REQUESTED_RANGE_NOT_SATISFIABLE: core.int,
+    EXPECTATION_FAILED: core.int,
+    INTERNAL_SERVER_ERROR: core.int,
+    NOT_IMPLEMENTED: core.int,
+    BAD_GATEWAY: core.int,
+    SERVICE_UNAVAILABLE: core.int,
+    GATEWAY_TIMEOUT: core.int,
+    HTTP_VERSION_NOT_SUPPORTED: core.int,
+    NETWORK_CONNECT_TIMEOUT_ERROR: core.int
+  })
+});
+io.HttpStatus.CONTINUE = 100;
+io.HttpStatus.SWITCHING_PROTOCOLS = 101;
+io.HttpStatus.OK = 200;
+io.HttpStatus.CREATED = 201;
+io.HttpStatus.ACCEPTED = 202;
+io.HttpStatus.NON_AUTHORITATIVE_INFORMATION = 203;
+io.HttpStatus.NO_CONTENT = 204;
+io.HttpStatus.RESET_CONTENT = 205;
+io.HttpStatus.PARTIAL_CONTENT = 206;
+io.HttpStatus.MULTIPLE_CHOICES = 300;
+io.HttpStatus.MOVED_PERMANENTLY = 301;
+io.HttpStatus.FOUND = 302;
+io.HttpStatus.MOVED_TEMPORARILY = 302;
+io.HttpStatus.SEE_OTHER = 303;
+io.HttpStatus.NOT_MODIFIED = 304;
+io.HttpStatus.USE_PROXY = 305;
+io.HttpStatus.TEMPORARY_REDIRECT = 307;
+io.HttpStatus.BAD_REQUEST = 400;
+io.HttpStatus.UNAUTHORIZED = 401;
+io.HttpStatus.PAYMENT_REQUIRED = 402;
+io.HttpStatus.FORBIDDEN = 403;
+io.HttpStatus.NOT_FOUND = 404;
+io.HttpStatus.METHOD_NOT_ALLOWED = 405;
+io.HttpStatus.NOT_ACCEPTABLE = 406;
+io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED = 407;
+io.HttpStatus.REQUEST_TIMEOUT = 408;
+io.HttpStatus.CONFLICT = 409;
+io.HttpStatus.GONE = 410;
+io.HttpStatus.LENGTH_REQUIRED = 411;
+io.HttpStatus.PRECONDITION_FAILED = 412;
+io.HttpStatus.REQUEST_ENTITY_TOO_LARGE = 413;
+io.HttpStatus.REQUEST_URI_TOO_LONG = 414;
+io.HttpStatus.UNSUPPORTED_MEDIA_TYPE = 415;
+io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+io.HttpStatus.EXPECTATION_FAILED = 417;
+io.HttpStatus.INTERNAL_SERVER_ERROR = 500;
+io.HttpStatus.NOT_IMPLEMENTED = 501;
+io.HttpStatus.BAD_GATEWAY = 502;
+io.HttpStatus.SERVICE_UNAVAILABLE = 503;
+io.HttpStatus.GATEWAY_TIMEOUT = 504;
+io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED = 505;
+io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR = 599;
+io.HttpServer = class HttpServer extends core.Object {
+  static bind(address, port, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    return io._HttpServer.bind(address, port, backlog, v6Only, shared);
+  }
+  static bindSecure(address, port, context, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    return io._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
+  }
+  static listenOn(serverSocket) {
+    return new io._HttpServer.listenOn(serverSocket);
+  }
+};
+io.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
+dart.setSignature(io.HttpServer, {
+  constructors: () => ({listenOn: dart.definiteFunctionType(io.HttpServer, [io.ServerSocket])}),
+  fields: () => ({
+    serverHeader: core.String,
+    autoCompress: core.bool,
+    idleTimeout: core.Duration
+  }),
+  statics: () => ({
+    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool}),
+    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, shared: core.bool})
+  }),
+  names: ['bind', 'bindSecure']
+});
+io.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {
+  new() {
+    this.total = 0;
+    this.active = 0;
+    this.idle = 0;
+    this.closing = 0;
+  }
+};
+dart.setSignature(io.HttpConnectionsInfo, {
+  fields: () => ({
+    total: core.int,
+    active: core.int,
+    idle: core.int,
+    closing: core.int
+  })
+});
+io.HttpHeaders = class HttpHeaders extends core.Object {
+  new() {
+    this.date = null;
+    this.expires = null;
+    this.ifModifiedSince = null;
+    this.host = null;
+    this.port = null;
+    this.contentType = null;
+    this.contentLength = null;
+    this.persistentConnection = null;
+    this.chunkedTransferEncoding = null;
+  }
+};
+dart.setSignature(io.HttpHeaders, {
+  fields: () => ({
+    date: core.DateTime,
+    expires: core.DateTime,
+    ifModifiedSince: core.DateTime,
+    host: core.String,
+    port: core.int,
+    contentType: io.ContentType,
+    contentLength: core.int,
+    persistentConnection: core.bool,
+    chunkedTransferEncoding: core.bool
+  }),
+  sfields: () => ({
+    ACCEPT: core.String,
+    ACCEPT_CHARSET: core.String,
+    ACCEPT_ENCODING: core.String,
+    ACCEPT_LANGUAGE: core.String,
+    ACCEPT_RANGES: core.String,
+    AGE: core.String,
+    ALLOW: core.String,
+    AUTHORIZATION: core.String,
+    CACHE_CONTROL: core.String,
+    CONNECTION: core.String,
+    CONTENT_ENCODING: core.String,
+    CONTENT_LANGUAGE: core.String,
+    CONTENT_LENGTH: core.String,
+    CONTENT_LOCATION: core.String,
+    CONTENT_MD5: core.String,
+    CONTENT_RANGE: core.String,
+    CONTENT_TYPE: core.String,
+    DATE: core.String,
+    ETAG: core.String,
+    EXPECT: core.String,
+    EXPIRES: core.String,
+    FROM: core.String,
+    HOST: core.String,
+    IF_MATCH: core.String,
+    IF_MODIFIED_SINCE: core.String,
+    IF_NONE_MATCH: core.String,
+    IF_RANGE: core.String,
+    IF_UNMODIFIED_SINCE: core.String,
+    LAST_MODIFIED: core.String,
+    LOCATION: core.String,
+    MAX_FORWARDS: core.String,
+    PRAGMA: core.String,
+    PROXY_AUTHENTICATE: core.String,
+    PROXY_AUTHORIZATION: core.String,
+    RANGE: core.String,
+    REFERER: core.String,
+    RETRY_AFTER: core.String,
+    SERVER: core.String,
+    TE: core.String,
+    TRAILER: core.String,
+    TRANSFER_ENCODING: core.String,
+    UPGRADE: core.String,
+    USER_AGENT: core.String,
+    VARY: core.String,
+    VIA: core.String,
+    WARNING: core.String,
+    WWW_AUTHENTICATE: core.String,
+    COOKIE: core.String,
+    SET_COOKIE: core.String,
+    GENERAL_HEADERS: ListOfString(),
+    ENTITY_HEADERS: ListOfString(),
+    RESPONSE_HEADERS: ListOfString(),
+    REQUEST_HEADERS: ListOfString()
+  })
+});
+io.HttpHeaders.ACCEPT = "accept";
+io.HttpHeaders.ACCEPT_CHARSET = "accept-charset";
+io.HttpHeaders.ACCEPT_ENCODING = "accept-encoding";
+io.HttpHeaders.ACCEPT_LANGUAGE = "accept-language";
+io.HttpHeaders.ACCEPT_RANGES = "accept-ranges";
+io.HttpHeaders.AGE = "age";
+io.HttpHeaders.ALLOW = "allow";
+io.HttpHeaders.AUTHORIZATION = "authorization";
+io.HttpHeaders.CACHE_CONTROL = "cache-control";
+io.HttpHeaders.CONNECTION = "connection";
+io.HttpHeaders.CONTENT_ENCODING = "content-encoding";
+io.HttpHeaders.CONTENT_LANGUAGE = "content-language";
+io.HttpHeaders.CONTENT_LENGTH = "content-length";
+io.HttpHeaders.CONTENT_LOCATION = "content-location";
+io.HttpHeaders.CONTENT_MD5 = "content-md5";
+io.HttpHeaders.CONTENT_RANGE = "content-range";
+io.HttpHeaders.CONTENT_TYPE = "content-type";
+io.HttpHeaders.DATE = "date";
+io.HttpHeaders.ETAG = "etag";
+io.HttpHeaders.EXPECT = "expect";
+io.HttpHeaders.EXPIRES = "expires";
+io.HttpHeaders.FROM = "from";
+io.HttpHeaders.HOST = "host";
+io.HttpHeaders.IF_MATCH = "if-match";
+io.HttpHeaders.IF_MODIFIED_SINCE = "if-modified-since";
+io.HttpHeaders.IF_NONE_MATCH = "if-none-match";
+io.HttpHeaders.IF_RANGE = "if-range";
+io.HttpHeaders.IF_UNMODIFIED_SINCE = "if-unmodified-since";
+io.HttpHeaders.LAST_MODIFIED = "last-modified";
+io.HttpHeaders.LOCATION = "location";
+io.HttpHeaders.MAX_FORWARDS = "max-forwards";
+io.HttpHeaders.PRAGMA = "pragma";
+io.HttpHeaders.PROXY_AUTHENTICATE = "proxy-authenticate";
+io.HttpHeaders.PROXY_AUTHORIZATION = "proxy-authorization";
+io.HttpHeaders.RANGE = "range";
+io.HttpHeaders.REFERER = "referer";
+io.HttpHeaders.RETRY_AFTER = "retry-after";
+io.HttpHeaders.SERVER = "server";
+io.HttpHeaders.TE = "te";
+io.HttpHeaders.TRAILER = "trailer";
+io.HttpHeaders.TRANSFER_ENCODING = "transfer-encoding";
+io.HttpHeaders.UPGRADE = "upgrade";
+io.HttpHeaders.USER_AGENT = "user-agent";
+io.HttpHeaders.VARY = "vary";
+io.HttpHeaders.VIA = "via";
+io.HttpHeaders.WARNING = "warning";
+io.HttpHeaders.WWW_AUTHENTICATE = "www-authenticate";
+io.HttpHeaders.COOKIE = "cookie";
+io.HttpHeaders.SET_COOKIE = "set-cookie";
+dart.defineLazy(io.HttpHeaders, {
+  get GENERAL_HEADERS() {
+    return dart.constList([io.HttpHeaders.CACHE_CONTROL, io.HttpHeaders.CONNECTION, io.HttpHeaders.DATE, io.HttpHeaders.PRAGMA, io.HttpHeaders.TRAILER, io.HttpHeaders.TRANSFER_ENCODING, io.HttpHeaders.UPGRADE, io.HttpHeaders.VIA, io.HttpHeaders.WARNING], core.String);
+  },
+  get ENTITY_HEADERS() {
+    return dart.constList([io.HttpHeaders.ALLOW, io.HttpHeaders.CONTENT_ENCODING, io.HttpHeaders.CONTENT_LANGUAGE, io.HttpHeaders.CONTENT_LENGTH, io.HttpHeaders.CONTENT_LOCATION, io.HttpHeaders.CONTENT_MD5, io.HttpHeaders.CONTENT_RANGE, io.HttpHeaders.CONTENT_TYPE, io.HttpHeaders.EXPIRES, io.HttpHeaders.LAST_MODIFIED], core.String);
+  },
+  get RESPONSE_HEADERS() {
+    return dart.constList([io.HttpHeaders.ACCEPT_RANGES, io.HttpHeaders.AGE, io.HttpHeaders.ETAG, io.HttpHeaders.LOCATION, io.HttpHeaders.PROXY_AUTHENTICATE, io.HttpHeaders.RETRY_AFTER, io.HttpHeaders.SERVER, io.HttpHeaders.VARY, io.HttpHeaders.WWW_AUTHENTICATE], core.String);
+  },
+  get REQUEST_HEADERS() {
+    return dart.constList([io.HttpHeaders.ACCEPT, io.HttpHeaders.ACCEPT_CHARSET, io.HttpHeaders.ACCEPT_ENCODING, io.HttpHeaders.ACCEPT_LANGUAGE, io.HttpHeaders.AUTHORIZATION, io.HttpHeaders.EXPECT, io.HttpHeaders.FROM, io.HttpHeaders.HOST, io.HttpHeaders.IF_MATCH, io.HttpHeaders.IF_MODIFIED_SINCE, io.HttpHeaders.IF_NONE_MATCH, io.HttpHeaders.IF_RANGE, io.HttpHeaders.IF_UNMODIFIED_SINCE, io.HttpHeaders.MAX_FORWARDS, io.HttpHeaders.PROXY_AUTHORIZATION, io.HttpHeaders.RANGE, io.HttpHeaders.REFERER, io.HttpHeaders.TE, io.HttpHeaders.USER_AGENT], core.String);
+  }
+});
+io.HeaderValue = class HeaderValue extends core.Object {
+  static new(value, parameters) {
+    if (value === void 0) value = "";
+    if (parameters === void 0) parameters = null;
+    return new io._HeaderValue(value, parameters);
+  }
+  static parse(value, opts) {
+    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
+    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
+    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
+    return io._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
+  }
+};
+dart.setSignature(io.HeaderValue, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HeaderValue, [], [core.String, MapOfString$String()])}),
+  statics: () => ({parse: dart.definiteFunctionType(io.HeaderValue, [core.String], {parameterSeparator: core.String, valueSeparator: core.String, preserveBackslash: core.bool})}),
+  names: ['parse']
+});
+io.HttpSession = class HttpSession extends core.Object {};
+io.HttpSession[dart.implements] = () => [core.Map];
+io.ContentType = class ContentType extends core.Object {
+  static new(primaryType, subType, opts) {
+    let charset = opts && 'charset' in opts ? opts.charset : null;
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    return new io._ContentType(primaryType, subType, charset, parameters);
+  }
+  static parse(value) {
+    return io._ContentType.parse(value);
+  }
+};
+io.ContentType[dart.implements] = () => [io.HeaderValue];
+dart.setSignature(io.ContentType, {
+  constructors: () => ({new: dart.definiteFunctionType(io.ContentType, [core.String, core.String], {charset: core.String, parameters: MapOfString$String()})}),
+  sfields: () => ({
+    TEXT: io.ContentType,
+    HTML: io.ContentType,
+    JSON: io.ContentType,
+    BINARY: io.ContentType
+  }),
+  statics: () => ({parse: dart.definiteFunctionType(io.ContentType, [core.String])}),
+  names: ['parse']
+});
+dart.defineLazy(io.ContentType, {
+  get TEXT() {
+    return io.ContentType.new("text", "plain", {charset: "utf-8"});
+  },
+  get HTML() {
+    return io.ContentType.new("text", "html", {charset: "utf-8"});
+  },
+  get JSON() {
+    return io.ContentType.new("application", "json", {charset: "utf-8"});
+  },
+  get BINARY() {
+    return io.ContentType.new("application", "octet-stream");
+  }
+});
+io.Cookie = class Cookie extends core.Object {
+  static new(name, value) {
+    if (name === void 0) name = null;
+    if (value === void 0) value = null;
+    return new io._Cookie(name, value);
+  }
+  static fromSetCookieValue(value) {
+    return new io._Cookie.fromSetCookieValue(value);
+  }
+};
+dart.setSignature(io.Cookie, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.Cookie, [], [core.String, core.String]),
+    fromSetCookieValue: dart.definiteFunctionType(io.Cookie, [core.String])
+  }),
+  fields: () => ({
+    name: core.String,
+    value: core.String,
+    expires: core.DateTime,
+    maxAge: core.int,
+    domain: core.String,
+    path: core.String,
+    secure: core.bool,
+    httpOnly: core.bool
+  })
+});
+io.HttpRequest = class HttpRequest extends core.Object {};
+io.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
+io.HttpResponse = class HttpResponse extends core.Object {
+  new() {
+    this.contentLength = null;
+    this.statusCode = null;
+    this.reasonPhrase = null;
+    this.persistentConnection = null;
+    this.deadline = null;
+    this.bufferOutput = null;
+  }
+};
+io.HttpResponse[dart.implements] = () => [io.IOSink];
+dart.setSignature(io.HttpResponse, {
+  fields: () => ({
+    contentLength: core.int,
+    statusCode: core.int,
+    reasonPhrase: core.String,
+    persistentConnection: core.bool,
+    deadline: core.Duration,
+    bufferOutput: core.bool
+  })
+});
+io.HttpClient = class HttpClient extends core.Object {
+  static new(opts) {
+    let context = opts && 'context' in opts ? opts.context : null;
+    return new io._HttpClient(context);
+  }
+  static findProxyFromEnvironment(url, opts) {
+    let environment = opts && 'environment' in opts ? opts.environment : null;
+    return io._HttpClient._findProxyFromEnvironment(url, environment);
+  }
+};
+dart.setSignature(io.HttpClient, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HttpClient, [], {context: io.SecurityContext})}),
+  fields: () => ({
+    idleTimeout: core.Duration,
+    maxConnectionsPerHost: core.int,
+    autoUncompress: core.bool,
+    userAgent: core.String
+  }),
+  sfields: () => ({
+    DEFAULT_HTTP_PORT: core.int,
+    DEFAULT_HTTPS_PORT: core.int
+  }),
+  statics: () => ({findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri], {environment: MapOfString$String()})}),
+  names: ['findProxyFromEnvironment']
+});
+io.HttpClient.DEFAULT_HTTP_PORT = 80;
+io.HttpClient.DEFAULT_HTTPS_PORT = 443;
+io.HttpClientRequest = class HttpClientRequest extends core.Object {
+  new() {
+    this.persistentConnection = null;
+    this.followRedirects = null;
+    this.maxRedirects = null;
+    this.contentLength = null;
+    this.bufferOutput = null;
+  }
+};
+io.HttpClientRequest[dart.implements] = () => [io.IOSink];
+dart.setSignature(io.HttpClientRequest, {
+  fields: () => ({
+    persistentConnection: core.bool,
+    followRedirects: core.bool,
+    maxRedirects: core.int,
+    contentLength: core.int,
+    bufferOutput: core.bool
+  })
+});
+io.HttpClientResponse = class HttpClientResponse extends core.Object {};
+io.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
+io.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
+io.HttpClientBasicCredentials = class HttpClientBasicCredentials extends io.HttpClientCredentials {
+  static new(username, password) {
+    return new io._HttpClientBasicCredentials(username, password);
+  }
+};
+dart.setSignature(io.HttpClientBasicCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientBasicCredentials, [core.String, core.String])})
+});
+io.HttpClientDigestCredentials = class HttpClientDigestCredentials extends io.HttpClientCredentials {
+  static new(username, password) {
+    return new io._HttpClientDigestCredentials(username, password);
+  }
+};
+dart.setSignature(io.HttpClientDigestCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HttpClientDigestCredentials, [core.String, core.String])})
+});
+io.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
+io.RedirectInfo = class RedirectInfo extends core.Object {};
+io.DetachedSocket = class DetachedSocket extends core.Object {};
+io.HttpException = class HttpException extends core.Object {
+  new(message, opts) {
+    let uri = opts && 'uri' in opts ? opts.uri : null;
+    this.message = message;
+    this.uri = uri;
+  }
+  toString() {
+    let b = new core.StringBuffer();
+    b.write('HttpException: ');
+    b.write(this.message);
+    if (this.uri != null) {
+      b.write(dart.str`, uri = ${this.uri}`);
+    }
+    return b.toString();
+  }
+};
+io.HttpException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.HttpException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HttpException, [core.String], {uri: core.Uri})}),
+  fields: () => ({
+    message: core.String,
+    uri: core.Uri
+  })
+});
+io.RedirectException = class RedirectException extends core.Object {
+  new(message, redirects) {
+    this.message = message;
+    this.redirects = redirects;
+  }
+  toString() {
+    return dart.str`RedirectException: ${this.message}`;
+  }
+  get uri() {
+    return this.redirects[dartx.last].location;
+  }
+};
+io.RedirectException[dart.implements] = () => [io.HttpException];
+dart.setSignature(io.RedirectException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.RedirectException, [core.String, ListOfRedirectInfo()])}),
+  fields: () => ({
+    message: core.String,
+    redirects: ListOfRedirectInfo()
+  }),
+  getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
+});
+let const$58;
+let const$59;
+let const$60;
+let const$61;
+let const$62;
+let const$63;
+let const$64;
+let const$65;
+let const$66;
+io.HttpDate = class HttpDate extends core.Object {
+  static format(date) {
+    let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let d = date.toUtc();
+    let sb = new core.StringBuffer();
+    sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
+    sb.write(", ");
+    sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
+    sb.write(dart.toString(d.day));
+    sb.write(" ");
+    sb.write(month[dartx._get](dart.notNull(d.month) - 1));
+    sb.write(" ");
+    sb.write(dart.toString(d.year));
+    sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
+    sb.write(dart.toString(d.hour));
+    sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
+    sb.write(dart.toString(d.minute));
+    sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
+    sb.write(dart.toString(d.second));
+    sb.write(" GMT");
+    return sb.toString();
+  }
+  static parse(date) {
+    let SP = 32;
+    let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+    let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+    let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+    let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let formatRfc1123 = 0;
+    let formatRfc850 = 1;
+    let formatAsctime = 2;
+    let index = 0;
+    let tmp = null;
+    let format = null;
+    function expect(s) {
+      if (dart.notNull(date[dartx.length]) - dart.notNull(index) < dart.notNull(s[dartx.length])) {
+        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+      }
+      let tmp = date[dartx.substring](index, dart.notNull(index) + dart.notNull(s[dartx.length]));
+      if (tmp != s) {
+        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+      }
+      index = dart.notNull(index) + dart.notNull(s[dartx.length]);
+    }
+    dart.fn(expect, StringTovoid$());
+    function expectWeekday() {
+      let weekday = null;
+      let pos = date[dartx.indexOf](",", index);
+      if (pos == -1) {
+        let pos = date[dartx.indexOf](" ", index);
+        if (pos == -1) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+        tmp = date[dartx.substring](index, pos);
+        index = dart.notNull(pos) + 1;
+        weekday = wkdays[dartx.indexOf](tmp);
+        if (weekday != -1) {
+          format = formatAsctime;
+          return weekday;
+        }
+      } else {
+        tmp = date[dartx.substring](index, pos);
+        index = dart.notNull(pos) + 1;
+        weekday = wkdays[dartx.indexOf](tmp);
+        if (weekday != -1) {
+          format = formatRfc1123;
+          return weekday;
+        }
+        weekday = weekdays[dartx.indexOf](tmp);
+        if (weekday != -1) {
+          format = formatRfc850;
+          return weekday;
+        }
+      }
+      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+    }
+    dart.fn(expectWeekday, VoidToint());
+    function expectMonth(separator) {
+      let pos = date[dartx.indexOf](separator, index);
+      if (dart.notNull(pos) - dart.notNull(index) != 3) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+      tmp = date[dartx.substring](index, pos);
+      index = dart.notNull(pos) + 1;
+      let month = months[dartx.indexOf](tmp);
+      if (month != -1) return month;
+      dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+    }
+    dart.fn(expectMonth, StringToint$());
+    function expectNum(separator) {
+      let pos = null;
+      if (dart.notNull(separator[dartx.length]) > 0) {
+        pos = date[dartx.indexOf](separator, index);
+      } else {
+        pos = date[dartx.length];
+      }
+      let tmp = date[dartx.substring](index, pos);
+      index = dart.notNull(pos) + dart.notNull(separator[dartx.length]);
+      try {
+        let value = core.int.parse(tmp);
+        return value;
+      } catch (e) {
+        if (core.FormatException.is(e)) {
+          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+        } else
+          throw e;
+      }
+
+    }
+    dart.fn(expectNum, StringToint$());
+    function expectEnd() {
+      if (index != date[dartx.length]) {
+        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
+      }
+    }
+    dart.fn(expectEnd, VoidTovoid$());
+    let weekday = expectWeekday();
+    let day = null;
+    let month = null;
+    let year = null;
+    let hours = null;
+    let minutes = null;
+    let seconds = null;
+    if (format == formatAsctime) {
+      month = expectMonth(" ");
+      if (date[dartx.codeUnitAt](index) == SP) {
+        index = dart.notNull(index) + 1;
+      }
+      day = expectNum(" ");
+      hours = expectNum(":");
+      minutes = expectNum(":");
+      seconds = expectNum(" ");
+      year = expectNum("");
+    } else {
+      expect(" ");
+      day = expectNum(format == formatRfc1123 ? " " : "-");
+      month = expectMonth(format == formatRfc1123 ? " " : "-");
+      year = expectNum(" ");
+      hours = expectNum(":");
+      minutes = expectNum(":");
+      seconds = expectNum(" ");
+      expect("GMT");
+    }
+    expectEnd();
+    return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
+  }
+  static _parseCookieDate(date) {
+    let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let position = 0;
+    function error() {
+      dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
+    }
+    dart.fn(error, VoidTovoid$());
+    function isEnd() {
+      return position == date[dartx.length];
+    }
+    dart.fn(isEnd, VoidTobool());
+    function isDelimiter(s) {
+      let char = s[dartx.codeUnitAt](0);
+      if (char == 9) return true;
+      if (dart.notNull(char) >= 32 && dart.notNull(char) <= 47) return true;
+      if (dart.notNull(char) >= 59 && dart.notNull(char) <= 64) return true;
+      if (dart.notNull(char) >= 91 && dart.notNull(char) <= 96) return true;
+      if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
+      return false;
+    }
+    dart.fn(isDelimiter, StringTobool$());
+    function isNonDelimiter(s) {
+      let char = s[dartx.codeUnitAt](0);
+      if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
+      if (dart.notNull(char) >= 10 && dart.notNull(char) <= 31) return true;
+      if (dart.notNull(char) >= 48 && dart.notNull(char) <= 57) return true;
+      if (char == 58) return true;
+      if (dart.notNull(char) >= 65 && dart.notNull(char) <= 90) return true;
+      if (dart.notNull(char) >= 97 && dart.notNull(char) <= 122) return true;
+      if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
+      return false;
+    }
+    dart.fn(isNonDelimiter, StringTobool$());
+    function isDigit(s) {
+      let char = s[dartx.codeUnitAt](0);
+      if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
+      return false;
+    }
+    dart.fn(isDigit, StringTobool$());
+    function getMonth(month) {
+      if (dart.notNull(month[dartx.length]) < 3) return -1;
+      return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
+    }
+    dart.fn(getMonth, StringToint$());
+    function toInt(s) {
+      let index = 0;
+      for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
+        ;
+      return core.int.parse(s[dartx.substring](0, index));
+    }
+    dart.fn(toInt, StringToint$());
+    let tokens = [];
+    while (!dart.test(isEnd())) {
+      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
+        position++;
+      let start = position;
+      while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[dartx._get](position))))
+        position++;
+      tokens[dartx.add](date[dartx.substring](start, position)[dartx.toLowerCase]());
+      while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
+        position++;
+    }
+    let timeStr = null;
+    let dayOfMonthStr = null;
+    let monthStr = null;
+    let yearStr = null;
+    for (let token of tokens) {
+      if (dart.test(dart.dsend(dart.dload(token, 'length'), '<', 1))) continue;
+      if (timeStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 5)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
+        timeStr = core.String._check(token);
+      } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
+        dayOfMonthStr = core.String._check(token);
+      } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
+        monthStr = core.String._check(token);
+      } else if (yearStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 2)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
+        yearStr = core.String._check(token);
+      }
+    }
+    if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
+      error();
+    }
+    let year = toInt(yearStr);
+    if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
+      year = dart.notNull(year) + 1900;
+    } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
+      year = dart.notNull(year) + 2000;
+    }
+    if (dart.notNull(year) < 1601) error();
+    let dayOfMonth = toInt(dayOfMonthStr);
+    if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
+    let month = dart.notNull(getMonth(monthStr)) + 1;
+    let timeList = timeStr[dartx.split](":");
+    if (timeList[dartx.length] != 3) error();
+    let hour = toInt(timeList[dartx._get](0));
+    let minute = toInt(timeList[dartx._get](1));
+    let second = toInt(timeList[dartx._get](2));
+    if (dart.notNull(hour) > 23) error();
+    if (dart.notNull(minute) > 59) error();
+    if (dart.notNull(second) > 59) error();
+    return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
+  }
+};
+dart.setSignature(io.HttpDate, {
+  statics: () => ({
+    format: dart.definiteFunctionType(core.String, [core.DateTime]),
+    parse: dart.definiteFunctionType(core.DateTime, [core.String]),
+    _parseCookieDate: dart.definiteFunctionType(core.DateTime, [core.String])
+  }),
+  names: ['format', 'parse', '_parseCookieDate']
+});
+const _headers = Symbol('_headers');
+const _defaultPortForScheme = Symbol('_defaultPortForScheme');
+const _mutable = Symbol('_mutable');
+const _noFoldingHeaders = Symbol('_noFoldingHeaders');
+const _contentLength = Symbol('_contentLength');
+const _persistentConnection = Symbol('_persistentConnection');
+const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
+const _host$ = Symbol('_host');
+const _port$ = Symbol('_port');
+const _checkMutable = Symbol('_checkMutable');
+const _addAll = Symbol('_addAll');
+const _add$2 = Symbol('_add');
+const _set$ = Symbol('_set');
+const _addValue = Symbol('_addValue');
+const _updateHostHeader = Symbol('_updateHostHeader');
+const _addDate = Symbol('_addDate');
+const _addHost = Symbol('_addHost');
+const _addExpires = Symbol('_addExpires');
+const _addConnection = Symbol('_addConnection');
+const _addContentType = Symbol('_addContentType');
+const _addContentLength = Symbol('_addContentLength');
+const _addTransferEncoding = Symbol('_addTransferEncoding');
+const _addIfModifiedSince = Symbol('_addIfModifiedSince');
+const _foldHeader = Symbol('_foldHeader');
+const _finalize = Symbol('_finalize');
+const _write = Symbol('_write');
+const _parseCookies = Symbol('_parseCookies');
+io._HttpHeaders = class _HttpHeaders extends core.Object {
+  new(protocolVersion, opts) {
+    let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : io.HttpClient.DEFAULT_HTTP_PORT;
+    let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
+    this.protocolVersion = protocolVersion;
+    this[_headers] = HashMapOfString$ListOfString().new();
+    this[_defaultPortForScheme] = defaultPortForScheme;
+    this[_mutable] = true;
+    this[_noFoldingHeaders] = null;
+    this[_contentLength] = -1;
+    this[_persistentConnection] = true;
+    this[_chunkedTransferEncoding] = false;
+    this[_host$] = null;
+    this[_port$] = null;
+    if (initialHeaders != null) {
+      initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
+      this[_contentLength] = initialHeaders[_contentLength];
+      this[_persistentConnection] = initialHeaders[_persistentConnection];
+      this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
+      this[_host$] = initialHeaders[_host$];
+      this[_port$] = initialHeaders[_port$];
+    }
+    if (this.protocolVersion == "1.0") {
+      this[_persistentConnection] = false;
+      this[_chunkedTransferEncoding] = false;
+    }
+  }
+  _get(name) {
+    return this[_headers][dartx._get](name[dartx.toLowerCase]());
+  }
+  value(name) {
+    name = name[dartx.toLowerCase]();
+    let values = this[_headers][dartx._get](name);
+    if (values == null) return null;
+    if (dart.notNull(values[dartx.length]) > 1) {
+      dart.throw(new io.HttpException(dart.str`More than one value for header ${name}`));
+    }
+    return values[dartx._get](0);
+  }
+  add(name, value) {
+    this[_checkMutable]();
+    this[_addAll](io._HttpHeaders._validateField(name), value);
+  }
+  [_addAll](name, value) {
+    dart.assert(name == io._HttpHeaders._validateField(name));
+    if (core.Iterable.is(value)) {
+      for (let v of value) {
+        this[_add$2](name, io._HttpHeaders._validateValue(v));
+      }
+    } else {
+      this[_add$2](name, io._HttpHeaders._validateValue(value));
+    }
+  }
+  set(name, value) {
+    this[_checkMutable]();
+    name = io._HttpHeaders._validateField(name);
+    this[_headers][dartx.remove](name);
+    if (name == io.HttpHeaders.TRANSFER_ENCODING) {
+      this[_chunkedTransferEncoding] = false;
+    }
+    this[_addAll](name, value);
+  }
+  remove(name, value) {
+    this[_checkMutable]();
+    name = io._HttpHeaders._validateField(name);
+    value = io._HttpHeaders._validateValue(value);
+    let values = this[_headers][dartx._get](name);
+    if (values != null) {
+      let index = values[dartx.indexOf](core.String._check(value));
+      if (index != -1) {
+        values[dartx.removeRange](index, dart.notNull(index) + 1);
+      }
+      if (values[dartx.length] == 0) this[_headers][dartx.remove](name);
+    }
+    if (name == io.HttpHeaders.TRANSFER_ENCODING && dart.equals(value, "chunked")) {
+      this[_chunkedTransferEncoding] = false;
+    }
+  }
+  removeAll(name) {
+    this[_checkMutable]();
+    name = io._HttpHeaders._validateField(name);
+    this[_headers][dartx.remove](name);
+  }
+  forEach(f) {
+    this[_headers][dartx.forEach](f);
+  }
+  noFolding(name) {
+    if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = ListOfString().new();
+    this[_noFoldingHeaders][dartx.add](name);
+  }
+  get persistentConnection() {
+    return this[_persistentConnection];
+  }
+  set persistentConnection(persistentConnection) {
+    this[_checkMutable]();
+    if (persistentConnection == this[_persistentConnection]) return;
+    if (dart.test(persistentConnection)) {
+      if (this.protocolVersion == "1.1") {
+        this.remove(io.HttpHeaders.CONNECTION, "close");
+      } else {
+        if (this[_contentLength] == -1) {
+          dart.throw(new io.HttpException("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
+        }
+        this.add(io.HttpHeaders.CONNECTION, "keep-alive");
+      }
+    } else {
+      if (this.protocolVersion == "1.1") {
+        this.add(io.HttpHeaders.CONNECTION, "close");
+      } else {
+        this.remove(io.HttpHeaders.CONNECTION, "keep-alive");
+      }
+    }
+    this[_persistentConnection] = persistentConnection;
+  }
+  get contentLength() {
+    return this[_contentLength];
+  }
+  set contentLength(contentLength) {
+    this[_checkMutable]();
+    if (this.protocolVersion == "1.0" && dart.test(this.persistentConnection) && contentLength == -1) {
+      dart.throw(new io.HttpException("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
+    }
+    if (this[_contentLength] == contentLength) return;
+    this[_contentLength] = contentLength;
+    if (dart.notNull(this[_contentLength]) >= 0) {
+      if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
+      this[_set$](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
+    } else {
+      this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
+      if (this.protocolVersion == "1.1") {
+        this.chunkedTransferEncoding = true;
+      }
+    }
+  }
+  get chunkedTransferEncoding() {
+    return this[_chunkedTransferEncoding];
+  }
+  set chunkedTransferEncoding(chunkedTransferEncoding) {
+    this[_checkMutable]();
+    if (dart.test(chunkedTransferEncoding) && this.protocolVersion == "1.0") {
+      dart.throw(new io.HttpException("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
+    }
+    if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
+    if (dart.test(chunkedTransferEncoding)) {
+      let values = this[_headers][dartx._get](io.HttpHeaders.TRANSFER_ENCODING);
+      if (values == null || values[dartx.last] != "chunked") {
+        this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, "chunked");
+      }
+      this.contentLength = -1;
+    } else {
+      this.remove(io.HttpHeaders.TRANSFER_ENCODING, "chunked");
+    }
+    this[_chunkedTransferEncoding] = chunkedTransferEncoding;
+  }
+  get host() {
+    return this[_host$];
+  }
+  set host(host) {
+    this[_checkMutable]();
+    this[_host$] = host;
+    this[_updateHostHeader]();
+  }
+  get port() {
+    return this[_port$];
+  }
+  set port(port) {
+    this[_checkMutable]();
+    this[_port$] = port;
+    this[_updateHostHeader]();
+  }
+  get ifModifiedSince() {
+    let values = this[_headers][dartx._get](io.HttpHeaders.IF_MODIFIED_SINCE);
+    if (values != null) {
+      try {
+        return io.HttpDate.parse(values[dartx._get](0));
+      } catch (e) {
+        if (core.Exception.is(e)) {
+          return null;
+        } else
+          throw e;
+      }
+
+    }
+    return null;
+  }
+  set ifModifiedSince(ifModifiedSince) {
+    this[_checkMutable]();
+    let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
+    this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
+  }
+  get date() {
+    let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
+    if (values != null) {
+      try {
+        return io.HttpDate.parse(values[dartx._get](0));
+      } catch (e) {
+        if (core.Exception.is(e)) {
+          return null;
+        } else
+          throw e;
+      }
+
+    }
+    return null;
+  }
+  set date(date) {
+    this[_checkMutable]();
+    let formatted = io.HttpDate.format(date.toUtc());
+    this[_set$]("date", formatted);
+  }
+  get expires() {
+    let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
+    if (values != null) {
+      try {
+        return io.HttpDate.parse(values[dartx._get](0));
+      } catch (e) {
+        if (core.Exception.is(e)) {
+          return null;
+        } else
+          throw e;
+      }
+
+    }
+    return null;
+  }
+  set expires(expires) {
+    this[_checkMutable]();
+    let formatted = io.HttpDate.format(expires.toUtc());
+    this[_set$](io.HttpHeaders.EXPIRES, formatted);
+  }
+  get contentType() {
+    let values = this[_headers][dartx._get]("content-type");
+    if (values != null) {
+      return io.ContentType.parse(values[dartx._get](0));
+    } else {
+      return null;
+    }
+  }
+  set contentType(contentType) {
+    this[_checkMutable]();
+    this[_set$](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
+  }
+  clear() {
+    this[_checkMutable]();
+    this[_headers][dartx.clear]();
+    this[_contentLength] = -1;
+    this[_persistentConnection] = true;
+    this[_chunkedTransferEncoding] = false;
+    this[_host$] = null;
+    this[_port$] = null;
+  }
+  [_add$2](name, value) {
+    dart.assert(name == io._HttpHeaders._validateField(name));
+    switch (name[dartx.length]) {
+      case 4:
+      {
+        if (io.HttpHeaders.DATE == name) {
+          this[_addDate](name, value);
+          return;
+        }
+        if (io.HttpHeaders.HOST == name) {
+          this[_addHost](name, value);
+          return;
+        }
+        break;
+      }
+      case 7:
+      {
+        if (io.HttpHeaders.EXPIRES == name) {
+          this[_addExpires](name, value);
+          return;
+        }
+        break;
+      }
+      case 10:
+      {
+        if (io.HttpHeaders.CONNECTION == name) {
+          this[_addConnection](name, value);
+          return;
+        }
+        break;
+      }
+      case 12:
+      {
+        if (io.HttpHeaders.CONTENT_TYPE == name) {
+          this[_addContentType](name, value);
+          return;
+        }
+        break;
+      }
+      case 14:
+      {
+        if (io.HttpHeaders.CONTENT_LENGTH == name) {
+          this[_addContentLength](name, value);
+          return;
+        }
+        break;
+      }
+      case 17:
+      {
+        if (io.HttpHeaders.TRANSFER_ENCODING == name) {
+          this[_addTransferEncoding](name, value);
+          return;
+        }
+        if (io.HttpHeaders.IF_MODIFIED_SINCE == name) {
+          this[_addIfModifiedSince](name, value);
+          return;
+        }
+      }
+    }
+    this[_addValue](name, value);
+  }
+  [_addContentLength](name, value) {
+    if (typeof value == 'number') {
+      this.contentLength = value;
+    } else if (typeof value == 'string') {
+      this.contentLength = core.int.parse(value);
+    } else {
+      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
+    }
+  }
+  [_addTransferEncoding](name, value) {
+    if (dart.equals(value, "chunked")) {
+      this.chunkedTransferEncoding = true;
+    } else {
+      this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, value);
+    }
+  }
+  [_addDate](name, value) {
+    if (core.DateTime.is(value)) {
+      this.date = value;
+    } else if (typeof value == 'string') {
+      this[_set$](io.HttpHeaders.DATE, value);
+    } else {
+      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
+    }
+  }
+  [_addExpires](name, value) {
+    if (core.DateTime.is(value)) {
+      this.expires = value;
+    } else if (typeof value == 'string') {
+      this[_set$](io.HttpHeaders.EXPIRES, value);
+    } else {
+      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
+    }
+  }
+  [_addIfModifiedSince](name, value) {
+    if (core.DateTime.is(value)) {
+      this.ifModifiedSince = value;
+    } else if (typeof value == 'string') {
+      this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, value);
+    } else {
+      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
+    }
+  }
+  [_addHost](name, value) {
+    if (typeof value == 'string') {
+      let pos = value[dartx.indexOf](":");
+      if (pos == -1) {
+        this[_host$] = value;
+        this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
+      } else {
+        if (dart.notNull(pos) > 0) {
+          this[_host$] = value[dartx.substring](0, pos);
+        } else {
+          this[_host$] = null;
+        }
+        if (dart.notNull(pos) + 1 == value[dartx.length]) {
+          this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
+        } else {
+          try {
+            this[_port$] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
+          } catch (e) {
+            if (core.FormatException.is(e)) {
+              this[_port$] = null;
+            } else
+              throw e;
+          }
+
+        }
+      }
+      this[_set$](io.HttpHeaders.HOST, value);
+    } else {
+      dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
+    }
+  }
+  [_addConnection](name, value) {
+    let lowerCaseValue = dart.dsend(value, 'toLowerCase');
+    if (dart.equals(lowerCaseValue, 'close')) {
+      this[_persistentConnection] = false;
+    } else if (dart.equals(lowerCaseValue, 'keep-alive')) {
+      this[_persistentConnection] = true;
+    }
+    this[_addValue](name, value);
+  }
+  [_addContentType](name, value) {
+    this[_set$](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
+  }
+  [_addValue](name, value) {
+    let values = this[_headers][dartx._get](name);
+    if (values == null) {
+      values = ListOfString().new();
+      this[_headers][dartx._set](name, values);
+    }
+    if (core.DateTime.is(value)) {
+      values[dartx.add](io.HttpDate.format(value));
+    } else if (typeof value == 'string') {
+      values[dartx.add](value);
+    } else {
+      values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
+    }
+  }
+  [_set$](name, value) {
+    dart.assert(name == io._HttpHeaders._validateField(name));
+    let values = ListOfString().new();
+    this[_headers][dartx._set](name, values);
+    values[dartx.add](value);
+  }
+  [_checkMutable]() {
+    if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
+  }
+  [_updateHostHeader]() {
+    let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
+    this[_set$]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port$]}`);
+  }
+  [_foldHeader](name) {
+    if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
+      return false;
+    }
+    return true;
+  }
+  [_finalize]() {
+    this[_mutable] = false;
+  }
+  [_write](buffer, offset) {
+    function write(bytes) {
+      let len = bytes[dartx.length];
+      for (let i = 0; i < dart.notNull(len); i++) {
+        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
+      }
+      offset = dart.notNull(offset) + dart.notNull(len);
+    }
+    dart.fn(write, ListOfintTovoid$());
+    for (let name of this[_headers][dartx.keys]) {
+      let values = this[_headers][dartx._get](name);
+      let fold = core.bool._check(this[_foldHeader](name));
+      let nameData = name[dartx.codeUnits];
+      write(nameData);
+      buffer[dartx._set]((() => {
+        let x = offset;
+        offset = dart.notNull(x) + 1;
+        return x;
+      })(), io._CharCode.COLON);
+      buffer[dartx._set]((() => {
+        let x = offset;
+        offset = dart.notNull(x) + 1;
+        return x;
+      })(), io._CharCode.SP);
+      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
+        if (i > 0) {
+          if (dart.test(fold)) {
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.COMMA);
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.SP);
+          } else {
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.CR);
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.LF);
+            write(nameData);
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.COLON);
+            buffer[dartx._set]((() => {
+              let x = offset;
+              offset = dart.notNull(x) + 1;
+              return x;
+            })(), io._CharCode.SP);
+          }
+        }
+        write(values[dartx._get](i)[dartx.codeUnits]);
+      }
+      buffer[dartx._set]((() => {
+        let x = offset;
+        offset = dart.notNull(x) + 1;
+        return x;
+      })(), io._CharCode.CR);
+      buffer[dartx._set]((() => {
+        let x = offset;
+        offset = dart.notNull(x) + 1;
+        return x;
+      })(), io._CharCode.LF);
+    }
+    return offset;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    this[_headers][dartx.forEach](dart.fn((name, values) => {
+      sb.write(name);
+      sb.write(": ");
+      let fold = core.bool._check(this[_foldHeader](name));
+      for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
+        if (i > 0) {
+          if (dart.test(fold)) {
+            sb.write(", ");
+          } else {
+            sb.write("\n");
+            sb.write(name);
+            sb.write(": ");
+          }
+        }
+        sb.write(values[dartx._get](i));
+      }
+      sb.write("\n");
+    }, StringAndListOfStringToNull()));
+    return sb.toString();
+  }
+  [_parseCookies]() {
+    let cookies = ListOfCookie().new();
+    function parseCookieString(s) {
+      let index = 0;
+      function done() {
+        return index == -1 || index == s[dartx.length];
+      }
+      dart.fn(done, VoidTobool());
+      function skipWS() {
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
+          index = dart.notNull(index) + 1;
+        }
+      }
+      dart.fn(skipWS, VoidTovoid$());
+      function parseName() {
+        let start = index;
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=") break;
+          index = dart.notNull(index) + 1;
+        }
+        return s[dartx.substring](start, index);
+      }
+      dart.fn(parseName, VoidToString$());
+      function parseValue() {
+        let start = index;
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == ";") break;
+          index = dart.notNull(index) + 1;
+        }
+        return s[dartx.substring](start, index);
+      }
+      dart.fn(parseValue, VoidToString$());
+      function expect(expected) {
+        if (dart.test(done())) return false;
+        if (s[dartx._get](index) != expected) return false;
+        index = dart.notNull(index) + 1;
+        return true;
+      }
+      dart.fn(expect, StringTobool$());
+      while (!dart.test(done())) {
+        skipWS();
+        if (dart.test(done())) return;
+        let name = parseName();
+        skipWS();
+        if (!dart.test(expect("="))) {
+          index = s[dartx.indexOf](';', index);
+          continue;
+        }
+        skipWS();
+        let value = parseValue();
+        try {
+          cookies[dartx.add](new io._Cookie(name, value));
+        } catch (_) {
+        }
+
+        skipWS();
+        if (dart.test(done())) return;
+        if (!dart.test(expect(";"))) {
+          index = s[dartx.indexOf](';', index);
+          continue;
+        }
+      }
+    }
+    dart.fn(parseCookieString, StringTovoid$());
+    let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
+    if (values != null) {
+      values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid$()));
+    }
+    return cookies;
+  }
+  static _validateField(field) {
+    for (let i = 0; i < dart.notNull(field[dartx.length]); i++) {
+      if (!dart.test(io._HttpParser._isTokenChar(field[dartx.codeUnitAt](i)))) {
+        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field name: ${convert.JSON.encode(field)}`));
+      }
+    }
+    return field[dartx.toLowerCase]();
+  }
+  static _validateValue(value) {
+    if (!(typeof value == 'string')) return value;
+    for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
+      if (!dart.test(io._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', i))))) {
+        dart.throw(new core.FormatException(dart.str`Invalid HTTP header field value: ${convert.JSON.encode(value)}`));
+      }
+    }
+    return value;
+  }
+};
+io._HttpHeaders[dart.implements] = () => [io.HttpHeaders];
+dart.setSignature(io._HttpHeaders, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpHeaders, [core.String], {defaultPortForScheme: core.int, initialHeaders: io._HttpHeaders})}),
+  fields: () => ({
+    [_headers]: MapOfString$ListOfString(),
+    protocolVersion: core.String,
+    [_mutable]: core.bool,
+    [_noFoldingHeaders]: ListOfString(),
+    [_contentLength]: core.int,
+    [_persistentConnection]: core.bool,
+    [_chunkedTransferEncoding]: core.bool,
+    [_host$]: core.String,
+    [_port$]: core.int,
+    [_defaultPortForScheme]: core.int
+  }),
+  getters: () => ({
+    persistentConnection: dart.definiteFunctionType(core.bool, []),
+    contentLength: dart.definiteFunctionType(core.int, []),
+    chunkedTransferEncoding: dart.definiteFunctionType(core.bool, []),
+    host: dart.definiteFunctionType(core.String, []),
+    port: dart.definiteFunctionType(core.int, []),
+    ifModifiedSince: dart.definiteFunctionType(core.DateTime, []),
+    date: dart.definiteFunctionType(core.DateTime, []),
+    expires: dart.definiteFunctionType(core.DateTime, []),
+    contentType: dart.definiteFunctionType(io.ContentType, [])
+  }),
+  setters: () => ({
+    persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
+    contentLength: dart.definiteFunctionType(dart.void, [core.int]),
+    chunkedTransferEncoding: dart.definiteFunctionType(dart.void, [core.bool]),
+    host: dart.definiteFunctionType(dart.void, [core.String]),
+    port: dart.definiteFunctionType(dart.void, [core.int]),
+    ifModifiedSince: dart.definiteFunctionType(dart.void, [core.DateTime]),
+    date: dart.definiteFunctionType(dart.void, [core.DateTime]),
+    expires: dart.definiteFunctionType(dart.void, [core.DateTime]),
+    contentType: dart.definiteFunctionType(dart.void, [io.ContentType])
+  }),
+  methods: () => ({
+    _get: dart.definiteFunctionType(core.List$(core.String), [core.String]),
+    value: dart.definiteFunctionType(core.String, [core.String]),
+    add: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
+    [_addAll]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    set: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
+    remove: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
+    removeAll: dart.definiteFunctionType(dart.void, [core.String]),
+    forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
+    noFolding: dart.definiteFunctionType(dart.void, [core.String]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    [_add$2]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addExpires]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addIfModifiedSince]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addHost]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
+    [_set$]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
+    [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
+    [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    [_finalize]: dart.definiteFunctionType(dart.void, []),
+    [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
+    [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
+  }),
+  statics: () => ({
+    _validateField: dart.definiteFunctionType(core.String, [core.String]),
+    _validateValue: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  }),
+  names: ['_validateField', '_validateValue']
+});
+const _value$1 = Symbol('_value');
+const _parameters = Symbol('_parameters');
+const _unmodifiableParameters = Symbol('_unmodifiableParameters');
+const _parse = Symbol('_parse');
+const _ensureParameters = Symbol('_ensureParameters');
+io._HeaderValue = class _HeaderValue extends core.Object {
+  new(value, parameters) {
+    if (value === void 0) value = "";
+    if (parameters === void 0) parameters = null;
+    this[_value$1] = value;
+    this[_parameters] = null;
+    this[_unmodifiableParameters] = null;
+    if (parameters != null) {
+      this[_parameters] = HashMapOfString$String().from(parameters);
+    }
+  }
+  static parse(value, opts) {
+    let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
+    let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
+    let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
+    let result = new io._HeaderValue();
+    result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
+    return result;
+  }
+  get value() {
+    return this[_value$1];
+  }
+  [_ensureParameters]() {
+    if (this[_parameters] == null) {
+      this[_parameters] = HashMapOfString$String().new();
+    }
+  }
+  get parameters() {
+    this[_ensureParameters]();
+    if (this[_unmodifiableParameters] == null) {
+      this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String())(this[_parameters]);
+    }
+    return this[_unmodifiableParameters];
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write(this[_value$1]);
+    if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
+      this[_parameters][dartx.forEach](dart.fn((name, value) => {
+        sb.write("; ");
+        sb.write(name);
+        sb.write("=");
+        sb.write(value);
+      }, StringAndStringToNull()));
+    }
+    return sb.toString();
+  }
+  [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
+    let index = 0;
+    function done() {
+      return index == s[dartx.length];
+    }
+    dart.fn(done, VoidTobool());
+    function skipWS() {
+      while (!dart.test(done())) {
+        if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
+        index++;
+      }
+    }
+    dart.fn(skipWS, VoidTovoid$());
+    function parseValue() {
+      let start = index;
+      while (!dart.test(done())) {
+        if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == valueSeparator || s[dartx._get](index) == parameterSeparator) break;
+        index++;
+      }
+      return s[dartx.substring](start, index);
+    }
+    dart.fn(parseValue, VoidToString$());
+    function expect(expected) {
+      if (dart.test(done()) || s[dartx._get](index) != expected) {
+        dart.throw(new io.HttpException("Failed to parse header value"));
+      }
+      index++;
+    }
+    dart.fn(expect, StringTovoid$());
+    function maybeExpect(expected) {
+      if (s[dartx._get](index) == expected) index++;
+    }
+    dart.fn(maybeExpect, StringTovoid$());
+    const parseParameters = (function() {
+      let parameters = HashMapOfString$String().new();
+      this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
+      function parseParameterName() {
+        let start = index;
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=" || s[dartx._get](index) == parameterSeparator || s[dartx._get](index) == valueSeparator) break;
+          index++;
+        }
+        return s[dartx.substring](start, index)[dartx.toLowerCase]();
+      }
+      dart.fn(parseParameterName, VoidToString$());
+      function parseParameterValue() {
+        if (!dart.test(done()) && s[dartx._get](index) == "\"") {
+          let sb = new core.StringBuffer();
+          index++;
+          while (!dart.test(done())) {
+            if (s[dartx._get](index) == "\\") {
+              if (index + 1 == s[dartx.length]) {
+                dart.throw(new io.HttpException("Failed to parse header value"));
+              }
+              if (dart.test(preserveBackslash) && s[dartx._get](index + 1) != "\"") {
+                sb.write(s[dartx._get](index));
+              }
+              index++;
+            } else if (s[dartx._get](index) == "\"") {
+              index++;
+              break;
+            }
+            sb.write(s[dartx._get](index));
+            index++;
+          }
+          return sb.toString();
+        } else {
+          let val = parseValue();
+          return val == "" ? null : val;
+        }
+      }
+      dart.fn(parseParameterValue, VoidToString$());
+      while (!dart.test(done())) {
+        skipWS();
+        if (dart.test(done())) return;
+        let name = parseParameterName();
+        skipWS();
+        if (dart.test(done())) {
+          parameters._set(name, null);
+          return;
+        }
+        maybeExpect("=");
+        skipWS();
+        if (dart.test(done())) {
+          parameters._set(name, null);
+          return;
+        }
+        let value = parseParameterValue();
+        if (name == 'charset' && io._ContentType.is(this)) {
+          value = value[dartx.toLowerCase]();
+        }
+        parameters._set(name, value);
+        skipWS();
+        if (dart.test(done())) return;
+        if (s[dartx._get](index) == valueSeparator) return;
+        expect(parameterSeparator);
+      }
+    }).bind(this);
+    dart.fn(parseParameters, VoidTovoid$());
+    skipWS();
+    this[_value$1] = parseValue();
+    skipWS();
+    if (dart.test(done())) return;
+    maybeExpect(parameterSeparator);
+    parseParameters();
+  }
+};
+io._HeaderValue[dart.implements] = () => [io.HeaderValue];
+dart.setSignature(io._HeaderValue, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
+  fields: () => ({
+    [_value$1]: core.String,
+    [_parameters]: MapOfString$String(),
+    [_unmodifiableParameters]: MapOfString$String()
+  }),
+  getters: () => ({
+    value: dart.definiteFunctionType(core.String, []),
+    parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+  }),
+  methods: () => ({
+    [_ensureParameters]: dart.definiteFunctionType(dart.void, []),
+    [_parse]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String, core.bool])
+  }),
+  statics: () => ({parse: dart.definiteFunctionType(io._HeaderValue, [core.String], {parameterSeparator: dart.dynamic, valueSeparator: dart.dynamic, preserveBackslash: dart.dynamic})}),
+  names: ['parse']
+});
+const _primaryType = Symbol('_primaryType');
+const _subType = Symbol('_subType');
+io._ContentType = class _ContentType extends io._HeaderValue {
+  new(primaryType, subType, charset, parameters) {
+    this[_primaryType] = primaryType;
+    this[_subType] = subType;
+    super.new("");
+    if (this[_primaryType] == null) this[_primaryType] = "";
+    if (this[_subType] == null) this[_subType] = "";
+    this[_value$1] = dart.str`${this[_primaryType]}/${this[_subType]}`;
+    if (parameters != null) {
+      this[_ensureParameters]();
+      parameters[dartx.forEach](dart.fn((key, value) => {
+        let lowerCaseKey = key[dartx.toLowerCase]();
+        if (lowerCaseKey == "charset") {
+          value = value[dartx.toLowerCase]();
+        }
+        this[_parameters][dartx._set](lowerCaseKey, value);
+      }, StringAndStringToNull()));
+    }
+    if (charset != null) {
+      this[_ensureParameters]();
+      this[_parameters][dartx._set]("charset", charset[dartx.toLowerCase]());
+    }
+  }
+  _() {
+    this[_primaryType] = "";
+    this[_subType] = "";
+    super.new();
+  }
+  static parse(value) {
+    let result = new io._ContentType._();
+    result[_parse](value, ";", null, false);
+    let index = result[_value$1][dartx.indexOf]("/");
+    if (index == -1 || index == dart.notNull(result[_value$1][dartx.length]) - 1) {
+      result[_primaryType] = result[_value$1][dartx.trim]()[dartx.toLowerCase]();
+      result[_subType] = "";
+    } else {
+      result[_primaryType] = result[_value$1][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
+      result[_subType] = result[_value$1][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
+    }
+    return result;
+  }
+  get mimeType() {
+    return dart.str`${this.primaryType}/${this.subType}`;
+  }
+  get primaryType() {
+    return this[_primaryType];
+  }
+  get subType() {
+    return this[_subType];
+  }
+  get charset() {
+    return this.parameters[dartx._get]("charset");
+  }
+};
+dart.defineNamedConstructor(io._ContentType, '_');
+io._ContentType[dart.implements] = () => [io.ContentType];
+dart.setSignature(io._ContentType, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._ContentType, [core.String, core.String, core.String, MapOfString$String()]),
+    _: dart.definiteFunctionType(io._ContentType, [])
+  }),
+  fields: () => ({
+    [_primaryType]: core.String,
+    [_subType]: core.String
+  }),
+  getters: () => ({
+    mimeType: dart.definiteFunctionType(core.String, []),
+    primaryType: dart.definiteFunctionType(core.String, []),
+    subType: dart.definiteFunctionType(core.String, []),
+    charset: dart.definiteFunctionType(core.String, [])
+  }),
+  statics: () => ({parse: dart.definiteFunctionType(io._ContentType, [core.String])}),
+  names: ['parse']
+});
+const _validate = Symbol('_validate');
+const _parseSetCookieValue = Symbol('_parseSetCookieValue');
+let const$67;
+io._Cookie = class _Cookie extends core.Object {
+  new(name, value) {
+    if (name === void 0) name = null;
+    if (value === void 0) value = null;
+    this.name = name;
+    this.value = value;
+    this.expires = null;
+    this.maxAge = null;
+    this.domain = null;
+    this.path = null;
+    this.httpOnly = false;
+    this.secure = false;
+    this.httpOnly = true;
+    this[_validate]();
+  }
+  fromSetCookieValue(value) {
+    this.name = null;
+    this.value = null;
+    this.expires = null;
+    this.maxAge = null;
+    this.domain = null;
+    this.path = null;
+    this.httpOnly = false;
+    this.secure = false;
+    this[_parseSetCookieValue](value);
+  }
+  [_parseSetCookieValue](s) {
+    let index = 0;
+    function done() {
+      return index == s[dartx.length];
+    }
+    dart.fn(done, VoidTobool());
+    function parseName() {
+      let start = index;
+      while (!dart.test(done())) {
+        if (s[dartx._get](index) == "=") break;
+        index++;
+      }
+      return s[dartx.substring](start, index)[dartx.trim]();
+    }
+    dart.fn(parseName, VoidToString$());
+    function parseValue() {
+      let start = index;
+      while (!dart.test(done())) {
+        if (s[dartx._get](index) == ";") break;
+        index++;
+      }
+      return s[dartx.substring](start, index)[dartx.trim]();
+    }
+    dart.fn(parseValue, VoidToString$());
+    function expect(expected) {
+      if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
+      if (s[dartx._get](index) != expected) {
+        dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
+      }
+      index++;
+    }
+    dart.fn(expect, StringTovoid$());
+    const parseAttributes = (function() {
+      function parseAttributeName() {
+        let start = index;
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) == "=" || s[dartx._get](index) == ";") break;
+          index++;
+        }
+        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
+      }
+      dart.fn(parseAttributeName, VoidToString$());
+      function parseAttributeValue() {
+        let start = index;
+        while (!dart.test(done())) {
+          if (s[dartx._get](index) == ";") break;
+          index++;
+        }
+        return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
+      }
+      dart.fn(parseAttributeValue, VoidToString$());
+      while (!dart.test(done())) {
+        let name = parseAttributeName();
+        let value = "";
+        if (!dart.test(done()) && s[dartx._get](index) == "=") {
+          index++;
+          value = parseAttributeValue();
+        }
+        if (name == "expires") {
+          this.expires = io.HttpDate._parseCookieDate(value);
+        } else if (name == "max-age") {
+          this.maxAge = core.int.parse(value);
+        } else if (name == "domain") {
+          this.domain = value;
+        } else if (name == "path") {
+          this.path = value;
+        } else if (name == "httponly") {
+          this.httpOnly = true;
+        } else if (name == "secure") {
+          this.secure = true;
+        }
+        if (!dart.test(done())) index++;
+      }
+    }).bind(this);
+    dart.fn(parseAttributes, VoidTovoid$());
+    this.name = parseName();
+    if (dart.test(done()) || this.name[dartx.length] == 0) {
+      dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
+    }
+    index++;
+    this.value = parseValue();
+    this[_validate]();
+    if (dart.test(done())) return;
+    index++;
+    parseAttributes();
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write(this.name);
+    sb.write("=");
+    sb.write(this.value);
+    if (this.expires != null) {
+      sb.write("; Expires=");
+      sb.write(io.HttpDate.format(this.expires));
+    }
+    if (this.maxAge != null) {
+      sb.write("; Max-Age=");
+      sb.write(this.maxAge);
+    }
+    if (this.domain != null) {
+      sb.write("; Domain=");
+      sb.write(this.domain);
+    }
+    if (this.path != null) {
+      sb.write("; Path=");
+      sb.write(this.path);
+    }
+    if (dart.test(this.secure)) sb.write("; Secure");
+    if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
+    return sb.toString();
+  }
+  [_validate]() {
+    let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+    for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
+      let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
+      if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
+        dart.throw(new core.FormatException(dart.str`Invalid character in cookie name, code unit: '${codeUnit}'`));
+      }
+    }
+    for (let i = 0; i < dart.notNull(this.value[dartx.length]); i++) {
+      let codeUnit = this.value[dartx.codeUnits][dartx._get](i);
+      if (!(codeUnit == 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
+        dart.throw(new core.FormatException(dart.str`Invalid character in cookie value, code unit: '${codeUnit}'`));
+      }
+    }
+  }
+};
+dart.defineNamedConstructor(io._Cookie, 'fromSetCookieValue');
+io._Cookie[dart.implements] = () => [io.Cookie];
+dart.setSignature(io._Cookie, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._Cookie, [], [core.String, core.String]),
+    fromSetCookieValue: dart.definiteFunctionType(io._Cookie, [core.String])
+  }),
+  fields: () => ({
+    name: core.String,
+    value: core.String,
+    expires: core.DateTime,
+    maxAge: core.int,
+    domain: core.String,
+    path: core.String,
+    httpOnly: core.bool,
+    secure: core.bool
+  }),
+  methods: () => ({
+    [_parseSetCookieValue]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_validate]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+io._OUTGOING_BUFFER_SIZE = 8 * 1024;
+const _transferLength = Symbol('_transferLength');
+const _dataCompleter = Symbol('_dataCompleter');
+const _stream$ = Symbol('_stream');
+io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
+  get transferLength() {
+    return this[_transferLength];
+  }
+  new(headers, transferLength, stream) {
+    this[_dataCompleter] = async.Completer.new();
+    this.headers = headers;
+    this[_transferLength] = transferLength;
+    this[_stream$] = stream;
+    this.fullBodyRead = false;
+    this.upgraded = false;
+    this.statusCode = null;
+    this.reasonPhrase = null;
+    this.method = null;
+    this.uri = null;
+    this.hasSubscriber = false;
+    super.new();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    this.hasSubscriber = true;
+    return this[_stream$].handleError(dart.fn(error => {
+      dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
+    }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get dataDone() {
+    return this[_dataCompleter].future;
+  }
+  close(closing) {
+    this.fullBodyRead = true;
+    this.hasSubscriber = true;
+    this[_dataCompleter].complete(closing);
+  }
+};
+dart.addSimpleTypeTests(io._HttpIncoming);
+dart.setSignature(io._HttpIncoming, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpIncoming, [io._HttpHeaders, core.int, StreamOfListOfint()])}),
+  fields: () => ({
+    [_transferLength]: core.int,
+    [_dataCompleter]: async.Completer,
+    [_stream$]: StreamOfListOfint(),
+    fullBodyRead: core.bool,
+    headers: io._HttpHeaders,
+    upgraded: core.bool,
+    statusCode: core.int,
+    reasonPhrase: core.String,
+    method: core.String,
+    uri: core.Uri,
+    hasSubscriber: core.bool
+  }),
+  getters: () => ({
+    transferLength: dart.definiteFunctionType(core.int, []),
+    dataDone: dart.definiteFunctionType(async.Future, [])
+  }),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    close: dart.definiteFunctionType(dart.void, [core.bool])
+  })
+});
+const _incoming = Symbol('_incoming');
+const _cookies = Symbol('_cookies');
+io._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
+  new(incoming) {
+    this[_incoming] = incoming;
+    this[_cookies] = null;
+    super.new();
+  }
+  get cookies() {
+    if (this[_cookies] != null) return this[_cookies];
+    return this[_cookies] = this.headers[_parseCookies]();
+  }
+  get headers() {
+    return this[_incoming].headers;
+  }
+  get protocolVersion() {
+    return this.headers.protocolVersion;
+  }
+  get contentLength() {
+    return this.headers.contentLength;
+  }
+  get persistentConnection() {
+    return this.headers.persistentConnection;
+  }
+};
+dart.addSimpleTypeTests(io._HttpInboundMessage);
+dart.setSignature(io._HttpInboundMessage, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpInboundMessage, [io._HttpIncoming])}),
+  fields: () => ({
+    [_incoming]: io._HttpIncoming,
+    [_cookies]: ListOfCookie()
+  }),
+  getters: () => ({
+    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
+    headers: dart.definiteFunctionType(io._HttpHeaders, []),
+    protocolVersion: dart.definiteFunctionType(core.String, []),
+    contentLength: dart.definiteFunctionType(core.int, []),
+    persistentConnection: dart.definiteFunctionType(core.bool, [])
+  })
+});
+const _httpServer = Symbol('_httpServer');
+const _httpConnection = Symbol('_httpConnection');
+const _session = Symbol('_session');
+const _requestedUri = Symbol('_requestedUri');
+const _sessionManagerInstance = Symbol('_sessionManagerInstance');
+const _sessionManager = Symbol('_sessionManager');
+const _markSeen = Symbol('_markSeen');
+const _socket = Symbol('_socket');
+const _destroyed = Symbol('_destroyed');
+io._HttpRequest = class _HttpRequest extends io._HttpInboundMessage {
+  new(response, _incoming, httpServer, httpConnection) {
+    this.response = response;
+    this[_httpServer] = httpServer;
+    this[_httpConnection] = httpConnection;
+    this[_session] = null;
+    this[_requestedUri] = null;
+    super.new(_incoming);
+    if (this.headers.protocolVersion == "1.1") {
+      let _ = this.response.headers;
+      _.chunkedTransferEncoding = true;
+      _.persistentConnection = this.headers.persistentConnection;
+    }
+    if (this[_httpServer][_sessionManagerInstance] != null) {
+      let sessionIds = this.cookies[dartx.where](dart.fn(cookie => cookie.name[dartx.toUpperCase]() == io._DART_SESSION_ID, CookieTobool()))[dartx.map](core.String)(dart.fn(cookie => cookie.value, CookieToString()));
+      for (let sessionId of sessionIds) {
+        this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
+        if (this[_session] != null) {
+          this[_session][_markSeen]();
+          break;
+        }
+      }
+    }
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get uri() {
+    return this[_incoming].uri;
+  }
+  get requestedUri() {
+    if (this[_requestedUri] == null) {
+      let proto = this.headers._get('x-forwarded-proto');
+      let scheme = proto != null ? proto[dartx.first] : io.SecureSocket.is(this[_httpConnection][_socket]) ? "https" : "http";
+      let hostList = this.headers._get('x-forwarded-host');
+      let host = null;
+      if (hostList != null) {
+        host = hostList[dartx.first];
+      } else {
+        hostList = this.headers._get('host');
+        if (hostList != null) {
+          host = hostList[dartx.first];
+        } else {
+          host = dart.str`${this[_httpServer].address.host}:${this[_httpServer].port}`;
+        }
+      }
+      this[_requestedUri] = core.Uri.parse(dart.str`${scheme}://${host}${this.uri}`);
+    }
+    return this[_requestedUri];
+  }
+  get method() {
+    return this[_incoming].method;
+  }
+  get session() {
+    if (this[_session] != null) {
+      if (dart.test(this[_session][_destroyed])) {
+        this[_session] = null;
+        return this.session;
+      }
+      return this[_session];
+    }
+    return this[_session] = this[_httpServer][_sessionManager].createSession();
+  }
+  get connectionInfo() {
+    return this[_httpConnection].connectionInfo;
+  }
+  get certificate() {
+    let socket = this[_httpConnection][_socket];
+    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
+    return null;
+  }
+};
+io._HttpRequest[dart.implements] = () => [io.HttpRequest];
+dart.setSignature(io._HttpRequest, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpRequest, [io.HttpResponse, io._HttpIncoming, io._HttpServer, io._HttpConnection])}),
+  fields: () => ({
+    response: io.HttpResponse,
+    [_httpServer]: io._HttpServer,
+    [_httpConnection]: io._HttpConnection,
+    [_session]: io._HttpSession,
+    [_requestedUri]: core.Uri
+  }),
+  getters: () => ({
+    uri: dart.definiteFunctionType(core.Uri, []),
+    requestedUri: dart.definiteFunctionType(core.Uri, []),
+    method: dart.definiteFunctionType(core.String, []),
+    session: dart.definiteFunctionType(io.HttpSession, []),
+    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
+    certificate: dart.definiteFunctionType(io.X509Certificate, [])
+  }),
+  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+});
+const _responseRedirects = Symbol('_responseRedirects');
+const _httpRequest = Symbol('_httpRequest');
+const _httpClient = Symbol('_httpClient');
+const _httpClientConnection = Symbol('_httpClientConnection');
+const _openUrlFromRequest = Symbol('_openUrlFromRequest');
+const _connectionClosed = Symbol('_connectionClosed');
+const _shouldAuthenticateProxy = Symbol('_shouldAuthenticateProxy');
+const _shouldAuthenticate = Symbol('_shouldAuthenticate');
+const _proxy = Symbol('_proxy');
+const _findProxyCredentials = Symbol('_findProxyCredentials');
+const _findCredentials = Symbol('_findCredentials');
+const _removeProxyCredentials = Symbol('_removeProxyCredentials');
+const _removeCredentials = Symbol('_removeCredentials');
+const _authenticateProxy = Symbol('_authenticateProxy');
+const _authenticate = Symbol('_authenticate');
+io._HttpClientResponse = class _HttpClientResponse extends io._HttpInboundMessage {
+  get redirects() {
+    return this[_httpRequest][_responseRedirects];
+  }
+  new(_incoming, httpRequest, httpClient) {
+    this[_httpRequest] = httpRequest;
+    this[_httpClient] = httpClient;
+    super.new(_incoming);
+    _incoming.uri = this[_httpRequest].uri;
+  }
+  get statusCode() {
+    return this[_incoming].statusCode;
+  }
+  get reasonPhrase() {
+    return this[_incoming].reasonPhrase;
+  }
+  get certificate() {
+    let socket = this[_httpRequest][_httpClientConnection][_socket];
+    if (io.SecureSocket.is(socket)) return socket.peerCertificate;
+    dart.throw(new core.UnsupportedError("Socket is not a SecureSocket"));
+  }
+  get cookies() {
+    if (this[_cookies] != null) return this[_cookies];
+    this[_cookies] = ListOfCookie().new();
+    let values = this.headers._get(io.HttpHeaders.SET_COOKIE);
+    if (values != null) {
+      values[dartx.forEach](dart.fn(value => {
+        this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
+      }, StringToNull()));
+    }
+    return this[_cookies];
+  }
+  get isRedirect() {
+    if (this[_httpRequest].method == "GET" || this[_httpRequest].method == "HEAD") {
+      return this.statusCode == io.HttpStatus.MOVED_PERMANENTLY || this.statusCode == io.HttpStatus.FOUND || this.statusCode == io.HttpStatus.SEE_OTHER || this.statusCode == io.HttpStatus.TEMPORARY_REDIRECT;
+    } else if (this[_httpRequest].method == "POST") {
+      return this.statusCode == io.HttpStatus.SEE_OTHER;
+    }
+    return false;
+  }
+  redirect(method, url, followLoops) {
+    if (method === void 0) method = null;
+    if (url === void 0) url = null;
+    if (followLoops === void 0) followLoops = null;
+    if (method == null) {
+      if (this.statusCode == io.HttpStatus.SEE_OTHER && this[_httpRequest].method == "POST") {
+        method = "GET";
+      } else {
+        method = this[_httpRequest].method;
+      }
+    }
+    if (url == null) {
+      let location = this.headers.value(io.HttpHeaders.LOCATION);
+      if (location == null) {
+        dart.throw(new core.StateError("Response has no Location header for redirect"));
+      }
+      url = core.Uri.parse(location);
+    }
+    if (followLoops != true) {
+      for (let redirect of this.redirects) {
+        if (dart.equals(redirect.location, url)) {
+          return FutureOfHttpClientResponse().error(new io.RedirectException("Redirect loop detected", this.redirects));
+        }
+      }
+    }
+    return this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => {
+      let _ = request[_responseRedirects];
+      _[dartx.addAll](this.redirects);
+      _[dartx.add](new io._RedirectInfo(this.statusCode, method, url));
+      return request.close();
+    }, _HttpClientRequestToFutureOfHttpClientResponse()));
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    if (dart.test(this[_incoming].upgraded)) {
+      this[_httpRequest][_httpClientConnection].destroy();
+      return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
+    }
+    let stream = this[_incoming];
+    if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
+      stream = io._HttpIncoming._check(stream.transform(ListOfint())(io.GZIP.decoder));
+    }
+    return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  detachSocket() {
+    this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
+    return this[_httpRequest][_httpClientConnection].detachSocket();
+  }
+  get connectionInfo() {
+    return this[_httpRequest].connectionInfo;
+  }
+  get [_shouldAuthenticateProxy]() {
+    let challenge = this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE);
+    return this.statusCode == io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED && challenge != null && challenge[dartx.length] == 1;
+  }
+  get [_shouldAuthenticate]() {
+    let challenge = this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
+    return this.statusCode == io.HttpStatus.UNAUTHORIZED && challenge != null && challenge[dartx.length] == 1;
+  }
+  [_authenticate](proxyAuth) {
+    const retry = (function() {
+      return this.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse())), dynamicToFutureOfHttpClientResponse()));
+    }).bind(this);
+    dart.fn(retry, VoidToFutureOfHttpClientResponse());
+    const authChallenge = (function() {
+      return dart.test(proxyAuth) ? this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE) : this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
+    }).bind(this);
+    dart.fn(authChallenge, VoidToListOfString());
+    const findCredentials = (function(scheme) {
+      return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
+    }).bind(this);
+    dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
+    const removeCredentials = (function(cr) {
+      if (dart.test(proxyAuth)) {
+        this[_httpClient][_removeProxyCredentials](cr);
+      } else {
+        this[_httpClient][_removeCredentials](cr);
+      }
+    }).bind(this);
+    dart.fn(removeCredentials, _CredentialsTovoid());
+    const requestAuthentication = (function(scheme, realm) {
+      if (dart.test(proxyAuth)) {
+        if (this[_httpClient][_authenticateProxy] == null) {
+          return async.Future.value(false);
+        }
+        let proxy = this[_httpRequest][_proxy];
+        return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, proxy.host, proxy.port, dart.toString(scheme), realm));
+      } else {
+        if (this[_httpClient][_authenticate] == null) {
+          return async.Future.value(false);
+        }
+        return async.Future._check(dart.dsend(this[_httpClient], _authenticate, this[_httpRequest].uri, dart.toString(scheme), realm));
+      }
+    }).bind(this);
+    dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
+    let challenge = authChallenge();
+    dart.assert(challenge != null || challenge[dartx.length] == 1);
+    let header = io._HeaderValue.parse(challenge[dartx._get](0), {parameterSeparator: ","});
+    let scheme = io._AuthenticationScheme.fromString(header.value);
+    let realm = header.parameters[dartx._get]("realm");
+    let cr = findCredentials(scheme);
+    if (cr != null) {
+      if (dart.equals(cr.scheme, io._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
+        return retry();
+      }
+      if (dart.equals(cr.scheme, io._AuthenticationScheme.DIGEST) && (header.parameters[dartx._get]("algorithm") == null || header.parameters[dartx._get]("algorithm")[dartx.toLowerCase]() == "md5")) {
+        if (cr.nonce == null || cr.nonce == header.parameters[dartx._get]("nonce")) {
+          if (cr.nonce == null) {
+            let _ = cr;
+            _.nonce = header.parameters[dartx._get]("nonce");
+            _.algorithm = "MD5";
+            _.qop = header.parameters[dartx._get]("qop");
+            _.nonceCount = 0;
+          }
+          return retry();
+        } else if (header.parameters[dartx._get]("stale") != null && header.parameters[dartx._get]("stale")[dartx.toLowerCase]() == "true") {
+          cr.nonce = header.parameters[dartx._get]("nonce");
+          return retry();
+        }
+      }
+    }
+    if (cr != null) {
+      removeCredentials(cr);
+      cr = null;
+    }
+    return requestAuthentication(scheme, realm).then(io.HttpClientResponse)(dart.fn(credsAvailable => {
+      if (dart.test(credsAvailable)) {
+        cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
+        return retry();
+      } else {
+        return this;
+      }
+    }, dynamicToFutureOrOfHttpClientResponse()));
+  }
+};
+io._HttpClientResponse[dart.implements] = () => [io.HttpClientResponse];
+dart.setSignature(io._HttpClientResponse, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientResponse, [io._HttpIncoming, io._HttpClientRequest, io._HttpClient])}),
+  fields: () => ({
+    [_httpClient]: io._HttpClient,
+    [_httpRequest]: io._HttpClientRequest
+  }),
+  getters: () => ({
+    redirects: dart.definiteFunctionType(core.List$(io.RedirectInfo), []),
+    statusCode: dart.definiteFunctionType(core.int, []),
+    reasonPhrase: dart.definiteFunctionType(core.String, []),
+    certificate: dart.definiteFunctionType(io.X509Certificate, []),
+    isRedirect: dart.definiteFunctionType(core.bool, []),
+    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
+    [_shouldAuthenticateProxy]: dart.definiteFunctionType(core.bool, []),
+    [_shouldAuthenticate]: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    redirect: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
+    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
+    [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
+  })
+});
+const _uri = Symbol('_uri');
+const _outgoing = Symbol('_outgoing');
+const _encodingSet = Symbol('_encodingSet');
+const _bufferOutput = Symbol('_bufferOutput');
+const _encodingMutable = Symbol('_encodingMutable');
+const _encoding = Symbol('_encoding');
+const _isConnectionClosed = Symbol('_isConnectionClosed');
+const _doneCompleter = Symbol('_doneCompleter');
+const _target$ = Symbol('_target');
+const _controllerInstance = Symbol('_controllerInstance');
+const _controllerCompleter = Symbol('_controllerCompleter');
+const _isClosed$0 = Symbol('_isClosed');
+const _isBound = Symbol('_isBound');
+const _hasError$ = Symbol('_hasError');
+const _closeTarget = Symbol('_closeTarget');
+const _completeDoneValue = Symbol('_completeDoneValue');
+const _completeDoneError = Symbol('_completeDoneError');
+io._StreamSinkImpl$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
+  let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
+  class _StreamSinkImpl extends core.Object {
+    new(target) {
+      this[_doneCompleter] = async.Completer.new();
+      this[_target$] = target;
+      this[_controllerInstance] = null;
+      this[_controllerCompleter] = null;
+      this[_isClosed$0] = false;
+      this[_isBound] = false;
+      this[_hasError$] = false;
+    }
+    add(data) {
+      T._check(data);
+      if (dart.test(this[_isClosed$0])) return;
+      this[_controller$0].add(data);
+    }
+    addError(error, stackTrace) {
+      if (stackTrace === void 0) stackTrace = null;
+      this[_controller$0].addError(error, stackTrace);
+    }
+    addStream(stream) {
+      StreamOfT()._check(stream);
+      if (dart.test(this[_isBound])) {
+        dart.throw(new core.StateError("StreamSink is already bound to a stream"));
+      }
+      this[_isBound] = true;
+      if (dart.test(this[_hasError$])) return this.done;
+      const targetAddStream = (function() {
+        return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
+          this[_isBound] = false;
+        }, VoidToNull()));
+      }).bind(this);
+      dart.fn(targetAddStream, VoidToFuture());
+      if (this[_controllerInstance] == null) return targetAddStream();
+      let future = this[_controllerCompleter].future;
+      this[_controllerInstance].close();
+      return future.then(dart.dynamic)(dart.fn(_ => targetAddStream(), dynamicToFuture()));
+    }
+    flush() {
+      if (dart.test(this[_isBound])) {
+        dart.throw(new core.StateError("StreamSink is bound to a stream"));
+      }
+      if (this[_controllerInstance] == null) return async.Future.value(this);
+      this[_isBound] = true;
+      let future = this[_controllerCompleter].future;
+      this[_controllerInstance].close();
+      return future.whenComplete(dart.fn(() => {
+        this[_isBound] = false;
+      }, VoidToNull()));
+    }
+    close() {
+      if (dart.test(this[_isBound])) {
+        dart.throw(new core.StateError("StreamSink is bound to a stream"));
+      }
+      if (!dart.test(this[_isClosed$0])) {
+        this[_isClosed$0] = true;
+        if (this[_controllerInstance] != null) {
+          this[_controllerInstance].close();
+        } else {
+          this[_closeTarget]();
+        }
+      }
+      return this.done;
+    }
+    [_closeTarget]() {
+      this[_target$].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
+    }
+    get done() {
+      return this[_doneCompleter].future;
+    }
+    [_completeDoneValue](value) {
+      if (!dart.test(this[_doneCompleter].isCompleted)) {
+        this[_doneCompleter].complete(value);
+      }
+    }
+    [_completeDoneError](error, stackTrace) {
+      if (!dart.test(this[_doneCompleter].isCompleted)) {
+        this[_hasError$] = true;
+        this[_doneCompleter].completeError(error, stackTrace);
+      }
+    }
+    get [_controller$0]() {
+      if (dart.test(this[_isBound])) {
+        dart.throw(new core.StateError("StreamSink is bound to a stream"));
+      }
+      if (dart.test(this[_isClosed$0])) {
+        dart.throw(new core.StateError("StreamSink is closed"));
+      }
+      if (this[_controllerInstance] == null) {
+        this[_controllerInstance] = StreamControllerOfT().new({sync: true});
+        this[_controllerCompleter] = async.Completer.new();
+        this[_target$].addStream(this[_controller$0].stream).then(dart.dynamic)(dart.fn(_ => {
+          if (dart.test(this[_isBound])) {
+            this[_controllerCompleter].complete(this);
+            this[_controllerCompleter] = null;
+            this[_controllerInstance] = null;
+          } else {
+            this[_closeTarget]();
+          }
+        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
+            if (dart.test(this[_isBound])) {
+              this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
+              this[_controllerCompleter] = null;
+              this[_controllerInstance] = null;
+            } else {
+              this[_completeDoneError](error, core.StackTrace._check(stackTrace));
+            }
+          }, dynamicAnddynamicToNull())});
+      }
+      return this[_controllerInstance];
+    }
+  }
+  dart.addTypeTests(_StreamSinkImpl);
+  _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
+  dart.setSignature(_StreamSinkImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
+    fields: () => ({
+      [_target$]: StreamConsumerOfT(),
+      [_doneCompleter]: async.Completer,
+      [_controllerInstance]: StreamControllerOfT(),
+      [_controllerCompleter]: async.Completer,
+      [_isClosed$0]: core.bool,
+      [_isBound]: core.bool,
+      [_hasError$]: core.bool
+    }),
+    getters: () => ({
+      done: dart.definiteFunctionType(async.Future, []),
+      [_controller$0]: dart.definiteFunctionType(async.StreamController$(T), [])
+    }),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [T]),
+      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfT()]),
+      flush: dart.definiteFunctionType(async.Future, []),
+      close: dart.definiteFunctionType(async.Future, []),
+      [_closeTarget]: dart.definiteFunctionType(dart.void, []),
+      [_completeDoneValue]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      [_completeDoneError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])
+    })
+  });
+  return _StreamSinkImpl;
+});
+io._StreamSinkImpl = _StreamSinkImpl();
+io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
+  new(target, encoding) {
+    this[_encoding] = encoding;
+    this[_encodingMutable] = true;
+    super.new(target);
+  }
+  get encoding() {
+    return this[_encoding];
+  }
+  set encoding(value) {
+    if (!dart.test(this[_encodingMutable])) {
+      dart.throw(new core.StateError("IOSink encoding is not mutable"));
+    }
+    this[_encoding] = value;
+  }
+  write(obj) {
+    let string = dart.str`${obj}`;
+    if (dart.test(string[dartx.isEmpty])) return;
+    this.add(this[_encoding].encode(string));
+  }
+  writeAll(objects, separator) {
+    if (separator === void 0) separator = "";
+    let iterator = objects[dartx.iterator];
+    if (!dart.test(iterator.moveNext())) return;
+    if (dart.test(separator[dartx.isEmpty])) {
+      do {
+        this.write(iterator.current);
+      } while (dart.test(iterator.moveNext()));
+    } else {
+      this.write(iterator.current);
+      while (dart.test(iterator.moveNext())) {
+        this.write(separator);
+        this.write(iterator.current);
+      }
+    }
+  }
+  writeln(object) {
+    if (object === void 0) object = "";
+    this.write(object);
+    this.write("\n");
+  }
+  writeCharCode(charCode) {
+    this.write(core.String.fromCharCode(charCode));
+  }
+};
+dart.addSimpleTypeTests(io._IOSinkImpl);
+io._IOSinkImpl[dart.implements] = () => [io.IOSink];
+dart.setSignature(io._IOSinkImpl, {
+  constructors: () => ({new: dart.definiteFunctionType(io._IOSinkImpl, [StreamConsumerOfListOfint(), convert.Encoding])}),
+  fields: () => ({
+    [_encoding]: convert.Encoding,
+    [_encodingMutable]: core.bool
+  }),
+  getters: () => ({encoding: dart.definiteFunctionType(convert.Encoding, [])}),
+  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+  methods: () => ({
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
+  })
+});
+io._HttpOutboundMessage$ = dart.generic(T => {
+  class _HttpOutboundMessage extends io._IOSinkImpl {
+    new(uri, protocolVersion, outgoing, opts) {
+      let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
+      this[_uri] = uri;
+      this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
+      this[_outgoing] = outgoing;
+      this[_encodingSet] = false;
+      this[_bufferOutput] = true;
+      super.new(outgoing, null);
+      this[_outgoing].outbound = this;
+      this[_encodingMutable] = false;
+    }
+    get contentLength() {
+      return this.headers.contentLength;
+    }
+    set contentLength(contentLength) {
+      this.headers.contentLength = contentLength;
+    }
+    get persistentConnection() {
+      return this.headers.persistentConnection;
+    }
+    set persistentConnection(p) {
+      this.headers.persistentConnection = p;
+    }
+    get bufferOutput() {
+      return this[_bufferOutput];
+    }
+    set bufferOutput(bufferOutput) {
+      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
+      this[_bufferOutput] = bufferOutput;
+    }
+    get encoding() {
+      if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
+        return this[_encoding];
+      }
+      let charset = null;
+      if (this.headers.contentType != null && this.headers.contentType.charset != null) {
+        charset = this.headers.contentType.charset;
+      } else {
+        charset = "iso-8859-1";
+      }
+      return convert.Encoding.getByName(core.String._check(charset));
+    }
+    set encoding(value) {
+      super.encoding = value;
+    }
+    add(data) {
+      if (data[dartx.length] == 0) return;
+      super.add(data);
+    }
+    write(obj) {
+      if (!dart.test(this[_encodingSet])) {
+        this[_encoding] = this.encoding;
+        this[_encodingSet] = true;
+      }
+      super.write(obj);
+    }
+    get [_isConnectionClosed]() {
+      return false;
+    }
+  }
+  dart.addTypeTests(_HttpOutboundMessage);
+  dart.setSignature(_HttpOutboundMessage, {
+    constructors: () => ({new: dart.definiteFunctionType(io._HttpOutboundMessage$(T), [core.Uri, core.String, io._HttpOutgoing], {initialHeaders: io._HttpHeaders})}),
+    fields: () => ({
+      [_encodingSet]: core.bool,
+      [_bufferOutput]: core.bool,
+      [_uri]: core.Uri,
+      [_outgoing]: io._HttpOutgoing,
+      headers: io._HttpHeaders
+    }),
+    getters: () => ({
+      contentLength: dart.definiteFunctionType(core.int, []),
+      persistentConnection: dart.definiteFunctionType(core.bool, []),
+      bufferOutput: dart.definiteFunctionType(core.bool, []),
+      [_isConnectionClosed]: dart.definiteFunctionType(core.bool, [])
+    }),
+    setters: () => ({
+      contentLength: dart.definiteFunctionType(dart.void, [core.int]),
+      persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
+      bufferOutput: dart.definiteFunctionType(dart.void, [core.bool])
+    })
+  });
+  return _HttpOutboundMessage;
+});
+io._HttpOutboundMessage = _HttpOutboundMessage();
+const _statusCode = Symbol('_statusCode');
+const _reasonPhrase = Symbol('_reasonPhrase');
+const _deadline = Symbol('_deadline');
+const _deadlineTimer = Symbol('_deadlineTimer');
+const _isClosing = Symbol('_isClosing');
+const _findReasonPhrase = Symbol('_findReasonPhrase');
+const _isNew = Symbol('_isNew');
+const _writeHeader = Symbol('_writeHeader');
+io._HttpResponse = class _HttpResponse extends io._HttpOutboundMessage$(io.HttpResponse) {
+  new(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
+    this[_statusCode] = 200;
+    this[_reasonPhrase] = null;
+    this[_cookies] = null;
+    this[_httpRequest] = null;
+    this[_deadline] = null;
+    this[_deadlineTimer] = null;
+    super.new(uri, protocolVersion, outgoing, {initialHeaders: io._HttpHeaders._check(defaultHeaders)});
+    if (serverHeader != null) this.headers.set('server', serverHeader);
+  }
+  get [_isConnectionClosed]() {
+    return this[_httpRequest][_httpConnection][_isClosing];
+  }
+  get cookies() {
+    if (this[_cookies] == null) this[_cookies] = ListOfCookie().new();
+    return this[_cookies];
+  }
+  get statusCode() {
+    return this[_statusCode];
+  }
+  set statusCode(statusCode) {
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
+    this[_statusCode] = statusCode;
+  }
+  get reasonPhrase() {
+    return this[_findReasonPhrase](this.statusCode);
+  }
+  set reasonPhrase(reasonPhrase) {
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
+    this[_reasonPhrase] = reasonPhrase;
+  }
+  redirect(location, opts) {
+    let status = opts && 'status' in opts ? opts.status : io.HttpStatus.MOVED_TEMPORARILY;
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
+    this.statusCode = status;
+    this.headers.set("location", dart.toString(location));
+    return this.close();
+  }
+  detachSocket(opts) {
+    let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Headers already sent"));
+    this.deadline = null;
+    let future = this[_httpRequest][_httpConnection].detachSocket();
+    if (dart.test(writeHeaders)) {
+      let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
+      dart.assert(headersFuture == null);
+    } else {
+      this[_outgoing].headersWritten = true;
+    }
+    this.close();
+    this.done.catchError(dart.fn(_ => {
+    }, dynamicToNull$()));
+    return future;
+  }
+  get connectionInfo() {
+    return this[_httpRequest].connectionInfo;
+  }
+  get deadline() {
+    return this[_deadline];
+  }
+  set deadline(d) {
+    if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
+    this[_deadline] = d;
+    if (this[_deadline] == null) return;
+    this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
+      this[_httpRequest][_httpConnection].destroy();
+    }, VoidToNull()));
+  }
+  [_writeHeader]() {
+    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+    let offset = 0;
+    function write(bytes) {
+      let len = bytes[dartx.length];
+      for (let i = 0; i < dart.notNull(len); i++) {
+        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
+      }
+      offset = dart.notNull(offset) + dart.notNull(len);
+    }
+    dart.fn(write, ListOfintTovoid$());
+    if (this.headers.protocolVersion == "1.1") {
+      write(io._Const.HTTP11);
+    } else {
+      write(io._Const.HTTP10);
+    }
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.SP);
+    write(dart.toString(this.statusCode)[dartx.codeUnits]);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.SP);
+    write(this.reasonPhrase[dartx.codeUnits]);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.CR);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.LF);
+    let session = this[_httpRequest][_session];
+    if (session != null && !dart.test(session[_destroyed])) {
+      session[_isNew] = false;
+      let found = false;
+      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
+        if (this.cookies[dartx._get](i).name[dartx.toUpperCase]() == io._DART_SESSION_ID) {
+          let _ = this.cookies[dartx._get](i);
+          _.value = session.id;
+          _.httpOnly = true;
+          _.path = "/";
+          found = true;
+        }
+      }
+      if (!found) {
+        let cookie = io.Cookie.new(io._DART_SESSION_ID, session.id);
+        this.cookies[dartx.add](((() => {
+          cookie.httpOnly = true;
+          cookie.path = "/";
+          return cookie;
+        })()));
+      }
+    }
+    if (this[_cookies] != null) {
+      this[_cookies][dartx.forEach](dart.fn(cookie => {
+        this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
+      }, CookieToNull()));
+    }
+    this.headers[_finalize]();
+    offset = this.headers[_write](buffer, offset);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.CR);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.LF);
+    this[_outgoing].setHeader(buffer, offset);
+  }
+  [_findReasonPhrase](statusCode) {
+    if (this[_reasonPhrase] != null) {
+      return this[_reasonPhrase];
+    }
+    switch (statusCode) {
+      case io.HttpStatus.CONTINUE:
+      {
+        return "Continue";
+      }
+      case io.HttpStatus.SWITCHING_PROTOCOLS:
+      {
+        return "Switching Protocols";
+      }
+      case io.HttpStatus.OK:
+      {
+        return "OK";
+      }
+      case io.HttpStatus.CREATED:
+      {
+        return "Created";
+      }
+      case io.HttpStatus.ACCEPTED:
+      {
+        return "Accepted";
+      }
+      case io.HttpStatus.NON_AUTHORITATIVE_INFORMATION:
+      {
+        return "Non-Authoritative Information";
+      }
+      case io.HttpStatus.NO_CONTENT:
+      {
+        return "No Content";
+      }
+      case io.HttpStatus.RESET_CONTENT:
+      {
+        return "Reset Content";
+      }
+      case io.HttpStatus.PARTIAL_CONTENT:
+      {
+        return "Partial Content";
+      }
+      case io.HttpStatus.MULTIPLE_CHOICES:
+      {
+        return "Multiple Choices";
+      }
+      case io.HttpStatus.MOVED_PERMANENTLY:
+      {
+        return "Moved Permanently";
+      }
+      case io.HttpStatus.FOUND:
+      {
+        return "Found";
+      }
+      case io.HttpStatus.SEE_OTHER:
+      {
+        return "See Other";
+      }
+      case io.HttpStatus.NOT_MODIFIED:
+      {
+        return "Not Modified";
+      }
+      case io.HttpStatus.USE_PROXY:
+      {
+        return "Use Proxy";
+      }
+      case io.HttpStatus.TEMPORARY_REDIRECT:
+      {
+        return "Temporary Redirect";
+      }
+      case io.HttpStatus.BAD_REQUEST:
+      {
+        return "Bad Request";
+      }
+      case io.HttpStatus.UNAUTHORIZED:
+      {
+        return "Unauthorized";
+      }
+      case io.HttpStatus.PAYMENT_REQUIRED:
+      {
+        return "Payment Required";
+      }
+      case io.HttpStatus.FORBIDDEN:
+      {
+        return "Forbidden";
+      }
+      case io.HttpStatus.NOT_FOUND:
+      {
+        return "Not Found";
+      }
+      case io.HttpStatus.METHOD_NOT_ALLOWED:
+      {
+        return "Method Not Allowed";
+      }
+      case io.HttpStatus.NOT_ACCEPTABLE:
+      {
+        return "Not Acceptable";
+      }
+      case io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
+      {
+        return "Proxy Authentication Required";
+      }
+      case io.HttpStatus.REQUEST_TIMEOUT:
+      {
+        return "Request Time-out";
+      }
+      case io.HttpStatus.CONFLICT:
+      {
+        return "Conflict";
+      }
+      case io.HttpStatus.GONE:
+      {
+        return "Gone";
+      }
+      case io.HttpStatus.LENGTH_REQUIRED:
+      {
+        return "Length Required";
+      }
+      case io.HttpStatus.PRECONDITION_FAILED:
+      {
+        return "Precondition Failed";
+      }
+      case io.HttpStatus.REQUEST_ENTITY_TOO_LARGE:
+      {
+        return "Request Entity Too Large";
+      }
+      case io.HttpStatus.REQUEST_URI_TOO_LONG:
+      {
+        return "Request-URI Too Large";
+      }
+      case io.HttpStatus.UNSUPPORTED_MEDIA_TYPE:
+      {
+        return "Unsupported Media Type";
+      }
+      case io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
+      {
+        return "Requested range not satisfiable";
+      }
+      case io.HttpStatus.EXPECTATION_FAILED:
+      {
+        return "Expectation Failed";
+      }
+      case io.HttpStatus.INTERNAL_SERVER_ERROR:
+      {
+        return "Internal Server Error";
+      }
+      case io.HttpStatus.NOT_IMPLEMENTED:
+      {
+        return "Not Implemented";
+      }
+      case io.HttpStatus.BAD_GATEWAY:
+      {
+        return "Bad Gateway";
+      }
+      case io.HttpStatus.SERVICE_UNAVAILABLE:
+      {
+        return "Service Unavailable";
+      }
+      case io.HttpStatus.GATEWAY_TIMEOUT:
+      {
+        return "Gateway Time-out";
+      }
+      case io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
+      {
+        return "Http Version not supported";
+      }
+      default:
+      {
+        return dart.str`Status ${statusCode}`;
+      }
+    }
+  }
+};
+dart.addSimpleTypeTests(io._HttpResponse);
+io._HttpResponse[dart.implements] = () => [io.HttpResponse];
+dart.setSignature(io._HttpResponse, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpResponse, [core.Uri, core.String, io._HttpOutgoing, io.HttpHeaders, core.String])}),
+  fields: () => ({
+    [_statusCode]: core.int,
+    [_reasonPhrase]: core.String,
+    [_cookies]: ListOfCookie(),
+    [_httpRequest]: io._HttpRequest,
+    [_deadline]: core.Duration,
+    [_deadlineTimer]: async.Timer
+  }),
+  getters: () => ({
+    cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
+    statusCode: dart.definiteFunctionType(core.int, []),
+    reasonPhrase: dart.definiteFunctionType(core.String, []),
+    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
+    deadline: dart.definiteFunctionType(core.Duration, [])
+  }),
+  setters: () => ({
+    statusCode: dart.definiteFunctionType(dart.void, [core.int]),
+    reasonPhrase: dart.definiteFunctionType(dart.void, [core.String]),
+    deadline: dart.definiteFunctionType(dart.void, [core.Duration])
+  }),
+  methods: () => ({
+    redirect: dart.definiteFunctionType(async.Future, [core.Uri], {status: core.int}),
+    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
+    [_writeHeader]: dart.definiteFunctionType(dart.void, []),
+    [_findReasonPhrase]: dart.definiteFunctionType(core.String, [core.int])
+  })
+});
+const _responseCompleter = Symbol('_responseCompleter');
+const _response = Symbol('_response');
+const _followRedirects = Symbol('_followRedirects');
+const _maxRedirects = Symbol('_maxRedirects');
+const _onIncoming = Symbol('_onIncoming');
+const _onError$ = Symbol('_onError');
+const _proxyTunnel = Symbol('_proxyTunnel');
+const _requestUri = Symbol('_requestUri');
+io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
+  new(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
+    this.cookies = ListOfCookie().new();
+    this[_responseCompleter] = CompleterOfHttpClientResponse().new();
+    this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
+    this.method = method;
+    this[_proxy] = proxy;
+    this[_httpClient] = httpClient;
+    this[_httpClientConnection] = httpClientConnection;
+    this.uri = uri;
+    this[_response] = null;
+    this[_followRedirects] = true;
+    this[_maxRedirects] = 5;
+    super.new(uri, "1.1", outgoing);
+    if (this.method == "GET" || this.method == "HEAD") {
+      this.contentLength = 0;
+    } else {
+      this.headers.chunkedTransferEncoding = true;
+    }
+  }
+  get done() {
+    if (this[_response] == null) {
+      this[_response] = async.Future.wait(dart.dynamic)(JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(io.HttpClientResponse)(dart.fn(list => FutureOrOfHttpClientResponse()._check(list[dartx._get](0)), ListToFutureOrOfHttpClientResponse()));
+    }
+    return this[_response];
+  }
+  close() {
+    super.close();
+    return this.done;
+  }
+  get maxRedirects() {
+    return this[_maxRedirects];
+  }
+  set maxRedirects(maxRedirects) {
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
+    this[_maxRedirects] = maxRedirects;
+  }
+  get followRedirects() {
+    return this[_followRedirects];
+  }
+  set followRedirects(followRedirects) {
+    if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
+    this[_followRedirects] = followRedirects;
+  }
+  get connectionInfo() {
+    return this[_httpClientConnection].connectionInfo;
+  }
+  [_onIncoming](incoming) {
+    let response = new io._HttpClientResponse(incoming, this, this[_httpClient]);
+    let future = null;
+    if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
+      if (dart.notNull(response.redirects[dartx.length]) < dart.notNull(this.maxRedirects)) {
+        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse()));
+      } else {
+        future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => FutureOfHttpClientResponse().error(new io.RedirectException("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse()));
+      }
+    } else if (dart.test(response[_shouldAuthenticateProxy])) {
+      future = response[_authenticate](true);
+    } else if (dart.test(response[_shouldAuthenticate])) {
+      future = response[_authenticate](false);
+    } else {
+      future = FutureOfHttpClientResponse().value(response);
+    }
+    future.then(dart.void)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
+  }
+  [_onError$](error, stackTrace) {
+    this[_responseCompleter].completeError(error, stackTrace);
+  }
+  [_requestUri]() {
+    const uriStartingFromPath = (function() {
+      let result = this.uri.path;
+      if (dart.test(result[dartx.isEmpty])) result = "/";
+      if (dart.test(this.uri.hasQuery)) {
+        result = dart.str`${result}?${this.uri.query}`;
+      }
+      return result;
+    }).bind(this);
+    dart.fn(uriStartingFromPath, VoidToString$());
+    if (dart.test(this[_proxy].isDirect)) {
+      return uriStartingFromPath();
+    } else {
+      if (this.method == "CONNECT") {
+        return dart.str`${this.uri.host}:${this.uri.port}`;
+      } else {
+        if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
+          return uriStartingFromPath();
+        } else {
+          return dart.toString(this.uri.removeFragment());
+        }
+      }
+    }
+  }
+  [_writeHeader]() {
+    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+    let offset = 0;
+    function write(bytes) {
+      let len = bytes[dartx.length];
+      for (let i = 0; i < dart.notNull(len); i++) {
+        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
+      }
+      offset = dart.notNull(offset) + dart.notNull(len);
+    }
+    dart.fn(write, ListOfintTovoid$());
+    write(this.method[dartx.codeUnits]);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.SP);
+    write(this[_requestUri]()[dartx.codeUnits]);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.SP);
+    write(io._Const.HTTP11);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.CR);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.LF);
+    if (!dart.test(this.cookies[dartx.isEmpty])) {
+      let sb = new core.StringBuffer();
+      for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
+        if (i > 0) sb.write("; ");
+        sb.write(this.cookies[dartx._get](i).name);
+        sb.write("=");
+        sb.write(this.cookies[dartx._get](i).value);
+      }
+      this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
+    }
+    this.headers[_finalize]();
+    offset = this.headers[_write](buffer, offset);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.CR);
+    buffer[dartx._set]((() => {
+      let x = offset;
+      offset = dart.notNull(x) + 1;
+      return x;
+    })(), io._CharCode.LF);
+    this[_outgoing].setHeader(buffer, offset);
+  }
+};
+dart.addSimpleTypeTests(io._HttpClientRequest);
+io._HttpClientRequest[dart.implements] = () => [io.HttpClientRequest];
+dart.setSignature(io._HttpClientRequest, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientRequest, [io._HttpOutgoing, core.Uri, core.String, io._Proxy, io._HttpClient, io._HttpClientConnection])}),
+  fields: () => ({
+    method: core.String,
+    uri: core.Uri,
+    cookies: ListOfCookie(),
+    [_httpClient]: io._HttpClient,
+    [_httpClientConnection]: io._HttpClientConnection,
+    [_responseCompleter]: CompleterOfHttpClientResponse(),
+    [_proxy]: io._Proxy,
+    [_response]: FutureOfHttpClientResponse(),
+    [_followRedirects]: core.bool,
+    [_maxRedirects]: core.int,
+    [_responseRedirects]: ListOfRedirectInfo()
+  }),
+  getters: () => ({
+    done: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
+    maxRedirects: dart.definiteFunctionType(core.int, []),
+    followRedirects: dart.definiteFunctionType(core.bool, []),
+    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])
+  }),
+  setters: () => ({
+    maxRedirects: dart.definiteFunctionType(dart.void, [core.int]),
+    followRedirects: dart.definiteFunctionType(dart.void, [core.bool])
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
+    [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
+    [_onError$]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
+    [_requestUri]: dart.definiteFunctionType(core.String, []),
+    [_writeHeader]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _consume = Symbol('_consume');
+io._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
+  new(consume) {
+    this[_consume] = consume;
+    super.new();
+  }
+  add(chunk) {
+    dart.dcall(this[_consume], chunk);
+  }
+  addSlice(chunk, start, end, isLast) {
+    if (typed_data.Uint8List.is(chunk)) {
+      dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+    } else {
+      dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
+    }
+  }
+  close() {}
+};
+dart.setSignature(io._HttpGZipSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpGZipSink, [core.Function])}),
+  fields: () => ({[_consume]: core.Function}),
+  methods: () => ({
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
+    close: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _closeFuture = Symbol('_closeFuture');
+const _pendingChunkedFooter = Symbol('_pendingChunkedFooter');
+const _bytesWritten = Symbol('_bytesWritten');
+const _gzip = Symbol('_gzip');
+const _gzipSink = Symbol('_gzipSink');
+const _gzipAdd = Symbol('_gzipAdd');
+const _gzipBuffer = Symbol('_gzipBuffer');
+const _gzipBufferLength = Symbol('_gzipBufferLength');
+const _socketError = Symbol('_socketError');
+const _addGZipChunk = Symbol('_addGZipChunk');
+const _addChunk$ = Symbol('_addChunk');
+const _chunkHeader = Symbol('_chunkHeader');
+const _ignoreError = Symbol('_ignoreError');
+let const$68;
+io._HttpOutgoing = class _HttpOutgoing extends core.Object {
+  new(socket) {
+    this[_doneCompleter] = async.Completer.new();
+    this.socket = socket;
+    this.ignoreBody = false;
+    this.headersWritten = false;
+    this[_buffer$] = null;
+    this[_length$2] = 0;
+    this[_closeFuture] = null;
+    this.chunked = false;
+    this[_pendingChunkedFooter] = 0;
+    this.contentLength = null;
+    this[_bytesWritten] = 0;
+    this[_gzip] = false;
+    this[_gzipSink] = null;
+    this[_gzipAdd] = null;
+    this[_gzipBuffer] = null;
+    this[_gzipBufferLength] = 0;
+    this[_socketError] = false;
+    this.outbound = null;
+  }
+  writeHeaders(opts) {
+    let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
+    let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
+    const write = (function() {
+      try {
+        this.outbound[_writeHeader]();
+      } catch (_) {
+        return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
+      }
+
+      return null;
+    }).bind(this);
+    dart.fn(write, VoidToFuture());
+    if (dart.test(this.headersWritten)) return null;
+    this.headersWritten = true;
+    let drainFuture = null;
+    let gzip = false;
+    if (io._HttpResponse.is(this.outbound)) {
+      let response = io._HttpResponse._check(this.outbound);
+      if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+        let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
+        let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
+        if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool$()))) && contentEncoding == null) {
+          this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
+          gzip = true;
+        }
+      }
+      if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
+        drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
+        }, dynamicToNull$()));
+      }
+    } else {
+      drainRequest = false;
+    }
+    if (dart.test(this.ignoreBody)) {
+      return write();
+    }
+    if (dart.test(setOutgoing)) {
+      let contentLength = this.outbound.headers.contentLength;
+      if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+        this.chunked = true;
+        if (gzip) this.gzip = true;
+      } else if (dart.notNull(contentLength) >= 0) {
+        this.contentLength = contentLength;
+      }
+    }
+    if (drainFuture != null) {
+      return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
+    }
+    return write();
+  }
+  addStream(stream) {
+    if (dart.test(this[_socketError])) {
+      stream.listen(null).cancel();
+      return async.Future.value(this.outbound);
+    }
+    if (dart.test(this.ignoreBody)) {
+      stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
+      }, dynamicToNull$()));
+      let future = this.writeHeaders();
+      if (future != null) {
+        return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
+      }
+      return this.close();
+    }
+    let sub = null;
+    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
+    const onData = (function(data) {
+      if (dart.test(this[_socketError])) return;
+      if (dart.equals(dart.dload(data, 'length'), 0)) return;
+      if (dart.test(this.chunked)) {
+        if (dart.test(this[_gzip])) {
+          this[_gzipAdd] = dart.bind(controller, 'add');
+          this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
+          this[_gzipAdd] = null;
+          return;
+        }
+        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+        this[_pendingChunkedFooter] = 2;
+      } else {
+        if (this.contentLength != null) {
+          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
+          if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
+            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
+            return;
           }
         }
       }
-    }
-    toString() {
-      return this[_separatorIndices][dartx._get](0) == core.UriData._noScheme ? dart.str`data:${this[_text]}` : this[_text];
-    }
-  };
-  dart.defineNamedConstructor(core.UriData, '_');
-  dart.setSignature(core.UriData, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(core.UriData, [core.String, ListOfint(), core.Uri]),
-      fromString: dart.definiteFunctionType(core.UriData, [core.String], {mimeType: core.String, encoding: convert.Encoding, parameters: MapOfString$String(), base64: core.bool}),
-      fromBytes: dart.definiteFunctionType(core.UriData, [ListOfint()], {mimeType: dart.dynamic, parameters: MapOfString$String(), percentEncoded: dart.dynamic}),
-      fromUri: dart.definiteFunctionType(core.UriData, [core.Uri])
-    }),
-    fields: () => ({
-      [_text]: core.String,
-      [_separatorIndices]: ListOfint(),
-      [_uriCache]: core.Uri
-    }),
-    getters: () => ({
-      uri: dart.definiteFunctionType(core.Uri, []),
-      mimeType: dart.definiteFunctionType(core.String, []),
-      charset: dart.definiteFunctionType(core.String, []),
-      isBase64: dart.definiteFunctionType(core.bool, []),
-      contentText: dart.definiteFunctionType(core.String, []),
-      parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
-    }),
-    methods: () => ({
-      contentAsBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      contentAsString: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding})
-    }),
-    sfields: () => ({
-      _noScheme: core.int,
-      _tokenCharTable: ListOfint(),
-      _uricTable: ListOfint()
-    }),
-    statics: () => ({
-      _writeUri: dart.definiteFunctionType(dart.void, [core.String, core.String, MapOfString$String(), core.StringBuffer, core.List]),
-      _validateMimeType: dart.definiteFunctionType(core.int, [core.String]),
-      parse: dart.definiteFunctionType(core.UriData, [core.String]),
-      _parse: dart.definiteFunctionType(core.UriData, [core.String, core.int, core.Uri]),
-      _uriEncodeBytes: dart.definiteFunctionType(dart.void, [ListOfint(), ListOfint(), core.StringSink])
-    }),
-    names: ['_writeUri', '_validateMimeType', 'parse', '_parse', '_uriEncodeBytes']
-  });
-  core.UriData._noScheme = -1;
-  core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
-  core.UriData._uricTable = core.Uri._queryCharTable;
-  developer.debugger = function(opts) {
-    let when = opts && 'when' in opts ? opts.when : true;
-    let message = opts && 'message' in opts ? opts.message : null;
-    if (dart.test(when)) {
-      debugger;
-    }
-    return when;
-  };
-  dart.fn(developer.debugger, __Tobool());
-  developer.inspect = function(object) {
-    return object;
-  };
-  dart.fn(developer.inspect, ObjectToObject());
-  developer.log = function(message, opts) {
-    let time = opts && 'time' in opts ? opts.time : null;
-    let sequenceNumber = opts && 'sequenceNumber' in opts ? opts.sequenceNumber : null;
-    let level = opts && 'level' in opts ? opts.level : 0;
-    let name = opts && 'name' in opts ? opts.name : '';
-    let zone = opts && 'zone' in opts ? opts.zone : null;
-    let error = opts && 'error' in opts ? opts.error : null;
-    let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
-  };
-  dart.fn(developer.log, String__Tovoid$());
-  dart.defineLazy(developer, {
-    get _extensions() {
-      return MapOfString$ServiceExtensionHandler().new();
-    }
-  });
-  developer._clockValue = 0;
-  const _result = Symbol('_result');
-  const _errorCode = Symbol('_errorCode');
-  const _errorDetail = Symbol('_errorDetail');
-  const _isError = Symbol('_isError');
-  const _toString = Symbol('_toString');
-  developer.ServiceExtensionResponse = class ServiceExtensionResponse extends core.Object {
-    result(result) {
-      this[_result] = result;
-      this[_errorCode] = null;
-      this[_errorDetail] = null;
-      if (!(typeof this[_result] == 'string')) {
-        dart.throw(new core.ArgumentError.value(this[_result], "result", "Must be a String"));
+      this[_addChunk$](data, dart.bind(controller, 'add'));
+    }).bind(this);
+    dart.fn(onData, dynamicTovoid$());
+    sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
+    if (!dart.test(this.headersWritten)) {
+      let future = this.writeHeaders();
+      if (future != null) {
+        dart.dsend(sub, 'pause', future);
       }
     }
-    error(errorCode, errorDetail) {
-      this[_result] = null;
-      this[_errorCode] = errorCode;
-      this[_errorDetail] = errorDetail;
-      developer.ServiceExtensionResponse._validateErrorCode(this[_errorCode]);
-      if (!(typeof this[_errorDetail] == 'string')) {
-        dart.throw(new core.ArgumentError.value(this[_errorDetail], "errorDetail", "Must be a String"));
+    return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+        if (dart.test(this[_gzip])) this[_gzipSink].close();
+        this[_socketError] = true;
+        this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
+        if (dart.test(this[_ignoreError](error))) {
+          return this.outbound;
+        } else {
+          dart.throw(error);
+        }
+      }, dynamicAnddynamicTo_HttpOutboundMessage())});
+  }
+  close() {
+    if (this[_closeFuture] != null) return this[_closeFuture];
+    if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
+    if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
+    if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
+      if (this.outbound.headers.contentLength == -1) {
+        this.outbound.headers.chunkedTransferEncoding = false;
+        this.outbound.headers.contentLength = 0;
+      } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
+        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
+        this[_doneCompleter].completeError(error);
+        return this[_closeFuture] = async.Future.error(error);
       }
     }
-    static _errorCodeMessage(errorCode) {
-      developer.ServiceExtensionResponse._validateErrorCode(errorCode);
-      if (errorCode == developer.ServiceExtensionResponse.kInvalidParams) {
-        return "Invalid params";
+    if (this.contentLength != null) {
+      if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
+        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
+        this[_doneCompleter].completeError(error);
+        return this[_closeFuture] = async.Future.error(error);
       }
-      return "Server error";
     }
-    static _validateErrorCode(errorCode) {
-      if (!(typeof errorCode == 'number')) {
-        dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Must be an int"));
+    const finalize = (function() {
+      if (dart.test(this.chunked)) {
+        if (dart.test(this[_gzip])) {
+          this[_gzipAdd] = dart.bind(this.socket, 'add');
+          if (dart.notNull(this[_gzipBufferLength]) > 0) {
+            this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
+          }
+          this[_gzipBuffer] = null;
+          this[_gzipSink].close();
+          this[_gzipAdd] = null;
+        }
+        this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
       }
-      if (errorCode == developer.ServiceExtensionResponse.invalidParams) {
-        return;
+      if (dart.notNull(this[_length$2]) > 0) {
+        this.socket.add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
       }
-      if (dart.notNull(errorCode) >= developer.ServiceExtensionResponse.extensionErrorMin && dart.notNull(errorCode) <= developer.ServiceExtensionResponse.extensionErrorMax) {
-        return;
-      }
-      dart.throw(new core.ArgumentError.value(errorCode, "errorCode", "Out of range"));
+      this[_buffer$] = null;
+      return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
+        this[_doneCompleter].complete(this.socket);
+        return this.outbound;
+      }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+          this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
+          if (dart.test(this[_ignoreError](error))) {
+            return this.outbound;
+          } else {
+            dart.throw(error);
+          }
+        }, dynamicAnddynamicTo_HttpOutboundMessage())});
+    }).bind(this);
+    dart.fn(finalize, VoidToFuture());
+    let future = this.writeHeaders();
+    if (future != null) {
+      return this[_closeFuture] = future.whenComplete(finalize);
     }
-    [_isError]() {
-      return this[_errorCode] != null && this[_errorDetail] != null;
+    return this[_closeFuture] = finalize();
+  }
+  get done() {
+    return this[_doneCompleter].future;
+  }
+  setHeader(data, length) {
+    dart.assert(this[_length$2] == 0);
+    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
+    this[_buffer$] = typed_data.Uint8List._check(data);
+    this[_length$2] = length;
+  }
+  set gzip(value) {
+    this[_gzip] = value;
+    if (dart.test(this[_gzip])) {
+      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+      dart.assert(this[_gzipSink] == null);
+      this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
+        if (this[_gzipAdd] == null) return;
+        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
+        this[_pendingChunkedFooter] = 2;
+        this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
+      }, dynamicToNull$())));
     }
-    [_toString]() {
-      if (this[_result] != null) {
-        return this[_result];
+  }
+  [_ignoreError](error) {
+    return (io.SocketException.is(error) || io.TlsException.is(error)) && io.HttpResponse.is(this.outbound);
+  }
+  [_addGZipChunk](chunk, add) {
+    if (!dart.test(this.outbound.bufferOutput)) {
+      add(ListOfint()._check(chunk));
+      return;
+    }
+    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
+      add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
+      this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+      this[_gzipBufferLength] = 0;
+    }
+    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
+      add(ListOfint()._check(chunk));
+    } else {
+      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
+      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+    }
+  }
+  [_addChunk$](chunk, add) {
+    if (!dart.test(this.outbound.bufferOutput)) {
+      if (this[_buffer$] != null) {
+        add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
+        this[_buffer$] = null;
+        this[_length$2] = 0;
+      }
+      add(ListOfint()._check(chunk));
+      return;
+    }
+    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+      add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
+      this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+      this[_length$2] = 0;
+    }
+    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
+      add(ListOfint()._check(chunk));
+    } else {
+      this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+    }
+  }
+  [_chunkHeader](length) {
+    let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+    if (length == 0) {
+      if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
+      return io._HttpOutgoing._chunk0Length;
+    }
+    let size = this[_pendingChunkedFooter];
+    let len = length;
+    while (dart.notNull(len) > 0) {
+      size = dart.notNull(size) + 1;
+      len = len[dartx['>>']](4);
+    }
+    let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
+    if (this[_pendingChunkedFooter] == 2) {
+      footerAndHeader[dartx._set](0, io._CharCode.CR);
+      footerAndHeader[dartx._set](1, io._CharCode.LF);
+    }
+    let index = size;
+    while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
+      footerAndHeader[dartx._set]((index = dart.notNull(index) - 1), hexDigits[dartx._get](dart.notNull(length) & 15));
+      length = length[dartx['>>']](4);
+    }
+    footerAndHeader[dartx._set](dart.notNull(size) + 0, io._CharCode.CR);
+    footerAndHeader[dartx._set](dart.notNull(size) + 1, io._CharCode.LF);
+    return footerAndHeader;
+  }
+};
+io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
+dart.setSignature(io._HttpOutgoing, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpOutgoing, [io.Socket])}),
+  fields: () => ({
+    [_doneCompleter]: async.Completer,
+    socket: io.Socket,
+    ignoreBody: core.bool,
+    headersWritten: core.bool,
+    [_buffer$]: typed_data.Uint8List,
+    [_length$2]: core.int,
+    [_closeFuture]: async.Future,
+    chunked: core.bool,
+    [_pendingChunkedFooter]: core.int,
+    contentLength: core.int,
+    [_bytesWritten]: core.int,
+    [_gzip]: core.bool,
+    [_gzipSink]: convert.ByteConversionSink,
+    [_gzipAdd]: core.Function,
+    [_gzipBuffer]: typed_data.Uint8List,
+    [_gzipBufferLength]: core.int,
+    [_socketError]: core.bool,
+    outbound: io._HttpOutboundMessage
+  }),
+  getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+  setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
+  methods: () => ({
+    writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
+    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
+    close: dart.definiteFunctionType(async.Future, []),
+    setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
+    [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
+    [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
+    [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
+  }),
+  sfields: () => ({
+    _footerAndChunk0Length: ListOfint(),
+    _chunk0Length: ListOfint()
+  })
+});
+dart.defineLazy(io._HttpOutgoing, {
+  get _footerAndChunk0Length() {
+    return dart.constList([io._CharCode.CR, io._CharCode.LF, 48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
+  },
+  get _chunk0Length() {
+    return dart.constList([48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
+  }
+});
+const _context = Symbol('_context');
+const _httpParser = Symbol('_httpParser');
+const _subscription$ = Symbol('_subscription');
+const _dispose = Symbol('_dispose');
+const _idleTimer = Symbol('_idleTimer');
+const _currentUri = Symbol('_currentUri');
+const _nextResponseCompleter = Symbol('_nextResponseCompleter');
+const _streamFuture = Symbol('_streamFuture');
+const _proxyCredentials = Symbol('_proxyCredentials');
+const _returnConnection = Symbol('_returnConnection');
+io._HttpClientConnection = class _HttpClientConnection extends core.Object {
+  new(key, socket, httpClient, proxyTunnel, context) {
+    if (proxyTunnel === void 0) proxyTunnel = false;
+    if (context === void 0) context = null;
+    this.key = key;
+    this[_socket] = socket;
+    this[_httpClient] = httpClient;
+    this[_proxyTunnel] = proxyTunnel;
+    this[_context] = context;
+    this[_httpParser] = io._HttpParser.responseParser();
+    this[_subscription$] = null;
+    this[_dispose] = false;
+    this[_idleTimer] = null;
+    this.closed = false;
+    this[_currentUri] = null;
+    this[_nextResponseCompleter] = null;
+    this[_streamFuture] = null;
+    this[_httpParser].listenToStream(this[_socket]);
+    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
+      this[_subscription$].pause();
+      if (this[_nextResponseCompleter] == null) {
+        dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
+      }
+      if (incoming.statusCode == 100) {
+        incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
+          this[_subscription$].resume();
+        }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
+          if (stackTrace === void 0) stackTrace = null;
+          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
+          this[_nextResponseCompleter] = null;
+        }, dynamic__ToNull$()));
       } else {
-        dart.assert(this[_errorCode] != null);
-        dart.assert(this[_errorDetail] != null);
-        return convert.JSON.encode(dart.map({code: this[_errorCode], message: developer.ServiceExtensionResponse._errorCodeMessage(this[_errorCode]), data: dart.map({details: this[_errorDetail]}, core.String, core.String)}, core.String, core.Object));
+        this[_nextResponseCompleter].complete(incoming);
+        this[_nextResponseCompleter] = null;
+      }
+    }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
+        if (stackTrace === void 0) stackTrace = null;
+        if (this[_nextResponseCompleter] != null) {
+          this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
+          this[_nextResponseCompleter] = null;
+        }
+      }, dynamic__ToNull$()), onDone: dart.fn(() => {
+        if (this[_nextResponseCompleter] != null) {
+          this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
+          this[_nextResponseCompleter] = null;
+        }
+        this.close();
+      }, VoidToNull())});
+  }
+  send(uri, port, method, proxy) {
+    if (dart.test(this.closed)) {
+      dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
+    }
+    this[_currentUri] = uri;
+    this[_subscription$].pause();
+    let proxyCreds = null;
+    let creds = null;
+    let outgoing = new io._HttpOutgoing(this[_socket]);
+    let request = new io._HttpClientRequest(outgoing, uri, method, proxy, this[_httpClient], this);
+    let host = uri.host;
+    if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
+    request.headers.host = host;
+    request.headers.port = port;
+    request.headers[_add$2](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
+    if (this[_httpClient].userAgent != null) {
+      request.headers[_add$2]('user-agent', this[_httpClient].userAgent);
+    }
+    if (dart.test(proxy.isAuthenticated)) {
+      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
+      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
+    } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][dartx.length]) > 0) {
+      proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
+      if (proxyCreds != null) {
+        proxyCreds.authorize(request);
       }
     }
-  };
-  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'result');
-  dart.defineNamedConstructor(developer.ServiceExtensionResponse, 'error');
-  dart.setSignature(developer.ServiceExtensionResponse, {
-    constructors: () => ({
-      result: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.String]),
-      error: dart.definiteFunctionType(developer.ServiceExtensionResponse, [core.int, core.String])
-    }),
-    fields: () => ({
-      [_result]: core.String,
-      [_errorCode]: core.int,
-      [_errorDetail]: core.String
-    }),
-    methods: () => ({
-      [_isError]: dart.definiteFunctionType(core.bool, []),
-      [_toString]: dart.definiteFunctionType(core.String, [])
-    }),
-    sfields: () => ({
-      kInvalidParams: core.int,
-      kExtensionError: core.int,
-      kExtensionErrorMax: core.int,
-      kExtensionErrorMin: core.int,
-      invalidParams: core.int,
-      extensionError: core.int,
-      extensionErrorMax: core.int,
-      extensionErrorMin: core.int
-    }),
-    statics: () => ({
-      _errorCodeMessage: dart.definiteFunctionType(core.String, [core.int]),
-      _validateErrorCode: dart.definiteFunctionType(dart.dynamic, [core.int])
-    }),
-    names: ['_errorCodeMessage', '_validateErrorCode']
-  });
-  developer.ServiceExtensionResponse.invalidParams = -32602;
-  developer.ServiceExtensionResponse.extensionError = -32000;
-  developer.ServiceExtensionResponse.extensionErrorMax = -32000;
-  developer.ServiceExtensionResponse.extensionErrorMin = -32016;
-  dart.defineLazy(developer.ServiceExtensionResponse, {
-    get kInvalidParams() {
-      return developer.ServiceExtensionResponse.invalidParams;
-    },
-    get kExtensionError() {
-      return developer.ServiceExtensionResponse.extensionError;
-    },
-    get kExtensionErrorMax() {
-      return developer.ServiceExtensionResponse.extensionErrorMax;
-    },
-    get kExtensionErrorMin() {
-      return developer.ServiceExtensionResponse.extensionErrorMin;
-    }
-  });
-  developer.ServiceExtensionHandler = dart.typedef('ServiceExtensionHandler', () => dart.functionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]));
-  developer.registerExtension = function(method, handler) {
-    if (!(typeof method == 'string')) {
-      dart.throw(new core.ArgumentError.value(method, 'method', 'Must be a String'));
-    }
-    if (!dart.test(method[dartx.startsWith]('ext.'))) {
-      dart.throw(new core.ArgumentError.value(method, 'method', 'Must begin with ext.'));
-    }
-    if (developer._lookupExtension(method) != null) {
-      dart.throw(new core.ArgumentError(dart.str`Extension already registered: ${method}`));
-    }
-    if (!developer.ServiceExtensionHandler.is(handler)) {
-      dart.throw(new core.ArgumentError.value(handler, 'handler', 'Must be a ServiceExtensionHandler'));
-    }
-    developer._registerExtension(method, handler);
-  };
-  dart.fn(developer.registerExtension, StringAndServiceExtensionHandlerTovoid());
-  developer.postEvent = function(eventKind, eventData) {
-    if (!(typeof eventKind == 'string')) {
-      dart.throw(new core.ArgumentError.value(eventKind, 'eventKind', 'Must be a String'));
-    }
-    if (!core.Map.is(eventData)) {
-      dart.throw(new core.ArgumentError.value(eventData, 'eventData', 'Must be a Map'));
-    }
-    let eventDataAsString = convert.JSON.encode(eventData);
-    developer._postEvent(eventKind, eventDataAsString);
-  };
-  dart.fn(developer.postEvent, StringAndMapTovoid());
-  developer._postEvent = function(eventKind, eventData) {
-  };
-  dart.fn(developer._postEvent, StringAndStringTodynamic());
-  developer._lookupExtension = function(method) {
-    return developer._extensions[dartx._get](method);
-  };
-  dart.fn(developer._lookupExtension, StringToServiceExtensionHandler());
-  developer._registerExtension = function(method, handler) {
-    developer._extensions[dartx._set](method, handler);
-  };
-  dart.fn(developer._registerExtension, StringAndServiceExtensionHandlerTodynamic());
-  developer.UserTag = class UserTag extends core.Object {
-    static new(label) {
-      return developer._FakeUserTag.new(label);
-    }
-    static get defaultTag() {
-      return developer._FakeUserTag._defaultTag;
-    }
-  };
-  dart.setSignature(developer.UserTag, {
-    constructors: () => ({new: dart.definiteFunctionType(developer.UserTag, [core.String])}),
-    sfields: () => ({MAX_USER_TAGS: core.int}),
-    sgetters: () => ({defaultTag: dart.definiteFunctionType(developer.UserTag, [])})
-  });
-  developer.UserTag.MAX_USER_TAGS = 64;
-  developer._FakeUserTag = class _FakeUserTag extends core.Object {
-    real(label) {
-      this.label = label;
-    }
-    static new(label) {
-      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
-      if (existingTag != null) {
-        return developer._FakeUserTag._check(existingTag);
-      }
-      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
-        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
-      }
-      let instance = new developer._FakeUserTag.real(label);
-      developer._FakeUserTag._instances[dartx._set](label, instance);
-      return instance;
-    }
-    makeCurrent() {
-      let old = developer._currentTag;
-      developer._currentTag = this;
-      return old;
-    }
-  };
-  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
-  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
-  dart.setSignature(developer._FakeUserTag, {
-    constructors: () => ({
-      real: dart.definiteFunctionType(developer._FakeUserTag, [core.String]),
-      new: dart.definiteFunctionType(developer._FakeUserTag, [core.String])
-    }),
-    fields: () => ({label: core.String}),
-    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])}),
-    sfields: () => ({
-      _instances: core.Map,
-      _defaultTag: developer.UserTag
-    })
-  });
-  dart.defineLazy(developer._FakeUserTag, {
-    get _instances() {
-      return dart.map();
-    },
-    set _instances(_) {},
-    get _defaultTag() {
-      return developer._FakeUserTag.new('Default');
-    }
-  });
-  dart.defineLazy(developer, {
-    get _currentTag() {
-      return developer._FakeUserTag._defaultTag;
-    },
-    set _currentTag(_) {}
-  });
-  developer.getCurrentTag = function() {
-    return developer._currentTag;
-  };
-  dart.fn(developer.getCurrentTag, VoidToUserTag());
-  developer.Metric = class Metric extends core.Object {
-    new(name, description) {
-      this.name = name;
-      this.description = description;
-      if (this.name == 'vm' || dart.test(this.name[dartx.contains]('/'))) {
-        dart.throw(new core.ArgumentError('Invalid Metric name.'));
+    if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
+      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
+      request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
+    } else {
+      creds = this[_httpClient][_findCredentials](uri);
+      if (creds != null) {
+        creds.authorize(request);
       }
     }
-  };
-  dart.setSignature(developer.Metric, {
-    constructors: () => ({new: dart.definiteFunctionType(developer.Metric, [core.String, core.String])}),
-    fields: () => ({
-      name: core.String,
-      description: core.String
-    })
-  });
-  const _value$0 = Symbol('_value');
-  const _toJSON = Symbol('_toJSON');
-  developer.Gauge = class Gauge extends developer.Metric {
-    get value() {
-      return this[_value$0];
+    this[_httpParser].isHead = method == "HEAD";
+    this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
+      this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
+      this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
+        this[_currentUri] = null;
+        incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
+          if (dart.test(incoming.upgraded)) {
+            this[_httpClient][_connectionClosed](this);
+            this.startTimer();
+            return;
+          }
+          if (dart.test(this.closed)) return;
+          if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
+            this[_httpClient][_returnConnection](this);
+            this[_subscription$].resume();
+          } else {
+            this.destroy();
+          }
+        }, dynamicToNull$()));
+        if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
+          let authInfo = incoming.headers._get("proxy-authentication-info");
+          if (authInfo != null && authInfo[dartx.length] == 1) {
+            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
+            let nextnonce = header.parameters[dartx._get]("nextnonce");
+            if (nextnonce != null) proxyCreds.nonce = nextnonce;
+          }
+        }
+        if (creds != null && dart.equals(creds.scheme, io._AuthenticationScheme.DIGEST)) {
+          let authInfo = incoming.headers._get("authentication-info");
+          if (authInfo != null && authInfo[dartx.length] == 1) {
+            let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
+            let nextnonce = header.parameters[dartx._get]("nextnonce");
+            if (nextnonce != null) creds.nonce = nextnonce;
+          }
+        }
+        request[_onIncoming](incoming);
+      }, _HttpIncomingToNull())).catchError(dart.fn(error => {
+        dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
+      }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+        this.destroy();
+        request[_onError$](error, core.StackTrace._check(stackTrace));
+      }, dynamicAnddynamicToNull()));
+      this[_subscription$].resume();
+      return s;
+    }, dynamicTodynamic$()), {onError: dart.fn(e => {
+        this.destroy();
+      }, dynamicToNull$())});
+    return request;
+  }
+  detachSocket() {
+    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
+  }
+  destroy() {
+    this.closed = true;
+    this[_httpClient][_connectionClosed](this);
+    this[_socket].destroy();
+  }
+  close() {
+    this.closed = true;
+    this[_httpClient][_connectionClosed](this);
+    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
+  }
+  createProxyTunnel(host, port, proxy, callback) {
+    let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
+    if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
+      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
+      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
     }
-    set value(v) {
-      if (dart.notNull(v) < dart.notNull(this.min)) {
-        v = this.min;
-      } else if (dart.notNull(v) > dart.notNull(this.max)) {
-        v = this.max;
+    return request.close().then(io.SecureSocket)(dart.fn(response => {
+      if (response.statusCode != io.HttpStatus.OK) {
+        dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
       }
-      this[_value$0] = v;
+      let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
+      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
+    }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
+      let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
+      return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
+    }, SecureSocketTo_HttpClientConnection()));
+  }
+  get connectionInfo() {
+    return io._HttpConnectionInfo.create(this[_socket]);
+  }
+  static makeKey(isSecure, host, port) {
+    return dart.test(isSecure) ? dart.str`ssh:${host}:${port}` : dart.str`${host}:${port}`;
+  }
+  stopTimer() {
+    if (this[_idleTimer] != null) {
+      this[_idleTimer].cancel();
+      this[_idleTimer] = null;
     }
-    new(name, description, min, max) {
-      this.min = min;
-      this.max = max;
-      this[_value$0] = null;
-      super.new(name, description);
-      if (!(typeof this.min == 'number')) {
-        dart.throw(new core.ArgumentError('min must be a double'));
-      }
-      if (!(typeof this.max == 'number')) {
-        dart.throw(new core.ArgumentError('max must be a double'));
-      }
-      if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
-        dart.throw(new core.ArgumentError('min must be less than max'));
-      }
-      this[_value$0] = this.min;
+  }
+  startTimer() {
+    dart.assert(this[_idleTimer] == null);
+    this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
+      this[_idleTimer] = null;
+      this.close();
+    }, VoidToNull()));
+  }
+};
+dart.setSignature(io._HttpClientConnection, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientConnection, [core.String, io.Socket, io._HttpClient], [core.bool, io.SecurityContext])}),
+  fields: () => ({
+    key: core.String,
+    [_socket]: io.Socket,
+    [_proxyTunnel]: core.bool,
+    [_context]: io.SecurityContext,
+    [_httpParser]: io._HttpParser,
+    [_subscription$]: async.StreamSubscription,
+    [_httpClient]: io._HttpClient,
+    [_dispose]: core.bool,
+    [_idleTimer]: async.Timer,
+    closed: core.bool,
+    [_currentUri]: core.Uri,
+    [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
+    [_streamFuture]: async.Future
+  }),
+  getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
+  methods: () => ({
+    send: dart.definiteFunctionType(io._HttpClientRequest, [core.Uri, core.int, core.String, io._Proxy]),
+    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
+    destroy: dart.definiteFunctionType(dart.void, []),
+    close: dart.definiteFunctionType(dart.void, []),
+    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    stopTimer: dart.definiteFunctionType(dart.void, []),
+    startTimer: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({makeKey: dart.definiteFunctionType(dart.dynamic, [core.bool, core.String, core.int])}),
+  names: ['makeKey']
+});
+io._ConnectionInfo = class _ConnectionInfo extends core.Object {
+  new(connection, proxy) {
+    this.connection = connection;
+    this.proxy = proxy;
+  }
+};
+dart.setSignature(io._ConnectionInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection, io._Proxy])}),
+  fields: () => ({
+    connection: io._HttpClientConnection,
+    proxy: io._Proxy
+  })
+});
+const _idle = Symbol('_idle');
+const _active = Symbol('_active');
+const _pending$ = Symbol('_pending');
+const _connecting = Symbol('_connecting');
+const _checkPending = Symbol('_checkPending');
+const _connectionsChanged = Symbol('_connectionsChanged');
+const _badCertificateCallback = Symbol('_badCertificateCallback');
+const _getConnectionTarget = Symbol('_getConnectionTarget');
+io._ConnectionTarget = class _ConnectionTarget extends core.Object {
+  new(key, host, port, isSecure, context) {
+    this[_idle] = HashSetOf_HttpClientConnection().new();
+    this[_active] = HashSetOf_HttpClientConnection().new();
+    this[_pending$] = new collection.ListQueue();
+    this.key = key;
+    this.host = host;
+    this.port = port;
+    this.isSecure = isSecure;
+    this.context = context;
+    this[_connecting] = 0;
+  }
+  get isEmpty() {
+    return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] == 0;
+  }
+  get hasIdle() {
+    return this[_idle].isNotEmpty;
+  }
+  get hasActive() {
+    return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
+  }
+  takeIdle() {
+    dart.assert(this.hasIdle);
+    let connection = this[_idle].first;
+    this[_idle].remove(connection);
+    connection.stopTimer();
+    this[_active].add(connection);
+    return connection;
+  }
+  [_checkPending]() {
+    if (dart.test(this[_pending$].isNotEmpty)) {
+      dart.dcall(this[_pending$].removeFirst());
     }
-    [_toJSON]() {
-      let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
-      return map;
+  }
+  addNewActive(connection) {
+    this[_active].add(connection);
+  }
+  returnConnection(connection) {
+    dart.assert(this[_active].contains(connection));
+    this[_active].remove(connection);
+    this[_idle].add(connection);
+    connection.startTimer();
+    this[_checkPending]();
+  }
+  connectionClosed(connection) {
+    dart.assert(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)));
+    this[_active].remove(connection);
+    this[_idle].remove(connection);
+    this[_checkPending]();
+  }
+  close(force) {
+    for (let c of this[_idle].toList()) {
+      c.close();
     }
-  };
-  dart.setSignature(developer.Gauge, {
-    constructors: () => ({new: dart.definiteFunctionType(developer.Gauge, [core.String, core.String, core.double, core.double])}),
-    fields: () => ({
-      min: core.double,
-      max: core.double,
-      [_value$0]: core.double
-    }),
-    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
-    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
-    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
-  });
-  developer.Counter = class Counter extends developer.Metric {
-    new(name, description) {
-      this[_value$0] = 0.0;
-      super.new(name, description);
+    if (dart.test(force)) {
+      for (let c of this[_active].toList()) {
+        c.destroy();
+      }
     }
-    get value() {
-      return this[_value$0];
+  }
+  connect(uriHost, uriPort, proxy, client) {
+    if (dart.test(this.hasIdle)) {
+      let connection = this.takeIdle();
+      client[_connectionsChanged]();
+      return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
     }
-    set value(v) {
-      this[_value$0] = v;
+    if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
+      let completer = async.Completer.new();
+      this[_pending$].add(dart.fn(() => {
+        this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
+      }, VoidToNull()));
+      return FutureOf_ConnectionInfo()._check(completer.future);
     }
-    [_toJSON]() {
-      let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
-      return map;
+    let currentBadCertificateCallback = client[_badCertificateCallback];
+    function callback(certificate) {
+      if (currentBadCertificateCallback == null) return false;
+      return currentBadCertificateCallback(certificate, uriHost, uriPort);
     }
-  };
-  dart.setSignature(developer.Counter, {
-    constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
-    fields: () => ({[_value$0]: core.double}),
-    getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
-    setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
-    methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
-  });
-  developer.Metrics = class Metrics extends core.Object {
-    static register(metric) {
-      if (!developer.Metric.is(metric)) {
-        dart.throw(new core.ArgumentError('metric must be a Metric'));
+    dart.fn(callback, X509CertificateTobool$());
+    let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
+    this[_connecting] = dart.notNull(this[_connecting]) + 1;
+    return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
+      this[_connecting] = dart.notNull(this[_connecting]) - 1;
+      dart.dsend(socket, 'setOption', io.SocketOption.TCP_NODELAY, true);
+      let connection = new io._HttpClientConnection(this.key, io.Socket._check(socket), client, false, this.context);
+      if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
+        connection[_dispose] = true;
+        return connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(io._ConnectionInfo)(dart.fn(tunnel => {
+          client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
+          return new io._ConnectionInfo(tunnel, proxy);
+        }, _HttpClientConnectionTo_ConnectionInfo()));
+      } else {
+        this.addNewActive(connection);
+        return new io._ConnectionInfo(connection, proxy);
       }
-      if (developer.Metrics._metrics[dartx._get](metric.name) != null) {
-        dart.throw(new core.ArgumentError('Registered metrics have unique names'));
+    }, dynamicToFutureOrOf_ConnectionInfo()), {onError: dart.fn(error => {
+        this[_connecting] = dart.notNull(this[_connecting]) - 1;
+        this[_checkPending]();
+        dart.throw(error);
+      }, dynamicToNull$())});
+  }
+};
+dart.setSignature(io._ConnectionTarget, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.String, core.int, core.bool, io.SecurityContext])}),
+  fields: () => ({
+    key: core.String,
+    host: core.String,
+    port: core.int,
+    isSecure: core.bool,
+    context: io.SecurityContext,
+    [_idle]: SetOf_HttpClientConnection(),
+    [_active]: SetOf_HttpClientConnection(),
+    [_pending$]: collection.Queue,
+    [_connecting]: core.int
+  }),
+  getters: () => ({
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    hasIdle: dart.definiteFunctionType(core.bool, []),
+    hasActive: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    takeIdle: dart.definiteFunctionType(io._HttpClientConnection, []),
+    [_checkPending]: dart.definiteFunctionType(dart.dynamic, []),
+    addNewActive: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
+    returnConnection: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
+    connectionClosed: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
+    close: dart.definiteFunctionType(dart.void, [core.bool]),
+    connect: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._Proxy, io._HttpClient])
+  })
+});
+io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
+const _idleTimeout = Symbol('_idleTimeout');
+let const$69;
+const _connectionTargets = Symbol('_connectionTargets');
+const _credentials = Symbol('_credentials');
+const _closing = Symbol('_closing');
+const _closingForcefully = Symbol('_closingForcefully');
+const _findProxy = Symbol('_findProxy');
+const _openUrl = Symbol('_openUrl');
+const _closeConnections = Symbol('_closeConnections');
+let const$70;
+const _getConnection = Symbol('_getConnection');
+io._HttpClient = class _HttpClient extends core.Object {
+  get idleTimeout() {
+    return this[_idleTimeout];
+  }
+  new(context) {
+    this[_connectionTargets] = HashMapOfString$_ConnectionTarget().new();
+    this[_credentials] = JSArrayOf_Credentials().of([]);
+    this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
+    this.userAgent = io._getHttpVersion();
+    this[_context] = context;
+    this[_closing] = false;
+    this[_closingForcefully] = false;
+    this[_authenticate] = null;
+    this[_authenticateProxy] = null;
+    this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
+    this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
+    this[_badCertificateCallback] = null;
+    this.maxConnectionsPerHost = null;
+    this.autoUncompress = true;
+  }
+  set idleTimeout(timeout) {
+    this[_idleTimeout] = timeout;
+    for (let c of this[_connectionTargets][dartx.values]) {
+      for (let idle of c[_idle]) {
+        idle.stopTimer();
+        idle.startTimer();
       }
-      developer.Metrics._metrics[dartx._set](metric.name, metric);
     }
-    static deregister(metric) {
-      if (!developer.Metric.is(metric)) {
-        dart.throw(new core.ArgumentError('metric must be a Metric'));
+  }
+  set badCertificateCallback(callback) {
+    this[_badCertificateCallback] = callback;
+  }
+  open(method, host, port, path) {
+    let hashMark = 35;
+    let questionMark = 63;
+    let fragmentStart = path[dartx.length];
+    let queryStart = path[dartx.length];
+    for (let i = dart.notNull(path[dartx.length]) - 1; i >= 0; i--) {
+      let char = path[dartx.codeUnitAt](i);
+      if (char == hashMark) {
+        fragmentStart = i;
+        queryStart = i;
+      } else if (char == questionMark) {
+        queryStart = i;
       }
-      developer.Metrics._metrics[dartx.remove](metric.name);
     }
-    static _printMetric(id) {
-      let metric = developer.Metrics._metrics[dartx._get](id);
-      if (metric == null) {
-        return null;
-      }
-      return convert.JSON.encode(metric[_toJSON]());
+    let query = null;
+    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
+      query = path[dartx.substring](dart.notNull(queryStart) + 1, fragmentStart);
+      path = path[dartx.substring](0, queryStart);
     }
-    static _printMetrics() {
-      let metrics = [];
-      for (let metric of developer.Metrics._metrics[dartx.values]) {
-        metrics[dartx.add](metric[_toJSON]());
-      }
-      let map = dart.map({type: 'MetricList', metrics: metrics}, core.String, core.Object);
-      return convert.JSON.encode(map);
+    let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
+    return this[_openUrl](method, uri);
+  }
+  openUrl(method, url) {
+    return this[_openUrl](method, url);
+  }
+  get(host, port, path) {
+    return this.open("get", host, port, path);
+  }
+  getUrl(url) {
+    return this[_openUrl]("get", url);
+  }
+  post(host, port, path) {
+    return this.open("post", host, port, path);
+  }
+  postUrl(url) {
+    return this[_openUrl]("post", url);
+  }
+  put(host, port, path) {
+    return this.open("put", host, port, path);
+  }
+  putUrl(url) {
+    return this[_openUrl]("put", url);
+  }
+  delete(host, port, path) {
+    return this.open("delete", host, port, path);
+  }
+  deleteUrl(url) {
+    return this[_openUrl]("delete", url);
+  }
+  head(host, port, path) {
+    return this.open("head", host, port, path);
+  }
+  headUrl(url) {
+    return this[_openUrl]("head", url);
+  }
+  patch(host, port, path) {
+    return this.open("patch", host, port, path);
+  }
+  patchUrl(url) {
+    return this[_openUrl]("patch", url);
+  }
+  close(opts) {
+    let force = opts && 'force' in opts ? opts.force : false;
+    this[_closing] = true;
+    this[_closingForcefully] = force;
+    this[_closeConnections](this[_closingForcefully]);
+    dart.assert(!dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool()))));
+    dart.assert(!dart.test(force) || !dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))));
+  }
+  set authenticate(f) {
+    this[_authenticate] = f;
+  }
+  addCredentials(url, realm, cr) {
+    this[_credentials][dartx.add](new io._SiteCredentials(url, realm, io._HttpClientCredentials._check(cr)));
+  }
+  set authenticateProxy(f) {
+    this[_authenticateProxy] = f;
+  }
+  addProxyCredentials(host, port, realm, cr) {
+    this[_proxyCredentials][dartx.add](new io._ProxyCredentials(host, port, realm, io._HttpClientCredentials._check(cr)));
+  }
+  set findProxy(f) {
+    return this[_findProxy] = f;
+  }
+  [_openUrl](method, uri) {
+    uri = uri.removeFragment();
+    if (method == null) {
+      dart.throw(new core.ArgumentError(method));
     }
-  };
-  dart.setSignature(developer.Metrics, {
-    sfields: () => ({_metrics: MapOfString$Metric()}),
-    statics: () => ({
-      register: dart.definiteFunctionType(dart.void, [developer.Metric]),
-      deregister: dart.definiteFunctionType(dart.void, [developer.Metric]),
-      _printMetric: dart.definiteFunctionType(core.String, [core.String]),
-      _printMetrics: dart.definiteFunctionType(core.String, [])
-    }),
-    names: ['register', 'deregister', '_printMetric', '_printMetrics']
-  });
-  dart.defineLazy(developer.Metrics, {
-    get _metrics() {
-      return MapOfString$Metric().new();
+    if (method != "CONNECT") {
+      if (dart.test(uri.host[dartx.isEmpty])) {
+        dart.throw(new core.ArgumentError(dart.str`No host specified in URI ${uri}`));
+      } else if (uri.scheme != "http" && uri.scheme != "https") {
+        dart.throw(new core.ArgumentError(dart.str`Unsupported scheme '${uri.scheme}' in URI ${uri}`));
+      }
     }
-  });
-  developer._isProduct = false;
-  developer.TimelineSyncFunction = dart.typedef('TimelineSyncFunction', () => dart.functionType(dart.dynamic, []));
-  developer.TimelineAsyncFunction = dart.typedef('TimelineAsyncFunction', () => dart.functionType(async.Future, []));
-  const _appendArguments = Symbol('_appendArguments');
-  developer.Timeline = class Timeline extends core.Object {
-    static startSync(name, opts) {
-      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
-      if (developer._isProduct) {
-        return;
-      }
-      if (!(typeof name == 'string')) {
-        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
-      }
-      if (!dart.test(developer._isDartStreamEnabled())) {
-        developer.Timeline._stack[dartx.add](null);
-        return;
-      }
-      let block = new developer._SyncBlock._(name, developer._getTraceClock(), developer._getThreadCpuClock());
-      if (core.Map.is(arguments$)) {
-        block[_appendArguments](arguments$);
-      }
-      developer.Timeline._stack[dartx.add](block);
+    let isSecure = uri.scheme == "https";
+    let port = uri.port;
+    if (port == 0) {
+      port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
     }
-    static finishSync() {
-      if (developer._isProduct) {
-        return;
-      }
-      if (developer.Timeline._stack[dartx.length] == 0) {
-        dart.throw(new core.StateError('Uneven calls to startSync and finishSync'));
-      }
-      let block = developer.Timeline._stack[dartx.removeLast]();
-      if (block == null) {
-        return;
-      }
-      block.finish();
-    }
-    static instantSync(name, opts) {
-      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
-      if (developer._isProduct) {
-        return;
-      }
-      if (!(typeof name == 'string')) {
-        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
-      }
-      if (!dart.test(developer._isDartStreamEnabled())) {
-        return;
-      }
-      let instantArguments = null;
-      if (core.Map.is(arguments$)) {
-        instantArguments = core.Map.from(arguments$);
-      }
-      developer._reportInstantEvent(developer._getTraceClock(), 'Dart', name, developer._argumentsAsJson(instantArguments));
-    }
-    static timeSync(name, func, opts) {
-      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
-      developer.Timeline.startSync(name, {arguments: arguments$});
+    let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
+    if (this[_findProxy] != null) {
       try {
-        return func();
-      } finally {
-        developer.Timeline.finishSync();
+        proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
+      } catch (error) {
+        let stackTrace = dart.stackTrace(error);
+        return FutureOf_HttpClientRequest().error(error, stackTrace);
+      }
+
+    }
+    return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(dart.fn(info => {
+      function send(info) {
+        return info.connection.send(uri, port, method[dartx.toUpperCase](), info.proxy);
+      }
+      dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
+      if (dart.test(info.connection.closed)) {
+        return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(send);
+      }
+      return send(info);
+    }, _ConnectionInfoToFutureOrOf_HttpClientRequest()));
+  }
+  [_openUrlFromRequest](method, uri, previous) {
+    let resolved = previous.uri.resolveUri(uri);
+    return this[_openUrl](method, resolved).then(io._HttpClientRequest)(dart.fn(request => {
+      request.followRedirects = previous.followRedirects;
+      request.maxRedirects = previous.maxRedirects;
+      for (let header of previous.headers[_headers][dartx.keys]) {
+        if (request.headers._get(header) == null) {
+          request.headers.set(header, previous.headers._get(header));
+        }
+      }
+      request.headers.chunkedTransferEncoding = false;
+      request.contentLength = 0;
+      return request;
+    }, _HttpClientRequestTo_HttpClientRequest()));
+  }
+  [_returnConnection](connection) {
+    this[_connectionTargets][dartx._get](connection.key).returnConnection(connection);
+    this[_connectionsChanged]();
+  }
+  [_connectionClosed](connection) {
+    connection.stopTimer();
+    let connectionTarget = this[_connectionTargets][dartx._get](connection.key);
+    if (connectionTarget != null) {
+      connectionTarget.connectionClosed(connection);
+      if (dart.test(connectionTarget.isEmpty)) {
+        this[_connectionTargets][dartx.remove](connection.key);
+      }
+      this[_connectionsChanged]();
+    }
+  }
+  [_connectionsChanged]() {
+    if (dart.test(this[_closing])) {
+      this[_closeConnections](this[_closingForcefully]);
+    }
+  }
+  [_closeConnections](force) {
+    for (let connectionTarget of this[_connectionTargets][dartx.values][dartx.toList]()) {
+      connectionTarget.close(force);
+    }
+  }
+  [_getConnectionTarget](host, port, isSecure) {
+    let key = core.String._check(io._HttpClientConnection.makeKey(isSecure, host, port));
+    return this[_connectionTargets][dartx.putIfAbsent](key, dart.fn(() => new io._ConnectionTarget(key, host, port, isSecure, this[_context]), VoidTo_ConnectionTarget()));
+  }
+  [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
+    let proxies = proxyConf.proxies[dartx.iterator];
+    const connect = (function(error) {
+      if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
+      let proxy = proxies.current;
+      let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
+      let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
+      return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
+    }).bind(this);
+    dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
+    return FutureOf_ConnectionInfo().new(dart.fn(() => connect(new io.HttpException("No proxies given")), VoidToFutureOf_ConnectionInfo()));
+  }
+  [_findCredentials](url, scheme) {
+    if (scheme === void 0) scheme = null;
+    let cr = this[_credentials][dartx.fold](io._SiteCredentials)(null, dart.fn((prev, value) => {
+      let siteCredentials = io._SiteCredentials.as(value);
+      if (dart.test(siteCredentials.applies(url, scheme))) {
+        if (prev == null) return io._SiteCredentials._check(value);
+        return dart.notNull(siteCredentials.uri.path[dartx.length]) > dart.notNull(prev.uri.path[dartx.length]) ? siteCredentials : prev;
+      } else {
+        return prev;
+      }
+    }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials()));
+    return cr;
+  }
+  [_findProxyCredentials](proxy, scheme) {
+    if (scheme === void 0) scheme = null;
+    let it = this[_proxyCredentials][dartx.iterator];
+    while (dart.test(it.moveNext())) {
+      if (dart.test(it.current.applies(proxy, scheme))) {
+        return it.current;
       }
     }
-    static get now() {
-      return developer._getTraceClock();
+    return null;
+  }
+  [_removeCredentials](cr) {
+    let index = this[_credentials][dartx.indexOf](cr);
+    if (index != -1) {
+      this[_credentials][dartx.removeAt](index);
     }
-  };
-  dart.setSignature(developer.Timeline, {
-    sfields: () => ({
-      _stack: ListOf_SyncBlock(),
-      _isolateId: core.int,
-      _isolateIdString: core.String
-    }),
-    sgetters: () => ({now: dart.definiteFunctionType(core.int, [])}),
-    statics: () => ({
-      startSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
-      finishSync: dart.definiteFunctionType(dart.void, []),
-      instantSync: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
-      timeSync: dart.definiteFunctionType(dart.dynamic, [core.String, developer.TimelineSyncFunction], {arguments: core.Map})
-    }),
-    names: ['startSync', 'finishSync', 'instantSync', 'timeSync']
-  });
-  dart.defineLazy(developer.Timeline, {
-    get _stack() {
-      return ListOf_SyncBlock().new();
-    },
-    get _isolateId() {
-      return developer._getIsolateNum();
-    },
-    get _isolateIdString() {
-      return dart.toString(developer.Timeline._isolateId);
+  }
+  [_removeProxyCredentials](cr) {
+    let index = this[_proxyCredentials][dartx.indexOf](io._ProxyCredentials._check(cr));
+    if (index != -1) {
+      this[_proxyCredentials][dartx.removeAt](index);
     }
-  });
-  const _stack = Symbol('_stack');
-  const _taskId = Symbol('_taskId');
-  const _start$1 = Symbol('_start');
-  const _finish = Symbol('_finish');
-  developer.TimelineTask = class TimelineTask extends core.Object {
-    new() {
-      this[_stack] = JSArrayOf_AsyncBlock().of([]);
-      this[_taskId] = developer._getNextAsyncId();
+  }
+  static _findProxyFromEnvironment(url, environment) {
+    function checkNoProxy(option) {
+      if (option == null) return null;
+      let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString$()))[dartx.iterator];
+      while (dart.test(names.moveNext())) {
+        let name = names.current;
+        if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
+          return "DIRECT";
+        }
+      }
+      return null;
     }
-    withTaskId(taskId) {
-      this[_stack] = JSArrayOf_AsyncBlock().of([]);
-      this[_taskId] = taskId;
-      if (!(typeof taskId == 'number')) {
-        dart.throw(new core.ArgumentError.value(taskId, 'taskId', 'Must be an int'));
+    dart.fn(checkNoProxy, StringToString$());
+    function checkProxy(option) {
+      if (option == null) return null;
+      option = option[dartx.trim]();
+      if (dart.test(option[dartx.isEmpty])) return null;
+      let pos = option[dartx.indexOf]("://");
+      if (dart.notNull(pos) >= 0) {
+        option = option[dartx.substring](dart.notNull(pos) + 3);
+      }
+      pos = option[dartx.indexOf]("/");
+      if (dart.notNull(pos) >= 0) {
+        option = option[dartx.substring](0, pos);
+      }
+      if (option[dartx.indexOf]("[") == 0) {
+        let pos = option[dartx.lastIndexOf](":");
+        if (dart.notNull(option[dartx.indexOf]("]")) > dart.notNull(pos)) option = dart.str`${option}:1080`;
+      } else {
+        if (option[dartx.indexOf](":") == -1) option = dart.str`${option}:1080`;
+      }
+      return dart.str`PROXY ${option}`;
+    }
+    dart.fn(checkProxy, StringToString$());
+    if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
+    let proxyCfg = null;
+    let noProxy = environment[dartx._get]("no_proxy");
+    if (noProxy == null) noProxy = environment[dartx._get]("NO_PROXY");
+    if ((proxyCfg = checkNoProxy(noProxy)) != null) {
+      return proxyCfg;
+    }
+    if (url.scheme == "http") {
+      let proxy = environment[dartx._get]("http_proxy");
+      if (proxy == null) proxy = environment[dartx._get]("HTTP_PROXY");
+      if ((proxyCfg = checkProxy(proxy)) != null) {
+        return proxyCfg;
+      }
+    } else if (url.scheme == "https") {
+      let proxy = environment[dartx._get]("https_proxy");
+      if (proxy == null) proxy = environment[dartx._get]("HTTPS_PROXY");
+      if ((proxyCfg = checkProxy(proxy)) != null) {
+        return proxyCfg;
       }
     }
-    start(name, opts) {
-      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
-      if (developer._isProduct) {
-        return;
-      }
-      if (!(typeof name == 'string')) {
-        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
-      }
-      let block = new developer._AsyncBlock._(name, this[_taskId]);
-      if (core.Map.is(arguments$)) {
-        block[_appendArguments](arguments$);
-      }
-      this[_stack][dartx.add](block);
-      block[_start$1]();
+    return "DIRECT";
+  }
+};
+io._HttpClient[dart.implements] = () => [io.HttpClient];
+dart.setSignature(io._HttpClient, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClient, [io.SecurityContext])}),
+  fields: () => ({
+    [_closing]: core.bool,
+    [_closingForcefully]: core.bool,
+    [_connectionTargets]: MapOfString$_ConnectionTarget(),
+    [_credentials]: ListOf_Credentials(),
+    [_proxyCredentials]: ListOf_ProxyCredentials(),
+    [_context]: io.SecurityContext,
+    [_authenticate]: core.Function,
+    [_authenticateProxy]: core.Function,
+    [_findProxy]: core.Function,
+    [_idleTimeout]: core.Duration,
+    [_badCertificateCallback]: io.BadCertificateCallback,
+    maxConnectionsPerHost: core.int,
+    autoUncompress: core.bool,
+    userAgent: core.String
+  }),
+  getters: () => ({idleTimeout: dart.definiteFunctionType(core.Duration, [])}),
+  setters: () => ({
+    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
+    badCertificateCallback: dart.definiteFunctionType(dart.void, [X509CertificateAndStringAndintTobool()]),
+    authenticate: dart.definiteFunctionType(dart.void, [UriAndStringAndStringToFutureOfbool()]),
+    authenticateProxy: dart.definiteFunctionType(dart.void, [StringAndintAndString__ToFutureOfbool()]),
+    findProxy: dart.definiteFunctionType(dart.void, [UriToString()])
+  }),
+  methods: () => ({
+    open: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.String, core.int, core.String]),
+    openUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.Uri]),
+    get: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    getUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    post: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    postUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    put: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    putUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    delete: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    deleteUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    head: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    headUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    patch: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
+    patchUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
+    close: dart.definiteFunctionType(dart.void, [], {force: core.bool}),
+    addCredentials: dart.definiteFunctionType(dart.void, [core.Uri, core.String, io.HttpClientCredentials]),
+    addProxyCredentials: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String, io.HttpClientCredentials]),
+    [_openUrl]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri]),
+    [_openUrlFromRequest]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri, io._HttpClientRequest]),
+    [_returnConnection]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
+    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
+    [_connectionsChanged]: dart.definiteFunctionType(dart.void, []),
+    [_closeConnections]: dart.definiteFunctionType(dart.void, [core.bool]),
+    [_getConnectionTarget]: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.int, core.bool]),
+    [_getConnection]: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._ProxyConfiguration, core.bool]),
+    [_findCredentials]: dart.definiteFunctionType(io._SiteCredentials, [core.Uri], [io._AuthenticationScheme]),
+    [_findProxyCredentials]: dart.definiteFunctionType(io._ProxyCredentials, [io._Proxy], [io._AuthenticationScheme]),
+    [_removeCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials]),
+    [_removeProxyCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials])
+  }),
+  sfields: () => ({_platformEnvironmentCache: MapOfString$String()}),
+  statics: () => ({_findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri, MapOfString$String()])}),
+  names: ['_findProxyFromEnvironment']
+});
+dart.defineLazy(io._HttpClient, {
+  get _platformEnvironmentCache() {
+    return io.Platform.environment;
+  },
+  set _platformEnvironmentCache(_) {}
+});
+const _state$1 = Symbol('_state');
+const _idleMark = Symbol('_idleMark');
+const _owner = Symbol('_owner');
+const _serviceId = Symbol('_serviceId');
+const _markActive = Symbol('_markActive');
+const _markIdle = Symbol('_markIdle');
+const _handleRequest = Symbol('_handleRequest');
+const _isActive = Symbol('_isActive');
+const _isIdle = Symbol('_isIdle');
+const _isDetached = Symbol('_isDetached');
+const _serviceTypePath = Symbol('_serviceTypePath');
+const _serviceTypeName = Symbol('_serviceTypeName');
+const _servicePath = Symbol('_servicePath');
+const _serviceType = Symbol('_serviceType');
+const _toJSON$ = Symbol('_toJSON');
+const __serviceId = Symbol('__serviceId');
+io._ServiceObject = class _ServiceObject extends core.Object {
+  new() {
+    this[__serviceId] = 0;
+  }
+  get [_serviceId]() {
+    if (this[__serviceId] == 0) this[__serviceId] = (() => {
+      let x = io._nextServiceId;
+      io._nextServiceId = dart.notNull(x) + 1;
+      return x;
+    })();
+    return this[__serviceId];
+  }
+  get [_servicePath]() {
+    return dart.str`${this[_serviceTypePath]}/${this[_serviceId]}`;
+  }
+  [_serviceType](ref) {
+    if (dart.test(ref)) return dart.str`@${this[_serviceTypeName]}`;
+    return this[_serviceTypeName];
+  }
+};
+dart.setSignature(io._ServiceObject, {
+  fields: () => ({[__serviceId]: core.int}),
+  getters: () => ({
+    [_serviceId]: dart.definiteFunctionType(core.int, []),
+    [_servicePath]: dart.definiteFunctionType(core.String, [])
+  }),
+  methods: () => ({[_serviceType]: dart.definiteFunctionType(core.String, [core.bool])})
+});
+io._HttpConnection = class _HttpConnection extends dart.mixin(collection.LinkedListEntry, io._ServiceObject) {
+  new(socket, httpServer) {
+    this[_socket] = socket;
+    this[_httpServer] = httpServer;
+    this[_httpParser] = io._HttpParser.requestParser();
+    this[_state$1] = io._HttpConnection._IDLE;
+    this[_subscription$] = null;
+    this[_idleMark] = false;
+    this[_streamFuture] = null;
+    super.new();
+    try {
+      dart.dput(this[_socket], _owner, this);
+    } catch (_) {
+      core.print(_);
     }
-    instant(name, opts) {
-      let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
-      if (developer._isProduct) {
-        return;
-      }
-      if (!(typeof name == 'string')) {
-        dart.throw(new core.ArgumentError.value(name, 'name', 'Must be a String'));
-      }
-      let instantArguments = null;
-      if (core.Map.is(arguments$)) {
-        instantArguments = core.Map.from(arguments$);
-      }
-      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'n', 'Dart', name, developer._argumentsAsJson(instantArguments));
-    }
-    finish() {
-      if (developer._isProduct) {
-        return;
-      }
-      if (this[_stack][dartx.length] == 0) {
-        dart.throw(new core.StateError('Uneven calls to start and finish'));
-      }
-      let block = this[_stack][dartx.removeLast]();
-      block[_finish]();
-    }
-    pass() {
-      if (dart.notNull(this[_stack][dartx.length]) > 0) {
-        dart.throw(new core.StateError('You cannot pass a TimelineTask without finishing all started ' + 'operations'));
-      }
-      let r = this[_taskId];
+
+    io._HttpConnection._connections[dartx._set](this[_serviceId], this);
+    this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
+    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
+      this[_httpServer][_markActive](this);
+      incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
+        if (dart.test(closing)) this.destroy();
+      }, dynamicToNull$()));
+      this[_subscription$].pause();
+      this[_state$1] = io._HttpConnection._ACTIVE;
+      let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
+      let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
+      let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
+      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
+        response.deadline = null;
+        if (this[_state$1] == io._HttpConnection._DETACHED) return;
+        if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
+          this[_state$1] = io._HttpConnection._IDLE;
+          this[_idleMark] = false;
+          this[_httpServer][_markIdle](this);
+          this[_subscription$].resume();
+        } else {
+          this.destroy();
+        }
+      }, dynamicToNull$()), {onError: dart.fn(_ => {
+          this.destroy();
+        }, dynamicToNull$())});
+      outgoing.ignoreBody = request.method == "HEAD";
+      response[_httpRequest] = request;
+      this[_httpServer][_handleRequest](request);
+    }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
+        this.destroy();
+      }, VoidToNull()), onError: dart.fn(error => {
+        this.destroy();
+      }, dynamicToNull$())});
+  }
+  markIdle() {
+    this[_idleMark] = true;
+  }
+  get isMarkedIdle() {
+    return this[_idleMark];
+  }
+  destroy() {
+    if (this[_state$1] == io._HttpConnection._CLOSING || this[_state$1] == io._HttpConnection._DETACHED) return;
+    this[_state$1] = io._HttpConnection._CLOSING;
+    dart.dsend(this[_socket], 'destroy');
+    this[_httpServer][_connectionClosed](this);
+    io._HttpConnection._connections[dartx.remove](this[_serviceId]);
+  }
+  detachSocket() {
+    this[_state$1] = io._HttpConnection._DETACHED;
+    this[_httpServer][_connectionClosed](this);
+    let detachedIncoming = this[_httpParser].detachIncoming();
+    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
+      io._HttpConnection._connections[dartx.remove](this[_serviceId]);
+      return new io._DetachedSocket(this[_socket], detachedIncoming);
+    }, dynamicTo_DetachedSocket()));
+  }
+  get connectionInfo() {
+    return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
+  }
+  get [_isActive]() {
+    return this[_state$1] == io._HttpConnection._ACTIVE;
+  }
+  get [_isIdle]() {
+    return this[_state$1] == io._HttpConnection._IDLE;
+  }
+  get [_isClosing]() {
+    return this[_state$1] == io._HttpConnection._CLOSING;
+  }
+  get [_isDetached]() {
+    return this[_state$1] == io._HttpConnection._DETACHED;
+  }
+  get [_serviceTypePath]() {
+    return 'io/http/serverconnections';
+  }
+  get [_serviceTypeName]() {
+    return 'HttpServerConnection';
+  }
+  [_toJSON$](ref) {
+    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
+    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
+    if (dart.test(ref)) {
       return r;
     }
-  };
-  dart.defineNamedConstructor(developer.TimelineTask, 'withTaskId');
-  dart.setSignature(developer.TimelineTask, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(developer.TimelineTask, []),
-      withTaskId: dart.definiteFunctionType(developer.TimelineTask, [core.int])
-    }),
-    fields: () => ({
-      [_taskId]: core.int,
-      [_stack]: ListOf_AsyncBlock()
-    }),
-    methods: () => ({
-      start: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
-      instant: dart.definiteFunctionType(dart.void, [core.String], {arguments: core.Map}),
-      finish: dart.definiteFunctionType(dart.void, []),
-      pass: dart.definiteFunctionType(core.int, [])
-    })
-  });
-  const _arguments$ = Symbol('_arguments');
-  developer._AsyncBlock = class _AsyncBlock extends core.Object {
-    _(name, taskId) {
-      this.name = name;
-      this[_taskId] = taskId;
-      this.category = 'Dart';
-      this[_arguments$] = null;
+    r[dartx._set]('server', this[_httpServer][_toJSON$](true));
+    try {
+      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
+    } catch (_) {
+      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
     }
-    [_start$1]() {
-      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
-    }
-    [_finish]() {
-      developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
-    }
-    [_appendArguments](arguments$) {
-      if (this[_arguments$] == null) {
-        this[_arguments$] = dart.map();
+
+    switch (this[_state$1]) {
+      case io._HttpConnection._ACTIVE:
+      {
+        r[dartx._set]('state', "Active");
+        break;
       }
-      this[_arguments$][dartx.addAll](arguments$);
+      case io._HttpConnection._IDLE:
+      {
+        r[dartx._set]('state', "Idle");
+        break;
+      }
+      case io._HttpConnection._CLOSING:
+      {
+        r[dartx._set]('state', "Closing");
+        break;
+      }
+      case io._HttpConnection._DETACHED:
+      {
+        r[dartx._set]('state', "Detached");
+        break;
+      }
+      default:
+      {
+        r[dartx._set]('state', 'Unknown');
+        break;
+      }
     }
-  };
-  dart.defineNamedConstructor(developer._AsyncBlock, '_');
-  dart.setSignature(developer._AsyncBlock, {
-    constructors: () => ({_: dart.definiteFunctionType(developer._AsyncBlock, [core.String, core.int])}),
-    fields: () => ({
-      category: core.String,
-      name: core.String,
-      [_taskId]: core.int,
-      [_arguments$]: core.Map
-    }),
-    methods: () => ({
-      [_start$1]: dart.definiteFunctionType(dart.void, []),
-      [_finish]: dart.definiteFunctionType(dart.void, []),
-      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
-    })
-  });
-  const _startCpu = Symbol('_startCpu');
-  developer._SyncBlock = class _SyncBlock extends core.Object {
-    _(name, start, startCpu) {
-      this.name = name;
-      this[_start$1] = start;
-      this[_startCpu] = startCpu;
-      this.category = 'Dart';
-      this[_arguments$] = null;
+    return r;
+  }
+};
+dart.setBaseClass(io._HttpConnection, dart.mixin(collection.LinkedListEntry$(io._HttpConnection), io._ServiceObject));
+dart.addSimpleTypeTests(io._HttpConnection);
+dart.setSignature(io._HttpConnection, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpConnection, [dart.dynamic, io._HttpServer])}),
+  fields: () => ({
+    [_socket]: dart.dynamic,
+    [_httpServer]: io._HttpServer,
+    [_httpParser]: io._HttpParser,
+    [_state$1]: core.int,
+    [_subscription$]: async.StreamSubscription,
+    [_idleMark]: core.bool,
+    [_streamFuture]: async.Future
+  }),
+  getters: () => ({
+    isMarkedIdle: dart.definiteFunctionType(core.bool, []),
+    connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
+    [_isActive]: dart.definiteFunctionType(core.bool, []),
+    [_isIdle]: dart.definiteFunctionType(core.bool, []),
+    [_isClosing]: dart.definiteFunctionType(core.bool, []),
+    [_isDetached]: dart.definiteFunctionType(core.bool, []),
+    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
+    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
+  }),
+  methods: () => ({
+    markIdle: dart.definiteFunctionType(dart.void, []),
+    destroy: dart.definiteFunctionType(dart.void, []),
+    detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
+    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
+  }),
+  sfields: () => ({
+    _ACTIVE: core.int,
+    _IDLE: core.int,
+    _CLOSING: core.int,
+    _DETACHED: core.int,
+    _connections: MapOfint$_HttpConnection()
+  })
+});
+io._HttpConnection._ACTIVE = 0;
+io._HttpConnection._IDLE = 1;
+io._HttpConnection._CLOSING = 2;
+io._HttpConnection._DETACHED = 3;
+dart.defineLazy(io._HttpConnection, {
+  get _connections() {
+    return HashMapOfint$_HttpConnection().new();
+  },
+  set _connections(_) {}
+});
+const _activeConnections = Symbol('_activeConnections');
+const _idleConnections = Symbol('_idleConnections');
+const _serverSocket = Symbol('_serverSocket');
+const _closeServer = Symbol('_closeServer');
+let const$71;
+let const$72;
+io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
+  static bind(address, port, backlog, v6Only, shared) {
+    return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
+  }
+  static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
+    return io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), SecureServerSocketTo_HttpServer()));
+  }
+  _(serverSocket, closeServer) {
+    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
+    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
+    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
+    this[_serverSocket] = serverSocket;
+    this[_closeServer] = closeServer;
+    this.serverHeader = null;
+    this.autoCompress = false;
+    this[_idleTimeout] = null;
+    this[_idleTimer] = null;
+    this[_sessionManagerInstance] = null;
+    this.closed = false;
+    this[_controller$0] = null;
+    super.new();
+    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
+    this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
+    io._HttpServer._servers[dartx._set](this[_serviceId], this);
+    dart.dput(this[_serverSocket], _owner, this);
+  }
+  listenOn(serverSocket) {
+    this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
+    this[_activeConnections] = new (LinkedListOf_HttpConnection())();
+    this[_idleConnections] = new (LinkedListOf_HttpConnection())();
+    this[_serverSocket] = serverSocket;
+    this[_closeServer] = false;
+    this.serverHeader = null;
+    this.autoCompress = false;
+    this[_idleTimeout] = null;
+    this[_idleTimer] = null;
+    this[_sessionManagerInstance] = null;
+    this.closed = false;
+    this[_controller$0] = null;
+    super.new();
+    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
+    this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
+    io._HttpServer._servers[dartx._set](this[_serviceId], this);
+    try {
+      dart.dput(this[_serverSocket], _owner, this);
+    } catch (_) {
     }
-    finish() {
-      developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
+
+  }
+  static _initDefaultResponseHeaders() {
+    let defaultResponseHeaders = new io._HttpHeaders('1.1');
+    defaultResponseHeaders.contentType = io.ContentType.TEXT;
+    defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
+    defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
+    defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
+    return defaultResponseHeaders;
+  }
+  get idleTimeout() {
+    return this[_idleTimeout];
+  }
+  set idleTimeout(duration) {
+    if (this[_idleTimer] != null) {
+      this[_idleTimer].cancel();
+      this[_idleTimer] = null;
     }
-    [_appendArguments](arguments$) {
-      if (arguments$ == null) {
+    this[_idleTimeout] = duration;
+    if (this[_idleTimeout] != null) {
+      this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
+        for (let idle of this[_idleConnections].toList()) {
+          if (dart.test(idle.isMarkedIdle)) {
+            idle.destroy();
+          } else {
+            idle.markIdle();
+          }
+        }
+      }, TimerToNull()));
+    }
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    dart.dsend(this[_serverSocket], 'listen', dart.fn(socket => {
+      socket.setOption(io.SocketOption.TCP_NODELAY, true);
+      let connection = new io._HttpConnection(socket, this);
+      this[_idleConnections].add(connection);
+    }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
+        if (!io.HandshakeException.is(error)) {
+          this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
+        }
+      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  close(opts) {
+    let force = opts && 'force' in opts ? opts.force : false;
+    this.closed = true;
+    let result = null;
+    if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
+      result = async.Future._check(dart.dsend(this[_serverSocket], 'close'));
+    } else {
+      result = async.Future.value();
+    }
+    this.idleTimeout = null;
+    if (dart.test(force)) {
+      for (let c of this[_activeConnections].toList()) {
+        c.destroy();
+      }
+      dart.assert(this[_activeConnections].isEmpty);
+    }
+    for (let c of this[_idleConnections].toList()) {
+      c.destroy();
+    }
+    this[_maybePerformCleanup]();
+    return result;
+  }
+  [_maybePerformCleanup]() {
+    if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
+      this[_sessionManagerInstance].close();
+      this[_sessionManagerInstance] = null;
+      io._HttpServer._servers[dartx.remove](this[_serviceId]);
+    }
+  }
+  get port() {
+    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
+    return core.int._check(dart.dload(this[_serverSocket], 'port'));
+  }
+  get address() {
+    if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
+    return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
+  }
+  set sessionTimeout(timeout) {
+    this[_sessionManager].sessionTimeout = timeout;
+  }
+  [_handleRequest](request) {
+    if (!dart.test(this.closed)) {
+      this[_controller$0].add(request);
+    } else {
+      request[_httpConnection].destroy();
+    }
+  }
+  [_connectionClosed](connection) {
+    connection.unlink();
+    this[_maybePerformCleanup]();
+  }
+  [_markIdle](connection) {
+    this[_activeConnections].remove(connection);
+    this[_idleConnections].add(connection);
+  }
+  [_markActive](connection) {
+    this[_idleConnections].remove(connection);
+    this[_activeConnections].add(connection);
+  }
+  get [_sessionManager]() {
+    if (this[_sessionManagerInstance] == null) {
+      this[_sessionManagerInstance] = new io._HttpSessionManager();
+    }
+    return this[_sessionManagerInstance];
+  }
+  connectionsInfo() {
+    let result = new io.HttpConnectionsInfo();
+    result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
+    this[_activeConnections].forEach(dart.fn(conn => {
+      if (dart.test(conn[_isActive])) {
+        result.active = dart.notNull(result.active) + 1;
+      } else {
+        dart.assert(conn[_isClosing]);
+        result.closing = dart.notNull(result.closing) + 1;
+      }
+    }, _HttpConnectionToNull()));
+    this[_idleConnections].forEach(dart.fn(conn => {
+      result.idle = dart.notNull(result.idle) + 1;
+      dart.assert(conn[_isIdle]);
+    }, _HttpConnectionToNull()));
+    return result;
+  }
+  get [_serviceTypePath]() {
+    return 'io/http/servers';
+  }
+  get [_serviceTypeName]() {
+    return 'HttpServer';
+  }
+  [_toJSON$](ref) {
+    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
+    if (dart.test(ref)) {
+      return r;
+    }
+    try {
+      r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON$, true));
+    } catch (_) {
+      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
+    }
+
+    r[dartx._set]('port', this.port);
+    r[dartx._set]('address', this.address.host);
+    r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
+    r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
+    r[dartx._set]('closed', this.closed);
+    return r;
+  }
+};
+dart.addSimpleTypeTests(io._HttpServer);
+dart.defineNamedConstructor(io._HttpServer, '_');
+dart.defineNamedConstructor(io._HttpServer, 'listenOn');
+io._HttpServer[dart.implements] = () => [io.HttpServer];
+dart.setSignature(io._HttpServer, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(io._HttpServer, [dart.dynamic, core.bool]),
+    listenOn: dart.definiteFunctionType(io._HttpServer, [dart.dynamic])
+  }),
+  fields: () => ({
+    serverHeader: core.String,
+    defaultResponseHeaders: io.HttpHeaders,
+    autoCompress: core.bool,
+    [_idleTimeout]: core.Duration,
+    [_idleTimer]: async.Timer,
+    [_sessionManagerInstance]: io._HttpSessionManager,
+    closed: core.bool,
+    [_serverSocket]: dart.dynamic,
+    [_closeServer]: core.bool,
+    [_activeConnections]: LinkedListOf_HttpConnection(),
+    [_idleConnections]: LinkedListOf_HttpConnection(),
+    [_controller$0]: StreamControllerOfHttpRequest()
+  }),
+  getters: () => ({
+    idleTimeout: dart.definiteFunctionType(core.Duration, []),
+    port: dart.definiteFunctionType(core.int, []),
+    address: dart.definiteFunctionType(io.InternetAddress, []),
+    [_sessionManager]: dart.definiteFunctionType(io._HttpSessionManager, []),
+    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
+    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({
+    idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
+    sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(io.HttpRequest), [HttpRequestTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    close: dart.definiteFunctionType(async.Future, [], {force: core.bool}),
+    [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
+    [_handleRequest]: dart.definiteFunctionType(dart.void, [io._HttpRequest]),
+    [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
+    [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
+    [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
+    connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
+    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
+  }),
+  sfields: () => ({_servers: MapOfint$_HttpServer()}),
+  statics: () => ({
+    bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, core.int, core.bool, core.bool]),
+    bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext, core.int, core.bool, core.bool, core.bool]),
+    _initDefaultResponseHeaders: dart.definiteFunctionType(io.HttpHeaders, [])
+  }),
+  names: ['bind', 'bindSecure', '_initDefaultResponseHeaders']
+});
+dart.defineLazy(io._HttpServer, {
+  get _servers() {
+    return MapOfint$_HttpServer().new();
+  },
+  set _servers(_) {}
+});
+io._Proxy = class _Proxy extends core.Object {
+  new(host, port, username, password) {
+    this.host = host;
+    this.port = port;
+    this.username = username;
+    this.password = password;
+    this.isDirect = false;
+  }
+  direct() {
+    this.host = null;
+    this.port = null;
+    this.username = null;
+    this.password = null;
+    this.isDirect = true;
+  }
+  get isAuthenticated() {
+    return this.username != null;
+  }
+};
+dart.defineNamedConstructor(io._Proxy, 'direct');
+dart.setSignature(io._Proxy, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._Proxy, [core.String, core.int, core.String, core.String]),
+    direct: dart.definiteFunctionType(io._Proxy, [])
+  }),
+  fields: () => ({
+    host: core.String,
+    port: core.int,
+    username: core.String,
+    password: core.String,
+    isDirect: core.bool
+  }),
+  getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
+});
+let const$73;
+let const$74;
+io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
+  new(configuration) {
+    this.proxies = ListOf_Proxy().new();
+    if (configuration == null) {
+      dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
+    }
+    let list = configuration[dartx.split](";");
+    list[dartx.forEach](dart.fn(proxy => {
+      proxy = proxy[dartx.trim]();
+      if (!dart.test(proxy[dartx.isEmpty])) {
+        if (dart.test(proxy[dartx.startsWith](io._ProxyConfiguration.PROXY_PREFIX))) {
+          let username = null;
+          let password = null;
+          proxy = proxy[dartx.substring](io._ProxyConfiguration.PROXY_PREFIX[dartx.length])[dartx.trim]();
+          let at = proxy[dartx.indexOf]("@");
+          if (at != -1) {
+            let userinfo = proxy[dartx.substring](0, at)[dartx.trim]();
+            proxy = proxy[dartx.substring](dart.notNull(at) + 1)[dartx.trim]();
+            let colon = userinfo[dartx.indexOf](":");
+            if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
+              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
+            }
+            username = userinfo[dartx.substring](0, colon)[dartx.trim]();
+            password = userinfo[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
+          }
+          let colon = proxy[dartx.lastIndexOf](":");
+          if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
+            dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
+          }
+          let host = proxy[dartx.substring](0, colon)[dartx.trim]();
+          if (dart.test(host[dartx.startsWith]("[")) && dart.test(host[dartx.endsWith]("]"))) {
+            host = host[dartx.substring](1, dart.notNull(host[dartx.length]) - 1);
+          }
+          let portString = proxy[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
+          let port = null;
+          try {
+            port = core.int.parse(portString);
+          } catch (e) {
+            if (core.FormatException.is(e)) {
+              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}, ` + dart.str`invalid port '${portString}'`));
+            } else
+              throw e;
+          }
+
+          this.proxies[dartx.add](new io._Proxy(host, port, username, password));
+        } else if (proxy[dartx.trim]() == io._ProxyConfiguration.DIRECT_PREFIX) {
+          this.proxies[dartx.add](new io._Proxy.direct());
+        } else {
+          dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
+        }
+      }
+    }, StringToNull()));
+  }
+  direct() {
+    this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
+  }
+};
+dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
+dart.setSignature(io._ProxyConfiguration, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._ProxyConfiguration, [core.String]),
+    direct: dart.definiteFunctionType(io._ProxyConfiguration, [])
+  }),
+  fields: () => ({proxies: ListOf_Proxy()}),
+  sfields: () => ({
+    PROXY_PREFIX: core.String,
+    DIRECT_PREFIX: core.String
+  })
+});
+io._ProxyConfiguration.PROXY_PREFIX = "PROXY ";
+io._ProxyConfiguration.DIRECT_PREFIX = "DIRECT";
+io._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
+  new() {
+    this.remoteAddress = null;
+    this.remotePort = null;
+    this.localPort = null;
+  }
+  static create(socket) {
+    if (socket == null) return null;
+    try {
+      let info = new io._HttpConnectionInfo();
+      info.remoteAddress = socket.remoteAddress;
+      info.remotePort = socket.remotePort;
+      info.localPort = socket.port;
+      return info;
+    } catch (e) {
+    }
+
+    return null;
+  }
+};
+io._HttpConnectionInfo[dart.implements] = () => [io.HttpConnectionInfo];
+dart.setSignature(io._HttpConnectionInfo, {
+  fields: () => ({
+    remoteAddress: io.InternetAddress,
+    remotePort: core.int,
+    localPort: core.int
+  }),
+  statics: () => ({create: dart.definiteFunctionType(io._HttpConnectionInfo, [io.Socket])}),
+  names: ['create']
+});
+io._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
+  new(socket, incoming) {
+    this[_socket] = socket;
+    this[_incoming] = incoming;
+    super.new();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get encoding() {
+    return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
+  }
+  set encoding(value) {
+    dart.dput(this[_socket], 'encoding', value);
+  }
+  write(obj) {
+    dart.dsend(this[_socket], 'write', obj);
+  }
+  writeln(obj) {
+    if (obj === void 0) obj = "";
+    dart.dsend(this[_socket], 'writeln', obj);
+  }
+  writeCharCode(charCode) {
+    dart.dsend(this[_socket], 'writeCharCode', charCode);
+  }
+  writeAll(objects, separator) {
+    if (separator === void 0) separator = "";
+    dart.dsend(this[_socket], 'writeAll', objects, separator);
+  }
+  add(bytes) {
+    dart.dsend(this[_socket], 'add', bytes);
+  }
+  addError(error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    return dart.dsend(this[_socket], 'addError', error, stackTrace);
+  }
+  addStream(stream) {
+    return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
+  }
+  destroy() {
+    dart.dsend(this[_socket], 'destroy');
+  }
+  flush() {
+    return async.Future._check(dart.dsend(this[_socket], 'flush'));
+  }
+  close() {
+    return async.Future._check(dart.dsend(this[_socket], 'close'));
+  }
+  get done() {
+    return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
+  }
+  get port() {
+    return core.int._check(dart.dload(this[_socket], 'port'));
+  }
+  get address() {
+    return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
+  }
+  get remoteAddress() {
+    return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
+  }
+  get remotePort() {
+    return core.int._check(dart.dload(this[_socket], 'remotePort'));
+  }
+  setOption(option, enabled) {
+    return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
+  }
+  [_toJSON$](ref) {
+    return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
+  }
+  set [_owner](owner) {
+    dart.dput(this[_socket], _owner, owner);
+  }
+};
+dart.addSimpleTypeTests(io._DetachedSocket);
+io._DetachedSocket[dart.implements] = () => [io.Socket];
+dart.setSignature(io._DetachedSocket, {
+  constructors: () => ({new: dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic, StreamOfListOfint()])}),
+  fields: () => ({
+    [_incoming]: StreamOfListOfint(),
+    [_socket]: dart.dynamic
+  }),
+  getters: () => ({
+    encoding: dart.definiteFunctionType(convert.Encoding, []),
+    done: dart.definiteFunctionType(async.Future$(io.Socket), []),
+    port: dart.definiteFunctionType(core.int, []),
+    address: dart.definiteFunctionType(io.InternetAddress, []),
+    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
+    remotePort: dart.definiteFunctionType(core.int, [])
+  }),
+  setters: () => ({
+    encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
+    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+    addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
+    destroy: dart.definiteFunctionType(dart.void, []),
+    flush: dart.definiteFunctionType(async.Future, []),
+    close: dart.definiteFunctionType(async.Future, []),
+    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
+    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
+  })
+});
+const _scheme = Symbol('_scheme');
+io._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
+  new(scheme) {
+    this[_scheme] = scheme;
+  }
+  static fromString(scheme) {
+    if (scheme[dartx.toLowerCase]() == "basic") return io._AuthenticationScheme.BASIC;
+    if (scheme[dartx.toLowerCase]() == "digest") return io._AuthenticationScheme.DIGEST;
+    return io._AuthenticationScheme.UNKNOWN;
+  }
+  toString() {
+    if (dart.equals(this, io._AuthenticationScheme.BASIC)) return "Basic";
+    if (dart.equals(this, io._AuthenticationScheme.DIGEST)) return "Digest";
+    return "Unknown";
+  }
+};
+dart.setSignature(io._AuthenticationScheme, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io._AuthenticationScheme, [core.int]),
+    fromString: dart.definiteFunctionType(io._AuthenticationScheme, [core.String])
+  }),
+  fields: () => ({[_scheme]: core.int}),
+  sfields: () => ({
+    UNKNOWN: io._AuthenticationScheme,
+    BASIC: io._AuthenticationScheme,
+    DIGEST: io._AuthenticationScheme
+  })
+});
+dart.defineLazy(io._AuthenticationScheme, {
+  get UNKNOWN() {
+    return dart.const(new io._AuthenticationScheme(-1));
+  },
+  get BASIC() {
+    return dart.const(new io._AuthenticationScheme(0));
+  },
+  get DIGEST() {
+    return dart.const(new io._AuthenticationScheme(1));
+  }
+});
+io._Credentials = class _Credentials extends core.Object {
+  new(credentials, realm) {
+    this.credentials = credentials;
+    this.realm = realm;
+    this.used = false;
+    this.ha1 = null;
+    this.nonce = null;
+    this.algorithm = null;
+    this.qop = null;
+    this.nonceCount = null;
+    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST)) {
+      let creds = io._HttpClientDigestCredentials._check(this.credentials);
+      let hasher = new io._MD5();
+      hasher.add(convert.UTF8.encode(creds.username));
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(this.realm[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(convert.UTF8.encode(creds.password));
+      this.ha1 = io._CryptoUtils.bytesToHex(hasher.close());
+    }
+  }
+  get scheme() {
+    return this.credentials.scheme;
+  }
+};
+dart.setSignature(io._Credentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io._Credentials, [io._HttpClientCredentials, core.String])}),
+  fields: () => ({
+    credentials: io._HttpClientCredentials,
+    realm: core.String,
+    used: core.bool,
+    ha1: core.String,
+    nonce: core.String,
+    algorithm: core.String,
+    qop: core.String,
+    nonceCount: core.int
+  }),
+  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])})
+});
+io._SiteCredentials = class _SiteCredentials extends io._Credentials {
+  new(uri, realm, creds) {
+    this.uri = uri;
+    super.new(creds, core.String._check(realm));
+  }
+  applies(uri, scheme) {
+    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
+    if (uri.host != this.uri.host) return false;
+    let thisPort = this.uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
+    let otherPort = uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : uri.port;
+    if (otherPort != thisPort) return false;
+    return uri.path[dartx.startsWith](this.uri.path);
+  }
+  authorize(request) {
+    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
+      return;
+    }
+    this.credentials.authorize(this, request);
+    this.used = true;
+  }
+};
+dart.setSignature(io._SiteCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io._SiteCredentials, [core.Uri, dart.dynamic, io._HttpClientCredentials])}),
+  fields: () => ({uri: core.Uri}),
+  methods: () => ({
+    applies: dart.definiteFunctionType(core.bool, [core.Uri, io._AuthenticationScheme]),
+    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
+  })
+});
+io._ProxyCredentials = class _ProxyCredentials extends io._Credentials {
+  new(host, port, realm, creds) {
+    this.host = host;
+    this.port = port;
+    super.new(creds, core.String._check(realm));
+  }
+  applies(proxy, scheme) {
+    if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
+    return proxy.host == this.host && proxy.port == this.port;
+  }
+  authorize(request) {
+    if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
+      return;
+    }
+    this.credentials.authorizeProxy(this, request);
+  }
+};
+dart.setSignature(io._ProxyCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ProxyCredentials, [core.String, core.int, dart.dynamic, io._HttpClientCredentials])}),
+  fields: () => ({
+    host: core.String,
+    port: core.int
+  }),
+  methods: () => ({
+    applies: dart.definiteFunctionType(core.bool, [io._Proxy, io._AuthenticationScheme]),
+    authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
+  })
+});
+io._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
+io._HttpClientCredentials[dart.implements] = () => [io.HttpClientCredentials];
+io._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends io._HttpClientCredentials {
+  new(username, password) {
+    this.username = username;
+    this.password = password;
+  }
+  get scheme() {
+    return io._AuthenticationScheme.BASIC;
+  }
+  authorization() {
+    let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${this.username}:${this.password}`));
+    return dart.str`Basic ${auth}`;
+  }
+  authorize(_, request) {
+    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization());
+  }
+  authorizeProxy(_, request) {
+    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization());
+  }
+};
+io._HttpClientBasicCredentials[dart.implements] = () => [io.HttpClientBasicCredentials];
+dart.setSignature(io._HttpClientBasicCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientBasicCredentials, [core.String, core.String])}),
+  fields: () => ({
+    username: core.String,
+    password: core.String
+  }),
+  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
+  methods: () => ({
+    authorization: dart.definiteFunctionType(core.String, []),
+    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
+    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
+  })
+});
+io._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends io._HttpClientCredentials {
+  new(username, password) {
+    this.username = username;
+    this.password = password;
+  }
+  get scheme() {
+    return io._AuthenticationScheme.DIGEST;
+  }
+  authorization(credentials, request) {
+    let requestUri = request[_requestUri]();
+    let hasher = new io._MD5();
+    hasher.add(request.method[dartx.codeUnits]);
+    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+    hasher.add(requestUri[dartx.codeUnits]);
+    let ha2 = io._CryptoUtils.bytesToHex(hasher.close());
+    let qop = null;
+    let cnonce = null;
+    let nc = null;
+    let x = null;
+    hasher = new io._MD5();
+    hasher.add(credentials.ha1[dartx.codeUnits]);
+    hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+    if (credentials.qop == "auth") {
+      qop = credentials.qop;
+      cnonce = io._CryptoUtils.bytesToHex(io._IOCrypto.getRandomBytes(4));
+      credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
+      nc = credentials.nonceCount[dartx.toRadixString](16);
+      nc = dart.notNull("00000000"[dartx.substring](0, 8 - dart.notNull(nc[dartx.length]) + 1)) + dart.notNull(nc);
+      hasher.add(credentials.nonce[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(nc[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(cnonce[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(credentials.qop[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(ha2[dartx.codeUnits]);
+    } else {
+      hasher.add(credentials.nonce[dartx.codeUnits]);
+      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
+      hasher.add(ha2[dartx.codeUnits]);
+    }
+    let response = io._CryptoUtils.bytesToHex(hasher.close());
+    let buffer = new core.StringBuffer();
+    buffer.write('Digest ');
+    buffer.write(dart.str`username="${this.username}"`);
+    buffer.write(dart.str`, realm="${credentials.realm}"`);
+    buffer.write(dart.str`, nonce="${credentials.nonce}"`);
+    buffer.write(dart.str`, uri="${requestUri}"`);
+    buffer.write(dart.str`, algorithm="${credentials.algorithm}"`);
+    if (qop == "auth") {
+      buffer.write(dart.str`, qop="${qop}"`);
+      buffer.write(dart.str`, cnonce="${cnonce}"`);
+      buffer.write(dart.str`, nc="${nc}"`);
+    }
+    buffer.write(dart.str`, response="${response}"`);
+    return buffer.toString();
+  }
+  authorize(credentials, request) {
+    request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
+  }
+  authorizeProxy(credentials, request) {
+    request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
+  }
+};
+io._HttpClientDigestCredentials[dart.implements] = () => [io.HttpClientDigestCredentials];
+dart.setSignature(io._HttpClientDigestCredentials, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpClientDigestCredentials, [core.String, core.String])}),
+  fields: () => ({
+    username: core.String,
+    password: core.String
+  }),
+  getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
+  methods: () => ({
+    authorization: dart.definiteFunctionType(core.String, [io._Credentials, io._HttpClientRequest]),
+    authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
+    authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
+  })
+});
+io._RedirectInfo = class _RedirectInfo extends core.Object {
+  new(statusCode, method, location) {
+    this.statusCode = statusCode;
+    this.method = method;
+    this.location = location;
+  }
+};
+io._RedirectInfo[dart.implements] = () => [io.RedirectInfo];
+dart.setSignature(io._RedirectInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._RedirectInfo, [core.int, core.String, core.Uri])}),
+  fields: () => ({
+    statusCode: core.int,
+    method: core.String,
+    location: core.Uri
+  })
+});
+io._getHttpVersion = function() {
+  let version = io.Platform.version;
+  let index = version[dartx.indexOf]('.', dart.notNull(version[dartx.indexOf]('.')) + 1);
+  version = version[dartx.substring](0, index);
+  return dart.str`Dart/${version} (dart:io)`;
+};
+dart.fn(io._getHttpVersion, VoidToString$());
+io._Const = class _Const extends core.Object {};
+dart.setSignature(io._Const, {
+  sfields: () => ({
+    HTTP: ListOfint(),
+    HTTP1DOT: ListOfint(),
+    HTTP10: ListOfint(),
+    HTTP11: ListOfint(),
+    T: core.bool,
+    F: core.bool,
+    SEPARATOR_MAP: ListOfbool()
+  })
+});
+io._Const.HTTP = dart.constList([72, 84, 84, 80], core.int);
+io._Const.HTTP1DOT = dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
+io._Const.HTTP10 = dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
+io._Const.HTTP11 = dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
+io._Const.T = true;
+io._Const.F = false;
+dart.defineLazy(io._Const, {
+  get SEPARATOR_MAP() {
+    return dart.constList([io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F], core.bool);
+  }
+});
+io._CharCode = class _CharCode extends core.Object {};
+dart.setSignature(io._CharCode, {
+  sfields: () => ({
+    HT: core.int,
+    LF: core.int,
+    CR: core.int,
+    SP: core.int,
+    AMPERSAND: core.int,
+    COMMA: core.int,
+    DASH: core.int,
+    SLASH: core.int,
+    ZERO: core.int,
+    ONE: core.int,
+    COLON: core.int,
+    SEMI_COLON: core.int,
+    EQUAL: core.int
+  })
+});
+io._CharCode.HT = 9;
+io._CharCode.LF = 10;
+io._CharCode.CR = 13;
+io._CharCode.SP = 32;
+io._CharCode.AMPERSAND = 38;
+io._CharCode.COMMA = 44;
+io._CharCode.DASH = 45;
+io._CharCode.SLASH = 47;
+io._CharCode.ZERO = 48;
+io._CharCode.ONE = 49;
+io._CharCode.COLON = 58;
+io._CharCode.SEMI_COLON = 59;
+io._CharCode.EQUAL = 61;
+io._State = class _State extends core.Object {};
+dart.setSignature(io._State, {
+  sfields: () => ({
+    START: core.int,
+    METHOD_OR_RESPONSE_HTTP_VERSION: core.int,
+    RESPONSE_HTTP_VERSION: core.int,
+    REQUEST_LINE_METHOD: core.int,
+    REQUEST_LINE_URI: core.int,
+    REQUEST_LINE_HTTP_VERSION: core.int,
+    REQUEST_LINE_ENDING: core.int,
+    RESPONSE_LINE_STATUS_CODE: core.int,
+    RESPONSE_LINE_REASON_PHRASE: core.int,
+    RESPONSE_LINE_ENDING: core.int,
+    HEADER_START: core.int,
+    HEADER_FIELD: core.int,
+    HEADER_VALUE_START: core.int,
+    HEADER_VALUE: core.int,
+    HEADER_VALUE_FOLDING_OR_ENDING: core.int,
+    HEADER_VALUE_FOLD_OR_END: core.int,
+    HEADER_ENDING: core.int,
+    CHUNK_SIZE_STARTING_CR: core.int,
+    CHUNK_SIZE_STARTING_LF: core.int,
+    CHUNK_SIZE: core.int,
+    CHUNK_SIZE_EXTENSION: core.int,
+    CHUNK_SIZE_ENDING: core.int,
+    CHUNKED_BODY_DONE_CR: core.int,
+    CHUNKED_BODY_DONE_LF: core.int,
+    BODY: core.int,
+    CLOSED: core.int,
+    UPGRADED: core.int,
+    FAILURE: core.int,
+    FIRST_BODY_STATE: core.int
+  })
+});
+io._State.START = 0;
+io._State.METHOD_OR_RESPONSE_HTTP_VERSION = 1;
+io._State.RESPONSE_HTTP_VERSION = 2;
+io._State.REQUEST_LINE_METHOD = 3;
+io._State.REQUEST_LINE_URI = 4;
+io._State.REQUEST_LINE_HTTP_VERSION = 5;
+io._State.REQUEST_LINE_ENDING = 6;
+io._State.RESPONSE_LINE_STATUS_CODE = 7;
+io._State.RESPONSE_LINE_REASON_PHRASE = 8;
+io._State.RESPONSE_LINE_ENDING = 9;
+io._State.HEADER_START = 10;
+io._State.HEADER_FIELD = 11;
+io._State.HEADER_VALUE_START = 12;
+io._State.HEADER_VALUE = 13;
+io._State.HEADER_VALUE_FOLDING_OR_ENDING = 14;
+io._State.HEADER_VALUE_FOLD_OR_END = 15;
+io._State.HEADER_ENDING = 16;
+io._State.CHUNK_SIZE_STARTING_CR = 17;
+io._State.CHUNK_SIZE_STARTING_LF = 18;
+io._State.CHUNK_SIZE = 19;
+io._State.CHUNK_SIZE_EXTENSION = 20;
+io._State.CHUNK_SIZE_ENDING = 21;
+io._State.CHUNKED_BODY_DONE_CR = 22;
+io._State.CHUNKED_BODY_DONE_LF = 23;
+io._State.BODY = 24;
+io._State.CLOSED = 25;
+io._State.UPGRADED = 26;
+io._State.FAILURE = 27;
+dart.defineLazy(io._State, {
+  get FIRST_BODY_STATE() {
+    return io._State.CHUNK_SIZE_STARTING_CR;
+  }
+});
+io._HttpVersion = class _HttpVersion extends core.Object {};
+dart.setSignature(io._HttpVersion, {
+  sfields: () => ({
+    UNDETERMINED: core.int,
+    HTTP10: core.int,
+    HTTP11: core.int
+  })
+});
+io._HttpVersion.UNDETERMINED = 0;
+io._HttpVersion.HTTP10 = 1;
+io._HttpVersion.HTTP11 = 2;
+io._MessageType = class _MessageType extends core.Object {};
+dart.setSignature(io._MessageType, {
+  sfields: () => ({
+    UNDETERMINED: core.int,
+    REQUEST: core.int,
+    RESPONSE: core.int
+  })
+});
+io._MessageType.UNDETERMINED = 0;
+io._MessageType.REQUEST = 1;
+io._MessageType.RESPONSE = 0;
+const _injectData = Symbol('_injectData');
+const _userOnData = Symbol('_userOnData');
+const _isCanceled$ = Symbol('_isCanceled');
+const _pauseCount$ = Symbol('_pauseCount');
+const _scheduled = Symbol('_scheduled');
+const _maybeScheduleData = Symbol('_maybeScheduleData');
+io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
+  new(subscription, injectData, userOnData) {
+    this[_subscription$] = subscription;
+    this[_injectData] = injectData;
+    this[_userOnData] = userOnData;
+    this[_isCanceled$] = false;
+    this[_pauseCount$] = 1;
+    this[_scheduled] = false;
+  }
+  get isPaused() {
+    return this[_subscription$].isPaused;
+  }
+  asFuture(T) {
+    return futureValue => {
+      if (futureValue === void 0) futureValue = null;
+      return this[_subscription$].asFuture(T)(futureValue);
+    };
+  }
+  cancel() {
+    this[_isCanceled$] = true;
+    this[_injectData] = null;
+    return this[_subscription$].cancel();
+  }
+  onData(handleData) {
+    this[_userOnData] = handleData;
+    this[_subscription$].onData(handleData);
+  }
+  onDone(handleDone) {
+    this[_subscription$].onDone(handleDone);
+  }
+  onError(handleError) {
+    this[_subscription$].onError(handleError);
+  }
+  pause(resumeSignal) {
+    if (resumeSignal === void 0) resumeSignal = null;
+    if (this[_injectData] == null) {
+      this[_subscription$].pause(resumeSignal);
+    } else {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
+      if (resumeSignal != null) {
+        resumeSignal.whenComplete(dart.bind(this, 'resume'));
+      }
+    }
+  }
+  resume() {
+    if (this[_injectData] == null) {
+      this[_subscription$].resume();
+    } else {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
+      this[_maybeScheduleData]();
+    }
+  }
+  [_maybeScheduleData]() {
+    if (dart.test(this[_scheduled])) return;
+    if (this[_pauseCount$] != 0) return;
+    this[_scheduled] = true;
+    async.scheduleMicrotask(dart.fn(() => {
+      this[_scheduled] = false;
+      if (dart.notNull(this[_pauseCount$]) > 0 || dart.test(this[_isCanceled$])) return;
+      let data = this[_injectData];
+      this[_injectData] = null;
+      this[_subscription$].resume();
+      if (this[_userOnData] != null) {
+        dart.dcall(this[_userOnData], data);
+      }
+    }, VoidToNull()));
+  }
+};
+io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
+dart.setSignature(io._HttpDetachedStreamSubscription, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
+  fields: () => ({
+    [_subscription$]: StreamSubscriptionOfListOfint(),
+    [_injectData]: ListOfint(),
+    [_isCanceled$]: core.bool,
+    [_pauseCount$]: core.int,
+    [_userOnData]: core.Function,
+    [_scheduled]: core.bool
+  }),
+  getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({
+    asFuture: dart.definiteFunctionType(T => [async.Future$(T), [], [T]]),
+    cancel: dart.definiteFunctionType(async.Future, []),
+    onData: dart.definiteFunctionType(dart.void, [ListOfintTovoid()]),
+    onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+    onError: dart.definiteFunctionType(dart.void, [core.Function]),
+    pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+    resume: dart.definiteFunctionType(dart.void, []),
+    [_maybeScheduleData]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+io._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
+  new(subscription, bufferedData) {
+    this.subscription = subscription;
+    this.bufferedData = bufferedData;
+    super.new();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    if (this.subscription != null) {
+      this.subscription.onData(onData);
+      this.subscription.onError(onError);
+      this.subscription.onDone(onDone);
+      if (this.bufferedData == null) {
+        return StreamSubscriptionOfListOfint()._check(((() => {
+          this.subscription.resume();
+          return this.subscription;
+        })()));
+      }
+      let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
+      _.resume();
+      return _;
+    } else {
+      return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }
+  }
+};
+dart.addSimpleTypeTests(io._HttpDetachedIncoming);
+dart.setSignature(io._HttpDetachedIncoming, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedIncoming, [async.StreamSubscription, ListOfint()])}),
+  fields: () => ({
+    subscription: async.StreamSubscription,
+    bufferedData: ListOfint()
+  }),
+  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+});
+const _method$ = Symbol('_method');
+const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
+const _headerField = Symbol('_headerField');
+const _headerValue = Symbol('_headerValue');
+const _requestParser = Symbol('_requestParser');
+const _parserCalled = Symbol('_parserCalled');
+const _index$2 = Symbol('_index');
+const _httpVersionIndex = Symbol('_httpVersionIndex');
+const _messageType = Symbol('_messageType');
+const _statusCodeLength = Symbol('_statusCodeLength');
+const _httpVersion = Symbol('_httpVersion');
+const _connectionUpgrade = Symbol('_connectionUpgrade');
+const _chunked = Symbol('_chunked');
+const _noMessageBody = Symbol('_noMessageBody');
+const _remainingContent = Symbol('_remainingContent');
+const _socketSubscription = Symbol('_socketSubscription');
+const _paused = Symbol('_paused');
+const _bodyPaused = Symbol('_bodyPaused');
+const _bodyController = Symbol('_bodyController');
+const _pauseStateChanged = Symbol('_pauseStateChanged');
+const _reset = Symbol('_reset');
+const _onData$ = Symbol('_onData');
+const _onDone$ = Symbol('_onDone');
+const _doParse = Symbol('_doParse');
+const _reportError = Symbol('_reportError');
+const _createIncoming = Symbol('_createIncoming');
+const _closeIncoming = Symbol('_closeIncoming');
+const _headersEnd = Symbol('_headersEnd');
+const _expect = Symbol('_expect');
+const _caseInsensitiveCompare = Symbol('_caseInsensitiveCompare');
+const _expectHexDigit = Symbol('_expectHexDigit');
+const _releaseBuffer = Symbol('_releaseBuffer');
+io._HttpParser = class _HttpParser extends async.Stream$(io._HttpIncoming) {
+  static requestParser() {
+    return new io._HttpParser._(true);
+  }
+  static responseParser() {
+    return new io._HttpParser._(false);
+  }
+  _(requestParser) {
+    this[_method$] = JSArrayOfint().of([]);
+    this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
+    this[_headerField] = JSArrayOfint().of([]);
+    this[_headerValue] = JSArrayOfint().of([]);
+    this[_requestParser] = requestParser;
+    this[_parserCalled] = false;
+    this[_buffer$] = null;
+    this[_index$2] = null;
+    this[_state$1] = null;
+    this[_httpVersionIndex] = null;
+    this[_messageType] = null;
+    this[_statusCode] = 0;
+    this[_statusCodeLength] = 0;
+    this[_httpVersion] = null;
+    this[_transferLength] = -1;
+    this[_persistentConnection] = null;
+    this[_connectionUpgrade] = null;
+    this[_chunked] = null;
+    this[_noMessageBody] = false;
+    this[_remainingContent] = -1;
+    this[_headers] = null;
+    this[_incoming] = null;
+    this[_socketSubscription] = null;
+    this[_paused] = true;
+    this[_bodyPaused] = false;
+    this[_controller$0] = null;
+    this[_bodyController] = null;
+    super.new();
+    this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
+        this[_paused] = false;
+      }, VoidToNull()), onPause: dart.fn(() => {
+        this[_paused] = true;
+        this[_pauseStateChanged]();
+      }, VoidToNull()), onResume: dart.fn(() => {
+        this[_paused] = false;
+        this[_pauseStateChanged]();
+      }, VoidToNull()), onCancel: dart.fn(() => {
+        if (this[_socketSubscription] != null) {
+          this[_socketSubscription].cancel();
+        }
+      }, VoidToNull())});
+    this[_reset]();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  listenToStream(stream) {
+    this[_socketSubscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this, _onDone$)});
+  }
+  [_parse]() {
+    try {
+      this[_doParse]();
+    } catch (e) {
+      let s = dart.stackTrace(e);
+      this[_state$1] = io._State.FAILURE;
+      this[_reportError](e, s);
+    }
+
+  }
+  [_headersEnd]() {
+    this[_headers][_mutable] = false;
+    this[_transferLength] = this[_headers].contentLength;
+    if (dart.test(this[_chunked])) this[_transferLength] = -1;
+    if (this[_messageType] == io._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] == false) {
+      this[_transferLength] = 0;
+    }
+    if (dart.test(this[_connectionUpgrade])) {
+      this[_state$1] = io._State.UPGRADED;
+      this[_transferLength] = 0;
+    }
+    this[_createIncoming](this[_transferLength]);
+    if (dart.test(this[_requestParser])) {
+      this[_incoming].method = core.String.fromCharCodes(this[_method$]);
+      this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
+    } else {
+      this[_incoming].statusCode = this[_statusCode];
+      this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
+    }
+    this[_method$][dartx.clear]();
+    this[_uri_or_reason_phrase][dartx.clear]();
+    if (dart.test(this[_connectionUpgrade])) {
+      this[_incoming].upgraded = true;
+      this[_parserCalled] = false;
+      let tmp = this[_incoming];
+      this[_closeIncoming]();
+      this[_controller$0].add(tmp);
+      return true;
+    }
+    if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
+      this[_reset]();
+      let tmp = this[_incoming];
+      this[_closeIncoming]();
+      this[_controller$0].add(tmp);
+      return false;
+    } else if (dart.test(this[_chunked])) {
+      this[_state$1] = io._State.CHUNK_SIZE;
+      this[_remainingContent] = 0;
+    } else if (dart.notNull(this[_transferLength]) > 0) {
+      this[_remainingContent] = this[_transferLength];
+      this[_state$1] = io._State.BODY;
+    } else {
+      this[_state$1] = io._State.BODY;
+    }
+    this[_parserCalled] = false;
+    this[_controller$0].add(this[_incoming]);
+    return true;
+  }
+  [_doParse]() {
+    dart.assert(!dart.test(this[_parserCalled]));
+    this[_parserCalled] = true;
+    if (this[_state$1] == io._State.CLOSED) {
+      dart.throw(new io.HttpException("Data on closed connection"));
+    }
+    if (this[_state$1] == io._State.FAILURE) {
+      dart.throw(new io.HttpException("Data on failed connection"));
+    }
+    while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
+      if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
+        this[_parserCalled] = false;
         return;
       }
-      if (this[_arguments$] == null) {
-        this[_arguments$] = dart.map();
-      }
-      this[_arguments$][dartx.addAll](arguments$);
-    }
-  };
-  dart.defineNamedConstructor(developer._SyncBlock, '_');
-  dart.setSignature(developer._SyncBlock, {
-    constructors: () => ({_: dart.definiteFunctionType(developer._SyncBlock, [core.String, core.int, core.int])}),
-    fields: () => ({
-      category: core.String,
-      name: core.String,
-      [_arguments$]: core.Map,
-      [_start$1]: core.int,
-      [_startCpu]: core.int
-    }),
-    methods: () => ({
-      finish: dart.definiteFunctionType(dart.void, []),
-      [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
-    })
-  });
-  developer._fastPathArguments = null;
-  developer._argumentsAsJson = function(arguments$) {
-    if (arguments$ == null || arguments$[dartx.length] == 0) {
-      if (developer._fastPathArguments == null) {
-        developer._fastPathArguments = dart.str`{"isolateNumber":"${developer.Timeline._isolateId}"}`;
-      }
-      return developer._fastPathArguments;
-    }
-    arguments$[dartx._set]('isolateNumber', developer.Timeline._isolateIdString);
-    return convert.JSON.encode(arguments$);
-  };
-  dart.fn(developer._argumentsAsJson, MapToString());
-  developer._isDartStreamEnabled = function() {
-    return false;
-  };
-  dart.fn(developer._isDartStreamEnabled, VoidTobool());
-  developer._getNextAsyncId = function() {
-    return 0;
-  };
-  dart.fn(developer._getNextAsyncId, VoidToint());
-  developer._getTraceClock = function() {
-    let x = developer._clockValue;
-    developer._clockValue = dart.notNull(x) + 1;
-    return x;
-  };
-  dart.fn(developer._getTraceClock, VoidToint());
-  developer._getThreadCpuClock = function() {
-    return -1;
-  };
-  dart.fn(developer._getThreadCpuClock, VoidToint());
-  developer._getIsolateNum = function() {
-    return 0;
-  };
-  dart.fn(developer._getIsolateNum, VoidToint());
-  developer._reportTaskEvent = function(start, taskId, phase, category, name, argumentsAsJson) {
-  };
-  dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
-  developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
-  };
-  dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
-  developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
-  };
-  dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
-  developer.ServiceProtocolInfo = class ServiceProtocolInfo extends core.Object {
-    new(serverUri) {
-      this.majorVersion = developer._getServiceMajorVersion();
-      this.minorVersion = developer._getServiceMinorVersion();
-      this.serverUri = serverUri;
-    }
-    toString() {
-      if (this.serverUri != null) {
-        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion} ` + dart.str`listening on ${this.serverUri}`;
-      } else {
-        return dart.str`Dart VM Service Protocol v${this.majorVersion}.${this.minorVersion}`;
-      }
-    }
-  };
-  dart.setSignature(developer.ServiceProtocolInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(developer.ServiceProtocolInfo, [core.Uri])}),
-    fields: () => ({
-      majorVersion: core.int,
-      minorVersion: core.int,
-      serverUri: core.Uri
-    })
-  });
-  developer.Service = class Service extends core.Object {
-    static getInfo() {
-      return dart.async(function*() {
-        let receivePort = isolate.RawReceivePort.new();
-        let uriCompleter = CompleterOfUri().new();
-        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
-        developer._getServerInfo(receivePort.sendPort);
-        let uri = (yield uriCompleter.future);
-        receivePort.close();
-        return new developer.ServiceProtocolInfo(uri);
-      }, developer.ServiceProtocolInfo);
-    }
-    static controlWebServer(opts) {
-      return dart.async(function*(opts) {
-        let enable = opts && 'enable' in opts ? opts.enable : false;
-        if (!(typeof enable == 'boolean')) {
-          dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
+      let byte = this[_buffer$][dartx._get]((() => {
+        let x = this[_index$2];
+        this[_index$2] = dart.notNull(x) + 1;
+        return x;
+      })());
+      switch (this[_state$1]) {
+        case io._State.START:
+        {
+          if (byte == io._Const.HTTP[dartx._get](0)) {
+            this[_httpVersionIndex] = 1;
+            this[_state$1] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
+          } else {
+            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
+              dart.throw(new io.HttpException("Invalid request method"));
+            }
+            this[_method$][dartx.add](byte);
+            if (!dart.test(this[_requestParser])) {
+              dart.throw(new io.HttpException("Invalid response line"));
+            }
+            this[_state$1] = io._State.REQUEST_LINE_METHOD;
+          }
+          break;
         }
-        let receivePort = isolate.RawReceivePort.new();
-        let uriCompleter = CompleterOfUri().new();
-        receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
-        developer._webServerControl(receivePort.sendPort, enable);
-        let uri = (yield uriCompleter.future);
-        receivePort.close();
-        return new developer.ServiceProtocolInfo(uri);
-      }, developer.ServiceProtocolInfo, opts);
-    }
-  };
-  dart.setSignature(developer.Service, {
-    statics: () => ({
-      getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
-      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
-    }),
-    names: ['getInfo', 'controlWebServer']
-  });
-  developer._getServerInfo = function(sp) {
-    sp.send(null);
-  };
-  dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
-  developer._webServerControl = function(sp, enable) {
-    sp.send(null);
-  };
-  dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
-  developer._getServiceMajorVersion = function() {
-    return 0;
-  };
-  dart.fn(developer._getServiceMajorVersion, VoidToint());
-  developer._getServiceMinorVersion = function() {
-    return 0;
-  };
-  dart.fn(developer._getServiceMinorVersion, VoidToint());
-  io.BytesBuilder = class BytesBuilder extends core.Object {
-    static new(opts) {
-      let copy = opts && 'copy' in opts ? opts.copy : true;
-      if (dart.test(copy)) {
-        return new io._CopyingBytesBuilder();
-      } else {
-        return new io._BytesBuilder();
-      }
-    }
-  };
-  dart.setSignature(io.BytesBuilder, {
-    constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
-  });
-  const _length$2 = Symbol('_length');
-  const _buffer$ = Symbol('_buffer');
-  const _pow2roundup = Symbol('_pow2roundup');
-  io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
-    new() {
-      this[_length$2] = 0;
-      this[_buffer$] = null;
-    }
-    add(bytes) {
-      let bytesLength = bytes[dartx.length];
-      if (bytesLength == 0) return;
-      let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
-      if (this[_buffer$] == null) {
-        let size = this[_pow2roundup](required);
-        size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-        this[_buffer$] = typed_data.Uint8List.new(size);
-      } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
-        let size = dart.notNull(this[_pow2roundup](required)) * 2;
-        let newBuffer = typed_data.Uint8List.new(size);
-        newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
-        this[_buffer$] = newBuffer;
-      }
-      dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
-      if (typed_data.Uint8List.is(bytes)) {
-        this[_buffer$][dartx.setRange](this[_length$2], required, bytes);
-      } else {
-        for (let i = 0; i < dart.notNull(bytesLength); i++) {
-          this[_buffer$][dartx._set](dart.notNull(this[_length$2]) + i, bytes[dartx._get](i));
+        case io._State.METHOD_OR_RESPONSE_HTTP_VERSION:
+        {
+          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP[dartx.length]) && byte == io._Const.HTTP[dartx._get](this[_httpVersionIndex])) {
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+          } else if (this[_httpVersionIndex] == io._Const.HTTP[dartx.length] && byte == io._CharCode.SLASH) {
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+            if (dart.test(this[_requestParser])) {
+              dart.throw(new io.HttpException("Invalid request line"));
+            }
+            this[_state$1] = io._State.RESPONSE_HTTP_VERSION;
+          } else {
+            for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
+              this[_method$][dartx.add](io._Const.HTTP[dartx._get](i));
+            }
+            if (byte == io._CharCode.SP) {
+              this[_state$1] = io._State.REQUEST_LINE_URI;
+            } else {
+              this[_method$][dartx.add](byte);
+              this[_httpVersion] = io._HttpVersion.UNDETERMINED;
+              if (!dart.test(this[_requestParser])) {
+                dart.throw(new io.HttpException("Invalid response line"));
+              }
+              this[_state$1] = io._State.REQUEST_LINE_METHOD;
+            }
+          }
+          break;
+        }
+        case io._State.RESPONSE_HTTP_VERSION:
+        {
+          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
+            this[_expect](byte, io._Const.HTTP1DOT[dartx._get](this[_httpVersionIndex]));
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ONE) {
+            this[_httpVersion] = io._HttpVersion.HTTP11;
+            this[_persistentConnection] = true;
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ZERO) {
+            this[_httpVersion] = io._HttpVersion.HTTP10;
+            this[_persistentConnection] = false;
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+          } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
+            this[_expect](byte, io._CharCode.SP);
+            this[_state$1] = io._State.RESPONSE_LINE_STATUS_CODE;
+          } else {
+            dart.throw(new io.HttpException("Invalid response line"));
+          }
+          break;
+        }
+        case io._State.REQUEST_LINE_METHOD:
+        {
+          if (byte == io._CharCode.SP) {
+            this[_state$1] = io._State.REQUEST_LINE_URI;
+          } else {
+            if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
+              dart.throw(new io.HttpException("Invalid request method"));
+            }
+            this[_method$][dartx.add](byte);
+          }
+          break;
+        }
+        case io._State.REQUEST_LINE_URI:
+        {
+          if (byte == io._CharCode.SP) {
+            if (this[_uri_or_reason_phrase][dartx.length] == 0) {
+              dart.throw(new io.HttpException("Invalid request URI"));
+            }
+            this[_state$1] = io._State.REQUEST_LINE_HTTP_VERSION;
+            this[_httpVersionIndex] = 0;
+          } else {
+            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
+              dart.throw(new io.HttpException("Invalid request URI"));
+            }
+            this[_uri_or_reason_phrase][dartx.add](byte);
+          }
+          break;
+        }
+        case io._State.REQUEST_LINE_HTTP_VERSION:
+        {
+          if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
+            this[_expect](byte, io._Const.HTTP11[dartx._get](this[_httpVersionIndex]));
+            this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+          } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length]) {
+            if (byte == io._CharCode.ONE) {
+              this[_httpVersion] = io._HttpVersion.HTTP11;
+              this[_persistentConnection] = true;
+              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+            } else if (byte == io._CharCode.ZERO) {
+              this[_httpVersion] = io._HttpVersion.HTTP10;
+              this[_persistentConnection] = false;
+              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
+            } else {
+              dart.throw(new io.HttpException("Invalid response line"));
+            }
+          } else {
+            if (byte == io._CharCode.CR) {
+              this[_state$1] = io._State.REQUEST_LINE_ENDING;
+            } else {
+              this[_expect](byte, io._CharCode.LF);
+              this[_messageType] = io._MessageType.REQUEST;
+              this[_state$1] = io._State.HEADER_START;
+            }
+          }
+          break;
+        }
+        case io._State.REQUEST_LINE_ENDING:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          this[_messageType] = io._MessageType.REQUEST;
+          this[_state$1] = io._State.HEADER_START;
+          break;
+        }
+        case io._State.RESPONSE_LINE_STATUS_CODE:
+        {
+          if (byte == io._CharCode.SP) {
+            this[_state$1] = io._State.RESPONSE_LINE_REASON_PHRASE;
+          } else if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
+          } else {
+            this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
+            if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
+              dart.throw(new io.HttpException("Invalid response status code"));
+            } else {
+              this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
+            }
+          }
+          break;
+        }
+        case io._State.RESPONSE_LINE_REASON_PHRASE:
+        {
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
+          } else {
+            if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
+              dart.throw(new io.HttpException("Invalid response reason phrase"));
+            }
+            this[_uri_or_reason_phrase][dartx.add](byte);
+          }
+          break;
+        }
+        case io._State.RESPONSE_LINE_ENDING:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          this[_messageType] == io._MessageType.RESPONSE;
+          if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
+            dart.throw(new io.HttpException("Invalid response status code"));
+          } else {
+            if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] == 204 || this[_statusCode] == 304) {
+              this[_noMessageBody] = true;
+            }
+          }
+          this[_state$1] = io._State.HEADER_START;
+          break;
+        }
+        case io._State.HEADER_START:
+        {
+          this[_headers] = new io._HttpHeaders(this.version);
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.HEADER_ENDING;
+          } else if (byte == io._CharCode.LF) {
+            this[_state$1] = io._State.HEADER_ENDING;
+            this[_index$2] = dart.notNull(this[_index$2]) - 1;
+          } else {
+            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
+            this[_state$1] = io._State.HEADER_FIELD;
+          }
+          break;
+        }
+        case io._State.HEADER_FIELD:
+        {
+          if (byte == io._CharCode.COLON) {
+            this[_state$1] = io._State.HEADER_VALUE_START;
+          } else {
+            if (!dart.test(io._HttpParser._isTokenChar(byte))) {
+              dart.throw(new io.HttpException("Invalid header field name"));
+            }
+            this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
+          }
+          break;
+        }
+        case io._State.HEADER_VALUE_START:
+        {
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
+          } else if (byte == io._CharCode.LF) {
+            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
+          } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
+            this[_headerValue][dartx.add](byte);
+            this[_state$1] = io._State.HEADER_VALUE;
+          }
+          break;
+        }
+        case io._State.HEADER_VALUE:
+        {
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
+          } else if (byte == io._CharCode.LF) {
+            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
+          } else {
+            this[_headerValue][dartx.add](byte);
+          }
+          break;
+        }
+        case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
+          break;
+        }
+        case io._State.HEADER_VALUE_FOLD_OR_END:
+        {
+          if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
+            this[_state$1] = io._State.HEADER_VALUE_START;
+          } else {
+            let headerField = core.String.fromCharCodes(this[_headerField]);
+            let headerValue = core.String.fromCharCodes(this[_headerValue]);
+            if (headerField == "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[dartx.codeUnits], this[_headerValue]))) {
+              this[_chunked] = true;
+            }
+            if (headerField == "connection") {
+              let tokens = io._HttpParser._tokenizeFieldValue(headerValue);
+              for (let i = 0; i < dart.notNull(tokens[dartx.length]); i++) {
+                if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
+                  this[_connectionUpgrade] = true;
+                }
+                this[_headers][_add$2](headerField, tokens[dartx._get](i));
+              }
+            } else {
+              this[_headers][_add$2](headerField, headerValue);
+            }
+            this[_headerField][dartx.clear]();
+            this[_headerValue][dartx.clear]();
+            if (byte == io._CharCode.CR) {
+              this[_state$1] = io._State.HEADER_ENDING;
+            } else if (byte == io._CharCode.LF) {
+              this[_state$1] = io._State.HEADER_ENDING;
+              this[_index$2] = dart.notNull(this[_index$2]) - 1;
+            } else {
+              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
+              this[_state$1] = io._State.HEADER_FIELD;
+            }
+          }
+          break;
+        }
+        case io._State.HEADER_ENDING:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          if (dart.test(this[_headersEnd]())) {
+            return;
+          } else {
+            break;
+          }
+          return;
+        }
+        case io._State.CHUNK_SIZE_STARTING_CR:
+        {
+          this[_expect](byte, io._CharCode.CR);
+          this[_state$1] = io._State.CHUNK_SIZE_STARTING_LF;
+          break;
+        }
+        case io._State.CHUNK_SIZE_STARTING_LF:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          this[_state$1] = io._State.CHUNK_SIZE;
+          break;
+        }
+        case io._State.CHUNK_SIZE:
+        {
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
+          } else if (byte == io._CharCode.SEMI_COLON) {
+            this[_state$1] = io._State.CHUNK_SIZE_EXTENSION;
+          } else {
+            let value = this[_expectHexDigit](byte);
+            this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
+          }
+          break;
+        }
+        case io._State.CHUNK_SIZE_EXTENSION:
+        {
+          if (byte == io._CharCode.CR) {
+            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
+          }
+          break;
+        }
+        case io._State.CHUNK_SIZE_ENDING:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          if (dart.notNull(this[_remainingContent]) > 0) {
+            this[_state$1] = io._State.BODY;
+          } else {
+            this[_state$1] = io._State.CHUNKED_BODY_DONE_CR;
+          }
+          break;
+        }
+        case io._State.CHUNKED_BODY_DONE_CR:
+        {
+          this[_expect](byte, io._CharCode.CR);
+          this[_state$1] = io._State.CHUNKED_BODY_DONE_LF;
+          break;
+        }
+        case io._State.CHUNKED_BODY_DONE_LF:
+        {
+          this[_expect](byte, io._CharCode.LF);
+          this[_reset]();
+          this[_closeIncoming]();
+          break;
+        }
+        case io._State.BODY:
+        {
+          this[_index$2] = dart.notNull(this[_index$2]) - 1;
+          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
+          if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
+            dataAvailable = this[_remainingContent];
+          }
+          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
+          this[_bodyController].add(data);
+          if (this[_remainingContent] != -1) {
+            this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
+          }
+          this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
+          if (this[_remainingContent] == 0) {
+            if (!dart.test(this[_chunked])) {
+              this[_reset]();
+              this[_closeIncoming]();
+            } else {
+              this[_state$1] = io._State.CHUNK_SIZE_STARTING_CR;
+            }
+          }
+          break;
+        }
+        case io._State.FAILURE:
+        {
+          dart.assert(false);
+          break;
+        }
+        default:
+        {
+          dart.assert(false);
+          break;
         }
       }
-      this[_length$2] = required;
     }
-    addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
-    }
-    takeBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
-      let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
-      this.clear();
-      return buffer;
-    }
-    toBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
-      return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
-    }
-    get length() {
-      return this[_length$2];
-    }
-    get isEmpty() {
-      return this[_length$2] == 0;
-    }
-    get isNotEmpty() {
-      return this[_length$2] != 0;
-    }
-    clear() {
-      this[_length$2] = 0;
-      this[_buffer$] = null;
-    }
-    [_pow2roundup](x) {
-      x = dart.notNull(x) - 1;
-      x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
-      x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
-      x = (dart.notNull(x) | x[dartx['>>']](4)) >>> 0;
-      x = (dart.notNull(x) | x[dartx['>>']](8)) >>> 0;
-      x = (dart.notNull(x) | x[dartx['>>']](16)) >>> 0;
-      return dart.notNull(x) + 1;
-    }
-  };
-  io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
-  dart.setSignature(io._CopyingBytesBuilder, {
-    fields: () => ({
-      [_length$2]: core.int,
-      [_buffer$]: typed_data.Uint8List
-    }),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addByte: dart.definiteFunctionType(dart.void, [core.int]),
-      takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      clear: dart.definiteFunctionType(dart.void, []),
-      [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
-    }),
-    sfields: () => ({_INIT_SIZE: core.int})
-  });
-  io._CopyingBytesBuilder._INIT_SIZE = 1024;
-  const _chunks = Symbol('_chunks');
-  io._BytesBuilder = class _BytesBuilder extends core.Object {
-    new() {
-      this[_chunks] = JSArrayOfListOfint().of([]);
-      this[_length$2] = 0;
-    }
-    add(bytes) {
-      if (!typed_data.Uint8List.is(bytes)) {
-        bytes = typed_data.Uint8List.fromList(bytes);
+    this[_parserCalled] = false;
+    if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
+      this[_releaseBuffer]();
+      if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
+        this[_socketSubscription].resume();
       }
-      this[_chunks][dartx.add](bytes);
-      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
     }
-    addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
-    }
-    takeBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
-      if (this[_chunks][dartx.length] == 1) {
-        let buffer = this[_chunks][dartx.single];
-        this.clear();
-        return buffer;
+  }
+  [_onData$](buffer) {
+    this[_socketSubscription].pause();
+    dart.assert(this[_buffer$] == null);
+    this[_buffer$] = typed_data.Uint8List._check(buffer);
+    this[_index$2] = 0;
+    this[_parse]();
+  }
+  [_onDone$]() {
+    this[_socketSubscription] = null;
+    if (this[_state$1] == io._State.CLOSED || this[_state$1] == io._State.FAILURE) return;
+    if (this[_incoming] != null) {
+      if (this[_state$1] != io._State.UPGRADED && !(this[_state$1] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
+        this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
       }
-      let buffer = typed_data.Uint8List.new(this[_length$2]);
-      let offset = 0;
-      for (let chunk of this[_chunks]) {
-        buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
-        offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
+      this[_closeIncoming](true);
+      this[_controller$0].close();
+      return;
+    }
+    if (this[_state$1] == io._State.START) {
+      if (!dart.test(this[_requestParser])) {
+        this[_reportError](new io.HttpException("Connection closed before full header was received"));
       }
-      this.clear();
-      return buffer;
+      this[_controller$0].close();
+      return;
     }
-    toBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
-      let buffer = typed_data.Uint8List.new(this[_length$2]);
-      let offset = 0;
-      for (let chunk of this[_chunks]) {
-        buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
-        offset = dart.notNull(offset) + dart.notNull(chunk[dartx.length]);
+    if (this[_state$1] == io._State.UPGRADED) {
+      this[_controller$0].close();
+      return;
+    }
+    if (dart.notNull(this[_state$1]) < io._State.FIRST_BODY_STATE) {
+      this[_state$1] = io._State.FAILURE;
+      this[_reportError](new io.HttpException("Connection closed before full header was received"));
+      this[_controller$0].close();
+      return;
+    }
+    if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
+      this[_state$1] = io._State.CLOSED;
+    } else {
+      this[_state$1] = io._State.FAILURE;
+      this[_reportError](new io.HttpException("Connection closed before full body was received"));
+    }
+    this[_controller$0].close();
+  }
+  get version() {
+    switch (this[_httpVersion]) {
+      case io._HttpVersion.HTTP10:
+      {
+        return "1.0";
       }
-      return buffer;
+      case io._HttpVersion.HTTP11:
+      {
+        return "1.1";
+      }
     }
-    get length() {
-      return this[_length$2];
+    return null;
+  }
+  get messageType() {
+    return this[_messageType];
+  }
+  get transferLength() {
+    return this[_transferLength];
+  }
+  get upgrade() {
+    return dart.test(this[_connectionUpgrade]) && this[_state$1] == io._State.UPGRADED;
+  }
+  get persistentConnection() {
+    return this[_persistentConnection];
+  }
+  set isHead(value) {
+    if (dart.test(value)) this[_noMessageBody] = true;
+  }
+  detachIncoming() {
+    this[_state$1] = io._State.UPGRADED;
+    return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
+  }
+  readUnparsedData() {
+    if (this[_buffer$] == null) return null;
+    if (this[_index$2] == this[_buffer$][dartx.length]) return null;
+    let result = this[_buffer$][dartx.sublist](this[_index$2]);
+    this[_releaseBuffer]();
+    return result;
+  }
+  [_reset]() {
+    if (this[_state$1] == io._State.UPGRADED) return;
+    this[_state$1] = io._State.START;
+    this[_messageType] = io._MessageType.UNDETERMINED;
+    this[_headerField][dartx.clear]();
+    this[_headerValue][dartx.clear]();
+    this[_method$][dartx.clear]();
+    this[_uri_or_reason_phrase][dartx.clear]();
+    this[_statusCode] = 0;
+    this[_statusCodeLength] = 0;
+    this[_httpVersion] = io._HttpVersion.UNDETERMINED;
+    this[_transferLength] = -1;
+    this[_persistentConnection] = false;
+    this[_connectionUpgrade] = false;
+    this[_chunked] = false;
+    this[_noMessageBody] = false;
+    this[_remainingContent] = -1;
+    this[_headers] = null;
+  }
+  [_releaseBuffer]() {
+    this[_buffer$] = null;
+    this[_index$2] = null;
+  }
+  static _isTokenChar(byte) {
+    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
+  }
+  static _isValueChar(byte) {
+    return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte == io._CharCode.SP || byte == io._CharCode.HT;
+  }
+  static _tokenizeFieldValue(headerValue) {
+    let tokens = ListOfString().new();
+    let start = 0;
+    let index = 0;
+    while (index < dart.notNull(headerValue[dartx.length])) {
+      if (headerValue[dartx._get](index) == ",") {
+        tokens[dartx.add](headerValue[dartx.substring](start, index));
+        start = index + 1;
+      } else if (headerValue[dartx._get](index) == " " || headerValue[dartx._get](index) == "\t") {
+        start++;
+      }
+      index++;
     }
-    get isEmpty() {
-      return this[_length$2] == 0;
+    tokens[dartx.add](headerValue[dartx.substring](start, index));
+    return tokens;
+  }
+  static _toLowerCaseByte(x) {
+    return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
+  }
+  [_caseInsensitiveCompare](expected, value) {
+    if (expected[dartx.length] != value[dartx.length]) return false;
+    for (let i = 0; i < dart.notNull(expected[dartx.length]); i++) {
+      if (expected[dartx._get](i) != io._HttpParser._toLowerCaseByte(value[dartx._get](i))) return false;
     }
-    get isNotEmpty() {
-      return this[_length$2] != 0;
+    return true;
+  }
+  [_expect](val1, val2) {
+    if (val1 != val2) {
+      dart.throw(new io.HttpException("Failed to parse HTTP"));
     }
-    clear() {
-      this[_length$2] = 0;
-      this[_chunks][dartx.clear]();
+  }
+  [_expectHexDigit](byte) {
+    if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
+      return dart.notNull(byte) - 48;
+    } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
+      return dart.notNull(byte) - 65 + 10;
+    } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
+      return dart.notNull(byte) - 97 + 10;
+    } else {
+      dart.throw(new io.HttpException("Failed to parse HTTP"));
     }
-  };
-  io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
-  dart.setSignature(io._BytesBuilder, {
-    fields: () => ({
-      [_length$2]: core.int,
-      [_chunks]: ListOfListOfint()
-    }),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addByte: dart.definiteFunctionType(dart.void, [core.int]),
-      takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      clear: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  io._SUCCESS_RESPONSE = 0;
-  io._ILLEGAL_ARGUMENT_RESPONSE = 1;
-  io._OSERROR_RESPONSE = 2;
-  io._FILE_CLOSED_RESPONSE = 3;
-  io._ERROR_RESPONSE_ERROR_TYPE = 0;
-  io._OSERROR_RESPONSE_ERROR_CODE = 1;
-  io._OSERROR_RESPONSE_MESSAGE = 2;
-  io._isErrorResponse = function(response) {
+  }
+  [_createIncoming](transferLength) {
+    dart.assert(this[_incoming] == null);
+    dart.assert(this[_bodyController] == null);
+    dart.assert(!dart.test(this[_bodyPaused]));
+    let incoming = null;
+    this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
+        if (!dart.equals(incoming, this[_incoming])) return;
+        dart.assert(this[_bodyPaused]);
+        this[_bodyPaused] = false;
+        this[_pauseStateChanged]();
+      }, VoidToNull()), onPause: dart.fn(() => {
+        if (!dart.equals(incoming, this[_incoming])) return;
+        dart.assert(!dart.test(this[_bodyPaused]));
+        this[_bodyPaused] = true;
+        this[_pauseStateChanged]();
+      }, VoidToNull()), onResume: dart.fn(() => {
+        if (!dart.equals(incoming, this[_incoming])) return;
+        dart.assert(this[_bodyPaused]);
+        this[_bodyPaused] = false;
+        this[_pauseStateChanged]();
+      }, VoidToNull()), onCancel: dart.fn(() => {
+        if (!dart.equals(incoming, this[_incoming])) return;
+        if (this[_socketSubscription] != null) {
+          this[_socketSubscription].cancel();
+        }
+        this[_closeIncoming](true);
+        this[_controller$0].close();
+      }, VoidToNull())});
+    incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
+    this[_bodyPaused] = true;
+    this[_pauseStateChanged]();
+  }
+  [_closeIncoming](closing) {
+    if (closing === void 0) closing = false;
+    if (this[_incoming] == null) return;
+    let tmp = this[_incoming];
+    tmp.close(closing);
+    this[_incoming] = null;
+    if (this[_bodyController] != null) {
+      this[_bodyController].close();
+      this[_bodyController] = null;
+    }
+    this[_bodyPaused] = false;
+    this[_pauseStateChanged]();
+  }
+  [_pauseStateChanged]() {
+    if (this[_incoming] != null) {
+      if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
+        this[_parse]();
+      }
+    } else {
+      if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
+        this[_parse]();
+      }
+    }
+  }
+  [_reportError](error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
+    this[_state$1] = io._State.FAILURE;
+    this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
+    this[_controller$0].close();
+  }
+};
+dart.addSimpleTypeTests(io._HttpParser);
+dart.defineNamedConstructor(io._HttpParser, '_');
+dart.setSignature(io._HttpParser, {
+  constructors: () => ({
+    requestParser: dart.definiteFunctionType(io._HttpParser, []),
+    responseParser: dart.definiteFunctionType(io._HttpParser, []),
+    _: dart.definiteFunctionType(io._HttpParser, [core.bool])
+  }),
+  fields: () => ({
+    [_parserCalled]: core.bool,
+    [_buffer$]: typed_data.Uint8List,
+    [_index$2]: core.int,
+    [_requestParser]: core.bool,
+    [_state$1]: core.int,
+    [_httpVersionIndex]: core.int,
+    [_messageType]: core.int,
+    [_statusCode]: core.int,
+    [_statusCodeLength]: core.int,
+    [_method$]: ListOfint(),
+    [_uri_or_reason_phrase]: ListOfint(),
+    [_headerField]: ListOfint(),
+    [_headerValue]: ListOfint(),
+    [_httpVersion]: core.int,
+    [_transferLength]: core.int,
+    [_persistentConnection]: core.bool,
+    [_connectionUpgrade]: core.bool,
+    [_chunked]: core.bool,
+    [_noMessageBody]: core.bool,
+    [_remainingContent]: core.int,
+    [_headers]: io._HttpHeaders,
+    [_incoming]: io._HttpIncoming,
+    [_socketSubscription]: async.StreamSubscription,
+    [_paused]: core.bool,
+    [_bodyPaused]: core.bool,
+    [_controller$0]: StreamControllerOf_HttpIncoming(),
+    [_bodyController]: StreamControllerOfListOfint()
+  }),
+  getters: () => ({
+    version: dart.definiteFunctionType(core.String, []),
+    messageType: dart.definiteFunctionType(core.int, []),
+    transferLength: dart.definiteFunctionType(core.int, []),
+    upgrade: dart.definiteFunctionType(core.bool, []),
+    persistentConnection: dart.definiteFunctionType(core.bool, [])
+  }),
+  setters: () => ({isHead: dart.definiteFunctionType(dart.void, [core.bool])}),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(io._HttpIncoming), [_HttpIncomingTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    listenToStream: dart.definiteFunctionType(dart.void, [StreamOfListOfint()]),
+    [_parse]: dart.definiteFunctionType(dart.void, []),
+    [_headersEnd]: dart.definiteFunctionType(core.bool, []),
+    [_doParse]: dart.definiteFunctionType(dart.void, []),
+    [_onData$]: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    [_onDone$]: dart.definiteFunctionType(dart.void, []),
+    detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
+    readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
+    [_reset]: dart.definiteFunctionType(dart.void, []),
+    [_releaseBuffer]: dart.definiteFunctionType(dart.void, []),
+    [_caseInsensitiveCompare]: dart.definiteFunctionType(core.bool, [ListOfint(), ListOfint()]),
+    [_expect]: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    [_expectHexDigit]: dart.definiteFunctionType(core.int, [core.int]),
+    [_createIncoming]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_closeIncoming]: dart.definiteFunctionType(dart.void, [], [core.bool]),
+    [_pauseStateChanged]: dart.definiteFunctionType(dart.void, []),
+    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic])
+  }),
+  statics: () => ({
+    _isTokenChar: dart.definiteFunctionType(core.bool, [core.int]),
+    _isValueChar: dart.definiteFunctionType(core.bool, [core.int]),
+    _tokenizeFieldValue: dart.definiteFunctionType(core.List$(core.String), [core.String]),
+    _toLowerCaseByte: dart.definiteFunctionType(core.int, [core.int])
+  }),
+  names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
+});
+io._DART_SESSION_ID = "DARTSESSID";
+const _data$ = Symbol('_data');
+const _lastSeen = Symbol('_lastSeen');
+const _timeoutCallback = Symbol('_timeoutCallback');
+const _prev = Symbol('_prev');
+const _next$1 = Symbol('_next');
+const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
+const _sessions = Symbol('_sessions');
+const _bumpToEnd = Symbol('_bumpToEnd');
+io._HttpSession = class _HttpSession extends core.Object {
+  new(sessionManager, id) {
+    this[_data$] = collection.HashMap.new();
+    this[_sessionManager] = sessionManager;
+    this.id = id;
+    this[_lastSeen] = new core.DateTime.now();
+    this[_destroyed] = false;
+    this[_isNew] = true;
+    this[_timeoutCallback] = null;
+    this[_prev] = null;
+    this[_next$1] = null;
+  }
+  destroy() {
+    this[_destroyed] = true;
+    this[_sessionManager][_removeFromTimeoutQueue](this);
+    this[_sessionManager][_sessions][dartx.remove](this.id);
+  }
+  [_markSeen]() {
+    this[_lastSeen] = new core.DateTime.now();
+    this[_sessionManager][_bumpToEnd](this);
+  }
+  get lastSeen() {
+    return this[_lastSeen];
+  }
+  get isNew() {
+    return this[_isNew];
+  }
+  set onTimeout(callback) {
+    this[_timeoutCallback] = callback;
+  }
+  containsValue(value) {
+    return this[_data$][dartx.containsValue](value);
+  }
+  containsKey(key) {
+    return this[_data$][dartx.containsKey](key);
+  }
+  _get(key) {
+    return this[_data$][dartx._get](key);
+  }
+  _set(key, value) {
+    this[_data$][dartx._set](key, value);
+    return value;
+  }
+  putIfAbsent(key, ifAbsent) {
+    return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+  }
+  addAll(other) {
+    return this[_data$][dartx.addAll](other);
+  }
+  remove(key) {
+    return this[_data$][dartx.remove](key);
+  }
+  clear() {
+    this[_data$][dartx.clear]();
+  }
+  forEach(f) {
+    this[_data$][dartx.forEach](f);
+  }
+  get keys() {
+    return this[_data$][dartx.keys];
+  }
+  get values() {
+    return this[_data$][dartx.values];
+  }
+  get length() {
+    return this[_data$][dartx.length];
+  }
+  get isEmpty() {
+    return this[_data$][dartx.isEmpty];
+  }
+  get isNotEmpty() {
+    return this[_data$][dartx.isNotEmpty];
+  }
+  toString() {
+    return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+  }
+};
+io._HttpSession[dart.implements] = () => [io.HttpSession];
+dart.setSignature(io._HttpSession, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpSession, [io._HttpSessionManager, core.String])}),
+  fields: () => ({
+    [_destroyed]: core.bool,
+    [_isNew]: core.bool,
+    [_lastSeen]: core.DateTime,
+    [_timeoutCallback]: core.Function,
+    [_sessionManager]: io._HttpSessionManager,
+    [_prev]: io._HttpSession,
+    [_next$1]: io._HttpSession,
+    id: core.String,
+    [_data$]: core.Map
+  }),
+  getters: () => ({
+    lastSeen: dart.definiteFunctionType(core.DateTime, []),
+    isNew: dart.definiteFunctionType(core.bool, []),
+    keys: dart.definiteFunctionType(core.Iterable, []),
+    values: dart.definiteFunctionType(core.Iterable, []),
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  setters: () => ({onTimeout: dart.definiteFunctionType(dart.void, [VoidTovoid()])}),
+  methods: () => ({
+    destroy: dart.definiteFunctionType(dart.void, []),
+    [_markSeen]: dart.definiteFunctionType(dart.void, []),
+    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
+    addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+    remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()])
+  })
+});
+dart.defineExtensionMembers(io._HttpSession, [
+  'containsValue',
+  'containsKey',
+  '_get',
+  '_set',
+  'putIfAbsent',
+  'addAll',
+  'remove',
+  'clear',
+  'forEach',
+  'keys',
+  'values',
+  'length',
+  'isEmpty',
+  'isNotEmpty'
+]);
+const _sessionTimeout = Symbol('_sessionTimeout');
+const _head$ = Symbol('_head');
+const _tail$ = Symbol('_tail');
+const _timer = Symbol('_timer');
+const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
+const _stopTimer = Symbol('_stopTimer');
+const _startTimer = Symbol('_startTimer');
+const _timerTimeout = Symbol('_timerTimeout');
+io._HttpSessionManager = class _HttpSessionManager extends core.Object {
+  new() {
+    this[_sessions] = dart.map({}, core.String, io._HttpSession);
+    this[_sessionTimeout] = 20 * 60;
+    this[_head$] = null;
+    this[_tail$] = null;
+    this[_timer] = null;
+  }
+  createSessionId() {
+    let _KEY_LENGTH = 16;
+    let data = io._IOCrypto.getRandomBytes(_KEY_LENGTH);
+    return io._CryptoUtils.bytesToHex(data);
+  }
+  getSession(id) {
+    return this[_sessions][dartx._get](id);
+  }
+  createSession() {
+    let id = this.createSessionId();
+    while (dart.test(this[_sessions][dartx.containsKey](id))) {
+      id = this.createSessionId();
+    }
+    let session = this[_sessions][dartx._set](id, new io._HttpSession(this, id));
+    this[_addToTimeoutQueue](session);
+    return session;
+  }
+  set sessionTimeout(timeout) {
+    this[_sessionTimeout] = timeout;
+    this[_stopTimer]();
+    this[_startTimer]();
+  }
+  close() {
+    this[_stopTimer]();
+  }
+  [_bumpToEnd](session) {
+    this[_removeFromTimeoutQueue](session);
+    this[_addToTimeoutQueue](session);
+  }
+  [_addToTimeoutQueue](session) {
+    if (this[_head$] == null) {
+      dart.assert(this[_tail$] == null);
+      this[_tail$] = this[_head$] = session;
+      this[_startTimer]();
+    } else {
+      dart.assert(this[_timer] != null);
+      dart.assert(this[_tail$] != null);
+      this[_tail$][_next$1] = session;
+      session[_prev] = this[_tail$];
+      this[_tail$] = session;
+    }
+  }
+  [_removeFromTimeoutQueue](session) {
+    if (session[_next$1] != null) {
+      session[_next$1][_prev] = session[_prev];
+    }
+    if (session[_prev] != null) {
+      session[_prev][_next$1] = session[_next$1];
+    }
+    if (dart.equals(this[_head$], session)) {
+      this[_head$] = session[_next$1];
+      this[_stopTimer]();
+      this[_startTimer]();
+    }
+    if (dart.equals(this[_tail$], session)) {
+      this[_tail$] = session[_prev];
+    }
+    session[_next$1] = session[_prev] = null;
+  }
+  [_timerTimeout]() {
+    this[_stopTimer]();
+    dart.assert(this[_head$] != null);
+    let session = this[_head$];
+    session.destroy();
+    if (session[_timeoutCallback] != null) {
+      dart.dsend(session, _timeoutCallback);
+    }
+  }
+  [_startTimer]() {
+    dart.assert(this[_timer] == null);
+    if (this[_head$] != null) {
+      let seconds = new core.DateTime.now().difference(this[_head$].lastSeen).inSeconds;
+      this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
+    }
+  }
+  [_stopTimer]() {
+    if (this[_timer] != null) {
+      this[_timer].cancel();
+      this[_timer] = null;
+    }
+  }
+};
+dart.setSignature(io._HttpSessionManager, {
+  constructors: () => ({new: dart.definiteFunctionType(io._HttpSessionManager, [])}),
+  fields: () => ({
+    [_sessions]: MapOfString$_HttpSession(),
+    [_sessionTimeout]: core.int,
+    [_head$]: io._HttpSession,
+    [_tail$]: io._HttpSession,
+    [_timer]: async.Timer
+  }),
+  setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    createSessionId: dart.definiteFunctionType(core.String, []),
+    getSession: dart.definiteFunctionType(io._HttpSession, [core.String]),
+    createSession: dart.definiteFunctionType(io._HttpSession, []),
+    close: dart.definiteFunctionType(dart.void, []),
+    [_bumpToEnd]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
+    [_addToTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
+    [_removeFromTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
+    [_timerTimeout]: dart.definiteFunctionType(dart.void, []),
+    [_startTimer]: dart.definiteFunctionType(dart.void, []),
+    [_stopTimer]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+io._IOResourceInfo = class _IOResourceInfo extends core.Object {
+  static get timestamp() {
+    return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
+  }
+  new(type) {
+    this.type = type;
+    this.id = io._IOResourceInfo.getNextID();
+  }
+  get referenceValueMap() {
+    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
+  }
+  static getNextID() {
+    return (() => {
+      let x = io._IOResourceInfo._count;
+      io._IOResourceInfo._count = dart.notNull(x) + 1;
+      return x;
+    })();
+  }
+};
+dart.setSignature(io._IOResourceInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._IOResourceInfo, [core.String])}),
+  fields: () => ({
+    type: core.String,
+    id: core.int
+  }),
+  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  sfields: () => ({
+    _count: core.int,
+    _sw: core.Stopwatch,
+    _startTime: core.int
+  }),
+  sgetters: () => ({timestamp: dart.definiteFunctionType(core.double, [])}),
+  statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
+  names: ['getNextID']
+});
+io._IOResourceInfo._count = 0;
+dart.defineLazy(io._IOResourceInfo, {
+  get _sw() {
+    return (() => {
+      let _ = new core.Stopwatch();
+      _.start();
+      return _;
+    })();
+  },
+  get _startTime() {
+    return new core.DateTime.now().millisecondsSinceEpoch;
+  }
+});
+io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
+  addRead(bytes) {
+    this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
+    this.readCount = dart.notNull(this.readCount) + 1;
+    this.lastRead = io._IOResourceInfo.timestamp;
+  }
+  didRead() {
+    this.addRead(0);
+  }
+  addWrite(bytes) {
+    this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
+    this.writeCount = dart.notNull(this.writeCount) + 1;
+    this.lastWrite = io._IOResourceInfo.timestamp;
+  }
+  new(type) {
+    this.totalRead = 0;
+    this.totalWritten = 0;
+    this.readCount = 0;
+    this.writeCount = 0;
+    this.lastRead = 0.0;
+    this.lastWrite = 0.0;
+    super.new(type);
+  }
+  get fullValueMap() {
+    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
+  }
+};
+dart.setSignature(io._ReadWriteResourceInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ReadWriteResourceInfo, [core.String])}),
+  fields: () => ({
+    totalRead: core.int,
+    totalWritten: core.int,
+    readCount: core.int,
+    writeCount: core.int,
+    lastRead: core.double,
+    lastWrite: core.double
+  }),
+  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  methods: () => ({
+    addRead: dart.definiteFunctionType(dart.void, [core.int]),
+    didRead: dart.definiteFunctionType(dart.void, []),
+    addWrite: dart.definiteFunctionType(dart.void, [core.int])
+  })
+});
+io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
+  new(file) {
+    this.file = file;
+    super.new(io._FileResourceInfo.TYPE);
+    io._FileResourceInfo.FileOpened(this);
+  }
+  static FileOpened(info) {
+    dart.assert(!dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](info.id)));
+    io._FileResourceInfo.openFiles[dartx._set](info.id, info);
+  }
+  static FileClosed(info) {
+    dart.assert(io._FileResourceInfo.openFiles[dartx.containsKey](info.id));
+    io._FileResourceInfo.openFiles[dartx.remove](info.id);
+  }
+  static getOpenFilesList() {
+    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
+  }
+  static getOpenFiles(func, params) {
+    dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
+    let data = dart.map({type: '_openfiles', data: io._FileResourceInfo.getOpenFilesList()}, core.String, core.Object);
+    let json = convert.JSON.encode(data);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+  getFileInfoMap() {
+    let result = this.fullValueMap;
+    return result;
+  }
+  static getFileInfoMapByID(func, params) {
+    dart.assert(dart.dsend(params, 'containsKey', 'id'));
+    let id = core.int.parse(core.String._check(dart.dindex(params, 'id')));
+    let result = dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](id)) ? io._FileResourceInfo.openFiles[dartx._get](id).getFileInfoMap() : dart.map();
+    let json = convert.JSON.encode(result);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+  get name() {
+    return dart.str`${dart.dload(this.file, 'path')}`;
+  }
+};
+dart.setSignature(io._FileResourceInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._FileResourceInfo, [dart.dynamic])}),
+  fields: () => ({file: dart.dynamic}),
+  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
+  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  sfields: () => ({
+    TYPE: core.String,
+    openFiles: MapOfint$_FileResourceInfo()
+  }),
+  statics: () => ({
+    FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
+    FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
+    getOpenFilesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
+    getOpenFiles: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
+    getFileInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic])
+  }),
+  names: ['FileOpened', 'FileClosed', 'getOpenFilesList', 'getOpenFiles', 'getFileInfoMapByID']
+});
+io._FileResourceInfo.TYPE = '_file';
+dart.defineLazy(io._FileResourceInfo, {
+  get openFiles() {
+    return MapOfint$_FileResourceInfo().new();
+  },
+  set openFiles(_) {}
+});
+const _arguments$0 = Symbol('_arguments');
+const _workingDirectory = Symbol('_workingDirectory');
+io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
+  new(process) {
+    this.process = process;
+    this.startedAt = io._IOResourceInfo.timestamp;
+    super.new(io._ProcessResourceInfo.TYPE);
+    io._ProcessResourceInfo.ProcessStarted(this);
+  }
+  get name() {
+    return core.String._check(dart.dload(this.process, _path$));
+  }
+  stopped() {
+    io._ProcessResourceInfo.ProcessStopped(this);
+  }
+  get fullValueMap() {
+    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+  }
+  static ProcessStarted(info) {
+    dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
+    io._ProcessResourceInfo.startedProcesses[dartx._set](info.id, info);
+  }
+  static ProcessStopped(info) {
+    dart.assert(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id));
+    io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
+  }
+  static getStartedProcessesList() {
+    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
+  }
+  static getStartedProcesses(func, params) {
+    dart.assert(func == 'ext.dart.io.getProcesses');
+    let data = dart.map({type: '_startedprocesses', data: io._ProcessResourceInfo.getStartedProcessesList()}, core.String, core.Object);
+    let json = convert.JSON.encode(data);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+  static getProcessInfoMapById(func, params) {
+    let id = core.int.parse(params[dartx._get]('id'));
+    let result = dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[dartx._get](id).fullValueMap : dart.map();
+    let json = convert.JSON.encode(result);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+};
+dart.setSignature(io._ProcessResourceInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ProcessResourceInfo, [dart.dynamic])}),
+  fields: () => ({
+    process: dart.dynamic,
+    startedAt: core.double
+  }),
+  getters: () => ({
+    name: dart.definiteFunctionType(core.String, []),
+    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+  }),
+  methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
+  sfields: () => ({
+    TYPE: core.String,
+    startedProcesses: MapOfint$_ProcessResourceInfo()
+  }),
+  statics: () => ({
+    ProcessStarted: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
+    ProcessStopped: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
+    getStartedProcessesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
+    getStartedProcesses: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
+    getProcessInfoMapById: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()])
+  }),
+  names: ['ProcessStarted', 'ProcessStopped', 'getStartedProcessesList', 'getStartedProcesses', 'getProcessInfoMapById']
+});
+io._ProcessResourceInfo.TYPE = '_process';
+dart.defineLazy(io._ProcessResourceInfo, {
+  get startedProcesses() {
+    return MapOfint$_ProcessResourceInfo().new();
+  },
+  set startedProcesses(_) {}
+});
+io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
+  new(socket) {
+    this.socket = socket;
+    super.new(io._SocketResourceInfo.TYPE);
+    io._SocketResourceInfo.SocketOpened(this);
+  }
+  get name() {
+    if (dart.test(dart.dload(this.socket, 'isListening'))) {
+      return dart.str`listening:${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}`;
+    }
+    let remote = '';
+    try {
+      let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
+      let remotePort = dart.dload(this.socket, 'remotePort');
+      remote = dart.str` -> ${remoteHost}:${remotePort}`;
+    } catch (e) {
+    }
+
+    return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
+  }
+  static getOpenSocketsList() {
+    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
+  }
+  getSocketInfoMap() {
+    let result = this.fullValueMap;
+    result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
+    result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
+    result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
+    result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
+    if (!dart.test(dart.dload(this.socket, 'isListening'))) {
+      try {
+        result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
+        result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
+      } catch (e) {
+        result[dartx._set]('remotePort', 'NA');
+        result[dartx._set]('remoteHost', 'NA');
+      }
+
+    } else {
+      result[dartx._set]('remotePort', 'NA');
+      result[dartx._set]('remoteHost', 'NA');
+    }
+    result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
+    return result;
+  }
+  static getSocketInfoMapByID(func, params) {
+    dart.assert(params[dartx.containsKey]('id'));
+    let id = core.int.parse(params[dartx._get]('id'));
+    let result = dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](id)) ? io._SocketResourceInfo.openSockets[dartx._get](id).getSocketInfoMap() : dart.map();
+    let json = convert.JSON.encode(result);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+  static getOpenSockets(func, params) {
+    dart.assert(dart.equals(func, 'ext.dart.io.getOpenSockets'));
+    let data = dart.map({type: '_opensockets', data: io._SocketResourceInfo.getOpenSocketsList()}, core.String, core.Object);
+    let json = convert.JSON.encode(data);
+    return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
+  }
+  static SocketOpened(info) {
+    dart.assert(!dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id)));
+    io._SocketResourceInfo.openSockets[dartx._set](info.id, info);
+  }
+  static SocketClosed(info) {
+    dart.assert(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id));
+    io._SocketResourceInfo.openSockets[dartx.remove](info.id);
+  }
+};
+dart.setSignature(io._SocketResourceInfo, {
+  constructors: () => ({new: dart.definiteFunctionType(io._SocketResourceInfo, [dart.dynamic])}),
+  fields: () => ({socket: dart.dynamic}),
+  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
+  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  sfields: () => ({
+    TCP_STRING: core.String,
+    UDP_STRING: core.String,
+    TYPE: core.String,
+    openSockets: MapOfint$_SocketResourceInfo()
+  }),
+  statics: () => ({
+    getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
+    getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
+    getOpenSockets: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
+    SocketOpened: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo]),
+    SocketClosed: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo])
+  }),
+  names: ['getOpenSocketsList', 'getSocketInfoMapByID', 'getOpenSockets', 'SocketOpened', 'SocketClosed']
+});
+io._SocketResourceInfo.TCP_STRING = 'TCP';
+io._SocketResourceInfo.UDP_STRING = 'UDP';
+io._SocketResourceInfo.TYPE = '_socket';
+dart.defineLazy(io._SocketResourceInfo, {
+  get openSockets() {
+    return MapOfint$_SocketResourceInfo().new();
+  },
+  set openSockets(_) {}
+});
+io.IOSink = class IOSink extends core.Object {
+  static new(target, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return new io._IOSinkImpl(target, encoding);
+  }
+};
+io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
+dart.setSignature(io.IOSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io.IOSink, [StreamConsumerOfListOfint()], {encoding: convert.Encoding})}),
+  fields: () => ({encoding: convert.Encoding})
+});
+io._FILE_EXISTS = 0;
+io._FILE_CREATE = 1;
+io._FILE_DELETE = 2;
+io._FILE_RENAME = 3;
+io._FILE_COPY = 4;
+io._FILE_OPEN = 5;
+io._FILE_RESOLVE_SYMBOLIC_LINKS = 6;
+io._FILE_CLOSE = 7;
+io._FILE_POSITION = 8;
+io._FILE_SET_POSITION = 9;
+io._FILE_TRUNCATE = 10;
+io._FILE_LENGTH = 11;
+io._FILE_LENGTH_FROM_PATH = 12;
+io._FILE_LAST_MODIFIED = 13;
+io._FILE_FLUSH = 14;
+io._FILE_READ_BYTE = 15;
+io._FILE_WRITE_BYTE = 16;
+io._FILE_READ = 17;
+io._FILE_READ_INTO = 18;
+io._FILE_WRITE_FROM = 19;
+io._FILE_CREATE_LINK = 20;
+io._FILE_DELETE_LINK = 21;
+io._FILE_RENAME_LINK = 22;
+io._FILE_LINK_TARGET = 23;
+io._FILE_TYPE = 24;
+io._FILE_IDENTICAL = 25;
+io._FILE_STAT = 26;
+io._FILE_LOCK = 27;
+io._SOCKET_LOOKUP = 28;
+io._SOCKET_LIST_INTERFACES = 29;
+io._SOCKET_REVERSE_LOOKUP = 30;
+io._DIRECTORY_CREATE = 31;
+io._DIRECTORY_DELETE = 32;
+io._DIRECTORY_EXISTS = 33;
+io._DIRECTORY_CREATE_TEMP = 34;
+io._DIRECTORY_LIST_START = 35;
+io._DIRECTORY_LIST_NEXT = 36;
+io._DIRECTORY_LIST_STOP = 37;
+io._DIRECTORY_RENAME = 38;
+io._SSL_PROCESS_FILTER = 39;
+io._IOService = class _IOService extends core.Object {
+  static _dispatch(request, data) {
+    dart.throw(new core.UnsupportedError("_IOService._dispatch"));
+  }
+};
+dart.setSignature(io._IOService, {
+  statics: () => ({_dispatch: dart.definiteFunctionType(async.Future, [core.int, core.List])}),
+  names: ['_dispatch']
+});
+io.Link = class Link extends core.Object {
+  static new(path) {
+    return new io._Link(path);
+  }
+  static fromUri(uri) {
+    return io.Link.new(uri.toFilePath());
+  }
+};
+io.Link[dart.implements] = () => [io.FileSystemEntity];
+dart.setSignature(io.Link, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.Link, [core.String]),
+    fromUri: dart.definiteFunctionType(io.Link, [core.Uri])
+  })
+});
+const _makeWindowsLinkTarget = Symbol('_makeWindowsLinkTarget');
+const _exceptionFromResponse = Symbol('_exceptionFromResponse');
+io._Link = class _Link extends io.FileSystemEntity {
+  new(path) {
+    this.path = path;
+    if (!(typeof this.path == 'string')) {
+      dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
+    }
+  }
+  toString() {
+    return dart.str`Link: '${this.path}'`;
+  }
+  exists() {
+    return io.FileSystemEntity.isLink(this.path);
+  }
+  existsSync() {
+    return io.FileSystemEntity.isLinkSync(this.path);
+  }
+  get absolute() {
+    return io.Link.new(this[_absolutePath]);
+  }
+  stat() {
+    return io.FileStat.stat(this.path);
+  }
+  statSync() {
+    return io.FileStat.statSync(this.path);
+  }
+  create(target, opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(io.Platform.isWindows)) {
+      target = this[_makeWindowsLinkTarget](target);
+    }
+    let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
+    return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE_LINK, JSArrayOfString().of([this.path, target])), dynamicToFuture())).then(io._Link)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot create link to target '${target}'`, this.path));
+      }
+      return this;
+    }, dynamicTo_Link()));
+  }
+  createSync(target, opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      this.parent.createSync({recursive: true});
+    }
+    if (dart.test(io.Platform.isWindows)) {
+      target = this[_makeWindowsLinkTarget](target);
+    }
+    let result = io._File._createLink(this.path, target);
+    io._Link.throwIfError(result, "Cannot create link", this.path);
+  }
+  [_makeWindowsLinkTarget](target) {
+    let base = core.Uri.file(dart.str`${io.Directory.current.path}\\`);
+    let link = core.Uri.file(this.path);
+    let destination = core.Uri.file(target);
+    let result = base.resolveUri(link).resolveUri(destination).toFilePath();
+    if (dart.notNull(result[dartx.length]) > 3 && result[dartx._get](1) == ':' && result[dartx._get](2) == '\\') {
+      return dart.str`\\??\\${result}`;
+    } else {
+      dart.throw(new io.FileSystemException(dart.str`Target ${result} of Link.create on Windows cannot be converted` + ' to start with a drive letter.  Unexpected error.'));
+    }
+  }
+  updateSync(target) {
+    this.deleteSync();
+    this.createSync(target);
+  }
+  update(target) {
+    return this.delete().then(io.Link)(dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink()));
+  }
+  [_delete](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      return io.Directory.new(this.path).delete({recursive: true}).then(io._Link)(dart.fn(_ => this, FileSystemEntityTo_Link()));
+    }
+    return io._IOService._dispatch(io._FILE_DELETE_LINK, JSArrayOfString().of([this.path])).then(io._Link)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
+      }
+      return this;
+    }, dynamicTo_Link()));
+  }
+  [_deleteSync](opts) {
+    let recursive = opts && 'recursive' in opts ? opts.recursive : false;
+    if (dart.test(recursive)) {
+      return io.Directory.new(this.path).deleteSync({recursive: true});
+    }
+    let result = io._File._deleteLinkNative(this.path);
+    io._Link.throwIfError(result, "Cannot delete link", this.path);
+  }
+  rename(newPath) {
+    return io._IOService._dispatch(io._FILE_RENAME_LINK, JSArrayOfString().of([this.path, newPath])).then(io.Link)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot rename link to '${newPath}'`, this.path));
+      }
+      return io.Link.new(newPath);
+    }, dynamicToLink()));
+  }
+  renameSync(newPath) {
+    let result = io._File._renameLink(this.path, newPath);
+    io._Link.throwIfError(result, dart.str`Cannot rename link '${this.path}' to '${newPath}'`);
+    return io.Link.new(newPath);
+  }
+  target() {
+    return io._IOService._dispatch(io._FILE_LINK_TARGET, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
+      if (dart.test(this[_isErrorResponse](response))) {
+        dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
+      }
+      return FutureOrOfString()._check(response);
+    }, dynamicToFutureOrOfString()));
+  }
+  targetSync() {
+    let result = io._File._linkTarget(this.path);
+    io._Link.throwIfError(result, "Cannot read link", this.path);
+    return core.String._check(result);
+  }
+  static throwIfError(result, msg, path) {
+    if (path === void 0) path = "";
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException(msg, path, result));
+    }
+  }
+  [_isErrorResponse](response) {
     return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
-  };
-  dart.fn(io._isErrorResponse, dynamicTobool$());
-  io._exceptionFromResponse = function(response, message, path) {
-    dart.assert(io._isErrorResponse(response));
+  }
+  [_exceptionFromResponse](response, message, path) {
+    dart.assert(this[_isErrorResponse](response));
     switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
       case io._ILLEGAL_ARGUMENT_RESPONSE:
       {
@@ -37732,9641 +48038,356 @@
         let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
         return new io.FileSystemException(message, path, err);
       }
-      case io._FILE_CLOSED_RESPONSE:
-      {
-        return new io.FileSystemException("File closed", path);
-      }
       default:
       {
         return core.Exception.new("Unknown error");
       }
     }
-  };
-  dart.fn(io._exceptionFromResponse, dynamicAndStringAndStringTodynamic());
-  io.IOException = class IOException extends core.Object {
-    toString() {
-      return "IOException";
-    }
-  };
-  io.IOException[dart.implements] = () => [core.Exception];
-  io.OSError = class OSError extends core.Object {
-    new(message, errorCode) {
-      if (message === void 0) message = "";
-      if (errorCode === void 0) errorCode = io.OSError.noErrorCode;
-      this.message = message;
-      this.errorCode = errorCode;
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write("OS Error");
-      if (!dart.test(this.message[dartx.isEmpty])) {
-        sb.write(": ");
-        sb.write(this.message);
-        if (this.errorCode != io.OSError.noErrorCode) {
-          sb.write(", errno = ");
-          sb.write(dart.toString(this.errorCode));
-        }
-      } else if (this.errorCode != io.OSError.noErrorCode) {
-        sb.write(": errno = ");
-        sb.write(dart.toString(this.errorCode));
-      }
-      return sb.toString();
-    }
-  };
-  dart.setSignature(io.OSError, {
-    constructors: () => ({new: dart.definiteFunctionType(io.OSError, [], [core.String, core.int])}),
-    fields: () => ({
-      message: core.String,
-      errorCode: core.int
-    }),
-    sfields: () => ({noErrorCode: core.int})
-  });
-  io.OSError.noErrorCode = -1;
-  io._BufferAndStart = class _BufferAndStart extends core.Object {
-    new(buffer, start) {
-      this.buffer = buffer;
-      this.start = start;
-    }
-  };
-  dart.setSignature(io._BufferAndStart, {
-    constructors: () => ({new: dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int])}),
-    fields: () => ({
-      buffer: core.List,
-      start: core.int
-    })
-  });
-  io._ensureFastAndSerializableByteData = function(buffer, start, end) {
-    if (typed_data.Uint8List.is(buffer) || typed_data.Int8List.is(buffer)) {
-      return new io._BufferAndStart(buffer, start);
-    }
-    let length = dart.notNull(end) - dart.notNull(start);
-    let newBuffer = typed_data.Uint8List.new(length);
-    let j = start;
-    for (let i = 0; i < length; i++) {
-      let value = core.int._check(buffer[dartx._get](j));
-      if (!(typeof value == 'number')) {
-        dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
-      }
-      newBuffer[dartx._set](i, value);
-      j = dart.notNull(j) + 1;
-    }
-    return new io._BufferAndStart(newBuffer, 0);
-  };
-  dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
-  io._IOCrypto = class _IOCrypto extends core.Object {
-    static getRandomBytes(count) {
-      dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
-    }
-  };
-  dart.setSignature(io._IOCrypto, {
-    statics: () => ({getRandomBytes: dart.definiteFunctionType(typed_data.Uint8List, [core.int])}),
-    names: ['getRandomBytes']
-  });
-  io._CryptoUtils = class _CryptoUtils extends core.Object {
-    static bytesToHex(bytes) {
-      let result = new core.StringBuffer();
-      for (let part of bytes) {
-        result.write(dart.str`${dart.notNull(part) < 16 ? '0' : ''}${part[dartx.toRadixString](16)}`);
-      }
-      return result.toString();
-    }
-    static bytesToBase64(bytes, urlSafe, addLineSeparator) {
-      if (urlSafe === void 0) urlSafe = false;
-      if (addLineSeparator === void 0) addLineSeparator = false;
-      let len = bytes[dartx.length];
-      if (len == 0) {
-        return "";
-      }
-      let lookup = dart.test(urlSafe) ? io._CryptoUtils._encodeTableUrlSafe : io._CryptoUtils._encodeTable;
-      let remainderLength = dart.asInt(len[dartx.remainder](3));
-      let chunkLength = dart.notNull(len) - dart.notNull(remainderLength);
-      let outputLen = (dart.notNull(len) / 3)[dartx.truncate]() * 4 + (dart.notNull(remainderLength) > 0 ? 4 : 0);
-      if (dart.test(addLineSeparator)) {
-        outputLen = outputLen + (((outputLen - 1) / io._CryptoUtils.LINE_LENGTH)[dartx.truncate]() << 1 >>> 0);
-      }
-      let out = ListOfint().new(outputLen);
-      let j = 0, i = 0, c = 0;
-      while (i < chunkLength) {
-        let x = (dart.notNull(bytes[dartx._get](i++)) << 16 & 16777215 | dart.notNull(bytes[dartx._get](i++)) << 8 & 16777215 | dart.notNull(bytes[dartx._get](i++))) >>> 0;
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](18)));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 12 & 63));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x >> 6 & 63));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x & 63));
-        if (dart.test(addLineSeparator) && ++c == 19 && j < outputLen - 2) {
-          out[dartx._set](j++, io._CryptoUtils.CR);
-          out[dartx._set](j++, io._CryptoUtils.LF);
-          c = 0;
-        }
-      }
-      if (remainderLength == 1) {
-        let x = bytes[dartx._get](i);
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(x) << 4 & 63));
-        out[dartx._set](j++, io._CryptoUtils.PAD);
-        out[dartx._set](j++, io._CryptoUtils.PAD);
-      } else if (remainderLength == 2) {
-        let x = bytes[dartx._get](i);
-        let y = bytes[dartx._get](i + 1);
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](x[dartx['>>']](2)));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt]((dart.notNull(x) << 4 | dart.notNull(y) >> 4) & 63));
-        out[dartx._set](j++, lookup[dartx.codeUnitAt](dart.notNull(y) << 2 & 63));
-        out[dartx._set](j++, io._CryptoUtils.PAD);
-      }
-      return core.String.fromCharCodes(out);
-    }
-    static base64StringToBytes(input, ignoreInvalidCharacters) {
-      if (ignoreInvalidCharacters === void 0) ignoreInvalidCharacters = true;
-      let len = input[dartx.length];
-      if (len == 0) {
-        return ListOfint().new(0);
-      }
-      let extrasLen = 0;
-      for (let i = 0; i < dart.notNull(len); i++) {
-        let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i));
-        if (dart.notNull(c) < 0) {
-          extrasLen++;
-          if (c == -2 && !dart.test(ignoreInvalidCharacters)) {
-            dart.throw(new core.FormatException(dart.str`Invalid character: ${input[dartx._get](i)}`));
-          }
-        }
-      }
-      if ((dart.notNull(len) - extrasLen)[dartx['%']](4) != 0) {
-        dart.throw(new core.FormatException(dart.str`Size of Base 64 characters in Input\n          must be a multiple of 4. Input: ${input}`));
-      }
-      let padLength = 0;
-      for (let i = dart.notNull(len) - 1; i >= 0; i--) {
-        let currentCodeUnit = input[dartx.codeUnitAt](i);
-        if (dart.notNull(io._CryptoUtils._decodeTable[dartx._get](currentCodeUnit)) > 0) break;
-        if (currentCodeUnit == io._CryptoUtils.PAD) padLength++;
-      }
-      let outputLen = ((dart.notNull(len) - extrasLen) * 6)[dartx['>>']](3) - padLength;
-      let out = ListOfint().new(outputLen);
-      for (let i = 0, o = 0; o < outputLen;) {
-        let x = 0;
-        for (let j = 4; j > 0;) {
-          let c = io._CryptoUtils._decodeTable[dartx._get](input[dartx.codeUnitAt](i++));
-          if (dart.notNull(c) >= 0) {
-            x = (x << 6 & 16777215 | dart.notNull(c)) >>> 0;
-            j--;
-          }
-        }
-        out[dartx._set](o++, x[dartx['>>']](16));
-        if (o < outputLen) {
-          out[dartx._set](o++, x >> 8 & 255);
-          if (o < outputLen) out[dartx._set](o++, x & 255);
-        }
-      }
-      return out;
-    }
-  };
-  dart.setSignature(io._CryptoUtils, {
-    sfields: () => ({
-      PAD: core.int,
-      CR: core.int,
-      LF: core.int,
-      LINE_LENGTH: core.int,
-      _encodeTable: core.String,
-      _encodeTableUrlSafe: core.String,
-      _decodeTable: ListOfint()
-    }),
-    statics: () => ({
-      bytesToHex: dart.definiteFunctionType(core.String, [ListOfint()]),
-      bytesToBase64: dart.definiteFunctionType(core.String, [ListOfint()], [core.bool, core.bool]),
-      base64StringToBytes: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.bool])
-    }),
-    names: ['bytesToHex', 'bytesToBase64', 'base64StringToBytes']
-  });
-  io._CryptoUtils.PAD = 61;
-  io._CryptoUtils.CR = 13;
-  io._CryptoUtils.LF = 10;
-  io._CryptoUtils.LINE_LENGTH = 76;
-  io._CryptoUtils._encodeTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-  io._CryptoUtils._encodeTableUrlSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-  io._CryptoUtils._decodeTable = dart.constList([-2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, 0, -2, -2, -2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63, -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], core.int);
-  io._MASK_8 = 255;
-  io._MASK_32 = 4294967295;
-  io._BITS_PER_BYTE = 8;
-  io._BYTES_PER_WORD = 4;
-  const _chunkSizeInWords = Symbol('_chunkSizeInWords');
-  const _digestSizeInWords = Symbol('_digestSizeInWords');
-  const _bigEndianWords = Symbol('_bigEndianWords');
-  const _pendingData = Symbol('_pendingData');
-  const _lengthInBytes = Symbol('_lengthInBytes');
-  const _currentChunk = Symbol('_currentChunk');
-  const _h = Symbol('_h');
-  const _digestCalled = Symbol('_digestCalled');
-  const _iterate = Symbol('_iterate');
-  const _resultAsBytes = Symbol('_resultAsBytes');
-  const _finalizeData = Symbol('_finalizeData');
-  const _add32 = Symbol('_add32');
-  const _roundUp = Symbol('_roundUp');
-  const _rotl32 = Symbol('_rotl32');
-  const _wordToBytes = Symbol('_wordToBytes');
-  const _bytesToChunk = Symbol('_bytesToChunk');
-  const _updateHash = Symbol('_updateHash');
-  io._HashBase = class _HashBase extends core.Object {
-    new(chunkSizeInWords, digestSizeInWords, bigEndianWords) {
-      this[_chunkSizeInWords] = chunkSizeInWords;
-      this[_digestSizeInWords] = digestSizeInWords;
-      this[_bigEndianWords] = bigEndianWords;
-      this[_pendingData] = JSArrayOfint().of([]);
-      this[_lengthInBytes] = 0;
-      this[_currentChunk] = null;
-      this[_h] = null;
-      this[_digestCalled] = false;
-      this[_currentChunk] = ListOfint().new(this[_chunkSizeInWords]);
-      this[_h] = ListOfint().new(this[_digestSizeInWords]);
-    }
-    add(data) {
-      if (dart.test(this[_digestCalled])) {
-        dart.throw(new core.StateError('Hash update method called after digest was retrieved'));
-      }
-      this[_lengthInBytes] = dart.notNull(this[_lengthInBytes]) + dart.notNull(data[dartx.length]);
-      this[_pendingData][dartx.addAll](data);
-      this[_iterate]();
-    }
-    close() {
-      if (dart.test(this[_digestCalled])) {
-        return ListOfint()._check(this[_resultAsBytes]());
-      }
-      this[_digestCalled] = true;
-      this[_finalizeData]();
-      this[_iterate]();
-      dart.assert(this[_pendingData][dartx.length] == 0);
-      return ListOfint()._check(this[_resultAsBytes]());
-    }
-    get blockSize() {
-      return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
-    }
-    [_add32](x, y) {
-      return dart.dsend(dart.dsend(x, '+', y), '&', io._MASK_32);
-    }
-    [_roundUp](val, n) {
-      return dart.dsend(dart.dsend(dart.dsend(val, '+', n), '-', 1), '&', dart.dsend(n, '_negate'));
-    }
-    [_rotl32](val, shift) {
-      let mod_shift = dart.notNull(shift) & 31;
-      return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
-    }
-    [_resultAsBytes]() {
-      let result = [];
-      for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
-        result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
-      }
-      return result;
-    }
-    [_bytesToChunk](data, dataIndex) {
-      dart.assert(dart.notNull(data[dartx.length]) - dart.notNull(dataIndex) >= dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD);
-      for (let wordIndex = 0; wordIndex < dart.notNull(this[_chunkSizeInWords]); wordIndex++) {
-        let w3 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dataIndex) : data[dartx._get](dart.notNull(dataIndex) + 3);
-        let w2 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 1) : data[dartx._get](dart.notNull(dataIndex) + 2);
-        let w1 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 2) : data[dartx._get](dart.notNull(dataIndex) + 1);
-        let w0 = dart.test(this[_bigEndianWords]) ? data[dartx._get](dart.notNull(dataIndex) + 3) : data[dartx._get](dataIndex);
-        dataIndex = dart.notNull(dataIndex) + 4;
-        let word = (dart.notNull(w3) & 255) << 24 >>> 0;
-        word = (word | (dart.notNull(w2) & io._MASK_8) << 16) >>> 0;
-        word = (word | (dart.notNull(w1) & io._MASK_8) << 8) >>> 0;
-        word = (word | dart.notNull(w0) & io._MASK_8) >>> 0;
-        this[_currentChunk][dartx._set](wordIndex, word);
-      }
-    }
-    [_wordToBytes](word) {
-      let bytes = ListOfint().new(io._BYTES_PER_WORD);
-      bytes[dartx._set](0, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 24 : 0) & io._MASK_8);
-      bytes[dartx._set](1, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 16 : 8) & io._MASK_8);
-      bytes[dartx._set](2, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 8 : 16) & io._MASK_8);
-      bytes[dartx._set](3, word[dartx['>>']](dart.test(this[_bigEndianWords]) ? 0 : 24) & io._MASK_8);
-      return bytes;
-    }
-    [_iterate]() {
-      let len = this[_pendingData][dartx.length];
-      let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
-      if (dart.notNull(len) >= chunkSizeInBytes) {
-        let index = 0;
-        for (; dart.notNull(len) - index >= chunkSizeInBytes; index = index + chunkSizeInBytes) {
-          this[_bytesToChunk](this[_pendingData], index);
-          this[_updateHash](this[_currentChunk]);
-        }
-        this[_pendingData] = this[_pendingData][dartx.sublist](index, len);
-      }
-    }
-    [_finalizeData]() {
-      this[_pendingData][dartx.add](128);
-      let contentsLength = dart.notNull(this[_lengthInBytes]) + 9;
-      let chunkSizeInBytes = dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
-      let finalizedLength = this[_roundUp](contentsLength, chunkSizeInBytes);
-      let zeroPadding = dart.dsend(finalizedLength, '-', contentsLength);
-      for (let i = 0; i < dart.notNull(core.num._check(zeroPadding)); i++) {
-        this[_pendingData][dartx.add](0);
-      }
-      let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
-      dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
-      if (dart.test(this[_bigEndianWords])) {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-      } else {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-      }
-    }
-  };
-  dart.setSignature(io._HashBase, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HashBase, [core.int, core.int, core.bool])}),
-    fields: () => ({
-      [_chunkSizeInWords]: core.int,
-      [_digestSizeInWords]: core.int,
-      [_bigEndianWords]: core.bool,
-      [_lengthInBytes]: core.int,
-      [_pendingData]: ListOfint(),
-      [_currentChunk]: ListOfint(),
-      [_h]: ListOfint(),
-      [_digestCalled]: core.bool
-    }),
-    getters: () => ({blockSize: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.dynamic, [ListOfint()]),
-      close: dart.definiteFunctionType(core.List$(core.int), []),
-      [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
-      [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
-      [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
-      [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
-    })
-  });
-  io._MD5 = class _MD5 extends io._HashBase {
-    new() {
-      super.new(16, 4, false);
-      this[_h][dartx._set](0, 1732584193);
-      this[_h][dartx._set](1, 4023233417);
-      this[_h][dartx._set](2, 2562383102);
-      this[_h][dartx._set](3, 271733878);
-    }
-    newInstance() {
-      return new io._MD5();
-    }
-    [_updateHash](m) {
-      dart.assert(m[dartx.length] == 16);
-      let a = this[_h][dartx._get](0);
-      let b = this[_h][dartx._get](1);
-      let c = this[_h][dartx._get](2);
-      let d = this[_h][dartx._get](3);
-      let t0 = null;
-      let t1 = null;
-      for (let i = 0; i < 64; i++) {
-        if (i < 16) {
-          t0 = (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & io._MASK_32 & dart.notNull(d)) >>> 0;
-          t1 = i;
-        } else if (i < 32) {
-          t0 = (dart.notNull(d) & dart.notNull(b) | ~dart.notNull(d) & io._MASK_32 & dart.notNull(c)) >>> 0;
-          t1 = (5 * i + 1)[dartx['%']](16);
-        } else if (i < 48) {
-          t0 = (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0;
-          t1 = (3 * i + 5)[dartx['%']](16);
-        } else {
-          t0 = (dart.notNull(c) ^ (dart.notNull(b) | ~dart.notNull(d) & io._MASK_32)) >>> 0;
-          t1 = (7 * i)[dartx['%']](16);
-        }
-        let temp = d;
-        d = c;
-        c = b;
-        b = core.int._check(this[_add32](b, this[_rotl32](core.int._check(this[_add32](this[_add32](a, t0), this[_add32](io._MD5._k[dartx._get](i), m[dartx._get](core.int._check(t1))))), io._MD5._r[dartx._get](i))));
-        a = temp;
-      }
-      this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
-      this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
-      this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
-      this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
-    }
-  };
-  dart.setSignature(io._MD5, {
-    constructors: () => ({new: dart.definiteFunctionType(io._MD5, [])}),
-    methods: () => ({
-      newInstance: dart.definiteFunctionType(io._MD5, []),
-      [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
-    }),
-    sfields: () => ({
-      _k: ListOfint(),
-      _r: ListOfint()
-    })
-  });
-  io._MD5._k = dart.constList([3614090360, 3905402710, 606105819, 3250441966, 4118548399, 1200080426, 2821735955, 4249261313, 1770035416, 2336552879, 4294925233, 2304563134, 1804603682, 4254626195, 2792965006, 1236535329, 4129170786, 3225465664, 643717713, 3921069994, 3593408605, 38016083, 3634488961, 3889429448, 568446438, 3275163606, 4107603335, 1163531501, 2850285829, 4243563512, 1735328473, 2368359562, 4294588738, 2272392833, 1839030562, 4259657740, 2763975236, 1272893353, 4139469664, 3200236656, 681279174, 3936430074, 3572445317, 76029189, 3654602809, 3873151461, 530742520, 3299628645, 4096336452, 1126891415, 2878612391, 4237533241, 1700485571, 2399980690, 4293915773, 2240044497, 1873313359, 4264355552, 2734768916, 1309151649, 4149444226, 3174756917, 718787259, 3951481745], core.int);
-  io._MD5._r = dart.constList([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21], core.int);
-  const _w = Symbol('_w');
-  io._SHA1 = class _SHA1 extends io._HashBase {
-    new() {
-      this[_w] = ListOfint().new(80);
-      super.new(16, 5, true);
-      this[_h][dartx._set](0, 1732584193);
-      this[_h][dartx._set](1, 4023233417);
-      this[_h][dartx._set](2, 2562383102);
-      this[_h][dartx._set](3, 271733878);
-      this[_h][dartx._set](4, 3285377520);
-    }
-    newInstance() {
-      return new io._SHA1();
-    }
-    [_updateHash](m) {
-      dart.assert(m[dartx.length] == 16);
-      let a = this[_h][dartx._get](0);
-      let b = this[_h][dartx._get](1);
-      let c = this[_h][dartx._get](2);
-      let d = this[_h][dartx._get](3);
-      let e = this[_h][dartx._get](4);
-      for (let i = 0; i < 80; i++) {
-        if (i < 16) {
-          this[_w][dartx._set](i, m[dartx._get](i));
-        } else {
-          let n = (dart.notNull(this[_w][dartx._get](i - 3)) ^ dart.notNull(this[_w][dartx._get](i - 8)) ^ dart.notNull(this[_w][dartx._get](i - 14)) ^ dart.notNull(this[_w][dartx._get](i - 16))) >>> 0;
-          this[_w][dartx._set](i, this[_rotl32](n, 1));
-        }
-        let t = this[_add32](this[_add32](this[_rotl32](a, 5), e), this[_w][dartx._get](i));
-        if (i < 20) {
-          t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | ~dart.notNull(b) & dart.notNull(d)) >>> 0), 1518500249);
-        } else if (i < 40) {
-          t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 1859775393);
-        } else if (i < 60) {
-          t = this[_add32](this[_add32](t, (dart.notNull(b) & dart.notNull(c) | dart.notNull(b) & dart.notNull(d) | dart.notNull(c) & dart.notNull(d)) >>> 0), 2400959708);
-        } else {
-          t = this[_add32](this[_add32](t, (dart.notNull(b) ^ dart.notNull(c) ^ dart.notNull(d)) >>> 0), 3395469782);
-        }
-        e = d;
-        d = c;
-        c = this[_rotl32](b, 30);
-        b = a;
-        a = core.int._check(dart.dsend(t, '&', io._MASK_32));
-      }
-      this[_h][dartx._set](0, core.int._check(this[_add32](a, this[_h][dartx._get](0))));
-      this[_h][dartx._set](1, core.int._check(this[_add32](b, this[_h][dartx._get](1))));
-      this[_h][dartx._set](2, core.int._check(this[_add32](c, this[_h][dartx._get](2))));
-      this[_h][dartx._set](3, core.int._check(this[_add32](d, this[_h][dartx._get](3))));
-      this[_h][dartx._set](4, core.int._check(this[_add32](e, this[_h][dartx._get](4))));
-    }
-  };
-  dart.setSignature(io._SHA1, {
-    constructors: () => ({new: dart.definiteFunctionType(io._SHA1, [])}),
-    fields: () => ({[_w]: ListOfint()}),
-    methods: () => ({
-      newInstance: dart.definiteFunctionType(io._SHA1, []),
-      [_updateHash]: dart.definiteFunctionType(dart.void, [ListOfint()])
-    })
-  });
-  io.ZLibOption = class ZLibOption extends core.Object {};
-  dart.setSignature(io.ZLibOption, {
-    sfields: () => ({
-      MIN_WINDOW_BITS: core.int,
-      MAX_WINDOW_BITS: core.int,
-      DEFAULT_WINDOW_BITS: core.int,
-      MIN_LEVEL: core.int,
-      MAX_LEVEL: core.int,
-      DEFAULT_LEVEL: core.int,
-      MIN_MEM_LEVEL: core.int,
-      MAX_MEM_LEVEL: core.int,
-      DEFAULT_MEM_LEVEL: core.int,
-      STRATEGY_FILTERED: core.int,
-      STRATEGY_HUFFMAN_ONLY: core.int,
-      STRATEGY_RLE: core.int,
-      STRATEGY_FIXED: core.int,
-      STRATEGY_DEFAULT: core.int
-    })
-  });
-  io.ZLibOption.MIN_WINDOW_BITS = 8;
-  io.ZLibOption.MAX_WINDOW_BITS = 15;
-  io.ZLibOption.DEFAULT_WINDOW_BITS = 15;
-  io.ZLibOption.MIN_LEVEL = -1;
-  io.ZLibOption.MAX_LEVEL = 9;
-  io.ZLibOption.DEFAULT_LEVEL = 6;
-  io.ZLibOption.MIN_MEM_LEVEL = 1;
-  io.ZLibOption.MAX_MEM_LEVEL = 9;
-  io.ZLibOption.DEFAULT_MEM_LEVEL = 8;
-  io.ZLibOption.STRATEGY_FILTERED = 1;
-  io.ZLibOption.STRATEGY_HUFFMAN_ONLY = 2;
-  io.ZLibOption.STRATEGY_RLE = 3;
-  io.ZLibOption.STRATEGY_FIXED = 4;
-  io.ZLibOption.STRATEGY_DEFAULT = 0;
-  io.ZLibCodec = class ZLibCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
-    new(opts) {
-      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
-      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
-      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
-      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
-      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
-      let raw = opts && 'raw' in opts ? opts.raw : false;
-      let gzip = opts && 'gzip' in opts ? opts.gzip : false;
-      this.level = level;
-      this.windowBits = windowBits;
-      this.memLevel = memLevel;
-      this.strategy = strategy;
-      this.dictionary = dictionary;
-      this.raw = raw;
-      this.gzip = gzip;
-      super.new();
-      io._validateZLibeLevel(this.level);
-      io._validateZLibMemLevel(this.memLevel);
-      io._validateZLibStrategy(this.strategy);
-      io._validateZLibWindowBits(this.windowBits);
-    }
-    _default() {
-      this.level = io.ZLibOption.DEFAULT_LEVEL;
-      this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
-      this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
-      this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
-      this.raw = false;
-      this.gzip = false;
-      this.dictionary = null;
-      super.new();
-    }
-    get encoder() {
-      return new io.ZLibEncoder({gzip: false, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
-    }
-    get decoder() {
-      return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
-    }
-  };
-  dart.addSimpleTypeTests(io.ZLibCodec);
-  dart.defineNamedConstructor(io.ZLibCodec, '_default');
-  dart.setSignature(io.ZLibCodec, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.ZLibCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
-      _default: dart.definiteFunctionType(io.ZLibCodec, [])
-    }),
-    fields: () => ({
-      gzip: core.bool,
-      level: core.int,
-      memLevel: core.int,
-      strategy: core.int,
-      windowBits: core.int,
-      raw: core.bool,
-      dictionary: ListOfint()
-    }),
-    getters: () => ({
-      encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
-      decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
-    })
-  });
-  io.ZLIB = dart.const(new io.ZLibCodec._default());
-  io.GZipCodec = class GZipCodec extends convert.Codec$(core.List$(core.int), core.List$(core.int)) {
-    new(opts) {
-      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
-      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
-      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
-      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
-      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
-      let raw = opts && 'raw' in opts ? opts.raw : false;
-      let gzip = opts && 'gzip' in opts ? opts.gzip : true;
-      this.level = level;
-      this.windowBits = windowBits;
-      this.memLevel = memLevel;
-      this.strategy = strategy;
-      this.dictionary = dictionary;
-      this.raw = raw;
-      this.gzip = gzip;
-      super.new();
-      io._validateZLibeLevel(this.level);
-      io._validateZLibMemLevel(this.memLevel);
-      io._validateZLibStrategy(this.strategy);
-      io._validateZLibWindowBits(this.windowBits);
-    }
-    _default() {
-      this.level = io.ZLibOption.DEFAULT_LEVEL;
-      this.windowBits = io.ZLibOption.DEFAULT_WINDOW_BITS;
-      this.memLevel = io.ZLibOption.DEFAULT_MEM_LEVEL;
-      this.strategy = io.ZLibOption.STRATEGY_DEFAULT;
-      this.raw = false;
-      this.gzip = true;
-      this.dictionary = null;
-      super.new();
-    }
-    get encoder() {
-      return new io.ZLibEncoder({gzip: true, level: this.level, windowBits: this.windowBits, memLevel: this.memLevel, strategy: this.strategy, dictionary: this.dictionary, raw: this.raw});
-    }
-    get decoder() {
-      return new io.ZLibDecoder({windowBits: this.windowBits, dictionary: this.dictionary, raw: this.raw});
-    }
-  };
-  dart.addSimpleTypeTests(io.GZipCodec);
-  dart.defineNamedConstructor(io.GZipCodec, '_default');
-  dart.setSignature(io.GZipCodec, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.GZipCodec, [], {level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool, gzip: core.bool}),
-      _default: dart.definiteFunctionType(io.GZipCodec, [])
-    }),
-    fields: () => ({
-      gzip: core.bool,
-      level: core.int,
-      memLevel: core.int,
-      strategy: core.int,
-      windowBits: core.int,
-      dictionary: ListOfint(),
-      raw: core.bool
-    }),
-    getters: () => ({
-      encoder: dart.definiteFunctionType(io.ZLibEncoder, []),
-      decoder: dart.definiteFunctionType(io.ZLibDecoder, [])
-    })
-  });
-  io.GZIP = dart.const(new io.GZipCodec._default());
-  io.ZLibEncoder = class ZLibEncoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
-    new(opts) {
-      let gzip = opts && 'gzip' in opts ? opts.gzip : false;
-      let level = opts && 'level' in opts ? opts.level : io.ZLibOption.DEFAULT_LEVEL;
-      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
-      let memLevel = opts && 'memLevel' in opts ? opts.memLevel : io.ZLibOption.DEFAULT_MEM_LEVEL;
-      let strategy = opts && 'strategy' in opts ? opts.strategy : io.ZLibOption.STRATEGY_DEFAULT;
-      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
-      let raw = opts && 'raw' in opts ? opts.raw : false;
-      this.gzip = gzip;
-      this.level = level;
-      this.windowBits = windowBits;
-      this.memLevel = memLevel;
-      this.strategy = strategy;
-      this.dictionary = dictionary;
-      this.raw = raw;
-      super.new();
-      io._validateZLibeLevel(this.level);
-      io._validateZLibMemLevel(this.memLevel);
-      io._validateZLibStrategy(this.strategy);
-      io._validateZLibWindowBits(this.windowBits);
-    }
-    convert(bytes) {
-      let sink = new io._BufferSink();
-      let _ = this.startChunkedConversion(sink);
-      _.add(bytes);
-      _.close();
-      return sink.builder.takeBytes();
-    }
-    startChunkedConversion(sink) {
-      if (!convert.ByteConversionSink.is(sink)) {
-        sink = convert.ByteConversionSink.from(sink);
-      }
-      return new io._ZLibEncoderSink(convert.ByteConversionSink._check(sink), this.gzip, this.level, this.windowBits, this.memLevel, this.strategy, this.dictionary, this.raw);
-    }
-  };
-  dart.addSimpleTypeTests(io.ZLibEncoder);
-  dart.setSignature(io.ZLibEncoder, {
-    constructors: () => ({new: dart.definiteFunctionType(io.ZLibEncoder, [], {gzip: core.bool, level: core.int, windowBits: core.int, memLevel: core.int, strategy: core.int, dictionary: ListOfint(), raw: core.bool})}),
-    fields: () => ({
-      gzip: core.bool,
-      level: core.int,
-      memLevel: core.int,
-      strategy: core.int,
-      windowBits: core.int,
-      dictionary: ListOfint(),
-      raw: core.bool
-    }),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
-    })
-  });
-  io.ZLibDecoder = class ZLibDecoder extends convert.Converter$(core.List$(core.int), core.List$(core.int)) {
-    new(opts) {
-      let windowBits = opts && 'windowBits' in opts ? opts.windowBits : io.ZLibOption.DEFAULT_WINDOW_BITS;
-      let dictionary = opts && 'dictionary' in opts ? opts.dictionary : null;
-      let raw = opts && 'raw' in opts ? opts.raw : false;
-      this.windowBits = windowBits;
-      this.dictionary = dictionary;
-      this.raw = raw;
-      super.new();
-      io._validateZLibWindowBits(this.windowBits);
-    }
-    convert(bytes) {
-      let sink = new io._BufferSink();
-      let _ = this.startChunkedConversion(sink);
-      _.add(bytes);
-      _.close();
-      return sink.builder.takeBytes();
-    }
-    startChunkedConversion(sink) {
-      if (!convert.ByteConversionSink.is(sink)) {
-        sink = convert.ByteConversionSink.from(sink);
-      }
-      return new io._ZLibDecoderSink(convert.ByteConversionSink._check(sink), this.windowBits, this.dictionary, this.raw);
-    }
-  };
-  dart.addSimpleTypeTests(io.ZLibDecoder);
-  dart.setSignature(io.ZLibDecoder, {
-    constructors: () => ({new: dart.definiteFunctionType(io.ZLibDecoder, [], {windowBits: core.int, dictionary: ListOfint(), raw: core.bool})}),
-    fields: () => ({
-      windowBits: core.int,
-      dictionary: ListOfint(),
-      raw: core.bool
-    }),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [ListOfint()]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfListOfint()])
-    })
-  });
-  io._BufferSink = class _BufferSink extends convert.ByteConversionSink {
-    new() {
-      this.builder = io.BytesBuilder.new({copy: false});
-      super.new();
-    }
-    add(chunk) {
-      this.builder.add(chunk);
-    }
-    addSlice(chunk, start, end, isLast) {
-      if (typed_data.Uint8List.is(chunk)) {
-        let list = chunk;
-        this.builder.add(typed_data.Uint8List.view(list[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
-      } else {
-        this.builder.add(chunk[dartx.sublist](start, end));
-      }
-    }
-    close() {}
-  };
-  dart.setSignature(io._BufferSink, {
-    fields: () => ({builder: io.BytesBuilder}),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _sink$0 = Symbol('_sink');
-  const _filter$ = Symbol('_filter');
-  const _closed = Symbol('_closed');
-  const _empty = Symbol('_empty');
-  let const$52;
-  io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
-    new(sink, filter) {
-      this[_sink$0] = sink;
-      this[_filter$] = filter;
-      this[_closed] = false;
-      this[_empty] = true;
-      super.new();
-    }
-    add(data) {
-      this.addSlice(data, 0, data[dartx.length], false);
-    }
-    addSlice(data, start, end, isLast) {
-      if (dart.test(this[_closed])) return;
-      if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
-      core.RangeError.checkValidRange(start, end, data[dartx.length]);
-      try {
-        this[_empty] = false;
-        let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-        this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
-        let out = null;
-        while ((out = this[_filter$].processed({flush: false})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
-        }
-      } catch (e) {
-        this[_closed] = true;
-        throw e;
-      }
-
-      if (dart.test(isLast)) this.close();
-    }
-    close() {
-      if (dart.test(this[_closed])) return;
-      if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
-      try {
-        let out = null;
-        while ((out = this[_filter$].processed({end: true})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
-        }
-      } catch (e) {
-        this[_closed] = true;
-        dart.throw(e);
-      }
-
-      this[_closed] = true;
-      this[_sink$0].close();
-    }
-  };
-  dart.setSignature(io._FilterSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
-    fields: () => ({
-      [_filter$]: io._Filter,
-      [_sink$0]: convert.ByteConversionSink,
-      [_closed]: core.bool,
-      [_empty]: core.bool
-    }),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  io._ZLibEncoderSink = class _ZLibEncoderSink extends io._FilterSink {
-    new(sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
-      super.new(sink, io._Filter._newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw));
-    }
-  };
-  dart.setSignature(io._ZLibEncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ZLibEncoderSink, [convert.ByteConversionSink, core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool])})
-  });
-  io._ZLibDecoderSink = class _ZLibDecoderSink extends io._FilterSink {
-    new(sink, windowBits, dictionary, raw) {
-      super.new(sink, io._Filter._newZLibInflateFilter(windowBits, dictionary, raw));
-    }
-  };
-  dart.setSignature(io._ZLibDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ZLibDecoderSink, [convert.ByteConversionSink, core.int, ListOfint(), core.bool])})
-  });
-  io._Filter = class _Filter extends core.Object {
-    static _newZLibDeflateFilter(gzip, level, windowBits, memLevel, strategy, dictionary, raw) {
-      dart.throw(new core.UnsupportedError("_newZLibDeflateFilter"));
-    }
-    static _newZLibInflateFilter(windowBits, dictionary, raw) {
-      dart.throw(new core.UnsupportedError("_newZLibInflateFilter"));
-    }
-  };
-  dart.setSignature(io._Filter, {
-    statics: () => ({
-      _newZLibDeflateFilter: dart.definiteFunctionType(io._Filter, [core.bool, core.int, core.int, core.int, core.int, ListOfint(), core.bool]),
-      _newZLibInflateFilter: dart.definiteFunctionType(io._Filter, [core.int, ListOfint(), core.bool])
-    }),
-    names: ['_newZLibDeflateFilter', '_newZLibInflateFilter']
-  });
-  io._validateZLibWindowBits = function(windowBits) {
-    if (io.ZLibOption.MIN_WINDOW_BITS > dart.notNull(windowBits) || io.ZLibOption.MAX_WINDOW_BITS < dart.notNull(windowBits)) {
-      dart.throw(new core.RangeError.range(windowBits, io.ZLibOption.MIN_WINDOW_BITS, io.ZLibOption.MAX_WINDOW_BITS));
-    }
-  };
-  dart.fn(io._validateZLibWindowBits, intTovoid());
-  io._validateZLibeLevel = function(level) {
-    if (io.ZLibOption.MIN_LEVEL > dart.notNull(level) || io.ZLibOption.MAX_LEVEL < dart.notNull(level)) {
-      dart.throw(new core.RangeError.range(level, io.ZLibOption.MIN_LEVEL, io.ZLibOption.MAX_LEVEL));
-    }
-  };
-  dart.fn(io._validateZLibeLevel, intTovoid());
-  io._validateZLibMemLevel = function(memLevel) {
-    if (io.ZLibOption.MIN_MEM_LEVEL > dart.notNull(memLevel) || io.ZLibOption.MAX_MEM_LEVEL < dart.notNull(memLevel)) {
-      dart.throw(new core.RangeError.range(memLevel, io.ZLibOption.MIN_MEM_LEVEL, io.ZLibOption.MAX_MEM_LEVEL));
-    }
-  };
-  dart.fn(io._validateZLibMemLevel, intTovoid());
-  let const$53;
-  io._validateZLibStrategy = function(strategy) {
-    let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
-    if (strategies[dartx.indexOf](strategy) == -1) {
-      dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
-    }
-  };
-  dart.fn(io._validateZLibStrategy, intTovoid());
-  io.Directory = class Directory extends core.Object {
-    static new(path) {
-      return new io._Directory(path);
-    }
-    static fromUri(uri) {
-      return io.Directory.new(uri.toFilePath());
-    }
-    static get current() {
-      return io._Directory.current;
-    }
-    static set current(path) {
-      io._Directory.current = path;
-    }
-    static get systemTemp() {
-      return io._Directory.systemTemp;
-    }
-  };
-  io.Directory[dart.implements] = () => [io.FileSystemEntity];
-  dart.setSignature(io.Directory, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.Directory, [core.String]),
-      fromUri: dart.definiteFunctionType(io.Directory, [core.Uri])
-    }),
-    fields: () => ({path: core.String}),
-    sgetters: () => ({
-      current: dart.definiteFunctionType(io.Directory, []),
-      systemTemp: dart.definiteFunctionType(io.Directory, [])
-    }),
-    ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])})
-  });
-  const _isErrorResponse = Symbol('_isErrorResponse');
-  const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
-  const _absolutePath = Symbol('_absolutePath');
-  const _computeExistingIndex = Symbol('_computeExistingIndex');
-  const _delete = Symbol('_delete');
-  const _deleteSync = Symbol('_deleteSync');
-  const _type = Symbol('_type');
-  io.FileSystemEntity = class FileSystemEntity extends core.Object {
-    get uri() {
-      return core.Uri.file(this.path);
-    }
-    resolveSymbolicLinks() {
-      return io._IOService._dispatch(io._FILE_RESOLVE_SYMBOLIC_LINKS, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot resolve symbolic links", this.path));
-        }
-        return FutureOrOfString()._check(response);
-      }, dynamicToFutureOrOfString()));
-    }
-    resolveSymbolicLinksSync() {
-      let result = io.FileSystemEntity._resolveSymbolicLinks(this.path);
-      io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
+  }
+};
+io._Link[dart.implements] = () => [io.Link];
+dart.setSignature(io._Link, {
+  constructors: () => ({new: dart.definiteFunctionType(io._Link, [core.String])}),
+  fields: () => ({path: core.String}),
+  getters: () => ({absolute: dart.definiteFunctionType(io.Link, [])}),
+  methods: () => ({
+    exists: dart.definiteFunctionType(async.Future$(core.bool), []),
+    existsSync: dart.definiteFunctionType(core.bool, []),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+    statSync: dart.definiteFunctionType(io.FileStat, []),
+    create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
+    createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
+    [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
+    updateSync: dart.definiteFunctionType(dart.void, [core.String]),
+    update: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
+    [_delete]: dart.definiteFunctionType(async.Future$(io.Link), [], {recursive: core.bool}),
+    [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
+    rename: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
+    renameSync: dart.definiteFunctionType(io.Link, [core.String]),
+    target: dart.definiteFunctionType(async.Future$(core.String), []),
+    targetSync: dart.definiteFunctionType(core.String, []),
+    [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [_exceptionFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])
+  }),
+  statics: () => ({throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String])}),
+  names: ['throwIfError']
+});
+io.Platform = class Platform extends core.Object {
+  static get numberOfProcessors() {
+    return io.Platform._numberOfProcessors;
+  }
+  static get pathSeparator() {
+    return io.Platform._pathSeparator;
+  }
+  static get operatingSystem() {
+    return io.Platform._operatingSystem;
+  }
+  static get localHostname() {
+    return io.Platform._localHostname;
+  }
+  static get environment() {
+    return io._Platform.environment;
+  }
+  static get executable() {
+    return io._Platform.executable;
+  }
+  static get resolvedExecutable() {
+    return io._Platform.resolvedExecutable;
+  }
+  static get script() {
+    return io._Platform.script;
+  }
+  static get executableArguments() {
+    return io._Platform.executableArguments;
+  }
+  static get packageRoot() {
+    return io._Platform.packageRoot;
+  }
+  static get packageConfig() {
+    return io._Platform.packageConfig;
+  }
+  static get version() {
+    return io.Platform._version;
+  }
+};
+dart.setSignature(io.Platform, {
+  sfields: () => ({
+    _numberOfProcessors: core.int,
+    _pathSeparator: core.String,
+    _operatingSystem: core.String,
+    _localHostname: core.String,
+    _version: core.String,
+    isLinux: core.bool,
+    isMacOS: core.bool,
+    isWindows: core.bool,
+    isAndroid: core.bool,
+    isIOS: core.bool
+  }),
+  sgetters: () => ({
+    numberOfProcessors: dart.definiteFunctionType(core.int, []),
+    pathSeparator: dart.definiteFunctionType(core.String, []),
+    operatingSystem: dart.definiteFunctionType(core.String, []),
+    localHostname: dart.definiteFunctionType(core.String, []),
+    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    executable: dart.definiteFunctionType(core.String, []),
+    resolvedExecutable: dart.definiteFunctionType(core.String, []),
+    script: dart.definiteFunctionType(core.Uri, []),
+    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
+    packageRoot: dart.definiteFunctionType(core.String, []),
+    packageConfig: dart.definiteFunctionType(core.String, []),
+    version: dart.definiteFunctionType(core.String, [])
+  })
+});
+dart.defineLazy(io.Platform, {
+  get _numberOfProcessors() {
+    return io._Platform.numberOfProcessors;
+  },
+  get _pathSeparator() {
+    return io._Platform.pathSeparator;
+  },
+  get _operatingSystem() {
+    return io._Platform.operatingSystem;
+  },
+  get _localHostname() {
+    return io._Platform.localHostname;
+  },
+  get _version() {
+    return io._Platform.version;
+  },
+  get isLinux() {
+    return io.Platform._operatingSystem == "linux";
+  },
+  get isMacOS() {
+    return io.Platform._operatingSystem == "macos";
+  },
+  get isWindows() {
+    return io.Platform._operatingSystem == "windows";
+  },
+  get isAndroid() {
+    return io.Platform._operatingSystem == "android";
+  },
+  get isIOS() {
+    return io.Platform._operatingSystem == "ios";
+  }
+});
+io._Platform = class _Platform extends core.Object {
+  static _numberOfProcessors() {
+    dart.throw(new core.UnsupportedError("Platform._numberOfProcessors"));
+  }
+  static _pathSeparator() {
+    dart.throw(new core.UnsupportedError("Platform._pathSeparator"));
+  }
+  static _operatingSystem() {
+    dart.throw(new core.UnsupportedError("Platform._operatingSystem"));
+  }
+  static _localHostname() {
+    dart.throw(new core.UnsupportedError("Platform._localHostname"));
+  }
+  static _executable() {
+    dart.throw(new core.UnsupportedError("Platform._executable"));
+  }
+  static _resolvedExecutable() {
+    dart.throw(new core.UnsupportedError("Platform._resolvedExecutable"));
+  }
+  static _environment() {
+    dart.throw(new core.UnsupportedError("Platform._environment"));
+  }
+  static _executableArguments() {
+    dart.throw(new core.UnsupportedError("Platform._executableArguments"));
+  }
+  static _packageRoot() {
+    dart.throw(new core.UnsupportedError("Platform._packageRoot"));
+  }
+  static _packageConfig() {
+    dart.throw(new core.UnsupportedError("Platform._packageConfig"));
+  }
+  static _version() {
+    dart.throw(new core.UnsupportedError("Platform._version"));
+  }
+  static get numberOfProcessors() {
+    return io._Platform._numberOfProcessors();
+  }
+  static get pathSeparator() {
+    return io._Platform._pathSeparator();
+  }
+  static get operatingSystem() {
+    return io._Platform._operatingSystem();
+  }
+  static get localHostname() {
+    let result = io._Platform._localHostname();
+    if (io.OSError.is(result)) {
+      dart.throw(result);
+    } else {
       return core.String._check(result);
     }
-    delete(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      return this[_delete]({recursive: recursive});
-    }
-    deleteSync(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      return this[_deleteSync]({recursive: recursive});
-    }
-    watch(opts) {
-      let events = opts && 'events' in opts ? opts.events : io.FileSystemEvent.ALL;
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      return io._FileSystemWatcher._watch(io.FileSystemEntity._trimTrailingPathSeparators(this.path), events, recursive);
-    }
-    static identical(path1, path2) {
-      return io._IOService._dispatch(io._FILE_IDENTICAL, JSArrayOfString().of([path1, path2])).then(core.bool)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, dart.str`Error in FileSystemEntity.identical(${path1}, ${path2})`, ""));
-        }
-        return FutureOrOfbool()._check(response);
-      }, dynamicToFutureOrOfbool()));
-    }
-    get isAbsolute() {
-      if (dart.test(io.Platform.isWindows)) {
-        return this.path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern);
-      } else {
-        return this.path[dartx.startsWith]('/');
-      }
-    }
-    get [_absolutePath]() {
-      if (dart.test(this.isAbsolute)) return this.path;
-      let current = io.Directory.current.path;
-      if (dart.test(current[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(current[dartx.endsWith]('\\'))) {
-        return dart.str`${current}${this.path}`;
-      } else {
-        return dart.str`${current}${io.Platform.pathSeparator}${this.path}`;
-      }
-    }
-    static identicalSync(path1, path2) {
-      let result = io.FileSystemEntity._identical(path1, path2);
-      io.FileSystemEntity._throwIfError(result, 'Error in FileSystemEntity.identicalSync');
-      return core.bool._check(result);
-    }
-    static get isWatchSupported() {
-      return io._FileSystemWatcher.isSupported;
-    }
-    static type(path, opts) {
-      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      return io.FileSystemEntity._getTypeAsync(path, followLinks).then(io.FileSystemEntityType)(io.FileSystemEntityType._lookup);
-    }
-    static typeSync(path, opts) {
-      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      return io.FileSystemEntityType._lookup(io.FileSystemEntity._getTypeSync(path, followLinks));
-    }
-    static isLink(path) {
-      return io.FileSystemEntity._getTypeAsync(path, false).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.LINK[_type], intTobool()));
-    }
-    static isFile(path) {
-      return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.FILE[_type], intTobool()));
-    }
-    static isDirectory(path) {
-      return io.FileSystemEntity._getTypeAsync(path, true).then(core.bool)(dart.fn(type => type == io.FileSystemEntityType.DIRECTORY[_type], intTobool()));
-    }
-    static isLinkSync(path) {
-      return io.FileSystemEntity._getTypeSync(path, false) == io.FileSystemEntityType.LINK[_type];
-    }
-    static isFileSync(path) {
-      return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.FILE[_type];
-    }
-    static isDirectorySync(path) {
-      return io.FileSystemEntity._getTypeSync(path, true) == io.FileSystemEntityType.DIRECTORY[_type];
-    }
-    static _getType(path, followLinks) {
-      dart.throw(new core.UnsupportedError("FileSystemEntity._getType"));
-    }
-    static _identical(path1, path2) {
-      dart.throw(new core.UnsupportedError("FileSystemEntity._identical"));
-    }
-    static _resolveSymbolicLinks(path) {
-      dart.throw(new core.UnsupportedError("FileSystemEntity._resolveSymbolicLinks"));
-    }
-    static parentOf(path) {
-      let rootEnd = -1;
-      if (dart.test(io.Platform.isWindows)) {
-        if (dart.test(path[dartx.startsWith](io.FileSystemEntity._absoluteWindowsPathPattern))) {
-          rootEnd = path[dartx.indexOf](core.RegExp.new('[/\\\\]'), 2);
-          if (rootEnd == -1) return path;
-        } else if (dart.test(path[dartx.startsWith]('\\')) || dart.test(path[dartx.startsWith]('/'))) {
-          rootEnd = 0;
-        }
-      } else if (dart.test(path[dartx.startsWith]('/'))) {
-        rootEnd = 0;
-      }
-      let pos = path[dartx.lastIndexOf](io.FileSystemEntity._parentRegExp);
-      if (dart.notNull(pos) > dart.notNull(rootEnd)) {
-        return path[dartx.substring](0, dart.notNull(pos) + 1);
-      } else if (dart.notNull(rootEnd) > -1) {
-        return path[dartx.substring](0, dart.notNull(rootEnd) + 1);
-      } else {
-        return '.';
-      }
-    }
-    get parent() {
-      return io.Directory.new(io.FileSystemEntity.parentOf(this.path));
-    }
-    static _getTypeSync(path, followLinks) {
-      let result = io.FileSystemEntity._getType(path, followLinks);
-      io.FileSystemEntity._throwIfError(result, 'Error getting type of FileSystemEntity');
-      return core.int._check(result);
-    }
-    static _getTypeAsync(path, followLinks) {
-      return io._IOService._dispatch(io._FILE_TYPE, JSArrayOfObject().of([path, followLinks])).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Error getting type", path));
-        }
-        return FutureOrOfint()._check(response);
-      }, dynamicToFutureOrOfint()));
-    }
-    static _throwIfError(result, msg, path) {
-      if (path === void 0) path = null;
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException(msg, path, result));
-      } else if (core.ArgumentError.is(result)) {
-        dart.throw(result);
-      }
-    }
-    static _trimTrailingPathSeparators(path) {
-      if (!(typeof path == 'string')) return path;
-      if (dart.test(io.Platform.isWindows)) {
-        while (dart.notNull(path[dartx.length]) > 1 && (dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) || dart.test(path[dartx.endsWith]('/')))) {
-          path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
-        }
-      } else {
-        while (dart.notNull(path[dartx.length]) > 1 && dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
-          path = path[dartx.substring](0, dart.notNull(path[dartx.length]) - 1);
-        }
-      }
-      return path;
-    }
-    static _ensureTrailingPathSeparators(path) {
-      if (!(typeof path == 'string')) return path;
-      if (dart.test(path[dartx.isEmpty])) path = '.';
-      if (dart.test(io.Platform.isWindows)) {
-        while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator)) && !dart.test(path[dartx.endsWith]('/'))) {
-          path = dart.str`${path}${io.Platform.pathSeparator}`;
-        }
-      } else {
-        while (!dart.test(path[dartx.endsWith](io.Platform.pathSeparator))) {
-          path = dart.str`${path}${io.Platform.pathSeparator}`;
-        }
-      }
-      return path;
-    }
-  };
-  dart.setSignature(io.FileSystemEntity, {
-    getters: () => ({
-      uri: dart.definiteFunctionType(core.Uri, []),
-      isAbsolute: dart.definiteFunctionType(core.bool, []),
-      [_absolutePath]: dart.definiteFunctionType(core.String, []),
-      parent: dart.definiteFunctionType(io.Directory, [])
-    }),
-    methods: () => ({
-      resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
-      resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
-      delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
-      deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
-    }),
-    sfields: () => ({
-      _absoluteWindowsPathPattern: core.RegExp,
-      _parentRegExp: core.RegExp
-    }),
-    sgetters: () => ({isWatchSupported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      identical: dart.definiteFunctionType(async.Future$(core.bool), [core.String, core.String]),
-      identicalSync: dart.definiteFunctionType(core.bool, [core.String, core.String]),
-      type: dart.definiteFunctionType(async.Future$(io.FileSystemEntityType), [core.String], {followLinks: core.bool}),
-      typeSync: dart.definiteFunctionType(io.FileSystemEntityType, [core.String], {followLinks: core.bool}),
-      isLink: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
-      isFile: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
-      isDirectory: dart.definiteFunctionType(async.Future$(core.bool), [core.String]),
-      isLinkSync: dart.definiteFunctionType(core.bool, [core.String]),
-      isFileSync: dart.definiteFunctionType(core.bool, [core.String]),
-      isDirectorySync: dart.definiteFunctionType(core.bool, [core.String]),
-      _getType: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
-      _identical: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _resolveSymbolicLinks: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      parentOf: dart.definiteFunctionType(core.String, [core.String]),
-      _getTypeSync: dart.definiteFunctionType(core.int, [core.String, core.bool]),
-      _getTypeAsync: dart.definiteFunctionType(async.Future$(core.int), [core.String, core.bool]),
-      _throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String]),
-      _trimTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String]),
-      _ensureTrailingPathSeparators: dart.definiteFunctionType(core.String, [core.String])
-    }),
-    names: ['identical', 'identicalSync', 'type', 'typeSync', 'isLink', 'isFile', 'isDirectory', 'isLinkSync', 'isFileSync', 'isDirectorySync', '_getType', '_identical', '_resolveSymbolicLinks', 'parentOf', '_getTypeSync', '_getTypeAsync', '_throwIfError', '_trimTrailingPathSeparators', '_ensureTrailingPathSeparators']
-  });
-  dart.defineLazy(io.FileSystemEntity, {
-    get _absoluteWindowsPathPattern() {
-      return core.RegExp.new('^(\\\\\\\\|[a-zA-Z]:[/\\\\])');
-    },
-    get _parentRegExp() {
-      return dart.test(io.Platform.isWindows) ? core.RegExp.new('[^/\\\\][/\\\\]+[^/\\\\]') : core.RegExp.new('[^/]/+[^/]');
-    }
-  });
-  io._Directory = class _Directory extends io.FileSystemEntity {
-    new(path) {
-      this.path = path;
-      if (!(typeof this.path == 'string')) {
-        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
-      }
-    }
-    static _current() {
-      dart.throw(new core.UnsupportedError("Directory._current"));
-    }
-    static _setCurrent(path) {
-      dart.throw(new core.UnsupportedError("Directory_SetCurrent"));
-    }
-    static _createTemp(path) {
-      dart.throw(new core.UnsupportedError("Directory._createTemp"));
-    }
-    static _systemTemp() {
-      dart.throw(new core.UnsupportedError("Directory._systemTemp"));
-    }
-    static _exists(path) {
-      dart.throw(new core.UnsupportedError("Directory._exists"));
-    }
-    static _create(path) {
-      dart.throw(new core.UnsupportedError("Directory._create"));
-    }
-    static _deleteNative(path, recursive) {
-      dart.throw(new core.UnsupportedError("Directory._deleteNative"));
-    }
-    static _rename(path, newPath) {
-      dart.throw(new core.UnsupportedError("Directory._rename"));
-    }
-    static _fillWithDirectoryListing(list, path, recursive, followLinks) {
-      dart.throw(new core.UnsupportedError("Directory._fillWithDirectoryListing"));
-    }
-    static get current() {
-      let result = io._Directory._current();
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Getting current working directory failed", "", result));
-      }
-      return new io._Directory(core.String._check(result));
-    }
-    static set current(path) {
-      if (io.Directory.is(path)) path = dart.dload(path, 'path');
-      let result = io._Directory._setCurrent(path);
-      if (core.ArgumentError.is(result)) dart.throw(result);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Setting current working directory failed", core.String._check(path), result));
-      }
-    }
-    get uri() {
-      return core.Uri.directory(this.path);
-    }
-    exists() {
-      return io._IOService._dispatch(io._DIRECTORY_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
-        }
-        return dart.equals(response, 1);
-      }, dynamicTobool$()));
-    }
-    existsSync() {
-      let result = io._Directory._exists(this.path);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Exists failed", this.path, result));
-      }
-      return dart.equals(result, 1);
-    }
-    get absolute() {
-      return io.Directory.new(this[_absolutePath]);
-    }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
-    [_computeExistingIndex](dirsToCreate) {
-      let future = null;
-      let notFound = dirsToCreate[dartx.length];
-      for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
-        if (future == null) {
-          future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        } else {
-          future = dart.dsend(future, 'then', dart.fn(index => {
-            if (!dart.equals(index, notFound)) {
-              return async.Future.value(index);
-            }
-            return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-          }, dynamicTodynamic$()));
-        }
-      }
-      if (future == null) {
-        return FutureOfint().value(notFound);
-      } else {
-        return FutureOfint()._check(future);
-      }
-    }
-    create(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        return this.exists().then(io.Directory)(dart.fn(exists => {
-          if (dart.test(exists)) return this;
-          if (this.path != this.parent.path) {
-            return this.parent.create({recursive: true}).then(io.Directory)(dart.fn(_ => this.create(), DirectoryToFutureOfDirectory()));
-          } else {
-            return this.create();
+  }
+  static get executableArguments() {
+    return io._Platform._executableArguments();
+  }
+  static get environment() {
+    if (io._Platform._environmentCache == null) {
+      let env = io._Platform._environment();
+      if (!io.OSError.is(env)) {
+        let isWindows = io._Platform.operatingSystem == 'windows';
+        let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
+        for (let str of core.Iterable._check(env)) {
+          let equalsIndex = dart.dsend(str, 'indexOf', '=');
+          if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
+            result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
           }
-        }, boolToFutureOrOfDirectory()));
+        }
+        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
       } else {
-        return io._IOService._dispatch(io._DIRECTORY_CREATE, JSArrayOfString().of([this.path])).then(io._Directory)(dart.fn(response => {
-          if (dart.test(this[_isErrorResponse](response))) {
-            dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation failed"));
-          }
-          return this;
-        }, dynamicTo_Directory()));
+        io._Platform._environmentCache = env;
       }
     }
-    createSync(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        if (dart.test(this.existsSync())) return;
-        if (this.path != this.parent.path) {
-          this.parent.createSync({recursive: true});
-        }
-      }
-      let result = io._Directory._create(this.path);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Creation failed", this.path, result));
-      }
+    if (io.OSError.is(io._Platform._environmentCache)) {
+      dart.throw(io._Platform._environmentCache);
+    } else {
+      return MapOfString$String()._check(io._Platform._environmentCache);
     }
-    static get systemTemp() {
-      return io.Directory.new(io._Directory._systemTemp());
-    }
-    createTemp(prefix) {
-      if (prefix === void 0) prefix = null;
-      if (prefix == null) prefix = '';
-      if (this.path == '') {
-        dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
-      }
-      let fullPrefix = null;
-      if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
-        fullPrefix = dart.str`${this.path}${prefix}`;
-      } else {
-        fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
-      }
-      return io._IOService._dispatch(io._DIRECTORY_CREATE_TEMP, JSArrayOfString().of([fullPrefix])).then(io.Directory)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionOrErrorFromResponse](response, "Creation of temporary directory failed"));
-        }
-        return io.Directory.new(core.String._check(response));
-      }, dynamicToDirectory()));
-    }
-    createTempSync(prefix) {
-      if (prefix === void 0) prefix = null;
-      if (prefix == null) prefix = '';
-      if (this.path == '') {
-        dart.throw(new core.ArgumentError("Directory.createTemp called with an empty path. " + "To use the system temp directory, use Directory.systemTemp"));
-      }
-      let fullPrefix = null;
-      if (dart.test(this.path[dartx.endsWith]('/')) || dart.test(io.Platform.isWindows) && dart.test(this.path[dartx.endsWith]('\\'))) {
-        fullPrefix = dart.str`${this.path}${prefix}`;
-      } else {
-        fullPrefix = dart.str`${this.path}${io.Platform.pathSeparator}${prefix}`;
-      }
-      let result = io._Directory._createTemp(fullPrefix);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Creation of temporary directory failed", fullPrefix, result));
-      }
-      return io.Directory.new(core.String._check(result));
-    }
-    [_delete](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      return io._IOService._dispatch(io._DIRECTORY_DELETE, JSArrayOfObject().of([this.path, recursive])).then(io._Directory)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionOrErrorFromResponse](response, "Deletion failed"));
-        }
-        return this;
-      }, dynamicTo_Directory()));
-    }
-    [_deleteSync](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      let result = io._Directory._deleteNative(this.path, recursive);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Deletion failed", this.path, result));
-      }
-    }
-    rename(newPath) {
-      return io._IOService._dispatch(io._DIRECTORY_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.Directory)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionOrErrorFromResponse](response, "Rename failed"));
-        }
-        return io.Directory.new(newPath);
-      }, dynamicToDirectory()));
-    }
-    renameSync(newPath) {
-      if (!(typeof newPath == 'string')) {
-        dart.throw(new core.ArgumentError());
-      }
-      let result = io._Directory._rename(this.path, newPath);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("Rename failed", this.path, result));
-      }
-      return io.Directory.new(newPath);
-    }
-    list(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
-    }
-    listSync(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      if (!(typeof recursive == 'boolean') || !(typeof followLinks == 'boolean')) {
-        dart.throw(new core.ArgumentError());
-      }
-      let result = JSArrayOfFileSystemEntity().of([]);
-      io._Directory._fillWithDirectoryListing(result, io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks);
-      return result;
-    }
-    toString() {
-      return dart.str`Directory: '${this.path}'`;
-    }
-    [_isErrorResponse](response) {
-      return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
-    }
-    [_exceptionOrErrorFromResponse](response, message) {
-      dart.assert(this[_isErrorResponse](response));
-      switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
-        case io._ILLEGAL_ARGUMENT_RESPONSE:
-        {
-          return new core.ArgumentError();
-        }
-        case io._OSERROR_RESPONSE:
-        {
-          let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
-          return new io.FileSystemException(message, this.path, err);
-        }
-        default:
-        {
-          return core.Exception.new("Unknown error");
-        }
-      }
-    }
-  };
-  io._Directory[dart.implements] = () => [io.Directory];
-  dart.setSignature(io._Directory, {
-    constructors: () => ({new: dart.definiteFunctionType(io._Directory, [core.String])}),
-    fields: () => ({path: core.String}),
-    getters: () => ({absolute: dart.definiteFunctionType(io.Directory, [])}),
-    methods: () => ({
-      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
-      existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
-      [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
-      create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
-      createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
-      createTempSync: dart.definiteFunctionType(io.Directory, [], [core.String]),
-      [_delete]: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
-      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      rename: dart.definiteFunctionType(async.Future$(io.Directory), [core.String]),
-      renameSync: dart.definiteFunctionType(io.Directory, [core.String]),
-      list: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
-      listSync: dart.definiteFunctionType(core.List$(io.FileSystemEntity), [], {recursive: core.bool, followLinks: core.bool}),
-      [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [_exceptionOrErrorFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String])
-    }),
-    sgetters: () => ({
-      current: dart.definiteFunctionType(io.Directory, []),
-      systemTemp: dart.definiteFunctionType(io.Directory, [])
-    }),
-    ssetters: () => ({current: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
-    statics: () => ({
-      _current: dart.definiteFunctionType(dart.dynamic, []),
-      _setCurrent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _createTemp: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _systemTemp: dart.definiteFunctionType(core.String, []),
-      _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String, core.bool]),
-      _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _fillWithDirectoryListing: dart.definiteFunctionType(dart.void, [ListOfFileSystemEntity(), core.String, core.bool, core.bool])
-    }),
-    names: ['_current', '_setCurrent', '_createTemp', '_systemTemp', '_exists', '_create', '_deleteNative', '_rename', '_fillWithDirectoryListing']
-  });
-  io._AsyncDirectoryListerOps = class _AsyncDirectoryListerOps extends core.Object {
-    static new(pointer) {
-      dart.throw(new core.UnsupportedError("Directory._list"));
-    }
-  };
-  dart.setSignature(io._AsyncDirectoryListerOps, {
-    constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryListerOps, [core.int])})
-  });
-  const _ops = Symbol('_ops');
-  const _pointer = Symbol('_pointer');
-  const _cleanup = Symbol('_cleanup');
-  io._AsyncDirectoryLister = class _AsyncDirectoryLister extends core.Object {
-    new(path, recursive, followLinks) {
-      this.closeCompleter = async.Completer.new();
-      this.path = path;
-      this.recursive = recursive;
-      this.followLinks = followLinks;
-      this.controller = null;
-      this.canceled = false;
-      this.nextRunning = false;
-      this.closed = false;
-      this[_ops] = null;
-      this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
-    }
-    [_pointer]() {
-      return this[_ops] == null ? null : this[_ops].getPointer();
-    }
-    get stream() {
-      return this.controller.stream;
-    }
-    onListen() {
-      io._IOService._dispatch(io._DIRECTORY_LIST_START, JSArrayOfObject().of([this.path, this.recursive, this.followLinks])).then(dart.dynamic)(dart.fn(response => {
-        if (typeof response == 'number') {
-          this[_ops] = io._AsyncDirectoryListerOps.new(response);
-          this.next();
-        } else if (core.Error.is(response)) {
-          this.controller.addError(response, response.stackTrace);
-          this.close();
-        } else {
-          this.error(response);
-          this.close();
-        }
-      }, dynamicToNull$()));
-    }
-    onResume() {
-      if (!dart.test(this.nextRunning)) {
-        this.next();
-      }
-    }
-    onCancel() {
-      this.canceled = true;
-      if (!dart.test(this.nextRunning)) {
-        this.close();
-      }
-      return this.closeCompleter.future;
-    }
-    next() {
-      if (dart.test(this.canceled)) {
-        this.close();
-        return;
-      }
-      if (dart.test(this.controller.isPaused) || dart.test(this.nextRunning)) {
-        return;
-      }
-      let pointer = this[_pointer]();
-      if (pointer == null) {
-        return;
-      }
-      this.nextRunning = true;
-      io._IOService._dispatch(io._DIRECTORY_LIST_NEXT, JSArrayOfint().of([pointer])).then(dart.dynamic)(dart.fn(result => {
-        this.nextRunning = false;
-        if (core.List.is(result)) {
-          this.next();
-          dart.assert(result[dartx.length][dartx['%']](2) == 0);
-          for (let i = 0; i < dart.notNull(result[dartx.length]); i++) {
-            dart.assert(i[dartx['%']](2) == 0);
-            switch (result[dartx._get](i++)) {
-              case io._AsyncDirectoryLister.LIST_FILE:
-              {
-                this.controller.add(io.File.new(core.String._check(result[dartx._get](i))));
-                break;
-              }
-              case io._AsyncDirectoryLister.LIST_DIRECTORY:
-              {
-                this.controller.add(io.Directory.new(core.String._check(result[dartx._get](i))));
-                break;
-              }
-              case io._AsyncDirectoryLister.LIST_LINK:
-              {
-                this.controller.add(io.Link.new(core.String._check(result[dartx._get](i))));
-                break;
-              }
-              case io._AsyncDirectoryLister.LIST_ERROR:
-              {
-                this.error(result[dartx._get](i));
-                break;
-              }
-              case io._AsyncDirectoryLister.LIST_DONE:
-              {
-                this.canceled = true;
-                return;
-              }
-            }
-          }
-        } else {
-          this.controller.addError(new io.FileSystemException("Internal error"));
-        }
-      }, dynamicToNull$()));
-    }
-    [_cleanup]() {
-      this.controller.close();
-      this.closeCompleter.complete();
-      this[_ops] = null;
-    }
-    close() {
-      if (dart.test(this.closed)) {
-        return;
-      }
-      if (dart.test(this.nextRunning)) {
-        return;
-      }
-      this.closed = true;
-      let pointer = this[_pointer]();
-      if (pointer == null) {
-        this[_cleanup]();
-      } else {
-        io._IOService._dispatch(io._DIRECTORY_LIST_STOP, JSArrayOfint().of([pointer])).whenComplete(dart.bind(this, _cleanup));
-      }
-    }
-    error(message) {
-      let errorType = dart.dindex(dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR), io._ERROR_RESPONSE_ERROR_TYPE);
-      if (dart.equals(errorType, io._ILLEGAL_ARGUMENT_RESPONSE)) {
-        this.controller.addError(new core.ArgumentError());
-      } else if (dart.equals(errorType, io._OSERROR_RESPONSE)) {
-        let responseError = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_ERROR);
-        let err = new io.OSError(core.String._check(dart.dindex(responseError, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(responseError, io._OSERROR_RESPONSE_ERROR_CODE)));
-        let errorPath = dart.dindex(message, io._AsyncDirectoryLister.RESPONSE_PATH);
-        if (errorPath == null) errorPath = this.path;
-        this.controller.addError(new io.FileSystemException("Directory listing failed", core.String._check(errorPath), err));
-      } else {
-        this.controller.addError(new io.FileSystemException("Internal error"));
-      }
-    }
-  };
-  dart.setSignature(io._AsyncDirectoryLister, {
-    constructors: () => ({new: dart.definiteFunctionType(io._AsyncDirectoryLister, [core.String, core.bool, core.bool])}),
-    fields: () => ({
-      path: core.String,
-      recursive: core.bool,
-      followLinks: core.bool,
-      controller: async.StreamController,
-      canceled: core.bool,
-      nextRunning: core.bool,
-      closed: core.bool,
-      [_ops]: io._AsyncDirectoryListerOps,
-      closeCompleter: async.Completer
-    }),
-    getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
-    methods: () => ({
-      [_pointer]: dart.definiteFunctionType(core.int, []),
-      onListen: dart.definiteFunctionType(dart.void, []),
-      onResume: dart.definiteFunctionType(dart.void, []),
-      onCancel: dart.definiteFunctionType(async.Future, []),
-      next: dart.definiteFunctionType(dart.void, []),
-      [_cleanup]: dart.definiteFunctionType(dart.void, []),
-      close: dart.definiteFunctionType(dart.void, []),
-      error: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    sfields: () => ({
-      LIST_FILE: core.int,
-      LIST_DIRECTORY: core.int,
-      LIST_LINK: core.int,
-      LIST_ERROR: core.int,
-      LIST_DONE: core.int,
-      RESPONSE_TYPE: core.int,
-      RESPONSE_PATH: core.int,
-      RESPONSE_COMPLETE: core.int,
-      RESPONSE_ERROR: core.int
-    })
-  });
-  io._AsyncDirectoryLister.LIST_FILE = 0;
-  io._AsyncDirectoryLister.LIST_DIRECTORY = 1;
-  io._AsyncDirectoryLister.LIST_LINK = 2;
-  io._AsyncDirectoryLister.LIST_ERROR = 3;
-  io._AsyncDirectoryLister.LIST_DONE = 4;
-  io._AsyncDirectoryLister.RESPONSE_TYPE = 0;
-  io._AsyncDirectoryLister.RESPONSE_PATH = 1;
-  io._AsyncDirectoryLister.RESPONSE_COMPLETE = 1;
-  io._AsyncDirectoryLister.RESPONSE_ERROR = 2;
-  io._EventHandler = class _EventHandler extends core.Object {
-    static _sendData(sender, sendPort, data) {
-      dart.throw(new core.UnsupportedError("EventHandler._sendData"));
-    }
-  };
-  dart.setSignature(io._EventHandler, {
-    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
-    names: ['_sendData']
-  });
-  const _mode = Symbol('_mode');
-  io.FileMode = class FileMode extends core.Object {
-    _internal(mode) {
-      this[_mode] = mode;
-    }
-  };
-  dart.defineNamedConstructor(io.FileMode, '_internal');
-  dart.setSignature(io.FileMode, {
-    constructors: () => ({_internal: dart.definiteFunctionType(io.FileMode, [core.int])}),
-    fields: () => ({[_mode]: core.int}),
-    sfields: () => ({
-      READ: io.FileMode,
-      WRITE: io.FileMode,
-      APPEND: io.FileMode,
-      WRITE_ONLY: io.FileMode,
-      WRITE_ONLY_APPEND: io.FileMode
-    })
-  });
-  dart.defineLazy(io.FileMode, {
-    get READ() {
-      return dart.const(new io.FileMode._internal(0));
-    },
-    get WRITE() {
-      return dart.const(new io.FileMode._internal(1));
-    },
-    get APPEND() {
-      return dart.const(new io.FileMode._internal(2));
-    },
-    get WRITE_ONLY() {
-      return dart.const(new io.FileMode._internal(3));
-    },
-    get WRITE_ONLY_APPEND() {
-      return dart.const(new io.FileMode._internal(4));
-    }
-  });
-  io.READ = io.FileMode.READ;
-  io.WRITE = io.FileMode.WRITE;
-  io.APPEND = io.FileMode.APPEND;
-  io.WRITE_ONLY = io.FileMode.WRITE_ONLY;
-  io.WRITE_ONLY_APPEND = io.FileMode.WRITE_ONLY_APPEND;
-  io.FileLock = class FileLock extends core.Object {
-    new(index) {
-      this.index = index;
-    }
-    toString() {
-      return {
-        0: "FileLock.SHARED",
-        1: "FileLock.EXCLUSIVE"
-      }[this.index];
-    }
-  };
-  dart.setSignature(io.FileLock, {
-    fields: () => ({index: core.int})
-  });
-  dart.defineEnumValues(io.FileLock, [
-    'SHARED',
-    'EXCLUSIVE'
-  ]);
-  io.File = class File extends core.Object {
-    static new(path) {
-      return new io._File(path);
-    }
-    static fromUri(uri) {
-      return io.File.new(uri.toFilePath());
-    }
-  };
-  io.File[dart.implements] = () => [io.FileSystemEntity];
-  dart.setSignature(io.File, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.File, [core.String]),
-      fromUri: dart.definiteFunctionType(io.File, [core.Uri])
-    })
-  });
-  io.RandomAccessFile = class RandomAccessFile extends core.Object {};
-  io.FileSystemException = class FileSystemException extends core.Object {
-    new(message, path, osError) {
-      if (message === void 0) message = "";
-      if (path === void 0) path = "";
-      if (osError === void 0) osError = null;
-      this.message = message;
-      this.path = path;
-      this.osError = osError;
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write("FileSystemException");
-      if (!dart.test(this.message[dartx.isEmpty])) {
-        sb.write(dart.str`: ${this.message}`);
-        if (this.path != null) {
-          sb.write(dart.str`, path = '${this.path}'`);
-        }
-        if (this.osError != null) {
-          sb.write(dart.str` (${this.osError})`);
-        }
-      } else if (this.osError != null) {
-        sb.write(dart.str`: ${this.osError}`);
-        if (this.path != null) {
-          sb.write(dart.str`, path = '${this.path}'`);
-        }
-      } else if (this.path != null) {
-        sb.write(dart.str`: ${this.path}`);
-      }
-      return sb.toString();
-    }
-  };
-  io.FileSystemException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.FileSystemException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.FileSystemException, [], [core.String, core.String, io.OSError])}),
-    fields: () => ({
-      message: core.String,
-      path: core.String,
-      osError: io.OSError
-    })
-  });
-  io._BLOCK_SIZE = 64 * 1024;
-  const _closeCompleter = Symbol('_closeCompleter');
-  const _path$ = Symbol('_path');
-  const _position$0 = Symbol('_position');
-  const _end$0 = Symbol('_end');
-  const _controller$0 = Symbol('_controller');
-  const _openedFile = Symbol('_openedFile');
-  const _unsubscribed = Symbol('_unsubscribed');
-  const _readInProgress = Symbol('_readInProgress');
-  const _atEnd = Symbol('_atEnd');
-  const _setupController = Symbol('_setupController');
-  const _start$2 = Symbol('_start');
-  const _readBlock = Symbol('_readBlock');
-  const _closeFile = Symbol('_closeFile');
-  io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
-    new(path, position, end) {
-      this[_closeCompleter] = async.Completer.new();
-      this[_path$] = path;
-      this[_position$0] = position;
-      this[_end$0] = end;
-      this[_controller$0] = null;
-      this[_openedFile] = null;
-      this[_unsubscribed] = false;
-      this[_readInProgress] = true;
-      this[_closed] = false;
-      this[_atEnd] = false;
-      super.new();
-      if (this[_position$0] == null) this[_position$0] = 0;
-    }
-    forStdin() {
-      this[_closeCompleter] = async.Completer.new();
-      this[_position$0] = 0;
-      this[_controller$0] = null;
-      this[_path$] = null;
-      this[_openedFile] = null;
-      this[_end$0] = null;
-      this[_unsubscribed] = false;
-      this[_readInProgress] = true;
-      this[_closed] = false;
-      this[_atEnd] = false;
-      super.new();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      this[_setupController]();
-      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    [_setupController]() {
-      this[_controller$0] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
-          this[_unsubscribed] = true;
-          return this[_closeFile]();
-        }, VoidToFuture())});
-    }
-    [_closeFile]() {
-      if (dart.test(this[_readInProgress]) || dart.test(this[_closed])) {
-        return this[_closeCompleter].future;
-      }
-      this[_closed] = true;
-      const done = (function() {
-        this[_closeCompleter].complete();
-        this[_controller$0].close();
-      }).bind(this);
-      dart.fn(done, VoidTovoid$());
-      this[_openedFile].close().catchError(dart.bind(this[_controller$0], 'addError')).whenComplete(done);
-      return this[_closeCompleter].future;
-    }
-    [_readBlock]() {
-      if (dart.test(this[_readInProgress])) return;
-      if (dart.test(this[_atEnd])) {
-        this[_closeFile]();
-        return;
-      }
-      this[_readInProgress] = true;
-      let readBytes = io._BLOCK_SIZE;
-      if (this[_end$0] != null) {
-        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
-        if (dart.notNull(readBytes) < 0) {
-          this[_readInProgress] = false;
-          if (!dart.test(this[_unsubscribed])) {
-            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
-            this[_closeFile]();
-            this[_unsubscribed] = true;
-          }
-          return;
-        }
-      }
-      this[_openedFile].read(readBytes).then(dart.dynamic)(dart.fn(block => {
-        this[_readInProgress] = false;
-        if (dart.test(this[_unsubscribed])) {
-          this[_closeFile]();
-          return;
-        }
-        this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
-        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
-          this[_atEnd] = true;
-        }
-        if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
-          this[_readBlock]();
-        }
-        this[_controller$0].add(block);
-        if (dart.test(this[_atEnd])) {
-          this[_closeFile]();
-        }
-      }, ListOfintToNull())).catchError(dart.fn((e, s) => {
-        if (!dart.test(this[_unsubscribed])) {
-          this[_controller$0].addError(e, core.StackTrace._check(s));
-          this[_closeFile]();
-          this[_unsubscribed] = true;
-        }
-      }, dynamicAnddynamicToNull()));
-    }
-    [_start$2]() {
-      if (dart.notNull(this[_position$0]) < 0) {
-        this[_controller$0].addError(new core.RangeError(dart.str`Bad start position: ${this[_position$0]}`));
-        this[_controller$0].close();
-        this[_closeCompleter].complete();
-        return;
-      }
-      const onReady = (function(file) {
-        this[_openedFile] = file;
-        this[_readInProgress] = false;
-        this[_readBlock]();
-      }).bind(this);
-      dart.fn(onReady, RandomAccessFileTovoid());
-      const onOpenFile = (function(file) {
-        if (dart.notNull(this[_position$0]) > 0) {
-          file.setPosition(this[_position$0]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
-              this[_controller$0].addError(e, core.StackTrace._check(s));
-              this[_readInProgress] = false;
-              this[_closeFile]();
-            }, dynamicAnddynamicToNull())});
-        } else {
-          onReady(file);
-        }
-      }).bind(this);
-      dart.fn(onOpenFile, RandomAccessFileTovoid());
-      const openFailed = (function(error, stackTrace) {
-        this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
-        this[_controller$0].close();
-        this[_closeCompleter].complete();
-      }).bind(this);
-      dart.fn(openFailed, dynamicAnddynamicTovoid$());
-      if (this[_path$] != null) {
-        io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
-      } else {
-        try {
-          onOpenFile(io._File._openStdioSync(0));
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          openFailed(e, s);
-        }
-
-      }
-    }
-  };
-  dart.addSimpleTypeTests(io._FileStream);
-  dart.defineNamedConstructor(io._FileStream, 'forStdin');
-  dart.setSignature(io._FileStream, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._FileStream, [core.String, core.int, core.int]),
-      forStdin: dart.definiteFunctionType(io._FileStream, [])
-    }),
-    fields: () => ({
-      [_controller$0]: StreamControllerOfListOfint(),
-      [_path$]: core.String,
-      [_openedFile]: io.RandomAccessFile,
-      [_position$0]: core.int,
-      [_end$0]: core.int,
-      [_closeCompleter]: async.Completer,
-      [_unsubscribed]: core.bool,
-      [_readInProgress]: core.bool,
-      [_closed]: core.bool,
-      [_atEnd]: core.bool
-    }),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      [_setupController]: dart.definiteFunctionType(dart.void, []),
-      [_closeFile]: dart.definiteFunctionType(async.Future, []),
-      [_readBlock]: dart.definiteFunctionType(dart.void, []),
-      [_start$2]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _file = Symbol('_file');
-  const _openFuture = Symbol('_openFuture');
-  io._FileStreamConsumer = class _FileStreamConsumer extends async.StreamConsumer$(core.List$(core.int)) {
-    new(file, mode) {
-      this[_file] = file;
-      this[_openFuture] = null;
-      this[_openFuture] = this[_file].open({mode: mode});
-    }
-    fromStdio(fd) {
-      this[_file] = null;
-      this[_openFuture] = null;
-      dart.assert(1 <= dart.notNull(fd) && dart.notNull(fd) <= 2);
-      this[_openFuture] = FutureOfRandomAccessFile().value(io._File._openStdioSync(fd));
-    }
-    addStream(stream) {
-      let completer = CompleterOfFile().sync();
-      this[_openFuture].then(dart.dynamic)(dart.fn(openedFile => {
-        let _subscription = null;
-        function error(e, stackTrace) {
-          if (stackTrace === void 0) stackTrace = null;
-          dart.dsend(_subscription, 'cancel');
-          openedFile.close();
-          completer.completeError(e, stackTrace);
-        }
-        dart.fn(error, dynamic__Tovoid());
-        _subscription = stream.listen(dart.fn(d => {
-          dart.dsend(_subscription, 'pause');
-          try {
-            openedFile.writeFrom(d, 0, d[dartx.length]).then(dart.dynamic)(dart.fn(_ => dart.dsend(_subscription, 'resume'), RandomAccessFileToFutureOr()), {onError: error});
-          } catch (e) {
-            let stackTrace = dart.stackTrace(e);
-            error(e, stackTrace);
-          }
-
-        }, ListOfintToNull()), {onDone: dart.fn(() => {
-            completer.complete(this[_file]);
-          }, VoidToNull()), onError: error, cancelOnError: true});
-      }, RandomAccessFileToNull())).catchError(dart.bind(completer, 'completeError'));
-      return completer.future;
-    }
-    close() {
-      return this[_openFuture].then(io.File)(dart.fn(openedFile => openedFile.close(), RandomAccessFileToFutureOfRandomAccessFile()));
-    }
-  };
-  dart.addSimpleTypeTests(io._FileStreamConsumer);
-  dart.defineNamedConstructor(io._FileStreamConsumer, 'fromStdio');
-  dart.setSignature(io._FileStreamConsumer, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._FileStreamConsumer, [io.File, io.FileMode]),
-      fromStdio: dart.definiteFunctionType(io._FileStreamConsumer, [core.int])
-    }),
-    fields: () => ({
-      [_file]: io.File,
-      [_openFuture]: FutureOfRandomAccessFile()
-    }),
-    methods: () => ({
-      addStream: dart.definiteFunctionType(async.Future$(io.File), [StreamOfListOfint()]),
-      close: dart.definiteFunctionType(async.Future$(io.File), [])
-    })
-  });
-  const _tryDecode = Symbol('_tryDecode');
-  let const$54;
-  let const$55;
-  io._File = class _File extends io.FileSystemEntity {
-    new(path) {
-      this.path = path;
-      if (!(typeof this.path == 'string')) {
-        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
-      }
-    }
-    exists() {
-      return io._IOService._dispatch(io._FILE_EXISTS, JSArrayOfString().of([this.path])).then(core.bool)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot check existence", this.path));
-        }
-        return FutureOrOfbool()._check(response);
-      }, dynamicToFutureOrOfbool()));
-    }
-    static _exists(path) {
-      dart.throw(new core.UnsupportedError("File._exists"));
-    }
-    existsSync() {
-      let result = io._File._exists(this.path);
-      io._File.throwIfError(result, "Cannot check existence of file", this.path);
-      return core.bool._check(result);
-    }
-    get absolute() {
-      return io.File.new(this[_absolutePath]);
-    }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
-    create(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
-      return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE, JSArrayOfString().of([this.path])), dynamicToFuture())).then(io._File)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot create file", this.path));
-        }
-        return this;
-      }, dynamicTo_File()));
-    }
-    static _create(path) {
-      dart.throw(new core.UnsupportedError("File._create"));
-    }
-    static _createLink(path, target) {
-      dart.throw(new core.UnsupportedError("File._createLink"));
-    }
-    static _linkTarget(path) {
-      dart.throw(new core.UnsupportedError("File._linkTarget"));
-    }
-    createSync(opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        this.parent.createSync({recursive: true});
-      }
-      let result = io._File._create(this.path);
-      io._File.throwIfError(result, "Cannot create file", this.path);
-    }
-    [_delete](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        return io.Directory.new(this.path).delete({recursive: true}).then(io._File)(dart.fn(_ => this, FileSystemEntityTo_File()));
-      }
-      return io._IOService._dispatch(io._FILE_DELETE, JSArrayOfString().of([this.path])).then(io._File)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot delete file", this.path));
-        }
-        return this;
-      }, dynamicTo_File()));
-    }
-    static _deleteNative(path) {
-      dart.throw(new core.UnsupportedError("File._deleteNative"));
-    }
-    static _deleteLinkNative(path) {
-      dart.throw(new core.UnsupportedError("File._deleteLinkNative"));
-    }
-    [_deleteSync](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        return io.Directory.new(this.path).deleteSync({recursive: true});
-      }
-      let result = io._File._deleteNative(this.path);
-      io._File.throwIfError(result, "Cannot delete file", this.path);
-    }
-    rename(newPath) {
-      return io._IOService._dispatch(io._FILE_RENAME, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, dart.str`Cannot rename file to '${newPath}'`, this.path));
-        }
-        return io.File.new(newPath);
-      }, dynamicToFile()));
-    }
-    static _rename(oldPath, newPath) {
-      dart.throw(new core.UnsupportedError("File._rename"));
-    }
-    static _renameLink(oldPath, newPath) {
-      dart.throw(new core.UnsupportedError("File._renameLink"));
-    }
-    renameSync(newPath) {
-      let result = io._File._rename(this.path, newPath);
-      io._File.throwIfError(result, dart.str`Cannot rename file to '${newPath}'`, this.path);
-      return io.File.new(newPath);
-    }
-    copy(newPath) {
-      return io._IOService._dispatch(io._FILE_COPY, JSArrayOfString().of([this.path, newPath])).then(io.File)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, dart.str`Cannot copy file to '${newPath}'`, this.path));
-        }
-        return io.File.new(newPath);
-      }, dynamicToFile()));
-    }
-    static _copy(oldPath, newPath) {
-      dart.throw(new core.UnsupportedError("File._copy"));
-    }
-    copySync(newPath) {
-      let result = io._File._copy(this.path, newPath);
-      io._File.throwIfError(result, dart.str`Cannot copy file to '${newPath}'`, this.path);
-      return io.File.new(newPath);
-    }
-    open(opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
-      if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
-        return FutureOfRandomAccessFile().error(new core.ArgumentError('Invalid file mode for this operation'));
-      }
-      return io._IOService._dispatch(io._FILE_OPEN, JSArrayOfObject().of([this.path, mode[_mode]])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot open file", this.path));
-        }
-        return new io._RandomAccessFile(core.int._check(response), this.path);
-      }, dynamicTo_RandomAccessFile()));
-    }
-    length() {
-      return io._IOService._dispatch(io._FILE_LENGTH_FROM_PATH, JSArrayOfString().of([this.path])).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve length of file", this.path));
-        }
-        return FutureOrOfint()._check(response);
-      }, dynamicToFutureOrOfint()));
-    }
-    static _lengthFromPath(path) {
-      dart.throw(new core.UnsupportedError("File._lengthFromPath"));
-    }
-    lengthSync() {
-      let result = io._File._lengthFromPath(this.path);
-      io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
-      return core.int._check(result);
-    }
-    lastModified() {
-      return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve modification time", this.path));
-        }
-        return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
-      }, dynamicToDateTime()));
-    }
-    static _lastModified(path) {
-      dart.throw(new core.UnsupportedError("File._lastModified"));
-    }
-    lastModifiedSync() {
-      let ms = io._File._lastModified(this.path);
-      io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
-      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
-    }
-    static _open(path, mode) {
-      dart.throw(new core.UnsupportedError("File._open"));
-    }
-    openSync(opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.READ;
-      if (!dart.equals(mode, io.FileMode.READ) && !dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
-        dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
-      }
-      let id = io._File._open(this.path, mode[_mode]);
-      io._File.throwIfError(id, "Cannot open file", this.path);
-      return new io._RandomAccessFile(core.int._check(id), this.path);
-    }
-    static _openStdio(fd) {
-      dart.throw(new core.UnsupportedError("File._openStdio"));
-    }
-    static _openStdioSync(fd) {
-      let id = io._File._openStdio(fd);
-      if (id == 0) {
-        dart.throw(new io.FileSystemException(dart.str`Cannot open stdio file for: ${fd}`));
-      }
-      return new io._RandomAccessFile(id, "");
-    }
-    openRead(start, end) {
-      if (start === void 0) start = null;
-      if (end === void 0) end = null;
-      return new io._FileStream(this.path, start, end);
-    }
-    openWrite(opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      if (!dart.equals(mode, io.FileMode.WRITE) && !dart.equals(mode, io.FileMode.APPEND) && !dart.equals(mode, io.FileMode.WRITE_ONLY) && !dart.equals(mode, io.FileMode.WRITE_ONLY_APPEND)) {
-        dart.throw(new core.ArgumentError('Invalid file mode for this operation'));
-      }
-      let consumer = new io._FileStreamConsumer(this, mode);
-      return io.IOSink.new(consumer, {encoding: encoding});
-    }
-    readAsBytes() {
-      function readDataChunked(file) {
-        let builder = io.BytesBuilder.new({copy: false});
-        let completer = async.Completer.new();
-        function read() {
-          dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
-              builder.add(ListOfint()._check(data));
-              read();
-            } else {
-              completer.complete(builder.takeBytes());
-            }
-          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
-        }
-        dart.fn(read, VoidTovoid$());
-        read();
-        return FutureOfListOfint()._check(completer.future);
-      }
-      dart.fn(readDataChunked, dynamicToFutureOfListOfint());
-      return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
-        if (length == 0) {
-          return readDataChunked(file);
-        }
-        return file.read(length);
-      }, intToFutureOfListOfint())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOfListOfint()));
-    }
-    readAsBytesSync() {
-      let opened = this.openSync();
-      try {
-        let data = null;
-        let length = opened.lengthSync();
-        if (length == 0) {
-          let builder = io.BytesBuilder.new({copy: false});
-          do {
-            data = opened.readSync(io._BLOCK_SIZE);
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
-          } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
-          data = builder.takeBytes();
-        } else {
-          data = opened.readSync(length);
-        }
-        return ListOfint()._check(data);
-      } finally {
-        opened.closeSync();
-      }
-    }
-    [_tryDecode](bytes, encoding) {
-      try {
-        return encoding.decode(bytes);
-      } catch (_) {
-        dart.throw(new io.FileSystemException(dart.str`Failed to decode data using encoding '${encoding.name}'`, this.path));
-      }
-
-    }
-    readAsString(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return this.readAsBytes().then(core.String)(dart.fn(bytes => this[_tryDecode](bytes, encoding), ListOfintToString()));
-    }
-    readAsStringSync(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return this[_tryDecode](this.readAsBytesSync(), encoding);
-    }
-    readAsLines(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
-    }
-    readAsLinesSync(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
-    }
-    writeAsBytes(bytes, opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
-      let flush = opts && 'flush' in opts ? opts.flush : false;
-      return this.open({mode: mode}).then(io.File)(dart.fn(file => file.writeFrom(bytes, 0, bytes[dartx.length]).then(dart.dynamic)(dart.fn(_ => {
-        if (dart.test(flush)) return file.flush().then(io._File)(dart.fn(_ => this, RandomAccessFileTo_File()));
-        return this;
-      }, RandomAccessFileToObject())).whenComplete(dart.bind(file, 'close')), RandomAccessFileToFutureOrOfFile()));
-    }
-    writeAsBytesSync(bytes, opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
-      let flush = opts && 'flush' in opts ? opts.flush : false;
-      let opened = this.openSync({mode: mode});
-      try {
-        opened.writeFromSync(bytes, 0, bytes[dartx.length]);
-        if (dart.test(flush)) opened.flushSync();
-      } finally {
-        opened.closeSync();
-      }
-    }
-    writeAsString(contents, opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      let flush = opts && 'flush' in opts ? opts.flush : false;
-      try {
-        return this.writeAsBytes(encoding.encode(contents), {mode: mode, flush: flush});
-      } catch (e) {
-        return FutureOfFile().error(e);
-      }
-
-    }
-    writeAsStringSync(contents, opts) {
-      let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      let flush = opts && 'flush' in opts ? opts.flush : false;
-      this.writeAsBytesSync(encoding.encode(contents), {mode: mode, flush: flush});
-    }
-    toString() {
-      return dart.str`File: '${this.path}'`;
-    }
-    static throwIfError(result, msg, path) {
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException(msg, path, result));
-      }
-    }
-  };
-  io._File[dart.implements] = () => [io.File];
-  dart.setSignature(io._File, {
-    constructors: () => ({new: dart.definiteFunctionType(io._File, [core.String])}),
-    fields: () => ({path: core.String}),
-    getters: () => ({absolute: dart.definiteFunctionType(io.File, [])}),
-    methods: () => ({
-      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
-      existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
-      create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
-      createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
-      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      rename: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
-      renameSync: dart.definiteFunctionType(io.File, [core.String]),
-      copy: dart.definiteFunctionType(async.Future$(io.File), [core.String]),
-      copySync: dart.definiteFunctionType(io.File, [core.String]),
-      open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
-      length: dart.definiteFunctionType(async.Future$(core.int), []),
-      lengthSync: dart.definiteFunctionType(core.int, []),
-      lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
-      lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
-      openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
-      openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
-      openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
-      readAsBytes: dart.definiteFunctionType(async.Future$(core.List$(core.int)), []),
-      readAsBytesSync: dart.definiteFunctionType(core.List$(core.int), []),
-      [_tryDecode]: dart.definiteFunctionType(core.String, [ListOfint(), convert.Encoding]),
-      readAsString: dart.definiteFunctionType(async.Future$(core.String), [], {encoding: convert.Encoding}),
-      readAsStringSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding}),
-      readAsLines: dart.definiteFunctionType(async.Future$(core.List$(core.String)), [], {encoding: convert.Encoding}),
-      readAsLinesSync: dart.definiteFunctionType(core.List$(core.String), [], {encoding: convert.Encoding}),
-      writeAsBytes: dart.definiteFunctionType(async.Future$(io.File), [ListOfint()], {mode: io.FileMode, flush: core.bool}),
-      writeAsBytesSync: dart.definiteFunctionType(dart.void, [ListOfint()], {mode: io.FileMode, flush: core.bool}),
-      writeAsString: dart.definiteFunctionType(async.Future$(io.File), [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool}),
-      writeAsStringSync: dart.definiteFunctionType(dart.void, [core.String], {mode: io.FileMode, encoding: convert.Encoding, flush: core.bool})
-    }),
-    statics: () => ({
-      _exists: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _create: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _createLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _linkTarget: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _deleteNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _deleteLinkNative: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _rename: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
-      _openStdio: dart.definiteFunctionType(core.int, [core.int]),
-      _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
-      throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
-    }),
-    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
-  });
-  io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
-    static new(pointer) {
-      dart.throw(new core.UnsupportedError("RandomAccessFile"));
-    }
-  };
-  dart.setSignature(io._RandomAccessFileOps, {
-    constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFileOps, [core.int])})
-  });
-  const _asyncDispatched = Symbol('_asyncDispatched');
-  const _fileService = Symbol('_fileService');
-  const _resourceInfo = Symbol('_resourceInfo');
-  const _maybeConnectHandler = Symbol('_maybeConnectHandler');
-  const _maybePerformCleanup = Symbol('_maybePerformCleanup');
-  const _dispatch = Symbol('_dispatch');
-  const _checkAvailable = Symbol('_checkAvailable');
-  io._RandomAccessFile = class _RandomAccessFile extends core.Object {
-    new(pointer, path) {
-      this.path = path;
-      this[_asyncDispatched] = false;
-      this[_fileService] = null;
-      this[_resourceInfo] = null;
-      this[_ops] = null;
-      this.closed = false;
-      this[_ops] = io._RandomAccessFileOps.new(pointer);
-      this[_resourceInfo] = new io._FileResourceInfo(this);
-      this[_maybeConnectHandler]();
-    }
-    [_maybePerformCleanup]() {
-      if (dart.test(this.closed)) {
-        io._FileResourceInfo.FileClosed(this[_resourceInfo]);
-      }
-    }
-    [_maybeConnectHandler]() {
-      if (!dart.test(io._RandomAccessFile._connectedResourceHandler)) {
-        developer.registerExtension('ext.dart.io.getOpenFiles', io._FileResourceInfo.getOpenFiles);
-        developer.registerExtension('ext.dart.io.getFileByID', io._FileResourceInfo.getFileInfoMapByID);
-        io._RandomAccessFile._connectedResourceHandler = true;
-      }
-    }
-    close() {
-      return this[_dispatch](io._FILE_CLOSE, [null], {markClosed: true}).then(io._RandomAccessFile)(dart.fn(result => {
-        if (!dart.equals(result, -1)) {
-          this.closed = dart.test(this.closed) || dart.equals(result, 0);
-          this[_maybePerformCleanup]();
-          return this;
-        } else {
-          dart.throw(new io.FileSystemException("Cannot close file", this.path));
-        }
-      }, dynamicTo_RandomAccessFile()));
-    }
-    closeSync() {
-      this[_checkAvailable]();
-      let id = this[_ops].close();
-      if (id == -1) {
-        dart.throw(new io.FileSystemException("Cannot close file", this.path));
-      }
-      this.closed = dart.test(this.closed) || id == 0;
-      this[_maybePerformCleanup]();
-    }
-    readByte() {
-      return this[_dispatch](io._FILE_READ_BYTE, [null]).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "readByte failed", this.path));
-        }
-        this[_resourceInfo].addRead(1);
-        return FutureOrOfint()._check(response);
-      }, dynamicToFutureOrOfint()));
-    }
-    readByteSync() {
-      this[_checkAvailable]();
-      let result = this[_ops].readByte();
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("readByte failed", this.path, result));
-      }
-      this[_resourceInfo].addRead(1);
-      return core.int._check(result);
-    }
-    read(bytes) {
-      if (!(typeof bytes == 'number')) {
-        dart.throw(new core.ArgumentError(bytes));
-      }
-      return this[_dispatch](io._FILE_READ, JSArrayOfint().of([null, bytes])).then(ListOfint())(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
-        }
-        this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
-        return FutureOrOfListOfint()._check(dart.dindex(response, 1));
-      }, dynamicToFutureOrOfListOfint()));
-    }
-    readSync(bytes) {
-      this[_checkAvailable]();
-      if (!(typeof bytes == 'number')) {
-        dart.throw(new core.ArgumentError(bytes));
-      }
-      let result = this[_ops].read(bytes);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("readSync failed", this.path, result));
-      }
-      this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
-      return ListOfint()._check(result);
-    }
-    readInto(buffer, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
-      if (end == start) {
-        return FutureOfint().value(0);
-      }
-      let length = dart.notNull(end) - dart.notNull(start);
-      return this[_dispatch](io._FILE_READ_INTO, JSArrayOfint().of([null, length])).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
-        }
-        let read = dart.dindex(response, 1);
-        let data = dart.dindex(response, 2);
-        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
-        this[_resourceInfo].addRead(core.int._check(read));
-        return FutureOrOfint()._check(read);
-      }, dynamicToFutureOrOfint()));
-    }
-    readIntoSync(buffer, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      this[_checkAvailable]();
-      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
-      if (end == start) {
-        return 0;
-      }
-      let result = this[_ops].readInto(buffer, start, end);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("readInto failed", this.path, result));
-      }
-      this[_resourceInfo].addRead(core.int._check(result));
-      return core.int._check(result);
-    }
-    writeByte(value) {
-      if (!(typeof value == 'number')) {
-        dart.throw(new core.ArgumentError(value));
-      }
-      return this[_dispatch](io._FILE_WRITE_BYTE, JSArrayOfint().of([null, value])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "writeByte failed", this.path));
-        }
-        this[_resourceInfo].addWrite(1);
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    writeByteSync(value) {
-      this[_checkAvailable]();
-      if (!(typeof value == 'number')) {
-        dart.throw(new core.ArgumentError(value));
-      }
-      let result = this[_ops].writeByte(value);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("writeByte failed", this.path, result));
-      }
-      this[_resourceInfo].addWrite(1);
-      return core.int._check(result);
-    }
-    writeFrom(buffer, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError("Invalid arguments to writeFrom"));
-      }
-      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
-      if (end == start) {
-        return FutureOfRandomAccessFile().value(this);
-      }
-      let result = null;
-      try {
-        result = io._ensureFastAndSerializableByteData(buffer, start, end);
-      } catch (e) {
-        return FutureOfRandomAccessFile().error(e);
-      }
-
-      let request = core.List.new(4);
-      request[dartx._set](0, null);
-      request[dartx._set](1, result.buffer);
-      request[dartx._set](2, result.start);
-      request[dartx._set](3, dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
-      return this[_dispatch](io._FILE_WRITE_FROM, request).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "writeFrom failed", this.path));
-        }
-        this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(result.start)));
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    writeFromSync(buffer, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      this[_checkAvailable]();
-      if (!core.List.is(buffer) || start != null && !(typeof start == 'number') || end != null && !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError("Invalid arguments to writeFromSync"));
-      }
-      end = core.RangeError.checkValidRange(start, end, buffer[dartx.length]);
-      if (end == start) {
-        return;
-      }
-      let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
-      let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
-      }
-      this[_resourceInfo].addWrite(dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
-    }
-    writeString(string, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      if (!convert.Encoding.is(encoding)) {
-        dart.throw(new core.ArgumentError(encoding));
-      }
-      let data = encoding.encode(string);
-      return this.writeFrom(data, 0, data[dartx.length]);
-    }
-    writeStringSync(string, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      if (!convert.Encoding.is(encoding)) {
-        dart.throw(new core.ArgumentError(encoding));
-      }
-      let data = encoding.encode(string);
-      this.writeFromSync(data, 0, data[dartx.length]);
-    }
-    position() {
-      return this[_dispatch](io._FILE_POSITION, [null]).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "position failed", this.path));
-        }
-        return FutureOrOfint()._check(response);
-      }, dynamicToFutureOrOfint()));
-    }
-    positionSync() {
-      this[_checkAvailable]();
-      let result = this[_ops].position();
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("position failed", this.path, result));
-      }
-      return core.int._check(result);
-    }
-    setPosition(position) {
-      return this[_dispatch](io._FILE_SET_POSITION, JSArrayOfint().of([null, position])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "setPosition failed", this.path));
-        }
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    setPositionSync(position) {
-      this[_checkAvailable]();
-      let result = this[_ops].setPosition(position);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("setPosition failed", this.path, result));
-      }
-    }
-    truncate(length) {
-      return this[_dispatch](io._FILE_TRUNCATE, JSArrayOfint().of([null, length])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "truncate failed", this.path));
-        }
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    truncateSync(length) {
-      this[_checkAvailable]();
-      let result = this[_ops].truncate(length);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("truncate failed", this.path, result));
-      }
-    }
-    length() {
-      return this[_dispatch](io._FILE_LENGTH, [null]).then(core.int)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "length failed", this.path));
-        }
-        return FutureOrOfint()._check(response);
-      }, dynamicToFutureOrOfint()));
-    }
-    lengthSync() {
-      this[_checkAvailable]();
-      let result = this[_ops].length();
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("length failed", this.path, result));
-      }
-      return core.int._check(result);
-    }
-    flush() {
-      return this[_dispatch](io._FILE_FLUSH, [null]).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, "flush failed", this.path));
-        }
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    flushSync() {
-      this[_checkAvailable]();
-      let result = this[_ops].flush();
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException("flush failed", this.path, result));
-      }
-    }
-    lock(mode, start, end) {
-      if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
-      if (start === void 0) start = 0;
-      if (end === void 0) end = -1;
-      if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
-        dart.throw(new core.ArgumentError());
-      }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
-      return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
-        }
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    unlock(start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = -1;
-      if (!(typeof start == 'number') || !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      if (start == end) {
-        dart.throw(new core.ArgumentError());
-      }
-      return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, io._RandomAccessFile.LOCK_UNLOCK, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          dart.throw(io._exceptionFromResponse(response, 'unlock failed', this.path));
-        }
-        return this;
-      }, dynamicTo_RandomAccessFile()));
-    }
-    lockSync(mode, start, end) {
-      if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
-      if (start === void 0) start = 0;
-      if (end === void 0) end = -1;
-      this[_checkAvailable]();
-      if (!io.FileLock.is(mode) || !(typeof start == 'number') || !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
-        dart.throw(new core.ArgumentError());
-      }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
-      let result = this[_ops].lock(lock, start, end);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException('lock failed', this.path, result));
-      }
-    }
-    unlockSync(start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = -1;
-      this[_checkAvailable]();
-      if (!(typeof start == 'number') || !(typeof end == 'number')) {
-        dart.throw(new core.ArgumentError());
-      }
-      if (start == end) {
-        dart.throw(new core.ArgumentError());
-      }
-      let result = this[_ops].lock(io._RandomAccessFile.LOCK_UNLOCK, start, end);
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException('unlock failed', this.path, result));
-      }
-    }
-    [_pointer]() {
-      return this[_ops].getPointer();
-    }
-    [_dispatch](request, data, opts) {
-      let markClosed = opts && 'markClosed' in opts ? opts.markClosed : false;
-      if (dart.test(this.closed)) {
-        return async.Future.error(new io.FileSystemException("File closed", this.path));
-      }
-      if (dart.test(this[_asyncDispatched])) {
-        let msg = "An async operation is currently pending";
-        return async.Future.error(new io.FileSystemException(msg, this.path));
-      }
-      if (dart.test(markClosed)) {
-        this.closed = true;
-      }
-      this[_asyncDispatched] = true;
-      data[dartx._set](0, this[_pointer]());
-      return io._IOService._dispatch(request, data).whenComplete(dart.fn(() => {
-        this[_asyncDispatched] = false;
-      }, VoidToNull()));
-    }
-    [_checkAvailable]() {
-      if (dart.test(this[_asyncDispatched])) {
-        dart.throw(new io.FileSystemException("An async operation is currently pending", this.path));
-      }
-      if (dart.test(this.closed)) {
-        dart.throw(new io.FileSystemException("File closed", this.path));
-      }
-    }
-  };
-  io._RandomAccessFile[dart.implements] = () => [io.RandomAccessFile];
-  dart.setSignature(io._RandomAccessFile, {
-    constructors: () => ({new: dart.definiteFunctionType(io._RandomAccessFile, [core.int, core.String])}),
-    fields: () => ({
-      path: core.String,
-      [_asyncDispatched]: core.bool,
-      [_fileService]: isolate.SendPort,
-      [_resourceInfo]: io._FileResourceInfo,
-      [_ops]: io._RandomAccessFileOps,
-      closed: core.bool
-    }),
-    methods: () => ({
-      [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
-      [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
-      close: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
-      closeSync: dart.definiteFunctionType(dart.void, []),
-      readByte: dart.definiteFunctionType(async.Future$(core.int), []),
-      readByteSync: dart.definiteFunctionType(core.int, []),
-      read: dart.definiteFunctionType(async.Future$(core.List$(core.int)), [core.int]),
-      readSync: dart.definiteFunctionType(core.List$(core.int), [core.int]),
-      readInto: dart.definiteFunctionType(async.Future$(core.int), [ListOfint()], [core.int, core.int]),
-      readIntoSync: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
-      writeByte: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
-      writeByteSync: dart.definiteFunctionType(core.int, [core.int]),
-      writeFrom: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [ListOfint()], [core.int, core.int]),
-      writeFromSync: dart.definiteFunctionType(dart.void, [ListOfint()], [core.int, core.int]),
-      writeString: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.String], {encoding: convert.Encoding}),
-      writeStringSync: dart.definiteFunctionType(dart.void, [core.String], {encoding: convert.Encoding}),
-      position: dart.definiteFunctionType(async.Future$(core.int), []),
-      positionSync: dart.definiteFunctionType(core.int, []),
-      setPosition: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
-      setPositionSync: dart.definiteFunctionType(dart.void, [core.int]),
-      truncate: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [core.int]),
-      truncateSync: dart.definiteFunctionType(dart.void, [core.int]),
-      length: dart.definiteFunctionType(async.Future$(core.int), []),
-      lengthSync: dart.definiteFunctionType(core.int, []),
-      flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
-      flushSync: dart.definiteFunctionType(dart.void, []),
-      lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
-      unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
-      lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
-      unlockSync: dart.definiteFunctionType(dart.void, [], [core.int, core.int]),
-      [_pointer]: dart.definiteFunctionType(core.int, []),
-      [_dispatch]: dart.definiteFunctionType(async.Future, [core.int, core.List], {markClosed: core.bool}),
-      [_checkAvailable]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      _connectedResourceHandler: core.bool,
-      LOCK_UNLOCK: core.int,
-      LOCK_SHARED: core.int,
-      LOCK_EXCLUSIVE: core.int
-    })
-  });
-  io._RandomAccessFile._connectedResourceHandler = false;
-  io._RandomAccessFile.LOCK_UNLOCK = 0;
-  io._RandomAccessFile.LOCK_SHARED = 1;
-  io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-  let const$56;
-  io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
-    _internal(type) {
-      this[_type] = type;
-    }
-    static _lookup(type) {
-      return io.FileSystemEntityType._typeList[dartx._get](type);
-    }
-    toString() {
-      return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
-  dart.setSignature(io.FileSystemEntityType, {
-    constructors: () => ({_internal: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
-    fields: () => ({[_type]: core.int}),
-    sfields: () => ({
-      FILE: io.FileSystemEntityType,
-      DIRECTORY: io.FileSystemEntityType,
-      LINK: io.FileSystemEntityType,
-      NOT_FOUND: io.FileSystemEntityType,
-      _typeList: ListOfFileSystemEntityType()
-    }),
-    statics: () => ({_lookup: dart.definiteFunctionType(io.FileSystemEntityType, [core.int])}),
-    names: ['_lookup']
-  });
-  dart.defineLazy(io.FileSystemEntityType, {
-    get FILE() {
-      return dart.const(new io.FileSystemEntityType._internal(0));
-    },
-    get DIRECTORY() {
-      return dart.const(new io.FileSystemEntityType._internal(1));
-    },
-    get LINK() {
-      return dart.const(new io.FileSystemEntityType._internal(2));
-    },
-    get NOT_FOUND() {
-      return dart.const(new io.FileSystemEntityType._internal(3));
-    },
-    get _typeList() {
-      return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
-    }
-  });
-  let const$57;
-  io.FileStat = class FileStat extends core.Object {
-    _internal(changed, modified, accessed, type, mode, size) {
-      this.changed = changed;
-      this.modified = modified;
-      this.accessed = accessed;
-      this.type = type;
-      this.mode = mode;
-      this.size = size;
-    }
-    _internalNotFound() {
-      this.changed = null;
-      this.modified = null;
-      this.accessed = null;
-      this.type = io.FileSystemEntityType.NOT_FOUND;
-      this.mode = 0;
-      this.size = -1;
-    }
-    static _statSync(path) {
-      dart.throw(new core.UnsupportedError("FileStat.stat"));
-    }
-    static statSync(path) {
-      if (dart.test(io.Platform.isWindows)) {
-        path = io.FileSystemEntity._trimTrailingPathSeparators(path);
-      }
-      let data = io.FileStat._statSync(path);
-      if (io.OSError.is(data)) return io.FileStat._notFound;
-      return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(dart.dindex(data, io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(dart.dindex(data, io.FileStat._TYPE))), core.int._check(dart.dindex(data, io.FileStat._MODE)), core.int._check(dart.dindex(data, io.FileStat._SIZE)));
-    }
-    static stat(path) {
-      if (dart.test(io.Platform.isWindows)) {
-        path = io.FileSystemEntity._trimTrailingPathSeparators(path);
-      }
-      return io._IOService._dispatch(io._FILE_STAT, JSArrayOfString().of([path])).then(io.FileStat)(dart.fn(response => {
-        if (dart.test(io._isErrorResponse(response))) {
-          return io.FileStat._notFound;
-        }
-        let data = core.List._check(dart.dindex(response, 1));
-        return new io.FileStat._internal(new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._CHANGED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._MODIFIED_TIME))), new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(data[dartx._get](io.FileStat._ACCESSED_TIME))), io.FileSystemEntityType._lookup(core.int._check(data[dartx._get](io.FileStat._TYPE))), core.int._check(data[dartx._get](io.FileStat._MODE)), core.int._check(data[dartx._get](io.FileStat._SIZE)));
-      }, dynamicToFileStat()));
-    }
-    toString() {
-      return dart.str`FileStat: type ${this.type}\n          changed ${this.changed}\n          modified ${this.modified}\n          accessed ${this.accessed}\n          mode ${this.modeString()}\n          size ${this.size}`;
-    }
-    modeString() {
-      let permissions = dart.notNull(this.mode) & 4095;
-      let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
-      let result = [];
-      if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
-      if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
-      if ((permissions & 512) != 0) result[dartx.add]("(sticky) ");
-      result[dartx.add](codes[dartx._get](permissions >> 6 & 7));
-      result[dartx.add](codes[dartx._get](permissions >> 3 & 7));
-      result[dartx.add](codes[dartx._get](permissions & 7));
-      return result[dartx.join]();
-    }
-  };
-  dart.defineNamedConstructor(io.FileStat, '_internal');
-  dart.defineNamedConstructor(io.FileStat, '_internalNotFound');
-  dart.setSignature(io.FileStat, {
-    constructors: () => ({
-      _internal: dart.definiteFunctionType(io.FileStat, [core.DateTime, core.DateTime, core.DateTime, io.FileSystemEntityType, core.int, core.int]),
-      _internalNotFound: dart.definiteFunctionType(io.FileStat, [])
-    }),
-    fields: () => ({
-      changed: core.DateTime,
-      modified: core.DateTime,
-      accessed: core.DateTime,
-      type: io.FileSystemEntityType,
-      mode: core.int,
-      size: core.int
-    }),
-    methods: () => ({modeString: dart.definiteFunctionType(core.String, [])}),
-    sfields: () => ({
-      _TYPE: core.int,
-      _CHANGED_TIME: core.int,
-      _MODIFIED_TIME: core.int,
-      _ACCESSED_TIME: core.int,
-      _MODE: core.int,
-      _SIZE: core.int,
-      _notFound: io.FileStat
-    }),
-    statics: () => ({
-      _statSync: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      statSync: dart.definiteFunctionType(io.FileStat, [core.String]),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), [core.String])
-    }),
-    names: ['_statSync', 'statSync', 'stat']
-  });
-  io.FileStat._TYPE = 0;
-  io.FileStat._CHANGED_TIME = 1;
-  io.FileStat._MODIFIED_TIME = 2;
-  io.FileStat._ACCESSED_TIME = 3;
-  io.FileStat._MODE = 4;
-  io.FileStat._SIZE = 5;
-  dart.defineLazy(io.FileStat, {
-    get _notFound() {
-      return dart.const(new io.FileStat._internalNotFound());
-    }
-  });
-  io.FileSystemEvent = class FileSystemEvent extends core.Object {
-    _(type, path, isDirectory) {
-      this.type = type;
-      this.path = path;
-      this.isDirectory = isDirectory;
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemEvent, '_');
-  dart.setSignature(io.FileSystemEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemEvent, [core.int, core.String, core.bool])}),
-    fields: () => ({
-      type: core.int,
-      path: core.String,
-      isDirectory: core.bool
-    }),
-    sfields: () => ({
-      CREATE: core.int,
-      MODIFY: core.int,
-      DELETE: core.int,
-      MOVE: core.int,
-      ALL: core.int,
-      _MODIFY_ATTRIBUTES: core.int,
-      _DELETE_SELF: core.int,
-      _IS_DIR: core.int
-    })
-  });
-  io.FileSystemEvent.CREATE = 1 << 0;
-  io.FileSystemEvent.MODIFY = 1 << 1;
-  io.FileSystemEvent.DELETE = 1 << 2;
-  io.FileSystemEvent.MOVE = 1 << 3;
-  io.FileSystemEvent._MODIFY_ATTRIBUTES = 1 << 4;
-  io.FileSystemEvent._DELETE_SELF = 1 << 5;
-  io.FileSystemEvent._IS_DIR = 1 << 6;
-  dart.defineLazy(io.FileSystemEvent, {
-    get ALL() {
-      return io.FileSystemEvent.CREATE | io.FileSystemEvent.MODIFY | io.FileSystemEvent.DELETE | io.FileSystemEvent.MOVE;
-    }
-  });
-  io.FileSystemCreateEvent = class FileSystemCreateEvent extends io.FileSystemEvent {
-    _(path, isDirectory) {
-      super._(io.FileSystemEvent.CREATE, core.String._check(path), core.bool._check(isDirectory));
-    }
-    toString() {
-      return dart.str`FileSystemCreateEvent('${this.path}')`;
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemCreateEvent, '_');
-  dart.setSignature(io.FileSystemCreateEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemCreateEvent, [dart.dynamic, dart.dynamic])})
-  });
-  io.FileSystemModifyEvent = class FileSystemModifyEvent extends io.FileSystemEvent {
-    _(path, isDirectory, contentChanged) {
-      this.contentChanged = contentChanged;
-      super._(io.FileSystemEvent.MODIFY, core.String._check(path), core.bool._check(isDirectory));
-    }
-    toString() {
-      return dart.str`FileSystemModifyEvent('${this.path}', contentChanged=${this.contentChanged})`;
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemModifyEvent, '_');
-  dart.setSignature(io.FileSystemModifyEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemModifyEvent, [dart.dynamic, dart.dynamic, core.bool])}),
-    fields: () => ({contentChanged: core.bool})
-  });
-  io.FileSystemDeleteEvent = class FileSystemDeleteEvent extends io.FileSystemEvent {
-    _(path, isDirectory) {
-      super._(io.FileSystemEvent.DELETE, core.String._check(path), core.bool._check(isDirectory));
-    }
-    toString() {
-      return dart.str`FileSystemDeleteEvent('${this.path}')`;
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemDeleteEvent, '_');
-  dart.setSignature(io.FileSystemDeleteEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemDeleteEvent, [dart.dynamic, dart.dynamic])})
-  });
-  io.FileSystemMoveEvent = class FileSystemMoveEvent extends io.FileSystemEvent {
-    _(path, isDirectory, destination) {
-      this.destination = destination;
-      super._(io.FileSystemEvent.MOVE, core.String._check(path), core.bool._check(isDirectory));
-    }
-    toString() {
-      let buffer = new core.StringBuffer();
-      buffer.write(dart.str`FileSystemMoveEvent('${this.path}'`);
-      if (this.destination != null) buffer.write(dart.str`, '${this.destination}'`);
-      buffer.write(')');
-      return buffer.toString();
-    }
-  };
-  dart.defineNamedConstructor(io.FileSystemMoveEvent, '_');
-  dart.setSignature(io.FileSystemMoveEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.FileSystemMoveEvent, [dart.dynamic, dart.dynamic, core.String])}),
-    fields: () => ({destination: core.String})
-  });
-  io._FileSystemWatcher = class _FileSystemWatcher extends core.Object {
-    static _watch(path, events, recursive) {
-      dart.throw(new core.UnsupportedError("_FileSystemWatcher.watch"));
-    }
-    static get isSupported() {
-      dart.throw(new core.UnsupportedError("_FileSystemWatcher.isSupported"));
-    }
-  };
-  dart.setSignature(io._FileSystemWatcher, {
-    sgetters: () => ({isSupported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({_watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [core.String, core.int, core.bool])}),
-    names: ['_watch']
-  });
-  io.HttpStatus = class HttpStatus extends core.Object {};
-  dart.setSignature(io.HttpStatus, {
-    sfields: () => ({
-      CONTINUE: core.int,
-      SWITCHING_PROTOCOLS: core.int,
-      OK: core.int,
-      CREATED: core.int,
-      ACCEPTED: core.int,
-      NON_AUTHORITATIVE_INFORMATION: core.int,
-      NO_CONTENT: core.int,
-      RESET_CONTENT: core.int,
-      PARTIAL_CONTENT: core.int,
-      MULTIPLE_CHOICES: core.int,
-      MOVED_PERMANENTLY: core.int,
-      FOUND: core.int,
-      MOVED_TEMPORARILY: core.int,
-      SEE_OTHER: core.int,
-      NOT_MODIFIED: core.int,
-      USE_PROXY: core.int,
-      TEMPORARY_REDIRECT: core.int,
-      BAD_REQUEST: core.int,
-      UNAUTHORIZED: core.int,
-      PAYMENT_REQUIRED: core.int,
-      FORBIDDEN: core.int,
-      NOT_FOUND: core.int,
-      METHOD_NOT_ALLOWED: core.int,
-      NOT_ACCEPTABLE: core.int,
-      PROXY_AUTHENTICATION_REQUIRED: core.int,
-      REQUEST_TIMEOUT: core.int,
-      CONFLICT: core.int,
-      GONE: core.int,
-      LENGTH_REQUIRED: core.int,
-      PRECONDITION_FAILED: core.int,
-      REQUEST_ENTITY_TOO_LARGE: core.int,
-      REQUEST_URI_TOO_LONG: core.int,
-      UNSUPPORTED_MEDIA_TYPE: core.int,
-      REQUESTED_RANGE_NOT_SATISFIABLE: core.int,
-      EXPECTATION_FAILED: core.int,
-      INTERNAL_SERVER_ERROR: core.int,
-      NOT_IMPLEMENTED: core.int,
-      BAD_GATEWAY: core.int,
-      SERVICE_UNAVAILABLE: core.int,
-      GATEWAY_TIMEOUT: core.int,
-      HTTP_VERSION_NOT_SUPPORTED: core.int,
-      NETWORK_CONNECT_TIMEOUT_ERROR: core.int
-    })
-  });
-  io.HttpStatus.CONTINUE = 100;
-  io.HttpStatus.SWITCHING_PROTOCOLS = 101;
-  io.HttpStatus.OK = 200;
-  io.HttpStatus.CREATED = 201;
-  io.HttpStatus.ACCEPTED = 202;
-  io.HttpStatus.NON_AUTHORITATIVE_INFORMATION = 203;
-  io.HttpStatus.NO_CONTENT = 204;
-  io.HttpStatus.RESET_CONTENT = 205;
-  io.HttpStatus.PARTIAL_CONTENT = 206;
-  io.HttpStatus.MULTIPLE_CHOICES = 300;
-  io.HttpStatus.MOVED_PERMANENTLY = 301;
-  io.HttpStatus.FOUND = 302;
-  io.HttpStatus.MOVED_TEMPORARILY = 302;
-  io.HttpStatus.SEE_OTHER = 303;
-  io.HttpStatus.NOT_MODIFIED = 304;
-  io.HttpStatus.USE_PROXY = 305;
-  io.HttpStatus.TEMPORARY_REDIRECT = 307;
-  io.HttpStatus.BAD_REQUEST = 400;
-  io.HttpStatus.UNAUTHORIZED = 401;
-  io.HttpStatus.PAYMENT_REQUIRED = 402;
-  io.HttpStatus.FORBIDDEN = 403;
-  io.HttpStatus.NOT_FOUND = 404;
-  io.HttpStatus.METHOD_NOT_ALLOWED = 405;
-  io.HttpStatus.NOT_ACCEPTABLE = 406;
-  io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED = 407;
-  io.HttpStatus.REQUEST_TIMEOUT = 408;
-  io.HttpStatus.CONFLICT = 409;
-  io.HttpStatus.GONE = 410;
-  io.HttpStatus.LENGTH_REQUIRED = 411;
-  io.HttpStatus.PRECONDITION_FAILED = 412;
-  io.HttpStatus.REQUEST_ENTITY_TOO_LARGE = 413;
-  io.HttpStatus.REQUEST_URI_TOO_LONG = 414;
-  io.HttpStatus.UNSUPPORTED_MEDIA_TYPE = 415;
-  io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE = 416;
-  io.HttpStatus.EXPECTATION_FAILED = 417;
-  io.HttpStatus.INTERNAL_SERVER_ERROR = 500;
-  io.HttpStatus.NOT_IMPLEMENTED = 501;
-  io.HttpStatus.BAD_GATEWAY = 502;
-  io.HttpStatus.SERVICE_UNAVAILABLE = 503;
-  io.HttpStatus.GATEWAY_TIMEOUT = 504;
-  io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED = 505;
-  io.HttpStatus.NETWORK_CONNECT_TIMEOUT_ERROR = 599;
-  io.HttpServer = class HttpServer extends core.Object {
-    static bind(address, port, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      return io._HttpServer.bind(address, port, backlog, v6Only, shared);
-    }
-    static bindSecure(address, port, context, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      return io._HttpServer.bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared);
-    }
-    static listenOn(serverSocket) {
-      return new io._HttpServer.listenOn(serverSocket);
-    }
-  };
-  io.HttpServer[dart.implements] = () => [StreamOfHttpRequest()];
-  dart.setSignature(io.HttpServer, {
-    constructors: () => ({listenOn: dart.definiteFunctionType(io.HttpServer, [io.ServerSocket])}),
-    fields: () => ({
-      serverHeader: core.String,
-      autoCompress: core.bool,
-      idleTimeout: core.Duration
-    }),
-    statics: () => ({
-      bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool}),
-      bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, shared: core.bool})
-    }),
-    names: ['bind', 'bindSecure']
-  });
-  io.HttpConnectionsInfo = class HttpConnectionsInfo extends core.Object {
+  }
+  static get version() {
+    return io._Platform._version();
+  }
+};
+dart.setSignature(io._Platform, {
+  sfields: () => ({
+    executable: core.String,
+    resolvedExecutable: core.String,
+    packageRoot: core.String,
+    packageConfig: core.String,
+    _environmentCache: dart.dynamic,
+    script: core.Uri
+  }),
+  sgetters: () => ({
+    numberOfProcessors: dart.definiteFunctionType(core.int, []),
+    pathSeparator: dart.definiteFunctionType(core.String, []),
+    operatingSystem: dart.definiteFunctionType(core.String, []),
+    localHostname: dart.definiteFunctionType(core.String, []),
+    executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
+    environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    version: dart.definiteFunctionType(core.String, [])
+  }),
+  statics: () => ({
+    _numberOfProcessors: dart.definiteFunctionType(core.int, []),
+    _pathSeparator: dart.definiteFunctionType(core.String, []),
+    _operatingSystem: dart.definiteFunctionType(core.String, []),
+    _localHostname: dart.definiteFunctionType(dart.dynamic, []),
+    _executable: dart.definiteFunctionType(dart.dynamic, []),
+    _resolvedExecutable: dart.definiteFunctionType(dart.dynamic, []),
+    _environment: dart.definiteFunctionType(dart.dynamic, []),
+    _executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
+    _packageRoot: dart.definiteFunctionType(core.String, []),
+    _packageConfig: dart.definiteFunctionType(core.String, []),
+    _version: dart.definiteFunctionType(core.String, [])
+  }),
+  names: ['_numberOfProcessors', '_pathSeparator', '_operatingSystem', '_localHostname', '_executable', '_resolvedExecutable', '_environment', '_executableArguments', '_packageRoot', '_packageConfig', '_version']
+});
+io._Platform._environmentCache = null;
+io._Platform.script = null;
+dart.defineLazy(io._Platform, {
+  get executable() {
+    return core.String._check(io._Platform._executable());
+  },
+  set executable(_) {},
+  get resolvedExecutable() {
+    return core.String._check(io._Platform._resolvedExecutable());
+  },
+  set resolvedExecutable(_) {},
+  get packageRoot() {
+    return io._Platform._packageRoot();
+  },
+  set packageRoot(_) {},
+  get packageConfig() {
+    return io._Platform._packageConfig();
+  },
+  set packageConfig(_) {}
+});
+const _map$1 = Symbol('_map');
+io._CaseInsensitiveStringMap$ = dart.generic(V => {
+  let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
+  let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
+  let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
+  class _CaseInsensitiveStringMap extends core.Object {
     new() {
-      this.total = 0;
-      this.active = 0;
-      this.idle = 0;
-      this.closing = 0;
-    }
-  };
-  dart.setSignature(io.HttpConnectionsInfo, {
-    fields: () => ({
-      total: core.int,
-      active: core.int,
-      idle: core.int,
-      closing: core.int
-    })
-  });
-  io.HttpHeaders = class HttpHeaders extends core.Object {
-    new() {
-      this.date = null;
-      this.expires = null;
-      this.ifModifiedSince = null;
-      this.host = null;
-      this.port = null;
-      this.contentType = null;
-      this.contentLength = null;
-      this.persistentConnection = null;
-      this.chunkedTransferEncoding = null;
-    }
-  };
-  dart.setSignature(io.HttpHeaders, {
-    fields: () => ({
-      date: core.DateTime,
-      expires: core.DateTime,
-      ifModifiedSince: core.DateTime,
-      host: core.String,
-      port: core.int,
-      contentType: io.ContentType,
-      contentLength: core.int,
-      persistentConnection: core.bool,
-      chunkedTransferEncoding: core.bool
-    }),
-    sfields: () => ({
-      ACCEPT: core.String,
-      ACCEPT_CHARSET: core.String,
-      ACCEPT_ENCODING: core.String,
-      ACCEPT_LANGUAGE: core.String,
-      ACCEPT_RANGES: core.String,
-      AGE: core.String,
-      ALLOW: core.String,
-      AUTHORIZATION: core.String,
-      CACHE_CONTROL: core.String,
-      CONNECTION: core.String,
-      CONTENT_ENCODING: core.String,
-      CONTENT_LANGUAGE: core.String,
-      CONTENT_LENGTH: core.String,
-      CONTENT_LOCATION: core.String,
-      CONTENT_MD5: core.String,
-      CONTENT_RANGE: core.String,
-      CONTENT_TYPE: core.String,
-      DATE: core.String,
-      ETAG: core.String,
-      EXPECT: core.String,
-      EXPIRES: core.String,
-      FROM: core.String,
-      HOST: core.String,
-      IF_MATCH: core.String,
-      IF_MODIFIED_SINCE: core.String,
-      IF_NONE_MATCH: core.String,
-      IF_RANGE: core.String,
-      IF_UNMODIFIED_SINCE: core.String,
-      LAST_MODIFIED: core.String,
-      LOCATION: core.String,
-      MAX_FORWARDS: core.String,
-      PRAGMA: core.String,
-      PROXY_AUTHENTICATE: core.String,
-      PROXY_AUTHORIZATION: core.String,
-      RANGE: core.String,
-      REFERER: core.String,
-      RETRY_AFTER: core.String,
-      SERVER: core.String,
-      TE: core.String,
-      TRAILER: core.String,
-      TRANSFER_ENCODING: core.String,
-      UPGRADE: core.String,
-      USER_AGENT: core.String,
-      VARY: core.String,
-      VIA: core.String,
-      WARNING: core.String,
-      WWW_AUTHENTICATE: core.String,
-      COOKIE: core.String,
-      SET_COOKIE: core.String,
-      GENERAL_HEADERS: ListOfString(),
-      ENTITY_HEADERS: ListOfString(),
-      RESPONSE_HEADERS: ListOfString(),
-      REQUEST_HEADERS: ListOfString()
-    })
-  });
-  io.HttpHeaders.ACCEPT = "accept";
-  io.HttpHeaders.ACCEPT_CHARSET = "accept-charset";
-  io.HttpHeaders.ACCEPT_ENCODING = "accept-encoding";
-  io.HttpHeaders.ACCEPT_LANGUAGE = "accept-language";
-  io.HttpHeaders.ACCEPT_RANGES = "accept-ranges";
-  io.HttpHeaders.AGE = "age";
-  io.HttpHeaders.ALLOW = "allow";
-  io.HttpHeaders.AUTHORIZATION = "authorization";
-  io.HttpHeaders.CACHE_CONTROL = "cache-control";
-  io.HttpHeaders.CONNECTION = "connection";
-  io.HttpHeaders.CONTENT_ENCODING = "content-encoding";
-  io.HttpHeaders.CONTENT_LANGUAGE = "content-language";
-  io.HttpHeaders.CONTENT_LENGTH = "content-length";
-  io.HttpHeaders.CONTENT_LOCATION = "content-location";
-  io.HttpHeaders.CONTENT_MD5 = "content-md5";
-  io.HttpHeaders.CONTENT_RANGE = "content-range";
-  io.HttpHeaders.CONTENT_TYPE = "content-type";
-  io.HttpHeaders.DATE = "date";
-  io.HttpHeaders.ETAG = "etag";
-  io.HttpHeaders.EXPECT = "expect";
-  io.HttpHeaders.EXPIRES = "expires";
-  io.HttpHeaders.FROM = "from";
-  io.HttpHeaders.HOST = "host";
-  io.HttpHeaders.IF_MATCH = "if-match";
-  io.HttpHeaders.IF_MODIFIED_SINCE = "if-modified-since";
-  io.HttpHeaders.IF_NONE_MATCH = "if-none-match";
-  io.HttpHeaders.IF_RANGE = "if-range";
-  io.HttpHeaders.IF_UNMODIFIED_SINCE = "if-unmodified-since";
-  io.HttpHeaders.LAST_MODIFIED = "last-modified";
-  io.HttpHeaders.LOCATION = "location";
-  io.HttpHeaders.MAX_FORWARDS = "max-forwards";
-  io.HttpHeaders.PRAGMA = "pragma";
-  io.HttpHeaders.PROXY_AUTHENTICATE = "proxy-authenticate";
-  io.HttpHeaders.PROXY_AUTHORIZATION = "proxy-authorization";
-  io.HttpHeaders.RANGE = "range";
-  io.HttpHeaders.REFERER = "referer";
-  io.HttpHeaders.RETRY_AFTER = "retry-after";
-  io.HttpHeaders.SERVER = "server";
-  io.HttpHeaders.TE = "te";
-  io.HttpHeaders.TRAILER = "trailer";
-  io.HttpHeaders.TRANSFER_ENCODING = "transfer-encoding";
-  io.HttpHeaders.UPGRADE = "upgrade";
-  io.HttpHeaders.USER_AGENT = "user-agent";
-  io.HttpHeaders.VARY = "vary";
-  io.HttpHeaders.VIA = "via";
-  io.HttpHeaders.WARNING = "warning";
-  io.HttpHeaders.WWW_AUTHENTICATE = "www-authenticate";
-  io.HttpHeaders.COOKIE = "cookie";
-  io.HttpHeaders.SET_COOKIE = "set-cookie";
-  dart.defineLazy(io.HttpHeaders, {
-    get GENERAL_HEADERS() {
-      return dart.constList([io.HttpHeaders.CACHE_CONTROL, io.HttpHeaders.CONNECTION, io.HttpHeaders.DATE, io.HttpHeaders.PRAGMA, io.HttpHeaders.TRAILER, io.HttpHeaders.TRANSFER_ENCODING, io.HttpHeaders.UPGRADE, io.HttpHeaders.VIA, io.HttpHeaders.WARNING], core.String);
-    },
-    get ENTITY_HEADERS() {
-      return dart.constList([io.HttpHeaders.ALLOW, io.HttpHeaders.CONTENT_ENCODING, io.HttpHeaders.CONTENT_LANGUAGE, io.HttpHeaders.CONTENT_LENGTH, io.HttpHeaders.CONTENT_LOCATION, io.HttpHeaders.CONTENT_MD5, io.HttpHeaders.CONTENT_RANGE, io.HttpHeaders.CONTENT_TYPE, io.HttpHeaders.EXPIRES, io.HttpHeaders.LAST_MODIFIED], core.String);
-    },
-    get RESPONSE_HEADERS() {
-      return dart.constList([io.HttpHeaders.ACCEPT_RANGES, io.HttpHeaders.AGE, io.HttpHeaders.ETAG, io.HttpHeaders.LOCATION, io.HttpHeaders.PROXY_AUTHENTICATE, io.HttpHeaders.RETRY_AFTER, io.HttpHeaders.SERVER, io.HttpHeaders.VARY, io.HttpHeaders.WWW_AUTHENTICATE], core.String);
-    },
-    get REQUEST_HEADERS() {
-      return dart.constList([io.HttpHeaders.ACCEPT, io.HttpHeaders.ACCEPT_CHARSET, io.HttpHeaders.ACCEPT_ENCODING, io.HttpHeaders.ACCEPT_LANGUAGE, io.HttpHeaders.AUTHORIZATION, io.HttpHeaders.EXPECT, io.HttpHeaders.FROM, io.HttpHeaders.HOST, io.HttpHeaders.IF_MATCH, io.HttpHeaders.IF_MODIFIED_SINCE, io.HttpHeaders.IF_NONE_MATCH, io.HttpHeaders.IF_RANGE, io.HttpHeaders.IF_UNMODIFIED_SINCE, io.HttpHeaders.MAX_FORWARDS, io.HttpHeaders.PROXY_AUTHORIZATION, io.HttpHeaders.RANGE, io.HttpHeaders.REFERER, io.HttpHeaders.TE, io.HttpHeaders.USER_AGENT], core.String);
-    }
-  });
-  io.HeaderValue = class HeaderValue extends core.Object {
-    static new(value, parameters) {
-      if (value === void 0) value = "";
-      if (parameters === void 0) parameters = null;
-      return new io._HeaderValue(value, parameters);
-    }
-    static parse(value, opts) {
-      let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
-      let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
-      let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
-      return io._HeaderValue.parse(value, {parameterSeparator: parameterSeparator, valueSeparator: valueSeparator, preserveBackslash: preserveBackslash});
-    }
-  };
-  dart.setSignature(io.HeaderValue, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HeaderValue, [], [core.String, MapOfString$String()])}),
-    statics: () => ({parse: dart.definiteFunctionType(io.HeaderValue, [core.String], {parameterSeparator: core.String, valueSeparator: core.String, preserveBackslash: core.bool})}),
-    names: ['parse']
-  });
-  io.HttpSession = class HttpSession extends core.Object {};
-  io.HttpSession[dart.implements] = () => [core.Map];
-  io.ContentType = class ContentType extends core.Object {
-    static new(primaryType, subType, opts) {
-      let charset = opts && 'charset' in opts ? opts.charset : null;
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      return new io._ContentType(primaryType, subType, charset, parameters);
-    }
-    static parse(value) {
-      return io._ContentType.parse(value);
-    }
-  };
-  io.ContentType[dart.implements] = () => [io.HeaderValue];
-  dart.setSignature(io.ContentType, {
-    constructors: () => ({new: dart.definiteFunctionType(io.ContentType, [core.String, core.String], {charset: core.String, parameters: MapOfString$String()})}),
-    sfields: () => ({
-      TEXT: io.ContentType,
-      HTML: io.ContentType,
-      JSON: io.ContentType,
-      BINARY: io.ContentType
-    }),
-    statics: () => ({parse: dart.definiteFunctionType(io.ContentType, [core.String])}),
-    names: ['parse']
-  });
-  dart.defineLazy(io.ContentType, {
-    get TEXT() {
-      return io.ContentType.new("text", "plain", {charset: "utf-8"});
-    },
-    get HTML() {
-      return io.ContentType.new("text", "html", {charset: "utf-8"});
-    },
-    get JSON() {
-      return io.ContentType.new("application", "json", {charset: "utf-8"});
-    },
-    get BINARY() {
-      return io.ContentType.new("application", "octet-stream");
-    }
-  });
-  io.Cookie = class Cookie extends core.Object {
-    static new(name, value) {
-      if (name === void 0) name = null;
-      if (value === void 0) value = null;
-      return new io._Cookie(name, value);
-    }
-    static fromSetCookieValue(value) {
-      return new io._Cookie.fromSetCookieValue(value);
-    }
-  };
-  dart.setSignature(io.Cookie, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.Cookie, [], [core.String, core.String]),
-      fromSetCookieValue: dart.definiteFunctionType(io.Cookie, [core.String])
-    }),
-    fields: () => ({
-      name: core.String,
-      value: core.String,
-      expires: core.DateTime,
-      maxAge: core.int,
-      domain: core.String,
-      path: core.String,
-      secure: core.bool,
-      httpOnly: core.bool
-    })
-  });
-  io.HttpRequest = class HttpRequest extends core.Object {};
-  io.HttpRequest[dart.implements] = () => [StreamOfListOfint()];
-  io.HttpResponse = class HttpResponse extends core.Object {
-    new() {
-      this.contentLength = null;
-      this.statusCode = null;
-      this.reasonPhrase = null;
-      this.persistentConnection = null;
-      this.deadline = null;
-      this.bufferOutput = null;
-    }
-  };
-  io.HttpResponse[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io.HttpResponse, {
-    fields: () => ({
-      contentLength: core.int,
-      statusCode: core.int,
-      reasonPhrase: core.String,
-      persistentConnection: core.bool,
-      deadline: core.Duration,
-      bufferOutput: core.bool
-    })
-  });
-  io.HttpClient = class HttpClient extends core.Object {
-    static new(opts) {
-      let context = opts && 'context' in opts ? opts.context : null;
-      return new io._HttpClient(context);
-    }
-    static findProxyFromEnvironment(url, opts) {
-      let environment = opts && 'environment' in opts ? opts.environment : null;
-      return io._HttpClient._findProxyFromEnvironment(url, environment);
-    }
-  };
-  dart.setSignature(io.HttpClient, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HttpClient, [], {context: io.SecurityContext})}),
-    fields: () => ({
-      idleTimeout: core.Duration,
-      maxConnectionsPerHost: core.int,
-      autoUncompress: core.bool,
-      userAgent: core.String
-    }),
-    sfields: () => ({
-      DEFAULT_HTTP_PORT: core.int,
-      DEFAULT_HTTPS_PORT: core.int
-    }),
-    statics: () => ({findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri], {environment: MapOfString$String()})}),
-    names: ['findProxyFromEnvironment']
-  });
-  io.HttpClient.DEFAULT_HTTP_PORT = 80;
-  io.HttpClient.DEFAULT_HTTPS_PORT = 443;
-  io.HttpClientRequest = class HttpClientRequest extends core.Object {
-    new() {
-      this.persistentConnection = null;
-      this.followRedirects = null;
-      this.maxRedirects = null;
-      this.contentLength = null;
-      this.bufferOutput = null;
-    }
-  };
-  io.HttpClientRequest[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io.HttpClientRequest, {
-    fields: () => ({
-      persistentConnection: core.bool,
-      followRedirects: core.bool,
-      maxRedirects: core.int,
-      contentLength: core.int,
-      bufferOutput: core.bool
-    })
-  });
-  io.HttpClientResponse = class HttpClientResponse extends core.Object {};
-  io.HttpClientResponse[dart.implements] = () => [StreamOfListOfint()];
-  io.HttpClientCredentials = class HttpClientCredentials extends core.Object {};
-  io.HttpClientBasicCredentials = class HttpClientBasicCredentials extends io.HttpClientCredentials {
-    static new(username, password) {
-      return new io._HttpClientBasicCredentials(username, password);
-    }
-  };
-  dart.setSignature(io.HttpClientBasicCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HttpClientBasicCredentials, [core.String, core.String])})
-  });
-  io.HttpClientDigestCredentials = class HttpClientDigestCredentials extends io.HttpClientCredentials {
-    static new(username, password) {
-      return new io._HttpClientDigestCredentials(username, password);
-    }
-  };
-  dart.setSignature(io.HttpClientDigestCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HttpClientDigestCredentials, [core.String, core.String])})
-  });
-  io.HttpConnectionInfo = class HttpConnectionInfo extends core.Object {};
-  io.RedirectInfo = class RedirectInfo extends core.Object {};
-  io.DetachedSocket = class DetachedSocket extends core.Object {};
-  io.HttpException = class HttpException extends core.Object {
-    new(message, opts) {
-      let uri = opts && 'uri' in opts ? opts.uri : null;
-      this.message = message;
-      this.uri = uri;
-    }
-    toString() {
-      let b = new core.StringBuffer();
-      b.write('HttpException: ');
-      b.write(this.message);
-      if (this.uri != null) {
-        b.write(dart.str`, uri = ${this.uri}`);
-      }
-      return b.toString();
-    }
-  };
-  io.HttpException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.HttpException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HttpException, [core.String], {uri: core.Uri})}),
-    fields: () => ({
-      message: core.String,
-      uri: core.Uri
-    })
-  });
-  io.RedirectException = class RedirectException extends core.Object {
-    new(message, redirects) {
-      this.message = message;
-      this.redirects = redirects;
-    }
-    toString() {
-      return dart.str`RedirectException: ${this.message}`;
-    }
-    get uri() {
-      return this.redirects[dartx.last].location;
-    }
-  };
-  io.RedirectException[dart.implements] = () => [io.HttpException];
-  dart.setSignature(io.RedirectException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.RedirectException, [core.String, ListOfRedirectInfo()])}),
-    fields: () => ({
-      message: core.String,
-      redirects: ListOfRedirectInfo()
-    }),
-    getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
-  });
-  let const$58;
-  let const$59;
-  let const$60;
-  let const$61;
-  let const$62;
-  let const$63;
-  let const$64;
-  let const$65;
-  let const$66;
-  io.HttpDate = class HttpDate extends core.Object {
-    static format(date) {
-      let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-      let d = date.toUtc();
-      let sb = new core.StringBuffer();
-      sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
-      sb.write(", ");
-      sb.write(dart.notNull(d.day) <= 9 ? "0" : "");
-      sb.write(dart.toString(d.day));
-      sb.write(" ");
-      sb.write(month[dartx._get](dart.notNull(d.month) - 1));
-      sb.write(" ");
-      sb.write(dart.toString(d.year));
-      sb.write(dart.notNull(d.hour) <= 9 ? " 0" : " ");
-      sb.write(dart.toString(d.hour));
-      sb.write(dart.notNull(d.minute) <= 9 ? ":0" : ":");
-      sb.write(dart.toString(d.minute));
-      sb.write(dart.notNull(d.second) <= 9 ? ":0" : ":");
-      sb.write(dart.toString(d.second));
-      sb.write(" GMT");
-      return sb.toString();
-    }
-    static parse(date) {
-      let SP = 32;
-      let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-      let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-      let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-      let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-      let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
-      let formatRfc1123 = 0;
-      let formatRfc850 = 1;
-      let formatAsctime = 2;
-      let index = 0;
-      let tmp = null;
-      let format = null;
-      function expect(s) {
-        if (dart.notNull(date[dartx.length]) - dart.notNull(index) < dart.notNull(s[dartx.length])) {
-          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-        }
-        let tmp = date[dartx.substring](index, dart.notNull(index) + dart.notNull(s[dartx.length]));
-        if (tmp != s) {
-          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-        }
-        index = dart.notNull(index) + dart.notNull(s[dartx.length]);
-      }
-      dart.fn(expect, StringTovoid$());
-      function expectWeekday() {
-        let weekday = null;
-        let pos = date[dartx.indexOf](",", index);
-        if (pos == -1) {
-          let pos = date[dartx.indexOf](" ", index);
-          if (pos == -1) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-          tmp = date[dartx.substring](index, pos);
-          index = dart.notNull(pos) + 1;
-          weekday = wkdays[dartx.indexOf](tmp);
-          if (weekday != -1) {
-            format = formatAsctime;
-            return weekday;
-          }
-        } else {
-          tmp = date[dartx.substring](index, pos);
-          index = dart.notNull(pos) + 1;
-          weekday = wkdays[dartx.indexOf](tmp);
-          if (weekday != -1) {
-            format = formatRfc1123;
-            return weekday;
-          }
-          weekday = weekdays[dartx.indexOf](tmp);
-          if (weekday != -1) {
-            format = formatRfc850;
-            return weekday;
-          }
-        }
-        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-      }
-      dart.fn(expectWeekday, VoidToint());
-      function expectMonth(separator) {
-        let pos = date[dartx.indexOf](separator, index);
-        if (dart.notNull(pos) - dart.notNull(index) != 3) dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-        tmp = date[dartx.substring](index, pos);
-        index = dart.notNull(pos) + 1;
-        let month = months[dartx.indexOf](tmp);
-        if (month != -1) return month;
-        dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-      }
-      dart.fn(expectMonth, StringToint$());
-      function expectNum(separator) {
-        let pos = null;
-        if (dart.notNull(separator[dartx.length]) > 0) {
-          pos = date[dartx.indexOf](separator, index);
-        } else {
-          pos = date[dartx.length];
-        }
-        let tmp = date[dartx.substring](index, pos);
-        index = dart.notNull(pos) + dart.notNull(separator[dartx.length]);
-        try {
-          let value = core.int.parse(tmp);
-          return value;
-        } catch (e) {
-          if (core.FormatException.is(e)) {
-            dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-          } else
-            throw e;
-        }
-
-      }
-      dart.fn(expectNum, StringToint$());
-      function expectEnd() {
-        if (index != date[dartx.length]) {
-          dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
-        }
-      }
-      dart.fn(expectEnd, VoidTovoid$());
-      let weekday = expectWeekday();
-      let day = null;
-      let month = null;
-      let year = null;
-      let hours = null;
-      let minutes = null;
-      let seconds = null;
-      if (format == formatAsctime) {
-        month = expectMonth(" ");
-        if (date[dartx.codeUnitAt](index) == SP) {
-          index = dart.notNull(index) + 1;
-        }
-        day = expectNum(" ");
-        hours = expectNum(":");
-        minutes = expectNum(":");
-        seconds = expectNum(" ");
-        year = expectNum("");
-      } else {
-        expect(" ");
-        day = expectNum(format == formatRfc1123 ? " " : "-");
-        month = expectMonth(format == formatRfc1123 ? " " : "-");
-        year = expectNum(" ");
-        hours = expectNum(":");
-        minutes = expectNum(":");
-        seconds = expectNum(" ");
-        expect("GMT");
-      }
-      expectEnd();
-      return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
-    }
-    static _parseCookieDate(date) {
-      let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
-      let position = 0;
-      function error() {
-        dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
-      }
-      dart.fn(error, VoidTovoid$());
-      function isEnd() {
-        return position == date[dartx.length];
-      }
-      dart.fn(isEnd, VoidTobool());
-      function isDelimiter(s) {
-        let char = s[dartx.codeUnitAt](0);
-        if (char == 9) return true;
-        if (dart.notNull(char) >= 32 && dart.notNull(char) <= 47) return true;
-        if (dart.notNull(char) >= 59 && dart.notNull(char) <= 64) return true;
-        if (dart.notNull(char) >= 91 && dart.notNull(char) <= 96) return true;
-        if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
-        return false;
-      }
-      dart.fn(isDelimiter, StringTobool$());
-      function isNonDelimiter(s) {
-        let char = s[dartx.codeUnitAt](0);
-        if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
-        if (dart.notNull(char) >= 10 && dart.notNull(char) <= 31) return true;
-        if (dart.notNull(char) >= 48 && dart.notNull(char) <= 57) return true;
-        if (char == 58) return true;
-        if (dart.notNull(char) >= 65 && dart.notNull(char) <= 90) return true;
-        if (dart.notNull(char) >= 97 && dart.notNull(char) <= 122) return true;
-        if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
-        return false;
-      }
-      dart.fn(isNonDelimiter, StringTobool$());
-      function isDigit(s) {
-        let char = s[dartx.codeUnitAt](0);
-        if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
-        return false;
-      }
-      dart.fn(isDigit, StringTobool$());
-      function getMonth(month) {
-        if (dart.notNull(month[dartx.length]) < 3) return -1;
-        return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
-      }
-      dart.fn(getMonth, StringToint$());
-      function toInt(s) {
-        let index = 0;
-        for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
-          ;
-        return core.int.parse(s[dartx.substring](0, index));
-      }
-      dart.fn(toInt, StringToint$());
-      let tokens = [];
-      while (!dart.test(isEnd())) {
-        while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
-          position++;
-        let start = position;
-        while (!dart.test(isEnd()) && dart.test(isNonDelimiter(date[dartx._get](position))))
-          position++;
-        tokens[dartx.add](date[dartx.substring](start, position)[dartx.toLowerCase]());
-        while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
-          position++;
-      }
-      let timeStr = null;
-      let dayOfMonthStr = null;
-      let monthStr = null;
-      let yearStr = null;
-      for (let token of tokens) {
-        if (dart.test(dart.dsend(dart.dload(token, 'length'), '<', 1))) continue;
-        if (timeStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 5)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && (dart.equals(dart.dindex(token, 1), ":") || dart.test(isDigit(core.String._check(dart.dindex(token, 1)))) && dart.equals(dart.dindex(token, 2), ":"))) {
-          timeStr = core.String._check(token);
-        } else if (dayOfMonthStr == null && dart.test(isDigit(core.String._check(dart.dindex(token, 0))))) {
-          dayOfMonthStr = core.String._check(token);
-        } else if (monthStr == null && dart.notNull(getMonth(core.String._check(token))) >= 0) {
-          monthStr = core.String._check(token);
-        } else if (yearStr == null && dart.test(dart.dsend(dart.dload(token, 'length'), '>=', 2)) && dart.test(isDigit(core.String._check(dart.dindex(token, 0)))) && dart.test(isDigit(core.String._check(dart.dindex(token, 1))))) {
-          yearStr = core.String._check(token);
-        }
-      }
-      if (timeStr == null || dayOfMonthStr == null || monthStr == null || yearStr == null) {
-        error();
-      }
-      let year = toInt(yearStr);
-      if (dart.notNull(year) >= 70 && dart.notNull(year) <= 99) {
-        year = dart.notNull(year) + 1900;
-      } else if (dart.notNull(year) >= 0 && dart.notNull(year) <= 69) {
-        year = dart.notNull(year) + 2000;
-      }
-      if (dart.notNull(year) < 1601) error();
-      let dayOfMonth = toInt(dayOfMonthStr);
-      if (dart.notNull(dayOfMonth) < 1 || dart.notNull(dayOfMonth) > 31) error();
-      let month = dart.notNull(getMonth(monthStr)) + 1;
-      let timeList = timeStr[dartx.split](":");
-      if (timeList[dartx.length] != 3) error();
-      let hour = toInt(timeList[dartx._get](0));
-      let minute = toInt(timeList[dartx._get](1));
-      let second = toInt(timeList[dartx._get](2));
-      if (dart.notNull(hour) > 23) error();
-      if (dart.notNull(minute) > 59) error();
-      if (dart.notNull(second) > 59) error();
-      return new core.DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
-    }
-  };
-  dart.setSignature(io.HttpDate, {
-    statics: () => ({
-      format: dart.definiteFunctionType(core.String, [core.DateTime]),
-      parse: dart.definiteFunctionType(core.DateTime, [core.String]),
-      _parseCookieDate: dart.definiteFunctionType(core.DateTime, [core.String])
-    }),
-    names: ['format', 'parse', '_parseCookieDate']
-  });
-  const _headers = Symbol('_headers');
-  const _defaultPortForScheme = Symbol('_defaultPortForScheme');
-  const _mutable = Symbol('_mutable');
-  const _noFoldingHeaders = Symbol('_noFoldingHeaders');
-  const _contentLength = Symbol('_contentLength');
-  const _persistentConnection = Symbol('_persistentConnection');
-  const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
-  const _host$ = Symbol('_host');
-  const _port$ = Symbol('_port');
-  const _checkMutable = Symbol('_checkMutable');
-  const _addAll = Symbol('_addAll');
-  const _add$2 = Symbol('_add');
-  const _set$ = Symbol('_set');
-  const _addValue = Symbol('_addValue');
-  const _updateHostHeader = Symbol('_updateHostHeader');
-  const _addDate = Symbol('_addDate');
-  const _addHost = Symbol('_addHost');
-  const _addExpires = Symbol('_addExpires');
-  const _addConnection = Symbol('_addConnection');
-  const _addContentType = Symbol('_addContentType');
-  const _addContentLength = Symbol('_addContentLength');
-  const _addTransferEncoding = Symbol('_addTransferEncoding');
-  const _addIfModifiedSince = Symbol('_addIfModifiedSince');
-  const _foldHeader = Symbol('_foldHeader');
-  const _finalize = Symbol('_finalize');
-  const _write = Symbol('_write');
-  const _parseCookies = Symbol('_parseCookies');
-  io._HttpHeaders = class _HttpHeaders extends core.Object {
-    new(protocolVersion, opts) {
-      let defaultPortForScheme = opts && 'defaultPortForScheme' in opts ? opts.defaultPortForScheme : io.HttpClient.DEFAULT_HTTP_PORT;
-      let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-      this.protocolVersion = protocolVersion;
-      this[_headers] = HashMapOfString$ListOfString().new();
-      this[_defaultPortForScheme] = defaultPortForScheme;
-      this[_mutable] = true;
-      this[_noFoldingHeaders] = null;
-      this[_contentLength] = -1;
-      this[_persistentConnection] = true;
-      this[_chunkedTransferEncoding] = false;
-      this[_host$] = null;
-      this[_port$] = null;
-      if (initialHeaders != null) {
-        initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
-        this[_contentLength] = initialHeaders[_contentLength];
-        this[_persistentConnection] = initialHeaders[_persistentConnection];
-        this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
-        this[_host$] = initialHeaders[_host$];
-        this[_port$] = initialHeaders[_port$];
-      }
-      if (this.protocolVersion == "1.0") {
-        this[_persistentConnection] = false;
-        this[_chunkedTransferEncoding] = false;
-      }
-    }
-    _get(name) {
-      return this[_headers][dartx._get](name[dartx.toLowerCase]());
-    }
-    value(name) {
-      name = name[dartx.toLowerCase]();
-      let values = this[_headers][dartx._get](name);
-      if (values == null) return null;
-      if (dart.notNull(values[dartx.length]) > 1) {
-        dart.throw(new io.HttpException(dart.str`More than one value for header ${name}`));
-      }
-      return values[dartx._get](0);
-    }
-    add(name, value) {
-      this[_checkMutable]();
-      this[_addAll](io._HttpHeaders._validateField(name), value);
-    }
-    [_addAll](name, value) {
-      dart.assert(name == io._HttpHeaders._validateField(name));
-      if (core.Iterable.is(value)) {
-        for (let v of value) {
-          this[_add$2](name, io._HttpHeaders._validateValue(v));
-        }
-      } else {
-        this[_add$2](name, io._HttpHeaders._validateValue(value));
-      }
-    }
-    set(name, value) {
-      this[_checkMutable]();
-      name = io._HttpHeaders._validateField(name);
-      this[_headers][dartx.remove](name);
-      if (name == io.HttpHeaders.TRANSFER_ENCODING) {
-        this[_chunkedTransferEncoding] = false;
-      }
-      this[_addAll](name, value);
-    }
-    remove(name, value) {
-      this[_checkMutable]();
-      name = io._HttpHeaders._validateField(name);
-      value = io._HttpHeaders._validateValue(value);
-      let values = this[_headers][dartx._get](name);
-      if (values != null) {
-        let index = values[dartx.indexOf](core.String._check(value));
-        if (index != -1) {
-          values[dartx.removeRange](index, dart.notNull(index) + 1);
-        }
-        if (values[dartx.length] == 0) this[_headers][dartx.remove](name);
-      }
-      if (name == io.HttpHeaders.TRANSFER_ENCODING && dart.equals(value, "chunked")) {
-        this[_chunkedTransferEncoding] = false;
-      }
-    }
-    removeAll(name) {
-      this[_checkMutable]();
-      name = io._HttpHeaders._validateField(name);
-      this[_headers][dartx.remove](name);
-    }
-    forEach(f) {
-      this[_headers][dartx.forEach](f);
-    }
-    noFolding(name) {
-      if (this[_noFoldingHeaders] == null) this[_noFoldingHeaders] = ListOfString().new();
-      this[_noFoldingHeaders][dartx.add](name);
-    }
-    get persistentConnection() {
-      return this[_persistentConnection];
-    }
-    set persistentConnection(persistentConnection) {
-      this[_checkMutable]();
-      if (persistentConnection == this[_persistentConnection]) return;
-      if (dart.test(persistentConnection)) {
-        if (this.protocolVersion == "1.1") {
-          this.remove(io.HttpHeaders.CONNECTION, "close");
-        } else {
-          if (this[_contentLength] == -1) {
-            dart.throw(new io.HttpException("Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with " + "no ContentLength"));
-          }
-          this.add(io.HttpHeaders.CONNECTION, "keep-alive");
-        }
-      } else {
-        if (this.protocolVersion == "1.1") {
-          this.add(io.HttpHeaders.CONNECTION, "close");
-        } else {
-          this.remove(io.HttpHeaders.CONNECTION, "keep-alive");
-        }
-      }
-      this[_persistentConnection] = persistentConnection;
-    }
-    get contentLength() {
-      return this[_contentLength];
-    }
-    set contentLength(contentLength) {
-      this[_checkMutable]();
-      if (this.protocolVersion == "1.0" && dart.test(this.persistentConnection) && contentLength == -1) {
-        dart.throw(new io.HttpException("Trying to clear ContentLength on HTTP 1.0 headers with " + "'Connection: Keep-Alive' set"));
-      }
-      if (this[_contentLength] == contentLength) return;
-      this[_contentLength] = contentLength;
-      if (dart.notNull(this[_contentLength]) >= 0) {
-        if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
-        this[_set$](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
-      } else {
-        this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
-        if (this.protocolVersion == "1.1") {
-          this.chunkedTransferEncoding = true;
-        }
-      }
-    }
-    get chunkedTransferEncoding() {
-      return this[_chunkedTransferEncoding];
-    }
-    set chunkedTransferEncoding(chunkedTransferEncoding) {
-      this[_checkMutable]();
-      if (dart.test(chunkedTransferEncoding) && this.protocolVersion == "1.0") {
-        dart.throw(new io.HttpException("Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers"));
-      }
-      if (chunkedTransferEncoding == this[_chunkedTransferEncoding]) return;
-      if (dart.test(chunkedTransferEncoding)) {
-        let values = this[_headers][dartx._get](io.HttpHeaders.TRANSFER_ENCODING);
-        if (values == null || values[dartx.last] != "chunked") {
-          this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, "chunked");
-        }
-        this.contentLength = -1;
-      } else {
-        this.remove(io.HttpHeaders.TRANSFER_ENCODING, "chunked");
-      }
-      this[_chunkedTransferEncoding] = chunkedTransferEncoding;
-    }
-    get host() {
-      return this[_host$];
-    }
-    set host(host) {
-      this[_checkMutable]();
-      this[_host$] = host;
-      this[_updateHostHeader]();
-    }
-    get port() {
-      return this[_port$];
-    }
-    set port(port) {
-      this[_checkMutable]();
-      this[_port$] = port;
-      this[_updateHostHeader]();
-    }
-    get ifModifiedSince() {
-      let values = this[_headers][dartx._get](io.HttpHeaders.IF_MODIFIED_SINCE);
-      if (values != null) {
-        try {
-          return io.HttpDate.parse(values[dartx._get](0));
-        } catch (e) {
-          if (core.Exception.is(e)) {
-            return null;
-          } else
-            throw e;
-        }
-
-      }
-      return null;
-    }
-    set ifModifiedSince(ifModifiedSince) {
-      this[_checkMutable]();
-      let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
-      this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
-    }
-    get date() {
-      let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
-      if (values != null) {
-        try {
-          return io.HttpDate.parse(values[dartx._get](0));
-        } catch (e) {
-          if (core.Exception.is(e)) {
-            return null;
-          } else
-            throw e;
-        }
-
-      }
-      return null;
-    }
-    set date(date) {
-      this[_checkMutable]();
-      let formatted = io.HttpDate.format(date.toUtc());
-      this[_set$]("date", formatted);
-    }
-    get expires() {
-      let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
-      if (values != null) {
-        try {
-          return io.HttpDate.parse(values[dartx._get](0));
-        } catch (e) {
-          if (core.Exception.is(e)) {
-            return null;
-          } else
-            throw e;
-        }
-
-      }
-      return null;
-    }
-    set expires(expires) {
-      this[_checkMutable]();
-      let formatted = io.HttpDate.format(expires.toUtc());
-      this[_set$](io.HttpHeaders.EXPIRES, formatted);
-    }
-    get contentType() {
-      let values = this[_headers][dartx._get]("content-type");
-      if (values != null) {
-        return io.ContentType.parse(values[dartx._get](0));
-      } else {
-        return null;
-      }
-    }
-    set contentType(contentType) {
-      this[_checkMutable]();
-      this[_set$](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
-    }
-    clear() {
-      this[_checkMutable]();
-      this[_headers][dartx.clear]();
-      this[_contentLength] = -1;
-      this[_persistentConnection] = true;
-      this[_chunkedTransferEncoding] = false;
-      this[_host$] = null;
-      this[_port$] = null;
-    }
-    [_add$2](name, value) {
-      dart.assert(name == io._HttpHeaders._validateField(name));
-      switch (name[dartx.length]) {
-        case 4:
-        {
-          if (io.HttpHeaders.DATE == name) {
-            this[_addDate](name, value);
-            return;
-          }
-          if (io.HttpHeaders.HOST == name) {
-            this[_addHost](name, value);
-            return;
-          }
-          break;
-        }
-        case 7:
-        {
-          if (io.HttpHeaders.EXPIRES == name) {
-            this[_addExpires](name, value);
-            return;
-          }
-          break;
-        }
-        case 10:
-        {
-          if (io.HttpHeaders.CONNECTION == name) {
-            this[_addConnection](name, value);
-            return;
-          }
-          break;
-        }
-        case 12:
-        {
-          if (io.HttpHeaders.CONTENT_TYPE == name) {
-            this[_addContentType](name, value);
-            return;
-          }
-          break;
-        }
-        case 14:
-        {
-          if (io.HttpHeaders.CONTENT_LENGTH == name) {
-            this[_addContentLength](name, value);
-            return;
-          }
-          break;
-        }
-        case 17:
-        {
-          if (io.HttpHeaders.TRANSFER_ENCODING == name) {
-            this[_addTransferEncoding](name, value);
-            return;
-          }
-          if (io.HttpHeaders.IF_MODIFIED_SINCE == name) {
-            this[_addIfModifiedSince](name, value);
-            return;
-          }
-        }
-      }
-      this[_addValue](name, value);
-    }
-    [_addContentLength](name, value) {
-      if (typeof value == 'number') {
-        this.contentLength = value;
-      } else if (typeof value == 'string') {
-        this.contentLength = core.int.parse(value);
-      } else {
-        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
-      }
-    }
-    [_addTransferEncoding](name, value) {
-      if (dart.equals(value, "chunked")) {
-        this.chunkedTransferEncoding = true;
-      } else {
-        this[_addValue](io.HttpHeaders.TRANSFER_ENCODING, value);
-      }
-    }
-    [_addDate](name, value) {
-      if (core.DateTime.is(value)) {
-        this.date = value;
-      } else if (typeof value == 'string') {
-        this[_set$](io.HttpHeaders.DATE, value);
-      } else {
-        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
-      }
-    }
-    [_addExpires](name, value) {
-      if (core.DateTime.is(value)) {
-        this.expires = value;
-      } else if (typeof value == 'string') {
-        this[_set$](io.HttpHeaders.EXPIRES, value);
-      } else {
-        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
-      }
-    }
-    [_addIfModifiedSince](name, value) {
-      if (core.DateTime.is(value)) {
-        this.ifModifiedSince = value;
-      } else if (typeof value == 'string') {
-        this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, value);
-      } else {
-        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
-      }
-    }
-    [_addHost](name, value) {
-      if (typeof value == 'string') {
-        let pos = value[dartx.indexOf](":");
-        if (pos == -1) {
-          this[_host$] = value;
-          this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
-        } else {
-          if (dart.notNull(pos) > 0) {
-            this[_host$] = value[dartx.substring](0, pos);
-          } else {
-            this[_host$] = null;
-          }
-          if (dart.notNull(pos) + 1 == value[dartx.length]) {
-            this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
-          } else {
-            try {
-              this[_port$] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
-            } catch (e) {
-              if (core.FormatException.is(e)) {
-                this[_port$] = null;
-              } else
-                throw e;
-            }
-
-          }
-        }
-        this[_set$](io.HttpHeaders.HOST, value);
-      } else {
-        dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
-      }
-    }
-    [_addConnection](name, value) {
-      let lowerCaseValue = dart.dsend(value, 'toLowerCase');
-      if (dart.equals(lowerCaseValue, 'close')) {
-        this[_persistentConnection] = false;
-      } else if (dart.equals(lowerCaseValue, 'keep-alive')) {
-        this[_persistentConnection] = true;
-      }
-      this[_addValue](name, value);
-    }
-    [_addContentType](name, value) {
-      this[_set$](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
-    }
-    [_addValue](name, value) {
-      let values = this[_headers][dartx._get](name);
-      if (values == null) {
-        values = ListOfString().new();
-        this[_headers][dartx._set](name, values);
-      }
-      if (core.DateTime.is(value)) {
-        values[dartx.add](io.HttpDate.format(value));
-      } else if (typeof value == 'string') {
-        values[dartx.add](value);
-      } else {
-        values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
-      }
-    }
-    [_set$](name, value) {
-      dart.assert(name == io._HttpHeaders._validateField(name));
-      let values = ListOfString().new();
-      this[_headers][dartx._set](name, values);
-      values[dartx.add](value);
-    }
-    [_checkMutable]() {
-      if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
-    }
-    [_updateHostHeader]() {
-      let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
-      this[_set$]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port$]}`);
-    }
-    [_foldHeader](name) {
-      if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
-        return false;
-      }
-      return true;
-    }
-    [_finalize]() {
-      this[_mutable] = false;
-    }
-    [_write](buffer, offset) {
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid$());
-      for (let name of this[_headers][dartx.keys]) {
-        let values = this[_headers][dartx._get](name);
-        let fold = core.bool._check(this[_foldHeader](name));
-        let nameData = name[dartx.codeUnits];
-        write(nameData);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.COLON);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.SP);
-        for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
-          if (i > 0) {
-            if (dart.test(fold)) {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COMMA);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
-            } else {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.CR);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.LF);
-              write(nameData);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COLON);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
-            }
-          }
-          write(values[dartx._get](i)[dartx.codeUnits]);
-        }
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.CR);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.LF);
-      }
-      return offset;
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      this[_headers][dartx.forEach](dart.fn((name, values) => {
-        sb.write(name);
-        sb.write(": ");
-        let fold = core.bool._check(this[_foldHeader](name));
-        for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
-          if (i > 0) {
-            if (dart.test(fold)) {
-              sb.write(", ");
-            } else {
-              sb.write("\n");
-              sb.write(name);
-              sb.write(": ");
-            }
-          }
-          sb.write(values[dartx._get](i));
-        }
-        sb.write("\n");
-      }, StringAndListOfStringToNull()));
-      return sb.toString();
-    }
-    [_parseCookies]() {
-      let cookies = ListOfCookie().new();
-      function parseCookieString(s) {
-        let index = 0;
-        function done() {
-          return index == -1 || index == s[dartx.length];
-        }
-        dart.fn(done, VoidTobool());
-        function skipWS() {
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
-            index = dart.notNull(index) + 1;
-          }
-        }
-        dart.fn(skipWS, VoidTovoid$());
-        function parseName() {
-          let start = index;
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=") break;
-            index = dart.notNull(index) + 1;
-          }
-          return s[dartx.substring](start, index);
-        }
-        dart.fn(parseName, VoidToString$());
-        function parseValue() {
-          let start = index;
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == ";") break;
-            index = dart.notNull(index) + 1;
-          }
-          return s[dartx.substring](start, index);
-        }
-        dart.fn(parseValue, VoidToString$());
-        function expect(expected) {
-          if (dart.test(done())) return false;
-          if (s[dartx._get](index) != expected) return false;
-          index = dart.notNull(index) + 1;
-          return true;
-        }
-        dart.fn(expect, StringTobool$());
-        while (!dart.test(done())) {
-          skipWS();
-          if (dart.test(done())) return;
-          let name = parseName();
-          skipWS();
-          if (!dart.test(expect("="))) {
-            index = s[dartx.indexOf](';', index);
-            continue;
-          }
-          skipWS();
-          let value = parseValue();
-          try {
-            cookies[dartx.add](new io._Cookie(name, value));
-          } catch (_) {
-          }
-
-          skipWS();
-          if (dart.test(done())) return;
-          if (!dart.test(expect(";"))) {
-            index = s[dartx.indexOf](';', index);
-            continue;
-          }
-        }
-      }
-      dart.fn(parseCookieString, StringTovoid$());
-      let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
-      if (values != null) {
-        values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid$()));
-      }
-      return cookies;
-    }
-    static _validateField(field) {
-      for (let i = 0; i < dart.notNull(field[dartx.length]); i++) {
-        if (!dart.test(io._HttpParser._isTokenChar(field[dartx.codeUnitAt](i)))) {
-          dart.throw(new core.FormatException(dart.str`Invalid HTTP header field name: ${convert.JSON.encode(field)}`));
-        }
-      }
-      return field[dartx.toLowerCase]();
-    }
-    static _validateValue(value) {
-      if (!(typeof value == 'string')) return value;
-      for (let i = 0; i < dart.notNull(core.num._check(dart.dload(value, 'length'))); i++) {
-        if (!dart.test(io._HttpParser._isValueChar(core.int._check(dart.dsend(value, 'codeUnitAt', i))))) {
-          dart.throw(new core.FormatException(dart.str`Invalid HTTP header field value: ${convert.JSON.encode(value)}`));
-        }
-      }
-      return value;
-    }
-  };
-  io._HttpHeaders[dart.implements] = () => [io.HttpHeaders];
-  dart.setSignature(io._HttpHeaders, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpHeaders, [core.String], {defaultPortForScheme: core.int, initialHeaders: io._HttpHeaders})}),
-    fields: () => ({
-      [_headers]: MapOfString$ListOfString(),
-      protocolVersion: core.String,
-      [_mutable]: core.bool,
-      [_noFoldingHeaders]: ListOfString(),
-      [_contentLength]: core.int,
-      [_persistentConnection]: core.bool,
-      [_chunkedTransferEncoding]: core.bool,
-      [_host$]: core.String,
-      [_port$]: core.int,
-      [_defaultPortForScheme]: core.int
-    }),
-    getters: () => ({
-      persistentConnection: dart.definiteFunctionType(core.bool, []),
-      contentLength: dart.definiteFunctionType(core.int, []),
-      chunkedTransferEncoding: dart.definiteFunctionType(core.bool, []),
-      host: dart.definiteFunctionType(core.String, []),
-      port: dart.definiteFunctionType(core.int, []),
-      ifModifiedSince: dart.definiteFunctionType(core.DateTime, []),
-      date: dart.definiteFunctionType(core.DateTime, []),
-      expires: dart.definiteFunctionType(core.DateTime, []),
-      contentType: dart.definiteFunctionType(io.ContentType, [])
-    }),
-    setters: () => ({
-      persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
-      contentLength: dart.definiteFunctionType(dart.void, [core.int]),
-      chunkedTransferEncoding: dart.definiteFunctionType(dart.void, [core.bool]),
-      host: dart.definiteFunctionType(dart.void, [core.String]),
-      port: dart.definiteFunctionType(dart.void, [core.int]),
-      ifModifiedSince: dart.definiteFunctionType(dart.void, [core.DateTime]),
-      date: dart.definiteFunctionType(dart.void, [core.DateTime]),
-      expires: dart.definiteFunctionType(dart.void, [core.DateTime]),
-      contentType: dart.definiteFunctionType(dart.void, [io.ContentType])
-    }),
-    methods: () => ({
-      _get: dart.definiteFunctionType(core.List$(core.String), [core.String]),
-      value: dart.definiteFunctionType(core.String, [core.String]),
-      add: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
-      [_addAll]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      set: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
-      remove: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
-      removeAll: dart.definiteFunctionType(dart.void, [core.String]),
-      forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
-      noFolding: dart.definiteFunctionType(dart.void, [core.String]),
-      clear: dart.definiteFunctionType(dart.void, []),
-      [_add$2]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addExpires]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addIfModifiedSince]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addHost]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
-      [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
-      [_set$]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
-      [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
-      [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      [_finalize]: dart.definiteFunctionType(dart.void, []),
-      [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
-      [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
-    }),
-    statics: () => ({
-      _validateField: dart.definiteFunctionType(core.String, [core.String]),
-      _validateValue: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    }),
-    names: ['_validateField', '_validateValue']
-  });
-  const _value$1 = Symbol('_value');
-  const _parameters = Symbol('_parameters');
-  const _unmodifiableParameters = Symbol('_unmodifiableParameters');
-  const _parse = Symbol('_parse');
-  const _ensureParameters = Symbol('_ensureParameters');
-  io._HeaderValue = class _HeaderValue extends core.Object {
-    new(value, parameters) {
-      if (value === void 0) value = "";
-      if (parameters === void 0) parameters = null;
-      this[_value$1] = value;
-      this[_parameters] = null;
-      this[_unmodifiableParameters] = null;
-      if (parameters != null) {
-        this[_parameters] = HashMapOfString$String().from(parameters);
-      }
-    }
-    static parse(value, opts) {
-      let parameterSeparator = opts && 'parameterSeparator' in opts ? opts.parameterSeparator : ";";
-      let valueSeparator = opts && 'valueSeparator' in opts ? opts.valueSeparator : null;
-      let preserveBackslash = opts && 'preserveBackslash' in opts ? opts.preserveBackslash : false;
-      let result = new io._HeaderValue();
-      result[_parse](value, core.String._check(parameterSeparator), core.String._check(valueSeparator), core.bool._check(preserveBackslash));
-      return result;
-    }
-    get value() {
-      return this[_value$1];
-    }
-    [_ensureParameters]() {
-      if (this[_parameters] == null) {
-        this[_parameters] = HashMapOfString$String().new();
-      }
-    }
-    get parameters() {
-      this[_ensureParameters]();
-      if (this[_unmodifiableParameters] == null) {
-        this[_unmodifiableParameters] = new (UnmodifiableMapViewOfString$String())(this[_parameters]);
-      }
-      return this[_unmodifiableParameters];
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write(this[_value$1]);
-      if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
-        this[_parameters][dartx.forEach](dart.fn((name, value) => {
-          sb.write("; ");
-          sb.write(name);
-          sb.write("=");
-          sb.write(value);
-        }, StringAndStringToNull()));
-      }
-      return sb.toString();
-    }
-    [_parse](s, parameterSeparator, valueSeparator, preserveBackslash) {
-      let index = 0;
-      function done() {
-        return index == s[dartx.length];
-      }
-      dart.fn(done, VoidTobool());
-      function skipWS() {
-        while (!dart.test(done())) {
-          if (s[dartx._get](index) != " " && s[dartx._get](index) != "\t") return;
-          index++;
-        }
-      }
-      dart.fn(skipWS, VoidTovoid$());
-      function parseValue() {
-        let start = index;
-        while (!dart.test(done())) {
-          if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == valueSeparator || s[dartx._get](index) == parameterSeparator) break;
-          index++;
-        }
-        return s[dartx.substring](start, index);
-      }
-      dart.fn(parseValue, VoidToString$());
-      function expect(expected) {
-        if (dart.test(done()) || s[dartx._get](index) != expected) {
-          dart.throw(new io.HttpException("Failed to parse header value"));
-        }
-        index++;
-      }
-      dart.fn(expect, StringTovoid$());
-      function maybeExpect(expected) {
-        if (s[dartx._get](index) == expected) index++;
-      }
-      dart.fn(maybeExpect, StringTovoid$());
-      const parseParameters = (function() {
-        let parameters = HashMapOfString$String().new();
-        this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
-        function parseParameterName() {
-          let start = index;
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) == " " || s[dartx._get](index) == "\t" || s[dartx._get](index) == "=" || s[dartx._get](index) == parameterSeparator || s[dartx._get](index) == valueSeparator) break;
-            index++;
-          }
-          return s[dartx.substring](start, index)[dartx.toLowerCase]();
-        }
-        dart.fn(parseParameterName, VoidToString$());
-        function parseParameterValue() {
-          if (!dart.test(done()) && s[dartx._get](index) == "\"") {
-            let sb = new core.StringBuffer();
-            index++;
-            while (!dart.test(done())) {
-              if (s[dartx._get](index) == "\\") {
-                if (index + 1 == s[dartx.length]) {
-                  dart.throw(new io.HttpException("Failed to parse header value"));
-                }
-                if (dart.test(preserveBackslash) && s[dartx._get](index + 1) != "\"") {
-                  sb.write(s[dartx._get](index));
-                }
-                index++;
-              } else if (s[dartx._get](index) == "\"") {
-                index++;
-                break;
-              }
-              sb.write(s[dartx._get](index));
-              index++;
-            }
-            return sb.toString();
-          } else {
-            let val = parseValue();
-            return val == "" ? null : val;
-          }
-        }
-        dart.fn(parseParameterValue, VoidToString$());
-        while (!dart.test(done())) {
-          skipWS();
-          if (dart.test(done())) return;
-          let name = parseParameterName();
-          skipWS();
-          if (dart.test(done())) {
-            parameters._set(name, null);
-            return;
-          }
-          maybeExpect("=");
-          skipWS();
-          if (dart.test(done())) {
-            parameters._set(name, null);
-            return;
-          }
-          let value = parseParameterValue();
-          if (name == 'charset' && io._ContentType.is(this)) {
-            value = value[dartx.toLowerCase]();
-          }
-          parameters._set(name, value);
-          skipWS();
-          if (dart.test(done())) return;
-          if (s[dartx._get](index) == valueSeparator) return;
-          expect(parameterSeparator);
-        }
-      }).bind(this);
-      dart.fn(parseParameters, VoidTovoid$());
-      skipWS();
-      this[_value$1] = parseValue();
-      skipWS();
-      if (dart.test(done())) return;
-      maybeExpect(parameterSeparator);
-      parseParameters();
-    }
-  };
-  io._HeaderValue[dart.implements] = () => [io.HeaderValue];
-  dart.setSignature(io._HeaderValue, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
-    fields: () => ({
-      [_value$1]: core.String,
-      [_parameters]: MapOfString$String(),
-      [_unmodifiableParameters]: MapOfString$String()
-    }),
-    getters: () => ({
-      value: dart.definiteFunctionType(core.String, []),
-      parameters: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
-    }),
-    methods: () => ({
-      [_ensureParameters]: dart.definiteFunctionType(dart.void, []),
-      [_parse]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String, core.bool])
-    }),
-    statics: () => ({parse: dart.definiteFunctionType(io._HeaderValue, [core.String], {parameterSeparator: dart.dynamic, valueSeparator: dart.dynamic, preserveBackslash: dart.dynamic})}),
-    names: ['parse']
-  });
-  const _primaryType = Symbol('_primaryType');
-  const _subType = Symbol('_subType');
-  io._ContentType = class _ContentType extends io._HeaderValue {
-    new(primaryType, subType, charset, parameters) {
-      this[_primaryType] = primaryType;
-      this[_subType] = subType;
-      super.new("");
-      if (this[_primaryType] == null) this[_primaryType] = "";
-      if (this[_subType] == null) this[_subType] = "";
-      this[_value$1] = dart.str`${this[_primaryType]}/${this[_subType]}`;
-      if (parameters != null) {
-        this[_ensureParameters]();
-        parameters[dartx.forEach](dart.fn((key, value) => {
-          let lowerCaseKey = key[dartx.toLowerCase]();
-          if (lowerCaseKey == "charset") {
-            value = value[dartx.toLowerCase]();
-          }
-          this[_parameters][dartx._set](lowerCaseKey, value);
-        }, StringAndStringToNull()));
-      }
-      if (charset != null) {
-        this[_ensureParameters]();
-        this[_parameters][dartx._set]("charset", charset[dartx.toLowerCase]());
-      }
-    }
-    _() {
-      this[_primaryType] = "";
-      this[_subType] = "";
-      super.new();
-    }
-    static parse(value) {
-      let result = new io._ContentType._();
-      result[_parse](value, ";", null, false);
-      let index = result[_value$1][dartx.indexOf]("/");
-      if (index == -1 || index == dart.notNull(result[_value$1][dartx.length]) - 1) {
-        result[_primaryType] = result[_value$1][dartx.trim]()[dartx.toLowerCase]();
-        result[_subType] = "";
-      } else {
-        result[_primaryType] = result[_value$1][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
-        result[_subType] = result[_value$1][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
-      }
-      return result;
-    }
-    get mimeType() {
-      return dart.str`${this.primaryType}/${this.subType}`;
-    }
-    get primaryType() {
-      return this[_primaryType];
-    }
-    get subType() {
-      return this[_subType];
-    }
-    get charset() {
-      return this.parameters[dartx._get]("charset");
-    }
-  };
-  dart.defineNamedConstructor(io._ContentType, '_');
-  io._ContentType[dart.implements] = () => [io.ContentType];
-  dart.setSignature(io._ContentType, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._ContentType, [core.String, core.String, core.String, MapOfString$String()]),
-      _: dart.definiteFunctionType(io._ContentType, [])
-    }),
-    fields: () => ({
-      [_primaryType]: core.String,
-      [_subType]: core.String
-    }),
-    getters: () => ({
-      mimeType: dart.definiteFunctionType(core.String, []),
-      primaryType: dart.definiteFunctionType(core.String, []),
-      subType: dart.definiteFunctionType(core.String, []),
-      charset: dart.definiteFunctionType(core.String, [])
-    }),
-    statics: () => ({parse: dart.definiteFunctionType(io._ContentType, [core.String])}),
-    names: ['parse']
-  });
-  const _validate = Symbol('_validate');
-  const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-  let const$67;
-  io._Cookie = class _Cookie extends core.Object {
-    new(name, value) {
-      if (name === void 0) name = null;
-      if (value === void 0) value = null;
-      this.name = name;
-      this.value = value;
-      this.expires = null;
-      this.maxAge = null;
-      this.domain = null;
-      this.path = null;
-      this.httpOnly = false;
-      this.secure = false;
-      this.httpOnly = true;
-      this[_validate]();
-    }
-    fromSetCookieValue(value) {
-      this.name = null;
-      this.value = null;
-      this.expires = null;
-      this.maxAge = null;
-      this.domain = null;
-      this.path = null;
-      this.httpOnly = false;
-      this.secure = false;
-      this[_parseSetCookieValue](value);
-    }
-    [_parseSetCookieValue](s) {
-      let index = 0;
-      function done() {
-        return index == s[dartx.length];
-      }
-      dart.fn(done, VoidTobool());
-      function parseName() {
-        let start = index;
-        while (!dart.test(done())) {
-          if (s[dartx._get](index) == "=") break;
-          index++;
-        }
-        return s[dartx.substring](start, index)[dartx.trim]();
-      }
-      dart.fn(parseName, VoidToString$());
-      function parseValue() {
-        let start = index;
-        while (!dart.test(done())) {
-          if (s[dartx._get](index) == ";") break;
-          index++;
-        }
-        return s[dartx.substring](start, index)[dartx.trim]();
-      }
-      dart.fn(parseValue, VoidToString$());
-      function expect(expected) {
-        if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
-        if (s[dartx._get](index) != expected) {
-          dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
-        }
-        index++;
-      }
-      dart.fn(expect, StringTovoid$());
-      const parseAttributes = (function() {
-        function parseAttributeName() {
-          let start = index;
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) == "=" || s[dartx._get](index) == ";") break;
-            index++;
-          }
-          return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
-        }
-        dart.fn(parseAttributeName, VoidToString$());
-        function parseAttributeValue() {
-          let start = index;
-          while (!dart.test(done())) {
-            if (s[dartx._get](index) == ";") break;
-            index++;
-          }
-          return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
-        }
-        dart.fn(parseAttributeValue, VoidToString$());
-        while (!dart.test(done())) {
-          let name = parseAttributeName();
-          let value = "";
-          if (!dart.test(done()) && s[dartx._get](index) == "=") {
-            index++;
-            value = parseAttributeValue();
-          }
-          if (name == "expires") {
-            this.expires = io.HttpDate._parseCookieDate(value);
-          } else if (name == "max-age") {
-            this.maxAge = core.int.parse(value);
-          } else if (name == "domain") {
-            this.domain = value;
-          } else if (name == "path") {
-            this.path = value;
-          } else if (name == "httponly") {
-            this.httpOnly = true;
-          } else if (name == "secure") {
-            this.secure = true;
-          }
-          if (!dart.test(done())) index++;
-        }
-      }).bind(this);
-      dart.fn(parseAttributes, VoidTovoid$());
-      this.name = parseName();
-      if (dart.test(done()) || this.name[dartx.length] == 0) {
-        dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
-      }
-      index++;
-      this.value = parseValue();
-      this[_validate]();
-      if (dart.test(done())) return;
-      index++;
-      parseAttributes();
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write(this.name);
-      sb.write("=");
-      sb.write(this.value);
-      if (this.expires != null) {
-        sb.write("; Expires=");
-        sb.write(io.HttpDate.format(this.expires));
-      }
-      if (this.maxAge != null) {
-        sb.write("; Max-Age=");
-        sb.write(this.maxAge);
-      }
-      if (this.domain != null) {
-        sb.write("; Domain=");
-        sb.write(this.domain);
-      }
-      if (this.path != null) {
-        sb.write("; Path=");
-        sb.write(this.path);
-      }
-      if (dart.test(this.secure)) sb.write("; Secure");
-      if (dart.test(this.httpOnly)) sb.write("; HttpOnly");
-      return sb.toString();
-    }
-    [_validate]() {
-      let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
-      for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
-        let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
-        if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
-          dart.throw(new core.FormatException(dart.str`Invalid character in cookie name, code unit: '${codeUnit}'`));
-        }
-      }
-      for (let i = 0; i < dart.notNull(this.value[dartx.length]); i++) {
-        let codeUnit = this.value[dartx.codeUnits][dartx._get](i);
-        if (!(codeUnit == 33 || dart.notNull(codeUnit) >= 35 && dart.notNull(codeUnit) <= 43 || dart.notNull(codeUnit) >= 45 && dart.notNull(codeUnit) <= 58 || dart.notNull(codeUnit) >= 60 && dart.notNull(codeUnit) <= 91 || dart.notNull(codeUnit) >= 93 && dart.notNull(codeUnit) <= 126)) {
-          dart.throw(new core.FormatException(dart.str`Invalid character in cookie value, code unit: '${codeUnit}'`));
-        }
-      }
-    }
-  };
-  dart.defineNamedConstructor(io._Cookie, 'fromSetCookieValue');
-  io._Cookie[dart.implements] = () => [io.Cookie];
-  dart.setSignature(io._Cookie, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._Cookie, [], [core.String, core.String]),
-      fromSetCookieValue: dart.definiteFunctionType(io._Cookie, [core.String])
-    }),
-    fields: () => ({
-      name: core.String,
-      value: core.String,
-      expires: core.DateTime,
-      maxAge: core.int,
-      domain: core.String,
-      path: core.String,
-      httpOnly: core.bool,
-      secure: core.bool
-    }),
-    methods: () => ({
-      [_parseSetCookieValue]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_validate]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  io._OUTGOING_BUFFER_SIZE = 8 * 1024;
-  const _transferLength = Symbol('_transferLength');
-  const _dataCompleter = Symbol('_dataCompleter');
-  const _stream$ = Symbol('_stream');
-  io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
-    get transferLength() {
-      return this[_transferLength];
-    }
-    new(headers, transferLength, stream) {
-      this[_dataCompleter] = async.Completer.new();
-      this.headers = headers;
-      this[_transferLength] = transferLength;
-      this[_stream$] = stream;
-      this.fullBodyRead = false;
-      this.upgraded = false;
-      this.statusCode = null;
-      this.reasonPhrase = null;
-      this.method = null;
-      this.uri = null;
-      this.hasSubscriber = false;
-      super.new();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      this.hasSubscriber = true;
-      return this[_stream$].handleError(dart.fn(error => {
-        dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-      }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get dataDone() {
-      return this[_dataCompleter].future;
-    }
-    close(closing) {
-      this.fullBodyRead = true;
-      this.hasSubscriber = true;
-      this[_dataCompleter].complete(closing);
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpIncoming);
-  dart.setSignature(io._HttpIncoming, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpIncoming, [io._HttpHeaders, core.int, StreamOfListOfint()])}),
-    fields: () => ({
-      [_transferLength]: core.int,
-      [_dataCompleter]: async.Completer,
-      [_stream$]: StreamOfListOfint(),
-      fullBodyRead: core.bool,
-      headers: io._HttpHeaders,
-      upgraded: core.bool,
-      statusCode: core.int,
-      reasonPhrase: core.String,
-      method: core.String,
-      uri: core.Uri,
-      hasSubscriber: core.bool
-    }),
-    getters: () => ({
-      transferLength: dart.definiteFunctionType(core.int, []),
-      dataDone: dart.definiteFunctionType(async.Future, [])
-    }),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      close: dart.definiteFunctionType(dart.void, [core.bool])
-    })
-  });
-  const _incoming = Symbol('_incoming');
-  const _cookies = Symbol('_cookies');
-  io._HttpInboundMessage = class _HttpInboundMessage extends async.Stream$(core.List$(core.int)) {
-    new(incoming) {
-      this[_incoming] = incoming;
-      this[_cookies] = null;
-      super.new();
-    }
-    get cookies() {
-      if (this[_cookies] != null) return this[_cookies];
-      return this[_cookies] = this.headers[_parseCookies]();
-    }
-    get headers() {
-      return this[_incoming].headers;
-    }
-    get protocolVersion() {
-      return this.headers.protocolVersion;
-    }
-    get contentLength() {
-      return this.headers.contentLength;
-    }
-    get persistentConnection() {
-      return this.headers.persistentConnection;
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpInboundMessage);
-  dart.setSignature(io._HttpInboundMessage, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpInboundMessage, [io._HttpIncoming])}),
-    fields: () => ({
-      [_incoming]: io._HttpIncoming,
-      [_cookies]: ListOfCookie()
-    }),
-    getters: () => ({
-      cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
-      headers: dart.definiteFunctionType(io._HttpHeaders, []),
-      protocolVersion: dart.definiteFunctionType(core.String, []),
-      contentLength: dart.definiteFunctionType(core.int, []),
-      persistentConnection: dart.definiteFunctionType(core.bool, [])
-    })
-  });
-  const _httpServer = Symbol('_httpServer');
-  const _httpConnection = Symbol('_httpConnection');
-  const _session = Symbol('_session');
-  const _requestedUri = Symbol('_requestedUri');
-  const _sessionManagerInstance = Symbol('_sessionManagerInstance');
-  const _sessionManager = Symbol('_sessionManager');
-  const _markSeen = Symbol('_markSeen');
-  const _socket = Symbol('_socket');
-  const _destroyed = Symbol('_destroyed');
-  io._HttpRequest = class _HttpRequest extends io._HttpInboundMessage {
-    new(response, _incoming, httpServer, httpConnection) {
-      this.response = response;
-      this[_httpServer] = httpServer;
-      this[_httpConnection] = httpConnection;
-      this[_session] = null;
-      this[_requestedUri] = null;
-      super.new(_incoming);
-      if (this.headers.protocolVersion == "1.1") {
-        let _ = this.response.headers;
-        _.chunkedTransferEncoding = true;
-        _.persistentConnection = this.headers.persistentConnection;
-      }
-      if (this[_httpServer][_sessionManagerInstance] != null) {
-        let sessionIds = this.cookies[dartx.where](dart.fn(cookie => cookie.name[dartx.toUpperCase]() == io._DART_SESSION_ID, CookieTobool()))[dartx.map](core.String)(dart.fn(cookie => cookie.value, CookieToString()));
-        for (let sessionId of sessionIds) {
-          this[_session] = this[_httpServer][_sessionManager].getSession(sessionId);
-          if (this[_session] != null) {
-            this[_session][_markSeen]();
-            break;
-          }
-        }
-      }
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get uri() {
-      return this[_incoming].uri;
-    }
-    get requestedUri() {
-      if (this[_requestedUri] == null) {
-        let proto = this.headers._get('x-forwarded-proto');
-        let scheme = proto != null ? proto[dartx.first] : io.SecureSocket.is(this[_httpConnection][_socket]) ? "https" : "http";
-        let hostList = this.headers._get('x-forwarded-host');
-        let host = null;
-        if (hostList != null) {
-          host = hostList[dartx.first];
-        } else {
-          hostList = this.headers._get('host');
-          if (hostList != null) {
-            host = hostList[dartx.first];
-          } else {
-            host = dart.str`${this[_httpServer].address.host}:${this[_httpServer].port}`;
-          }
-        }
-        this[_requestedUri] = core.Uri.parse(dart.str`${scheme}://${host}${this.uri}`);
-      }
-      return this[_requestedUri];
-    }
-    get method() {
-      return this[_incoming].method;
-    }
-    get session() {
-      if (this[_session] != null) {
-        if (dart.test(this[_session][_destroyed])) {
-          this[_session] = null;
-          return this.session;
-        }
-        return this[_session];
-      }
-      return this[_session] = this[_httpServer][_sessionManager].createSession();
-    }
-    get connectionInfo() {
-      return this[_httpConnection].connectionInfo;
-    }
-    get certificate() {
-      let socket = this[_httpConnection][_socket];
-      if (io.SecureSocket.is(socket)) return socket.peerCertificate;
-      return null;
-    }
-  };
-  io._HttpRequest[dart.implements] = () => [io.HttpRequest];
-  dart.setSignature(io._HttpRequest, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpRequest, [io.HttpResponse, io._HttpIncoming, io._HttpServer, io._HttpConnection])}),
-    fields: () => ({
-      response: io.HttpResponse,
-      [_httpServer]: io._HttpServer,
-      [_httpConnection]: io._HttpConnection,
-      [_session]: io._HttpSession,
-      [_requestedUri]: core.Uri
-    }),
-    getters: () => ({
-      uri: dart.definiteFunctionType(core.Uri, []),
-      requestedUri: dart.definiteFunctionType(core.Uri, []),
-      method: dart.definiteFunctionType(core.String, []),
-      session: dart.definiteFunctionType(io.HttpSession, []),
-      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
-      certificate: dart.definiteFunctionType(io.X509Certificate, [])
-    }),
-    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-  });
-  const _responseRedirects = Symbol('_responseRedirects');
-  const _httpRequest = Symbol('_httpRequest');
-  const _httpClient = Symbol('_httpClient');
-  const _httpClientConnection = Symbol('_httpClientConnection');
-  const _openUrlFromRequest = Symbol('_openUrlFromRequest');
-  const _connectionClosed = Symbol('_connectionClosed');
-  const _shouldAuthenticateProxy = Symbol('_shouldAuthenticateProxy');
-  const _shouldAuthenticate = Symbol('_shouldAuthenticate');
-  const _proxy = Symbol('_proxy');
-  const _findProxyCredentials = Symbol('_findProxyCredentials');
-  const _findCredentials = Symbol('_findCredentials');
-  const _removeProxyCredentials = Symbol('_removeProxyCredentials');
-  const _removeCredentials = Symbol('_removeCredentials');
-  const _authenticateProxy = Symbol('_authenticateProxy');
-  const _authenticate = Symbol('_authenticate');
-  io._HttpClientResponse = class _HttpClientResponse extends io._HttpInboundMessage {
-    get redirects() {
-      return this[_httpRequest][_responseRedirects];
-    }
-    new(_incoming, httpRequest, httpClient) {
-      this[_httpRequest] = httpRequest;
-      this[_httpClient] = httpClient;
-      super.new(_incoming);
-      _incoming.uri = this[_httpRequest].uri;
-    }
-    get statusCode() {
-      return this[_incoming].statusCode;
-    }
-    get reasonPhrase() {
-      return this[_incoming].reasonPhrase;
-    }
-    get certificate() {
-      let socket = this[_httpRequest][_httpClientConnection][_socket];
-      if (io.SecureSocket.is(socket)) return socket.peerCertificate;
-      dart.throw(new core.UnsupportedError("Socket is not a SecureSocket"));
-    }
-    get cookies() {
-      if (this[_cookies] != null) return this[_cookies];
-      this[_cookies] = ListOfCookie().new();
-      let values = this.headers._get(io.HttpHeaders.SET_COOKIE);
-      if (values != null) {
-        values[dartx.forEach](dart.fn(value => {
-          this[_cookies][dartx.add](io.Cookie.fromSetCookieValue(value));
-        }, StringToNull()));
-      }
-      return this[_cookies];
-    }
-    get isRedirect() {
-      if (this[_httpRequest].method == "GET" || this[_httpRequest].method == "HEAD") {
-        return this.statusCode == io.HttpStatus.MOVED_PERMANENTLY || this.statusCode == io.HttpStatus.FOUND || this.statusCode == io.HttpStatus.SEE_OTHER || this.statusCode == io.HttpStatus.TEMPORARY_REDIRECT;
-      } else if (this[_httpRequest].method == "POST") {
-        return this.statusCode == io.HttpStatus.SEE_OTHER;
-      }
-      return false;
-    }
-    redirect(method, url, followLoops) {
-      if (method === void 0) method = null;
-      if (url === void 0) url = null;
-      if (followLoops === void 0) followLoops = null;
-      if (method == null) {
-        if (this.statusCode == io.HttpStatus.SEE_OTHER && this[_httpRequest].method == "POST") {
-          method = "GET";
-        } else {
-          method = this[_httpRequest].method;
-        }
-      }
-      if (url == null) {
-        let location = this.headers.value(io.HttpHeaders.LOCATION);
-        if (location == null) {
-          dart.throw(new core.StateError("Response has no Location header for redirect"));
-        }
-        url = core.Uri.parse(location);
-      }
-      if (followLoops != true) {
-        for (let redirect of this.redirects) {
-          if (dart.equals(redirect.location, url)) {
-            return FutureOfHttpClientResponse().error(new io.RedirectException("Redirect loop detected", this.redirects));
-          }
-        }
-      }
-      return this[_httpClient][_openUrlFromRequest](method, url, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => {
-        let _ = request[_responseRedirects];
-        _[dartx.addAll](this.redirects);
-        _[dartx.add](new io._RedirectInfo(this.statusCode, method, url));
-        return request.close();
-      }, _HttpClientRequestToFutureOfHttpClientResponse()));
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      if (dart.test(this[_incoming].upgraded)) {
-        this[_httpRequest][_httpClientConnection].destroy();
-        return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
-      }
-      let stream = this[_incoming];
-      if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
-        stream = io._HttpIncoming._check(stream.transform(ListOfint())(io.GZIP.decoder));
-      }
-      return stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    detachSocket() {
-      this[_httpClient][_connectionClosed](this[_httpRequest][_httpClientConnection]);
-      return this[_httpRequest][_httpClientConnection].detachSocket();
-    }
-    get connectionInfo() {
-      return this[_httpRequest].connectionInfo;
-    }
-    get [_shouldAuthenticateProxy]() {
-      let challenge = this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE);
-      return this.statusCode == io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED && challenge != null && challenge[dartx.length] == 1;
-    }
-    get [_shouldAuthenticate]() {
-      let challenge = this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
-      return this.statusCode == io.HttpStatus.UNAUTHORIZED && challenge != null && challenge[dartx.length] == 1;
-    }
-    [_authenticate](proxyAuth) {
-      const retry = (function() {
-        return this.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => this[_httpClient][_openUrlFromRequest](this[_httpRequest].method, this[_httpRequest].uri, this[_httpRequest]).then(io.HttpClientResponse)(dart.fn(request => request.close(), _HttpClientRequestToFutureOfHttpClientResponse())), dynamicToFutureOfHttpClientResponse()));
-      }).bind(this);
-      dart.fn(retry, VoidToFutureOfHttpClientResponse());
-      const authChallenge = (function() {
-        return dart.test(proxyAuth) ? this.headers._get(io.HttpHeaders.PROXY_AUTHENTICATE) : this.headers._get(io.HttpHeaders.WWW_AUTHENTICATE);
-      }).bind(this);
-      dart.fn(authChallenge, VoidToListOfString());
-      const findCredentials = (function(scheme) {
-        return dart.test(proxyAuth) ? this[_httpClient][_findProxyCredentials](this[_httpRequest][_proxy], scheme) : this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
-      }).bind(this);
-      dart.fn(findCredentials, _AuthenticationSchemeTo_Credentials());
-      const removeCredentials = (function(cr) {
-        if (dart.test(proxyAuth)) {
-          this[_httpClient][_removeProxyCredentials](cr);
-        } else {
-          this[_httpClient][_removeCredentials](cr);
-        }
-      }).bind(this);
-      dart.fn(removeCredentials, _CredentialsTovoid());
-      const requestAuthentication = (function(scheme, realm) {
-        if (dart.test(proxyAuth)) {
-          if (this[_httpClient][_authenticateProxy] == null) {
-            return async.Future.value(false);
-          }
-          let proxy = this[_httpRequest][_proxy];
-          return async.Future._check(dart.dsend(this[_httpClient], _authenticateProxy, proxy.host, proxy.port, dart.toString(scheme), realm));
-        } else {
-          if (this[_httpClient][_authenticate] == null) {
-            return async.Future.value(false);
-          }
-          return async.Future._check(dart.dsend(this[_httpClient], _authenticate, this[_httpRequest].uri, dart.toString(scheme), realm));
-        }
-      }).bind(this);
-      dart.fn(requestAuthentication, _AuthenticationSchemeAndStringToFuture());
-      let challenge = authChallenge();
-      dart.assert(challenge != null || challenge[dartx.length] == 1);
-      let header = io._HeaderValue.parse(challenge[dartx._get](0), {parameterSeparator: ","});
-      let scheme = io._AuthenticationScheme.fromString(header.value);
-      let realm = header.parameters[dartx._get]("realm");
-      let cr = findCredentials(scheme);
-      if (cr != null) {
-        if (dart.equals(cr.scheme, io._AuthenticationScheme.BASIC) && !dart.test(cr.used)) {
-          return retry();
-        }
-        if (dart.equals(cr.scheme, io._AuthenticationScheme.DIGEST) && (header.parameters[dartx._get]("algorithm") == null || header.parameters[dartx._get]("algorithm")[dartx.toLowerCase]() == "md5")) {
-          if (cr.nonce == null || cr.nonce == header.parameters[dartx._get]("nonce")) {
-            if (cr.nonce == null) {
-              let _ = cr;
-              _.nonce = header.parameters[dartx._get]("nonce");
-              _.algorithm = "MD5";
-              _.qop = header.parameters[dartx._get]("qop");
-              _.nonceCount = 0;
-            }
-            return retry();
-          } else if (header.parameters[dartx._get]("stale") != null && header.parameters[dartx._get]("stale")[dartx.toLowerCase]() == "true") {
-            cr.nonce = header.parameters[dartx._get]("nonce");
-            return retry();
-          }
-        }
-      }
-      if (cr != null) {
-        removeCredentials(cr);
-        cr = null;
-      }
-      return requestAuthentication(scheme, realm).then(io.HttpClientResponse)(dart.fn(credsAvailable => {
-        if (dart.test(credsAvailable)) {
-          cr = this[_httpClient][_findCredentials](this[_httpRequest].uri, scheme);
-          return retry();
-        } else {
-          return this;
-        }
-      }, dynamicToFutureOrOfHttpClientResponse()));
-    }
-  };
-  io._HttpClientResponse[dart.implements] = () => [io.HttpClientResponse];
-  dart.setSignature(io._HttpClientResponse, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientResponse, [io._HttpIncoming, io._HttpClientRequest, io._HttpClient])}),
-    fields: () => ({
-      [_httpClient]: io._HttpClient,
-      [_httpRequest]: io._HttpClientRequest
-    }),
-    getters: () => ({
-      redirects: dart.definiteFunctionType(core.List$(io.RedirectInfo), []),
-      statusCode: dart.definiteFunctionType(core.int, []),
-      reasonPhrase: dart.definiteFunctionType(core.String, []),
-      certificate: dart.definiteFunctionType(io.X509Certificate, []),
-      isRedirect: dart.definiteFunctionType(core.bool, []),
-      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
-      [_shouldAuthenticateProxy]: dart.definiteFunctionType(core.bool, []),
-      [_shouldAuthenticate]: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      redirect: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [], [core.String, core.Uri, core.bool]),
-      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
-      [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
-    })
-  });
-  const _uri = Symbol('_uri');
-  const _outgoing = Symbol('_outgoing');
-  const _encodingSet = Symbol('_encodingSet');
-  const _bufferOutput = Symbol('_bufferOutput');
-  const _encodingMutable = Symbol('_encodingMutable');
-  const _encoding = Symbol('_encoding');
-  const _isConnectionClosed = Symbol('_isConnectionClosed');
-  const _doneCompleter = Symbol('_doneCompleter');
-  const _target$ = Symbol('_target');
-  const _controllerInstance = Symbol('_controllerInstance');
-  const _controllerCompleter = Symbol('_controllerCompleter');
-  const _isClosed$0 = Symbol('_isClosed');
-  const _isBound = Symbol('_isBound');
-  const _hasError$ = Symbol('_hasError');
-  const _closeTarget = Symbol('_closeTarget');
-  const _completeDoneValue = Symbol('_completeDoneValue');
-  const _completeDoneError = Symbol('_completeDoneError');
-  io._StreamSinkImpl$ = dart.generic(T => {
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    let StreamSinkOfT = () => (StreamSinkOfT = dart.constFn(async.StreamSink$(T)))();
-    let StreamConsumerOfT = () => (StreamConsumerOfT = dart.constFn(async.StreamConsumer$(T)))();
-    class _StreamSinkImpl extends core.Object {
-      new(target) {
-        this[_doneCompleter] = async.Completer.new();
-        this[_target$] = target;
-        this[_controllerInstance] = null;
-        this[_controllerCompleter] = null;
-        this[_isClosed$0] = false;
-        this[_isBound] = false;
-        this[_hasError$] = false;
-      }
-      add(data) {
-        T._check(data);
-        if (dart.test(this[_isClosed$0])) return;
-        this[_controller$0].add(data);
-      }
-      addError(error, stackTrace) {
-        if (stackTrace === void 0) stackTrace = null;
-        this[_controller$0].addError(error, stackTrace);
-      }
-      addStream(stream) {
-        StreamOfT()._check(stream);
-        if (dart.test(this[_isBound])) {
-          dart.throw(new core.StateError("StreamSink is already bound to a stream"));
-        }
-        this[_isBound] = true;
-        if (dart.test(this[_hasError$])) return this.done;
-        const targetAddStream = (function() {
-          return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
-            this[_isBound] = false;
-          }, VoidToNull()));
-        }).bind(this);
-        dart.fn(targetAddStream, VoidToFuture());
-        if (this[_controllerInstance] == null) return targetAddStream();
-        let future = this[_controllerCompleter].future;
-        this[_controllerInstance].close();
-        return future.then(dart.dynamic)(dart.fn(_ => targetAddStream(), dynamicToFuture()));
-      }
-      flush() {
-        if (dart.test(this[_isBound])) {
-          dart.throw(new core.StateError("StreamSink is bound to a stream"));
-        }
-        if (this[_controllerInstance] == null) return async.Future.value(this);
-        this[_isBound] = true;
-        let future = this[_controllerCompleter].future;
-        this[_controllerInstance].close();
-        return future.whenComplete(dart.fn(() => {
-          this[_isBound] = false;
-        }, VoidToNull()));
-      }
-      close() {
-        if (dart.test(this[_isBound])) {
-          dart.throw(new core.StateError("StreamSink is bound to a stream"));
-        }
-        if (!dart.test(this[_isClosed$0])) {
-          this[_isClosed$0] = true;
-          if (this[_controllerInstance] != null) {
-            this[_controllerInstance].close();
-          } else {
-            this[_closeTarget]();
-          }
-        }
-        return this.done;
-      }
-      [_closeTarget]() {
-        this[_target$].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
-      }
-      get done() {
-        return this[_doneCompleter].future;
-      }
-      [_completeDoneValue](value) {
-        if (!dart.test(this[_doneCompleter].isCompleted)) {
-          this[_doneCompleter].complete(value);
-        }
-      }
-      [_completeDoneError](error, stackTrace) {
-        if (!dart.test(this[_doneCompleter].isCompleted)) {
-          this[_hasError$] = true;
-          this[_doneCompleter].completeError(error, stackTrace);
-        }
-      }
-      get [_controller$0]() {
-        if (dart.test(this[_isBound])) {
-          dart.throw(new core.StateError("StreamSink is bound to a stream"));
-        }
-        if (dart.test(this[_isClosed$0])) {
-          dart.throw(new core.StateError("StreamSink is closed"));
-        }
-        if (this[_controllerInstance] == null) {
-          this[_controllerInstance] = StreamControllerOfT().new({sync: true});
-          this[_controllerCompleter] = async.Completer.new();
-          this[_target$].addStream(this[_controller$0].stream).then(dart.dynamic)(dart.fn(_ => {
-            if (dart.test(this[_isBound])) {
-              this[_controllerCompleter].complete(this);
-              this[_controllerCompleter] = null;
-              this[_controllerInstance] = null;
-            } else {
-              this[_closeTarget]();
-            }
-          }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
-              if (dart.test(this[_isBound])) {
-                this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
-                this[_controllerCompleter] = null;
-                this[_controllerInstance] = null;
-              } else {
-                this[_completeDoneError](error, core.StackTrace._check(stackTrace));
-              }
-            }, dynamicAnddynamicToNull())});
-        }
-        return this[_controllerInstance];
-      }
-    }
-    dart.addTypeTests(_StreamSinkImpl);
-    _StreamSinkImpl[dart.implements] = () => [StreamSinkOfT()];
-    dart.setSignature(_StreamSinkImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
-      fields: () => ({
-        [_target$]: StreamConsumerOfT(),
-        [_doneCompleter]: async.Completer,
-        [_controllerInstance]: StreamControllerOfT(),
-        [_controllerCompleter]: async.Completer,
-        [_isClosed$0]: core.bool,
-        [_isBound]: core.bool,
-        [_hasError$]: core.bool
-      }),
-      getters: () => ({
-        done: dart.definiteFunctionType(async.Future, []),
-        [_controller$0]: dart.definiteFunctionType(async.StreamController$(T), [])
-      }),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [T]),
-        addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-        addStream: dart.definiteFunctionType(async.Future, [StreamOfT()]),
-        flush: dart.definiteFunctionType(async.Future, []),
-        close: dart.definiteFunctionType(async.Future, []),
-        [_closeTarget]: dart.definiteFunctionType(dart.void, []),
-        [_completeDoneValue]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-        [_completeDoneError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])
-      })
-    });
-    return _StreamSinkImpl;
-  });
-  io._StreamSinkImpl = _StreamSinkImpl();
-  io._IOSinkImpl = class _IOSinkImpl extends io._StreamSinkImpl$(core.List$(core.int)) {
-    new(target, encoding) {
-      this[_encoding] = encoding;
-      this[_encodingMutable] = true;
-      super.new(target);
-    }
-    get encoding() {
-      return this[_encoding];
-    }
-    set encoding(value) {
-      if (!dart.test(this[_encodingMutable])) {
-        dart.throw(new core.StateError("IOSink encoding is not mutable"));
-      }
-      this[_encoding] = value;
-    }
-    write(obj) {
-      let string = dart.str`${obj}`;
-      if (dart.test(string[dartx.isEmpty])) return;
-      this.add(this[_encoding].encode(string));
-    }
-    writeAll(objects, separator) {
-      if (separator === void 0) separator = "";
-      let iterator = objects[dartx.iterator];
-      if (!dart.test(iterator.moveNext())) return;
-      if (dart.test(separator[dartx.isEmpty])) {
-        do {
-          this.write(iterator.current);
-        } while (dart.test(iterator.moveNext()));
-      } else {
-        this.write(iterator.current);
-        while (dart.test(iterator.moveNext())) {
-          this.write(separator);
-          this.write(iterator.current);
-        }
-      }
-    }
-    writeln(object) {
-      if (object === void 0) object = "";
-      this.write(object);
-      this.write("\n");
-    }
-    writeCharCode(charCode) {
-      this.write(core.String.fromCharCode(charCode));
-    }
-  };
-  dart.addSimpleTypeTests(io._IOSinkImpl);
-  io._IOSinkImpl[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io._IOSinkImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(io._IOSinkImpl, [StreamConsumerOfListOfint(), convert.Encoding])}),
-    fields: () => ({
-      [_encoding]: convert.Encoding,
-      [_encodingMutable]: core.bool
-    }),
-    getters: () => ({encoding: dart.definiteFunctionType(convert.Encoding, [])}),
-    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
-    methods: () => ({
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int])
-    })
-  });
-  io._HttpOutboundMessage$ = dart.generic(T => {
-    class _HttpOutboundMessage extends io._IOSinkImpl {
-      new(uri, protocolVersion, outgoing, opts) {
-        let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-        this[_uri] = uri;
-        this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
-        this[_outgoing] = outgoing;
-        this[_encodingSet] = false;
-        this[_bufferOutput] = true;
-        super.new(outgoing, null);
-        this[_outgoing].outbound = this;
-        this[_encodingMutable] = false;
-      }
-      get contentLength() {
-        return this.headers.contentLength;
-      }
-      set contentLength(contentLength) {
-        this.headers.contentLength = contentLength;
-      }
-      get persistentConnection() {
-        return this.headers.persistentConnection;
-      }
-      set persistentConnection(p) {
-        this.headers.persistentConnection = p;
-      }
-      get bufferOutput() {
-        return this[_bufferOutput];
-      }
-      set bufferOutput(bufferOutput) {
-        if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
-        this[_bufferOutput] = bufferOutput;
-      }
-      get encoding() {
-        if (dart.test(this[_encodingSet]) && dart.test(this[_outgoing].headersWritten)) {
-          return this[_encoding];
-        }
-        let charset = null;
-        if (this.headers.contentType != null && this.headers.contentType.charset != null) {
-          charset = this.headers.contentType.charset;
-        } else {
-          charset = "iso-8859-1";
-        }
-        return convert.Encoding.getByName(core.String._check(charset));
-      }
-      set encoding(value) {
-        super.encoding = value;
-      }
-      add(data) {
-        if (data[dartx.length] == 0) return;
-        super.add(data);
-      }
-      write(obj) {
-        if (!dart.test(this[_encodingSet])) {
-          this[_encoding] = this.encoding;
-          this[_encodingSet] = true;
-        }
-        super.write(obj);
-      }
-      get [_isConnectionClosed]() {
-        return false;
-      }
-    }
-    dart.addTypeTests(_HttpOutboundMessage);
-    dart.setSignature(_HttpOutboundMessage, {
-      constructors: () => ({new: dart.definiteFunctionType(io._HttpOutboundMessage$(T), [core.Uri, core.String, io._HttpOutgoing], {initialHeaders: io._HttpHeaders})}),
-      fields: () => ({
-        [_encodingSet]: core.bool,
-        [_bufferOutput]: core.bool,
-        [_uri]: core.Uri,
-        [_outgoing]: io._HttpOutgoing,
-        headers: io._HttpHeaders
-      }),
-      getters: () => ({
-        contentLength: dart.definiteFunctionType(core.int, []),
-        persistentConnection: dart.definiteFunctionType(core.bool, []),
-        bufferOutput: dart.definiteFunctionType(core.bool, []),
-        [_isConnectionClosed]: dart.definiteFunctionType(core.bool, [])
-      }),
-      setters: () => ({
-        contentLength: dart.definiteFunctionType(dart.void, [core.int]),
-        persistentConnection: dart.definiteFunctionType(dart.void, [core.bool]),
-        bufferOutput: dart.definiteFunctionType(dart.void, [core.bool])
-      })
-    });
-    return _HttpOutboundMessage;
-  });
-  io._HttpOutboundMessage = _HttpOutboundMessage();
-  const _statusCode = Symbol('_statusCode');
-  const _reasonPhrase = Symbol('_reasonPhrase');
-  const _deadline = Symbol('_deadline');
-  const _deadlineTimer = Symbol('_deadlineTimer');
-  const _isClosing = Symbol('_isClosing');
-  const _findReasonPhrase = Symbol('_findReasonPhrase');
-  const _isNew = Symbol('_isNew');
-  const _writeHeader = Symbol('_writeHeader');
-  io._HttpResponse = class _HttpResponse extends io._HttpOutboundMessage$(io.HttpResponse) {
-    new(uri, protocolVersion, outgoing, defaultHeaders, serverHeader) {
-      this[_statusCode] = 200;
-      this[_reasonPhrase] = null;
-      this[_cookies] = null;
-      this[_httpRequest] = null;
-      this[_deadline] = null;
-      this[_deadlineTimer] = null;
-      super.new(uri, protocolVersion, outgoing, {initialHeaders: io._HttpHeaders._check(defaultHeaders)});
-      if (serverHeader != null) this.headers.set('server', serverHeader);
-    }
-    get [_isConnectionClosed]() {
-      return this[_httpRequest][_httpConnection][_isClosing];
-    }
-    get cookies() {
-      if (this[_cookies] == null) this[_cookies] = ListOfCookie().new();
-      return this[_cookies];
-    }
-    get statusCode() {
-      return this[_statusCode];
-    }
-    set statusCode(statusCode) {
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
-      this[_statusCode] = statusCode;
-    }
-    get reasonPhrase() {
-      return this[_findReasonPhrase](this.statusCode);
-    }
-    set reasonPhrase(reasonPhrase) {
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
-      this[_reasonPhrase] = reasonPhrase;
-    }
-    redirect(location, opts) {
-      let status = opts && 'status' in opts ? opts.status : io.HttpStatus.MOVED_TEMPORARILY;
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Header already sent"));
-      this.statusCode = status;
-      this.headers.set("location", dart.toString(location));
-      return this.close();
-    }
-    detachSocket(opts) {
-      let writeHeaders = opts && 'writeHeaders' in opts ? opts.writeHeaders : true;
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Headers already sent"));
-      this.deadline = null;
-      let future = this[_httpRequest][_httpConnection].detachSocket();
-      if (dart.test(writeHeaders)) {
-        let headersFuture = this[_outgoing].writeHeaders({drainRequest: false, setOutgoing: false});
-        dart.assert(headersFuture == null);
-      } else {
-        this[_outgoing].headersWritten = true;
-      }
-      this.close();
-      this.done.catchError(dart.fn(_ => {
-      }, dynamicToNull$()));
-      return future;
-    }
-    get connectionInfo() {
-      return this[_httpRequest].connectionInfo;
-    }
-    get deadline() {
-      return this[_deadline];
-    }
-    set deadline(d) {
-      if (this[_deadlineTimer] != null) this[_deadlineTimer].cancel();
-      this[_deadline] = d;
-      if (this[_deadline] == null) return;
-      this[_deadlineTimer] = async.Timer.new(this[_deadline], dart.fn(() => {
-        this[_httpRequest][_httpConnection].destroy();
-      }, VoidToNull()));
-    }
-    [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid$());
-      if (this.headers.protocolVersion == "1.1") {
-        write(io._Const.HTTP11);
-      } else {
-        write(io._Const.HTTP10);
-      }
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(dart.toString(this.statusCode)[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this.reasonPhrase[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      let session = this[_httpRequest][_session];
-      if (session != null && !dart.test(session[_destroyed])) {
-        session[_isNew] = false;
-        let found = false;
-        for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
-          if (this.cookies[dartx._get](i).name[dartx.toUpperCase]() == io._DART_SESSION_ID) {
-            let _ = this.cookies[dartx._get](i);
-            _.value = session.id;
-            _.httpOnly = true;
-            _.path = "/";
-            found = true;
-          }
-        }
-        if (!found) {
-          let cookie = io.Cookie.new(io._DART_SESSION_ID, session.id);
-          this.cookies[dartx.add](((() => {
-            cookie.httpOnly = true;
-            cookie.path = "/";
-            return cookie;
-          })()));
-        }
-      }
-      if (this[_cookies] != null) {
-        this[_cookies][dartx.forEach](dart.fn(cookie => {
-          this.headers.add(io.HttpHeaders.SET_COOKIE, cookie);
-        }, CookieToNull()));
-      }
-      this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
-    }
-    [_findReasonPhrase](statusCode) {
-      if (this[_reasonPhrase] != null) {
-        return this[_reasonPhrase];
-      }
-      switch (statusCode) {
-        case io.HttpStatus.CONTINUE:
-        {
-          return "Continue";
-        }
-        case io.HttpStatus.SWITCHING_PROTOCOLS:
-        {
-          return "Switching Protocols";
-        }
-        case io.HttpStatus.OK:
-        {
-          return "OK";
-        }
-        case io.HttpStatus.CREATED:
-        {
-          return "Created";
-        }
-        case io.HttpStatus.ACCEPTED:
-        {
-          return "Accepted";
-        }
-        case io.HttpStatus.NON_AUTHORITATIVE_INFORMATION:
-        {
-          return "Non-Authoritative Information";
-        }
-        case io.HttpStatus.NO_CONTENT:
-        {
-          return "No Content";
-        }
-        case io.HttpStatus.RESET_CONTENT:
-        {
-          return "Reset Content";
-        }
-        case io.HttpStatus.PARTIAL_CONTENT:
-        {
-          return "Partial Content";
-        }
-        case io.HttpStatus.MULTIPLE_CHOICES:
-        {
-          return "Multiple Choices";
-        }
-        case io.HttpStatus.MOVED_PERMANENTLY:
-        {
-          return "Moved Permanently";
-        }
-        case io.HttpStatus.FOUND:
-        {
-          return "Found";
-        }
-        case io.HttpStatus.SEE_OTHER:
-        {
-          return "See Other";
-        }
-        case io.HttpStatus.NOT_MODIFIED:
-        {
-          return "Not Modified";
-        }
-        case io.HttpStatus.USE_PROXY:
-        {
-          return "Use Proxy";
-        }
-        case io.HttpStatus.TEMPORARY_REDIRECT:
-        {
-          return "Temporary Redirect";
-        }
-        case io.HttpStatus.BAD_REQUEST:
-        {
-          return "Bad Request";
-        }
-        case io.HttpStatus.UNAUTHORIZED:
-        {
-          return "Unauthorized";
-        }
-        case io.HttpStatus.PAYMENT_REQUIRED:
-        {
-          return "Payment Required";
-        }
-        case io.HttpStatus.FORBIDDEN:
-        {
-          return "Forbidden";
-        }
-        case io.HttpStatus.NOT_FOUND:
-        {
-          return "Not Found";
-        }
-        case io.HttpStatus.METHOD_NOT_ALLOWED:
-        {
-          return "Method Not Allowed";
-        }
-        case io.HttpStatus.NOT_ACCEPTABLE:
-        {
-          return "Not Acceptable";
-        }
-        case io.HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
-        {
-          return "Proxy Authentication Required";
-        }
-        case io.HttpStatus.REQUEST_TIMEOUT:
-        {
-          return "Request Time-out";
-        }
-        case io.HttpStatus.CONFLICT:
-        {
-          return "Conflict";
-        }
-        case io.HttpStatus.GONE:
-        {
-          return "Gone";
-        }
-        case io.HttpStatus.LENGTH_REQUIRED:
-        {
-          return "Length Required";
-        }
-        case io.HttpStatus.PRECONDITION_FAILED:
-        {
-          return "Precondition Failed";
-        }
-        case io.HttpStatus.REQUEST_ENTITY_TOO_LARGE:
-        {
-          return "Request Entity Too Large";
-        }
-        case io.HttpStatus.REQUEST_URI_TOO_LONG:
-        {
-          return "Request-URI Too Large";
-        }
-        case io.HttpStatus.UNSUPPORTED_MEDIA_TYPE:
-        {
-          return "Unsupported Media Type";
-        }
-        case io.HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
-        {
-          return "Requested range not satisfiable";
-        }
-        case io.HttpStatus.EXPECTATION_FAILED:
-        {
-          return "Expectation Failed";
-        }
-        case io.HttpStatus.INTERNAL_SERVER_ERROR:
-        {
-          return "Internal Server Error";
-        }
-        case io.HttpStatus.NOT_IMPLEMENTED:
-        {
-          return "Not Implemented";
-        }
-        case io.HttpStatus.BAD_GATEWAY:
-        {
-          return "Bad Gateway";
-        }
-        case io.HttpStatus.SERVICE_UNAVAILABLE:
-        {
-          return "Service Unavailable";
-        }
-        case io.HttpStatus.GATEWAY_TIMEOUT:
-        {
-          return "Gateway Time-out";
-        }
-        case io.HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
-        {
-          return "Http Version not supported";
-        }
-        default:
-        {
-          return dart.str`Status ${statusCode}`;
-        }
-      }
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpResponse);
-  io._HttpResponse[dart.implements] = () => [io.HttpResponse];
-  dart.setSignature(io._HttpResponse, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpResponse, [core.Uri, core.String, io._HttpOutgoing, io.HttpHeaders, core.String])}),
-    fields: () => ({
-      [_statusCode]: core.int,
-      [_reasonPhrase]: core.String,
-      [_cookies]: ListOfCookie(),
-      [_httpRequest]: io._HttpRequest,
-      [_deadline]: core.Duration,
-      [_deadlineTimer]: async.Timer
-    }),
-    getters: () => ({
-      cookies: dart.definiteFunctionType(core.List$(io.Cookie), []),
-      statusCode: dart.definiteFunctionType(core.int, []),
-      reasonPhrase: dart.definiteFunctionType(core.String, []),
-      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
-      deadline: dart.definiteFunctionType(core.Duration, [])
-    }),
-    setters: () => ({
-      statusCode: dart.definiteFunctionType(dart.void, [core.int]),
-      reasonPhrase: dart.definiteFunctionType(dart.void, [core.String]),
-      deadline: dart.definiteFunctionType(dart.void, [core.Duration])
-    }),
-    methods: () => ({
-      redirect: dart.definiteFunctionType(async.Future, [core.Uri], {status: core.int}),
-      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), [], {writeHeaders: core.bool}),
-      [_writeHeader]: dart.definiteFunctionType(dart.void, []),
-      [_findReasonPhrase]: dart.definiteFunctionType(core.String, [core.int])
-    })
-  });
-  const _responseCompleter = Symbol('_responseCompleter');
-  const _response = Symbol('_response');
-  const _followRedirects = Symbol('_followRedirects');
-  const _maxRedirects = Symbol('_maxRedirects');
-  const _onIncoming = Symbol('_onIncoming');
-  const _onError$ = Symbol('_onError');
-  const _proxyTunnel = Symbol('_proxyTunnel');
-  const _requestUri = Symbol('_requestUri');
-  io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
-    new(outgoing, uri, method, proxy, httpClient, httpClientConnection) {
-      this.cookies = ListOfCookie().new();
-      this[_responseCompleter] = CompleterOfHttpClientResponse().new();
-      this[_responseRedirects] = JSArrayOfRedirectInfo().of([]);
-      this.method = method;
-      this[_proxy] = proxy;
-      this[_httpClient] = httpClient;
-      this[_httpClientConnection] = httpClientConnection;
-      this.uri = uri;
-      this[_response] = null;
-      this[_followRedirects] = true;
-      this[_maxRedirects] = 5;
-      super.new(uri, "1.1", outgoing);
-      if (this.method == "GET" || this.method == "HEAD") {
-        this.contentLength = 0;
-      } else {
-        this.headers.chunkedTransferEncoding = true;
-      }
-    }
-    get done() {
-      if (this[_response] == null) {
-        this[_response] = async.Future.wait(dart.dynamic)(JSArrayOfFuture().of([this[_responseCompleter].future, super.done]), {eagerError: true}).then(io.HttpClientResponse)(dart.fn(list => FutureOrOfHttpClientResponse()._check(list[dartx._get](0)), ListToFutureOrOfHttpClientResponse()));
-      }
-      return this[_response];
-    }
-    close() {
-      super.close();
-      return this.done;
-    }
-    get maxRedirects() {
-      return this[_maxRedirects];
-    }
-    set maxRedirects(maxRedirects) {
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
-      this[_maxRedirects] = maxRedirects;
-    }
-    get followRedirects() {
-      return this[_followRedirects];
-    }
-    set followRedirects(followRedirects) {
-      if (dart.test(this[_outgoing].headersWritten)) dart.throw(new core.StateError("Request already sent"));
-      this[_followRedirects] = followRedirects;
-    }
-    get connectionInfo() {
-      return this[_httpClientConnection].connectionInfo;
-    }
-    [_onIncoming](incoming) {
-      let response = new io._HttpClientResponse(incoming, this, this[_httpClient]);
-      let future = null;
-      if (dart.test(this.followRedirects) && dart.test(response.isRedirect)) {
-        if (dart.notNull(response.redirects[dartx.length]) < dart.notNull(this.maxRedirects)) {
-          future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => response.redirect(), dynamicToFutureOfHttpClientResponse()));
-        } else {
-          future = response.drain(dart.dynamic)().then(io.HttpClientResponse)(dart.fn(_ => FutureOfHttpClientResponse().error(new io.RedirectException("Redirect limit exceeded", response.redirects)), dynamicToFutureOfHttpClientResponse()));
-        }
-      } else if (dart.test(response[_shouldAuthenticateProxy])) {
-        future = response[_authenticate](true);
-      } else if (dart.test(response[_shouldAuthenticate])) {
-        future = response[_authenticate](false);
-      } else {
-        future = FutureOfHttpClientResponse().value(response);
-      }
-      future.then(dart.void)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
-    }
-    [_onError$](error, stackTrace) {
-      this[_responseCompleter].completeError(error, stackTrace);
-    }
-    [_requestUri]() {
-      const uriStartingFromPath = (function() {
-        let result = this.uri.path;
-        if (dart.test(result[dartx.isEmpty])) result = "/";
-        if (dart.test(this.uri.hasQuery)) {
-          result = dart.str`${result}?${this.uri.query}`;
-        }
-        return result;
-      }).bind(this);
-      dart.fn(uriStartingFromPath, VoidToString$());
-      if (dart.test(this[_proxy].isDirect)) {
-        return uriStartingFromPath();
-      } else {
-        if (this.method == "CONNECT") {
-          return dart.str`${this.uri.host}:${this.uri.port}`;
-        } else {
-          if (dart.test(this[_httpClientConnection][_proxyTunnel])) {
-            return uriStartingFromPath();
-          } else {
-            return dart.toString(this.uri.removeFragment());
-          }
-        }
-      }
-    }
-    [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid$());
-      write(this.method[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this[_requestUri]()[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(io._Const.HTTP11);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      if (!dart.test(this.cookies[dartx.isEmpty])) {
-        let sb = new core.StringBuffer();
-        for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
-          if (i > 0) sb.write("; ");
-          sb.write(this.cookies[dartx._get](i).name);
-          sb.write("=");
-          sb.write(this.cookies[dartx._get](i).value);
-        }
-        this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
-      }
-      this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpClientRequest);
-  io._HttpClientRequest[dart.implements] = () => [io.HttpClientRequest];
-  dart.setSignature(io._HttpClientRequest, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientRequest, [io._HttpOutgoing, core.Uri, core.String, io._Proxy, io._HttpClient, io._HttpClientConnection])}),
-    fields: () => ({
-      method: core.String,
-      uri: core.Uri,
-      cookies: ListOfCookie(),
-      [_httpClient]: io._HttpClient,
-      [_httpClientConnection]: io._HttpClientConnection,
-      [_responseCompleter]: CompleterOfHttpClientResponse(),
-      [_proxy]: io._Proxy,
-      [_response]: FutureOfHttpClientResponse(),
-      [_followRedirects]: core.bool,
-      [_maxRedirects]: core.int,
-      [_responseRedirects]: ListOfRedirectInfo()
-    }),
-    getters: () => ({
-      done: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
-      maxRedirects: dart.definiteFunctionType(core.int, []),
-      followRedirects: dart.definiteFunctionType(core.bool, []),
-      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])
-    }),
-    setters: () => ({
-      maxRedirects: dart.definiteFunctionType(dart.void, [core.int]),
-      followRedirects: dart.definiteFunctionType(dart.void, [core.bool])
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
-      [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
-      [_onError$]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
-      [_requestUri]: dart.definiteFunctionType(core.String, []),
-      [_writeHeader]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _consume = Symbol('_consume');
-  io._HttpGZipSink = class _HttpGZipSink extends convert.ByteConversionSink {
-    new(consume) {
-      this[_consume] = consume;
-      super.new();
-    }
-    add(chunk) {
-      dart.dcall(this[_consume], chunk);
-    }
-    addSlice(chunk, start, end, isLast) {
-      if (typed_data.Uint8List.is(chunk)) {
-        dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
-      } else {
-        dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
-      }
-    }
-    close() {}
-  };
-  dart.setSignature(io._HttpGZipSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpGZipSink, [core.Function])}),
-    fields: () => ({[_consume]: core.Function}),
-    methods: () => ({
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
-      close: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _closeFuture = Symbol('_closeFuture');
-  const _pendingChunkedFooter = Symbol('_pendingChunkedFooter');
-  const _bytesWritten = Symbol('_bytesWritten');
-  const _gzip = Symbol('_gzip');
-  const _gzipSink = Symbol('_gzipSink');
-  const _gzipAdd = Symbol('_gzipAdd');
-  const _gzipBuffer = Symbol('_gzipBuffer');
-  const _gzipBufferLength = Symbol('_gzipBufferLength');
-  const _socketError = Symbol('_socketError');
-  const _addGZipChunk = Symbol('_addGZipChunk');
-  const _addChunk$ = Symbol('_addChunk');
-  const _chunkHeader = Symbol('_chunkHeader');
-  const _ignoreError = Symbol('_ignoreError');
-  let const$68;
-  io._HttpOutgoing = class _HttpOutgoing extends core.Object {
-    new(socket) {
-      this[_doneCompleter] = async.Completer.new();
-      this.socket = socket;
-      this.ignoreBody = false;
-      this.headersWritten = false;
-      this[_buffer$] = null;
-      this[_length$2] = 0;
-      this[_closeFuture] = null;
-      this.chunked = false;
-      this[_pendingChunkedFooter] = 0;
-      this.contentLength = null;
-      this[_bytesWritten] = 0;
-      this[_gzip] = false;
-      this[_gzipSink] = null;
-      this[_gzipAdd] = null;
-      this[_gzipBuffer] = null;
-      this[_gzipBufferLength] = 0;
-      this[_socketError] = false;
-      this.outbound = null;
-    }
-    writeHeaders(opts) {
-      let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
-      let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
-      const write = (function() {
-        try {
-          this.outbound[_writeHeader]();
-        } catch (_) {
-          return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
-        }
-
-        return null;
-      }).bind(this);
-      dart.fn(write, VoidToFuture());
-      if (dart.test(this.headersWritten)) return null;
-      this.headersWritten = true;
-      let drainFuture = null;
-      let gzip = false;
-      if (io._HttpResponse.is(this.outbound)) {
-        let response = io._HttpResponse._check(this.outbound);
-        if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-          let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
-          let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
-          if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool$()))) && contentEncoding == null) {
-            this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
-            gzip = true;
-          }
-        }
-        if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
-          drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-          }, dynamicToNull$()));
-        }
-      } else {
-        drainRequest = false;
-      }
-      if (dart.test(this.ignoreBody)) {
-        return write();
-      }
-      if (dart.test(setOutgoing)) {
-        let contentLength = this.outbound.headers.contentLength;
-        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-          this.chunked = true;
-          if (gzip) this.gzip = true;
-        } else if (dart.notNull(contentLength) >= 0) {
-          this.contentLength = contentLength;
-        }
-      }
-      if (drainFuture != null) {
-        return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
-      }
-      return write();
-    }
-    addStream(stream) {
-      if (dart.test(this[_socketError])) {
-        stream.listen(null).cancel();
-        return async.Future.value(this.outbound);
-      }
-      if (dart.test(this.ignoreBody)) {
-        stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicToNull$()));
-        let future = this.writeHeaders();
-        if (future != null) {
-          return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
-        }
-        return this.close();
-      }
-      let sub = null;
-      let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
-      const onData = (function(data) {
-        if (dart.test(this[_socketError])) return;
-        if (dart.equals(dart.dload(data, 'length'), 0)) return;
-        if (dart.test(this.chunked)) {
-          if (dart.test(this[_gzip])) {
-            this[_gzipAdd] = dart.bind(controller, 'add');
-            this[_addGZipChunk](data, dart.bind(this[_gzipSink], 'add'));
-            this[_gzipAdd] = null;
-            return;
-          }
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
-          this[_pendingChunkedFooter] = 2;
-        } else {
-          if (this.contentLength != null) {
-            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
-            if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
-              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
-              return;
-            }
-          }
-        }
-        this[_addChunk$](data, dart.bind(controller, 'add'));
-      }).bind(this);
-      dart.fn(onData, dynamicTovoid$());
-      sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
-      if (!dart.test(this.headersWritten)) {
-        let future = this.writeHeaders();
-        if (future != null) {
-          dart.dsend(sub, 'pause', future);
-        }
-      }
-      return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
-          if (dart.test(this[_gzip])) this[_gzipSink].close();
-          this[_socketError] = true;
-          this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
-          if (dart.test(this[_ignoreError](error))) {
-            return this.outbound;
-          } else {
-            dart.throw(error);
-          }
-        }, dynamicAnddynamicTo_HttpOutboundMessage())});
-    }
-    close() {
-      if (this[_closeFuture] != null) return this[_closeFuture];
-      if (dart.test(this[_socketError])) return async.Future.value(this.outbound);
-      if (dart.test(this.outbound[_isConnectionClosed])) return async.Future.value(this.outbound);
-      if (!dart.test(this.headersWritten) && !dart.test(this.ignoreBody)) {
-        if (this.outbound.headers.contentLength == -1) {
-          this.outbound.headers.chunkedTransferEncoding = false;
-          this.outbound.headers.contentLength = 0;
-        } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
-          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
-          this[_doneCompleter].completeError(error);
-          return this[_closeFuture] = async.Future.error(error);
-        }
-      }
-      if (this.contentLength != null) {
-        if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
-          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
-          this[_doneCompleter].completeError(error);
-          return this[_closeFuture] = async.Future.error(error);
-        }
-      }
-      const finalize = (function() {
-        if (dart.test(this.chunked)) {
-          if (dart.test(this[_gzip])) {
-            this[_gzipAdd] = dart.bind(this.socket, 'add');
-            if (dart.notNull(this[_gzipBufferLength]) > 0) {
-              this[_gzipSink].add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
-            }
-            this[_gzipBuffer] = null;
-            this[_gzipSink].close();
-            this[_gzipAdd] = null;
-          }
-          this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
-        }
-        if (dart.notNull(this[_length$2]) > 0) {
-          this.socket.add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
-        }
-        this[_buffer$] = null;
-        return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
-          this[_doneCompleter].complete(this.socket);
-          return this.outbound;
-        }, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
-            this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
-            if (dart.test(this[_ignoreError](error))) {
-              return this.outbound;
-            } else {
-              dart.throw(error);
-            }
-          }, dynamicAnddynamicTo_HttpOutboundMessage())});
-      }).bind(this);
-      dart.fn(finalize, VoidToFuture());
-      let future = this.writeHeaders();
-      if (future != null) {
-        return this[_closeFuture] = future.whenComplete(finalize);
-      }
-      return this[_closeFuture] = finalize();
-    }
-    get done() {
-      return this[_doneCompleter].future;
-    }
-    setHeader(data, length) {
-      dart.assert(this[_length$2] == 0);
-      dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
-      this[_buffer$] = typed_data.Uint8List._check(data);
-      this[_length$2] = length;
-    }
-    set gzip(value) {
-      this[_gzip] = value;
-      if (dart.test(this[_gzip])) {
-        this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-        dart.assert(this[_gzipSink] == null);
-        this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
-          if (this[_gzipAdd] == null) return;
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
-          this[_pendingChunkedFooter] = 2;
-          this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
-        }, dynamicToNull$())));
-      }
-    }
-    [_ignoreError](error) {
-      return (io.SocketException.is(error) || io.TlsException.is(error)) && io.HttpResponse.is(this.outbound);
-    }
-    [_addGZipChunk](chunk, add) {
-      if (!dart.test(this.outbound.bufferOutput)) {
-        add(ListOfint()._check(chunk));
-        return;
-      }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
-        add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
-        this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-        this[_gzipBufferLength] = 0;
-      }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
-      } else {
-        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
-      }
-    }
-    [_addChunk$](chunk, add) {
-      if (!dart.test(this.outbound.bufferOutput)) {
-        if (this[_buffer$] != null) {
-          add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
-          this[_buffer$] = null;
-          this[_length$2] = 0;
-        }
-        add(ListOfint()._check(chunk));
-        return;
-      }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
-        add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
-        this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-        this[_length$2] = 0;
-      }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
-      } else {
-        this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
-      }
-    }
-    [_chunkHeader](length) {
-      let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
-      if (length == 0) {
-        if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
-        return io._HttpOutgoing._chunk0Length;
-      }
-      let size = this[_pendingChunkedFooter];
-      let len = length;
-      while (dart.notNull(len) > 0) {
-        size = dart.notNull(size) + 1;
-        len = len[dartx['>>']](4);
-      }
-      let footerAndHeader = typed_data.Uint8List.new(dart.notNull(size) + 2);
-      if (this[_pendingChunkedFooter] == 2) {
-        footerAndHeader[dartx._set](0, io._CharCode.CR);
-        footerAndHeader[dartx._set](1, io._CharCode.LF);
-      }
-      let index = size;
-      while (dart.notNull(index) > dart.notNull(this[_pendingChunkedFooter])) {
-        footerAndHeader[dartx._set]((index = dart.notNull(index) - 1), hexDigits[dartx._get](dart.notNull(length) & 15));
-        length = length[dartx['>>']](4);
-      }
-      footerAndHeader[dartx._set](dart.notNull(size) + 0, io._CharCode.CR);
-      footerAndHeader[dartx._set](dart.notNull(size) + 1, io._CharCode.LF);
-      return footerAndHeader;
-    }
-  };
-  io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
-  dart.setSignature(io._HttpOutgoing, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpOutgoing, [io.Socket])}),
-    fields: () => ({
-      [_doneCompleter]: async.Completer,
-      socket: io.Socket,
-      ignoreBody: core.bool,
-      headersWritten: core.bool,
-      [_buffer$]: typed_data.Uint8List,
-      [_length$2]: core.int,
-      [_closeFuture]: async.Future,
-      chunked: core.bool,
-      [_pendingChunkedFooter]: core.int,
-      contentLength: core.int,
-      [_bytesWritten]: core.int,
-      [_gzip]: core.bool,
-      [_gzipSink]: convert.ByteConversionSink,
-      [_gzipAdd]: core.Function,
-      [_gzipBuffer]: typed_data.Uint8List,
-      [_gzipBufferLength]: core.int,
-      [_socketError]: core.bool,
-      outbound: io._HttpOutboundMessage
-    }),
-    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
-    setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
-    methods: () => ({
-      writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
-      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
-      close: dart.definiteFunctionType(async.Future, []),
-      setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
-      [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
-      [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
-      [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
-    }),
-    sfields: () => ({
-      _footerAndChunk0Length: ListOfint(),
-      _chunk0Length: ListOfint()
-    })
-  });
-  dart.defineLazy(io._HttpOutgoing, {
-    get _footerAndChunk0Length() {
-      return dart.constList([io._CharCode.CR, io._CharCode.LF, 48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
-    },
-    get _chunk0Length() {
-      return dart.constList([48, io._CharCode.CR, io._CharCode.LF, io._CharCode.CR, io._CharCode.LF], core.int);
-    }
-  });
-  const _context = Symbol('_context');
-  const _httpParser = Symbol('_httpParser');
-  const _subscription$ = Symbol('_subscription');
-  const _dispose = Symbol('_dispose');
-  const _idleTimer = Symbol('_idleTimer');
-  const _currentUri = Symbol('_currentUri');
-  const _nextResponseCompleter = Symbol('_nextResponseCompleter');
-  const _streamFuture = Symbol('_streamFuture');
-  const _proxyCredentials = Symbol('_proxyCredentials');
-  const _returnConnection = Symbol('_returnConnection');
-  io._HttpClientConnection = class _HttpClientConnection extends core.Object {
-    new(key, socket, httpClient, proxyTunnel, context) {
-      if (proxyTunnel === void 0) proxyTunnel = false;
-      if (context === void 0) context = null;
-      this.key = key;
-      this[_socket] = socket;
-      this[_httpClient] = httpClient;
-      this[_proxyTunnel] = proxyTunnel;
-      this[_context] = context;
-      this[_httpParser] = io._HttpParser.responseParser();
-      this[_subscription$] = null;
-      this[_dispose] = false;
-      this[_idleTimer] = null;
-      this.closed = false;
-      this[_currentUri] = null;
-      this[_nextResponseCompleter] = null;
-      this[_streamFuture] = null;
-      this[_httpParser].listenToStream(this[_socket]);
-      this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
-        this[_subscription$].pause();
-        if (this[_nextResponseCompleter] == null) {
-          dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
-        }
-        if (incoming.statusCode == 100) {
-          incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
-            this[_subscription$].resume();
-          }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
-            if (stackTrace === void 0) stackTrace = null;
-            this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
-            this[_nextResponseCompleter] = null;
-          }, dynamic__ToNull$()));
-        } else {
-          this[_nextResponseCompleter].complete(incoming);
-          this[_nextResponseCompleter] = null;
-        }
-      }, _HttpIncomingToNull()), {onError: dart.fn((error, stackTrace) => {
-          if (stackTrace === void 0) stackTrace = null;
-          if (this[_nextResponseCompleter] != null) {
-            this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
-            this[_nextResponseCompleter] = null;
-          }
-        }, dynamic__ToNull$()), onDone: dart.fn(() => {
-          if (this[_nextResponseCompleter] != null) {
-            this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
-            this[_nextResponseCompleter] = null;
-          }
-          this.close();
-        }, VoidToNull())});
-    }
-    send(uri, port, method, proxy) {
-      if (dart.test(this.closed)) {
-        dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
-      }
-      this[_currentUri] = uri;
-      this[_subscription$].pause();
-      let proxyCreds = null;
-      let creds = null;
-      let outgoing = new io._HttpOutgoing(this[_socket]);
-      let request = new io._HttpClientRequest(outgoing, uri, method, proxy, this[_httpClient], this);
-      let host = uri.host;
-      if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
-      request.headers.host = host;
-      request.headers.port = port;
-      request.headers[_add$2](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
-      if (this[_httpClient].userAgent != null) {
-        request.headers[_add$2]('user-agent', this[_httpClient].userAgent);
-      }
-      if (dart.test(proxy.isAuthenticated)) {
-        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
-        request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
-      } else if (!dart.test(proxy.isDirect) && dart.notNull(this[_httpClient][_proxyCredentials][dartx.length]) > 0) {
-        proxyCreds = this[_httpClient][_findProxyCredentials](proxy);
-        if (proxyCreds != null) {
-          proxyCreds.authorize(request);
-        }
-      }
-      if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
-        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
-        request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
-      } else {
-        creds = this[_httpClient][_findCredentials](uri);
-        if (creds != null) {
-          creds.authorize(request);
-        }
-      }
-      this[_httpParser].isHead = method == "HEAD";
-      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
-        this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
-        this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
-          this[_currentUri] = null;
-          incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
-            if (dart.test(incoming.upgraded)) {
-              this[_httpClient][_connectionClosed](this);
-              this.startTimer();
-              return;
-            }
-            if (dart.test(this.closed)) return;
-            if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
-              this[_httpClient][_returnConnection](this);
-              this[_subscription$].resume();
-            } else {
-              this.destroy();
-            }
-          }, dynamicToNull$()));
-          if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
-            let authInfo = incoming.headers._get("proxy-authentication-info");
-            if (authInfo != null && authInfo[dartx.length] == 1) {
-              let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
-              let nextnonce = header.parameters[dartx._get]("nextnonce");
-              if (nextnonce != null) proxyCreds.nonce = nextnonce;
-            }
-          }
-          if (creds != null && dart.equals(creds.scheme, io._AuthenticationScheme.DIGEST)) {
-            let authInfo = incoming.headers._get("authentication-info");
-            if (authInfo != null && authInfo[dartx.length] == 1) {
-              let header = io._HeaderValue.parse(authInfo[dartx._get](0), {parameterSeparator: ','});
-              let nextnonce = header.parameters[dartx._get]("nextnonce");
-              if (nextnonce != null) creds.nonce = nextnonce;
-            }
-          }
-          request[_onIncoming](incoming);
-        }, _HttpIncomingToNull())).catchError(dart.fn(error => {
-          dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-        }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
-          this.destroy();
-          request[_onError$](error, core.StackTrace._check(stackTrace));
-        }, dynamicAnddynamicToNull()));
-        this[_subscription$].resume();
-        return s;
-      }, dynamicTodynamic$()), {onError: dart.fn(e => {
-          this.destroy();
-        }, dynamicToNull$())});
-      return request;
-    }
-    detachSocket() {
-      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
-    }
-    destroy() {
-      this.closed = true;
-      this[_httpClient][_connectionClosed](this);
-      this[_socket].destroy();
-    }
-    close() {
-      this.closed = true;
-      this[_httpClient][_connectionClosed](this);
-      this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
-    }
-    createProxyTunnel(host, port, proxy, callback) {
-      let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
-      if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
-        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
-        request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
-      }
-      return request.close().then(io.SecureSocket)(dart.fn(response => {
-        if (response.statusCode != io.HttpStatus.OK) {
-          dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
-        }
-        let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
-        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
-      }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
-        let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
-        return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
-      }, SecureSocketTo_HttpClientConnection()));
-    }
-    get connectionInfo() {
-      return io._HttpConnectionInfo.create(this[_socket]);
-    }
-    static makeKey(isSecure, host, port) {
-      return dart.test(isSecure) ? dart.str`ssh:${host}:${port}` : dart.str`${host}:${port}`;
-    }
-    stopTimer() {
-      if (this[_idleTimer] != null) {
-        this[_idleTimer].cancel();
-        this[_idleTimer] = null;
-      }
-    }
-    startTimer() {
-      dart.assert(this[_idleTimer] == null);
-      this[_idleTimer] = async.Timer.new(this[_httpClient].idleTimeout, dart.fn(() => {
-        this[_idleTimer] = null;
-        this.close();
-      }, VoidToNull()));
-    }
-  };
-  dart.setSignature(io._HttpClientConnection, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientConnection, [core.String, io.Socket, io._HttpClient], [core.bool, io.SecurityContext])}),
-    fields: () => ({
-      key: core.String,
-      [_socket]: io.Socket,
-      [_proxyTunnel]: core.bool,
-      [_context]: io.SecurityContext,
-      [_httpParser]: io._HttpParser,
-      [_subscription$]: async.StreamSubscription,
-      [_httpClient]: io._HttpClient,
-      [_dispose]: core.bool,
-      [_idleTimer]: async.Timer,
-      closed: core.bool,
-      [_currentUri]: core.Uri,
-      [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
-      [_streamFuture]: async.Future
-    }),
-    getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
-    methods: () => ({
-      send: dart.definiteFunctionType(io._HttpClientRequest, [core.Uri, core.int, core.String, io._Proxy]),
-      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
-      destroy: dart.definiteFunctionType(dart.void, []),
-      close: dart.definiteFunctionType(dart.void, []),
-      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      stopTimer: dart.definiteFunctionType(dart.void, []),
-      startTimer: dart.definiteFunctionType(dart.void, [])
-    }),
-    statics: () => ({makeKey: dart.definiteFunctionType(dart.dynamic, [core.bool, core.String, core.int])}),
-    names: ['makeKey']
-  });
-  io._ConnectionInfo = class _ConnectionInfo extends core.Object {
-    new(connection, proxy) {
-      this.connection = connection;
-      this.proxy = proxy;
-    }
-  };
-  dart.setSignature(io._ConnectionInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection, io._Proxy])}),
-    fields: () => ({
-      connection: io._HttpClientConnection,
-      proxy: io._Proxy
-    })
-  });
-  const _idle = Symbol('_idle');
-  const _active = Symbol('_active');
-  const _pending$ = Symbol('_pending');
-  const _connecting = Symbol('_connecting');
-  const _checkPending = Symbol('_checkPending');
-  const _connectionsChanged = Symbol('_connectionsChanged');
-  const _badCertificateCallback = Symbol('_badCertificateCallback');
-  const _getConnectionTarget = Symbol('_getConnectionTarget');
-  io._ConnectionTarget = class _ConnectionTarget extends core.Object {
-    new(key, host, port, isSecure, context) {
-      this[_idle] = HashSetOf_HttpClientConnection().new();
-      this[_active] = HashSetOf_HttpClientConnection().new();
-      this[_pending$] = new collection.ListQueue();
-      this.key = key;
-      this.host = host;
-      this.port = port;
-      this.isSecure = isSecure;
-      this.context = context;
-      this[_connecting] = 0;
-    }
-    get isEmpty() {
-      return dart.test(this[_idle].isEmpty) && dart.test(this[_active].isEmpty) && this[_connecting] == 0;
-    }
-    get hasIdle() {
-      return this[_idle].isNotEmpty;
-    }
-    get hasActive() {
-      return dart.test(this[_active].isNotEmpty) || dart.notNull(this[_connecting]) > 0;
-    }
-    takeIdle() {
-      dart.assert(this.hasIdle);
-      let connection = this[_idle].first;
-      this[_idle].remove(connection);
-      connection.stopTimer();
-      this[_active].add(connection);
-      return connection;
-    }
-    [_checkPending]() {
-      if (dart.test(this[_pending$].isNotEmpty)) {
-        dart.dcall(this[_pending$].removeFirst());
-      }
-    }
-    addNewActive(connection) {
-      this[_active].add(connection);
-    }
-    returnConnection(connection) {
-      dart.assert(this[_active].contains(connection));
-      this[_active].remove(connection);
-      this[_idle].add(connection);
-      connection.startTimer();
-      this[_checkPending]();
-    }
-    connectionClosed(connection) {
-      dart.assert(!dart.test(this[_active].contains(connection)) || !dart.test(this[_idle].contains(connection)));
-      this[_active].remove(connection);
-      this[_idle].remove(connection);
-      this[_checkPending]();
-    }
-    close(force) {
-      for (let c of this[_idle].toList()) {
-        c.close();
-      }
-      if (dart.test(force)) {
-        for (let c of this[_active].toList()) {
-          c.destroy();
-        }
-      }
-    }
-    connect(uriHost, uriPort, proxy, client) {
-      if (dart.test(this.hasIdle)) {
-        let connection = this.takeIdle();
-        client[_connectionsChanged]();
-        return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
-      }
-      if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
-        let completer = async.Completer.new();
-        this[_pending$].add(dart.fn(() => {
-          this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
-        }, VoidToNull()));
-        return FutureOf_ConnectionInfo()._check(completer.future);
-      }
-      let currentBadCertificateCallback = client[_badCertificateCallback];
-      function callback(certificate) {
-        if (currentBadCertificateCallback == null) return false;
-        return currentBadCertificateCallback(certificate, uriHost, uriPort);
-      }
-      dart.fn(callback, X509CertificateTobool$());
-      let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
-      this[_connecting] = dart.notNull(this[_connecting]) + 1;
-      return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
-        this[_connecting] = dart.notNull(this[_connecting]) - 1;
-        dart.dsend(socket, 'setOption', io.SocketOption.TCP_NODELAY, true);
-        let connection = new io._HttpClientConnection(this.key, io.Socket._check(socket), client, false, this.context);
-        if (dart.test(this.isSecure) && !dart.test(proxy.isDirect)) {
-          connection[_dispose] = true;
-          return connection.createProxyTunnel(uriHost, uriPort, proxy, callback).then(io._ConnectionInfo)(dart.fn(tunnel => {
-            client[_getConnectionTarget](uriHost, uriPort, true).addNewActive(tunnel);
-            return new io._ConnectionInfo(tunnel, proxy);
-          }, _HttpClientConnectionTo_ConnectionInfo()));
-        } else {
-          this.addNewActive(connection);
-          return new io._ConnectionInfo(connection, proxy);
-        }
-      }, dynamicToFutureOrOf_ConnectionInfo()), {onError: dart.fn(error => {
-          this[_connecting] = dart.notNull(this[_connecting]) - 1;
-          this[_checkPending]();
-          dart.throw(error);
-        }, dynamicToNull$())});
-    }
-  };
-  dart.setSignature(io._ConnectionTarget, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.String, core.int, core.bool, io.SecurityContext])}),
-    fields: () => ({
-      key: core.String,
-      host: core.String,
-      port: core.int,
-      isSecure: core.bool,
-      context: io.SecurityContext,
-      [_idle]: SetOf_HttpClientConnection(),
-      [_active]: SetOf_HttpClientConnection(),
-      [_pending$]: collection.Queue,
-      [_connecting]: core.int
-    }),
-    getters: () => ({
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      hasIdle: dart.definiteFunctionType(core.bool, []),
-      hasActive: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      takeIdle: dart.definiteFunctionType(io._HttpClientConnection, []),
-      [_checkPending]: dart.definiteFunctionType(dart.dynamic, []),
-      addNewActive: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
-      returnConnection: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
-      connectionClosed: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
-      close: dart.definiteFunctionType(dart.void, [core.bool]),
-      connect: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._Proxy, io._HttpClient])
-    })
-  });
-  io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
-  const _idleTimeout = Symbol('_idleTimeout');
-  let const$69;
-  const _connectionTargets = Symbol('_connectionTargets');
-  const _credentials = Symbol('_credentials');
-  const _closing = Symbol('_closing');
-  const _closingForcefully = Symbol('_closingForcefully');
-  const _findProxy = Symbol('_findProxy');
-  const _openUrl = Symbol('_openUrl');
-  const _closeConnections = Symbol('_closeConnections');
-  let const$70;
-  const _getConnection = Symbol('_getConnection');
-  io._HttpClient = class _HttpClient extends core.Object {
-    get idleTimeout() {
-      return this[_idleTimeout];
-    }
-    new(context) {
-      this[_connectionTargets] = HashMapOfString$_ConnectionTarget().new();
-      this[_credentials] = JSArrayOf_Credentials().of([]);
-      this[_proxyCredentials] = JSArrayOf_ProxyCredentials().of([]);
-      this.userAgent = io._getHttpVersion();
-      this[_context] = context;
-      this[_closing] = false;
-      this[_closingForcefully] = false;
-      this[_authenticate] = null;
-      this[_authenticateProxy] = null;
-      this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-      this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
-      this[_badCertificateCallback] = null;
-      this.maxConnectionsPerHost = null;
-      this.autoUncompress = true;
-    }
-    set idleTimeout(timeout) {
-      this[_idleTimeout] = timeout;
-      for (let c of this[_connectionTargets][dartx.values]) {
-        for (let idle of c[_idle]) {
-          idle.stopTimer();
-          idle.startTimer();
-        }
-      }
-    }
-    set badCertificateCallback(callback) {
-      this[_badCertificateCallback] = callback;
-    }
-    open(method, host, port, path) {
-      let hashMark = 35;
-      let questionMark = 63;
-      let fragmentStart = path[dartx.length];
-      let queryStart = path[dartx.length];
-      for (let i = dart.notNull(path[dartx.length]) - 1; i >= 0; i--) {
-        let char = path[dartx.codeUnitAt](i);
-        if (char == hashMark) {
-          fragmentStart = i;
-          queryStart = i;
-        } else if (char == questionMark) {
-          queryStart = i;
-        }
-      }
-      let query = null;
-      if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
-        query = path[dartx.substring](dart.notNull(queryStart) + 1, fragmentStart);
-        path = path[dartx.substring](0, queryStart);
-      }
-      let uri = core.Uri.new({scheme: "http", host: host, port: port, path: path, query: query});
-      return this[_openUrl](method, uri);
-    }
-    openUrl(method, url) {
-      return this[_openUrl](method, url);
-    }
-    get(host, port, path) {
-      return this.open("get", host, port, path);
-    }
-    getUrl(url) {
-      return this[_openUrl]("get", url);
-    }
-    post(host, port, path) {
-      return this.open("post", host, port, path);
-    }
-    postUrl(url) {
-      return this[_openUrl]("post", url);
-    }
-    put(host, port, path) {
-      return this.open("put", host, port, path);
-    }
-    putUrl(url) {
-      return this[_openUrl]("put", url);
-    }
-    delete(host, port, path) {
-      return this.open("delete", host, port, path);
-    }
-    deleteUrl(url) {
-      return this[_openUrl]("delete", url);
-    }
-    head(host, port, path) {
-      return this.open("head", host, port, path);
-    }
-    headUrl(url) {
-      return this[_openUrl]("head", url);
-    }
-    patch(host, port, path) {
-      return this.open("patch", host, port, path);
-    }
-    patchUrl(url) {
-      return this[_openUrl]("patch", url);
-    }
-    close(opts) {
-      let force = opts && 'force' in opts ? opts.force : false;
-      this[_closing] = true;
-      this[_closingForcefully] = force;
-      this[_closeConnections](this[_closingForcefully]);
-      dart.assert(!dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s.hasIdle, _ConnectionTargetTobool()))));
-      dart.assert(!dart.test(force) || !dart.test(this[_connectionTargets][dartx.values][dartx.any](dart.fn(s => s[_active].isNotEmpty, _ConnectionTargetTobool()))));
-    }
-    set authenticate(f) {
-      this[_authenticate] = f;
-    }
-    addCredentials(url, realm, cr) {
-      this[_credentials][dartx.add](new io._SiteCredentials(url, realm, io._HttpClientCredentials._check(cr)));
-    }
-    set authenticateProxy(f) {
-      this[_authenticateProxy] = f;
-    }
-    addProxyCredentials(host, port, realm, cr) {
-      this[_proxyCredentials][dartx.add](new io._ProxyCredentials(host, port, realm, io._HttpClientCredentials._check(cr)));
-    }
-    set findProxy(f) {
-      return this[_findProxy] = f;
-    }
-    [_openUrl](method, uri) {
-      uri = uri.removeFragment();
-      if (method == null) {
-        dart.throw(new core.ArgumentError(method));
-      }
-      if (method != "CONNECT") {
-        if (dart.test(uri.host[dartx.isEmpty])) {
-          dart.throw(new core.ArgumentError(dart.str`No host specified in URI ${uri}`));
-        } else if (uri.scheme != "http" && uri.scheme != "https") {
-          dart.throw(new core.ArgumentError(dart.str`Unsupported scheme '${uri.scheme}' in URI ${uri}`));
-        }
-      }
-      let isSecure = uri.scheme == "https";
-      let port = uri.port;
-      if (port == 0) {
-        port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
-      }
-      let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
-      if (this[_findProxy] != null) {
-        try {
-          proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
-        } catch (error) {
-          let stackTrace = dart.stackTrace(error);
-          return FutureOf_HttpClientRequest().error(error, stackTrace);
-        }
-
-      }
-      return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(dart.fn(info => {
-        function send(info) {
-          return info.connection.send(uri, port, method[dartx.toUpperCase](), info.proxy);
-        }
-        dart.fn(send, _ConnectionInfoTo_HttpClientRequest());
-        if (dart.test(info.connection.closed)) {
-          return this[_getConnection](uri.host, port, proxyConf, isSecure).then(io._HttpClientRequest)(send);
-        }
-        return send(info);
-      }, _ConnectionInfoToFutureOrOf_HttpClientRequest()));
-    }
-    [_openUrlFromRequest](method, uri, previous) {
-      let resolved = previous.uri.resolveUri(uri);
-      return this[_openUrl](method, resolved).then(io._HttpClientRequest)(dart.fn(request => {
-        request.followRedirects = previous.followRedirects;
-        request.maxRedirects = previous.maxRedirects;
-        for (let header of previous.headers[_headers][dartx.keys]) {
-          if (request.headers._get(header) == null) {
-            request.headers.set(header, previous.headers._get(header));
-          }
-        }
-        request.headers.chunkedTransferEncoding = false;
-        request.contentLength = 0;
-        return request;
-      }, _HttpClientRequestTo_HttpClientRequest()));
-    }
-    [_returnConnection](connection) {
-      this[_connectionTargets][dartx._get](connection.key).returnConnection(connection);
-      this[_connectionsChanged]();
-    }
-    [_connectionClosed](connection) {
-      connection.stopTimer();
-      let connectionTarget = this[_connectionTargets][dartx._get](connection.key);
-      if (connectionTarget != null) {
-        connectionTarget.connectionClosed(connection);
-        if (dart.test(connectionTarget.isEmpty)) {
-          this[_connectionTargets][dartx.remove](connection.key);
-        }
-        this[_connectionsChanged]();
-      }
-    }
-    [_connectionsChanged]() {
-      if (dart.test(this[_closing])) {
-        this[_closeConnections](this[_closingForcefully]);
-      }
-    }
-    [_closeConnections](force) {
-      for (let connectionTarget of this[_connectionTargets][dartx.values][dartx.toList]()) {
-        connectionTarget.close(force);
-      }
-    }
-    [_getConnectionTarget](host, port, isSecure) {
-      let key = core.String._check(io._HttpClientConnection.makeKey(isSecure, host, port));
-      return this[_connectionTargets][dartx.putIfAbsent](key, dart.fn(() => new io._ConnectionTarget(key, host, port, isSecure, this[_context]), VoidTo_ConnectionTarget()));
-    }
-    [_getConnection](uriHost, uriPort, proxyConf, isSecure) {
-      let proxies = proxyConf.proxies[dartx.iterator];
-      const connect = (function(error) {
-        if (!dart.test(proxies.moveNext())) return FutureOf_ConnectionInfo().error(error);
-        let proxy = proxies.current;
-        let host = dart.test(proxy.isDirect) ? uriHost : proxy.host;
-        let port = dart.test(proxy.isDirect) ? uriPort : proxy.port;
-        return this[_getConnectionTarget](host, port, isSecure).connect(uriHost, uriPort, proxy, this).catchError(connect);
-      }).bind(this);
-      dart.fn(connect, dynamicToFutureOf_ConnectionInfo());
-      return FutureOf_ConnectionInfo().new(dart.fn(() => connect(new io.HttpException("No proxies given")), VoidToFutureOf_ConnectionInfo()));
-    }
-    [_findCredentials](url, scheme) {
-      if (scheme === void 0) scheme = null;
-      let cr = this[_credentials][dartx.fold](io._SiteCredentials)(null, dart.fn((prev, value) => {
-        let siteCredentials = io._SiteCredentials.as(value);
-        if (dart.test(siteCredentials.applies(url, scheme))) {
-          if (prev == null) return io._SiteCredentials._check(value);
-          return dart.notNull(siteCredentials.uri.path[dartx.length]) > dart.notNull(prev.uri.path[dartx.length]) ? siteCredentials : prev;
-        } else {
-          return prev;
-        }
-      }, _SiteCredentialsAnd_CredentialsTo_SiteCredentials()));
-      return cr;
-    }
-    [_findProxyCredentials](proxy, scheme) {
-      if (scheme === void 0) scheme = null;
-      let it = this[_proxyCredentials][dartx.iterator];
-      while (dart.test(it.moveNext())) {
-        if (dart.test(it.current.applies(proxy, scheme))) {
-          return it.current;
-        }
-      }
-      return null;
-    }
-    [_removeCredentials](cr) {
-      let index = this[_credentials][dartx.indexOf](cr);
-      if (index != -1) {
-        this[_credentials][dartx.removeAt](index);
-      }
-    }
-    [_removeProxyCredentials](cr) {
-      let index = this[_proxyCredentials][dartx.indexOf](io._ProxyCredentials._check(cr));
-      if (index != -1) {
-        this[_proxyCredentials][dartx.removeAt](index);
-      }
-    }
-    static _findProxyFromEnvironment(url, environment) {
-      function checkNoProxy(option) {
-        if (option == null) return null;
-        let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString$()))[dartx.iterator];
-        while (dart.test(names.moveNext())) {
-          let name = names.current;
-          if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
-            return "DIRECT";
-          }
-        }
-        return null;
-      }
-      dart.fn(checkNoProxy, StringToString$());
-      function checkProxy(option) {
-        if (option == null) return null;
-        option = option[dartx.trim]();
-        if (dart.test(option[dartx.isEmpty])) return null;
-        let pos = option[dartx.indexOf]("://");
-        if (dart.notNull(pos) >= 0) {
-          option = option[dartx.substring](dart.notNull(pos) + 3);
-        }
-        pos = option[dartx.indexOf]("/");
-        if (dart.notNull(pos) >= 0) {
-          option = option[dartx.substring](0, pos);
-        }
-        if (option[dartx.indexOf]("[") == 0) {
-          let pos = option[dartx.lastIndexOf](":");
-          if (dart.notNull(option[dartx.indexOf]("]")) > dart.notNull(pos)) option = dart.str`${option}:1080`;
-        } else {
-          if (option[dartx.indexOf](":") == -1) option = dart.str`${option}:1080`;
-        }
-        return dart.str`PROXY ${option}`;
-      }
-      dart.fn(checkProxy, StringToString$());
-      if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
-      let proxyCfg = null;
-      let noProxy = environment[dartx._get]("no_proxy");
-      if (noProxy == null) noProxy = environment[dartx._get]("NO_PROXY");
-      if ((proxyCfg = checkNoProxy(noProxy)) != null) {
-        return proxyCfg;
-      }
-      if (url.scheme == "http") {
-        let proxy = environment[dartx._get]("http_proxy");
-        if (proxy == null) proxy = environment[dartx._get]("HTTP_PROXY");
-        if ((proxyCfg = checkProxy(proxy)) != null) {
-          return proxyCfg;
-        }
-      } else if (url.scheme == "https") {
-        let proxy = environment[dartx._get]("https_proxy");
-        if (proxy == null) proxy = environment[dartx._get]("HTTPS_PROXY");
-        if ((proxyCfg = checkProxy(proxy)) != null) {
-          return proxyCfg;
-        }
-      }
-      return "DIRECT";
-    }
-  };
-  io._HttpClient[dart.implements] = () => [io.HttpClient];
-  dart.setSignature(io._HttpClient, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClient, [io.SecurityContext])}),
-    fields: () => ({
-      [_closing]: core.bool,
-      [_closingForcefully]: core.bool,
-      [_connectionTargets]: MapOfString$_ConnectionTarget(),
-      [_credentials]: ListOf_Credentials(),
-      [_proxyCredentials]: ListOf_ProxyCredentials(),
-      [_context]: io.SecurityContext,
-      [_authenticate]: core.Function,
-      [_authenticateProxy]: core.Function,
-      [_findProxy]: core.Function,
-      [_idleTimeout]: core.Duration,
-      [_badCertificateCallback]: io.BadCertificateCallback,
-      maxConnectionsPerHost: core.int,
-      autoUncompress: core.bool,
-      userAgent: core.String
-    }),
-    getters: () => ({idleTimeout: dart.definiteFunctionType(core.Duration, [])}),
-    setters: () => ({
-      idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
-      badCertificateCallback: dart.definiteFunctionType(dart.void, [X509CertificateAndStringAndintTobool()]),
-      authenticate: dart.definiteFunctionType(dart.void, [UriAndStringAndStringToFutureOfbool()]),
-      authenticateProxy: dart.definiteFunctionType(dart.void, [StringAndintAndString__ToFutureOfbool()]),
-      findProxy: dart.definiteFunctionType(dart.void, [UriToString()])
-    }),
-    methods: () => ({
-      open: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.String, core.int, core.String]),
-      openUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.Uri]),
-      get: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      getUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      post: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      postUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      put: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      putUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      delete: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      deleteUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      head: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      headUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      patch: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.String, core.int, core.String]),
-      patchUrl: dart.definiteFunctionType(async.Future$(io.HttpClientRequest), [core.Uri]),
-      close: dart.definiteFunctionType(dart.void, [], {force: core.bool}),
-      addCredentials: dart.definiteFunctionType(dart.void, [core.Uri, core.String, io.HttpClientCredentials]),
-      addProxyCredentials: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String, io.HttpClientCredentials]),
-      [_openUrl]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri]),
-      [_openUrlFromRequest]: dart.definiteFunctionType(async.Future$(io._HttpClientRequest), [core.String, core.Uri, io._HttpClientRequest]),
-      [_returnConnection]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
-      [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpClientConnection]),
-      [_connectionsChanged]: dart.definiteFunctionType(dart.void, []),
-      [_closeConnections]: dart.definiteFunctionType(dart.void, [core.bool]),
-      [_getConnectionTarget]: dart.definiteFunctionType(io._ConnectionTarget, [core.String, core.int, core.bool]),
-      [_getConnection]: dart.definiteFunctionType(async.Future$(io._ConnectionInfo), [core.String, core.int, io._ProxyConfiguration, core.bool]),
-      [_findCredentials]: dart.definiteFunctionType(io._SiteCredentials, [core.Uri], [io._AuthenticationScheme]),
-      [_findProxyCredentials]: dart.definiteFunctionType(io._ProxyCredentials, [io._Proxy], [io._AuthenticationScheme]),
-      [_removeCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials]),
-      [_removeProxyCredentials]: dart.definiteFunctionType(dart.void, [io._Credentials])
-    }),
-    sfields: () => ({_platformEnvironmentCache: MapOfString$String()}),
-    statics: () => ({_findProxyFromEnvironment: dart.definiteFunctionType(core.String, [core.Uri, MapOfString$String()])}),
-    names: ['_findProxyFromEnvironment']
-  });
-  dart.defineLazy(io._HttpClient, {
-    get _platformEnvironmentCache() {
-      return io.Platform.environment;
-    },
-    set _platformEnvironmentCache(_) {}
-  });
-  const _state$1 = Symbol('_state');
-  const _idleMark = Symbol('_idleMark');
-  const _owner = Symbol('_owner');
-  const _serviceId = Symbol('_serviceId');
-  const _markActive = Symbol('_markActive');
-  const _markIdle = Symbol('_markIdle');
-  const _handleRequest = Symbol('_handleRequest');
-  const _isActive = Symbol('_isActive');
-  const _isIdle = Symbol('_isIdle');
-  const _isDetached = Symbol('_isDetached');
-  const _serviceTypePath = Symbol('_serviceTypePath');
-  const _serviceTypeName = Symbol('_serviceTypeName');
-  const _servicePath = Symbol('_servicePath');
-  const _serviceType = Symbol('_serviceType');
-  const _toJSON$ = Symbol('_toJSON');
-  const __serviceId = Symbol('__serviceId');
-  io._ServiceObject = class _ServiceObject extends core.Object {
-    new() {
-      this[__serviceId] = 0;
-    }
-    get [_serviceId]() {
-      if (this[__serviceId] == 0) this[__serviceId] = (() => {
-        let x = io._nextServiceId;
-        io._nextServiceId = dart.notNull(x) + 1;
-        return x;
-      })();
-      return this[__serviceId];
-    }
-    get [_servicePath]() {
-      return dart.str`${this[_serviceTypePath]}/${this[_serviceId]}`;
-    }
-    [_serviceType](ref) {
-      if (dart.test(ref)) return dart.str`@${this[_serviceTypeName]}`;
-      return this[_serviceTypeName];
-    }
-  };
-  dart.setSignature(io._ServiceObject, {
-    fields: () => ({[__serviceId]: core.int}),
-    getters: () => ({
-      [_serviceId]: dart.definiteFunctionType(core.int, []),
-      [_servicePath]: dart.definiteFunctionType(core.String, [])
-    }),
-    methods: () => ({[_serviceType]: dart.definiteFunctionType(core.String, [core.bool])})
-  });
-  io._HttpConnection = class _HttpConnection extends dart.mixin(collection.LinkedListEntry, io._ServiceObject) {
-    new(socket, httpServer) {
-      this[_socket] = socket;
-      this[_httpServer] = httpServer;
-      this[_httpParser] = io._HttpParser.requestParser();
-      this[_state$1] = io._HttpConnection._IDLE;
-      this[_subscription$] = null;
-      this[_idleMark] = false;
-      this[_streamFuture] = null;
-      super.new();
-      try {
-        dart.dput(this[_socket], _owner, this);
-      } catch (_) {
-        core.print(_);
-      }
-
-      io._HttpConnection._connections[dartx._set](this[_serviceId], this);
-      this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
-      this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
-        this[_httpServer][_markActive](this);
-        incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
-          if (dart.test(closing)) this.destroy();
-        }, dynamicToNull$()));
-        this[_subscription$].pause();
-        this[_state$1] = io._HttpConnection._ACTIVE;
-        let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
-        let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
-        let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
-        this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
-          response.deadline = null;
-          if (this[_state$1] == io._HttpConnection._DETACHED) return;
-          if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
-            this[_state$1] = io._HttpConnection._IDLE;
-            this[_idleMark] = false;
-            this[_httpServer][_markIdle](this);
-            this[_subscription$].resume();
-          } else {
-            this.destroy();
-          }
-        }, dynamicToNull$()), {onError: dart.fn(_ => {
-            this.destroy();
-          }, dynamicToNull$())});
-        outgoing.ignoreBody = request.method == "HEAD";
-        response[_httpRequest] = request;
-        this[_httpServer][_handleRequest](request);
-      }, _HttpIncomingToNull()), {onDone: dart.fn(() => {
-          this.destroy();
-        }, VoidToNull()), onError: dart.fn(error => {
-          this.destroy();
-        }, dynamicToNull$())});
-    }
-    markIdle() {
-      this[_idleMark] = true;
-    }
-    get isMarkedIdle() {
-      return this[_idleMark];
-    }
-    destroy() {
-      if (this[_state$1] == io._HttpConnection._CLOSING || this[_state$1] == io._HttpConnection._DETACHED) return;
-      this[_state$1] = io._HttpConnection._CLOSING;
-      dart.dsend(this[_socket], 'destroy');
-      this[_httpServer][_connectionClosed](this);
-      io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-    }
-    detachSocket() {
-      this[_state$1] = io._HttpConnection._DETACHED;
-      this[_httpServer][_connectionClosed](this);
-      let detachedIncoming = this[_httpParser].detachIncoming();
-      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
-        io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-        return new io._DetachedSocket(this[_socket], detachedIncoming);
-      }, dynamicTo_DetachedSocket()));
-    }
-    get connectionInfo() {
-      return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
-    }
-    get [_isActive]() {
-      return this[_state$1] == io._HttpConnection._ACTIVE;
-    }
-    get [_isIdle]() {
-      return this[_state$1] == io._HttpConnection._IDLE;
-    }
-    get [_isClosing]() {
-      return this[_state$1] == io._HttpConnection._CLOSING;
-    }
-    get [_isDetached]() {
-      return this[_state$1] == io._HttpConnection._DETACHED;
-    }
-    get [_serviceTypePath]() {
-      return 'io/http/serverconnections';
-    }
-    get [_serviceTypeName]() {
-      return 'HttpServerConnection';
-    }
-    [_toJSON$](ref) {
-      let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
-      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
-      if (dart.test(ref)) {
-        return r;
-      }
-      r[dartx._set]('server', this[_httpServer][_toJSON$](true));
-      try {
-        r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
-      } catch (_) {
-        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
-      }
-
-      switch (this[_state$1]) {
-        case io._HttpConnection._ACTIVE:
-        {
-          r[dartx._set]('state', "Active");
-          break;
-        }
-        case io._HttpConnection._IDLE:
-        {
-          r[dartx._set]('state', "Idle");
-          break;
-        }
-        case io._HttpConnection._CLOSING:
-        {
-          r[dartx._set]('state', "Closing");
-          break;
-        }
-        case io._HttpConnection._DETACHED:
-        {
-          r[dartx._set]('state', "Detached");
-          break;
-        }
-        default:
-        {
-          r[dartx._set]('state', 'Unknown');
-          break;
-        }
-      }
-      return r;
-    }
-  };
-  dart.setBaseClass(io._HttpConnection, dart.mixin(collection.LinkedListEntry$(io._HttpConnection), io._ServiceObject));
-  dart.addSimpleTypeTests(io._HttpConnection);
-  dart.setSignature(io._HttpConnection, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpConnection, [dart.dynamic, io._HttpServer])}),
-    fields: () => ({
-      [_socket]: dart.dynamic,
-      [_httpServer]: io._HttpServer,
-      [_httpParser]: io._HttpParser,
-      [_state$1]: core.int,
-      [_subscription$]: async.StreamSubscription,
-      [_idleMark]: core.bool,
-      [_streamFuture]: async.Future
-    }),
-    getters: () => ({
-      isMarkedIdle: dart.definiteFunctionType(core.bool, []),
-      connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, []),
-      [_isActive]: dart.definiteFunctionType(core.bool, []),
-      [_isIdle]: dart.definiteFunctionType(core.bool, []),
-      [_isClosing]: dart.definiteFunctionType(core.bool, []),
-      [_isDetached]: dart.definiteFunctionType(core.bool, []),
-      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
-      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
-    }),
-    methods: () => ({
-      markIdle: dart.definiteFunctionType(dart.void, []),
-      destroy: dart.definiteFunctionType(dart.void, []),
-      detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
-      [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
-    }),
-    sfields: () => ({
-      _ACTIVE: core.int,
-      _IDLE: core.int,
-      _CLOSING: core.int,
-      _DETACHED: core.int,
-      _connections: MapOfint$_HttpConnection()
-    })
-  });
-  io._HttpConnection._ACTIVE = 0;
-  io._HttpConnection._IDLE = 1;
-  io._HttpConnection._CLOSING = 2;
-  io._HttpConnection._DETACHED = 3;
-  dart.defineLazy(io._HttpConnection, {
-    get _connections() {
-      return HashMapOfint$_HttpConnection().new();
-    },
-    set _connections(_) {}
-  });
-  const _activeConnections = Symbol('_activeConnections');
-  const _idleConnections = Symbol('_idleConnections');
-  const _serverSocket = Symbol('_serverSocket');
-  const _closeServer = Symbol('_closeServer');
-  let const$71;
-  let const$72;
-  io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
-    static bind(address, port, backlog, v6Only, shared) {
-      return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
-    }
-    static bindSecure(address, port, context, backlog, v6Only, requestClientCertificate, shared) {
-      return io.SecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), SecureServerSocketTo_HttpServer()));
-    }
-    _(serverSocket, closeServer) {
-      this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
-      this[_activeConnections] = new (LinkedListOf_HttpConnection())();
-      this[_idleConnections] = new (LinkedListOf_HttpConnection())();
-      this[_serverSocket] = serverSocket;
-      this[_closeServer] = closeServer;
-      this.serverHeader = null;
-      this.autoCompress = false;
-      this[_idleTimeout] = null;
-      this[_idleTimer] = null;
-      this[_sessionManagerInstance] = null;
-      this.closed = false;
-      this[_controller$0] = null;
-      super.new();
-      this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
-      io._HttpServer._servers[dartx._set](this[_serviceId], this);
-      dart.dput(this[_serverSocket], _owner, this);
-    }
-    listenOn(serverSocket) {
-      this.defaultResponseHeaders = io._HttpServer._initDefaultResponseHeaders();
-      this[_activeConnections] = new (LinkedListOf_HttpConnection())();
-      this[_idleConnections] = new (LinkedListOf_HttpConnection())();
-      this[_serverSocket] = serverSocket;
-      this[_closeServer] = false;
-      this.serverHeader = null;
-      this.autoCompress = false;
-      this[_idleTimeout] = null;
-      this[_idleTimer] = null;
-      this[_sessionManagerInstance] = null;
-      this.closed = false;
-      this[_controller$0] = null;
-      super.new();
-      this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
-      io._HttpServer._servers[dartx._set](this[_serviceId], this);
-      try {
-        dart.dput(this[_serverSocket], _owner, this);
-      } catch (_) {
-      }
-
-    }
-    static _initDefaultResponseHeaders() {
-      let defaultResponseHeaders = new io._HttpHeaders('1.1');
-      defaultResponseHeaders.contentType = io.ContentType.TEXT;
-      defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
-      defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
-      defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
-      return defaultResponseHeaders;
-    }
-    get idleTimeout() {
-      return this[_idleTimeout];
-    }
-    set idleTimeout(duration) {
-      if (this[_idleTimer] != null) {
-        this[_idleTimer].cancel();
-        this[_idleTimer] = null;
-      }
-      this[_idleTimeout] = duration;
-      if (this[_idleTimeout] != null) {
-        this[_idleTimer] = async.Timer.periodic(this[_idleTimeout], dart.fn(_ => {
-          for (let idle of this[_idleConnections].toList()) {
-            if (dart.test(idle.isMarkedIdle)) {
-              idle.destroy();
-            } else {
-              idle.markIdle();
-            }
-          }
-        }, TimerToNull()));
-      }
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      dart.dsend(this[_serverSocket], 'listen', dart.fn(socket => {
-        socket.setOption(io.SocketOption.TCP_NODELAY, true);
-        let connection = new io._HttpConnection(socket, this);
-        this[_idleConnections].add(connection);
-      }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
-          if (!io.HandshakeException.is(error)) {
-            this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
-          }
-        }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
-      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    close(opts) {
-      let force = opts && 'force' in opts ? opts.force : false;
-      this.closed = true;
-      let result = null;
-      if (this[_serverSocket] != null && dart.test(this[_closeServer])) {
-        result = async.Future._check(dart.dsend(this[_serverSocket], 'close'));
-      } else {
-        result = async.Future.value();
-      }
-      this.idleTimeout = null;
-      if (dart.test(force)) {
-        for (let c of this[_activeConnections].toList()) {
-          c.destroy();
-        }
-        dart.assert(this[_activeConnections].isEmpty);
-      }
-      for (let c of this[_idleConnections].toList()) {
-        c.destroy();
-      }
-      this[_maybePerformCleanup]();
-      return result;
-    }
-    [_maybePerformCleanup]() {
-      if (dart.test(this.closed) && dart.test(this[_idleConnections].isEmpty) && dart.test(this[_activeConnections].isEmpty) && this[_sessionManagerInstance] != null) {
-        this[_sessionManagerInstance].close();
-        this[_sessionManagerInstance] = null;
-        io._HttpServer._servers[dartx.remove](this[_serviceId]);
-      }
-    }
-    get port() {
-      if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
-      return core.int._check(dart.dload(this[_serverSocket], 'port'));
-    }
-    get address() {
-      if (dart.test(this.closed)) dart.throw(new io.HttpException("HttpServer is not bound to a socket"));
-      return io.InternetAddress._check(dart.dload(this[_serverSocket], 'address'));
-    }
-    set sessionTimeout(timeout) {
-      this[_sessionManager].sessionTimeout = timeout;
-    }
-    [_handleRequest](request) {
-      if (!dart.test(this.closed)) {
-        this[_controller$0].add(request);
-      } else {
-        request[_httpConnection].destroy();
-      }
-    }
-    [_connectionClosed](connection) {
-      connection.unlink();
-      this[_maybePerformCleanup]();
-    }
-    [_markIdle](connection) {
-      this[_activeConnections].remove(connection);
-      this[_idleConnections].add(connection);
-    }
-    [_markActive](connection) {
-      this[_idleConnections].remove(connection);
-      this[_activeConnections].add(connection);
-    }
-    get [_sessionManager]() {
-      if (this[_sessionManagerInstance] == null) {
-        this[_sessionManagerInstance] = new io._HttpSessionManager();
-      }
-      return this[_sessionManagerInstance];
-    }
-    connectionsInfo() {
-      let result = new io.HttpConnectionsInfo();
-      result.total = dart.notNull(this[_activeConnections].length) + dart.notNull(this[_idleConnections].length);
-      this[_activeConnections].forEach(dart.fn(conn => {
-        if (dart.test(conn[_isActive])) {
-          result.active = dart.notNull(result.active) + 1;
-        } else {
-          dart.assert(conn[_isClosing]);
-          result.closing = dart.notNull(result.closing) + 1;
-        }
-      }, _HttpConnectionToNull()));
-      this[_idleConnections].forEach(dart.fn(conn => {
-        result.idle = dart.notNull(result.idle) + 1;
-        dart.assert(conn[_isIdle]);
-      }, _HttpConnectionToNull()));
-      return result;
-    }
-    get [_serviceTypePath]() {
-      return 'io/http/servers';
-    }
-    get [_serviceTypeName]() {
-      return 'HttpServer';
-    }
-    [_toJSON$](ref) {
-      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
-      if (dart.test(ref)) {
-        return r;
-      }
-      try {
-        r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON$, true));
-      } catch (_) {
-        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
-      }
-
-      r[dartx._set]('port', this.port);
-      r[dartx._set]('address', this.address.host);
-      r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
-      r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
-      r[dartx._set]('closed', this.closed);
-      return r;
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpServer);
-  dart.defineNamedConstructor(io._HttpServer, '_');
-  dart.defineNamedConstructor(io._HttpServer, 'listenOn');
-  io._HttpServer[dart.implements] = () => [io.HttpServer];
-  dart.setSignature(io._HttpServer, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(io._HttpServer, [dart.dynamic, core.bool]),
-      listenOn: dart.definiteFunctionType(io._HttpServer, [dart.dynamic])
-    }),
-    fields: () => ({
-      serverHeader: core.String,
-      defaultResponseHeaders: io.HttpHeaders,
-      autoCompress: core.bool,
-      [_idleTimeout]: core.Duration,
-      [_idleTimer]: async.Timer,
-      [_sessionManagerInstance]: io._HttpSessionManager,
-      closed: core.bool,
-      [_serverSocket]: dart.dynamic,
-      [_closeServer]: core.bool,
-      [_activeConnections]: LinkedListOf_HttpConnection(),
-      [_idleConnections]: LinkedListOf_HttpConnection(),
-      [_controller$0]: StreamControllerOfHttpRequest()
-    }),
-    getters: () => ({
-      idleTimeout: dart.definiteFunctionType(core.Duration, []),
-      port: dart.definiteFunctionType(core.int, []),
-      address: dart.definiteFunctionType(io.InternetAddress, []),
-      [_sessionManager]: dart.definiteFunctionType(io._HttpSessionManager, []),
-      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
-      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({
-      idleTimeout: dart.definiteFunctionType(dart.void, [core.Duration]),
-      sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(io.HttpRequest), [HttpRequestTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      close: dart.definiteFunctionType(async.Future, [], {force: core.bool}),
-      [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
-      [_handleRequest]: dart.definiteFunctionType(dart.void, [io._HttpRequest]),
-      [_connectionClosed]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
-      [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
-      [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
-      connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
-      [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
-    }),
-    sfields: () => ({_servers: MapOfint$_HttpServer()}),
-    statics: () => ({
-      bind: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, core.int, core.bool, core.bool]),
-      bindSecure: dart.definiteFunctionType(async.Future$(io.HttpServer), [dart.dynamic, core.int, io.SecurityContext, core.int, core.bool, core.bool, core.bool]),
-      _initDefaultResponseHeaders: dart.definiteFunctionType(io.HttpHeaders, [])
-    }),
-    names: ['bind', 'bindSecure', '_initDefaultResponseHeaders']
-  });
-  dart.defineLazy(io._HttpServer, {
-    get _servers() {
-      return MapOfint$_HttpServer().new();
-    },
-    set _servers(_) {}
-  });
-  io._Proxy = class _Proxy extends core.Object {
-    new(host, port, username, password) {
-      this.host = host;
-      this.port = port;
-      this.username = username;
-      this.password = password;
-      this.isDirect = false;
-    }
-    direct() {
-      this.host = null;
-      this.port = null;
-      this.username = null;
-      this.password = null;
-      this.isDirect = true;
-    }
-    get isAuthenticated() {
-      return this.username != null;
-    }
-  };
-  dart.defineNamedConstructor(io._Proxy, 'direct');
-  dart.setSignature(io._Proxy, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._Proxy, [core.String, core.int, core.String, core.String]),
-      direct: dart.definiteFunctionType(io._Proxy, [])
-    }),
-    fields: () => ({
-      host: core.String,
-      port: core.int,
-      username: core.String,
-      password: core.String,
-      isDirect: core.bool
-    }),
-    getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
-  });
-  let const$73;
-  let const$74;
-  io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
-    new(configuration) {
-      this.proxies = ListOf_Proxy().new();
-      if (configuration == null) {
-        dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
-      }
-      let list = configuration[dartx.split](";");
-      list[dartx.forEach](dart.fn(proxy => {
-        proxy = proxy[dartx.trim]();
-        if (!dart.test(proxy[dartx.isEmpty])) {
-          if (dart.test(proxy[dartx.startsWith](io._ProxyConfiguration.PROXY_PREFIX))) {
-            let username = null;
-            let password = null;
-            proxy = proxy[dartx.substring](io._ProxyConfiguration.PROXY_PREFIX[dartx.length])[dartx.trim]();
-            let at = proxy[dartx.indexOf]("@");
-            if (at != -1) {
-              let userinfo = proxy[dartx.substring](0, at)[dartx.trim]();
-              proxy = proxy[dartx.substring](dart.notNull(at) + 1)[dartx.trim]();
-              let colon = userinfo[dartx.indexOf](":");
-              if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
-                dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
-              }
-              username = userinfo[dartx.substring](0, colon)[dartx.trim]();
-              password = userinfo[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
-            }
-            let colon = proxy[dartx.lastIndexOf](":");
-            if (colon == -1 || colon == 0 || colon == dart.notNull(proxy[dartx.length]) - 1) {
-              dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
-            }
-            let host = proxy[dartx.substring](0, colon)[dartx.trim]();
-            if (dart.test(host[dartx.startsWith]("[")) && dart.test(host[dartx.endsWith]("]"))) {
-              host = host[dartx.substring](1, dart.notNull(host[dartx.length]) - 1);
-            }
-            let portString = proxy[dartx.substring](dart.notNull(colon) + 1)[dartx.trim]();
-            let port = null;
-            try {
-              port = core.int.parse(portString);
-            } catch (e) {
-              if (core.FormatException.is(e)) {
-                dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}, ` + dart.str`invalid port '${portString}'`));
-              } else
-                throw e;
-            }
-
-            this.proxies[dartx.add](new io._Proxy(host, port, username, password));
-          } else if (proxy[dartx.trim]() == io._ProxyConfiguration.DIRECT_PREFIX) {
-            this.proxies[dartx.add](new io._Proxy.direct());
-          } else {
-            dart.throw(new io.HttpException(dart.str`Invalid proxy configuration ${configuration}`));
-          }
-        }
-      }, StringToNull()));
-    }
-    direct() {
-      this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
-    }
-  };
-  dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
-  dart.setSignature(io._ProxyConfiguration, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._ProxyConfiguration, [core.String]),
-      direct: dart.definiteFunctionType(io._ProxyConfiguration, [])
-    }),
-    fields: () => ({proxies: ListOf_Proxy()}),
-    sfields: () => ({
-      PROXY_PREFIX: core.String,
-      DIRECT_PREFIX: core.String
-    })
-  });
-  io._ProxyConfiguration.PROXY_PREFIX = "PROXY ";
-  io._ProxyConfiguration.DIRECT_PREFIX = "DIRECT";
-  io._HttpConnectionInfo = class _HttpConnectionInfo extends core.Object {
-    new() {
-      this.remoteAddress = null;
-      this.remotePort = null;
-      this.localPort = null;
-    }
-    static create(socket) {
-      if (socket == null) return null;
-      try {
-        let info = new io._HttpConnectionInfo();
-        info.remoteAddress = socket.remoteAddress;
-        info.remotePort = socket.remotePort;
-        info.localPort = socket.port;
-        return info;
-      } catch (e) {
-      }
-
-      return null;
-    }
-  };
-  io._HttpConnectionInfo[dart.implements] = () => [io.HttpConnectionInfo];
-  dart.setSignature(io._HttpConnectionInfo, {
-    fields: () => ({
-      remoteAddress: io.InternetAddress,
-      remotePort: core.int,
-      localPort: core.int
-    }),
-    statics: () => ({create: dart.definiteFunctionType(io._HttpConnectionInfo, [io.Socket])}),
-    names: ['create']
-  });
-  io._DetachedSocket = class _DetachedSocket extends async.Stream$(core.List$(core.int)) {
-    new(socket, incoming) {
-      this[_socket] = socket;
-      this[_incoming] = incoming;
-      super.new();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get encoding() {
-      return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
-    }
-    set encoding(value) {
-      dart.dput(this[_socket], 'encoding', value);
-    }
-    write(obj) {
-      dart.dsend(this[_socket], 'write', obj);
-    }
-    writeln(obj) {
-      if (obj === void 0) obj = "";
-      dart.dsend(this[_socket], 'writeln', obj);
-    }
-    writeCharCode(charCode) {
-      dart.dsend(this[_socket], 'writeCharCode', charCode);
-    }
-    writeAll(objects, separator) {
-      if (separator === void 0) separator = "";
-      dart.dsend(this[_socket], 'writeAll', objects, separator);
-    }
-    add(bytes) {
-      dart.dsend(this[_socket], 'add', bytes);
-    }
-    addError(error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      return dart.dsend(this[_socket], 'addError', error, stackTrace);
-    }
-    addStream(stream) {
-      return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
-    }
-    destroy() {
-      dart.dsend(this[_socket], 'destroy');
-    }
-    flush() {
-      return async.Future._check(dart.dsend(this[_socket], 'flush'));
-    }
-    close() {
-      return async.Future._check(dart.dsend(this[_socket], 'close'));
-    }
-    get done() {
-      return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
-    }
-    get port() {
-      return core.int._check(dart.dload(this[_socket], 'port'));
-    }
-    get address() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
-    }
-    get remoteAddress() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
-    }
-    get remotePort() {
-      return core.int._check(dart.dload(this[_socket], 'remotePort'));
-    }
-    setOption(option, enabled) {
-      return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
-    }
-    [_toJSON$](ref) {
-      return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
-    }
-    set [_owner](owner) {
-      dart.dput(this[_socket], _owner, owner);
-    }
-  };
-  dart.addSimpleTypeTests(io._DetachedSocket);
-  io._DetachedSocket[dart.implements] = () => [io.Socket];
-  dart.setSignature(io._DetachedSocket, {
-    constructors: () => ({new: dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic, StreamOfListOfint()])}),
-    fields: () => ({
-      [_incoming]: StreamOfListOfint(),
-      [_socket]: dart.dynamic
-    }),
-    getters: () => ({
-      encoding: dart.definiteFunctionType(convert.Encoding, []),
-      done: dart.definiteFunctionType(async.Future$(io.Socket), []),
-      port: dart.definiteFunctionType(core.int, []),
-      address: dart.definiteFunctionType(io.InternetAddress, []),
-      remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
-      remotePort: dart.definiteFunctionType(core.int, [])
-    }),
-    setters: () => ({
-      encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
-      [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
-      destroy: dart.definiteFunctionType(dart.void, []),
-      flush: dart.definiteFunctionType(async.Future, []),
-      close: dart.definiteFunctionType(async.Future, []),
-      setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
-      [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
-    })
-  });
-  const _scheme = Symbol('_scheme');
-  io._AuthenticationScheme = class _AuthenticationScheme extends core.Object {
-    new(scheme) {
-      this[_scheme] = scheme;
-    }
-    static fromString(scheme) {
-      if (scheme[dartx.toLowerCase]() == "basic") return io._AuthenticationScheme.BASIC;
-      if (scheme[dartx.toLowerCase]() == "digest") return io._AuthenticationScheme.DIGEST;
-      return io._AuthenticationScheme.UNKNOWN;
-    }
-    toString() {
-      if (dart.equals(this, io._AuthenticationScheme.BASIC)) return "Basic";
-      if (dart.equals(this, io._AuthenticationScheme.DIGEST)) return "Digest";
-      return "Unknown";
-    }
-  };
-  dart.setSignature(io._AuthenticationScheme, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io._AuthenticationScheme, [core.int]),
-      fromString: dart.definiteFunctionType(io._AuthenticationScheme, [core.String])
-    }),
-    fields: () => ({[_scheme]: core.int}),
-    sfields: () => ({
-      UNKNOWN: io._AuthenticationScheme,
-      BASIC: io._AuthenticationScheme,
-      DIGEST: io._AuthenticationScheme
-    })
-  });
-  dart.defineLazy(io._AuthenticationScheme, {
-    get UNKNOWN() {
-      return dart.const(new io._AuthenticationScheme(-1));
-    },
-    get BASIC() {
-      return dart.const(new io._AuthenticationScheme(0));
-    },
-    get DIGEST() {
-      return dart.const(new io._AuthenticationScheme(1));
-    }
-  });
-  io._Credentials = class _Credentials extends core.Object {
-    new(credentials, realm) {
-      this.credentials = credentials;
-      this.realm = realm;
-      this.used = false;
-      this.ha1 = null;
-      this.nonce = null;
-      this.algorithm = null;
-      this.qop = null;
-      this.nonceCount = null;
-      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST)) {
-        let creds = io._HttpClientDigestCredentials._check(this.credentials);
-        let hasher = new io._MD5();
-        hasher.add(convert.UTF8.encode(creds.username));
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(this.realm[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(convert.UTF8.encode(creds.password));
-        this.ha1 = io._CryptoUtils.bytesToHex(hasher.close());
-      }
-    }
-    get scheme() {
-      return this.credentials.scheme;
-    }
-  };
-  dart.setSignature(io._Credentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io._Credentials, [io._HttpClientCredentials, core.String])}),
-    fields: () => ({
-      credentials: io._HttpClientCredentials,
-      realm: core.String,
-      used: core.bool,
-      ha1: core.String,
-      nonce: core.String,
-      algorithm: core.String,
-      qop: core.String,
-      nonceCount: core.int
-    }),
-    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])})
-  });
-  io._SiteCredentials = class _SiteCredentials extends io._Credentials {
-    new(uri, realm, creds) {
-      this.uri = uri;
-      super.new(creds, core.String._check(realm));
-    }
-    applies(uri, scheme) {
-      if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
-      if (uri.host != this.uri.host) return false;
-      let thisPort = this.uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
-      let otherPort = uri.port == 0 ? io.HttpClient.DEFAULT_HTTP_PORT : uri.port;
-      if (otherPort != thisPort) return false;
-      return uri.path[dartx.startsWith](this.uri.path);
-    }
-    authorize(request) {
-      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
-        return;
-      }
-      this.credentials.authorize(this, request);
-      this.used = true;
-    }
-  };
-  dart.setSignature(io._SiteCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io._SiteCredentials, [core.Uri, dart.dynamic, io._HttpClientCredentials])}),
-    fields: () => ({uri: core.Uri}),
-    methods: () => ({
-      applies: dart.definiteFunctionType(core.bool, [core.Uri, io._AuthenticationScheme]),
-      authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
-    })
-  });
-  io._ProxyCredentials = class _ProxyCredentials extends io._Credentials {
-    new(host, port, realm, creds) {
-      this.host = host;
-      this.port = port;
-      super.new(creds, core.String._check(realm));
-    }
-    applies(proxy, scheme) {
-      if (scheme != null && !dart.equals(this.credentials.scheme, scheme)) return false;
-      return proxy.host == this.host && proxy.port == this.port;
-    }
-    authorize(request) {
-      if (dart.equals(this.credentials.scheme, io._AuthenticationScheme.DIGEST) && this.nonce == null) {
-        return;
-      }
-      this.credentials.authorizeProxy(this, request);
-    }
-  };
-  dart.setSignature(io._ProxyCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ProxyCredentials, [core.String, core.int, dart.dynamic, io._HttpClientCredentials])}),
-    fields: () => ({
-      host: core.String,
-      port: core.int
-    }),
-    methods: () => ({
-      applies: dart.definiteFunctionType(core.bool, [io._Proxy, io._AuthenticationScheme]),
-      authorize: dart.definiteFunctionType(dart.void, [io.HttpClientRequest])
-    })
-  });
-  io._HttpClientCredentials = class _HttpClientCredentials extends core.Object {};
-  io._HttpClientCredentials[dart.implements] = () => [io.HttpClientCredentials];
-  io._HttpClientBasicCredentials = class _HttpClientBasicCredentials extends io._HttpClientCredentials {
-    new(username, password) {
-      this.username = username;
-      this.password = password;
-    }
-    get scheme() {
-      return io._AuthenticationScheme.BASIC;
-    }
-    authorization() {
-      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${this.username}:${this.password}`));
-      return dart.str`Basic ${auth}`;
-    }
-    authorize(_, request) {
-      request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization());
-    }
-    authorizeProxy(_, request) {
-      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization());
-    }
-  };
-  io._HttpClientBasicCredentials[dart.implements] = () => [io.HttpClientBasicCredentials];
-  dart.setSignature(io._HttpClientBasicCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientBasicCredentials, [core.String, core.String])}),
-    fields: () => ({
-      username: core.String,
-      password: core.String
-    }),
-    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
-    methods: () => ({
-      authorization: dart.definiteFunctionType(core.String, []),
-      authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
-      authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
-    })
-  });
-  io._HttpClientDigestCredentials = class _HttpClientDigestCredentials extends io._HttpClientCredentials {
-    new(username, password) {
-      this.username = username;
-      this.password = password;
-    }
-    get scheme() {
-      return io._AuthenticationScheme.DIGEST;
-    }
-    authorization(credentials, request) {
-      let requestUri = request[_requestUri]();
-      let hasher = new io._MD5();
-      hasher.add(request.method[dartx.codeUnits]);
-      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-      hasher.add(requestUri[dartx.codeUnits]);
-      let ha2 = io._CryptoUtils.bytesToHex(hasher.close());
-      let qop = null;
-      let cnonce = null;
-      let nc = null;
-      let x = null;
-      hasher = new io._MD5();
-      hasher.add(credentials.ha1[dartx.codeUnits]);
-      hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-      if (credentials.qop == "auth") {
-        qop = credentials.qop;
-        cnonce = io._CryptoUtils.bytesToHex(io._IOCrypto.getRandomBytes(4));
-        credentials.nonceCount = dart.notNull(credentials.nonceCount) + 1;
-        nc = credentials.nonceCount[dartx.toRadixString](16);
-        nc = dart.notNull("00000000"[dartx.substring](0, 8 - dart.notNull(nc[dartx.length]) + 1)) + dart.notNull(nc);
-        hasher.add(credentials.nonce[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(nc[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(cnonce[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(credentials.qop[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(ha2[dartx.codeUnits]);
-      } else {
-        hasher.add(credentials.nonce[dartx.codeUnits]);
-        hasher.add(JSArrayOfint().of([io._CharCode.COLON]));
-        hasher.add(ha2[dartx.codeUnits]);
-      }
-      let response = io._CryptoUtils.bytesToHex(hasher.close());
-      let buffer = new core.StringBuffer();
-      buffer.write('Digest ');
-      buffer.write(dart.str`username="${this.username}"`);
-      buffer.write(dart.str`, realm="${credentials.realm}"`);
-      buffer.write(dart.str`, nonce="${credentials.nonce}"`);
-      buffer.write(dart.str`, uri="${requestUri}"`);
-      buffer.write(dart.str`, algorithm="${credentials.algorithm}"`);
-      if (qop == "auth") {
-        buffer.write(dart.str`, qop="${qop}"`);
-        buffer.write(dart.str`, cnonce="${cnonce}"`);
-        buffer.write(dart.str`, nc="${nc}"`);
-      }
-      buffer.write(dart.str`, response="${response}"`);
-      return buffer.toString();
-    }
-    authorize(credentials, request) {
-      request.headers.set(io.HttpHeaders.AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
-    }
-    authorizeProxy(credentials, request) {
-      request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, this.authorization(credentials, io._HttpClientRequest._check(request)));
-    }
-  };
-  io._HttpClientDigestCredentials[dart.implements] = () => [io.HttpClientDigestCredentials];
-  dart.setSignature(io._HttpClientDigestCredentials, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpClientDigestCredentials, [core.String, core.String])}),
-    fields: () => ({
-      username: core.String,
-      password: core.String
-    }),
-    getters: () => ({scheme: dart.definiteFunctionType(io._AuthenticationScheme, [])}),
-    methods: () => ({
-      authorization: dart.definiteFunctionType(core.String, [io._Credentials, io._HttpClientRequest]),
-      authorize: dart.definiteFunctionType(dart.void, [io._Credentials, io.HttpClientRequest]),
-      authorizeProxy: dart.definiteFunctionType(dart.void, [io._ProxyCredentials, io.HttpClientRequest])
-    })
-  });
-  io._RedirectInfo = class _RedirectInfo extends core.Object {
-    new(statusCode, method, location) {
-      this.statusCode = statusCode;
-      this.method = method;
-      this.location = location;
-    }
-  };
-  io._RedirectInfo[dart.implements] = () => [io.RedirectInfo];
-  dart.setSignature(io._RedirectInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._RedirectInfo, [core.int, core.String, core.Uri])}),
-    fields: () => ({
-      statusCode: core.int,
-      method: core.String,
-      location: core.Uri
-    })
-  });
-  io._getHttpVersion = function() {
-    let version = io.Platform.version;
-    let index = version[dartx.indexOf]('.', dart.notNull(version[dartx.indexOf]('.')) + 1);
-    version = version[dartx.substring](0, index);
-    return dart.str`Dart/${version} (dart:io)`;
-  };
-  dart.fn(io._getHttpVersion, VoidToString$());
-  io._Const = class _Const extends core.Object {};
-  dart.setSignature(io._Const, {
-    sfields: () => ({
-      HTTP: ListOfint(),
-      HTTP1DOT: ListOfint(),
-      HTTP10: ListOfint(),
-      HTTP11: ListOfint(),
-      T: core.bool,
-      F: core.bool,
-      SEPARATOR_MAP: ListOfbool()
-    })
-  });
-  io._Const.HTTP = dart.constList([72, 84, 84, 80], core.int);
-  io._Const.HTTP1DOT = dart.constList([72, 84, 84, 80, 47, 49, 46], core.int);
-  io._Const.HTTP10 = dart.constList([72, 84, 84, 80, 47, 49, 46, 48], core.int);
-  io._Const.HTTP11 = dart.constList([72, 84, 84, 80, 47, 49, 46, 49], core.int);
-  io._Const.T = true;
-  io._Const.F = false;
-  dart.defineLazy(io._Const, {
-    get SEPARATOR_MAP() {
-      return dart.constList([io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.T, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.T, io._Const.F, io._Const.T, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F, io._Const.F], core.bool);
-    }
-  });
-  io._CharCode = class _CharCode extends core.Object {};
-  dart.setSignature(io._CharCode, {
-    sfields: () => ({
-      HT: core.int,
-      LF: core.int,
-      CR: core.int,
-      SP: core.int,
-      AMPERSAND: core.int,
-      COMMA: core.int,
-      DASH: core.int,
-      SLASH: core.int,
-      ZERO: core.int,
-      ONE: core.int,
-      COLON: core.int,
-      SEMI_COLON: core.int,
-      EQUAL: core.int
-    })
-  });
-  io._CharCode.HT = 9;
-  io._CharCode.LF = 10;
-  io._CharCode.CR = 13;
-  io._CharCode.SP = 32;
-  io._CharCode.AMPERSAND = 38;
-  io._CharCode.COMMA = 44;
-  io._CharCode.DASH = 45;
-  io._CharCode.SLASH = 47;
-  io._CharCode.ZERO = 48;
-  io._CharCode.ONE = 49;
-  io._CharCode.COLON = 58;
-  io._CharCode.SEMI_COLON = 59;
-  io._CharCode.EQUAL = 61;
-  io._State = class _State extends core.Object {};
-  dart.setSignature(io._State, {
-    sfields: () => ({
-      START: core.int,
-      METHOD_OR_RESPONSE_HTTP_VERSION: core.int,
-      RESPONSE_HTTP_VERSION: core.int,
-      REQUEST_LINE_METHOD: core.int,
-      REQUEST_LINE_URI: core.int,
-      REQUEST_LINE_HTTP_VERSION: core.int,
-      REQUEST_LINE_ENDING: core.int,
-      RESPONSE_LINE_STATUS_CODE: core.int,
-      RESPONSE_LINE_REASON_PHRASE: core.int,
-      RESPONSE_LINE_ENDING: core.int,
-      HEADER_START: core.int,
-      HEADER_FIELD: core.int,
-      HEADER_VALUE_START: core.int,
-      HEADER_VALUE: core.int,
-      HEADER_VALUE_FOLDING_OR_ENDING: core.int,
-      HEADER_VALUE_FOLD_OR_END: core.int,
-      HEADER_ENDING: core.int,
-      CHUNK_SIZE_STARTING_CR: core.int,
-      CHUNK_SIZE_STARTING_LF: core.int,
-      CHUNK_SIZE: core.int,
-      CHUNK_SIZE_EXTENSION: core.int,
-      CHUNK_SIZE_ENDING: core.int,
-      CHUNKED_BODY_DONE_CR: core.int,
-      CHUNKED_BODY_DONE_LF: core.int,
-      BODY: core.int,
-      CLOSED: core.int,
-      UPGRADED: core.int,
-      FAILURE: core.int,
-      FIRST_BODY_STATE: core.int
-    })
-  });
-  io._State.START = 0;
-  io._State.METHOD_OR_RESPONSE_HTTP_VERSION = 1;
-  io._State.RESPONSE_HTTP_VERSION = 2;
-  io._State.REQUEST_LINE_METHOD = 3;
-  io._State.REQUEST_LINE_URI = 4;
-  io._State.REQUEST_LINE_HTTP_VERSION = 5;
-  io._State.REQUEST_LINE_ENDING = 6;
-  io._State.RESPONSE_LINE_STATUS_CODE = 7;
-  io._State.RESPONSE_LINE_REASON_PHRASE = 8;
-  io._State.RESPONSE_LINE_ENDING = 9;
-  io._State.HEADER_START = 10;
-  io._State.HEADER_FIELD = 11;
-  io._State.HEADER_VALUE_START = 12;
-  io._State.HEADER_VALUE = 13;
-  io._State.HEADER_VALUE_FOLDING_OR_ENDING = 14;
-  io._State.HEADER_VALUE_FOLD_OR_END = 15;
-  io._State.HEADER_ENDING = 16;
-  io._State.CHUNK_SIZE_STARTING_CR = 17;
-  io._State.CHUNK_SIZE_STARTING_LF = 18;
-  io._State.CHUNK_SIZE = 19;
-  io._State.CHUNK_SIZE_EXTENSION = 20;
-  io._State.CHUNK_SIZE_ENDING = 21;
-  io._State.CHUNKED_BODY_DONE_CR = 22;
-  io._State.CHUNKED_BODY_DONE_LF = 23;
-  io._State.BODY = 24;
-  io._State.CLOSED = 25;
-  io._State.UPGRADED = 26;
-  io._State.FAILURE = 27;
-  dart.defineLazy(io._State, {
-    get FIRST_BODY_STATE() {
-      return io._State.CHUNK_SIZE_STARTING_CR;
-    }
-  });
-  io._HttpVersion = class _HttpVersion extends core.Object {};
-  dart.setSignature(io._HttpVersion, {
-    sfields: () => ({
-      UNDETERMINED: core.int,
-      HTTP10: core.int,
-      HTTP11: core.int
-    })
-  });
-  io._HttpVersion.UNDETERMINED = 0;
-  io._HttpVersion.HTTP10 = 1;
-  io._HttpVersion.HTTP11 = 2;
-  io._MessageType = class _MessageType extends core.Object {};
-  dart.setSignature(io._MessageType, {
-    sfields: () => ({
-      UNDETERMINED: core.int,
-      REQUEST: core.int,
-      RESPONSE: core.int
-    })
-  });
-  io._MessageType.UNDETERMINED = 0;
-  io._MessageType.REQUEST = 1;
-  io._MessageType.RESPONSE = 0;
-  const _injectData = Symbol('_injectData');
-  const _userOnData = Symbol('_userOnData');
-  const _isCanceled$ = Symbol('_isCanceled');
-  const _pauseCount$ = Symbol('_pauseCount');
-  const _scheduled = Symbol('_scheduled');
-  const _maybeScheduleData = Symbol('_maybeScheduleData');
-  io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
-    new(subscription, injectData, userOnData) {
-      this[_subscription$] = subscription;
-      this[_injectData] = injectData;
-      this[_userOnData] = userOnData;
-      this[_isCanceled$] = false;
-      this[_pauseCount$] = 1;
-      this[_scheduled] = false;
-    }
-    get isPaused() {
-      return this[_subscription$].isPaused;
-    }
-    asFuture(T) {
-      return futureValue => {
-        if (futureValue === void 0) futureValue = null;
-        return this[_subscription$].asFuture(T)(futureValue);
-      };
-    }
-    cancel() {
-      this[_isCanceled$] = true;
-      this[_injectData] = null;
-      return this[_subscription$].cancel();
-    }
-    onData(handleData) {
-      this[_userOnData] = handleData;
-      this[_subscription$].onData(handleData);
-    }
-    onDone(handleDone) {
-      this[_subscription$].onDone(handleDone);
-    }
-    onError(handleError) {
-      this[_subscription$].onError(handleError);
-    }
-    pause(resumeSignal) {
-      if (resumeSignal === void 0) resumeSignal = null;
-      if (this[_injectData] == null) {
-        this[_subscription$].pause(resumeSignal);
-      } else {
-        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
-        if (resumeSignal != null) {
-          resumeSignal.whenComplete(dart.bind(this, 'resume'));
-        }
-      }
-    }
-    resume() {
-      if (this[_injectData] == null) {
-        this[_subscription$].resume();
-      } else {
-        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
-        this[_maybeScheduleData]();
-      }
-    }
-    [_maybeScheduleData]() {
-      if (dart.test(this[_scheduled])) return;
-      if (this[_pauseCount$] != 0) return;
-      this[_scheduled] = true;
-      async.scheduleMicrotask(dart.fn(() => {
-        this[_scheduled] = false;
-        if (dart.notNull(this[_pauseCount$]) > 0 || dart.test(this[_isCanceled$])) return;
-        let data = this[_injectData];
-        this[_injectData] = null;
-        this[_subscription$].resume();
-        if (this[_userOnData] != null) {
-          dart.dcall(this[_userOnData], data);
-        }
-      }, VoidToNull()));
-    }
-  };
-  io._HttpDetachedStreamSubscription[dart.implements] = () => [StreamSubscriptionOfListOfint()];
-  dart.setSignature(io._HttpDetachedStreamSubscription, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
-    fields: () => ({
-      [_subscription$]: StreamSubscriptionOfListOfint(),
-      [_injectData]: ListOfint(),
-      [_isCanceled$]: core.bool,
-      [_pauseCount$]: core.int,
-      [_userOnData]: core.Function,
-      [_scheduled]: core.bool
-    }),
-    getters: () => ({isPaused: dart.definiteFunctionType(core.bool, [])}),
-    methods: () => ({
-      asFuture: dart.definiteFunctionType(T => [async.Future$(T), [], [T]]),
-      cancel: dart.definiteFunctionType(async.Future, []),
-      onData: dart.definiteFunctionType(dart.void, [ListOfintTovoid()]),
-      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-      onError: dart.definiteFunctionType(dart.void, [core.Function]),
-      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-      resume: dart.definiteFunctionType(dart.void, []),
-      [_maybeScheduleData]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  io._HttpDetachedIncoming = class _HttpDetachedIncoming extends async.Stream$(core.List$(core.int)) {
-    new(subscription, bufferedData) {
-      this.subscription = subscription;
-      this.bufferedData = bufferedData;
-      super.new();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      if (this.subscription != null) {
-        this.subscription.onData(onData);
-        this.subscription.onError(onError);
-        this.subscription.onDone(onDone);
-        if (this.bufferedData == null) {
-          return StreamSubscriptionOfListOfint()._check(((() => {
-            this.subscription.resume();
-            return this.subscription;
-          })()));
-        }
-        let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
-        _.resume();
-        return _;
-      } else {
-        return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-      }
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpDetachedIncoming);
-  dart.setSignature(io._HttpDetachedIncoming, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedIncoming, [async.StreamSubscription, ListOfint()])}),
-    fields: () => ({
-      subscription: async.StreamSubscription,
-      bufferedData: ListOfint()
-    }),
-    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-  });
-  const _method$ = Symbol('_method');
-  const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
-  const _headerField = Symbol('_headerField');
-  const _headerValue = Symbol('_headerValue');
-  const _requestParser = Symbol('_requestParser');
-  const _parserCalled = Symbol('_parserCalled');
-  const _index$2 = Symbol('_index');
-  const _httpVersionIndex = Symbol('_httpVersionIndex');
-  const _messageType = Symbol('_messageType');
-  const _statusCodeLength = Symbol('_statusCodeLength');
-  const _httpVersion = Symbol('_httpVersion');
-  const _connectionUpgrade = Symbol('_connectionUpgrade');
-  const _chunked = Symbol('_chunked');
-  const _noMessageBody = Symbol('_noMessageBody');
-  const _remainingContent = Symbol('_remainingContent');
-  const _socketSubscription = Symbol('_socketSubscription');
-  const _paused = Symbol('_paused');
-  const _bodyPaused = Symbol('_bodyPaused');
-  const _bodyController = Symbol('_bodyController');
-  const _pauseStateChanged = Symbol('_pauseStateChanged');
-  const _reset = Symbol('_reset');
-  const _onData$ = Symbol('_onData');
-  const _onDone$ = Symbol('_onDone');
-  const _doParse = Symbol('_doParse');
-  const _reportError = Symbol('_reportError');
-  const _createIncoming = Symbol('_createIncoming');
-  const _closeIncoming = Symbol('_closeIncoming');
-  const _headersEnd = Symbol('_headersEnd');
-  const _expect = Symbol('_expect');
-  const _caseInsensitiveCompare = Symbol('_caseInsensitiveCompare');
-  const _expectHexDigit = Symbol('_expectHexDigit');
-  const _releaseBuffer = Symbol('_releaseBuffer');
-  io._HttpParser = class _HttpParser extends async.Stream$(io._HttpIncoming) {
-    static requestParser() {
-      return new io._HttpParser._(true);
-    }
-    static responseParser() {
-      return new io._HttpParser._(false);
-    }
-    _(requestParser) {
-      this[_method$] = JSArrayOfint().of([]);
-      this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
-      this[_headerField] = JSArrayOfint().of([]);
-      this[_headerValue] = JSArrayOfint().of([]);
-      this[_requestParser] = requestParser;
-      this[_parserCalled] = false;
-      this[_buffer$] = null;
-      this[_index$2] = null;
-      this[_state$1] = null;
-      this[_httpVersionIndex] = null;
-      this[_messageType] = null;
-      this[_statusCode] = 0;
-      this[_statusCodeLength] = 0;
-      this[_httpVersion] = null;
-      this[_transferLength] = -1;
-      this[_persistentConnection] = null;
-      this[_connectionUpgrade] = null;
-      this[_chunked] = null;
-      this[_noMessageBody] = false;
-      this[_remainingContent] = -1;
-      this[_headers] = null;
-      this[_incoming] = null;
-      this[_socketSubscription] = null;
-      this[_paused] = true;
-      this[_bodyPaused] = false;
-      this[_controller$0] = null;
-      this[_bodyController] = null;
-      super.new();
-      this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
-          this[_paused] = false;
-        }, VoidToNull()), onPause: dart.fn(() => {
-          this[_paused] = true;
-          this[_pauseStateChanged]();
-        }, VoidToNull()), onResume: dart.fn(() => {
-          this[_paused] = false;
-          this[_pauseStateChanged]();
-        }, VoidToNull()), onCancel: dart.fn(() => {
-          if (this[_socketSubscription] != null) {
-            this[_socketSubscription].cancel();
-          }
-        }, VoidToNull())});
-      this[_reset]();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    listenToStream(stream) {
-      this[_socketSubscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this, _onDone$)});
-    }
-    [_parse]() {
-      try {
-        this[_doParse]();
-      } catch (e) {
-        let s = dart.stackTrace(e);
-        this[_state$1] = io._State.FAILURE;
-        this[_reportError](e, s);
-      }
-
-    }
-    [_headersEnd]() {
-      this[_headers][_mutable] = false;
-      this[_transferLength] = this[_headers].contentLength;
-      if (dart.test(this[_chunked])) this[_transferLength] = -1;
-      if (this[_messageType] == io._MessageType.REQUEST && dart.notNull(this[_transferLength]) < 0 && this[_chunked] == false) {
-        this[_transferLength] = 0;
-      }
-      if (dart.test(this[_connectionUpgrade])) {
-        this[_state$1] = io._State.UPGRADED;
-        this[_transferLength] = 0;
-      }
-      this[_createIncoming](this[_transferLength]);
-      if (dart.test(this[_requestParser])) {
-        this[_incoming].method = core.String.fromCharCodes(this[_method$]);
-        this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
-      } else {
-        this[_incoming].statusCode = this[_statusCode];
-        this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
-      }
-      this[_method$][dartx.clear]();
-      this[_uri_or_reason_phrase][dartx.clear]();
-      if (dart.test(this[_connectionUpgrade])) {
-        this[_incoming].upgraded = true;
-        this[_parserCalled] = false;
-        let tmp = this[_incoming];
-        this[_closeIncoming]();
-        this[_controller$0].add(tmp);
-        return true;
-      }
-      if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
-        this[_reset]();
-        let tmp = this[_incoming];
-        this[_closeIncoming]();
-        this[_controller$0].add(tmp);
-        return false;
-      } else if (dart.test(this[_chunked])) {
-        this[_state$1] = io._State.CHUNK_SIZE;
-        this[_remainingContent] = 0;
-      } else if (dart.notNull(this[_transferLength]) > 0) {
-        this[_remainingContent] = this[_transferLength];
-        this[_state$1] = io._State.BODY;
-      } else {
-        this[_state$1] = io._State.BODY;
-      }
-      this[_parserCalled] = false;
-      this[_controller$0].add(this[_incoming]);
-      return true;
-    }
-    [_doParse]() {
-      dart.assert(!dart.test(this[_parserCalled]));
-      this[_parserCalled] = true;
-      if (this[_state$1] == io._State.CLOSED) {
-        dart.throw(new io.HttpException("Data on closed connection"));
-      }
-      if (this[_state$1] == io._State.FAILURE) {
-        dart.throw(new io.HttpException("Data on failed connection"));
-      }
-      while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
-        if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
-          this[_parserCalled] = false;
-          return;
-        }
-        let byte = this[_buffer$][dartx._get]((() => {
-          let x = this[_index$2];
-          this[_index$2] = dart.notNull(x) + 1;
-          return x;
-        })());
-        switch (this[_state$1]) {
-          case io._State.START:
-          {
-            if (byte == io._Const.HTTP[dartx._get](0)) {
-              this[_httpVersionIndex] = 1;
-              this[_state$1] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
-            } else {
-              if (!dart.test(io._HttpParser._isTokenChar(byte))) {
-                dart.throw(new io.HttpException("Invalid request method"));
-              }
-              this[_method$][dartx.add](byte);
-              if (!dart.test(this[_requestParser])) {
-                dart.throw(new io.HttpException("Invalid response line"));
-              }
-              this[_state$1] = io._State.REQUEST_LINE_METHOD;
-            }
-            break;
-          }
-          case io._State.METHOD_OR_RESPONSE_HTTP_VERSION:
-          {
-            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP[dartx.length]) && byte == io._Const.HTTP[dartx._get](this[_httpVersionIndex])) {
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-            } else if (this[_httpVersionIndex] == io._Const.HTTP[dartx.length] && byte == io._CharCode.SLASH) {
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-              if (dart.test(this[_requestParser])) {
-                dart.throw(new io.HttpException("Invalid request line"));
-              }
-              this[_state$1] = io._State.RESPONSE_HTTP_VERSION;
-            } else {
-              for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
-                this[_method$][dartx.add](io._Const.HTTP[dartx._get](i));
-              }
-              if (byte == io._CharCode.SP) {
-                this[_state$1] = io._State.REQUEST_LINE_URI;
-              } else {
-                this[_method$][dartx.add](byte);
-                this[_httpVersion] = io._HttpVersion.UNDETERMINED;
-                if (!dart.test(this[_requestParser])) {
-                  dart.throw(new io.HttpException("Invalid response line"));
-                }
-                this[_state$1] = io._State.REQUEST_LINE_METHOD;
-              }
-            }
-            break;
-          }
-          case io._State.RESPONSE_HTTP_VERSION:
-          {
-            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
-              this[_expect](byte, io._Const.HTTP1DOT[dartx._get](this[_httpVersionIndex]));
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ONE) {
-              this[_httpVersion] = io._HttpVersion.HTTP11;
-              this[_persistentConnection] = true;
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length] && byte == io._CharCode.ZERO) {
-              this[_httpVersion] = io._HttpVersion.HTTP10;
-              this[_persistentConnection] = false;
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-            } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
-              this[_expect](byte, io._CharCode.SP);
-              this[_state$1] = io._State.RESPONSE_LINE_STATUS_CODE;
-            } else {
-              dart.throw(new io.HttpException("Invalid response line"));
-            }
-            break;
-          }
-          case io._State.REQUEST_LINE_METHOD:
-          {
-            if (byte == io._CharCode.SP) {
-              this[_state$1] = io._State.REQUEST_LINE_URI;
-            } else {
-              if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
-                dart.throw(new io.HttpException("Invalid request method"));
-              }
-              this[_method$][dartx.add](byte);
-            }
-            break;
-          }
-          case io._State.REQUEST_LINE_URI:
-          {
-            if (byte == io._CharCode.SP) {
-              if (this[_uri_or_reason_phrase][dartx.length] == 0) {
-                dart.throw(new io.HttpException("Invalid request URI"));
-              }
-              this[_state$1] = io._State.REQUEST_LINE_HTTP_VERSION;
-              this[_httpVersionIndex] = 0;
-            } else {
-              if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
-                dart.throw(new io.HttpException("Invalid request URI"));
-              }
-              this[_uri_or_reason_phrase][dartx.add](byte);
-            }
-            break;
-          }
-          case io._State.REQUEST_LINE_HTTP_VERSION:
-          {
-            if (dart.notNull(this[_httpVersionIndex]) < dart.notNull(io._Const.HTTP1DOT[dartx.length])) {
-              this[_expect](byte, io._Const.HTTP11[dartx._get](this[_httpVersionIndex]));
-              this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-            } else if (this[_httpVersionIndex] == io._Const.HTTP1DOT[dartx.length]) {
-              if (byte == io._CharCode.ONE) {
-                this[_httpVersion] = io._HttpVersion.HTTP11;
-                this[_persistentConnection] = true;
-                this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-              } else if (byte == io._CharCode.ZERO) {
-                this[_httpVersion] = io._HttpVersion.HTTP10;
-                this[_persistentConnection] = false;
-                this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
-              } else {
-                dart.throw(new io.HttpException("Invalid response line"));
-              }
-            } else {
-              if (byte == io._CharCode.CR) {
-                this[_state$1] = io._State.REQUEST_LINE_ENDING;
-              } else {
-                this[_expect](byte, io._CharCode.LF);
-                this[_messageType] = io._MessageType.REQUEST;
-                this[_state$1] = io._State.HEADER_START;
-              }
-            }
-            break;
-          }
-          case io._State.REQUEST_LINE_ENDING:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            this[_messageType] = io._MessageType.REQUEST;
-            this[_state$1] = io._State.HEADER_START;
-            break;
-          }
-          case io._State.RESPONSE_LINE_STATUS_CODE:
-          {
-            if (byte == io._CharCode.SP) {
-              this[_state$1] = io._State.RESPONSE_LINE_REASON_PHRASE;
-            } else if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.RESPONSE_LINE_ENDING;
-            } else {
-              this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
-              if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
-                dart.throw(new io.HttpException("Invalid response status code"));
-              } else {
-                this[_statusCode] = dart.notNull(this[_statusCode]) * 10 + dart.notNull(byte) - 48;
-              }
-            }
-            break;
-          }
-          case io._State.RESPONSE_LINE_REASON_PHRASE:
-          {
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.RESPONSE_LINE_ENDING;
-            } else {
-              if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
-                dart.throw(new io.HttpException("Invalid response reason phrase"));
-              }
-              this[_uri_or_reason_phrase][dartx.add](byte);
-            }
-            break;
-          }
-          case io._State.RESPONSE_LINE_ENDING:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            this[_messageType] == io._MessageType.RESPONSE;
-            if (dart.notNull(this[_statusCode]) < 100 || dart.notNull(this[_statusCode]) > 599) {
-              dart.throw(new io.HttpException("Invalid response status code"));
-            } else {
-              if (dart.notNull(this[_statusCode]) <= 199 || this[_statusCode] == 204 || this[_statusCode] == 304) {
-                this[_noMessageBody] = true;
-              }
-            }
-            this[_state$1] = io._State.HEADER_START;
-            break;
-          }
-          case io._State.HEADER_START:
-          {
-            this[_headers] = new io._HttpHeaders(this.version);
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.HEADER_ENDING;
-            } else if (byte == io._CharCode.LF) {
-              this[_state$1] = io._State.HEADER_ENDING;
-              this[_index$2] = dart.notNull(this[_index$2]) - 1;
-            } else {
-              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
-              this[_state$1] = io._State.HEADER_FIELD;
-            }
-            break;
-          }
-          case io._State.HEADER_FIELD:
-          {
-            if (byte == io._CharCode.COLON) {
-              this[_state$1] = io._State.HEADER_VALUE_START;
-            } else {
-              if (!dart.test(io._HttpParser._isTokenChar(byte))) {
-                dart.throw(new io.HttpException("Invalid header field name"));
-              }
-              this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
-            }
-            break;
-          }
-          case io._State.HEADER_VALUE_START:
-          {
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
-            } else if (byte == io._CharCode.LF) {
-              this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
-            } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
-              this[_headerValue][dartx.add](byte);
-              this[_state$1] = io._State.HEADER_VALUE;
-            }
-            break;
-          }
-          case io._State.HEADER_VALUE:
-          {
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
-            } else if (byte == io._CharCode.LF) {
-              this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
-            } else {
-              this[_headerValue][dartx.add](byte);
-            }
-            break;
-          }
-          case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
-            break;
-          }
-          case io._State.HEADER_VALUE_FOLD_OR_END:
-          {
-            if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
-              this[_state$1] = io._State.HEADER_VALUE_START;
-            } else {
-              let headerField = core.String.fromCharCodes(this[_headerField]);
-              let headerValue = core.String.fromCharCodes(this[_headerValue]);
-              if (headerField == "transfer-encoding" && dart.test(this[_caseInsensitiveCompare]("chunked"[dartx.codeUnits], this[_headerValue]))) {
-                this[_chunked] = true;
-              }
-              if (headerField == "connection") {
-                let tokens = io._HttpParser._tokenizeFieldValue(headerValue);
-                for (let i = 0; i < dart.notNull(tokens[dartx.length]); i++) {
-                  if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
-                    this[_connectionUpgrade] = true;
-                  }
-                  this[_headers][_add$2](headerField, tokens[dartx._get](i));
-                }
-              } else {
-                this[_headers][_add$2](headerField, headerValue);
-              }
-              this[_headerField][dartx.clear]();
-              this[_headerValue][dartx.clear]();
-              if (byte == io._CharCode.CR) {
-                this[_state$1] = io._State.HEADER_ENDING;
-              } else if (byte == io._CharCode.LF) {
-                this[_state$1] = io._State.HEADER_ENDING;
-                this[_index$2] = dart.notNull(this[_index$2]) - 1;
-              } else {
-                this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
-                this[_state$1] = io._State.HEADER_FIELD;
-              }
-            }
-            break;
-          }
-          case io._State.HEADER_ENDING:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            if (dart.test(this[_headersEnd]())) {
-              return;
-            } else {
-              break;
-            }
-            return;
-          }
-          case io._State.CHUNK_SIZE_STARTING_CR:
-          {
-            this[_expect](byte, io._CharCode.CR);
-            this[_state$1] = io._State.CHUNK_SIZE_STARTING_LF;
-            break;
-          }
-          case io._State.CHUNK_SIZE_STARTING_LF:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            this[_state$1] = io._State.CHUNK_SIZE;
-            break;
-          }
-          case io._State.CHUNK_SIZE:
-          {
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.CHUNK_SIZE_ENDING;
-            } else if (byte == io._CharCode.SEMI_COLON) {
-              this[_state$1] = io._State.CHUNK_SIZE_EXTENSION;
-            } else {
-              let value = this[_expectHexDigit](byte);
-              this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
-            }
-            break;
-          }
-          case io._State.CHUNK_SIZE_EXTENSION:
-          {
-            if (byte == io._CharCode.CR) {
-              this[_state$1] = io._State.CHUNK_SIZE_ENDING;
-            }
-            break;
-          }
-          case io._State.CHUNK_SIZE_ENDING:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            if (dart.notNull(this[_remainingContent]) > 0) {
-              this[_state$1] = io._State.BODY;
-            } else {
-              this[_state$1] = io._State.CHUNKED_BODY_DONE_CR;
-            }
-            break;
-          }
-          case io._State.CHUNKED_BODY_DONE_CR:
-          {
-            this[_expect](byte, io._CharCode.CR);
-            this[_state$1] = io._State.CHUNKED_BODY_DONE_LF;
-            break;
-          }
-          case io._State.CHUNKED_BODY_DONE_LF:
-          {
-            this[_expect](byte, io._CharCode.LF);
-            this[_reset]();
-            this[_closeIncoming]();
-            break;
-          }
-          case io._State.BODY:
-          {
-            this[_index$2] = dart.notNull(this[_index$2]) - 1;
-            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
-            if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
-              dataAvailable = this[_remainingContent];
-            }
-            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
-            this[_bodyController].add(data);
-            if (this[_remainingContent] != -1) {
-              this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
-            }
-            this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
-            if (this[_remainingContent] == 0) {
-              if (!dart.test(this[_chunked])) {
-                this[_reset]();
-                this[_closeIncoming]();
-              } else {
-                this[_state$1] = io._State.CHUNK_SIZE_STARTING_CR;
-              }
-            }
-            break;
-          }
-          case io._State.FAILURE:
-          {
-            dart.assert(false);
-            break;
-          }
-          default:
-          {
-            dart.assert(false);
-            break;
-          }
-        }
-      }
-      this[_parserCalled] = false;
-      if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
-        this[_releaseBuffer]();
-        if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
-          this[_socketSubscription].resume();
-        }
-      }
-    }
-    [_onData$](buffer) {
-      this[_socketSubscription].pause();
-      dart.assert(this[_buffer$] == null);
-      this[_buffer$] = typed_data.Uint8List._check(buffer);
-      this[_index$2] = 0;
-      this[_parse]();
-    }
-    [_onDone$]() {
-      this[_socketSubscription] = null;
-      if (this[_state$1] == io._State.CLOSED || this[_state$1] == io._State.FAILURE) return;
-      if (this[_incoming] != null) {
-        if (this[_state$1] != io._State.UPGRADED && !(this[_state$1] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
-          this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
-        }
-        this[_closeIncoming](true);
-        this[_controller$0].close();
-        return;
-      }
-      if (this[_state$1] == io._State.START) {
-        if (!dart.test(this[_requestParser])) {
-          this[_reportError](new io.HttpException("Connection closed before full header was received"));
-        }
-        this[_controller$0].close();
-        return;
-      }
-      if (this[_state$1] == io._State.UPGRADED) {
-        this[_controller$0].close();
-        return;
-      }
-      if (dart.notNull(this[_state$1]) < io._State.FIRST_BODY_STATE) {
-        this[_state$1] = io._State.FAILURE;
-        this[_reportError](new io.HttpException("Connection closed before full header was received"));
-        this[_controller$0].close();
-        return;
-      }
-      if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
-        this[_state$1] = io._State.CLOSED;
-      } else {
-        this[_state$1] = io._State.FAILURE;
-        this[_reportError](new io.HttpException("Connection closed before full body was received"));
-      }
-      this[_controller$0].close();
-    }
-    get version() {
-      switch (this[_httpVersion]) {
-        case io._HttpVersion.HTTP10:
-        {
-          return "1.0";
-        }
-        case io._HttpVersion.HTTP11:
-        {
-          return "1.1";
-        }
-      }
-      return null;
-    }
-    get messageType() {
-      return this[_messageType];
-    }
-    get transferLength() {
-      return this[_transferLength];
-    }
-    get upgrade() {
-      return dart.test(this[_connectionUpgrade]) && this[_state$1] == io._State.UPGRADED;
-    }
-    get persistentConnection() {
-      return this[_persistentConnection];
-    }
-    set isHead(value) {
-      if (dart.test(value)) this[_noMessageBody] = true;
-    }
-    detachIncoming() {
-      this[_state$1] = io._State.UPGRADED;
-      return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
-    }
-    readUnparsedData() {
-      if (this[_buffer$] == null) return null;
-      if (this[_index$2] == this[_buffer$][dartx.length]) return null;
-      let result = this[_buffer$][dartx.sublist](this[_index$2]);
-      this[_releaseBuffer]();
-      return result;
-    }
-    [_reset]() {
-      if (this[_state$1] == io._State.UPGRADED) return;
-      this[_state$1] = io._State.START;
-      this[_messageType] = io._MessageType.UNDETERMINED;
-      this[_headerField][dartx.clear]();
-      this[_headerValue][dartx.clear]();
-      this[_method$][dartx.clear]();
-      this[_uri_or_reason_phrase][dartx.clear]();
-      this[_statusCode] = 0;
-      this[_statusCodeLength] = 0;
-      this[_httpVersion] = io._HttpVersion.UNDETERMINED;
-      this[_transferLength] = -1;
-      this[_persistentConnection] = false;
-      this[_connectionUpgrade] = false;
-      this[_chunked] = false;
-      this[_noMessageBody] = false;
-      this[_remainingContent] = -1;
-      this[_headers] = null;
-    }
-    [_releaseBuffer]() {
-      this[_buffer$] = null;
-      this[_index$2] = null;
-    }
-    static _isTokenChar(byte) {
-      return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
-    }
-    static _isValueChar(byte) {
-      return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 || byte == io._CharCode.SP || byte == io._CharCode.HT;
-    }
-    static _tokenizeFieldValue(headerValue) {
-      let tokens = ListOfString().new();
-      let start = 0;
-      let index = 0;
-      while (index < dart.notNull(headerValue[dartx.length])) {
-        if (headerValue[dartx._get](index) == ",") {
-          tokens[dartx.add](headerValue[dartx.substring](start, index));
-          start = index + 1;
-        } else if (headerValue[dartx._get](index) == " " || headerValue[dartx._get](index) == "\t") {
-          start++;
-        }
-        index++;
-      }
-      tokens[dartx.add](headerValue[dartx.substring](start, index));
-      return tokens;
-    }
-    static _toLowerCaseByte(x) {
-      return (dart.notNull(x) - 65 & 127) < 26 ? (dart.notNull(x) | 32) >>> 0 : x;
-    }
-    [_caseInsensitiveCompare](expected, value) {
-      if (expected[dartx.length] != value[dartx.length]) return false;
-      for (let i = 0; i < dart.notNull(expected[dartx.length]); i++) {
-        if (expected[dartx._get](i) != io._HttpParser._toLowerCaseByte(value[dartx._get](i))) return false;
-      }
-      return true;
-    }
-    [_expect](val1, val2) {
-      if (val1 != val2) {
-        dart.throw(new io.HttpException("Failed to parse HTTP"));
-      }
-    }
-    [_expectHexDigit](byte) {
-      if (48 <= dart.notNull(byte) && dart.notNull(byte) <= 57) {
-        return dart.notNull(byte) - 48;
-      } else if (65 <= dart.notNull(byte) && dart.notNull(byte) <= 70) {
-        return dart.notNull(byte) - 65 + 10;
-      } else if (97 <= dart.notNull(byte) && dart.notNull(byte) <= 102) {
-        return dart.notNull(byte) - 97 + 10;
-      } else {
-        dart.throw(new io.HttpException("Failed to parse HTTP"));
-      }
-    }
-    [_createIncoming](transferLength) {
-      dart.assert(this[_incoming] == null);
-      dart.assert(this[_bodyController] == null);
-      dart.assert(!dart.test(this[_bodyPaused]));
-      let incoming = null;
-      this[_bodyController] = StreamControllerOfListOfint().new({sync: true, onListen: dart.fn(() => {
-          if (!dart.equals(incoming, this[_incoming])) return;
-          dart.assert(this[_bodyPaused]);
-          this[_bodyPaused] = false;
-          this[_pauseStateChanged]();
-        }, VoidToNull()), onPause: dart.fn(() => {
-          if (!dart.equals(incoming, this[_incoming])) return;
-          dart.assert(!dart.test(this[_bodyPaused]));
-          this[_bodyPaused] = true;
-          this[_pauseStateChanged]();
-        }, VoidToNull()), onResume: dart.fn(() => {
-          if (!dart.equals(incoming, this[_incoming])) return;
-          dart.assert(this[_bodyPaused]);
-          this[_bodyPaused] = false;
-          this[_pauseStateChanged]();
-        }, VoidToNull()), onCancel: dart.fn(() => {
-          if (!dart.equals(incoming, this[_incoming])) return;
-          if (this[_socketSubscription] != null) {
-            this[_socketSubscription].cancel();
-          }
-          this[_closeIncoming](true);
-          this[_controller$0].close();
-        }, VoidToNull())});
-      incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
-      this[_bodyPaused] = true;
-      this[_pauseStateChanged]();
-    }
-    [_closeIncoming](closing) {
-      if (closing === void 0) closing = false;
-      if (this[_incoming] == null) return;
-      let tmp = this[_incoming];
-      tmp.close(closing);
-      this[_incoming] = null;
-      if (this[_bodyController] != null) {
-        this[_bodyController].close();
-        this[_bodyController] = null;
-      }
-      this[_bodyPaused] = false;
-      this[_pauseStateChanged]();
-    }
-    [_pauseStateChanged]() {
-      if (this[_incoming] != null) {
-        if (!dart.test(this[_bodyPaused]) && !dart.test(this[_parserCalled])) {
-          this[_parse]();
-        }
-      } else {
-        if (!dart.test(this[_paused]) && !dart.test(this[_parserCalled])) {
-          this[_parse]();
-        }
-      }
-    }
-    [_reportError](error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
-      this[_state$1] = io._State.FAILURE;
-      this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
-      this[_controller$0].close();
-    }
-  };
-  dart.addSimpleTypeTests(io._HttpParser);
-  dart.defineNamedConstructor(io._HttpParser, '_');
-  dart.setSignature(io._HttpParser, {
-    constructors: () => ({
-      requestParser: dart.definiteFunctionType(io._HttpParser, []),
-      responseParser: dart.definiteFunctionType(io._HttpParser, []),
-      _: dart.definiteFunctionType(io._HttpParser, [core.bool])
-    }),
-    fields: () => ({
-      [_parserCalled]: core.bool,
-      [_buffer$]: typed_data.Uint8List,
-      [_index$2]: core.int,
-      [_requestParser]: core.bool,
-      [_state$1]: core.int,
-      [_httpVersionIndex]: core.int,
-      [_messageType]: core.int,
-      [_statusCode]: core.int,
-      [_statusCodeLength]: core.int,
-      [_method$]: ListOfint(),
-      [_uri_or_reason_phrase]: ListOfint(),
-      [_headerField]: ListOfint(),
-      [_headerValue]: ListOfint(),
-      [_httpVersion]: core.int,
-      [_transferLength]: core.int,
-      [_persistentConnection]: core.bool,
-      [_connectionUpgrade]: core.bool,
-      [_chunked]: core.bool,
-      [_noMessageBody]: core.bool,
-      [_remainingContent]: core.int,
-      [_headers]: io._HttpHeaders,
-      [_incoming]: io._HttpIncoming,
-      [_socketSubscription]: async.StreamSubscription,
-      [_paused]: core.bool,
-      [_bodyPaused]: core.bool,
-      [_controller$0]: StreamControllerOf_HttpIncoming(),
-      [_bodyController]: StreamControllerOfListOfint()
-    }),
-    getters: () => ({
-      version: dart.definiteFunctionType(core.String, []),
-      messageType: dart.definiteFunctionType(core.int, []),
-      transferLength: dart.definiteFunctionType(core.int, []),
-      upgrade: dart.definiteFunctionType(core.bool, []),
-      persistentConnection: dart.definiteFunctionType(core.bool, [])
-    }),
-    setters: () => ({isHead: dart.definiteFunctionType(dart.void, [core.bool])}),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(io._HttpIncoming), [_HttpIncomingTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      listenToStream: dart.definiteFunctionType(dart.void, [StreamOfListOfint()]),
-      [_parse]: dart.definiteFunctionType(dart.void, []),
-      [_headersEnd]: dart.definiteFunctionType(core.bool, []),
-      [_doParse]: dart.definiteFunctionType(dart.void, []),
-      [_onData$]: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      [_onDone$]: dart.definiteFunctionType(dart.void, []),
-      detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
-      readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
-      [_reset]: dart.definiteFunctionType(dart.void, []),
-      [_releaseBuffer]: dart.definiteFunctionType(dart.void, []),
-      [_caseInsensitiveCompare]: dart.definiteFunctionType(core.bool, [ListOfint(), ListOfint()]),
-      [_expect]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [_expectHexDigit]: dart.definiteFunctionType(core.int, [core.int]),
-      [_createIncoming]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_closeIncoming]: dart.definiteFunctionType(dart.void, [], [core.bool]),
-      [_pauseStateChanged]: dart.definiteFunctionType(dart.void, []),
-      [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [dart.dynamic])
-    }),
-    statics: () => ({
-      _isTokenChar: dart.definiteFunctionType(core.bool, [core.int]),
-      _isValueChar: dart.definiteFunctionType(core.bool, [core.int]),
-      _tokenizeFieldValue: dart.definiteFunctionType(core.List$(core.String), [core.String]),
-      _toLowerCaseByte: dart.definiteFunctionType(core.int, [core.int])
-    }),
-    names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
-  });
-  io._DART_SESSION_ID = "DARTSESSID";
-  const _data$ = Symbol('_data');
-  const _lastSeen = Symbol('_lastSeen');
-  const _timeoutCallback = Symbol('_timeoutCallback');
-  const _prev = Symbol('_prev');
-  const _next$1 = Symbol('_next');
-  const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
-  const _sessions = Symbol('_sessions');
-  const _bumpToEnd = Symbol('_bumpToEnd');
-  io._HttpSession = class _HttpSession extends core.Object {
-    new(sessionManager, id) {
-      this[_data$] = collection.HashMap.new();
-      this[_sessionManager] = sessionManager;
-      this.id = id;
-      this[_lastSeen] = new core.DateTime.now();
-      this[_destroyed] = false;
-      this[_isNew] = true;
-      this[_timeoutCallback] = null;
-      this[_prev] = null;
-      this[_next$1] = null;
-    }
-    destroy() {
-      this[_destroyed] = true;
-      this[_sessionManager][_removeFromTimeoutQueue](this);
-      this[_sessionManager][_sessions][dartx.remove](this.id);
-    }
-    [_markSeen]() {
-      this[_lastSeen] = new core.DateTime.now();
-      this[_sessionManager][_bumpToEnd](this);
-    }
-    get lastSeen() {
-      return this[_lastSeen];
-    }
-    get isNew() {
-      return this[_isNew];
-    }
-    set onTimeout(callback) {
-      this[_timeoutCallback] = callback;
-    }
-    containsValue(value) {
-      return this[_data$][dartx.containsValue](value);
+      this[_map$1] = MapOfString$V().new();
     }
     containsKey(key) {
-      return this[_data$][dartx.containsKey](key);
+      return typeof key == 'string' && dart.test(this[_map$1][dartx.containsKey](key[dartx.toUpperCase]()));
+    }
+    containsValue(value) {
+      return this[_map$1][dartx.containsValue](value);
     }
     _get(key) {
-      return this[_data$][dartx._get](key);
+      return typeof key == 'string' ? this[_map$1][dartx._get](key[dartx.toUpperCase]()) : null;
     }
     _set(key, value) {
-      this[_data$][dartx._set](key, value);
+      V._check(value);
+      this[_map$1][dartx._set](key[dartx.toUpperCase](), value);
       return value;
     }
     putIfAbsent(key, ifAbsent) {
-      return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+      VoidToV()._check(ifAbsent);
+      return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
     }
     addAll(other) {
-      return this[_data$][dartx.addAll](other);
+      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
     }
     remove(key) {
-      return this[_data$][dartx.remove](key);
+      return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
     }
     clear() {
-      this[_data$][dartx.clear]();
+      this[_map$1][dartx.clear]();
     }
     forEach(f) {
-      this[_data$][dartx.forEach](f);
+      this[_map$1][dartx.forEach](f);
     }
     get keys() {
-      return this[_data$][dartx.keys];
+      return this[_map$1][dartx.keys];
     }
     get values() {
-      return this[_data$][dartx.values];
+      return this[_map$1][dartx.values];
     }
     get length() {
-      return this[_data$][dartx.length];
+      return this[_map$1][dartx.length];
     }
     get isEmpty() {
-      return this[_data$][dartx.isEmpty];
+      return this[_map$1][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_data$][dartx.isNotEmpty];
+      return this[_map$1][dartx.isNotEmpty];
     }
     toString() {
-      return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+      return dart.toString(this[_map$1]);
     }
-  };
-  io._HttpSession[dart.implements] = () => [io.HttpSession];
-  dart.setSignature(io._HttpSession, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpSession, [io._HttpSessionManager, core.String])}),
-    fields: () => ({
-      [_destroyed]: core.bool,
-      [_isNew]: core.bool,
-      [_lastSeen]: core.DateTime,
-      [_timeoutCallback]: core.Function,
-      [_sessionManager]: io._HttpSessionManager,
-      [_prev]: io._HttpSession,
-      [_next$1]: io._HttpSession,
-      id: core.String,
-      [_data$]: core.Map
-    }),
+  }
+  dart.addTypeTests(_CaseInsensitiveStringMap);
+  _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
+  dart.setSignature(_CaseInsensitiveStringMap, {
+    fields: () => ({[_map$1]: MapOfString$V()}),
     getters: () => ({
-      lastSeen: dart.definiteFunctionType(core.DateTime, []),
-      isNew: dart.definiteFunctionType(core.bool, []),
-      keys: dart.definiteFunctionType(core.Iterable, []),
-      values: dart.definiteFunctionType(core.Iterable, []),
+      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
+      values: dart.definiteFunctionType(core.Iterable$(V), []),
       length: dart.definiteFunctionType(core.int, []),
       isEmpty: dart.definiteFunctionType(core.bool, []),
       isNotEmpty: dart.definiteFunctionType(core.bool, [])
     }),
-    setters: () => ({onTimeout: dart.definiteFunctionType(dart.void, [VoidTovoid()])}),
     methods: () => ({
-      destroy: dart.definiteFunctionType(dart.void, []),
-      [_markSeen]: dart.definiteFunctionType(dart.void, []),
-      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
       containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
-      _set: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      putIfAbsent: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, VoidTodynamic()]),
+      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+      _get: dart.definiteFunctionType(V, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [core.String, V]),
+      putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
       addAll: dart.definiteFunctionType(dart.void, [core.Map]),
-      remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+      remove: dart.definiteFunctionType(V, [core.Object]),
       clear: dart.definiteFunctionType(dart.void, []),
-      forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()])
+      forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
     })
   });
-  dart.defineExtensionMembers(io._HttpSession, [
-    'containsValue',
+  dart.defineExtensionMembers(_CaseInsensitiveStringMap, [
     'containsKey',
+    'containsValue',
     '_get',
     '_set',
     'putIfAbsent',
@@ -47380,3987 +48401,2942 @@
     'isEmpty',
     'isNotEmpty'
   ]);
-  const _sessionTimeout = Symbol('_sessionTimeout');
-  const _head$ = Symbol('_head');
-  const _tail$ = Symbol('_tail');
-  const _timer = Symbol('_timer');
-  const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
-  const _stopTimer = Symbol('_stopTimer');
-  const _startTimer = Symbol('_startTimer');
-  const _timerTimeout = Symbol('_timerTimeout');
-  io._HttpSessionManager = class _HttpSessionManager extends core.Object {
-    new() {
-      this[_sessions] = dart.map({}, core.String, io._HttpSession);
-      this[_sessionTimeout] = 20 * 60;
-      this[_head$] = null;
-      this[_tail$] = null;
-      this[_timer] = null;
-    }
-    createSessionId() {
-      let _KEY_LENGTH = 16;
-      let data = io._IOCrypto.getRandomBytes(_KEY_LENGTH);
-      return io._CryptoUtils.bytesToHex(data);
-    }
-    getSession(id) {
-      return this[_sessions][dartx._get](id);
-    }
-    createSession() {
-      let id = this.createSessionId();
-      while (dart.test(this[_sessions][dartx.containsKey](id))) {
-        id = this.createSessionId();
-      }
-      let session = this[_sessions][dartx._set](id, new io._HttpSession(this, id));
-      this[_addToTimeoutQueue](session);
-      return session;
-    }
-    set sessionTimeout(timeout) {
-      this[_sessionTimeout] = timeout;
-      this[_stopTimer]();
-      this[_startTimer]();
-    }
-    close() {
-      this[_stopTimer]();
-    }
-    [_bumpToEnd](session) {
-      this[_removeFromTimeoutQueue](session);
-      this[_addToTimeoutQueue](session);
-    }
-    [_addToTimeoutQueue](session) {
-      if (this[_head$] == null) {
-        dart.assert(this[_tail$] == null);
-        this[_tail$] = this[_head$] = session;
-        this[_startTimer]();
-      } else {
-        dart.assert(this[_timer] != null);
-        dart.assert(this[_tail$] != null);
-        this[_tail$][_next$1] = session;
-        session[_prev] = this[_tail$];
-        this[_tail$] = session;
-      }
-    }
-    [_removeFromTimeoutQueue](session) {
-      if (session[_next$1] != null) {
-        session[_next$1][_prev] = session[_prev];
-      }
-      if (session[_prev] != null) {
-        session[_prev][_next$1] = session[_next$1];
-      }
-      if (dart.equals(this[_head$], session)) {
-        this[_head$] = session[_next$1];
-        this[_stopTimer]();
-        this[_startTimer]();
-      }
-      if (dart.equals(this[_tail$], session)) {
-        this[_tail$] = session[_prev];
-      }
-      session[_next$1] = session[_prev] = null;
-    }
-    [_timerTimeout]() {
-      this[_stopTimer]();
-      dart.assert(this[_head$] != null);
-      let session = this[_head$];
-      session.destroy();
-      if (session[_timeoutCallback] != null) {
-        dart.dsend(session, _timeoutCallback);
-      }
-    }
-    [_startTimer]() {
-      dart.assert(this[_timer] == null);
-      if (this[_head$] != null) {
-        let seconds = new core.DateTime.now().difference(this[_head$].lastSeen).inSeconds;
-        this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
-      }
-    }
-    [_stopTimer]() {
-      if (this[_timer] != null) {
-        this[_timer].cancel();
-        this[_timer] = null;
-      }
-    }
-  };
-  dart.setSignature(io._HttpSessionManager, {
-    constructors: () => ({new: dart.definiteFunctionType(io._HttpSessionManager, [])}),
-    fields: () => ({
-      [_sessions]: MapOfString$_HttpSession(),
-      [_sessionTimeout]: core.int,
-      [_head$]: io._HttpSession,
-      [_tail$]: io._HttpSession,
-      [_timer]: async.Timer
-    }),
-    setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      createSessionId: dart.definiteFunctionType(core.String, []),
-      getSession: dart.definiteFunctionType(io._HttpSession, [core.String]),
-      createSession: dart.definiteFunctionType(io._HttpSession, []),
-      close: dart.definiteFunctionType(dart.void, []),
-      [_bumpToEnd]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
-      [_addToTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
-      [_removeFromTimeoutQueue]: dart.definiteFunctionType(dart.void, [io._HttpSession]),
-      [_timerTimeout]: dart.definiteFunctionType(dart.void, []),
-      [_startTimer]: dart.definiteFunctionType(dart.void, []),
-      [_stopTimer]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  io._IOResourceInfo = class _IOResourceInfo extends core.Object {
-    static get timestamp() {
-      return dart.notNull(io._IOResourceInfo._startTime) + dart.notNull(io._IOResourceInfo._sw.elapsedMicroseconds) / 1000;
-    }
-    new(type) {
-      this.type = type;
-      this.id = io._IOResourceInfo.getNextID();
-    }
-    get referenceValueMap() {
-      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
-    }
-    static getNextID() {
-      return (() => {
-        let x = io._IOResourceInfo._count;
-        io._IOResourceInfo._count = dart.notNull(x) + 1;
-        return x;
-      })();
-    }
-  };
-  dart.setSignature(io._IOResourceInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._IOResourceInfo, [core.String])}),
-    fields: () => ({
-      type: core.String,
-      id: core.int
-    }),
-    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
-    sfields: () => ({
-      _count: core.int,
-      _sw: core.Stopwatch,
-      _startTime: core.int
-    }),
-    sgetters: () => ({timestamp: dart.definiteFunctionType(core.double, [])}),
-    statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
-    names: ['getNextID']
-  });
-  io._IOResourceInfo._count = 0;
-  dart.defineLazy(io._IOResourceInfo, {
-    get _sw() {
-      return (() => {
-        let _ = new core.Stopwatch();
-        _.start();
-        return _;
-      })();
-    },
-    get _startTime() {
-      return new core.DateTime.now().millisecondsSinceEpoch;
-    }
-  });
-  io._ReadWriteResourceInfo = class _ReadWriteResourceInfo extends io._IOResourceInfo {
-    addRead(bytes) {
-      this.totalRead = dart.notNull(this.totalRead) + dart.notNull(bytes);
-      this.readCount = dart.notNull(this.readCount) + 1;
-      this.lastRead = io._IOResourceInfo.timestamp;
-    }
-    didRead() {
-      this.addRead(0);
-    }
-    addWrite(bytes) {
-      this.totalWritten = dart.notNull(this.totalWritten) + dart.notNull(bytes);
-      this.writeCount = dart.notNull(this.writeCount) + 1;
-      this.lastWrite = io._IOResourceInfo.timestamp;
-    }
-    new(type) {
-      this.totalRead = 0;
-      this.totalWritten = 0;
-      this.readCount = 0;
-      this.writeCount = 0;
-      this.lastRead = 0.0;
-      this.lastWrite = 0.0;
-      super.new(type);
-    }
-    get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
-    }
-  };
-  dart.setSignature(io._ReadWriteResourceInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ReadWriteResourceInfo, [core.String])}),
-    fields: () => ({
-      totalRead: core.int,
-      totalWritten: core.int,
-      readCount: core.int,
-      writeCount: core.int,
-      lastRead: core.double,
-      lastWrite: core.double
-    }),
-    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
-    methods: () => ({
-      addRead: dart.definiteFunctionType(dart.void, [core.int]),
-      didRead: dart.definiteFunctionType(dart.void, []),
-      addWrite: dart.definiteFunctionType(dart.void, [core.int])
-    })
-  });
-  io._FileResourceInfo = class _FileResourceInfo extends io._ReadWriteResourceInfo {
-    new(file) {
-      this.file = file;
-      super.new(io._FileResourceInfo.TYPE);
-      io._FileResourceInfo.FileOpened(this);
-    }
-    static FileOpened(info) {
-      dart.assert(!dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](info.id)));
-      io._FileResourceInfo.openFiles[dartx._set](info.id, info);
-    }
-    static FileClosed(info) {
-      dart.assert(io._FileResourceInfo.openFiles[dartx.containsKey](info.id));
-      io._FileResourceInfo.openFiles[dartx.remove](info.id);
-    }
-    static getOpenFilesList() {
-      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
-    }
-    static getOpenFiles(func, params) {
-      dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
-      let data = dart.map({type: '_openfiles', data: io._FileResourceInfo.getOpenFilesList()}, core.String, core.Object);
-      let json = convert.JSON.encode(data);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-    getFileInfoMap() {
-      let result = this.fullValueMap;
-      return result;
-    }
-    static getFileInfoMapByID(func, params) {
-      dart.assert(dart.dsend(params, 'containsKey', 'id'));
-      let id = core.int.parse(core.String._check(dart.dindex(params, 'id')));
-      let result = dart.test(io._FileResourceInfo.openFiles[dartx.containsKey](id)) ? io._FileResourceInfo.openFiles[dartx._get](id).getFileInfoMap() : dart.map();
-      let json = convert.JSON.encode(result);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-    get name() {
-      return dart.str`${dart.dload(this.file, 'path')}`;
-    }
-  };
-  dart.setSignature(io._FileResourceInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._FileResourceInfo, [dart.dynamic])}),
-    fields: () => ({file: dart.dynamic}),
-    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
-    sfields: () => ({
-      TYPE: core.String,
-      openFiles: MapOfint$_FileResourceInfo()
-    }),
-    statics: () => ({
-      FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
-      FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
-      getOpenFilesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
-      getOpenFiles: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
-      getFileInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic])
-    }),
-    names: ['FileOpened', 'FileClosed', 'getOpenFilesList', 'getOpenFiles', 'getFileInfoMapByID']
-  });
-  io._FileResourceInfo.TYPE = '_file';
-  dart.defineLazy(io._FileResourceInfo, {
-    get openFiles() {
-      return MapOfint$_FileResourceInfo().new();
-    },
-    set openFiles(_) {}
-  });
-  const _arguments$0 = Symbol('_arguments');
-  const _workingDirectory = Symbol('_workingDirectory');
-  io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
-    new(process) {
-      this.process = process;
-      this.startedAt = io._IOResourceInfo.timestamp;
-      super.new(io._ProcessResourceInfo.TYPE);
-      io._ProcessResourceInfo.ProcessStarted(this);
-    }
-    get name() {
-      return core.String._check(dart.dload(this.process, _path$));
-    }
-    stopped() {
-      io._ProcessResourceInfo.ProcessStopped(this);
-    }
-    get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
-    }
-    static ProcessStarted(info) {
-      dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
-      io._ProcessResourceInfo.startedProcesses[dartx._set](info.id, info);
-    }
-    static ProcessStopped(info) {
-      dart.assert(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id));
-      io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
-    }
-    static getStartedProcessesList() {
-      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
-    }
-    static getStartedProcesses(func, params) {
-      dart.assert(func == 'ext.dart.io.getProcesses');
-      let data = dart.map({type: '_startedprocesses', data: io._ProcessResourceInfo.getStartedProcessesList()}, core.String, core.Object);
-      let json = convert.JSON.encode(data);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-    static getProcessInfoMapById(func, params) {
-      let id = core.int.parse(params[dartx._get]('id'));
-      let result = dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](id)) ? io._ProcessResourceInfo.startedProcesses[dartx._get](id).fullValueMap : dart.map();
-      let json = convert.JSON.encode(result);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-  };
-  dart.setSignature(io._ProcessResourceInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ProcessResourceInfo, [dart.dynamic])}),
-    fields: () => ({
-      process: dart.dynamic,
-      startedAt: core.double
-    }),
-    getters: () => ({
-      name: dart.definiteFunctionType(core.String, []),
-      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
-    }),
-    methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
-    sfields: () => ({
-      TYPE: core.String,
-      startedProcesses: MapOfint$_ProcessResourceInfo()
-    }),
-    statics: () => ({
-      ProcessStarted: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
-      ProcessStopped: dart.definiteFunctionType(dart.dynamic, [io._ProcessResourceInfo]),
-      getStartedProcessesList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
-      getStartedProcesses: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
-      getProcessInfoMapById: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()])
-    }),
-    names: ['ProcessStarted', 'ProcessStopped', 'getStartedProcessesList', 'getStartedProcesses', 'getProcessInfoMapById']
-  });
-  io._ProcessResourceInfo.TYPE = '_process';
-  dart.defineLazy(io._ProcessResourceInfo, {
-    get startedProcesses() {
-      return MapOfint$_ProcessResourceInfo().new();
-    },
-    set startedProcesses(_) {}
-  });
-  io._SocketResourceInfo = class _SocketResourceInfo extends io._ReadWriteResourceInfo {
-    new(socket) {
-      this.socket = socket;
-      super.new(io._SocketResourceInfo.TYPE);
-      io._SocketResourceInfo.SocketOpened(this);
-    }
-    get name() {
-      if (dart.test(dart.dload(this.socket, 'isListening'))) {
-        return dart.str`listening:${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}`;
-      }
-      let remote = '';
-      try {
-        let remoteHost = dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host');
-        let remotePort = dart.dload(this.socket, 'remotePort');
-        remote = dart.str` -> ${remoteHost}:${remotePort}`;
-      } catch (e) {
-      }
-
-      return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
-    }
-    static getOpenSocketsList() {
-      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
-    }
-    getSocketInfoMap() {
-      let result = this.fullValueMap;
-      result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
-      result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
-      result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
-      result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
-      if (!dart.test(dart.dload(this.socket, 'isListening'))) {
-        try {
-          result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
-          result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
-        } catch (e) {
-          result[dartx._set]('remotePort', 'NA');
-          result[dartx._set]('remoteHost', 'NA');
-        }
-
-      } else {
-        result[dartx._set]('remotePort', 'NA');
-        result[dartx._set]('remoteHost', 'NA');
-      }
-      result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
-      return result;
-    }
-    static getSocketInfoMapByID(func, params) {
-      dart.assert(params[dartx.containsKey]('id'));
-      let id = core.int.parse(params[dartx._get]('id'));
-      let result = dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](id)) ? io._SocketResourceInfo.openSockets[dartx._get](id).getSocketInfoMap() : dart.map();
-      let json = convert.JSON.encode(result);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-    static getOpenSockets(func, params) {
-      dart.assert(dart.equals(func, 'ext.dart.io.getOpenSockets'));
-      let data = dart.map({type: '_opensockets', data: io._SocketResourceInfo.getOpenSocketsList()}, core.String, core.Object);
-      let json = convert.JSON.encode(data);
-      return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
-    }
-    static SocketOpened(info) {
-      dart.assert(!dart.test(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id)));
-      io._SocketResourceInfo.openSockets[dartx._set](info.id, info);
-    }
-    static SocketClosed(info) {
-      dart.assert(io._SocketResourceInfo.openSockets[dartx.containsKey](info.id));
-      io._SocketResourceInfo.openSockets[dartx.remove](info.id);
-    }
-  };
-  dart.setSignature(io._SocketResourceInfo, {
-    constructors: () => ({new: dart.definiteFunctionType(io._SocketResourceInfo, [dart.dynamic])}),
-    fields: () => ({socket: dart.dynamic}),
-    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
-    sfields: () => ({
-      TCP_STRING: core.String,
-      UDP_STRING: core.String,
-      TYPE: core.String,
-      openSockets: MapOfint$_SocketResourceInfo()
-    }),
-    statics: () => ({
-      getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
-      getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
-      getOpenSockets: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [dart.dynamic, dart.dynamic]),
-      SocketOpened: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo]),
-      SocketClosed: dart.definiteFunctionType(dart.dynamic, [io._SocketResourceInfo])
-    }),
-    names: ['getOpenSocketsList', 'getSocketInfoMapByID', 'getOpenSockets', 'SocketOpened', 'SocketClosed']
-  });
-  io._SocketResourceInfo.TCP_STRING = 'TCP';
-  io._SocketResourceInfo.UDP_STRING = 'UDP';
-  io._SocketResourceInfo.TYPE = '_socket';
-  dart.defineLazy(io._SocketResourceInfo, {
-    get openSockets() {
-      return MapOfint$_SocketResourceInfo().new();
-    },
-    set openSockets(_) {}
-  });
-  io.IOSink = class IOSink extends core.Object {
-    static new(target, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return new io._IOSinkImpl(target, encoding);
-    }
-  };
-  io.IOSink[dart.implements] = () => [StreamSinkOfListOfint(), core.StringSink];
-  dart.setSignature(io.IOSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io.IOSink, [StreamConsumerOfListOfint()], {encoding: convert.Encoding})}),
-    fields: () => ({encoding: convert.Encoding})
-  });
-  io._FILE_EXISTS = 0;
-  io._FILE_CREATE = 1;
-  io._FILE_DELETE = 2;
-  io._FILE_RENAME = 3;
-  io._FILE_COPY = 4;
-  io._FILE_OPEN = 5;
-  io._FILE_RESOLVE_SYMBOLIC_LINKS = 6;
-  io._FILE_CLOSE = 7;
-  io._FILE_POSITION = 8;
-  io._FILE_SET_POSITION = 9;
-  io._FILE_TRUNCATE = 10;
-  io._FILE_LENGTH = 11;
-  io._FILE_LENGTH_FROM_PATH = 12;
-  io._FILE_LAST_MODIFIED = 13;
-  io._FILE_FLUSH = 14;
-  io._FILE_READ_BYTE = 15;
-  io._FILE_WRITE_BYTE = 16;
-  io._FILE_READ = 17;
-  io._FILE_READ_INTO = 18;
-  io._FILE_WRITE_FROM = 19;
-  io._FILE_CREATE_LINK = 20;
-  io._FILE_DELETE_LINK = 21;
-  io._FILE_RENAME_LINK = 22;
-  io._FILE_LINK_TARGET = 23;
-  io._FILE_TYPE = 24;
-  io._FILE_IDENTICAL = 25;
-  io._FILE_STAT = 26;
-  io._FILE_LOCK = 27;
-  io._SOCKET_LOOKUP = 28;
-  io._SOCKET_LIST_INTERFACES = 29;
-  io._SOCKET_REVERSE_LOOKUP = 30;
-  io._DIRECTORY_CREATE = 31;
-  io._DIRECTORY_DELETE = 32;
-  io._DIRECTORY_EXISTS = 33;
-  io._DIRECTORY_CREATE_TEMP = 34;
-  io._DIRECTORY_LIST_START = 35;
-  io._DIRECTORY_LIST_NEXT = 36;
-  io._DIRECTORY_LIST_STOP = 37;
-  io._DIRECTORY_RENAME = 38;
-  io._SSL_PROCESS_FILTER = 39;
-  io._IOService = class _IOService extends core.Object {
-    static _dispatch(request, data) {
-      dart.throw(new core.UnsupportedError("_IOService._dispatch"));
-    }
-  };
-  dart.setSignature(io._IOService, {
-    statics: () => ({_dispatch: dart.definiteFunctionType(async.Future, [core.int, core.List])}),
-    names: ['_dispatch']
-  });
-  io.Link = class Link extends core.Object {
-    static new(path) {
-      return new io._Link(path);
-    }
-    static fromUri(uri) {
-      return io.Link.new(uri.toFilePath());
-    }
-  };
-  io.Link[dart.implements] = () => [io.FileSystemEntity];
-  dart.setSignature(io.Link, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.Link, [core.String]),
-      fromUri: dart.definiteFunctionType(io.Link, [core.Uri])
-    })
-  });
-  const _makeWindowsLinkTarget = Symbol('_makeWindowsLinkTarget');
-  const _exceptionFromResponse = Symbol('_exceptionFromResponse');
-  io._Link = class _Link extends io.FileSystemEntity {
-    new(path) {
-      this.path = path;
-      if (!(typeof this.path == 'string')) {
-        dart.throw(new core.ArgumentError(dart.str`${core.Error.safeToString(this.path)} ` + 'is not a String'));
-      }
-    }
-    toString() {
-      return dart.str`Link: '${this.path}'`;
-    }
-    exists() {
-      return io.FileSystemEntity.isLink(this.path);
-    }
-    existsSync() {
-      return io.FileSystemEntity.isLinkSync(this.path);
-    }
-    get absolute() {
-      return io.Link.new(this[_absolutePath]);
-    }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
-    create(target, opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(io.Platform.isWindows)) {
-        target = this[_makeWindowsLinkTarget](target);
-      }
-      let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
-      return result.then(dart.dynamic)(dart.fn(_ => io._IOService._dispatch(io._FILE_CREATE_LINK, JSArrayOfString().of([this.path, target])), dynamicToFuture())).then(io._Link)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot create link to target '${target}'`, this.path));
-        }
-        return this;
-      }, dynamicTo_Link()));
-    }
-    createSync(target, opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        this.parent.createSync({recursive: true});
-      }
-      if (dart.test(io.Platform.isWindows)) {
-        target = this[_makeWindowsLinkTarget](target);
-      }
-      let result = io._File._createLink(this.path, target);
-      io._Link.throwIfError(result, "Cannot create link", this.path);
-    }
-    [_makeWindowsLinkTarget](target) {
-      let base = core.Uri.file(dart.str`${io.Directory.current.path}\\`);
-      let link = core.Uri.file(this.path);
-      let destination = core.Uri.file(target);
-      let result = base.resolveUri(link).resolveUri(destination).toFilePath();
-      if (dart.notNull(result[dartx.length]) > 3 && result[dartx._get](1) == ':' && result[dartx._get](2) == '\\') {
-        return dart.str`\\??\\${result}`;
-      } else {
-        dart.throw(new io.FileSystemException(dart.str`Target ${result} of Link.create on Windows cannot be converted` + ' to start with a drive letter.  Unexpected error.'));
-      }
-    }
-    updateSync(target) {
-      this.deleteSync();
-      this.createSync(target);
-    }
-    update(target) {
-      return this.delete().then(io.Link)(dart.fn(_ => this.create(target), FileSystemEntityToFutureOfLink()));
-    }
-    [_delete](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        return io.Directory.new(this.path).delete({recursive: true}).then(io._Link)(dart.fn(_ => this, FileSystemEntityTo_Link()));
-      }
-      return io._IOService._dispatch(io._FILE_DELETE_LINK, JSArrayOfString().of([this.path])).then(io._Link)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionFromResponse](response, "Cannot delete link", this.path));
-        }
-        return this;
-      }, dynamicTo_Link()));
-    }
-    [_deleteSync](opts) {
-      let recursive = opts && 'recursive' in opts ? opts.recursive : false;
-      if (dart.test(recursive)) {
-        return io.Directory.new(this.path).deleteSync({recursive: true});
-      }
-      let result = io._File._deleteLinkNative(this.path);
-      io._Link.throwIfError(result, "Cannot delete link", this.path);
-    }
-    rename(newPath) {
-      return io._IOService._dispatch(io._FILE_RENAME_LINK, JSArrayOfString().of([this.path, newPath])).then(io.Link)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionFromResponse](response, dart.str`Cannot rename link to '${newPath}'`, this.path));
-        }
-        return io.Link.new(newPath);
-      }, dynamicToLink()));
-    }
-    renameSync(newPath) {
-      let result = io._File._renameLink(this.path, newPath);
-      io._Link.throwIfError(result, dart.str`Cannot rename link '${this.path}' to '${newPath}'`);
-      return io.Link.new(newPath);
-    }
-    target() {
-      return io._IOService._dispatch(io._FILE_LINK_TARGET, JSArrayOfString().of([this.path])).then(core.String)(dart.fn(response => {
-        if (dart.test(this[_isErrorResponse](response))) {
-          dart.throw(this[_exceptionFromResponse](response, "Cannot get target of link", this.path));
-        }
-        return FutureOrOfString()._check(response);
-      }, dynamicToFutureOrOfString()));
-    }
-    targetSync() {
-      let result = io._File._linkTarget(this.path);
-      io._Link.throwIfError(result, "Cannot read link", this.path);
-      return core.String._check(result);
-    }
-    static throwIfError(result, msg, path) {
-      if (path === void 0) path = "";
-      if (io.OSError.is(result)) {
-        dart.throw(new io.FileSystemException(msg, path, result));
-      }
-    }
-    [_isErrorResponse](response) {
-      return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
-    }
-    [_exceptionFromResponse](response, message, path) {
-      dart.assert(this[_isErrorResponse](response));
-      switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
-        case io._ILLEGAL_ARGUMENT_RESPONSE:
-        {
-          return new core.ArgumentError();
-        }
-        case io._OSERROR_RESPONSE:
-        {
-          let err = new io.OSError(core.String._check(dart.dindex(response, io._OSERROR_RESPONSE_MESSAGE)), core.int._check(dart.dindex(response, io._OSERROR_RESPONSE_ERROR_CODE)));
-          return new io.FileSystemException(message, path, err);
-        }
-        default:
-        {
-          return core.Exception.new("Unknown error");
-        }
-      }
-    }
-  };
-  io._Link[dart.implements] = () => [io.Link];
-  dart.setSignature(io._Link, {
-    constructors: () => ({new: dart.definiteFunctionType(io._Link, [core.String])}),
-    fields: () => ({path: core.String}),
-    getters: () => ({absolute: dart.definiteFunctionType(io.Link, [])}),
-    methods: () => ({
-      exists: dart.definiteFunctionType(async.Future$(core.bool), []),
-      existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
-      create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
-      createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
-      [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
-      updateSync: dart.definiteFunctionType(dart.void, [core.String]),
-      update: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
-      [_delete]: dart.definiteFunctionType(async.Future$(io.Link), [], {recursive: core.bool}),
-      [_deleteSync]: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
-      rename: dart.definiteFunctionType(async.Future$(io.Link), [core.String]),
-      renameSync: dart.definiteFunctionType(io.Link, [core.String]),
-      target: dart.definiteFunctionType(async.Future$(core.String), []),
-      targetSync: dart.definiteFunctionType(core.String, []),
-      [_isErrorResponse]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [_exceptionFromResponse]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])
-    }),
-    statics: () => ({throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String], [core.String])}),
-    names: ['throwIfError']
-  });
-  io.Platform = class Platform extends core.Object {
-    static get numberOfProcessors() {
-      return io.Platform._numberOfProcessors;
-    }
-    static get pathSeparator() {
-      return io.Platform._pathSeparator;
-    }
-    static get operatingSystem() {
-      return io.Platform._operatingSystem;
-    }
-    static get localHostname() {
-      return io.Platform._localHostname;
-    }
-    static get environment() {
-      return io._Platform.environment;
-    }
-    static get executable() {
-      return io._Platform.executable;
-    }
-    static get resolvedExecutable() {
-      return io._Platform.resolvedExecutable;
-    }
-    static get script() {
-      return io._Platform.script;
-    }
-    static get executableArguments() {
-      return io._Platform.executableArguments;
-    }
-    static get packageRoot() {
-      return io._Platform.packageRoot;
-    }
-    static get packageConfig() {
-      return io._Platform.packageConfig;
-    }
-    static get version() {
-      return io.Platform._version;
-    }
-  };
-  dart.setSignature(io.Platform, {
-    sfields: () => ({
-      _numberOfProcessors: core.int,
-      _pathSeparator: core.String,
-      _operatingSystem: core.String,
-      _localHostname: core.String,
-      _version: core.String,
-      isLinux: core.bool,
-      isMacOS: core.bool,
-      isWindows: core.bool,
-      isAndroid: core.bool,
-      isIOS: core.bool
-    }),
-    sgetters: () => ({
-      numberOfProcessors: dart.definiteFunctionType(core.int, []),
-      pathSeparator: dart.definiteFunctionType(core.String, []),
-      operatingSystem: dart.definiteFunctionType(core.String, []),
-      localHostname: dart.definiteFunctionType(core.String, []),
-      environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      executable: dart.definiteFunctionType(core.String, []),
-      resolvedExecutable: dart.definiteFunctionType(core.String, []),
-      script: dart.definiteFunctionType(core.Uri, []),
-      executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
-      packageRoot: dart.definiteFunctionType(core.String, []),
-      packageConfig: dart.definiteFunctionType(core.String, []),
-      version: dart.definiteFunctionType(core.String, [])
-    })
-  });
-  dart.defineLazy(io.Platform, {
-    get _numberOfProcessors() {
-      return io._Platform.numberOfProcessors;
-    },
-    get _pathSeparator() {
-      return io._Platform.pathSeparator;
-    },
-    get _operatingSystem() {
-      return io._Platform.operatingSystem;
-    },
-    get _localHostname() {
-      return io._Platform.localHostname;
-    },
-    get _version() {
-      return io._Platform.version;
-    },
-    get isLinux() {
-      return io.Platform._operatingSystem == "linux";
-    },
-    get isMacOS() {
-      return io.Platform._operatingSystem == "macos";
-    },
-    get isWindows() {
-      return io.Platform._operatingSystem == "windows";
-    },
-    get isAndroid() {
-      return io.Platform._operatingSystem == "android";
-    },
-    get isIOS() {
-      return io.Platform._operatingSystem == "ios";
-    }
-  });
-  io._Platform = class _Platform extends core.Object {
-    static _numberOfProcessors() {
-      dart.throw(new core.UnsupportedError("Platform._numberOfProcessors"));
-    }
-    static _pathSeparator() {
-      dart.throw(new core.UnsupportedError("Platform._pathSeparator"));
-    }
-    static _operatingSystem() {
-      dart.throw(new core.UnsupportedError("Platform._operatingSystem"));
-    }
-    static _localHostname() {
-      dart.throw(new core.UnsupportedError("Platform._localHostname"));
-    }
-    static _executable() {
-      dart.throw(new core.UnsupportedError("Platform._executable"));
-    }
-    static _resolvedExecutable() {
-      dart.throw(new core.UnsupportedError("Platform._resolvedExecutable"));
-    }
-    static _environment() {
-      dart.throw(new core.UnsupportedError("Platform._environment"));
-    }
-    static _executableArguments() {
-      dart.throw(new core.UnsupportedError("Platform._executableArguments"));
-    }
-    static _packageRoot() {
-      dart.throw(new core.UnsupportedError("Platform._packageRoot"));
-    }
-    static _packageConfig() {
-      dart.throw(new core.UnsupportedError("Platform._packageConfig"));
-    }
-    static _version() {
-      dart.throw(new core.UnsupportedError("Platform._version"));
-    }
-    static get numberOfProcessors() {
-      return io._Platform._numberOfProcessors();
-    }
-    static get pathSeparator() {
-      return io._Platform._pathSeparator();
-    }
-    static get operatingSystem() {
-      return io._Platform._operatingSystem();
-    }
-    static get localHostname() {
-      let result = io._Platform._localHostname();
-      if (io.OSError.is(result)) {
-        dart.throw(result);
-      } else {
-        return core.String._check(result);
-      }
-    }
-    static get executableArguments() {
-      return io._Platform._executableArguments();
-    }
-    static get environment() {
-      if (io._Platform._environmentCache == null) {
-        let env = io._Platform._environment();
-        if (!io.OSError.is(env)) {
-          let isWindows = io._Platform.operatingSystem == 'windows';
-          let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
-          for (let str of core.Iterable._check(env)) {
-            let equalsIndex = dart.dsend(str, 'indexOf', '=');
-            if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
-              result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
-            }
-          }
-          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
-        } else {
-          io._Platform._environmentCache = env;
-        }
-      }
-      if (io.OSError.is(io._Platform._environmentCache)) {
-        dart.throw(io._Platform._environmentCache);
-      } else {
-        return MapOfString$String()._check(io._Platform._environmentCache);
-      }
-    }
-    static get version() {
-      return io._Platform._version();
-    }
-  };
-  dart.setSignature(io._Platform, {
-    sfields: () => ({
-      executable: core.String,
-      resolvedExecutable: core.String,
-      packageRoot: core.String,
-      packageConfig: core.String,
-      _environmentCache: dart.dynamic,
-      script: core.Uri
-    }),
-    sgetters: () => ({
-      numberOfProcessors: dart.definiteFunctionType(core.int, []),
-      pathSeparator: dart.definiteFunctionType(core.String, []),
-      operatingSystem: dart.definiteFunctionType(core.String, []),
-      localHostname: dart.definiteFunctionType(core.String, []),
-      executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
-      environment: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      version: dart.definiteFunctionType(core.String, [])
-    }),
-    statics: () => ({
-      _numberOfProcessors: dart.definiteFunctionType(core.int, []),
-      _pathSeparator: dart.definiteFunctionType(core.String, []),
-      _operatingSystem: dart.definiteFunctionType(core.String, []),
-      _localHostname: dart.definiteFunctionType(dart.dynamic, []),
-      _executable: dart.definiteFunctionType(dart.dynamic, []),
-      _resolvedExecutable: dart.definiteFunctionType(dart.dynamic, []),
-      _environment: dart.definiteFunctionType(dart.dynamic, []),
-      _executableArguments: dart.definiteFunctionType(core.List$(core.String), []),
-      _packageRoot: dart.definiteFunctionType(core.String, []),
-      _packageConfig: dart.definiteFunctionType(core.String, []),
-      _version: dart.definiteFunctionType(core.String, [])
-    }),
-    names: ['_numberOfProcessors', '_pathSeparator', '_operatingSystem', '_localHostname', '_executable', '_resolvedExecutable', '_environment', '_executableArguments', '_packageRoot', '_packageConfig', '_version']
-  });
-  io._Platform._environmentCache = null;
-  io._Platform.script = null;
-  dart.defineLazy(io._Platform, {
-    get executable() {
-      return core.String._check(io._Platform._executable());
-    },
-    set executable(_) {},
-    get resolvedExecutable() {
-      return core.String._check(io._Platform._resolvedExecutable());
-    },
-    set resolvedExecutable(_) {},
-    get packageRoot() {
-      return io._Platform._packageRoot();
-    },
-    set packageRoot(_) {},
-    get packageConfig() {
-      return io._Platform._packageConfig();
-    },
-    set packageConfig(_) {}
-  });
-  const _map$1 = Symbol('_map');
-  io._CaseInsensitiveStringMap$ = dart.generic(V => {
-    let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
-    let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
-    let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
-    class _CaseInsensitiveStringMap extends core.Object {
-      new() {
-        this[_map$1] = MapOfString$V().new();
-      }
-      containsKey(key) {
-        return typeof key == 'string' && dart.test(this[_map$1][dartx.containsKey](key[dartx.toUpperCase]()));
-      }
-      containsValue(value) {
-        return this[_map$1][dartx.containsValue](value);
-      }
-      _get(key) {
-        return typeof key == 'string' ? this[_map$1][dartx._get](key[dartx.toUpperCase]()) : null;
-      }
-      _set(key, value) {
-        V._check(value);
-        this[_map$1][dartx._set](key[dartx.toUpperCase](), value);
-        return value;
-      }
-      putIfAbsent(key, ifAbsent) {
-        VoidToV()._check(ifAbsent);
-        return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
-      }
-      addAll(other) {
-        other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
-      }
-      remove(key) {
-        return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
-      }
-      clear() {
-        this[_map$1][dartx.clear]();
-      }
-      forEach(f) {
-        this[_map$1][dartx.forEach](f);
-      }
-      get keys() {
-        return this[_map$1][dartx.keys];
-      }
-      get values() {
-        return this[_map$1][dartx.values];
-      }
-      get length() {
-        return this[_map$1][dartx.length];
-      }
-      get isEmpty() {
-        return this[_map$1][dartx.isEmpty];
-      }
-      get isNotEmpty() {
-        return this[_map$1][dartx.isNotEmpty];
-      }
-      toString() {
-        return dart.toString(this[_map$1]);
-      }
-    }
-    dart.addTypeTests(_CaseInsensitiveStringMap);
-    _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
-    dart.setSignature(_CaseInsensitiveStringMap, {
-      fields: () => ({[_map$1]: MapOfString$V()}),
-      getters: () => ({
-        keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
-        values: dart.definiteFunctionType(core.Iterable$(V), []),
-        length: dart.definiteFunctionType(core.int, []),
-        isEmpty: dart.definiteFunctionType(core.bool, []),
-        isNotEmpty: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-        containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-        _get: dart.definiteFunctionType(V, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [core.String, V]),
-        putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
-        addAll: dart.definiteFunctionType(dart.void, [core.Map]),
-        remove: dart.definiteFunctionType(V, [core.Object]),
-        clear: dart.definiteFunctionType(dart.void, []),
-        forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
-      })
-    });
-    dart.defineExtensionMembers(_CaseInsensitiveStringMap, [
-      'containsKey',
-      'containsValue',
-      '_get',
-      '_set',
-      'putIfAbsent',
-      'addAll',
-      'remove',
-      'clear',
-      'forEach',
-      'keys',
-      'values',
-      'length',
-      'isEmpty',
-      'isNotEmpty'
-    ]);
-    return _CaseInsensitiveStringMap;
-  });
-  io._CaseInsensitiveStringMap = _CaseInsensitiveStringMap();
-  io._ProcessUtils = class _ProcessUtils extends core.Object {
-    static _exit(status) {
-      dart.throw(new core.UnsupportedError("ProcessUtils._exit"));
-    }
-    static _setExitCode(status) {
-      dart.throw(new core.UnsupportedError("ProcessUtils._setExitCode"));
-    }
-    static _getExitCode() {
-      dart.throw(new core.UnsupportedError("ProcessUtils._getExitCode"));
-    }
-    static _sleep(millis) {
-      dart.throw(new core.UnsupportedError("ProcessUtils._sleep"));
-    }
-    static _pid(process) {
-      dart.throw(new core.UnsupportedError("ProcessUtils._pid"));
-    }
-    static _watchSignal(signal) {
-      dart.throw(new core.UnsupportedError("ProcessUtils._watchSignal"));
-    }
-  };
-  dart.setSignature(io._ProcessUtils, {
-    statics: () => ({
-      _exit: dart.definiteFunctionType(dart.void, [core.int]),
-      _setExitCode: dart.definiteFunctionType(dart.void, [core.int]),
-      _getExitCode: dart.definiteFunctionType(core.int, []),
-      _sleep: dart.definiteFunctionType(dart.void, [core.int]),
-      _pid: dart.definiteFunctionType(core.int, [io.Process]),
-      _watchSignal: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [io.ProcessSignal])
-    }),
-    names: ['_exit', '_setExitCode', '_getExitCode', '_sleep', '_pid', '_watchSignal']
-  });
-  io.exit = function(code) {
+  return _CaseInsensitiveStringMap;
+});
+io._CaseInsensitiveStringMap = _CaseInsensitiveStringMap();
+io._ProcessUtils = class _ProcessUtils extends core.Object {
+  static _exit(status) {
+    dart.throw(new core.UnsupportedError("ProcessUtils._exit"));
+  }
+  static _setExitCode(status) {
+    dart.throw(new core.UnsupportedError("ProcessUtils._setExitCode"));
+  }
+  static _getExitCode() {
+    dart.throw(new core.UnsupportedError("ProcessUtils._getExitCode"));
+  }
+  static _sleep(millis) {
+    dart.throw(new core.UnsupportedError("ProcessUtils._sleep"));
+  }
+  static _pid(process) {
+    dart.throw(new core.UnsupportedError("ProcessUtils._pid"));
+  }
+  static _watchSignal(signal) {
+    dart.throw(new core.UnsupportedError("ProcessUtils._watchSignal"));
+  }
+};
+dart.setSignature(io._ProcessUtils, {
+  statics: () => ({
+    _exit: dart.definiteFunctionType(dart.void, [core.int]),
+    _setExitCode: dart.definiteFunctionType(dart.void, [core.int]),
+    _getExitCode: dart.definiteFunctionType(core.int, []),
+    _sleep: dart.definiteFunctionType(dart.void, [core.int]),
+    _pid: dart.definiteFunctionType(core.int, [io.Process]),
+    _watchSignal: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [io.ProcessSignal])
+  }),
+  names: ['_exit', '_setExitCode', '_getExitCode', '_sleep', '_pid', '_watchSignal']
+});
+io.exit = function(code) {
+  if (!(typeof code == 'number')) {
+    dart.throw(new core.ArgumentError("Integer value for exit code expected"));
+  }
+  io._ProcessUtils._exit(code);
+};
+dart.fn(io.exit, intTovoid());
+dart.copyProperties(io, {
+  set exitCode(code) {
     if (!(typeof code == 'number')) {
       dart.throw(new core.ArgumentError("Integer value for exit code expected"));
     }
-    io._ProcessUtils._exit(code);
-  };
-  dart.fn(io.exit, intTovoid());
-  dart.copyProperties(io, {
-    set exitCode(code) {
-      if (!(typeof code == 'number')) {
-        dart.throw(new core.ArgumentError("Integer value for exit code expected"));
-      }
-      io._ProcessUtils._setExitCode(code);
-    },
-    get exitCode() {
-      return io._ProcessUtils._getExitCode();
+    io._ProcessUtils._setExitCode(code);
+  },
+  get exitCode() {
+    return io._ProcessUtils._getExitCode();
+  }
+});
+io.sleep = function(duration) {
+  let milliseconds = duration.inMilliseconds;
+  if (dart.notNull(milliseconds) < 0) {
+    dart.throw(new core.ArgumentError("sleep: duration cannot be negative"));
+  }
+  io._ProcessUtils._sleep(milliseconds);
+};
+dart.fn(io.sleep, DurationTovoid());
+dart.copyProperties(io, {
+  get pid() {
+    return io._ProcessUtils._pid(null);
+  }
+});
+io.ProcessStartMode = class ProcessStartMode extends core.Object {
+  new(index) {
+    this.index = index;
+  }
+  toString() {
+    return {
+      0: "ProcessStartMode.NORMAL",
+      1: "ProcessStartMode.DETACHED",
+      2: "ProcessStartMode.DETACHED_WITH_STDIO"
+    }[this.index];
+  }
+};
+dart.setSignature(io.ProcessStartMode, {
+  fields: () => ({index: core.int})
+});
+dart.defineEnumValues(io.ProcessStartMode, [
+  'NORMAL',
+  'DETACHED',
+  'DETACHED_WITH_STDIO'
+]);
+io.Process = class Process extends core.Object {
+  new() {
+    this.exitCode = null;
+  }
+  static start(executable, arguments$, opts) {
+    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
+    let environment = opts && 'environment' in opts ? opts.environment : null;
+    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
+    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
+    let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.NORMAL;
+    dart.throw(new core.UnsupportedError("Process.start"));
+  }
+  static run(executable, arguments$, opts) {
+    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
+    let environment = opts && 'environment' in opts ? opts.environment : null;
+    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
+    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
+    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
+    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
+    dart.throw(new core.UnsupportedError("Process.run"));
+  }
+  static runSync(executable, arguments$, opts) {
+    let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
+    let environment = opts && 'environment' in opts ? opts.environment : null;
+    let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
+    let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
+    let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
+    let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
+    dart.throw(new core.UnsupportedError("Process.runSync"));
+  }
+  static killPid(pid, signal) {
+    if (signal === void 0) signal = io.ProcessSignal.SIGTERM;
+    dart.throw(new core.UnsupportedError("Process.killPid"));
+  }
+};
+dart.setSignature(io.Process, {
+  fields: () => ({exitCode: FutureOfint()}),
+  statics: () => ({
+    start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
+    run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
+    runSync: dart.definiteFunctionType(io.ProcessResult, [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
+    killPid: dart.definiteFunctionType(core.bool, [core.int], [io.ProcessSignal])
+  }),
+  names: ['start', 'run', 'runSync', 'killPid']
+});
+io.ProcessResult = class ProcessResult extends core.Object {
+  new(pid, exitCode, stdout, stderr) {
+    this.pid = pid;
+    this.exitCode = exitCode;
+    this.stdout = stdout;
+    this.stderr = stderr;
+  }
+};
+dart.setSignature(io.ProcessResult, {
+  constructors: () => ({new: dart.definiteFunctionType(io.ProcessResult, [core.int, core.int, dart.dynamic, dart.dynamic])}),
+  fields: () => ({
+    exitCode: core.int,
+    stdout: dart.dynamic,
+    stderr: dart.dynamic,
+    pid: core.int
+  })
+});
+const _signalNumber = Symbol('_signalNumber');
+const _name$2 = Symbol('_name');
+io.ProcessSignal = class ProcessSignal extends core.Object {
+  _(signalNumber, name) {
+    this[_signalNumber] = signalNumber;
+    this[_name$2] = name;
+  }
+  toString() {
+    return this[_name$2];
+  }
+  watch() {
+    return io._ProcessUtils._watchSignal(this);
+  }
+};
+dart.defineNamedConstructor(io.ProcessSignal, '_');
+dart.setSignature(io.ProcessSignal, {
+  constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
+  fields: () => ({
+    [_signalNumber]: core.int,
+    [_name$2]: core.String
+  }),
+  methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
+  sfields: () => ({
+    SIGHUP: io.ProcessSignal,
+    SIGINT: io.ProcessSignal,
+    SIGQUIT: io.ProcessSignal,
+    SIGILL: io.ProcessSignal,
+    SIGTRAP: io.ProcessSignal,
+    SIGABRT: io.ProcessSignal,
+    SIGBUS: io.ProcessSignal,
+    SIGFPE: io.ProcessSignal,
+    SIGKILL: io.ProcessSignal,
+    SIGUSR1: io.ProcessSignal,
+    SIGSEGV: io.ProcessSignal,
+    SIGUSR2: io.ProcessSignal,
+    SIGPIPE: io.ProcessSignal,
+    SIGALRM: io.ProcessSignal,
+    SIGTERM: io.ProcessSignal,
+    SIGCHLD: io.ProcessSignal,
+    SIGCONT: io.ProcessSignal,
+    SIGSTOP: io.ProcessSignal,
+    SIGTSTP: io.ProcessSignal,
+    SIGTTIN: io.ProcessSignal,
+    SIGTTOU: io.ProcessSignal,
+    SIGURG: io.ProcessSignal,
+    SIGXCPU: io.ProcessSignal,
+    SIGXFSZ: io.ProcessSignal,
+    SIGVTALRM: io.ProcessSignal,
+    SIGPROF: io.ProcessSignal,
+    SIGWINCH: io.ProcessSignal,
+    SIGPOLL: io.ProcessSignal,
+    SIGSYS: io.ProcessSignal
+  })
+});
+dart.defineLazy(io.ProcessSignal, {
+  get SIGHUP() {
+    return dart.const(new io.ProcessSignal._(1, "SIGHUP"));
+  },
+  get SIGINT() {
+    return dart.const(new io.ProcessSignal._(2, "SIGINT"));
+  },
+  get SIGQUIT() {
+    return dart.const(new io.ProcessSignal._(3, "SIGQUIT"));
+  },
+  get SIGILL() {
+    return dart.const(new io.ProcessSignal._(4, "SIGILL"));
+  },
+  get SIGTRAP() {
+    return dart.const(new io.ProcessSignal._(5, "SIGTRAP"));
+  },
+  get SIGABRT() {
+    return dart.const(new io.ProcessSignal._(6, "SIGABRT"));
+  },
+  get SIGBUS() {
+    return dart.const(new io.ProcessSignal._(7, "SIGBUS"));
+  },
+  get SIGFPE() {
+    return dart.const(new io.ProcessSignal._(8, "SIGFPE"));
+  },
+  get SIGKILL() {
+    return dart.const(new io.ProcessSignal._(9, "SIGKILL"));
+  },
+  get SIGUSR1() {
+    return dart.const(new io.ProcessSignal._(10, "SIGUSR1"));
+  },
+  get SIGSEGV() {
+    return dart.const(new io.ProcessSignal._(11, "SIGSEGV"));
+  },
+  get SIGUSR2() {
+    return dart.const(new io.ProcessSignal._(12, "SIGUSR2"));
+  },
+  get SIGPIPE() {
+    return dart.const(new io.ProcessSignal._(13, "SIGPIPE"));
+  },
+  get SIGALRM() {
+    return dart.const(new io.ProcessSignal._(14, "SIGALRM"));
+  },
+  get SIGTERM() {
+    return dart.const(new io.ProcessSignal._(15, "SIGTERM"));
+  },
+  get SIGCHLD() {
+    return dart.const(new io.ProcessSignal._(17, "SIGCHLD"));
+  },
+  get SIGCONT() {
+    return dart.const(new io.ProcessSignal._(18, "SIGCONT"));
+  },
+  get SIGSTOP() {
+    return dart.const(new io.ProcessSignal._(19, "SIGSTOP"));
+  },
+  get SIGTSTP() {
+    return dart.const(new io.ProcessSignal._(20, "SIGTSTP"));
+  },
+  get SIGTTIN() {
+    return dart.const(new io.ProcessSignal._(21, "SIGTTIN"));
+  },
+  get SIGTTOU() {
+    return dart.const(new io.ProcessSignal._(22, "SIGTTOU"));
+  },
+  get SIGURG() {
+    return dart.const(new io.ProcessSignal._(23, "SIGURG"));
+  },
+  get SIGXCPU() {
+    return dart.const(new io.ProcessSignal._(24, "SIGXCPU"));
+  },
+  get SIGXFSZ() {
+    return dart.const(new io.ProcessSignal._(25, "SIGXFSZ"));
+  },
+  get SIGVTALRM() {
+    return dart.const(new io.ProcessSignal._(26, "SIGVTALRM"));
+  },
+  get SIGPROF() {
+    return dart.const(new io.ProcessSignal._(27, "SIGPROF"));
+  },
+  get SIGWINCH() {
+    return dart.const(new io.ProcessSignal._(28, "SIGWINCH"));
+  },
+  get SIGPOLL() {
+    return dart.const(new io.ProcessSignal._(29, "SIGPOLL"));
+  },
+  get SIGSYS() {
+    return dart.const(new io.ProcessSignal._(31, "SIGSYS"));
+  }
+});
+io.SignalException = class SignalException extends core.Object {
+  new(message, osError) {
+    if (osError === void 0) osError = null;
+    this.message = message;
+    this.osError = osError;
+  }
+  toString() {
+    let msg = "";
+    if (this.osError != null) {
+      msg = dart.str`, osError: ${this.osError}`;
     }
-  });
-  io.sleep = function(duration) {
-    let milliseconds = duration.inMilliseconds;
-    if (dart.notNull(milliseconds) < 0) {
-      dart.throw(new core.ArgumentError("sleep: duration cannot be negative"));
+    return dart.str`SignalException: ${this.message}${msg}`;
+  }
+};
+io.SignalException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.SignalException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.SignalException, [core.String], [dart.dynamic])}),
+  fields: () => ({
+    message: core.String,
+    osError: dart.dynamic
+  })
+});
+io.ProcessException = class ProcessException extends core.Object {
+  new(executable, arguments$, message, errorCode) {
+    if (message === void 0) message = "";
+    if (errorCode === void 0) errorCode = 0;
+    this.executable = executable;
+    this.arguments = arguments$;
+    this.message = message;
+    this.errorCode = errorCode;
+  }
+  toString() {
+    let msg = this.message == null ? dart.str`OS error code: ${this.errorCode}` : this.message;
+    let args = this.arguments[dartx.join](' ');
+    return dart.str`ProcessException: ${msg}\n  Command: ${this.executable} ${args}`;
+  }
+};
+io.ProcessException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.ProcessException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.ProcessException, [core.String, ListOfString()], [core.String, core.int])}),
+  fields: () => ({
+    executable: core.String,
+    arguments: ListOfString(),
+    message: core.String,
+    errorCode: core.int
+  })
+});
+const _detachRaw = Symbol('_detachRaw');
+io.SecureSocket = class SecureSocket extends core.Object {
+  static _(rawSocket) {
+    dart.throw(new core.UnsupportedError("SecureSocket constructor"));
+  }
+  static connect(host, port, opts) {
+    let context = opts && 'context' in opts ? opts.context : null;
+    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    return io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket()));
+  }
+  static secure(socket, opts) {
+    let host = opts && 'host' in opts ? opts.host : null;
+    let context = opts && 'context' in opts ? opts.context : null;
+    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
+    let completer = async.Completer.new();
+    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
+      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
+    }, dynamicToNull$()));
+    return FutureOfSecureSocket()._check(completer.future);
+  }
+  static secureServer(socket, context, opts) {
+    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    let completer = async.Completer.new();
+    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
+      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
+    }, dynamicToNull$()));
+    return FutureOfSecureSocket()._check(completer.future);
+  }
+};
+io.SecureSocket[dart.implements] = () => [io.Socket];
+dart.setSignature(io.SecureSocket, {
+  constructors: () => ({_: dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])}),
+  statics: () => ({
+    connect: dart.definiteFunctionType(async.Future$(io.SecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    secure: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket], {host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool()}),
+    secureServer: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket, io.SecurityContext], {bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+  }),
+  names: ['connect', 'secure', 'secureServer']
+});
+io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
+  _(socket) {
+    this[_socket] = socket;
+    super.new();
+  }
+  static bind(address, port, context, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    return io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket)(dart.fn(serverSocket => new io.SecureServerSocket._(serverSocket), RawSecureServerSocketToSecureServerSocket()));
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_socket].map(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get port() {
+    return this[_socket].port;
+  }
+  get address() {
+    return this[_socket].address;
+  }
+  close() {
+    return this[_socket].close().then(io.SecureServerSocket)(dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket()));
+  }
+  set [_owner](owner) {
+    this[_socket][_owner] = owner;
+  }
+};
+dart.addSimpleTypeTests(io.SecureServerSocket);
+dart.defineNamedConstructor(io.SecureServerSocket, '_');
+dart.setSignature(io.SecureServerSocket, {
+  constructors: () => ({_: dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])}),
+  fields: () => ({[_socket]: io.RawSecureServerSocket}),
+  getters: () => ({
+    port: dart.definiteFunctionType(core.int, []),
+    address: dart.definiteFunctionType(io.InternetAddress, [])
+  }),
+  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(io.SecureSocket), [SecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    close: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [])
+  }),
+  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
+  names: ['bind']
+});
+const _onSubscriptionStateChange = Symbol('_onSubscriptionStateChange');
+const _onPauseStateChange = Symbol('_onPauseStateChange');
+io.RawSecureSocket = class RawSecureSocket extends core.Object {
+  static connect(host, port, opts) {
+    let context = opts && 'context' in opts ? opts.context : null;
+    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
+    return io.RawSocket.connect(host, port).then(io.RawSecureSocket)(dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket()));
+  }
+  static secure(socket, opts) {
+    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
+    let host = opts && 'host' in opts ? opts.host : null;
+    let context = opts && 'context' in opts ? opts.context : null;
+    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    socket.readEventsEnabled = false;
+    socket.writeEventsEnabled = false;
+    return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
+  }
+  static secureServer(socket, context, opts) {
+    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
+    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    socket.readEventsEnabled = false;
+    socket.writeEventsEnabled = false;
+    return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
+  }
+};
+io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
+dart.setSignature(io.RawSecureSocket, {
+  statics: () => ({
+    connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+  }),
+  names: ['connect', 'secure', 'secureServer']
+});
+io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
+  _(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
+    this[_socket] = socket;
+    this[_context] = context;
+    this.requestClientCertificate = requestClientCertificate;
+    this.requireClientCertificate = requireClientCertificate;
+    this.supportedProtocols = supportedProtocols;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
+    this[_closed] = false;
+    super.new();
+    this[_controller$0] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
+  }
+  static bind(address, port, context, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    return io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket)(dart.fn(serverSocket => new io.RawSecureServerSocket._(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket()));
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get port() {
+    return this[_socket].port;
+  }
+  get address() {
+    return this[_socket].address;
+  }
+  close() {
+    this[_closed] = true;
+    return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
+  }
+  [_onData$](connection) {
+    let remotePort = null;
+    try {
+      remotePort = connection.remotePort;
+    } catch (e) {
+      return;
     }
-    io._ProcessUtils._sleep(milliseconds);
-  };
-  dart.fn(io.sleep, DurationTovoid());
-  dart.copyProperties(io, {
-    get pid() {
-      return io._ProcessUtils._pid(null);
-    }
-  });
-  io.ProcessStartMode = class ProcessStartMode extends core.Object {
-    new(index) {
-      this.index = index;
-    }
-    toString() {
-      return {
-        0: "ProcessStartMode.NORMAL",
-        1: "ProcessStartMode.DETACHED",
-        2: "ProcessStartMode.DETACHED_WITH_STDIO"
-      }[this.index];
-    }
-  };
-  dart.setSignature(io.ProcessStartMode, {
-    fields: () => ({index: core.int})
-  });
-  dart.defineEnumValues(io.ProcessStartMode, [
-    'NORMAL',
-    'DETACHED',
-    'DETACHED_WITH_STDIO'
-  ]);
-  io.Process = class Process extends core.Object {
-    new() {
-      this.exitCode = null;
-    }
-    static start(executable, arguments$, opts) {
-      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
-      let environment = opts && 'environment' in opts ? opts.environment : null;
-      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
-      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
-      let mode = opts && 'mode' in opts ? opts.mode : io.ProcessStartMode.NORMAL;
-      dart.throw(new core.UnsupportedError("Process.start"));
-    }
-    static run(executable, arguments$, opts) {
-      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
-      let environment = opts && 'environment' in opts ? opts.environment : null;
-      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
-      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
-      let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
-      let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
-      dart.throw(new core.UnsupportedError("Process.run"));
-    }
-    static runSync(executable, arguments$, opts) {
-      let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
-      let environment = opts && 'environment' in opts ? opts.environment : null;
-      let includeParentEnvironment = opts && 'includeParentEnvironment' in opts ? opts.includeParentEnvironment : true;
-      let runInShell = opts && 'runInShell' in opts ? opts.runInShell : false;
-      let stdoutEncoding = opts && 'stdoutEncoding' in opts ? opts.stdoutEncoding : io.SYSTEM_ENCODING;
-      let stderrEncoding = opts && 'stderrEncoding' in opts ? opts.stderrEncoding : io.SYSTEM_ENCODING;
-      dart.throw(new core.UnsupportedError("Process.runSync"));
-    }
-    static killPid(pid, signal) {
-      if (signal === void 0) signal = io.ProcessSignal.SIGTERM;
-      dart.throw(new core.UnsupportedError("Process.killPid"));
-    }
-  };
-  dart.setSignature(io.Process, {
-    fields: () => ({exitCode: FutureOfint()}),
-    statics: () => ({
-      start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
-      run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
-      runSync: dart.definiteFunctionType(io.ProcessResult, [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
-      killPid: dart.definiteFunctionType(core.bool, [core.int], [io.ProcessSignal])
-    }),
-    names: ['start', 'run', 'runSync', 'killPid']
-  });
-  io.ProcessResult = class ProcessResult extends core.Object {
-    new(pid, exitCode, stdout, stderr) {
-      this.pid = pid;
-      this.exitCode = exitCode;
-      this.stdout = stdout;
-      this.stderr = stderr;
-    }
-  };
-  dart.setSignature(io.ProcessResult, {
-    constructors: () => ({new: dart.definiteFunctionType(io.ProcessResult, [core.int, core.int, dart.dynamic, dart.dynamic])}),
-    fields: () => ({
-      exitCode: core.int,
-      stdout: dart.dynamic,
-      stderr: dart.dynamic,
-      pid: core.int
-    })
-  });
-  const _signalNumber = Symbol('_signalNumber');
-  const _name$2 = Symbol('_name');
-  io.ProcessSignal = class ProcessSignal extends core.Object {
-    _(signalNumber, name) {
-      this[_signalNumber] = signalNumber;
-      this[_name$2] = name;
-    }
-    toString() {
-      return this[_name$2];
-    }
-    watch() {
-      return io._ProcessUtils._watchSignal(this);
-    }
-  };
-  dart.defineNamedConstructor(io.ProcessSignal, '_');
-  dart.setSignature(io.ProcessSignal, {
-    constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
-    fields: () => ({
-      [_signalNumber]: core.int,
-      [_name$2]: core.String
-    }),
-    methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
-    sfields: () => ({
-      SIGHUP: io.ProcessSignal,
-      SIGINT: io.ProcessSignal,
-      SIGQUIT: io.ProcessSignal,
-      SIGILL: io.ProcessSignal,
-      SIGTRAP: io.ProcessSignal,
-      SIGABRT: io.ProcessSignal,
-      SIGBUS: io.ProcessSignal,
-      SIGFPE: io.ProcessSignal,
-      SIGKILL: io.ProcessSignal,
-      SIGUSR1: io.ProcessSignal,
-      SIGSEGV: io.ProcessSignal,
-      SIGUSR2: io.ProcessSignal,
-      SIGPIPE: io.ProcessSignal,
-      SIGALRM: io.ProcessSignal,
-      SIGTERM: io.ProcessSignal,
-      SIGCHLD: io.ProcessSignal,
-      SIGCONT: io.ProcessSignal,
-      SIGSTOP: io.ProcessSignal,
-      SIGTSTP: io.ProcessSignal,
-      SIGTTIN: io.ProcessSignal,
-      SIGTTOU: io.ProcessSignal,
-      SIGURG: io.ProcessSignal,
-      SIGXCPU: io.ProcessSignal,
-      SIGXFSZ: io.ProcessSignal,
-      SIGVTALRM: io.ProcessSignal,
-      SIGPROF: io.ProcessSignal,
-      SIGWINCH: io.ProcessSignal,
-      SIGPOLL: io.ProcessSignal,
-      SIGSYS: io.ProcessSignal
-    })
-  });
-  dart.defineLazy(io.ProcessSignal, {
-    get SIGHUP() {
-      return dart.const(new io.ProcessSignal._(1, "SIGHUP"));
-    },
-    get SIGINT() {
-      return dart.const(new io.ProcessSignal._(2, "SIGINT"));
-    },
-    get SIGQUIT() {
-      return dart.const(new io.ProcessSignal._(3, "SIGQUIT"));
-    },
-    get SIGILL() {
-      return dart.const(new io.ProcessSignal._(4, "SIGILL"));
-    },
-    get SIGTRAP() {
-      return dart.const(new io.ProcessSignal._(5, "SIGTRAP"));
-    },
-    get SIGABRT() {
-      return dart.const(new io.ProcessSignal._(6, "SIGABRT"));
-    },
-    get SIGBUS() {
-      return dart.const(new io.ProcessSignal._(7, "SIGBUS"));
-    },
-    get SIGFPE() {
-      return dart.const(new io.ProcessSignal._(8, "SIGFPE"));
-    },
-    get SIGKILL() {
-      return dart.const(new io.ProcessSignal._(9, "SIGKILL"));
-    },
-    get SIGUSR1() {
-      return dart.const(new io.ProcessSignal._(10, "SIGUSR1"));
-    },
-    get SIGSEGV() {
-      return dart.const(new io.ProcessSignal._(11, "SIGSEGV"));
-    },
-    get SIGUSR2() {
-      return dart.const(new io.ProcessSignal._(12, "SIGUSR2"));
-    },
-    get SIGPIPE() {
-      return dart.const(new io.ProcessSignal._(13, "SIGPIPE"));
-    },
-    get SIGALRM() {
-      return dart.const(new io.ProcessSignal._(14, "SIGALRM"));
-    },
-    get SIGTERM() {
-      return dart.const(new io.ProcessSignal._(15, "SIGTERM"));
-    },
-    get SIGCHLD() {
-      return dart.const(new io.ProcessSignal._(17, "SIGCHLD"));
-    },
-    get SIGCONT() {
-      return dart.const(new io.ProcessSignal._(18, "SIGCONT"));
-    },
-    get SIGSTOP() {
-      return dart.const(new io.ProcessSignal._(19, "SIGSTOP"));
-    },
-    get SIGTSTP() {
-      return dart.const(new io.ProcessSignal._(20, "SIGTSTP"));
-    },
-    get SIGTTIN() {
-      return dart.const(new io.ProcessSignal._(21, "SIGTTIN"));
-    },
-    get SIGTTOU() {
-      return dart.const(new io.ProcessSignal._(22, "SIGTTOU"));
-    },
-    get SIGURG() {
-      return dart.const(new io.ProcessSignal._(23, "SIGURG"));
-    },
-    get SIGXCPU() {
-      return dart.const(new io.ProcessSignal._(24, "SIGXCPU"));
-    },
-    get SIGXFSZ() {
-      return dart.const(new io.ProcessSignal._(25, "SIGXFSZ"));
-    },
-    get SIGVTALRM() {
-      return dart.const(new io.ProcessSignal._(26, "SIGVTALRM"));
-    },
-    get SIGPROF() {
-      return dart.const(new io.ProcessSignal._(27, "SIGPROF"));
-    },
-    get SIGWINCH() {
-      return dart.const(new io.ProcessSignal._(28, "SIGWINCH"));
-    },
-    get SIGPOLL() {
-      return dart.const(new io.ProcessSignal._(29, "SIGPOLL"));
-    },
-    get SIGSYS() {
-      return dart.const(new io.ProcessSignal._(31, "SIGSYS"));
-    }
-  });
-  io.SignalException = class SignalException extends core.Object {
-    new(message, osError) {
-      if (osError === void 0) osError = null;
-      this.message = message;
-      this.osError = osError;
-    }
-    toString() {
-      let msg = "";
-      if (this.osError != null) {
-        msg = dart.str`, osError: ${this.osError}`;
-      }
-      return dart.str`SignalException: ${this.message}${msg}`;
-    }
-  };
-  io.SignalException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.SignalException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.SignalException, [core.String], [dart.dynamic])}),
-    fields: () => ({
-      message: core.String,
-      osError: dart.dynamic
-    })
-  });
-  io.ProcessException = class ProcessException extends core.Object {
-    new(executable, arguments$, message, errorCode) {
-      if (message === void 0) message = "";
-      if (errorCode === void 0) errorCode = 0;
-      this.executable = executable;
-      this.arguments = arguments$;
-      this.message = message;
-      this.errorCode = errorCode;
-    }
-    toString() {
-      let msg = this.message == null ? dart.str`OS error code: ${this.errorCode}` : this.message;
-      let args = this.arguments[dartx.join](' ');
-      return dart.str`ProcessException: ${msg}\n  Command: ${this.executable} ${args}`;
-    }
-  };
-  io.ProcessException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.ProcessException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.ProcessException, [core.String, ListOfString()], [core.String, core.int])}),
-    fields: () => ({
-      executable: core.String,
-      arguments: ListOfString(),
-      message: core.String,
-      errorCode: core.int
-    })
-  });
-  const _detachRaw = Symbol('_detachRaw');
-  io.SecureSocket = class SecureSocket extends core.Object {
-    static _(rawSocket) {
-      dart.throw(new core.UnsupportedError("SecureSocket constructor"));
-    }
-    static connect(host, port, opts) {
-      let context = opts && 'context' in opts ? opts.context : null;
-      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      return io.RawSecureSocket.connect(host, port, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}).then(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket()));
-    }
-    static secure(socket, opts) {
-      let host = opts && 'host' in opts ? opts.host : null;
-      let context = opts && 'context' in opts ? opts.context : null;
-      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
-    }
-    static secureServer(socket, context, opts) {
-      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
-    }
-  };
-  io.SecureSocket[dart.implements] = () => [io.Socket];
-  dart.setSignature(io.SecureSocket, {
-    constructors: () => ({_: dart.definiteFunctionType(io.SecureSocket, [io.RawSecureSocket])}),
-    statics: () => ({
-      connect: dart.definiteFunctionType(async.Future$(io.SecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secure: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket], {host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool()}),
-      secureServer: dart.definiteFunctionType(async.Future$(io.SecureSocket), [io.Socket, io.SecurityContext], {bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
-    }),
-    names: ['connect', 'secure', 'secureServer']
-  });
-  io.SecureServerSocket = class SecureServerSocket extends async.Stream$(io.SecureSocket) {
-    _(socket) {
-      this[_socket] = socket;
-      super.new();
-    }
-    static bind(address, port, context, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      return io.RawSecureServerSocket.bind(address, port, context, {backlog: backlog, v6Only: v6Only, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols, shared: shared}).then(io.SecureServerSocket)(dart.fn(serverSocket => new io.SecureServerSocket._(serverSocket), RawSecureServerSocketToSecureServerSocket()));
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_socket].map(io.SecureSocket)(dart.fn(rawSocket => io.SecureSocket._(rawSocket), RawSecureSocketToSecureSocket())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get port() {
-      return this[_socket].port;
-    }
-    get address() {
-      return this[_socket].address;
-    }
-    close() {
-      return this[_socket].close().then(io.SecureServerSocket)(dart.fn(_ => this, RawSecureServerSocketToSecureServerSocket()));
-    }
-    set [_owner](owner) {
-      this[_socket][_owner] = owner;
-    }
-  };
-  dart.addSimpleTypeTests(io.SecureServerSocket);
-  dart.defineNamedConstructor(io.SecureServerSocket, '_');
-  dart.setSignature(io.SecureServerSocket, {
-    constructors: () => ({_: dart.definiteFunctionType(io.SecureServerSocket, [io.RawSecureServerSocket])}),
-    fields: () => ({[_socket]: io.RawSecureServerSocket}),
-    getters: () => ({
-      port: dart.definiteFunctionType(core.int, []),
-      address: dart.definiteFunctionType(io.InternetAddress, [])
-    }),
-    setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(io.SecureSocket), [SecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      close: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [])
-    }),
-    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.SecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
-    names: ['bind']
-  });
-  const _onSubscriptionStateChange = Symbol('_onSubscriptionStateChange');
-  const _onPauseStateChange = Symbol('_onPauseStateChange');
-  io.RawSecureSocket = class RawSecureSocket extends core.Object {
-    static connect(host, port, opts) {
-      let context = opts && 'context' in opts ? opts.context : null;
-      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      io._RawSecureSocket._verifyFields(host, port, false, false, false, onBadCertificate);
-      return io.RawSocket.connect(host, port).then(io.RawSecureSocket)(dart.fn(socket => io.RawSecureSocket.secure(socket, {context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols}), RawSocketToFutureOfRawSecureSocket()));
-    }
-    static secure(socket, opts) {
-      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
-      let host = opts && 'host' in opts ? opts.host : null;
-      let context = opts && 'context' in opts ? opts.context : null;
-      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      socket.readEventsEnabled = false;
-      socket.writeEventsEnabled = false;
-      return io._RawSecureSocket.connect(host != null ? host : socket.address.host, socket.port, {is_server: false, socket: socket, subscription: subscription, context: context, onBadCertificate: onBadCertificate, supportedProtocols: supportedProtocols});
-    }
-    static secureServer(socket, context, opts) {
-      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
-      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      socket.readEventsEnabled = false;
-      socket.writeEventsEnabled = false;
-      return io._RawSecureSocket.connect(socket.address, socket.remotePort, {context: context, is_server: true, socket: socket, subscription: subscription, bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols});
-    }
-  };
-  io.RawSecureSocket[dart.implements] = () => [io.RawSocket];
-  dart.setSignature(io.RawSecureSocket, {
-    statics: () => ({
-      connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
-    }),
-    names: ['connect', 'secure', 'secureServer']
-  });
-  io.RawSecureServerSocket = class RawSecureServerSocket extends async.Stream$(io.RawSecureSocket) {
-    _(socket, context, requestClientCertificate, requireClientCertificate, supportedProtocols) {
-      this[_socket] = socket;
-      this[_context] = context;
-      this.requestClientCertificate = requestClientCertificate;
-      this.requireClientCertificate = requireClientCertificate;
-      this.supportedProtocols = supportedProtocols;
-      this[_controller$0] = null;
-      this[_subscription$] = null;
-      this[_closed] = false;
-      super.new();
-      this[_controller$0] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
-    }
-    static bind(address, port, context, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      return io.RawServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io.RawSecureServerSocket)(dart.fn(serverSocket => new io.RawSecureServerSocket._(serverSocket, context, requestClientCertificate, requireClientCertificate, supportedProtocols), RawServerSocketToRawSecureServerSocket()));
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get port() {
-      return this[_socket].port;
-    }
-    get address() {
-      return this[_socket].address;
-    }
-    close() {
-      this[_closed] = true;
-      return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
-    }
-    [_onData$](connection) {
-      let remotePort = null;
-      try {
-        remotePort = connection.remotePort;
-      } catch (e) {
-        return;
-      }
 
-      io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(dart.dynamic)(dart.fn(secureConnection => {
-        if (dart.test(this[_closed])) {
-          secureConnection.close();
-        } else {
-          this[_controller$0].add(secureConnection);
-        }
-      }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
-        if (!dart.test(this[_closed])) {
-          this[_controller$0].addError(e, core.StackTrace._check(s));
-        }
-      }, dynamicAnddynamicToNull()));
-    }
-    [_onPauseStateChange]() {
-      if (dart.test(this[_controller$0].isPaused)) {
-        this[_subscription$].pause();
+    io._RawSecureSocket.connect(connection.address, core.int._check(remotePort), {context: this[_context], is_server: true, socket: connection, requestClientCertificate: this.requestClientCertificate, requireClientCertificate: this.requireClientCertificate, supportedProtocols: this.supportedProtocols}).then(dart.dynamic)(dart.fn(secureConnection => {
+      if (dart.test(this[_closed])) {
+        secureConnection.close();
       } else {
-        this[_subscription$].resume();
+        this[_controller$0].add(secureConnection);
       }
-    }
-    [_onSubscriptionStateChange]() {
-      if (dart.test(this[_controller$0].hasListener)) {
-        this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this[_controller$0], 'close')});
-      } else {
-        this.close();
+    }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
+      if (!dart.test(this[_closed])) {
+        this[_controller$0].addError(e, core.StackTrace._check(s));
       }
+    }, dynamicAnddynamicToNull()));
+  }
+  [_onPauseStateChange]() {
+    if (dart.test(this[_controller$0].isPaused)) {
+      this[_subscription$].pause();
+    } else {
+      this[_subscription$].resume();
     }
-    set [_owner](owner) {
-      dart.dput(this[_socket], _owner, owner);
+  }
+  [_onSubscriptionStateChange]() {
+    if (dart.test(this[_controller$0].hasListener)) {
+      this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this[_controller$0], 'close')});
+    } else {
+      this.close();
     }
-  };
-  dart.addSimpleTypeTests(io.RawSecureServerSocket);
-  dart.defineNamedConstructor(io.RawSecureServerSocket, '_');
-  dart.setSignature(io.RawSecureServerSocket, {
-    constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
-    fields: () => ({
-      [_socket]: io.RawServerSocket,
-      [_controller$0]: StreamControllerOfRawSecureSocket(),
-      [_subscription$]: StreamSubscriptionOfRawSocket(),
-      [_context]: io.SecurityContext,
-      requestClientCertificate: core.bool,
-      requireClientCertificate: core.bool,
-      supportedProtocols: ListOfString(),
-      [_closed]: core.bool
-    }),
-    getters: () => ({
-      port: dart.definiteFunctionType(core.int, []),
-      address: dart.definiteFunctionType(io.InternetAddress, [])
-    }),
-    setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
-      [_onData$]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
-      [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
-      [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
-    }),
-    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
-    names: ['bind']
-  });
-  io.X509Certificate = class X509Certificate extends core.Object {
-    static _() {
-      dart.throw(new core.UnsupportedError("X509Certificate constructor"));
+  }
+  set [_owner](owner) {
+    dart.dput(this[_socket], _owner, owner);
+  }
+};
+dart.addSimpleTypeTests(io.RawSecureServerSocket);
+dart.defineNamedConstructor(io.RawSecureServerSocket, '_');
+dart.setSignature(io.RawSecureServerSocket, {
+  constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
+  fields: () => ({
+    [_socket]: io.RawServerSocket,
+    [_controller$0]: StreamControllerOfRawSecureSocket(),
+    [_subscription$]: StreamSubscriptionOfRawSocket(),
+    [_context]: io.SecurityContext,
+    requestClientCertificate: core.bool,
+    requireClientCertificate: core.bool,
+    supportedProtocols: ListOfString(),
+    [_closed]: core.bool
+  }),
+  getters: () => ({
+    port: dart.definiteFunctionType(core.int, []),
+    address: dart.definiteFunctionType(io.InternetAddress, [])
+  }),
+  setters: () => ({[_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic])}),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
+    [_onData$]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
+    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
+    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), [dart.dynamic, core.int, io.SecurityContext], {backlog: core.int, v6Only: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString(), shared: core.bool})}),
+  names: ['bind']
+});
+io.X509Certificate = class X509Certificate extends core.Object {
+  static _() {
+    dart.throw(new core.UnsupportedError("X509Certificate constructor"));
+  }
+};
+dart.setSignature(io.X509Certificate, {
+  constructors: () => ({_: dart.definiteFunctionType(io.X509Certificate, [])})
+});
+io._FilterStatus = class _FilterStatus extends core.Object {
+  new() {
+    this.progress = false;
+    this.readEmpty = true;
+    this.writeEmpty = true;
+    this.readPlaintextNoLongerEmpty = false;
+    this.writePlaintextNoLongerFull = false;
+    this.readEncryptedNoLongerFull = false;
+    this.writeEncryptedNoLongerEmpty = false;
+  }
+};
+dart.setSignature(io._FilterStatus, {
+  constructors: () => ({new: dart.definiteFunctionType(io._FilterStatus, [])}),
+  fields: () => ({
+    progress: core.bool,
+    readEmpty: core.bool,
+    writeEmpty: core.bool,
+    readPlaintextNoLongerEmpty: core.bool,
+    writePlaintextNoLongerFull: core.bool,
+    readEncryptedNoLongerFull: core.bool,
+    writeEncryptedNoLongerEmpty: core.bool
+  })
+});
+const _handshakeComplete = Symbol('_handshakeComplete');
+const _status = Symbol('_status');
+const _filterStatus = Symbol('_filterStatus');
+const _secureFilter = Symbol('_secureFilter');
+const _bufferedData = Symbol('_bufferedData');
+const _bufferedDataIndex = Symbol('_bufferedDataIndex');
+const _writeEventsEnabled = Symbol('_writeEventsEnabled');
+const _readEventsEnabled = Symbol('_readEventsEnabled');
+const _pendingReadEvent = Symbol('_pendingReadEvent');
+const _socketClosedRead = Symbol('_socketClosedRead');
+const _socketClosedWrite = Symbol('_socketClosedWrite');
+const _closedRead = Symbol('_closedRead');
+const _closedWrite = Symbol('_closedWrite');
+const _connectPending = Symbol('_connectPending');
+const _filterPending = Symbol('_filterPending');
+const _filterActive = Symbol('_filterActive');
+const _selectedProtocol = Symbol('_selectedProtocol');
+const _secureHandshakeCompleteHandler = Symbol('_secureHandshakeCompleteHandler');
+const _onBadCertificateWrapper = Symbol('_onBadCertificateWrapper');
+const _eventDispatcher = Symbol('_eventDispatcher');
+const _doneHandler = Symbol('_doneHandler');
+const _secureHandshake = Symbol('_secureHandshake');
+const _sendWriteEvent = Symbol('_sendWriteEvent');
+const _completeCloseCompleter = Symbol('_completeCloseCompleter');
+const _close$0 = Symbol('_close');
+const _scheduleReadEvent = Symbol('_scheduleReadEvent');
+const _scheduleFilter = Symbol('_scheduleFilter');
+const _readHandler = Symbol('_readHandler');
+const _writeHandler = Symbol('_writeHandler');
+const _closeHandler = Symbol('_closeHandler');
+const _readSocket = Symbol('_readSocket');
+const _writeSocket = Symbol('_writeSocket');
+const _tryFilter = Symbol('_tryFilter');
+const _pushAllFilterStages = Symbol('_pushAllFilterStages');
+const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
+const _sendReadEvent = Symbol('_sendReadEvent');
+let const$75;
+io.RawSocketEvent = class RawSocketEvent extends core.Object {
+  _(value) {
+    this[_value$1] = value;
+  }
+  toString() {
+    return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
+  }
+};
+dart.defineNamedConstructor(io.RawSocketEvent, '_');
+dart.setSignature(io.RawSocketEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
+  fields: () => ({[_value$1]: core.int}),
+  sfields: () => ({
+    READ: io.RawSocketEvent,
+    WRITE: io.RawSocketEvent,
+    READ_CLOSED: io.RawSocketEvent,
+    CLOSED: io.RawSocketEvent
+  })
+});
+dart.defineLazy(io.RawSocketEvent, {
+  get READ() {
+    return dart.const(new io.RawSocketEvent._(0));
+  },
+  get WRITE() {
+    return dart.const(new io.RawSocketEvent._(1));
+  },
+  get READ_CLOSED() {
+    return dart.const(new io.RawSocketEvent._(2));
+  },
+  get CLOSED() {
+    return dart.const(new io.RawSocketEvent._(3));
+  }
+});
+io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
+  static _isBufferEncrypted(identifier) {
+    return dart.notNull(identifier) >= dart.notNull(io._RawSecureSocket.READ_ENCRYPTED);
+  }
+  static connect(host, requestedPort, opts) {
+    let is_server = opts && 'is_server' in opts ? opts.is_server : null;
+    let context = opts && 'context' in opts ? opts.context : null;
+    let socket = opts && 'socket' in opts ? opts.socket : null;
+    let subscription = opts && 'subscription' in opts ? opts.subscription : null;
+    let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
+    let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
+    io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
+    if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
+    let address = socket.address;
+    if (host != null) {
+      address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
     }
-  };
-  dart.setSignature(io.X509Certificate, {
-    constructors: () => ({_: dart.definiteFunctionType(io.X509Certificate, [])})
-  });
-  io._FilterStatus = class _FilterStatus extends core.Object {
-    new() {
-      this.progress = false;
-      this.readEmpty = true;
-      this.writeEmpty = true;
-      this.readPlaintextNoLongerEmpty = false;
-      this.writePlaintextNoLongerFull = false;
-      this.readEncryptedNoLongerFull = false;
-      this.writeEncryptedNoLongerEmpty = false;
+    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+  }
+  new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
+    this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
+    this[_status] = io._RawSecureSocket.HANDSHAKE;
+    this[_closeCompleter] = async.Completer.new();
+    this[_filterStatus] = new io._FilterStatus();
+    this[_secureFilter] = io._SecureFilter.new();
+    this.address = address;
+    this.is_server = is_server;
+    this.context = context;
+    this[_socket] = socket;
+    this[_socketSubscription] = socketSubscription;
+    this[_bufferedData] = bufferedData;
+    this.requestClientCertificate = requestClientCertificate;
+    this.requireClientCertificate = requireClientCertificate;
+    this.onBadCertificate = onBadCertificate;
+    this[_controller$0] = null;
+    this[_stream$] = null;
+    this[_bufferedDataIndex] = 0;
+    this[_writeEventsEnabled] = true;
+    this[_readEventsEnabled] = true;
+    this[_pauseCount$] = 0;
+    this[_pendingReadEvent] = false;
+    this[_socketClosedRead] = false;
+    this[_socketClosedWrite] = false;
+    this[_closedRead] = false;
+    this[_closedWrite] = false;
+    this[_connectPending] = true;
+    this[_filterPending] = false;
+    this[_filterActive] = false;
+    this[_selectedProtocol] = null;
+    super.new();
+    if (this.context == null) {
+      this.context = io.SecurityContext.defaultContext;
     }
-  };
-  dart.setSignature(io._FilterStatus, {
-    constructors: () => ({new: dart.definiteFunctionType(io._FilterStatus, [])}),
-    fields: () => ({
-      progress: core.bool,
-      readEmpty: core.bool,
-      writeEmpty: core.bool,
-      readPlaintextNoLongerEmpty: core.bool,
-      writePlaintextNoLongerFull: core.bool,
-      readEncryptedNoLongerFull: core.bool,
-      writeEncryptedNoLongerEmpty: core.bool
-    })
-  });
-  const _handshakeComplete = Symbol('_handshakeComplete');
-  const _status = Symbol('_status');
-  const _filterStatus = Symbol('_filterStatus');
-  const _secureFilter = Symbol('_secureFilter');
-  const _bufferedData = Symbol('_bufferedData');
-  const _bufferedDataIndex = Symbol('_bufferedDataIndex');
-  const _writeEventsEnabled = Symbol('_writeEventsEnabled');
-  const _readEventsEnabled = Symbol('_readEventsEnabled');
-  const _pendingReadEvent = Symbol('_pendingReadEvent');
-  const _socketClosedRead = Symbol('_socketClosedRead');
-  const _socketClosedWrite = Symbol('_socketClosedWrite');
-  const _closedRead = Symbol('_closedRead');
-  const _closedWrite = Symbol('_closedWrite');
-  const _connectPending = Symbol('_connectPending');
-  const _filterPending = Symbol('_filterPending');
-  const _filterActive = Symbol('_filterActive');
-  const _selectedProtocol = Symbol('_selectedProtocol');
-  const _secureHandshakeCompleteHandler = Symbol('_secureHandshakeCompleteHandler');
-  const _onBadCertificateWrapper = Symbol('_onBadCertificateWrapper');
-  const _eventDispatcher = Symbol('_eventDispatcher');
-  const _doneHandler = Symbol('_doneHandler');
-  const _secureHandshake = Symbol('_secureHandshake');
-  const _sendWriteEvent = Symbol('_sendWriteEvent');
-  const _completeCloseCompleter = Symbol('_completeCloseCompleter');
-  const _close$0 = Symbol('_close');
-  const _scheduleReadEvent = Symbol('_scheduleReadEvent');
-  const _scheduleFilter = Symbol('_scheduleFilter');
-  const _readHandler = Symbol('_readHandler');
-  const _writeHandler = Symbol('_writeHandler');
-  const _closeHandler = Symbol('_closeHandler');
-  const _readSocket = Symbol('_readSocket');
-  const _writeSocket = Symbol('_writeSocket');
-  const _tryFilter = Symbol('_tryFilter');
-  const _pushAllFilterStages = Symbol('_pushAllFilterStages');
-  const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
-  const _sendReadEvent = Symbol('_sendReadEvent');
-  let const$75;
-  io.RawSocketEvent = class RawSocketEvent extends core.Object {
-    _(value) {
-      this[_value$1] = value;
+    this[_controller$0] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
+    this[_stream$] = this[_controller$0].stream;
+    this[_secureFilter].init();
+    this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
+    if (this.onBadCertificate != null) {
+      this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
     }
-    toString() {
-      return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
-    }
-  };
-  dart.defineNamedConstructor(io.RawSocketEvent, '_');
-  dart.setSignature(io.RawSocketEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
-    fields: () => ({[_value$1]: core.int}),
-    sfields: () => ({
-      READ: io.RawSocketEvent,
-      WRITE: io.RawSocketEvent,
-      READ_CLOSED: io.RawSocketEvent,
-      CLOSED: io.RawSocketEvent
-    })
-  });
-  dart.defineLazy(io.RawSocketEvent, {
-    get READ() {
-      return dart.const(new io.RawSocketEvent._(0));
-    },
-    get WRITE() {
-      return dart.const(new io.RawSocketEvent._(1));
-    },
-    get READ_CLOSED() {
-      return dart.const(new io.RawSocketEvent._(2));
-    },
-    get CLOSED() {
-      return dart.const(new io.RawSocketEvent._(3));
-    }
-  });
-  io._RawSecureSocket = class _RawSecureSocket extends async.Stream$(io.RawSocketEvent) {
-    static _isBufferEncrypted(identifier) {
-      return dart.notNull(identifier) >= dart.notNull(io._RawSecureSocket.READ_ENCRYPTED);
-    }
-    static connect(host, requestedPort, opts) {
-      let is_server = opts && 'is_server' in opts ? opts.is_server : null;
-      let context = opts && 'context' in opts ? opts.context : null;
-      let socket = opts && 'socket' in opts ? opts.socket : null;
-      let subscription = opts && 'subscription' in opts ? opts.subscription : null;
-      let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      io._RawSecureSocket._verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate);
-      if (io.InternetAddress.is(host)) host = dart.dload(host, 'host');
-      let address = socket.address;
-      if (host != null) {
-        address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
+    this[_socket].readEventsEnabled = true;
+    this[_socket].writeEventsEnabled = false;
+    if (this[_socketSubscription] == null) {
+      this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
+    } else {
+      if (dart.test(this[_socketSubscription].isPaused)) {
+        this[_socket].close();
+        dart.throw(new core.ArgumentError("Subscription passed to TLS upgrade is paused"));
       }
-      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+      let s = this[_socket];
+      if (dart.test(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
+        this[_eventDispatcher](io.RawSocketEvent.READ_CLOSED);
+      }
+      let _ = this[_socketSubscription];
+      _.onData(dart.bind(this, _eventDispatcher));
+      _.onError(dart.bind(this, _reportError));
+      _.onDone(dart.bind(this, _doneHandler));
     }
-    new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
-      this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
-      this[_status] = io._RawSecureSocket.HANDSHAKE;
-      this[_closeCompleter] = async.Completer.new();
-      this[_filterStatus] = new io._FilterStatus();
-      this[_secureFilter] = io._SecureFilter.new();
-      this.address = address;
-      this.is_server = is_server;
-      this.context = context;
-      this[_socket] = socket;
-      this[_socketSubscription] = socketSubscription;
-      this[_bufferedData] = bufferedData;
-      this.requestClientCertificate = requestClientCertificate;
-      this.requireClientCertificate = requireClientCertificate;
-      this.onBadCertificate = onBadCertificate;
-      this[_controller$0] = null;
-      this[_stream$] = null;
-      this[_bufferedDataIndex] = 0;
-      this[_writeEventsEnabled] = true;
-      this[_readEventsEnabled] = true;
-      this[_pauseCount$] = 0;
-      this[_pendingReadEvent] = false;
-      this[_socketClosedRead] = false;
-      this[_socketClosedWrite] = false;
-      this[_closedRead] = false;
-      this[_closedWrite] = false;
-      this[_connectPending] = true;
-      this[_filterPending] = false;
-      this[_filterActive] = false;
-      this[_selectedProtocol] = null;
-      super.new();
-      if (this.context == null) {
-        this.context = io.SecurityContext.defaultContext;
-      }
-      this[_controller$0] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
-      this[_stream$] = this[_controller$0].stream;
-      this[_secureFilter].init();
-      this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
-      if (this.onBadCertificate != null) {
-        this[_secureFilter].registerBadCertificateCallback(dart.bind(this, _onBadCertificateWrapper));
-      }
-      this[_socket].readEventsEnabled = true;
-      this[_socket].writeEventsEnabled = false;
-      if (this[_socketSubscription] == null) {
-        this[_socketSubscription] = this[_socket].listen(dart.bind(this, _eventDispatcher), {onError: dart.bind(this, _reportError), onDone: dart.bind(this, _doneHandler)});
-      } else {
-        if (dart.test(this[_socketSubscription].isPaused)) {
-          this[_socket].close();
-          dart.throw(new core.ArgumentError("Subscription passed to TLS upgrade is paused"));
-        }
-        let s = this[_socket];
-        if (dart.test(dart.dload(dart.dload(s, _socket), 'closedReadEventSent'))) {
-          this[_eventDispatcher](io.RawSocketEvent.READ_CLOSED);
-        }
-        let _ = this[_socketSubscription];
-        _.onData(dart.bind(this, _eventDispatcher));
-        _.onError(dart.bind(this, _reportError));
-        _.onDone(dart.bind(this, _doneHandler));
-      }
-      try {
-        let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
-        this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
-        this[_secureHandshake]();
-      } catch (e) {
-        let s = dart.stackTrace(e);
-        this[_reportError](e, s);
-      }
+    try {
+      let encodedProtocols = io.SecurityContext._protocolsToLengthEncoding(supportedProtocols);
+      this[_secureFilter].connect(this.address.host, this.context, this.is_server, dart.test(this.requestClientCertificate) || dart.test(this.requireClientCertificate), this.requireClientCertificate, encodedProtocols);
+      this[_secureHandshake]();
+    } catch (e) {
+      let s = dart.stackTrace(e);
+      this[_reportError](e, s);
+    }
 
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    this[_sendWriteEvent]();
+    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
+    if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
+      dart.throw(new core.ArgumentError("host is not a String or an InternetAddress"));
     }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      this[_sendWriteEvent]();
-      return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    if (!(typeof requestedPort == 'number')) {
+      dart.throw(new core.ArgumentError("requestedPort is not an int"));
     }
-    static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
-      if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
-        dart.throw(new core.ArgumentError("host is not a String or an InternetAddress"));
-      }
-      if (!(typeof requestedPort == 'number')) {
-        dart.throw(new core.ArgumentError("requestedPort is not an int"));
-      }
-      if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
-        dart.throw(new core.ArgumentError("requestedPort is not in the range 0..65535"));
-      }
-      if (!(typeof requestClientCertificate == 'boolean')) {
-        dart.throw(new core.ArgumentError("requestClientCertificate is not a bool"));
-      }
-      if (!(typeof requireClientCertificate == 'boolean')) {
-        dart.throw(new core.ArgumentError("requireClientCertificate is not a bool"));
-      }
-      if (onBadCertificate != null && !core.Function.is(onBadCertificate)) {
-        dart.throw(new core.ArgumentError("onBadCertificate is not null or a Function"));
-      }
+    if (dart.notNull(requestedPort) < 0 || dart.notNull(requestedPort) > 65535) {
+      dart.throw(new core.ArgumentError("requestedPort is not in the range 0..65535"));
     }
-    get port() {
-      return this[_socket].port;
+    if (!(typeof requestClientCertificate == 'boolean')) {
+      dart.throw(new core.ArgumentError("requestClientCertificate is not a bool"));
     }
-    get remoteAddress() {
-      return this[_socket].remoteAddress;
+    if (!(typeof requireClientCertificate == 'boolean')) {
+      dart.throw(new core.ArgumentError("requireClientCertificate is not a bool"));
     }
-    get remotePort() {
-      return this[_socket].remotePort;
+    if (onBadCertificate != null && !core.Function.is(onBadCertificate)) {
+      dart.throw(new core.ArgumentError("onBadCertificate is not null or a Function"));
     }
-    set [_owner](owner) {
-      dart.dput(this[_socket], _owner, owner);
+  }
+  get port() {
+    return this[_socket].port;
+  }
+  get remoteAddress() {
+    return this[_socket].remoteAddress;
+  }
+  get remotePort() {
+    return this[_socket].remotePort;
+  }
+  set [_owner](owner) {
+    dart.dput(this[_socket], _owner, owner);
+  }
+  available() {
+    return this[_status] != io._RawSecureSocket.CONNECTED ? 0 : this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).length;
+  }
+  close() {
+    this.shutdown(io.SocketDirection.BOTH);
+    return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+  }
+  [_completeCloseCompleter](dummy) {
+    if (dummy === void 0) dummy = null;
+    if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
+  }
+  [_close$0]() {
+    this[_closedWrite] = true;
+    this[_closedRead] = true;
+    if (this[_socket] != null) {
+      this[_socket].close().then(dart.void)(dart.bind(this, _completeCloseCompleter));
+    } else {
+      this[_completeCloseCompleter]();
     }
-    available() {
-      return this[_status] != io._RawSecureSocket.CONNECTED ? 0 : this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).length;
+    this[_socketClosedWrite] = true;
+    this[_socketClosedRead] = true;
+    if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
+      this[_secureFilter].destroy();
+      this[_secureFilter] = null;
     }
-    close() {
-      this.shutdown(io.SocketDirection.BOTH);
-      return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+    if (this[_socketSubscription] != null) {
+      this[_socketSubscription].cancel();
     }
-    [_completeCloseCompleter](dummy) {
-      if (dummy === void 0) dummy = null;
-      if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
-    }
-    [_close$0]() {
+    this[_controller$0].close();
+    this[_status] = io._RawSecureSocket.CLOSED;
+  }
+  shutdown(direction) {
+    if (dart.equals(direction, io.SocketDirection.SEND) || dart.equals(direction, io.SocketDirection.BOTH)) {
       this[_closedWrite] = true;
-      this[_closedRead] = true;
-      if (this[_socket] != null) {
-        this[_socket].close().then(dart.void)(dart.bind(this, _completeCloseCompleter));
-      } else {
-        this[_completeCloseCompleter]();
-      }
-      this[_socketClosedWrite] = true;
-      this[_socketClosedRead] = true;
-      if (!dart.test(this[_filterActive]) && this[_secureFilter] != null) {
-        this[_secureFilter].destroy();
-        this[_secureFilter] = null;
-      }
-      if (this[_socketSubscription] != null) {
-        this[_socketSubscription].cancel();
-      }
-      this[_controller$0].close();
-      this[_status] = io._RawSecureSocket.CLOSED;
-    }
-    shutdown(direction) {
-      if (dart.equals(direction, io.SocketDirection.SEND) || dart.equals(direction, io.SocketDirection.BOTH)) {
-        this[_closedWrite] = true;
-        if (dart.test(this[_filterStatus].writeEmpty)) {
-          this[_socket].shutdown(io.SocketDirection.SEND);
-          this[_socketClosedWrite] = true;
-          if (dart.test(this[_closedRead])) {
-            this[_close$0]();
-          }
-        }
-      }
-      if (dart.equals(direction, io.SocketDirection.RECEIVE) || dart.equals(direction, io.SocketDirection.BOTH)) {
-        this[_closedRead] = true;
-        this[_socketClosedRead] = true;
-        this[_socket].shutdown(io.SocketDirection.RECEIVE);
-        if (dart.test(this[_socketClosedWrite])) {
+      if (dart.test(this[_filterStatus].writeEmpty)) {
+        this[_socket].shutdown(io.SocketDirection.SEND);
+        this[_socketClosedWrite] = true;
+        if (dart.test(this[_closedRead])) {
           this[_close$0]();
         }
       }
     }
-    get writeEventsEnabled() {
-      return this[_writeEventsEnabled];
-    }
-    set writeEventsEnabled(value) {
-      this[_writeEventsEnabled] = value;
-      if (dart.test(value)) {
-        async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid$()));
-      }
-    }
-    get readEventsEnabled() {
-      return this[_readEventsEnabled];
-    }
-    set readEventsEnabled(value) {
-      this[_readEventsEnabled] = value;
-      this[_scheduleReadEvent]();
-    }
-    read(length) {
-      if (length === void 0) length = null;
-      if (length != null && (!(typeof length == 'number') || dart.notNull(length) < 0)) {
-        dart.throw(new core.ArgumentError(dart.str`Invalid length parameter in SecureSocket.read (length: ${length})`));
-      }
-      if (dart.test(this[_closedRead])) {
-        dart.throw(new io.SocketException("Reading from a closed socket"));
-      }
-      if (this[_status] != io._RawSecureSocket.CONNECTED) {
-        return null;
-      }
-      let result = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).read(length);
-      this[_scheduleFilter]();
-      return result;
-    }
-    write(data, offset, bytes) {
-      if (offset === void 0) offset = null;
-      if (bytes === void 0) bytes = null;
-      if (bytes != null && (!(typeof bytes == 'number') || dart.notNull(bytes) < 0)) {
-        dart.throw(new core.ArgumentError(dart.str`Invalid bytes parameter in SecureSocket.read (bytes: ${bytes})`));
-      }
-      if (offset != null && (!(typeof offset == 'number') || dart.notNull(offset) < 0)) {
-        dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
-      }
-      if (dart.test(this[_closedWrite])) {
-        this[_controller$0].addError(new io.SocketException("Writing to a closed socket"));
-        return 0;
-      }
-      if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
-      if (offset == null) offset = 0;
-      if (bytes == null) bytes = dart.notNull(data[dartx.length]) - dart.notNull(offset);
-      let written = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).write(data, offset, bytes);
-      if (dart.notNull(written) > 0) {
-        this[_filterStatus].writeEmpty = false;
-      }
-      this[_scheduleFilter]();
-      return written;
-    }
-    get peerCertificate() {
-      return this[_secureFilter].peerCertificate;
-    }
-    get selectedProtocol() {
-      return this[_selectedProtocol];
-    }
-    [_onBadCertificateWrapper](certificate) {
-      if (this.onBadCertificate == null) return false;
-      let result = dart.dcall(this.onBadCertificate, certificate);
-      if (typeof result == 'boolean') return result;
-      dart.throw(new io.HandshakeException(dart.str`onBadCertificate callback returned non-boolean ${result}`));
-    }
-    setOption(option, enabled) {
-      if (this[_socket] == null) return false;
-      return this[_socket].setOption(option, enabled);
-    }
-    [_eventDispatcher](event) {
-      try {
-        if (dart.equals(event, io.RawSocketEvent.READ)) {
-          this[_readHandler]();
-        } else if (dart.equals(event, io.RawSocketEvent.WRITE)) {
-          this[_writeHandler]();
-        } else if (dart.equals(event, io.RawSocketEvent.READ_CLOSED)) {
-          this[_closeHandler]();
-        }
-      } catch (e) {
-        let stackTrace = dart.stackTrace(e);
-        this[_reportError](e, stackTrace);
-      }
-
-    }
-    [_readHandler]() {
-      this[_readSocket]();
-      this[_scheduleFilter]();
-    }
-    [_writeHandler]() {
-      this[_writeSocket]();
-      this[_scheduleFilter]();
-    }
-    [_doneHandler]() {
-      if (dart.test(this[_filterStatus].readEmpty)) {
+    if (dart.equals(direction, io.SocketDirection.RECEIVE) || dart.equals(direction, io.SocketDirection.BOTH)) {
+      this[_closedRead] = true;
+      this[_socketClosedRead] = true;
+      this[_socket].shutdown(io.SocketDirection.RECEIVE);
+      if (dart.test(this[_socketClosedWrite])) {
         this[_close$0]();
       }
     }
-    [_reportError](e, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      if (this[_status] == io._RawSecureSocket.CLOSED) {
-        return;
-      } else if (dart.test(this[_connectPending])) {
-        this[_handshakeComplete].completeError(e, stackTrace);
-      } else {
-        this[_controller$0].addError(e, stackTrace);
+  }
+  get writeEventsEnabled() {
+    return this[_writeEventsEnabled];
+  }
+  set writeEventsEnabled(value) {
+    this[_writeEventsEnabled] = value;
+    if (dart.test(value)) {
+      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid$()));
+    }
+  }
+  get readEventsEnabled() {
+    return this[_readEventsEnabled];
+  }
+  set readEventsEnabled(value) {
+    this[_readEventsEnabled] = value;
+    this[_scheduleReadEvent]();
+  }
+  read(length) {
+    if (length === void 0) length = null;
+    if (length != null && (!(typeof length == 'number') || dart.notNull(length) < 0)) {
+      dart.throw(new core.ArgumentError(dart.str`Invalid length parameter in SecureSocket.read (length: ${length})`));
+    }
+    if (dart.test(this[_closedRead])) {
+      dart.throw(new io.SocketException("Reading from a closed socket"));
+    }
+    if (this[_status] != io._RawSecureSocket.CONNECTED) {
+      return null;
+    }
+    let result = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).read(length);
+    this[_scheduleFilter]();
+    return result;
+  }
+  write(data, offset, bytes) {
+    if (offset === void 0) offset = null;
+    if (bytes === void 0) bytes = null;
+    if (bytes != null && (!(typeof bytes == 'number') || dart.notNull(bytes) < 0)) {
+      dart.throw(new core.ArgumentError(dart.str`Invalid bytes parameter in SecureSocket.read (bytes: ${bytes})`));
+    }
+    if (offset != null && (!(typeof offset == 'number') || dart.notNull(offset) < 0)) {
+      dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
+    }
+    if (dart.test(this[_closedWrite])) {
+      this[_controller$0].addError(new io.SocketException("Writing to a closed socket"));
+      return 0;
+    }
+    if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
+    if (offset == null) offset = 0;
+    if (bytes == null) bytes = dart.notNull(data[dartx.length]) - dart.notNull(offset);
+    let written = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).write(data, offset, bytes);
+    if (dart.notNull(written) > 0) {
+      this[_filterStatus].writeEmpty = false;
+    }
+    this[_scheduleFilter]();
+    return written;
+  }
+  get peerCertificate() {
+    return this[_secureFilter].peerCertificate;
+  }
+  get selectedProtocol() {
+    return this[_selectedProtocol];
+  }
+  [_onBadCertificateWrapper](certificate) {
+    if (this.onBadCertificate == null) return false;
+    let result = dart.dcall(this.onBadCertificate, certificate);
+    if (typeof result == 'boolean') return result;
+    dart.throw(new io.HandshakeException(dart.str`onBadCertificate callback returned non-boolean ${result}`));
+  }
+  setOption(option, enabled) {
+    if (this[_socket] == null) return false;
+    return this[_socket].setOption(option, enabled);
+  }
+  [_eventDispatcher](event) {
+    try {
+      if (dart.equals(event, io.RawSocketEvent.READ)) {
+        this[_readHandler]();
+      } else if (dart.equals(event, io.RawSocketEvent.WRITE)) {
+        this[_writeHandler]();
+      } else if (dart.equals(event, io.RawSocketEvent.READ_CLOSED)) {
+        this[_closeHandler]();
       }
+    } catch (e) {
+      let stackTrace = dart.stackTrace(e);
+      this[_reportError](e, stackTrace);
+    }
+
+  }
+  [_readHandler]() {
+    this[_readSocket]();
+    this[_scheduleFilter]();
+  }
+  [_writeHandler]() {
+    this[_writeSocket]();
+    this[_scheduleFilter]();
+  }
+  [_doneHandler]() {
+    if (dart.test(this[_filterStatus].readEmpty)) {
       this[_close$0]();
     }
-    [_closeHandler]() {
-      if (this[_status] == io._RawSecureSocket.CONNECTED) {
-        if (dart.test(this[_closedRead])) return;
-        this[_socketClosedRead] = true;
-        if (dart.test(this[_filterStatus].readEmpty)) {
-          this[_closedRead] = true;
-          this[_controller$0].add(io.RawSocketEvent.READ_CLOSED);
-          if (dart.test(this[_socketClosedWrite])) {
-            this[_close$0]();
-          }
-        } else {
-          this[_scheduleFilter]();
-        }
-      } else if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
-        this[_socketClosedRead] = true;
-        if (dart.test(this[_filterStatus].readEmpty)) {
-          this[_reportError](new io.HandshakeException('Connection terminated during handshake'), null);
-        } else {
-          this[_secureHandshake]();
-        }
-      }
+  }
+  [_reportError](e, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    if (this[_status] == io._RawSecureSocket.CLOSED) {
+      return;
+    } else if (dart.test(this[_connectPending])) {
+      this[_handshakeComplete].completeError(e, stackTrace);
+    } else {
+      this[_controller$0].addError(e, stackTrace);
     }
-    [_secureHandshake]() {
-      try {
-        this[_secureFilter].handshake();
-        this[_filterStatus].writeEmpty = false;
-        this[_readSocket]();
-        this[_writeSocket]();
+    this[_close$0]();
+  }
+  [_closeHandler]() {
+    if (this[_status] == io._RawSecureSocket.CONNECTED) {
+      if (dart.test(this[_closedRead])) return;
+      this[_socketClosedRead] = true;
+      if (dart.test(this[_filterStatus].readEmpty)) {
+        this[_closedRead] = true;
+        this[_controller$0].add(io.RawSocketEvent.READ_CLOSED);
+        if (dart.test(this[_socketClosedWrite])) {
+          this[_close$0]();
+        }
+      } else {
         this[_scheduleFilter]();
-      } catch (e) {
-        let stackTrace = dart.stackTrace(e);
-        this[_reportError](e, stackTrace);
       }
-
+    } else if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
+      this[_socketClosedRead] = true;
+      if (dart.test(this[_filterStatus].readEmpty)) {
+        this[_reportError](new io.HandshakeException('Connection terminated during handshake'), null);
+      } else {
+        this[_secureHandshake]();
+      }
     }
-    renegotiate(opts) {
-      let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
-      let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
-      let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
-      if (this[_status] != io._RawSecureSocket.CONNECTED) {
-        dart.throw(new io.HandshakeException("Called renegotiate on a non-connected socket"));
-      }
-      this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
-      this[_status] = io._RawSecureSocket.HANDSHAKE;
+  }
+  [_secureHandshake]() {
+    try {
+      this[_secureFilter].handshake();
       this[_filterStatus].writeEmpty = false;
+      this[_readSocket]();
+      this[_writeSocket]();
       this[_scheduleFilter]();
+    } catch (e) {
+      let stackTrace = dart.stackTrace(e);
+      this[_reportError](e, stackTrace);
     }
-    [_secureHandshakeCompleteHandler]() {
-      this[_status] = io._RawSecureSocket.CONNECTED;
-      if (dart.test(this[_connectPending])) {
-        this[_connectPending] = false;
-        try {
-          this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
-          async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid$()));
-        } catch (error) {
-          let stack = dart.stackTrace(error);
-          this[_handshakeComplete].completeError(error, stack);
-        }
 
-      }
+  }
+  renegotiate(opts) {
+    let useSessionCache = opts && 'useSessionCache' in opts ? opts.useSessionCache : true;
+    let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
+    let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
+    if (this[_status] != io._RawSecureSocket.CONNECTED) {
+      dart.throw(new io.HandshakeException("Called renegotiate on a non-connected socket"));
     }
-    [_onPauseStateChange]() {
-      if (dart.test(this[_controller$0].isPaused)) {
-        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
-      } else {
-        this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
-        if (this[_pauseCount$] == 0) {
-          this[_scheduleReadEvent]();
-          this[_sendWriteEvent]();
-        }
+    this[_secureFilter].renegotiate(useSessionCache, requestClientCertificate, requireClientCertificate);
+    this[_status] = io._RawSecureSocket.HANDSHAKE;
+    this[_filterStatus].writeEmpty = false;
+    this[_scheduleFilter]();
+  }
+  [_secureHandshakeCompleteHandler]() {
+    this[_status] = io._RawSecureSocket.CONNECTED;
+    if (dart.test(this[_connectPending])) {
+      this[_connectPending] = false;
+      try {
+        this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
+        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid$()));
+      } catch (error) {
+        let stack = dart.stackTrace(error);
+        this[_handshakeComplete].completeError(error, stack);
       }
-      if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
-        if (dart.test(this[_controller$0].isPaused)) {
-          this[_socketSubscription].pause();
-        } else {
-          this[_socketSubscription].resume();
-        }
-      }
+
     }
-    [_onSubscriptionStateChange]() {
-      if (dart.test(this[_controller$0].hasListener)) {
-      }
-    }
-    [_scheduleFilter]() {
-      this[_filterPending] = true;
-      this[_tryFilter]();
-    }
-    [_tryFilter]() {
-      if (this[_status] == io._RawSecureSocket.CLOSED) {
-        return;
-      }
-      if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
-        this[_filterActive] = true;
-        this[_filterPending] = false;
-        this[_pushAllFilterStages]().then(dart.dynamic)(dart.fn(status => {
-          this[_filterStatus] = status;
-          this[_filterActive] = false;
-          if (this[_status] == io._RawSecureSocket.CLOSED) {
-            this[_secureFilter].destroy();
-            this[_secureFilter] = null;
-            return;
-          }
-          this[_socket].readEventsEnabled = true;
-          if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
-            this.shutdown(io.SocketDirection.SEND);
-            if (this[_status] == io._RawSecureSocket.CLOSED) {
-              return;
-            }
-          }
-          if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
-            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
-              this[_secureFilter].handshake();
-              if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
-                dart.throw(new io.HandshakeException('Connection terminated during handshake'));
-              }
-            }
-            this[_closeHandler]();
-          }
-          if (this[_status] == io._RawSecureSocket.CLOSED) {
-            return;
-          }
-          if (dart.test(this[_filterStatus].progress)) {
-            this[_filterPending] = true;
-            if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
-              this[_writeSocket]();
-            }
-            if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
-              this[_sendWriteEvent]();
-            }
-            if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
-              this[_readSocket]();
-            }
-            if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
-              this[_scheduleReadEvent]();
-            }
-            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
-              this[_secureHandshake]();
-            }
-          }
-          this[_tryFilter]();
-        }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
-      }
-    }
-    [_readSocketOrBufferedData](bytes) {
-      if (this[_bufferedData] != null) {
-        if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex])) {
-          bytes = dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex]);
-        }
-        let result = this[_bufferedData][dartx.sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
-        this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
-        if (this[_bufferedData][dartx.length] == this[_bufferedDataIndex]) {
-          this[_bufferedData] = null;
-        }
-        return result;
-      } else if (!dart.test(this[_socketClosedRead])) {
-        return this[_socket].read(bytes);
-      } else {
-        return null;
-      }
-    }
-    [_readSocket]() {
-      if (this[_status] == io._RawSecureSocket.CLOSED) return;
-      let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
-      if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
-        this[_filterStatus].readEmpty = false;
-      } else {
-        this[_socket].readEventsEnabled = false;
-      }
-    }
-    [_writeSocket]() {
-      if (dart.test(this[_socketClosedWrite])) return;
-      let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
-      if (dart.test(buffer.readToSocket(this[_socket]))) {
-        this[_socket].writeEventsEnabled = true;
-      }
-    }
-    [_scheduleReadEvent]() {
-      if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
-        this[_pendingReadEvent] = true;
-        async.Timer.run(dart.bind(this, _sendReadEvent));
-      }
-    }
-    [_sendReadEvent]() {
-      this[_pendingReadEvent] = false;
-      if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
-        this[_controller$0].add(io.RawSocketEvent.READ);
+  }
+  [_onPauseStateChange]() {
+    if (dart.test(this[_controller$0].isPaused)) {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
+    } else {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
+      if (this[_pauseCount$] == 0) {
         this[_scheduleReadEvent]();
+        this[_sendWriteEvent]();
       }
     }
-    [_sendWriteEvent]() {
-      if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
-        this[_writeEventsEnabled] = false;
-        this[_controller$0].add(io.RawSocketEvent.WRITE);
-      }
-    }
-    [_pushAllFilterStages]() {
-      let wasInHandshake = this[_status] != io._RawSecureSocket.CONNECTED;
-      let args = core.List.new(2 + dart.notNull(io._RawSecureSocket.NUM_BUFFERS) * 2);
-      args[dartx._set](0, this[_secureFilter][_pointer]());
-      args[dartx._set](1, wasInHandshake);
-      let bufs = this[_secureFilter].buffers;
-      for (let i = 0; i < dart.notNull(io._RawSecureSocket.NUM_BUFFERS); ++i) {
-        args[dartx._set](2 * i + 2, bufs[dartx._get](i).start);
-        args[dartx._set](2 * i + 3, bufs[dartx._get](i).end);
-      }
-      return io._IOService._dispatch(io._SSL_PROCESS_FILTER, args).then(io._FilterStatus)(dart.fn(response => {
-        if (dart.equals(dart.dload(response, 'length'), 2)) {
-          if (wasInHandshake) {
-            this[_reportError](new io.HandshakeException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
-          } else {
-            this[_reportError](new io.TlsException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
-          }
-        }
-        function start(index) {
-          return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
-        }
-        dart.fn(start, intToint());
-        function end(index) {
-          return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
-        }
-        dart.fn(end, intToint());
-        let status = new io._FilterStatus();
-        status.writeEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).isEmpty) && start(io._RawSecureSocket.WRITE_ENCRYPTED) == end(io._RawSecureSocket.WRITE_ENCRYPTED);
-        if (wasInHandshake) status.writeEmpty = false;
-        status.readEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED).isEmpty) && start(io._RawSecureSocket.READ_PLAINTEXT) == end(io._RawSecureSocket.READ_PLAINTEXT);
-        let buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT);
-        let new_start = start(io._RawSecureSocket.WRITE_PLAINTEXT);
-        if (new_start != buffer.start) {
-          status.progress = true;
-          if (buffer.free == 0) {
-            status.writePlaintextNoLongerFull = true;
-          }
-          buffer.start = new_start;
-        }
-        buffer = bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
-        new_start = start(io._RawSecureSocket.READ_ENCRYPTED);
-        if (new_start != buffer.start) {
-          status.progress = true;
-          if (buffer.free == 0) {
-            status.readEncryptedNoLongerFull = true;
-          }
-          buffer.start = new_start;
-        }
-        buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
-        let new_end = end(io._RawSecureSocket.WRITE_ENCRYPTED);
-        if (new_end != buffer.end) {
-          status.progress = true;
-          if (buffer.length == 0) {
-            status.writeEncryptedNoLongerEmpty = true;
-          }
-          buffer.end = new_end;
-        }
-        buffer = bufs[dartx._get](io._RawSecureSocket.READ_PLAINTEXT);
-        new_end = end(io._RawSecureSocket.READ_PLAINTEXT);
-        if (new_end != buffer.end) {
-          status.progress = true;
-          if (buffer.length == 0) {
-            status.readPlaintextNoLongerEmpty = true;
-          }
-          buffer.end = new_end;
-        }
-        return status;
-      }, dynamicTo_FilterStatus()));
-    }
-  };
-  dart.addSimpleTypeTests(io._RawSecureSocket);
-  io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
-  dart.setSignature(io._RawSecureSocket, {
-    constructors: () => ({new: dart.definiteFunctionType(io._RawSecureSocket, [io.InternetAddress, core.int, core.bool, io.SecurityContext, io.RawSocket, StreamSubscriptionOfRawSocketEvent(), ListOfint(), core.bool, core.bool, X509CertificateTodynamic(), ListOfString()])}),
-    fields: () => ({
-      [_socket]: io.RawSocket,
-      [_handshakeComplete]: CompleterOf_RawSecureSocket(),
-      [_controller$0]: StreamControllerOfRawSocketEvent(),
-      [_stream$]: StreamOfRawSocketEvent(),
-      [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
-      [_bufferedData]: ListOfint(),
-      [_bufferedDataIndex]: core.int,
-      address: io.InternetAddress,
-      is_server: core.bool,
-      context: io.SecurityContext,
-      requestClientCertificate: core.bool,
-      requireClientCertificate: core.bool,
-      onBadCertificate: core.Function,
-      [_status]: core.int,
-      [_writeEventsEnabled]: core.bool,
-      [_readEventsEnabled]: core.bool,
-      [_pauseCount$]: core.int,
-      [_pendingReadEvent]: core.bool,
-      [_socketClosedRead]: core.bool,
-      [_socketClosedWrite]: core.bool,
-      [_closedRead]: core.bool,
-      [_closedWrite]: core.bool,
-      [_closeCompleter]: async.Completer,
-      [_filterStatus]: io._FilterStatus,
-      [_connectPending]: core.bool,
-      [_filterPending]: core.bool,
-      [_filterActive]: core.bool,
-      [_secureFilter]: io._SecureFilter,
-      [_selectedProtocol]: core.String
-    }),
-    getters: () => ({
-      port: dart.definiteFunctionType(core.int, []),
-      remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
-      remotePort: dart.definiteFunctionType(core.int, []),
-      writeEventsEnabled: dart.definiteFunctionType(core.bool, []),
-      readEventsEnabled: dart.definiteFunctionType(core.bool, []),
-      peerCertificate: dart.definiteFunctionType(io.X509Certificate, []),
-      selectedProtocol: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({
-      [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      writeEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool]),
-      readEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool])
-    }),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      available: dart.definiteFunctionType(core.int, []),
-      close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
-      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
-      [_close$0]: dart.definiteFunctionType(dart.void, []),
-      shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
-      read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
-      write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
-      [_onBadCertificateWrapper]: dart.definiteFunctionType(core.bool, [io.X509Certificate]),
-      setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
-      [_eventDispatcher]: dart.definiteFunctionType(dart.void, [io.RawSocketEvent]),
-      [_readHandler]: dart.definiteFunctionType(dart.void, []),
-      [_writeHandler]: dart.definiteFunctionType(dart.void, []),
-      [_doneHandler]: dart.definiteFunctionType(dart.void, []),
-      [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      [_closeHandler]: dart.definiteFunctionType(dart.void, []),
-      [_secureHandshake]: dart.definiteFunctionType(dart.void, []),
-      renegotiate: dart.definiteFunctionType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
-      [_secureHandshakeCompleteHandler]: dart.definiteFunctionType(dart.void, []),
-      [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
-      [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, []),
-      [_scheduleFilter]: dart.definiteFunctionType(dart.void, []),
-      [_tryFilter]: dart.definiteFunctionType(dart.void, []),
-      [_readSocketOrBufferedData]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
-      [_readSocket]: dart.definiteFunctionType(dart.void, []),
-      [_writeSocket]: dart.definiteFunctionType(dart.void, []),
-      [_scheduleReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
-      [_sendReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
-      [_sendWriteEvent]: dart.definiteFunctionType(dart.dynamic, []),
-      [_pushAllFilterStages]: dart.definiteFunctionType(async.Future$(io._FilterStatus), [])
-    }),
-    sfields: () => ({
-      HANDSHAKE: core.int,
-      CONNECTED: core.int,
-      CLOSED: core.int,
-      READ_PLAINTEXT: core.int,
-      WRITE_PLAINTEXT: core.int,
-      READ_ENCRYPTED: core.int,
-      WRITE_ENCRYPTED: core.int,
-      NUM_BUFFERS: core.int
-    }),
-    statics: () => ({
-      _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
-      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
-    }),
-    names: ['_isBufferEncrypted', 'connect', '_verifyFields']
-  });
-  io._RawSecureSocket.HANDSHAKE = 201;
-  io._RawSecureSocket.CONNECTED = 202;
-  io._RawSecureSocket.CLOSED = 203;
-  io._RawSecureSocket.READ_PLAINTEXT = 0;
-  io._RawSecureSocket.WRITE_PLAINTEXT = 1;
-  io._RawSecureSocket.READ_ENCRYPTED = 2;
-  io._RawSecureSocket.WRITE_ENCRYPTED = 3;
-  io._RawSecureSocket.NUM_BUFFERS = 4;
-  io._ExternalBuffer = class _ExternalBuffer extends core.Object {
-    new(size) {
-      this.size = size;
-      this.data = null;
-      this.start = null;
-      this.end = null;
-      this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', 2)));
-    }
-    advanceStart(bytes) {
-      dart.assert(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end));
-      this.start = dart.notNull(this.start) + dart.notNull(bytes);
-      if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
-        this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
-        dart.assert(dart.notNull(this.start) <= dart.notNull(this.end));
-        dart.assert(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)));
-      }
-    }
-    advanceEnd(bytes) {
-      dart.assert(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes));
-      this.end = dart.notNull(this.end) + dart.notNull(bytes);
-      if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
-        this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
-        dart.assert(dart.notNull(this.end) < dart.notNull(this.start));
-        dart.assert(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)));
-      }
-    }
-    get isEmpty() {
-      return this.end == this.start;
-    }
-    get length() {
-      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', this.end), '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
-    }
-    get linearLength() {
-      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
-    }
-    get free() {
-      return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', this.start), '-', this.end), '-', 1));
-    }
-    get linearFree() {
-      if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
-      if (this.start == 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', this.end), '-', 1));
-      return core.int._check(dart.dsend(this.size, '-', this.end));
-    }
-    read(bytes) {
-      if (bytes == null) {
-        bytes = this.length;
+    if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
+      if (dart.test(this[_controller$0].isPaused)) {
+        this[_socketSubscription].pause();
       } else {
-        bytes = math.min(core.int)(bytes, this.length);
+        this[_socketSubscription].resume();
       }
-      if (bytes == 0) return null;
-      let result = typed_data.Uint8List.new(bytes);
-      let bytesRead = 0;
-      while (dart.notNull(bytesRead) < dart.notNull(bytes)) {
-        let toRead = math.min(core.int)(dart.notNull(bytes) - dart.notNull(bytesRead), this.linearLength);
-        result[dartx.setRange](bytesRead, dart.notNull(bytesRead) + dart.notNull(toRead), this.data, this.start);
-        this.advanceStart(toRead);
-        bytesRead = dart.notNull(bytesRead) + dart.notNull(toRead);
+    }
+  }
+  [_onSubscriptionStateChange]() {
+    if (dart.test(this[_controller$0].hasListener)) {
+    }
+  }
+  [_scheduleFilter]() {
+    this[_filterPending] = true;
+    this[_tryFilter]();
+  }
+  [_tryFilter]() {
+    if (this[_status] == io._RawSecureSocket.CLOSED) {
+      return;
+    }
+    if (dart.test(this[_filterPending]) && !dart.test(this[_filterActive])) {
+      this[_filterActive] = true;
+      this[_filterPending] = false;
+      this[_pushAllFilterStages]().then(dart.dynamic)(dart.fn(status => {
+        this[_filterStatus] = status;
+        this[_filterActive] = false;
+        if (this[_status] == io._RawSecureSocket.CLOSED) {
+          this[_secureFilter].destroy();
+          this[_secureFilter] = null;
+          return;
+        }
+        this[_socket].readEventsEnabled = true;
+        if (dart.test(this[_filterStatus].writeEmpty) && dart.test(this[_closedWrite]) && !dart.test(this[_socketClosedWrite])) {
+          this.shutdown(io.SocketDirection.SEND);
+          if (this[_status] == io._RawSecureSocket.CLOSED) {
+            return;
+          }
+        }
+        if (dart.test(this[_filterStatus].readEmpty) && dart.test(this[_socketClosedRead]) && !dart.test(this[_closedRead])) {
+          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
+            this[_secureFilter].handshake();
+            if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
+              dart.throw(new io.HandshakeException('Connection terminated during handshake'));
+            }
+          }
+          this[_closeHandler]();
+        }
+        if (this[_status] == io._RawSecureSocket.CLOSED) {
+          return;
+        }
+        if (dart.test(this[_filterStatus].progress)) {
+          this[_filterPending] = true;
+          if (dart.test(this[_filterStatus].writeEncryptedNoLongerEmpty)) {
+            this[_writeSocket]();
+          }
+          if (dart.test(this[_filterStatus].writePlaintextNoLongerFull)) {
+            this[_sendWriteEvent]();
+          }
+          if (dart.test(this[_filterStatus].readEncryptedNoLongerFull)) {
+            this[_readSocket]();
+          }
+          if (dart.test(this[_filterStatus].readPlaintextNoLongerEmpty)) {
+            this[_scheduleReadEvent]();
+          }
+          if (this[_status] == io._RawSecureSocket.HANDSHAKE) {
+            this[_secureHandshake]();
+          }
+        }
+        this[_tryFilter]();
+      }, _FilterStatusToNull())).catchError(dart.bind(this, _reportError));
+    }
+  }
+  [_readSocketOrBufferedData](bytes) {
+    if (this[_bufferedData] != null) {
+      if (dart.notNull(bytes) > dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex])) {
+        bytes = dart.notNull(this[_bufferedData][dartx.length]) - dart.notNull(this[_bufferedDataIndex]);
+      }
+      let result = this[_bufferedData][dartx.sublist](this[_bufferedDataIndex], dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes));
+      this[_bufferedDataIndex] = dart.notNull(this[_bufferedDataIndex]) + dart.notNull(bytes);
+      if (this[_bufferedData][dartx.length] == this[_bufferedDataIndex]) {
+        this[_bufferedData] = null;
       }
       return result;
+    } else if (!dart.test(this[_socketClosedRead])) {
+      return this[_socket].read(bytes);
+    } else {
+      return null;
     }
-    write(inputData, offset, bytes) {
-      if (dart.notNull(bytes) > dart.notNull(this.free)) {
-        bytes = this.free;
-      }
-      let written = 0;
-      let toWrite = math.min(core.int)(bytes, this.linearFree);
-      while (dart.notNull(toWrite) > 0) {
-        this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(toWrite), inputData, offset);
-        this.advanceEnd(toWrite);
-        offset = dart.notNull(offset) + dart.notNull(toWrite);
-        written = dart.notNull(written) + dart.notNull(toWrite);
-        toWrite = math.min(core.int)(dart.notNull(bytes) - dart.notNull(written), this.linearFree);
-      }
-      return written;
+  }
+  [_readSocket]() {
+    if (this[_status] == io._RawSecureSocket.CLOSED) return;
+    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
+    if (dart.notNull(buffer.writeFromSource(dart.bind(this, _readSocketOrBufferedData))) > 0) {
+      this[_filterStatus].readEmpty = false;
+    } else {
+      this[_socket].readEventsEnabled = false;
     }
-    writeFromSource(getData) {
-      let written = 0;
-      let toWrite = this.linearFree;
-      while (dart.notNull(toWrite) > 0) {
-        let inputData = getData(toWrite);
-        if (inputData == null || inputData[dartx.length] == 0) break;
-        let len = inputData[dartx.length];
-        this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
-        this.advanceEnd(len);
-        written = dart.notNull(written) + dart.notNull(len);
-        toWrite = this.linearFree;
-      }
-      return written;
+  }
+  [_writeSocket]() {
+    if (dart.test(this[_socketClosedWrite])) return;
+    let buffer = this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
+    if (dart.test(buffer.readToSocket(this[_socket]))) {
+      this[_socket].writeEventsEnabled = true;
     }
-    readToSocket(socket) {
-      while (true) {
-        let toWrite = this.linearLength;
-        if (toWrite == 0) return false;
-        let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
-        this.advanceStart(bytes);
-        if (dart.notNull(bytes) < dart.notNull(toWrite)) {
-          return true;
-        }
-      }
+  }
+  [_scheduleReadEvent]() {
+    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
+      this[_pendingReadEvent] = true;
+      async.Timer.run(dart.bind(this, _sendReadEvent));
     }
-  };
-  dart.setSignature(io._ExternalBuffer, {
-    constructors: () => ({new: dart.definiteFunctionType(io._ExternalBuffer, [dart.dynamic])}),
-    fields: () => ({
-      data: core.List,
-      start: core.int,
-      end: core.int,
-      size: dart.dynamic
-    }),
-    getters: () => ({
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      length: dart.definiteFunctionType(core.int, []),
-      linearLength: dart.definiteFunctionType(core.int, []),
-      free: dart.definiteFunctionType(core.int, []),
-      linearFree: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      advanceStart: dart.definiteFunctionType(dart.void, [core.int]),
-      advanceEnd: dart.definiteFunctionType(dart.void, [core.int]),
-      read: dart.definiteFunctionType(core.List$(core.int), [core.int]),
-      write: dart.definiteFunctionType(core.int, [ListOfint(), core.int, core.int]),
-      writeFromSource: dart.definiteFunctionType(core.int, [intToListOfint()]),
-      readToSocket: dart.definiteFunctionType(core.bool, [io.RawSocket])
-    })
-  });
-  io._SecureFilter = class _SecureFilter extends core.Object {
-    static new() {
-      dart.throw(new core.UnsupportedError("_SecureFilter._SecureFilter"));
+  }
+  [_sendReadEvent]() {
+    this[_pendingReadEvent] = false;
+    if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
+      this[_controller$0].add(io.RawSocketEvent.READ);
+      this[_scheduleReadEvent]();
     }
-  };
-  dart.setSignature(io._SecureFilter, {
-    constructors: () => ({new: dart.definiteFunctionType(io._SecureFilter, [])})
-  });
-  io.TlsException = class TlsException extends core.Object {
-    new(message, osError) {
-      if (message === void 0) message = "";
-      if (osError === void 0) osError = null;
-      TlsException.prototype._.call(this, "TlsException", message, osError);
+  }
+  [_sendWriteEvent]() {
+    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
+      this[_writeEventsEnabled] = false;
+      this[_controller$0].add(io.RawSocketEvent.WRITE);
     }
-    _(type, message, osError) {
-      this.type = type;
-      this.message = message;
-      this.osError = osError;
+  }
+  [_pushAllFilterStages]() {
+    let wasInHandshake = this[_status] != io._RawSecureSocket.CONNECTED;
+    let args = core.List.new(2 + dart.notNull(io._RawSecureSocket.NUM_BUFFERS) * 2);
+    args[dartx._set](0, this[_secureFilter][_pointer]());
+    args[dartx._set](1, wasInHandshake);
+    let bufs = this[_secureFilter].buffers;
+    for (let i = 0; i < dart.notNull(io._RawSecureSocket.NUM_BUFFERS); ++i) {
+      args[dartx._set](2 * i + 2, bufs[dartx._get](i).start);
+      args[dartx._set](2 * i + 3, bufs[dartx._get](i).end);
     }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write(this.type);
-      if (!dart.test(this.message[dartx.isEmpty])) {
-        sb.write(dart.str`: ${this.message}`);
-        if (this.osError != null) {
-          sb.write(dart.str` (${this.osError})`);
-        }
-      } else if (this.osError != null) {
-        sb.write(dart.str`: ${this.osError}`);
-      }
-      return sb.toString();
-    }
-  };
-  dart.defineNamedConstructor(io.TlsException, '_');
-  io.TlsException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.TlsException, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.TlsException, [], [core.String, io.OSError]),
-      _: dart.definiteFunctionType(io.TlsException, [core.String, core.String, io.OSError])
-    }),
-    fields: () => ({
-      type: core.String,
-      message: core.String,
-      osError: io.OSError
-    })
-  });
-  io.HandshakeException = class HandshakeException extends io.TlsException {
-    new(message, osError) {
-      if (message === void 0) message = "";
-      if (osError === void 0) osError = null;
-      super._("HandshakeException", message, osError);
-    }
-  };
-  dart.setSignature(io.HandshakeException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.HandshakeException, [], [core.String, io.OSError])})
-  });
-  io.CertificateException = class CertificateException extends io.TlsException {
-    new(message, osError) {
-      if (message === void 0) message = "";
-      if (osError === void 0) osError = null;
-      super._("CertificateException", message, osError);
-    }
-  };
-  dart.setSignature(io.CertificateException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.CertificateException, [], [core.String, io.OSError])})
-  });
-  io.SecurityContext = class SecurityContext extends core.Object {
-    static new() {
-      dart.throw(new core.UnsupportedError("SecurityContext constructor"));
-    }
-    static get defaultContext() {
-      dart.throw(new core.UnsupportedError("default SecurityContext getter"));
-    }
-    static get alpnSupported() {
-      dart.throw(new core.UnsupportedError("SecurityContext alpnSupported getter"));
-    }
-    static _protocolsToLengthEncoding(protocols) {
-      if (protocols == null || protocols[dartx.length] == 0) {
-        return typed_data.Uint8List.new(0);
-      }
-      let protocolsLength = protocols[dartx.length];
-      let expectedLength = protocolsLength;
-      for (let i = 0; i < dart.notNull(protocolsLength); i++) {
-        let length = protocols[dartx._get](i)[dartx.length];
-        if (dart.notNull(length) > 0 && dart.notNull(length) <= 255) {
-          expectedLength = dart.notNull(expectedLength) + dart.notNull(length);
+    return io._IOService._dispatch(io._SSL_PROCESS_FILTER, args).then(io._FilterStatus)(dart.fn(response => {
+      if (dart.equals(dart.dload(response, 'length'), 2)) {
+        if (wasInHandshake) {
+          this[_reportError](new io.HandshakeException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
         } else {
-          dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${length}).`));
+          this[_reportError](new io.TlsException(dart.str`${dart.dindex(response, 1)} error ${dart.dindex(response, 0)}`), null);
         }
       }
-      if (dart.notNull(expectedLength) >= 1 << 13) {
-        dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
+      function start(index) {
+        return core.int._check(dart.dindex(response, 2 * dart.notNull(index)));
       }
-      let bytes = typed_data.Uint8List.new(expectedLength);
-      let bytesOffset = 0;
-      for (let i = 0; i < dart.notNull(protocolsLength); i++) {
-        let proto = protocols[dartx._get](i);
-        bytes[dartx._set](bytesOffset++, proto[dartx.length]);
-        let bits = 0;
-        for (let j = 0; j < dart.notNull(proto[dartx.length]); j++) {
-          let char = proto[dartx.codeUnitAt](j);
-          bits = (dart.notNull(bits) | dart.notNull(char)) >>> 0;
-          bytes[dartx._set](bytesOffset++, dart.notNull(char) & 255);
-        }
-        if (dart.notNull(bits) > 127) {
-          return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
-        }
+      dart.fn(start, intToint());
+      function end(index) {
+        return core.int._check(dart.dindex(response, 2 * dart.notNull(index) + 1));
       }
-      return bytes;
+      dart.fn(end, intToint());
+      let status = new io._FilterStatus();
+      status.writeEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).isEmpty) && start(io._RawSecureSocket.WRITE_ENCRYPTED) == end(io._RawSecureSocket.WRITE_ENCRYPTED);
+      if (wasInHandshake) status.writeEmpty = false;
+      status.readEmpty = dart.test(bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED).isEmpty) && start(io._RawSecureSocket.READ_PLAINTEXT) == end(io._RawSecureSocket.READ_PLAINTEXT);
+      let buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT);
+      let new_start = start(io._RawSecureSocket.WRITE_PLAINTEXT);
+      if (new_start != buffer.start) {
+        status.progress = true;
+        if (buffer.free == 0) {
+          status.writePlaintextNoLongerFull = true;
+        }
+        buffer.start = new_start;
+      }
+      buffer = bufs[dartx._get](io._RawSecureSocket.READ_ENCRYPTED);
+      new_start = start(io._RawSecureSocket.READ_ENCRYPTED);
+      if (new_start != buffer.start) {
+        status.progress = true;
+        if (buffer.free == 0) {
+          status.readEncryptedNoLongerFull = true;
+        }
+        buffer.start = new_start;
+      }
+      buffer = bufs[dartx._get](io._RawSecureSocket.WRITE_ENCRYPTED);
+      let new_end = end(io._RawSecureSocket.WRITE_ENCRYPTED);
+      if (new_end != buffer.end) {
+        status.progress = true;
+        if (buffer.length == 0) {
+          status.writeEncryptedNoLongerEmpty = true;
+        }
+        buffer.end = new_end;
+      }
+      buffer = bufs[dartx._get](io._RawSecureSocket.READ_PLAINTEXT);
+      new_end = end(io._RawSecureSocket.READ_PLAINTEXT);
+      if (new_end != buffer.end) {
+        status.progress = true;
+        if (buffer.length == 0) {
+          status.readPlaintextNoLongerEmpty = true;
+        }
+        buffer.end = new_end;
+      }
+      return status;
+    }, dynamicTo_FilterStatus()));
+  }
+};
+dart.addSimpleTypeTests(io._RawSecureSocket);
+io._RawSecureSocket[dart.implements] = () => [io.RawSecureSocket];
+dart.setSignature(io._RawSecureSocket, {
+  constructors: () => ({new: dart.definiteFunctionType(io._RawSecureSocket, [io.InternetAddress, core.int, core.bool, io.SecurityContext, io.RawSocket, StreamSubscriptionOfRawSocketEvent(), ListOfint(), core.bool, core.bool, X509CertificateTodynamic(), ListOfString()])}),
+  fields: () => ({
+    [_socket]: io.RawSocket,
+    [_handshakeComplete]: CompleterOf_RawSecureSocket(),
+    [_controller$0]: StreamControllerOfRawSocketEvent(),
+    [_stream$]: StreamOfRawSocketEvent(),
+    [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
+    [_bufferedData]: ListOfint(),
+    [_bufferedDataIndex]: core.int,
+    address: io.InternetAddress,
+    is_server: core.bool,
+    context: io.SecurityContext,
+    requestClientCertificate: core.bool,
+    requireClientCertificate: core.bool,
+    onBadCertificate: core.Function,
+    [_status]: core.int,
+    [_writeEventsEnabled]: core.bool,
+    [_readEventsEnabled]: core.bool,
+    [_pauseCount$]: core.int,
+    [_pendingReadEvent]: core.bool,
+    [_socketClosedRead]: core.bool,
+    [_socketClosedWrite]: core.bool,
+    [_closedRead]: core.bool,
+    [_closedWrite]: core.bool,
+    [_closeCompleter]: async.Completer,
+    [_filterStatus]: io._FilterStatus,
+    [_connectPending]: core.bool,
+    [_filterPending]: core.bool,
+    [_filterActive]: core.bool,
+    [_secureFilter]: io._SecureFilter,
+    [_selectedProtocol]: core.String
+  }),
+  getters: () => ({
+    port: dart.definiteFunctionType(core.int, []),
+    remoteAddress: dart.definiteFunctionType(io.InternetAddress, []),
+    remotePort: dart.definiteFunctionType(core.int, []),
+    writeEventsEnabled: dart.definiteFunctionType(core.bool, []),
+    readEventsEnabled: dart.definiteFunctionType(core.bool, []),
+    peerCertificate: dart.definiteFunctionType(io.X509Certificate, []),
+    selectedProtocol: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({
+    [_owner]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    writeEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool]),
+    readEventsEnabled: dart.definiteFunctionType(dart.void, [core.bool])
+  }),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    available: dart.definiteFunctionType(core.int, []),
+    close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
+    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+    [_close$0]: dart.definiteFunctionType(dart.void, []),
+    shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
+    read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
+    write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
+    [_onBadCertificateWrapper]: dart.definiteFunctionType(core.bool, [io.X509Certificate]),
+    setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
+    [_eventDispatcher]: dart.definiteFunctionType(dart.void, [io.RawSocketEvent]),
+    [_readHandler]: dart.definiteFunctionType(dart.void, []),
+    [_writeHandler]: dart.definiteFunctionType(dart.void, []),
+    [_doneHandler]: dart.definiteFunctionType(dart.void, []),
+    [_reportError]: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+    [_closeHandler]: dart.definiteFunctionType(dart.void, []),
+    [_secureHandshake]: dart.definiteFunctionType(dart.void, []),
+    renegotiate: dart.definiteFunctionType(dart.void, [], {useSessionCache: core.bool, requestClientCertificate: core.bool, requireClientCertificate: core.bool}),
+    [_secureHandshakeCompleteHandler]: dart.definiteFunctionType(dart.void, []),
+    [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
+    [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, []),
+    [_scheduleFilter]: dart.definiteFunctionType(dart.void, []),
+    [_tryFilter]: dart.definiteFunctionType(dart.void, []),
+    [_readSocketOrBufferedData]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
+    [_readSocket]: dart.definiteFunctionType(dart.void, []),
+    [_writeSocket]: dart.definiteFunctionType(dart.void, []),
+    [_scheduleReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
+    [_sendReadEvent]: dart.definiteFunctionType(dart.dynamic, []),
+    [_sendWriteEvent]: dart.definiteFunctionType(dart.dynamic, []),
+    [_pushAllFilterStages]: dart.definiteFunctionType(async.Future$(io._FilterStatus), [])
+  }),
+  sfields: () => ({
+    HANDSHAKE: core.int,
+    CONNECTED: core.int,
+    CLOSED: core.int,
+    READ_PLAINTEXT: core.int,
+    WRITE_PLAINTEXT: core.int,
+    READ_ENCRYPTED: core.int,
+    WRITE_ENCRYPTED: core.int,
+    NUM_BUFFERS: core.int
+  }),
+  statics: () => ({
+    _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
+    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
+  }),
+  names: ['_isBufferEncrypted', 'connect', '_verifyFields']
+});
+io._RawSecureSocket.HANDSHAKE = 201;
+io._RawSecureSocket.CONNECTED = 202;
+io._RawSecureSocket.CLOSED = 203;
+io._RawSecureSocket.READ_PLAINTEXT = 0;
+io._RawSecureSocket.WRITE_PLAINTEXT = 1;
+io._RawSecureSocket.READ_ENCRYPTED = 2;
+io._RawSecureSocket.WRITE_ENCRYPTED = 3;
+io._RawSecureSocket.NUM_BUFFERS = 4;
+io._ExternalBuffer = class _ExternalBuffer extends core.Object {
+  new(size) {
+    this.size = size;
+    this.data = null;
+    this.start = null;
+    this.end = null;
+    this.start = core.int._check(this.end = core.int._check(dart.dsend(this.size, '~/', 2)));
+  }
+  advanceStart(bytes) {
+    dart.assert(dart.notNull(this.start) > dart.notNull(this.end) || dart.notNull(this.start) + dart.notNull(bytes) <= dart.notNull(this.end));
+    this.start = dart.notNull(this.start) + dart.notNull(bytes);
+    if (dart.notNull(this.start) >= dart.notNull(core.num._check(this.size))) {
+      this.start = dart.notNull(this.start) - dart.notNull(core.num._check(this.size));
+      dart.assert(dart.notNull(this.start) <= dart.notNull(this.end));
+      dart.assert(dart.notNull(this.start) < dart.notNull(core.num._check(this.size)));
     }
-    static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
-      function addProtocol(outBytes, protocol) {
-        let protocolBytes = convert.UTF8.encode(protocol);
-        let len = protocolBytes[dartx.length];
-        if (dart.notNull(len) > 255) {
-          dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${len})`));
-        }
-        outBytes[dartx.add](len);
-        outBytes[dartx.addAll](protocolBytes);
-      }
-      dart.fn(addProtocol, ListOfintAndStringTovoid());
-      let bytes = JSArrayOfint().of([]);
-      for (let i = 0; i < dart.notNull(protocols[dartx.length]); i++) {
-        addProtocol(bytes, protocols[dartx._get](i));
-      }
-      if (dart.notNull(bytes[dartx.length]) >= 1 << 13) {
-        dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
-      }
-      return typed_data.Uint8List.fromList(bytes);
+  }
+  advanceEnd(bytes) {
+    dart.assert(dart.notNull(this.start) <= dart.notNull(this.end) || dart.notNull(this.start) > dart.notNull(this.end) + dart.notNull(bytes));
+    this.end = dart.notNull(this.end) + dart.notNull(bytes);
+    if (dart.notNull(this.end) >= dart.notNull(core.num._check(this.size))) {
+      this.end = dart.notNull(this.end) - dart.notNull(core.num._check(this.size));
+      dart.assert(dart.notNull(this.end) < dart.notNull(this.start));
+      dart.assert(dart.notNull(this.end) < dart.notNull(core.num._check(this.size)));
     }
-  };
-  dart.setSignature(io.SecurityContext, {
-    constructors: () => ({new: dart.definiteFunctionType(io.SecurityContext, [])}),
-    sgetters: () => ({
-      defaultContext: dart.definiteFunctionType(io.SecurityContext, []),
-      alpnSupported: dart.definiteFunctionType(core.bool, [])
-    }),
-    statics: () => ({
-      _protocolsToLengthEncoding: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()]),
-      _protocolsToLengthEncodingNonAsciiBailout: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()])
-    }),
-    names: ['_protocolsToLengthEncoding', '_protocolsToLengthEncodingNonAsciiBailout']
-  });
-  io._nextServiceId = 1;
-  io.InternetAddressType = class InternetAddressType extends core.Object {
-    _(value) {
-      this[_value$1] = value;
+  }
+  get isEmpty() {
+    return this.end == this.start;
+  }
+  get length() {
+    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(dart.dsend(this.size, '+', this.end), '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
+  }
+  get linearLength() {
+    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.dsend(this.size, '-', this.start) : dart.notNull(this.end) - dart.notNull(this.start));
+  }
+  get free() {
+    return core.int._check(dart.notNull(this.start) > dart.notNull(this.end) ? dart.notNull(this.start) - dart.notNull(this.end) - 1 : dart.dsend(dart.dsend(dart.dsend(this.size, '+', this.start), '-', this.end), '-', 1));
+  }
+  get linearFree() {
+    if (dart.notNull(this.start) > dart.notNull(this.end)) return dart.notNull(this.start) - dart.notNull(this.end) - 1;
+    if (this.start == 0) return core.int._check(dart.dsend(dart.dsend(this.size, '-', this.end), '-', 1));
+    return core.int._check(dart.dsend(this.size, '-', this.end));
+  }
+  read(bytes) {
+    if (bytes == null) {
+      bytes = this.length;
+    } else {
+      bytes = math.min(core.int)(bytes, this.length);
     }
-    static _from(value) {
-      if (value == 0) return io.InternetAddressType.IP_V4;
-      if (value == 1) return io.InternetAddressType.IP_V6;
-      dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
+    if (bytes == 0) return null;
+    let result = typed_data.Uint8List.new(bytes);
+    let bytesRead = 0;
+    while (dart.notNull(bytesRead) < dart.notNull(bytes)) {
+      let toRead = math.min(core.int)(dart.notNull(bytes) - dart.notNull(bytesRead), this.linearLength);
+      result[dartx.setRange](bytesRead, dart.notNull(bytesRead) + dart.notNull(toRead), this.data, this.start);
+      this.advanceStart(toRead);
+      bytesRead = dart.notNull(bytesRead) + dart.notNull(toRead);
     }
-    get name() {
-      switch (this[_value$1]) {
-        case -1:
-        {
-          return "ANY";
-        }
-        case 0:
-        {
-          return "IP_V4";
-        }
-        case 1:
-        {
-          return "IP_V6";
-        }
-        default:
-        {
-          dart.throw(new core.ArgumentError("Invalid InternetAddress"));
-        }
+    return result;
+  }
+  write(inputData, offset, bytes) {
+    if (dart.notNull(bytes) > dart.notNull(this.free)) {
+      bytes = this.free;
+    }
+    let written = 0;
+    let toWrite = math.min(core.int)(bytes, this.linearFree);
+    while (dart.notNull(toWrite) > 0) {
+      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(toWrite), inputData, offset);
+      this.advanceEnd(toWrite);
+      offset = dart.notNull(offset) + dart.notNull(toWrite);
+      written = dart.notNull(written) + dart.notNull(toWrite);
+      toWrite = math.min(core.int)(dart.notNull(bytes) - dart.notNull(written), this.linearFree);
+    }
+    return written;
+  }
+  writeFromSource(getData) {
+    let written = 0;
+    let toWrite = this.linearFree;
+    while (dart.notNull(toWrite) > 0) {
+      let inputData = getData(toWrite);
+      if (inputData == null || inputData[dartx.length] == 0) break;
+      let len = inputData[dartx.length];
+      this.data[dartx.setRange](this.end, dart.notNull(this.end) + dart.notNull(len), inputData);
+      this.advanceEnd(len);
+      written = dart.notNull(written) + dart.notNull(len);
+      toWrite = this.linearFree;
+    }
+    return written;
+  }
+  readToSocket(socket) {
+    while (true) {
+      let toWrite = this.linearLength;
+      if (toWrite == 0) return false;
+      let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
+      this.advanceStart(bytes);
+      if (dart.notNull(bytes) < dart.notNull(toWrite)) {
+        return true;
       }
     }
-    toString() {
-      return dart.str`InternetAddressType: ${this.name}`;
+  }
+};
+dart.setSignature(io._ExternalBuffer, {
+  constructors: () => ({new: dart.definiteFunctionType(io._ExternalBuffer, [dart.dynamic])}),
+  fields: () => ({
+    data: core.List,
+    start: core.int,
+    end: core.int,
+    size: dart.dynamic
+  }),
+  getters: () => ({
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    length: dart.definiteFunctionType(core.int, []),
+    linearLength: dart.definiteFunctionType(core.int, []),
+    free: dart.definiteFunctionType(core.int, []),
+    linearFree: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    advanceStart: dart.definiteFunctionType(dart.void, [core.int]),
+    advanceEnd: dart.definiteFunctionType(dart.void, [core.int]),
+    read: dart.definiteFunctionType(core.List$(core.int), [core.int]),
+    write: dart.definiteFunctionType(core.int, [ListOfint(), core.int, core.int]),
+    writeFromSource: dart.definiteFunctionType(core.int, [intToListOfint()]),
+    readToSocket: dart.definiteFunctionType(core.bool, [io.RawSocket])
+  })
+});
+io._SecureFilter = class _SecureFilter extends core.Object {
+  static new() {
+    dart.throw(new core.UnsupportedError("_SecureFilter._SecureFilter"));
+  }
+};
+dart.setSignature(io._SecureFilter, {
+  constructors: () => ({new: dart.definiteFunctionType(io._SecureFilter, [])})
+});
+io.TlsException = class TlsException extends core.Object {
+  new(message, osError) {
+    if (message === void 0) message = "";
+    if (osError === void 0) osError = null;
+    TlsException.prototype._.call(this, "TlsException", message, osError);
+  }
+  _(type, message, osError) {
+    this.type = type;
+    this.message = message;
+    this.osError = osError;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write(this.type);
+    if (!dart.test(this.message[dartx.isEmpty])) {
+      sb.write(dart.str`: ${this.message}`);
+      if (this.osError != null) {
+        sb.write(dart.str` (${this.osError})`);
+      }
+    } else if (this.osError != null) {
+      sb.write(dart.str`: ${this.osError}`);
     }
-  };
-  dart.defineNamedConstructor(io.InternetAddressType, '_');
-  dart.setSignature(io.InternetAddressType, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
-      _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
-    }),
-    fields: () => ({[_value$1]: core.int}),
-    getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    sfields: () => ({
-      IP_V4: io.InternetAddressType,
-      IP_V6: io.InternetAddressType,
-      ANY: io.InternetAddressType
-    })
-  });
-  dart.defineLazy(io.InternetAddressType, {
-    get IP_V4() {
-      return dart.const(new io.InternetAddressType._(0));
-    },
-    get IP_V6() {
-      return dart.const(new io.InternetAddressType._(1));
-    },
-    get ANY() {
-      return dart.const(new io.InternetAddressType._(-1));
+    return sb.toString();
+  }
+};
+dart.defineNamedConstructor(io.TlsException, '_');
+io.TlsException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.TlsException, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.TlsException, [], [core.String, io.OSError]),
+    _: dart.definiteFunctionType(io.TlsException, [core.String, core.String, io.OSError])
+  }),
+  fields: () => ({
+    type: core.String,
+    message: core.String,
+    osError: io.OSError
+  })
+});
+io.HandshakeException = class HandshakeException extends io.TlsException {
+  new(message, osError) {
+    if (message === void 0) message = "";
+    if (osError === void 0) osError = null;
+    super._("HandshakeException", message, osError);
+  }
+};
+dart.setSignature(io.HandshakeException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.HandshakeException, [], [core.String, io.OSError])})
+});
+io.CertificateException = class CertificateException extends io.TlsException {
+  new(message, osError) {
+    if (message === void 0) message = "";
+    if (osError === void 0) osError = null;
+    super._("CertificateException", message, osError);
+  }
+};
+dart.setSignature(io.CertificateException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.CertificateException, [], [core.String, io.OSError])})
+});
+io.SecurityContext = class SecurityContext extends core.Object {
+  static new() {
+    dart.throw(new core.UnsupportedError("SecurityContext constructor"));
+  }
+  static get defaultContext() {
+    dart.throw(new core.UnsupportedError("default SecurityContext getter"));
+  }
+  static get alpnSupported() {
+    dart.throw(new core.UnsupportedError("SecurityContext alpnSupported getter"));
+  }
+  static _protocolsToLengthEncoding(protocols) {
+    if (protocols == null || protocols[dartx.length] == 0) {
+      return typed_data.Uint8List.new(0);
     }
-  });
-  io.InternetAddress = class InternetAddress extends core.Object {
-    static get LOOPBACK_IP_V4() {
-      dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V4"));
+    let protocolsLength = protocols[dartx.length];
+    let expectedLength = protocolsLength;
+    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
+      let length = protocols[dartx._get](i)[dartx.length];
+      if (dart.notNull(length) > 0 && dart.notNull(length) <= 255) {
+        expectedLength = dart.notNull(expectedLength) + dart.notNull(length);
+      } else {
+        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${length}).`));
+      }
     }
-    static get LOOPBACK_IP_V6() {
-      dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V6"));
+    if (dart.notNull(expectedLength) >= 1 << 13) {
+      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
     }
-    static get ANY_IP_V4() {
-      dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V4"));
+    let bytes = typed_data.Uint8List.new(expectedLength);
+    let bytesOffset = 0;
+    for (let i = 0; i < dart.notNull(protocolsLength); i++) {
+      let proto = protocols[dartx._get](i);
+      bytes[dartx._set](bytesOffset++, proto[dartx.length]);
+      let bits = 0;
+      for (let j = 0; j < dart.notNull(proto[dartx.length]); j++) {
+        let char = proto[dartx.codeUnitAt](j);
+        bits = (dart.notNull(bits) | dart.notNull(char)) >>> 0;
+        bytes[dartx._set](bytesOffset++, dart.notNull(char) & 255);
+      }
+      if (dart.notNull(bits) > 127) {
+        return io.SecurityContext._protocolsToLengthEncodingNonAsciiBailout(protocols);
+      }
     }
-    static get ANY_IP_V6() {
-      dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V6"));
+    return bytes;
+  }
+  static _protocolsToLengthEncodingNonAsciiBailout(protocols) {
+    function addProtocol(outBytes, protocol) {
+      let protocolBytes = convert.UTF8.encode(protocol);
+      let len = protocolBytes[dartx.length];
+      if (dart.notNull(len) > 255) {
+        dart.throw(new core.ArgumentError(dart.str`Length of protocol must be between 1 and 255 (was: ${len})`));
+      }
+      outBytes[dartx.add](len);
+      outBytes[dartx.addAll](protocolBytes);
     }
-    static new(address) {
-      dart.throw(new core.UnsupportedError("InternetAddress"));
+    dart.fn(addProtocol, ListOfintAndStringTovoid());
+    let bytes = JSArrayOfint().of([]);
+    for (let i = 0; i < dart.notNull(protocols[dartx.length]); i++) {
+      addProtocol(bytes, protocols[dartx._get](i));
     }
-    static lookup(host, opts) {
-      let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
-      dart.throw(new core.UnsupportedError("InternetAddress.lookup"));
+    if (dart.notNull(bytes[dartx.length]) >= 1 << 13) {
+      dart.throw(new core.ArgumentError('The maximum message length supported is 2^13-1.'));
     }
-    static _cloneWithNewHost(address, host) {
-      dart.throw(new core.UnsupportedError("InternetAddress._cloneWithNewHost"));
+    return typed_data.Uint8List.fromList(bytes);
+  }
+};
+dart.setSignature(io.SecurityContext, {
+  constructors: () => ({new: dart.definiteFunctionType(io.SecurityContext, [])}),
+  sgetters: () => ({
+    defaultContext: dart.definiteFunctionType(io.SecurityContext, []),
+    alpnSupported: dart.definiteFunctionType(core.bool, [])
+  }),
+  statics: () => ({
+    _protocolsToLengthEncoding: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()]),
+    _protocolsToLengthEncodingNonAsciiBailout: dart.definiteFunctionType(typed_data.Uint8List, [ListOfString()])
+  }),
+  names: ['_protocolsToLengthEncoding', '_protocolsToLengthEncodingNonAsciiBailout']
+});
+io._nextServiceId = 1;
+io.InternetAddressType = class InternetAddressType extends core.Object {
+  _(value) {
+    this[_value$1] = value;
+  }
+  static _from(value) {
+    if (value == 0) return io.InternetAddressType.IP_V4;
+    if (value == 1) return io.InternetAddressType.IP_V6;
+    dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
+  }
+  get name() {
+    switch (this[_value$1]) {
+      case -1:
+      {
+        return "ANY";
+      }
+      case 0:
+      {
+        return "IP_V4";
+      }
+      case 1:
+      {
+        return "IP_V6";
+      }
+      default:
+      {
+        dart.throw(new core.ArgumentError("Invalid InternetAddress"));
+      }
     }
-  };
-  dart.setSignature(io.InternetAddress, {
-    constructors: () => ({new: dart.definiteFunctionType(io.InternetAddress, [core.String])}),
-    fields: () => ({type: io.InternetAddressType}),
-    sgetters: () => ({
-      LOOPBACK_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
-      LOOPBACK_IP_V6: dart.definiteFunctionType(io.InternetAddress, []),
-      ANY_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
-      ANY_IP_V6: dart.definiteFunctionType(io.InternetAddress, [])
-    }),
-    statics: () => ({
-      lookup: dart.definiteFunctionType(async.Future$(core.List$(io.InternetAddress)), [core.String], {type: io.InternetAddressType}),
-      _cloneWithNewHost: dart.definiteFunctionType(io.InternetAddress, [io.InternetAddress, core.String])
-    }),
-    names: ['lookup', '_cloneWithNewHost']
-  });
-  io.NetworkInterface = class NetworkInterface extends core.Object {
-    static get listSupported() {
-      dart.throw(new core.UnsupportedError("NetworkInterface.listSupported"));
+  }
+  toString() {
+    return dart.str`InternetAddressType: ${this.name}`;
+  }
+};
+dart.defineNamedConstructor(io.InternetAddressType, '_');
+dart.setSignature(io.InternetAddressType, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
+    _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
+  }),
+  fields: () => ({[_value$1]: core.int}),
+  getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
+  sfields: () => ({
+    IP_V4: io.InternetAddressType,
+    IP_V6: io.InternetAddressType,
+    ANY: io.InternetAddressType
+  })
+});
+dart.defineLazy(io.InternetAddressType, {
+  get IP_V4() {
+    return dart.const(new io.InternetAddressType._(0));
+  },
+  get IP_V6() {
+    return dart.const(new io.InternetAddressType._(1));
+  },
+  get ANY() {
+    return dart.const(new io.InternetAddressType._(-1));
+  }
+});
+io.InternetAddress = class InternetAddress extends core.Object {
+  static get LOOPBACK_IP_V4() {
+    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V4"));
+  }
+  static get LOOPBACK_IP_V6() {
+    dart.throw(new core.UnsupportedError("InternetAddress.LOOPBACK_IP_V6"));
+  }
+  static get ANY_IP_V4() {
+    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V4"));
+  }
+  static get ANY_IP_V6() {
+    dart.throw(new core.UnsupportedError("InternetAddress.ANY_IP_V6"));
+  }
+  static new(address) {
+    dart.throw(new core.UnsupportedError("InternetAddress"));
+  }
+  static lookup(host, opts) {
+    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
+    dart.throw(new core.UnsupportedError("InternetAddress.lookup"));
+  }
+  static _cloneWithNewHost(address, host) {
+    dart.throw(new core.UnsupportedError("InternetAddress._cloneWithNewHost"));
+  }
+};
+dart.setSignature(io.InternetAddress, {
+  constructors: () => ({new: dart.definiteFunctionType(io.InternetAddress, [core.String])}),
+  fields: () => ({type: io.InternetAddressType}),
+  sgetters: () => ({
+    LOOPBACK_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
+    LOOPBACK_IP_V6: dart.definiteFunctionType(io.InternetAddress, []),
+    ANY_IP_V4: dart.definiteFunctionType(io.InternetAddress, []),
+    ANY_IP_V6: dart.definiteFunctionType(io.InternetAddress, [])
+  }),
+  statics: () => ({
+    lookup: dart.definiteFunctionType(async.Future$(core.List$(io.InternetAddress)), [core.String], {type: io.InternetAddressType}),
+    _cloneWithNewHost: dart.definiteFunctionType(io.InternetAddress, [io.InternetAddress, core.String])
+  }),
+  names: ['lookup', '_cloneWithNewHost']
+});
+io.NetworkInterface = class NetworkInterface extends core.Object {
+  static get listSupported() {
+    dart.throw(new core.UnsupportedError("NetworkInterface.listSupported"));
+  }
+  static list(opts) {
+    let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
+    let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
+    let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
+    dart.throw(new core.UnsupportedError("NetworkInterface.list"));
+  }
+};
+dart.setSignature(io.NetworkInterface, {
+  sgetters: () => ({listSupported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({list: dart.definiteFunctionType(async.Future$(core.List$(io.NetworkInterface)), [], {includeLoopback: core.bool, includeLinkLocal: core.bool, type: io.InternetAddressType})}),
+  names: ['list']
+});
+io.RawServerSocket = class RawServerSocket extends core.Object {
+  static bind(address, port, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    dart.throw(new core.UnsupportedError("RawServerSocket.bind"));
+  }
+};
+io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
+dart.setSignature(io.RawServerSocket, {
+  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
+  names: ['bind']
+});
+io.ServerSocket = class ServerSocket extends core.Object {
+  static bind(address, port, opts) {
+    let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
+    let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
+    let shared = opts && 'shared' in opts ? opts.shared : false;
+    dart.throw(new core.UnsupportedError("ServerSocket.bind"));
+  }
+};
+io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
+dart.setSignature(io.ServerSocket, {
+  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.ServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
+  names: ['bind']
+});
+io.SocketDirection = class SocketDirection extends core.Object {
+  _(value) {
+    this[_value$1] = value;
+  }
+};
+dart.defineNamedConstructor(io.SocketDirection, '_');
+dart.setSignature(io.SocketDirection, {
+  constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
+  fields: () => ({[_value$1]: dart.dynamic}),
+  sfields: () => ({
+    RECEIVE: io.SocketDirection,
+    SEND: io.SocketDirection,
+    BOTH: io.SocketDirection
+  })
+});
+dart.defineLazy(io.SocketDirection, {
+  get RECEIVE() {
+    return dart.const(new io.SocketDirection._(0));
+  },
+  get SEND() {
+    return dart.const(new io.SocketDirection._(1));
+  },
+  get BOTH() {
+    return dart.const(new io.SocketDirection._(2));
+  }
+});
+io.SocketOption = class SocketOption extends core.Object {
+  _(value) {
+    this[_value$1] = value;
+  }
+};
+dart.defineNamedConstructor(io.SocketOption, '_');
+dart.setSignature(io.SocketOption, {
+  constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
+  fields: () => ({[_value$1]: dart.dynamic}),
+  sfields: () => ({
+    TCP_NODELAY: io.SocketOption,
+    _IP_MULTICAST_LOOP: io.SocketOption,
+    _IP_MULTICAST_HOPS: io.SocketOption,
+    _IP_MULTICAST_IF: io.SocketOption,
+    _IP_BROADCAST: io.SocketOption
+  })
+});
+dart.defineLazy(io.SocketOption, {
+  get TCP_NODELAY() {
+    return dart.const(new io.SocketOption._(0));
+  },
+  get _IP_MULTICAST_LOOP() {
+    return dart.const(new io.SocketOption._(1));
+  },
+  get _IP_MULTICAST_HOPS() {
+    return dart.const(new io.SocketOption._(2));
+  },
+  get _IP_MULTICAST_IF() {
+    return dart.const(new io.SocketOption._(3));
+  },
+  get _IP_BROADCAST() {
+    return dart.const(new io.SocketOption._(4));
+  }
+});
+io.RawSocket = class RawSocket extends core.Object {
+  new() {
+    this.readEventsEnabled = null;
+    this.writeEventsEnabled = null;
+  }
+  static connect(host, port, opts) {
+    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
+    dart.throw(new core.UnsupportedError("RawSocket constructor"));
+  }
+};
+io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
+dart.setSignature(io.RawSocket, {
+  fields: () => ({
+    readEventsEnabled: core.bool,
+    writeEventsEnabled: core.bool
+  }),
+  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.RawSocket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
+  names: ['connect']
+});
+io.Socket = class Socket extends core.Object {
+  static connect(host, port, opts) {
+    let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
+    dart.throw(new core.UnsupportedError("Socket constructor"));
+  }
+};
+io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
+dart.setSignature(io.Socket, {
+  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
+  names: ['connect']
+});
+io.Datagram = class Datagram extends core.Object {
+  new(data, address, port) {
+    this.data = data;
+    this.address = address;
+    this.port = port;
+  }
+};
+dart.setSignature(io.Datagram, {
+  constructors: () => ({new: dart.definiteFunctionType(io.Datagram, [ListOfint(), io.InternetAddress, core.int])}),
+  fields: () => ({
+    data: ListOfint(),
+    address: io.InternetAddress,
+    port: core.int
+  })
+});
+io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
+  new() {
+    this.readEventsEnabled = null;
+    this.writeEventsEnabled = null;
+    this.multicastLoopback = null;
+    this.multicastHops = null;
+    this.multicastInterface = null;
+    this.broadcastEnabled = null;
+    super.new();
+  }
+  static bind(host, port, opts) {
+    let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
+    dart.throw(new core.UnsupportedError("RawDatagramSocket.bind"));
+  }
+};
+dart.addSimpleTypeTests(io.RawDatagramSocket);
+dart.setSignature(io.RawDatagramSocket, {
+  fields: () => ({
+    readEventsEnabled: core.bool,
+    writeEventsEnabled: core.bool,
+    multicastLoopback: core.bool,
+    multicastHops: core.int,
+    multicastInterface: io.NetworkInterface,
+    broadcastEnabled: core.bool
+  }),
+  statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawDatagramSocket), [dart.dynamic, core.int], {reuseAddress: core.bool})}),
+  names: ['bind']
+});
+io.SocketException = class SocketException extends core.Object {
+  new(message, opts) {
+    let osError = opts && 'osError' in opts ? opts.osError : null;
+    let address = opts && 'address' in opts ? opts.address : null;
+    let port = opts && 'port' in opts ? opts.port : null;
+    this.message = message;
+    this.osError = osError;
+    this.address = address;
+    this.port = port;
+  }
+  closed() {
+    this.message = 'Socket has been closed';
+    this.osError = null;
+    this.address = null;
+    this.port = null;
+  }
+  toString() {
+    let sb = new core.StringBuffer();
+    sb.write("SocketException");
+    if (!dart.test(this.message[dartx.isEmpty])) {
+      sb.write(dart.str`: ${this.message}`);
+      if (this.osError != null) {
+        sb.write(dart.str` (${this.osError})`);
+      }
+    } else if (this.osError != null) {
+      sb.write(dart.str`: ${this.osError}`);
     }
-    static list(opts) {
-      let includeLoopback = opts && 'includeLoopback' in opts ? opts.includeLoopback : false;
-      let includeLinkLocal = opts && 'includeLinkLocal' in opts ? opts.includeLinkLocal : false;
-      let type = opts && 'type' in opts ? opts.type : io.InternetAddressType.ANY;
-      dart.throw(new core.UnsupportedError("NetworkInterface.list"));
+    if (this.address != null) {
+      sb.write(dart.str`, address = ${this.address.host}`);
     }
-  };
-  dart.setSignature(io.NetworkInterface, {
-    sgetters: () => ({listSupported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({list: dart.definiteFunctionType(async.Future$(core.List$(io.NetworkInterface)), [], {includeLoopback: core.bool, includeLinkLocal: core.bool, type: io.InternetAddressType})}),
-    names: ['list']
-  });
-  io.RawServerSocket = class RawServerSocket extends core.Object {
-    static bind(address, port, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      dart.throw(new core.UnsupportedError("RawServerSocket.bind"));
+    if (this.port != null) {
+      sb.write(dart.str`, port = ${this.port}`);
     }
-  };
-  io.RawServerSocket[dart.implements] = () => [StreamOfRawSocket()];
-  dart.setSignature(io.RawServerSocket, {
-    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
-    names: ['bind']
-  });
-  io.ServerSocket = class ServerSocket extends core.Object {
-    static bind(address, port, opts) {
-      let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
-      let v6Only = opts && 'v6Only' in opts ? opts.v6Only : false;
-      let shared = opts && 'shared' in opts ? opts.shared : false;
-      dart.throw(new core.UnsupportedError("ServerSocket.bind"));
-    }
-  };
-  io.ServerSocket[dart.implements] = () => [StreamOfSocket()];
-  dart.setSignature(io.ServerSocket, {
-    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.ServerSocket), [dart.dynamic, core.int], {backlog: core.int, v6Only: core.bool, shared: core.bool})}),
-    names: ['bind']
-  });
-  io.SocketDirection = class SocketDirection extends core.Object {
-    _(value) {
-      this[_value$1] = value;
-    }
-  };
-  dart.defineNamedConstructor(io.SocketDirection, '_');
-  dart.setSignature(io.SocketDirection, {
-    constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
-    fields: () => ({[_value$1]: dart.dynamic}),
-    sfields: () => ({
-      RECEIVE: io.SocketDirection,
-      SEND: io.SocketDirection,
-      BOTH: io.SocketDirection
-    })
-  });
-  dart.defineLazy(io.SocketDirection, {
-    get RECEIVE() {
-      return dart.const(new io.SocketDirection._(0));
-    },
-    get SEND() {
-      return dart.const(new io.SocketDirection._(1));
-    },
-    get BOTH() {
-      return dart.const(new io.SocketDirection._(2));
-    }
-  });
-  io.SocketOption = class SocketOption extends core.Object {
-    _(value) {
-      this[_value$1] = value;
-    }
-  };
-  dart.defineNamedConstructor(io.SocketOption, '_');
-  dart.setSignature(io.SocketOption, {
-    constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
-    fields: () => ({[_value$1]: dart.dynamic}),
-    sfields: () => ({
-      TCP_NODELAY: io.SocketOption,
-      _IP_MULTICAST_LOOP: io.SocketOption,
-      _IP_MULTICAST_HOPS: io.SocketOption,
-      _IP_MULTICAST_IF: io.SocketOption,
-      _IP_BROADCAST: io.SocketOption
-    })
-  });
-  dart.defineLazy(io.SocketOption, {
-    get TCP_NODELAY() {
-      return dart.const(new io.SocketOption._(0));
-    },
-    get _IP_MULTICAST_LOOP() {
-      return dart.const(new io.SocketOption._(1));
-    },
-    get _IP_MULTICAST_HOPS() {
-      return dart.const(new io.SocketOption._(2));
-    },
-    get _IP_MULTICAST_IF() {
-      return dart.const(new io.SocketOption._(3));
-    },
-    get _IP_BROADCAST() {
-      return dart.const(new io.SocketOption._(4));
-    }
-  });
-  io.RawSocket = class RawSocket extends core.Object {
-    new() {
-      this.readEventsEnabled = null;
-      this.writeEventsEnabled = null;
-    }
-    static connect(host, port, opts) {
-      let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
-      dart.throw(new core.UnsupportedError("RawSocket constructor"));
-    }
-  };
-  io.RawSocket[dart.implements] = () => [StreamOfRawSocketEvent()];
-  dart.setSignature(io.RawSocket, {
-    fields: () => ({
-      readEventsEnabled: core.bool,
-      writeEventsEnabled: core.bool
-    }),
-    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.RawSocket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
-    names: ['connect']
-  });
-  io.Socket = class Socket extends core.Object {
-    static connect(host, port, opts) {
-      let sourceAddress = opts && 'sourceAddress' in opts ? opts.sourceAddress : null;
-      dart.throw(new core.UnsupportedError("Socket constructor"));
-    }
-  };
-  io.Socket[dart.implements] = () => [StreamOfListOfint(), io.IOSink];
-  dart.setSignature(io.Socket, {
-    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.Socket), [dart.dynamic, core.int], {sourceAddress: dart.dynamic})}),
-    names: ['connect']
-  });
-  io.Datagram = class Datagram extends core.Object {
-    new(data, address, port) {
-      this.data = data;
-      this.address = address;
-      this.port = port;
-    }
-  };
-  dart.setSignature(io.Datagram, {
-    constructors: () => ({new: dart.definiteFunctionType(io.Datagram, [ListOfint(), io.InternetAddress, core.int])}),
-    fields: () => ({
-      data: ListOfint(),
-      address: io.InternetAddress,
-      port: core.int
-    })
-  });
-  io.RawDatagramSocket = class RawDatagramSocket extends async.Stream$(io.RawSocketEvent) {
-    new() {
-      this.readEventsEnabled = null;
-      this.writeEventsEnabled = null;
-      this.multicastLoopback = null;
-      this.multicastHops = null;
-      this.multicastInterface = null;
-      this.broadcastEnabled = null;
-      super.new();
-    }
-    static bind(host, port, opts) {
-      let reuseAddress = opts && 'reuseAddress' in opts ? opts.reuseAddress : true;
-      dart.throw(new core.UnsupportedError("RawDatagramSocket.bind"));
-    }
-  };
-  dart.addSimpleTypeTests(io.RawDatagramSocket);
-  dart.setSignature(io.RawDatagramSocket, {
-    fields: () => ({
-      readEventsEnabled: core.bool,
-      writeEventsEnabled: core.bool,
-      multicastLoopback: core.bool,
-      multicastHops: core.int,
-      multicastInterface: io.NetworkInterface,
-      broadcastEnabled: core.bool
-    }),
-    statics: () => ({bind: dart.definiteFunctionType(async.Future$(io.RawDatagramSocket), [dart.dynamic, core.int], {reuseAddress: core.bool})}),
-    names: ['bind']
-  });
-  io.SocketException = class SocketException extends core.Object {
-    new(message, opts) {
-      let osError = opts && 'osError' in opts ? opts.osError : null;
-      let address = opts && 'address' in opts ? opts.address : null;
-      let port = opts && 'port' in opts ? opts.port : null;
-      this.message = message;
-      this.osError = osError;
-      this.address = address;
-      this.port = port;
-    }
-    closed() {
-      this.message = 'Socket has been closed';
-      this.osError = null;
-      this.address = null;
-      this.port = null;
-    }
-    toString() {
-      let sb = new core.StringBuffer();
-      sb.write("SocketException");
-      if (!dart.test(this.message[dartx.isEmpty])) {
-        sb.write(dart.str`: ${this.message}`);
-        if (this.osError != null) {
-          sb.write(dart.str` (${this.osError})`);
+    return sb.toString();
+  }
+};
+dart.defineNamedConstructor(io.SocketException, 'closed');
+io.SocketException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.SocketException, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.SocketException, [core.String], {osError: io.OSError, address: io.InternetAddress, port: core.int}),
+    closed: dart.definiteFunctionType(io.SocketException, [])
+  }),
+  fields: () => ({
+    message: core.String,
+    osError: io.OSError,
+    address: io.InternetAddress,
+    port: core.int
+  })
+});
+io._STDIO_HANDLE_TYPE_TERMINAL = 0;
+io._STDIO_HANDLE_TYPE_PIPE = 1;
+io._STDIO_HANDLE_TYPE_FILE = 2;
+io._STDIO_HANDLE_TYPE_SOCKET = 3;
+io._STDIO_HANDLE_TYPE_OTHER = 4;
+io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
+  new(stream) {
+    this[_stream$] = stream;
+    super.new();
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+};
+dart.addSimpleTypeTests(io._StdStream);
+dart.setSignature(io._StdStream, {
+  constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
+  fields: () => ({[_stream$]: StreamOfListOfint()}),
+  methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+});
+io.Stdin = class Stdin extends io._StdStream {
+  _(stream) {
+    super.new(stream);
+  }
+  readLineSync(opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : io.SYSTEM_ENCODING;
+    let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
+    let CR = 13;
+    let LF = 10;
+    let line = [];
+    let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
+    if (dart.test(retainNewlines)) {
+      let byte = null;
+      do {
+        byte = this.readByteSync();
+        if (dart.notNull(byte) < 0) {
+          break;
         }
-      } else if (this.osError != null) {
-        sb.write(dart.str`: ${this.osError}`);
+        line[dartx.add](byte);
+      } while (byte != LF && !(byte == CR && crIsNewline));
+      if (dart.test(line[dartx.isEmpty])) {
+        return null;
       }
-      if (this.address != null) {
-        sb.write(dart.str`, address = ${this.address.host}`);
-      }
-      if (this.port != null) {
-        sb.write(dart.str`, port = ${this.port}`);
-      }
-      return sb.toString();
-    }
-  };
-  dart.defineNamedConstructor(io.SocketException, 'closed');
-  io.SocketException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.SocketException, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.SocketException, [core.String], {osError: io.OSError, address: io.InternetAddress, port: core.int}),
-      closed: dart.definiteFunctionType(io.SocketException, [])
-    }),
-    fields: () => ({
-      message: core.String,
-      osError: io.OSError,
-      address: io.InternetAddress,
-      port: core.int
-    })
-  });
-  io._STDIO_HANDLE_TYPE_TERMINAL = 0;
-  io._STDIO_HANDLE_TYPE_PIPE = 1;
-  io._STDIO_HANDLE_TYPE_FILE = 2;
-  io._STDIO_HANDLE_TYPE_SOCKET = 3;
-  io._STDIO_HANDLE_TYPE_OTHER = 4;
-  io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
-    new(stream) {
-      this[_stream$] = stream;
-      super.new();
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-  };
-  dart.addSimpleTypeTests(io._StdStream);
-  dart.setSignature(io._StdStream, {
-    constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
-    fields: () => ({[_stream$]: StreamOfListOfint()}),
-    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-  });
-  io.Stdin = class Stdin extends io._StdStream {
-    _(stream) {
-      super.new(stream);
-    }
-    readLineSync(opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : io.SYSTEM_ENCODING;
-      let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
-      let CR = 13;
-      let LF = 10;
-      let line = [];
-      let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
-      if (dart.test(retainNewlines)) {
-        let byte = null;
-        do {
-          byte = this.readByteSync();
-          if (dart.notNull(byte) < 0) {
-            break;
-          }
-          line[dartx.add](byte);
-        } while (byte != LF && !(byte == CR && crIsNewline));
-        if (dart.test(line[dartx.isEmpty])) {
-          return null;
+    } else if (crIsNewline) {
+      while (true) {
+        let byte = this.readByteSync();
+        if (dart.notNull(byte) < 0) {
+          if (dart.test(line[dartx.isEmpty])) return null;
+          break;
         }
-      } else if (crIsNewline) {
+        if (byte == LF || byte == CR) break;
+        line[dartx.add](byte);
+      }
+    } else {
+      outer:
         while (true) {
           let byte = this.readByteSync();
+          if (byte == LF) break;
+          if (byte == CR) {
+            do {
+              byte = this.readByteSync();
+              if (byte == LF) break outer;
+              line[dartx.add](CR);
+            } while (byte == CR);
+          }
           if (dart.notNull(byte) < 0) {
             if (dart.test(line[dartx.isEmpty])) return null;
             break;
           }
-          if (byte == LF || byte == CR) break;
           line[dartx.add](byte);
         }
-      } else {
-        outer:
-          while (true) {
-            let byte = this.readByteSync();
-            if (byte == LF) break;
-            if (byte == CR) {
-              do {
-                byte = this.readByteSync();
-                if (byte == LF) break outer;
-                line[dartx.add](CR);
-              } while (byte == CR);
-            }
-            if (dart.notNull(byte) < 0) {
-              if (dart.test(line[dartx.isEmpty])) return null;
-              break;
-            }
-            line[dartx.add](byte);
-          }
-      }
-      return encoding.decode(ListOfint()._check(line));
     }
-    set echoMode(enabled) {
-      dart.throw(new core.UnsupportedError("Stdin.echoMode"));
+    return encoding.decode(ListOfint()._check(line));
+  }
+  set echoMode(enabled) {
+    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
+  }
+  set echoMode(enabled) {
+    dart.throw(new core.UnsupportedError("Stdin.echoMode"));
+  }
+  set lineMode(enabled) {
+    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
+  }
+  set lineMode(enabled) {
+    dart.throw(new core.UnsupportedError("Stdin.lineMode"));
+  }
+  readByteSync() {
+    dart.throw(new core.UnsupportedError("Stdin.readByteSync"));
+  }
+};
+dart.defineNamedConstructor(io.Stdin, '_');
+io.Stdin[dart.implements] = () => [StreamOfListOfint()];
+dart.setSignature(io.Stdin, {
+  constructors: () => ({_: dart.definiteFunctionType(io.Stdin, [StreamOfListOfint()])}),
+  setters: () => ({
+    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
+    echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
+    lineMode: dart.definiteFunctionType(dart.void, [core.bool]),
+    lineMode: dart.definiteFunctionType(dart.void, [core.bool])
+  }),
+  methods: () => ({
+    readLineSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
+    readByteSync: dart.definiteFunctionType(core.int, [])
+  })
+});
+const _fd = Symbol('_fd');
+const _nonBlocking = Symbol('_nonBlocking');
+const _hasTerminal = Symbol('_hasTerminal');
+const _terminalColumns = Symbol('_terminalColumns');
+const _terminalLines = Symbol('_terminalLines');
+io._StdSink = class _StdSink extends core.Object {
+  new(sink) {
+    this[_sink$0] = sink;
+  }
+  get encoding() {
+    return this[_sink$0].encoding;
+  }
+  set encoding(encoding) {
+    this[_sink$0].encoding = encoding;
+  }
+  write(object) {
+    this[_sink$0].write(object);
+  }
+  writeln(object) {
+    if (object === void 0) object = "";
+    this[_sink$0].writeln(object);
+  }
+  writeAll(objects, sep) {
+    if (sep === void 0) sep = "";
+    this[_sink$0].writeAll(objects, sep);
+  }
+  add(data) {
+    this[_sink$0].add(data);
+  }
+  addError(error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    this[_sink$0].addError(error, stackTrace);
+  }
+  writeCharCode(charCode) {
+    this[_sink$0].writeCharCode(charCode);
+  }
+  addStream(stream) {
+    return this[_sink$0].addStream(stream);
+  }
+  flush() {
+    return this[_sink$0].flush();
+  }
+  close() {
+    return this[_sink$0].close();
+  }
+  get done() {
+    return this[_sink$0].done;
+  }
+};
+io._StdSink[dart.implements] = () => [io.IOSink];
+dart.setSignature(io._StdSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
+  fields: () => ({[_sink$0]: io.IOSink}),
+  getters: () => ({
+    encoding: dart.definiteFunctionType(convert.Encoding, []),
+    done: dart.definiteFunctionType(async.Future, [])
+  }),
+  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+  methods: () => ({
+    write: dart.definiteFunctionType(dart.void, [core.Object]),
+    writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+    writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
+    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
+    flush: dart.definiteFunctionType(async.Future, []),
+    close: dart.definiteFunctionType(async.Future, [])
+  })
+});
+io.Stdout = class Stdout extends io._StdSink {
+  _(sink, fd) {
+    this[_fd] = fd;
+    this[_nonBlocking] = null;
+    super.new(sink);
+  }
+  get hasTerminal() {
+    return this[_hasTerminal](this[_fd]);
+  }
+  get terminalColumns() {
+    return this[_terminalColumns](this[_fd]);
+  }
+  get terminalLines() {
+    return this[_terminalLines](this[_fd]);
+  }
+  [_hasTerminal](fd) {
+    dart.throw(new core.UnsupportedError("Stdout.hasTerminal"));
+  }
+  [_terminalColumns](fd) {
+    dart.throw(new core.UnsupportedError("Stdout.terminalColumns"));
+  }
+  [_terminalLines](fd) {
+    dart.throw(new core.UnsupportedError("Stdout.terminalLines"));
+  }
+  get nonBlocking() {
+    if (this[_nonBlocking] == null) {
+      this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd]));
     }
-    set echoMode(enabled) {
-      dart.throw(new core.UnsupportedError("Stdin.echoMode"));
-    }
-    set lineMode(enabled) {
-      dart.throw(new core.UnsupportedError("Stdin.lineMode"));
-    }
-    set lineMode(enabled) {
-      dart.throw(new core.UnsupportedError("Stdin.lineMode"));
-    }
-    readByteSync() {
-      dart.throw(new core.UnsupportedError("Stdin.readByteSync"));
-    }
-  };
-  dart.defineNamedConstructor(io.Stdin, '_');
-  io.Stdin[dart.implements] = () => [StreamOfListOfint()];
-  dart.setSignature(io.Stdin, {
-    constructors: () => ({_: dart.definiteFunctionType(io.Stdin, [StreamOfListOfint()])}),
-    setters: () => ({
-      echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
-      echoMode: dart.definiteFunctionType(dart.void, [core.bool]),
-      lineMode: dart.definiteFunctionType(dart.void, [core.bool]),
-      lineMode: dart.definiteFunctionType(dart.void, [core.bool])
-    }),
-    methods: () => ({
-      readLineSync: dart.definiteFunctionType(core.String, [], {encoding: convert.Encoding, retainNewlines: core.bool}),
-      readByteSync: dart.definiteFunctionType(core.int, [])
-    })
-  });
-  const _fd = Symbol('_fd');
-  const _nonBlocking = Symbol('_nonBlocking');
-  const _hasTerminal = Symbol('_hasTerminal');
-  const _terminalColumns = Symbol('_terminalColumns');
-  const _terminalLines = Symbol('_terminalLines');
-  io._StdSink = class _StdSink extends core.Object {
-    new(sink) {
-      this[_sink$0] = sink;
-    }
-    get encoding() {
-      return this[_sink$0].encoding;
-    }
-    set encoding(encoding) {
-      this[_sink$0].encoding = encoding;
-    }
-    write(object) {
-      this[_sink$0].write(object);
-    }
-    writeln(object) {
-      if (object === void 0) object = "";
-      this[_sink$0].writeln(object);
-    }
-    writeAll(objects, sep) {
-      if (sep === void 0) sep = "";
-      this[_sink$0].writeAll(objects, sep);
-    }
-    add(data) {
-      this[_sink$0].add(data);
-    }
-    addError(error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      this[_sink$0].addError(error, stackTrace);
-    }
-    writeCharCode(charCode) {
-      this[_sink$0].writeCharCode(charCode);
-    }
-    addStream(stream) {
-      return this[_sink$0].addStream(stream);
-    }
-    flush() {
-      return this[_sink$0].flush();
-    }
-    close() {
-      return this[_sink$0].close();
-    }
-    get done() {
-      return this[_sink$0].done;
-    }
-  };
-  io._StdSink[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io._StdSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
-    fields: () => ({[_sink$0]: io.IOSink}),
-    getters: () => ({
-      encoding: dart.definiteFunctionType(convert.Encoding, []),
-      done: dart.definiteFunctionType(async.Future, [])
-    }),
-    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
-    methods: () => ({
-      write: dart.definiteFunctionType(dart.void, [core.Object]),
-      writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      writeCharCode: dart.definiteFunctionType(dart.void, [core.int]),
-      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
-      flush: dart.definiteFunctionType(async.Future, []),
-      close: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  io.Stdout = class Stdout extends io._StdSink {
-    _(sink, fd) {
-      this[_fd] = fd;
-      this[_nonBlocking] = null;
-      super.new(sink);
-    }
-    get hasTerminal() {
-      return this[_hasTerminal](this[_fd]);
-    }
-    get terminalColumns() {
-      return this[_terminalColumns](this[_fd]);
-    }
-    get terminalLines() {
-      return this[_terminalLines](this[_fd]);
-    }
-    [_hasTerminal](fd) {
-      dart.throw(new core.UnsupportedError("Stdout.hasTerminal"));
-    }
-    [_terminalColumns](fd) {
-      dart.throw(new core.UnsupportedError("Stdout.terminalColumns"));
-    }
-    [_terminalLines](fd) {
-      dart.throw(new core.UnsupportedError("Stdout.terminalLines"));
-    }
-    get nonBlocking() {
-      if (this[_nonBlocking] == null) {
-        this[_nonBlocking] = io.IOSink.new(new io._FileStreamConsumer.fromStdio(this[_fd]));
-      }
-      return this[_nonBlocking];
-    }
-  };
-  dart.defineNamedConstructor(io.Stdout, '_');
-  io.Stdout[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io.Stdout, {
-    constructors: () => ({_: dart.definiteFunctionType(io.Stdout, [io.IOSink, core.int])}),
-    fields: () => ({
-      [_fd]: core.int,
-      [_nonBlocking]: io.IOSink
-    }),
-    getters: () => ({
-      hasTerminal: dart.definiteFunctionType(core.bool, []),
-      terminalColumns: dart.definiteFunctionType(core.int, []),
-      terminalLines: dart.definiteFunctionType(core.int, []),
-      nonBlocking: dart.definiteFunctionType(io.IOSink, [])
-    }),
-    methods: () => ({
-      [_hasTerminal]: dart.definiteFunctionType(core.bool, [core.int]),
-      [_terminalColumns]: dart.definiteFunctionType(core.int, [core.int]),
-      [_terminalLines]: dart.definiteFunctionType(core.int, [core.int])
-    })
-  });
-  io.StdoutException = class StdoutException extends core.Object {
-    new(message, osError) {
-      if (osError === void 0) osError = null;
-      this.message = message;
-      this.osError = osError;
-    }
-    toString() {
-      return dart.str`StdoutException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
-    }
-  };
-  io.StdoutException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.StdoutException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.StdoutException, [core.String], [io.OSError])}),
-    fields: () => ({
-      message: core.String,
-      osError: io.OSError
-    })
-  });
-  io._StdConsumer = class _StdConsumer extends core.Object {
-    new(fd) {
-      this[_file] = io._File._openStdioSync(fd);
-    }
-    addStream(stream) {
-      let completer = async.Completer.new();
-      let sub = null;
-      sub = stream.listen(dart.fn(data => {
-        try {
-          dart.dsend(this[_file], 'writeFromSync', data);
-        } catch (e) {
-          let s = dart.stackTrace(e);
-          dart.dsend(sub, 'cancel');
-          completer.completeError(e, s);
-        }
-
-      }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
-      return completer.future;
-    }
-    close() {
-      dart.dsend(this[_file], 'closeSync');
-      return async.Future.value();
-    }
-  };
-  io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
-  dart.setSignature(io._StdConsumer, {
-    constructors: () => ({new: dart.definiteFunctionType(io._StdConsumer, [core.int])}),
-    fields: () => ({[_file]: dart.dynamic}),
-    methods: () => ({
-      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
-      close: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  io.StdioType = class StdioType extends core.Object {
-    _(name) {
-      this.name = name;
-    }
-    toString() {
-      return dart.str`StdioType: ${this.name}`;
-    }
-  };
-  dart.defineNamedConstructor(io.StdioType, '_');
-  dart.setSignature(io.StdioType, {
-    constructors: () => ({_: dart.definiteFunctionType(io.StdioType, [core.String])}),
-    fields: () => ({name: core.String}),
-    sfields: () => ({
-      TERMINAL: io.StdioType,
-      PIPE: io.StdioType,
-      FILE: io.StdioType,
-      OTHER: io.StdioType
-    })
-  });
-  dart.defineLazy(io.StdioType, {
-    get TERMINAL() {
-      return dart.const(new io.StdioType._("terminal"));
-    },
-    get PIPE() {
-      return dart.const(new io.StdioType._("pipe"));
-    },
-    get FILE() {
-      return dart.const(new io.StdioType._("file"));
-    },
-    get OTHER() {
-      return dart.const(new io.StdioType._("other"));
-    }
-  });
-  io._stdin = null;
-  io._stdout = null;
-  io._stderr = null;
-  dart.copyProperties(io, {
-    get stdin() {
-      if (io._stdin == null) {
-        io._stdin = io._StdIOUtils._getStdioInputStream();
-      }
-      return io._stdin;
-    }
-  });
-  dart.copyProperties(io, {
-    get stdout() {
-      if (io._stdout == null) {
-        io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(1));
-      }
-      return io._stdout;
-    }
-  });
-  dart.copyProperties(io, {
-    get stderr() {
-      if (io._stderr == null) {
-        io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(2));
-      }
-      return io._stderr;
-    }
-  });
-  io.stdioType = function(object) {
-    if (io._StdStream.is(object)) {
-      object = dart.dload(object, _stream$);
-    } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
-      switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
-        case io._STDIO_HANDLE_TYPE_TERMINAL:
-        {
-          return io.StdioType.TERMINAL;
-        }
-        case io._STDIO_HANDLE_TYPE_PIPE:
-        {
-          return io.StdioType.PIPE;
-        }
-        case io._STDIO_HANDLE_TYPE_FILE:
-        {
-          return io.StdioType.FILE;
-        }
-      }
-    }
-    if (io._FileStream.is(object)) {
-      return io.StdioType.FILE;
-    }
-    if (io.Socket.is(object)) {
-      let socketType = io._StdIOUtils._socketType(object);
-      if (socketType == null) return io.StdioType.OTHER;
-      switch (socketType) {
-        case io._STDIO_HANDLE_TYPE_TERMINAL:
-        {
-          return io.StdioType.TERMINAL;
-        }
-        case io._STDIO_HANDLE_TYPE_PIPE:
-        {
-          return io.StdioType.PIPE;
-        }
-        case io._STDIO_HANDLE_TYPE_FILE:
-        {
-          return io.StdioType.FILE;
-        }
-      }
-    }
-    if (io._IOSinkImpl.is(object)) {
+    return this[_nonBlocking];
+  }
+};
+dart.defineNamedConstructor(io.Stdout, '_');
+io.Stdout[dart.implements] = () => [io.IOSink];
+dart.setSignature(io.Stdout, {
+  constructors: () => ({_: dart.definiteFunctionType(io.Stdout, [io.IOSink, core.int])}),
+  fields: () => ({
+    [_fd]: core.int,
+    [_nonBlocking]: io.IOSink
+  }),
+  getters: () => ({
+    hasTerminal: dart.definiteFunctionType(core.bool, []),
+    terminalColumns: dart.definiteFunctionType(core.int, []),
+    terminalLines: dart.definiteFunctionType(core.int, []),
+    nonBlocking: dart.definiteFunctionType(io.IOSink, [])
+  }),
+  methods: () => ({
+    [_hasTerminal]: dart.definiteFunctionType(core.bool, [core.int]),
+    [_terminalColumns]: dart.definiteFunctionType(core.int, [core.int]),
+    [_terminalLines]: dart.definiteFunctionType(core.int, [core.int])
+  })
+});
+io.StdoutException = class StdoutException extends core.Object {
+  new(message, osError) {
+    if (osError === void 0) osError = null;
+    this.message = message;
+    this.osError = osError;
+  }
+  toString() {
+    return dart.str`StdoutException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
+  }
+};
+io.StdoutException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.StdoutException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.StdoutException, [core.String], [io.OSError])}),
+  fields: () => ({
+    message: core.String,
+    osError: io.OSError
+  })
+});
+io._StdConsumer = class _StdConsumer extends core.Object {
+  new(fd) {
+    this[_file] = io._File._openStdioSync(fd);
+  }
+  addStream(stream) {
+    let completer = async.Completer.new();
+    let sub = null;
+    sub = stream.listen(dart.fn(data => {
       try {
-        if (io._FileStreamConsumer.is(object[_target$])) {
-          return io.StdioType.FILE;
-        }
+        dart.dsend(this[_file], 'writeFromSync', data);
       } catch (e) {
+        let s = dart.stackTrace(e);
+        dart.dsend(sub, 'cancel');
+        completer.completeError(e, s);
       }
 
+    }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError'), onDone: dart.bind(completer, 'complete'), cancelOnError: true});
+    return completer.future;
+  }
+  close() {
+    dart.dsend(this[_file], 'closeSync');
+    return async.Future.value();
+  }
+};
+io._StdConsumer[dart.implements] = () => [StreamConsumerOfListOfint()];
+dart.setSignature(io._StdConsumer, {
+  constructors: () => ({new: dart.definiteFunctionType(io._StdConsumer, [core.int])}),
+  fields: () => ({[_file]: dart.dynamic}),
+  methods: () => ({
+    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
+    close: dart.definiteFunctionType(async.Future, [])
+  })
+});
+io.StdioType = class StdioType extends core.Object {
+  _(name) {
+    this.name = name;
+  }
+  toString() {
+    return dart.str`StdioType: ${this.name}`;
+  }
+};
+dart.defineNamedConstructor(io.StdioType, '_');
+dart.setSignature(io.StdioType, {
+  constructors: () => ({_: dart.definiteFunctionType(io.StdioType, [core.String])}),
+  fields: () => ({name: core.String}),
+  sfields: () => ({
+    TERMINAL: io.StdioType,
+    PIPE: io.StdioType,
+    FILE: io.StdioType,
+    OTHER: io.StdioType
+  })
+});
+dart.defineLazy(io.StdioType, {
+  get TERMINAL() {
+    return dart.const(new io.StdioType._("terminal"));
+  },
+  get PIPE() {
+    return dart.const(new io.StdioType._("pipe"));
+  },
+  get FILE() {
+    return dart.const(new io.StdioType._("file"));
+  },
+  get OTHER() {
+    return dart.const(new io.StdioType._("other"));
+  }
+});
+io._stdin = null;
+io._stdout = null;
+io._stderr = null;
+dart.copyProperties(io, {
+  get stdin() {
+    if (io._stdin == null) {
+      io._stdin = io._StdIOUtils._getStdioInputStream();
     }
-    return io.StdioType.OTHER;
-  };
-  dart.fn(io.stdioType, dynamicToStdioType());
-  io._StdIOUtils = class _StdIOUtils extends core.Object {
-    static _getStdioOutputStream(fd) {
-      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioOutputStream"));
+    return io._stdin;
+  }
+});
+dart.copyProperties(io, {
+  get stdout() {
+    if (io._stdout == null) {
+      io._stdout = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(1));
     }
-    static _getStdioInputStream() {
-      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioInputStream"));
+    return io._stdout;
+  }
+});
+dart.copyProperties(io, {
+  get stderr() {
+    if (io._stderr == null) {
+      io._stderr = io.Stdout._check(io._StdIOUtils._getStdioOutputStream(2));
     }
-    static _socketType(socket) {
-      dart.throw(new core.UnsupportedError("StdIOUtils._socketType"));
+    return io._stderr;
+  }
+});
+io.stdioType = function(object) {
+  if (io._StdStream.is(object)) {
+    object = dart.dload(object, _stream$);
+  } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
+    switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
+      case io._STDIO_HANDLE_TYPE_TERMINAL:
+      {
+        return io.StdioType.TERMINAL;
+      }
+      case io._STDIO_HANDLE_TYPE_PIPE:
+      {
+        return io.StdioType.PIPE;
+      }
+      case io._STDIO_HANDLE_TYPE_FILE:
+      {
+        return io.StdioType.FILE;
+      }
     }
-    static _getStdioHandleType(fd) {
-      dart.throw(new core.UnsupportedError("StdIOUtils._getStdioHandleType"));
+  }
+  if (io._FileStream.is(object)) {
+    return io.StdioType.FILE;
+  }
+  if (io.Socket.is(object)) {
+    let socketType = io._StdIOUtils._socketType(object);
+    if (socketType == null) return io.StdioType.OTHER;
+    switch (socketType) {
+      case io._STDIO_HANDLE_TYPE_TERMINAL:
+      {
+        return io.StdioType.TERMINAL;
+      }
+      case io._STDIO_HANDLE_TYPE_PIPE:
+      {
+        return io.StdioType.PIPE;
+      }
+      case io._STDIO_HANDLE_TYPE_FILE:
+      {
+        return io.StdioType.FILE;
+      }
     }
-  };
-  dart.setSignature(io._StdIOUtils, {
-    statics: () => ({
-      _getStdioOutputStream: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      _getStdioInputStream: dart.definiteFunctionType(io.Stdin, []),
-      _socketType: dart.definiteFunctionType(core.int, [io.Socket]),
-      _getStdioHandleType: dart.definiteFunctionType(dart.dynamic, [core.int])
-    }),
-    names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
-  });
-  let const$76;
-  let const$77;
-  let const$78;
-  let const$79;
-  io.SystemEncoding = class SystemEncoding extends convert.Encoding {
-    new() {
-      super.new();
+  }
+  if (io._IOSinkImpl.is(object)) {
+    try {
+      if (io._FileStreamConsumer.is(object[_target$])) {
+        return io.StdioType.FILE;
+      }
+    } catch (e) {
     }
-    get name() {
-      return 'system';
+
+  }
+  return io.StdioType.OTHER;
+};
+dart.fn(io.stdioType, dynamicToStdioType());
+io._StdIOUtils = class _StdIOUtils extends core.Object {
+  static _getStdioOutputStream(fd) {
+    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioOutputStream"));
+  }
+  static _getStdioInputStream() {
+    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioInputStream"));
+  }
+  static _socketType(socket) {
+    dart.throw(new core.UnsupportedError("StdIOUtils._socketType"));
+  }
+  static _getStdioHandleType(fd) {
+    dart.throw(new core.UnsupportedError("StdIOUtils._getStdioHandleType"));
+  }
+};
+dart.setSignature(io._StdIOUtils, {
+  statics: () => ({
+    _getStdioOutputStream: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    _getStdioInputStream: dart.definiteFunctionType(io.Stdin, []),
+    _socketType: dart.definiteFunctionType(core.int, [io.Socket]),
+    _getStdioHandleType: dart.definiteFunctionType(dart.dynamic, [core.int])
+  }),
+  names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
+});
+let const$76;
+let const$77;
+let const$78;
+let const$79;
+io.SystemEncoding = class SystemEncoding extends convert.Encoding {
+  new() {
+    super.new();
+  }
+  get name() {
+    return 'system';
+  }
+  encode(input) {
+    return this.encoder.convert(input);
+  }
+  decode(encoded) {
+    return this.decoder.convert(encoded);
+  }
+  get encoder() {
+    if (io.Platform.operatingSystem == "windows") {
+      return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+    } else {
+      return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
     }
-    encode(input) {
-      return this.encoder.convert(input);
+  }
+  get decoder() {
+    if (io.Platform.operatingSystem == "windows") {
+      return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+    } else {
+      return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
     }
-    decode(encoded) {
-      return this.decoder.convert(encoded);
+  }
+};
+dart.setSignature(io.SystemEncoding, {
+  constructors: () => ({new: dart.definiteFunctionType(io.SystemEncoding, [])}),
+  getters: () => ({
+    name: dart.definiteFunctionType(core.String, []),
+    encoder: dart.definiteFunctionType(convert.Converter$(core.String, core.List$(core.int)), []),
+    decoder: dart.definiteFunctionType(convert.Converter$(core.List$(core.int), core.String), [])
+  })
+});
+io.SYSTEM_ENCODING = dart.const(new io.SystemEncoding());
+io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
+  new() {
+    super.new();
+  }
+  convert(input) {
+    let encoded = io._WindowsCodePageEncoder._encodeString(input);
+    if (encoded == null) {
+      dart.throw(new core.FormatException("Invalid character for encoding"));
     }
-    get encoder() {
-      if (io.Platform.operatingSystem == "windows") {
-        return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+    return encoded;
+  }
+  startChunkedConversion(sink) {
+    return new io._WindowsCodePageEncoderSink(sink);
+  }
+  static _encodeString(string) {
+    dart.throw(new core.UnsupportedError("_WindowsCodePageEncoder._encodeString"));
+  }
+};
+dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
+dart.setSignature(io._WindowsCodePageEncoder, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoder, [])}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+    startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
+  }),
+  statics: () => ({_encodeString: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
+  names: ['_encodeString']
+});
+io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
+  new(sink) {
+    this[_sink$0] = sink;
+  }
+  close() {
+    this[_sink$0].close();
+  }
+  add(string) {
+    let encoded = io._WindowsCodePageEncoder._encodeString(string);
+    if (encoded == null) {
+      dart.throw(new core.FormatException("Invalid character for encoding"));
+    }
+    this[_sink$0].add(encoded);
+  }
+  addSlice(source, start, end, isLast) {
+    if (start != 0 || end != source[dartx.length]) {
+      source = source[dartx.substring](start, end);
+    }
+    this.add(source);
+    if (dart.test(isLast)) this.close();
+  }
+};
+dart.setSignature(io._WindowsCodePageEncoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
+  fields: () => ({[_sink$0]: SinkOfListOfint()}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
+  })
+});
+io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
+  new() {
+    super.new();
+  }
+  convert(input) {
+    return io._WindowsCodePageDecoder._decodeBytes(input);
+  }
+  startChunkedConversion(sink) {
+    return new io._WindowsCodePageDecoderSink(sink);
+  }
+  static _decodeBytes(bytes) {
+    dart.throw(new core.UnsupportedError("_WindowsCodePageDecoder._decodeBytes"));
+  }
+};
+dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
+dart.setSignature(io._WindowsCodePageDecoder, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoder, [])}),
+  methods: () => ({
+    convert: dart.definiteFunctionType(core.String, [ListOfint()]),
+    startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
+  }),
+  statics: () => ({_decodeBytes: dart.definiteFunctionType(core.String, [ListOfint()])}),
+  names: ['_decodeBytes']
+});
+io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
+  new(sink) {
+    this[_sink$0] = sink;
+    super.new();
+  }
+  close() {
+    this[_sink$0].close();
+  }
+  add(bytes) {
+    this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
+  }
+};
+dart.setSignature(io._WindowsCodePageDecoderSink, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
+  fields: () => ({[_sink$0]: SinkOfString()}),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()])
+  })
+});
+io.WebSocketStatus = class WebSocketStatus extends core.Object {};
+dart.setSignature(io.WebSocketStatus, {
+  sfields: () => ({
+    NORMAL_CLOSURE: core.int,
+    GOING_AWAY: core.int,
+    PROTOCOL_ERROR: core.int,
+    UNSUPPORTED_DATA: core.int,
+    RESERVED_1004: core.int,
+    NO_STATUS_RECEIVED: core.int,
+    ABNORMAL_CLOSURE: core.int,
+    INVALID_FRAME_PAYLOAD_DATA: core.int,
+    POLICY_VIOLATION: core.int,
+    MESSAGE_TOO_BIG: core.int,
+    MISSING_MANDATORY_EXTENSION: core.int,
+    INTERNAL_SERVER_ERROR: core.int,
+    RESERVED_1015: core.int
+  })
+});
+io.WebSocketStatus.NORMAL_CLOSURE = 1000;
+io.WebSocketStatus.GOING_AWAY = 1001;
+io.WebSocketStatus.PROTOCOL_ERROR = 1002;
+io.WebSocketStatus.UNSUPPORTED_DATA = 1003;
+io.WebSocketStatus.RESERVED_1004 = 1004;
+io.WebSocketStatus.NO_STATUS_RECEIVED = 1005;
+io.WebSocketStatus.ABNORMAL_CLOSURE = 1006;
+io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA = 1007;
+io.WebSocketStatus.POLICY_VIOLATION = 1008;
+io.WebSocketStatus.MESSAGE_TOO_BIG = 1009;
+io.WebSocketStatus.MISSING_MANDATORY_EXTENSION = 1010;
+io.WebSocketStatus.INTERNAL_SERVER_ERROR = 1011;
+io.WebSocketStatus.RESERVED_1015 = 1015;
+const _createServerResponseHeader = Symbol('_createServerResponseHeader');
+const _createClientRequestHeader = Symbol('_createClientRequestHeader');
+const _createHeader = Symbol('_createHeader');
+io.CompressionOptions = class CompressionOptions extends core.Object {
+  new(opts) {
+    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
+    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
+    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
+    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
+    let enabled = opts && 'enabled' in opts ? opts.enabled : true;
+    this.clientNoContextTakeover = clientNoContextTakeover;
+    this.serverNoContextTakeover = serverNoContextTakeover;
+    this.clientMaxWindowBits = clientMaxWindowBits;
+    this.serverMaxWindowBits = serverMaxWindowBits;
+    this.enabled = enabled;
+  }
+  [_createServerResponseHeader](requested) {
+    let info = new io._CompressionMaxWindowBits();
+    let mwb = null;
+    let part = null;
+    if (dart.nullSafe(requested, _ => _.parameters) != null) {
+      part = requested.parameters[dartx._get](io._serverMaxWindowBits);
+    }
+    if (part != null) {
+      if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
+        dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
       } else {
-        return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
+        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())}) : this.serverMaxWindowBits;
+        info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
+        info.maxWindowBits = mwb;
       }
+    } else {
+      info.headerValue = "";
+      info.maxWindowBits = io._WebSocketImpl.DEFAULT_WINDOW_BITS;
     }
-    get decoder() {
-      if (io.Platform.operatingSystem == "windows") {
-        return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+    return info;
+  }
+  [_createClientRequestHeader](requested, size) {
+    let info = "";
+    if (requested != null) {
+      info = dart.str`; client_max_window_bits=${size}`;
+    } else {
+      if (this.clientMaxWindowBits == null) {
+        info = "; client_max_window_bits";
       } else {
-        return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
+        info = dart.str`; client_max_window_bits=${this.clientMaxWindowBits}`;
+      }
+      if (this.serverMaxWindowBits != null) {
+        info = info + dart.str`; server_max_window_bits=${this.serverMaxWindowBits}`;
       }
     }
-  };
-  dart.setSignature(io.SystemEncoding, {
-    constructors: () => ({new: dart.definiteFunctionType(io.SystemEncoding, [])}),
-    getters: () => ({
-      name: dart.definiteFunctionType(core.String, []),
-      encoder: dart.definiteFunctionType(convert.Converter$(core.String, core.List$(core.int)), []),
-      decoder: dart.definiteFunctionType(convert.Converter$(core.List$(core.int), core.String), [])
-    })
-  });
-  io.SYSTEM_ENCODING = dart.const(new io.SystemEncoding());
-  io._WindowsCodePageEncoder = class _WindowsCodePageEncoder extends convert.Converter$(core.String, core.List$(core.int)) {
-    new() {
-      super.new();
-    }
-    convert(input) {
-      let encoded = io._WindowsCodePageEncoder._encodeString(input);
-      if (encoded == null) {
-        dart.throw(new core.FormatException("Invalid character for encoding"));
-      }
-      return encoded;
-    }
-    startChunkedConversion(sink) {
-      return new io._WindowsCodePageEncoderSink(sink);
-    }
-    static _encodeString(string) {
-      dart.throw(new core.UnsupportedError("_WindowsCodePageEncoder._encodeString"));
-    }
-  };
-  dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
-  dart.setSignature(io._WindowsCodePageEncoder, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoder, [])}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-      startChunkedConversion: dart.definiteFunctionType(convert.StringConversionSink, [SinkOfListOfint()])
-    }),
-    statics: () => ({_encodeString: dart.definiteFunctionType(core.List$(core.int), [core.String])}),
-    names: ['_encodeString']
-  });
-  io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
-    new(sink) {
-      this[_sink$0] = sink;
-    }
-    close() {
-      this[_sink$0].close();
-    }
-    add(string) {
-      let encoded = io._WindowsCodePageEncoder._encodeString(string);
-      if (encoded == null) {
-        dart.throw(new core.FormatException("Invalid character for encoding"));
-      }
-      this[_sink$0].add(encoded);
-    }
-    addSlice(source, start, end, isLast) {
-      if (start != 0 || end != source[dartx.length]) {
-        source = source[dartx.substring](start, end);
-      }
-      this.add(source);
-      if (dart.test(isLast)) this.close();
-    }
-  };
-  dart.setSignature(io._WindowsCodePageEncoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
-    fields: () => ({[_sink$0]: SinkOfListOfint()}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
-    })
-  });
-  io._WindowsCodePageDecoder = class _WindowsCodePageDecoder extends convert.Converter$(core.List$(core.int), core.String) {
-    new() {
-      super.new();
-    }
-    convert(input) {
-      return io._WindowsCodePageDecoder._decodeBytes(input);
-    }
-    startChunkedConversion(sink) {
-      return new io._WindowsCodePageDecoderSink(sink);
-    }
-    static _decodeBytes(bytes) {
-      dart.throw(new core.UnsupportedError("_WindowsCodePageDecoder._decodeBytes"));
-    }
-  };
-  dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
-  dart.setSignature(io._WindowsCodePageDecoder, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoder, [])}),
-    methods: () => ({
-      convert: dart.definiteFunctionType(core.String, [ListOfint()]),
-      startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
-    }),
-    statics: () => ({_decodeBytes: dart.definiteFunctionType(core.String, [ListOfint()])}),
-    names: ['_decodeBytes']
-  });
-  io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
-    new(sink) {
-      this[_sink$0] = sink;
-      super.new();
-    }
-    close() {
-      this[_sink$0].close();
-    }
-    add(bytes) {
-      this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
-    }
-  };
-  dart.setSignature(io._WindowsCodePageDecoderSink, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
-    fields: () => ({[_sink$0]: SinkOfString()}),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()])
-    })
-  });
-  io.WebSocketStatus = class WebSocketStatus extends core.Object {};
-  dart.setSignature(io.WebSocketStatus, {
-    sfields: () => ({
-      NORMAL_CLOSURE: core.int,
-      GOING_AWAY: core.int,
-      PROTOCOL_ERROR: core.int,
-      UNSUPPORTED_DATA: core.int,
-      RESERVED_1004: core.int,
-      NO_STATUS_RECEIVED: core.int,
-      ABNORMAL_CLOSURE: core.int,
-      INVALID_FRAME_PAYLOAD_DATA: core.int,
-      POLICY_VIOLATION: core.int,
-      MESSAGE_TOO_BIG: core.int,
-      MISSING_MANDATORY_EXTENSION: core.int,
-      INTERNAL_SERVER_ERROR: core.int,
-      RESERVED_1015: core.int
-    })
-  });
-  io.WebSocketStatus.NORMAL_CLOSURE = 1000;
-  io.WebSocketStatus.GOING_AWAY = 1001;
-  io.WebSocketStatus.PROTOCOL_ERROR = 1002;
-  io.WebSocketStatus.UNSUPPORTED_DATA = 1003;
-  io.WebSocketStatus.RESERVED_1004 = 1004;
-  io.WebSocketStatus.NO_STATUS_RECEIVED = 1005;
-  io.WebSocketStatus.ABNORMAL_CLOSURE = 1006;
-  io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA = 1007;
-  io.WebSocketStatus.POLICY_VIOLATION = 1008;
-  io.WebSocketStatus.MESSAGE_TOO_BIG = 1009;
-  io.WebSocketStatus.MISSING_MANDATORY_EXTENSION = 1010;
-  io.WebSocketStatus.INTERNAL_SERVER_ERROR = 1011;
-  io.WebSocketStatus.RESERVED_1015 = 1015;
-  const _createServerResponseHeader = Symbol('_createServerResponseHeader');
-  const _createClientRequestHeader = Symbol('_createClientRequestHeader');
-  const _createHeader = Symbol('_createHeader');
-  io.CompressionOptions = class CompressionOptions extends core.Object {
-    new(opts) {
-      let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
-      let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
-      let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : null;
-      let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : null;
-      let enabled = opts && 'enabled' in opts ? opts.enabled : true;
-      this.clientNoContextTakeover = clientNoContextTakeover;
-      this.serverNoContextTakeover = serverNoContextTakeover;
-      this.clientMaxWindowBits = clientMaxWindowBits;
-      this.serverMaxWindowBits = serverMaxWindowBits;
-      this.enabled = enabled;
-    }
-    [_createServerResponseHeader](requested) {
-      let info = new io._CompressionMaxWindowBits();
-      let mwb = null;
-      let part = null;
-      if (dart.nullSafe(requested, _ => _.parameters) != null) {
-        part = requested.parameters[dartx._get](io._serverMaxWindowBits);
-      }
-      if (part != null) {
-        if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
-          dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
-        } else {
-          mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())}) : this.serverMaxWindowBits;
-          info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
-          info.maxWindowBits = mwb;
-        }
-      } else {
-        info.headerValue = "";
-        info.maxWindowBits = io._WebSocketImpl.DEFAULT_WINDOW_BITS;
-      }
+    return info;
+  }
+  [_createHeader](requested) {
+    if (requested === void 0) requested = null;
+    let info = new io._CompressionMaxWindowBits("", 0);
+    if (!dart.test(this.enabled)) {
       return info;
     }
-    [_createClientRequestHeader](requested, size) {
-      let info = "";
-      if (requested != null) {
-        info = dart.str`; client_max_window_bits=${size}`;
-      } else {
-        if (this.clientMaxWindowBits == null) {
-          info = "; client_max_window_bits";
-        } else {
-          info = dart.str`; client_max_window_bits=${this.clientMaxWindowBits}`;
-        }
-        if (this.serverMaxWindowBits != null) {
-          info = info + dart.str`; server_max_window_bits=${this.serverMaxWindowBits}`;
-        }
+    info.headerValue = io._WebSocketImpl.PER_MESSAGE_DEFLATE;
+    if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._clientNoContextTakeover)))) {
+      info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
+    }
+    if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._serverNoContextTakeover)))) {
+      info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
+    }
+    let headerList = this[_createServerResponseHeader](requested);
+    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
+    info.maxWindowBits = headerList.maxWindowBits;
+    info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
+    return info;
+  }
+};
+dart.setSignature(io.CompressionOptions, {
+  constructors: () => ({new: dart.definiteFunctionType(io.CompressionOptions, [], {clientNoContextTakeover: core.bool, serverNoContextTakeover: core.bool, clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, enabled: core.bool})}),
+  fields: () => ({
+    clientNoContextTakeover: core.bool,
+    serverNoContextTakeover: core.bool,
+    clientMaxWindowBits: core.int,
+    serverMaxWindowBits: core.int,
+    enabled: core.bool
+  }),
+  methods: () => ({
+    [_createServerResponseHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [io.HeaderValue]),
+    [_createClientRequestHeader]: dart.definiteFunctionType(core.String, [io.HeaderValue, core.int]),
+    [_createHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [io.HeaderValue])
+  }),
+  sfields: () => ({
+    DEFAULT: io.CompressionOptions,
+    OFF: io.CompressionOptions
+  })
+});
+dart.defineLazy(io.CompressionOptions, {
+  get DEFAULT() {
+    return dart.const(new io.CompressionOptions());
+  },
+  get OFF() {
+    return dart.const(new io.CompressionOptions({enabled: false}));
+  }
+});
+io.WebSocketTransformer = class WebSocketTransformer extends core.Object {
+  static new(opts) {
+    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
+    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
+    return new io._WebSocketTransformerImpl(protocolSelector, compression);
+  }
+  static upgrade(request, opts) {
+    let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
+    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
+    return io._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
+  }
+  static isUpgradeRequest(request) {
+    return io._WebSocketTransformerImpl._isUpgradeRequest(request);
+  }
+};
+io.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
+dart.setSignature(io.WebSocketTransformer, {
+  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketTransformer, [], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions})}),
+  statics: () => ({
+    upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions}),
+    isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
+  }),
+  names: ['upgrade', 'isUpgradeRequest']
+});
+io.WebSocket = class WebSocket extends core.Object {
+  static connect(url, opts) {
+    let protocols = opts && 'protocols' in opts ? opts.protocols : null;
+    let headers = opts && 'headers' in opts ? opts.headers : null;
+    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
+    return io._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
+  }
+  new() {
+    this.pingInterval = null;
+  }
+  static fromUpgradedSocket(socket, opts) {
+    let protocol = opts && 'protocol' in opts ? opts.protocol : null;
+    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
+    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
+    if (serverSide == null) {
+      dart.throw(new core.ArgumentError("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
+    }
+    return new io._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
+  }
+};
+io.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
+dart.setSignature(io.WebSocket, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(io.WebSocket, []),
+    fromUpgradedSocket: dart.definiteFunctionType(io.WebSocket, [io.Socket], {protocol: core.String, serverSide: core.bool, compression: io.CompressionOptions})
+  }),
+  fields: () => ({pingInterval: core.Duration}),
+  sfields: () => ({
+    CONNECTING: core.int,
+    OPEN: core.int,
+    CLOSING: core.int,
+    CLOSED: core.int
+  }),
+  statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String], {protocols: IterableOfString(), headers: MapOfString$dynamic(), compression: io.CompressionOptions})}),
+  names: ['connect']
+});
+io.WebSocket.CONNECTING = 0;
+io.WebSocket.OPEN = 1;
+io.WebSocket.CLOSING = 2;
+io.WebSocket.CLOSED = 3;
+io.WebSocketException = class WebSocketException extends core.Object {
+  new(message) {
+    if (message === void 0) message = "";
+    this.message = message;
+  }
+  toString() {
+    return dart.str`WebSocketException: ${this.message}`;
+  }
+};
+io.WebSocketException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.WebSocketException, {
+  constructors: () => ({new: dart.definiteFunctionType(io.WebSocketException, [], [core.String])}),
+  fields: () => ({message: core.String})
+});
+io._webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+io._clientNoContextTakeover = "client_no_context_takeover";
+io._serverNoContextTakeover = "server_no_context_takeover";
+io._clientMaxWindowBits = "client_max_window_bits";
+io._serverMaxWindowBits = "server_max_window_bits";
+io._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
+dart.setSignature(io._WebSocketMessageType, {
+  sfields: () => ({
+    NONE: core.int,
+    TEXT: core.int,
+    BINARY: core.int
+  })
+});
+io._WebSocketMessageType.NONE = 0;
+io._WebSocketMessageType.TEXT = 1;
+io._WebSocketMessageType.BINARY = 2;
+io._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
+dart.setSignature(io._WebSocketOpcode, {
+  sfields: () => ({
+    CONTINUATION: core.int,
+    TEXT: core.int,
+    BINARY: core.int,
+    RESERVED_3: core.int,
+    RESERVED_4: core.int,
+    RESERVED_5: core.int,
+    RESERVED_6: core.int,
+    RESERVED_7: core.int,
+    CLOSE: core.int,
+    PING: core.int,
+    PONG: core.int,
+    RESERVED_B: core.int,
+    RESERVED_C: core.int,
+    RESERVED_D: core.int,
+    RESERVED_E: core.int,
+    RESERVED_F: core.int
+  })
+});
+io._WebSocketOpcode.CONTINUATION = 0;
+io._WebSocketOpcode.TEXT = 1;
+io._WebSocketOpcode.BINARY = 2;
+io._WebSocketOpcode.RESERVED_3 = 3;
+io._WebSocketOpcode.RESERVED_4 = 4;
+io._WebSocketOpcode.RESERVED_5 = 5;
+io._WebSocketOpcode.RESERVED_6 = 6;
+io._WebSocketOpcode.RESERVED_7 = 7;
+io._WebSocketOpcode.CLOSE = 8;
+io._WebSocketOpcode.PING = 9;
+io._WebSocketOpcode.PONG = 10;
+io._WebSocketOpcode.RESERVED_B = 11;
+io._WebSocketOpcode.RESERVED_C = 12;
+io._WebSocketOpcode.RESERVED_D = 13;
+io._WebSocketOpcode.RESERVED_E = 14;
+io._WebSocketOpcode.RESERVED_F = 15;
+io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
+  new(headerValue, maxWindowBits) {
+    if (headerValue === void 0) headerValue = null;
+    if (maxWindowBits === void 0) maxWindowBits = null;
+    this.headerValue = headerValue;
+    this.maxWindowBits = maxWindowBits;
+  }
+  toString() {
+    return this.headerValue;
+  }
+};
+dart.setSignature(io._CompressionMaxWindowBits, {
+  constructors: () => ({new: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [core.String, core.int])}),
+  fields: () => ({
+    headerValue: core.String,
+    maxWindowBits: core.int
+  })
+});
+const _maskingBytes = Symbol('_maskingBytes');
+const _payload = Symbol('_payload');
+const _serverSide = Symbol('_serverSide');
+const _deflate = Symbol('_deflate');
+const _fin = Symbol('_fin');
+const _compressed = Symbol('_compressed');
+const _opcode = Symbol('_opcode');
+const _len = Symbol('_len');
+const _masked = Symbol('_masked');
+const _remainingLenBytes = Symbol('_remainingLenBytes');
+const _remainingMaskingKeyBytes = Symbol('_remainingMaskingKeyBytes');
+const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
+const _unmaskingIndex = Symbol('_unmaskingIndex');
+const _currentMessageType = Symbol('_currentMessageType');
+const _eventSink$ = Symbol('_eventSink');
+const _isControlFrame = Symbol('_isControlFrame');
+const _lengthDone = Symbol('_lengthDone');
+const _maskDone = Symbol('_maskDone');
+const _unmask = Symbol('_unmask');
+const _controlFrameEnd = Symbol('_controlFrameEnd');
+const _messageFrameEnd = Symbol('_messageFrameEnd');
+const _startPayload = Symbol('_startPayload');
+const _prepareForNextFrame = Symbol('_prepareForNextFrame');
+io._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends core.Object {
+  new(serverSide, deflate) {
+    if (serverSide === void 0) serverSide = false;
+    if (deflate === void 0) deflate = null;
+    this[_maskingBytes] = core.List.new(4);
+    this[_payload] = io.BytesBuilder.new({copy: false});
+    this[_serverSide] = serverSide;
+    this[_deflate] = deflate;
+    this[_state$1] = io._WebSocketProtocolTransformer.START;
+    this[_fin] = false;
+    this[_compressed] = false;
+    this[_opcode] = -1;
+    this[_len] = -1;
+    this[_masked] = false;
+    this[_remainingLenBytes] = -1;
+    this[_remainingMaskingKeyBytes] = 4;
+    this[_remainingPayloadBytes] = -1;
+    this[_unmaskingIndex] = 0;
+    this[_currentMessageType] = io._WebSocketMessageType.NONE;
+    this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
+    this.closeReason = "";
+    this[_eventSink$] = null;
+  }
+  bind(stream) {
+    return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
+      if (this[_eventSink$] != null) {
+        dart.throw(new core.StateError("WebSocket transformer already used."));
       }
-      return info;
+      this[_eventSink$] = eventSink;
+      return this;
+    }, EventSinkTo_WebSocketProtocolTransformer()));
+  }
+  addError(error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    this[_eventSink$].addError(error, stackTrace);
+  }
+  close() {
+    this[_eventSink$].close();
+  }
+  add(bytes) {
+    let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
+    let index = 0;
+    let lastIndex = buffer[dartx.length];
+    if (this[_state$1] == io._WebSocketProtocolTransformer.CLOSED) {
+      dart.throw(new io.WebSocketException("Data on closed connection"));
     }
-    [_createHeader](requested) {
-      if (requested === void 0) requested = null;
-      let info = new io._CompressionMaxWindowBits("", 0);
-      if (!dart.test(this.enabled)) {
-        return info;
-      }
-      info.headerValue = io._WebSocketImpl.PER_MESSAGE_DEFLATE;
-      if (dart.test(this.clientNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._clientNoContextTakeover)))) {
-        info.headerValue = dart.notNull(info.headerValue) + "; client_no_context_takeover";
-      }
-      if (dart.test(this.serverNoContextTakeover) && (requested == null || requested != null && dart.test(requested.parameters[dartx.containsKey](io._serverNoContextTakeover)))) {
-        info.headerValue = dart.notNull(info.headerValue) + "; server_no_context_takeover";
-      }
-      let headerList = this[_createServerResponseHeader](requested);
-      info.headerValue = dart.notNull(info.headerValue) + dart.notNull(headerList.headerValue);
-      info.maxWindowBits = headerList.maxWindowBits;
-      info.headerValue = dart.notNull(info.headerValue) + dart.notNull(this[_createClientRequestHeader](requested, info.maxWindowBits));
-      return info;
+    if (this[_state$1] == io._WebSocketProtocolTransformer.FAILURE) {
+      dart.throw(new io.WebSocketException("Data on failed connection"));
     }
-  };
-  dart.setSignature(io.CompressionOptions, {
-    constructors: () => ({new: dart.definiteFunctionType(io.CompressionOptions, [], {clientNoContextTakeover: core.bool, serverNoContextTakeover: core.bool, clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, enabled: core.bool})}),
-    fields: () => ({
-      clientNoContextTakeover: core.bool,
-      serverNoContextTakeover: core.bool,
-      clientMaxWindowBits: core.int,
-      serverMaxWindowBits: core.int,
-      enabled: core.bool
-    }),
-    methods: () => ({
-      [_createServerResponseHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [io.HeaderValue]),
-      [_createClientRequestHeader]: dart.definiteFunctionType(core.String, [io.HeaderValue, core.int]),
-      [_createHeader]: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [io.HeaderValue])
-    }),
-    sfields: () => ({
-      DEFAULT: io.CompressionOptions,
-      OFF: io.CompressionOptions
-    })
-  });
-  dart.defineLazy(io.CompressionOptions, {
-    get DEFAULT() {
-      return dart.const(new io.CompressionOptions());
-    },
-    get OFF() {
-      return dart.const(new io.CompressionOptions({enabled: false}));
-    }
-  });
-  io.WebSocketTransformer = class WebSocketTransformer extends core.Object {
-    static new(opts) {
-      let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
-      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
-      return new io._WebSocketTransformerImpl(protocolSelector, compression);
-    }
-    static upgrade(request, opts) {
-      let protocolSelector = opts && 'protocolSelector' in opts ? opts.protocolSelector : null;
-      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
-      return io._WebSocketTransformerImpl._upgrade(request, protocolSelector, compression);
-    }
-    static isUpgradeRequest(request) {
-      return io._WebSocketTransformerImpl._isUpgradeRequest(request);
-    }
-  };
-  io.WebSocketTransformer[dart.implements] = () => [StreamTransformerOfHttpRequest$WebSocket()];
-  dart.setSignature(io.WebSocketTransformer, {
-    constructors: () => ({new: dart.definiteFunctionType(io.WebSocketTransformer, [], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions})}),
-    statics: () => ({
-      upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest], {protocolSelector: ListOfStringTodynamic(), compression: io.CompressionOptions}),
-      isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
-    }),
-    names: ['upgrade', 'isUpgradeRequest']
-  });
-  io.WebSocket = class WebSocket extends core.Object {
-    static connect(url, opts) {
-      let protocols = opts && 'protocols' in opts ? opts.protocols : null;
-      let headers = opts && 'headers' in opts ? opts.headers : null;
-      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
-      return io._WebSocketImpl.connect(url, protocols, headers, {compression: compression});
-    }
-    new() {
-      this.pingInterval = null;
-    }
-    static fromUpgradedSocket(socket, opts) {
-      let protocol = opts && 'protocol' in opts ? opts.protocol : null;
-      let serverSide = opts && 'serverSide' in opts ? opts.serverSide : null;
-      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
-      if (serverSide == null) {
-        dart.throw(new core.ArgumentError("The serverSide argument must be passed " + "explicitly to WebSocket.fromUpgradedSocket."));
-      }
-      return new io._WebSocketImpl._fromSocket(socket, protocol, compression, serverSide);
-    }
-  };
-  io.WebSocket[dart.implements] = () => [async.Stream, async.StreamSink];
-  dart.setSignature(io.WebSocket, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(io.WebSocket, []),
-      fromUpgradedSocket: dart.definiteFunctionType(io.WebSocket, [io.Socket], {protocol: core.String, serverSide: core.bool, compression: io.CompressionOptions})
-    }),
-    fields: () => ({pingInterval: core.Duration}),
-    sfields: () => ({
-      CONNECTING: core.int,
-      OPEN: core.int,
-      CLOSING: core.int,
-      CLOSED: core.int
-    }),
-    statics: () => ({connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String], {protocols: IterableOfString(), headers: MapOfString$dynamic(), compression: io.CompressionOptions})}),
-    names: ['connect']
-  });
-  io.WebSocket.CONNECTING = 0;
-  io.WebSocket.OPEN = 1;
-  io.WebSocket.CLOSING = 2;
-  io.WebSocket.CLOSED = 3;
-  io.WebSocketException = class WebSocketException extends core.Object {
-    new(message) {
-      if (message === void 0) message = "";
-      this.message = message;
-    }
-    toString() {
-      return dart.str`WebSocketException: ${this.message}`;
-    }
-  };
-  io.WebSocketException[dart.implements] = () => [io.IOException];
-  dart.setSignature(io.WebSocketException, {
-    constructors: () => ({new: dart.definiteFunctionType(io.WebSocketException, [], [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  io._webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
-  io._clientNoContextTakeover = "client_no_context_takeover";
-  io._serverNoContextTakeover = "server_no_context_takeover";
-  io._clientMaxWindowBits = "client_max_window_bits";
-  io._serverMaxWindowBits = "server_max_window_bits";
-  io._WebSocketMessageType = class _WebSocketMessageType extends core.Object {};
-  dart.setSignature(io._WebSocketMessageType, {
-    sfields: () => ({
-      NONE: core.int,
-      TEXT: core.int,
-      BINARY: core.int
-    })
-  });
-  io._WebSocketMessageType.NONE = 0;
-  io._WebSocketMessageType.TEXT = 1;
-  io._WebSocketMessageType.BINARY = 2;
-  io._WebSocketOpcode = class _WebSocketOpcode extends core.Object {};
-  dart.setSignature(io._WebSocketOpcode, {
-    sfields: () => ({
-      CONTINUATION: core.int,
-      TEXT: core.int,
-      BINARY: core.int,
-      RESERVED_3: core.int,
-      RESERVED_4: core.int,
-      RESERVED_5: core.int,
-      RESERVED_6: core.int,
-      RESERVED_7: core.int,
-      CLOSE: core.int,
-      PING: core.int,
-      PONG: core.int,
-      RESERVED_B: core.int,
-      RESERVED_C: core.int,
-      RESERVED_D: core.int,
-      RESERVED_E: core.int,
-      RESERVED_F: core.int
-    })
-  });
-  io._WebSocketOpcode.CONTINUATION = 0;
-  io._WebSocketOpcode.TEXT = 1;
-  io._WebSocketOpcode.BINARY = 2;
-  io._WebSocketOpcode.RESERVED_3 = 3;
-  io._WebSocketOpcode.RESERVED_4 = 4;
-  io._WebSocketOpcode.RESERVED_5 = 5;
-  io._WebSocketOpcode.RESERVED_6 = 6;
-  io._WebSocketOpcode.RESERVED_7 = 7;
-  io._WebSocketOpcode.CLOSE = 8;
-  io._WebSocketOpcode.PING = 9;
-  io._WebSocketOpcode.PONG = 10;
-  io._WebSocketOpcode.RESERVED_B = 11;
-  io._WebSocketOpcode.RESERVED_C = 12;
-  io._WebSocketOpcode.RESERVED_D = 13;
-  io._WebSocketOpcode.RESERVED_E = 14;
-  io._WebSocketOpcode.RESERVED_F = 15;
-  io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
-    new(headerValue, maxWindowBits) {
-      if (headerValue === void 0) headerValue = null;
-      if (maxWindowBits === void 0) maxWindowBits = null;
-      this.headerValue = headerValue;
-      this.maxWindowBits = maxWindowBits;
-    }
-    toString() {
-      return this.headerValue;
-    }
-  };
-  dart.setSignature(io._CompressionMaxWindowBits, {
-    constructors: () => ({new: dart.definiteFunctionType(io._CompressionMaxWindowBits, [], [core.String, core.int])}),
-    fields: () => ({
-      headerValue: core.String,
-      maxWindowBits: core.int
-    })
-  });
-  const _maskingBytes = Symbol('_maskingBytes');
-  const _payload = Symbol('_payload');
-  const _serverSide = Symbol('_serverSide');
-  const _deflate = Symbol('_deflate');
-  const _fin = Symbol('_fin');
-  const _compressed = Symbol('_compressed');
-  const _opcode = Symbol('_opcode');
-  const _len = Symbol('_len');
-  const _masked = Symbol('_masked');
-  const _remainingLenBytes = Symbol('_remainingLenBytes');
-  const _remainingMaskingKeyBytes = Symbol('_remainingMaskingKeyBytes');
-  const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
-  const _unmaskingIndex = Symbol('_unmaskingIndex');
-  const _currentMessageType = Symbol('_currentMessageType');
-  const _eventSink$ = Symbol('_eventSink');
-  const _isControlFrame = Symbol('_isControlFrame');
-  const _lengthDone = Symbol('_lengthDone');
-  const _maskDone = Symbol('_maskDone');
-  const _unmask = Symbol('_unmask');
-  const _controlFrameEnd = Symbol('_controlFrameEnd');
-  const _messageFrameEnd = Symbol('_messageFrameEnd');
-  const _startPayload = Symbol('_startPayload');
-  const _prepareForNextFrame = Symbol('_prepareForNextFrame');
-  io._WebSocketProtocolTransformer = class _WebSocketProtocolTransformer extends core.Object {
-    new(serverSide, deflate) {
-      if (serverSide === void 0) serverSide = false;
-      if (deflate === void 0) deflate = null;
-      this[_maskingBytes] = core.List.new(4);
-      this[_payload] = io.BytesBuilder.new({copy: false});
-      this[_serverSide] = serverSide;
-      this[_deflate] = deflate;
-      this[_state$1] = io._WebSocketProtocolTransformer.START;
-      this[_fin] = false;
-      this[_compressed] = false;
-      this[_opcode] = -1;
-      this[_len] = -1;
-      this[_masked] = false;
-      this[_remainingLenBytes] = -1;
-      this[_remainingMaskingKeyBytes] = 4;
-      this[_remainingPayloadBytes] = -1;
-      this[_unmaskingIndex] = 0;
-      this[_currentMessageType] = io._WebSocketMessageType.NONE;
-      this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
-      this.closeReason = "";
-      this[_eventSink$] = null;
-    }
-    bind(stream) {
-      return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
-        if (this[_eventSink$] != null) {
-          dart.throw(new core.StateError("WebSocket transformer already used."));
-        }
-        this[_eventSink$] = eventSink;
-        return this;
-      }, EventSinkTo_WebSocketProtocolTransformer()));
-    }
-    addError(error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      this[_eventSink$].addError(error, stackTrace);
-    }
-    close() {
-      this[_eventSink$].close();
-    }
-    add(bytes) {
-      let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
-      let index = 0;
-      let lastIndex = buffer[dartx.length];
-      if (this[_state$1] == io._WebSocketProtocolTransformer.CLOSED) {
-        dart.throw(new io.WebSocketException("Data on closed connection"));
-      }
-      if (this[_state$1] == io._WebSocketProtocolTransformer.FAILURE) {
-        dart.throw(new io.WebSocketException("Data on failed connection"));
-      }
-      while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) {
-        let byte = buffer[dartx._get](index);
-        if (dart.notNull(this[_state$1]) <= io._WebSocketProtocolTransformer.LEN_REST) {
-          if (this[_state$1] == io._WebSocketProtocolTransformer.START) {
-            this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
-            if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
-              dart.throw(new io.WebSocketException("Protocol error"));
-            }
-            this[_opcode] = dart.notNull(byte) & io._WebSocketProtocolTransformer.OPCODE;
-            if (this[_opcode] != io._WebSocketOpcode.CONTINUATION) {
-              if ((dart.notNull(byte) & io._WebSocketProtocolTransformer.RSV1) != 0) {
-                this[_compressed] = true;
-              } else {
-                this[_compressed] = false;
-              }
-            }
-            if (dart.notNull(this[_opcode]) <= io._WebSocketOpcode.BINARY) {
-              if (this[_opcode] == io._WebSocketOpcode.CONTINUATION) {
-                if (this[_currentMessageType] == io._WebSocketMessageType.NONE) {
-                  dart.throw(new io.WebSocketException("Protocol error"));
-                }
-              } else {
-                dart.assert(this[_opcode] == io._WebSocketOpcode.TEXT || this[_opcode] == io._WebSocketOpcode.BINARY);
-                if (this[_currentMessageType] != io._WebSocketMessageType.NONE) {
-                  dart.throw(new io.WebSocketException("Protocol error"));
-                }
-                this[_currentMessageType] = this[_opcode];
-              }
-            } else if (dart.notNull(this[_opcode]) >= io._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= io._WebSocketOpcode.PONG) {
-              if (!dart.test(this[_fin])) dart.throw(new io.WebSocketException("Protocol error"));
+    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) {
+      let byte = buffer[dartx._get](index);
+      if (dart.notNull(this[_state$1]) <= io._WebSocketProtocolTransformer.LEN_REST) {
+        if (this[_state$1] == io._WebSocketProtocolTransformer.START) {
+          this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
+          if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
+            dart.throw(new io.WebSocketException("Protocol error"));
+          }
+          this[_opcode] = dart.notNull(byte) & io._WebSocketProtocolTransformer.OPCODE;
+          if (this[_opcode] != io._WebSocketOpcode.CONTINUATION) {
+            if ((dart.notNull(byte) & io._WebSocketProtocolTransformer.RSV1) != 0) {
+              this[_compressed] = true;
             } else {
-              dart.throw(new io.WebSocketException("Protocol error"));
-            }
-            this[_state$1] = io._WebSocketProtocolTransformer.LEN_FIRST;
-          } else if (this[_state$1] == io._WebSocketProtocolTransformer.LEN_FIRST) {
-            this[_masked] = (dart.notNull(byte) & 128) != 0;
-            this[_len] = dart.notNull(byte) & 127;
-            if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
-              dart.throw(new io.WebSocketException("Protocol error"));
-            }
-            if (this[_len] == 126) {
-              this[_len] = 0;
-              this[_remainingLenBytes] = 2;
-              this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
-            } else if (this[_len] == 127) {
-              this[_len] = 0;
-              this[_remainingLenBytes] = 8;
-              this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
-            } else {
-              dart.assert(dart.notNull(this[_len]) < 126);
-              this[_lengthDone]();
-            }
-          } else {
-            dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.LEN_REST);
-            this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
-            this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
-            if (this[_remainingLenBytes] == 0) {
-              this[_lengthDone]();
+              this[_compressed] = false;
             }
           }
-        } else {
-          if (this[_state$1] == io._WebSocketProtocolTransformer.MASK) {
-            this[_maskingBytes][dartx._set](4 - (() => {
-              let x = this[_remainingMaskingKeyBytes];
-              this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
-              return x;
-            })(), byte);
-            if (this[_remainingMaskingKeyBytes] == 0) {
-              this[_maskDone]();
-            }
-          } else {
-            dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.PAYLOAD);
-            let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
-            this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
-            if (dart.test(this[_masked])) {
-              this[_unmask](index, payloadLength, buffer);
-            }
-            this[_payload].add(typed_data.Uint8List.view(buffer[dartx.buffer], index, payloadLength));
-            index = dart.notNull(index) + dart.notNull(payloadLength);
-            if (dart.test(this[_isControlFrame]())) {
-              if (this[_remainingPayloadBytes] == 0) this[_controlFrameEnd]();
-            } else {
-              if (this[_currentMessageType] != io._WebSocketMessageType.TEXT && this[_currentMessageType] != io._WebSocketMessageType.BINARY) {
+          if (dart.notNull(this[_opcode]) <= io._WebSocketOpcode.BINARY) {
+            if (this[_opcode] == io._WebSocketOpcode.CONTINUATION) {
+              if (this[_currentMessageType] == io._WebSocketMessageType.NONE) {
                 dart.throw(new io.WebSocketException("Protocol error"));
               }
-              if (this[_remainingPayloadBytes] == 0) this[_messageFrameEnd]();
+            } else {
+              dart.assert(this[_opcode] == io._WebSocketOpcode.TEXT || this[_opcode] == io._WebSocketOpcode.BINARY);
+              if (this[_currentMessageType] != io._WebSocketMessageType.NONE) {
+                dart.throw(new io.WebSocketException("Protocol error"));
+              }
+              this[_currentMessageType] = this[_opcode];
             }
-            index = dart.notNull(index) - 1;
+          } else if (dart.notNull(this[_opcode]) >= io._WebSocketOpcode.CLOSE && dart.notNull(this[_opcode]) <= io._WebSocketOpcode.PONG) {
+            if (!dart.test(this[_fin])) dart.throw(new io.WebSocketException("Protocol error"));
+          } else {
+            dart.throw(new io.WebSocketException("Protocol error"));
+          }
+          this[_state$1] = io._WebSocketProtocolTransformer.LEN_FIRST;
+        } else if (this[_state$1] == io._WebSocketProtocolTransformer.LEN_FIRST) {
+          this[_masked] = (dart.notNull(byte) & 128) != 0;
+          this[_len] = dart.notNull(byte) & 127;
+          if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
+            dart.throw(new io.WebSocketException("Protocol error"));
+          }
+          if (this[_len] == 126) {
+            this[_len] = 0;
+            this[_remainingLenBytes] = 2;
+            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
+          } else if (this[_len] == 127) {
+            this[_len] = 0;
+            this[_remainingLenBytes] = 8;
+            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
+          } else {
+            dart.assert(dart.notNull(this[_len]) < 126);
+            this[_lengthDone]();
+          }
+        } else {
+          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.LEN_REST);
+          this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
+          this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
+          if (this[_remainingLenBytes] == 0) {
+            this[_lengthDone]();
           }
         }
-        index = dart.notNull(index) + 1;
-      }
-    }
-    [_unmask](index, length, buffer) {
-      let BLOCK_SIZE = 16;
-      if (dart.notNull(length) >= BLOCK_SIZE) {
-        let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
-        let end = dart.notNull(index) + startOffset;
-        for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
-          buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
-            let x = this[_unmaskingIndex];
-            this[_unmaskingIndex] = dart.notNull(x) + 1;
+      } else {
+        if (this[_state$1] == io._WebSocketProtocolTransformer.MASK) {
+          this[_maskingBytes][dartx._set](4 - (() => {
+            let x = this[_remainingMaskingKeyBytes];
+            this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
             return x;
-          })() & 3)))) >>> 0);
-        }
-        index = dart.notNull(index) + startOffset;
-        length = dart.notNull(length) - startOffset;
-        let blockCount = (dart.notNull(length) / BLOCK_SIZE)[dartx.truncate]();
-        if (blockCount > 0) {
-          let mask = 0;
-          for (let i = 3; i >= 0; i--) {
-            mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][dartx._get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
+          })(), byte);
+          if (this[_remainingMaskingKeyBytes] == 0) {
+            this[_maskDone]();
           }
-          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
-          let blockBuffer = typed_data.Int32x4List.view(buffer[dartx.buffer], index, blockCount);
-          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
-            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
+        } else {
+          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.PAYLOAD);
+          let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
+          this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
+          if (dart.test(this[_masked])) {
+            this[_unmask](index, payloadLength, buffer);
           }
-          let bytes = blockCount * BLOCK_SIZE;
-          index = dart.notNull(index) + bytes;
-          length = dart.notNull(length) - bytes;
+          this[_payload].add(typed_data.Uint8List.view(buffer[dartx.buffer], index, payloadLength));
+          index = dart.notNull(index) + dart.notNull(payloadLength);
+          if (dart.test(this[_isControlFrame]())) {
+            if (this[_remainingPayloadBytes] == 0) this[_controlFrameEnd]();
+          } else {
+            if (this[_currentMessageType] != io._WebSocketMessageType.TEXT && this[_currentMessageType] != io._WebSocketMessageType.BINARY) {
+              dart.throw(new io.WebSocketException("Protocol error"));
+            }
+            if (this[_remainingPayloadBytes] == 0) this[_messageFrameEnd]();
+          }
+          index = dart.notNull(index) - 1;
         }
       }
-      let end = dart.notNull(index) + dart.notNull(length);
+      index = dart.notNull(index) + 1;
+    }
+  }
+  [_unmask](index, length, buffer) {
+    let BLOCK_SIZE = 16;
+    if (dart.notNull(length) >= BLOCK_SIZE) {
+      let startOffset = BLOCK_SIZE - (dart.notNull(index) & 15);
+      let end = dart.notNull(index) + startOffset;
       for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
         buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
           let x = this[_unmaskingIndex];
@@ -51368,1753 +51344,1394 @@
           return x;
         })() & 3)))) >>> 0);
       }
-    }
-    [_lengthDone]() {
-      if (dart.test(this[_masked])) {
-        if (!dart.test(this[_serverSide])) {
-          dart.throw(new io.WebSocketException("Received masked frame from server"));
+      index = dart.notNull(index) + startOffset;
+      length = dart.notNull(length) - startOffset;
+      let blockCount = (dart.notNull(length) / BLOCK_SIZE)[dartx.truncate]();
+      if (blockCount > 0) {
+        let mask = 0;
+        for (let i = 3; i >= 0; i--) {
+          mask = (mask << 8 | dart.notNull(core.int._check(this[_maskingBytes][dartx._get](dart.notNull(this[_unmaskingIndex]) + i & 3)))) >>> 0;
         }
-        this[_state$1] = io._WebSocketProtocolTransformer.MASK;
-      } else {
-        if (dart.test(this[_serverSide])) {
-          dart.throw(new io.WebSocketException("Received unmasked frame from client"));
+        let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
+        let blockBuffer = typed_data.Int32x4List.view(buffer[dartx.buffer], index, blockCount);
+        for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
+          blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
         }
-        this[_remainingPayloadBytes] = this[_len];
-        this[_startPayload]();
+        let bytes = blockCount * BLOCK_SIZE;
+        index = dart.notNull(index) + bytes;
+        length = dart.notNull(length) - bytes;
       }
     }
-    [_maskDone]() {
+    let end = dart.notNull(index) + dart.notNull(length);
+    for (let i = index; dart.notNull(i) < end; i = dart.notNull(i) + 1) {
+      buffer[dartx._set](i, (dart.notNull(buffer[dartx._get](i)) ^ dart.notNull(core.int._check(this[_maskingBytes][dartx._get]((() => {
+        let x = this[_unmaskingIndex];
+        this[_unmaskingIndex] = dart.notNull(x) + 1;
+        return x;
+      })() & 3)))) >>> 0);
+    }
+  }
+  [_lengthDone]() {
+    if (dart.test(this[_masked])) {
+      if (!dart.test(this[_serverSide])) {
+        dart.throw(new io.WebSocketException("Received masked frame from server"));
+      }
+      this[_state$1] = io._WebSocketProtocolTransformer.MASK;
+    } else {
+      if (dart.test(this[_serverSide])) {
+        dart.throw(new io.WebSocketException("Received unmasked frame from client"));
+      }
       this[_remainingPayloadBytes] = this[_len];
       this[_startPayload]();
     }
-    [_startPayload]() {
-      if (this[_remainingPayloadBytes] == 0) {
-        if (dart.test(this[_isControlFrame]())) {
-          switch (this[_opcode]) {
-            case io._WebSocketOpcode.CLOSE:
-            {
-              this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
-              this[_eventSink$].close();
-              break;
-            }
-            case io._WebSocketOpcode.PING:
-            {
-              this[_eventSink$].add(new io._WebSocketPing());
-              break;
-            }
-            case io._WebSocketOpcode.PONG:
-            {
-              this[_eventSink$].add(new io._WebSocketPong());
-              break;
-            }
-          }
-          this[_prepareForNextFrame]();
-        } else {
-          this[_messageFrameEnd]();
-        }
-      } else {
-        this[_state$1] = io._WebSocketProtocolTransformer.PAYLOAD;
-      }
-    }
-    [_messageFrameEnd]() {
-      if (dart.test(this[_fin])) {
-        let bytes = this[_payload].takeBytes();
-        if (this[_deflate] != null && dart.test(this[_compressed])) {
-          bytes = this[_deflate].processIncomingMessage(bytes);
-        }
-        switch (this[_currentMessageType]) {
-          case io._WebSocketMessageType.TEXT:
+  }
+  [_maskDone]() {
+    this[_remainingPayloadBytes] = this[_len];
+    this[_startPayload]();
+  }
+  [_startPayload]() {
+    if (this[_remainingPayloadBytes] == 0) {
+      if (dart.test(this[_isControlFrame]())) {
+        switch (this[_opcode]) {
+          case io._WebSocketOpcode.CLOSE:
           {
-            this[_eventSink$].add(convert.UTF8.decode(bytes));
+            this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
+            this[_eventSink$].close();
             break;
           }
-          case io._WebSocketMessageType.BINARY:
+          case io._WebSocketOpcode.PING:
           {
-            this[_eventSink$].add(bytes);
+            this[_eventSink$].add(new io._WebSocketPing());
+            break;
+          }
+          case io._WebSocketOpcode.PONG:
+          {
+            this[_eventSink$].add(new io._WebSocketPong());
             break;
           }
         }
-        this[_currentMessageType] = io._WebSocketMessageType.NONE;
-      }
-      this[_prepareForNextFrame]();
-    }
-    [_controlFrameEnd]() {
-      switch (this[_opcode]) {
-        case io._WebSocketOpcode.CLOSE:
-        {
-          this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
-          let payload = this[_payload].takeBytes();
-          if (dart.notNull(payload[dartx.length]) > 0) {
-            if (payload[dartx.length] == 1) {
-              dart.throw(new io.WebSocketException("Protocol error"));
-            }
-            this.closeCode = (dart.notNull(payload[dartx._get](0)) << 8 | dart.notNull(payload[dartx._get](1))) >>> 0;
-            if (this.closeCode == io.WebSocketStatus.NO_STATUS_RECEIVED) {
-              dart.throw(new io.WebSocketException("Protocol error"));
-            }
-            if (dart.notNull(payload[dartx.length]) > 2) {
-              this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
-            }
-          }
-          this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
-          this[_eventSink$].close();
-          break;
-        }
-        case io._WebSocketOpcode.PING:
-        {
-          this[_eventSink$].add(new io._WebSocketPing(this[_payload].takeBytes()));
-          break;
-        }
-        case io._WebSocketOpcode.PONG:
-        {
-          this[_eventSink$].add(new io._WebSocketPong(this[_payload].takeBytes()));
-          break;
-        }
-      }
-      this[_prepareForNextFrame]();
-    }
-    [_isControlFrame]() {
-      return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
-    }
-    [_prepareForNextFrame]() {
-      if (this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) this[_state$1] = io._WebSocketProtocolTransformer.START;
-      this[_fin] = false;
-      this[_opcode] = -1;
-      this[_len] = -1;
-      this[_remainingLenBytes] = -1;
-      this[_remainingMaskingKeyBytes] = 4;
-      this[_remainingPayloadBytes] = -1;
-      this[_unmaskingIndex] = 0;
-    }
-  };
-  io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
-  dart.setSignature(io._WebSocketProtocolTransformer, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
-    fields: () => ({
-      [_state$1]: core.int,
-      [_fin]: core.bool,
-      [_compressed]: core.bool,
-      [_opcode]: core.int,
-      [_len]: core.int,
-      [_masked]: core.bool,
-      [_remainingLenBytes]: core.int,
-      [_remainingMaskingKeyBytes]: core.int,
-      [_remainingPayloadBytes]: core.int,
-      [_unmaskingIndex]: core.int,
-      [_currentMessageType]: core.int,
-      closeCode: core.int,
-      closeReason: core.String,
-      [_eventSink$]: async.EventSink,
-      [_serverSide]: core.bool,
-      [_maskingBytes]: core.List,
-      [_payload]: io.BytesBuilder,
-      [_deflate]: io._WebSocketPerMessageDeflate
-    }),
-    methods: () => ({
-      bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
-      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-      close: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [ListOfint()]),
-      [_unmask]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.Uint8List]),
-      [_lengthDone]: dart.definiteFunctionType(dart.void, []),
-      [_maskDone]: dart.definiteFunctionType(dart.void, []),
-      [_startPayload]: dart.definiteFunctionType(dart.void, []),
-      [_messageFrameEnd]: dart.definiteFunctionType(dart.void, []),
-      [_controlFrameEnd]: dart.definiteFunctionType(dart.void, []),
-      [_isControlFrame]: dart.definiteFunctionType(core.bool, []),
-      [_prepareForNextFrame]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      START: core.int,
-      LEN_FIRST: core.int,
-      LEN_REST: core.int,
-      MASK: core.int,
-      PAYLOAD: core.int,
-      CLOSED: core.int,
-      FAILURE: core.int,
-      FIN: core.int,
-      RSV1: core.int,
-      RSV2: core.int,
-      RSV3: core.int,
-      OPCODE: core.int
-    })
-  });
-  io._WebSocketProtocolTransformer.START = 0;
-  io._WebSocketProtocolTransformer.LEN_FIRST = 1;
-  io._WebSocketProtocolTransformer.LEN_REST = 2;
-  io._WebSocketProtocolTransformer.MASK = 3;
-  io._WebSocketProtocolTransformer.PAYLOAD = 4;
-  io._WebSocketProtocolTransformer.CLOSED = 5;
-  io._WebSocketProtocolTransformer.FAILURE = 6;
-  io._WebSocketProtocolTransformer.FIN = 128;
-  io._WebSocketProtocolTransformer.RSV1 = 64;
-  io._WebSocketProtocolTransformer.RSV2 = 32;
-  io._WebSocketProtocolTransformer.RSV3 = 16;
-  io._WebSocketProtocolTransformer.OPCODE = 15;
-  io._WebSocketPing = class _WebSocketPing extends core.Object {
-    new(payload) {
-      if (payload === void 0) payload = null;
-      this.payload = payload;
-    }
-  };
-  dart.setSignature(io._WebSocketPing, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPing, [], [ListOfint()])}),
-    fields: () => ({payload: ListOfint()})
-  });
-  io._WebSocketPong = class _WebSocketPong extends core.Object {
-    new(payload) {
-      if (payload === void 0) payload = null;
-      this.payload = payload;
-    }
-  };
-  dart.setSignature(io._WebSocketPong, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPong, [], [ListOfint()])}),
-    fields: () => ({payload: ListOfint()})
-  });
-  const _protocolSelector = Symbol('_protocolSelector');
-  const _compression = Symbol('_compression');
-  io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
-    new(protocolSelector, compression) {
-      this[_controller$0] = StreamControllerOfWebSocket().new({sync: true});
-      this[_protocolSelector] = protocolSelector;
-      this[_compression] = compression;
-    }
-    bind(stream) {
-      stream.listen(dart.fn(request => {
-        io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
-      }, HttpRequestToNull()), {onDone: dart.fn(() => {
-          this[_controller$0].close();
-        }, VoidToNull())});
-      return this[_controller$0].stream;
-    }
-    static _upgrade(request, _protocolSelector, compression) {
-      let response = request.response;
-      if (!dart.test(io._WebSocketTransformerImpl._isUpgradeRequest(request))) {
-        response.statusCode = io.HttpStatus.BAD_REQUEST;
-        response.close();
-        return FutureOfWebSocket().error(new io.WebSocketException("Invalid WebSocket upgrade request"));
-      }
-      function upgrade(protocol) {
-        response.statusCode = io.HttpStatus.SWITCHING_PROTOCOLS;
-        response.headers.add(io.HttpHeaders.CONNECTION, "Upgrade");
-        response.headers.add(io.HttpHeaders.UPGRADE, "websocket");
-        let key = request.headers.value("Sec-WebSocket-Key");
-        let sha1 = new io._SHA1();
-        sha1.add(dart.str`${key}${io._webSocketGUID}`[dartx.codeUnits]);
-        let accept = io._CryptoUtils.bytesToBase64(sha1.close());
-        response.headers.add("Sec-WebSocket-Accept", accept);
-        if (protocol != null) {
-          response.headers.add("Sec-WebSocket-Protocol", protocol);
-        }
-        let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
-        response.headers.contentLength = 0;
-        return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
-      }
-      dart.fn(upgrade, StringToFuture());
-      let protocols = request.headers._get('Sec-WebSocket-Protocol');
-      if (protocols != null && _protocolSelector != null) {
-        protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-        return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
-          if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
-            dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
-          }
-          return protocol;
-        }, dynamicTodynamic$())).catchError(dart.fn(error => {
-          response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
-          response.close();
-          dart.throw(error);
-        }, dynamicToNull$())).then(io.WebSocket)(upgrade);
+        this[_prepareForNextFrame]();
       } else {
-        return FutureOfWebSocket()._check(upgrade(null));
+        this[_messageFrameEnd]();
+      }
+    } else {
+      this[_state$1] = io._WebSocketProtocolTransformer.PAYLOAD;
+    }
+  }
+  [_messageFrameEnd]() {
+    if (dart.test(this[_fin])) {
+      let bytes = this[_payload].takeBytes();
+      if (this[_deflate] != null && dart.test(this[_compressed])) {
+        bytes = this[_deflate].processIncomingMessage(bytes);
+      }
+      switch (this[_currentMessageType]) {
+        case io._WebSocketMessageType.TEXT:
+        {
+          this[_eventSink$].add(convert.UTF8.decode(bytes));
+          break;
+        }
+        case io._WebSocketMessageType.BINARY:
+        {
+          this[_eventSink$].add(bytes);
+          break;
+        }
+      }
+      this[_currentMessageType] = io._WebSocketMessageType.NONE;
+    }
+    this[_prepareForNextFrame]();
+  }
+  [_controlFrameEnd]() {
+    switch (this[_opcode]) {
+      case io._WebSocketOpcode.CLOSE:
+      {
+        this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
+        let payload = this[_payload].takeBytes();
+        if (dart.notNull(payload[dartx.length]) > 0) {
+          if (payload[dartx.length] == 1) {
+            dart.throw(new io.WebSocketException("Protocol error"));
+          }
+          this.closeCode = (dart.notNull(payload[dartx._get](0)) << 8 | dart.notNull(payload[dartx._get](1))) >>> 0;
+          if (this.closeCode == io.WebSocketStatus.NO_STATUS_RECEIVED) {
+            dart.throw(new io.WebSocketException("Protocol error"));
+          }
+          if (dart.notNull(payload[dartx.length]) > 2) {
+            this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
+          }
+        }
+        this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
+        this[_eventSink$].close();
+        break;
+      }
+      case io._WebSocketOpcode.PING:
+      {
+        this[_eventSink$].add(new io._WebSocketPing(this[_payload].takeBytes()));
+        break;
+      }
+      case io._WebSocketOpcode.PONG:
+      {
+        this[_eventSink$].add(new io._WebSocketPong(this[_payload].takeBytes()));
+        break;
       }
     }
-    static _negotiateCompression(request, response, compression) {
-      let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
-      let t = extensionHeader;
-      t == null ? extensionHeader = "" : t;
-      let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
-      if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
-        let info = compression[_createHeader](hv);
-        response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
-        let serverNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._serverNoContextTakeover)) && dart.test(compression.serverNoContextTakeover);
-        let clientNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._clientNoContextTakeover)) && dart.test(compression.clientNoContextTakeover);
-        let deflate = new io._WebSocketPerMessageDeflate({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
-        return deflate;
-      }
-      return null;
+    this[_prepareForNextFrame]();
+  }
+  [_isControlFrame]() {
+    return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
+  }
+  [_prepareForNextFrame]() {
+    if (this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) this[_state$1] = io._WebSocketProtocolTransformer.START;
+    this[_fin] = false;
+    this[_opcode] = -1;
+    this[_len] = -1;
+    this[_remainingLenBytes] = -1;
+    this[_remainingMaskingKeyBytes] = 4;
+    this[_remainingPayloadBytes] = -1;
+    this[_unmaskingIndex] = 0;
+  }
+};
+io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
+dart.setSignature(io._WebSocketProtocolTransformer, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
+  fields: () => ({
+    [_state$1]: core.int,
+    [_fin]: core.bool,
+    [_compressed]: core.bool,
+    [_opcode]: core.int,
+    [_len]: core.int,
+    [_masked]: core.bool,
+    [_remainingLenBytes]: core.int,
+    [_remainingMaskingKeyBytes]: core.int,
+    [_remainingPayloadBytes]: core.int,
+    [_unmaskingIndex]: core.int,
+    [_currentMessageType]: core.int,
+    closeCode: core.int,
+    closeReason: core.String,
+    [_eventSink$]: async.EventSink,
+    [_serverSide]: core.bool,
+    [_maskingBytes]: core.List,
+    [_payload]: io.BytesBuilder,
+    [_deflate]: io._WebSocketPerMessageDeflate
+  }),
+  methods: () => ({
+    bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
+    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+    close: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    [_unmask]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.Uint8List]),
+    [_lengthDone]: dart.definiteFunctionType(dart.void, []),
+    [_maskDone]: dart.definiteFunctionType(dart.void, []),
+    [_startPayload]: dart.definiteFunctionType(dart.void, []),
+    [_messageFrameEnd]: dart.definiteFunctionType(dart.void, []),
+    [_controlFrameEnd]: dart.definiteFunctionType(dart.void, []),
+    [_isControlFrame]: dart.definiteFunctionType(core.bool, []),
+    [_prepareForNextFrame]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    START: core.int,
+    LEN_FIRST: core.int,
+    LEN_REST: core.int,
+    MASK: core.int,
+    PAYLOAD: core.int,
+    CLOSED: core.int,
+    FAILURE: core.int,
+    FIN: core.int,
+    RSV1: core.int,
+    RSV2: core.int,
+    RSV3: core.int,
+    OPCODE: core.int
+  })
+});
+io._WebSocketProtocolTransformer.START = 0;
+io._WebSocketProtocolTransformer.LEN_FIRST = 1;
+io._WebSocketProtocolTransformer.LEN_REST = 2;
+io._WebSocketProtocolTransformer.MASK = 3;
+io._WebSocketProtocolTransformer.PAYLOAD = 4;
+io._WebSocketProtocolTransformer.CLOSED = 5;
+io._WebSocketProtocolTransformer.FAILURE = 6;
+io._WebSocketProtocolTransformer.FIN = 128;
+io._WebSocketProtocolTransformer.RSV1 = 64;
+io._WebSocketProtocolTransformer.RSV2 = 32;
+io._WebSocketProtocolTransformer.RSV3 = 16;
+io._WebSocketProtocolTransformer.OPCODE = 15;
+io._WebSocketPing = class _WebSocketPing extends core.Object {
+  new(payload) {
+    if (payload === void 0) payload = null;
+    this.payload = payload;
+  }
+};
+dart.setSignature(io._WebSocketPing, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPing, [], [ListOfint()])}),
+  fields: () => ({payload: ListOfint()})
+});
+io._WebSocketPong = class _WebSocketPong extends core.Object {
+  new(payload) {
+    if (payload === void 0) payload = null;
+    this.payload = payload;
+  }
+};
+dart.setSignature(io._WebSocketPong, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPong, [], [ListOfint()])}),
+  fields: () => ({payload: ListOfint()})
+});
+const _protocolSelector = Symbol('_protocolSelector');
+const _compression = Symbol('_compression');
+io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
+  new(protocolSelector, compression) {
+    this[_controller$0] = StreamControllerOfWebSocket().new({sync: true});
+    this[_protocolSelector] = protocolSelector;
+    this[_compression] = compression;
+  }
+  bind(stream) {
+    stream.listen(dart.fn(request => {
+      io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
+    }, HttpRequestToNull()), {onDone: dart.fn(() => {
+        this[_controller$0].close();
+      }, VoidToNull())});
+    return this[_controller$0].stream;
+  }
+  static _upgrade(request, _protocolSelector, compression) {
+    let response = request.response;
+    if (!dart.test(io._WebSocketTransformerImpl._isUpgradeRequest(request))) {
+      response.statusCode = io.HttpStatus.BAD_REQUEST;
+      response.close();
+      return FutureOfWebSocket().error(new io.WebSocketException("Invalid WebSocket upgrade request"));
     }
-    static _isUpgradeRequest(request) {
-      if (request.method != "GET") {
-        return false;
-      }
-      if (request.headers._get(io.HttpHeaders.CONNECTION) == null) {
-        return false;
-      }
-      let isUpgrade = false;
-      request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
-        if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
-      }, StringToNull()));
-      if (!isUpgrade) return false;
-      let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
-      if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
-        return false;
-      }
-      let version = request.headers.value("Sec-WebSocket-Version");
-      if (version == null || version != "13") {
-        return false;
-      }
+    function upgrade(protocol) {
+      response.statusCode = io.HttpStatus.SWITCHING_PROTOCOLS;
+      response.headers.add(io.HttpHeaders.CONNECTION, "Upgrade");
+      response.headers.add(io.HttpHeaders.UPGRADE, "websocket");
       let key = request.headers.value("Sec-WebSocket-Key");
-      if (key == null) {
-        return false;
+      let sha1 = new io._SHA1();
+      sha1.add(dart.str`${key}${io._webSocketGUID}`[dartx.codeUnits]);
+      let accept = io._CryptoUtils.bytesToBase64(sha1.close());
+      response.headers.add("Sec-WebSocket-Accept", accept);
+      if (protocol != null) {
+        response.headers.add("Sec-WebSocket-Protocol", protocol);
       }
-      return true;
+      let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
+      response.headers.contentLength = 0;
+      return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
     }
-  };
-  io._WebSocketTransformerImpl[dart.implements] = () => [io.WebSocketTransformer];
-  dart.setSignature(io._WebSocketTransformerImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
-    fields: () => ({
-      [_controller$0]: StreamControllerOfWebSocket(),
-      [_protocolSelector]: core.Function,
-      [_compression]: io.CompressionOptions
-    }),
-    methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
-    statics: () => ({
-      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
-      _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
-      _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
-    }),
-    names: ['_upgrade', '_negotiateCompression', '_isUpgradeRequest']
-  });
-  const _ensureDecoder = Symbol('_ensureDecoder');
-  const _ensureEncoder = Symbol('_ensureEncoder');
-  let const$80;
-  io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
-    new(opts) {
-      let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
-      let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
-      let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
-      let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
-      let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
-      this.clientMaxWindowBits = clientMaxWindowBits;
-      this.serverMaxWindowBits = serverMaxWindowBits;
-      this.serverNoContextTakeover = serverNoContextTakeover;
-      this.clientNoContextTakeover = clientNoContextTakeover;
-      this.serverSide = serverSide;
+    dart.fn(upgrade, StringToFuture());
+    let protocols = request.headers._get('Sec-WebSocket-Protocol');
+    if (protocols != null && _protocolSelector != null) {
+      protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
+      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
+        if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
+          dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
+        }
+        return protocol;
+      }, dynamicTodynamic$())).catchError(dart.fn(error => {
+        response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
+        response.close();
+        dart.throw(error);
+      }, dynamicToNull$())).then(io.WebSocket)(upgrade);
+    } else {
+      return FutureOfWebSocket()._check(upgrade(null));
+    }
+  }
+  static _negotiateCompression(request, response, compression) {
+    let extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
+    let t = extensionHeader;
+    t == null ? extensionHeader = "" : t;
+    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
+    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
+      let info = compression[_createHeader](hv);
+      response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
+      let serverNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._serverNoContextTakeover)) && dart.test(compression.serverNoContextTakeover);
+      let clientNoContextTakeover = dart.test(hv.parameters[dartx.containsKey](io._clientNoContextTakeover)) && dart.test(compression.clientNoContextTakeover);
+      let deflate = new io._WebSocketPerMessageDeflate({serverNoContextTakeover: serverNoContextTakeover, clientNoContextTakeover: clientNoContextTakeover, serverMaxWindowBits: info.maxWindowBits, clientMaxWindowBits: info.maxWindowBits, serverSide: true});
+      return deflate;
+    }
+    return null;
+  }
+  static _isUpgradeRequest(request) {
+    if (request.method != "GET") {
+      return false;
+    }
+    if (request.headers._get(io.HttpHeaders.CONNECTION) == null) {
+      return false;
+    }
+    let isUpgrade = false;
+    request.headers._get(io.HttpHeaders.CONNECTION)[dartx.forEach](dart.fn(value => {
+      if (value[dartx.toLowerCase]() == "upgrade") isUpgrade = true;
+    }, StringToNull()));
+    if (!isUpgrade) return false;
+    let upgrade = request.headers.value(io.HttpHeaders.UPGRADE);
+    if (upgrade == null || upgrade[dartx.toLowerCase]() != "websocket") {
+      return false;
+    }
+    let version = request.headers.value("Sec-WebSocket-Version");
+    if (version == null || version != "13") {
+      return false;
+    }
+    let key = request.headers.value("Sec-WebSocket-Key");
+    if (key == null) {
+      return false;
+    }
+    return true;
+  }
+};
+io._WebSocketTransformerImpl[dart.implements] = () => [io.WebSocketTransformer];
+dart.setSignature(io._WebSocketTransformerImpl, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
+  fields: () => ({
+    [_controller$0]: StreamControllerOfWebSocket(),
+    [_protocolSelector]: core.Function,
+    [_compression]: io.CompressionOptions
+  }),
+  methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
+  statics: () => ({
+    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
+    _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
+    _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
+  }),
+  names: ['_upgrade', '_negotiateCompression', '_isUpgradeRequest']
+});
+const _ensureDecoder = Symbol('_ensureDecoder');
+const _ensureEncoder = Symbol('_ensureEncoder');
+let const$80;
+io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
+  new(opts) {
+    let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
+    let serverMaxWindowBits = opts && 'serverMaxWindowBits' in opts ? opts.serverMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
+    let serverNoContextTakeover = opts && 'serverNoContextTakeover' in opts ? opts.serverNoContextTakeover : false;
+    let clientNoContextTakeover = opts && 'clientNoContextTakeover' in opts ? opts.clientNoContextTakeover : false;
+    let serverSide = opts && 'serverSide' in opts ? opts.serverSide : false;
+    this.clientMaxWindowBits = clientMaxWindowBits;
+    this.serverMaxWindowBits = serverMaxWindowBits;
+    this.serverNoContextTakeover = serverNoContextTakeover;
+    this.clientNoContextTakeover = clientNoContextTakeover;
+    this.serverSide = serverSide;
+    this.decoder = null;
+    this.encoder = null;
+  }
+  [_ensureDecoder]() {
+    if (this.decoder == null) {
+      this.decoder = io._Filter._newZLibInflateFilter(dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, null, true);
+    }
+  }
+  [_ensureEncoder]() {
+    if (this.encoder == null) {
+      this.encoder = io._Filter._newZLibDeflateFilter(false, io.ZLibOption.DEFAULT_LEVEL, dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, io.ZLibOption.DEFAULT_MEM_LEVEL, io.ZLibOption.STRATEGY_DEFAULT, null, true);
+    }
+  }
+  processIncomingMessage(msg) {
+    this[_ensureDecoder]();
+    let data = [];
+    data[dartx.addAll](msg);
+    data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
+    this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
+    let result = [];
+    let out = null;
+    while ((out = this.decoder.processed()) != null) {
+      result[dartx.addAll](core.Iterable._check(out));
+    }
+    if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.decoder = null;
+    }
+    return typed_data.Uint8List.fromList(ListOfint()._check(result));
+  }
+  processOutgoingMessage(msg) {
+    this[_ensureEncoder]();
+    let result = [];
+    let buffer = null;
+    let out = null;
+    if (!typed_data.Uint8List.is(msg)) {
+      for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
+        if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
+          dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${msg[dartx._get](i)} at index ${i})`));
+        }
+      }
+      buffer = typed_data.Uint8List.fromList(msg);
+    } else {
+      buffer = typed_data.Uint8List._check(msg);
+    }
+    this.encoder.process(buffer, 0, buffer[dartx.length]);
+    while ((out = this.encoder.processed()) != null) {
+      result[dartx.addAll](core.Iterable._check(out));
+    }
+    if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.encoder = null;
     }
-    [_ensureDecoder]() {
-      if (this.decoder == null) {
-        this.decoder = io._Filter._newZLibInflateFilter(dart.test(this.serverSide) ? this.clientMaxWindowBits : this.serverMaxWindowBits, null, true);
-      }
+    if (dart.notNull(result[dartx.length]) > 4) {
+      result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
     }
-    [_ensureEncoder]() {
-      if (this.encoder == null) {
-        this.encoder = io._Filter._newZLibDeflateFilter(false, io.ZLibOption.DEFAULT_LEVEL, dart.test(this.serverSide) ? this.serverMaxWindowBits : this.clientMaxWindowBits, io.ZLibOption.DEFAULT_MEM_LEVEL, io.ZLibOption.STRATEGY_DEFAULT, null, true);
+    return ListOfint()._check(result);
+  }
+};
+dart.setSignature(io._WebSocketPerMessageDeflate, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [], {clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, serverNoContextTakeover: core.bool, clientNoContextTakeover: core.bool, serverSide: core.bool})}),
+  fields: () => ({
+    serverNoContextTakeover: core.bool,
+    clientNoContextTakeover: core.bool,
+    clientMaxWindowBits: core.int,
+    serverMaxWindowBits: core.int,
+    serverSide: core.bool,
+    decoder: io._Filter,
+    encoder: io._Filter
+  }),
+  methods: () => ({
+    [_ensureDecoder]: dart.definiteFunctionType(dart.void, []),
+    [_ensureEncoder]: dart.definiteFunctionType(dart.void, []),
+    processIncomingMessage: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
+    processOutgoingMessage: dart.definiteFunctionType(core.List$(core.int), [ListOfint()])
+  })
+});
+const _deflateHelper = Symbol('_deflateHelper');
+const _outCloseCode = Symbol('_outCloseCode');
+const _outCloseReason = Symbol('_outCloseReason');
+io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
+  new(webSocket) {
+    this.webSocket = webSocket;
+    this[_eventSink$] = null;
+    this[_deflateHelper] = null;
+    this[_deflateHelper] = this.webSocket[_deflate];
+  }
+  bind(stream) {
+    return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
+      if (this[_eventSink$] != null) {
+        dart.throw(new core.StateError("WebSocket transformer already used"));
       }
+      this[_eventSink$] = eventSink;
+      return this;
+    }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
+  }
+  add(message) {
+    if (io._WebSocketPong.is(message)) {
+      this.addFrame(io._WebSocketOpcode.PONG, message.payload);
+      return;
     }
-    processIncomingMessage(msg) {
-      this[_ensureDecoder]();
-      let data = [];
-      data[dartx.addAll](msg);
-      data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
-      this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
-      let result = [];
-      let out = null;
-      while ((out = this.decoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
-      }
-      if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
-        this.decoder = null;
-      }
-      return typed_data.Uint8List.fromList(ListOfint()._check(result));
+    if (io._WebSocketPing.is(message)) {
+      this.addFrame(io._WebSocketOpcode.PING, message.payload);
+      return;
     }
-    processOutgoingMessage(msg) {
-      this[_ensureEncoder]();
-      let result = [];
-      let buffer = null;
-      let out = null;
-      if (!typed_data.Uint8List.is(msg)) {
-        for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
-          if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
-            dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${msg[dartx._get](i)} at index ${i})`));
-          }
-        }
-        buffer = typed_data.Uint8List.fromList(msg);
-      } else {
-        buffer = typed_data.Uint8List._check(msg);
-      }
-      this.encoder.process(buffer, 0, buffer[dartx.length]);
-      while ((out = this.encoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
-      }
-      if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
-        this.encoder = null;
-      }
-      if (dart.notNull(result[dartx.length]) > 4) {
-        result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
-      }
-      return ListOfint()._check(result);
-    }
-  };
-  dart.setSignature(io._WebSocketPerMessageDeflate, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [], {clientMaxWindowBits: core.int, serverMaxWindowBits: core.int, serverNoContextTakeover: core.bool, clientNoContextTakeover: core.bool, serverSide: core.bool})}),
-    fields: () => ({
-      serverNoContextTakeover: core.bool,
-      clientNoContextTakeover: core.bool,
-      clientMaxWindowBits: core.int,
-      serverMaxWindowBits: core.int,
-      serverSide: core.bool,
-      decoder: io._Filter,
-      encoder: io._Filter
-    }),
-    methods: () => ({
-      [_ensureDecoder]: dart.definiteFunctionType(dart.void, []),
-      [_ensureEncoder]: dart.definiteFunctionType(dart.void, []),
-      processIncomingMessage: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
-      processOutgoingMessage: dart.definiteFunctionType(core.List$(core.int), [ListOfint()])
-    })
-  });
-  const _deflateHelper = Symbol('_deflateHelper');
-  const _outCloseCode = Symbol('_outCloseCode');
-  const _outCloseReason = Symbol('_outCloseReason');
-  io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
-    new(webSocket) {
-      this.webSocket = webSocket;
-      this[_eventSink$] = null;
-      this[_deflateHelper] = null;
-      this[_deflateHelper] = this.webSocket[_deflate];
-    }
-    bind(stream) {
-      return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
-        if (this[_eventSink$] != null) {
-          dart.throw(new core.StateError("WebSocket transformer already used"));
-        }
-        this[_eventSink$] = eventSink;
-        return this;
-      }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
-    }
-    add(message) {
-      if (io._WebSocketPong.is(message)) {
-        this.addFrame(io._WebSocketOpcode.PONG, message.payload);
-        return;
-      }
-      if (io._WebSocketPing.is(message)) {
-        this.addFrame(io._WebSocketOpcode.PING, message.payload);
-        return;
-      }
-      let data = null;
-      let opcode = null;
-      if (message != null) {
-        if (typeof message == 'string') {
-          opcode = io._WebSocketOpcode.TEXT;
-          data = convert.UTF8.encode(message);
-        } else {
-          if (ListOfint().is(message)) {
-            data = message;
-            opcode = io._WebSocketOpcode.BINARY;
-          } else {
-            dart.throw(new core.ArgumentError(message));
-          }
-        }
-        if (this[_deflateHelper] != null) {
-          data = this[_deflateHelper].processOutgoingMessage(data);
-        }
-      } else {
+    let data = null;
+    let opcode = null;
+    if (message != null) {
+      if (typeof message == 'string') {
         opcode = io._WebSocketOpcode.TEXT;
-      }
-      this.addFrame(opcode, data);
-    }
-    addError(error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      this[_eventSink$].addError(error, stackTrace);
-    }
-    close() {
-      let code = this.webSocket[_outCloseCode];
-      let reason = this.webSocket[_outCloseReason];
-      let data = null;
-      if (code != null) {
-        data = ListOfint().new();
-        data[dartx.add](dart.notNull(code) >> 8 & 255);
-        data[dartx.add](dart.notNull(code) & 255);
-        if (reason != null) {
-          data[dartx.addAll](convert.UTF8.encode(reason));
-        }
-      }
-      this.addFrame(io._WebSocketOpcode.CLOSE, data);
-      this[_eventSink$].close();
-    }
-    addFrame(opcode, data) {
-      return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
-        this[_eventSink$].add(e);
-      }, ListOfintToNull()));
-    }
-    static createFrame(opcode, data, serverSide, compressed) {
-      let mask = !dart.test(serverSide);
-      let dataLength = data == null ? 0 : data[dartx.length];
-      let headerSize = mask ? 6 : 2;
-      if (dart.notNull(dataLength) > 65535) {
-        headerSize = headerSize + 8;
-      } else if (dart.notNull(dataLength) > 125) {
-        headerSize = headerSize + 2;
-      }
-      let header = typed_data.Uint8List.new(headerSize);
-      let index = 0;
-      let hoc = (io._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? io._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & io._WebSocketProtocolTransformer.OPCODE) >>> 0;
-      header[dartx._set](index++, hoc);
-      let lengthBytes = 1;
-      if (dart.notNull(dataLength) > 65535) {
-        header[dartx._set](index++, 127);
-        lengthBytes = 8;
-      } else if (dart.notNull(dataLength) > 125) {
-        header[dartx._set](index++, 126);
-        lengthBytes = 2;
-      }
-      for (let i = 0; i < lengthBytes; i++) {
-        header[dartx._set](index++, dataLength[dartx['>>']]((lengthBytes - 1 - i) * 8) & 255);
-      }
-      if (mask) {
-        let i$ = 1;
-        header[dartx._set](i$, (dart.notNull(header[dartx._get](i$)) | 1 << 7) >>> 0);
-        let maskBytes = io._IOCrypto.getRandomBytes(4);
-        header[dartx.setRange](index, index + 4, maskBytes);
-        index = index + 4;
-        if (data != null) {
-          let list = null;
-          if (opcode == io._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
-            list = data;
-          } else {
-            if (typed_data.Uint8List.is(data)) {
-              list = typed_data.Uint8List.fromList(data);
-            } else {
-              list = typed_data.Uint8List.new(data[dartx.length]);
-              for (let i = 0; i < dart.notNull(data[dartx.length]); i++) {
-                if (dart.notNull(data[dartx._get](i)) < 0 || 255 < dart.notNull(data[dartx._get](i))) {
-                  dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${data[dartx._get](i)} at index ${i})`));
-                }
-                list[dartx._set](i, data[dartx._get](i));
-              }
-            }
-          }
-          let BLOCK_SIZE = 16;
-          let blockCount = (dart.notNull(list[dartx.length]) / BLOCK_SIZE)[dartx.truncate]();
-          if (blockCount > 0) {
-            let mask = 0;
-            for (let i = 3; i >= 0; i--) {
-              mask = (mask << 8 | dart.notNull(maskBytes[dartx._get](i))) >>> 0;
-            }
-            let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
-            let blockBuffer = typed_data.Int32x4List.view(list[dartx.buffer], 0, blockCount);
-            for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
-              blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
-            }
-          }
-          for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[dartx.length]); i++) {
-            list[dartx._set](i, (dart.notNull(list[dartx._get](i)) ^ dart.notNull(maskBytes[dartx._get](i & 3))) >>> 0);
-          }
-          data = list;
-        }
-      }
-      dart.assert(index == headerSize);
-      if (data == null) {
-        return JSArrayOfUint8List().of([header]);
+        data = convert.UTF8.encode(message);
       } else {
-        return JSArrayOfListOfint().of([header, data]);
-      }
-    }
-  };
-  io._WebSocketOutgoingTransformer[dart.implements] = () => [StreamTransformerOfdynamic$ListOfint(), async.EventSink];
-  dart.setSignature(io._WebSocketOutgoingTransformer, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
-    fields: () => ({
-      webSocket: io._WebSocketImpl,
-      [_eventSink$]: EventSinkOfListOfint(),
-      [_deflateHelper]: io._WebSocketPerMessageDeflate
-    }),
-    methods: () => ({
-      bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [async.Stream]),
-      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
-      close: dart.definiteFunctionType(dart.void, []),
-      addFrame: dart.definiteFunctionType(dart.void, [core.int, ListOfint()])
-    }),
-    statics: () => ({createFrame: dart.definiteFunctionType(core.Iterable$(core.List$(core.int)), [core.int, ListOfint(), core.bool, core.bool])}),
-    names: ['createFrame']
-  });
-  const _issuedPause = Symbol('_issuedPause');
-  const _completer = Symbol('_completer');
-  const _onListen$ = Symbol('_onListen');
-  const _onPause$ = Symbol('_onPause');
-  const _onResume$ = Symbol('_onResume');
-  const _cancel$ = Symbol('_cancel');
-  const _done$ = Symbol('_done');
-  const _ensureController = Symbol('_ensureController');
-  io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
-    new(webSocket, socket) {
-      this[_closeCompleter] = async.Completer.new();
-      this.webSocket = webSocket;
-      this.socket = socket;
-      this[_controller$0] = null;
-      this[_subscription$] = null;
-      this[_issuedPause] = false;
-      this[_closed] = false;
-      this[_completer] = null;
-    }
-    [_onListen$]() {
-      if (this[_subscription$] != null) {
-        this[_subscription$].cancel();
-      }
-    }
-    [_onPause$]() {
-      if (this[_subscription$] != null) {
-        this[_subscription$].pause();
-      } else {
-        this[_issuedPause] = true;
-      }
-    }
-    [_onResume$]() {
-      if (this[_subscription$] != null) {
-        this[_subscription$].resume();
-      } else {
-        this[_issuedPause] = false;
-      }
-    }
-    [_cancel$]() {
-      if (this[_subscription$] != null) {
-        let subscription = this[_subscription$];
-        this[_subscription$] = null;
-        subscription.cancel();
-      }
-    }
-    [_ensureController]() {
-      if (this[_controller$0] != null) return;
-      this[_controller$0] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
-      let stream = this[_controller$0].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
-      this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
-        this[_done$]();
-        this[_closeCompleter].complete(this.webSocket);
-      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
-          this[_closed] = true;
-          this[_cancel$]();
-          if (core.ArgumentError.is(error)) {
-            if (!dart.test(this[_done$](error, stackTrace))) {
-              this[_closeCompleter].completeError(error, stackTrace);
-            }
-          } else {
-            this[_done$]();
-            this[_closeCompleter].complete(this.webSocket);
-          }
-        }, dynamicAndStackTraceToNull())});
-    }
-    [_done$](error, stackTrace) {
-      if (error === void 0) error = null;
-      if (stackTrace === void 0) stackTrace = null;
-      if (this[_completer] == null) return false;
-      if (error != null) {
-        this[_completer].completeError(error, stackTrace);
-      } else {
-        this[_completer].complete(this.webSocket);
-      }
-      this[_completer] = null;
-      return true;
-    }
-    addStream(stream) {
-      if (dart.test(this[_closed])) {
-        stream.listen(null).cancel();
-        return async.Future.value(this.webSocket);
-      }
-      this[_ensureController]();
-      this[_completer] = async.Completer.new();
-      this[_subscription$] = stream.listen(dart.fn(data => {
-        this[_controller$0].add(data);
-      }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
-      if (dart.test(this[_issuedPause])) {
-        this[_subscription$].pause();
-        this[_issuedPause] = false;
-      }
-      return this[_completer].future;
-    }
-    close() {
-      this[_ensureController]();
-      const closeSocket = (function() {
-        return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
-      }).bind(this);
-      dart.fn(closeSocket, VoidToFuture());
-      this[_controller$0].close();
-      return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
-    }
-    add(data) {
-      if (dart.test(this[_closed])) return;
-      this[_ensureController]();
-      this[_controller$0].add(data);
-    }
-    closeSocket() {
-      this[_closed] = true;
-      this[_cancel$]();
-      this.close();
-    }
-  };
-  io._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
-  dart.setSignature(io._WebSocketConsumer, {
-    constructors: () => ({new: dart.definiteFunctionType(io._WebSocketConsumer, [io._WebSocketImpl, io.Socket])}),
-    fields: () => ({
-      webSocket: io._WebSocketImpl,
-      socket: io.Socket,
-      [_controller$0]: async.StreamController,
-      [_subscription$]: async.StreamSubscription,
-      [_issuedPause]: core.bool,
-      [_closed]: core.bool,
-      [_closeCompleter]: async.Completer,
-      [_completer]: async.Completer
-    }),
-    methods: () => ({
-      [_onListen$]: dart.definiteFunctionType(dart.void, []),
-      [_onPause$]: dart.definiteFunctionType(dart.void, []),
-      [_onResume$]: dart.definiteFunctionType(dart.void, []),
-      [_cancel$]: dart.definiteFunctionType(dart.void, []),
-      [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
-      [_done$]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
-      addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
-      close: dart.definiteFunctionType(async.Future, []),
-      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      closeSocket: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  const _readyState = Symbol('_readyState');
-  const _writeClosed = Symbol('_writeClosed');
-  const _closeCode = Symbol('_closeCode');
-  const _closeReason = Symbol('_closeReason');
-  const _pingInterval = Symbol('_pingInterval');
-  const _pingTimer = Symbol('_pingTimer');
-  const _consumer = Symbol('_consumer');
-  const _closeTimer = Symbol('_closeTimer');
-  let const$81;
-  io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
-    static connect(url, protocols, headers, opts) {
-      let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
-      let uri = core.Uri.parse(url);
-      if (uri.scheme != "ws" && uri.scheme != "wss") {
-        dart.throw(new io.WebSocketException(dart.str`Unsupported URL scheme '${uri.scheme}'`));
-      }
-      let random = math.Random.new();
-      let nonceData = typed_data.Uint8List.new(16);
-      for (let i = 0; i < 16; i++) {
-        nonceData[dartx._set](i, random.nextInt(256));
-      }
-      let nonce = io._CryptoUtils.bytesToBase64(nonceData);
-      uri = core.Uri.new({scheme: uri.scheme == "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
-      return io._WebSocketImpl._httpClient.openUrl("GET", uri).then(io.HttpClientResponse)(dart.fn(request => {
-        if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
-          let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
-          request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
-        }
-        if (headers != null) {
-          headers[dartx.forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
-        }
-        let _ = request.headers;
-        _.set(io.HttpHeaders.CONNECTION, "Upgrade");
-        _.set(io.HttpHeaders.UPGRADE, "websocket");
-        _.set("Sec-WebSocket-Key", nonce);
-        _.set("Cache-Control", "no-cache");
-        _.set("Sec-WebSocket-Version", "13");
-        if (protocols != null) {
-          request.headers.add("Sec-WebSocket-Protocol", protocols[dartx.toList]());
-        }
-        if (dart.test(compression.enabled)) {
-          request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
-        }
-        return request.close();
-      }, HttpClientRequestToFutureOfHttpClientResponse())).then(io.WebSocket)(dart.fn(response => {
-        function error(message) {
-          response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
-            socket.destroy();
-          }, SocketToNull()));
-          dart.throw(new io.WebSocketException(message));
-        }
-        dart.fn(error, StringTovoid$());
-        if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool$()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
-          error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
-        }
-        let accept = response.headers.value("Sec-WebSocket-Accept");
-        if (accept == null) {
-          error("Response did not contain a 'Sec-WebSocket-Accept' header");
-        }
-        let sha1 = new io._SHA1();
-        sha1.add(dart.str`${nonce}${io._webSocketGUID}`[dartx.codeUnits]);
-        let expectedAccept = sha1.close();
-        let receivedAccept = io._CryptoUtils.base64StringToBytes(accept);
-        if (expectedAccept[dartx.length] != receivedAccept[dartx.length]) {
-          error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
-        }
-        for (let i = 0; i < dart.notNull(expectedAccept[dartx.length]); i++) {
-          if (expectedAccept[dartx._get](i) != receivedAccept[dartx._get](i)) {
-            error("Bad response 'Sec-WebSocket-Accept' header");
-          }
-        }
-        let protocol = response.headers.value('Sec-WebSocket-Protocol');
-        let deflate = io._WebSocketImpl.negotiateClientCompression(response, compression);
-        return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl()));
-      }, HttpClientResponseToFutureOfWebSocket()));
-    }
-    static negotiateClientCompression(response, compression) {
-      let extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
-      if (extensionHeader == null) {
-        extensionHeader = "";
-      }
-      let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
-      if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
-        let serverNoContextTakeover = hv.parameters[dartx.containsKey](io._serverNoContextTakeover);
-        let clientNoContextTakeover = hv.parameters[dartx.containsKey](io._clientNoContextTakeover);
-        function getWindowBits(type) {
-          let o = hv.parameters[dartx._get](type);
-          if (o == null) {
-            return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
-          }
-          return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())});
-        }
-        dart.fn(getWindowBits, StringToint$());
-        return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
-      }
-      return null;
-    }
-    _fromSocket(socket, protocol, compression, serverSide, deflate) {
-      if (serverSide === void 0) serverSide = false;
-      if (deflate === void 0) deflate = null;
-      this[_socket] = socket;
-      this.protocol = protocol;
-      this[_serverSide] = serverSide;
-      this[_controller$0] = null;
-      this[_subscription$] = null;
-      this[_sink$0] = null;
-      this[_readyState] = io.WebSocket.CONNECTING;
-      this[_writeClosed] = false;
-      this[_closeCode] = null;
-      this[_closeReason] = null;
-      this[_pingInterval] = null;
-      this[_pingTimer] = null;
-      this[_consumer] = null;
-      this[_outCloseCode] = null;
-      this[_outCloseReason] = null;
-      this[_closeTimer] = null;
-      this[_deflate] = null;
-      super.new();
-      this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
-      this[_sink$0] = new io._StreamSinkImpl(this[_consumer]);
-      this[_readyState] = io.WebSocket.OPEN;
-      this[_deflate] = deflate;
-      let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
-      this[_subscription$] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
-        if (io._WebSocketPing.is(data)) {
-          if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
-        } else if (io._WebSocketPong.is(data)) {
-          this.pingInterval = this[_pingInterval];
+        if (ListOfint().is(message)) {
+          data = message;
+          opcode = io._WebSocketOpcode.BINARY;
         } else {
-          this[_controller$0].add(data);
+          dart.throw(new core.ArgumentError(message));
         }
-      }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
-          if (this[_closeTimer] != null) this[_closeTimer].cancel();
-          if (core.FormatException.is(error)) {
-            this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
+      }
+      if (this[_deflateHelper] != null) {
+        data = this[_deflateHelper].processOutgoingMessage(data);
+      }
+    } else {
+      opcode = io._WebSocketOpcode.TEXT;
+    }
+    this.addFrame(opcode, data);
+  }
+  addError(error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    this[_eventSink$].addError(error, stackTrace);
+  }
+  close() {
+    let code = this.webSocket[_outCloseCode];
+    let reason = this.webSocket[_outCloseReason];
+    let data = null;
+    if (code != null) {
+      data = ListOfint().new();
+      data[dartx.add](dart.notNull(code) >> 8 & 255);
+      data[dartx.add](dart.notNull(code) & 255);
+      if (reason != null) {
+        data[dartx.addAll](convert.UTF8.encode(reason));
+      }
+    }
+    this.addFrame(io._WebSocketOpcode.CLOSE, data);
+    this[_eventSink$].close();
+  }
+  addFrame(opcode, data) {
+    return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
+      this[_eventSink$].add(e);
+    }, ListOfintToNull()));
+  }
+  static createFrame(opcode, data, serverSide, compressed) {
+    let mask = !dart.test(serverSide);
+    let dataLength = data == null ? 0 : data[dartx.length];
+    let headerSize = mask ? 6 : 2;
+    if (dart.notNull(dataLength) > 65535) {
+      headerSize = headerSize + 8;
+    } else if (dart.notNull(dataLength) > 125) {
+      headerSize = headerSize + 2;
+    }
+    let header = typed_data.Uint8List.new(headerSize);
+    let index = 0;
+    let hoc = (io._WebSocketProtocolTransformer.FIN | (dart.test(compressed) ? io._WebSocketProtocolTransformer.RSV1 : 0) | dart.notNull(opcode) & io._WebSocketProtocolTransformer.OPCODE) >>> 0;
+    header[dartx._set](index++, hoc);
+    let lengthBytes = 1;
+    if (dart.notNull(dataLength) > 65535) {
+      header[dartx._set](index++, 127);
+      lengthBytes = 8;
+    } else if (dart.notNull(dataLength) > 125) {
+      header[dartx._set](index++, 126);
+      lengthBytes = 2;
+    }
+    for (let i = 0; i < lengthBytes; i++) {
+      header[dartx._set](index++, dataLength[dartx['>>']]((lengthBytes - 1 - i) * 8) & 255);
+    }
+    if (mask) {
+      let i$ = 1;
+      header[dartx._set](i$, (dart.notNull(header[dartx._get](i$)) | 1 << 7) >>> 0);
+      let maskBytes = io._IOCrypto.getRandomBytes(4);
+      header[dartx.setRange](index, index + 4, maskBytes);
+      index = index + 4;
+      if (data != null) {
+        let list = null;
+        if (opcode == io._WebSocketOpcode.TEXT && typed_data.Uint8List.is(data)) {
+          list = data;
+        } else {
+          if (typed_data.Uint8List.is(data)) {
+            list = typed_data.Uint8List.fromList(data);
           } else {
-            this[_close$0](io.WebSocketStatus.PROTOCOL_ERROR);
+            list = typed_data.Uint8List.new(data[dartx.length]);
+            for (let i = 0; i < dart.notNull(data[dartx.length]); i++) {
+              if (dart.notNull(data[dartx._get](i)) < 0 || 255 < dart.notNull(data[dartx._get](i))) {
+                dart.throw(new core.ArgumentError("List element is not a byte value " + dart.str`(value ${data[dartx._get](i)} at index ${i})`));
+              }
+              list[dartx._set](i, data[dartx._get](i));
+            }
           }
+        }
+        let BLOCK_SIZE = 16;
+        let blockCount = (dart.notNull(list[dartx.length]) / BLOCK_SIZE)[dartx.truncate]();
+        if (blockCount > 0) {
+          let mask = 0;
+          for (let i = 3; i >= 0; i--) {
+            mask = (mask << 8 | dart.notNull(maskBytes[dartx._get](i))) >>> 0;
+          }
+          let blockMask = typed_data.Int32x4.new(mask, mask, mask, mask);
+          let blockBuffer = typed_data.Int32x4List.view(list[dartx.buffer], 0, blockCount);
+          for (let i = 0; i < dart.notNull(blockBuffer.length); i++) {
+            blockBuffer._set(i, blockBuffer._get(i)['^'](blockMask));
+          }
+        }
+        for (let i = blockCount * BLOCK_SIZE; i < dart.notNull(list[dartx.length]); i++) {
+          list[dartx._set](i, (dart.notNull(list[dartx._get](i)) ^ dart.notNull(maskBytes[dartx._get](i & 3))) >>> 0);
+        }
+        data = list;
+      }
+    }
+    dart.assert(index == headerSize);
+    if (data == null) {
+      return JSArrayOfUint8List().of([header]);
+    } else {
+      return JSArrayOfListOfint().of([header, data]);
+    }
+  }
+};
+io._WebSocketOutgoingTransformer[dart.implements] = () => [StreamTransformerOfdynamic$ListOfint(), async.EventSink];
+dart.setSignature(io._WebSocketOutgoingTransformer, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
+  fields: () => ({
+    webSocket: io._WebSocketImpl,
+    [_eventSink$]: EventSinkOfListOfint(),
+    [_deflateHelper]: io._WebSocketPerMessageDeflate
+  }),
+  methods: () => ({
+    bind: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [async.Stream]),
+    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
+    close: dart.definiteFunctionType(dart.void, []),
+    addFrame: dart.definiteFunctionType(dart.void, [core.int, ListOfint()])
+  }),
+  statics: () => ({createFrame: dart.definiteFunctionType(core.Iterable$(core.List$(core.int)), [core.int, ListOfint(), core.bool, core.bool])}),
+  names: ['createFrame']
+});
+const _issuedPause = Symbol('_issuedPause');
+const _completer = Symbol('_completer');
+const _onListen$ = Symbol('_onListen');
+const _onPause$ = Symbol('_onPause');
+const _onResume$ = Symbol('_onResume');
+const _cancel$ = Symbol('_cancel');
+const _done$ = Symbol('_done');
+const _ensureController = Symbol('_ensureController');
+io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
+  new(webSocket, socket) {
+    this[_closeCompleter] = async.Completer.new();
+    this.webSocket = webSocket;
+    this.socket = socket;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
+    this[_issuedPause] = false;
+    this[_closed] = false;
+    this[_completer] = null;
+  }
+  [_onListen$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].cancel();
+    }
+  }
+  [_onPause$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].pause();
+    } else {
+      this[_issuedPause] = true;
+    }
+  }
+  [_onResume$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].resume();
+    } else {
+      this[_issuedPause] = false;
+    }
+  }
+  [_cancel$]() {
+    if (this[_subscription$] != null) {
+      let subscription = this[_subscription$];
+      this[_subscription$] = null;
+      subscription.cancel();
+    }
+  }
+  [_ensureController]() {
+    if (this[_controller$0] != null) return;
+    this[_controller$0] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
+    let stream = this[_controller$0].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
+    this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
+      this[_done$]();
+      this[_closeCompleter].complete(this.webSocket);
+    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
+        this[_closed] = true;
+        this[_cancel$]();
+        if (core.ArgumentError.is(error)) {
+          if (!dart.test(this[_done$](error, stackTrace))) {
+            this[_closeCompleter].completeError(error, stackTrace);
+          }
+        } else {
+          this[_done$]();
+          this[_closeCompleter].complete(this.webSocket);
+        }
+      }, dynamicAndStackTraceToNull())});
+  }
+  [_done$](error, stackTrace) {
+    if (error === void 0) error = null;
+    if (stackTrace === void 0) stackTrace = null;
+    if (this[_completer] == null) return false;
+    if (error != null) {
+      this[_completer].completeError(error, stackTrace);
+    } else {
+      this[_completer].complete(this.webSocket);
+    }
+    this[_completer] = null;
+    return true;
+  }
+  addStream(stream) {
+    if (dart.test(this[_closed])) {
+      stream.listen(null).cancel();
+      return async.Future.value(this.webSocket);
+    }
+    this[_ensureController]();
+    this[_completer] = async.Completer.new();
+    this[_subscription$] = stream.listen(dart.fn(data => {
+      this[_controller$0].add(data);
+    }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
+    if (dart.test(this[_issuedPause])) {
+      this[_subscription$].pause();
+      this[_issuedPause] = false;
+    }
+    return this[_completer].future;
+  }
+  close() {
+    this[_ensureController]();
+    const closeSocket = (function() {
+      return this.socket.close().catchError(dart.fn(_ => {
+      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+    }).bind(this);
+    dart.fn(closeSocket, VoidToFuture());
+    this[_controller$0].close();
+    return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
+  }
+  add(data) {
+    if (dart.test(this[_closed])) return;
+    this[_ensureController]();
+    this[_controller$0].add(data);
+  }
+  closeSocket() {
+    this[_closed] = true;
+    this[_cancel$]();
+    this.close();
+  }
+};
+io._WebSocketConsumer[dart.implements] = () => [async.StreamConsumer];
+dart.setSignature(io._WebSocketConsumer, {
+  constructors: () => ({new: dart.definiteFunctionType(io._WebSocketConsumer, [io._WebSocketImpl, io.Socket])}),
+  fields: () => ({
+    webSocket: io._WebSocketImpl,
+    socket: io.Socket,
+    [_controller$0]: async.StreamController,
+    [_subscription$]: async.StreamSubscription,
+    [_issuedPause]: core.bool,
+    [_closed]: core.bool,
+    [_closeCompleter]: async.Completer,
+    [_completer]: async.Completer
+  }),
+  methods: () => ({
+    [_onListen$]: dart.definiteFunctionType(dart.void, []),
+    [_onPause$]: dart.definiteFunctionType(dart.void, []),
+    [_onResume$]: dart.definiteFunctionType(dart.void, []),
+    [_cancel$]: dart.definiteFunctionType(dart.void, []),
+    [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
+    [_done$]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
+    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
+    close: dart.definiteFunctionType(async.Future, []),
+    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    closeSocket: dart.definiteFunctionType(dart.void, [])
+  })
+});
+const _readyState = Symbol('_readyState');
+const _writeClosed = Symbol('_writeClosed');
+const _closeCode = Symbol('_closeCode');
+const _closeReason = Symbol('_closeReason');
+const _pingInterval = Symbol('_pingInterval');
+const _pingTimer = Symbol('_pingTimer');
+const _consumer = Symbol('_consumer');
+const _closeTimer = Symbol('_closeTimer');
+let const$81;
+io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
+  static connect(url, protocols, headers, opts) {
+    let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
+    let uri = core.Uri.parse(url);
+    if (uri.scheme != "ws" && uri.scheme != "wss") {
+      dart.throw(new io.WebSocketException(dart.str`Unsupported URL scheme '${uri.scheme}'`));
+    }
+    let random = math.Random.new();
+    let nonceData = typed_data.Uint8List.new(16);
+    for (let i = 0; i < 16; i++) {
+      nonceData[dartx._set](i, random.nextInt(256));
+    }
+    let nonce = io._CryptoUtils.bytesToBase64(nonceData);
+    uri = core.Uri.new({scheme: uri.scheme == "wss" ? "https" : "http", userInfo: uri.userInfo, host: uri.host, port: uri.port, path: uri.path, query: uri.query, fragment: uri.fragment});
+    return io._WebSocketImpl._httpClient.openUrl("GET", uri).then(io.HttpClientResponse)(dart.fn(request => {
+      if (uri.userInfo != null && !dart.test(uri.userInfo[dartx.isEmpty])) {
+        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(uri.userInfo));
+        request.headers.set(io.HttpHeaders.AUTHORIZATION, dart.str`Basic ${auth}`);
+      }
+      if (headers != null) {
+        headers[dartx.forEach](dart.fn((field, value) => request.headers.add(field, value), StringAnddynamicTovoid()));
+      }
+      let _ = request.headers;
+      _.set(io.HttpHeaders.CONNECTION, "Upgrade");
+      _.set(io.HttpHeaders.UPGRADE, "websocket");
+      _.set("Sec-WebSocket-Key", nonce);
+      _.set("Cache-Control", "no-cache");
+      _.set("Sec-WebSocket-Version", "13");
+      if (protocols != null) {
+        request.headers.add("Sec-WebSocket-Protocol", protocols[dartx.toList]());
+      }
+      if (dart.test(compression.enabled)) {
+        request.headers.add("Sec-WebSocket-Extensions", compression[_createHeader]());
+      }
+      return request.close();
+    }, HttpClientRequestToFutureOfHttpClientResponse())).then(io.WebSocket)(dart.fn(response => {
+      function error(message) {
+        response.detachSocket().then(dart.dynamic)(dart.fn(socket => {
+          socket.destroy();
+        }, SocketToNull()));
+        dart.throw(new io.WebSocketException(message));
+      }
+      dart.fn(error, StringTovoid$());
+      if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool$()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
+        error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
+      }
+      let accept = response.headers.value("Sec-WebSocket-Accept");
+      if (accept == null) {
+        error("Response did not contain a 'Sec-WebSocket-Accept' header");
+      }
+      let sha1 = new io._SHA1();
+      sha1.add(dart.str`${nonce}${io._webSocketGUID}`[dartx.codeUnits]);
+      let expectedAccept = sha1.close();
+      let receivedAccept = io._CryptoUtils.base64StringToBytes(accept);
+      if (expectedAccept[dartx.length] != receivedAccept[dartx.length]) {
+        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
+      }
+      for (let i = 0; i < dart.notNull(expectedAccept[dartx.length]); i++) {
+        if (expectedAccept[dartx._get](i) != receivedAccept[dartx._get](i)) {
+          error("Bad response 'Sec-WebSocket-Accept' header");
+        }
+      }
+      let protocol = response.headers.value('Sec-WebSocket-Protocol');
+      let deflate = io._WebSocketImpl.negotiateClientCompression(response, compression);
+      return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, false, deflate), SocketTo_WebSocketImpl()));
+    }, HttpClientResponseToFutureOfWebSocket()));
+  }
+  static negotiateClientCompression(response, compression) {
+    let extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
+    if (extensionHeader == null) {
+      extensionHeader = "";
+    }
+    let hv = io.HeaderValue.parse(extensionHeader, {valueSeparator: ','});
+    if (dart.test(compression.enabled) && hv.value == io._WebSocketImpl.PER_MESSAGE_DEFLATE) {
+      let serverNoContextTakeover = hv.parameters[dartx.containsKey](io._serverNoContextTakeover);
+      let clientNoContextTakeover = hv.parameters[dartx.containsKey](io._clientNoContextTakeover);
+      function getWindowBits(type) {
+        let o = hv.parameters[dartx._get](type);
+        if (o == null) {
+          return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
+        }
+        return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())});
+      }
+      dart.fn(getWindowBits, StringToint$());
+      return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
+    }
+    return null;
+  }
+  _fromSocket(socket, protocol, compression, serverSide, deflate) {
+    if (serverSide === void 0) serverSide = false;
+    if (deflate === void 0) deflate = null;
+    this[_socket] = socket;
+    this.protocol = protocol;
+    this[_serverSide] = serverSide;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
+    this[_sink$0] = null;
+    this[_readyState] = io.WebSocket.CONNECTING;
+    this[_writeClosed] = false;
+    this[_closeCode] = null;
+    this[_closeReason] = null;
+    this[_pingInterval] = null;
+    this[_pingTimer] = null;
+    this[_consumer] = null;
+    this[_outCloseCode] = null;
+    this[_outCloseReason] = null;
+    this[_closeTimer] = null;
+    this[_deflate] = null;
+    super.new();
+    this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
+    this[_sink$0] = new io._StreamSinkImpl(this[_consumer]);
+    this[_readyState] = io.WebSocket.OPEN;
+    this[_deflate] = deflate;
+    let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
+    this[_subscription$] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
+      if (io._WebSocketPing.is(data)) {
+        if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
+      } else if (io._WebSocketPong.is(data)) {
+        this.pingInterval = this[_pingInterval];
+      } else {
+        this[_controller$0].add(data);
+      }
+    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
+        if (this[_closeTimer] != null) this[_closeTimer].cancel();
+        if (core.FormatException.is(error)) {
+          this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
+        } else {
+          this[_close$0](io.WebSocketStatus.PROTOCOL_ERROR);
+        }
+        this[_closeCode] = this[_outCloseCode];
+        this[_closeReason] = this[_outCloseReason];
+        this[_controller$0].close();
+      }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
+        if (this[_closeTimer] != null) this[_closeTimer].cancel();
+        if (this[_readyState] == io.WebSocket.OPEN) {
+          this[_readyState] = io.WebSocket.CLOSING;
+          if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
+            this[_close$0](transformer.closeCode, transformer.closeReason);
+          } else {
+            this[_close$0]();
+          }
+          this[_readyState] = io.WebSocket.CLOSED;
+        }
+        this[_closeCode] = transformer.closeCode;
+        this[_closeReason] = transformer.closeReason;
+        this[_controller$0].close();
+      }, VoidToNull()), cancelOnError: true}));
+    this[_subscription$].pause();
+    this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
+        this[_subscription$].cancel();
+        this[_subscription$] = null;
+      }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
+    io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
+    try {
+      dart.dput(this[_socket], _owner, this);
+    } catch (_) {
+    }
+
+  }
+  listen(onData, opts) {
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+    let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+  }
+  get pingInterval() {
+    return this[_pingInterval];
+  }
+  set pingInterval(interval) {
+    if (dart.test(this[_writeClosed])) return;
+    if (this[_pingTimer] != null) this[_pingTimer].cancel();
+    this[_pingInterval] = interval;
+    if (this[_pingInterval] == null) return;
+    this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
+      if (dart.test(this[_writeClosed])) return;
+      this[_consumer].add(new io._WebSocketPing());
+      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
+        this[_close$0](io.WebSocketStatus.GOING_AWAY);
+      }, VoidToNull()));
+    }, VoidToNull()));
+  }
+  get readyState() {
+    return this[_readyState];
+  }
+  get extensions() {
+    return null;
+  }
+  get closeCode() {
+    return this[_closeCode];
+  }
+  get closeReason() {
+    return this[_closeReason];
+  }
+  add(data) {
+    this[_sink$0].add(data);
+  }
+  addError(error, stackTrace) {
+    if (stackTrace === void 0) stackTrace = null;
+    this[_sink$0].addError(error, stackTrace);
+  }
+  addStream(stream) {
+    return this[_sink$0].addStream(stream);
+  }
+  get done() {
+    return this[_sink$0].done;
+  }
+  close(code, reason) {
+    if (code === void 0) code = null;
+    if (reason === void 0) reason = null;
+    if (dart.test(io._WebSocketImpl._isReservedStatusCode(code))) {
+      dart.throw(new io.WebSocketException(dart.str`Reserved status code ${code}`));
+    }
+    if (this[_outCloseCode] == null) {
+      this[_outCloseCode] = code;
+      this[_outCloseReason] = reason;
+    }
+    if (!dart.test(this[_controller$0].isClosed)) {
+      if (!dart.test(this[_controller$0].hasListener) && this[_subscription$] != null) {
+        this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
+      }
+      if (this[_closeTimer] == null) {
+        this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
+          if (this[_subscription$] != null) this[_subscription$].cancel();
           this[_controller$0].close();
-        }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
-          if (this[_closeTimer] != null) this[_closeTimer].cancel();
-          if (this[_readyState] == io.WebSocket.OPEN) {
-            this[_readyState] = io.WebSocket.CLOSING;
-            if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
-              this[_close$0](transformer.closeCode, transformer.closeReason);
-            } else {
-              this[_close$0]();
-            }
-            this[_readyState] = io.WebSocket.CLOSED;
-          }
-          this[_closeCode] = transformer.closeCode;
-          this[_closeReason] = transformer.closeReason;
-          this[_controller$0].close();
-        }, VoidToNull()), cancelOnError: true}));
-      this[_subscription$].pause();
-      this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
-          this[_subscription$].cancel();
-          this[_subscription$] = null;
-        }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
-      io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
-      try {
-        dart.dput(this[_socket], _owner, this);
-      } catch (_) {
-      }
-
-    }
-    listen(onData, opts) {
-      let onError = opts && 'onError' in opts ? opts.onError : null;
-      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-    }
-    get pingInterval() {
-      return this[_pingInterval];
-    }
-    set pingInterval(interval) {
-      if (dart.test(this[_writeClosed])) return;
-      if (this[_pingTimer] != null) this[_pingTimer].cancel();
-      this[_pingInterval] = interval;
-      if (this[_pingInterval] == null) return;
-      this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
-        if (dart.test(this[_writeClosed])) return;
-        this[_consumer].add(new io._WebSocketPing());
-        this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
-          this[_close$0](io.WebSocketStatus.GOING_AWAY);
+          io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
         }, VoidToNull()));
-      }, VoidToNull()));
-    }
-    get readyState() {
-      return this[_readyState];
-    }
-    get extensions() {
-      return null;
-    }
-    get closeCode() {
-      return this[_closeCode];
-    }
-    get closeReason() {
-      return this[_closeReason];
-    }
-    add(data) {
-      this[_sink$0].add(data);
-    }
-    addError(error, stackTrace) {
-      if (stackTrace === void 0) stackTrace = null;
-      this[_sink$0].addError(error, stackTrace);
-    }
-    addStream(stream) {
-      return this[_sink$0].addStream(stream);
-    }
-    get done() {
-      return this[_sink$0].done;
-    }
-    close(code, reason) {
-      if (code === void 0) code = null;
-      if (reason === void 0) reason = null;
-      if (dart.test(io._WebSocketImpl._isReservedStatusCode(code))) {
-        dart.throw(new io.WebSocketException(dart.str`Reserved status code ${code}`));
       }
-      if (this[_outCloseCode] == null) {
-        this[_outCloseCode] = code;
-        this[_outCloseReason] = reason;
-      }
-      if (!dart.test(this[_controller$0].isClosed)) {
-        if (!dart.test(this[_controller$0].hasListener) && this[_subscription$] != null) {
-          this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
-        }
-        if (this[_closeTimer] == null) {
-          this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
-            this[_closeCode] = this[_outCloseCode];
-            this[_closeReason] = this[_outCloseReason];
-            if (this[_subscription$] != null) this[_subscription$].cancel();
-            this[_controller$0].close();
-            io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
-          }, VoidToNull()));
-        }
-      }
-      return this[_sink$0].close();
     }
-    [_close$0](code, reason) {
-      if (code === void 0) code = null;
-      if (reason === void 0) reason = null;
-      if (dart.test(this[_writeClosed])) return;
-      if (this[_outCloseCode] == null) {
-        this[_outCloseCode] = code;
-        this[_outCloseReason] = reason;
-      }
-      this[_writeClosed] = true;
-      this[_consumer].closeSocket();
-      io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
+    return this[_sink$0].close();
+  }
+  [_close$0](code, reason) {
+    if (code === void 0) code = null;
+    if (reason === void 0) reason = null;
+    if (dart.test(this[_writeClosed])) return;
+    if (this[_outCloseCode] == null) {
+      this[_outCloseCode] = code;
+      this[_outCloseReason] = reason;
     }
-    get [_serviceTypePath]() {
-      return 'io/websockets';
-    }
-    get [_serviceTypeName]() {
-      return 'WebSocket';
-    }
-    [_toJSON$](ref) {
-      let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
-      let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
-      if (dart.test(ref)) {
-        return r;
-      }
-      try {
-        r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
-      } catch (_) {
-        r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
-      }
-
+    this[_writeClosed] = true;
+    this[_consumer].closeSocket();
+    io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
+  }
+  get [_serviceTypePath]() {
+    return 'io/websockets';
+  }
+  get [_serviceTypeName]() {
+    return 'WebSocket';
+  }
+  [_toJSON$](ref) {
+    let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
+    let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
+    if (dart.test(ref)) {
       return r;
     }
-    static _isReservedStatusCode(code) {
-      return code != null && (dart.notNull(code) < io.WebSocketStatus.NORMAL_CLOSURE || code == io.WebSocketStatus.RESERVED_1004 || code == io.WebSocketStatus.NO_STATUS_RECEIVED || code == io.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > io.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < io.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= io.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
+    try {
+      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
+    } catch (_) {
+      r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
     }
-  };
-  dart.addSimpleTypeTests(io._WebSocketImpl);
-  dart.defineNamedConstructor(io._WebSocketImpl, '_fromSocket');
-  io._WebSocketImpl[dart.implements] = () => [io.WebSocket];
-  dart.setSignature(io._WebSocketImpl, {
-    constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
-    fields: () => ({
-      protocol: core.String,
-      [_controller$0]: async.StreamController,
-      [_subscription$]: async.StreamSubscription,
-      [_sink$0]: async.StreamSink,
-      [_socket]: dart.dynamic,
-      [_serverSide]: core.bool,
-      [_readyState]: core.int,
-      [_writeClosed]: core.bool,
-      [_closeCode]: core.int,
-      [_closeReason]: core.String,
-      [_pingInterval]: core.Duration,
-      [_pingTimer]: async.Timer,
-      [_consumer]: io._WebSocketConsumer,
-      [_outCloseCode]: core.int,
-      [_outCloseReason]: core.String,
-      [_closeTimer]: async.Timer,
-      [_deflate]: io._WebSocketPerMessageDeflate
-    }),
-    getters: () => ({
-      pingInterval: dart.definiteFunctionType(core.Duration, []),
-      readyState: dart.definiteFunctionType(core.int, []),
-      extensions: dart.definiteFunctionType(core.String, []),
-      closeCode: dart.definiteFunctionType(core.int, []),
-      closeReason: dart.definiteFunctionType(core.String, []),
-      done: dart.definiteFunctionType(async.Future, []),
-      [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
-      [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({pingInterval: dart.definiteFunctionType(dart.void, [core.Duration])}),
-    methods: () => ({
-      listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-      add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
-      close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
-      [_close$0]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
-      [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
-    }),
-    sfields: () => ({
-      _webSockets: MapOfint$_WebSocketImpl(),
-      DEFAULT_WINDOW_BITS: core.int,
-      PER_MESSAGE_DEFLATE: core.String,
-      _httpClient: io.HttpClient
-    }),
-    statics: () => ({
-      connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String, IterableOfString(), MapOfString$dynamic()], {compression: io.CompressionOptions}),
-      negotiateClientCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpClientResponse, io.CompressionOptions]),
-      _isReservedStatusCode: dart.definiteFunctionType(core.bool, [core.int])
-    }),
-    names: ['connect', 'negotiateClientCompression', '_isReservedStatusCode']
-  });
-  io._WebSocketImpl.DEFAULT_WINDOW_BITS = 15;
-  io._WebSocketImpl.PER_MESSAGE_DEFLATE = "permessage-deflate";
-  dart.defineLazy(io._WebSocketImpl, {
-    get _webSockets() {
-      return MapOfint$_WebSocketImpl().new();
-    },
-    set _webSockets(_) {},
-    get _httpClient() {
-      return io.HttpClient.new();
-    }
-  });
-  isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
-    new(message) {
-      this.message = message;
-    }
-    toString() {
-      return dart.str`IsolateSpawnException: ${this.message}`;
-    }
-  };
-  isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate.IsolateSpawnException, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate.IsolateSpawnException, [core.String])}),
-    fields: () => ({message: core.String})
-  });
-  const _pause = Symbol('_pause');
-  isolate.Isolate = class Isolate extends core.Object {
-    new(controlPort, opts) {
-      let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
-      let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
-      this.controlPort = controlPort;
-      this.pauseCapability = pauseCapability;
-      this.terminateCapability = terminateCapability;
-    }
-    static get current() {
-      return isolate.Isolate._currentIsolateCache;
-    }
-    static spawn(entryPoint, message, opts) {
-      let paused = opts && 'paused' in opts ? opts.paused : false;
-      try {
-        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
-      } catch (e) {
-        let st = dart.stackTrace(e);
-        return FutureOfIsolate().error(e, st);
-      }
 
+    return r;
+  }
+  static _isReservedStatusCode(code) {
+    return code != null && (dart.notNull(code) < io.WebSocketStatus.NORMAL_CLOSURE || code == io.WebSocketStatus.RESERVED_1004 || code == io.WebSocketStatus.NO_STATUS_RECEIVED || code == io.WebSocketStatus.ABNORMAL_CLOSURE || dart.notNull(code) > io.WebSocketStatus.INTERNAL_SERVER_ERROR && dart.notNull(code) < io.WebSocketStatus.RESERVED_1015 || dart.notNull(code) >= io.WebSocketStatus.RESERVED_1015 && dart.notNull(code) < 3000);
+  }
+};
+dart.addSimpleTypeTests(io._WebSocketImpl);
+dart.defineNamedConstructor(io._WebSocketImpl, '_fromSocket');
+io._WebSocketImpl[dart.implements] = () => [io.WebSocket];
+dart.setSignature(io._WebSocketImpl, {
+  constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
+  fields: () => ({
+    protocol: core.String,
+    [_controller$0]: async.StreamController,
+    [_subscription$]: async.StreamSubscription,
+    [_sink$0]: async.StreamSink,
+    [_socket]: dart.dynamic,
+    [_serverSide]: core.bool,
+    [_readyState]: core.int,
+    [_writeClosed]: core.bool,
+    [_closeCode]: core.int,
+    [_closeReason]: core.String,
+    [_pingInterval]: core.Duration,
+    [_pingTimer]: async.Timer,
+    [_consumer]: io._WebSocketConsumer,
+    [_outCloseCode]: core.int,
+    [_outCloseReason]: core.String,
+    [_closeTimer]: async.Timer,
+    [_deflate]: io._WebSocketPerMessageDeflate
+  }),
+  getters: () => ({
+    pingInterval: dart.definiteFunctionType(core.Duration, []),
+    readyState: dart.definiteFunctionType(core.int, []),
+    extensions: dart.definiteFunctionType(core.String, []),
+    closeCode: dart.definiteFunctionType(core.int, []),
+    closeReason: dart.definiteFunctionType(core.String, []),
+    done: dart.definiteFunctionType(async.Future, []),
+    [_serviceTypePath]: dart.definiteFunctionType(core.String, []),
+    [_serviceTypeName]: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({pingInterval: dart.definiteFunctionType(dart.void, [core.Duration])}),
+  methods: () => ({
+    listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+    add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
+    addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
+    close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
+    [_close$0]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
+    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
+  }),
+  sfields: () => ({
+    _webSockets: MapOfint$_WebSocketImpl(),
+    DEFAULT_WINDOW_BITS: core.int,
+    PER_MESSAGE_DEFLATE: core.String,
+    _httpClient: io.HttpClient
+  }),
+  statics: () => ({
+    connect: dart.definiteFunctionType(async.Future$(io.WebSocket), [core.String, IterableOfString(), MapOfString$dynamic()], {compression: io.CompressionOptions}),
+    negotiateClientCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpClientResponse, io.CompressionOptions]),
+    _isReservedStatusCode: dart.definiteFunctionType(core.bool, [core.int])
+  }),
+  names: ['connect', 'negotiateClientCompression', '_isReservedStatusCode']
+});
+io._WebSocketImpl.DEFAULT_WINDOW_BITS = 15;
+io._WebSocketImpl.PER_MESSAGE_DEFLATE = "permessage-deflate";
+dart.defineLazy(io._WebSocketImpl, {
+  get _webSockets() {
+    return MapOfint$_WebSocketImpl().new();
+  },
+  set _webSockets(_) {},
+  get _httpClient() {
+    return io.HttpClient.new();
+  }
+});
+isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
+  new(message) {
+    this.message = message;
+  }
+  toString() {
+    return dart.str`IsolateSpawnException: ${this.message}`;
+  }
+};
+isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
+dart.setSignature(isolate.IsolateSpawnException, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate.IsolateSpawnException, [core.String])}),
+  fields: () => ({message: core.String})
+});
+const _pause = Symbol('_pause');
+isolate.Isolate = class Isolate extends core.Object {
+  new(controlPort, opts) {
+    let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
+    let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
+    this.controlPort = controlPort;
+    this.pauseCapability = pauseCapability;
+    this.terminateCapability = terminateCapability;
+  }
+  static get current() {
+    return isolate.Isolate._currentIsolateCache;
+  }
+  static spawn(entryPoint, message, opts) {
+    let paused = opts && 'paused' in opts ? opts.paused : false;
+    try {
+      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+    } catch (e) {
+      let st = dart.stackTrace(e);
+      return FutureOfIsolate().error(e, st);
     }
-    static spawnUri(uri, args, message, opts) {
-      let paused = opts && 'paused' in opts ? opts.paused : false;
-      let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
-      if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
-      try {
-        if (core.List.is(args)) {
-          for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
-            if (!(typeof args[dartx._get](i) == 'string')) {
-              dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
-            }
+
+  }
+  static spawnUri(uri, args, message, opts) {
+    let paused = opts && 'paused' in opts ? opts.paused : false;
+    let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
+    if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
+    try {
+      if (core.List.is(args)) {
+        for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
+          if (!(typeof args[dartx._get](i) == 'string')) {
+            dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
           }
-        } else if (args != null) {
-          dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
         }
-        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
-      } catch (e) {
-        let st = dart.stackTrace(e);
-        return FutureOfIsolate().error(e, st);
+      } else if (args != null) {
+        dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
       }
+      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+    } catch (e) {
+      let st = dart.stackTrace(e);
+      return FutureOfIsolate().error(e, st);
+    }
 
+  }
+  pause(resumeCapability) {
+    if (resumeCapability === void 0) resumeCapability = null;
+    if (resumeCapability == null) resumeCapability = isolate.Capability.new();
+    this[_pause](resumeCapability);
+    return resumeCapability;
+  }
+  [_pause](resumeCapability) {
+    let message = core.List.new(3);
+    message[dartx._set](0, "pause");
+    message[dartx._set](1, this.pauseCapability);
+    message[dartx._set](2, resumeCapability);
+    this.controlPort.send(message);
+  }
+  resume(resumeCapability) {
+    let message = core.List.new(2);
+    message[dartx._set](0, "resume");
+    message[dartx._set](1, resumeCapability);
+    this.controlPort.send(message);
+  }
+  addOnExitListener(responsePort) {
+    let message = core.List.new(2);
+    message[dartx._set](0, "add-ondone");
+    message[dartx._set](1, responsePort);
+    this.controlPort.send(message);
+  }
+  removeOnExitListener(responsePort) {
+    let message = core.List.new(2);
+    message[dartx._set](0, "remove-ondone");
+    message[dartx._set](1, responsePort);
+    this.controlPort.send(message);
+  }
+  setErrorsFatal(errorsAreFatal) {
+    let message = core.List.new(3);
+    message[dartx._set](0, "set-errors-fatal");
+    message[dartx._set](1, this.terminateCapability);
+    message[dartx._set](2, errorsAreFatal);
+    this.controlPort.send(message);
+  }
+  kill(priority) {
+    if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
+    this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
+  }
+  ping(responsePort, pingType) {
+    if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
+    let message = core.List.new(3);
+    message[dartx._set](0, "ping");
+    message[dartx._set](1, responsePort);
+    message[dartx._set](2, pingType);
+    this.controlPort.send(message);
+  }
+  addErrorListener(port) {
+    let message = core.List.new(2);
+    message[dartx._set](0, "getErrors");
+    message[dartx._set](1, port);
+    this.controlPort.send(message);
+  }
+  removeErrorListener(port) {
+    let message = core.List.new(2);
+    message[dartx._set](0, "stopErrors");
+    message[dartx._set](1, port);
+    this.controlPort.send(message);
+  }
+  get errors() {
+    let controller = null;
+    let port = null;
+    function handleError(message) {
+      let errorDescription = core.String._check(dart.dindex(message, 0));
+      let stackDescription = core.String._check(dart.dindex(message, 1));
+      let error = new isolate.RemoteError(errorDescription, stackDescription);
+      controller.addError(error, error.stackTrace);
     }
-    pause(resumeCapability) {
-      if (resumeCapability === void 0) resumeCapability = null;
-      if (resumeCapability == null) resumeCapability = isolate.Capability.new();
-      this[_pause](resumeCapability);
-      return resumeCapability;
+    dart.fn(handleError, dynamicTovoid$());
+    controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
+        port = isolate.RawReceivePort.new(handleError);
+        this.addErrorListener(port.sendPort);
+      }, VoidToNull()), onCancel: dart.fn(() => {
+        this.removeErrorListener(port.sendPort);
+        port.close();
+        port = null;
+      }, VoidToNull())});
+    return controller.stream;
+  }
+};
+dart.setSignature(isolate.Isolate, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate.Isolate, [isolate.SendPort], {pauseCapability: isolate.Capability, terminateCapability: isolate.Capability})}),
+  fields: () => ({
+    controlPort: isolate.SendPort,
+    pauseCapability: isolate.Capability,
+    terminateCapability: isolate.Capability
+  }),
+  getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
+  methods: () => ({
+    pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
+    [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
+    resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
+    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
+    kill: dart.definiteFunctionType(dart.void, [], [core.int]),
+    ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
+  }),
+  sfields: () => ({
+    IMMEDIATE: core.int,
+    BEFORE_NEXT_EVENT: core.int,
+    AS_EVENT: core.int,
+    _currentIsolateCache: isolate.Isolate
+  }),
+  sgetters: () => ({current: dart.definiteFunctionType(isolate.Isolate, [])}),
+  statics: () => ({
+    spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
+    spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
+  }),
+  names: ['spawn', 'spawnUri']
+});
+isolate.Isolate.IMMEDIATE = 0;
+isolate.Isolate.BEFORE_NEXT_EVENT = 1;
+isolate.Isolate.AS_EVENT = 2;
+dart.defineLazy(isolate.Isolate, {
+  get _currentIsolateCache() {
+    return _isolate_helper.IsolateNatives.currentIsolate;
+  }
+});
+isolate.SendPort = class SendPort extends core.Object {};
+isolate.SendPort[dart.implements] = () => [isolate.Capability];
+isolate.ReceivePort = class ReceivePort extends core.Object {
+  static new() {
+    return new _isolate_helper.ReceivePortImpl();
+  }
+  static fromRawReceivePort(rawPort) {
+    return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
+  }
+};
+isolate.ReceivePort[dart.implements] = () => [async.Stream];
+dart.setSignature(isolate.ReceivePort, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(isolate.ReceivePort, []),
+    fromRawReceivePort: dart.definiteFunctionType(isolate.ReceivePort, [isolate.RawReceivePort])
+  })
+});
+isolate.RawReceivePort = class RawReceivePort extends core.Object {
+  static new(handler) {
+    if (handler === void 0) handler = null;
+    return new _isolate_helper.RawReceivePortImpl(handler);
+  }
+};
+dart.setSignature(isolate.RawReceivePort, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate.RawReceivePort, [], [dynamicTovoid()])})
+});
+isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
+  new(message, source, stackTrace) {
+    this.message = message;
+    this.source = source;
+    this.stackTrace = stackTrace;
+  }
+  toString() {
+    return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
+  }
+};
+isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
+dart.setSignature(isolate._IsolateUnhandledException, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate._IsolateUnhandledException, [dart.dynamic, dart.dynamic, core.StackTrace])}),
+  fields: () => ({
+    message: dart.dynamic,
+    source: dart.dynamic,
+    stackTrace: core.StackTrace
+  })
+});
+const _description = Symbol('_description');
+isolate.RemoteError = class RemoteError extends core.Object {
+  new(description, stackDescription) {
+    this[_description] = description;
+    this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
+  }
+  toString() {
+    return this[_description];
+  }
+};
+isolate.RemoteError[dart.implements] = () => [core.Error];
+dart.setSignature(isolate.RemoteError, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate.RemoteError, [core.String, core.String])}),
+  fields: () => ({
+    [_description]: core.String,
+    stackTrace: core.StackTrace
+  })
+});
+const _trace$ = Symbol('_trace');
+isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
+  new(trace) {
+    this[_trace$] = trace;
+  }
+  toString() {
+    return this[_trace$];
+  }
+};
+isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
+dart.setSignature(isolate._RemoteStackTrace, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
+  fields: () => ({[_trace$]: core.String})
+});
+isolate.Capability = class Capability extends core.Object {
+  static new() {
+    return new _isolate_helper.CapabilityImpl();
+  }
+};
+dart.setSignature(isolate.Capability, {
+  constructors: () => ({new: dart.definiteFunctionType(isolate.Capability, [])})
+});
+dart.defineLazy(js, {
+  get _global() {
+    return dart.global;
+  }
+});
+dart.defineLazy(js, {
+  get context() {
+    return js.JsObject._check(js._wrapToDart(js._global));
+  }
+});
+const _jsObject = Symbol('_jsObject');
+js.JsObject = class JsObject extends core.Object {
+  _fromJs(jsObject) {
+    this[_jsObject] = jsObject;
+    dart.assert(this[_jsObject] != null);
+  }
+  static new(constructor, arguments$) {
+    if (arguments$ === void 0) arguments$ = null;
+    let ctor = constructor[_jsObject];
+    if (arguments$ == null) {
+      return js.JsObject._check(js._wrapToDart(new ctor()));
     }
-    [_pause](resumeCapability) {
-      let message = core.List.new(3);
-      message[dartx._set](0, "pause");
-      message[dartx._set](1, this.pauseCapability);
-      message[dartx._set](2, resumeCapability);
-      this.controlPort.send(message);
+    let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
+    return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
+  }
+  static fromBrowserObject(object) {
+    if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
+      dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
     }
-    resume(resumeCapability) {
-      let message = core.List.new(2);
-      message[dartx._set](0, "resume");
-      message[dartx._set](1, resumeCapability);
-      this.controlPort.send(message);
-    }
-    addOnExitListener(responsePort) {
-      let message = core.List.new(2);
-      message[dartx._set](0, "add-ondone");
-      message[dartx._set](1, responsePort);
-      this.controlPort.send(message);
-    }
-    removeOnExitListener(responsePort) {
-      let message = core.List.new(2);
-      message[dartx._set](0, "remove-ondone");
-      message[dartx._set](1, responsePort);
-      this.controlPort.send(message);
-    }
-    setErrorsFatal(errorsAreFatal) {
-      let message = core.List.new(3);
-      message[dartx._set](0, "set-errors-fatal");
-      message[dartx._set](1, this.terminateCapability);
-      message[dartx._set](2, errorsAreFatal);
-      this.controlPort.send(message);
-    }
-    kill(priority) {
-      if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
-      this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
-    }
-    ping(responsePort, pingType) {
-      if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
-      let message = core.List.new(3);
-      message[dartx._set](0, "ping");
-      message[dartx._set](1, responsePort);
-      message[dartx._set](2, pingType);
-      this.controlPort.send(message);
-    }
-    addErrorListener(port) {
-      let message = core.List.new(2);
-      message[dartx._set](0, "getErrors");
-      message[dartx._set](1, port);
-      this.controlPort.send(message);
-    }
-    removeErrorListener(port) {
-      let message = core.List.new(2);
-      message[dartx._set](0, "stopErrors");
-      message[dartx._set](1, port);
-      this.controlPort.send(message);
-    }
-    get errors() {
-      let controller = null;
-      let port = null;
-      function handleError(message) {
-        let errorDescription = core.String._check(dart.dindex(message, 0));
-        let stackDescription = core.String._check(dart.dindex(message, 1));
-        let error = new isolate.RemoteError(errorDescription, stackDescription);
-        controller.addError(error, error.stackTrace);
-      }
-      dart.fn(handleError, dynamicTovoid$());
-      controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
-          port = isolate.RawReceivePort.new(handleError);
-          this.addErrorListener(port.sendPort);
-        }, VoidToNull()), onCancel: dart.fn(() => {
-          this.removeErrorListener(port.sendPort);
-          port.close();
-          port = null;
-        }, VoidToNull())});
-      return controller.stream;
-    }
-  };
-  dart.setSignature(isolate.Isolate, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate.Isolate, [isolate.SendPort], {pauseCapability: isolate.Capability, terminateCapability: isolate.Capability})}),
-    fields: () => ({
-      controlPort: isolate.SendPort,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability
-    }),
-    getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
-    methods: () => ({
-      pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
-      [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
-      kill: dart.definiteFunctionType(dart.void, [], [core.int]),
-      ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
-    }),
-    sfields: () => ({
-      IMMEDIATE: core.int,
-      BEFORE_NEXT_EVENT: core.int,
-      AS_EVENT: core.int,
-      _currentIsolateCache: isolate.Isolate
-    }),
-    sgetters: () => ({current: dart.definiteFunctionType(isolate.Isolate, [])}),
-    statics: () => ({
-      spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
-      spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
-    }),
-    names: ['spawn', 'spawnUri']
-  });
-  isolate.Isolate.IMMEDIATE = 0;
-  isolate.Isolate.BEFORE_NEXT_EVENT = 1;
-  isolate.Isolate.AS_EVENT = 2;
-  dart.defineLazy(isolate.Isolate, {
-    get _currentIsolateCache() {
-      return _isolate_helper.IsolateNatives.currentIsolate;
-    }
-  });
-  isolate.SendPort = class SendPort extends core.Object {};
-  isolate.SendPort[dart.implements] = () => [isolate.Capability];
-  isolate.ReceivePort = class ReceivePort extends core.Object {
-    static new() {
-      return new _isolate_helper.ReceivePortImpl();
-    }
-    static fromRawReceivePort(rawPort) {
-      return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
-    }
-  };
-  isolate.ReceivePort[dart.implements] = () => [async.Stream];
-  dart.setSignature(isolate.ReceivePort, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(isolate.ReceivePort, []),
-      fromRawReceivePort: dart.definiteFunctionType(isolate.ReceivePort, [isolate.RawReceivePort])
-    })
-  });
-  isolate.RawReceivePort = class RawReceivePort extends core.Object {
-    static new(handler) {
-      if (handler === void 0) handler = null;
-      return new _isolate_helper.RawReceivePortImpl(handler);
-    }
-  };
-  dart.setSignature(isolate.RawReceivePort, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate.RawReceivePort, [], [dynamicTovoid()])})
-  });
-  isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
-    new(message, source, stackTrace) {
-      this.message = message;
-      this.source = source;
-      this.stackTrace = stackTrace;
-    }
-    toString() {
-      return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
-    }
-  };
-  isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate._IsolateUnhandledException, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate._IsolateUnhandledException, [dart.dynamic, dart.dynamic, core.StackTrace])}),
-    fields: () => ({
-      message: dart.dynamic,
-      source: dart.dynamic,
-      stackTrace: core.StackTrace
-    })
-  });
-  const _description = Symbol('_description');
-  isolate.RemoteError = class RemoteError extends core.Object {
-    new(description, stackDescription) {
-      this[_description] = description;
-      this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
-    }
-    toString() {
-      return this[_description];
-    }
-  };
-  isolate.RemoteError[dart.implements] = () => [core.Error];
-  dart.setSignature(isolate.RemoteError, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate.RemoteError, [core.String, core.String])}),
-    fields: () => ({
-      [_description]: core.String,
-      stackTrace: core.StackTrace
-    })
-  });
-  const _trace$ = Symbol('_trace');
-  isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
-    new(trace) {
-      this[_trace$] = trace;
-    }
-    toString() {
-      return this[_trace$];
-    }
-  };
-  isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
-  dart.setSignature(isolate._RemoteStackTrace, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
-    fields: () => ({[_trace$]: core.String})
-  });
-  isolate.Capability = class Capability extends core.Object {
-    static new() {
-      return new _isolate_helper.CapabilityImpl();
-    }
-  };
-  dart.setSignature(isolate.Capability, {
-    constructors: () => ({new: dart.definiteFunctionType(isolate.Capability, [])})
-  });
-  dart.defineLazy(js, {
-    get _global() {
-      return dart.global;
-    }
-  });
-  dart.defineLazy(js, {
-    get context() {
-      return js.JsObject._check(js._wrapToDart(js._global));
-    }
-  });
-  const _jsObject = Symbol('_jsObject');
-  js.JsObject = class JsObject extends core.Object {
-    _fromJs(jsObject) {
-      this[_jsObject] = jsObject;
-      dart.assert(this[_jsObject] != null);
-    }
-    static new(constructor, arguments$) {
-      if (arguments$ === void 0) arguments$ = null;
-      let ctor = constructor[_jsObject];
-      if (arguments$ == null) {
-        return js.JsObject._check(js._wrapToDart(new ctor()));
-      }
-      let unwrapped = core.List.from(arguments$[dartx.map](dart.dynamic)(js._convertToJS));
-      return js.JsObject._check(js._wrapToDart(new ctor(...unwrapped)));
-    }
-    static fromBrowserObject(object) {
-      if (typeof object == 'number' || typeof object == 'string' || typeof object == 'boolean' || object == null) {
-        dart.throw(new core.ArgumentError("object cannot be a num, string, bool, or null"));
-      }
-      return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
-    }
-    static jsify(object) {
-      if (!core.Map.is(object) && !core.Iterable.is(object)) {
-        dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
-      }
-      return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
-    }
-    static _convertDataTree(data) {
-      let _convertedObjects = collection.HashMap.identity();
-      function _convert(o) {
-        if (dart.test(_convertedObjects.containsKey(o))) {
-          return _convertedObjects._get(o);
-        }
-        if (core.Map.is(o)) {
-          let convertedMap = {};
-          _convertedObjects._set(o, convertedMap);
-          for (let key of o[dartx.keys]) {
-            convertedMap[key] = _convert(o[dartx._get](key));
-          }
-          return convertedMap;
-        } else if (core.Iterable.is(o)) {
-          let convertedList = [];
-          _convertedObjects._set(o, convertedList);
-          convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
-          return convertedList;
-        } else {
-          return js._convertToJS(o);
-        }
-      }
-      dart.fn(_convert, dynamicTodynamic$());
-      return _convert(data);
-    }
-    _get(property) {
-      if (!(typeof property == 'string') && !(typeof property == 'number')) {
-        dart.throw(new core.ArgumentError("property is not a String or num"));
-      }
-      return js._convertToDart(this[_jsObject][property]);
-    }
-    _set(property, value) {
-      if (!(typeof property == 'string') && !(typeof property == 'number')) {
-        dart.throw(new core.ArgumentError("property is not a String or num"));
-      }
-      this[_jsObject][property] = js._convertToJS(value);
-      return value;
-    }
-    get hashCode() {
-      return 0;
-    }
-    ['=='](other) {
-      return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
-    }
-    hasProperty(property) {
-      if (!(typeof property == 'string') && !(typeof property == 'number')) {
-        dart.throw(new core.ArgumentError("property is not a String or num"));
-      }
-      return property in this[_jsObject];
-    }
-    deleteProperty(property) {
-      if (!(typeof property == 'string') && !(typeof property == 'number')) {
-        dart.throw(new core.ArgumentError("property is not a String or num"));
-      }
-      delete this[_jsObject][property];
-    }
-    instanceof(type) {
-      return this[_jsObject] instanceof js._convertToJS(type);
-    }
-    toString() {
-      try {
-        return String(this[_jsObject]);
-      } catch (e) {
-        return super.toString();
-      }
-
-    }
-    callMethod(method, args) {
-      if (args === void 0) args = null;
-      if (!(typeof method == 'string') && !(typeof method == 'number')) {
-        dart.throw(new core.ArgumentError("method is not a String or num"));
-      }
-      if (args != null) args = core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS));
-      let fn = this[_jsObject][method];
-      if (typeof fn !== "function") {
-        dart.throw(new core.NoSuchMethodError(this[_jsObject], core.Symbol.new(core.String._check(method)), args, dart.map({}, core.Symbol, dart.dynamic)));
-      }
-      return js._convertToDart(fn.apply(this[_jsObject], args));
-    }
-  };
-  dart.defineNamedConstructor(js.JsObject, '_fromJs');
-  dart.setSignature(js.JsObject, {
-    constructors: () => ({
-      _fromJs: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
-      new: dart.definiteFunctionType(js.JsObject, [js.JsFunction], [core.List]),
-      fromBrowserObject: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
-      jsify: dart.definiteFunctionType(js.JsObject, [dart.dynamic])
-    }),
-    fields: () => ({[_jsObject]: dart.dynamic}),
-    methods: () => ({
-      _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
-      _set: dart.definiteFunctionType(dart.dynamic, [core.Object, dart.dynamic]),
-      hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      deleteProperty: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      instanceof: dart.definiteFunctionType(core.bool, [js.JsFunction]),
-      callMethod: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.List])
-    }),
-    statics: () => ({_convertDataTree: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
-    names: ['_convertDataTree']
-  });
-  js.JsFunction = class JsFunction extends js.JsObject {
-    static withThis(f) {
-      return new js.JsFunction._fromJs(function() {
-        let args = [js._convertToDart(this)];
-        for (let arg of arguments) {
-          args.push(js._convertToDart(arg));
-        }
-        return js._convertToJS(f(...args));
-      });
-    }
-    _fromJs(jsObject) {
-      super._fromJs(jsObject);
-    }
-    apply(args, opts) {
-      let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
-      return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS))));
-    }
-  };
-  dart.defineNamedConstructor(js.JsFunction, '_fromJs');
-  dart.setSignature(js.JsFunction, {
-    constructors: () => ({
-      withThis: dart.definiteFunctionType(js.JsFunction, [core.Function]),
-      _fromJs: dart.definiteFunctionType(js.JsFunction, [dart.dynamic])
-    }),
-    methods: () => ({apply: dart.definiteFunctionType(dart.dynamic, [core.List], {thisArg: dart.dynamic})})
-  });
-  const _checkIndex = Symbol('_checkIndex');
-  const _checkInsertIndex = Symbol('_checkInsertIndex');
-  js.JsArray$ = dart.generic(E => {
-    let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
-    let JSArrayOfEAndEToint = () => (JSArrayOfEAndEToint = dart.constFn(_interceptors.JSArray$(EAndEToint())))();
-    class JsArray extends dart.mixin(js.JsObject, collection.ListMixin$(E)) {
-      new() {
-        super._fromJs([]);
-      }
-      from(other) {
-        super._fromJs((() => {
-          let _ = [];
-          _[dartx.addAll](other[dartx.map](dart.dynamic)(js._convertToJS));
-          return _;
-        })());
-      }
-      _fromJs(jsObject) {
-        super._fromJs(jsObject);
-      }
-      [_checkIndex](index) {
-        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
-          dart.throw(new core.RangeError.range(index, 0, this.length));
-        }
-      }
-      [_checkInsertIndex](index) {
-        if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
-          dart.throw(new core.RangeError.range(index, 0, this.length));
-        }
-      }
-      static _checkRange(start, end, length) {
-        if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
-          dart.throw(new core.RangeError.range(start, 0, length));
-        }
-        if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
-          dart.throw(new core.RangeError.range(end, start, length));
-        }
-      }
-      _get(index) {
-        if (typeof index == 'number' && index == index[dartx.toInt]()) {
-          this[_checkIndex](dart.asInt(index));
-        }
-        return E.as(super._get(index));
-      }
-      _set(index, value) {
-        E._check(value);
-        if (typeof index == 'number' && index == index[dartx.toInt]()) {
-          this[_checkIndex](dart.asInt(index));
-        }
-        super._set(index, value);
-        return value;
-      }
-      get length() {
-        let len = this[_jsObject].length;
-        if (typeof len === "number" && len >>> 0 === len) {
-          return len;
-        }
-        dart.throw(new core.StateError('Bad JsArray length'));
-      }
-      set length(length) {
-        super._set('length', length);
-      }
-      add(value) {
-        E._check(value);
-        this.callMethod('push', JSArrayOfE().of([value]));
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        let list = iterable instanceof Array ? iterable : core.List.from(iterable);
-        this.callMethod('push', core.List._check(list));
-      }
-      insert(index, element) {
-        E._check(element);
-        this[_checkInsertIndex](index);
-        this.callMethod('splice', JSArrayOfObject().of([index, 0, element]));
-      }
-      removeAt(index) {
-        this[_checkIndex](index);
-        return E.as(dart.dindex(this.callMethod('splice', JSArrayOfint().of([index, 1])), 0));
-      }
-      removeLast() {
-        if (this.length == 0) dart.throw(new core.RangeError(-1));
-        return E.as(this.callMethod('pop'));
-      }
-      removeRange(start, end) {
-        js.JsArray._checkRange(start, end, this.length);
-        this.callMethod('splice', JSArrayOfint().of([start, dart.notNull(end) - dart.notNull(start)]));
-      }
-      setRange(start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        js.JsArray._checkRange(start, end, this.length);
-        let length = dart.notNull(end) - dart.notNull(start);
-        if (length == 0) return;
-        if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
-        let args = JSArrayOfObject().of([start, length]);
-        args[dartx.addAll](iterable[dartx.skip](skipCount)[dartx.take](length));
-        this.callMethod('splice', args);
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        this.callMethod('sort', compare == null ? [] : JSArrayOfEAndEToint().of([compare]));
-      }
-    }
-    dart.addTypeTests(JsArray);
-    dart.defineNamedConstructor(JsArray, 'from');
-    dart.defineNamedConstructor(JsArray, '_fromJs');
-    dart.setSignature(JsArray, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(js.JsArray$(E), []),
-        from: dart.definiteFunctionType(js.JsArray$(E), [IterableOfE()]),
-        _fromJs: dart.definiteFunctionType(js.JsArray$(E), [dart.dynamic])
-      }),
-      getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-      methods: () => ({
-        [_checkIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
-        [_checkInsertIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
-        _get: dart.definiteFunctionType(E, [core.Object]),
-        _set: dart.definiteFunctionType(dart.void, [core.Object, E])
-      }),
-      statics: () => ({_checkRange: dart.definiteFunctionType(dart.dynamic, [core.int, core.int, core.int])}),
-      names: ['_checkRange']
-    });
-    dart.defineExtensionMembers(JsArray, [
-      '_get',
-      '_set',
-      'add',
-      'addAll',
-      'insert',
-      'removeAt',
-      'removeLast',
-      'removeRange',
-      'setRange',
-      'sort',
-      'length',
-      'length'
-    ]);
-    return JsArray;
-  });
-  js.JsArray = JsArray();
-  js._isBrowserType = function(o) {
-    return o instanceof Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window);
-  };
-  dart.fn(js._isBrowserType, dynamicTobool$());
-  const _dartObj = Symbol('_dartObj');
-  js._DartObject = class _DartObject extends core.Object {
-    new(dartObj) {
-      this[_dartObj] = dartObj;
-    }
-  };
-  dart.setSignature(js._DartObject, {
-    constructors: () => ({new: dart.definiteFunctionType(js._DartObject, [dart.dynamic])}),
-    fields: () => ({[_dartObj]: dart.dynamic})
-  });
-  js._convertToJS = function(o) {
-    if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
-      return o;
-    } else if (core.DateTime.is(o)) {
-      return _js_helper.Primitives.lazyAsJsDate(o);
-    } else if (js.JsObject.is(o)) {
-      return o[_jsObject];
-    } else if (core.Function.is(o)) {
-      return js._putIfAbsent(js._jsProxies, o, js._wrapDartFunction);
-    } else {
-      return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
-    }
-  };
-  dart.fn(js._convertToJS, dynamicTodynamic$());
-  js._wrapDartFunction = function(f) {
-    let wrapper = function() {
-      let args = Array.prototype.map.call(arguments, js._convertToDart);
-      return js._convertToJS(f(...args));
-    };
-    js._dartProxies.set(wrapper, f);
-    return wrapper;
-  };
-  dart.fn(js._wrapDartFunction, dynamicTodynamic$());
-  js._convertToDart = function(o) {
-    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
-      return o;
-    } else if (o instanceof Date) {
-      let ms = o.getTime();
-      return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
-    } else if (js._DartObject.is(o) && dart.jsobject != dart.getReifiedType(o)) {
-      return o[_dartObj];
-    } else {
-      return js._wrapToDart(o);
-    }
-  };
-  dart.fn(js._convertToDart, dynamicToObject());
-  js._wrapToDart = function(o) {
-    return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
-  };
-  dart.fn(js._wrapToDart, dynamicToObject());
-  js._wrapToDartHelper = function(o) {
-    if (typeof o == "function") {
-      return new js.JsFunction._fromJs(o);
-    }
-    if (o instanceof Array) {
-      return new js.JsArray._fromJs(o);
-    }
-    return new js.JsObject._fromJs(o);
-  };
-  dart.fn(js._wrapToDartHelper, dynamicToObject());
-  dart.defineLazy(js, {
-    get _dartProxies() {
-      return new WeakMap();
-    }
-  });
-  dart.defineLazy(js, {
-    get _jsProxies() {
-      return new WeakMap();
-    }
-  });
-  js._putIfAbsent = function(weakMap, o, getValue) {
-    let value = weakMap.get(o);
-    if (value == null) {
-      value = dart.dcall(getValue, o);
-      weakMap.set(o, value);
-    }
-    return value;
-  };
-  dart.fn(js._putIfAbsent, dynamicAnddynamicAndFnToObject());
-  js.allowInterop = function(F) {
-    return f => {
-      return f;
-    };
-  };
-  dart.fn(js.allowInterop, FToF());
-  dart.defineLazy(js, {
-    get _interopCaptureThisExpando() {
-      return new (ExpandoOfFunction())();
-    },
-    set _interopCaptureThisExpando(_) {}
-  });
-  js.allowInteropCaptureThis = function(f) {
-    let ret = js._interopCaptureThisExpando._get(f);
-    if (ret == null) {
-      ret = function() {
-        let args = [this];
-        for (let arg of arguments) {
-          args.push(arg);
-        }
-        return f(...args);
-      };
-      js._interopCaptureThisExpando._set(f, ret);
-    }
-    return ret;
-  };
-  dart.fn(js.allowInteropCaptureThis, FunctionToFunction());
-  js_util.jsify = function(object) {
+    return js.JsObject._check(js._wrapToDart(js._convertToJS(object)));
+  }
+  static jsify(object) {
     if (!core.Map.is(object) && !core.Iterable.is(object)) {
       dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
     }
-    return js_util._convertDataTree(object);
-  };
-  dart.fn(js_util.jsify, dynamicTodynamic$());
-  js_util._convertDataTree = function(data) {
+    return js.JsObject._check(js._wrapToDart(js.JsObject._convertDataTree(object)));
+  }
+  static _convertDataTree(data) {
     let _convertedObjects = collection.HashMap.identity();
     function _convert(o) {
       if (dart.test(_convertedObjects.containsKey(o))) {
@@ -53133,40719 +52750,874 @@
         convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
         return convertedList;
       } else {
-        return o;
+        return js._convertToJS(o);
       }
     }
     dart.fn(_convert, dynamicTodynamic$());
     return _convert(data);
-  };
-  dart.fn(js_util._convertDataTree, dynamicTodynamic$());
-  js_util.newObject = function() {
-    return {};
-  };
-  dart.fn(js_util.newObject, VoidTodynamic$());
-  js_util.hasProperty = function(o, name) {
-    return name in o;
-  };
-  dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
-  js_util.getProperty = function(o, name) {
-    return o[name];
-  };
-  dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
-  js_util.setProperty = function(o, name, value) {
-    return o[name] = value;
-  };
-  dart.fn(js_util.setProperty, dynamicAnddynamicAnddynamicTodynamic());
-  js_util.callMethod = function(o, method, args) {
-    return o[method].apply(o, args);
-  };
-  dart.fn(js_util.callMethod, dynamicAndStringAndListTodynamic());
-  js_util.instanceof = function(o, type) {
-    return o instanceof type;
-  };
-  dart.fn(js_util.instanceof, dynamicAndFunctionTodynamic());
-  js_util.callConstructor = function(constr, arguments$) {
-    if (arguments$ == null) {
-      return new constr();
+  }
+  _get(property) {
+    if (!(typeof property == 'string') && !(typeof property == 'number')) {
+      dart.throw(new core.ArgumentError("property is not a String or num"));
     }
-    if (arguments$ instanceof Array) {
-      let argumentCount = arguments$.length;
-      switch (argumentCount) {
-        case 0:
-        {
-          return new constr();
-        }
-        case 1:
-        {
-          let arg0 = arguments$[0];
-          return new constr(arg0);
-        }
-        case 2:
-        {
-          let arg0 = arguments$[0];
-          let arg1 = arguments$[1];
-          return new constr(arg0, arg1);
-        }
-        case 3:
-        {
-          let arg0 = arguments$[0];
-          let arg1 = arguments$[1];
-          let arg2 = arguments$[2];
-          return new constr(arg0, arg1, arg2);
-        }
-        case 4:
-        {
-          let arg0 = arguments$[0];
-          let arg1 = arguments$[1];
-          let arg2 = arguments$[2];
-          let arg3 = arguments$[3];
-          return new constr(arg0, arg1, arg2, arg3);
-        }
+    return js._convertToDart(this[_jsObject][property]);
+  }
+  _set(property, value) {
+    if (!(typeof property == 'string') && !(typeof property == 'number')) {
+      dart.throw(new core.ArgumentError("property is not a String or num"));
+    }
+    this[_jsObject][property] = js._convertToJS(value);
+    return value;
+  }
+  get hashCode() {
+    return 0;
+  }
+  ['=='](other) {
+    return js.JsObject.is(other) && this[_jsObject] === other[_jsObject];
+  }
+  hasProperty(property) {
+    if (!(typeof property == 'string') && !(typeof property == 'number')) {
+      dart.throw(new core.ArgumentError("property is not a String or num"));
+    }
+    return property in this[_jsObject];
+  }
+  deleteProperty(property) {
+    if (!(typeof property == 'string') && !(typeof property == 'number')) {
+      dart.throw(new core.ArgumentError("property is not a String or num"));
+    }
+    delete this[_jsObject][property];
+  }
+  instanceof(type) {
+    return this[_jsObject] instanceof js._convertToJS(type);
+  }
+  toString() {
+    try {
+      return String(this[_jsObject]);
+    } catch (e) {
+      return super.toString();
+    }
+
+  }
+  callMethod(method, args) {
+    if (args === void 0) args = null;
+    if (!(typeof method == 'string') && !(typeof method == 'number')) {
+      dart.throw(new core.ArgumentError("method is not a String or num"));
+    }
+    if (args != null) args = core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS));
+    let fn = this[_jsObject][method];
+    if (typeof fn !== "function") {
+      dart.throw(new core.NoSuchMethodError(this[_jsObject], core.Symbol.new(core.String._check(method)), args, dart.map({}, core.Symbol, dart.dynamic)));
+    }
+    return js._convertToDart(fn.apply(this[_jsObject], args));
+  }
+};
+dart.defineNamedConstructor(js.JsObject, '_fromJs');
+dart.setSignature(js.JsObject, {
+  constructors: () => ({
+    _fromJs: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
+    new: dart.definiteFunctionType(js.JsObject, [js.JsFunction], [core.List]),
+    fromBrowserObject: dart.definiteFunctionType(js.JsObject, [dart.dynamic]),
+    jsify: dart.definiteFunctionType(js.JsObject, [dart.dynamic])
+  }),
+  fields: () => ({[_jsObject]: dart.dynamic}),
+  methods: () => ({
+    _get: dart.definiteFunctionType(dart.dynamic, [core.Object]),
+    _set: dart.definiteFunctionType(dart.dynamic, [core.Object, dart.dynamic]),
+    hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    deleteProperty: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    instanceof: dart.definiteFunctionType(core.bool, [js.JsFunction]),
+    callMethod: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], [core.List])
+  }),
+  statics: () => ({_convertDataTree: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])}),
+  names: ['_convertDataTree']
+});
+js.JsFunction = class JsFunction extends js.JsObject {
+  static withThis(f) {
+    return new js.JsFunction._fromJs(function() {
+      let args = [js._convertToDart(this)];
+      for (let arg of arguments) {
+        args.push(js._convertToDart(arg));
       }
-    }
-    let args = [null];
-    args[dartx.addAll](arguments$);
-    let factoryFunction = constr.bind.apply(constr, args);
-    String(factoryFunction);
-    return new factoryFunction();
-  };
-  dart.fn(js_util.callConstructor, FunctionAndListTodynamic());
-  math.E = 2.718281828459045;
-  math.LN10 = 2.302585092994046;
-  math.LN2 = 0.6931471805599453;
-  math.LOG2E = 1.4426950408889634;
-  math.LOG10E = 0.4342944819032518;
-  math.PI = 3.141592653589793;
-  math.SQRT1_2 = 0.7071067811865476;
-  math.SQRT2 = 1.4142135623730951;
-  math.min = function(T) {
-    return (a, b) => {
-      return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
-    };
-  };
-  dart.fn(math.min, TAndTToT());
-  math.max = function(T) {
-    return (a, b) => {
-      return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
-    };
-  };
-  dart.fn(math.max, TAndTToT$());
-  math.atan2 = function(a, b) {
-    return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
-  };
-  dart.fn(math.atan2, numAndnumTodouble());
-  math.pow = function(x, exponent) {
-    _js_helper.checkNum(x);
-    _js_helper.checkNum(exponent);
-    return Math.pow(x, exponent);
-  };
-  dart.fn(math.pow, numAndnumTonum());
-  math.sin = function(x) {
-    return Math.sin(_js_helper.checkNum(x));
-  };
-  dart.fn(math.sin, numTodouble());
-  math.cos = function(x) {
-    return Math.cos(_js_helper.checkNum(x));
-  };
-  dart.fn(math.cos, numTodouble());
-  math.tan = function(x) {
-    return Math.tan(_js_helper.checkNum(x));
-  };
-  dart.fn(math.tan, numTodouble());
-  math.acos = function(x) {
-    return Math.acos(_js_helper.checkNum(x));
-  };
-  dart.fn(math.acos, numTodouble());
-  math.asin = function(x) {
-    return Math.asin(_js_helper.checkNum(x));
-  };
-  dart.fn(math.asin, numTodouble());
-  math.atan = function(x) {
-    return Math.atan(_js_helper.checkNum(x));
-  };
-  dart.fn(math.atan, numTodouble());
-  math.sqrt = function(x) {
-    return Math.sqrt(_js_helper.checkNum(x));
-  };
-  dart.fn(math.sqrt, numTodouble());
-  math.exp = function(x) {
-    return Math.exp(_js_helper.checkNum(x));
-  };
-  dart.fn(math.exp, numTodouble());
-  math.log = function(x) {
-    return Math.log(_js_helper.checkNum(x));
-  };
-  dart.fn(math.log, numTodouble());
-  math._POW2_32 = 4294967296;
-  math._JSRandom = class _JSRandom extends core.Object {
+      return js._convertToJS(f(...args));
+    });
+  }
+  _fromJs(jsObject) {
+    super._fromJs(jsObject);
+  }
+  apply(args, opts) {
+    let thisArg = opts && 'thisArg' in opts ? opts.thisArg : null;
+    return js._convertToDart(this[_jsObject].apply(js._convertToJS(thisArg), args == null ? null : core.List.from(args[dartx.map](dart.dynamic)(js._convertToJS))));
+  }
+};
+dart.defineNamedConstructor(js.JsFunction, '_fromJs');
+dart.setSignature(js.JsFunction, {
+  constructors: () => ({
+    withThis: dart.definiteFunctionType(js.JsFunction, [core.Function]),
+    _fromJs: dart.definiteFunctionType(js.JsFunction, [dart.dynamic])
+  }),
+  methods: () => ({apply: dart.definiteFunctionType(dart.dynamic, [core.List], {thisArg: dart.dynamic})})
+});
+const _checkIndex = Symbol('_checkIndex');
+const _checkInsertIndex = Symbol('_checkInsertIndex');
+js.JsArray$ = dart.generic(E => {
+  let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
+  let JSArrayOfEAndEToint = () => (JSArrayOfEAndEToint = dart.constFn(_interceptors.JSArray$(EAndEToint())))();
+  class JsArray extends dart.mixin(js.JsObject, collection.ListMixin$(E)) {
     new() {
+      super._fromJs([]);
     }
-    nextInt(max) {
-      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
-        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
-      }
-      return Math.random() * max >>> 0;
+    from(other) {
+      super._fromJs((() => {
+        let _ = [];
+        _[dartx.addAll](other[dartx.map](dart.dynamic)(js._convertToJS));
+        return _;
+      })());
     }
-    nextDouble() {
-      return Math.random();
+    _fromJs(jsObject) {
+      super._fromJs(jsObject);
     }
-    nextBool() {
-      return Math.random() < 0.5;
-    }
-  };
-  math._JSRandom[dart.implements] = () => [math.Random];
-  dart.setSignature(math._JSRandom, {
-    constructors: () => ({new: dart.definiteFunctionType(math._JSRandom, [])}),
-    methods: () => ({
-      nextInt: dart.definiteFunctionType(core.int, [core.int]),
-      nextDouble: dart.definiteFunctionType(core.double, []),
-      nextBool: dart.definiteFunctionType(core.bool, [])
-    })
-  });
-  const _lo = Symbol('_lo');
-  const _hi = Symbol('_hi');
-  const _nextState = Symbol('_nextState');
-  math._Random = class _Random extends core.Object {
-    new(seed) {
-      this[_lo] = 0;
-      this[_hi] = 0;
-      let empty_seed = 0;
-      if (dart.notNull(seed) < 0) {
-        empty_seed = -1;
+    [_checkIndex](index) {
+      if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length))) {
+        dart.throw(new core.RangeError.range(index, 0, this.length));
       }
-      do {
-        let low = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
-        seed = ((dart.notNull(seed) - low) / math._POW2_32)[dartx.truncate]();
-        let high = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
-        seed = ((dart.notNull(seed) - high) / math._POW2_32)[dartx.truncate]();
-        let tmplow = low << 21 >>> 0;
-        let tmphigh = (high << 21 | low[dartx['>>']](11)) >>> 0;
-        tmplow = ((~low & math._Random._MASK32) >>> 0) + tmplow;
-        low = (tmplow & math._Random._MASK32) >>> 0;
-        high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-        tmphigh = high[dartx['>>']](24);
-        tmplow = (low[dartx['>>']](24) | high << 8) >>> 0;
-        low = (low ^ tmplow) >>> 0;
-        high = (high ^ tmphigh) >>> 0;
-        tmplow = low * 265;
-        low = (tmplow & math._Random._MASK32) >>> 0;
-        high = (high * 265 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-        tmphigh = high[dartx['>>']](14);
-        tmplow = (low[dartx['>>']](14) | high << 18) >>> 0;
-        low = (low ^ tmplow) >>> 0;
-        high = (high ^ tmphigh) >>> 0;
-        tmplow = low * 21;
-        low = (tmplow & math._Random._MASK32) >>> 0;
-        high = (high * 21 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-        tmphigh = high[dartx['>>']](28);
-        tmplow = (low[dartx['>>']](28) | high << 4) >>> 0;
-        low = (low ^ tmplow) >>> 0;
-        high = (high ^ tmphigh) >>> 0;
-        tmplow = low << 31 >>> 0;
-        tmphigh = (high << 31 | low[dartx['>>']](1)) >>> 0;
-        tmplow = tmplow + low;
-        low = (tmplow & math._Random._MASK32) >>> 0;
-        high = (high + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-        tmplow = dart.notNull(this[_lo]) * 1037;
-        this[_lo] = (tmplow & math._Random._MASK32) >>> 0;
-        this[_hi] = (dart.notNull(this[_hi]) * 1037 + ((tmplow - dart.notNull(this[_lo])) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-        this[_lo] = (dart.notNull(this[_lo]) ^ low) >>> 0;
-        this[_hi] = (dart.notNull(this[_hi]) ^ high) >>> 0;
-      } while (seed != empty_seed);
-      if (this[_hi] == 0 && this[_lo] == 0) {
-        this[_lo] = 23063;
-      }
-      this[_nextState]();
-      this[_nextState]();
-      this[_nextState]();
-      this[_nextState]();
-    }
-    [_nextState]() {
-      let tmpHi = 4294901760 * dart.notNull(this[_lo]);
-      let tmpHiLo = (tmpHi & math._Random._MASK32) >>> 0;
-      let tmpHiHi = tmpHi - tmpHiLo;
-      let tmpLo = 55905 * dart.notNull(this[_lo]);
-      let tmpLoLo = (tmpLo & math._Random._MASK32) >>> 0;
-      let tmpLoHi = tmpLo - tmpLoLo;
-      let newLo = tmpLoLo + tmpHiLo + dart.notNull(this[_hi]);
-      this[_lo] = (newLo & math._Random._MASK32) >>> 0;
-      let newLoHi = newLo - dart.notNull(this[_lo]);
-      this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / math._POW2_32)[dartx.truncate]() & math._Random._MASK32) >>> 0;
-      dart.assert(dart.notNull(this[_lo]) < math._POW2_32);
-      dart.assert(dart.notNull(this[_hi]) < math._POW2_32);
     }
-    nextInt(max) {
-      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
-        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
-      }
-      if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
-        this[_nextState]();
-        return (dart.notNull(this[_lo]) & dart.notNull(max) - 1) >>> 0;
+    [_checkInsertIndex](index) {
+      if (typeof index == 'number' && (dart.notNull(index) < 0 || dart.notNull(index) >= dart.notNull(this.length) + 1)) {
+        dart.throw(new core.RangeError.range(index, 0, this.length));
       }
-      let rnd32 = null;
-      let result = null;
-      do {
-        this[_nextState]();
-        rnd32 = this[_lo];
-        result = dart.asInt(rnd32[dartx.remainder](max));
-      } while (dart.notNull(rnd32) - dart.notNull(result) + dart.notNull(max) >= math._POW2_32);
-      return result;
     }
-    nextDouble() {
-      this[_nextState]();
-      let bits26 = (dart.notNull(this[_lo]) & (1 << 26) - 1) >>> 0;
-      this[_nextState]();
-      let bits27 = (dart.notNull(this[_lo]) & (1 << 27) - 1) >>> 0;
-      return (bits26 * math._Random._POW2_27_D + bits27) / math._Random._POW2_53_D;
-    }
-    nextBool() {
-      this[_nextState]();
-      return (dart.notNull(this[_lo]) & 1) == 0;
-    }
-  };
-  math._Random[dart.implements] = () => [math.Random];
-  dart.setSignature(math._Random, {
-    constructors: () => ({new: dart.definiteFunctionType(math._Random, [core.int])}),
-    fields: () => ({
-      [_lo]: core.int,
-      [_hi]: core.int
-    }),
-    methods: () => ({
-      [_nextState]: dart.definiteFunctionType(dart.void, []),
-      nextInt: dart.definiteFunctionType(core.int, [core.int]),
-      nextDouble: dart.definiteFunctionType(core.double, []),
-      nextBool: dart.definiteFunctionType(core.bool, [])
-    }),
-    sfields: () => ({
-      _POW2_53_D: core.double,
-      _POW2_27_D: core.double,
-      _MASK32: core.int
-    })
-  });
-  math._Random._POW2_53_D = 1.0 * 9007199254740992;
-  math._Random._POW2_27_D = 1.0 * (1 << 27);
-  math._Random._MASK32 = 4294967295;
-  const _buffer$0 = Symbol('_buffer');
-  const _getRandomBytes = Symbol('_getRandomBytes');
-  math._JSSecureRandom = class _JSSecureRandom extends core.Object {
-    new() {
-      this[_buffer$0] = typed_data.ByteData.new(8);
-      let crypto = self.crypto;
-      if (crypto != null) {
-        let getRandomValues = crypto.getRandomValues;
-        if (getRandomValues != null) {
-          return;
-        }
+    static _checkRange(start, end, length) {
+      if (dart.notNull(start) < 0 || dart.notNull(start) > dart.notNull(length)) {
+        dart.throw(new core.RangeError.range(start, 0, length));
       }
-      dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
-    }
-    [_getRandomBytes](start, length) {
-      crypto.getRandomValues(this[_buffer$0][dartx.buffer][dartx.asUint8List](start, length));
-    }
-    nextBool() {
-      this[_getRandomBytes](0, 1);
-      return this[_buffer$0][dartx.getUint8](0)[dartx.isOdd];
-    }
-    nextDouble() {
-      this[_getRandomBytes](1, 7);
-      this[_buffer$0][dartx.setUint8](0, 63);
-      let highByte = this[_buffer$0][dartx.getUint8](1);
-      this[_buffer$0][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
-      let result = dart.notNull(this[_buffer$0][dartx.getFloat64](0)) - 1.0;
-      if ((dart.notNull(highByte) & 16) != 0) {
-        result = result + 1.1102230246251565e-16;
-      }
-      return result;
-    }
-    nextInt(max) {
-      if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
-        dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
-      }
-      let byteCount = 1;
-      if (dart.notNull(max) > 255) {
-        byteCount++;
-        if (dart.notNull(max) > 65535) {
-          byteCount++;
-          if (dart.notNull(max) > 16777215) {
-            byteCount++;
-          }
-        }
-      }
-      this[_buffer$0][dartx.setUint32](0, 0);
-      let start = 4 - byteCount;
-      let randomLimit = dart.asInt(math.pow(256, byteCount));
-      while (true) {
-        this[_getRandomBytes](start, byteCount);
-        let random = this[_buffer$0][dartx.getUint32](0);
-        if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
-          return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
-        }
-        let result = dart.asInt(random[dartx.remainder](max));
-        if (dart.notNull(random) - dart.notNull(result) + dart.notNull(max) < dart.notNull(randomLimit)) {
-          return result;
-        }
-      }
-    }
-  };
-  math._JSSecureRandom[dart.implements] = () => [math.Random];
-  dart.setSignature(math._JSSecureRandom, {
-    constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
-    fields: () => ({[_buffer$0]: typed_data.ByteData}),
-    methods: () => ({
-      [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      nextBool: dart.definiteFunctionType(core.bool, []),
-      nextDouble: dart.definiteFunctionType(core.double, []),
-      nextInt: dart.definiteFunctionType(core.int, [core.int])
-    })
-  });
-  math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
-    static combine(hash, value) {
-      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
-      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
-      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
-    }
-    static finish(hash) {
-      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
-      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
-      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
-    }
-    static hash2(a, b) {
-      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
-    }
-    static hash4(a, b, c, d) {
-      return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
-    }
-  };
-  dart.setSignature(math._JenkinsSmiHash, {
-    statics: () => ({
-      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      finish: dart.definiteFunctionType(core.int, [core.int]),
-      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
-      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['combine', 'finish', 'hash2', 'hash4']
-  });
-  math.Point$ = dart.generic(T => {
-    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
-    class Point extends core.Object {
-      new(x, y) {
-        this.x = x;
-        this.y = y;
-      }
-      toString() {
-        return dart.str`Point(${this.x}, ${this.y})`;
-      }
-      ['=='](other) {
-        if (!PointOfnum().is(other)) return false;
-        return dart.equals(this.x, dart.dload(other, 'x')) && dart.equals(this.y, dart.dload(other, 'y'));
-      }
-      get hashCode() {
-        return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
-      }
-      ['+'](other) {
-        PointOfT()._check(other);
-        return new (PointOfT())(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
-      }
-      ['-'](other) {
-        PointOfT()._check(other);
-        return new (PointOfT())(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
-      }
-      ['*'](factor) {
-        return new (PointOfT())(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
-      }
-      get magnitude() {
-        return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
-      }
-      distanceTo(other) {
-        PointOfT()._check(other);
-        let dx = dart.notNull(this.x) - dart.notNull(other.x);
-        let dy = dart.notNull(this.y) - dart.notNull(other.y);
-        return math.sqrt(dx * dx + dy * dy);
-      }
-      squaredDistanceTo(other) {
-        PointOfT()._check(other);
-        let dx = dart.notNull(this.x) - dart.notNull(other.x);
-        let dy = dart.notNull(this.y) - dart.notNull(other.y);
-        return dx * dx + dy * dy;
-      }
-    }
-    dart.addTypeTests(Point);
-    dart.setSignature(Point, {
-      constructors: () => ({new: dart.definiteFunctionType(math.Point$(T), [T, T])}),
-      fields: () => ({
-        x: T,
-        y: T
-      }),
-      getters: () => ({magnitude: dart.definiteFunctionType(core.double, [])}),
-      methods: () => ({
-        '+': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
-        '-': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
-        '*': dart.definiteFunctionType(math.Point$(T), [core.num]),
-        distanceTo: dart.definiteFunctionType(core.double, [PointOfT()]),
-        squaredDistanceTo: dart.definiteFunctionType(T, [PointOfT()])
-      })
-    });
-    return Point;
-  });
-  math.Point = Point$();
-  let const$82;
-  math.Random = class Random extends core.Object {
-    static new(seed) {
-      if (seed === void 0) seed = null;
-      return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
-    }
-    static secure() {
-      return math.Random._secureRandom;
-    }
-  };
-  dart.setSignature(math.Random, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(math.Random, [], [core.int]),
-      secure: dart.definiteFunctionType(math.Random, [])
-    }),
-    sfields: () => ({_secureRandom: math._JSSecureRandom})
-  });
-  dart.defineLazy(math.Random, {
-    get _secureRandom() {
-      return new math._JSSecureRandom();
-    }
-  });
-  math._RectangleBase$ = dart.generic(T => {
-    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
-    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
-    dart.defineExtensionNames([
-      'right',
-      'bottom',
-      'toString',
-      '==',
-      'hashCode',
-      'intersection',
-      'intersects',
-      'boundingBox',
-      'containsRectangle',
-      'containsPoint',
-      'topLeft',
-      'topRight',
-      'bottomRight',
-      'bottomLeft'
-    ]);
-    class _RectangleBase extends core.Object {
-      new() {
-      }
-      get right() {
-        return dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]);
-      }
-      get bottom() {
-        return dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-      }
-      toString() {
-        return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
-      }
-      ['=='](other) {
-        if (!RectangleOfnum().is(other)) return false;
-        let otherRect = RectangleOfnum().as(other);
-        return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
-      }
-      get hashCode() {
-        return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
-      }
-      intersection(other) {
-        RectangleOfT()._check(other);
-        let x0 = math.max(T)(this[dartx.left], other[dartx.left]);
-        let x1 = math.min(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-        if (dart.notNull(x0) <= dart.notNull(x1)) {
-          let y0 = math.max(T)(this[dartx.top], other[dartx.top]);
-          let y1 = math.min(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-          if (dart.notNull(y0) <= dart.notNull(y1)) {
-            return new (RectangleOfT())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
-          }
-        }
-        return null;
-      }
-      intersects(other) {
-        return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-      }
-      boundingBox(other) {
-        RectangleOfT()._check(other);
-        let right = math.max(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-        let bottom = math.max(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-        let left = math.min(T)(this[dartx.left], other[dartx.left]);
-        let top = math.min(T)(this[dartx.top], other[dartx.top]);
-        return new (RectangleOfT())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
-      }
-      containsRectangle(another) {
-        return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
-      }
-      containsPoint(another) {
-        return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-      }
-      get topLeft() {
-        return new (PointOfT())(this[dartx.left], this[dartx.top]);
-      }
-      get topRight() {
-        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
-      }
-      get bottomRight() {
-        return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-      }
-      get bottomLeft() {
-        return new (PointOfT())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-      }
-    }
-    dart.addTypeTests(_RectangleBase);
-    dart.setSignature(_RectangleBase, {
-      constructors: () => ({new: dart.definiteFunctionType(math._RectangleBase$(T), [])}),
-      getters: () => ({
-        right: dart.definiteFunctionType(T, []),
-        bottom: dart.definiteFunctionType(T, []),
-        topLeft: dart.definiteFunctionType(math.Point$(T), []),
-        topRight: dart.definiteFunctionType(math.Point$(T), []),
-        bottomRight: dart.definiteFunctionType(math.Point$(T), []),
-        bottomLeft: dart.definiteFunctionType(math.Point$(T), [])
-      }),
-      methods: () => ({
-        intersection: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
-        intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-        boundingBox: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
-        containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-        containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
-      })
-    });
-    dart.defineExtensionMembers(_RectangleBase, [
-      'toString',
-      '==',
-      'intersection',
-      'intersects',
-      'boundingBox',
-      'containsRectangle',
-      'containsPoint',
-      'right',
-      'bottom',
-      'hashCode',
-      'topLeft',
-      'topRight',
-      'bottomRight',
-      'bottomLeft'
-    ]);
-    return _RectangleBase;
-  });
-  math._RectangleBase = _RectangleBase();
-  math.Rectangle$ = dart.generic(T => {
-    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
-    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
-    dart.defineExtensionNames([
-      'left',
-      'top',
-      'width',
-      'height'
-    ]);
-    class Rectangle extends math._RectangleBase$(T) {
-      get left() {
-        return this[left$];
-      }
-      set left(value) {
-        super.left = value;
-      }
-      get top() {
-        return this[top$];
-      }
-      set top(value) {
-        super.top = value;
-      }
-      get width() {
-        return this[width$];
-      }
-      set width(value) {
-        super.width = value;
-      }
-      get height() {
-        return this[height$];
-      }
-      set height(value) {
-        super.height = value;
-      }
-      new(left, top, width, height) {
-        this[left$] = left;
-        this[top$] = top;
-        this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
-        this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
-        super.new();
-      }
-      static fromPoints(a, b) {
-        let left = math.min(T)(a.x, b.x);
-        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
-        let top = math.min(T)(a.y, b.y);
-        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
-        return new (RectangleOfT())(left, top, width, height);
-      }
-    }
-    const left$ = Symbol(Rectangle.name + "." + 'left'.toString());
-    const top$ = Symbol(Rectangle.name + "." + 'top'.toString());
-    const width$ = Symbol(Rectangle.name + "." + 'width'.toString());
-    const height$ = Symbol(Rectangle.name + "." + 'height'.toString());
-    dart.setSignature(Rectangle, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(math.Rectangle$(T), [T, T, T, T]),
-        fromPoints: dart.definiteFunctionType(math.Rectangle$(T), [PointOfT(), PointOfT()])
-      }),
-      fields: () => ({
-        left: T,
-        top: T,
-        width: T,
-        height: T
-      })
-    });
-    dart.defineExtensionMembers(Rectangle, ['left', 'top', 'width', 'height']);
-    return Rectangle;
-  });
-  math.Rectangle = Rectangle();
-  const _width = Symbol('_width');
-  const _height = Symbol('_height');
-  math.MutableRectangle$ = dart.generic(T => {
-    let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
-    let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
-    let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
-    class MutableRectangle extends math._RectangleBase$(T) {
-      get left() {
-        return this[left$];
-      }
-      set left(value) {
-        this[left$] = value;
-      }
-      get top() {
-        return this[top$];
-      }
-      set top(value) {
-        this[top$] = value;
-      }
-      new(left, top, width, height) {
-        this[left$] = left;
-        this[top$] = top;
-        this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T)(width) : width;
-        this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T)(height) : height;
-        super.new();
-      }
-      static fromPoints(a, b) {
-        let left = math.min(T)(a.x, b.x);
-        let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
-        let top = math.min(T)(a.y, b.y);
-        let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
-        return new (MutableRectangleOfT())(left, top, width, height);
-      }
-      get width() {
-        return this[_width];
-      }
-      set width(width) {
-        T._check(width);
-        if (dart.notNull(width) < 0) width = math._clampToZero(T)(width);
-        this[_width] = width;
-      }
-      get height() {
-        return this[_height];
-      }
-      set height(height) {
-        T._check(height);
-        if (dart.notNull(height) < 0) height = math._clampToZero(T)(height);
-        this[_height] = height;
-      }
-    }
-    const left$ = Symbol(MutableRectangle.name + "." + 'left'.toString());
-    const top$ = Symbol(MutableRectangle.name + "." + 'top'.toString());
-    MutableRectangle[dart.implements] = () => [RectangleOfT()];
-    dart.setSignature(MutableRectangle, {
-      constructors: () => ({
-        new: dart.definiteFunctionType(math.MutableRectangle$(T), [T, T, T, T]),
-        fromPoints: dart.definiteFunctionType(math.MutableRectangle$(T), [PointOfT(), PointOfT()])
-      }),
-      fields: () => ({
-        left: T,
-        top: T,
-        [_width]: T,
-        [_height]: T
-      }),
-      getters: () => ({
-        width: dart.definiteFunctionType(T, []),
-        height: dart.definiteFunctionType(T, [])
-      }),
-      setters: () => ({
-        width: dart.definiteFunctionType(dart.void, [T]),
-        height: dart.definiteFunctionType(dart.void, [T])
-      })
-    });
-    dart.defineExtensionMembers(MutableRectangle, ['left', 'top', 'width', 'height']);
-    return MutableRectangle;
-  });
-  math.MutableRectangle = MutableRectangle();
-  math._clampToZero = function(T) {
-    return value => {
-      dart.assert(dart.notNull(value) < 0);
-      return -dart.notNull(value) * 0;
-    };
-  };
-  dart.fn(math._clampToZero, TToT());
-  mirrors.MirrorSystem = class MirrorSystem extends core.Object {
-    findLibrary(libraryName) {
-      return this.libraries[dartx.values][dartx.singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
-    }
-    static getName(symbol) {
-      return _js_mirrors.getName(symbol);
-    }
-    static getSymbol(name, library) {
-      if (library === void 0) library = null;
-      return _js_mirrors.getSymbol(name, library);
-    }
-  };
-  dart.setSignature(mirrors.MirrorSystem, {
-    methods: () => ({findLibrary: dart.definiteFunctionType(mirrors.LibraryMirror, [core.Symbol])}),
-    statics: () => ({
-      getName: dart.definiteFunctionType(core.String, [core.Symbol]),
-      getSymbol: dart.definiteFunctionType(core.Symbol, [core.String], [mirrors.LibraryMirror])
-    }),
-    names: ['getName', 'getSymbol']
-  });
-  mirrors.currentMirrorSystem = function() {
-    return mirrors.MirrorSystem._check(_js_mirrors.currentJsMirrorSystem);
-  };
-  dart.fn(mirrors.currentMirrorSystem, VoidToMirrorSystem());
-  mirrors.reflect = function(reflectee) {
-    return _js_mirrors.reflect(reflectee);
-  };
-  dart.lazyFn(mirrors.reflect, () => ObjectToInstanceMirror());
-  mirrors.reflectClass = function(key) {
-    if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
-      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
-    }
-    let tm = mirrors.reflectType(key);
-    if (!mirrors.ClassMirror.is(tm)) {
-      dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
-    }
-    return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
-  };
-  dart.lazyFn(mirrors.reflectClass, () => TypeToClassMirror());
-  mirrors.reflectType = function(key) {
-    if (dart.equals(key, dart.wrapType(dart.dynamic))) {
-      return mirrors.currentMirrorSystem().dynamicType;
-    }
-    return _js_mirrors.reflectType(key);
-  };
-  dart.lazyFn(mirrors.reflectType, () => TypeToTypeMirror());
-  mirrors.Mirror = class Mirror extends core.Object {};
-  mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
-  mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
-  mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
-  mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
-  mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
-  mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
-  mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
-  mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
-  mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
-  mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
-  mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
-  mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
-  mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
-  mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
-  mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
-  mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
-  mirrors.TypeMirror = class TypeMirror extends core.Object {};
-  mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
-  mirrors.ClassMirror = class ClassMirror extends core.Object {};
-  mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
-  mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
-  mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
-  mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
-  mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
-  mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
-  mirrors.MethodMirror = class MethodMirror extends core.Object {};
-  mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
-  mirrors.VariableMirror = class VariableMirror extends core.Object {};
-  mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
-  mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
-  mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
-  mirrors.SourceLocation = class SourceLocation extends core.Object {};
-  mirrors.Comment = class Comment extends core.Object {
-    new(text, trimmedText, isDocComment) {
-      this.text = text;
-      this.trimmedText = trimmedText;
-      this.isDocComment = isDocComment;
-    }
-  };
-  dart.setSignature(mirrors.Comment, {
-    constructors: () => ({new: dart.definiteFunctionType(mirrors.Comment, [core.String, core.String, core.bool])}),
-    fields: () => ({
-      text: core.String,
-      trimmedText: core.String,
-      isDocComment: core.bool
-    })
-  });
-  mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
-    new(opts) {
-      let symbols = opts && 'symbols' in opts ? opts.symbols : null;
-      let targets = opts && 'targets' in opts ? opts.targets : null;
-      let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
-      let override = opts && 'override' in opts ? opts.override : null;
-      this.symbols = symbols;
-      this.targets = targets;
-      this.metaTargets = metaTargets;
-      this.override = override;
-    }
-  };
-  dart.setSignature(mirrors.MirrorsUsed, {
-    constructors: () => ({new: dart.definiteFunctionType(mirrors.MirrorsUsed, [], {symbols: dart.dynamic, targets: dart.dynamic, metaTargets: dart.dynamic, override: dart.dynamic})}),
-    fields: () => ({
-      symbols: dart.dynamic,
-      targets: dart.dynamic,
-      metaTargets: dart.dynamic,
-      override: dart.dynamic
-    })
-  });
-  typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
-  typed_data.TypedData = class TypedData extends core.Object {};
-  const _littleEndian = Symbol('_littleEndian');
-  typed_data.Endianness = class Endianness extends core.Object {
-    _(littleEndian) {
-      this[_littleEndian] = littleEndian;
-    }
-  };
-  dart.defineNamedConstructor(typed_data.Endianness, '_');
-  dart.setSignature(typed_data.Endianness, {
-    constructors: () => ({_: dart.definiteFunctionType(typed_data.Endianness, [core.bool])}),
-    fields: () => ({[_littleEndian]: core.bool}),
-    sfields: () => ({
-      BIG_ENDIAN: typed_data.Endianness,
-      LITTLE_ENDIAN: typed_data.Endianness,
-      HOST_ENDIAN: typed_data.Endianness
-    })
-  });
-  dart.defineLazy(typed_data.Endianness, {
-    get BIG_ENDIAN() {
-      return dart.const(new typed_data.Endianness._(false));
-    },
-    get LITTLE_ENDIAN() {
-      return dart.const(new typed_data.Endianness._(true));
-    },
-    get HOST_ENDIAN() {
-      return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[dartx.buffer])[dartx.getInt8](0) == 1 ? typed_data.Endianness.LITTLE_ENDIAN : typed_data.Endianness.BIG_ENDIAN;
-    }
-  });
-  typed_data.ByteData = class ByteData extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeByteData.new(length);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asByteData](offsetInBytes, length);
-    }
-  };
-  typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
-  dart.setSignature(typed_data.ByteData, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.ByteData, [core.int]),
-      view: dart.definiteFunctionType(typed_data.ByteData, [typed_data.ByteBuffer], [core.int, core.int])
-    })
-  });
-  typed_data.Int8List = class Int8List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeInt8List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt8List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asInt8List](offsetInBytes, length);
-    }
-  };
-  typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Int8List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int8List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Int8List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Int8List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Int8List.BYTES_PER_ELEMENT = 1;
-  typed_data.Uint8List = class Uint8List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeUint8List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint8List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asUint8List](offsetInBytes, length);
-    }
-  };
-  typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Uint8List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Uint8List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Uint8List.BYTES_PER_ELEMENT = 1;
-  typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeUint8ClampedList.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint8ClampedList.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asUint8ClampedList](offsetInBytes, length);
-    }
-  };
-  typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Uint8ClampedList, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Uint8ClampedList, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Uint8ClampedList, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Uint8ClampedList, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Uint8ClampedList.BYTES_PER_ELEMENT = 1;
-  typed_data.Int16List = class Int16List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeInt16List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt16List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asInt16List](offsetInBytes, length);
-    }
-  };
-  typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Int16List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int16List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Int16List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Int16List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Int16List.BYTES_PER_ELEMENT = 2;
-  typed_data.Uint16List = class Uint16List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeUint16List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint16List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asUint16List](offsetInBytes, length);
-    }
-  };
-  typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Uint16List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Uint16List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Uint16List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Uint16List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Uint16List.BYTES_PER_ELEMENT = 2;
-  typed_data.Int32List = class Int32List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeInt32List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt32List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asInt32List](offsetInBytes, length);
-    }
-  };
-  typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Int32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int32List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Int32List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Int32List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Int32List.BYTES_PER_ELEMENT = 4;
-  typed_data.Uint32List = class Uint32List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeUint32List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeUint32List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asUint32List](offsetInBytes, length);
-    }
-  };
-  typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Uint32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Uint32List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Uint32List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Uint32List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Uint32List.BYTES_PER_ELEMENT = 4;
-  typed_data.Int64List = class Int64List extends core.Object {
-    static new(length) {
-      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
-    }
-    static fromList(elements) {
-      dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asInt64List](offsetInBytes, length);
-    }
-  };
-  typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Int64List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int64List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Int64List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Int64List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Int64List.BYTES_PER_ELEMENT = 8;
-  typed_data.Uint64List = class Uint64List extends core.Object {
-    static new(length) {
-      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
-    }
-    static fromList(elements) {
-      dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asUint64List](offsetInBytes, length);
-    }
-  };
-  typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
-  dart.setSignature(typed_data.Uint64List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Uint64List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Uint64List, [ListOfint()]),
-      view: dart.definiteFunctionType(typed_data.Uint64List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Uint64List.BYTES_PER_ELEMENT = 8;
-  typed_data.Float32List = class Float32List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeFloat32List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat32List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asFloat32List](offsetInBytes, length);
-    }
-  };
-  typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
-  dart.setSignature(typed_data.Float32List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float32List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Float32List, [ListOfdouble()]),
-      view: dart.definiteFunctionType(typed_data.Float32List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Float32List.BYTES_PER_ELEMENT = 4;
-  typed_data.Float64List = class Float64List extends core.Object {
-    static new(length) {
-      return _native_typed_data.NativeFloat64List.new(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat64List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asFloat64List](offsetInBytes, length);
-    }
-  };
-  typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
-  dart.setSignature(typed_data.Float64List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float64List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Float64List, [ListOfdouble()]),
-      view: dart.definiteFunctionType(typed_data.Float64List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Float64List.BYTES_PER_ELEMENT = 8;
-  typed_data.Float32x4List = class Float32x4List extends core.Object {
-    static new(length) {
-      return new _native_typed_data.NativeFloat32x4List(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat32x4List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asFloat32x4List](offsetInBytes, length);
-    }
-  };
-  typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
-  dart.setSignature(typed_data.Float32x4List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float32x4List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Float32x4List, [ListOfFloat32x4()]),
-      view: dart.definiteFunctionType(typed_data.Float32x4List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Float32x4List.BYTES_PER_ELEMENT = 16;
-  typed_data.Int32x4List = class Int32x4List extends core.Object {
-    static new(length) {
-      return new _native_typed_data.NativeInt32x4List(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeInt32x4List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asInt32x4List](offsetInBytes, length);
-    }
-  };
-  typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
-  dart.setSignature(typed_data.Int32x4List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Int32x4List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Int32x4List, [ListOfInt32x4()]),
-      view: dart.definiteFunctionType(typed_data.Int32x4List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Int32x4List.BYTES_PER_ELEMENT = 16;
-  typed_data.Float64x2List = class Float64x2List extends core.Object {
-    static new(length) {
-      return new _native_typed_data.NativeFloat64x2List(length);
-    }
-    static fromList(elements) {
-      return _native_typed_data.NativeFloat64x2List.fromList(elements);
-    }
-    static view(buffer, offsetInBytes, length) {
-      if (offsetInBytes === void 0) offsetInBytes = 0;
-      if (length === void 0) length = null;
-      return buffer[dartx.asFloat64x2List](offsetInBytes, length);
-    }
-  };
-  typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
-  dart.setSignature(typed_data.Float64x2List, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(typed_data.Float64x2List, [core.int]),
-      fromList: dart.definiteFunctionType(typed_data.Float64x2List, [ListOfFloat64x2()]),
-      view: dart.definiteFunctionType(typed_data.Float64x2List, [typed_data.ByteBuffer], [core.int, core.int])
-    }),
-    sfields: () => ({BYTES_PER_ELEMENT: core.int})
-  });
-  typed_data.Float64x2List.BYTES_PER_ELEMENT = 16;
-  indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
-    static createKeyRange_only(value) {
-      return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
-    }
-    static createKeyRange_lowerBound(bound, open) {
-      if (open === void 0) open = false;
-      return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
-    }
-    static createKeyRange_upperBound(bound, open) {
-      if (open === void 0) open = false;
-      return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
-    }
-    static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
-      if (lowerOpen === void 0) lowerOpen = false;
-      if (upperOpen === void 0) upperOpen = false;
-      return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
-    }
-    static _class() {
-      if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
-      return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
-    }
-    static _uncachedClass() {
-      return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
-    }
-    static _translateKey(idbkey) {
-      return idbkey;
-    }
-    static _only(cls, value) {
-      return cls.only(value);
-    }
-    static _lowerBound(cls, bound, open) {
-      return cls.lowerBound(bound, open);
-    }
-    static _upperBound(cls, bound, open) {
-      return cls.upperBound(bound, open);
-    }
-    static _bound(cls, lower, upper, lowerOpen, upperOpen) {
-      return cls.bound(lower, upper, lowerOpen, upperOpen);
-    }
-  };
-  dart.setSignature(indexed_db._KeyRangeFactoryProvider, {
-    sfields: () => ({_cachedClass: dart.dynamic}),
-    statics: () => ({
-      createKeyRange_only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
-      createKeyRange_lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
-      createKeyRange_upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
-      createKeyRange_bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
-      _class: dart.definiteFunctionType(dart.dynamic, []),
-      _uncachedClass: dart.definiteFunctionType(dart.dynamic, []),
-      _translateKey: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic]),
-      _lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['createKeyRange_only', 'createKeyRange_lowerBound', 'createKeyRange_upperBound', 'createKeyRange_bound', '_class', '_uncachedClass', '_translateKey', '_only', '_lowerBound', '_upperBound', '_bound']
-  });
-  indexed_db._KeyRangeFactoryProvider._cachedClass = null;
-  indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
-    function containsDate(object) {
-      if (dart.test(html_common.isJavaScriptDate(object))) return true;
-      if (core.List.is(object)) {
-        for (let i = 0; i < dart.notNull(object[dartx.length]); i++) {
-          if (dart.test(containsDate(object[dartx._get](i)))) return true;
-        }
-      }
-      return false;
-    }
-    dart.fn(containsDate, dynamicTobool$());
-    if (dart.test(containsDate(nativeKey))) {
-      dart.throw(new core.UnimplementedError('Key containing DateTime'));
-    }
-    return nativeKey;
-  };
-  dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
-  indexed_db._convertDartToNative_IDBKey = function(dartKey) {
-    return dartKey;
-  };
-  dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
-  indexed_db._convertNativeToDart_IDBAny = function(object) {
-    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
-  };
-  dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
-  indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
-  indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
-  indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
-  const _delete$ = Symbol('_delete');
-  const _update = Symbol('_update');
-  const _update_1 = Symbol('_update_1');
-  dart.defineExtensionNames([
-    'delete',
-    'update',
-    'next',
-    'advance',
-    'continuePrimaryKey',
-    'direction',
-    'key',
-    'primaryKey',
-    'source'
-  ]);
-  indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
-    [dartx.delete]() {
-      try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_delete$]());
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.update](value) {
-      try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_update](value));
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.next](key) {
-      if (key === void 0) key = null;
-      if (key == null) {
-        this.continue();
-      } else {
-        this.continue(key);
-      }
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.direction]() {
-      return this.direction;
-    }
-    get [dartx.key]() {
-      return this.key;
-    }
-    get [dartx.primaryKey]() {
-      return this.primaryKey;
-    }
-    get [dartx.source]() {
-      return this.source;
-    }
-    [dartx.advance](...args) {
-      return this.advance.apply(this, args);
-    }
-    [dartx.continuePrimaryKey](...args) {
-      return this.continuePrimaryKey.apply(this, args);
-    }
-    [_delete$](...args) {
-      return this.delete.apply(this, args);
-    }
-    [_update](value) {
-      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
-      return this[_update_1](value_1);
-    }
-    [_update_1](...args) {
-      return this.update.apply(this, args);
-    }
-  };
-  dart.setSignature(indexed_db.Cursor, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Cursor, [])}),
-    fields: () => ({
-      [dartx.direction]: core.String,
-      [dartx.key]: core.Object,
-      [dartx.primaryKey]: core.Object,
-      [dartx.source]: core.Object
-    }),
-    methods: () => ({
-      [dartx.delete]: dart.definiteFunctionType(async.Future, []),
-      [dartx.update]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
-      [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
-      [_delete$]: dart.definiteFunctionType(indexed_db.Request, []),
-      [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-      [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.IDBCursor, indexed_db.Cursor);
-  const _get_value = Symbol('_get_value');
-  dart.defineExtensionNames([
-    'value'
-  ]);
-  indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.value]() {
-      return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
-    }
-    get [_get_value]() {
-      return this.value;
-    }
-  };
-  dart.setSignature(indexed_db.CursorWithValue, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.CursorWithValue, [])}),
-    fields: () => ({[_get_value]: dart.dynamic}),
-    getters: () => ({[dartx.value]: dart.definiteFunctionType(dart.dynamic, [])})
-  });
-  dart.registerExtension(dart.global.IDBCursorWithValue, indexed_db.CursorWithValue);
-  const _createObjectStore = Symbol('_createObjectStore');
-  const _transaction = Symbol('_transaction');
-  const _createObjectStore_1 = Symbol('_createObjectStore_1');
-  const _createObjectStore_2 = Symbol('_createObjectStore_2');
-  const _addEventListener = Symbol('_addEventListener');
-  const _removeEventListener = Symbol('_removeEventListener');
-  dart.defineExtensionNames([
-    'on',
-    'addEventListener',
-    'removeEventListener',
-    'dispatchEvent'
-  ]);
-  html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
-    _created() {
-      super.new();
-    }
-    get [dartx.on]() {
-      return new html$.Events(this);
-    }
-    [dartx.addEventListener](type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      if (listener != null) {
-        this[_addEventListener](type, listener, useCapture);
-      }
-    }
-    [dartx.removeEventListener](type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      if (listener != null) {
-        this[_removeEventListener](type, listener, useCapture);
-      }
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_addEventListener](...args) {
-      return this.addEventListener.apply(this, args);
-    }
-    [dartx.dispatchEvent](...args) {
-      return this.dispatchEvent.apply(this, args);
-    }
-    [_removeEventListener](...args) {
-      return this.removeEventListener.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.EventTarget, '_created');
-  dart.setSignature(html$.EventTarget, {
-    constructors: () => ({
-      _created: dart.definiteFunctionType(html$.EventTarget, []),
-      _: dart.definiteFunctionType(html$.EventTarget, [])
-    }),
-    getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
-    methods: () => ({
-      [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
-      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
-    })
-  });
-  dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
-  dart.defineExtensionNames([
-    'createObjectStore',
-    'transaction',
-    'transactionStore',
-    'transactionList',
-    'transactionStores',
-    'close',
-    'deleteObjectStore',
-    'onAbort',
-    'onClose',
-    'onError',
-    'onVersionChange',
-    'name',
-    'objectStoreNames',
-    'version'
-  ]);
-  indexed_db.Database = class Database extends html$.EventTarget {
-    [dartx.createObjectStore](name, opts) {
-      let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
-      let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
-      let options = dart.map();
-      if (keyPath != null) {
-        options[dartx._set]('keyPath', keyPath);
-      }
-      if (autoIncrement != null) {
-        options[dartx._set]('autoIncrement', autoIncrement);
-      }
-      return this[_createObjectStore](name, options);
-    }
-    [dartx.transaction](storeName_OR_storeNames, mode) {
-      if (mode != 'readonly' && mode != 'readwrite') {
-        dart.throw(new core.ArgumentError(mode));
-      }
-      return this[_transaction](storeName_OR_storeNames, mode);
-    }
-    [dartx.transactionStore](storeName, mode) {
-      if (mode != 'readonly' && mode != 'readwrite') {
-        dart.throw(new core.ArgumentError(mode));
-      }
-      return this[_transaction](storeName, mode);
-    }
-    [dartx.transactionList](storeNames, mode) {
-      if (mode != 'readonly' && mode != 'readwrite') {
-        dart.throw(new core.ArgumentError(mode));
-      }
-      let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
-      return this[_transaction](storeNames_1, mode);
-    }
-    [dartx.transactionStores](storeNames, mode) {
-      if (mode != 'readonly' && mode != 'readwrite') {
-        dart.throw(new core.ArgumentError(mode));
-      }
-      return this[_transaction](storeNames, mode);
-    }
-    [_transaction](...args) {
-      return this.transaction.apply(this, args);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.objectStoreNames]() {
-      return this.objectStoreNames;
-    }
-    get [dartx.version]() {
-      return this.version;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [_createObjectStore](name, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_createObjectStore_1](name, options_1);
-      }
-      return this[_createObjectStore_2](name);
-    }
-    [_createObjectStore_1](...args) {
-      return this.createObjectStore.apply(this, args);
-    }
-    [_createObjectStore_2](...args) {
-      return this.createObjectStore.apply(this, args);
-    }
-    [dartx.deleteObjectStore](...args) {
-      return this.deleteObjectStore.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return indexed_db.Database.abortEvent.forTarget(this);
-    }
-    get [dartx.onClose]() {
-      return indexed_db.Database.closeEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return indexed_db.Database.errorEvent.forTarget(this);
-    }
-    get [dartx.onVersionChange]() {
-      return indexed_db.Database.versionChangeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(indexed_db.Database, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Database, [])}),
-    fields: () => ({
-      [dartx.name]: core.String,
-      [dartx.objectStoreNames]: ListOfString(),
-      [dartx.version]: core.Object
-    }),
-    getters: () => ({
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
-    }),
-    methods: () => ({
-      [dartx.createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], {keyPath: core.String, autoIncrement: core.bool}),
-      [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
-      [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
-      [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
-      [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
-      [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
-      [_createObjectStore_1]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
-      [_createObjectStore_2]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic]),
-      [dartx.deleteObjectStore]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfEvent(),
-      closeEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      versionChangeEvent: EventStreamProviderOfVersionChangeEvent()
-    })
-  });
-  dart.defineLazy(indexed_db.Database, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('abort'));
-    },
-    get closeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('close'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get versionChangeEvent() {
-      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('versionchange'));
-    }
-  });
-  dart.registerExtension(dart.global.IDBDatabase, indexed_db.Database);
-  const _open = Symbol('_open');
-  const _deleteDatabase = Symbol('_deleteDatabase');
-  const _webkitGetDatabaseNames = Symbol('_webkitGetDatabaseNames');
-  dart.defineExtensionNames([
-    'open',
-    'deleteDatabase',
-    'getDatabaseNames',
-    'supportsDatabaseNames',
-    'cmp'
-  ]);
-  indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
-    static get supported() {
-      return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
-    }
-    [dartx.open](name, opts) {
-      let version = opts && 'version' in opts ? opts.version : null;
-      let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
-      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
-      if (version == null != (onUpgradeNeeded == null)) {
-        return FutureOfDatabase().error(new core.ArgumentError('version and onUpgradeNeeded must be specified together'));
-      }
-      try {
-        let request = null;
-        if (version != null) {
-          request = this[_open](name, version);
-        } else {
-          request = this[_open](name);
-        }
-        if (onUpgradeNeeded != null) {
-          dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', onUpgradeNeeded);
-        }
-        if (onBlocked != null) {
-          dart.dsend(dart.dload(request, 'onBlocked'), 'listen', onBlocked);
-        }
-        return indexed_db._completeRequest(indexed_db.Database)(indexed_db.Request._check(request));
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return FutureOfDatabase().error(e, stacktrace);
-      }
-
-    }
-    [dartx.deleteDatabase](name, opts) {
-      let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
-      try {
-        let request = this[_deleteDatabase](name);
-        if (onBlocked != null) {
-          request[dartx.onBlocked].listen(onBlocked);
-        }
-        let completer = CompleterOfIdbFactory().sync();
-        request[dartx.onSuccess].listen(dart.fn(e => {
-          completer.complete(this);
-        }, EventToNull()));
-        request[dartx.onError].listen(dart.bind(completer, 'completeError'));
-        return completer.future;
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return FutureOfIdbFactory().error(e, stacktrace);
-      }
-
-    }
-    [dartx.getDatabaseNames]() {
-      try {
-        let request = this[_webkitGetDatabaseNames]();
-        return indexed_db._completeRequest(ListOfString())(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return FutureOfListOfString().error(e, stacktrace);
-      }
-
-    }
-    get [dartx.supportsDatabaseNames]() {
-      return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.cmp](...args) {
-      return this.cmp.apply(this, args);
-    }
-    [_deleteDatabase](...args) {
-      return this.deleteDatabase.apply(this, args);
-    }
-    [_open](...args) {
-      return this.open.apply(this, args);
-    }
-    [_webkitGetDatabaseNames](...args) {
-      return this.webkitGetDatabaseNames.apply(this, args);
-    }
-  };
-  dart.setSignature(indexed_db.IdbFactory, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.IdbFactory, [])}),
-    getters: () => ({[dartx.supportsDatabaseNames]: dart.definiteFunctionType(core.bool, [])}),
-    methods: () => ({
-      [dartx.open]: dart.definiteFunctionType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dynamicTovoid(), onBlocked: dynamicTovoid()}),
-      [dartx.deleteDatabase]: dart.definiteFunctionType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: EventTovoid()}),
-      [dartx.getDatabaseNames]: dart.definiteFunctionType(async.Future$(core.List$(core.String)), []),
-      [dartx.cmp]: dart.definiteFunctionType(core.int, [core.Object, core.Object]),
-      [_deleteDatabase]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String]),
-      [_open]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String], [core.int]),
-      [_webkitGetDatabaseNames]: dart.definiteFunctionType(indexed_db.Request, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.IDBFactory, indexed_db.IdbFactory);
-  indexed_db._completeRequest = function(T) {
-    return request => {
-      let completer = async.Completer$(T).sync();
-      request[dartx.onSuccess].listen(dart.fn(e => {
-        let result = indexed_db._cast(T)(request[dartx.result]);
-        completer.complete(result);
-      }, EventToNull()));
-      request[dartx.onError].listen(dart.bind(completer, 'completeError'));
-      return completer.future;
-    };
-  };
-  dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
-  const _count$0 = Symbol('_count');
-  const _get$ = Symbol('_get');
-  const _getKey$ = Symbol('_getKey');
-  const _openCursor = Symbol('_openCursor');
-  const _openKeyCursor = Symbol('_openKeyCursor');
-  dart.defineExtensionNames([
-    'count',
-    'get',
-    'getKey',
-    'openCursor',
-    'openKeyCursor',
-    'getAll',
-    'getAllKeys',
-    'keyPath',
-    'multiEntry',
-    'name',
-    'objectStore',
-    'unique'
-  ]);
-  indexed_db.Index = class Index extends _interceptors.Interceptor {
-    [dartx.count](key_OR_range) {
-      if (key_OR_range === void 0) key_OR_range = null;
-      try {
-        let request = this[_count$0](key_OR_range);
-        return indexed_db._completeRequest(core.int)(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return FutureOfint().error(e, stacktrace);
-      }
-
-    }
-    [dartx.get](key) {
-      try {
-        let request = this[_get$](key);
-        return indexed_db._completeRequest(dart.dynamic)(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.getKey](key) {
-      try {
-        let request = this[_getKey$](key);
-        return indexed_db._completeRequest(dart.dynamic)(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.openCursor](opts) {
-      let key = opts && 'key' in opts ? opts.key : null;
-      let range = opts && 'range' in opts ? opts.range : null;
-      let direction = opts && 'direction' in opts ? opts.direction : null;
-      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
-      let key_OR_range = null;
-      if (key != null) {
-        if (range != null) {
-          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
-        }
-        key_OR_range = key;
-      } else {
-        key_OR_range = range;
-      }
-      let request = null;
-      if (direction == null) {
-        request = this[_openCursor](key_OR_range, "next");
-      } else {
-        request = this[_openCursor](key_OR_range, direction);
-      }
-      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
-    }
-    [dartx.openKeyCursor](opts) {
-      let key = opts && 'key' in opts ? opts.key : null;
-      let range = opts && 'range' in opts ? opts.range : null;
-      let direction = opts && 'direction' in opts ? opts.direction : null;
-      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
-      let key_OR_range = null;
-      if (key != null) {
-        if (range != null) {
-          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
-        }
-        key_OR_range = key;
-      } else {
-        key_OR_range = range;
-      }
-      let request = null;
-      if (direction == null) {
-        request = this[_openKeyCursor](key_OR_range, "next");
-      } else {
-        request = this[_openKeyCursor](key_OR_range, direction);
-      }
-      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor)(indexed_db.Request._check(request), autoAdvance);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.keyPath]() {
-      return this.keyPath;
-    }
-    get [dartx.multiEntry]() {
-      return this.multiEntry;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.objectStore]() {
-      return this.objectStore;
-    }
-    get [dartx.unique]() {
-      return this.unique;
-    }
-    [_count$0](...args) {
-      return this.count.apply(this, args);
-    }
-    [_get$](...args) {
-      return this.get.apply(this, args);
-    }
-    [dartx.getAll](...args) {
-      return this.getAll.apply(this, args);
-    }
-    [dartx.getAllKeys](...args) {
-      return this.getAllKeys.apply(this, args);
-    }
-    [_getKey$](...args) {
-      return this.getKey.apply(this, args);
-    }
-    [_openCursor](...args) {
-      return this.openCursor.apply(this, args);
-    }
-    [_openKeyCursor](...args) {
-      return this.openKeyCursor.apply(this, args);
-    }
-  };
-  dart.setSignature(indexed_db.Index, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Index, [])}),
-    fields: () => ({
-      [dartx.keyPath]: core.Object,
-      [dartx.multiEntry]: core.bool,
-      [dartx.name]: core.String,
-      [dartx.objectStore]: indexed_db.ObjectStore,
-      [dartx.unique]: core.bool
-    }),
-    methods: () => ({
-      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
-      [dartx.get]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
-      [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
-      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
-      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
-      [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
-      [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.IDBIndex, indexed_db.Index);
-  dart.defineExtensionNames([
-    'lower',
-    'lowerOpen',
-    'upper',
-    'upperOpen'
-  ]);
-  indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
-    static only(value) {
-      return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
-    }
-    static lowerBound(bound, open) {
-      if (open === void 0) open = false;
-      return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
-    }
-    static upperBound(bound, open) {
-      if (open === void 0) open = false;
-      return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
-    }
-    static bound(lower, upper, lowerOpen, upperOpen) {
-      if (lowerOpen === void 0) lowerOpen = false;
-      if (upperOpen === void 0) upperOpen = false;
-      return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.lower]() {
-      return this.lower;
-    }
-    get [dartx.lowerOpen]() {
-      return this.lowerOpen;
-    }
-    get [dartx.upper]() {
-      return this.upper;
-    }
-    get [dartx.upperOpen]() {
-      return this.upperOpen;
-    }
-  };
-  dart.setSignature(indexed_db.KeyRange, {
-    constructors: () => ({
-      only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
-      lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
-      upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
-      bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
-      _: dart.definiteFunctionType(indexed_db.KeyRange, [])
-    }),
-    fields: () => ({
-      [dartx.lower]: core.Object,
-      [dartx.lowerOpen]: core.bool,
-      [dartx.upper]: core.Object,
-      [dartx.upperOpen]: core.bool
-    }),
-    statics: () => ({
-      bound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object, core.Object], [core.bool, core.bool]),
-      lowerBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool]),
-      only_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object]),
-      upperBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool])
-    }),
-    names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
-  });
-  dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
-  const _add$3 = Symbol('_add');
-  const _clear$0 = Symbol('_clear');
-  const _put = Symbol('_put');
-  const _createIndex = Symbol('_createIndex');
-  const _add_1 = Symbol('_add_1');
-  const _add_2 = Symbol('_add_2');
-  const _createIndex_1 = Symbol('_createIndex_1');
-  const _createIndex_2 = Symbol('_createIndex_2');
-  const _put_1 = Symbol('_put_1');
-  const _put_2 = Symbol('_put_2');
-  dart.defineExtensionNames([
-    'add',
-    'clear',
-    'delete',
-    'count',
-    'put',
-    'getObject',
-    'openCursor',
-    'createIndex',
-    'deleteIndex',
-    'getAll',
-    'getAllKeys',
-    'index',
-    'openKeyCursor',
-    'autoIncrement',
-    'indexNames',
-    'keyPath',
-    'name',
-    'transaction'
-  ]);
-  indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
-    [dartx.add](value, key) {
-      if (key === void 0) key = null;
-      try {
-        let request = null;
-        if (key != null) {
-          request = this[_add$3](value, key);
-        } else {
-          request = this[_add$3](value);
-        }
-        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.clear]() {
-      try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.delete](key_OR_keyRange) {
-      try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_delete$](key_OR_keyRange));
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.count](key_OR_range) {
-      if (key_OR_range === void 0) key_OR_range = null;
-      try {
-        let request = this[_count$0](key_OR_range);
-        return indexed_db._completeRequest(core.int)(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return FutureOfint().error(e, stacktrace);
-      }
-
-    }
-    [dartx.put](value, key) {
-      if (key === void 0) key = null;
-      try {
-        let request = null;
-        if (key != null) {
-          request = this[_put](value, key);
-        } else {
-          request = this[_put](value);
-        }
-        return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.getObject](key) {
-      try {
-        let request = this[_get$](key);
-        return indexed_db._completeRequest(dart.dynamic)(request);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        return async.Future.error(e, stacktrace);
-      }
-
-    }
-    [dartx.openCursor](opts) {
-      let key = opts && 'key' in opts ? opts.key : null;
-      let range = opts && 'range' in opts ? opts.range : null;
-      let direction = opts && 'direction' in opts ? opts.direction : null;
-      let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
-      let key_OR_range = null;
-      if (key != null) {
-        if (range != null) {
-          dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
-        }
-        key_OR_range = key;
-      } else {
-        key_OR_range = range;
-      }
-      let request = null;
-      if (direction == null) {
-        request = this[_openCursor](key_OR_range);
-      } else {
-        request = this[_openCursor](key_OR_range, direction);
-      }
-      return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
-    }
-    [dartx.createIndex](name, keyPath, opts) {
-      let unique = opts && 'unique' in opts ? opts.unique : null;
-      let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
-      let options = dart.map();
-      if (unique != null) {
-        options[dartx._set]('unique', unique);
-      }
-      if (multiEntry != null) {
-        options[dartx._set]('multiEntry', multiEntry);
-      }
-      return this[_createIndex](name, keyPath, options);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.autoIncrement]() {
-      return this.autoIncrement;
-    }
-    get [dartx.indexNames]() {
-      return this.indexNames;
-    }
-    get [dartx.keyPath]() {
-      return this.keyPath;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.transaction]() {
-      return this.transaction;
-    }
-    [_add$3](value, key) {
-      if (key === void 0) key = null;
-      if (key != null) {
-        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
-        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
-        return this[_add_1](value_1, key_2);
-      }
-      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
-      return this[_add_2](value_1);
-    }
-    [_add_1](...args) {
-      return this.add.apply(this, args);
-    }
-    [_add_2](...args) {
-      return this.add.apply(this, args);
-    }
-    [_clear$0](...args) {
-      return this.clear.apply(this, args);
-    }
-    [_count$0](...args) {
-      return this.count.apply(this, args);
-    }
-    [_createIndex](name, keyPath, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_createIndex_1](name, keyPath, options_1);
-      }
-      return this[_createIndex_2](name, keyPath);
-    }
-    [_createIndex_1](...args) {
-      return this.createIndex.apply(this, args);
-    }
-    [_createIndex_2](...args) {
-      return this.createIndex.apply(this, args);
-    }
-    [_delete$](...args) {
-      return this.delete.apply(this, args);
-    }
-    [dartx.deleteIndex](...args) {
-      return this.deleteIndex.apply(this, args);
-    }
-    [_get$](...args) {
-      return this.get.apply(this, args);
-    }
-    [dartx.getAll](...args) {
-      return this.getAll.apply(this, args);
-    }
-    [dartx.getAllKeys](...args) {
-      return this.getAllKeys.apply(this, args);
-    }
-    [dartx.index](...args) {
-      return this.index.apply(this, args);
-    }
-    [_openCursor](...args) {
-      return this.openCursor.apply(this, args);
-    }
-    [dartx.openKeyCursor](...args) {
-      return this.openKeyCursor.apply(this, args);
-    }
-    [_put](value, key) {
-      if (key === void 0) key = null;
-      if (key != null) {
-        let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
-        let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
-        return this[_put_1](value_1, key_2);
-      }
-      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
-      return this[_put_2](value_1);
-    }
-    [_put_1](...args) {
-      return this.put.apply(this, args);
-    }
-    [_put_2](...args) {
-      return this.put.apply(this, args);
-    }
-    static _cursorStreamFromResult(T) {
-      return (request, autoAdvance) => {
-        let controller = async.StreamController$(T).new({sync: true});
-        request[dartx.onError].listen(dart.bind(controller, 'addError'));
-        request[dartx.onSuccess].listen(dart.fn(e => {
-          let cursor = indexed_db._cast(T)(request[dartx.result]);
-          if (cursor == null) {
-            controller.close();
-          } else {
-            controller.add(cursor);
-            if (autoAdvance == true && dart.test(controller.hasListener)) {
-              cursor[dartx.next]();
-            }
-          }
-        }, EventToNull()));
-        return controller.stream;
-      };
-    }
-  };
-  dart.setSignature(indexed_db.ObjectStore, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.ObjectStore, [])}),
-    fields: () => ({
-      [dartx.autoIncrement]: core.bool,
-      [dartx.indexNames]: ListOfString(),
-      [dartx.keyPath]: core.Object,
-      [dartx.name]: core.String,
-      [dartx.transaction]: indexed_db.Transaction
-    }),
-    methods: () => ({
-      [dartx.add]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
-      [dartx.clear]: dart.definiteFunctionType(async.Future, []),
-      [dartx.delete]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
-      [dartx.put]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
-      [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
-      [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
-      [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
-      [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
-      [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-      [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
-      [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
-      [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
-      [_delete$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-      [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
-      [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
-      [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
-      [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
-      [dartx.openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
-      [_put]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
-      [_put_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
-      [_put_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
-    }),
-    statics: () => ({_cursorStreamFromResult: dart.definiteFunctionType(T => [async.Stream$(T), [indexed_db.Request, core.bool]])}),
-    names: ['_cursorStreamFromResult']
-  });
-  dart.registerExtension(dart.global.IDBObjectStore, indexed_db.ObjectStore);
-  indexed_db._cast = function(To) {
-    return x => {
-      return To._check(x);
-    };
-  };
-  dart.fn(indexed_db._cast, dynamicToTo());
-  const _get_result = Symbol('_get_result');
-  dart.defineExtensionNames([
-    'result',
-    'onError',
-    'onSuccess',
-    'error',
-    'readyState',
-    'source',
-    'transaction'
-  ]);
-  indexed_db.Request = class Request extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.result]() {
-      return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
-    }
-    get [_get_result]() {
-      return this.result;
-    }
-    get [dartx.source]() {
-      return this.source;
-    }
-    get [dartx.transaction]() {
-      return this.transaction;
-    }
-    get [dartx.onError]() {
-      return indexed_db.Request.errorEvent.forTarget(this);
-    }
-    get [dartx.onSuccess]() {
-      return indexed_db.Request.successEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(indexed_db.Request, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
-    fields: () => ({
-      [dartx.error]: html$.DomError,
-      [dartx.readyState]: core.String,
-      [_get_result]: dart.dynamic,
-      [dartx.source]: core.Object,
-      [dartx.transaction]: indexed_db.Transaction
-    }),
-    getters: () => ({
-      [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    sfields: () => ({
-      errorEvent: EventStreamProviderOfEvent(),
-      successEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(indexed_db.Request, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get successEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('success'));
-    }
-  });
-  dart.registerExtension(dart.global.IDBRequest, indexed_db.Request);
-  dart.defineExtensionNames([
-    'onBlocked',
-    'onUpgradeNeeded'
-  ]);
-  indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.onBlocked]() {
-      return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
-    }
-    get [dartx.onUpgradeNeeded]() {
-      return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(indexed_db.OpenDBRequest, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
-    getters: () => ({
-      [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
-    }),
-    sfields: () => ({
-      blockedEvent: EventStreamProviderOfEvent(),
-      upgradeNeededEvent: EventStreamProviderOfVersionChangeEvent()
-    })
-  });
-  dart.defineLazy(indexed_db.OpenDBRequest, {
-    get blockedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('blocked'));
-    },
-    get upgradeNeededEvent() {
-      return dart.const(new (EventStreamProviderOfVersionChangeEvent())('upgradeneeded'));
-    }
-  });
-  dart.registerExtension(dart.global.IDBOpenDBRequest, indexed_db.OpenDBRequest);
-  dart.registerExtension(dart.global.IDBVersionChangeRequest, indexed_db.OpenDBRequest);
-  dart.defineExtensionNames([
-    'completed',
-    'abort',
-    'objectStore',
-    'onAbort',
-    'onComplete',
-    'onError',
-    'db',
-    'error',
-    'mode',
-    'objectStoreNames'
-  ]);
-  indexed_db.Transaction = class Transaction extends html$.EventTarget {
-    get [dartx.completed]() {
-      let completer = CompleterOfDatabase().new();
-      this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
-        completer.complete(this[dartx.db]);
-      }, EventToNull()));
-      this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
-        completer.completeError(e);
-      }, EventToNull()));
-      this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
-        if (!dart.test(completer.isCompleted)) {
-          completer.completeError(e);
-        }
-      }, EventToNull()));
-      return completer.future;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.db]() {
-      return this.db;
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.mode]() {
-      return this.mode;
-    }
-    get [dartx.objectStoreNames]() {
-      return this.objectStoreNames;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.objectStore](...args) {
-      return this.objectStore.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return indexed_db.Transaction.abortEvent.forTarget(this);
-    }
-    get [dartx.onComplete]() {
-      return indexed_db.Transaction.completeEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return indexed_db.Transaction.errorEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(indexed_db.Transaction, {
-    constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
-    fields: () => ({
-      [dartx.db]: indexed_db.Database,
-      [dartx.error]: html$.DomError,
-      [dartx.mode]: core.String,
-      [dartx.objectStoreNames]: ListOfString()
-    }),
-    getters: () => ({
-      [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.objectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfEvent(),
-      completeEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(indexed_db.Transaction, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('abort'));
-    },
-    get completeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('complete'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    }
-  });
-  dart.registerExtension(dart.global.IDBTransaction, indexed_db.Transaction);
-  const _createEvent = Symbol('_createEvent');
-  const _initEvent = Symbol('_initEvent');
-  const _selector = Symbol('_selector');
-  const _get_currentTarget = Symbol('_get_currentTarget');
-  const _get_target = Symbol('_get_target');
-  dart.defineExtensionNames([
-    'matchingTarget',
-    'currentTarget',
-    'target',
-    'preventDefault',
-    'stopImmediatePropagation',
-    'stopPropagation',
-    'bubbles',
-    'cancelable',
-    'defaultPrevented',
-    'eventPhase',
-    'path',
-    'timeStamp',
-    'type'
-  ]);
-  html$.Event = class Event extends _interceptors.Interceptor {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
-    }
-    static eventType(type, name, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let e = html$.document[_createEvent](type);
-      e[_initEvent](name, canBubble, cancelable);
-      return e;
-    }
-    get [_selector]() {
-      return this._selector;
-    }
-    set [_selector](value) {
-      this._selector = value;
-    }
-    get [dartx.matchingTarget]() {
-      if (this[_selector] == null) {
-        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
-      }
-      let currentTarget = html$.Element._check(this[dartx.currentTarget]);
-      let target = html$.Element._check(this[dartx.target]);
-      let matchedTarget = null;
-      do {
-        if (dart.test(target[dartx.matches](this[_selector]))) return target;
-        target = target[dartx.parent];
-      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
-      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.Event._create_1(type, eventInitDict_1);
-      }
-      return html$.Event._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.Event(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.Event(type);
-    }
-    get [dartx.bubbles]() {
-      return this.bubbles;
-    }
-    get [dartx.cancelable]() {
-      return this.cancelable;
-    }
-    get [dartx.currentTarget]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
-    }
-    get [_get_currentTarget]() {
-      return this.currentTarget;
-    }
-    get [dartx.defaultPrevented]() {
-      return this.defaultPrevented;
-    }
-    get [dartx.eventPhase]() {
-      return this.eventPhase;
-    }
-    get [dartx.path]() {
-      return this.path;
-    }
-    get [dartx.target]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_target]);
-    }
-    get [_get_target]() {
-      return this.target;
-    }
-    get [dartx.timeStamp]() {
-      return this.timeStamp;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [_initEvent](...args) {
-      return this.initEvent.apply(this, args);
-    }
-    [dartx.preventDefault](...args) {
-      return this.preventDefault.apply(this, args);
-    }
-    [dartx.stopImmediatePropagation](...args) {
-      return this.stopImmediatePropagation.apply(this, args);
-    }
-    [dartx.stopPropagation](...args) {
-      return this.stopPropagation.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Event, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
-      eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
-      _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_selector]: core.String,
-      [dartx.bubbles]: core.bool,
-      [dartx.cancelable]: core.bool,
-      [_get_currentTarget]: dart.dynamic,
-      [dartx.defaultPrevented]: core.bool,
-      [dartx.eventPhase]: core.int,
-      [dartx.path]: ListOfEventTarget(),
-      [_get_target]: dart.dynamic,
-      [dartx.timeStamp]: core.int,
-      [dartx.type]: core.String
-    }),
-    getters: () => ({
-      [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
-      [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
-      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
-    }),
-    methods: () => ({
-      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
-      [dartx.preventDefault]: dart.definiteFunctionType(dart.void, []),
-      [dartx.stopImmediatePropagation]: dart.definiteFunctionType(dart.void, []),
-      [dartx.stopPropagation]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      AT_TARGET: core.int,
-      BUBBLING_PHASE: core.int,
-      CAPTURING_PHASE: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  html$.Event.AT_TARGET = 2;
-  html$.Event.BUBBLING_PHASE = 3;
-  html$.Event.CAPTURING_PHASE = 1;
-  dart.registerExtension(dart.global.Event, html$.Event);
-  dart.registerExtension(dart.global.InputEvent, html$.Event);
-  dart.defineExtensionNames([
-    'dataLoss',
-    'dataLossMessage',
-    'newVersion',
-    'oldVersion'
-  ]);
-  indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
-      }
-      return indexed_db.VersionChangeEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new IDBVersionChangeEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new IDBVersionChangeEvent(type);
-    }
-    get [dartx.dataLoss]() {
-      return this.dataLoss;
-    }
-    get [dartx.dataLossMessage]() {
-      return this.dataLossMessage;
-    }
-    get [dartx.newVersion]() {
-      return this.newVersion;
-    }
-    get [dartx.oldVersion]() {
-      return this.oldVersion;
-    }
-  };
-  dart.setSignature(indexed_db.VersionChangeEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(indexed_db.VersionChangeEvent, []),
-      new: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.dataLoss]: core.String,
-      [dartx.dataLossMessage]: core.String,
-      [dartx.newVersion]: core.int,
-      [dartx.oldVersion]: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
-  dart.copyProperties(html$, {
-    get window() {
-      return window;
-    }
-  });
-  dart.copyProperties(html$, {
-    get document() {
-      return document;
-    }
-  });
-  const _xtag = Symbol('_xtag');
-  const _attributes$ = Symbol('_attributes');
-  const _innerHtml = Symbol('_innerHtml');
-  const _scrollHeight = Symbol('_scrollHeight');
-  const _scrollLeft = Symbol('_scrollLeft');
-  const _scrollTop = Symbol('_scrollTop');
-  const _scrollWidth = Symbol('_scrollWidth');
-  const _childElementCount = Symbol('_childElementCount');
-  const _children = Symbol('_children');
-  const _firstElementChild = Symbol('_firstElementChild');
-  const _lastElementChild = Symbol('_lastElementChild');
-  const _querySelectorAll = Symbol('_querySelectorAll');
-  const _getComputedStyle = Symbol('_getComputedStyle');
-  const _animate = Symbol('_animate');
-  const _localName = Symbol('_localName');
-  const _namespaceUri = Symbol('_namespaceUri');
-  const _scrollIntoView = Symbol('_scrollIntoView');
-  const _scrollIntoViewIfNeeded = Symbol('_scrollIntoViewIfNeeded');
-  const _insertAdjacentText = Symbol('_insertAdjacentText');
-  const _insertAdjacentNode = Symbol('_insertAdjacentNode');
-  const _insertAdjacentHtml = Symbol('_insertAdjacentHtml');
-  const _insertAdjacentElement = Symbol('_insertAdjacentElement');
-  const _canBeUsedToCreateContextualFragment = Symbol('_canBeUsedToCreateContextualFragment');
-  const _cannotBeUsedToCreateContextualFragment = Symbol('_cannotBeUsedToCreateContextualFragment');
-  const _getElementsByTagName = Symbol('_getElementsByTagName');
-  const _hasAttribute = Symbol('_hasAttribute');
-  const _hasAttributeNS = Symbol('_hasAttributeNS');
-  const _removeAttribute = Symbol('_removeAttribute');
-  const _removeAttributeNS = Symbol('_removeAttributeNS');
-  const _scroll_1 = Symbol('_scroll_1');
-  const _scroll_2 = Symbol('_scroll_2');
-  const _scroll_3 = Symbol('_scroll_3');
-  const _scrollBy_1 = Symbol('_scrollBy_1');
-  const _scrollBy_2 = Symbol('_scrollBy_2');
-  const _scrollBy_3 = Symbol('_scrollBy_3');
-  const _scrollTo_1 = Symbol('_scrollTo_1');
-  const _scrollTo_2 = Symbol('_scrollTo_2');
-  const _scrollTo_3 = Symbol('_scrollTo_3');
-  const _removeChild = Symbol('_removeChild');
-  const _replaceChild = Symbol('_replaceChild');
-  const _this = Symbol('_this');
-  const _clearChildren = Symbol('_clearChildren');
-  dart.defineExtensionNames([
-    'nodes',
-    'nodes',
-    'remove',
-    'replaceWith',
-    'insertAllBefore',
-    'toString',
-    'append',
-    'clone',
-    'contains',
-    'hasChildNodes',
-    'insertBefore',
-    'childNodes',
-    'baseUri',
-    'firstChild',
-    'lastChild',
-    'nextNode',
-    'nodeName',
-    'nodeType',
-    'nodeValue',
-    'ownerDocument',
-    'parent',
-    'parentNode',
-    'previousNode',
-    'text'
-  ]);
-  html$.Node = class Node extends html$.EventTarget {
-    _created() {
-      this[dartx.childNodes] = null;
-      this[dartx.baseUri] = null;
-      this[dartx.firstChild] = null;
-      this[dartx.lastChild] = null;
-      this[_localName] = null;
-      this[_namespaceUri] = null;
-      this[dartx.nextNode] = null;
-      this[dartx.nodeName] = null;
-      this[dartx.nodeType] = null;
-      this[dartx.nodeValue] = null;
-      this[dartx.ownerDocument] = null;
-      this[dartx.parent] = null;
-      this[dartx.parentNode] = null;
-      this[dartx.previousNode] = null;
-      this[dartx.text] = null;
-      super._created();
-    }
-    get [dartx.nodes]() {
-      return new html$._ChildNodeListLazy(this);
-    }
-    set [dartx.nodes](value) {
-      let copy = value[dartx.toList]();
-      this[dartx.text] = '';
-      for (let node of copy) {
-        this[dartx.append](node);
-      }
-    }
-    [dartx.remove]() {
-      if (this[dartx.parentNode] != null) {
-        let parent = this[dartx.parentNode];
-        this[dartx.parentNode][_removeChild](this);
-      }
-    }
-    [dartx.replaceWith](otherNode) {
-      try {
-        let parent = this[dartx.parentNode];
-        parent[_replaceChild](otherNode, this);
-      } catch (e) {
-      }
-
-      ;
-      return this;
-    }
-    [dartx.insertAllBefore](newNodes, refChild) {
-      if (html$._ChildNodeListLazy.is(newNodes)) {
-        let otherList = newNodes;
-        if (core.identical(otherList[_this], this)) {
-          dart.throw(new core.ArgumentError(newNodes));
-        }
-        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
-          this[dartx.insertBefore](otherList[_this][dartx.firstChild], refChild);
-        }
-      } else {
-        for (let node of newNodes) {
-          this[dartx.insertBefore](node, refChild);
-        }
-      }
-    }
-    [_clearChildren]() {
-      while (this[dartx.firstChild] != null) {
-        this[_removeChild](this[dartx.firstChild]);
-      }
-    }
-    [dartx.toString]() {
-      let value = this[dartx.nodeValue];
-      return value == null ? super.toString() : value;
-    }
-    get [dartx.childNodes]() {
-      return this.childNodes;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.baseUri]() {
-      return this.baseURI;
-    }
-    get [dartx.firstChild]() {
-      return this.firstChild;
-    }
-    get [dartx.lastChild]() {
-      return this.lastChild;
-    }
-    get [_localName]() {
-      return this.localName;
-    }
-    get [_namespaceUri]() {
-      return this.namespaceURI;
-    }
-    get [dartx.nextNode]() {
-      return this.nextSibling;
-    }
-    get [dartx.nodeName]() {
-      return this.nodeName;
-    }
-    get [dartx.nodeType]() {
-      return this.nodeType;
-    }
-    get [dartx.nodeValue]() {
-      return this.nodeValue;
-    }
-    get [dartx.ownerDocument]() {
-      return this.ownerDocument;
-    }
-    get [dartx.parent]() {
-      return this.parentElement;
-    }
-    get [dartx.parentNode]() {
-      return this.parentNode;
-    }
-    get [dartx.previousNode]() {
-      return this.previousSibling;
-    }
-    get [dartx.text]() {
-      return this.textContent;
-    }
-    set [dartx.text](value) {
-      this.textContent = value;
-    }
-    [dartx.append](...args) {
-      return this.appendChild.apply(this, args);
-    }
-    [dartx.clone](...args) {
-      return this.cloneNode.apply(this, args);
-    }
-    [dartx.contains](...args) {
-      return this.contains.apply(this, args);
-    }
-    [dartx.hasChildNodes](...args) {
-      return this.hasChildNodes.apply(this, args);
-    }
-    [dartx.insertBefore](...args) {
-      return this.insertBefore.apply(this, args);
-    }
-    [_removeChild](...args) {
-      return this.removeChild.apply(this, args);
-    }
-    [_replaceChild](...args) {
-      return this.replaceChild.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.Node, '_created');
-  dart.setSignature(html$.Node, {
-    constructors: () => ({
-      _created: dart.definiteFunctionType(html$.Node, []),
-      _: dart.definiteFunctionType(html$.Node, [])
-    }),
-    fields: () => ({
-      [dartx.childNodes]: ListOfNode(),
-      [dartx.baseUri]: core.String,
-      [dartx.firstChild]: html$.Node,
-      [dartx.lastChild]: html$.Node,
-      [_localName]: core.String,
-      [_namespaceUri]: core.String,
-      [dartx.nextNode]: html$.Node,
-      [dartx.nodeName]: core.String,
-      [dartx.nodeType]: core.int,
-      [dartx.nodeValue]: core.String,
-      [dartx.ownerDocument]: html$.Document,
-      [dartx.parent]: html$.Element,
-      [dartx.parentNode]: html$.Node,
-      [dartx.previousNode]: html$.Node,
-      [dartx.text]: core.String
-    }),
-    getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
-    setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
-    methods: () => ({
-      [dartx.remove]: dart.definiteFunctionType(dart.void, []),
-      [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
-      [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
-      [_clearChildren]: dart.definiteFunctionType(dart.void, []),
-      [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
-      [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
-      [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
-      [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
-      [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
-      [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
-      [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
-    }),
-    sfields: () => ({
-      ATTRIBUTE_NODE: core.int,
-      CDATA_SECTION_NODE: core.int,
-      COMMENT_NODE: core.int,
-      DOCUMENT_FRAGMENT_NODE: core.int,
-      DOCUMENT_NODE: core.int,
-      DOCUMENT_TYPE_NODE: core.int,
-      ELEMENT_NODE: core.int,
-      ENTITY_NODE: core.int,
-      ENTITY_REFERENCE_NODE: core.int,
-      NOTATION_NODE: core.int,
-      PROCESSING_INSTRUCTION_NODE: core.int,
-      TEXT_NODE: core.int
-    })
-  });
-  html$.Node.ATTRIBUTE_NODE = 2;
-  html$.Node.CDATA_SECTION_NODE = 4;
-  html$.Node.COMMENT_NODE = 8;
-  html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
-  html$.Node.DOCUMENT_NODE = 9;
-  html$.Node.DOCUMENT_TYPE_NODE = 10;
-  html$.Node.ELEMENT_NODE = 1;
-  html$.Node.ENTITY_NODE = 6;
-  html$.Node.ENTITY_REFERENCE_NODE = 5;
-  html$.Node.NOTATION_NODE = 12;
-  html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
-  html$.Node.TEXT_NODE = 3;
-  dart.registerExtension(dart.global.Node, html$.Node);
-  dart.defineExtensionNames([
-    'attributes',
-    'attributes',
-    'children',
-    'children',
-    'querySelectorAll',
-    'query',
-    'queryAll',
-    'classes',
-    'classes',
-    'dataset',
-    'dataset',
-    'getNamespacedAttributes',
-    'getComputedStyle',
-    'client',
-    'offset',
-    'appendText',
-    'appendHtml',
-    'attached',
-    'detached',
-    'enteredView',
-    'leftView',
-    'animate',
-    'attributeChanged',
-    'xtag',
-    'xtag',
-    'localName',
-    'namespaceUri',
-    'toString',
-    'scrollIntoView',
-    'insertAdjacentText',
-    'insertAdjacentHtml',
-    'insertAdjacentElement',
-    'matches',
-    'matchesWithAncestors',
-    'createShadowRoot',
-    'shadowRoot',
-    'contentEdge',
-    'paddingEdge',
-    'borderEdge',
-    'marginEdge',
-    'documentOffset',
-    'offsetTo',
-    'createFragment',
-    'innerHtml',
-    'setInnerHtml',
-    'innerHtml',
-    'on',
-    'offsetHeight',
-    'offsetLeft',
-    'offsetTop',
-    'offsetWidth',
-    'scrollHeight',
-    'scrollLeft',
-    'scrollLeft',
-    'scrollTop',
-    'scrollTop',
-    'scrollWidth',
-    'isContentEditable',
-    'blur',
-    'click',
-    'focus',
-    'outerHtml',
-    'closest',
-    'getAnimations',
-    'getAttribute',
-    'getAttributeNS',
-    'getBoundingClientRect',
-    'getClientRects',
-    'getDestinationInsertionPoints',
-    'getElementsByClassName',
-    'requestFullscreen',
-    'requestPointerLock',
-    'scroll',
-    'scrollBy',
-    'scrollTo',
-    'setAttribute',
-    'setAttributeNS',
-    'after',
-    'before',
-    'querySelector',
-    'onAbort',
-    'onBeforeCopy',
-    'onBeforeCut',
-    'onBeforePaste',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onCopy',
-    'onCut',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onPaste',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onRateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSearch',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onSelectStart',
-    'onStalled',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onTouchCancel',
-    'onTouchEnd',
-    'onTouchEnter',
-    'onTouchLeave',
-    'onTouchMove',
-    'onTouchStart',
-    'onTransitionEnd',
-    'onVolumeChange',
-    'onWaiting',
-    'onFullscreenChange',
-    'onFullscreenError',
-    'offsetParent',
-    'contentEditable',
-    'contextMenu',
-    'dir',
-    'draggable',
-    'hidden',
-    'lang',
-    'spellcheck',
-    'style',
-    'tabIndex',
-    'title',
-    'translate',
-    'dropzone',
-    'className',
-    'clientHeight',
-    'clientLeft',
-    'clientTop',
-    'clientWidth',
-    'computedName',
-    'computedRole',
-    'id',
-    'tagName',
-    'nextElementSibling',
-    'previousElementSibling'
-  ]);
-  html$.Element = class Element extends html$.Node {
-    static html(html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-      return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
-    }
-    created() {
-      this[_xtag] = null;
-      this[dartx.offsetParent] = null;
-      this[dartx.contentEditable] = null;
-      this[dartx.contextMenu] = null;
-      this[dartx.dir] = null;
-      this[dartx.draggable] = null;
-      this[dartx.hidden] = null;
-      this[dartx.lang] = null;
-      this[dartx.spellcheck] = null;
-      this[dartx.style] = null;
-      this[dartx.tabIndex] = null;
-      this[dartx.title] = null;
-      this[dartx.translate] = null;
-      this[dartx.dropzone] = null;
-      this[_attributes$] = null;
-      this[dartx.className] = null;
-      this[dartx.clientHeight] = null;
-      this[dartx.clientLeft] = null;
-      this[dartx.clientTop] = null;
-      this[dartx.clientWidth] = null;
-      this[dartx.computedName] = null;
-      this[dartx.computedRole] = null;
-      this[dartx.id] = null;
-      this[_innerHtml] = null;
-      this[_scrollHeight] = null;
-      this[_scrollLeft] = null;
-      this[_scrollTop] = null;
-      this[_scrollWidth] = null;
-      this[dartx.tagName] = null;
-      this[dartx.nextElementSibling] = null;
-      this[dartx.previousElementSibling] = null;
-      this[_childElementCount] = null;
-      this[_children] = null;
-      this[_firstElementChild] = null;
-      this[_lastElementChild] = null;
-      super._created();
-    }
-    static tag(tag, typeExtention) {
-      if (typeExtention === void 0) typeExtention = null;
-      return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
-    }
-    static a() {
-      return html$.Element.tag('a');
-    }
-    static article() {
-      return html$.Element.tag('article');
-    }
-    static aside() {
-      return html$.Element.tag('aside');
-    }
-    static audio() {
-      return html$.Element.tag('audio');
-    }
-    static br() {
-      return html$.Element.tag('br');
-    }
-    static canvas() {
-      return html$.Element.tag('canvas');
-    }
-    static div() {
-      return html$.Element.tag('div');
-    }
-    static footer() {
-      return html$.Element.tag('footer');
-    }
-    static header() {
-      return html$.Element.tag('header');
-    }
-    static hr() {
-      return html$.Element.tag('hr');
-    }
-    static iframe() {
-      return html$.Element.tag('iframe');
-    }
-    static img() {
-      return html$.Element.tag('img');
-    }
-    static li() {
-      return html$.Element.tag('li');
-    }
-    static nav() {
-      return html$.Element.tag('nav');
-    }
-    static ol() {
-      return html$.Element.tag('ol');
-    }
-    static option() {
-      return html$.Element.tag('option');
-    }
-    static p() {
-      return html$.Element.tag('p');
-    }
-    static pre() {
-      return html$.Element.tag('pre');
-    }
-    static section() {
-      return html$.Element.tag('section');
-    }
-    static select() {
-      return html$.Element.tag('select');
-    }
-    static span() {
-      return html$.Element.tag('span');
-    }
-    static svg() {
-      return html$.Element.tag('svg');
-    }
-    static table() {
-      return html$.Element.tag('table');
-    }
-    static td() {
-      return html$.Element.tag('td');
-    }
-    static textarea() {
-      return html$.Element.tag('textarea');
-    }
-    static th() {
-      return html$.Element.tag('th');
-    }
-    static tr() {
-      return html$.Element.tag('tr');
-    }
-    static ul() {
-      return html$.Element.tag('ul');
-    }
-    static video() {
-      return html$.Element.tag('video');
-    }
-    get [dartx.attributes]() {
-      return new html$._ElementAttributeMap(this);
-    }
-    set [dartx.attributes](value) {
-      let attributes = this[dartx.attributes];
-      attributes[dartx.clear]();
-      for (let key of value[dartx.keys]) {
-        attributes[dartx._set](key, value[dartx._get](key));
-      }
-    }
-    get [dartx.children]() {
-      return new html$._ChildrenElementList._wrap(this);
-    }
-    set [dartx.children](value) {
-      let copy = value[dartx.toList]();
-      let children = this[dartx.children];
-      children[dartx.clear]();
-      children[dartx.addAll](copy);
-    }
-    [dartx.querySelectorAll](T) {
-      return selectors => {
-        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
-      };
-    }
-    [dartx.query](relativeSelectors) {
-      return this[dartx.querySelector](relativeSelectors);
-    }
-    [dartx.queryAll](T) {
-      return relativeSelectors => {
-        return this[dartx.querySelectorAll](T)(relativeSelectors);
-      };
-    }
-    get [dartx.classes]() {
-      return new html$._ElementCssClassSet(this);
-    }
-    set [dartx.classes](value) {
-      let classSet = this[dartx.classes];
-      classSet.clear();
-      classSet.addAll(value);
-    }
-    get [dartx.dataset]() {
-      return new html$._DataAttributeMap(this[dartx.attributes]);
-    }
-    set [dartx.dataset](value) {
-      let data = this[dartx.dataset];
-      data[dartx.clear]();
-      for (let key of value[dartx.keys]) {
-        data[dartx._set](key, value[dartx._get](key));
-      }
-    }
-    [dartx.getNamespacedAttributes](namespace) {
-      return new html$._NamespacedAttributeMap(this, namespace);
-    }
-    [dartx.getComputedStyle](pseudoElement) {
-      if (pseudoElement === void 0) pseudoElement = null;
-      if (pseudoElement == null) {
-        pseudoElement = '';
-      }
-      return html$.window[_getComputedStyle](this, pseudoElement);
-    }
-    get [dartx.client]() {
-      return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
-    }
-    get [dartx.offset]() {
-      return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
-    }
-    [dartx.appendText](text) {
-      this[dartx.append](html$.Text.new(text));
-    }
-    [dartx.appendHtml](text, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
-    }
-    static isTagSupported(tag) {
-      let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
-      return html$.Element.is(e) && !html$.UnknownElement.is(e);
-    }
-    [dartx.attached]() {
-      this[dartx.enteredView]();
-    }
-    [dartx.detached]() {
-      this[dartx.leftView]();
-    }
-    [dartx.enteredView]() {}
-    [dartx.leftView]() {}
-    [dartx.animate](frames, timing) {
-      if (timing === void 0) timing = null;
-      if (!core.Iterable.is(frames) || !dart.test(frames[dartx.every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
-        dart.throw(new core.ArgumentError("The frames parameter should be a List of Maps " + "with frame information"));
-      }
-      let convertedFrames = null;
-      if (core.Iterable.is(frames)) {
-        convertedFrames = frames[dartx.map](dart.dynamic)(html_common.convertDartToNative_Dictionary)[dartx.toList]();
-      } else {
-        convertedFrames = frames;
-      }
-      let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
-      return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
-    }
-    [_animate](...args) {
-      return this.animate.apply(this, args);
-    }
-    [dartx.attributeChanged](name, oldValue, newValue) {}
-    get [_xtag]() {
-      return this._xtag;
-    }
-    set [_xtag](value) {
-      this._xtag = value;
-    }
-    get [dartx.xtag]() {
-      return this[_xtag] != null ? this[_xtag] : this;
-    }
-    set [dartx.xtag](value) {
-      this[_xtag] = value;
-    }
-    get [dartx.localName]() {
-      return this[_localName];
-    }
-    get [dartx.namespaceUri]() {
-      return this[_namespaceUri];
-    }
-    [dartx.toString]() {
-      return this[dartx.localName];
-    }
-    [dartx.scrollIntoView](alignment) {
-      if (alignment === void 0) alignment = null;
-      let hasScrollIntoViewIfNeeded = true;
-      hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
-      if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
-        this[_scrollIntoView](true);
-      } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
-        this[_scrollIntoView](false);
-      } else if (hasScrollIntoViewIfNeeded) {
-        if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
-          this[_scrollIntoViewIfNeeded](true);
-        } else {
-          this[_scrollIntoViewIfNeeded]();
-        }
-      } else {
-        this[_scrollIntoView]();
-      }
-    }
-    static _determineMouseWheelEventType(e) {
-      return 'wheel';
-    }
-    static _determineTransitionEventType(e) {
-      if (dart.test(html_common.Device.isWebKit)) {
-        return 'webkitTransitionEnd';
-      } else if (dart.test(html_common.Device.isOpera)) {
-        return 'oTransitionEnd';
-      }
-      return 'transitionend';
-    }
-    [dartx.insertAdjacentText](where, text) {
-      if (!!this.insertAdjacentText) {
-        this[_insertAdjacentText](where, text);
-      } else {
-        this[_insertAdjacentNode](where, html$.Text.new(text));
-      }
-    }
-    [_insertAdjacentText](...args) {
-      return this.insertAdjacentText.apply(this, args);
-    }
-    [dartx.insertAdjacentHtml](where, html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
-        this[_insertAdjacentHtml](where, html);
-      } else {
-        this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
-      }
-    }
-    [_insertAdjacentHtml](...args) {
-      return this.insertAdjacentHTML.apply(this, args);
-    }
-    [dartx.insertAdjacentElement](where, element) {
-      if (!!this.insertAdjacentElement) {
-        this[_insertAdjacentElement](where, element);
-      } else {
-        this[_insertAdjacentNode](where, element);
-      }
-      return element;
-    }
-    [_insertAdjacentElement](...args) {
-      return this.insertAdjacentElement.apply(this, args);
-    }
-    [_insertAdjacentNode](where, node) {
-      switch (where[dartx.toLowerCase]()) {
-        case 'beforebegin':
-        {
-          this[dartx.parentNode][dartx.insertBefore](node, this);
-          break;
-        }
-        case 'afterbegin':
-        {
-          let first = dart.notNull(this[dartx.nodes][dartx.length]) > 0 ? this[dartx.nodes][dartx._get](0) : null;
-          this[dartx.insertBefore](node, first);
-          break;
-        }
-        case 'beforeend':
-        {
-          this[dartx.append](node);
-          break;
-        }
-        case 'afterend':
-        {
-          this[dartx.parentNode][dartx.insertBefore](node, this[dartx.nextNode]);
-          break;
-        }
-        default:
-        {
-          dart.throw(new core.ArgumentError(dart.str`Invalid position ${where}`));
-        }
-      }
-    }
-    [dartx.matches](selectors) {
-      if (!!this.matches) {
-        return this.matches(selectors);
-      } else if (!!this.webkitMatchesSelector) {
-        return this.webkitMatchesSelector(selectors);
-      } else if (!!this.mozMatchesSelector) {
-        return this.mozMatchesSelector(selectors);
-      } else if (!!this.msMatchesSelector) {
-        return this.msMatchesSelector(selectors);
-      } else if (!!this.oMatchesSelector) {
-        return this.oMatchesSelector(selectors);
-      } else {
-        dart.throw(new core.UnsupportedError("Not supported on this platform"));
-      }
-    }
-    [dartx.matchesWithAncestors](selectors) {
-      let elem = this;
-      do {
-        if (dart.test(elem[dartx.matches](selectors))) return true;
-        elem = elem[dartx.parent];
-      } while (elem != null);
-      return false;
-    }
-    [dartx.createShadowRoot]() {
-      return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
-    }
-    get [dartx.shadowRoot]() {
-      return this.shadowRoot || this.webkitShadowRoot;
-    }
-    get [dartx.contentEdge]() {
-      return new html$._ContentCssRect(this);
-    }
-    get [dartx.paddingEdge]() {
-      return new html$._PaddingCssRect(this);
-    }
-    get [dartx.borderEdge]() {
-      return new html$._BorderCssRect(this);
-    }
-    get [dartx.marginEdge]() {
-      return new html$._MarginCssRect(this);
-    }
-    get [dartx.documentOffset]() {
-      return this[dartx.offsetTo](html$.document[dartx.documentElement]);
-    }
-    [dartx.offsetTo](parent) {
-      return html$.Element._offsetToHelper(this, parent);
-    }
-    static _offsetToHelper(current, parent) {
-      let sameAsParent = core.identical(current, parent);
-      let foundAsParent = sameAsParent || parent[dartx.tagName] == 'HTML';
-      if (current == null || sameAsParent) {
-        if (foundAsParent) return new (PointOfnum())(0, 0);
-        dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
-      }
-      let parentOffset = current[dartx.offsetParent];
-      let p = html$.Element._offsetToHelper(parentOffset, parent);
-      return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
-    }
-    [dartx.createFragment](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (treeSanitizer == null) {
-        if (validator == null) {
-          if (html$.Element._defaultValidator == null) {
-            html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
-          }
-          validator = html$.Element._defaultValidator;
-        }
-        if (html$.Element._defaultSanitizer == null) {
-          html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
-        } else {
-          html$.Element._defaultSanitizer.validator = validator;
-        }
-        treeSanitizer = html$.Element._defaultSanitizer;
-      } else if (validator != null) {
-        dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
-      }
-      if (html$.Element._parseDocument == null) {
-        html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
-        html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
-        let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
-        base[dartx.href] = html$.document[dartx.baseUri];
-        html$.Element._parseDocument[dartx.head][dartx.append](base);
-      }
-      let contextElement = null;
-      if (html$.BodyElement.is(this)) {
-        contextElement = html$.Element._parseDocument[dartx.body];
-      } else {
-        contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
-        html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
-      }
-      let fragment = null;
-      if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
-        html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
-        fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
-      } else {
-        dart.dput(contextElement, _innerHtml, html);
-        fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
-        while (dart.dload(contextElement, 'firstChild') != null) {
-          dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
-        }
-      }
-      if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
-        dart.dsend(contextElement, 'remove');
-      }
-      treeSanitizer.sanitizeTree(html$.Node._check(fragment));
-      html$.document[dartx.adoptNode](html$.Node._check(fragment));
-      return html$.DocumentFragment._check(fragment);
-    }
-    get [_canBeUsedToCreateContextualFragment]() {
-      return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
-    }
-    get [_cannotBeUsedToCreateContextualFragment]() {
-      return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
-    }
-    set [dartx.innerHtml](html) {
-      this[dartx.setInnerHtml](html);
-    }
-    [dartx.setInnerHtml](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      this[dartx.text] = null;
-      if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
-        this[_innerHtml] = html;
-      } else {
-        this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
-      }
-    }
-    get [dartx.innerHtml]() {
-      return this[_innerHtml];
-    }
-    get [dartx.on]() {
-      return new html$.ElementEvents(this);
-    }
-    static _hasCorruptedAttributes(element) {
-      return (function(element) {
-        if (!(element.attributes instanceof NamedNodeMap)) {
-          return true;
-        }
-        var childNodes = element.childNodes;
-        if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
-          return true;
-        }
-        if (element.children) {
-          if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
-            return true;
-          }
-        }
-        var length = 0;
-        if (element.children) {
-          length = element.children.length;
-        }
-        for (var i = 0; i < length; i++) {
-          var child = element.children[i];
-          if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
-            return true;
-          }
-        }
-        return false;
-      })(element);
-    }
-    static _hasCorruptedAttributesAdditionalCheck(element) {
-      return !(element.attributes instanceof NamedNodeMap);
-    }
-    static _safeTagName(element) {
-      let result = 'element tag unavailable';
-      try {
-        if (typeof dart.dload(element, 'tagName') == 'string') {
-          result = core.String._check(dart.dload(element, 'tagName'));
-        }
-      } catch (e) {
-      }
-
-      return result;
-    }
-    get [dartx.offsetParent]() {
-      return this.offsetParent;
-    }
-    get [dartx.offsetHeight]() {
-      return this.offsetHeight[dartx.round]();
-    }
-    get [dartx.offsetLeft]() {
-      return this.offsetLeft[dartx.round]();
-    }
-    get [dartx.offsetTop]() {
-      return this.offsetTop[dartx.round]();
-    }
-    get [dartx.offsetWidth]() {
-      return this.offsetWidth[dartx.round]();
-    }
-    get [dartx.scrollHeight]() {
-      return this.scrollHeight[dartx.round]();
-    }
-    get [dartx.scrollLeft]() {
-      return this.scrollLeft[dartx.round]();
-    }
-    set [dartx.scrollLeft](value) {
-      this.scrollLeft = value[dartx.round]();
-    }
-    get [dartx.scrollTop]() {
-      return this.scrollTop[dartx.round]();
-    }
-    set [dartx.scrollTop](value) {
-      this.scrollTop = value[dartx.round]();
-    }
-    get [dartx.scrollWidth]() {
-      return this.scrollWidth[dartx.round]();
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.contentEditable]() {
-      return this.contentEditable;
-    }
-    set [dartx.contentEditable](value) {
-      this.contentEditable = value;
-    }
-    get [dartx.contextMenu]() {
-      return this.contextMenu;
-    }
-    set [dartx.contextMenu](value) {
-      this.contextMenu = value;
-    }
-    get [dartx.dir]() {
-      return this.dir;
-    }
-    set [dartx.dir](value) {
-      this.dir = value;
-    }
-    get [dartx.draggable]() {
-      return this.draggable;
-    }
-    set [dartx.draggable](value) {
-      this.draggable = value;
-    }
-    get [dartx.hidden]() {
-      return this.hidden;
-    }
-    set [dartx.hidden](value) {
-      this.hidden = value;
-    }
-    get [dartx.isContentEditable]() {
-      return this.isContentEditable;
-    }
-    get [dartx.lang]() {
-      return this.lang;
-    }
-    set [dartx.lang](value) {
-      this.lang = value;
-    }
-    get [dartx.spellcheck]() {
-      return this.spellcheck;
-    }
-    set [dartx.spellcheck](value) {
-      this.spellcheck = value;
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-    get [dartx.tabIndex]() {
-      return this.tabIndex;
-    }
-    set [dartx.tabIndex](value) {
-      this.tabIndex = value;
-    }
-    get [dartx.title]() {
-      return this.title;
-    }
-    set [dartx.title](value) {
-      this.title = value;
-    }
-    get [dartx.translate]() {
-      return this.translate;
-    }
-    set [dartx.translate](value) {
-      this.translate = value;
-    }
-    get [dartx.dropzone]() {
-      return this.webkitdropzone;
-    }
-    set [dartx.dropzone](value) {
-      this.webkitdropzone = value;
-    }
-    [dartx.blur](...args) {
-      return this.blur.apply(this, args);
-    }
-    [dartx.click](...args) {
-      return this.click.apply(this, args);
-    }
-    [dartx.focus](...args) {
-      return this.focus.apply(this, args);
-    }
-    get [_attributes$]() {
-      return this.attributes;
-    }
-    get [dartx.className]() {
-      return this.className;
-    }
-    set [dartx.className](value) {
-      this.className = value;
-    }
-    get [dartx.clientHeight]() {
-      return this.clientHeight;
-    }
-    get [dartx.clientLeft]() {
-      return this.clientLeft;
-    }
-    get [dartx.clientTop]() {
-      return this.clientTop;
-    }
-    get [dartx.clientWidth]() {
-      return this.clientWidth;
-    }
-    get [dartx.computedName]() {
-      return this.computedName;
-    }
-    get [dartx.computedRole]() {
-      return this.computedRole;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    set [dartx.id](value) {
-      this.id = value;
-    }
-    get [_innerHtml]() {
-      return this.innerHTML;
-    }
-    set [_innerHtml](value) {
-      this.innerHTML = value;
-    }
-    get [dartx.outerHtml]() {
-      return this.outerHTML;
-    }
-    get [_scrollHeight]() {
-      return this.scrollHeight;
-    }
-    get [_scrollLeft]() {
-      return this.scrollLeft;
-    }
-    set [_scrollLeft](value) {
-      this.scrollLeft = value;
-    }
-    get [_scrollTop]() {
-      return this.scrollTop;
-    }
-    set [_scrollTop](value) {
-      this.scrollTop = value;
-    }
-    get [_scrollWidth]() {
-      return this.scrollWidth;
-    }
-    get [dartx.tagName]() {
-      return this.tagName;
-    }
-    [dartx.closest](...args) {
-      return this.closest.apply(this, args);
-    }
-    [dartx.getAnimations](...args) {
-      return this.getAnimations.apply(this, args);
-    }
-    [dartx.getAttribute](...args) {
-      return this.getAttribute.apply(this, args);
-    }
-    [dartx.getAttributeNS](...args) {
-      return this.getAttributeNS.apply(this, args);
-    }
-    [dartx.getBoundingClientRect](...args) {
-      return this.getBoundingClientRect.apply(this, args);
-    }
-    [dartx.getClientRects](...args) {
-      return this.getClientRects.apply(this, args);
-    }
-    [dartx.getDestinationInsertionPoints](...args) {
-      return this.getDestinationInsertionPoints.apply(this, args);
-    }
-    [dartx.getElementsByClassName](...args) {
-      return this.getElementsByClassName.apply(this, args);
-    }
-    [_getElementsByTagName](...args) {
-      return this.getElementsByTagName.apply(this, args);
-    }
-    [_hasAttribute](...args) {
-      return this.hasAttribute.apply(this, args);
-    }
-    [_hasAttributeNS](...args) {
-      return this.hasAttributeNS.apply(this, args);
-    }
-    [_removeAttribute](...args) {
-      return this.removeAttribute.apply(this, args);
-    }
-    [_removeAttributeNS](...args) {
-      return this.removeAttributeNS.apply(this, args);
-    }
-    [dartx.requestFullscreen](...args) {
-      return this.requestFullscreen.apply(this, args);
-    }
-    [dartx.requestPointerLock](...args) {
-      return this.requestPointerLock.apply(this, args);
-    }
-    [dartx.scroll](options_OR_x, y) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (options_OR_x == null && y == null) {
-        this[_scroll_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scroll_2](options_1);
-        return;
-      }
-      if (y != null && typeof options_OR_x == 'number') {
-        this[_scroll_3](options_OR_x, y);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scroll_1](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_2](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_3](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [dartx.scrollBy](options_OR_x, y) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (options_OR_x == null && y == null) {
-        this[_scrollBy_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scrollBy_2](options_1);
-        return;
-      }
-      if (y != null && typeof options_OR_x == 'number') {
-        this[_scrollBy_3](options_OR_x, y);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scrollBy_1](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_2](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_3](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollIntoView](...args) {
-      return this.scrollIntoView.apply(this, args);
-    }
-    [_scrollIntoViewIfNeeded](...args) {
-      return this.scrollIntoViewIfNeeded.apply(this, args);
-    }
-    [dartx.scrollTo](options_OR_x, y) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (options_OR_x == null && y == null) {
-        this[_scrollTo_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scrollTo_2](options_1);
-        return;
-      }
-      if (y != null && typeof options_OR_x == 'number') {
-        this[_scrollTo_3](options_OR_x, y);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scrollTo_1](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_2](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_3](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [dartx.setAttribute](...args) {
-      return this.setAttribute.apply(this, args);
-    }
-    [dartx.setAttributeNS](...args) {
-      return this.setAttributeNS.apply(this, args);
-    }
-    [dartx.after](...args) {
-      return this.after.apply(this, args);
-    }
-    [dartx.before](...args) {
-      return this.before.apply(this, args);
-    }
-    get [dartx.nextElementSibling]() {
-      return this.nextElementSibling;
-    }
-    get [dartx.previousElementSibling]() {
-      return this.previousElementSibling;
-    }
-    get [_childElementCount]() {
-      return this.childElementCount;
-    }
-    get [_children]() {
-      return this.children;
-    }
-    get [_firstElementChild]() {
-      return this.firstElementChild;
-    }
-    get [_lastElementChild]() {
-      return this.lastElementChild;
-    }
-    [dartx.querySelector](...args) {
-      return this.querySelector.apply(this, args);
-    }
-    [_querySelectorAll](...args) {
-      return this.querySelectorAll.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return html$.Element.abortEvent.forElement(this);
-    }
-    get [dartx.onBeforeCopy]() {
-      return html$.Element.beforeCopyEvent.forElement(this);
-    }
-    get [dartx.onBeforeCut]() {
-      return html$.Element.beforeCutEvent.forElement(this);
-    }
-    get [dartx.onBeforePaste]() {
-      return html$.Element.beforePasteEvent.forElement(this);
-    }
-    get [dartx.onBlur]() {
-      return html$.Element.blurEvent.forElement(this);
-    }
-    get [dartx.onCanPlay]() {
-      return html$.Element.canPlayEvent.forElement(this);
-    }
-    get [dartx.onCanPlayThrough]() {
-      return html$.Element.canPlayThroughEvent.forElement(this);
-    }
-    get [dartx.onChange]() {
-      return html$.Element.changeEvent.forElement(this);
-    }
-    get [dartx.onClick]() {
-      return html$.Element.clickEvent.forElement(this);
-    }
-    get [dartx.onContextMenu]() {
-      return html$.Element.contextMenuEvent.forElement(this);
-    }
-    get [dartx.onCopy]() {
-      return html$.Element.copyEvent.forElement(this);
-    }
-    get [dartx.onCut]() {
-      return html$.Element.cutEvent.forElement(this);
-    }
-    get [dartx.onDoubleClick]() {
-      return html$.Element.doubleClickEvent.forElement(this);
-    }
-    get [dartx.onDrag]() {
-      return html$.Element.dragEvent.forElement(this);
-    }
-    get [dartx.onDragEnd]() {
-      return html$.Element.dragEndEvent.forElement(this);
-    }
-    get [dartx.onDragEnter]() {
-      return html$.Element.dragEnterEvent.forElement(this);
-    }
-    get [dartx.onDragLeave]() {
-      return html$.Element.dragLeaveEvent.forElement(this);
-    }
-    get [dartx.onDragOver]() {
-      return html$.Element.dragOverEvent.forElement(this);
-    }
-    get [dartx.onDragStart]() {
-      return html$.Element.dragStartEvent.forElement(this);
-    }
-    get [dartx.onDrop]() {
-      return html$.Element.dropEvent.forElement(this);
-    }
-    get [dartx.onDurationChange]() {
-      return html$.Element.durationChangeEvent.forElement(this);
-    }
-    get [dartx.onEmptied]() {
-      return html$.Element.emptiedEvent.forElement(this);
-    }
-    get [dartx.onEnded]() {
-      return html$.Element.endedEvent.forElement(this);
-    }
-    get [dartx.onError]() {
-      return html$.Element.errorEvent.forElement(this);
-    }
-    get [dartx.onFocus]() {
-      return html$.Element.focusEvent.forElement(this);
-    }
-    get [dartx.onInput]() {
-      return html$.Element.inputEvent.forElement(this);
-    }
-    get [dartx.onInvalid]() {
-      return html$.Element.invalidEvent.forElement(this);
-    }
-    get [dartx.onKeyDown]() {
-      return html$.Element.keyDownEvent.forElement(this);
-    }
-    get [dartx.onKeyPress]() {
-      return html$.Element.keyPressEvent.forElement(this);
-    }
-    get [dartx.onKeyUp]() {
-      return html$.Element.keyUpEvent.forElement(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.Element.loadEvent.forElement(this);
-    }
-    get [dartx.onLoadedData]() {
-      return html$.Element.loadedDataEvent.forElement(this);
-    }
-    get [dartx.onLoadedMetadata]() {
-      return html$.Element.loadedMetadataEvent.forElement(this);
-    }
-    get [dartx.onMouseDown]() {
-      return html$.Element.mouseDownEvent.forElement(this);
-    }
-    get [dartx.onMouseEnter]() {
-      return html$.Element.mouseEnterEvent.forElement(this);
-    }
-    get [dartx.onMouseLeave]() {
-      return html$.Element.mouseLeaveEvent.forElement(this);
-    }
-    get [dartx.onMouseMove]() {
-      return html$.Element.mouseMoveEvent.forElement(this);
-    }
-    get [dartx.onMouseOut]() {
-      return html$.Element.mouseOutEvent.forElement(this);
-    }
-    get [dartx.onMouseOver]() {
-      return html$.Element.mouseOverEvent.forElement(this);
-    }
-    get [dartx.onMouseUp]() {
-      return html$.Element.mouseUpEvent.forElement(this);
-    }
-    get [dartx.onMouseWheel]() {
-      return html$.Element.mouseWheelEvent.forElement(this);
-    }
-    get [dartx.onPaste]() {
-      return html$.Element.pasteEvent.forElement(this);
-    }
-    get [dartx.onPause]() {
-      return html$.Element.pauseEvent.forElement(this);
-    }
-    get [dartx.onPlay]() {
-      return html$.Element.playEvent.forElement(this);
-    }
-    get [dartx.onPlaying]() {
-      return html$.Element.playingEvent.forElement(this);
-    }
-    get [dartx.onRateChange]() {
-      return html$.Element.rateChangeEvent.forElement(this);
-    }
-    get [dartx.onReset]() {
-      return html$.Element.resetEvent.forElement(this);
-    }
-    get [dartx.onResize]() {
-      return html$.Element.resizeEvent.forElement(this);
-    }
-    get [dartx.onScroll]() {
-      return html$.Element.scrollEvent.forElement(this);
-    }
-    get [dartx.onSearch]() {
-      return html$.Element.searchEvent.forElement(this);
-    }
-    get [dartx.onSeeked]() {
-      return html$.Element.seekedEvent.forElement(this);
-    }
-    get [dartx.onSeeking]() {
-      return html$.Element.seekingEvent.forElement(this);
-    }
-    get [dartx.onSelect]() {
-      return html$.Element.selectEvent.forElement(this);
-    }
-    get [dartx.onSelectStart]() {
-      return html$.Element.selectStartEvent.forElement(this);
-    }
-    get [dartx.onStalled]() {
-      return html$.Element.stalledEvent.forElement(this);
-    }
-    get [dartx.onSubmit]() {
-      return html$.Element.submitEvent.forElement(this);
-    }
-    get [dartx.onSuspend]() {
-      return html$.Element.suspendEvent.forElement(this);
-    }
-    get [dartx.onTimeUpdate]() {
-      return html$.Element.timeUpdateEvent.forElement(this);
-    }
-    get [dartx.onTouchCancel]() {
-      return html$.Element.touchCancelEvent.forElement(this);
-    }
-    get [dartx.onTouchEnd]() {
-      return html$.Element.touchEndEvent.forElement(this);
-    }
-    get [dartx.onTouchEnter]() {
-      return html$.Element.touchEnterEvent.forElement(this);
-    }
-    get [dartx.onTouchLeave]() {
-      return html$.Element.touchLeaveEvent.forElement(this);
-    }
-    get [dartx.onTouchMove]() {
-      return html$.Element.touchMoveEvent.forElement(this);
-    }
-    get [dartx.onTouchStart]() {
-      return html$.Element.touchStartEvent.forElement(this);
-    }
-    get [dartx.onTransitionEnd]() {
-      return html$.Element.transitionEndEvent.forElement(this);
-    }
-    get [dartx.onVolumeChange]() {
-      return html$.Element.volumeChangeEvent.forElement(this);
-    }
-    get [dartx.onWaiting]() {
-      return html$.Element.waitingEvent.forElement(this);
-    }
-    get [dartx.onFullscreenChange]() {
-      return html$.Element.fullscreenChangeEvent.forElement(this);
-    }
-    get [dartx.onFullscreenError]() {
-      return html$.Element.fullscreenErrorEvent.forElement(this);
-    }
-  };
-  dart.defineNamedConstructor(html$.Element, 'created');
-  html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
-  dart.setSignature(html$.Element, {
-    constructors: () => ({
-      html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      created: dart.definiteFunctionType(html$.Element, []),
-      tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
-      a: dart.definiteFunctionType(html$.Element, []),
-      article: dart.definiteFunctionType(html$.Element, []),
-      aside: dart.definiteFunctionType(html$.Element, []),
-      audio: dart.definiteFunctionType(html$.Element, []),
-      br: dart.definiteFunctionType(html$.Element, []),
-      canvas: dart.definiteFunctionType(html$.Element, []),
-      div: dart.definiteFunctionType(html$.Element, []),
-      footer: dart.definiteFunctionType(html$.Element, []),
-      header: dart.definiteFunctionType(html$.Element, []),
-      hr: dart.definiteFunctionType(html$.Element, []),
-      iframe: dart.definiteFunctionType(html$.Element, []),
-      img: dart.definiteFunctionType(html$.Element, []),
-      li: dart.definiteFunctionType(html$.Element, []),
-      nav: dart.definiteFunctionType(html$.Element, []),
-      ol: dart.definiteFunctionType(html$.Element, []),
-      option: dart.definiteFunctionType(html$.Element, []),
-      p: dart.definiteFunctionType(html$.Element, []),
-      pre: dart.definiteFunctionType(html$.Element, []),
-      section: dart.definiteFunctionType(html$.Element, []),
-      select: dart.definiteFunctionType(html$.Element, []),
-      span: dart.definiteFunctionType(html$.Element, []),
-      svg: dart.definiteFunctionType(html$.Element, []),
-      table: dart.definiteFunctionType(html$.Element, []),
-      td: dart.definiteFunctionType(html$.Element, []),
-      textarea: dart.definiteFunctionType(html$.Element, []),
-      th: dart.definiteFunctionType(html$.Element, []),
-      tr: dart.definiteFunctionType(html$.Element, []),
-      ul: dart.definiteFunctionType(html$.Element, []),
-      video: dart.definiteFunctionType(html$.Element, []),
-      _: dart.definiteFunctionType(html$.Element, [])
-    }),
-    fields: () => ({
-      [_xtag]: html$.Element,
-      [dartx.offsetParent]: html$.Element,
-      [dartx.contentEditable]: core.String,
-      [dartx.contextMenu]: html$.MenuElement,
-      [dartx.dir]: core.String,
-      [dartx.draggable]: core.bool,
-      [dartx.hidden]: core.bool,
-      [dartx.lang]: core.String,
-      [dartx.spellcheck]: core.bool,
-      [dartx.style]: html$.CssStyleDeclaration,
-      [dartx.tabIndex]: core.int,
-      [dartx.title]: core.String,
-      [dartx.translate]: core.bool,
-      [dartx.dropzone]: core.String,
-      [_attributes$]: html$._NamedNodeMap,
-      [dartx.className]: core.String,
-      [dartx.clientHeight]: core.int,
-      [dartx.clientLeft]: core.int,
-      [dartx.clientTop]: core.int,
-      [dartx.clientWidth]: core.int,
-      [dartx.computedName]: core.String,
-      [dartx.computedRole]: core.String,
-      [dartx.id]: core.String,
-      [_innerHtml]: core.String,
-      [_scrollHeight]: core.int,
-      [_scrollLeft]: core.num,
-      [_scrollTop]: core.num,
-      [_scrollWidth]: core.int,
-      [dartx.tagName]: core.String,
-      [dartx.nextElementSibling]: html$.Element,
-      [dartx.previousElementSibling]: html$.Element,
-      [_childElementCount]: core.int,
-      [_children]: ListOfNode(),
-      [_firstElementChild]: html$.Element,
-      [_lastElementChild]: html$.Element
-    }),
-    getters: () => ({
-      [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
-      [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
-      [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
-      [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
-      [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.localName]: dart.definiteFunctionType(core.String, []),
-      [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
-      [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
-      [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
-      [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
-      [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
-      [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
-      [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
-      [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
-      [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
-      [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
-      [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
-      [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
-      [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
-      [dartx.offsetWidth]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollHeight]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollLeft]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollTop]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
-      [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
-      [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
-      [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-      [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-      [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-      [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-      [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-      [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-      [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
-      [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-      [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-      [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
-      [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
-    }),
-    setters: () => ({
-      [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
-      [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
-      [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-      [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
-      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    methods: () => ({
-      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
-      [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
-      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      [dartx.attached]: dart.definiteFunctionType(dart.void, []),
-      [dartx.detached]: dart.definiteFunctionType(dart.void, []),
-      [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
-      [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
-      [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
-      [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
-      [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
-      [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
-      [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
-      [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
-      [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
-      [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
-      [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      [dartx.blur]: dart.definiteFunctionType(dart.void, []),
-      [dartx.click]: dart.definiteFunctionType(dart.void, []),
-      [dartx.focus]: dart.definiteFunctionType(dart.void, []),
-      [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
-      [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
-      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
-      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
-      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
-      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
-      [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
-      [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_removeAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.requestFullscreen]: dart.definiteFunctionType(dart.void, []),
-      [dartx.requestPointerLock]: dart.definiteFunctionType(dart.void, []),
-      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
-      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
-      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
-      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
-      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
-      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
-      [_scrollIntoView]: dart.definiteFunctionType(dart.void, [], [core.bool]),
-      [_scrollIntoViewIfNeeded]: dart.definiteFunctionType(dart.void, [], [core.bool]),
-      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
-      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
-      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
-      [dartx.setAttribute]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
-      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
-      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
-    }),
-    sfields: () => ({
-      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
-      transitionEndEvent: EventStreamProviderOfTransitionEvent(),
-      _parseDocument: html$.HtmlDocument,
-      _parseRange: html$.Range,
-      _defaultValidator: html$.NodeValidatorBuilder,
-      _defaultSanitizer: html$._ValidatingTreeSanitizer,
-      _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
-      abortEvent: EventStreamProviderOfEvent(),
-      beforeCopyEvent: EventStreamProviderOfEvent(),
-      beforeCutEvent: EventStreamProviderOfEvent(),
-      beforePasteEvent: EventStreamProviderOfEvent(),
-      blurEvent: EventStreamProviderOfEvent(),
-      canPlayEvent: EventStreamProviderOfEvent(),
-      canPlayThroughEvent: EventStreamProviderOfEvent(),
-      changeEvent: EventStreamProviderOfEvent(),
-      clickEvent: EventStreamProviderOfMouseEvent(),
-      contextMenuEvent: EventStreamProviderOfMouseEvent(),
-      copyEvent: EventStreamProviderOfClipboardEvent(),
-      cutEvent: EventStreamProviderOfClipboardEvent(),
-      doubleClickEvent: EventStreamProviderOfEvent(),
-      dragEvent: EventStreamProviderOfMouseEvent(),
-      dragEndEvent: EventStreamProviderOfMouseEvent(),
-      dragEnterEvent: EventStreamProviderOfMouseEvent(),
-      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
-      dragOverEvent: EventStreamProviderOfMouseEvent(),
-      dragStartEvent: EventStreamProviderOfMouseEvent(),
-      dropEvent: EventStreamProviderOfMouseEvent(),
-      durationChangeEvent: EventStreamProviderOfEvent(),
-      emptiedEvent: EventStreamProviderOfEvent(),
-      endedEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      focusEvent: EventStreamProviderOfEvent(),
-      inputEvent: EventStreamProviderOfEvent(),
-      invalidEvent: EventStreamProviderOfEvent(),
-      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
-      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
-      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
-      loadEvent: EventStreamProviderOfEvent(),
-      loadedDataEvent: EventStreamProviderOfEvent(),
-      loadedMetadataEvent: EventStreamProviderOfEvent(),
-      mouseDownEvent: EventStreamProviderOfMouseEvent(),
-      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
-      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
-      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
-      mouseOutEvent: EventStreamProviderOfMouseEvent(),
-      mouseOverEvent: EventStreamProviderOfMouseEvent(),
-      mouseUpEvent: EventStreamProviderOfMouseEvent(),
-      pasteEvent: EventStreamProviderOfClipboardEvent(),
-      pauseEvent: EventStreamProviderOfEvent(),
-      playEvent: EventStreamProviderOfEvent(),
-      playingEvent: EventStreamProviderOfEvent(),
-      rateChangeEvent: EventStreamProviderOfEvent(),
-      resetEvent: EventStreamProviderOfEvent(),
-      resizeEvent: EventStreamProviderOfEvent(),
-      scrollEvent: EventStreamProviderOfEvent(),
-      searchEvent: EventStreamProviderOfEvent(),
-      seekedEvent: EventStreamProviderOfEvent(),
-      seekingEvent: EventStreamProviderOfEvent(),
-      selectEvent: EventStreamProviderOfEvent(),
-      selectStartEvent: EventStreamProviderOfEvent(),
-      stalledEvent: EventStreamProviderOfEvent(),
-      submitEvent: EventStreamProviderOfEvent(),
-      suspendEvent: EventStreamProviderOfEvent(),
-      timeUpdateEvent: EventStreamProviderOfEvent(),
-      touchCancelEvent: EventStreamProviderOfTouchEvent(),
-      touchEndEvent: EventStreamProviderOfTouchEvent(),
-      touchEnterEvent: EventStreamProviderOfTouchEvent(),
-      touchLeaveEvent: EventStreamProviderOfTouchEvent(),
-      touchMoveEvent: EventStreamProviderOfTouchEvent(),
-      touchStartEvent: EventStreamProviderOfTouchEvent(),
-      volumeChangeEvent: EventStreamProviderOfEvent(),
-      waitingEvent: EventStreamProviderOfEvent(),
-      fullscreenChangeEvent: EventStreamProviderOfEvent(),
-      fullscreenErrorEvent: EventStreamProviderOfEvent()
-    }),
-    statics: () => ({
-      isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
-      _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
-      _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
-      _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
-      _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
-      _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
-      _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
-    }),
-    names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
-  });
-  html$.Element._parseDocument = null;
-  html$.Element._parseRange = null;
-  html$.Element._defaultValidator = null;
-  html$.Element._defaultSanitizer = null;
-  html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
-  dart.defineLazy(html$.Element, {
-    get mouseWheelEvent() {
-      return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
-    },
-    get transitionEndEvent() {
-      return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
-    },
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('abort'));
-    },
-    get beforeCopyEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('beforecopy'));
-    },
-    get beforeCutEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('beforecut'));
-    },
-    get beforePasteEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('beforepaste'));
-    },
-    get blurEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('blur'));
-    },
-    get canPlayEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
-    },
-    get canPlayThroughEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
-    },
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    },
-    get clickEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
-    },
-    get contextMenuEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
-    },
-    get copyEvent() {
-      return dart.const(new (EventStreamProviderOfClipboardEvent())('copy'));
-    },
-    get cutEvent() {
-      return dart.const(new (EventStreamProviderOfClipboardEvent())('cut'));
-    },
-    get doubleClickEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
-    },
-    get dragEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
-    },
-    get dragEndEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
-    },
-    get dragEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
-    },
-    get dragLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
-    },
-    get dragOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
-    },
-    get dragStartEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
-    },
-    get dropEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
-    },
-    get durationChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
-    },
-    get emptiedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
-    },
-    get endedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ended'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get focusEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('focus'));
-    },
-    get inputEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('input'));
-    },
-    get invalidEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
-    },
-    get keyDownEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
-    },
-    get keyPressEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
-    },
-    get keyUpEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('load'));
-    },
-    get loadedDataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
-    },
-    get loadedMetadataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
-    },
-    get mouseDownEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
-    },
-    get mouseEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
-    },
-    get mouseLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
-    },
-    get mouseMoveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
-    },
-    get mouseOutEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
-    },
-    get mouseOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
-    },
-    get mouseUpEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
-    },
-    get pasteEvent() {
-      return dart.const(new (EventStreamProviderOfClipboardEvent())('paste'));
-    },
-    get pauseEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pause'));
-    },
-    get playEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('play'));
-    },
-    get playingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('playing'));
-    },
-    get rateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
-    },
-    get resetEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('reset'));
-    },
-    get resizeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('resize'));
-    },
-    get scrollEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
-    },
-    get searchEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('search'));
-    },
-    get seekedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
-    },
-    get seekingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
-    },
-    get selectEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('select'));
-    },
-    get selectStartEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('selectstart'));
-    },
-    get stalledEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
-    },
-    get submitEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('submit'));
-    },
-    get suspendEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
-    },
-    get timeUpdateEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
-    },
-    get touchCancelEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchcancel'));
-    },
-    get touchEndEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchend'));
-    },
-    get touchEnterEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchenter'));
-    },
-    get touchLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchleave'));
-    },
-    get touchMoveEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchmove'));
-    },
-    get touchStartEvent() {
-      return dart.const(new (EventStreamProviderOfTouchEvent())('touchstart'));
-    },
-    get volumeChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
-    },
-    get waitingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
-    },
-    get fullscreenChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenchange'));
-    },
-    get fullscreenErrorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
-    }
-  });
-  dart.registerExtension(dart.global.Element, html$.Element);
-  html$.HtmlElement = class HtmlElement extends html$.Element {
-    static new() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.HtmlElement, 'created');
-  dart.setSignature(html$.HtmlElement, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.HtmlElement, []),
-      created: dart.definiteFunctionType(html$.HtmlElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
-  html$._EntryArray = class _EntryArray extends core.Object {};
-  html$._EntryArray[dart.implements] = () => [ListOfEntry()];
-  dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
-  html$.spawnDomUri = function(uri, args, message) {
-    dart.throw(new core.UnimplementedError());
-  };
-  dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
-  html$.createCustomUpgrader = function(customElementClass, $this) {
-    return $this;
-  };
-  dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
-  dart.defineExtensionNames([
-    'onError'
-  ]);
-  html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get onError() {
-      return html$.AbstractWorker.errorEvent.forTarget(this);
-    }
-  };
-  html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
-  dart.setSignature(html$.AbstractWorker, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
-    getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
-  dart.defineLazy(html$.AbstractWorker, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    }
-  });
-  dart.defineExtensionNames([
-    'toString',
-    'download',
-    'hreflang',
-    'rel',
-    'target',
-    'type',
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'password',
-    'pathname',
-    'port',
-    'protocol',
-    'search',
-    'username'
-  ]);
-  html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(opts) {
-      let href = opts && 'href' in opts ? opts.href : null;
-      let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
-      if (href != null) e[dartx.href] = href;
-      return e;
-    }
-    created() {
-      this[dartx.download] = null;
-      this[dartx.hreflang] = null;
-      this[dartx.rel] = null;
-      this[dartx.target] = null;
-      this[dartx.type] = null;
-      this[dartx.hash] = null;
-      this[dartx.host] = null;
-      this[dartx.hostname] = null;
-      this[dartx.href] = null;
-      this[dartx.origin] = null;
-      this[dartx.password] = null;
-      this[dartx.pathname] = null;
-      this[dartx.port] = null;
-      this[dartx.protocol] = null;
-      this[dartx.search] = null;
-      this[dartx.username] = null;
-      super.created();
-    }
-    get [dartx.download]() {
-      return this.download;
-    }
-    set [dartx.download](value) {
-      this.download = value;
-    }
-    get [dartx.hreflang]() {
-      return this.hreflang;
-    }
-    set [dartx.hreflang](value) {
-      this.hreflang = value;
-    }
-    get [dartx.rel]() {
-      return this.rel;
-    }
-    set [dartx.rel](value) {
-      this.rel = value;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    set [dartx.target](value) {
-      this.target = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.hash]() {
-      return this.hash;
-    }
-    set [dartx.hash](value) {
-      this.hash = value;
-    }
-    get [dartx.host]() {
-      return this.host;
-    }
-    set [dartx.host](value) {
-      this.host = value;
-    }
-    get [dartx.hostname]() {
-      return this.hostname;
-    }
-    set [dartx.hostname](value) {
-      this.hostname = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.password]() {
-      return this.password;
-    }
-    set [dartx.password](value) {
-      this.password = value;
-    }
-    get [dartx.pathname]() {
-      return this.pathname;
-    }
-    set [dartx.pathname](value) {
-      this.pathname = value;
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-    set [dartx.port](value) {
-      this.port = value;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    set [dartx.protocol](value) {
-      this.protocol = value;
-    }
-    get [dartx.search]() {
-      return this.search;
-    }
-    set [dartx.search](value) {
-      this.search = value;
-    }
-    get [dartx.username]() {
-      return this.username;
-    }
-    set [dartx.username](value) {
-      this.username = value;
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-  };
-  dart.defineNamedConstructor(html$.AnchorElement, 'created');
-  html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
-  dart.setSignature(html$.AnchorElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AnchorElement, []),
-      new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
-      created: dart.definiteFunctionType(html$.AnchorElement, [])
-    }),
-    fields: () => ({
-      [dartx.download]: core.String,
-      [dartx.hreflang]: core.String,
-      [dartx.rel]: core.String,
-      [dartx.target]: core.String,
-      [dartx.type]: core.String,
-      [dartx.hash]: core.String,
-      [dartx.host]: core.String,
-      [dartx.hostname]: core.String,
-      [dartx.href]: core.String,
-      [dartx.origin]: core.String,
-      [dartx.password]: core.String,
-      [dartx.pathname]: core.String,
-      [dartx.port]: core.String,
-      [dartx.protocol]: core.String,
-      [dartx.search]: core.String,
-      [dartx.username]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
-  dart.defineExtensionNames([
-    'cancel',
-    'finish',
-    'pause',
-    'play',
-    'reverse',
-    'currentTime',
-    'effect',
-    'endClip',
-    'finished',
-    'playState',
-    'playbackRate',
-    'ready',
-    'startClip',
-    'startTime'
-  ]);
-  html$.Animation = class Animation extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!document.body.animate;
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    set [dartx.currentTime](value) {
-      this.currentTime = value;
-    }
-    get [dartx.effect]() {
-      return this.effect;
-    }
-    set [dartx.effect](value) {
-      this.effect = value;
-    }
-    get [dartx.endClip]() {
-      return this.endClip;
-    }
-    set [dartx.endClip](value) {
-      this.endClip = value;
-    }
-    get [dartx.finished]() {
-      return this.finished;
-    }
-    get [dartx.playState]() {
-      return this.playState;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    set [dartx.playbackRate](value) {
-      this.playbackRate = value;
-    }
-    get [dartx.ready]() {
-      return this.ready;
-    }
-    get [dartx.startClip]() {
-      return this.startClip;
-    }
-    set [dartx.startClip](value) {
-      this.startClip = value;
-    }
-    get [dartx.startTime]() {
-      return this.startTime;
-    }
-    set [dartx.startTime](value) {
-      this.startTime = value;
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.finish](...args) {
-      return this.finish.apply(this, args);
-    }
-    [dartx.pause](...args) {
-      return this.pause.apply(this, args);
-    }
-    [dartx.play](...args) {
-      return this.play.apply(this, args);
-    }
-    [dartx.reverse](...args) {
-      return this.reverse.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Animation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
-    fields: () => ({
-      [dartx.currentTime]: core.num,
-      [dartx.effect]: html$.AnimationEffectReadOnly,
-      [dartx.endClip]: core.num,
-      [dartx.finished]: async.Future,
-      [dartx.playState]: core.String,
-      [dartx.playbackRate]: core.num,
-      [dartx.ready]: async.Future,
-      [dartx.startClip]: core.num,
-      [dartx.startTime]: core.num
-    }),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
-      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
-      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
-      [dartx.play]: dart.definiteFunctionType(dart.void, []),
-      [dartx.reverse]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.Animation, html$.Animation);
-  const _get_computedTiming = Symbol('_get_computedTiming');
-  dart.defineExtensionNames([
-    'computedTiming',
-    'timing'
-  ]);
-  html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.computedTiming]() {
-      return html_common.convertNativeToDart_Dictionary(this[_get_computedTiming]);
-    }
-    get [_get_computedTiming]() {
-      return this.computedTiming;
-    }
-    get [dartx.timing]() {
-      return this.timing;
-    }
-  };
-  dart.setSignature(html$.AnimationEffectReadOnly, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
-    fields: () => ({
-      [_get_computedTiming]: dart.dynamic,
-      [dartx.timing]: html$.AnimationEffectTiming
-    }),
-    getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
-  });
-  dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
-  dart.defineExtensionNames([
-    'delay',
-    'direction',
-    'duration',
-    'easing',
-    'endDelay',
-    'fill',
-    'iterationStart',
-    'iterations',
-    'playbackRate'
-  ]);
-  html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.delay]() {
-      return this.delay;
-    }
-    set [dartx.delay](value) {
-      this.delay = value;
-    }
-    get [dartx.direction]() {
-      return this.direction;
-    }
-    set [dartx.direction](value) {
-      this.direction = value;
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    set [dartx.duration](value) {
-      this.duration = value;
-    }
-    get [dartx.easing]() {
-      return this.easing;
-    }
-    set [dartx.easing](value) {
-      this.easing = value;
-    }
-    get [dartx.endDelay]() {
-      return this.endDelay;
-    }
-    set [dartx.endDelay](value) {
-      this.endDelay = value;
-    }
-    get [dartx.fill]() {
-      return this.fill;
-    }
-    set [dartx.fill](value) {
-      this.fill = value;
-    }
-    get [dartx.iterationStart]() {
-      return this.iterationStart;
-    }
-    set [dartx.iterationStart](value) {
-      this.iterationStart = value;
-    }
-    get [dartx.iterations]() {
-      return this.iterations;
-    }
-    set [dartx.iterations](value) {
-      this.iterations = value;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    set [dartx.playbackRate](value) {
-      this.playbackRate = value;
-    }
-  };
-  dart.setSignature(html$.AnimationEffectTiming, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
-    fields: () => ({
-      [dartx.delay]: core.num,
-      [dartx.direction]: core.String,
-      [dartx.duration]: core.Object,
-      [dartx.easing]: core.String,
-      [dartx.endDelay]: core.num,
-      [dartx.fill]: core.String,
-      [dartx.iterationStart]: core.num,
-      [dartx.iterations]: core.num,
-      [dartx.playbackRate]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
-  dart.defineExtensionNames([
-    'animationName',
-    'elapsedTime'
-  ]);
-  html$.AnimationEvent = class AnimationEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.AnimationEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.AnimationEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.AnimationEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.AnimationEvent(type);
-    }
-    get [dartx.animationName]() {
-      return this.animationName;
-    }
-    get [dartx.elapsedTime]() {
-      return this.elapsedTime;
-    }
-  };
-  dart.setSignature(html$.AnimationEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AnimationEvent, []),
-      new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.animationName]: core.String,
-      [dartx.elapsedTime]: core.double
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
-  dart.defineExtensionNames([
-    'currentTime',
-    'timelineTime'
-  ]);
-  html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.AnimationPlayerEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.AnimationPlayerEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.AnimationPlayerEvent(type);
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    get [dartx.timelineTime]() {
-      return this.timelineTime;
-    }
-  };
-  dart.setSignature(html$.AnimationPlayerEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
-      new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.currentTime]: core.double,
-      [dartx.timelineTime]: core.double
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
-  dart.defineExtensionNames([
-    'getAnimations',
-    'play',
-    'currentTime',
-    'playbackRate'
-  ]);
-  html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    set [dartx.currentTime](value) {
-      this.currentTime = value;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    set [dartx.playbackRate](value) {
-      this.playbackRate = value;
-    }
-    [dartx.getAnimations](...args) {
-      return this.getAnimations.apply(this, args);
-    }
-    [dartx.play](...args) {
-      return this.play.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.AnimationTimeline, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
-    fields: () => ({
-      [dartx.currentTime]: core.num,
-      [dartx.playbackRate]: core.num
-    }),
-    methods: () => ({
-      [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
-      [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
-    })
-  });
-  dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
-  dart.defineExtensionNames([
-    'outcome',
-    'platform'
-  ]);
-  html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.outcome]() {
-      return this.outcome;
-    }
-    get [dartx.platform]() {
-      return this.platform;
-    }
-  };
-  dart.setSignature(html$.AppBannerPromptResult, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
-    fields: () => ({
-      [dartx.outcome]: core.String,
-      [dartx.platform]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
-  dart.defineExtensionNames([
-    'abort',
-    'swapCache',
-    'update',
-    'onCached',
-    'onChecking',
-    'onDownloading',
-    'onError',
-    'onNoUpdate',
-    'onObsolete',
-    'onProgress',
-    'onUpdateReady',
-    'status'
-  ]);
-  html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!window.applicationCache;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.swapCache](...args) {
-      return this.swapCache.apply(this, args);
-    }
-    [dartx.update](...args) {
-      return this.update.apply(this, args);
-    }
-    get [dartx.onCached]() {
-      return html$.ApplicationCache.cachedEvent.forTarget(this);
-    }
-    get [dartx.onChecking]() {
-      return html$.ApplicationCache.checkingEvent.forTarget(this);
-    }
-    get [dartx.onDownloading]() {
-      return html$.ApplicationCache.downloadingEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.ApplicationCache.errorEvent.forTarget(this);
-    }
-    get [dartx.onNoUpdate]() {
-      return html$.ApplicationCache.noUpdateEvent.forTarget(this);
-    }
-    get [dartx.onObsolete]() {
-      return html$.ApplicationCache.obsoleteEvent.forTarget(this);
-    }
-    get [dartx.onProgress]() {
-      return html$.ApplicationCache.progressEvent.forTarget(this);
-    }
-    get [dartx.onUpdateReady]() {
-      return html$.ApplicationCache.updateReadyEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.ApplicationCache, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
-    fields: () => ({[dartx.status]: core.int}),
-    getters: () => ({
-      [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.swapCache]: dart.definiteFunctionType(dart.void, []),
-      [dartx.update]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      cachedEvent: EventStreamProviderOfEvent(),
-      checkingEvent: EventStreamProviderOfEvent(),
-      downloadingEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      noUpdateEvent: EventStreamProviderOfEvent(),
-      obsoleteEvent: EventStreamProviderOfEvent(),
-      progressEvent: EventStreamProviderOfProgressEvent(),
-      updateReadyEvent: EventStreamProviderOfEvent(),
-      CHECKING: core.int,
-      DOWNLOADING: core.int,
-      IDLE: core.int,
-      OBSOLETE: core.int,
-      UNCACHED: core.int,
-      UPDATEREADY: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  html$.ApplicationCache.CHECKING = 2;
-  html$.ApplicationCache.DOWNLOADING = 3;
-  html$.ApplicationCache.IDLE = 1;
-  html$.ApplicationCache.OBSOLETE = 5;
-  html$.ApplicationCache.UNCACHED = 0;
-  html$.ApplicationCache.UPDATEREADY = 4;
-  dart.defineLazy(html$.ApplicationCache, {
-    get cachedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('cached'));
-    },
-    get checkingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('checking'));
-    },
-    get downloadingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('downloading'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get noUpdateEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('noupdate'));
-    },
-    get obsoleteEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('obsolete'));
-    },
-    get progressEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
-    },
-    get updateReadyEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('updateready'));
-    }
-  });
-  dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
-  dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
-  dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
-  dart.defineExtensionNames([
-    'message',
-    'reason',
-    'status',
-    'url'
-  ]);
-  html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ApplicationCacheErrorEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ApplicationCacheErrorEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ApplicationCacheErrorEvent(type);
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    get [dartx.reason]() {
-      return this.reason;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-  };
-  dart.setSignature(html$.ApplicationCacheErrorEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
-      new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.message]: core.String,
-      [dartx.reason]: core.String,
-      [dartx.status]: core.int,
-      [dartx.url]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
-  dart.defineExtensionNames([
-    'toString',
-    'alt',
-    'coords',
-    'shape',
-    'target',
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'password',
-    'pathname',
-    'port',
-    'protocol',
-    'search',
-    'username'
-  ]);
-  html$.AreaElement = class AreaElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
-    }
-    created() {
-      this[dartx.alt] = null;
-      this[dartx.coords] = null;
-      this[dartx.shape] = null;
-      this[dartx.target] = null;
-      this[dartx.hash] = null;
-      this[dartx.host] = null;
-      this[dartx.hostname] = null;
-      this[dartx.href] = null;
-      this[dartx.origin] = null;
-      this[dartx.password] = null;
-      this[dartx.pathname] = null;
-      this[dartx.port] = null;
-      this[dartx.protocol] = null;
-      this[dartx.search] = null;
-      this[dartx.username] = null;
-      super.created();
-    }
-    get [dartx.alt]() {
-      return this.alt;
-    }
-    set [dartx.alt](value) {
-      this.alt = value;
-    }
-    get [dartx.coords]() {
-      return this.coords;
-    }
-    set [dartx.coords](value) {
-      this.coords = value;
-    }
-    get [dartx.shape]() {
-      return this.shape;
-    }
-    set [dartx.shape](value) {
-      this.shape = value;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    set [dartx.target](value) {
-      this.target = value;
-    }
-    get [dartx.hash]() {
-      return this.hash;
-    }
-    set [dartx.hash](value) {
-      this.hash = value;
-    }
-    get [dartx.host]() {
-      return this.host;
-    }
-    set [dartx.host](value) {
-      this.host = value;
-    }
-    get [dartx.hostname]() {
-      return this.hostname;
-    }
-    set [dartx.hostname](value) {
-      this.hostname = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.password]() {
-      return this.password;
-    }
-    set [dartx.password](value) {
-      this.password = value;
-    }
-    get [dartx.pathname]() {
-      return this.pathname;
-    }
-    set [dartx.pathname](value) {
-      this.pathname = value;
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-    set [dartx.port](value) {
-      this.port = value;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    set [dartx.protocol](value) {
-      this.protocol = value;
-    }
-    get [dartx.search]() {
-      return this.search;
-    }
-    set [dartx.search](value) {
-      this.search = value;
-    }
-    get [dartx.username]() {
-      return this.username;
-    }
-    set [dartx.username](value) {
-      this.username = value;
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-  };
-  dart.defineNamedConstructor(html$.AreaElement, 'created');
-  html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
-  dart.setSignature(html$.AreaElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AreaElement, []),
-      new: dart.definiteFunctionType(html$.AreaElement, []),
-      created: dart.definiteFunctionType(html$.AreaElement, [])
-    }),
-    fields: () => ({
-      [dartx.alt]: core.String,
-      [dartx.coords]: core.String,
-      [dartx.shape]: core.String,
-      [dartx.target]: core.String,
-      [dartx.hash]: core.String,
-      [dartx.host]: core.String,
-      [dartx.hostname]: core.String,
-      [dartx.href]: core.String,
-      [dartx.origin]: core.String,
-      [dartx.password]: core.String,
-      [dartx.pathname]: core.String,
-      [dartx.port]: core.String,
-      [dartx.protocol]: core.String,
-      [dartx.search]: core.String,
-      [dartx.username]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
-  dart.defineExtensionNames([
-    'addTextTrack',
-    'canPlayType',
-    'load',
-    'pause',
-    'play',
-    'setMediaKeys',
-    'setSinkId',
-    'addKey',
-    'cancelKeyRequest',
-    'generateKeyRequest',
-    'onKeyAdded',
-    'onKeyError',
-    'onKeyMessage',
-    'onNeedKey',
-    'audioTracks',
-    'autoplay',
-    'buffered',
-    'controller',
-    'controls',
-    'crossOrigin',
-    'currentSrc',
-    'currentTime',
-    'defaultMuted',
-    'defaultPlaybackRate',
-    'duration',
-    'ended',
-    'error',
-    'loop',
-    'mediaGroup',
-    'mediaKeys',
-    'muted',
-    'networkState',
-    'paused',
-    'playbackRate',
-    'played',
-    'preload',
-    'readyState',
-    'seekable',
-    'seeking',
-    'session',
-    'sinkId',
-    'src',
-    'textTracks',
-    'videoTracks',
-    'volume',
-    'audioDecodedByteCount',
-    'videoDecodedByteCount'
-  ]);
-  html$.MediaElement = class MediaElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.audioTracks] = null;
-      this[dartx.autoplay] = null;
-      this[dartx.buffered] = null;
-      this[dartx.controller] = null;
-      this[dartx.controls] = null;
-      this[dartx.crossOrigin] = null;
-      this[dartx.currentSrc] = null;
-      this[dartx.currentTime] = null;
-      this[dartx.defaultMuted] = null;
-      this[dartx.defaultPlaybackRate] = null;
-      this[dartx.duration] = null;
-      this[dartx.ended] = null;
-      this[dartx.error] = null;
-      this[dartx.loop] = null;
-      this[dartx.mediaGroup] = null;
-      this[dartx.mediaKeys] = null;
-      this[dartx.muted] = null;
-      this[dartx.networkState] = null;
-      this[dartx.paused] = null;
-      this[dartx.playbackRate] = null;
-      this[dartx.played] = null;
-      this[dartx.preload] = null;
-      this[dartx.readyState] = null;
-      this[dartx.seekable] = null;
-      this[dartx.seeking] = null;
-      this[dartx.session] = null;
-      this[dartx.sinkId] = null;
-      this[dartx.src] = null;
-      this[dartx.textTracks] = null;
-      this[dartx.videoTracks] = null;
-      this[dartx.volume] = null;
-      this[dartx.audioDecodedByteCount] = null;
-      this[dartx.videoDecodedByteCount] = null;
-      super.created();
-    }
-    get [dartx.audioTracks]() {
-      return this.audioTracks;
-    }
-    get [dartx.autoplay]() {
-      return this.autoplay;
-    }
-    set [dartx.autoplay](value) {
-      this.autoplay = value;
-    }
-    get [dartx.buffered]() {
-      return this.buffered;
-    }
-    get [dartx.controller]() {
-      return this.controller;
-    }
-    set [dartx.controller](value) {
-      this.controller = value;
-    }
-    get [dartx.controls]() {
-      return this.controls;
-    }
-    set [dartx.controls](value) {
-      this.controls = value;
-    }
-    get [dartx.crossOrigin]() {
-      return this.crossOrigin;
-    }
-    set [dartx.crossOrigin](value) {
-      this.crossOrigin = value;
-    }
-    get [dartx.currentSrc]() {
-      return this.currentSrc;
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    set [dartx.currentTime](value) {
-      this.currentTime = value;
-    }
-    get [dartx.defaultMuted]() {
-      return this.defaultMuted;
-    }
-    set [dartx.defaultMuted](value) {
-      this.defaultMuted = value;
-    }
-    get [dartx.defaultPlaybackRate]() {
-      return this.defaultPlaybackRate;
-    }
-    set [dartx.defaultPlaybackRate](value) {
-      this.defaultPlaybackRate = value;
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    get [dartx.ended]() {
-      return this.ended;
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.loop]() {
-      return this.loop;
-    }
-    set [dartx.loop](value) {
-      this.loop = value;
-    }
-    get [dartx.mediaGroup]() {
-      return this.mediaGroup;
-    }
-    set [dartx.mediaGroup](value) {
-      this.mediaGroup = value;
-    }
-    get [dartx.mediaKeys]() {
-      return this.mediaKeys;
-    }
-    get [dartx.muted]() {
-      return this.muted;
-    }
-    set [dartx.muted](value) {
-      this.muted = value;
-    }
-    get [dartx.networkState]() {
-      return this.networkState;
-    }
-    get [dartx.paused]() {
-      return this.paused;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    set [dartx.playbackRate](value) {
-      this.playbackRate = value;
-    }
-    get [dartx.played]() {
-      return this.played;
-    }
-    get [dartx.preload]() {
-      return this.preload;
-    }
-    set [dartx.preload](value) {
-      this.preload = value;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.seekable]() {
-      return this.seekable;
-    }
-    get [dartx.seeking]() {
-      return this.seeking;
-    }
-    get [dartx.session]() {
-      return this.session;
-    }
-    set [dartx.session](value) {
-      this.session = value;
-    }
-    get [dartx.sinkId]() {
-      return this.sinkId;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.textTracks]() {
-      return this.textTracks;
-    }
-    get [dartx.videoTracks]() {
-      return this.videoTracks;
-    }
-    get [dartx.volume]() {
-      return this.volume;
-    }
-    set [dartx.volume](value) {
-      this.volume = value;
-    }
-    get [dartx.audioDecodedByteCount]() {
-      return this.webkitAudioDecodedByteCount;
-    }
-    get [dartx.videoDecodedByteCount]() {
-      return this.webkitVideoDecodedByteCount;
-    }
-    [dartx.addTextTrack](...args) {
-      return this.addTextTrack.apply(this, args);
-    }
-    [dartx.canPlayType](...args) {
-      return this.canPlayType.apply(this, args);
-    }
-    [dartx.load](...args) {
-      return this.load.apply(this, args);
-    }
-    [dartx.pause](...args) {
-      return this.pause.apply(this, args);
-    }
-    [dartx.play](...args) {
-      return this.play.apply(this, args);
-    }
-    [dartx.setMediaKeys](...args) {
-      return this.setMediaKeys.apply(this, args);
-    }
-    [dartx.setSinkId](...args) {
-      return this.setSinkId.apply(this, args);
-    }
-    [dartx.addKey](...args) {
-      return this.webkitAddKey.apply(this, args);
-    }
-    [dartx.cancelKeyRequest](...args) {
-      return this.webkitCancelKeyRequest.apply(this, args);
-    }
-    [dartx.generateKeyRequest](...args) {
-      return this.webkitGenerateKeyRequest.apply(this, args);
-    }
-    get [dartx.onKeyAdded]() {
-      return html$.MediaElement.keyAddedEvent.forElement(this);
-    }
-    get [dartx.onKeyError]() {
-      return html$.MediaElement.keyErrorEvent.forElement(this);
-    }
-    get [dartx.onKeyMessage]() {
-      return html$.MediaElement.keyMessageEvent.forElement(this);
-    }
-    get [dartx.onNeedKey]() {
-      return html$.MediaElement.needKeyEvent.forElement(this);
-    }
-  };
-  dart.defineNamedConstructor(html$.MediaElement, 'created');
-  dart.setSignature(html$.MediaElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaElement, []),
-      created: dart.definiteFunctionType(html$.MediaElement, [])
-    }),
-    fields: () => ({
-      [dartx.audioTracks]: html$.AudioTrackList,
-      [dartx.autoplay]: core.bool,
-      [dartx.buffered]: html$.TimeRanges,
-      [dartx.controller]: html$.MediaController,
-      [dartx.controls]: core.bool,
-      [dartx.crossOrigin]: core.String,
-      [dartx.currentSrc]: core.String,
-      [dartx.currentTime]: core.num,
-      [dartx.defaultMuted]: core.bool,
-      [dartx.defaultPlaybackRate]: core.num,
-      [dartx.duration]: core.double,
-      [dartx.ended]: core.bool,
-      [dartx.error]: html$.MediaError,
-      [dartx.loop]: core.bool,
-      [dartx.mediaGroup]: core.String,
-      [dartx.mediaKeys]: html$.MediaKeys,
-      [dartx.muted]: core.bool,
-      [dartx.networkState]: core.int,
-      [dartx.paused]: core.bool,
-      [dartx.playbackRate]: core.num,
-      [dartx.played]: html$.TimeRanges,
-      [dartx.preload]: core.String,
-      [dartx.readyState]: core.int,
-      [dartx.seekable]: html$.TimeRanges,
-      [dartx.seeking]: core.bool,
-      [dartx.session]: html$.MediaSession,
-      [dartx.sinkId]: core.String,
-      [dartx.src]: core.String,
-      [dartx.textTracks]: html$.TextTrackList,
-      [dartx.videoTracks]: html$.VideoTrackList,
-      [dartx.volume]: core.num,
-      [dartx.audioDecodedByteCount]: core.int,
-      [dartx.videoDecodedByteCount]: core.int
-    }),
-    getters: () => ({
-      [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
-      [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
-      [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
-      [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
-    }),
-    methods: () => ({
-      [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
-      [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
-      [dartx.load]: dart.definiteFunctionType(dart.void, []),
-      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
-      [dartx.play]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
-      [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
-      [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.generateKeyRequest]: dart.definiteFunctionType(dart.void, [core.String], [typed_data.Uint8List])
-    }),
-    sfields: () => ({
-      keyAddedEvent: EventStreamProviderOfMediaKeyEvent(),
-      keyErrorEvent: EventStreamProviderOfMediaKeyEvent(),
-      keyMessageEvent: EventStreamProviderOfMediaKeyEvent(),
-      needKeyEvent: EventStreamProviderOfMediaKeyEvent(),
-      HAVE_CURRENT_DATA: core.int,
-      HAVE_ENOUGH_DATA: core.int,
-      HAVE_FUTURE_DATA: core.int,
-      HAVE_METADATA: core.int,
-      HAVE_NOTHING: core.int,
-      NETWORK_EMPTY: core.int,
-      NETWORK_IDLE: core.int,
-      NETWORK_LOADING: core.int,
-      NETWORK_NO_SOURCE: core.int
-    })
-  });
-  html$.MediaElement.HAVE_CURRENT_DATA = 2;
-  html$.MediaElement.HAVE_ENOUGH_DATA = 4;
-  html$.MediaElement.HAVE_FUTURE_DATA = 3;
-  html$.MediaElement.HAVE_METADATA = 1;
-  html$.MediaElement.HAVE_NOTHING = 0;
-  html$.MediaElement.NETWORK_EMPTY = 0;
-  html$.MediaElement.NETWORK_IDLE = 1;
-  html$.MediaElement.NETWORK_LOADING = 2;
-  html$.MediaElement.NETWORK_NO_SOURCE = 3;
-  dart.defineLazy(html$.MediaElement, {
-    get keyAddedEvent() {
-      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
-    },
-    get keyErrorEvent() {
-      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyerror'));
-    },
-    get keyMessageEvent() {
-      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeymessage'));
-    },
-    get needKeyEvent() {
-      return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
-    }
-  });
-  dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
-  html$.AudioElement = class AudioElement extends html$.MediaElement {
-    static _(src) {
-      if (src === void 0) src = null;
-      if (src != null) {
-        return html$.AudioElement._create_1(src);
-      }
-      return html$.AudioElement._create_2();
-    }
-    static _create_1(src) {
-      return new Audio(src);
-    }
-    static _create_2() {
-      return new Audio();
-    }
-    created() {
-      super.created();
-    }
-    static new(src) {
-      if (src === void 0) src = null;
-      return html$.AudioElement._(src);
-    }
-  };
-  dart.defineNamedConstructor(html$.AudioElement, 'created');
-  dart.setSignature(html$.AudioElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
-      created: dart.definiteFunctionType(html$.AudioElement, []),
-      new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.AudioElement, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
-  dart.defineExtensionNames([
-    'enabled',
-    'id',
-    'kind',
-    'label',
-    'language'
-  ]);
-  html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.enabled]() {
-      return this.enabled;
-    }
-    set [dartx.enabled](value) {
-      this.enabled = value;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.language]() {
-      return this.language;
-    }
-  };
-  dart.setSignature(html$.AudioTrack, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
-    fields: () => ({
-      [dartx.enabled]: core.bool,
-      [dartx.id]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String,
-      [dartx.language]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
-  const __getter__ = Symbol('__getter__');
-  dart.defineExtensionNames([
-    'getTrackById',
-    'onChange',
-    'length'
-  ]);
-  html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.getTrackById](...args) {
-      return this.getTrackById.apply(this, args);
-    }
-    get [dartx.onChange]() {
-      return html$.AudioTrackList.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.AudioTrackList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
-    fields: () => ({[dartx.length]: core.int}),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
-      [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
-    }),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.AudioTrackList, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
-  dart.defineExtensionNames([
-    'reason'
-  ]);
-  html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.AutocompleteErrorEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.AutocompleteErrorEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.AutocompleteErrorEvent(type);
-    }
-    get [dartx.reason]() {
-      return this.reason;
-    }
-  };
-  dart.setSignature(html$.AutocompleteErrorEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
-      new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.reason]: core.String}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
-  html$.BRElement = class BRElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.BRElement._check(html$.document[dartx.createElement]("br"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.BRElement, 'created');
-  dart.setSignature(html$.BRElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.BRElement, []),
-      new: dart.definiteFunctionType(html$.BRElement, []),
-      created: dart.definiteFunctionType(html$.BRElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
-  dart.defineExtensionNames([
-    'visible'
-  ]);
-  html$.BarProp = class BarProp extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.visible]() {
-      return this.visible;
-    }
-  };
-  dart.setSignature(html$.BarProp, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
-    fields: () => ({[dartx.visible]: core.bool})
-  });
-  dart.registerExtension(dart.global.BarProp, html$.BarProp);
-  dart.defineExtensionNames([
-    'href',
-    'target'
-  ]);
-  html$.BaseElement = class BaseElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
-    }
-    created() {
-      this[dartx.href] = null;
-      this[dartx.target] = null;
-      super.created();
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    set [dartx.target](value) {
-      this.target = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.BaseElement, 'created');
-  dart.setSignature(html$.BaseElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.BaseElement, []),
-      new: dart.definiteFunctionType(html$.BaseElement, []),
-      created: dart.definiteFunctionType(html$.BaseElement, [])
-    }),
-    fields: () => ({
-      [dartx.href]: core.String,
-      [dartx.target]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
-  dart.defineExtensionNames([
-    'charging',
-    'chargingTime',
-    'dischargingTime',
-    'level'
-  ]);
-  html$.BatteryManager = class BatteryManager extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.charging]() {
-      return this.charging;
-    }
-    get [dartx.chargingTime]() {
-      return this.chargingTime;
-    }
-    get [dartx.dischargingTime]() {
-      return this.dischargingTime;
-    }
-    get [dartx.level]() {
-      return this.level;
-    }
-  };
-  dart.setSignature(html$.BatteryManager, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
-    fields: () => ({
-      [dartx.charging]: core.bool,
-      [dartx.chargingTime]: core.double,
-      [dartx.dischargingTime]: core.double,
-      [dartx.level]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
-  dart.defineExtensionNames([
-    'platforms',
-    'prompt',
-    'userChoice'
-  ]);
-  html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.BeforeInstallPromptEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.BeforeInstallPromptEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.BeforeInstallPromptEvent(type);
-    }
-    get [dartx.platforms]() {
-      return this.platforms;
-    }
-    get [dartx.userChoice]() {
-      return this.userChoice;
-    }
-    [dartx.prompt](...args) {
-      return this.prompt.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.BeforeInstallPromptEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
-      new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.userChoice]: async.Future}),
-    getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
-    methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
-  dart.defineExtensionNames([
-    'returnValue',
-    'returnValue'
-  ]);
-  html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.returnValue]() {
-      return this.returnValue;
-    }
-    set [dartx.returnValue](value) {
-      this.returnValue = value;
-    }
-  };
-  dart.setSignature(html$.BeforeUnloadEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
-    getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
-    setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
-  });
-  dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
-  dart.defineExtensionNames([
-    'close',
-    'slice',
-    'size',
-    'type'
-  ]);
-  html$.Blob = class Blob extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.slice](...args) {
-      return this.slice.apply(this, args);
-    }
-    static new(blobParts, type, endings) {
-      if (type === void 0) type = null;
-      if (endings === void 0) endings = null;
-      if (type == null && endings == null) {
-        return html$.Blob._check(html$.Blob._create_1(blobParts));
-      }
-      let bag = html$.Blob._create_bag();
-      if (type != null) html$.Blob._bag_set(bag, 'type', type);
-      if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
-      return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
-    }
-    static _create_1(parts) {
-      return new self.Blob(parts);
-    }
-    static _create_2(parts, bag) {
-      return new self.Blob(parts, bag);
-    }
-    static _create_bag() {
-      return {};
-    }
-    static _bag_set(bag, key, value) {
-      bag[key] = value;
-    }
-  };
-  dart.setSignature(html$.Blob, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.Blob, []),
-      new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
-    }),
-    fields: () => ({
-      [dartx.size]: core.int,
-      [dartx.type]: core.String
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
-      _create_bag: dart.definiteFunctionType(dart.dynamic, []),
-      _bag_set: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
-  });
-  dart.registerExtension(dart.global.Blob, html$.Blob);
-  const _requestDevice_1 = Symbol('_requestDevice_1');
-  dart.defineExtensionNames([
-    'requestDevice'
-  ]);
-  html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.requestDevice](options) {
-      let options_1 = html_common.convertDartToNative_Dictionary(options);
-      return this[_requestDevice_1](options_1);
-    }
-    [_requestDevice_1](...args) {
-      return this.requestDevice.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Bluetooth, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
-    methods: () => ({
-      [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
-      [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
-  dart.defineExtensionNames([
-    'connectGatt',
-    'deviceClass',
-    'instanceID',
-    'name',
-    'paired',
-    'productID',
-    'productVersion',
-    'vendorID',
-    'vendorIDSource'
-  ]);
-  html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.deviceClass]() {
-      return this.deviceClass;
-    }
-    get [dartx.instanceID]() {
-      return this.instanceID;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.paired]() {
-      return this.paired;
-    }
-    get [dartx.productID]() {
-      return this.productID;
-    }
-    get [dartx.productVersion]() {
-      return this.productVersion;
-    }
-    get [dartx.vendorID]() {
-      return this.vendorID;
-    }
-    get [dartx.vendorIDSource]() {
-      return this.vendorIDSource;
-    }
-    [dartx.connectGatt](...args) {
-      return this.connectGATT.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.BluetoothDevice, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
-    fields: () => ({
-      [dartx.deviceClass]: core.int,
-      [dartx.instanceID]: core.String,
-      [dartx.name]: core.String,
-      [dartx.paired]: core.bool,
-      [dartx.productID]: core.int,
-      [dartx.productVersion]: core.int,
-      [dartx.vendorID]: core.int,
-      [dartx.vendorIDSource]: core.String
-    }),
-    methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
-  });
-  dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
-  dart.defineExtensionNames([
-    'readValue',
-    'writeValue',
-    'uuid'
-  ]);
-  html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.uuid]() {
-      return this.uuid;
-    }
-    [dartx.readValue](...args) {
-      return this.readValue.apply(this, args);
-    }
-    [dartx.writeValue](...args) {
-      return this.writeValue.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.BluetoothGattCharacteristic, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
-    fields: () => ({[dartx.uuid]: core.String}),
-    methods: () => ({
-      [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
-      [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
-  dart.defineExtensionNames([
-    'getPrimaryService',
-    'connected'
-  ]);
-  html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.connected]() {
-      return this.connected;
-    }
-    [dartx.getPrimaryService](...args) {
-      return this.getPrimaryService.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.BluetoothGattRemoteServer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
-    fields: () => ({[dartx.connected]: core.bool}),
-    methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
-  });
-  dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
-  dart.defineExtensionNames([
-    'getCharacteristic',
-    'isPrimary',
-    'uuid'
-  ]);
-  html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.isPrimary]() {
-      return this.isPrimary;
-    }
-    get [dartx.uuid]() {
-      return this.uuid;
-    }
-    [dartx.getCharacteristic](...args) {
-      return this.getCharacteristic.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.BluetoothGattService, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
-    fields: () => ({
-      [dartx.isPrimary]: core.bool,
-      [dartx.uuid]: core.String
-    }),
-    methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
-  });
-  dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
-  html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.BluetoothUuid, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
-    statics: () => ({
-      canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
-      getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
-      getDescriptor: dart.definiteFunctionType(core.String, [core.Object]),
-      getService: dart.definiteFunctionType(core.String, [core.Object])
-    }),
-    names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
-  });
-  dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
-  dart.defineExtensionNames([
-    'arrayBuffer',
-    'blob',
-    'json',
-    'text',
-    'bodyUsed'
-  ]);
-  html$.Body = class Body extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.bodyUsed]() {
-      return this.bodyUsed;
-    }
-    [dartx.arrayBuffer](...args) {
-      return this.arrayBuffer.apply(this, args);
-    }
-    [dartx.blob](...args) {
-      return this.blob.apply(this, args);
-    }
-    [dartx.json](...args) {
-      return this.json.apply(this, args);
-    }
-    [dartx.text](...args) {
-      return this.text.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Body, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
-    fields: () => ({[dartx.bodyUsed]: core.bool}),
-    methods: () => ({
-      [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
-      [dartx.blob]: dart.definiteFunctionType(async.Future, []),
-      [dartx.json]: dart.definiteFunctionType(async.Future, []),
-      [dartx.text]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.Body, html$.Body);
-  dart.defineExtensionNames([
-    'onBlur',
-    'onError',
-    'onFocus',
-    'onHashChange',
-    'onLoad',
-    'onMessage',
-    'onOffline',
-    'onOnline',
-    'onPopState',
-    'onResize',
-    'onScroll',
-    'onStorage',
-    'onUnload'
-  ]);
-  html$.BodyElement = class BodyElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
-    }
-    created() {
-      super.created();
-    }
-    get [dartx.onBlur]() {
-      return html$.BodyElement.blurEvent.forElement(this);
-    }
-    get [dartx.onError]() {
-      return html$.BodyElement.errorEvent.forElement(this);
-    }
-    get [dartx.onFocus]() {
-      return html$.BodyElement.focusEvent.forElement(this);
-    }
-    get [dartx.onHashChange]() {
-      return html$.BodyElement.hashChangeEvent.forElement(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.BodyElement.loadEvent.forElement(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.BodyElement.messageEvent.forElement(this);
-    }
-    get [dartx.onOffline]() {
-      return html$.BodyElement.offlineEvent.forElement(this);
-    }
-    get [dartx.onOnline]() {
-      return html$.BodyElement.onlineEvent.forElement(this);
-    }
-    get [dartx.onPopState]() {
-      return html$.BodyElement.popStateEvent.forElement(this);
-    }
-    get [dartx.onResize]() {
-      return html$.BodyElement.resizeEvent.forElement(this);
-    }
-    get [dartx.onScroll]() {
-      return html$.BodyElement.scrollEvent.forElement(this);
-    }
-    get [dartx.onStorage]() {
-      return html$.BodyElement.storageEvent.forElement(this);
-    }
-    get [dartx.onUnload]() {
-      return html$.BodyElement.unloadEvent.forElement(this);
-    }
-  };
-  dart.defineNamedConstructor(html$.BodyElement, 'created');
-  html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
-  dart.setSignature(html$.BodyElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.BodyElement, []),
-      new: dart.definiteFunctionType(html$.BodyElement, []),
-      created: dart.definiteFunctionType(html$.BodyElement, [])
-    }),
-    getters: () => ({
-      [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
-      [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-      [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
-      [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
-      [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
-    }),
-    sfields: () => ({
-      blurEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      focusEvent: EventStreamProviderOfEvent(),
-      hashChangeEvent: EventStreamProviderOfEvent(),
-      loadEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      offlineEvent: EventStreamProviderOfEvent(),
-      onlineEvent: EventStreamProviderOfEvent(),
-      popStateEvent: EventStreamProviderOfPopStateEvent(),
-      resizeEvent: EventStreamProviderOfEvent(),
-      scrollEvent: EventStreamProviderOfEvent(),
-      storageEvent: EventStreamProviderOfStorageEvent(),
-      unloadEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(html$.BodyElement, {
-    get blurEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('blur'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get focusEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('focus'));
-    },
-    get hashChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('load'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get offlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('offline'));
-    },
-    get onlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('online'));
-    },
-    get popStateEvent() {
-      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
-    },
-    get resizeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('resize'));
-    },
-    get scrollEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
-    },
-    get storageEvent() {
-      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
-    },
-    get unloadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('unload'));
-    }
-  });
-  dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'setCustomValidity',
-    'autofocus',
-    'disabled',
-    'form',
-    'formAction',
-    'formEnctype',
-    'formMethod',
-    'formNoValidate',
-    'formTarget',
-    'labels',
-    'name',
-    'type',
-    'validationMessage',
-    'validity',
-    'value',
-    'willValidate'
-  ]);
-  html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
-    }
-    created() {
-      this[dartx.autofocus] = null;
-      this[dartx.disabled] = null;
-      this[dartx.form] = null;
-      this[dartx.formAction] = null;
-      this[dartx.formEnctype] = null;
-      this[dartx.formMethod] = null;
-      this[dartx.formNoValidate] = null;
-      this[dartx.formTarget] = null;
-      this[dartx.labels] = null;
-      this[dartx.name] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.value] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    get [dartx.autofocus]() {
-      return this.autofocus;
-    }
-    set [dartx.autofocus](value) {
-      this.autofocus = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.formAction]() {
-      return this.formAction;
-    }
-    set [dartx.formAction](value) {
-      this.formAction = value;
-    }
-    get [dartx.formEnctype]() {
-      return this.formEnctype;
-    }
-    set [dartx.formEnctype](value) {
-      this.formEnctype = value;
-    }
-    get [dartx.formMethod]() {
-      return this.formMethod;
-    }
-    set [dartx.formMethod](value) {
-      this.formMethod = value;
-    }
-    get [dartx.formNoValidate]() {
-      return this.formNoValidate;
-    }
-    set [dartx.formNoValidate](value) {
-      this.formNoValidate = value;
-    }
-    get [dartx.formTarget]() {
-      return this.formTarget;
-    }
-    set [dartx.formTarget](value) {
-      this.formTarget = value;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.ButtonElement, 'created');
-  dart.setSignature(html$.ButtonElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ButtonElement, []),
-      new: dart.definiteFunctionType(html$.ButtonElement, []),
-      created: dart.definiteFunctionType(html$.ButtonElement, [])
-    }),
-    fields: () => ({
-      [dartx.autofocus]: core.bool,
-      [dartx.disabled]: core.bool,
-      [dartx.form]: html$.FormElement,
-      [dartx.formAction]: core.String,
-      [dartx.formEnctype]: core.String,
-      [dartx.formMethod]: core.String,
-      [dartx.formNoValidate]: core.bool,
-      [dartx.formTarget]: core.String,
-      [dartx.labels]: ListOfNode(),
-      [dartx.name]: core.String,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.value]: core.String,
-      [dartx.willValidate]: core.bool
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
-  const _createTextNode = Symbol('_createTextNode');
-  dart.defineExtensionNames([
-    'appendData',
-    'deleteData',
-    'insertData',
-    'replaceData',
-    'substringData',
-    'after',
-    'before',
-    'data',
-    'length',
-    'nextElementSibling',
-    'previousElementSibling'
-  ]);
-  html$.CharacterData = class CharacterData extends html$.Node {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    set [dartx.data](value) {
-      this.data = value;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.appendData](...args) {
-      return this.appendData.apply(this, args);
-    }
-    [dartx.deleteData](...args) {
-      return this.deleteData.apply(this, args);
-    }
-    [dartx.insertData](...args) {
-      return this.insertData.apply(this, args);
-    }
-    [dartx.replaceData](...args) {
-      return this.replaceData.apply(this, args);
-    }
-    [dartx.substringData](...args) {
-      return this.substringData.apply(this, args);
-    }
-    [dartx.after](...args) {
-      return this.after.apply(this, args);
-    }
-    [dartx.before](...args) {
-      return this.before.apply(this, args);
-    }
-    get [dartx.nextElementSibling]() {
-      return this.nextElementSibling;
-    }
-    get [dartx.previousElementSibling]() {
-      return this.previousElementSibling;
-    }
-  };
-  html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
-  dart.setSignature(html$.CharacterData, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
-    fields: () => ({
-      [dartx.data]: core.String,
-      [dartx.length]: core.int,
-      [dartx.nextElementSibling]: html$.Element,
-      [dartx.previousElementSibling]: html$.Element
-    }),
-    methods: () => ({
-      [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.deleteData]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.insertData]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
-      [dartx.replaceData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
-      [dartx.substringData]: dart.definiteFunctionType(core.String, [core.int, core.int]),
-      [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
-      [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
-    })
-  });
-  dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
-  dart.defineExtensionNames([
-    'getDestinationInsertionPoints',
-    'splitText',
-    'wholeText'
-  ]);
-  html$.Text = class Text extends html$.CharacterData {
-    static new(data) {
-      return html$.document[_createTextNode](data);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.wholeText]() {
-      return this.wholeText;
-    }
-    [dartx.getDestinationInsertionPoints](...args) {
-      return this.getDestinationInsertionPoints.apply(this, args);
-    }
-    [dartx.splitText](...args) {
-      return this.splitText.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Text, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.Text, [core.String]),
-      _: dart.definiteFunctionType(html$.Text, [])
-    }),
-    fields: () => ({[dartx.wholeText]: core.String}),
-    methods: () => ({
-      [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
-      [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.Text, html$.Text);
-  html$.CDataSection = class CDataSection extends html$.Text {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.CDataSection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
-  });
-  dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
-  const _match_1 = Symbol('_match_1');
-  const _match_2 = Symbol('_match_2');
-  dart.defineExtensionNames([
-    'delete',
-    'has',
-    'keys',
-    'match',
-    'open'
-  ]);
-  html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.delete](...args) {
-      return this.delete.apply(this, args);
-    }
-    [dartx.has](...args) {
-      return this.has.apply(this, args);
-    }
-    [dartx.keys](...args) {
-      return this.keys.apply(this, args);
-    }
-    [dartx.match](request, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_match_1](request, options_1);
-      }
-      return this[_match_2](request);
-    }
-    [_match_1](...args) {
-      return this.match.apply(this, args);
-    }
-    [_match_2](...args) {
-      return this.match.apply(this, args);
-    }
-    [dartx.open](...args) {
-      return this.open.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CacheStorage, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
-    methods: () => ({
-      [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.keys]: dart.definiteFunctionType(async.Future, []),
-      [dartx.match]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
-      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_match_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
-  const _getContext_1 = Symbol('_getContext_1');
-  const _getContext_2 = Symbol('_getContext_2');
-  const _toDataUrl = Symbol('_toDataUrl');
-  dart.defineExtensionNames([
-    'getContext',
-    'onWebGlContextLost',
-    'onWebGlContextRestored',
-    'context2D',
-    'getContext3d',
-    'toDataUrl',
-    'height',
-    'width'
-  ]);
-  html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(opts) {
-      let width = opts && 'width' in opts ? opts.width : null;
-      let height = opts && 'height' in opts ? opts.height : null;
-      let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
-      if (width != null) e[dartx.width] = width;
-      if (height != null) e[dartx.height] = height;
-      return e;
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.width] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    [dartx.getContext](contextId, attributes) {
-      if (attributes === void 0) attributes = null;
-      if (attributes != null) {
-        let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
-        return this[_getContext_1](contextId, attributes_1);
-      }
-      return this[_getContext_2](contextId);
-    }
-    [_getContext_1](...args) {
-      return this.getContext.apply(this, args);
-    }
-    [_getContext_2](...args) {
-      return this.getContext.apply(this, args);
-    }
-    [_toDataUrl](...args) {
-      return this.toDataURL.apply(this, args);
-    }
-    get [dartx.onWebGlContextLost]() {
-      return html$.CanvasElement.webGlContextLostEvent.forElement(this);
-    }
-    get [dartx.onWebGlContextRestored]() {
-      return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
-    }
-    get [dartx.context2D]() {
-      return this.getContext('2d');
-    }
-    [dartx.getContext3d](opts) {
-      let alpha = opts && 'alpha' in opts ? opts.alpha : true;
-      let depth = opts && 'depth' in opts ? opts.depth : true;
-      let stencil = opts && 'stencil' in opts ? opts.stencil : false;
-      let antialias = opts && 'antialias' in opts ? opts.antialias : true;
-      let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
-      let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
-      let options = dart.map({alpha: alpha, depth: depth, stencil: stencil, antialias: antialias, premultipliedAlpha: premultipliedAlpha, preserveDrawingBuffer: preserveDrawingBuffer}, core.String, dart.dynamic);
-      let context = this[dartx.getContext]('webgl', options);
-      if (context == null) {
-        context = this[dartx.getContext]('experimental-webgl', options);
-      }
-      return web_gl.RenderingContext._check(context);
-    }
-    [dartx.toDataUrl](type, quality) {
-      if (type === void 0) type = 'image/png';
-      if (quality === void 0) quality = null;
-      return this[_toDataUrl](type, quality);
-    }
-  };
-  dart.defineNamedConstructor(html$.CanvasElement, 'created');
-  html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
-  dart.setSignature(html$.CanvasElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.CanvasElement, []),
-      new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
-      created: dart.definiteFunctionType(html$.CanvasElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: core.int,
-      [dartx.width]: core.int
-    }),
-    getters: () => ({
-      [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
-      [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
-      [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
-    }),
-    methods: () => ({
-      [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
-      [_getContext_1]: dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic]),
-      [_getContext_2]: dart.definiteFunctionType(core.Object, [dart.dynamic]),
-      [_toDataUrl]: dart.definiteFunctionType(core.String, [core.String], [dart.dynamic]),
-      [dartx.getContext3d]: dart.definiteFunctionType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
-      [dartx.toDataUrl]: dart.definiteFunctionType(core.String, [], [core.String, core.num])
-    }),
-    sfields: () => ({
-      webGlContextLostEvent: EventStreamProviderOfContextEvent(),
-      webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
-    })
-  });
-  dart.defineLazy(html$.CanvasElement, {
-    get webGlContextLostEvent() {
-      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
-    },
-    get webGlContextRestoredEvent() {
-      return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
-    }
-  });
-  dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
-  dart.defineExtensionNames([
-    'addColorStop'
-  ]);
-  html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.addColorStop](...args) {
-      return this.addColorStop.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CanvasGradient, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
-    methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
-  });
-  dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
-  dart.defineExtensionNames([
-    'setTransform'
-  ]);
-  html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.setTransform](...args) {
-      return this.setTransform.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CanvasPattern, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
-    methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
-  });
-  dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
-  html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
-  const _addHitRegion_1 = Symbol('_addHitRegion_1');
-  const _addHitRegion_2 = Symbol('_addHitRegion_2');
-  const _createImageData_1 = Symbol('_createImageData_1');
-  const _createImageData_2 = Symbol('_createImageData_2');
-  const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
-  const _getImageData_1 = Symbol('_getImageData_1');
-  const _getLineDash = Symbol('_getLineDash');
-  const _putImageData_1 = Symbol('_putImageData_1');
-  const _putImageData_2 = Symbol('_putImageData_2');
-  const _arc = Symbol('_arc');
-  dart.defineExtensionNames([
-    'addHitRegion',
-    'beginPath',
-    'clearHitRegions',
-    'clearRect',
-    'clip',
-    'createImageData',
-    'createLinearGradient',
-    'createPattern',
-    'createRadialGradient',
-    'drawFocusIfNeeded',
-    'fillRect',
-    'getContextAttributes',
-    'getImageData',
-    'isContextLost',
-    'isPointInPath',
-    'isPointInStroke',
-    'measureText',
-    'putImageData',
-    'removeHitRegion',
-    'resetTransform',
-    'restore',
-    'rotate',
-    'save',
-    'scale',
-    'scrollPathIntoView',
-    'setTransform',
-    'stroke',
-    'strokeRect',
-    'strokeText',
-    'transform',
-    'translate',
-    'arcTo',
-    'bezierCurveTo',
-    'closePath',
-    'ellipse',
-    'lineTo',
-    'moveTo',
-    'quadraticCurveTo',
-    'rect',
-    'createImageDataFromImageData',
-    'setFillColorRgb',
-    'setFillColorHsl',
-    'setStrokeColorRgb',
-    'setStrokeColorHsl',
-    'arc',
-    'createPatternFromImage',
-    'drawImageToRect',
-    'drawImage',
-    'drawImageScaled',
-    'drawImageScaledFromSource',
-    'lineDashOffset',
-    'lineDashOffset',
-    'getLineDash',
-    'setLineDash',
-    'fillText',
-    'fill',
-    'backingStorePixelRatio',
-    'canvas',
-    'currentTransform',
-    'direction',
-    'fillStyle',
-    'filter',
-    'font',
-    'globalAlpha',
-    'globalCompositeOperation',
-    'imageSmoothingEnabled',
-    'lineCap',
-    'lineJoin',
-    'lineWidth',
-    'miterLimit',
-    'shadowBlur',
-    'shadowColor',
-    'shadowOffsetX',
-    'shadowOffsetY',
-    'strokeStyle',
-    'textAlign',
-    'textBaseline'
-  ]);
-  html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.canvas]() {
-      return this.canvas;
-    }
-    get [dartx.currentTransform]() {
-      return this.currentTransform;
-    }
-    set [dartx.currentTransform](value) {
-      this.currentTransform = value;
-    }
-    get [dartx.direction]() {
-      return this.direction;
-    }
-    set [dartx.direction](value) {
-      this.direction = value;
-    }
-    get [dartx.fillStyle]() {
-      return this.fillStyle;
-    }
-    set [dartx.fillStyle](value) {
-      this.fillStyle = value;
-    }
-    get [dartx.filter]() {
-      return this.filter;
-    }
-    set [dartx.filter](value) {
-      this.filter = value;
-    }
-    get [dartx.font]() {
-      return this.font;
-    }
-    set [dartx.font](value) {
-      this.font = value;
-    }
-    get [dartx.globalAlpha]() {
-      return this.globalAlpha;
-    }
-    set [dartx.globalAlpha](value) {
-      this.globalAlpha = value;
-    }
-    get [dartx.globalCompositeOperation]() {
-      return this.globalCompositeOperation;
-    }
-    set [dartx.globalCompositeOperation](value) {
-      this.globalCompositeOperation = value;
-    }
-    get [dartx.imageSmoothingEnabled]() {
-      return this.imageSmoothingEnabled;
-    }
-    set [dartx.imageSmoothingEnabled](value) {
-      this.imageSmoothingEnabled = value;
-    }
-    get [dartx.lineCap]() {
-      return this.lineCap;
-    }
-    set [dartx.lineCap](value) {
-      this.lineCap = value;
-    }
-    get [dartx.lineJoin]() {
-      return this.lineJoin;
-    }
-    set [dartx.lineJoin](value) {
-      this.lineJoin = value;
-    }
-    get [dartx.lineWidth]() {
-      return this.lineWidth;
-    }
-    set [dartx.lineWidth](value) {
-      this.lineWidth = value;
-    }
-    get [dartx.miterLimit]() {
-      return this.miterLimit;
-    }
-    set [dartx.miterLimit](value) {
-      this.miterLimit = value;
-    }
-    get [dartx.shadowBlur]() {
-      return this.shadowBlur;
-    }
-    set [dartx.shadowBlur](value) {
-      this.shadowBlur = value;
-    }
-    get [dartx.shadowColor]() {
-      return this.shadowColor;
-    }
-    set [dartx.shadowColor](value) {
-      this.shadowColor = value;
-    }
-    get [dartx.shadowOffsetX]() {
-      return this.shadowOffsetX;
-    }
-    set [dartx.shadowOffsetX](value) {
-      this.shadowOffsetX = value;
-    }
-    get [dartx.shadowOffsetY]() {
-      return this.shadowOffsetY;
-    }
-    set [dartx.shadowOffsetY](value) {
-      this.shadowOffsetY = value;
-    }
-    get [dartx.strokeStyle]() {
-      return this.strokeStyle;
-    }
-    set [dartx.strokeStyle](value) {
-      this.strokeStyle = value;
-    }
-    get [dartx.textAlign]() {
-      return this.textAlign;
-    }
-    set [dartx.textAlign](value) {
-      this.textAlign = value;
-    }
-    get [dartx.textBaseline]() {
-      return this.textBaseline;
-    }
-    set [dartx.textBaseline](value) {
-      this.textBaseline = value;
-    }
-    [dartx.addHitRegion](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[_addHitRegion_1](options_1);
-        return;
-      }
-      this[_addHitRegion_2]();
-      return;
-    }
-    [_addHitRegion_1](...args) {
-      return this.addHitRegion.apply(this, args);
-    }
-    [_addHitRegion_2](...args) {
-      return this.addHitRegion.apply(this, args);
-    }
-    [dartx.beginPath](...args) {
-      return this.beginPath.apply(this, args);
-    }
-    [dartx.clearHitRegions](...args) {
-      return this.clearHitRegions.apply(this, args);
-    }
-    [dartx.clearRect](...args) {
-      return this.clearRect.apply(this, args);
-    }
-    [dartx.clip](...args) {
-      return this.clip.apply(this, args);
-    }
-    [dartx.createImageData](imagedata_OR_sw, sh) {
-      if (sh === void 0) sh = null;
-      if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
-        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
-        return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
-      }
-      if (sh != null && typeof imagedata_OR_sw == 'number') {
-        return html_common.convertNativeToDart_ImageData(this[_createImageData_2](imagedata_OR_sw, sh));
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_createImageData_1](...args) {
-      return this.createImageData.apply(this, args);
-    }
-    [_createImageData_2](...args) {
-      return this.createImageData.apply(this, args);
-    }
-    [dartx.createLinearGradient](...args) {
-      return this.createLinearGradient.apply(this, args);
-    }
-    [dartx.createPattern](...args) {
-      return this.createPattern.apply(this, args);
-    }
-    [dartx.createRadialGradient](...args) {
-      return this.createRadialGradient.apply(this, args);
-    }
-    [dartx.drawFocusIfNeeded](...args) {
-      return this.drawFocusIfNeeded.apply(this, args);
-    }
-    [dartx.fillRect](...args) {
-      return this.fillRect.apply(this, args);
-    }
-    [dartx.getContextAttributes]() {
-      return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
-    }
-    [_getContextAttributes_1](...args) {
-      return this.getContextAttributes.apply(this, args);
-    }
-    [dartx.getImageData](sx, sy, sw, sh) {
-      return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
-    }
-    [_getImageData_1](...args) {
-      return this.getImageData.apply(this, args);
-    }
-    [_getLineDash](...args) {
-      return this.getLineDash.apply(this, args);
-    }
-    [dartx.isContextLost](...args) {
-      return this.isContextLost.apply(this, args);
-    }
-    [dartx.isPointInPath](...args) {
-      return this.isPointInPath.apply(this, args);
-    }
-    [dartx.isPointInStroke](...args) {
-      return this.isPointInStroke.apply(this, args);
-    }
-    [dartx.measureText](...args) {
-      return this.measureText.apply(this, args);
-    }
-    [dartx.putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
-      if (dirtyX === void 0) dirtyX = null;
-      if (dirtyY === void 0) dirtyY = null;
-      if (dirtyWidth === void 0) dirtyWidth = null;
-      if (dirtyHeight === void 0) dirtyHeight = null;
-      if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
-        this[_putImageData_1](imagedata_1, dx, dy);
-        return;
-      }
-      if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
-        let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
-        this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_putImageData_1](...args) {
-      return this.putImageData.apply(this, args);
-    }
-    [_putImageData_2](...args) {
-      return this.putImageData.apply(this, args);
-    }
-    [dartx.removeHitRegion](...args) {
-      return this.removeHitRegion.apply(this, args);
-    }
-    [dartx.resetTransform](...args) {
-      return this.resetTransform.apply(this, args);
-    }
-    [dartx.restore](...args) {
-      return this.restore.apply(this, args);
-    }
-    [dartx.rotate](...args) {
-      return this.rotate.apply(this, args);
-    }
-    [dartx.save](...args) {
-      return this.save.apply(this, args);
-    }
-    [dartx.scale](...args) {
-      return this.scale.apply(this, args);
-    }
-    [dartx.scrollPathIntoView](...args) {
-      return this.scrollPathIntoView.apply(this, args);
-    }
-    [dartx.setTransform](...args) {
-      return this.setTransform.apply(this, args);
-    }
-    [dartx.stroke](...args) {
-      return this.stroke.apply(this, args);
-    }
-    [dartx.strokeRect](...args) {
-      return this.strokeRect.apply(this, args);
-    }
-    [dartx.strokeText](...args) {
-      return this.strokeText.apply(this, args);
-    }
-    [dartx.transform](...args) {
-      return this.transform.apply(this, args);
-    }
-    [dartx.translate](...args) {
-      return this.translate.apply(this, args);
-    }
-    [_arc](...args) {
-      return this.arc.apply(this, args);
-    }
-    [dartx.arcTo](...args) {
-      return this.arcTo.apply(this, args);
-    }
-    [dartx.bezierCurveTo](...args) {
-      return this.bezierCurveTo.apply(this, args);
-    }
-    [dartx.closePath](...args) {
-      return this.closePath.apply(this, args);
-    }
-    [dartx.ellipse](...args) {
-      return this.ellipse.apply(this, args);
-    }
-    [dartx.lineTo](...args) {
-      return this.lineTo.apply(this, args);
-    }
-    [dartx.moveTo](...args) {
-      return this.moveTo.apply(this, args);
-    }
-    [dartx.quadraticCurveTo](...args) {
-      return this.quadraticCurveTo.apply(this, args);
-    }
-    [dartx.rect](...args) {
-      return this.rect.apply(this, args);
-    }
-    [dartx.createImageDataFromImageData](imagedata) {
-      return this.createImageData(imagedata);
-    }
-    [dartx.setFillColorRgb](r, g, b, a) {
-      if (a === void 0) a = 1;
-      this[dartx.fillStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
-    }
-    [dartx.setFillColorHsl](h, s, l, a) {
-      if (a === void 0) a = 1;
-      this[dartx.fillStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
-    }
-    [dartx.setStrokeColorRgb](r, g, b, a) {
-      if (a === void 0) a = 1;
-      this[dartx.strokeStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
-    }
-    [dartx.setStrokeColorHsl](h, s, l, a) {
-      if (a === void 0) a = 1;
-      this[dartx.strokeStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
-    }
-    [dartx.arc](x, y, radius, startAngle, endAngle, anticlockwise) {
-      if (anticlockwise === void 0) anticlockwise = false;
-      this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
-    }
-    [dartx.createPatternFromImage](image, repetitionType) {
-      return this.createPattern(image, repetitionType);
-    }
-    [dartx.drawImageToRect](source, destRect, opts) {
-      let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
-      if (sourceRect == null) {
-        this[dartx.drawImageScaled](source, destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
-      } else {
-        this[dartx.drawImageScaledFromSource](source, sourceRect[dartx.left], sourceRect[dartx.top], sourceRect[dartx.width], sourceRect[dartx.height], destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
-      }
-    }
-    [dartx.drawImage](...args) {
-      return this.drawImage.apply(this, args);
-    }
-    [dartx.drawImageScaled](...args) {
-      return this.drawImage.apply(this, args);
-    }
-    [dartx.drawImageScaledFromSource](...args) {
-      return this.drawImage.apply(this, args);
-    }
-    get [dartx.lineDashOffset]() {
-      return this.lineDashOffset || this.webkitLineDashOffset;
-    }
-    set [dartx.lineDashOffset](value) {
-      typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
-    }
-    [dartx.getLineDash]() {
-      if (!!this.getLineDash) {
-        return this.getLineDash();
-      } else if (!!this.webkitLineDash) {
-        return this.webkitLineDash;
-      }
-    }
-    [dartx.setLineDash](dash) {
-      if (!!this.setLineDash) {
-        this.setLineDash(dash);
-      } else if (!!this.webkitLineDash) {
-        this.webkitLineDash = dash;
-      }
-    }
-    [dartx.fillText](text, x, y, maxWidth) {
-      if (maxWidth === void 0) maxWidth = null;
-      if (maxWidth != null) {
-        this.fillText(text, x, y, maxWidth);
-      } else {
-        this.fillText(text, x, y);
-      }
-    }
-    [dartx.fill](winding) {
-      if (winding === void 0) winding = 'nonzero';
-      this.fill(winding);
-    }
-    get [dartx.backingStorePixelRatio]() {
-      return 1.0;
-    }
-  };
-  html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
-  dart.setSignature(html$.CanvasRenderingContext2D, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
-    fields: () => ({
-      [dartx.canvas]: html$.CanvasElement,
-      [dartx.currentTransform]: svg$.Matrix,
-      [dartx.direction]: core.String,
-      [dartx.fillStyle]: core.Object,
-      [dartx.filter]: core.String,
-      [dartx.font]: core.String,
-      [dartx.globalAlpha]: core.num,
-      [dartx.globalCompositeOperation]: core.String,
-      [dartx.imageSmoothingEnabled]: core.bool,
-      [dartx.lineCap]: core.String,
-      [dartx.lineJoin]: core.String,
-      [dartx.lineWidth]: core.num,
-      [dartx.miterLimit]: core.num,
-      [dartx.shadowBlur]: core.num,
-      [dartx.shadowColor]: core.String,
-      [dartx.shadowOffsetX]: core.num,
-      [dartx.shadowOffsetY]: core.num,
-      [dartx.strokeStyle]: core.Object,
-      [dartx.textAlign]: core.String,
-      [dartx.textBaseline]: core.String
-    }),
-    getters: () => ({
-      [dartx.lineDashOffset]: dart.definiteFunctionType(core.num, []),
-      [dartx.backingStorePixelRatio]: dart.definiteFunctionType(core.double, [])
-    }),
-    setters: () => ({[dartx.lineDashOffset]: dart.definiteFunctionType(dart.void, [core.num])}),
-    methods: () => ({
-      [dartx.addHitRegion]: dart.definiteFunctionType(dart.void, [], [core.Map]),
-      [_addHitRegion_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_addHitRegion_2]: dart.definiteFunctionType(dart.void, []),
-      [dartx.beginPath]: dart.definiteFunctionType(dart.void, []),
-      [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
-      [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
-      [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
-      [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
-      [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
-      [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
-      [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
-      [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
-      [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
-      [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
-      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
-      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
-      [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
-      [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
-      [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.resetTransform]: dart.definiteFunctionType(dart.void, []),
-      [dartx.restore]: dart.definiteFunctionType(dart.void, []),
-      [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.save]: dart.definiteFunctionType(dart.void, []),
-      [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
-      [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
-      [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
-      [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.translate]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [_arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
-      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
-      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
-      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
-      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
-      [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
-      [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
-      [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
-      [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
-      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
-      [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
-      [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
-      [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
-      [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
-      [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
-      [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
-      [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
-      [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
-  html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.ChildNode, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
-  });
-  html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.ChromiumValuebuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
-  });
-  dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
-  dart.defineExtensionNames([
-    'id'
-  ]);
-  html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-  };
-  dart.setSignature(html$.GeofencingRegion, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
-    fields: () => ({[dartx.id]: core.String})
-  });
-  dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
-  dart.defineExtensionNames([
-    'latitude',
-    'longitude',
-    'radius'
-  ]);
-  html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(init) {
-      let init_1 = html_common.convertDartToNative_Dictionary(init);
-      return html$.CircularGeofencingRegion._create_1(init_1);
-    }
-    static _create_1(init) {
-      return new self.CircularGeofencingRegion(init);
-    }
-    get [dartx.latitude]() {
-      return this.latitude;
-    }
-    get [dartx.longitude]() {
-      return this.longitude;
-    }
-    get [dartx.radius]() {
-      return this.radius;
-    }
-  };
-  dart.setSignature(html$.CircularGeofencingRegion, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
-      new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
-    }),
-    fields: () => ({
-      [dartx.latitude]: core.double,
-      [dartx.longitude]: core.double,
-      [dartx.radius]: core.double
-    }),
-    sfields: () => ({
-      MAX_RADIUS: core.num,
-      MIN_RADIUS: core.num
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
-    names: ['_create_1']
-  });
-  html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
-  html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
-  dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
-  const _postMessage_1 = Symbol('_postMessage_1');
-  const _postMessage_2 = Symbol('_postMessage_2');
-  dart.defineExtensionNames([
-    'postMessage',
-    'frameType',
-    'id',
-    'url'
-  ]);
-  html$.Client = class Client extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.frameType]() {
-      return this.frameType;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Client, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
-    fields: () => ({
-      [dartx.frameType]: core.String,
-      [dartx.id]: core.String,
-      [dartx.url]: core.String
-    }),
-    methods: () => ({
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.Client, html$.Client);
-  const _matchAll_1 = Symbol('_matchAll_1');
-  const _matchAll_2 = Symbol('_matchAll_2');
-  dart.defineExtensionNames([
-    'claim',
-    'matchAll',
-    'openWindow'
-  ]);
-  html$.Clients = class Clients extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.claim](...args) {
-      return this.claim.apply(this, args);
-    }
-    [dartx.matchAll](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_matchAll_1](options_1);
-      }
-      return this[_matchAll_2]();
-    }
-    [_matchAll_1](...args) {
-      return this.matchAll.apply(this, args);
-    }
-    [_matchAll_2](...args) {
-      return this.matchAll.apply(this, args);
-    }
-    [dartx.openWindow](...args) {
-      return this.openWindow.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Clients, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
-    methods: () => ({
-      [dartx.claim]: dart.definiteFunctionType(async.Future, []),
-      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_matchAll_2]: dart.definiteFunctionType(async.Future, []),
-      [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Clients, html$.Clients);
-  dart.defineExtensionNames([
-    'clipboardData'
-  ]);
-  html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.clipboardData]() {
-      return this.clipboardData;
-    }
-  };
-  dart.setSignature(html$.ClipboardEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
-    fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
-  });
-  dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
-  dart.defineExtensionNames([
-    'code',
-    'reason',
-    'wasClean'
-  ]);
-  html$.CloseEvent = class CloseEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.CloseEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.CloseEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.CloseEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.CloseEvent(type);
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-    get [dartx.reason]() {
-      return this.reason;
-    }
-    get [dartx.wasClean]() {
-      return this.wasClean;
-    }
-  };
-  dart.setSignature(html$.CloseEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.CloseEvent, []),
-      new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.code]: core.int,
-      [dartx.reason]: core.String,
-      [dartx.wasClean]: core.bool
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
-  html$.Comment = class Comment extends html$.CharacterData {
-    static new(data) {
-      if (data === void 0) data = null;
-      if (data != null) {
-        return html$.document.createComment(data);
-      }
-      return html$.document.createComment("");
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.Comment, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
-      _: dart.definiteFunctionType(html$.Comment, [])
-    })
-  });
-  dart.registerExtension(dart.global.Comment, html$.Comment);
-  const _initCompositionEvent = Symbol('_initCompositionEvent');
-  const _initUIEvent = Symbol('_initUIEvent');
-  const _charCode = Symbol('_charCode');
-  const _keyCode = Symbol('_keyCode');
-  const _get_view = Symbol('_get_view');
-  const _which = Symbol('_which');
-  dart.defineExtensionNames([
-    'view',
-    'detail',
-    'sourceDevice'
-  ]);
-  html$.UIEvent = class UIEvent extends html$.Event {
-    static new(type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let detail = opts && 'detail' in opts ? opts.detail : 0;
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      if (view == null) {
-        view = html$.window;
-      }
-      let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
-      e[_initUIEvent](type, canBubble, cancelable, view, detail);
-      return e;
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.UIEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.UIEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.UIEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.UIEvent(type);
-    }
-    get [_charCode]() {
-      return this.charCode;
-    }
-    get [dartx.detail]() {
-      return this.detail;
-    }
-    get [_keyCode]() {
-      return this.keyCode;
-    }
-    get [dartx.sourceDevice]() {
-      return this.sourceDevice;
-    }
-    get [dartx.view]() {
-      return html$._convertNativeToDart_Window(this[_get_view]);
-    }
-    get [_get_view]() {
-      return this.view;
-    }
-    get [_which]() {
-      return this.which;
-    }
-    [_initUIEvent](...args) {
-      return this.initUIEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.UIEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
-      _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_charCode]: core.int,
-      [dartx.detail]: core.int,
-      [_keyCode]: core.int,
-      [dartx.sourceDevice]: html$.InputDevice,
-      [_get_view]: dart.dynamic,
-      [_which]: core.int
-    }),
-    getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
-    methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
-  dart.defineExtensionNames([
-    'data'
-  ]);
-  html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
-      let view = opts && 'view' in opts ? opts.view : null;
-      let data = opts && 'data' in opts ? opts.data : null;
-      let locale = opts && 'locale' in opts ? opts.locale : null;
-      if (view == null) {
-        view = html$.window;
-      }
-      let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
-      if (dart.test(html_common.Device.isFirefox)) {
-        e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
-      } else {
-        e[_initCompositionEvent](type, canBubble, cancelable, view, data);
-      }
-      return e;
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.CompositionEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.CompositionEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.CompositionEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.CompositionEvent(type);
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    [_initCompositionEvent](...args) {
-      return this.initCompositionEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CompositionEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
-      _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.data]: core.String}),
-    methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
-  dart.defineExtensionNames([
-    'disconnect',
-    'supports',
-    'opacity',
-    'scrollLeft',
-    'scrollTop',
-    'transform'
-  ]);
-  html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(element, attributeArray) {
-      return html$.CompositorProxy._create_1(element, attributeArray);
-    }
-    static _create_1(element, attributeArray) {
-      return new self.CompositorProxy(element, attributeArray);
-    }
-    get [dartx.opacity]() {
-      return this.opacity;
-    }
-    set [dartx.opacity](value) {
-      this.opacity = value;
-    }
-    get [dartx.scrollLeft]() {
-      return this.scrollLeft;
-    }
-    set [dartx.scrollLeft](value) {
-      this.scrollLeft = value;
-    }
-    get [dartx.scrollTop]() {
-      return this.scrollTop;
-    }
-    set [dartx.scrollTop](value) {
-      this.scrollTop = value;
-    }
-    get [dartx.transform]() {
-      return this.transform;
-    }
-    set [dartx.transform](value) {
-      this.transform = value;
-    }
-    [dartx.disconnect](...args) {
-      return this.disconnect.apply(this, args);
-    }
-    [dartx.supports](...args) {
-      return this.supports.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CompositorProxy, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.CompositorProxy, []),
-      new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
-    }),
-    fields: () => ({
-      [dartx.opacity]: core.num,
-      [dartx.scrollLeft]: core.num,
-      [dartx.scrollTop]: core.num,
-      [dartx.transform]: html$.DomMatrix
-    }),
-    methods: () => ({
-      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
-      [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
-  dart.defineExtensionNames([
-    'postMessage',
-    'terminate',
-    'onError',
-    'onMessage'
-  ]);
-  html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(scriptUrl) {
-      return html$.CompositorWorker._create_1(scriptUrl);
-    }
-    static _create_1(scriptUrl) {
-      return new self.CompositorWorker(scriptUrl);
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [dartx.terminate](...args) {
-      return this.terminate.apply(this, args);
-    }
-    get [dartx.onError]() {
-      return html$.CompositorWorker.errorEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.CompositorWorker.messageEvent.forTarget(this);
-    }
-  };
-  html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
-  dart.setSignature(html$.CompositorWorker, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.CompositorWorker, []),
-      new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
-    }),
-    getters: () => ({
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
-    }),
-    methods: () => ({
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      errorEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent()
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.defineLazy(html$.CompositorWorker, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
-  const _fetch_1 = Symbol('_fetch_1');
-  const _fetch_2 = Symbol('_fetch_2');
-  const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
-  const _webkitResolveLocalFileSystemUrl = Symbol('_webkitResolveLocalFileSystemUrl');
-  const _setInterval_String = Symbol('_setInterval_String');
-  const _setTimeout_String = Symbol('_setTimeout_String');
-  const _clearInterval = Symbol('_clearInterval');
-  const _clearTimeout = Symbol('_clearTimeout');
-  const _setInterval = Symbol('_setInterval');
-  const _setTimeout = Symbol('_setTimeout');
-  dart.defineExtensionNames([
-    'close',
-    'fetch',
-    'importScripts',
-    'webkitRequestFileSystem',
-    'requestFileSystemSync',
-    'resolveLocalFileSystemSyncUrl',
-    'webkitResolveLocalFileSystemUrl',
-    'atob',
-    'btoa',
-    'onError',
-    'caches',
-    'console',
-    'crypto',
-    'indexedDB',
-    'location',
-    'navigator',
-    'performance',
-    'self'
-  ]);
-  html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.caches]() {
-      return this.caches;
-    }
-    get [dartx.console]() {
-      return this.console;
-    }
-    get [dartx.crypto]() {
-      return this.crypto;
-    }
-    get [dartx.indexedDB]() {
-      return this.indexedDB;
-    }
-    get [dartx.location]() {
-      return this.location;
-    }
-    get [dartx.navigator]() {
-      return this.navigator;
-    }
-    get [dartx.performance]() {
-      return this.performance;
-    }
-    get [dartx.self]() {
-      return this.self;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.fetch](input, init) {
-      if (init === void 0) init = null;
-      if (init != null) {
-        let init_1 = html_common.convertDartToNative_Dictionary(init);
-        return this[_fetch_1](input, init_1);
-      }
-      return this[_fetch_2](input);
-    }
-    [_fetch_1](...args) {
-      return this.fetch.apply(this, args);
-    }
-    [_fetch_2](...args) {
-      return this.fetch.apply(this, args);
-    }
-    [dartx.importScripts](...args) {
-      return this.importScripts.apply(this, args);
-    }
-    [_webkitRequestFileSystem](...args) {
-      return this.webkitRequestFileSystem.apply(this, args);
-    }
-    [dartx.webkitRequestFileSystem](type, size) {
-      let completer = CompleterOfFileSystem().new();
-      this[_webkitRequestFileSystem](type, size, dart.fn(value => {
-        completer.complete(value);
-      }, FileSystemToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [dartx.requestFileSystemSync](...args) {
-      return this.webkitRequestFileSystemSync.apply(this, args);
-    }
-    [dartx.resolveLocalFileSystemSyncUrl](...args) {
-      return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
-    }
-    [_webkitResolveLocalFileSystemUrl](...args) {
-      return this.webkitResolveLocalFileSystemURL.apply(this, args);
-    }
-    [dartx.webkitResolveLocalFileSystemUrl](url) {
-      let completer = CompleterOfEntry().new();
-      this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
-        completer.complete(value);
-      }, EntryToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [dartx.atob](...args) {
-      return this.atob.apply(this, args);
-    }
-    [dartx.btoa](...args) {
-      return this.btoa.apply(this, args);
-    }
-    [_setInterval_String](...args) {
-      return this.setInterval.apply(this, args);
-    }
-    [_setTimeout_String](...args) {
-      return this.setTimeout.apply(this, args);
-    }
-    [_clearInterval](...args) {
-      return this.clearInterval.apply(this, args);
-    }
-    [_clearTimeout](...args) {
-      return this.clearTimeout.apply(this, args);
-    }
-    [_setInterval](...args) {
-      return this.setInterval.apply(this, args);
-    }
-    [_setTimeout](...args) {
-      return this.setTimeout.apply(this, args);
-    }
-    get [dartx.onError]() {
-      return html$.WorkerGlobalScope.errorEvent.forTarget(this);
-    }
-  };
-  html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
-  dart.setSignature(html$.WorkerGlobalScope, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
-    fields: () => ({
-      [dartx.caches]: html$.CacheStorage,
-      [dartx.console]: html$.WorkerConsole,
-      [dartx.crypto]: html$.Crypto,
-      [dartx.indexedDB]: indexed_db.IdbFactory,
-      [dartx.location]: html$._WorkerLocation,
-      [dartx.navigator]: html$._WorkerNavigator,
-      [dartx.performance]: html$.WorkerPerformance,
-      [dartx.self]: html$.WorkerGlobalScope
-    }),
-    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
-      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
-      [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
-      [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
-      [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
-      [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
-      [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
-      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
-      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
-      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
-      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int])
-    }),
-    sfields: () => ({
-      errorEvent: EventStreamProviderOfEvent(),
-      PERSISTENT: core.int,
-      TEMPORARY: core.int
-    })
-  });
-  html$.WorkerGlobalScope.PERSISTENT = 1;
-  html$.WorkerGlobalScope.TEMPORARY = 0;
-  dart.defineLazy(html$.WorkerGlobalScope, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    }
-  });
-  dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
-  dart.defineExtensionNames([
-    'cancelAnimationFrame',
-    'postMessage',
-    'requestAnimationFrame',
-    'onMessage'
-  ]);
-  html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.cancelAnimationFrame](...args) {
-      return this.cancelAnimationFrame.apply(this, args);
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [dartx.requestAnimationFrame](...args) {
-      return this.requestAnimationFrame.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.CompositorWorkerGlobalScope, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.CompositorWorkerGlobalScope, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
-  const _isConsoleDefined = Symbol('_isConsoleDefined');
-  html$.Console = class Console extends core.Object {
-    _safe() {
-    }
-    get [_isConsoleDefined]() {
-      return typeof console != "undefined";
-    }
-    get memory() {
-      return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
-    }
-    assertCondition(condition, arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
-    }
-    clear(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.clear(arg) : null;
-    }
-    count(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.count(arg) : null;
-    }
-    debug(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.debug(arg) : null;
-    }
-    dir(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.dir(arg) : null;
-    }
-    dirxml(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.dirxml(arg) : null;
-    }
-    error(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.error(arg) : null;
-    }
-    group(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.group(arg) : null;
-    }
-    groupCollapsed(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.groupCollapsed(arg) : null;
-    }
-    groupEnd() {
-      return dart.test(this[_isConsoleDefined]) ? console.groupEnd() : null;
-    }
-    info(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.info(arg) : null;
-    }
-    log(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.log(arg) : null;
-    }
-    markTimeline(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.markTimeline(arg) : null;
-    }
-    profile(title) {
-      return dart.test(this[_isConsoleDefined]) ? console.profile(title) : null;
-    }
-    profileEnd(title) {
-      return dart.test(this[_isConsoleDefined]) ? console.profileEnd(title) : null;
-    }
-    table(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.table(arg) : null;
-    }
-    time(title) {
-      return dart.test(this[_isConsoleDefined]) ? console.time(title) : null;
-    }
-    timeEnd(title) {
-      return dart.test(this[_isConsoleDefined]) ? console.timeEnd(title) : null;
-    }
-    timeStamp(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.timeStamp(arg) : null;
-    }
-    trace(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.trace(arg) : null;
-    }
-    warn(arg) {
-      return dart.test(this[_isConsoleDefined]) ? console.warn(arg) : null;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.defineNamedConstructor(html$.Console, '_safe');
-  dart.setSignature(html$.Console, {
-    constructors: () => ({
-      _safe: dart.definiteFunctionType(html$.Console, []),
-      _: dart.definiteFunctionType(html$.Console, [])
-    }),
-    getters: () => ({
-      [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
-      memory: dart.definiteFunctionType(html$.MemoryInfo, [])
-    }),
-    methods: () => ({
-      assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
-      clear: dart.definiteFunctionType(dart.void, [core.Object]),
-      count: dart.definiteFunctionType(dart.void, [core.Object]),
-      debug: dart.definiteFunctionType(dart.void, [core.Object]),
-      dir: dart.definiteFunctionType(dart.void, [core.Object]),
-      dirxml: dart.definiteFunctionType(dart.void, [core.Object]),
-      error: dart.definiteFunctionType(dart.void, [core.Object]),
-      group: dart.definiteFunctionType(dart.void, [core.Object]),
-      groupCollapsed: dart.definiteFunctionType(dart.void, [core.Object]),
-      groupEnd: dart.definiteFunctionType(dart.void, []),
-      info: dart.definiteFunctionType(dart.void, [core.Object]),
-      log: dart.definiteFunctionType(dart.void, [core.Object]),
-      markTimeline: dart.definiteFunctionType(dart.void, [core.Object]),
-      profile: dart.definiteFunctionType(dart.void, [core.String]),
-      profileEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      table: dart.definiteFunctionType(dart.void, [core.Object]),
-      time: dart.definiteFunctionType(dart.void, [core.String]),
-      timeEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      timeStamp: dart.definiteFunctionType(dart.void, [core.Object]),
-      trace: dart.definiteFunctionType(dart.void, [core.Object]),
-      warn: dart.definiteFunctionType(dart.void, [core.Object])
-    }),
-    sfields: () => ({_safeConsole: html$.Console})
-  });
-  dart.defineLazy(html$.Console, {
-    get _safeConsole() {
-      return dart.const(new html$.Console._safe());
-    }
-  });
-  dart.defineExtensionNames([
-    'assertCondition',
-    'timeline',
-    'timelineEnd'
-  ]);
-  html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.assertCondition](...args) {
-      return this.assert.apply(this, args);
-    }
-    [dartx.timeline](...args) {
-      return this.timeline.apply(this, args);
-    }
-    [dartx.timelineEnd](...args) {
-      return this.timelineEnd.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ConsoleBase, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
-    methods: () => ({
-      [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
-      [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
-  dart.defineExtensionNames([
-    'getDistributedNodes',
-    'select'
-  ]);
-  html$.ContentElement = class ContentElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
-    }
-    created() {
-      this[dartx.select] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('content');
-    }
-    get [dartx.select]() {
-      return this.select;
-    }
-    set [dartx.select](value) {
-      this.select = value;
-    }
-    [dartx.getDistributedNodes](...args) {
-      return this.getDistributedNodes.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.ContentElement, 'created');
-  dart.setSignature(html$.ContentElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ContentElement, []),
-      new: dart.definiteFunctionType(html$.ContentElement, []),
-      created: dart.definiteFunctionType(html$.ContentElement, [])
-    }),
-    fields: () => ({[dartx.select]: core.String}),
-    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
-  dart.defineExtensionNames([
-    'accuracy',
-    'altitude',
-    'altitudeAccuracy',
-    'heading',
-    'latitude',
-    'longitude',
-    'speed'
-  ]);
-  html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.accuracy]() {
-      return this.accuracy;
-    }
-    get [dartx.altitude]() {
-      return this.altitude;
-    }
-    get [dartx.altitudeAccuracy]() {
-      return this.altitudeAccuracy;
-    }
-    get [dartx.heading]() {
-      return this.heading;
-    }
-    get [dartx.latitude]() {
-      return this.latitude;
-    }
-    get [dartx.longitude]() {
-      return this.longitude;
-    }
-    get [dartx.speed]() {
-      return this.speed;
-    }
-  };
-  dart.setSignature(html$.Coordinates, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
-    fields: () => ({
-      [dartx.accuracy]: core.double,
-      [dartx.altitude]: core.double,
-      [dartx.altitudeAccuracy]: core.double,
-      [dartx.heading]: core.double,
-      [dartx.latitude]: core.double,
-      [dartx.longitude]: core.double,
-      [dartx.speed]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
-  dart.defineExtensionNames([
-    'iconUrl',
-    'id',
-    'name',
-    'type'
-  ]);
-  html$.Credential = class Credential extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.iconUrl]() {
-      return this.iconURL;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.Credential, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
-    fields: () => ({
-      [dartx.iconUrl]: core.String,
-      [dartx.id]: core.String,
-      [dartx.name]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.Credential, html$.Credential);
-  const _request_1 = Symbol('_request_1');
-  const _request_2 = Symbol('_request_2');
-  dart.defineExtensionNames([
-    'notifySignedIn',
-    'request',
-    'requireUserMediation'
-  ]);
-  html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.notifySignedIn](...args) {
-      return this.notifySignedIn.apply(this, args);
-    }
-    [dartx.request](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_request_1](options_1);
-      }
-      return this[_request_2]();
-    }
-    [_request_1](...args) {
-      return this.request.apply(this, args);
-    }
-    [_request_2](...args) {
-      return this.request.apply(this, args);
-    }
-    [dartx.requireUserMediation](...args) {
-      return this.requireUserMediation.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CredentialsContainer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
-    methods: () => ({
-      [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
-      [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_request_2]: dart.definiteFunctionType(async.Future, []),
-      [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
-  dart.defineExtensionNames([
-    'acceptConnection',
-    'client'
-  ]);
-  html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.client]() {
-      return this.client;
-    }
-    [dartx.acceptConnection](...args) {
-      return this.acceptConnection.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CrossOriginConnectEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
-    fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
-    methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
-  });
-  dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
-  dart.defineExtensionNames([
-    'postMessage',
-    'origin',
-    'targetUrl'
-  ]);
-  html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.targetUrl]() {
-      return this.targetUrl;
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CrossOriginServiceWorkerClient, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
-    fields: () => ({
-      [dartx.origin]: core.String,
-      [dartx.targetUrl]: core.String
-    }),
-    methods: () => ({
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
-  const _getRandomValues = Symbol('_getRandomValues');
-  dart.defineExtensionNames([
-    'getRandomValues',
-    'subtle'
-  ]);
-  html$.Crypto = class Crypto extends _interceptors.Interceptor {
-    [dartx.getRandomValues](array) {
-      return this[_getRandomValues](array);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!(window.crypto && window.crypto.getRandomValues);
-    }
-    get [dartx.subtle]() {
-      return this.subtle;
-    }
-    [_getRandomValues](...args) {
-      return this.getRandomValues.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Crypto, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
-    fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
-    methods: () => ({
-      [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
-      [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.Crypto, html$.Crypto);
-  dart.defineExtensionNames([
-    'algorithm',
-    'extractable',
-    'type',
-    'usages'
-  ]);
-  html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.algorithm]() {
-      return this.algorithm;
-    }
-    get [dartx.extractable]() {
-      return this.extractable;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.usages]() {
-      return this.usages;
-    }
-  };
-  dart.setSignature(html$.CryptoKey, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
-    fields: () => ({
-      [dartx.algorithm]: core.Object,
-      [dartx.extractable]: core.bool,
-      [dartx.type]: core.String,
-      [dartx.usages]: ListOfString()
-    })
-  });
-  dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
-  html$.Css = class Css extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.Css, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
-    statics: () => ({
-      supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
-      supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    names: ['supports', 'supportsCondition']
-  });
-  dart.registerExtension(dart.global.CSS, html$.Css);
-  dart.defineExtensionNames([
-    'cssText',
-    'parentRule',
-    'parentStyleSheet',
-    'type'
-  ]);
-  html$.CssRule = class CssRule extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cssText]() {
-      return this.cssText;
-    }
-    set [dartx.cssText](value) {
-      this.cssText = value;
-    }
-    get [dartx.parentRule]() {
-      return this.parentRule;
-    }
-    get [dartx.parentStyleSheet]() {
-      return this.parentStyleSheet;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.CssRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
-    fields: () => ({
-      [dartx.cssText]: core.String,
-      [dartx.parentRule]: html$.CssRule,
-      [dartx.parentStyleSheet]: html$.CssStyleSheet,
-      [dartx.type]: core.int
-    }),
-    sfields: () => ({
-      CHARSET_RULE: core.int,
-      FONT_FACE_RULE: core.int,
-      IMPORT_RULE: core.int,
-      KEYFRAMES_RULE: core.int,
-      KEYFRAME_RULE: core.int,
-      MEDIA_RULE: core.int,
-      PAGE_RULE: core.int,
-      STYLE_RULE: core.int,
-      SUPPORTS_RULE: core.int,
-      VIEWPORT_RULE: core.int,
-      WEBKIT_KEYFRAMES_RULE: core.int,
-      WEBKIT_KEYFRAME_RULE: core.int
-    })
-  });
-  html$.CssRule.CHARSET_RULE = 2;
-  html$.CssRule.FONT_FACE_RULE = 5;
-  html$.CssRule.IMPORT_RULE = 3;
-  html$.CssRule.KEYFRAMES_RULE = 7;
-  html$.CssRule.KEYFRAME_RULE = 8;
-  html$.CssRule.MEDIA_RULE = 4;
-  html$.CssRule.PAGE_RULE = 6;
-  html$.CssRule.STYLE_RULE = 1;
-  html$.CssRule.SUPPORTS_RULE = 12;
-  html$.CssRule.VIEWPORT_RULE = 15;
-  html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
-  html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
-  dart.registerExtension(dart.global.CSSRule, html$.CssRule);
-  dart.defineExtensionNames([
-    'encoding'
-  ]);
-  html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.encoding]() {
-      return this.encoding;
-    }
-    set [dartx.encoding](value) {
-      this.encoding = value;
-    }
-  };
-  dart.setSignature(html$.CssCharsetRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
-    fields: () => ({[dartx.encoding]: core.String})
-  });
-  dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
-  dart.defineExtensionNames([
-    'style'
-  ]);
-  html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-  };
-  dart.setSignature(html$.CssFontFaceRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
-    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
-  });
-  dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
-  dart.defineExtensionNames([
-    'deleteRule',
-    'insertRule',
-    'cssRules'
-  ]);
-  html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cssRules]() {
-      return this.cssRules;
-    }
-    [dartx.deleteRule](...args) {
-      return this.deleteRule.apply(this, args);
-    }
-    [dartx.insertRule](...args) {
-      return this.insertRule.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CssGroupingRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
-    fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
-    methods: () => ({
-      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
-  dart.defineExtensionNames([
-    'href',
-    'media',
-    'styleSheet'
-  ]);
-  html$.CssImportRule = class CssImportRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    get [dartx.styleSheet]() {
-      return this.styleSheet;
-    }
-  };
-  dart.setSignature(html$.CssImportRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
-    fields: () => ({
-      [dartx.href]: core.String,
-      [dartx.media]: html$.MediaList,
-      [dartx.styleSheet]: html$.CssStyleSheet
-    })
-  });
-  dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
-  dart.defineExtensionNames([
-    'keyText',
-    'style'
-  ]);
-  html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.keyText]() {
-      return this.keyText;
-    }
-    set [dartx.keyText](value) {
-      this.keyText = value;
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-  };
-  dart.setSignature(html$.CssKeyframeRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
-    fields: () => ({
-      [dartx.keyText]: core.String,
-      [dartx.style]: html$.CssStyleDeclaration
-    })
-  });
-  dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
-  dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
-  dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
-  dart.defineExtensionNames([
-    'appendRule',
-    'deleteRule',
-    'findRule',
-    'cssRules',
-    'name'
-  ]);
-  html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cssRules]() {
-      return this.cssRules;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.appendRule](...args) {
-      return this.appendRule.apply(this, args);
-    }
-    [dartx.deleteRule](...args) {
-      return this.deleteRule.apply(this, args);
-    }
-    [dartx.findRule](...args) {
-      return this.findRule.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CssKeyframesRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
-    fields: () => ({
-      [dartx.cssRules]: ListOfCssRule(),
-      [dartx.name]: core.String
-    }),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
-      [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
-  dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
-  dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
-  dart.defineExtensionNames([
-    'media'
-  ]);
-  html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-  };
-  dart.setSignature(html$.CssMediaRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
-    fields: () => ({[dartx.media]: html$.MediaList})
-  });
-  dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
-  dart.defineExtensionNames([
-    'selectorText',
-    'style'
-  ]);
-  html$.CssPageRule = class CssPageRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.selectorText]() {
-      return this.selectorText;
-    }
-    set [dartx.selectorText](value) {
-      this.selectorText = value;
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-  };
-  dart.setSignature(html$.CssPageRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
-    fields: () => ({
-      [dartx.selectorText]: core.String,
-      [dartx.style]: html$.CssStyleDeclaration
-    })
-  });
-  dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
-  const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
-  const _supportsProperty = Symbol('_supportsProperty');
-  const _getPropertyValue = Symbol('_getPropertyValue');
-  const _setPropertyHelper = Symbol('_setPropertyHelper');
-  const _browserPropertyName = Symbol('_browserPropertyName');
-  const _background = Symbol('_background');
-  const _backgroundAttachment = Symbol('_backgroundAttachment');
-  const _backgroundColor = Symbol('_backgroundColor');
-  const _backgroundImage = Symbol('_backgroundImage');
-  const _backgroundPosition = Symbol('_backgroundPosition');
-  const _backgroundRepeat = Symbol('_backgroundRepeat');
-  const _border = Symbol('_border');
-  const _borderBottom = Symbol('_borderBottom');
-  const _borderBottomColor = Symbol('_borderBottomColor');
-  const _borderBottomStyle = Symbol('_borderBottomStyle');
-  const _borderBottomWidth = Symbol('_borderBottomWidth');
-  const _borderCollapse = Symbol('_borderCollapse');
-  const _borderColor = Symbol('_borderColor');
-  const _borderLeft = Symbol('_borderLeft');
-  const _borderLeftColor = Symbol('_borderLeftColor');
-  const _borderLeftStyle = Symbol('_borderLeftStyle');
-  const _borderLeftWidth = Symbol('_borderLeftWidth');
-  const _borderRight = Symbol('_borderRight');
-  const _borderRightColor = Symbol('_borderRightColor');
-  const _borderRightStyle = Symbol('_borderRightStyle');
-  const _borderRightWidth = Symbol('_borderRightWidth');
-  const _borderSpacing = Symbol('_borderSpacing');
-  const _borderStyle = Symbol('_borderStyle');
-  const _borderTop = Symbol('_borderTop');
-  const _borderTopColor = Symbol('_borderTopColor');
-  const _borderTopStyle = Symbol('_borderTopStyle');
-  const _borderTopWidth = Symbol('_borderTopWidth');
-  const _borderWidth = Symbol('_borderWidth');
-  const _bottom = Symbol('_bottom');
-  const _captionSide = Symbol('_captionSide');
-  const _clear$1 = Symbol('_clear');
-  const _clip = Symbol('_clip');
-  const _color = Symbol('_color');
-  const _content = Symbol('_content');
-  const _cursor = Symbol('_cursor');
-  const _direction = Symbol('_direction');
-  const _display = Symbol('_display');
-  const _emptyCells = Symbol('_emptyCells');
-  const _font = Symbol('_font');
-  const _fontFamily = Symbol('_fontFamily');
-  const _fontSize = Symbol('_fontSize');
-  const _fontStyle = Symbol('_fontStyle');
-  const _fontVariant = Symbol('_fontVariant');
-  const _fontWeight = Symbol('_fontWeight');
-  const _height$ = Symbol('_height');
-  const _left = Symbol('_left');
-  const _letterSpacing = Symbol('_letterSpacing');
-  const _lineHeight = Symbol('_lineHeight');
-  const _listStyle = Symbol('_listStyle');
-  const _listStyleImage = Symbol('_listStyleImage');
-  const _listStylePosition = Symbol('_listStylePosition');
-  const _listStyleType = Symbol('_listStyleType');
-  const _margin = Symbol('_margin');
-  const _marginBottom = Symbol('_marginBottom');
-  const _marginLeft = Symbol('_marginLeft');
-  const _marginRight = Symbol('_marginRight');
-  const _marginTop = Symbol('_marginTop');
-  const _maxHeight = Symbol('_maxHeight');
-  const _maxWidth = Symbol('_maxWidth');
-  const _minHeight = Symbol('_minHeight');
-  const _minWidth = Symbol('_minWidth');
-  const _outline = Symbol('_outline');
-  const _outlineColor = Symbol('_outlineColor');
-  const _outlineStyle = Symbol('_outlineStyle');
-  const _outlineWidth = Symbol('_outlineWidth');
-  const _overflow = Symbol('_overflow');
-  const _padding = Symbol('_padding');
-  const _paddingBottom = Symbol('_paddingBottom');
-  const _paddingLeft = Symbol('_paddingLeft');
-  const _paddingRight = Symbol('_paddingRight');
-  const _paddingTop = Symbol('_paddingTop');
-  const _pageBreakAfter = Symbol('_pageBreakAfter');
-  const _pageBreakBefore = Symbol('_pageBreakBefore');
-  const _pageBreakInside = Symbol('_pageBreakInside');
-  const _position$1 = Symbol('_position');
-  const _quotes = Symbol('_quotes');
-  const _right = Symbol('_right');
-  const _tableLayout = Symbol('_tableLayout');
-  const _textAlign = Symbol('_textAlign');
-  const _textDecoration = Symbol('_textDecoration');
-  const _textIndent = Symbol('_textIndent');
-  const _textTransform = Symbol('_textTransform');
-  const _top = Symbol('_top');
-  const _unicodeBidi = Symbol('_unicodeBidi');
-  const _verticalAlign = Symbol('_verticalAlign');
-  const _visibility = Symbol('_visibility');
-  const _whiteSpace = Symbol('_whiteSpace');
-  const _width$ = Symbol('_width');
-  const _wordSpacing = Symbol('_wordSpacing');
-  const _zIndex = Symbol('_zIndex');
-  dart.defineExtensionNames([
-    'alignContent',
-    'alignContent',
-    'alignItems',
-    'alignItems',
-    'alignSelf',
-    'alignSelf',
-    'animation',
-    'animation',
-    'animationDelay',
-    'animationDelay',
-    'animationDirection',
-    'animationDirection',
-    'animationDuration',
-    'animationDuration',
-    'animationFillMode',
-    'animationFillMode',
-    'animationIterationCount',
-    'animationIterationCount',
-    'animationName',
-    'animationName',
-    'animationPlayState',
-    'animationPlayState',
-    'animationTimingFunction',
-    'animationTimingFunction',
-    'appRegion',
-    'appRegion',
-    'appearance',
-    'appearance',
-    'aspectRatio',
-    'aspectRatio',
-    'backfaceVisibility',
-    'backfaceVisibility',
-    'background',
-    'background',
-    'backgroundAttachment',
-    'backgroundAttachment',
-    'backgroundBlendMode',
-    'backgroundBlendMode',
-    'backgroundClip',
-    'backgroundClip',
-    'backgroundColor',
-    'backgroundColor',
-    'backgroundComposite',
-    'backgroundComposite',
-    'backgroundImage',
-    'backgroundImage',
-    'backgroundOrigin',
-    'backgroundOrigin',
-    'backgroundPosition',
-    'backgroundPosition',
-    'backgroundPositionX',
-    'backgroundPositionX',
-    'backgroundPositionY',
-    'backgroundPositionY',
-    'backgroundRepeat',
-    'backgroundRepeat',
-    'backgroundRepeatX',
-    'backgroundRepeatX',
-    'backgroundRepeatY',
-    'backgroundRepeatY',
-    'backgroundSize',
-    'backgroundSize',
-    'border',
-    'border',
-    'borderAfter',
-    'borderAfter',
-    'borderAfterColor',
-    'borderAfterColor',
-    'borderAfterStyle',
-    'borderAfterStyle',
-    'borderAfterWidth',
-    'borderAfterWidth',
-    'borderBefore',
-    'borderBefore',
-    'borderBeforeColor',
-    'borderBeforeColor',
-    'borderBeforeStyle',
-    'borderBeforeStyle',
-    'borderBeforeWidth',
-    'borderBeforeWidth',
-    'borderBottom',
-    'borderBottom',
-    'borderBottomColor',
-    'borderBottomColor',
-    'borderBottomLeftRadius',
-    'borderBottomLeftRadius',
-    'borderBottomRightRadius',
-    'borderBottomRightRadius',
-    'borderBottomStyle',
-    'borderBottomStyle',
-    'borderBottomWidth',
-    'borderBottomWidth',
-    'borderCollapse',
-    'borderCollapse',
-    'borderColor',
-    'borderColor',
-    'borderEnd',
-    'borderEnd',
-    'borderEndColor',
-    'borderEndColor',
-    'borderEndStyle',
-    'borderEndStyle',
-    'borderEndWidth',
-    'borderEndWidth',
-    'borderFit',
-    'borderFit',
-    'borderHorizontalSpacing',
-    'borderHorizontalSpacing',
-    'borderImage',
-    'borderImage',
-    'borderImageOutset',
-    'borderImageOutset',
-    'borderImageRepeat',
-    'borderImageRepeat',
-    'borderImageSlice',
-    'borderImageSlice',
-    'borderImageSource',
-    'borderImageSource',
-    'borderImageWidth',
-    'borderImageWidth',
-    'borderLeft',
-    'borderLeft',
-    'borderLeftColor',
-    'borderLeftColor',
-    'borderLeftStyle',
-    'borderLeftStyle',
-    'borderLeftWidth',
-    'borderLeftWidth',
-    'borderRadius',
-    'borderRadius',
-    'borderRight',
-    'borderRight',
-    'borderRightColor',
-    'borderRightColor',
-    'borderRightStyle',
-    'borderRightStyle',
-    'borderRightWidth',
-    'borderRightWidth',
-    'borderSpacing',
-    'borderSpacing',
-    'borderStart',
-    'borderStart',
-    'borderStartColor',
-    'borderStartColor',
-    'borderStartStyle',
-    'borderStartStyle',
-    'borderStartWidth',
-    'borderStartWidth',
-    'borderStyle',
-    'borderStyle',
-    'borderTop',
-    'borderTop',
-    'borderTopColor',
-    'borderTopColor',
-    'borderTopLeftRadius',
-    'borderTopLeftRadius',
-    'borderTopRightRadius',
-    'borderTopRightRadius',
-    'borderTopStyle',
-    'borderTopStyle',
-    'borderTopWidth',
-    'borderTopWidth',
-    'borderVerticalSpacing',
-    'borderVerticalSpacing',
-    'borderWidth',
-    'borderWidth',
-    'bottom',
-    'bottom',
-    'boxAlign',
-    'boxAlign',
-    'boxDecorationBreak',
-    'boxDecorationBreak',
-    'boxDirection',
-    'boxDirection',
-    'boxFlex',
-    'boxFlex',
-    'boxFlexGroup',
-    'boxFlexGroup',
-    'boxLines',
-    'boxLines',
-    'boxOrdinalGroup',
-    'boxOrdinalGroup',
-    'boxOrient',
-    'boxOrient',
-    'boxPack',
-    'boxPack',
-    'boxReflect',
-    'boxReflect',
-    'boxShadow',
-    'boxShadow',
-    'boxSizing',
-    'boxSizing',
-    'captionSide',
-    'captionSide',
-    'clear',
-    'clear',
-    'clip',
-    'clip',
-    'clipPath',
-    'clipPath',
-    'color',
-    'color',
-    'columnBreakAfter',
-    'columnBreakAfter',
-    'columnBreakBefore',
-    'columnBreakBefore',
-    'columnBreakInside',
-    'columnBreakInside',
-    'columnCount',
-    'columnCount',
-    'columnFill',
-    'columnFill',
-    'columnGap',
-    'columnGap',
-    'columnRule',
-    'columnRule',
-    'columnRuleColor',
-    'columnRuleColor',
-    'columnRuleStyle',
-    'columnRuleStyle',
-    'columnRuleWidth',
-    'columnRuleWidth',
-    'columnSpan',
-    'columnSpan',
-    'columnWidth',
-    'columnWidth',
-    'columns',
-    'columns',
-    'content',
-    'content',
-    'counterIncrement',
-    'counterIncrement',
-    'counterReset',
-    'counterReset',
-    'cursor',
-    'cursor',
-    'direction',
-    'direction',
-    'display',
-    'display',
-    'emptyCells',
-    'emptyCells',
-    'filter',
-    'filter',
-    'flex',
-    'flex',
-    'flexBasis',
-    'flexBasis',
-    'flexDirection',
-    'flexDirection',
-    'flexFlow',
-    'flexFlow',
-    'flexGrow',
-    'flexGrow',
-    'flexShrink',
-    'flexShrink',
-    'flexWrap',
-    'flexWrap',
-    'float',
-    'float',
-    'font',
-    'font',
-    'fontFamily',
-    'fontFamily',
-    'fontFeatureSettings',
-    'fontFeatureSettings',
-    'fontKerning',
-    'fontKerning',
-    'fontSize',
-    'fontSize',
-    'fontSizeDelta',
-    'fontSizeDelta',
-    'fontSmoothing',
-    'fontSmoothing',
-    'fontStretch',
-    'fontStretch',
-    'fontStyle',
-    'fontStyle',
-    'fontVariant',
-    'fontVariant',
-    'fontVariantLigatures',
-    'fontVariantLigatures',
-    'fontWeight',
-    'fontWeight',
-    'grid',
-    'grid',
-    'gridArea',
-    'gridArea',
-    'gridAutoColumns',
-    'gridAutoColumns',
-    'gridAutoFlow',
-    'gridAutoFlow',
-    'gridAutoRows',
-    'gridAutoRows',
-    'gridColumn',
-    'gridColumn',
-    'gridColumnEnd',
-    'gridColumnEnd',
-    'gridColumnStart',
-    'gridColumnStart',
-    'gridRow',
-    'gridRow',
-    'gridRowEnd',
-    'gridRowEnd',
-    'gridRowStart',
-    'gridRowStart',
-    'gridTemplate',
-    'gridTemplate',
-    'gridTemplateAreas',
-    'gridTemplateAreas',
-    'gridTemplateColumns',
-    'gridTemplateColumns',
-    'gridTemplateRows',
-    'gridTemplateRows',
-    'height',
-    'height',
-    'highlight',
-    'highlight',
-    'hyphenateCharacter',
-    'hyphenateCharacter',
-    'imageRendering',
-    'imageRendering',
-    'isolation',
-    'isolation',
-    'justifyContent',
-    'justifyContent',
-    'justifySelf',
-    'justifySelf',
-    'left',
-    'left',
-    'letterSpacing',
-    'letterSpacing',
-    'lineBoxContain',
-    'lineBoxContain',
-    'lineBreak',
-    'lineBreak',
-    'lineClamp',
-    'lineClamp',
-    'lineHeight',
-    'lineHeight',
-    'listStyle',
-    'listStyle',
-    'listStyleImage',
-    'listStyleImage',
-    'listStylePosition',
-    'listStylePosition',
-    'listStyleType',
-    'listStyleType',
-    'locale',
-    'locale',
-    'logicalHeight',
-    'logicalHeight',
-    'logicalWidth',
-    'logicalWidth',
-    'margin',
-    'margin',
-    'marginAfter',
-    'marginAfter',
-    'marginAfterCollapse',
-    'marginAfterCollapse',
-    'marginBefore',
-    'marginBefore',
-    'marginBeforeCollapse',
-    'marginBeforeCollapse',
-    'marginBottom',
-    'marginBottom',
-    'marginBottomCollapse',
-    'marginBottomCollapse',
-    'marginCollapse',
-    'marginCollapse',
-    'marginEnd',
-    'marginEnd',
-    'marginLeft',
-    'marginLeft',
-    'marginRight',
-    'marginRight',
-    'marginStart',
-    'marginStart',
-    'marginTop',
-    'marginTop',
-    'marginTopCollapse',
-    'marginTopCollapse',
-    'mask',
-    'mask',
-    'maskBoxImage',
-    'maskBoxImage',
-    'maskBoxImageOutset',
-    'maskBoxImageOutset',
-    'maskBoxImageRepeat',
-    'maskBoxImageRepeat',
-    'maskBoxImageSlice',
-    'maskBoxImageSlice',
-    'maskBoxImageSource',
-    'maskBoxImageSource',
-    'maskBoxImageWidth',
-    'maskBoxImageWidth',
-    'maskClip',
-    'maskClip',
-    'maskComposite',
-    'maskComposite',
-    'maskImage',
-    'maskImage',
-    'maskOrigin',
-    'maskOrigin',
-    'maskPosition',
-    'maskPosition',
-    'maskPositionX',
-    'maskPositionX',
-    'maskPositionY',
-    'maskPositionY',
-    'maskRepeat',
-    'maskRepeat',
-    'maskRepeatX',
-    'maskRepeatX',
-    'maskRepeatY',
-    'maskRepeatY',
-    'maskSize',
-    'maskSize',
-    'maskSourceType',
-    'maskSourceType',
-    'maxHeight',
-    'maxHeight',
-    'maxLogicalHeight',
-    'maxLogicalHeight',
-    'maxLogicalWidth',
-    'maxLogicalWidth',
-    'maxWidth',
-    'maxWidth',
-    'maxZoom',
-    'maxZoom',
-    'minHeight',
-    'minHeight',
-    'minLogicalHeight',
-    'minLogicalHeight',
-    'minLogicalWidth',
-    'minLogicalWidth',
-    'minWidth',
-    'minWidth',
-    'minZoom',
-    'minZoom',
-    'mixBlendMode',
-    'mixBlendMode',
-    'objectFit',
-    'objectFit',
-    'objectPosition',
-    'objectPosition',
-    'opacity',
-    'opacity',
-    'order',
-    'order',
-    'orientation',
-    'orientation',
-    'orphans',
-    'orphans',
-    'outline',
-    'outline',
-    'outlineColor',
-    'outlineColor',
-    'outlineOffset',
-    'outlineOffset',
-    'outlineStyle',
-    'outlineStyle',
-    'outlineWidth',
-    'outlineWidth',
-    'overflow',
-    'overflow',
-    'overflowWrap',
-    'overflowWrap',
-    'overflowX',
-    'overflowX',
-    'overflowY',
-    'overflowY',
-    'padding',
-    'padding',
-    'paddingAfter',
-    'paddingAfter',
-    'paddingBefore',
-    'paddingBefore',
-    'paddingBottom',
-    'paddingBottom',
-    'paddingEnd',
-    'paddingEnd',
-    'paddingLeft',
-    'paddingLeft',
-    'paddingRight',
-    'paddingRight',
-    'paddingStart',
-    'paddingStart',
-    'paddingTop',
-    'paddingTop',
-    'page',
-    'page',
-    'pageBreakAfter',
-    'pageBreakAfter',
-    'pageBreakBefore',
-    'pageBreakBefore',
-    'pageBreakInside',
-    'pageBreakInside',
-    'perspective',
-    'perspective',
-    'perspectiveOrigin',
-    'perspectiveOrigin',
-    'perspectiveOriginX',
-    'perspectiveOriginX',
-    'perspectiveOriginY',
-    'perspectiveOriginY',
-    'pointerEvents',
-    'pointerEvents',
-    'position',
-    'position',
-    'printColorAdjust',
-    'printColorAdjust',
-    'quotes',
-    'quotes',
-    'resize',
-    'resize',
-    'right',
-    'right',
-    'rtlOrdering',
-    'rtlOrdering',
-    'rubyPosition',
-    'rubyPosition',
-    'scrollBehavior',
-    'scrollBehavior',
-    'shapeImageThreshold',
-    'shapeImageThreshold',
-    'shapeMargin',
-    'shapeMargin',
-    'shapeOutside',
-    'shapeOutside',
-    'size',
-    'size',
-    'speak',
-    'speak',
-    'src',
-    'src',
-    'tabSize',
-    'tabSize',
-    'tableLayout',
-    'tableLayout',
-    'tapHighlightColor',
-    'tapHighlightColor',
-    'textAlign',
-    'textAlign',
-    'textAlignLast',
-    'textAlignLast',
-    'textCombine',
-    'textCombine',
-    'textDecoration',
-    'textDecoration',
-    'textDecorationColor',
-    'textDecorationColor',
-    'textDecorationLine',
-    'textDecorationLine',
-    'textDecorationStyle',
-    'textDecorationStyle',
-    'textDecorationsInEffect',
-    'textDecorationsInEffect',
-    'textEmphasis',
-    'textEmphasis',
-    'textEmphasisColor',
-    'textEmphasisColor',
-    'textEmphasisPosition',
-    'textEmphasisPosition',
-    'textEmphasisStyle',
-    'textEmphasisStyle',
-    'textFillColor',
-    'textFillColor',
-    'textIndent',
-    'textIndent',
-    'textJustify',
-    'textJustify',
-    'textLineThroughColor',
-    'textLineThroughColor',
-    'textLineThroughMode',
-    'textLineThroughMode',
-    'textLineThroughStyle',
-    'textLineThroughStyle',
-    'textLineThroughWidth',
-    'textLineThroughWidth',
-    'textOrientation',
-    'textOrientation',
-    'textOverflow',
-    'textOverflow',
-    'textOverlineColor',
-    'textOverlineColor',
-    'textOverlineMode',
-    'textOverlineMode',
-    'textOverlineStyle',
-    'textOverlineStyle',
-    'textOverlineWidth',
-    'textOverlineWidth',
-    'textRendering',
-    'textRendering',
-    'textSecurity',
-    'textSecurity',
-    'textShadow',
-    'textShadow',
-    'textStroke',
-    'textStroke',
-    'textStrokeColor',
-    'textStrokeColor',
-    'textStrokeWidth',
-    'textStrokeWidth',
-    'textTransform',
-    'textTransform',
-    'textUnderlineColor',
-    'textUnderlineColor',
-    'textUnderlineMode',
-    'textUnderlineMode',
-    'textUnderlinePosition',
-    'textUnderlinePosition',
-    'textUnderlineStyle',
-    'textUnderlineStyle',
-    'textUnderlineWidth',
-    'textUnderlineWidth',
-    'top',
-    'top',
-    'touchAction',
-    'touchAction',
-    'touchActionDelay',
-    'touchActionDelay',
-    'transform',
-    'transform',
-    'transformOrigin',
-    'transformOrigin',
-    'transformOriginX',
-    'transformOriginX',
-    'transformOriginY',
-    'transformOriginY',
-    'transformOriginZ',
-    'transformOriginZ',
-    'transformStyle',
-    'transformStyle',
-    'transition',
-    'transition',
-    'transitionDelay',
-    'transitionDelay',
-    'transitionDuration',
-    'transitionDuration',
-    'transitionProperty',
-    'transitionProperty',
-    'transitionTimingFunction',
-    'transitionTimingFunction',
-    'unicodeBidi',
-    'unicodeBidi',
-    'unicodeRange',
-    'unicodeRange',
-    'userDrag',
-    'userDrag',
-    'userModify',
-    'userModify',
-    'userSelect',
-    'userSelect',
-    'userZoom',
-    'userZoom',
-    'verticalAlign',
-    'verticalAlign',
-    'visibility',
-    'visibility',
-    'whiteSpace',
-    'whiteSpace',
-    'widows',
-    'widows',
-    'width',
-    'width',
-    'willChange',
-    'willChange',
-    'wordBreak',
-    'wordBreak',
-    'wordSpacing',
-    'wordSpacing',
-    'wordWrap',
-    'wordWrap',
-    'wrapFlow',
-    'wrapFlow',
-    'wrapThrough',
-    'wrapThrough',
-    'writingMode',
-    'writingMode',
-    'zIndex',
-    'zIndex',
-    'zoom',
-    'zoom'
-  ]);
-  html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
-    get alignContent() {
-      return this[dartx.getPropertyValue]('align-content');
-    }
-    set alignContent(value) {
-      this[dartx.setProperty]('align-content', value, '');
-    }
-    get alignItems() {
-      return this[dartx.getPropertyValue]('align-items');
-    }
-    set alignItems(value) {
-      this[dartx.setProperty]('align-items', value, '');
-    }
-    get alignSelf() {
-      return this[dartx.getPropertyValue]('align-self');
-    }
-    set alignSelf(value) {
-      this[dartx.setProperty]('align-self', value, '');
-    }
-    get animation() {
-      return this[dartx.getPropertyValue]('animation');
-    }
-    set animation(value) {
-      this[dartx.setProperty]('animation', value, '');
-    }
-    get animationDelay() {
-      return this[dartx.getPropertyValue]('animation-delay');
-    }
-    set animationDelay(value) {
-      this[dartx.setProperty]('animation-delay', value, '');
-    }
-    get animationDirection() {
-      return this[dartx.getPropertyValue]('animation-direction');
-    }
-    set animationDirection(value) {
-      this[dartx.setProperty]('animation-direction', value, '');
-    }
-    get animationDuration() {
-      return this[dartx.getPropertyValue]('animation-duration');
-    }
-    set animationDuration(value) {
-      this[dartx.setProperty]('animation-duration', value, '');
-    }
-    get animationFillMode() {
-      return this[dartx.getPropertyValue]('animation-fill-mode');
-    }
-    set animationFillMode(value) {
-      this[dartx.setProperty]('animation-fill-mode', value, '');
-    }
-    get animationIterationCount() {
-      return this[dartx.getPropertyValue]('animation-iteration-count');
-    }
-    set animationIterationCount(value) {
-      this[dartx.setProperty]('animation-iteration-count', value, '');
-    }
-    get animationName() {
-      return this[dartx.getPropertyValue]('animation-name');
-    }
-    set animationName(value) {
-      this[dartx.setProperty]('animation-name', value, '');
-    }
-    get animationPlayState() {
-      return this[dartx.getPropertyValue]('animation-play-state');
-    }
-    set animationPlayState(value) {
-      this[dartx.setProperty]('animation-play-state', value, '');
-    }
-    get animationTimingFunction() {
-      return this[dartx.getPropertyValue]('animation-timing-function');
-    }
-    set animationTimingFunction(value) {
-      this[dartx.setProperty]('animation-timing-function', value, '');
-    }
-    get appRegion() {
-      return this[dartx.getPropertyValue]('app-region');
-    }
-    set appRegion(value) {
-      this[dartx.setProperty]('app-region', value, '');
-    }
-    get appearance() {
-      return this[dartx.getPropertyValue]('appearance');
-    }
-    set appearance(value) {
-      this[dartx.setProperty]('appearance', value, '');
-    }
-    get aspectRatio() {
-      return this[dartx.getPropertyValue]('aspect-ratio');
-    }
-    set aspectRatio(value) {
-      this[dartx.setProperty]('aspect-ratio', value, '');
-    }
-    get backfaceVisibility() {
-      return this[dartx.getPropertyValue]('backface-visibility');
-    }
-    set backfaceVisibility(value) {
-      this[dartx.setProperty]('backface-visibility', value, '');
-    }
-    get background() {
-      return this[dartx.getPropertyValue]('background');
-    }
-    set background(value) {
-      this[dartx.setProperty]('background', value, '');
-    }
-    get backgroundAttachment() {
-      return this[dartx.getPropertyValue]('background-attachment');
-    }
-    set backgroundAttachment(value) {
-      this[dartx.setProperty]('background-attachment', value, '');
-    }
-    get backgroundBlendMode() {
-      return this[dartx.getPropertyValue]('background-blend-mode');
-    }
-    set backgroundBlendMode(value) {
-      this[dartx.setProperty]('background-blend-mode', value, '');
-    }
-    get backgroundClip() {
-      return this[dartx.getPropertyValue]('background-clip');
-    }
-    set backgroundClip(value) {
-      this[dartx.setProperty]('background-clip', value, '');
-    }
-    get backgroundColor() {
-      return this[dartx.getPropertyValue]('background-color');
-    }
-    set backgroundColor(value) {
-      this[dartx.setProperty]('background-color', value, '');
-    }
-    get backgroundComposite() {
-      return this[dartx.getPropertyValue]('background-composite');
-    }
-    set backgroundComposite(value) {
-      this[dartx.setProperty]('background-composite', value, '');
-    }
-    get backgroundImage() {
-      return this[dartx.getPropertyValue]('background-image');
-    }
-    set backgroundImage(value) {
-      this[dartx.setProperty]('background-image', value, '');
-    }
-    get backgroundOrigin() {
-      return this[dartx.getPropertyValue]('background-origin');
-    }
-    set backgroundOrigin(value) {
-      this[dartx.setProperty]('background-origin', value, '');
-    }
-    get backgroundPosition() {
-      return this[dartx.getPropertyValue]('background-position');
-    }
-    set backgroundPosition(value) {
-      this[dartx.setProperty]('background-position', value, '');
-    }
-    get backgroundPositionX() {
-      return this[dartx.getPropertyValue]('background-position-x');
-    }
-    set backgroundPositionX(value) {
-      this[dartx.setProperty]('background-position-x', value, '');
-    }
-    get backgroundPositionY() {
-      return this[dartx.getPropertyValue]('background-position-y');
-    }
-    set backgroundPositionY(value) {
-      this[dartx.setProperty]('background-position-y', value, '');
-    }
-    get backgroundRepeat() {
-      return this[dartx.getPropertyValue]('background-repeat');
-    }
-    set backgroundRepeat(value) {
-      this[dartx.setProperty]('background-repeat', value, '');
-    }
-    get backgroundRepeatX() {
-      return this[dartx.getPropertyValue]('background-repeat-x');
-    }
-    set backgroundRepeatX(value) {
-      this[dartx.setProperty]('background-repeat-x', value, '');
-    }
-    get backgroundRepeatY() {
-      return this[dartx.getPropertyValue]('background-repeat-y');
-    }
-    set backgroundRepeatY(value) {
-      this[dartx.setProperty]('background-repeat-y', value, '');
-    }
-    get backgroundSize() {
-      return this[dartx.getPropertyValue]('background-size');
-    }
-    set backgroundSize(value) {
-      this[dartx.setProperty]('background-size', value, '');
-    }
-    get border() {
-      return this[dartx.getPropertyValue]('border');
-    }
-    set border(value) {
-      this[dartx.setProperty]('border', value, '');
-    }
-    get borderAfter() {
-      return this[dartx.getPropertyValue]('border-after');
-    }
-    set borderAfter(value) {
-      this[dartx.setProperty]('border-after', value, '');
-    }
-    get borderAfterColor() {
-      return this[dartx.getPropertyValue]('border-after-color');
-    }
-    set borderAfterColor(value) {
-      this[dartx.setProperty]('border-after-color', value, '');
-    }
-    get borderAfterStyle() {
-      return this[dartx.getPropertyValue]('border-after-style');
-    }
-    set borderAfterStyle(value) {
-      this[dartx.setProperty]('border-after-style', value, '');
-    }
-    get borderAfterWidth() {
-      return this[dartx.getPropertyValue]('border-after-width');
-    }
-    set borderAfterWidth(value) {
-      this[dartx.setProperty]('border-after-width', value, '');
-    }
-    get borderBefore() {
-      return this[dartx.getPropertyValue]('border-before');
-    }
-    set borderBefore(value) {
-      this[dartx.setProperty]('border-before', value, '');
-    }
-    get borderBeforeColor() {
-      return this[dartx.getPropertyValue]('border-before-color');
-    }
-    set borderBeforeColor(value) {
-      this[dartx.setProperty]('border-before-color', value, '');
-    }
-    get borderBeforeStyle() {
-      return this[dartx.getPropertyValue]('border-before-style');
-    }
-    set borderBeforeStyle(value) {
-      this[dartx.setProperty]('border-before-style', value, '');
-    }
-    get borderBeforeWidth() {
-      return this[dartx.getPropertyValue]('border-before-width');
-    }
-    set borderBeforeWidth(value) {
-      this[dartx.setProperty]('border-before-width', value, '');
-    }
-    get borderBottom() {
-      return this[dartx.getPropertyValue]('border-bottom');
-    }
-    set borderBottom(value) {
-      this[dartx.setProperty]('border-bottom', value, '');
-    }
-    get borderBottomColor() {
-      return this[dartx.getPropertyValue]('border-bottom-color');
-    }
-    set borderBottomColor(value) {
-      this[dartx.setProperty]('border-bottom-color', value, '');
-    }
-    get borderBottomLeftRadius() {
-      return this[dartx.getPropertyValue]('border-bottom-left-radius');
-    }
-    set borderBottomLeftRadius(value) {
-      this[dartx.setProperty]('border-bottom-left-radius', value, '');
-    }
-    get borderBottomRightRadius() {
-      return this[dartx.getPropertyValue]('border-bottom-right-radius');
-    }
-    set borderBottomRightRadius(value) {
-      this[dartx.setProperty]('border-bottom-right-radius', value, '');
-    }
-    get borderBottomStyle() {
-      return this[dartx.getPropertyValue]('border-bottom-style');
-    }
-    set borderBottomStyle(value) {
-      this[dartx.setProperty]('border-bottom-style', value, '');
-    }
-    get borderBottomWidth() {
-      return this[dartx.getPropertyValue]('border-bottom-width');
-    }
-    set borderBottomWidth(value) {
-      this[dartx.setProperty]('border-bottom-width', value, '');
-    }
-    get borderCollapse() {
-      return this[dartx.getPropertyValue]('border-collapse');
-    }
-    set borderCollapse(value) {
-      this[dartx.setProperty]('border-collapse', value, '');
-    }
-    get borderColor() {
-      return this[dartx.getPropertyValue]('border-color');
-    }
-    set borderColor(value) {
-      this[dartx.setProperty]('border-color', value, '');
-    }
-    get borderEnd() {
-      return this[dartx.getPropertyValue]('border-end');
-    }
-    set borderEnd(value) {
-      this[dartx.setProperty]('border-end', value, '');
-    }
-    get borderEndColor() {
-      return this[dartx.getPropertyValue]('border-end-color');
-    }
-    set borderEndColor(value) {
-      this[dartx.setProperty]('border-end-color', value, '');
-    }
-    get borderEndStyle() {
-      return this[dartx.getPropertyValue]('border-end-style');
-    }
-    set borderEndStyle(value) {
-      this[dartx.setProperty]('border-end-style', value, '');
-    }
-    get borderEndWidth() {
-      return this[dartx.getPropertyValue]('border-end-width');
-    }
-    set borderEndWidth(value) {
-      this[dartx.setProperty]('border-end-width', value, '');
-    }
-    get borderFit() {
-      return this[dartx.getPropertyValue]('border-fit');
-    }
-    set borderFit(value) {
-      this[dartx.setProperty]('border-fit', value, '');
-    }
-    get borderHorizontalSpacing() {
-      return this[dartx.getPropertyValue]('border-horizontal-spacing');
-    }
-    set borderHorizontalSpacing(value) {
-      this[dartx.setProperty]('border-horizontal-spacing', value, '');
-    }
-    get borderImage() {
-      return this[dartx.getPropertyValue]('border-image');
-    }
-    set borderImage(value) {
-      this[dartx.setProperty]('border-image', value, '');
-    }
-    get borderImageOutset() {
-      return this[dartx.getPropertyValue]('border-image-outset');
-    }
-    set borderImageOutset(value) {
-      this[dartx.setProperty]('border-image-outset', value, '');
-    }
-    get borderImageRepeat() {
-      return this[dartx.getPropertyValue]('border-image-repeat');
-    }
-    set borderImageRepeat(value) {
-      this[dartx.setProperty]('border-image-repeat', value, '');
-    }
-    get borderImageSlice() {
-      return this[dartx.getPropertyValue]('border-image-slice');
-    }
-    set borderImageSlice(value) {
-      this[dartx.setProperty]('border-image-slice', value, '');
-    }
-    get borderImageSource() {
-      return this[dartx.getPropertyValue]('border-image-source');
-    }
-    set borderImageSource(value) {
-      this[dartx.setProperty]('border-image-source', value, '');
-    }
-    get borderImageWidth() {
-      return this[dartx.getPropertyValue]('border-image-width');
-    }
-    set borderImageWidth(value) {
-      this[dartx.setProperty]('border-image-width', value, '');
-    }
-    get borderLeft() {
-      return this[dartx.getPropertyValue]('border-left');
-    }
-    set borderLeft(value) {
-      this[dartx.setProperty]('border-left', value, '');
-    }
-    get borderLeftColor() {
-      return this[dartx.getPropertyValue]('border-left-color');
-    }
-    set borderLeftColor(value) {
-      this[dartx.setProperty]('border-left-color', value, '');
-    }
-    get borderLeftStyle() {
-      return this[dartx.getPropertyValue]('border-left-style');
-    }
-    set borderLeftStyle(value) {
-      this[dartx.setProperty]('border-left-style', value, '');
-    }
-    get borderLeftWidth() {
-      return this[dartx.getPropertyValue]('border-left-width');
-    }
-    set borderLeftWidth(value) {
-      this[dartx.setProperty]('border-left-width', value, '');
-    }
-    get borderRadius() {
-      return this[dartx.getPropertyValue]('border-radius');
-    }
-    set borderRadius(value) {
-      this[dartx.setProperty]('border-radius', value, '');
-    }
-    get borderRight() {
-      return this[dartx.getPropertyValue]('border-right');
-    }
-    set borderRight(value) {
-      this[dartx.setProperty]('border-right', value, '');
-    }
-    get borderRightColor() {
-      return this[dartx.getPropertyValue]('border-right-color');
-    }
-    set borderRightColor(value) {
-      this[dartx.setProperty]('border-right-color', value, '');
-    }
-    get borderRightStyle() {
-      return this[dartx.getPropertyValue]('border-right-style');
-    }
-    set borderRightStyle(value) {
-      this[dartx.setProperty]('border-right-style', value, '');
-    }
-    get borderRightWidth() {
-      return this[dartx.getPropertyValue]('border-right-width');
-    }
-    set borderRightWidth(value) {
-      this[dartx.setProperty]('border-right-width', value, '');
-    }
-    get borderSpacing() {
-      return this[dartx.getPropertyValue]('border-spacing');
-    }
-    set borderSpacing(value) {
-      this[dartx.setProperty]('border-spacing', value, '');
-    }
-    get borderStart() {
-      return this[dartx.getPropertyValue]('border-start');
-    }
-    set borderStart(value) {
-      this[dartx.setProperty]('border-start', value, '');
-    }
-    get borderStartColor() {
-      return this[dartx.getPropertyValue]('border-start-color');
-    }
-    set borderStartColor(value) {
-      this[dartx.setProperty]('border-start-color', value, '');
-    }
-    get borderStartStyle() {
-      return this[dartx.getPropertyValue]('border-start-style');
-    }
-    set borderStartStyle(value) {
-      this[dartx.setProperty]('border-start-style', value, '');
-    }
-    get borderStartWidth() {
-      return this[dartx.getPropertyValue]('border-start-width');
-    }
-    set borderStartWidth(value) {
-      this[dartx.setProperty]('border-start-width', value, '');
-    }
-    get borderStyle() {
-      return this[dartx.getPropertyValue]('border-style');
-    }
-    set borderStyle(value) {
-      this[dartx.setProperty]('border-style', value, '');
-    }
-    get borderTop() {
-      return this[dartx.getPropertyValue]('border-top');
-    }
-    set borderTop(value) {
-      this[dartx.setProperty]('border-top', value, '');
-    }
-    get borderTopColor() {
-      return this[dartx.getPropertyValue]('border-top-color');
-    }
-    set borderTopColor(value) {
-      this[dartx.setProperty]('border-top-color', value, '');
-    }
-    get borderTopLeftRadius() {
-      return this[dartx.getPropertyValue]('border-top-left-radius');
-    }
-    set borderTopLeftRadius(value) {
-      this[dartx.setProperty]('border-top-left-radius', value, '');
-    }
-    get borderTopRightRadius() {
-      return this[dartx.getPropertyValue]('border-top-right-radius');
-    }
-    set borderTopRightRadius(value) {
-      this[dartx.setProperty]('border-top-right-radius', value, '');
-    }
-    get borderTopStyle() {
-      return this[dartx.getPropertyValue]('border-top-style');
-    }
-    set borderTopStyle(value) {
-      this[dartx.setProperty]('border-top-style', value, '');
-    }
-    get borderTopWidth() {
-      return this[dartx.getPropertyValue]('border-top-width');
-    }
-    set borderTopWidth(value) {
-      this[dartx.setProperty]('border-top-width', value, '');
-    }
-    get borderVerticalSpacing() {
-      return this[dartx.getPropertyValue]('border-vertical-spacing');
-    }
-    set borderVerticalSpacing(value) {
-      this[dartx.setProperty]('border-vertical-spacing', value, '');
-    }
-    get borderWidth() {
-      return this[dartx.getPropertyValue]('border-width');
-    }
-    set borderWidth(value) {
-      this[dartx.setProperty]('border-width', value, '');
-    }
-    get bottom() {
-      return this[dartx.getPropertyValue]('bottom');
-    }
-    set bottom(value) {
-      this[dartx.setProperty]('bottom', value, '');
-    }
-    get boxAlign() {
-      return this[dartx.getPropertyValue]('box-align');
-    }
-    set boxAlign(value) {
-      this[dartx.setProperty]('box-align', value, '');
-    }
-    get boxDecorationBreak() {
-      return this[dartx.getPropertyValue]('box-decoration-break');
-    }
-    set boxDecorationBreak(value) {
-      this[dartx.setProperty]('box-decoration-break', value, '');
-    }
-    get boxDirection() {
-      return this[dartx.getPropertyValue]('box-direction');
-    }
-    set boxDirection(value) {
-      this[dartx.setProperty]('box-direction', value, '');
-    }
-    get boxFlex() {
-      return this[dartx.getPropertyValue]('box-flex');
-    }
-    set boxFlex(value) {
-      this[dartx.setProperty]('box-flex', value, '');
-    }
-    get boxFlexGroup() {
-      return this[dartx.getPropertyValue]('box-flex-group');
-    }
-    set boxFlexGroup(value) {
-      this[dartx.setProperty]('box-flex-group', value, '');
-    }
-    get boxLines() {
-      return this[dartx.getPropertyValue]('box-lines');
-    }
-    set boxLines(value) {
-      this[dartx.setProperty]('box-lines', value, '');
-    }
-    get boxOrdinalGroup() {
-      return this[dartx.getPropertyValue]('box-ordinal-group');
-    }
-    set boxOrdinalGroup(value) {
-      this[dartx.setProperty]('box-ordinal-group', value, '');
-    }
-    get boxOrient() {
-      return this[dartx.getPropertyValue]('box-orient');
-    }
-    set boxOrient(value) {
-      this[dartx.setProperty]('box-orient', value, '');
-    }
-    get boxPack() {
-      return this[dartx.getPropertyValue]('box-pack');
-    }
-    set boxPack(value) {
-      this[dartx.setProperty]('box-pack', value, '');
-    }
-    get boxReflect() {
-      return this[dartx.getPropertyValue]('box-reflect');
-    }
-    set boxReflect(value) {
-      this[dartx.setProperty]('box-reflect', value, '');
-    }
-    get boxShadow() {
-      return this[dartx.getPropertyValue]('box-shadow');
-    }
-    set boxShadow(value) {
-      this[dartx.setProperty]('box-shadow', value, '');
-    }
-    get boxSizing() {
-      return this[dartx.getPropertyValue]('box-sizing');
-    }
-    set boxSizing(value) {
-      this[dartx.setProperty]('box-sizing', value, '');
-    }
-    get captionSide() {
-      return this[dartx.getPropertyValue]('caption-side');
-    }
-    set captionSide(value) {
-      this[dartx.setProperty]('caption-side', value, '');
-    }
-    get clear() {
-      return this[dartx.getPropertyValue]('clear');
-    }
-    set clear(value) {
-      this[dartx.setProperty]('clear', value, '');
-    }
-    get clip() {
-      return this[dartx.getPropertyValue]('clip');
-    }
-    set clip(value) {
-      this[dartx.setProperty]('clip', value, '');
-    }
-    get clipPath() {
-      return this[dartx.getPropertyValue]('clip-path');
-    }
-    set clipPath(value) {
-      this[dartx.setProperty]('clip-path', value, '');
-    }
-    get color() {
-      return this[dartx.getPropertyValue]('color');
-    }
-    set color(value) {
-      this[dartx.setProperty]('color', value, '');
-    }
-    get columnBreakAfter() {
-      return this[dartx.getPropertyValue]('column-break-after');
-    }
-    set columnBreakAfter(value) {
-      this[dartx.setProperty]('column-break-after', value, '');
-    }
-    get columnBreakBefore() {
-      return this[dartx.getPropertyValue]('column-break-before');
-    }
-    set columnBreakBefore(value) {
-      this[dartx.setProperty]('column-break-before', value, '');
-    }
-    get columnBreakInside() {
-      return this[dartx.getPropertyValue]('column-break-inside');
-    }
-    set columnBreakInside(value) {
-      this[dartx.setProperty]('column-break-inside', value, '');
-    }
-    get columnCount() {
-      return this[dartx.getPropertyValue]('column-count');
-    }
-    set columnCount(value) {
-      this[dartx.setProperty]('column-count', value, '');
-    }
-    get columnFill() {
-      return this[dartx.getPropertyValue]('column-fill');
-    }
-    set columnFill(value) {
-      this[dartx.setProperty]('column-fill', value, '');
-    }
-    get columnGap() {
-      return this[dartx.getPropertyValue]('column-gap');
-    }
-    set columnGap(value) {
-      this[dartx.setProperty]('column-gap', value, '');
-    }
-    get columnRule() {
-      return this[dartx.getPropertyValue]('column-rule');
-    }
-    set columnRule(value) {
-      this[dartx.setProperty]('column-rule', value, '');
-    }
-    get columnRuleColor() {
-      return this[dartx.getPropertyValue]('column-rule-color');
-    }
-    set columnRuleColor(value) {
-      this[dartx.setProperty]('column-rule-color', value, '');
-    }
-    get columnRuleStyle() {
-      return this[dartx.getPropertyValue]('column-rule-style');
-    }
-    set columnRuleStyle(value) {
-      this[dartx.setProperty]('column-rule-style', value, '');
-    }
-    get columnRuleWidth() {
-      return this[dartx.getPropertyValue]('column-rule-width');
-    }
-    set columnRuleWidth(value) {
-      this[dartx.setProperty]('column-rule-width', value, '');
-    }
-    get columnSpan() {
-      return this[dartx.getPropertyValue]('column-span');
-    }
-    set columnSpan(value) {
-      this[dartx.setProperty]('column-span', value, '');
-    }
-    get columnWidth() {
-      return this[dartx.getPropertyValue]('column-width');
-    }
-    set columnWidth(value) {
-      this[dartx.setProperty]('column-width', value, '');
-    }
-    get columns() {
-      return this[dartx.getPropertyValue]('columns');
-    }
-    set columns(value) {
-      this[dartx.setProperty]('columns', value, '');
-    }
-    get content() {
-      return this[dartx.getPropertyValue]('content');
-    }
-    set content(value) {
-      this[dartx.setProperty]('content', value, '');
-    }
-    get counterIncrement() {
-      return this[dartx.getPropertyValue]('counter-increment');
-    }
-    set counterIncrement(value) {
-      this[dartx.setProperty]('counter-increment', value, '');
-    }
-    get counterReset() {
-      return this[dartx.getPropertyValue]('counter-reset');
-    }
-    set counterReset(value) {
-      this[dartx.setProperty]('counter-reset', value, '');
-    }
-    get cursor() {
-      return this[dartx.getPropertyValue]('cursor');
-    }
-    set cursor(value) {
-      this[dartx.setProperty]('cursor', value, '');
-    }
-    get direction() {
-      return this[dartx.getPropertyValue]('direction');
-    }
-    set direction(value) {
-      this[dartx.setProperty]('direction', value, '');
-    }
-    get display() {
-      return this[dartx.getPropertyValue]('display');
-    }
-    set display(value) {
-      this[dartx.setProperty]('display', value, '');
-    }
-    get emptyCells() {
-      return this[dartx.getPropertyValue]('empty-cells');
-    }
-    set emptyCells(value) {
-      this[dartx.setProperty]('empty-cells', value, '');
-    }
-    get filter() {
-      return this[dartx.getPropertyValue]('filter');
-    }
-    set filter(value) {
-      this[dartx.setProperty]('filter', value, '');
-    }
-    get flex() {
-      return this[dartx.getPropertyValue]('flex');
-    }
-    set flex(value) {
-      this[dartx.setProperty]('flex', value, '');
-    }
-    get flexBasis() {
-      return this[dartx.getPropertyValue]('flex-basis');
-    }
-    set flexBasis(value) {
-      this[dartx.setProperty]('flex-basis', value, '');
-    }
-    get flexDirection() {
-      return this[dartx.getPropertyValue]('flex-direction');
-    }
-    set flexDirection(value) {
-      this[dartx.setProperty]('flex-direction', value, '');
-    }
-    get flexFlow() {
-      return this[dartx.getPropertyValue]('flex-flow');
-    }
-    set flexFlow(value) {
-      this[dartx.setProperty]('flex-flow', value, '');
-    }
-    get flexGrow() {
-      return this[dartx.getPropertyValue]('flex-grow');
-    }
-    set flexGrow(value) {
-      this[dartx.setProperty]('flex-grow', value, '');
-    }
-    get flexShrink() {
-      return this[dartx.getPropertyValue]('flex-shrink');
-    }
-    set flexShrink(value) {
-      this[dartx.setProperty]('flex-shrink', value, '');
-    }
-    get flexWrap() {
-      return this[dartx.getPropertyValue]('flex-wrap');
-    }
-    set flexWrap(value) {
-      this[dartx.setProperty]('flex-wrap', value, '');
-    }
-    get float() {
-      return this[dartx.getPropertyValue]('float');
-    }
-    set float(value) {
-      this[dartx.setProperty]('float', value, '');
-    }
-    get font() {
-      return this[dartx.getPropertyValue]('font');
-    }
-    set font(value) {
-      this[dartx.setProperty]('font', value, '');
-    }
-    get fontFamily() {
-      return this[dartx.getPropertyValue]('font-family');
-    }
-    set fontFamily(value) {
-      this[dartx.setProperty]('font-family', value, '');
-    }
-    get fontFeatureSettings() {
-      return this[dartx.getPropertyValue]('font-feature-settings');
-    }
-    set fontFeatureSettings(value) {
-      this[dartx.setProperty]('font-feature-settings', value, '');
-    }
-    get fontKerning() {
-      return this[dartx.getPropertyValue]('font-kerning');
-    }
-    set fontKerning(value) {
-      this[dartx.setProperty]('font-kerning', value, '');
-    }
-    get fontSize() {
-      return this[dartx.getPropertyValue]('font-size');
-    }
-    set fontSize(value) {
-      this[dartx.setProperty]('font-size', value, '');
-    }
-    get fontSizeDelta() {
-      return this[dartx.getPropertyValue]('font-size-delta');
-    }
-    set fontSizeDelta(value) {
-      this[dartx.setProperty]('font-size-delta', value, '');
-    }
-    get fontSmoothing() {
-      return this[dartx.getPropertyValue]('font-smoothing');
-    }
-    set fontSmoothing(value) {
-      this[dartx.setProperty]('font-smoothing', value, '');
-    }
-    get fontStretch() {
-      return this[dartx.getPropertyValue]('font-stretch');
-    }
-    set fontStretch(value) {
-      this[dartx.setProperty]('font-stretch', value, '');
-    }
-    get fontStyle() {
-      return this[dartx.getPropertyValue]('font-style');
-    }
-    set fontStyle(value) {
-      this[dartx.setProperty]('font-style', value, '');
-    }
-    get fontVariant() {
-      return this[dartx.getPropertyValue]('font-variant');
-    }
-    set fontVariant(value) {
-      this[dartx.setProperty]('font-variant', value, '');
-    }
-    get fontVariantLigatures() {
-      return this[dartx.getPropertyValue]('font-variant-ligatures');
-    }
-    set fontVariantLigatures(value) {
-      this[dartx.setProperty]('font-variant-ligatures', value, '');
-    }
-    get fontWeight() {
-      return this[dartx.getPropertyValue]('font-weight');
-    }
-    set fontWeight(value) {
-      this[dartx.setProperty]('font-weight', value, '');
-    }
-    get grid() {
-      return this[dartx.getPropertyValue]('grid');
-    }
-    set grid(value) {
-      this[dartx.setProperty]('grid', value, '');
-    }
-    get gridArea() {
-      return this[dartx.getPropertyValue]('grid-area');
-    }
-    set gridArea(value) {
-      this[dartx.setProperty]('grid-area', value, '');
-    }
-    get gridAutoColumns() {
-      return this[dartx.getPropertyValue]('grid-auto-columns');
-    }
-    set gridAutoColumns(value) {
-      this[dartx.setProperty]('grid-auto-columns', value, '');
-    }
-    get gridAutoFlow() {
-      return this[dartx.getPropertyValue]('grid-auto-flow');
-    }
-    set gridAutoFlow(value) {
-      this[dartx.setProperty]('grid-auto-flow', value, '');
-    }
-    get gridAutoRows() {
-      return this[dartx.getPropertyValue]('grid-auto-rows');
-    }
-    set gridAutoRows(value) {
-      this[dartx.setProperty]('grid-auto-rows', value, '');
-    }
-    get gridColumn() {
-      return this[dartx.getPropertyValue]('grid-column');
-    }
-    set gridColumn(value) {
-      this[dartx.setProperty]('grid-column', value, '');
-    }
-    get gridColumnEnd() {
-      return this[dartx.getPropertyValue]('grid-column-end');
-    }
-    set gridColumnEnd(value) {
-      this[dartx.setProperty]('grid-column-end', value, '');
-    }
-    get gridColumnStart() {
-      return this[dartx.getPropertyValue]('grid-column-start');
-    }
-    set gridColumnStart(value) {
-      this[dartx.setProperty]('grid-column-start', value, '');
-    }
-    get gridRow() {
-      return this[dartx.getPropertyValue]('grid-row');
-    }
-    set gridRow(value) {
-      this[dartx.setProperty]('grid-row', value, '');
-    }
-    get gridRowEnd() {
-      return this[dartx.getPropertyValue]('grid-row-end');
-    }
-    set gridRowEnd(value) {
-      this[dartx.setProperty]('grid-row-end', value, '');
-    }
-    get gridRowStart() {
-      return this[dartx.getPropertyValue]('grid-row-start');
-    }
-    set gridRowStart(value) {
-      this[dartx.setProperty]('grid-row-start', value, '');
-    }
-    get gridTemplate() {
-      return this[dartx.getPropertyValue]('grid-template');
-    }
-    set gridTemplate(value) {
-      this[dartx.setProperty]('grid-template', value, '');
-    }
-    get gridTemplateAreas() {
-      return this[dartx.getPropertyValue]('grid-template-areas');
-    }
-    set gridTemplateAreas(value) {
-      this[dartx.setProperty]('grid-template-areas', value, '');
-    }
-    get gridTemplateColumns() {
-      return this[dartx.getPropertyValue]('grid-template-columns');
-    }
-    set gridTemplateColumns(value) {
-      this[dartx.setProperty]('grid-template-columns', value, '');
-    }
-    get gridTemplateRows() {
-      return this[dartx.getPropertyValue]('grid-template-rows');
-    }
-    set gridTemplateRows(value) {
-      this[dartx.setProperty]('grid-template-rows', value, '');
-    }
-    get height() {
-      return this[dartx.getPropertyValue]('height');
-    }
-    set height(value) {
-      this[dartx.setProperty]('height', value, '');
-    }
-    get highlight() {
-      return this[dartx.getPropertyValue]('highlight');
-    }
-    set highlight(value) {
-      this[dartx.setProperty]('highlight', value, '');
-    }
-    get hyphenateCharacter() {
-      return this[dartx.getPropertyValue]('hyphenate-character');
-    }
-    set hyphenateCharacter(value) {
-      this[dartx.setProperty]('hyphenate-character', value, '');
-    }
-    get imageRendering() {
-      return this[dartx.getPropertyValue]('image-rendering');
-    }
-    set imageRendering(value) {
-      this[dartx.setProperty]('image-rendering', value, '');
-    }
-    get isolation() {
-      return this[dartx.getPropertyValue]('isolation');
-    }
-    set isolation(value) {
-      this[dartx.setProperty]('isolation', value, '');
-    }
-    get justifyContent() {
-      return this[dartx.getPropertyValue]('justify-content');
-    }
-    set justifyContent(value) {
-      this[dartx.setProperty]('justify-content', value, '');
-    }
-    get justifySelf() {
-      return this[dartx.getPropertyValue]('justify-self');
-    }
-    set justifySelf(value) {
-      this[dartx.setProperty]('justify-self', value, '');
-    }
-    get left() {
-      return this[dartx.getPropertyValue]('left');
-    }
-    set left(value) {
-      this[dartx.setProperty]('left', value, '');
-    }
-    get letterSpacing() {
-      return this[dartx.getPropertyValue]('letter-spacing');
-    }
-    set letterSpacing(value) {
-      this[dartx.setProperty]('letter-spacing', value, '');
-    }
-    get lineBoxContain() {
-      return this[dartx.getPropertyValue]('line-box-contain');
-    }
-    set lineBoxContain(value) {
-      this[dartx.setProperty]('line-box-contain', value, '');
-    }
-    get lineBreak() {
-      return this[dartx.getPropertyValue]('line-break');
-    }
-    set lineBreak(value) {
-      this[dartx.setProperty]('line-break', value, '');
-    }
-    get lineClamp() {
-      return this[dartx.getPropertyValue]('line-clamp');
-    }
-    set lineClamp(value) {
-      this[dartx.setProperty]('line-clamp', value, '');
-    }
-    get lineHeight() {
-      return this[dartx.getPropertyValue]('line-height');
-    }
-    set lineHeight(value) {
-      this[dartx.setProperty]('line-height', value, '');
-    }
-    get listStyle() {
-      return this[dartx.getPropertyValue]('list-style');
-    }
-    set listStyle(value) {
-      this[dartx.setProperty]('list-style', value, '');
-    }
-    get listStyleImage() {
-      return this[dartx.getPropertyValue]('list-style-image');
-    }
-    set listStyleImage(value) {
-      this[dartx.setProperty]('list-style-image', value, '');
-    }
-    get listStylePosition() {
-      return this[dartx.getPropertyValue]('list-style-position');
-    }
-    set listStylePosition(value) {
-      this[dartx.setProperty]('list-style-position', value, '');
-    }
-    get listStyleType() {
-      return this[dartx.getPropertyValue]('list-style-type');
-    }
-    set listStyleType(value) {
-      this[dartx.setProperty]('list-style-type', value, '');
-    }
-    get locale() {
-      return this[dartx.getPropertyValue]('locale');
-    }
-    set locale(value) {
-      this[dartx.setProperty]('locale', value, '');
-    }
-    get logicalHeight() {
-      return this[dartx.getPropertyValue]('logical-height');
-    }
-    set logicalHeight(value) {
-      this[dartx.setProperty]('logical-height', value, '');
-    }
-    get logicalWidth() {
-      return this[dartx.getPropertyValue]('logical-width');
-    }
-    set logicalWidth(value) {
-      this[dartx.setProperty]('logical-width', value, '');
-    }
-    get margin() {
-      return this[dartx.getPropertyValue]('margin');
-    }
-    set margin(value) {
-      this[dartx.setProperty]('margin', value, '');
-    }
-    get marginAfter() {
-      return this[dartx.getPropertyValue]('margin-after');
-    }
-    set marginAfter(value) {
-      this[dartx.setProperty]('margin-after', value, '');
-    }
-    get marginAfterCollapse() {
-      return this[dartx.getPropertyValue]('margin-after-collapse');
-    }
-    set marginAfterCollapse(value) {
-      this[dartx.setProperty]('margin-after-collapse', value, '');
-    }
-    get marginBefore() {
-      return this[dartx.getPropertyValue]('margin-before');
-    }
-    set marginBefore(value) {
-      this[dartx.setProperty]('margin-before', value, '');
-    }
-    get marginBeforeCollapse() {
-      return this[dartx.getPropertyValue]('margin-before-collapse');
-    }
-    set marginBeforeCollapse(value) {
-      this[dartx.setProperty]('margin-before-collapse', value, '');
-    }
-    get marginBottom() {
-      return this[dartx.getPropertyValue]('margin-bottom');
-    }
-    set marginBottom(value) {
-      this[dartx.setProperty]('margin-bottom', value, '');
-    }
-    get marginBottomCollapse() {
-      return this[dartx.getPropertyValue]('margin-bottom-collapse');
-    }
-    set marginBottomCollapse(value) {
-      this[dartx.setProperty]('margin-bottom-collapse', value, '');
-    }
-    get marginCollapse() {
-      return this[dartx.getPropertyValue]('margin-collapse');
-    }
-    set marginCollapse(value) {
-      this[dartx.setProperty]('margin-collapse', value, '');
-    }
-    get marginEnd() {
-      return this[dartx.getPropertyValue]('margin-end');
-    }
-    set marginEnd(value) {
-      this[dartx.setProperty]('margin-end', value, '');
-    }
-    get marginLeft() {
-      return this[dartx.getPropertyValue]('margin-left');
-    }
-    set marginLeft(value) {
-      this[dartx.setProperty]('margin-left', value, '');
-    }
-    get marginRight() {
-      return this[dartx.getPropertyValue]('margin-right');
-    }
-    set marginRight(value) {
-      this[dartx.setProperty]('margin-right', value, '');
-    }
-    get marginStart() {
-      return this[dartx.getPropertyValue]('margin-start');
-    }
-    set marginStart(value) {
-      this[dartx.setProperty]('margin-start', value, '');
-    }
-    get marginTop() {
-      return this[dartx.getPropertyValue]('margin-top');
-    }
-    set marginTop(value) {
-      this[dartx.setProperty]('margin-top', value, '');
-    }
-    get marginTopCollapse() {
-      return this[dartx.getPropertyValue]('margin-top-collapse');
-    }
-    set marginTopCollapse(value) {
-      this[dartx.setProperty]('margin-top-collapse', value, '');
-    }
-    get mask() {
-      return this[dartx.getPropertyValue]('mask');
-    }
-    set mask(value) {
-      this[dartx.setProperty]('mask', value, '');
-    }
-    get maskBoxImage() {
-      return this[dartx.getPropertyValue]('mask-box-image');
-    }
-    set maskBoxImage(value) {
-      this[dartx.setProperty]('mask-box-image', value, '');
-    }
-    get maskBoxImageOutset() {
-      return this[dartx.getPropertyValue]('mask-box-image-outset');
-    }
-    set maskBoxImageOutset(value) {
-      this[dartx.setProperty]('mask-box-image-outset', value, '');
-    }
-    get maskBoxImageRepeat() {
-      return this[dartx.getPropertyValue]('mask-box-image-repeat');
-    }
-    set maskBoxImageRepeat(value) {
-      this[dartx.setProperty]('mask-box-image-repeat', value, '');
-    }
-    get maskBoxImageSlice() {
-      return this[dartx.getPropertyValue]('mask-box-image-slice');
-    }
-    set maskBoxImageSlice(value) {
-      this[dartx.setProperty]('mask-box-image-slice', value, '');
-    }
-    get maskBoxImageSource() {
-      return this[dartx.getPropertyValue]('mask-box-image-source');
-    }
-    set maskBoxImageSource(value) {
-      this[dartx.setProperty]('mask-box-image-source', value, '');
-    }
-    get maskBoxImageWidth() {
-      return this[dartx.getPropertyValue]('mask-box-image-width');
-    }
-    set maskBoxImageWidth(value) {
-      this[dartx.setProperty]('mask-box-image-width', value, '');
-    }
-    get maskClip() {
-      return this[dartx.getPropertyValue]('mask-clip');
-    }
-    set maskClip(value) {
-      this[dartx.setProperty]('mask-clip', value, '');
-    }
-    get maskComposite() {
-      return this[dartx.getPropertyValue]('mask-composite');
-    }
-    set maskComposite(value) {
-      this[dartx.setProperty]('mask-composite', value, '');
-    }
-    get maskImage() {
-      return this[dartx.getPropertyValue]('mask-image');
-    }
-    set maskImage(value) {
-      this[dartx.setProperty]('mask-image', value, '');
-    }
-    get maskOrigin() {
-      return this[dartx.getPropertyValue]('mask-origin');
-    }
-    set maskOrigin(value) {
-      this[dartx.setProperty]('mask-origin', value, '');
-    }
-    get maskPosition() {
-      return this[dartx.getPropertyValue]('mask-position');
-    }
-    set maskPosition(value) {
-      this[dartx.setProperty]('mask-position', value, '');
-    }
-    get maskPositionX() {
-      return this[dartx.getPropertyValue]('mask-position-x');
-    }
-    set maskPositionX(value) {
-      this[dartx.setProperty]('mask-position-x', value, '');
-    }
-    get maskPositionY() {
-      return this[dartx.getPropertyValue]('mask-position-y');
-    }
-    set maskPositionY(value) {
-      this[dartx.setProperty]('mask-position-y', value, '');
-    }
-    get maskRepeat() {
-      return this[dartx.getPropertyValue]('mask-repeat');
-    }
-    set maskRepeat(value) {
-      this[dartx.setProperty]('mask-repeat', value, '');
-    }
-    get maskRepeatX() {
-      return this[dartx.getPropertyValue]('mask-repeat-x');
-    }
-    set maskRepeatX(value) {
-      this[dartx.setProperty]('mask-repeat-x', value, '');
-    }
-    get maskRepeatY() {
-      return this[dartx.getPropertyValue]('mask-repeat-y');
-    }
-    set maskRepeatY(value) {
-      this[dartx.setProperty]('mask-repeat-y', value, '');
-    }
-    get maskSize() {
-      return this[dartx.getPropertyValue]('mask-size');
-    }
-    set maskSize(value) {
-      this[dartx.setProperty]('mask-size', value, '');
-    }
-    get maskSourceType() {
-      return this[dartx.getPropertyValue]('mask-source-type');
-    }
-    set maskSourceType(value) {
-      this[dartx.setProperty]('mask-source-type', value, '');
-    }
-    get maxHeight() {
-      return this[dartx.getPropertyValue]('max-height');
-    }
-    set maxHeight(value) {
-      this[dartx.setProperty]('max-height', value, '');
-    }
-    get maxLogicalHeight() {
-      return this[dartx.getPropertyValue]('max-logical-height');
-    }
-    set maxLogicalHeight(value) {
-      this[dartx.setProperty]('max-logical-height', value, '');
-    }
-    get maxLogicalWidth() {
-      return this[dartx.getPropertyValue]('max-logical-width');
-    }
-    set maxLogicalWidth(value) {
-      this[dartx.setProperty]('max-logical-width', value, '');
-    }
-    get maxWidth() {
-      return this[dartx.getPropertyValue]('max-width');
-    }
-    set maxWidth(value) {
-      this[dartx.setProperty]('max-width', value, '');
-    }
-    get maxZoom() {
-      return this[dartx.getPropertyValue]('max-zoom');
-    }
-    set maxZoom(value) {
-      this[dartx.setProperty]('max-zoom', value, '');
-    }
-    get minHeight() {
-      return this[dartx.getPropertyValue]('min-height');
-    }
-    set minHeight(value) {
-      this[dartx.setProperty]('min-height', value, '');
-    }
-    get minLogicalHeight() {
-      return this[dartx.getPropertyValue]('min-logical-height');
-    }
-    set minLogicalHeight(value) {
-      this[dartx.setProperty]('min-logical-height', value, '');
-    }
-    get minLogicalWidth() {
-      return this[dartx.getPropertyValue]('min-logical-width');
-    }
-    set minLogicalWidth(value) {
-      this[dartx.setProperty]('min-logical-width', value, '');
-    }
-    get minWidth() {
-      return this[dartx.getPropertyValue]('min-width');
-    }
-    set minWidth(value) {
-      this[dartx.setProperty]('min-width', value, '');
-    }
-    get minZoom() {
-      return this[dartx.getPropertyValue]('min-zoom');
-    }
-    set minZoom(value) {
-      this[dartx.setProperty]('min-zoom', value, '');
-    }
-    get mixBlendMode() {
-      return this[dartx.getPropertyValue]('mix-blend-mode');
-    }
-    set mixBlendMode(value) {
-      this[dartx.setProperty]('mix-blend-mode', value, '');
-    }
-    get objectFit() {
-      return this[dartx.getPropertyValue]('object-fit');
-    }
-    set objectFit(value) {
-      this[dartx.setProperty]('object-fit', value, '');
-    }
-    get objectPosition() {
-      return this[dartx.getPropertyValue]('object-position');
-    }
-    set objectPosition(value) {
-      this[dartx.setProperty]('object-position', value, '');
-    }
-    get opacity() {
-      return this[dartx.getPropertyValue]('opacity');
-    }
-    set opacity(value) {
-      this[dartx.setProperty]('opacity', value, '');
-    }
-    get order() {
-      return this[dartx.getPropertyValue]('order');
-    }
-    set order(value) {
-      this[dartx.setProperty]('order', value, '');
-    }
-    get orientation() {
-      return this[dartx.getPropertyValue]('orientation');
-    }
-    set orientation(value) {
-      this[dartx.setProperty]('orientation', value, '');
-    }
-    get orphans() {
-      return this[dartx.getPropertyValue]('orphans');
-    }
-    set orphans(value) {
-      this[dartx.setProperty]('orphans', value, '');
-    }
-    get outline() {
-      return this[dartx.getPropertyValue]('outline');
-    }
-    set outline(value) {
-      this[dartx.setProperty]('outline', value, '');
-    }
-    get outlineColor() {
-      return this[dartx.getPropertyValue]('outline-color');
-    }
-    set outlineColor(value) {
-      this[dartx.setProperty]('outline-color', value, '');
-    }
-    get outlineOffset() {
-      return this[dartx.getPropertyValue]('outline-offset');
-    }
-    set outlineOffset(value) {
-      this[dartx.setProperty]('outline-offset', value, '');
-    }
-    get outlineStyle() {
-      return this[dartx.getPropertyValue]('outline-style');
-    }
-    set outlineStyle(value) {
-      this[dartx.setProperty]('outline-style', value, '');
-    }
-    get outlineWidth() {
-      return this[dartx.getPropertyValue]('outline-width');
-    }
-    set outlineWidth(value) {
-      this[dartx.setProperty]('outline-width', value, '');
-    }
-    get overflow() {
-      return this[dartx.getPropertyValue]('overflow');
-    }
-    set overflow(value) {
-      this[dartx.setProperty]('overflow', value, '');
-    }
-    get overflowWrap() {
-      return this[dartx.getPropertyValue]('overflow-wrap');
-    }
-    set overflowWrap(value) {
-      this[dartx.setProperty]('overflow-wrap', value, '');
-    }
-    get overflowX() {
-      return this[dartx.getPropertyValue]('overflow-x');
-    }
-    set overflowX(value) {
-      this[dartx.setProperty]('overflow-x', value, '');
-    }
-    get overflowY() {
-      return this[dartx.getPropertyValue]('overflow-y');
-    }
-    set overflowY(value) {
-      this[dartx.setProperty]('overflow-y', value, '');
-    }
-    get padding() {
-      return this[dartx.getPropertyValue]('padding');
-    }
-    set padding(value) {
-      this[dartx.setProperty]('padding', value, '');
-    }
-    get paddingAfter() {
-      return this[dartx.getPropertyValue]('padding-after');
-    }
-    set paddingAfter(value) {
-      this[dartx.setProperty]('padding-after', value, '');
-    }
-    get paddingBefore() {
-      return this[dartx.getPropertyValue]('padding-before');
-    }
-    set paddingBefore(value) {
-      this[dartx.setProperty]('padding-before', value, '');
-    }
-    get paddingBottom() {
-      return this[dartx.getPropertyValue]('padding-bottom');
-    }
-    set paddingBottom(value) {
-      this[dartx.setProperty]('padding-bottom', value, '');
-    }
-    get paddingEnd() {
-      return this[dartx.getPropertyValue]('padding-end');
-    }
-    set paddingEnd(value) {
-      this[dartx.setProperty]('padding-end', value, '');
-    }
-    get paddingLeft() {
-      return this[dartx.getPropertyValue]('padding-left');
-    }
-    set paddingLeft(value) {
-      this[dartx.setProperty]('padding-left', value, '');
-    }
-    get paddingRight() {
-      return this[dartx.getPropertyValue]('padding-right');
-    }
-    set paddingRight(value) {
-      this[dartx.setProperty]('padding-right', value, '');
-    }
-    get paddingStart() {
-      return this[dartx.getPropertyValue]('padding-start');
-    }
-    set paddingStart(value) {
-      this[dartx.setProperty]('padding-start', value, '');
-    }
-    get paddingTop() {
-      return this[dartx.getPropertyValue]('padding-top');
-    }
-    set paddingTop(value) {
-      this[dartx.setProperty]('padding-top', value, '');
-    }
-    get page() {
-      return this[dartx.getPropertyValue]('page');
-    }
-    set page(value) {
-      this[dartx.setProperty]('page', value, '');
-    }
-    get pageBreakAfter() {
-      return this[dartx.getPropertyValue]('page-break-after');
-    }
-    set pageBreakAfter(value) {
-      this[dartx.setProperty]('page-break-after', value, '');
-    }
-    get pageBreakBefore() {
-      return this[dartx.getPropertyValue]('page-break-before');
-    }
-    set pageBreakBefore(value) {
-      this[dartx.setProperty]('page-break-before', value, '');
-    }
-    get pageBreakInside() {
-      return this[dartx.getPropertyValue]('page-break-inside');
-    }
-    set pageBreakInside(value) {
-      this[dartx.setProperty]('page-break-inside', value, '');
-    }
-    get perspective() {
-      return this[dartx.getPropertyValue]('perspective');
-    }
-    set perspective(value) {
-      this[dartx.setProperty]('perspective', value, '');
-    }
-    get perspectiveOrigin() {
-      return this[dartx.getPropertyValue]('perspective-origin');
-    }
-    set perspectiveOrigin(value) {
-      this[dartx.setProperty]('perspective-origin', value, '');
-    }
-    get perspectiveOriginX() {
-      return this[dartx.getPropertyValue]('perspective-origin-x');
-    }
-    set perspectiveOriginX(value) {
-      this[dartx.setProperty]('perspective-origin-x', value, '');
-    }
-    get perspectiveOriginY() {
-      return this[dartx.getPropertyValue]('perspective-origin-y');
-    }
-    set perspectiveOriginY(value) {
-      this[dartx.setProperty]('perspective-origin-y', value, '');
-    }
-    get pointerEvents() {
-      return this[dartx.getPropertyValue]('pointer-events');
-    }
-    set pointerEvents(value) {
-      this[dartx.setProperty]('pointer-events', value, '');
-    }
-    get position() {
-      return this[dartx.getPropertyValue]('position');
-    }
-    set position(value) {
-      this[dartx.setProperty]('position', value, '');
-    }
-    get printColorAdjust() {
-      return this[dartx.getPropertyValue]('print-color-adjust');
-    }
-    set printColorAdjust(value) {
-      this[dartx.setProperty]('print-color-adjust', value, '');
-    }
-    get quotes() {
-      return this[dartx.getPropertyValue]('quotes');
-    }
-    set quotes(value) {
-      this[dartx.setProperty]('quotes', value, '');
-    }
-    get resize() {
-      return this[dartx.getPropertyValue]('resize');
-    }
-    set resize(value) {
-      this[dartx.setProperty]('resize', value, '');
-    }
-    get right() {
-      return this[dartx.getPropertyValue]('right');
-    }
-    set right(value) {
-      this[dartx.setProperty]('right', value, '');
-    }
-    get rtlOrdering() {
-      return this[dartx.getPropertyValue]('rtl-ordering');
-    }
-    set rtlOrdering(value) {
-      this[dartx.setProperty]('rtl-ordering', value, '');
-    }
-    get rubyPosition() {
-      return this[dartx.getPropertyValue]('ruby-position');
-    }
-    set rubyPosition(value) {
-      this[dartx.setProperty]('ruby-position', value, '');
-    }
-    get scrollBehavior() {
-      return this[dartx.getPropertyValue]('scroll-behavior');
-    }
-    set scrollBehavior(value) {
-      this[dartx.setProperty]('scroll-behavior', value, '');
-    }
-    get shapeImageThreshold() {
-      return this[dartx.getPropertyValue]('shape-image-threshold');
-    }
-    set shapeImageThreshold(value) {
-      this[dartx.setProperty]('shape-image-threshold', value, '');
-    }
-    get shapeMargin() {
-      return this[dartx.getPropertyValue]('shape-margin');
-    }
-    set shapeMargin(value) {
-      this[dartx.setProperty]('shape-margin', value, '');
-    }
-    get shapeOutside() {
-      return this[dartx.getPropertyValue]('shape-outside');
-    }
-    set shapeOutside(value) {
-      this[dartx.setProperty]('shape-outside', value, '');
-    }
-    get size() {
-      return this[dartx.getPropertyValue]('size');
-    }
-    set size(value) {
-      this[dartx.setProperty]('size', value, '');
-    }
-    get speak() {
-      return this[dartx.getPropertyValue]('speak');
-    }
-    set speak(value) {
-      this[dartx.setProperty]('speak', value, '');
-    }
-    get src() {
-      return this[dartx.getPropertyValue]('src');
-    }
-    set src(value) {
-      this[dartx.setProperty]('src', value, '');
-    }
-    get tabSize() {
-      return this[dartx.getPropertyValue]('tab-size');
-    }
-    set tabSize(value) {
-      this[dartx.setProperty]('tab-size', value, '');
-    }
-    get tableLayout() {
-      return this[dartx.getPropertyValue]('table-layout');
-    }
-    set tableLayout(value) {
-      this[dartx.setProperty]('table-layout', value, '');
-    }
-    get tapHighlightColor() {
-      return this[dartx.getPropertyValue]('tap-highlight-color');
-    }
-    set tapHighlightColor(value) {
-      this[dartx.setProperty]('tap-highlight-color', value, '');
-    }
-    get textAlign() {
-      return this[dartx.getPropertyValue]('text-align');
-    }
-    set textAlign(value) {
-      this[dartx.setProperty]('text-align', value, '');
-    }
-    get textAlignLast() {
-      return this[dartx.getPropertyValue]('text-align-last');
-    }
-    set textAlignLast(value) {
-      this[dartx.setProperty]('text-align-last', value, '');
-    }
-    get textCombine() {
-      return this[dartx.getPropertyValue]('text-combine');
-    }
-    set textCombine(value) {
-      this[dartx.setProperty]('text-combine', value, '');
-    }
-    get textDecoration() {
-      return this[dartx.getPropertyValue]('text-decoration');
-    }
-    set textDecoration(value) {
-      this[dartx.setProperty]('text-decoration', value, '');
-    }
-    get textDecorationColor() {
-      return this[dartx.getPropertyValue]('text-decoration-color');
-    }
-    set textDecorationColor(value) {
-      this[dartx.setProperty]('text-decoration-color', value, '');
-    }
-    get textDecorationLine() {
-      return this[dartx.getPropertyValue]('text-decoration-line');
-    }
-    set textDecorationLine(value) {
-      this[dartx.setProperty]('text-decoration-line', value, '');
-    }
-    get textDecorationStyle() {
-      return this[dartx.getPropertyValue]('text-decoration-style');
-    }
-    set textDecorationStyle(value) {
-      this[dartx.setProperty]('text-decoration-style', value, '');
-    }
-    get textDecorationsInEffect() {
-      return this[dartx.getPropertyValue]('text-decorations-in-effect');
-    }
-    set textDecorationsInEffect(value) {
-      this[dartx.setProperty]('text-decorations-in-effect', value, '');
-    }
-    get textEmphasis() {
-      return this[dartx.getPropertyValue]('text-emphasis');
-    }
-    set textEmphasis(value) {
-      this[dartx.setProperty]('text-emphasis', value, '');
-    }
-    get textEmphasisColor() {
-      return this[dartx.getPropertyValue]('text-emphasis-color');
-    }
-    set textEmphasisColor(value) {
-      this[dartx.setProperty]('text-emphasis-color', value, '');
-    }
-    get textEmphasisPosition() {
-      return this[dartx.getPropertyValue]('text-emphasis-position');
-    }
-    set textEmphasisPosition(value) {
-      this[dartx.setProperty]('text-emphasis-position', value, '');
-    }
-    get textEmphasisStyle() {
-      return this[dartx.getPropertyValue]('text-emphasis-style');
-    }
-    set textEmphasisStyle(value) {
-      this[dartx.setProperty]('text-emphasis-style', value, '');
-    }
-    get textFillColor() {
-      return this[dartx.getPropertyValue]('text-fill-color');
-    }
-    set textFillColor(value) {
-      this[dartx.setProperty]('text-fill-color', value, '');
-    }
-    get textIndent() {
-      return this[dartx.getPropertyValue]('text-indent');
-    }
-    set textIndent(value) {
-      this[dartx.setProperty]('text-indent', value, '');
-    }
-    get textJustify() {
-      return this[dartx.getPropertyValue]('text-justify');
-    }
-    set textJustify(value) {
-      this[dartx.setProperty]('text-justify', value, '');
-    }
-    get textLineThroughColor() {
-      return this[dartx.getPropertyValue]('text-line-through-color');
-    }
-    set textLineThroughColor(value) {
-      this[dartx.setProperty]('text-line-through-color', value, '');
-    }
-    get textLineThroughMode() {
-      return this[dartx.getPropertyValue]('text-line-through-mode');
-    }
-    set textLineThroughMode(value) {
-      this[dartx.setProperty]('text-line-through-mode', value, '');
-    }
-    get textLineThroughStyle() {
-      return this[dartx.getPropertyValue]('text-line-through-style');
-    }
-    set textLineThroughStyle(value) {
-      this[dartx.setProperty]('text-line-through-style', value, '');
-    }
-    get textLineThroughWidth() {
-      return this[dartx.getPropertyValue]('text-line-through-width');
-    }
-    set textLineThroughWidth(value) {
-      this[dartx.setProperty]('text-line-through-width', value, '');
-    }
-    get textOrientation() {
-      return this[dartx.getPropertyValue]('text-orientation');
-    }
-    set textOrientation(value) {
-      this[dartx.setProperty]('text-orientation', value, '');
-    }
-    get textOverflow() {
-      return this[dartx.getPropertyValue]('text-overflow');
-    }
-    set textOverflow(value) {
-      this[dartx.setProperty]('text-overflow', value, '');
-    }
-    get textOverlineColor() {
-      return this[dartx.getPropertyValue]('text-overline-color');
-    }
-    set textOverlineColor(value) {
-      this[dartx.setProperty]('text-overline-color', value, '');
-    }
-    get textOverlineMode() {
-      return this[dartx.getPropertyValue]('text-overline-mode');
-    }
-    set textOverlineMode(value) {
-      this[dartx.setProperty]('text-overline-mode', value, '');
-    }
-    get textOverlineStyle() {
-      return this[dartx.getPropertyValue]('text-overline-style');
-    }
-    set textOverlineStyle(value) {
-      this[dartx.setProperty]('text-overline-style', value, '');
-    }
-    get textOverlineWidth() {
-      return this[dartx.getPropertyValue]('text-overline-width');
-    }
-    set textOverlineWidth(value) {
-      this[dartx.setProperty]('text-overline-width', value, '');
-    }
-    get textRendering() {
-      return this[dartx.getPropertyValue]('text-rendering');
-    }
-    set textRendering(value) {
-      this[dartx.setProperty]('text-rendering', value, '');
-    }
-    get textSecurity() {
-      return this[dartx.getPropertyValue]('text-security');
-    }
-    set textSecurity(value) {
-      this[dartx.setProperty]('text-security', value, '');
-    }
-    get textShadow() {
-      return this[dartx.getPropertyValue]('text-shadow');
-    }
-    set textShadow(value) {
-      this[dartx.setProperty]('text-shadow', value, '');
-    }
-    get textStroke() {
-      return this[dartx.getPropertyValue]('text-stroke');
-    }
-    set textStroke(value) {
-      this[dartx.setProperty]('text-stroke', value, '');
-    }
-    get textStrokeColor() {
-      return this[dartx.getPropertyValue]('text-stroke-color');
-    }
-    set textStrokeColor(value) {
-      this[dartx.setProperty]('text-stroke-color', value, '');
-    }
-    get textStrokeWidth() {
-      return this[dartx.getPropertyValue]('text-stroke-width');
-    }
-    set textStrokeWidth(value) {
-      this[dartx.setProperty]('text-stroke-width', value, '');
-    }
-    get textTransform() {
-      return this[dartx.getPropertyValue]('text-transform');
-    }
-    set textTransform(value) {
-      this[dartx.setProperty]('text-transform', value, '');
-    }
-    get textUnderlineColor() {
-      return this[dartx.getPropertyValue]('text-underline-color');
-    }
-    set textUnderlineColor(value) {
-      this[dartx.setProperty]('text-underline-color', value, '');
-    }
-    get textUnderlineMode() {
-      return this[dartx.getPropertyValue]('text-underline-mode');
-    }
-    set textUnderlineMode(value) {
-      this[dartx.setProperty]('text-underline-mode', value, '');
-    }
-    get textUnderlinePosition() {
-      return this[dartx.getPropertyValue]('text-underline-position');
-    }
-    set textUnderlinePosition(value) {
-      this[dartx.setProperty]('text-underline-position', value, '');
-    }
-    get textUnderlineStyle() {
-      return this[dartx.getPropertyValue]('text-underline-style');
-    }
-    set textUnderlineStyle(value) {
-      this[dartx.setProperty]('text-underline-style', value, '');
-    }
-    get textUnderlineWidth() {
-      return this[dartx.getPropertyValue]('text-underline-width');
-    }
-    set textUnderlineWidth(value) {
-      this[dartx.setProperty]('text-underline-width', value, '');
-    }
-    get top() {
-      return this[dartx.getPropertyValue]('top');
-    }
-    set top(value) {
-      this[dartx.setProperty]('top', value, '');
-    }
-    get touchAction() {
-      return this[dartx.getPropertyValue]('touch-action');
-    }
-    set touchAction(value) {
-      this[dartx.setProperty]('touch-action', value, '');
-    }
-    get touchActionDelay() {
-      return this[dartx.getPropertyValue]('touch-action-delay');
-    }
-    set touchActionDelay(value) {
-      this[dartx.setProperty]('touch-action-delay', value, '');
-    }
-    get transform() {
-      return this[dartx.getPropertyValue]('transform');
-    }
-    set transform(value) {
-      this[dartx.setProperty]('transform', value, '');
-    }
-    get transformOrigin() {
-      return this[dartx.getPropertyValue]('transform-origin');
-    }
-    set transformOrigin(value) {
-      this[dartx.setProperty]('transform-origin', value, '');
-    }
-    get transformOriginX() {
-      return this[dartx.getPropertyValue]('transform-origin-x');
-    }
-    set transformOriginX(value) {
-      this[dartx.setProperty]('transform-origin-x', value, '');
-    }
-    get transformOriginY() {
-      return this[dartx.getPropertyValue]('transform-origin-y');
-    }
-    set transformOriginY(value) {
-      this[dartx.setProperty]('transform-origin-y', value, '');
-    }
-    get transformOriginZ() {
-      return this[dartx.getPropertyValue]('transform-origin-z');
-    }
-    set transformOriginZ(value) {
-      this[dartx.setProperty]('transform-origin-z', value, '');
-    }
-    get transformStyle() {
-      return this[dartx.getPropertyValue]('transform-style');
-    }
-    set transformStyle(value) {
-      this[dartx.setProperty]('transform-style', value, '');
-    }
-    get transition() {
-      return this[dartx.getPropertyValue]('transition');
-    }
-    set transition(value) {
-      this[dartx.setProperty]('transition', value, '');
-    }
-    get transitionDelay() {
-      return this[dartx.getPropertyValue]('transition-delay');
-    }
-    set transitionDelay(value) {
-      this[dartx.setProperty]('transition-delay', value, '');
-    }
-    get transitionDuration() {
-      return this[dartx.getPropertyValue]('transition-duration');
-    }
-    set transitionDuration(value) {
-      this[dartx.setProperty]('transition-duration', value, '');
-    }
-    get transitionProperty() {
-      return this[dartx.getPropertyValue]('transition-property');
-    }
-    set transitionProperty(value) {
-      this[dartx.setProperty]('transition-property', value, '');
-    }
-    get transitionTimingFunction() {
-      return this[dartx.getPropertyValue]('transition-timing-function');
-    }
-    set transitionTimingFunction(value) {
-      this[dartx.setProperty]('transition-timing-function', value, '');
-    }
-    get unicodeBidi() {
-      return this[dartx.getPropertyValue]('unicode-bidi');
-    }
-    set unicodeBidi(value) {
-      this[dartx.setProperty]('unicode-bidi', value, '');
-    }
-    get unicodeRange() {
-      return this[dartx.getPropertyValue]('unicode-range');
-    }
-    set unicodeRange(value) {
-      this[dartx.setProperty]('unicode-range', value, '');
-    }
-    get userDrag() {
-      return this[dartx.getPropertyValue]('user-drag');
-    }
-    set userDrag(value) {
-      this[dartx.setProperty]('user-drag', value, '');
-    }
-    get userModify() {
-      return this[dartx.getPropertyValue]('user-modify');
-    }
-    set userModify(value) {
-      this[dartx.setProperty]('user-modify', value, '');
-    }
-    get userSelect() {
-      return this[dartx.getPropertyValue]('user-select');
-    }
-    set userSelect(value) {
-      this[dartx.setProperty]('user-select', value, '');
-    }
-    get userZoom() {
-      return this[dartx.getPropertyValue]('user-zoom');
-    }
-    set userZoom(value) {
-      this[dartx.setProperty]('user-zoom', value, '');
-    }
-    get verticalAlign() {
-      return this[dartx.getPropertyValue]('vertical-align');
-    }
-    set verticalAlign(value) {
-      this[dartx.setProperty]('vertical-align', value, '');
-    }
-    get visibility() {
-      return this[dartx.getPropertyValue]('visibility');
-    }
-    set visibility(value) {
-      this[dartx.setProperty]('visibility', value, '');
-    }
-    get whiteSpace() {
-      return this[dartx.getPropertyValue]('white-space');
-    }
-    set whiteSpace(value) {
-      this[dartx.setProperty]('white-space', value, '');
-    }
-    get widows() {
-      return this[dartx.getPropertyValue]('widows');
-    }
-    set widows(value) {
-      this[dartx.setProperty]('widows', value, '');
-    }
-    get width() {
-      return this[dartx.getPropertyValue]('width');
-    }
-    set width(value) {
-      this[dartx.setProperty]('width', value, '');
-    }
-    get willChange() {
-      return this[dartx.getPropertyValue]('will-change');
-    }
-    set willChange(value) {
-      this[dartx.setProperty]('will-change', value, '');
-    }
-    get wordBreak() {
-      return this[dartx.getPropertyValue]('word-break');
-    }
-    set wordBreak(value) {
-      this[dartx.setProperty]('word-break', value, '');
-    }
-    get wordSpacing() {
-      return this[dartx.getPropertyValue]('word-spacing');
-    }
-    set wordSpacing(value) {
-      this[dartx.setProperty]('word-spacing', value, '');
-    }
-    get wordWrap() {
-      return this[dartx.getPropertyValue]('word-wrap');
-    }
-    set wordWrap(value) {
-      this[dartx.setProperty]('word-wrap', value, '');
-    }
-    get wrapFlow() {
-      return this[dartx.getPropertyValue]('wrap-flow');
-    }
-    set wrapFlow(value) {
-      this[dartx.setProperty]('wrap-flow', value, '');
-    }
-    get wrapThrough() {
-      return this[dartx.getPropertyValue]('wrap-through');
-    }
-    set wrapThrough(value) {
-      this[dartx.setProperty]('wrap-through', value, '');
-    }
-    get writingMode() {
-      return this[dartx.getPropertyValue]('writing-mode');
-    }
-    set writingMode(value) {
-      this[dartx.setProperty]('writing-mode', value, '');
-    }
-    get zIndex() {
-      return this[dartx.getPropertyValue]('z-index');
-    }
-    set zIndex(value) {
-      this[dartx.setProperty]('z-index', value, '');
-    }
-    get zoom() {
-      return this[dartx.getPropertyValue]('zoom');
-    }
-    set zoom(value) {
-      this[dartx.setProperty]('zoom', value, '');
-    }
-  };
-  dart.setSignature(html$.CssStyleDeclarationBase, {
-    getters: () => ({
-      alignContent: dart.definiteFunctionType(core.String, []),
-      alignItems: dart.definiteFunctionType(core.String, []),
-      alignSelf: dart.definiteFunctionType(core.String, []),
-      animation: dart.definiteFunctionType(core.String, []),
-      animationDelay: dart.definiteFunctionType(core.String, []),
-      animationDirection: dart.definiteFunctionType(core.String, []),
-      animationDuration: dart.definiteFunctionType(core.String, []),
-      animationFillMode: dart.definiteFunctionType(core.String, []),
-      animationIterationCount: dart.definiteFunctionType(core.String, []),
-      animationName: dart.definiteFunctionType(core.String, []),
-      animationPlayState: dart.definiteFunctionType(core.String, []),
-      animationTimingFunction: dart.definiteFunctionType(core.String, []),
-      appRegion: dart.definiteFunctionType(core.String, []),
-      appearance: dart.definiteFunctionType(core.String, []),
-      aspectRatio: dart.definiteFunctionType(core.String, []),
-      backfaceVisibility: dart.definiteFunctionType(core.String, []),
-      background: dart.definiteFunctionType(core.String, []),
-      backgroundAttachment: dart.definiteFunctionType(core.String, []),
-      backgroundBlendMode: dart.definiteFunctionType(core.String, []),
-      backgroundClip: dart.definiteFunctionType(core.String, []),
-      backgroundColor: dart.definiteFunctionType(core.String, []),
-      backgroundComposite: dart.definiteFunctionType(core.String, []),
-      backgroundImage: dart.definiteFunctionType(core.String, []),
-      backgroundOrigin: dart.definiteFunctionType(core.String, []),
-      backgroundPosition: dart.definiteFunctionType(core.String, []),
-      backgroundPositionX: dart.definiteFunctionType(core.String, []),
-      backgroundPositionY: dart.definiteFunctionType(core.String, []),
-      backgroundRepeat: dart.definiteFunctionType(core.String, []),
-      backgroundRepeatX: dart.definiteFunctionType(core.String, []),
-      backgroundRepeatY: dart.definiteFunctionType(core.String, []),
-      backgroundSize: dart.definiteFunctionType(core.String, []),
-      border: dart.definiteFunctionType(core.String, []),
-      borderAfter: dart.definiteFunctionType(core.String, []),
-      borderAfterColor: dart.definiteFunctionType(core.String, []),
-      borderAfterStyle: dart.definiteFunctionType(core.String, []),
-      borderAfterWidth: dart.definiteFunctionType(core.String, []),
-      borderBefore: dart.definiteFunctionType(core.String, []),
-      borderBeforeColor: dart.definiteFunctionType(core.String, []),
-      borderBeforeStyle: dart.definiteFunctionType(core.String, []),
-      borderBeforeWidth: dart.definiteFunctionType(core.String, []),
-      borderBottom: dart.definiteFunctionType(core.String, []),
-      borderBottomColor: dart.definiteFunctionType(core.String, []),
-      borderBottomLeftRadius: dart.definiteFunctionType(core.String, []),
-      borderBottomRightRadius: dart.definiteFunctionType(core.String, []),
-      borderBottomStyle: dart.definiteFunctionType(core.String, []),
-      borderBottomWidth: dart.definiteFunctionType(core.String, []),
-      borderCollapse: dart.definiteFunctionType(core.String, []),
-      borderColor: dart.definiteFunctionType(core.String, []),
-      borderEnd: dart.definiteFunctionType(core.String, []),
-      borderEndColor: dart.definiteFunctionType(core.String, []),
-      borderEndStyle: dart.definiteFunctionType(core.String, []),
-      borderEndWidth: dart.definiteFunctionType(core.String, []),
-      borderFit: dart.definiteFunctionType(core.String, []),
-      borderHorizontalSpacing: dart.definiteFunctionType(core.String, []),
-      borderImage: dart.definiteFunctionType(core.String, []),
-      borderImageOutset: dart.definiteFunctionType(core.String, []),
-      borderImageRepeat: dart.definiteFunctionType(core.String, []),
-      borderImageSlice: dart.definiteFunctionType(core.String, []),
-      borderImageSource: dart.definiteFunctionType(core.String, []),
-      borderImageWidth: dart.definiteFunctionType(core.String, []),
-      borderLeft: dart.definiteFunctionType(core.String, []),
-      borderLeftColor: dart.definiteFunctionType(core.String, []),
-      borderLeftStyle: dart.definiteFunctionType(core.String, []),
-      borderLeftWidth: dart.definiteFunctionType(core.String, []),
-      borderRadius: dart.definiteFunctionType(core.String, []),
-      borderRight: dart.definiteFunctionType(core.String, []),
-      borderRightColor: dart.definiteFunctionType(core.String, []),
-      borderRightStyle: dart.definiteFunctionType(core.String, []),
-      borderRightWidth: dart.definiteFunctionType(core.String, []),
-      borderSpacing: dart.definiteFunctionType(core.String, []),
-      borderStart: dart.definiteFunctionType(core.String, []),
-      borderStartColor: dart.definiteFunctionType(core.String, []),
-      borderStartStyle: dart.definiteFunctionType(core.String, []),
-      borderStartWidth: dart.definiteFunctionType(core.String, []),
-      borderStyle: dart.definiteFunctionType(core.String, []),
-      borderTop: dart.definiteFunctionType(core.String, []),
-      borderTopColor: dart.definiteFunctionType(core.String, []),
-      borderTopLeftRadius: dart.definiteFunctionType(core.String, []),
-      borderTopRightRadius: dart.definiteFunctionType(core.String, []),
-      borderTopStyle: dart.definiteFunctionType(core.String, []),
-      borderTopWidth: dart.definiteFunctionType(core.String, []),
-      borderVerticalSpacing: dart.definiteFunctionType(core.String, []),
-      borderWidth: dart.definiteFunctionType(core.String, []),
-      bottom: dart.definiteFunctionType(core.String, []),
-      boxAlign: dart.definiteFunctionType(core.String, []),
-      boxDecorationBreak: dart.definiteFunctionType(core.String, []),
-      boxDirection: dart.definiteFunctionType(core.String, []),
-      boxFlex: dart.definiteFunctionType(core.String, []),
-      boxFlexGroup: dart.definiteFunctionType(core.String, []),
-      boxLines: dart.definiteFunctionType(core.String, []),
-      boxOrdinalGroup: dart.definiteFunctionType(core.String, []),
-      boxOrient: dart.definiteFunctionType(core.String, []),
-      boxPack: dart.definiteFunctionType(core.String, []),
-      boxReflect: dart.definiteFunctionType(core.String, []),
-      boxShadow: dart.definiteFunctionType(core.String, []),
-      boxSizing: dart.definiteFunctionType(core.String, []),
-      captionSide: dart.definiteFunctionType(core.String, []),
-      clear: dart.definiteFunctionType(core.String, []),
-      clip: dart.definiteFunctionType(core.String, []),
-      clipPath: dart.definiteFunctionType(core.String, []),
-      color: dart.definiteFunctionType(core.String, []),
-      columnBreakAfter: dart.definiteFunctionType(core.String, []),
-      columnBreakBefore: dart.definiteFunctionType(core.String, []),
-      columnBreakInside: dart.definiteFunctionType(core.String, []),
-      columnCount: dart.definiteFunctionType(core.String, []),
-      columnFill: dart.definiteFunctionType(core.String, []),
-      columnGap: dart.definiteFunctionType(core.String, []),
-      columnRule: dart.definiteFunctionType(core.String, []),
-      columnRuleColor: dart.definiteFunctionType(core.String, []),
-      columnRuleStyle: dart.definiteFunctionType(core.String, []),
-      columnRuleWidth: dart.definiteFunctionType(core.String, []),
-      columnSpan: dart.definiteFunctionType(core.String, []),
-      columnWidth: dart.definiteFunctionType(core.String, []),
-      columns: dart.definiteFunctionType(core.String, []),
-      content: dart.definiteFunctionType(core.String, []),
-      counterIncrement: dart.definiteFunctionType(core.String, []),
-      counterReset: dart.definiteFunctionType(core.String, []),
-      cursor: dart.definiteFunctionType(core.String, []),
-      direction: dart.definiteFunctionType(core.String, []),
-      display: dart.definiteFunctionType(core.String, []),
-      emptyCells: dart.definiteFunctionType(core.String, []),
-      filter: dart.definiteFunctionType(core.String, []),
-      flex: dart.definiteFunctionType(core.String, []),
-      flexBasis: dart.definiteFunctionType(core.String, []),
-      flexDirection: dart.definiteFunctionType(core.String, []),
-      flexFlow: dart.definiteFunctionType(core.String, []),
-      flexGrow: dart.definiteFunctionType(core.String, []),
-      flexShrink: dart.definiteFunctionType(core.String, []),
-      flexWrap: dart.definiteFunctionType(core.String, []),
-      float: dart.definiteFunctionType(core.String, []),
-      font: dart.definiteFunctionType(core.String, []),
-      fontFamily: dart.definiteFunctionType(core.String, []),
-      fontFeatureSettings: dart.definiteFunctionType(core.String, []),
-      fontKerning: dart.definiteFunctionType(core.String, []),
-      fontSize: dart.definiteFunctionType(core.String, []),
-      fontSizeDelta: dart.definiteFunctionType(core.String, []),
-      fontSmoothing: dart.definiteFunctionType(core.String, []),
-      fontStretch: dart.definiteFunctionType(core.String, []),
-      fontStyle: dart.definiteFunctionType(core.String, []),
-      fontVariant: dart.definiteFunctionType(core.String, []),
-      fontVariantLigatures: dart.definiteFunctionType(core.String, []),
-      fontWeight: dart.definiteFunctionType(core.String, []),
-      grid: dart.definiteFunctionType(core.String, []),
-      gridArea: dart.definiteFunctionType(core.String, []),
-      gridAutoColumns: dart.definiteFunctionType(core.String, []),
-      gridAutoFlow: dart.definiteFunctionType(core.String, []),
-      gridAutoRows: dart.definiteFunctionType(core.String, []),
-      gridColumn: dart.definiteFunctionType(core.String, []),
-      gridColumnEnd: dart.definiteFunctionType(core.String, []),
-      gridColumnStart: dart.definiteFunctionType(core.String, []),
-      gridRow: dart.definiteFunctionType(core.String, []),
-      gridRowEnd: dart.definiteFunctionType(core.String, []),
-      gridRowStart: dart.definiteFunctionType(core.String, []),
-      gridTemplate: dart.definiteFunctionType(core.String, []),
-      gridTemplateAreas: dart.definiteFunctionType(core.String, []),
-      gridTemplateColumns: dart.definiteFunctionType(core.String, []),
-      gridTemplateRows: dart.definiteFunctionType(core.String, []),
-      height: dart.definiteFunctionType(core.String, []),
-      highlight: dart.definiteFunctionType(core.String, []),
-      hyphenateCharacter: dart.definiteFunctionType(core.String, []),
-      imageRendering: dart.definiteFunctionType(core.String, []),
-      isolation: dart.definiteFunctionType(core.String, []),
-      justifyContent: dart.definiteFunctionType(core.String, []),
-      justifySelf: dart.definiteFunctionType(core.String, []),
-      left: dart.definiteFunctionType(core.String, []),
-      letterSpacing: dart.definiteFunctionType(core.String, []),
-      lineBoxContain: dart.definiteFunctionType(core.String, []),
-      lineBreak: dart.definiteFunctionType(core.String, []),
-      lineClamp: dart.definiteFunctionType(core.String, []),
-      lineHeight: dart.definiteFunctionType(core.String, []),
-      listStyle: dart.definiteFunctionType(core.String, []),
-      listStyleImage: dart.definiteFunctionType(core.String, []),
-      listStylePosition: dart.definiteFunctionType(core.String, []),
-      listStyleType: dart.definiteFunctionType(core.String, []),
-      locale: dart.definiteFunctionType(core.String, []),
-      logicalHeight: dart.definiteFunctionType(core.String, []),
-      logicalWidth: dart.definiteFunctionType(core.String, []),
-      margin: dart.definiteFunctionType(core.String, []),
-      marginAfter: dart.definiteFunctionType(core.String, []),
-      marginAfterCollapse: dart.definiteFunctionType(core.String, []),
-      marginBefore: dart.definiteFunctionType(core.String, []),
-      marginBeforeCollapse: dart.definiteFunctionType(core.String, []),
-      marginBottom: dart.definiteFunctionType(core.String, []),
-      marginBottomCollapse: dart.definiteFunctionType(core.String, []),
-      marginCollapse: dart.definiteFunctionType(core.String, []),
-      marginEnd: dart.definiteFunctionType(core.String, []),
-      marginLeft: dart.definiteFunctionType(core.String, []),
-      marginRight: dart.definiteFunctionType(core.String, []),
-      marginStart: dart.definiteFunctionType(core.String, []),
-      marginTop: dart.definiteFunctionType(core.String, []),
-      marginTopCollapse: dart.definiteFunctionType(core.String, []),
-      mask: dart.definiteFunctionType(core.String, []),
-      maskBoxImage: dart.definiteFunctionType(core.String, []),
-      maskBoxImageOutset: dart.definiteFunctionType(core.String, []),
-      maskBoxImageRepeat: dart.definiteFunctionType(core.String, []),
-      maskBoxImageSlice: dart.definiteFunctionType(core.String, []),
-      maskBoxImageSource: dart.definiteFunctionType(core.String, []),
-      maskBoxImageWidth: dart.definiteFunctionType(core.String, []),
-      maskClip: dart.definiteFunctionType(core.String, []),
-      maskComposite: dart.definiteFunctionType(core.String, []),
-      maskImage: dart.definiteFunctionType(core.String, []),
-      maskOrigin: dart.definiteFunctionType(core.String, []),
-      maskPosition: dart.definiteFunctionType(core.String, []),
-      maskPositionX: dart.definiteFunctionType(core.String, []),
-      maskPositionY: dart.definiteFunctionType(core.String, []),
-      maskRepeat: dart.definiteFunctionType(core.String, []),
-      maskRepeatX: dart.definiteFunctionType(core.String, []),
-      maskRepeatY: dart.definiteFunctionType(core.String, []),
-      maskSize: dart.definiteFunctionType(core.String, []),
-      maskSourceType: dart.definiteFunctionType(core.String, []),
-      maxHeight: dart.definiteFunctionType(core.String, []),
-      maxLogicalHeight: dart.definiteFunctionType(core.String, []),
-      maxLogicalWidth: dart.definiteFunctionType(core.String, []),
-      maxWidth: dart.definiteFunctionType(core.String, []),
-      maxZoom: dart.definiteFunctionType(core.String, []),
-      minHeight: dart.definiteFunctionType(core.String, []),
-      minLogicalHeight: dart.definiteFunctionType(core.String, []),
-      minLogicalWidth: dart.definiteFunctionType(core.String, []),
-      minWidth: dart.definiteFunctionType(core.String, []),
-      minZoom: dart.definiteFunctionType(core.String, []),
-      mixBlendMode: dart.definiteFunctionType(core.String, []),
-      objectFit: dart.definiteFunctionType(core.String, []),
-      objectPosition: dart.definiteFunctionType(core.String, []),
-      opacity: dart.definiteFunctionType(core.String, []),
-      order: dart.definiteFunctionType(core.String, []),
-      orientation: dart.definiteFunctionType(core.String, []),
-      orphans: dart.definiteFunctionType(core.String, []),
-      outline: dart.definiteFunctionType(core.String, []),
-      outlineColor: dart.definiteFunctionType(core.String, []),
-      outlineOffset: dart.definiteFunctionType(core.String, []),
-      outlineStyle: dart.definiteFunctionType(core.String, []),
-      outlineWidth: dart.definiteFunctionType(core.String, []),
-      overflow: dart.definiteFunctionType(core.String, []),
-      overflowWrap: dart.definiteFunctionType(core.String, []),
-      overflowX: dart.definiteFunctionType(core.String, []),
-      overflowY: dart.definiteFunctionType(core.String, []),
-      padding: dart.definiteFunctionType(core.String, []),
-      paddingAfter: dart.definiteFunctionType(core.String, []),
-      paddingBefore: dart.definiteFunctionType(core.String, []),
-      paddingBottom: dart.definiteFunctionType(core.String, []),
-      paddingEnd: dart.definiteFunctionType(core.String, []),
-      paddingLeft: dart.definiteFunctionType(core.String, []),
-      paddingRight: dart.definiteFunctionType(core.String, []),
-      paddingStart: dart.definiteFunctionType(core.String, []),
-      paddingTop: dart.definiteFunctionType(core.String, []),
-      page: dart.definiteFunctionType(core.String, []),
-      pageBreakAfter: dart.definiteFunctionType(core.String, []),
-      pageBreakBefore: dart.definiteFunctionType(core.String, []),
-      pageBreakInside: dart.definiteFunctionType(core.String, []),
-      perspective: dart.definiteFunctionType(core.String, []),
-      perspectiveOrigin: dart.definiteFunctionType(core.String, []),
-      perspectiveOriginX: dart.definiteFunctionType(core.String, []),
-      perspectiveOriginY: dart.definiteFunctionType(core.String, []),
-      pointerEvents: dart.definiteFunctionType(core.String, []),
-      position: dart.definiteFunctionType(core.String, []),
-      printColorAdjust: dart.definiteFunctionType(core.String, []),
-      quotes: dart.definiteFunctionType(core.String, []),
-      resize: dart.definiteFunctionType(core.String, []),
-      right: dart.definiteFunctionType(core.String, []),
-      rtlOrdering: dart.definiteFunctionType(core.String, []),
-      rubyPosition: dart.definiteFunctionType(core.String, []),
-      scrollBehavior: dart.definiteFunctionType(core.String, []),
-      shapeImageThreshold: dart.definiteFunctionType(core.String, []),
-      shapeMargin: dart.definiteFunctionType(core.String, []),
-      shapeOutside: dart.definiteFunctionType(core.String, []),
-      size: dart.definiteFunctionType(core.String, []),
-      speak: dart.definiteFunctionType(core.String, []),
-      src: dart.definiteFunctionType(core.String, []),
-      tabSize: dart.definiteFunctionType(core.String, []),
-      tableLayout: dart.definiteFunctionType(core.String, []),
-      tapHighlightColor: dart.definiteFunctionType(core.String, []),
-      textAlign: dart.definiteFunctionType(core.String, []),
-      textAlignLast: dart.definiteFunctionType(core.String, []),
-      textCombine: dart.definiteFunctionType(core.String, []),
-      textDecoration: dart.definiteFunctionType(core.String, []),
-      textDecorationColor: dart.definiteFunctionType(core.String, []),
-      textDecorationLine: dart.definiteFunctionType(core.String, []),
-      textDecorationStyle: dart.definiteFunctionType(core.String, []),
-      textDecorationsInEffect: dart.definiteFunctionType(core.String, []),
-      textEmphasis: dart.definiteFunctionType(core.String, []),
-      textEmphasisColor: dart.definiteFunctionType(core.String, []),
-      textEmphasisPosition: dart.definiteFunctionType(core.String, []),
-      textEmphasisStyle: dart.definiteFunctionType(core.String, []),
-      textFillColor: dart.definiteFunctionType(core.String, []),
-      textIndent: dart.definiteFunctionType(core.String, []),
-      textJustify: dart.definiteFunctionType(core.String, []),
-      textLineThroughColor: dart.definiteFunctionType(core.String, []),
-      textLineThroughMode: dart.definiteFunctionType(core.String, []),
-      textLineThroughStyle: dart.definiteFunctionType(core.String, []),
-      textLineThroughWidth: dart.definiteFunctionType(core.String, []),
-      textOrientation: dart.definiteFunctionType(core.String, []),
-      textOverflow: dart.definiteFunctionType(core.String, []),
-      textOverlineColor: dart.definiteFunctionType(core.String, []),
-      textOverlineMode: dart.definiteFunctionType(core.String, []),
-      textOverlineStyle: dart.definiteFunctionType(core.String, []),
-      textOverlineWidth: dart.definiteFunctionType(core.String, []),
-      textRendering: dart.definiteFunctionType(core.String, []),
-      textSecurity: dart.definiteFunctionType(core.String, []),
-      textShadow: dart.definiteFunctionType(core.String, []),
-      textStroke: dart.definiteFunctionType(core.String, []),
-      textStrokeColor: dart.definiteFunctionType(core.String, []),
-      textStrokeWidth: dart.definiteFunctionType(core.String, []),
-      textTransform: dart.definiteFunctionType(core.String, []),
-      textUnderlineColor: dart.definiteFunctionType(core.String, []),
-      textUnderlineMode: dart.definiteFunctionType(core.String, []),
-      textUnderlinePosition: dart.definiteFunctionType(core.String, []),
-      textUnderlineStyle: dart.definiteFunctionType(core.String, []),
-      textUnderlineWidth: dart.definiteFunctionType(core.String, []),
-      top: dart.definiteFunctionType(core.String, []),
-      touchAction: dart.definiteFunctionType(core.String, []),
-      touchActionDelay: dart.definiteFunctionType(core.String, []),
-      transform: dart.definiteFunctionType(core.String, []),
-      transformOrigin: dart.definiteFunctionType(core.String, []),
-      transformOriginX: dart.definiteFunctionType(core.String, []),
-      transformOriginY: dart.definiteFunctionType(core.String, []),
-      transformOriginZ: dart.definiteFunctionType(core.String, []),
-      transformStyle: dart.definiteFunctionType(core.String, []),
-      transition: dart.definiteFunctionType(core.String, []),
-      transitionDelay: dart.definiteFunctionType(core.String, []),
-      transitionDuration: dart.definiteFunctionType(core.String, []),
-      transitionProperty: dart.definiteFunctionType(core.String, []),
-      transitionTimingFunction: dart.definiteFunctionType(core.String, []),
-      unicodeBidi: dart.definiteFunctionType(core.String, []),
-      unicodeRange: dart.definiteFunctionType(core.String, []),
-      userDrag: dart.definiteFunctionType(core.String, []),
-      userModify: dart.definiteFunctionType(core.String, []),
-      userSelect: dart.definiteFunctionType(core.String, []),
-      userZoom: dart.definiteFunctionType(core.String, []),
-      verticalAlign: dart.definiteFunctionType(core.String, []),
-      visibility: dart.definiteFunctionType(core.String, []),
-      whiteSpace: dart.definiteFunctionType(core.String, []),
-      widows: dart.definiteFunctionType(core.String, []),
-      width: dart.definiteFunctionType(core.String, []),
-      willChange: dart.definiteFunctionType(core.String, []),
-      wordBreak: dart.definiteFunctionType(core.String, []),
-      wordSpacing: dart.definiteFunctionType(core.String, []),
-      wordWrap: dart.definiteFunctionType(core.String, []),
-      wrapFlow: dart.definiteFunctionType(core.String, []),
-      wrapThrough: dart.definiteFunctionType(core.String, []),
-      writingMode: dart.definiteFunctionType(core.String, []),
-      zIndex: dart.definiteFunctionType(core.String, []),
-      zoom: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({
-      alignContent: dart.definiteFunctionType(dart.void, [core.String]),
-      alignItems: dart.definiteFunctionType(dart.void, [core.String]),
-      alignSelf: dart.definiteFunctionType(dart.void, [core.String]),
-      animation: dart.definiteFunctionType(dart.void, [core.String]),
-      animationDelay: dart.definiteFunctionType(dart.void, [core.String]),
-      animationDirection: dart.definiteFunctionType(dart.void, [core.String]),
-      animationDuration: dart.definiteFunctionType(dart.void, [core.String]),
-      animationFillMode: dart.definiteFunctionType(dart.void, [core.String]),
-      animationIterationCount: dart.definiteFunctionType(dart.void, [core.String]),
-      animationName: dart.definiteFunctionType(dart.void, [core.String]),
-      animationPlayState: dart.definiteFunctionType(dart.void, [core.String]),
-      animationTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
-      appRegion: dart.definiteFunctionType(dart.void, [core.String]),
-      appearance: dart.definiteFunctionType(dart.void, [core.String]),
-      aspectRatio: dart.definiteFunctionType(dart.void, [core.String]),
-      backfaceVisibility: dart.definiteFunctionType(dart.void, [core.String]),
-      background: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundAttachment: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundClip: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundColor: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundComposite: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundImage: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundOrigin: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundPosition: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundPositionX: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundPositionY: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundRepeat: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
-      backgroundSize: dart.definiteFunctionType(dart.void, [core.String]),
-      border: dart.definiteFunctionType(dart.void, [core.String]),
-      borderAfter: dart.definiteFunctionType(dart.void, [core.String]),
-      borderAfterColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderAfterStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderAfterWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBefore: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBeforeColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBeforeStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBeforeWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottom: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottomColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottomLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottomRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottomStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderBottomWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      borderColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      borderEndColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderEndStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderEndWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderFit: dart.definiteFunctionType(dart.void, [core.String]),
-      borderHorizontalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImage: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImageSource: dart.definiteFunctionType(dart.void, [core.String]),
-      borderImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderLeft: dart.definiteFunctionType(dart.void, [core.String]),
-      borderLeftColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderLeftStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderLeftWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderRadius: dart.definiteFunctionType(dart.void, [core.String]),
-      borderRight: dart.definiteFunctionType(dart.void, [core.String]),
-      borderRightColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderRightStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderRightWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderSpacing: dart.definiteFunctionType(dart.void, [core.String]),
-      borderStart: dart.definiteFunctionType(dart.void, [core.String]),
-      borderStartColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderStartStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderStartWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTop: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTopColor: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTopLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTopRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTopStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      borderTopWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      borderVerticalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
-      borderWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      bottom: dart.definiteFunctionType(dart.void, [core.String]),
-      boxAlign: dart.definiteFunctionType(dart.void, [core.String]),
-      boxDecorationBreak: dart.definiteFunctionType(dart.void, [core.String]),
-      boxDirection: dart.definiteFunctionType(dart.void, [core.String]),
-      boxFlex: dart.definiteFunctionType(dart.void, [core.String]),
-      boxFlexGroup: dart.definiteFunctionType(dart.void, [core.String]),
-      boxLines: dart.definiteFunctionType(dart.void, [core.String]),
-      boxOrdinalGroup: dart.definiteFunctionType(dart.void, [core.String]),
-      boxOrient: dart.definiteFunctionType(dart.void, [core.String]),
-      boxPack: dart.definiteFunctionType(dart.void, [core.String]),
-      boxReflect: dart.definiteFunctionType(dart.void, [core.String]),
-      boxShadow: dart.definiteFunctionType(dart.void, [core.String]),
-      boxSizing: dart.definiteFunctionType(dart.void, [core.String]),
-      captionSide: dart.definiteFunctionType(dart.void, [core.String]),
-      clear: dart.definiteFunctionType(dart.void, [core.String]),
-      clip: dart.definiteFunctionType(dart.void, [core.String]),
-      clipPath: dart.definiteFunctionType(dart.void, [core.String]),
-      color: dart.definiteFunctionType(dart.void, [core.String]),
-      columnBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
-      columnBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
-      columnBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
-      columnCount: dart.definiteFunctionType(dart.void, [core.String]),
-      columnFill: dart.definiteFunctionType(dart.void, [core.String]),
-      columnGap: dart.definiteFunctionType(dart.void, [core.String]),
-      columnRule: dart.definiteFunctionType(dart.void, [core.String]),
-      columnRuleColor: dart.definiteFunctionType(dart.void, [core.String]),
-      columnRuleStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      columnRuleWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      columnSpan: dart.definiteFunctionType(dart.void, [core.String]),
-      columnWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      columns: dart.definiteFunctionType(dart.void, [core.String]),
-      content: dart.definiteFunctionType(dart.void, [core.String]),
-      counterIncrement: dart.definiteFunctionType(dart.void, [core.String]),
-      counterReset: dart.definiteFunctionType(dart.void, [core.String]),
-      cursor: dart.definiteFunctionType(dart.void, [core.String]),
-      direction: dart.definiteFunctionType(dart.void, [core.String]),
-      display: dart.definiteFunctionType(dart.void, [core.String]),
-      emptyCells: dart.definiteFunctionType(dart.void, [core.String]),
-      filter: dart.definiteFunctionType(dart.void, [core.String]),
-      flex: dart.definiteFunctionType(dart.void, [core.String]),
-      flexBasis: dart.definiteFunctionType(dart.void, [core.String]),
-      flexDirection: dart.definiteFunctionType(dart.void, [core.String]),
-      flexFlow: dart.definiteFunctionType(dart.void, [core.String]),
-      flexGrow: dart.definiteFunctionType(dart.void, [core.String]),
-      flexShrink: dart.definiteFunctionType(dart.void, [core.String]),
-      flexWrap: dart.definiteFunctionType(dart.void, [core.String]),
-      float: dart.definiteFunctionType(dart.void, [core.String]),
-      font: dart.definiteFunctionType(dart.void, [core.String]),
-      fontFamily: dart.definiteFunctionType(dart.void, [core.String]),
-      fontFeatureSettings: dart.definiteFunctionType(dart.void, [core.String]),
-      fontKerning: dart.definiteFunctionType(dart.void, [core.String]),
-      fontSize: dart.definiteFunctionType(dart.void, [core.String]),
-      fontSizeDelta: dart.definiteFunctionType(dart.void, [core.String]),
-      fontSmoothing: dart.definiteFunctionType(dart.void, [core.String]),
-      fontStretch: dart.definiteFunctionType(dart.void, [core.String]),
-      fontStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      fontVariant: dart.definiteFunctionType(dart.void, [core.String]),
-      fontVariantLigatures: dart.definiteFunctionType(dart.void, [core.String]),
-      fontWeight: dart.definiteFunctionType(dart.void, [core.String]),
-      grid: dart.definiteFunctionType(dart.void, [core.String]),
-      gridArea: dart.definiteFunctionType(dart.void, [core.String]),
-      gridAutoColumns: dart.definiteFunctionType(dart.void, [core.String]),
-      gridAutoFlow: dart.definiteFunctionType(dart.void, [core.String]),
-      gridAutoRows: dart.definiteFunctionType(dart.void, [core.String]),
-      gridColumn: dart.definiteFunctionType(dart.void, [core.String]),
-      gridColumnEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      gridColumnStart: dart.definiteFunctionType(dart.void, [core.String]),
-      gridRow: dart.definiteFunctionType(dart.void, [core.String]),
-      gridRowEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      gridRowStart: dart.definiteFunctionType(dart.void, [core.String]),
-      gridTemplate: dart.definiteFunctionType(dart.void, [core.String]),
-      gridTemplateAreas: dart.definiteFunctionType(dart.void, [core.String]),
-      gridTemplateColumns: dart.definiteFunctionType(dart.void, [core.String]),
-      gridTemplateRows: dart.definiteFunctionType(dart.void, [core.String]),
-      height: dart.definiteFunctionType(dart.void, [core.String]),
-      highlight: dart.definiteFunctionType(dart.void, [core.String]),
-      hyphenateCharacter: dart.definiteFunctionType(dart.void, [core.String]),
-      imageRendering: dart.definiteFunctionType(dart.void, [core.String]),
-      isolation: dart.definiteFunctionType(dart.void, [core.String]),
-      justifyContent: dart.definiteFunctionType(dart.void, [core.String]),
-      justifySelf: dart.definiteFunctionType(dart.void, [core.String]),
-      left: dart.definiteFunctionType(dart.void, [core.String]),
-      letterSpacing: dart.definiteFunctionType(dart.void, [core.String]),
-      lineBoxContain: dart.definiteFunctionType(dart.void, [core.String]),
-      lineBreak: dart.definiteFunctionType(dart.void, [core.String]),
-      lineClamp: dart.definiteFunctionType(dart.void, [core.String]),
-      lineHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      listStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      listStyleImage: dart.definiteFunctionType(dart.void, [core.String]),
-      listStylePosition: dart.definiteFunctionType(dart.void, [core.String]),
-      listStyleType: dart.definiteFunctionType(dart.void, [core.String]),
-      locale: dart.definiteFunctionType(dart.void, [core.String]),
-      logicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      logicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      margin: dart.definiteFunctionType(dart.void, [core.String]),
-      marginAfter: dart.definiteFunctionType(dart.void, [core.String]),
-      marginAfterCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      marginBefore: dart.definiteFunctionType(dart.void, [core.String]),
-      marginBeforeCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      marginBottom: dart.definiteFunctionType(dart.void, [core.String]),
-      marginBottomCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      marginCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      marginEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      marginLeft: dart.definiteFunctionType(dart.void, [core.String]),
-      marginRight: dart.definiteFunctionType(dart.void, [core.String]),
-      marginStart: dart.definiteFunctionType(dart.void, [core.String]),
-      marginTop: dart.definiteFunctionType(dart.void, [core.String]),
-      marginTopCollapse: dart.definiteFunctionType(dart.void, [core.String]),
-      mask: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImage: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImageSource: dart.definiteFunctionType(dart.void, [core.String]),
-      maskBoxImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      maskClip: dart.definiteFunctionType(dart.void, [core.String]),
-      maskComposite: dart.definiteFunctionType(dart.void, [core.String]),
-      maskImage: dart.definiteFunctionType(dart.void, [core.String]),
-      maskOrigin: dart.definiteFunctionType(dart.void, [core.String]),
-      maskPosition: dart.definiteFunctionType(dart.void, [core.String]),
-      maskPositionX: dart.definiteFunctionType(dart.void, [core.String]),
-      maskPositionY: dart.definiteFunctionType(dart.void, [core.String]),
-      maskRepeat: dart.definiteFunctionType(dart.void, [core.String]),
-      maskRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
-      maskRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
-      maskSize: dart.definiteFunctionType(dart.void, [core.String]),
-      maskSourceType: dart.definiteFunctionType(dart.void, [core.String]),
-      maxHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      maxLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      maxLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      maxWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      maxZoom: dart.definiteFunctionType(dart.void, [core.String]),
-      minHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      minLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
-      minLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      minWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      minZoom: dart.definiteFunctionType(dart.void, [core.String]),
-      mixBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
-      objectFit: dart.definiteFunctionType(dart.void, [core.String]),
-      objectPosition: dart.definiteFunctionType(dart.void, [core.String]),
-      opacity: dart.definiteFunctionType(dart.void, [core.String]),
-      order: dart.definiteFunctionType(dart.void, [core.String]),
-      orientation: dart.definiteFunctionType(dart.void, [core.String]),
-      orphans: dart.definiteFunctionType(dart.void, [core.String]),
-      outline: dart.definiteFunctionType(dart.void, [core.String]),
-      outlineColor: dart.definiteFunctionType(dart.void, [core.String]),
-      outlineOffset: dart.definiteFunctionType(dart.void, [core.String]),
-      outlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      outlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      overflow: dart.definiteFunctionType(dart.void, [core.String]),
-      overflowWrap: dart.definiteFunctionType(dart.void, [core.String]),
-      overflowX: dart.definiteFunctionType(dart.void, [core.String]),
-      overflowY: dart.definiteFunctionType(dart.void, [core.String]),
-      padding: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingAfter: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingBefore: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingBottom: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingEnd: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingLeft: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingRight: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingStart: dart.definiteFunctionType(dart.void, [core.String]),
-      paddingTop: dart.definiteFunctionType(dart.void, [core.String]),
-      page: dart.definiteFunctionType(dart.void, [core.String]),
-      pageBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
-      pageBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
-      pageBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
-      perspective: dart.definiteFunctionType(dart.void, [core.String]),
-      perspectiveOrigin: dart.definiteFunctionType(dart.void, [core.String]),
-      perspectiveOriginX: dart.definiteFunctionType(dart.void, [core.String]),
-      perspectiveOriginY: dart.definiteFunctionType(dart.void, [core.String]),
-      pointerEvents: dart.definiteFunctionType(dart.void, [core.String]),
-      position: dart.definiteFunctionType(dart.void, [core.String]),
-      printColorAdjust: dart.definiteFunctionType(dart.void, [core.String]),
-      quotes: dart.definiteFunctionType(dart.void, [core.String]),
-      resize: dart.definiteFunctionType(dart.void, [core.String]),
-      right: dart.definiteFunctionType(dart.void, [core.String]),
-      rtlOrdering: dart.definiteFunctionType(dart.void, [core.String]),
-      rubyPosition: dart.definiteFunctionType(dart.void, [core.String]),
-      scrollBehavior: dart.definiteFunctionType(dart.void, [core.String]),
-      shapeImageThreshold: dart.definiteFunctionType(dart.void, [core.String]),
-      shapeMargin: dart.definiteFunctionType(dart.void, [core.String]),
-      shapeOutside: dart.definiteFunctionType(dart.void, [core.String]),
-      size: dart.definiteFunctionType(dart.void, [core.String]),
-      speak: dart.definiteFunctionType(dart.void, [core.String]),
-      src: dart.definiteFunctionType(dart.void, [core.String]),
-      tabSize: dart.definiteFunctionType(dart.void, [core.String]),
-      tableLayout: dart.definiteFunctionType(dart.void, [core.String]),
-      tapHighlightColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textAlign: dart.definiteFunctionType(dart.void, [core.String]),
-      textAlignLast: dart.definiteFunctionType(dart.void, [core.String]),
-      textCombine: dart.definiteFunctionType(dart.void, [core.String]),
-      textDecoration: dart.definiteFunctionType(dart.void, [core.String]),
-      textDecorationColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textDecorationLine: dart.definiteFunctionType(dart.void, [core.String]),
-      textDecorationStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      textDecorationsInEffect: dart.definiteFunctionType(dart.void, [core.String]),
-      textEmphasis: dart.definiteFunctionType(dart.void, [core.String]),
-      textEmphasisColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textEmphasisPosition: dart.definiteFunctionType(dart.void, [core.String]),
-      textEmphasisStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      textFillColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textIndent: dart.definiteFunctionType(dart.void, [core.String]),
-      textJustify: dart.definiteFunctionType(dart.void, [core.String]),
-      textLineThroughColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textLineThroughMode: dart.definiteFunctionType(dart.void, [core.String]),
-      textLineThroughStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      textLineThroughWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      textOrientation: dart.definiteFunctionType(dart.void, [core.String]),
-      textOverflow: dart.definiteFunctionType(dart.void, [core.String]),
-      textOverlineColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textOverlineMode: dart.definiteFunctionType(dart.void, [core.String]),
-      textOverlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      textOverlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      textRendering: dart.definiteFunctionType(dart.void, [core.String]),
-      textSecurity: dart.definiteFunctionType(dart.void, [core.String]),
-      textShadow: dart.definiteFunctionType(dart.void, [core.String]),
-      textStroke: dart.definiteFunctionType(dart.void, [core.String]),
-      textStrokeColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textStrokeWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      textTransform: dart.definiteFunctionType(dart.void, [core.String]),
-      textUnderlineColor: dart.definiteFunctionType(dart.void, [core.String]),
-      textUnderlineMode: dart.definiteFunctionType(dart.void, [core.String]),
-      textUnderlinePosition: dart.definiteFunctionType(dart.void, [core.String]),
-      textUnderlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      textUnderlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
-      top: dart.definiteFunctionType(dart.void, [core.String]),
-      touchAction: dart.definiteFunctionType(dart.void, [core.String]),
-      touchActionDelay: dart.definiteFunctionType(dart.void, [core.String]),
-      transform: dart.definiteFunctionType(dart.void, [core.String]),
-      transformOrigin: dart.definiteFunctionType(dart.void, [core.String]),
-      transformOriginX: dart.definiteFunctionType(dart.void, [core.String]),
-      transformOriginY: dart.definiteFunctionType(dart.void, [core.String]),
-      transformOriginZ: dart.definiteFunctionType(dart.void, [core.String]),
-      transformStyle: dart.definiteFunctionType(dart.void, [core.String]),
-      transition: dart.definiteFunctionType(dart.void, [core.String]),
-      transitionDelay: dart.definiteFunctionType(dart.void, [core.String]),
-      transitionDuration: dart.definiteFunctionType(dart.void, [core.String]),
-      transitionProperty: dart.definiteFunctionType(dart.void, [core.String]),
-      transitionTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
-      unicodeBidi: dart.definiteFunctionType(dart.void, [core.String]),
-      unicodeRange: dart.definiteFunctionType(dart.void, [core.String]),
-      userDrag: dart.definiteFunctionType(dart.void, [core.String]),
-      userModify: dart.definiteFunctionType(dart.void, [core.String]),
-      userSelect: dart.definiteFunctionType(dart.void, [core.String]),
-      userZoom: dart.definiteFunctionType(dart.void, [core.String]),
-      verticalAlign: dart.definiteFunctionType(dart.void, [core.String]),
-      visibility: dart.definiteFunctionType(dart.void, [core.String]),
-      whiteSpace: dart.definiteFunctionType(dart.void, [core.String]),
-      widows: dart.definiteFunctionType(dart.void, [core.String]),
-      width: dart.definiteFunctionType(dart.void, [core.String]),
-      willChange: dart.definiteFunctionType(dart.void, [core.String]),
-      wordBreak: dart.definiteFunctionType(dart.void, [core.String]),
-      wordSpacing: dart.definiteFunctionType(dart.void, [core.String]),
-      wordWrap: dart.definiteFunctionType(dart.void, [core.String]),
-      wrapFlow: dart.definiteFunctionType(dart.void, [core.String]),
-      wrapThrough: dart.definiteFunctionType(dart.void, [core.String]),
-      writingMode: dart.definiteFunctionType(dart.void, [core.String]),
-      zIndex: dart.definiteFunctionType(dart.void, [core.String]),
-      zoom: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
-    'alignContent',
-    'alignContent',
-    'alignItems',
-    'alignItems',
-    'alignSelf',
-    'alignSelf',
-    'animation',
-    'animation',
-    'animationDelay',
-    'animationDelay',
-    'animationDirection',
-    'animationDirection',
-    'animationDuration',
-    'animationDuration',
-    'animationFillMode',
-    'animationFillMode',
-    'animationIterationCount',
-    'animationIterationCount',
-    'animationName',
-    'animationName',
-    'animationPlayState',
-    'animationPlayState',
-    'animationTimingFunction',
-    'animationTimingFunction',
-    'appRegion',
-    'appRegion',
-    'appearance',
-    'appearance',
-    'aspectRatio',
-    'aspectRatio',
-    'backfaceVisibility',
-    'backfaceVisibility',
-    'background',
-    'background',
-    'backgroundAttachment',
-    'backgroundAttachment',
-    'backgroundBlendMode',
-    'backgroundBlendMode',
-    'backgroundClip',
-    'backgroundClip',
-    'backgroundColor',
-    'backgroundColor',
-    'backgroundComposite',
-    'backgroundComposite',
-    'backgroundImage',
-    'backgroundImage',
-    'backgroundOrigin',
-    'backgroundOrigin',
-    'backgroundPosition',
-    'backgroundPosition',
-    'backgroundPositionX',
-    'backgroundPositionX',
-    'backgroundPositionY',
-    'backgroundPositionY',
-    'backgroundRepeat',
-    'backgroundRepeat',
-    'backgroundRepeatX',
-    'backgroundRepeatX',
-    'backgroundRepeatY',
-    'backgroundRepeatY',
-    'backgroundSize',
-    'backgroundSize',
-    'border',
-    'border',
-    'borderAfter',
-    'borderAfter',
-    'borderAfterColor',
-    'borderAfterColor',
-    'borderAfterStyle',
-    'borderAfterStyle',
-    'borderAfterWidth',
-    'borderAfterWidth',
-    'borderBefore',
-    'borderBefore',
-    'borderBeforeColor',
-    'borderBeforeColor',
-    'borderBeforeStyle',
-    'borderBeforeStyle',
-    'borderBeforeWidth',
-    'borderBeforeWidth',
-    'borderBottom',
-    'borderBottom',
-    'borderBottomColor',
-    'borderBottomColor',
-    'borderBottomLeftRadius',
-    'borderBottomLeftRadius',
-    'borderBottomRightRadius',
-    'borderBottomRightRadius',
-    'borderBottomStyle',
-    'borderBottomStyle',
-    'borderBottomWidth',
-    'borderBottomWidth',
-    'borderCollapse',
-    'borderCollapse',
-    'borderColor',
-    'borderColor',
-    'borderEnd',
-    'borderEnd',
-    'borderEndColor',
-    'borderEndColor',
-    'borderEndStyle',
-    'borderEndStyle',
-    'borderEndWidth',
-    'borderEndWidth',
-    'borderFit',
-    'borderFit',
-    'borderHorizontalSpacing',
-    'borderHorizontalSpacing',
-    'borderImage',
-    'borderImage',
-    'borderImageOutset',
-    'borderImageOutset',
-    'borderImageRepeat',
-    'borderImageRepeat',
-    'borderImageSlice',
-    'borderImageSlice',
-    'borderImageSource',
-    'borderImageSource',
-    'borderImageWidth',
-    'borderImageWidth',
-    'borderLeft',
-    'borderLeft',
-    'borderLeftColor',
-    'borderLeftColor',
-    'borderLeftStyle',
-    'borderLeftStyle',
-    'borderLeftWidth',
-    'borderLeftWidth',
-    'borderRadius',
-    'borderRadius',
-    'borderRight',
-    'borderRight',
-    'borderRightColor',
-    'borderRightColor',
-    'borderRightStyle',
-    'borderRightStyle',
-    'borderRightWidth',
-    'borderRightWidth',
-    'borderSpacing',
-    'borderSpacing',
-    'borderStart',
-    'borderStart',
-    'borderStartColor',
-    'borderStartColor',
-    'borderStartStyle',
-    'borderStartStyle',
-    'borderStartWidth',
-    'borderStartWidth',
-    'borderStyle',
-    'borderStyle',
-    'borderTop',
-    'borderTop',
-    'borderTopColor',
-    'borderTopColor',
-    'borderTopLeftRadius',
-    'borderTopLeftRadius',
-    'borderTopRightRadius',
-    'borderTopRightRadius',
-    'borderTopStyle',
-    'borderTopStyle',
-    'borderTopWidth',
-    'borderTopWidth',
-    'borderVerticalSpacing',
-    'borderVerticalSpacing',
-    'borderWidth',
-    'borderWidth',
-    'bottom',
-    'bottom',
-    'boxAlign',
-    'boxAlign',
-    'boxDecorationBreak',
-    'boxDecorationBreak',
-    'boxDirection',
-    'boxDirection',
-    'boxFlex',
-    'boxFlex',
-    'boxFlexGroup',
-    'boxFlexGroup',
-    'boxLines',
-    'boxLines',
-    'boxOrdinalGroup',
-    'boxOrdinalGroup',
-    'boxOrient',
-    'boxOrient',
-    'boxPack',
-    'boxPack',
-    'boxReflect',
-    'boxReflect',
-    'boxShadow',
-    'boxShadow',
-    'boxSizing',
-    'boxSizing',
-    'captionSide',
-    'captionSide',
-    'clear',
-    'clear',
-    'clip',
-    'clip',
-    'clipPath',
-    'clipPath',
-    'color',
-    'color',
-    'columnBreakAfter',
-    'columnBreakAfter',
-    'columnBreakBefore',
-    'columnBreakBefore',
-    'columnBreakInside',
-    'columnBreakInside',
-    'columnCount',
-    'columnCount',
-    'columnFill',
-    'columnFill',
-    'columnGap',
-    'columnGap',
-    'columnRule',
-    'columnRule',
-    'columnRuleColor',
-    'columnRuleColor',
-    'columnRuleStyle',
-    'columnRuleStyle',
-    'columnRuleWidth',
-    'columnRuleWidth',
-    'columnSpan',
-    'columnSpan',
-    'columnWidth',
-    'columnWidth',
-    'columns',
-    'columns',
-    'content',
-    'content',
-    'counterIncrement',
-    'counterIncrement',
-    'counterReset',
-    'counterReset',
-    'cursor',
-    'cursor',
-    'direction',
-    'direction',
-    'display',
-    'display',
-    'emptyCells',
-    'emptyCells',
-    'filter',
-    'filter',
-    'flex',
-    'flex',
-    'flexBasis',
-    'flexBasis',
-    'flexDirection',
-    'flexDirection',
-    'flexFlow',
-    'flexFlow',
-    'flexGrow',
-    'flexGrow',
-    'flexShrink',
-    'flexShrink',
-    'flexWrap',
-    'flexWrap',
-    'float',
-    'float',
-    'font',
-    'font',
-    'fontFamily',
-    'fontFamily',
-    'fontFeatureSettings',
-    'fontFeatureSettings',
-    'fontKerning',
-    'fontKerning',
-    'fontSize',
-    'fontSize',
-    'fontSizeDelta',
-    'fontSizeDelta',
-    'fontSmoothing',
-    'fontSmoothing',
-    'fontStretch',
-    'fontStretch',
-    'fontStyle',
-    'fontStyle',
-    'fontVariant',
-    'fontVariant',
-    'fontVariantLigatures',
-    'fontVariantLigatures',
-    'fontWeight',
-    'fontWeight',
-    'grid',
-    'grid',
-    'gridArea',
-    'gridArea',
-    'gridAutoColumns',
-    'gridAutoColumns',
-    'gridAutoFlow',
-    'gridAutoFlow',
-    'gridAutoRows',
-    'gridAutoRows',
-    'gridColumn',
-    'gridColumn',
-    'gridColumnEnd',
-    'gridColumnEnd',
-    'gridColumnStart',
-    'gridColumnStart',
-    'gridRow',
-    'gridRow',
-    'gridRowEnd',
-    'gridRowEnd',
-    'gridRowStart',
-    'gridRowStart',
-    'gridTemplate',
-    'gridTemplate',
-    'gridTemplateAreas',
-    'gridTemplateAreas',
-    'gridTemplateColumns',
-    'gridTemplateColumns',
-    'gridTemplateRows',
-    'gridTemplateRows',
-    'height',
-    'height',
-    'highlight',
-    'highlight',
-    'hyphenateCharacter',
-    'hyphenateCharacter',
-    'imageRendering',
-    'imageRendering',
-    'isolation',
-    'isolation',
-    'justifyContent',
-    'justifyContent',
-    'justifySelf',
-    'justifySelf',
-    'left',
-    'left',
-    'letterSpacing',
-    'letterSpacing',
-    'lineBoxContain',
-    'lineBoxContain',
-    'lineBreak',
-    'lineBreak',
-    'lineClamp',
-    'lineClamp',
-    'lineHeight',
-    'lineHeight',
-    'listStyle',
-    'listStyle',
-    'listStyleImage',
-    'listStyleImage',
-    'listStylePosition',
-    'listStylePosition',
-    'listStyleType',
-    'listStyleType',
-    'locale',
-    'locale',
-    'logicalHeight',
-    'logicalHeight',
-    'logicalWidth',
-    'logicalWidth',
-    'margin',
-    'margin',
-    'marginAfter',
-    'marginAfter',
-    'marginAfterCollapse',
-    'marginAfterCollapse',
-    'marginBefore',
-    'marginBefore',
-    'marginBeforeCollapse',
-    'marginBeforeCollapse',
-    'marginBottom',
-    'marginBottom',
-    'marginBottomCollapse',
-    'marginBottomCollapse',
-    'marginCollapse',
-    'marginCollapse',
-    'marginEnd',
-    'marginEnd',
-    'marginLeft',
-    'marginLeft',
-    'marginRight',
-    'marginRight',
-    'marginStart',
-    'marginStart',
-    'marginTop',
-    'marginTop',
-    'marginTopCollapse',
-    'marginTopCollapse',
-    'mask',
-    'mask',
-    'maskBoxImage',
-    'maskBoxImage',
-    'maskBoxImageOutset',
-    'maskBoxImageOutset',
-    'maskBoxImageRepeat',
-    'maskBoxImageRepeat',
-    'maskBoxImageSlice',
-    'maskBoxImageSlice',
-    'maskBoxImageSource',
-    'maskBoxImageSource',
-    'maskBoxImageWidth',
-    'maskBoxImageWidth',
-    'maskClip',
-    'maskClip',
-    'maskComposite',
-    'maskComposite',
-    'maskImage',
-    'maskImage',
-    'maskOrigin',
-    'maskOrigin',
-    'maskPosition',
-    'maskPosition',
-    'maskPositionX',
-    'maskPositionX',
-    'maskPositionY',
-    'maskPositionY',
-    'maskRepeat',
-    'maskRepeat',
-    'maskRepeatX',
-    'maskRepeatX',
-    'maskRepeatY',
-    'maskRepeatY',
-    'maskSize',
-    'maskSize',
-    'maskSourceType',
-    'maskSourceType',
-    'maxHeight',
-    'maxHeight',
-    'maxLogicalHeight',
-    'maxLogicalHeight',
-    'maxLogicalWidth',
-    'maxLogicalWidth',
-    'maxWidth',
-    'maxWidth',
-    'maxZoom',
-    'maxZoom',
-    'minHeight',
-    'minHeight',
-    'minLogicalHeight',
-    'minLogicalHeight',
-    'minLogicalWidth',
-    'minLogicalWidth',
-    'minWidth',
-    'minWidth',
-    'minZoom',
-    'minZoom',
-    'mixBlendMode',
-    'mixBlendMode',
-    'objectFit',
-    'objectFit',
-    'objectPosition',
-    'objectPosition',
-    'opacity',
-    'opacity',
-    'order',
-    'order',
-    'orientation',
-    'orientation',
-    'orphans',
-    'orphans',
-    'outline',
-    'outline',
-    'outlineColor',
-    'outlineColor',
-    'outlineOffset',
-    'outlineOffset',
-    'outlineStyle',
-    'outlineStyle',
-    'outlineWidth',
-    'outlineWidth',
-    'overflow',
-    'overflow',
-    'overflowWrap',
-    'overflowWrap',
-    'overflowX',
-    'overflowX',
-    'overflowY',
-    'overflowY',
-    'padding',
-    'padding',
-    'paddingAfter',
-    'paddingAfter',
-    'paddingBefore',
-    'paddingBefore',
-    'paddingBottom',
-    'paddingBottom',
-    'paddingEnd',
-    'paddingEnd',
-    'paddingLeft',
-    'paddingLeft',
-    'paddingRight',
-    'paddingRight',
-    'paddingStart',
-    'paddingStart',
-    'paddingTop',
-    'paddingTop',
-    'page',
-    'page',
-    'pageBreakAfter',
-    'pageBreakAfter',
-    'pageBreakBefore',
-    'pageBreakBefore',
-    'pageBreakInside',
-    'pageBreakInside',
-    'perspective',
-    'perspective',
-    'perspectiveOrigin',
-    'perspectiveOrigin',
-    'perspectiveOriginX',
-    'perspectiveOriginX',
-    'perspectiveOriginY',
-    'perspectiveOriginY',
-    'pointerEvents',
-    'pointerEvents',
-    'position',
-    'position',
-    'printColorAdjust',
-    'printColorAdjust',
-    'quotes',
-    'quotes',
-    'resize',
-    'resize',
-    'right',
-    'right',
-    'rtlOrdering',
-    'rtlOrdering',
-    'rubyPosition',
-    'rubyPosition',
-    'scrollBehavior',
-    'scrollBehavior',
-    'shapeImageThreshold',
-    'shapeImageThreshold',
-    'shapeMargin',
-    'shapeMargin',
-    'shapeOutside',
-    'shapeOutside',
-    'size',
-    'size',
-    'speak',
-    'speak',
-    'src',
-    'src',
-    'tabSize',
-    'tabSize',
-    'tableLayout',
-    'tableLayout',
-    'tapHighlightColor',
-    'tapHighlightColor',
-    'textAlign',
-    'textAlign',
-    'textAlignLast',
-    'textAlignLast',
-    'textCombine',
-    'textCombine',
-    'textDecoration',
-    'textDecoration',
-    'textDecorationColor',
-    'textDecorationColor',
-    'textDecorationLine',
-    'textDecorationLine',
-    'textDecorationStyle',
-    'textDecorationStyle',
-    'textDecorationsInEffect',
-    'textDecorationsInEffect',
-    'textEmphasis',
-    'textEmphasis',
-    'textEmphasisColor',
-    'textEmphasisColor',
-    'textEmphasisPosition',
-    'textEmphasisPosition',
-    'textEmphasisStyle',
-    'textEmphasisStyle',
-    'textFillColor',
-    'textFillColor',
-    'textIndent',
-    'textIndent',
-    'textJustify',
-    'textJustify',
-    'textLineThroughColor',
-    'textLineThroughColor',
-    'textLineThroughMode',
-    'textLineThroughMode',
-    'textLineThroughStyle',
-    'textLineThroughStyle',
-    'textLineThroughWidth',
-    'textLineThroughWidth',
-    'textOrientation',
-    'textOrientation',
-    'textOverflow',
-    'textOverflow',
-    'textOverlineColor',
-    'textOverlineColor',
-    'textOverlineMode',
-    'textOverlineMode',
-    'textOverlineStyle',
-    'textOverlineStyle',
-    'textOverlineWidth',
-    'textOverlineWidth',
-    'textRendering',
-    'textRendering',
-    'textSecurity',
-    'textSecurity',
-    'textShadow',
-    'textShadow',
-    'textStroke',
-    'textStroke',
-    'textStrokeColor',
-    'textStrokeColor',
-    'textStrokeWidth',
-    'textStrokeWidth',
-    'textTransform',
-    'textTransform',
-    'textUnderlineColor',
-    'textUnderlineColor',
-    'textUnderlineMode',
-    'textUnderlineMode',
-    'textUnderlinePosition',
-    'textUnderlinePosition',
-    'textUnderlineStyle',
-    'textUnderlineStyle',
-    'textUnderlineWidth',
-    'textUnderlineWidth',
-    'top',
-    'top',
-    'touchAction',
-    'touchAction',
-    'touchActionDelay',
-    'touchActionDelay',
-    'transform',
-    'transform',
-    'transformOrigin',
-    'transformOrigin',
-    'transformOriginX',
-    'transformOriginX',
-    'transformOriginY',
-    'transformOriginY',
-    'transformOriginZ',
-    'transformOriginZ',
-    'transformStyle',
-    'transformStyle',
-    'transition',
-    'transition',
-    'transitionDelay',
-    'transitionDelay',
-    'transitionDuration',
-    'transitionDuration',
-    'transitionProperty',
-    'transitionProperty',
-    'transitionTimingFunction',
-    'transitionTimingFunction',
-    'unicodeBidi',
-    'unicodeBidi',
-    'unicodeRange',
-    'unicodeRange',
-    'userDrag',
-    'userDrag',
-    'userModify',
-    'userModify',
-    'userSelect',
-    'userSelect',
-    'userZoom',
-    'userZoom',
-    'verticalAlign',
-    'verticalAlign',
-    'visibility',
-    'visibility',
-    'whiteSpace',
-    'whiteSpace',
-    'widows',
-    'widows',
-    'width',
-    'width',
-    'willChange',
-    'willChange',
-    'wordBreak',
-    'wordBreak',
-    'wordSpacing',
-    'wordSpacing',
-    'wordWrap',
-    'wordWrap',
-    'wrapFlow',
-    'wrapFlow',
-    'wrapThrough',
-    'wrapThrough',
-    'writingMode',
-    'writingMode',
-    'zIndex',
-    'zIndex',
-    'zoom',
-    'zoom'
-  ]);
-  dart.defineExtensionNames([
-    'getPropertyValue',
-    'supportsProperty',
-    'setProperty',
-    'getPropertyPriority',
-    'item',
-    'removeProperty',
-    'background',
-    'background',
-    'backgroundAttachment',
-    'backgroundAttachment',
-    'backgroundColor',
-    'backgroundColor',
-    'backgroundImage',
-    'backgroundImage',
-    'backgroundPosition',
-    'backgroundPosition',
-    'backgroundRepeat',
-    'backgroundRepeat',
-    'border',
-    'border',
-    'borderBottom',
-    'borderBottom',
-    'borderBottomColor',
-    'borderBottomColor',
-    'borderBottomStyle',
-    'borderBottomStyle',
-    'borderBottomWidth',
-    'borderBottomWidth',
-    'borderCollapse',
-    'borderCollapse',
-    'borderColor',
-    'borderColor',
-    'borderLeft',
-    'borderLeft',
-    'borderLeftColor',
-    'borderLeftColor',
-    'borderLeftStyle',
-    'borderLeftStyle',
-    'borderLeftWidth',
-    'borderLeftWidth',
-    'borderRight',
-    'borderRight',
-    'borderRightColor',
-    'borderRightColor',
-    'borderRightStyle',
-    'borderRightStyle',
-    'borderRightWidth',
-    'borderRightWidth',
-    'borderSpacing',
-    'borderSpacing',
-    'borderStyle',
-    'borderStyle',
-    'borderTop',
-    'borderTop',
-    'borderTopColor',
-    'borderTopColor',
-    'borderTopStyle',
-    'borderTopStyle',
-    'borderTopWidth',
-    'borderTopWidth',
-    'borderWidth',
-    'borderWidth',
-    'bottom',
-    'bottom',
-    'captionSide',
-    'captionSide',
-    'clear',
-    'clear',
-    'clip',
-    'clip',
-    'color',
-    'color',
-    'content',
-    'content',
-    'cursor',
-    'cursor',
-    'direction',
-    'direction',
-    'display',
-    'display',
-    'emptyCells',
-    'emptyCells',
-    'font',
-    'font',
-    'fontFamily',
-    'fontFamily',
-    'fontSize',
-    'fontSize',
-    'fontStyle',
-    'fontStyle',
-    'fontVariant',
-    'fontVariant',
-    'fontWeight',
-    'fontWeight',
-    'height',
-    'height',
-    'left',
-    'left',
-    'letterSpacing',
-    'letterSpacing',
-    'lineHeight',
-    'lineHeight',
-    'listStyle',
-    'listStyle',
-    'listStyleImage',
-    'listStyleImage',
-    'listStylePosition',
-    'listStylePosition',
-    'listStyleType',
-    'listStyleType',
-    'margin',
-    'margin',
-    'marginBottom',
-    'marginBottom',
-    'marginLeft',
-    'marginLeft',
-    'marginRight',
-    'marginRight',
-    'marginTop',
-    'marginTop',
-    'maxHeight',
-    'maxHeight',
-    'maxWidth',
-    'maxWidth',
-    'minHeight',
-    'minHeight',
-    'minWidth',
-    'minWidth',
-    'outline',
-    'outline',
-    'outlineColor',
-    'outlineColor',
-    'outlineStyle',
-    'outlineStyle',
-    'outlineWidth',
-    'outlineWidth',
-    'overflow',
-    'overflow',
-    'padding',
-    'padding',
-    'paddingBottom',
-    'paddingBottom',
-    'paddingLeft',
-    'paddingLeft',
-    'paddingRight',
-    'paddingRight',
-    'paddingTop',
-    'paddingTop',
-    'pageBreakAfter',
-    'pageBreakAfter',
-    'pageBreakBefore',
-    'pageBreakBefore',
-    'pageBreakInside',
-    'pageBreakInside',
-    'position',
-    'position',
-    'quotes',
-    'quotes',
-    'right',
-    'right',
-    'tableLayout',
-    'tableLayout',
-    'textAlign',
-    'textAlign',
-    'textDecoration',
-    'textDecoration',
-    'textIndent',
-    'textIndent',
-    'textTransform',
-    'textTransform',
-    'top',
-    'top',
-    'unicodeBidi',
-    'unicodeBidi',
-    'verticalAlign',
-    'verticalAlign',
-    'visibility',
-    'visibility',
-    'whiteSpace',
-    'whiteSpace',
-    'width',
-    'width',
-    'wordSpacing',
-    'wordSpacing',
-    'zIndex',
-    'zIndex',
-    'cssText',
-    'length',
-    'parentRule'
-  ]);
-  html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
-    static new() {
-      return html$.CssStyleDeclaration.css('');
-    }
-    static css(css) {
-      let style = html$.Element.tag('div')[dartx.style];
-      style[dartx.cssText] = css;
-      return style;
-    }
-    [dartx.getPropertyValue](propertyName) {
-      let propValue = this[_getPropertyValueHelper](propertyName);
-      return propValue != null ? propValue : '';
-    }
-    [_getPropertyValueHelper](propertyName) {
-      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
-        return this[_getPropertyValue](propertyName);
-      } else {
-        return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
-      }
-    }
-    [dartx.supportsProperty](propertyName) {
-      return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
-    }
-    [_supportsProperty](propertyName) {
-      return propertyName in this;
-    }
-    [dartx.setProperty](propertyName, value, priority) {
-      if (priority === void 0) priority = null;
-      return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
-    }
-    [_browserPropertyName](propertyName) {
-      let name = html$.CssStyleDeclaration._readCache(propertyName);
-      if (typeof name == 'string') return name;
-      if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
-        name = propertyName;
-      } else {
-        name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
-      }
-      html$.CssStyleDeclaration._writeCache(propertyName, name);
-      return name;
-    }
-    static _readCache(key) {
-      return html$.CssStyleDeclaration._propertyCache[key];
-    }
-    static _writeCache(key, value) {
-      html$.CssStyleDeclaration._propertyCache[key] = value;
-    }
-    static _camelCase(hyphenated) {
-      let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
-      return replacedMs.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase());
-    }
-    [_setPropertyHelper](propertyName, value, priority) {
-      if (priority === void 0) priority = null;
-      if (value == null) value = '';
-      if (priority == null) priority = '';
-      this.setProperty(propertyName, value, priority);
-    }
-    static get supportsTransitions() {
-      return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cssText]() {
-      return this.cssText;
-    }
-    set [dartx.cssText](value) {
-      this.cssText = value;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.parentRule]() {
-      return this.parentRule;
-    }
-    [dartx.getPropertyPriority](...args) {
-      return this.getPropertyPriority.apply(this, args);
-    }
-    [_getPropertyValue](...args) {
-      return this.getPropertyValue.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.removeProperty](...args) {
-      return this.removeProperty.apply(this, args);
-    }
-    get [dartx.background]() {
-      return this[_background];
-    }
-    set [dartx.background](value) {
-      this[_background] = value == null ? '' : value;
-    }
-    get [_background]() {
-      return this.background;
-    }
-    set [_background](value) {
-      this.background = value;
-    }
-    get [dartx.backgroundAttachment]() {
-      return this[_backgroundAttachment];
-    }
-    set [dartx.backgroundAttachment](value) {
-      this[_backgroundAttachment] = value == null ? '' : value;
-    }
-    get [_backgroundAttachment]() {
-      return this.backgroundAttachment;
-    }
-    set [_backgroundAttachment](value) {
-      this.backgroundAttachment = value;
-    }
-    get [dartx.backgroundColor]() {
-      return this[_backgroundColor];
-    }
-    set [dartx.backgroundColor](value) {
-      this[_backgroundColor] = value == null ? '' : value;
-    }
-    get [_backgroundColor]() {
-      return this.backgroundColor;
-    }
-    set [_backgroundColor](value) {
-      this.backgroundColor = value;
-    }
-    get [dartx.backgroundImage]() {
-      return this[_backgroundImage];
-    }
-    set [dartx.backgroundImage](value) {
-      this[_backgroundImage] = value == null ? '' : value;
-    }
-    get [_backgroundImage]() {
-      return this.backgroundImage;
-    }
-    set [_backgroundImage](value) {
-      this.backgroundImage = value;
-    }
-    get [dartx.backgroundPosition]() {
-      return this[_backgroundPosition];
-    }
-    set [dartx.backgroundPosition](value) {
-      this[_backgroundPosition] = value == null ? '' : value;
-    }
-    get [_backgroundPosition]() {
-      return this.backgroundPosition;
-    }
-    set [_backgroundPosition](value) {
-      this.backgroundPosition = value;
-    }
-    get [dartx.backgroundRepeat]() {
-      return this[_backgroundRepeat];
-    }
-    set [dartx.backgroundRepeat](value) {
-      this[_backgroundRepeat] = value == null ? '' : value;
-    }
-    get [_backgroundRepeat]() {
-      return this.backgroundRepeat;
-    }
-    set [_backgroundRepeat](value) {
-      this.backgroundRepeat = value;
-    }
-    get [dartx.border]() {
-      return this[_border];
-    }
-    set [dartx.border](value) {
-      this[_border] = value == null ? '' : value;
-    }
-    get [_border]() {
-      return this.border;
-    }
-    set [_border](value) {
-      this.border = value;
-    }
-    get [dartx.borderBottom]() {
-      return this[_borderBottom];
-    }
-    set [dartx.borderBottom](value) {
-      this[_borderBottom] = value == null ? '' : value;
-    }
-    get [_borderBottom]() {
-      return this.borderBottom;
-    }
-    set [_borderBottom](value) {
-      this.borderBottom = value;
-    }
-    get [dartx.borderBottomColor]() {
-      return this[_borderBottomColor];
-    }
-    set [dartx.borderBottomColor](value) {
-      this[_borderBottomColor] = value == null ? '' : value;
-    }
-    get [_borderBottomColor]() {
-      return this.borderBottomColor;
-    }
-    set [_borderBottomColor](value) {
-      this.borderBottomColor = value;
-    }
-    get [dartx.borderBottomStyle]() {
-      return this[_borderBottomStyle];
-    }
-    set [dartx.borderBottomStyle](value) {
-      this[_borderBottomStyle] = value == null ? '' : value;
-    }
-    get [_borderBottomStyle]() {
-      return this.borderBottomStyle;
-    }
-    set [_borderBottomStyle](value) {
-      this.borderBottomStyle = value;
-    }
-    get [dartx.borderBottomWidth]() {
-      return this[_borderBottomWidth];
-    }
-    set [dartx.borderBottomWidth](value) {
-      this[_borderBottomWidth] = value == null ? '' : value;
-    }
-    get [_borderBottomWidth]() {
-      return this.borderBottomWidth;
-    }
-    set [_borderBottomWidth](value) {
-      this.borderBottomWidth = value;
-    }
-    get [dartx.borderCollapse]() {
-      return this[_borderCollapse];
-    }
-    set [dartx.borderCollapse](value) {
-      this[_borderCollapse] = value == null ? '' : value;
-    }
-    get [_borderCollapse]() {
-      return this.borderCollapse;
-    }
-    set [_borderCollapse](value) {
-      this.borderCollapse = value;
-    }
-    get [dartx.borderColor]() {
-      return this[_borderColor];
-    }
-    set [dartx.borderColor](value) {
-      this[_borderColor] = value == null ? '' : value;
-    }
-    get [_borderColor]() {
-      return this.borderColor;
-    }
-    set [_borderColor](value) {
-      this.borderColor = value;
-    }
-    get [dartx.borderLeft]() {
-      return this[_borderLeft];
-    }
-    set [dartx.borderLeft](value) {
-      this[_borderLeft] = value == null ? '' : value;
-    }
-    get [_borderLeft]() {
-      return this.borderLeft;
-    }
-    set [_borderLeft](value) {
-      this.borderLeft = value;
-    }
-    get [dartx.borderLeftColor]() {
-      return this[_borderLeftColor];
-    }
-    set [dartx.borderLeftColor](value) {
-      this[_borderLeftColor] = value == null ? '' : value;
-    }
-    get [_borderLeftColor]() {
-      return this.borderLeftColor;
-    }
-    set [_borderLeftColor](value) {
-      this.borderLeftColor = value;
-    }
-    get [dartx.borderLeftStyle]() {
-      return this[_borderLeftStyle];
-    }
-    set [dartx.borderLeftStyle](value) {
-      this[_borderLeftStyle] = value == null ? '' : value;
-    }
-    get [_borderLeftStyle]() {
-      return this.borderLeftStyle;
-    }
-    set [_borderLeftStyle](value) {
-      this.borderLeftStyle = value;
-    }
-    get [dartx.borderLeftWidth]() {
-      return this[_borderLeftWidth];
-    }
-    set [dartx.borderLeftWidth](value) {
-      this[_borderLeftWidth] = value == null ? '' : value;
-    }
-    get [_borderLeftWidth]() {
-      return this.borderLeftWidth;
-    }
-    set [_borderLeftWidth](value) {
-      this.borderLeftWidth = value;
-    }
-    get [dartx.borderRight]() {
-      return this[_borderRight];
-    }
-    set [dartx.borderRight](value) {
-      this[_borderRight] = value == null ? '' : value;
-    }
-    get [_borderRight]() {
-      return this.borderRight;
-    }
-    set [_borderRight](value) {
-      this.borderRight = value;
-    }
-    get [dartx.borderRightColor]() {
-      return this[_borderRightColor];
-    }
-    set [dartx.borderRightColor](value) {
-      this[_borderRightColor] = value == null ? '' : value;
-    }
-    get [_borderRightColor]() {
-      return this.borderRightColor;
-    }
-    set [_borderRightColor](value) {
-      this.borderRightColor = value;
-    }
-    get [dartx.borderRightStyle]() {
-      return this[_borderRightStyle];
-    }
-    set [dartx.borderRightStyle](value) {
-      this[_borderRightStyle] = value == null ? '' : value;
-    }
-    get [_borderRightStyle]() {
-      return this.borderRightStyle;
-    }
-    set [_borderRightStyle](value) {
-      this.borderRightStyle = value;
-    }
-    get [dartx.borderRightWidth]() {
-      return this[_borderRightWidth];
-    }
-    set [dartx.borderRightWidth](value) {
-      this[_borderRightWidth] = value == null ? '' : value;
-    }
-    get [_borderRightWidth]() {
-      return this.borderRightWidth;
-    }
-    set [_borderRightWidth](value) {
-      this.borderRightWidth = value;
-    }
-    get [dartx.borderSpacing]() {
-      return this[_borderSpacing];
-    }
-    set [dartx.borderSpacing](value) {
-      this[_borderSpacing] = value == null ? '' : value;
-    }
-    get [_borderSpacing]() {
-      return this.borderSpacing;
-    }
-    set [_borderSpacing](value) {
-      this.borderSpacing = value;
-    }
-    get [dartx.borderStyle]() {
-      return this[_borderStyle];
-    }
-    set [dartx.borderStyle](value) {
-      this[_borderStyle] = value == null ? '' : value;
-    }
-    get [_borderStyle]() {
-      return this.borderStyle;
-    }
-    set [_borderStyle](value) {
-      this.borderStyle = value;
-    }
-    get [dartx.borderTop]() {
-      return this[_borderTop];
-    }
-    set [dartx.borderTop](value) {
-      this[_borderTop] = value == null ? '' : value;
-    }
-    get [_borderTop]() {
-      return this.borderTop;
-    }
-    set [_borderTop](value) {
-      this.borderTop = value;
-    }
-    get [dartx.borderTopColor]() {
-      return this[_borderTopColor];
-    }
-    set [dartx.borderTopColor](value) {
-      this[_borderTopColor] = value == null ? '' : value;
-    }
-    get [_borderTopColor]() {
-      return this.borderTopColor;
-    }
-    set [_borderTopColor](value) {
-      this.borderTopColor = value;
-    }
-    get [dartx.borderTopStyle]() {
-      return this[_borderTopStyle];
-    }
-    set [dartx.borderTopStyle](value) {
-      this[_borderTopStyle] = value == null ? '' : value;
-    }
-    get [_borderTopStyle]() {
-      return this.borderTopStyle;
-    }
-    set [_borderTopStyle](value) {
-      this.borderTopStyle = value;
-    }
-    get [dartx.borderTopWidth]() {
-      return this[_borderTopWidth];
-    }
-    set [dartx.borderTopWidth](value) {
-      this[_borderTopWidth] = value == null ? '' : value;
-    }
-    get [_borderTopWidth]() {
-      return this.borderTopWidth;
-    }
-    set [_borderTopWidth](value) {
-      this.borderTopWidth = value;
-    }
-    get [dartx.borderWidth]() {
-      return this[_borderWidth];
-    }
-    set [dartx.borderWidth](value) {
-      this[_borderWidth] = value == null ? '' : value;
-    }
-    get [_borderWidth]() {
-      return this.borderWidth;
-    }
-    set [_borderWidth](value) {
-      this.borderWidth = value;
-    }
-    get [dartx.bottom]() {
-      return this[_bottom];
-    }
-    set [dartx.bottom](value) {
-      this[_bottom] = value == null ? '' : value;
-    }
-    get [_bottom]() {
-      return this.bottom;
-    }
-    set [_bottom](value) {
-      this.bottom = value;
-    }
-    get [dartx.captionSide]() {
-      return this[_captionSide];
-    }
-    set [dartx.captionSide](value) {
-      this[_captionSide] = value == null ? '' : value;
-    }
-    get [_captionSide]() {
-      return this.captionSide;
-    }
-    set [_captionSide](value) {
-      this.captionSide = value;
-    }
-    get [dartx.clear]() {
-      return this[_clear$1];
-    }
-    set [dartx.clear](value) {
-      this[_clear$1] = value == null ? '' : value;
-    }
-    get [_clear$1]() {
-      return this.clear;
-    }
-    set [_clear$1](value) {
-      this.clear = value;
-    }
-    get [dartx.clip]() {
-      return this[_clip];
-    }
-    set [dartx.clip](value) {
-      this[_clip] = value == null ? '' : value;
-    }
-    get [_clip]() {
-      return this.clip;
-    }
-    set [_clip](value) {
-      this.clip = value;
-    }
-    get [dartx.color]() {
-      return this[_color];
-    }
-    set [dartx.color](value) {
-      this[_color] = value == null ? '' : value;
-    }
-    get [_color]() {
-      return this.color;
-    }
-    set [_color](value) {
-      this.color = value;
-    }
-    get [dartx.content]() {
-      return this[_content];
-    }
-    set [dartx.content](value) {
-      this[_content] = value == null ? '' : value;
-    }
-    get [_content]() {
-      return this.content;
-    }
-    set [_content](value) {
-      this.content = value;
-    }
-    get [dartx.cursor]() {
-      return this[_cursor];
-    }
-    set [dartx.cursor](value) {
-      this[_cursor] = value == null ? '' : value;
-    }
-    get [_cursor]() {
-      return this.cursor;
-    }
-    set [_cursor](value) {
-      this.cursor = value;
-    }
-    get [dartx.direction]() {
-      return this[_direction];
-    }
-    set [dartx.direction](value) {
-      this[_direction] = value == null ? '' : value;
-    }
-    get [_direction]() {
-      return this.direction;
-    }
-    set [_direction](value) {
-      this.direction = value;
-    }
-    get [dartx.display]() {
-      return this[_display];
-    }
-    set [dartx.display](value) {
-      this[_display] = value == null ? '' : value;
-    }
-    get [_display]() {
-      return this.display;
-    }
-    set [_display](value) {
-      this.display = value;
-    }
-    get [dartx.emptyCells]() {
-      return this[_emptyCells];
-    }
-    set [dartx.emptyCells](value) {
-      this[_emptyCells] = value == null ? '' : value;
-    }
-    get [_emptyCells]() {
-      return this.emptyCells;
-    }
-    set [_emptyCells](value) {
-      this.emptyCells = value;
-    }
-    get [dartx.font]() {
-      return this[_font];
-    }
-    set [dartx.font](value) {
-      this[_font] = value == null ? '' : value;
-    }
-    get [_font]() {
-      return this.font;
-    }
-    set [_font](value) {
-      this.font = value;
-    }
-    get [dartx.fontFamily]() {
-      return this[_fontFamily];
-    }
-    set [dartx.fontFamily](value) {
-      this[_fontFamily] = value == null ? '' : value;
-    }
-    get [_fontFamily]() {
-      return this.fontFamily;
-    }
-    set [_fontFamily](value) {
-      this.fontFamily = value;
-    }
-    get [dartx.fontSize]() {
-      return this[_fontSize];
-    }
-    set [dartx.fontSize](value) {
-      this[_fontSize] = value == null ? '' : value;
-    }
-    get [_fontSize]() {
-      return this.fontSize;
-    }
-    set [_fontSize](value) {
-      this.fontSize = value;
-    }
-    get [dartx.fontStyle]() {
-      return this[_fontStyle];
-    }
-    set [dartx.fontStyle](value) {
-      this[_fontStyle] = value == null ? '' : value;
-    }
-    get [_fontStyle]() {
-      return this.fontStyle;
-    }
-    set [_fontStyle](value) {
-      this.fontStyle = value;
-    }
-    get [dartx.fontVariant]() {
-      return this[_fontVariant];
-    }
-    set [dartx.fontVariant](value) {
-      this[_fontVariant] = value == null ? '' : value;
-    }
-    get [_fontVariant]() {
-      return this.fontVariant;
-    }
-    set [_fontVariant](value) {
-      this.fontVariant = value;
-    }
-    get [dartx.fontWeight]() {
-      return this[_fontWeight];
-    }
-    set [dartx.fontWeight](value) {
-      this[_fontWeight] = value == null ? '' : value;
-    }
-    get [_fontWeight]() {
-      return this.fontWeight;
-    }
-    set [_fontWeight](value) {
-      this.fontWeight = value;
-    }
-    get [dartx.height]() {
-      return this[_height$];
-    }
-    set [dartx.height](value) {
-      this[_height$] = value == null ? '' : value;
-    }
-    get [_height$]() {
-      return this.height;
-    }
-    set [_height$](value) {
-      this.height = value;
-    }
-    get [dartx.left]() {
-      return this[_left];
-    }
-    set [dartx.left](value) {
-      this[_left] = value == null ? '' : value;
-    }
-    get [_left]() {
-      return this.left;
-    }
-    set [_left](value) {
-      this.left = value;
-    }
-    get [dartx.letterSpacing]() {
-      return this[_letterSpacing];
-    }
-    set [dartx.letterSpacing](value) {
-      this[_letterSpacing] = value == null ? '' : value;
-    }
-    get [_letterSpacing]() {
-      return this.letterSpacing;
-    }
-    set [_letterSpacing](value) {
-      this.letterSpacing = value;
-    }
-    get [dartx.lineHeight]() {
-      return this[_lineHeight];
-    }
-    set [dartx.lineHeight](value) {
-      this[_lineHeight] = value == null ? '' : value;
-    }
-    get [_lineHeight]() {
-      return this.lineHeight;
-    }
-    set [_lineHeight](value) {
-      this.lineHeight = value;
-    }
-    get [dartx.listStyle]() {
-      return this[_listStyle];
-    }
-    set [dartx.listStyle](value) {
-      this[_listStyle] = value == null ? '' : value;
-    }
-    get [_listStyle]() {
-      return this.listStyle;
-    }
-    set [_listStyle](value) {
-      this.listStyle = value;
-    }
-    get [dartx.listStyleImage]() {
-      return this[_listStyleImage];
-    }
-    set [dartx.listStyleImage](value) {
-      this[_listStyleImage] = value == null ? '' : value;
-    }
-    get [_listStyleImage]() {
-      return this.listStyleImage;
-    }
-    set [_listStyleImage](value) {
-      this.listStyleImage = value;
-    }
-    get [dartx.listStylePosition]() {
-      return this[_listStylePosition];
-    }
-    set [dartx.listStylePosition](value) {
-      this[_listStylePosition] = value == null ? '' : value;
-    }
-    get [_listStylePosition]() {
-      return this.listStylePosition;
-    }
-    set [_listStylePosition](value) {
-      this.listStylePosition = value;
-    }
-    get [dartx.listStyleType]() {
-      return this[_listStyleType];
-    }
-    set [dartx.listStyleType](value) {
-      this[_listStyleType] = value == null ? '' : value;
-    }
-    get [_listStyleType]() {
-      return this.listStyleType;
-    }
-    set [_listStyleType](value) {
-      this.listStyleType = value;
-    }
-    get [dartx.margin]() {
-      return this[_margin];
-    }
-    set [dartx.margin](value) {
-      this[_margin] = value == null ? '' : value;
-    }
-    get [_margin]() {
-      return this.margin;
-    }
-    set [_margin](value) {
-      this.margin = value;
-    }
-    get [dartx.marginBottom]() {
-      return this[_marginBottom];
-    }
-    set [dartx.marginBottom](value) {
-      this[_marginBottom] = value == null ? '' : value;
-    }
-    get [_marginBottom]() {
-      return this.marginBottom;
-    }
-    set [_marginBottom](value) {
-      this.marginBottom = value;
-    }
-    get [dartx.marginLeft]() {
-      return this[_marginLeft];
-    }
-    set [dartx.marginLeft](value) {
-      this[_marginLeft] = value == null ? '' : value;
-    }
-    get [_marginLeft]() {
-      return this.marginLeft;
-    }
-    set [_marginLeft](value) {
-      this.marginLeft = value;
-    }
-    get [dartx.marginRight]() {
-      return this[_marginRight];
-    }
-    set [dartx.marginRight](value) {
-      this[_marginRight] = value == null ? '' : value;
-    }
-    get [_marginRight]() {
-      return this.marginRight;
-    }
-    set [_marginRight](value) {
-      this.marginRight = value;
-    }
-    get [dartx.marginTop]() {
-      return this[_marginTop];
-    }
-    set [dartx.marginTop](value) {
-      this[_marginTop] = value == null ? '' : value;
-    }
-    get [_marginTop]() {
-      return this.marginTop;
-    }
-    set [_marginTop](value) {
-      this.marginTop = value;
-    }
-    get [dartx.maxHeight]() {
-      return this[_maxHeight];
-    }
-    set [dartx.maxHeight](value) {
-      this[_maxHeight] = value == null ? '' : value;
-    }
-    get [_maxHeight]() {
-      return this.maxHeight;
-    }
-    set [_maxHeight](value) {
-      this.maxHeight = value;
-    }
-    get [dartx.maxWidth]() {
-      return this[_maxWidth];
-    }
-    set [dartx.maxWidth](value) {
-      this[_maxWidth] = value == null ? '' : value;
-    }
-    get [_maxWidth]() {
-      return this.maxWidth;
-    }
-    set [_maxWidth](value) {
-      this.maxWidth = value;
-    }
-    get [dartx.minHeight]() {
-      return this[_minHeight];
-    }
-    set [dartx.minHeight](value) {
-      this[_minHeight] = value == null ? '' : value;
-    }
-    get [_minHeight]() {
-      return this.minHeight;
-    }
-    set [_minHeight](value) {
-      this.minHeight = value;
-    }
-    get [dartx.minWidth]() {
-      return this[_minWidth];
-    }
-    set [dartx.minWidth](value) {
-      this[_minWidth] = value == null ? '' : value;
-    }
-    get [_minWidth]() {
-      return this.minWidth;
-    }
-    set [_minWidth](value) {
-      this.minWidth = value;
-    }
-    get [dartx.outline]() {
-      return this[_outline];
-    }
-    set [dartx.outline](value) {
-      this[_outline] = value == null ? '' : value;
-    }
-    get [_outline]() {
-      return this.outline;
-    }
-    set [_outline](value) {
-      this.outline = value;
-    }
-    get [dartx.outlineColor]() {
-      return this[_outlineColor];
-    }
-    set [dartx.outlineColor](value) {
-      this[_outlineColor] = value == null ? '' : value;
-    }
-    get [_outlineColor]() {
-      return this.outlineColor;
-    }
-    set [_outlineColor](value) {
-      this.outlineColor = value;
-    }
-    get [dartx.outlineStyle]() {
-      return this[_outlineStyle];
-    }
-    set [dartx.outlineStyle](value) {
-      this[_outlineStyle] = value == null ? '' : value;
-    }
-    get [_outlineStyle]() {
-      return this.outlineStyle;
-    }
-    set [_outlineStyle](value) {
-      this.outlineStyle = value;
-    }
-    get [dartx.outlineWidth]() {
-      return this[_outlineWidth];
-    }
-    set [dartx.outlineWidth](value) {
-      this[_outlineWidth] = value == null ? '' : value;
-    }
-    get [_outlineWidth]() {
-      return this.outlineWidth;
-    }
-    set [_outlineWidth](value) {
-      this.outlineWidth = value;
-    }
-    get [dartx.overflow]() {
-      return this[_overflow];
-    }
-    set [dartx.overflow](value) {
-      this[_overflow] = value == null ? '' : value;
-    }
-    get [_overflow]() {
-      return this.overflow;
-    }
-    set [_overflow](value) {
-      this.overflow = value;
-    }
-    get [dartx.padding]() {
-      return this[_padding];
-    }
-    set [dartx.padding](value) {
-      this[_padding] = value == null ? '' : value;
-    }
-    get [_padding]() {
-      return this.padding;
-    }
-    set [_padding](value) {
-      this.padding = value;
-    }
-    get [dartx.paddingBottom]() {
-      return this[_paddingBottom];
-    }
-    set [dartx.paddingBottom](value) {
-      this[_paddingBottom] = value == null ? '' : value;
-    }
-    get [_paddingBottom]() {
-      return this.paddingBottom;
-    }
-    set [_paddingBottom](value) {
-      this.paddingBottom = value;
-    }
-    get [dartx.paddingLeft]() {
-      return this[_paddingLeft];
-    }
-    set [dartx.paddingLeft](value) {
-      this[_paddingLeft] = value == null ? '' : value;
-    }
-    get [_paddingLeft]() {
-      return this.paddingLeft;
-    }
-    set [_paddingLeft](value) {
-      this.paddingLeft = value;
-    }
-    get [dartx.paddingRight]() {
-      return this[_paddingRight];
-    }
-    set [dartx.paddingRight](value) {
-      this[_paddingRight] = value == null ? '' : value;
-    }
-    get [_paddingRight]() {
-      return this.paddingRight;
-    }
-    set [_paddingRight](value) {
-      this.paddingRight = value;
-    }
-    get [dartx.paddingTop]() {
-      return this[_paddingTop];
-    }
-    set [dartx.paddingTop](value) {
-      this[_paddingTop] = value == null ? '' : value;
-    }
-    get [_paddingTop]() {
-      return this.paddingTop;
-    }
-    set [_paddingTop](value) {
-      this.paddingTop = value;
-    }
-    get [dartx.pageBreakAfter]() {
-      return this[_pageBreakAfter];
-    }
-    set [dartx.pageBreakAfter](value) {
-      this[_pageBreakAfter] = value == null ? '' : value;
-    }
-    get [_pageBreakAfter]() {
-      return this.pageBreakAfter;
-    }
-    set [_pageBreakAfter](value) {
-      this.pageBreakAfter = value;
-    }
-    get [dartx.pageBreakBefore]() {
-      return this[_pageBreakBefore];
-    }
-    set [dartx.pageBreakBefore](value) {
-      this[_pageBreakBefore] = value == null ? '' : value;
-    }
-    get [_pageBreakBefore]() {
-      return this.pageBreakBefore;
-    }
-    set [_pageBreakBefore](value) {
-      this.pageBreakBefore = value;
-    }
-    get [dartx.pageBreakInside]() {
-      return this[_pageBreakInside];
-    }
-    set [dartx.pageBreakInside](value) {
-      this[_pageBreakInside] = value == null ? '' : value;
-    }
-    get [_pageBreakInside]() {
-      return this.pageBreakInside;
-    }
-    set [_pageBreakInside](value) {
-      this.pageBreakInside = value;
-    }
-    get [dartx.position]() {
-      return this[_position$1];
-    }
-    set [dartx.position](value) {
-      this[_position$1] = value == null ? '' : value;
-    }
-    get [_position$1]() {
-      return this.position;
-    }
-    set [_position$1](value) {
-      this.position = value;
-    }
-    get [dartx.quotes]() {
-      return this[_quotes];
-    }
-    set [dartx.quotes](value) {
-      this[_quotes] = value == null ? '' : value;
-    }
-    get [_quotes]() {
-      return this.quotes;
-    }
-    set [_quotes](value) {
-      this.quotes = value;
-    }
-    get [dartx.right]() {
-      return this[_right];
-    }
-    set [dartx.right](value) {
-      this[_right] = value == null ? '' : value;
-    }
-    get [_right]() {
-      return this.right;
-    }
-    set [_right](value) {
-      this.right = value;
-    }
-    get [dartx.tableLayout]() {
-      return this[_tableLayout];
-    }
-    set [dartx.tableLayout](value) {
-      this[_tableLayout] = value == null ? '' : value;
-    }
-    get [_tableLayout]() {
-      return this.tableLayout;
-    }
-    set [_tableLayout](value) {
-      this.tableLayout = value;
-    }
-    get [dartx.textAlign]() {
-      return this[_textAlign];
-    }
-    set [dartx.textAlign](value) {
-      this[_textAlign] = value == null ? '' : value;
-    }
-    get [_textAlign]() {
-      return this.textAlign;
-    }
-    set [_textAlign](value) {
-      this.textAlign = value;
-    }
-    get [dartx.textDecoration]() {
-      return this[_textDecoration];
-    }
-    set [dartx.textDecoration](value) {
-      this[_textDecoration] = value == null ? '' : value;
-    }
-    get [_textDecoration]() {
-      return this.textDecoration;
-    }
-    set [_textDecoration](value) {
-      this.textDecoration = value;
-    }
-    get [dartx.textIndent]() {
-      return this[_textIndent];
-    }
-    set [dartx.textIndent](value) {
-      this[_textIndent] = value == null ? '' : value;
-    }
-    get [_textIndent]() {
-      return this.textIndent;
-    }
-    set [_textIndent](value) {
-      this.textIndent = value;
-    }
-    get [dartx.textTransform]() {
-      return this[_textTransform];
-    }
-    set [dartx.textTransform](value) {
-      this[_textTransform] = value == null ? '' : value;
-    }
-    get [_textTransform]() {
-      return this.textTransform;
-    }
-    set [_textTransform](value) {
-      this.textTransform = value;
-    }
-    get [dartx.top]() {
-      return this[_top];
-    }
-    set [dartx.top](value) {
-      this[_top] = value == null ? '' : value;
-    }
-    get [_top]() {
-      return this.top;
-    }
-    set [_top](value) {
-      this.top = value;
-    }
-    get [dartx.unicodeBidi]() {
-      return this[_unicodeBidi];
-    }
-    set [dartx.unicodeBidi](value) {
-      this[_unicodeBidi] = value == null ? '' : value;
-    }
-    get [_unicodeBidi]() {
-      return this.unicodeBidi;
-    }
-    set [_unicodeBidi](value) {
-      this.unicodeBidi = value;
-    }
-    get [dartx.verticalAlign]() {
-      return this[_verticalAlign];
-    }
-    set [dartx.verticalAlign](value) {
-      this[_verticalAlign] = value == null ? '' : value;
-    }
-    get [_verticalAlign]() {
-      return this.verticalAlign;
-    }
-    set [_verticalAlign](value) {
-      this.verticalAlign = value;
-    }
-    get [dartx.visibility]() {
-      return this[_visibility];
-    }
-    set [dartx.visibility](value) {
-      this[_visibility] = value == null ? '' : value;
-    }
-    get [_visibility]() {
-      return this.visibility;
-    }
-    set [_visibility](value) {
-      this.visibility = value;
-    }
-    get [dartx.whiteSpace]() {
-      return this[_whiteSpace];
-    }
-    set [dartx.whiteSpace](value) {
-      this[_whiteSpace] = value == null ? '' : value;
-    }
-    get [_whiteSpace]() {
-      return this.whiteSpace;
-    }
-    set [_whiteSpace](value) {
-      this.whiteSpace = value;
-    }
-    get [dartx.width]() {
-      return this[_width$];
-    }
-    set [dartx.width](value) {
-      this[_width$] = value == null ? '' : value;
-    }
-    get [_width$]() {
-      return this.width;
-    }
-    set [_width$](value) {
-      this.width = value;
-    }
-    get [dartx.wordSpacing]() {
-      return this[_wordSpacing];
-    }
-    set [dartx.wordSpacing](value) {
-      this[_wordSpacing] = value == null ? '' : value;
-    }
-    get [_wordSpacing]() {
-      return this.wordSpacing;
-    }
-    set [_wordSpacing](value) {
-      this.wordSpacing = value;
-    }
-    get [dartx.zIndex]() {
-      return this[_zIndex];
-    }
-    set [dartx.zIndex](value) {
-      this[_zIndex] = value == null ? '' : value;
-    }
-    get [_zIndex]() {
-      return this.zIndex;
-    }
-    set [_zIndex](value) {
-      this.zIndex = value;
-    }
-  };
-  dart.setSignature(html$.CssStyleDeclaration, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
-      css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
-      _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
-    }),
-    fields: () => ({
-      [dartx.cssText]: core.String,
-      [dartx.length]: core.int,
-      [dartx.parentRule]: html$.CssRule,
-      [_background]: core.String,
-      [_backgroundAttachment]: core.String,
-      [_backgroundColor]: core.String,
-      [_backgroundImage]: core.String,
-      [_backgroundPosition]: core.String,
-      [_backgroundRepeat]: core.String,
-      [_border]: core.String,
-      [_borderBottom]: core.String,
-      [_borderBottomColor]: core.String,
-      [_borderBottomStyle]: core.String,
-      [_borderBottomWidth]: core.String,
-      [_borderCollapse]: core.String,
-      [_borderColor]: core.String,
-      [_borderLeft]: core.String,
-      [_borderLeftColor]: core.String,
-      [_borderLeftStyle]: core.String,
-      [_borderLeftWidth]: core.String,
-      [_borderRight]: core.String,
-      [_borderRightColor]: core.String,
-      [_borderRightStyle]: core.String,
-      [_borderRightWidth]: core.String,
-      [_borderSpacing]: core.String,
-      [_borderStyle]: core.String,
-      [_borderTop]: core.String,
-      [_borderTopColor]: core.String,
-      [_borderTopStyle]: core.String,
-      [_borderTopWidth]: core.String,
-      [_borderWidth]: core.String,
-      [_bottom]: core.String,
-      [_captionSide]: core.String,
-      [_clear$1]: core.String,
-      [_clip]: core.String,
-      [_color]: core.String,
-      [_content]: core.String,
-      [_cursor]: core.String,
-      [_direction]: core.String,
-      [_display]: core.String,
-      [_emptyCells]: core.String,
-      [_font]: core.String,
-      [_fontFamily]: core.String,
-      [_fontSize]: core.String,
-      [_fontStyle]: core.String,
-      [_fontVariant]: core.String,
-      [_fontWeight]: core.String,
-      [_height$]: core.String,
-      [_left]: core.String,
-      [_letterSpacing]: core.String,
-      [_lineHeight]: core.String,
-      [_listStyle]: core.String,
-      [_listStyleImage]: core.String,
-      [_listStylePosition]: core.String,
-      [_listStyleType]: core.String,
-      [_margin]: core.String,
-      [_marginBottom]: core.String,
-      [_marginLeft]: core.String,
-      [_marginRight]: core.String,
-      [_marginTop]: core.String,
-      [_maxHeight]: core.String,
-      [_maxWidth]: core.String,
-      [_minHeight]: core.String,
-      [_minWidth]: core.String,
-      [_outline]: core.String,
-      [_outlineColor]: core.String,
-      [_outlineStyle]: core.String,
-      [_outlineWidth]: core.String,
-      [_overflow]: core.String,
-      [_padding]: core.String,
-      [_paddingBottom]: core.String,
-      [_paddingLeft]: core.String,
-      [_paddingRight]: core.String,
-      [_paddingTop]: core.String,
-      [_pageBreakAfter]: core.String,
-      [_pageBreakBefore]: core.String,
-      [_pageBreakInside]: core.String,
-      [_position$1]: core.String,
-      [_quotes]: core.String,
-      [_right]: core.String,
-      [_tableLayout]: core.String,
-      [_textAlign]: core.String,
-      [_textDecoration]: core.String,
-      [_textIndent]: core.String,
-      [_textTransform]: core.String,
-      [_top]: core.String,
-      [_unicodeBidi]: core.String,
-      [_verticalAlign]: core.String,
-      [_visibility]: core.String,
-      [_whiteSpace]: core.String,
-      [_width$]: core.String,
-      [_wordSpacing]: core.String,
-      [_zIndex]: core.String
-    }),
-    methods: () => ({
-      [dartx.getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
-      [_getPropertyValueHelper]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
-      [_supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.setProperty]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
-      [_browserPropertyName]: dart.definiteFunctionType(core.String, [core.String]),
-      [_setPropertyHelper]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
-      [dartx.getPropertyPriority]: dart.definiteFunctionType(core.String, [core.String]),
-      [_getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.removeProperty]: dart.definiteFunctionType(core.String, [core.String])
-    }),
-    sfields: () => ({_propertyCache: dart.dynamic}),
-    sgetters: () => ({supportsTransitions: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _readCache: dart.definiteFunctionType(core.String, [core.String]),
-      _writeCache: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      _camelCase: dart.definiteFunctionType(core.String, [core.String])
-    }),
-    names: ['_readCache', '_writeCache', '_camelCase']
-  });
-  dart.defineLazy(html$.CssStyleDeclaration, {
-    get _propertyCache() {
-      return {};
-    }
-  });
-  dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
-  dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
-  dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
-  const _elementIterable = Symbol('_elementIterable');
-  const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
-  const _setAll = Symbol('_setAll');
-  html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
-    new(elementIterable) {
-      this[_elementIterable] = elementIterable;
-      this[_elementCssStyleDeclarationSetIterable] = null;
-      this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
-    }
-    getPropertyValue(propertyName) {
-      return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
-    }
-    setProperty(propertyName, value, priority) {
-      if (priority === void 0) priority = null;
-      this[_elementCssStyleDeclarationSetIterable][dartx.forEach](dart.fn(e => e[dartx.setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
-    }
-    [_setAll](propertyName, value) {
-      value = value == null ? '' : value;
-      for (let element of this[_elementIterable]) {
-        element.style[propertyName] = value;
-      }
-    }
-    set background(value) {
-      this[_setAll]('background', value);
-    }
-    get background() {
-      return super.background;
-    }
-    set backgroundAttachment(value) {
-      this[_setAll]('backgroundAttachment', value);
-    }
-    get backgroundAttachment() {
-      return super.backgroundAttachment;
-    }
-    set backgroundColor(value) {
-      this[_setAll]('backgroundColor', value);
-    }
-    get backgroundColor() {
-      return super.backgroundColor;
-    }
-    set backgroundImage(value) {
-      this[_setAll]('backgroundImage', value);
-    }
-    get backgroundImage() {
-      return super.backgroundImage;
-    }
-    set backgroundPosition(value) {
-      this[_setAll]('backgroundPosition', value);
-    }
-    get backgroundPosition() {
-      return super.backgroundPosition;
-    }
-    set backgroundRepeat(value) {
-      this[_setAll]('backgroundRepeat', value);
-    }
-    get backgroundRepeat() {
-      return super.backgroundRepeat;
-    }
-    set border(value) {
-      this[_setAll]('border', value);
-    }
-    get border() {
-      return super.border;
-    }
-    set borderBottom(value) {
-      this[_setAll]('borderBottom', value);
-    }
-    get borderBottom() {
-      return super.borderBottom;
-    }
-    set borderBottomColor(value) {
-      this[_setAll]('borderBottomColor', value);
-    }
-    get borderBottomColor() {
-      return super.borderBottomColor;
-    }
-    set borderBottomStyle(value) {
-      this[_setAll]('borderBottomStyle', value);
-    }
-    get borderBottomStyle() {
-      return super.borderBottomStyle;
-    }
-    set borderBottomWidth(value) {
-      this[_setAll]('borderBottomWidth', value);
-    }
-    get borderBottomWidth() {
-      return super.borderBottomWidth;
-    }
-    set borderCollapse(value) {
-      this[_setAll]('borderCollapse', value);
-    }
-    get borderCollapse() {
-      return super.borderCollapse;
-    }
-    set borderColor(value) {
-      this[_setAll]('borderColor', value);
-    }
-    get borderColor() {
-      return super.borderColor;
-    }
-    set borderLeft(value) {
-      this[_setAll]('borderLeft', value);
-    }
-    get borderLeft() {
-      return super.borderLeft;
-    }
-    set borderLeftColor(value) {
-      this[_setAll]('borderLeftColor', value);
-    }
-    get borderLeftColor() {
-      return super.borderLeftColor;
-    }
-    set borderLeftStyle(value) {
-      this[_setAll]('borderLeftStyle', value);
-    }
-    get borderLeftStyle() {
-      return super.borderLeftStyle;
-    }
-    set borderLeftWidth(value) {
-      this[_setAll]('borderLeftWidth', value);
-    }
-    get borderLeftWidth() {
-      return super.borderLeftWidth;
-    }
-    set borderRight(value) {
-      this[_setAll]('borderRight', value);
-    }
-    get borderRight() {
-      return super.borderRight;
-    }
-    set borderRightColor(value) {
-      this[_setAll]('borderRightColor', value);
-    }
-    get borderRightColor() {
-      return super.borderRightColor;
-    }
-    set borderRightStyle(value) {
-      this[_setAll]('borderRightStyle', value);
-    }
-    get borderRightStyle() {
-      return super.borderRightStyle;
-    }
-    set borderRightWidth(value) {
-      this[_setAll]('borderRightWidth', value);
-    }
-    get borderRightWidth() {
-      return super.borderRightWidth;
-    }
-    set borderSpacing(value) {
-      this[_setAll]('borderSpacing', value);
-    }
-    get borderSpacing() {
-      return super.borderSpacing;
-    }
-    set borderStyle(value) {
-      this[_setAll]('borderStyle', value);
-    }
-    get borderStyle() {
-      return super.borderStyle;
-    }
-    set borderTop(value) {
-      this[_setAll]('borderTop', value);
-    }
-    get borderTop() {
-      return super.borderTop;
-    }
-    set borderTopColor(value) {
-      this[_setAll]('borderTopColor', value);
-    }
-    get borderTopColor() {
-      return super.borderTopColor;
-    }
-    set borderTopStyle(value) {
-      this[_setAll]('borderTopStyle', value);
-    }
-    get borderTopStyle() {
-      return super.borderTopStyle;
-    }
-    set borderTopWidth(value) {
-      this[_setAll]('borderTopWidth', value);
-    }
-    get borderTopWidth() {
-      return super.borderTopWidth;
-    }
-    set borderWidth(value) {
-      this[_setAll]('borderWidth', value);
-    }
-    get borderWidth() {
-      return super.borderWidth;
-    }
-    set bottom(value) {
-      this[_setAll]('bottom', value);
-    }
-    get bottom() {
-      return super.bottom;
-    }
-    set captionSide(value) {
-      this[_setAll]('captionSide', value);
-    }
-    get captionSide() {
-      return super.captionSide;
-    }
-    set clear(value) {
-      this[_setAll]('clear', value);
-    }
-    get clear() {
-      return super.clear;
-    }
-    set clip(value) {
-      this[_setAll]('clip', value);
-    }
-    get clip() {
-      return super.clip;
-    }
-    set color(value) {
-      this[_setAll]('color', value);
-    }
-    get color() {
-      return super.color;
-    }
-    set content(value) {
-      this[_setAll]('content', value);
-    }
-    get content() {
-      return super.content;
-    }
-    set cursor(value) {
-      this[_setAll]('cursor', value);
-    }
-    get cursor() {
-      return super.cursor;
-    }
-    set direction(value) {
-      this[_setAll]('direction', value);
-    }
-    get direction() {
-      return super.direction;
-    }
-    set display(value) {
-      this[_setAll]('display', value);
-    }
-    get display() {
-      return super.display;
-    }
-    set emptyCells(value) {
-      this[_setAll]('emptyCells', value);
-    }
-    get emptyCells() {
-      return super.emptyCells;
-    }
-    set font(value) {
-      this[_setAll]('font', value);
-    }
-    get font() {
-      return super.font;
-    }
-    set fontFamily(value) {
-      this[_setAll]('fontFamily', value);
-    }
-    get fontFamily() {
-      return super.fontFamily;
-    }
-    set fontSize(value) {
-      this[_setAll]('fontSize', value);
-    }
-    get fontSize() {
-      return super.fontSize;
-    }
-    set fontStyle(value) {
-      this[_setAll]('fontStyle', value);
-    }
-    get fontStyle() {
-      return super.fontStyle;
-    }
-    set fontVariant(value) {
-      this[_setAll]('fontVariant', value);
-    }
-    get fontVariant() {
-      return super.fontVariant;
-    }
-    set fontWeight(value) {
-      this[_setAll]('fontWeight', value);
-    }
-    get fontWeight() {
-      return super.fontWeight;
-    }
-    set height(value) {
-      this[_setAll]('height', value);
-    }
-    get height() {
-      return super.height;
-    }
-    set left(value) {
-      this[_setAll]('left', value);
-    }
-    get left() {
-      return super.left;
-    }
-    set letterSpacing(value) {
-      this[_setAll]('letterSpacing', value);
-    }
-    get letterSpacing() {
-      return super.letterSpacing;
-    }
-    set lineHeight(value) {
-      this[_setAll]('lineHeight', value);
-    }
-    get lineHeight() {
-      return super.lineHeight;
-    }
-    set listStyle(value) {
-      this[_setAll]('listStyle', value);
-    }
-    get listStyle() {
-      return super.listStyle;
-    }
-    set listStyleImage(value) {
-      this[_setAll]('listStyleImage', value);
-    }
-    get listStyleImage() {
-      return super.listStyleImage;
-    }
-    set listStylePosition(value) {
-      this[_setAll]('listStylePosition', value);
-    }
-    get listStylePosition() {
-      return super.listStylePosition;
-    }
-    set listStyleType(value) {
-      this[_setAll]('listStyleType', value);
-    }
-    get listStyleType() {
-      return super.listStyleType;
-    }
-    set margin(value) {
-      this[_setAll]('margin', value);
-    }
-    get margin() {
-      return super.margin;
-    }
-    set marginBottom(value) {
-      this[_setAll]('marginBottom', value);
-    }
-    get marginBottom() {
-      return super.marginBottom;
-    }
-    set marginLeft(value) {
-      this[_setAll]('marginLeft', value);
-    }
-    get marginLeft() {
-      return super.marginLeft;
-    }
-    set marginRight(value) {
-      this[_setAll]('marginRight', value);
-    }
-    get marginRight() {
-      return super.marginRight;
-    }
-    set marginTop(value) {
-      this[_setAll]('marginTop', value);
-    }
-    get marginTop() {
-      return super.marginTop;
-    }
-    set maxHeight(value) {
-      this[_setAll]('maxHeight', value);
-    }
-    get maxHeight() {
-      return super.maxHeight;
-    }
-    set maxWidth(value) {
-      this[_setAll]('maxWidth', value);
-    }
-    get maxWidth() {
-      return super.maxWidth;
-    }
-    set minHeight(value) {
-      this[_setAll]('minHeight', value);
-    }
-    get minHeight() {
-      return super.minHeight;
-    }
-    set minWidth(value) {
-      this[_setAll]('minWidth', value);
-    }
-    get minWidth() {
-      return super.minWidth;
-    }
-    set outline(value) {
-      this[_setAll]('outline', value);
-    }
-    get outline() {
-      return super.outline;
-    }
-    set outlineColor(value) {
-      this[_setAll]('outlineColor', value);
-    }
-    get outlineColor() {
-      return super.outlineColor;
-    }
-    set outlineStyle(value) {
-      this[_setAll]('outlineStyle', value);
-    }
-    get outlineStyle() {
-      return super.outlineStyle;
-    }
-    set outlineWidth(value) {
-      this[_setAll]('outlineWidth', value);
-    }
-    get outlineWidth() {
-      return super.outlineWidth;
-    }
-    set overflow(value) {
-      this[_setAll]('overflow', value);
-    }
-    get overflow() {
-      return super.overflow;
-    }
-    set padding(value) {
-      this[_setAll]('padding', value);
-    }
-    get padding() {
-      return super.padding;
-    }
-    set paddingBottom(value) {
-      this[_setAll]('paddingBottom', value);
-    }
-    get paddingBottom() {
-      return super.paddingBottom;
-    }
-    set paddingLeft(value) {
-      this[_setAll]('paddingLeft', value);
-    }
-    get paddingLeft() {
-      return super.paddingLeft;
-    }
-    set paddingRight(value) {
-      this[_setAll]('paddingRight', value);
-    }
-    get paddingRight() {
-      return super.paddingRight;
-    }
-    set paddingTop(value) {
-      this[_setAll]('paddingTop', value);
-    }
-    get paddingTop() {
-      return super.paddingTop;
-    }
-    set pageBreakAfter(value) {
-      this[_setAll]('pageBreakAfter', value);
-    }
-    get pageBreakAfter() {
-      return super.pageBreakAfter;
-    }
-    set pageBreakBefore(value) {
-      this[_setAll]('pageBreakBefore', value);
-    }
-    get pageBreakBefore() {
-      return super.pageBreakBefore;
-    }
-    set pageBreakInside(value) {
-      this[_setAll]('pageBreakInside', value);
-    }
-    get pageBreakInside() {
-      return super.pageBreakInside;
-    }
-    set position(value) {
-      this[_setAll]('position', value);
-    }
-    get position() {
-      return super.position;
-    }
-    set quotes(value) {
-      this[_setAll]('quotes', value);
-    }
-    get quotes() {
-      return super.quotes;
-    }
-    set right(value) {
-      this[_setAll]('right', value);
-    }
-    get right() {
-      return super.right;
-    }
-    set tableLayout(value) {
-      this[_setAll]('tableLayout', value);
-    }
-    get tableLayout() {
-      return super.tableLayout;
-    }
-    set textAlign(value) {
-      this[_setAll]('textAlign', value);
-    }
-    get textAlign() {
-      return super.textAlign;
-    }
-    set textDecoration(value) {
-      this[_setAll]('textDecoration', value);
-    }
-    get textDecoration() {
-      return super.textDecoration;
-    }
-    set textIndent(value) {
-      this[_setAll]('textIndent', value);
-    }
-    get textIndent() {
-      return super.textIndent;
-    }
-    set textTransform(value) {
-      this[_setAll]('textTransform', value);
-    }
-    get textTransform() {
-      return super.textTransform;
-    }
-    set top(value) {
-      this[_setAll]('top', value);
-    }
-    get top() {
-      return super.top;
-    }
-    set unicodeBidi(value) {
-      this[_setAll]('unicodeBidi', value);
-    }
-    get unicodeBidi() {
-      return super.unicodeBidi;
-    }
-    set verticalAlign(value) {
-      this[_setAll]('verticalAlign', value);
-    }
-    get verticalAlign() {
-      return super.verticalAlign;
-    }
-    set visibility(value) {
-      this[_setAll]('visibility', value);
-    }
-    get visibility() {
-      return super.visibility;
-    }
-    set whiteSpace(value) {
-      this[_setAll]('whiteSpace', value);
-    }
-    get whiteSpace() {
-      return super.whiteSpace;
-    }
-    set width(value) {
-      this[_setAll]('width', value);
-    }
-    get width() {
-      return super.width;
-    }
-    set wordSpacing(value) {
-      this[_setAll]('wordSpacing', value);
-    }
-    get wordSpacing() {
-      return super.wordSpacing;
-    }
-    set zIndex(value) {
-      this[_setAll]('zIndex', value);
-    }
-    get zIndex() {
-      return super.zIndex;
-    }
-  };
-  dart.setSignature(html$._CssStyleDeclarationSet, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
-    fields: () => ({
-      [_elementIterable]: IterableOfElement(),
-      [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
-    }),
-    methods: () => ({
-      getPropertyValue: dart.definiteFunctionType(core.String, [core.String]),
-      setProperty: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
-      [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
-    })
-  });
-  dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
-    'getPropertyValue',
-    'setProperty',
-    'background',
-    'backgroundAttachment',
-    'backgroundColor',
-    'backgroundImage',
-    'backgroundPosition',
-    'backgroundRepeat',
-    'border',
-    'borderBottom',
-    'borderBottomColor',
-    'borderBottomStyle',
-    'borderBottomWidth',
-    'borderCollapse',
-    'borderColor',
-    'borderLeft',
-    'borderLeftColor',
-    'borderLeftStyle',
-    'borderLeftWidth',
-    'borderRight',
-    'borderRightColor',
-    'borderRightStyle',
-    'borderRightWidth',
-    'borderSpacing',
-    'borderStyle',
-    'borderTop',
-    'borderTopColor',
-    'borderTopStyle',
-    'borderTopWidth',
-    'borderWidth',
-    'bottom',
-    'captionSide',
-    'clear',
-    'clip',
-    'color',
-    'content',
-    'cursor',
-    'direction',
-    'display',
-    'emptyCells',
-    'font',
-    'fontFamily',
-    'fontSize',
-    'fontStyle',
-    'fontVariant',
-    'fontWeight',
-    'height',
-    'left',
-    'letterSpacing',
-    'lineHeight',
-    'listStyle',
-    'listStyleImage',
-    'listStylePosition',
-    'listStyleType',
-    'margin',
-    'marginBottom',
-    'marginLeft',
-    'marginRight',
-    'marginTop',
-    'maxHeight',
-    'maxWidth',
-    'minHeight',
-    'minWidth',
-    'outline',
-    'outlineColor',
-    'outlineStyle',
-    'outlineWidth',
-    'overflow',
-    'padding',
-    'paddingBottom',
-    'paddingLeft',
-    'paddingRight',
-    'paddingTop',
-    'pageBreakAfter',
-    'pageBreakBefore',
-    'pageBreakInside',
-    'position',
-    'quotes',
-    'right',
-    'tableLayout',
-    'textAlign',
-    'textDecoration',
-    'textIndent',
-    'textTransform',
-    'top',
-    'unicodeBidi',
-    'verticalAlign',
-    'visibility',
-    'whiteSpace',
-    'width',
-    'wordSpacing',
-    'zIndex'
-  ]);
-  dart.defineExtensionNames([
-    'selectorText',
-    'style'
-  ]);
-  html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.selectorText]() {
-      return this.selectorText;
-    }
-    set [dartx.selectorText](value) {
-      this.selectorText = value;
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-  };
-  dart.setSignature(html$.CssStyleRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
-    fields: () => ({
-      [dartx.selectorText]: core.String,
-      [dartx.style]: html$.CssStyleDeclaration
-    })
-  });
-  dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
-  dart.defineExtensionNames([
-    'disabled',
-    'href',
-    'media',
-    'ownerNode',
-    'parentStyleSheet',
-    'title',
-    'type'
-  ]);
-  html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    get [dartx.ownerNode]() {
-      return this.ownerNode;
-    }
-    get [dartx.parentStyleSheet]() {
-      return this.parentStyleSheet;
-    }
-    get [dartx.title]() {
-      return this.title;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.StyleSheet, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
-    fields: () => ({
-      [dartx.disabled]: core.bool,
-      [dartx.href]: core.String,
-      [dartx.media]: html$.MediaList,
-      [dartx.ownerNode]: html$.Node,
-      [dartx.parentStyleSheet]: html$.StyleSheet,
-      [dartx.title]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
-  dart.defineExtensionNames([
-    'addRule',
-    'deleteRule',
-    'insertRule',
-    'removeRule',
-    'cssRules',
-    'ownerRule',
-    'rules'
-  ]);
-  html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cssRules]() {
-      return this.cssRules;
-    }
-    get [dartx.ownerRule]() {
-      return this.ownerRule;
-    }
-    get [dartx.rules]() {
-      return this.rules;
-    }
-    [dartx.addRule](...args) {
-      return this.addRule.apply(this, args);
-    }
-    [dartx.deleteRule](...args) {
-      return this.deleteRule.apply(this, args);
-    }
-    [dartx.insertRule](...args) {
-      return this.insertRule.apply(this, args);
-    }
-    [dartx.removeRule](...args) {
-      return this.removeRule.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CssStyleSheet, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
-    fields: () => ({
-      [dartx.cssRules]: ListOfCssRule(),
-      [dartx.ownerRule]: html$.CssRule,
-      [dartx.rules]: ListOfCssRule()
-    }),
-    methods: () => ({
-      [dartx.addRule]: dart.definiteFunctionType(core.int, [core.String, core.String], [core.int]),
-      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String], [core.int]),
-      [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
-  dart.defineExtensionNames([
-    'deleteRule',
-    'insertRule',
-    'conditionText',
-    'cssRules'
-  ]);
-  html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.conditionText]() {
-      return this.conditionText;
-    }
-    get [dartx.cssRules]() {
-      return this.cssRules;
-    }
-    [dartx.deleteRule](...args) {
-      return this.deleteRule.apply(this, args);
-    }
-    [dartx.insertRule](...args) {
-      return this.insertRule.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CssSupportsRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
-    fields: () => ({
-      [dartx.conditionText]: core.String,
-      [dartx.cssRules]: ListOfCssRule()
-    }),
-    methods: () => ({
-      [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
-  dart.defineExtensionNames([
-    'style'
-  ]);
-  html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-  };
-  dart.setSignature(html$.CssViewportRule, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
-    fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
-  });
-  dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
-  const _dartDetail = Symbol('_dartDetail');
-  const _initCustomEvent = Symbol('_initCustomEvent');
-  const _detail = Symbol('_detail');
-  const _get__detail = Symbol('_get__detail');
-  dart.defineExtensionNames([
-    'detail'
-  ]);
-  html$.CustomEvent = class CustomEvent extends html$.Event {
-    get [_dartDetail]() {
-      return this._dartDetail;
-    }
-    set [_dartDetail](value) {
-      this._dartDetail = value;
-    }
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let detail = opts && 'detail' in opts ? opts.detail : null;
-      let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
-      e[_dartDetail] = detail;
-      if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
-        try {
-          detail = html_common.convertDartToNative_SerializedScriptValue(detail);
-          e[_initCustomEvent](type, canBubble, cancelable, detail);
-        } catch (_) {
-          e[_initCustomEvent](type, canBubble, cancelable, null);
-        }
-
-      } else {
-        e[_initCustomEvent](type, canBubble, cancelable, null);
-      }
-      return e;
-    }
-    get [dartx.detail]() {
-      if (this[_dartDetail] != null) {
-        return this[_dartDetail];
-      }
-      return this[_detail];
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.CustomEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.CustomEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.CustomEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.CustomEvent(type);
-    }
-    get [_detail]() {
-      return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
-    }
-    get [_get__detail]() {
-      return this.detail;
-    }
-    [_initCustomEvent](...args) {
-      return this.initCustomEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.CustomEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
-      _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_dartDetail]: dart.dynamic,
-      [_get__detail]: dart.dynamic
-    }),
-    getters: () => ({
-      [dartx.detail]: dart.definiteFunctionType(dart.dynamic, []),
-      [_detail]: dart.definiteFunctionType(dart.dynamic, [])
-    }),
-    methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
-  html$.DListElement = class DListElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.DListElement, 'created');
-  dart.setSignature(html$.DListElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DListElement, []),
-      new: dart.definiteFunctionType(html$.DListElement, []),
-      created: dart.definiteFunctionType(html$.DListElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
-  dart.defineExtensionNames([
-    'options'
-  ]);
-  html$.DataListElement = class DataListElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
-    }
-    created() {
-      this[dartx.options] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('datalist');
-    }
-    get [dartx.options]() {
-      return this.options;
-    }
-  };
-  dart.defineNamedConstructor(html$.DataListElement, 'created');
-  dart.setSignature(html$.DataListElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DataListElement, []),
-      new: dart.definiteFunctionType(html$.DataListElement, []),
-      created: dart.definiteFunctionType(html$.DataListElement, [])
-    }),
-    fields: () => ({[dartx.options]: ListOfNode()}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
-  dart.defineExtensionNames([
-    'clearData',
-    'getData',
-    'setData',
-    'setDragImage',
-    'dropEffect',
-    'effectAllowed',
-    'files',
-    'items',
-    'types'
-  ]);
-  html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.dropEffect]() {
-      return this.dropEffect;
-    }
-    set [dartx.dropEffect](value) {
-      this.dropEffect = value;
-    }
-    get [dartx.effectAllowed]() {
-      return this.effectAllowed;
-    }
-    set [dartx.effectAllowed](value) {
-      this.effectAllowed = value;
-    }
-    get [dartx.files]() {
-      return this.files;
-    }
-    get [dartx.items]() {
-      return this.items;
-    }
-    get [dartx.types]() {
-      return this.types;
-    }
-    [dartx.clearData](...args) {
-      return this.clearData.apply(this, args);
-    }
-    [dartx.getData](...args) {
-      return this.getData.apply(this, args);
-    }
-    [dartx.setData](...args) {
-      return this.setData.apply(this, args);
-    }
-    [dartx.setDragImage](...args) {
-      return this.setDragImage.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DataTransfer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
-    fields: () => ({
-      [dartx.dropEffect]: core.String,
-      [dartx.effectAllowed]: core.String,
-      [dartx.files]: ListOfFile(),
-      [dartx.items]: html$.DataTransferItemList,
-      [dartx.types]: ListOfString()
-    }),
-    methods: () => ({
-      [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
-      [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
-  const _getAsString = Symbol('_getAsString');
-  dart.defineExtensionNames([
-    'getAsFile',
-    'getAsString',
-    'getAsEntry',
-    'kind',
-    'type'
-  ]);
-  html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.getAsFile](...args) {
-      return this.getAsFile.apply(this, args);
-    }
-    [_getAsString](...args) {
-      return this.getAsString.apply(this, args);
-    }
-    [dartx.getAsString]() {
-      let completer = CompleterOfString().new();
-      this[_getAsString](dart.fn(value => {
-        completer.complete(value);
-      }, StringToNull()));
-      return completer.future;
-    }
-    [dartx.getAsEntry](...args) {
-      return this.webkitGetAsEntry.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DataTransferItem, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
-    fields: () => ({
-      [dartx.kind]: core.String,
-      [dartx.type]: core.String
-    }),
-    methods: () => ({
-      [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
-      [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
-      [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
-      [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
-    })
-  });
-  dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
-  dart.defineExtensionNames([
-    'add',
-    'addData',
-    'addFile',
-    'clear',
-    'item',
-    'remove',
-    '_get',
-    'length'
-  ]);
-  html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.add](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.addData](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.addFile](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.remove](...args) {
-      return this.remove.apply(this, args);
-    }
-    [dartx._get](index) {
-      return this[index];
-    }
-  };
-  dart.setSignature(html$.DataTransferItemList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
-    fields: () => ({[dartx.length]: core.int}),
-    methods: () => ({
-      [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
-      [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
-      [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
-      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-      [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
-      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
-  html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
-  dart.defineExtensionNames([
-    'postMessage',
-    'onMessage'
-  ]);
-  html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.DedicatedWorkerGlobalScope, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
-  dart.defineExtensionNames([
-    'session'
-  ]);
-  html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.DefaultSessionStartEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.DefaultSessionStartEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.DefaultSessionStartEvent(type);
-    }
-    get [dartx.session]() {
-      return this.session;
-    }
-  };
-  dart.setSignature(html$.DefaultSessionStartEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
-      new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.session]: html$.PresentationSession}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
-  dart.defineExtensionNames([
-    'queryUsageAndQuota',
-    'requestQuota'
-  ]);
-  html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.queryUsageAndQuota](...args) {
-      return this.queryUsageAndQuota.apply(this, args);
-    }
-    [dartx.requestQuota](...args) {
-      return this.requestQuota.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DeprecatedStorageInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
-    methods: () => ({
-      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
-      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
-    }),
-    sfields: () => ({
-      PERSISTENT: core.int,
-      TEMPORARY: core.int
-    })
-  });
-  html$.DeprecatedStorageInfo.PERSISTENT = 1;
-  html$.DeprecatedStorageInfo.TEMPORARY = 0;
-  dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
-  dart.defineExtensionNames([
-    'queryUsageAndQuota',
-    'requestQuota'
-  ]);
-  html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.queryUsageAndQuota](...args) {
-      return this.queryUsageAndQuota.apply(this, args);
-    }
-    [dartx.requestQuota](...args) {
-      return this.requestQuota.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DeprecatedStorageQuota, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
-    methods: () => ({
-      [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
-      [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
-    })
-  });
-  dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
-  dart.defineExtensionNames([
-    'open'
-  ]);
-  html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
-    }
-    created() {
-      this[dartx.open] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('details');
-    }
-    get [dartx.open]() {
-      return this.open;
-    }
-    set [dartx.open](value) {
-      this.open = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.DetailsElement, 'created');
-  dart.setSignature(html$.DetailsElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DetailsElement, []),
-      new: dart.definiteFunctionType(html$.DetailsElement, []),
-      created: dart.definiteFunctionType(html$.DetailsElement, [])
-    }),
-    fields: () => ({[dartx.open]: core.bool}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
-  dart.defineExtensionNames([
-    'x',
-    'y',
-    'z'
-  ]);
-  html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.z]() {
-      return this.z;
-    }
-  };
-  dart.setSignature(html$.DeviceAcceleration, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
-    fields: () => ({
-      [dartx.x]: core.double,
-      [dartx.y]: core.double,
-      [dartx.z]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
-  dart.defineExtensionNames([
-    'value'
-  ]);
-  html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.DeviceLightEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.DeviceLightEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.DeviceLightEvent(type);
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-  };
-  dart.setSignature(html$.DeviceLightEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
-      new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.value]: core.double}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
-  dart.defineExtensionNames([
-    'initDeviceMotionEvent',
-    'acceleration',
-    'accelerationIncludingGravity',
-    'interval',
-    'rotationRate'
-  ]);
-  html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.acceleration]() {
-      return this.acceleration;
-    }
-    get [dartx.accelerationIncludingGravity]() {
-      return this.accelerationIncludingGravity;
-    }
-    get [dartx.interval]() {
-      return this.interval;
-    }
-    get [dartx.rotationRate]() {
-      return this.rotationRate;
-    }
-    [dartx.initDeviceMotionEvent](...args) {
-      return this.initDeviceMotionEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DeviceMotionEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
-    fields: () => ({
-      [dartx.acceleration]: html$.DeviceAcceleration,
-      [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
-      [dartx.interval]: core.double,
-      [dartx.rotationRate]: html$.DeviceRotationRate
-    }),
-    methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
-  });
-  dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
-  const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
-  dart.defineExtensionNames([
-    'absolute',
-    'alpha',
-    'beta',
-    'gamma'
-  ]);
-  html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let alpha = opts && 'alpha' in opts ? opts.alpha : 0;
-      let beta = opts && 'beta' in opts ? opts.beta : 0;
-      let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
-      let absolute = opts && 'absolute' in opts ? opts.absolute : false;
-      let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
-      e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
-      return e;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.absolute]() {
-      return this.absolute;
-    }
-    get [dartx.alpha]() {
-      return this.alpha;
-    }
-    get [dartx.beta]() {
-      return this.beta;
-    }
-    get [dartx.gamma]() {
-      return this.gamma;
-    }
-    [_initDeviceOrientationEvent](...args) {
-      return this.initDeviceOrientationEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DeviceOrientationEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
-      _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
-    }),
-    fields: () => ({
-      [dartx.absolute]: core.bool,
-      [dartx.alpha]: core.double,
-      [dartx.beta]: core.double,
-      [dartx.gamma]: core.double
-    }),
-    methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
-  });
-  dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
-  dart.defineExtensionNames([
-    'alpha',
-    'beta',
-    'gamma'
-  ]);
-  html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.alpha]() {
-      return this.alpha;
-    }
-    get [dartx.beta]() {
-      return this.beta;
-    }
-    get [dartx.gamma]() {
-      return this.gamma;
-    }
-  };
-  dart.setSignature(html$.DeviceRotationRate, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
-    fields: () => ({
-      [dartx.alpha]: core.double,
-      [dartx.beta]: core.double,
-      [dartx.gamma]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
-  dart.defineExtensionNames([
-    'close',
-    'show',
-    'showModal',
-    'open',
-    'returnValue'
-  ]);
-  html$.DialogElement = class DialogElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.open] = null;
-      this[dartx.returnValue] = null;
-      super.created();
-    }
-    get [dartx.open]() {
-      return this.open;
-    }
-    set [dartx.open](value) {
-      this.open = value;
-    }
-    get [dartx.returnValue]() {
-      return this.returnValue;
-    }
-    set [dartx.returnValue](value) {
-      this.returnValue = value;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.show](...args) {
-      return this.show.apply(this, args);
-    }
-    [dartx.showModal](...args) {
-      return this.showModal.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.DialogElement, 'created');
-  dart.setSignature(html$.DialogElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DialogElement, []),
-      created: dart.definiteFunctionType(html$.DialogElement, [])
-    }),
-    fields: () => ({
-      [dartx.open]: core.bool,
-      [dartx.returnValue]: core.String
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.show]: dart.definiteFunctionType(dart.void, []),
-      [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
-  const _getDirectory = Symbol('_getDirectory');
-  const _getFile = Symbol('_getFile');
-  const __getDirectory_1 = Symbol('__getDirectory_1');
-  const __getDirectory_2 = Symbol('__getDirectory_2');
-  const __getDirectory_3 = Symbol('__getDirectory_3');
-  const __getDirectory_4 = Symbol('__getDirectory_4');
-  const __getDirectory = Symbol('__getDirectory');
-  const __getFile_1 = Symbol('__getFile_1');
-  const __getFile_2 = Symbol('__getFile_2');
-  const __getFile_3 = Symbol('__getFile_3');
-  const __getFile_4 = Symbol('__getFile_4');
-  const __getFile = Symbol('__getFile');
-  const _removeRecursively = Symbol('_removeRecursively');
-  const _copyTo = Symbol('_copyTo');
-  const _getMetadata = Symbol('_getMetadata');
-  const _getParent = Symbol('_getParent');
-  const _moveTo = Symbol('_moveTo');
-  const _remove$ = Symbol('_remove');
-  dart.defineExtensionNames([
-    'copyTo',
-    'getMetadata',
-    'getParent',
-    'moveTo',
-    'remove',
-    'toUrl',
-    'filesystem',
-    'fullPath',
-    'isDirectory',
-    'isFile',
-    'name'
-  ]);
-  html$.Entry = class Entry extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.filesystem]() {
-      return this.filesystem;
-    }
-    get [dartx.fullPath]() {
-      return this.fullPath;
-    }
-    get [dartx.isDirectory]() {
-      return this.isDirectory;
-    }
-    get [dartx.isFile]() {
-      return this.isFile;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    [_copyTo](...args) {
-      return this.copyTo.apply(this, args);
-    }
-    [dartx.copyTo](parent, opts) {
-      let name = opts && 'name' in opts ? opts.name : null;
-      let completer = CompleterOfEntry().new();
-      this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
-          completer.complete(value);
-        }, EntryToNull()), errorCallback: dart.fn(error => {
-          completer.completeError(error);
-        }, FileErrorToNull())});
-      return completer.future;
-    }
-    [_getMetadata](...args) {
-      return this.getMetadata.apply(this, args);
-    }
-    [dartx.getMetadata]() {
-      let completer = CompleterOfMetadata().new();
-      this[_getMetadata](dart.fn(value => {
-        completer.complete(value);
-      }, MetadataToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [_getParent](...args) {
-      return this.getParent.apply(this, args);
-    }
-    [dartx.getParent]() {
-      let completer = CompleterOfEntry().new();
-      this[_getParent](dart.fn(value => {
-        completer.complete(value);
-      }, EntryToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [_moveTo](...args) {
-      return this.moveTo.apply(this, args);
-    }
-    [dartx.moveTo](parent, opts) {
-      let name = opts && 'name' in opts ? opts.name : null;
-      let completer = CompleterOfEntry().new();
-      this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
-          completer.complete(value);
-        }, EntryToNull()), errorCallback: dart.fn(error => {
-          completer.completeError(error);
-        }, FileErrorToNull())});
-      return completer.future;
-    }
-    [_remove$](...args) {
-      return this.remove.apply(this, args);
-    }
-    [dartx.remove]() {
-      let completer = async.Completer.new();
-      this[_remove$](dart.fn(() => {
-        completer.complete();
-      }, VoidToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [dartx.toUrl](...args) {
-      return this.toURL.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Entry, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
-    fields: () => ({
-      [dartx.filesystem]: html$.FileSystem,
-      [dartx.fullPath]: core.String,
-      [dartx.isDirectory]: core.bool,
-      [dartx.isFile]: core.bool,
-      [dartx.name]: core.String
-    }),
-    methods: () => ({
-      [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
-      [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
-      [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
-      [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
-      [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
-      [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
-      [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
-      [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
-      [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
-      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
-      [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
-    })
-  });
-  dart.registerExtension(dart.global.Entry, html$.Entry);
-  dart.defineExtensionNames([
-    'createDirectory',
-    'getDirectory',
-    'createFile',
-    'getFile',
-    'createReader',
-    'removeRecursively'
-  ]);
-  html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
-    [dartx.createDirectory](path, opts) {
-      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
-      return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
-    }
-    [dartx.getDirectory](path) {
-      return this[_getDirectory](path);
-    }
-    [dartx.createFile](path, opts) {
-      let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
-      return this[_getFile](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
-    }
-    [dartx.getFile](path) {
-      return this[_getFile](path);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.createReader](...args) {
-      return this.createReader.apply(this, args);
-    }
-    [__getDirectory](path, opts) {
-      let options = opts && 'options' in opts ? opts.options : null;
-      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
-      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
-      if (errorCallback != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getDirectory_1](path, options_1, successCallback, errorCallback);
-        return;
-      }
-      if (successCallback != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getDirectory_2](path, options_1, successCallback);
-        return;
-      }
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getDirectory_3](path, options_1);
-        return;
-      }
-      this[__getDirectory_4](path);
-      return;
-    }
-    [__getDirectory_1](...args) {
-      return this.getDirectory.apply(this, args);
-    }
-    [__getDirectory_2](...args) {
-      return this.getDirectory.apply(this, args);
-    }
-    [__getDirectory_3](...args) {
-      return this.getDirectory.apply(this, args);
-    }
-    [__getDirectory_4](...args) {
-      return this.getDirectory.apply(this, args);
-    }
-    [_getDirectory](path, opts) {
-      let options = opts && 'options' in opts ? opts.options : null;
-      let completer = CompleterOfEntry().new();
-      this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
-          completer.complete(value);
-        }, EntryToNull()), errorCallback: dart.fn(error => {
-          completer.completeError(error);
-        }, FileErrorToNull())});
-      return completer.future;
-    }
-    [__getFile](path, opts) {
-      let options = opts && 'options' in opts ? opts.options : null;
-      let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
-      let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
-      if (errorCallback != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getFile_1](path, options_1, successCallback, errorCallback);
-        return;
-      }
-      if (successCallback != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getFile_2](path, options_1, successCallback);
-        return;
-      }
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[__getFile_3](path, options_1);
-        return;
-      }
-      this[__getFile_4](path);
-      return;
-    }
-    [__getFile_1](...args) {
-      return this.getFile.apply(this, args);
-    }
-    [__getFile_2](...args) {
-      return this.getFile.apply(this, args);
-    }
-    [__getFile_3](...args) {
-      return this.getFile.apply(this, args);
-    }
-    [__getFile_4](...args) {
-      return this.getFile.apply(this, args);
-    }
-    [_getFile](path, opts) {
-      let options = opts && 'options' in opts ? opts.options : null;
-      let completer = CompleterOfEntry().new();
-      this[__getFile](path, {options: options, successCallback: dart.fn(value => {
-          completer.complete(value);
-        }, EntryToNull()), errorCallback: dart.fn(error => {
-          completer.completeError(error);
-        }, FileErrorToNull())});
-      return completer.future;
-    }
-    [_removeRecursively](...args) {
-      return this.removeRecursively.apply(this, args);
-    }
-    [dartx.removeRecursively]() {
-      let completer = async.Completer.new();
-      this[_removeRecursively](dart.fn(() => {
-        completer.complete();
-      }, VoidToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-  };
-  dart.setSignature(html$.DirectoryEntry, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
-    methods: () => ({
-      [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
-      [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
-      [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
-      [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
-      [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
-      [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
-      [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
-      [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
-      [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
-      [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
-      [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
-      [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
-      [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
-      [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
-      [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
-  const _readEntries = Symbol('_readEntries');
-  dart.defineExtensionNames([
-    'readEntries'
-  ]);
-  html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_readEntries](...args) {
-      return this.readEntries.apply(this, args);
-    }
-    [dartx.readEntries]() {
-      let completer = CompleterOfListOfEntry().new();
-      this[_readEntries](dart.fn(value => {
-        completer.complete(value);
-      }, ListOfEntryToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-  };
-  dart.setSignature(html$.DirectoryReader, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
-    methods: () => ({
-      [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
-      [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
-    })
-  });
-  dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
-  html$.DivElement = class DivElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.DivElement._check(html$.document[dartx.createElement]("div"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.DivElement, 'created');
-  dart.setSignature(html$.DivElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DivElement, []),
-      new: dart.definiteFunctionType(html$.DivElement, []),
-      created: dart.definiteFunctionType(html$.DivElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
-  const _body = Symbol('_body');
-  const _get_window = Symbol('_get_window');
-  const _head$0 = Symbol('_head');
-  const _lastModified = Symbol('_lastModified');
-  const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
-  const _referrer = Symbol('_referrer');
-  const _selectedStylesheetSet = Symbol('_selectedStylesheetSet');
-  const _styleSheets = Symbol('_styleSheets');
-  const _title = Symbol('_title');
-  const _visibilityState = Symbol('_visibilityState');
-  const _webkitFullscreenElement = Symbol('_webkitFullscreenElement');
-  const _webkitFullscreenEnabled = Symbol('_webkitFullscreenEnabled');
-  const _webkitHidden = Symbol('_webkitHidden');
-  const _webkitVisibilityState = Symbol('_webkitVisibilityState');
-  const _caretRangeFromPoint = Symbol('_caretRangeFromPoint');
-  const _createElement = Symbol('_createElement');
-  const _createElementNS = Symbol('_createElementNS');
-  const _createTouch_1 = Symbol('_createTouch_1');
-  const _createTouch = Symbol('_createTouch');
-  const _createTouchList = Symbol('_createTouchList');
-  const _elementFromPoint = Symbol('_elementFromPoint');
-  const _getCssCanvasContext = Symbol('_getCssCanvasContext');
-  const _webkitExitFullscreen = Symbol('_webkitExitFullscreen');
-  const _createElement_2 = Symbol('_createElement_2');
-  const _createElementNS_2 = Symbol('_createElementNS_2');
-  const _createNodeIterator = Symbol('_createNodeIterator');
-  const _createTreeWalker = Symbol('_createTreeWalker');
-  dart.defineExtensionNames([
-    'window',
-    'adoptNode',
-    'createDocumentFragment',
-    'createRange',
-    'elementsFromPoint',
-    'execCommand',
-    'exitFullscreen',
-    'exitPointerLock',
-    'getElementsByClassName',
-    'getElementsByName',
-    'getElementsByTagName',
-    'importNode',
-    'queryCommandEnabled',
-    'queryCommandIndeterm',
-    'queryCommandState',
-    'queryCommandSupported',
-    'queryCommandValue',
-    'transformDocumentToTreeView',
-    'getElementById',
-    'querySelector',
-    'onAbort',
-    'onBeforeCopy',
-    'onBeforeCut',
-    'onBeforePaste',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onCopy',
-    'onCut',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onPaste',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onPointerLockChange',
-    'onPointerLockError',
-    'onRateChange',
-    'onReadyStateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSearch',
-    'onSecurityPolicyViolation',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onSelectionChange',
-    'onSelectStart',
-    'onStalled',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onTouchCancel',
-    'onTouchEnd',
-    'onTouchMove',
-    'onTouchStart',
-    'onVolumeChange',
-    'onWaiting',
-    'onFullscreenChange',
-    'onFullscreenError',
-    'querySelectorAll',
-    'query',
-    'queryAll',
-    'supportsRegisterElement',
-    'supportsRegister',
-    'createElement',
-    'createElementNS',
-    'visibilityState',
-    'activeElement',
-    'contentType',
-    'cookie',
-    'currentScript',
-    'documentElement',
-    'domain',
-    'fonts',
-    'fullscreenElement',
-    'fullscreenEnabled',
-    'hidden',
-    'implementation',
-    'origin',
-    'pointerLockElement',
-    'readyState',
-    'rootElement',
-    'scrollingElement',
-    'timeline'
-  ]);
-  html$.Document = class Document extends html$.Node {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.activeElement]() {
-      return this.activeElement;
-    }
-    get [_body]() {
-      return this.body;
-    }
-    set [_body](value) {
-      this.body = value;
-    }
-    get [dartx.contentType]() {
-      return this.contentType;
-    }
-    get [dartx.cookie]() {
-      return this.cookie;
-    }
-    set [dartx.cookie](value) {
-      this.cookie = value;
-    }
-    get [dartx.currentScript]() {
-      return this.currentScript;
-    }
-    get [dartx.window]() {
-      return html$._convertNativeToDart_Window(this[_get_window]);
-    }
-    get [_get_window]() {
-      return this.defaultView;
-    }
-    get [dartx.documentElement]() {
-      return this.documentElement;
-    }
-    get [dartx.domain]() {
-      return this.domain;
-    }
-    get [dartx.fonts]() {
-      return this.fonts;
-    }
-    get [dartx.fullscreenElement]() {
-      return this.fullscreenElement;
-    }
-    get [dartx.fullscreenEnabled]() {
-      return this.fullscreenEnabled;
-    }
-    get [_head$0]() {
-      return this.head;
-    }
-    get [dartx.hidden]() {
-      return this.hidden;
-    }
-    get [dartx.implementation]() {
-      return this.implementation;
-    }
-    get [_lastModified]() {
-      return this.lastModified;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.pointerLockElement]() {
-      return this.pointerLockElement;
-    }
-    get [_preferredStylesheetSet]() {
-      return this.preferredStylesheetSet;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [_referrer]() {
-      return this.referrer;
-    }
-    get [dartx.rootElement]() {
-      return this.rootElement;
-    }
-    get [dartx.scrollingElement]() {
-      return this.scrollingElement;
-    }
-    get [_selectedStylesheetSet]() {
-      return this.selectedStylesheetSet;
-    }
-    set [_selectedStylesheetSet](value) {
-      this.selectedStylesheetSet = value;
-    }
-    get [_styleSheets]() {
-      return this.styleSheets;
-    }
-    get [dartx.timeline]() {
-      return this.timeline;
-    }
-    get [_title]() {
-      return this.title;
-    }
-    set [_title](value) {
-      this.title = value;
-    }
-    get [_visibilityState]() {
-      return this.visibilityState;
-    }
-    get [_webkitFullscreenElement]() {
-      return this.webkitFullscreenElement;
-    }
-    get [_webkitFullscreenEnabled]() {
-      return this.webkitFullscreenEnabled;
-    }
-    get [_webkitHidden]() {
-      return this.webkitHidden;
-    }
-    get [_webkitVisibilityState]() {
-      return this.webkitVisibilityState;
-    }
-    [dartx.adoptNode](...args) {
-      return this.adoptNode.apply(this, args);
-    }
-    [_caretRangeFromPoint](...args) {
-      return this.caretRangeFromPoint.apply(this, args);
-    }
-    [dartx.createDocumentFragment](...args) {
-      return this.createDocumentFragment.apply(this, args);
-    }
-    [_createElement](...args) {
-      return this.createElement.apply(this, args);
-    }
-    [_createElementNS](...args) {
-      return this.createElementNS.apply(this, args);
-    }
-    [_createEvent](...args) {
-      return this.createEvent.apply(this, args);
-    }
-    [dartx.createRange](...args) {
-      return this.createRange.apply(this, args);
-    }
-    [_createTextNode](...args) {
-      return this.createTextNode.apply(this, args);
-    }
-    [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
-      let target_1 = html$._convertDartToNative_EventTarget(target);
-      return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
-    }
-    [_createTouch_1](...args) {
-      return this.createTouch.apply(this, args);
-    }
-    [_createTouchList](...args) {
-      return this.createTouchList.apply(this, args);
-    }
-    [_elementFromPoint](...args) {
-      return this.elementFromPoint.apply(this, args);
-    }
-    [dartx.elementsFromPoint](...args) {
-      return this.elementsFromPoint.apply(this, args);
-    }
-    [dartx.execCommand](...args) {
-      return this.execCommand.apply(this, args);
-    }
-    [dartx.exitFullscreen](...args) {
-      return this.exitFullscreen.apply(this, args);
-    }
-    [dartx.exitPointerLock](...args) {
-      return this.exitPointerLock.apply(this, args);
-    }
-    [_getCssCanvasContext](...args) {
-      return this.getCSSCanvasContext.apply(this, args);
-    }
-    [dartx.getElementsByClassName](...args) {
-      return this.getElementsByClassName.apply(this, args);
-    }
-    [dartx.getElementsByName](...args) {
-      return this.getElementsByName.apply(this, args);
-    }
-    [dartx.getElementsByTagName](...args) {
-      return this.getElementsByTagName.apply(this, args);
-    }
-    [dartx.importNode](...args) {
-      return this.importNode.apply(this, args);
-    }
-    [dartx.queryCommandEnabled](...args) {
-      return this.queryCommandEnabled.apply(this, args);
-    }
-    [dartx.queryCommandIndeterm](...args) {
-      return this.queryCommandIndeterm.apply(this, args);
-    }
-    [dartx.queryCommandState](...args) {
-      return this.queryCommandState.apply(this, args);
-    }
-    [dartx.queryCommandSupported](...args) {
-      return this.queryCommandSupported.apply(this, args);
-    }
-    [dartx.queryCommandValue](...args) {
-      return this.queryCommandValue.apply(this, args);
-    }
-    [dartx.transformDocumentToTreeView](...args) {
-      return this.transformDocumentToTreeView.apply(this, args);
-    }
-    [_webkitExitFullscreen](...args) {
-      return this.webkitExitFullscreen.apply(this, args);
-    }
-    [dartx.getElementById](...args) {
-      return this.getElementById.apply(this, args);
-    }
-    get [_childElementCount]() {
-      return this.childElementCount;
-    }
-    get [_children]() {
-      return this.children;
-    }
-    get [_firstElementChild]() {
-      return this.firstElementChild;
-    }
-    get [_lastElementChild]() {
-      return this.lastElementChild;
-    }
-    [dartx.querySelector](...args) {
-      return this.querySelector.apply(this, args);
-    }
-    [_querySelectorAll](...args) {
-      return this.querySelectorAll.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return html$.Element.abortEvent.forTarget(this);
-    }
-    get [dartx.onBeforeCopy]() {
-      return html$.Element.beforeCopyEvent.forTarget(this);
-    }
-    get [dartx.onBeforeCut]() {
-      return html$.Element.beforeCutEvent.forTarget(this);
-    }
-    get [dartx.onBeforePaste]() {
-      return html$.Element.beforePasteEvent.forTarget(this);
-    }
-    get [dartx.onBlur]() {
-      return html$.Element.blurEvent.forTarget(this);
-    }
-    get [dartx.onCanPlay]() {
-      return html$.Element.canPlayEvent.forTarget(this);
-    }
-    get [dartx.onCanPlayThrough]() {
-      return html$.Element.canPlayThroughEvent.forTarget(this);
-    }
-    get [dartx.onChange]() {
-      return html$.Element.changeEvent.forTarget(this);
-    }
-    get [dartx.onClick]() {
-      return html$.Element.clickEvent.forTarget(this);
-    }
-    get [dartx.onContextMenu]() {
-      return html$.Element.contextMenuEvent.forTarget(this);
-    }
-    get [dartx.onCopy]() {
-      return html$.Element.copyEvent.forTarget(this);
-    }
-    get [dartx.onCut]() {
-      return html$.Element.cutEvent.forTarget(this);
-    }
-    get [dartx.onDoubleClick]() {
-      return html$.Element.doubleClickEvent.forTarget(this);
-    }
-    get [dartx.onDrag]() {
-      return html$.Element.dragEvent.forTarget(this);
-    }
-    get [dartx.onDragEnd]() {
-      return html$.Element.dragEndEvent.forTarget(this);
-    }
-    get [dartx.onDragEnter]() {
-      return html$.Element.dragEnterEvent.forTarget(this);
-    }
-    get [dartx.onDragLeave]() {
-      return html$.Element.dragLeaveEvent.forTarget(this);
-    }
-    get [dartx.onDragOver]() {
-      return html$.Element.dragOverEvent.forTarget(this);
-    }
-    get [dartx.onDragStart]() {
-      return html$.Element.dragStartEvent.forTarget(this);
-    }
-    get [dartx.onDrop]() {
-      return html$.Element.dropEvent.forTarget(this);
-    }
-    get [dartx.onDurationChange]() {
-      return html$.Element.durationChangeEvent.forTarget(this);
-    }
-    get [dartx.onEmptied]() {
-      return html$.Element.emptiedEvent.forTarget(this);
-    }
-    get [dartx.onEnded]() {
-      return html$.Element.endedEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.Element.errorEvent.forTarget(this);
-    }
-    get [dartx.onFocus]() {
-      return html$.Element.focusEvent.forTarget(this);
-    }
-    get [dartx.onInput]() {
-      return html$.Element.inputEvent.forTarget(this);
-    }
-    get [dartx.onInvalid]() {
-      return html$.Element.invalidEvent.forTarget(this);
-    }
-    get [dartx.onKeyDown]() {
-      return html$.Element.keyDownEvent.forTarget(this);
-    }
-    get [dartx.onKeyPress]() {
-      return html$.Element.keyPressEvent.forTarget(this);
-    }
-    get [dartx.onKeyUp]() {
-      return html$.Element.keyUpEvent.forTarget(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.Element.loadEvent.forTarget(this);
-    }
-    get [dartx.onLoadedData]() {
-      return html$.Element.loadedDataEvent.forTarget(this);
-    }
-    get [dartx.onLoadedMetadata]() {
-      return html$.Element.loadedMetadataEvent.forTarget(this);
-    }
-    get [dartx.onMouseDown]() {
-      return html$.Element.mouseDownEvent.forTarget(this);
-    }
-    get [dartx.onMouseEnter]() {
-      return html$.Element.mouseEnterEvent.forTarget(this);
-    }
-    get [dartx.onMouseLeave]() {
-      return html$.Element.mouseLeaveEvent.forTarget(this);
-    }
-    get [dartx.onMouseMove]() {
-      return html$.Element.mouseMoveEvent.forTarget(this);
-    }
-    get [dartx.onMouseOut]() {
-      return html$.Element.mouseOutEvent.forTarget(this);
-    }
-    get [dartx.onMouseOver]() {
-      return html$.Element.mouseOverEvent.forTarget(this);
-    }
-    get [dartx.onMouseUp]() {
-      return html$.Element.mouseUpEvent.forTarget(this);
-    }
-    get [dartx.onMouseWheel]() {
-      return html$.Element.mouseWheelEvent.forTarget(this);
-    }
-    get [dartx.onPaste]() {
-      return html$.Element.pasteEvent.forTarget(this);
-    }
-    get [dartx.onPause]() {
-      return html$.Element.pauseEvent.forTarget(this);
-    }
-    get [dartx.onPlay]() {
-      return html$.Element.playEvent.forTarget(this);
-    }
-    get [dartx.onPlaying]() {
-      return html$.Element.playingEvent.forTarget(this);
-    }
-    get [dartx.onPointerLockChange]() {
-      return html$.Document.pointerLockChangeEvent.forTarget(this);
-    }
-    get [dartx.onPointerLockError]() {
-      return html$.Document.pointerLockErrorEvent.forTarget(this);
-    }
-    get [dartx.onRateChange]() {
-      return html$.Element.rateChangeEvent.forTarget(this);
-    }
-    get [dartx.onReadyStateChange]() {
-      return html$.Document.readyStateChangeEvent.forTarget(this);
-    }
-    get [dartx.onReset]() {
-      return html$.Element.resetEvent.forTarget(this);
-    }
-    get [dartx.onResize]() {
-      return html$.Element.resizeEvent.forTarget(this);
-    }
-    get [dartx.onScroll]() {
-      return html$.Element.scrollEvent.forTarget(this);
-    }
-    get [dartx.onSearch]() {
-      return html$.Element.searchEvent.forTarget(this);
-    }
-    get [dartx.onSecurityPolicyViolation]() {
-      return html$.Document.securityPolicyViolationEvent.forTarget(this);
-    }
-    get [dartx.onSeeked]() {
-      return html$.Element.seekedEvent.forTarget(this);
-    }
-    get [dartx.onSeeking]() {
-      return html$.Element.seekingEvent.forTarget(this);
-    }
-    get [dartx.onSelect]() {
-      return html$.Element.selectEvent.forTarget(this);
-    }
-    get [dartx.onSelectionChange]() {
-      return html$.Document.selectionChangeEvent.forTarget(this);
-    }
-    get [dartx.onSelectStart]() {
-      return html$.Element.selectStartEvent.forTarget(this);
-    }
-    get [dartx.onStalled]() {
-      return html$.Element.stalledEvent.forTarget(this);
-    }
-    get [dartx.onSubmit]() {
-      return html$.Element.submitEvent.forTarget(this);
-    }
-    get [dartx.onSuspend]() {
-      return html$.Element.suspendEvent.forTarget(this);
-    }
-    get [dartx.onTimeUpdate]() {
-      return html$.Element.timeUpdateEvent.forTarget(this);
-    }
-    get [dartx.onTouchCancel]() {
-      return html$.Element.touchCancelEvent.forTarget(this);
-    }
-    get [dartx.onTouchEnd]() {
-      return html$.Element.touchEndEvent.forTarget(this);
-    }
-    get [dartx.onTouchMove]() {
-      return html$.Element.touchMoveEvent.forTarget(this);
-    }
-    get [dartx.onTouchStart]() {
-      return html$.Element.touchStartEvent.forTarget(this);
-    }
-    get [dartx.onVolumeChange]() {
-      return html$.Element.volumeChangeEvent.forTarget(this);
-    }
-    get [dartx.onWaiting]() {
-      return html$.Element.waitingEvent.forTarget(this);
-    }
-    get [dartx.onFullscreenChange]() {
-      return html$.Element.fullscreenChangeEvent.forTarget(this);
-    }
-    get [dartx.onFullscreenError]() {
-      return html$.Element.fullscreenErrorEvent.forTarget(this);
-    }
-    [dartx.querySelectorAll](T) {
-      return selectors => {
-        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
-      };
-    }
-    [dartx.query](relativeSelectors) {
-      return this[dartx.querySelector](relativeSelectors);
-    }
-    [dartx.queryAll](T) {
-      return relativeSelectors => {
-        return this[dartx.querySelectorAll](T)(relativeSelectors);
-      };
-    }
-    get [dartx.supportsRegisterElement]() {
-      return "registerElement" in this;
-    }
-    get [dartx.supportsRegister]() {
-      return this[dartx.supportsRegisterElement];
-    }
-    [dartx.createElement](tagName, typeExtension) {
-      if (typeExtension === void 0) typeExtension = null;
-      return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
-    }
-    [_createElement_2](tagName) {
-      return this.createElement(tagName);
-    }
-    [_createElementNS_2](namespaceURI, qualifiedName) {
-      return this.createElementNS(namespaceURI, qualifiedName);
-    }
-    [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
-      if (typeExtension === void 0) typeExtension = null;
-      return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
-    }
-    [_createNodeIterator](root, whatToShow, filter) {
-      if (whatToShow === void 0) whatToShow = null;
-      if (filter === void 0) filter = null;
-      return this.createNodeIterator(root, whatToShow, filter, false);
-    }
-    [_createTreeWalker](root, whatToShow, filter) {
-      if (whatToShow === void 0) whatToShow = null;
-      if (filter === void 0) filter = null;
-      return this.createTreeWalker(root, whatToShow, filter, false);
-    }
-    get [dartx.visibilityState]() {
-      return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
-    }
-  };
-  dart.setSignature(html$.Document, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
-    fields: () => ({
-      [dartx.activeElement]: html$.Element,
-      [_body]: html$.HtmlElement,
-      [dartx.contentType]: core.String,
-      [dartx.cookie]: core.String,
-      [dartx.currentScript]: html$.ScriptElement,
-      [_get_window]: dart.dynamic,
-      [dartx.documentElement]: html$.Element,
-      [dartx.domain]: core.String,
-      [dartx.fonts]: html$.FontFaceSet,
-      [dartx.fullscreenElement]: html$.Element,
-      [dartx.fullscreenEnabled]: core.bool,
-      [_head$0]: html$.HeadElement,
-      [dartx.hidden]: core.bool,
-      [dartx.implementation]: html$.DomImplementation,
-      [_lastModified]: core.String,
-      [dartx.origin]: core.String,
-      [dartx.pointerLockElement]: html$.Element,
-      [_preferredStylesheetSet]: core.String,
-      [dartx.readyState]: core.String,
-      [_referrer]: core.String,
-      [dartx.rootElement]: svg$.SvgSvgElement,
-      [dartx.scrollingElement]: html$.Element,
-      [_selectedStylesheetSet]: core.String,
-      [_styleSheets]: ListOfStyleSheet(),
-      [dartx.timeline]: html$.AnimationTimeline,
-      [_title]: core.String,
-      [_visibilityState]: core.String,
-      [_webkitFullscreenElement]: html$.Element,
-      [_webkitFullscreenEnabled]: core.bool,
-      [_webkitHidden]: core.bool,
-      [_webkitVisibilityState]: core.String,
-      [_childElementCount]: core.int,
-      [_children]: ListOfNode(),
-      [_firstElementChild]: html$.Element,
-      [_lastElementChild]: html$.Element
-    }),
-    getters: () => ({
-      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
-      [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
-      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
-      [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
-      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
-      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
-      [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
-      [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
-    }),
-    methods: () => ({
-      [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
-      [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
-      [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
-      [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
-      [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
-      [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
-      [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
-      [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
-      [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
-      [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
-      [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
-      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
-      [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
-      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
-      [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
-      [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
-      [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
-      [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.queryCommandSupported]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
-      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
-      [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-      [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
-      [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
-      [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
-    }),
-    sfields: () => ({
-      pointerLockChangeEvent: EventStreamProviderOfEvent(),
-      pointerLockErrorEvent: EventStreamProviderOfEvent(),
-      readyStateChangeEvent: EventStreamProviderOfEvent(),
-      securityPolicyViolationEvent: EventStreamProviderOfSecurityPolicyViolationEvent(),
-      selectionChangeEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(html$.Document, {
-    get pointerLockChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
-    },
-    get pointerLockErrorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pointerlockerror'));
-    },
-    get readyStateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('readystatechange'));
-    },
-    get securityPolicyViolationEvent() {
-      return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent())('securitypolicyviolation'));
-    },
-    get selectionChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
-    }
-  });
-  dart.registerExtension(dart.global.Document, html$.Document);
-  const _docChildren = Symbol('_docChildren');
-  dart.defineExtensionNames([
-    'children',
-    'children',
-    'querySelectorAll',
-    'innerHtml',
-    'innerHtml',
-    'setInnerHtml',
-    'appendText',
-    'appendHtml',
-    'query',
-    'queryAll',
-    'getElementById',
-    'querySelector'
-  ]);
-  html$.DocumentFragment = class DocumentFragment extends html$.Node {
-    static new() {
-      return html$.document[dartx.createDocumentFragment]();
-    }
-    static html(html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-    }
-    static svg(svgContent, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
-    }
-    get [_children]() {
-      return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
-    }
-    get [_docChildren]() {
-      return this._docChildren;
-    }
-    set [_docChildren](value) {
-      this._docChildren = value;
-    }
-    get [dartx.children]() {
-      if (this[_docChildren] == null) {
-        this[_docChildren] = new html_common.FilteredElementList(this);
-      }
-      return this[_docChildren];
-    }
-    set [dartx.children](value) {
-      let copy = value[dartx.toList]();
-      let children = this[dartx.children];
-      children[dartx.clear]();
-      children[dartx.addAll](copy);
-    }
-    [dartx.querySelectorAll](T) {
-      return selectors => {
-        return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
-      };
-    }
-    get [dartx.innerHtml]() {
-      let e = html$.Element.tag("div");
-      e[dartx.append](this[dartx.clone](true));
-      return e[dartx.innerHtml];
-    }
-    set [dartx.innerHtml](value) {
-      this[dartx.setInnerHtml](value);
-    }
-    [dartx.setInnerHtml](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      this[dartx.nodes][dartx.clear]();
-      this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
-    }
-    [dartx.appendText](text) {
-      this[dartx.append](html$.Text.new(text));
-    }
-    [dartx.appendHtml](text, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
-    }
-    [dartx.query](relativeSelectors) {
-      return this[dartx.querySelector](relativeSelectors);
-    }
-    [dartx.queryAll](T) {
-      return relativeSelectors => {
-        return this[dartx.querySelectorAll](T)(relativeSelectors);
-      };
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getElementById](...args) {
-      return this.getElementById.apply(this, args);
-    }
-    get [_childElementCount]() {
-      return this.childElementCount;
-    }
-    get [_firstElementChild]() {
-      return this.firstElementChild;
-    }
-    get [_lastElementChild]() {
-      return this.lastElementChild;
-    }
-    [dartx.querySelector](...args) {
-      return this.querySelector.apply(this, args);
-    }
-    [_querySelectorAll](...args) {
-      return this.querySelectorAll.apply(this, args);
-    }
-  };
-  html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
-  dart.setSignature(html$.DocumentFragment, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.DocumentFragment, []),
-      html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      _: dart.definiteFunctionType(html$.DocumentFragment, [])
-    }),
-    fields: () => ({
-      [_docChildren]: ListOfElement(),
-      [_childElementCount]: core.int,
-      [_firstElementChild]: html$.Element,
-      [_lastElementChild]: html$.Element
-    }),
-    getters: () => ({
-      [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
-      [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
-      [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
-    }),
-    setters: () => ({
-      [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
-      [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    methods: () => ({
-      [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
-      [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
-      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
-  dart.defineExtensionNames([
-    'message',
-    'name'
-  ]);
-  html$.DomError = class DomError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(name, message) {
-      if (message === void 0) message = null;
-      if (message != null) {
-        return html$.DomError._create_1(name, message);
-      }
-      return html$.DomError._create_2(name);
-    }
-    static _create_1(name, message) {
-      return new DOMError(name, message);
-    }
-    static _create_2(name) {
-      return new DOMError(name);
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-  };
-  dart.setSignature(html$.DomError, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomError, []),
-      new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
-    }),
-    fields: () => ({
-      [dartx.message]: core.String,
-      [dartx.name]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.DOMError, html$.DomError);
-  dart.defineExtensionNames([
-    'name',
-    'toString',
-    'message'
-  ]);
-  html$.DomException = class DomException extends _interceptors.Interceptor {
-    get [dartx.name]() {
-      let errorName = this.name;
-      if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
-      if (dart.test(html_common.Device.isWebKit) && errorName == 'SYNTAX_ERR') return 'SyntaxError';
-      return errorName;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-  };
-  dart.setSignature(html$.DomException, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
-    fields: () => ({[dartx.message]: core.String}),
-    getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
-    sfields: () => ({
-      INDEX_SIZE: core.String,
-      HIERARCHY_REQUEST: core.String,
-      WRONG_DOCUMENT: core.String,
-      INVALID_CHARACTER: core.String,
-      NO_MODIFICATION_ALLOWED: core.String,
-      NOT_FOUND: core.String,
-      NOT_SUPPORTED: core.String,
-      INVALID_STATE: core.String,
-      SYNTAX: core.String,
-      INVALID_MODIFICATION: core.String,
-      NAMESPACE: core.String,
-      INVALID_ACCESS: core.String,
-      TYPE_MISMATCH: core.String,
-      SECURITY: core.String,
-      NETWORK: core.String,
-      ABORT: core.String,
-      URL_MISMATCH: core.String,
-      QUOTA_EXCEEDED: core.String,
-      TIMEOUT: core.String,
-      INVALID_NODE_TYPE: core.String,
-      DATA_CLONE: core.String
-    })
-  });
-  html$.DomException.INDEX_SIZE = 'IndexSizeError';
-  html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
-  html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
-  html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
-  html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
-  html$.DomException.NOT_FOUND = 'NotFoundError';
-  html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
-  html$.DomException.INVALID_STATE = 'InvalidStateError';
-  html$.DomException.SYNTAX = 'SyntaxError';
-  html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
-  html$.DomException.NAMESPACE = 'NamespaceError';
-  html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
-  html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
-  html$.DomException.SECURITY = 'SecurityError';
-  html$.DomException.NETWORK = 'NetworkError';
-  html$.DomException.ABORT = 'AbortError';
-  html$.DomException.URL_MISMATCH = 'URLMismatchError';
-  html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
-  html$.DomException.TIMEOUT = 'TimeoutError';
-  html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
-  html$.DomException.DATA_CLONE = 'DataCloneError';
-  dart.registerExtension(dart.global.DOMException, html$.DomException);
-  dart.defineExtensionNames([
-    'createDocument',
-    'createDocumentType',
-    'createHtmlDocument',
-    'hasFeature'
-  ]);
-  html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.createDocument](...args) {
-      return this.createDocument.apply(this, args);
-    }
-    [dartx.createDocumentType](...args) {
-      return this.createDocumentType.apply(this, args);
-    }
-    [dartx.createHtmlDocument](...args) {
-      return this.createHTMLDocument.apply(this, args);
-    }
-    [dartx.hasFeature](...args) {
-      return this.hasFeature.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomImplementation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
-    methods: () => ({
-      [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
-      [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
-      [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
-      [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
-    })
-  });
-  dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
-  dart.defineExtensionNames([
-    'next'
-  ]);
-  html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.next](...args) {
-      return this.next.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomIterator, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
-    methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
-  });
-  dart.registerExtension(dart.global.Iterator, html$.DomIterator);
-  dart.defineExtensionNames([
-    'a',
-    'b',
-    'c',
-    'd',
-    'e',
-    'f',
-    'is2D',
-    'isIdentity',
-    'm11',
-    'm12',
-    'm13',
-    'm14',
-    'm21',
-    'm22',
-    'm23',
-    'm24',
-    'm31',
-    'm32',
-    'm33',
-    'm34',
-    'm41',
-    'm42',
-    'm43',
-    'm44',
-    'multiply',
-    'scale',
-    'scale3d',
-    'scaleNonUniform',
-    'toFloat32Array',
-    'toFloat64Array',
-    'translate'
-  ]);
-  html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.a]() {
-      return this.a;
-    }
-    get [dartx.b]() {
-      return this.b;
-    }
-    get [dartx.c]() {
-      return this.c;
-    }
-    get [dartx.d]() {
-      return this.d;
-    }
-    get [dartx.e]() {
-      return this.e;
-    }
-    get [dartx.f]() {
-      return this.f;
-    }
-    get [dartx.is2D]() {
-      return this.is2D;
-    }
-    get [dartx.isIdentity]() {
-      return this.isIdentity;
-    }
-    get [dartx.m11]() {
-      return this.m11;
-    }
-    get [dartx.m12]() {
-      return this.m12;
-    }
-    get [dartx.m13]() {
-      return this.m13;
-    }
-    get [dartx.m14]() {
-      return this.m14;
-    }
-    get [dartx.m21]() {
-      return this.m21;
-    }
-    get [dartx.m22]() {
-      return this.m22;
-    }
-    get [dartx.m23]() {
-      return this.m23;
-    }
-    get [dartx.m24]() {
-      return this.m24;
-    }
-    get [dartx.m31]() {
-      return this.m31;
-    }
-    get [dartx.m32]() {
-      return this.m32;
-    }
-    get [dartx.m33]() {
-      return this.m33;
-    }
-    get [dartx.m34]() {
-      return this.m34;
-    }
-    get [dartx.m41]() {
-      return this.m41;
-    }
-    get [dartx.m42]() {
-      return this.m42;
-    }
-    get [dartx.m43]() {
-      return this.m43;
-    }
-    get [dartx.m44]() {
-      return this.m44;
-    }
-    [dartx.multiply](...args) {
-      return this.multiply.apply(this, args);
-    }
-    [dartx.scale](...args) {
-      return this.scale.apply(this, args);
-    }
-    [dartx.scale3d](...args) {
-      return this.scale3d.apply(this, args);
-    }
-    [dartx.scaleNonUniform](...args) {
-      return this.scaleNonUniform.apply(this, args);
-    }
-    [dartx.toFloat32Array](...args) {
-      return this.toFloat32Array.apply(this, args);
-    }
-    [dartx.toFloat64Array](...args) {
-      return this.toFloat64Array.apply(this, args);
-    }
-    [dartx.translate](...args) {
-      return this.translate.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomMatrixReadOnly, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
-    getters: () => ({
-      [dartx.a]: dart.definiteFunctionType(core.num, []),
-      [dartx.b]: dart.definiteFunctionType(core.num, []),
-      [dartx.c]: dart.definiteFunctionType(core.num, []),
-      [dartx.d]: dart.definiteFunctionType(core.num, []),
-      [dartx.e]: dart.definiteFunctionType(core.num, []),
-      [dartx.f]: dart.definiteFunctionType(core.num, []),
-      [dartx.is2D]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isIdentity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.m11]: dart.definiteFunctionType(core.num, []),
-      [dartx.m12]: dart.definiteFunctionType(core.num, []),
-      [dartx.m13]: dart.definiteFunctionType(core.num, []),
-      [dartx.m14]: dart.definiteFunctionType(core.num, []),
-      [dartx.m21]: dart.definiteFunctionType(core.num, []),
-      [dartx.m22]: dart.definiteFunctionType(core.num, []),
-      [dartx.m23]: dart.definiteFunctionType(core.num, []),
-      [dartx.m24]: dart.definiteFunctionType(core.num, []),
-      [dartx.m31]: dart.definiteFunctionType(core.num, []),
-      [dartx.m32]: dart.definiteFunctionType(core.num, []),
-      [dartx.m33]: dart.definiteFunctionType(core.num, []),
-      [dartx.m34]: dart.definiteFunctionType(core.num, []),
-      [dartx.m41]: dart.definiteFunctionType(core.num, []),
-      [dartx.m42]: dart.definiteFunctionType(core.num, []),
-      [dartx.m43]: dart.definiteFunctionType(core.num, []),
-      [dartx.m44]: dart.definiteFunctionType(core.num, [])
-    }),
-    methods: () => ({
-      [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
-      [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
-      [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
-      [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
-      [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
-      [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
-      [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
-    })
-  });
-  dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
-  dart.defineExtensionNames([
-    'a',
-    'a',
-    'b',
-    'b',
-    'c',
-    'c',
-    'd',
-    'd',
-    'e',
-    'e',
-    'f',
-    'f',
-    'm11',
-    'm11',
-    'm12',
-    'm12',
-    'm13',
-    'm13',
-    'm14',
-    'm14',
-    'm21',
-    'm21',
-    'm22',
-    'm22',
-    'm23',
-    'm23',
-    'm24',
-    'm24',
-    'm31',
-    'm31',
-    'm32',
-    'm32',
-    'm33',
-    'm33',
-    'm34',
-    'm34',
-    'm41',
-    'm41',
-    'm42',
-    'm42',
-    'm43',
-    'm43',
-    'm44',
-    'm44',
-    'multiplySelf',
-    'preMultiplySelf',
-    'scale3dSelf',
-    'scaleNonUniformSelf',
-    'scaleSelf',
-    'translateSelf'
-  ]);
-  html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(other) {
-      if (other === void 0) other = null;
-      if (other == null) {
-        return html$.DomMatrix._create_1();
-      }
-      if (html$.DomMatrixReadOnly.is(other) || other == null) {
-        return html$.DomMatrix._create_2(other);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1() {
-      return new DOMMatrix();
-    }
-    static _create_2(other) {
-      return new DOMMatrix(other);
-    }
-    get [dartx.a]() {
-      return this.a;
-    }
-    set [dartx.a](value) {
-      this.a = value;
-    }
-    get [dartx.b]() {
-      return this.b;
-    }
-    set [dartx.b](value) {
-      this.b = value;
-    }
-    get [dartx.c]() {
-      return this.c;
-    }
-    set [dartx.c](value) {
-      this.c = value;
-    }
-    get [dartx.d]() {
-      return this.d;
-    }
-    set [dartx.d](value) {
-      this.d = value;
-    }
-    get [dartx.e]() {
-      return this.e;
-    }
-    set [dartx.e](value) {
-      this.e = value;
-    }
-    get [dartx.f]() {
-      return this.f;
-    }
-    set [dartx.f](value) {
-      this.f = value;
-    }
-    get [dartx.m11]() {
-      return this.m11;
-    }
-    set [dartx.m11](value) {
-      this.m11 = value;
-    }
-    get [dartx.m12]() {
-      return this.m12;
-    }
-    set [dartx.m12](value) {
-      this.m12 = value;
-    }
-    get [dartx.m13]() {
-      return this.m13;
-    }
-    set [dartx.m13](value) {
-      this.m13 = value;
-    }
-    get [dartx.m14]() {
-      return this.m14;
-    }
-    set [dartx.m14](value) {
-      this.m14 = value;
-    }
-    get [dartx.m21]() {
-      return this.m21;
-    }
-    set [dartx.m21](value) {
-      this.m21 = value;
-    }
-    get [dartx.m22]() {
-      return this.m22;
-    }
-    set [dartx.m22](value) {
-      this.m22 = value;
-    }
-    get [dartx.m23]() {
-      return this.m23;
-    }
-    set [dartx.m23](value) {
-      this.m23 = value;
-    }
-    get [dartx.m24]() {
-      return this.m24;
-    }
-    set [dartx.m24](value) {
-      this.m24 = value;
-    }
-    get [dartx.m31]() {
-      return this.m31;
-    }
-    set [dartx.m31](value) {
-      this.m31 = value;
-    }
-    get [dartx.m32]() {
-      return this.m32;
-    }
-    set [dartx.m32](value) {
-      this.m32 = value;
-    }
-    get [dartx.m33]() {
-      return this.m33;
-    }
-    set [dartx.m33](value) {
-      this.m33 = value;
-    }
-    get [dartx.m34]() {
-      return this.m34;
-    }
-    set [dartx.m34](value) {
-      this.m34 = value;
-    }
-    get [dartx.m41]() {
-      return this.m41;
-    }
-    set [dartx.m41](value) {
-      this.m41 = value;
-    }
-    get [dartx.m42]() {
-      return this.m42;
-    }
-    set [dartx.m42](value) {
-      this.m42 = value;
-    }
-    get [dartx.m43]() {
-      return this.m43;
-    }
-    set [dartx.m43](value) {
-      this.m43 = value;
-    }
-    get [dartx.m44]() {
-      return this.m44;
-    }
-    set [dartx.m44](value) {
-      this.m44 = value;
-    }
-    [dartx.multiplySelf](...args) {
-      return this.multiplySelf.apply(this, args);
-    }
-    [dartx.preMultiplySelf](...args) {
-      return this.preMultiplySelf.apply(this, args);
-    }
-    [dartx.scale3dSelf](...args) {
-      return this.scale3dSelf.apply(this, args);
-    }
-    [dartx.scaleNonUniformSelf](...args) {
-      return this.scaleNonUniformSelf.apply(this, args);
-    }
-    [dartx.scaleSelf](...args) {
-      return this.scaleSelf.apply(this, args);
-    }
-    [dartx.translateSelf](...args) {
-      return this.translateSelf.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomMatrix, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomMatrix, []),
-      new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
-    }),
-    setters: () => ({
-      [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.b]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.c]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.d]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.e]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.f]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m11]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m12]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m13]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m14]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m21]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m22]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m23]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m24]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m31]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m32]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m33]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m34]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m41]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m42]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m43]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
-    }),
-    methods: () => ({
-      [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
-      [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
-      [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
-      [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
-      [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
-      [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
-      _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
-  dart.defineExtensionNames([
-    'parseFromString'
-  ]);
-  html$.DomParser = class DomParser extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.DomParser._create_1();
-    }
-    static _create_1() {
-      return new DOMParser();
-    }
-    [dartx.parseFromString](...args) {
-      return this.parseFromString.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomParser, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomParser, []),
-      new: dart.definiteFunctionType(html$.DomParser, [])
-    }),
-    methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.DOMParser, html$.DomParser);
-  dart.defineExtensionNames([
-    'w',
-    'x',
-    'y',
-    'z'
-  ]);
-  html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(x, y, z, w) {
-      return html$.DomPointReadOnly._create_1(x, y, z, w);
-    }
-    static _create_1(x, y, z, w) {
-      return new DOMPointReadOnly(x, y, z, w);
-    }
-    get [dartx.w]() {
-      return this.w;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.z]() {
-      return this.z;
-    }
-  };
-  dart.setSignature(html$.DomPointReadOnly, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
-      new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
-    }),
-    getters: () => ({
-      [dartx.w]: dart.definiteFunctionType(core.num, []),
-      [dartx.x]: dart.definiteFunctionType(core.num, []),
-      [dartx.y]: dart.definiteFunctionType(core.num, []),
-      [dartx.z]: dart.definiteFunctionType(core.num, [])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
-  dart.defineExtensionNames([
-    'w',
-    'w',
-    'x',
-    'x',
-    'y',
-    'y',
-    'z',
-    'z'
-  ]);
-  html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(point_OR_x, y, z, w) {
-      if (point_OR_x === void 0) point_OR_x = null;
-      if (y === void 0) y = null;
-      if (z === void 0) z = null;
-      if (w === void 0) w = null;
-      if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
-        let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
-        return html$.DomPoint._create_1(point_1);
-      }
-      if (point_OR_x == null && y == null && z == null && w == null) {
-        return html$.DomPoint._create_2();
-      }
-      if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
-        return html$.DomPoint._create_3(point_OR_x);
-      }
-      if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
-        return html$.DomPoint._create_4(point_OR_x, y);
-      }
-      if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
-        return html$.DomPoint._create_5(point_OR_x, y, z);
-      }
-      if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
-        return html$.DomPoint._create_6(point_OR_x, y, z, w);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1(point_OR_x) {
-      return new DOMPoint(point_OR_x);
-    }
-    static _create_2() {
-      return new DOMPoint();
-    }
-    static _create_3(point_OR_x) {
-      return new DOMPoint(point_OR_x);
-    }
-    static _create_4(point_OR_x, y) {
-      return new DOMPoint(point_OR_x, y);
-    }
-    static _create_5(point_OR_x, y, z) {
-      return new DOMPoint(point_OR_x, y, z);
-    }
-    static _create_6(point_OR_x, y, z, w) {
-      return new DOMPoint(point_OR_x, y, z, w);
-    }
-    static get supported() {
-      return !!window.DOMPoint || !!window.WebKitPoint;
-    }
-    get [dartx.w]() {
-      return this.w;
-    }
-    set [dartx.w](value) {
-      this.w = value;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.z]() {
-      return this.z;
-    }
-    set [dartx.z](value) {
-      this.z = value;
-    }
-  };
-  dart.setSignature(html$.DomPoint, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomPoint, []),
-      new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
-    }),
-    setters: () => ({
-      [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.z]: dart.definiteFunctionType(dart.void, [core.num])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.DomPoint, []),
-      _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
-      _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
-      _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
-  });
-  dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
-  dart.defineExtensionNames([
-    'toString',
-    '==',
-    'hashCode',
-    'intersection',
-    'intersects',
-    'boundingBox',
-    'containsRectangle',
-    'containsPoint',
-    'topLeft',
-    'topRight',
-    'bottomRight',
-    'bottomLeft',
-    'bottom',
-    'height',
-    'left',
-    'right',
-    'top',
-    'width',
-    'x',
-    'y'
-  ]);
-  html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
-    [dartx.toString]() {
-      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
-    }
-    [dartx['==']](other) {
-      if (!RectangleOfnum().is(other)) return false;
-      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
-    }
-    get [dartx.hashCode]() {
-      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
-    }
-    [dartx.intersection](other) {
-      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
-      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-      if (dart.notNull(x0) <= dart.notNull(x1)) {
-        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
-        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-        if (dart.notNull(y0) <= dart.notNull(y1)) {
-          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
-        }
-      }
-      return null;
-    }
-    [dartx.intersects](other) {
-      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-    }
-    [dartx.boundingBox](other) {
-      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
-      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
-      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
-    }
-    [dartx.containsRectangle](another) {
-      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
-    }
-    [dartx.containsPoint](another) {
-      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-    }
-    get [dartx.topLeft]() {
-      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
-    }
-    get [dartx.topRight]() {
-      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
-    }
-    get [dartx.bottomRight]() {
-      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-    }
-    get [dartx.bottomLeft]() {
-      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(x, y, width, height) {
-      return html$.DomRectReadOnly._create_1(x, y, width, height);
-    }
-    static _create_1(x, y, width, height) {
-      return new DOMRectReadOnly(x, y, width, height);
-    }
-    get [dartx.bottom]() {
-      return this.bottom;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.left]() {
-      return this.left;
-    }
-    get [dartx.right]() {
-      return this.right;
-    }
-    get [dartx.top]() {
-      return this.top;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
-  dart.setSignature(html$.DomRectReadOnly, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
-      new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
-    }),
-    getters: () => ({
-      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.bottom]: dart.definiteFunctionType(core.num, []),
-      [dartx.height]: dart.definiteFunctionType(core.num, []),
-      [dartx.left]: dart.definiteFunctionType(core.num, []),
-      [dartx.right]: dart.definiteFunctionType(core.num, []),
-      [dartx.top]: dart.definiteFunctionType(core.num, []),
-      [dartx.width]: dart.definiteFunctionType(core.num, []),
-      [dartx.x]: dart.definiteFunctionType(core.num, []),
-      [dartx.y]: dart.definiteFunctionType(core.num, [])
-    }),
-    methods: () => ({
-      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
-      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
-      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
-  dart.defineExtensionNames([
-    'add',
-    'contains',
-    'item',
-    'remove',
-    'toggle',
-    'length'
-  ]);
-  html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.add](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.contains](...args) {
-      return this.contains.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.remove](...args) {
-      return this.remove.apply(this, args);
-    }
-    [dartx.toggle](...args) {
-      return this.toggle.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.DomTokenList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
-    fields: () => ({[dartx.length]: core.int}),
-    methods: () => ({
-      [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.contains]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
-    })
-  });
-  dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
-  dart.defineExtensionNames([
-    'value'
-  ]);
-  html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.setSignature(html$.DomSettableTokenList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
-    fields: () => ({[dartx.value]: core.String})
-  });
-  dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
-  html$.ImmutableListMixin$ = dart.generic(E => {
-    let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
-    let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    dart.defineExtensionNames([
-      'iterator',
-      'add',
-      'addAll',
-      'sort',
-      'shuffle',
-      'insert',
-      'insertAll',
-      'setAll',
-      'removeAt',
-      'removeLast',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'setRange',
-      'removeRange',
-      'replaceRange',
-      'fillRange'
-    ]);
-    class ImmutableListMixin extends core.Object {
-      get iterator() {
-        return new (FixedSizeListIteratorOfE())(this);
-      }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
-      }
-      add(value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
-      }
-      addAll(iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        dart.throw(new core.UnsupportedError("Cannot sort immutable List."));
-      }
-      shuffle(random) {
-        if (random === void 0) random = null;
-        dart.throw(new core.UnsupportedError("Cannot shuffle immutable List."));
-      }
-      insert(index, element) {
-        E._check(element);
-        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
-      }
-      insertAll(index, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
-      }
-      setAll(index, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
-      }
-      removeAt(pos) {
-        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
-      }
-      removeLast() {
-        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
-      }
-      remove(object) {
-        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
-      }
-      removeWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
-      }
-      retainWhere(test) {
-        dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
-      }
-      setRange(start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        dart.throw(new core.UnsupportedError("Cannot setRange on immutable List."));
-      }
-      removeRange(start, end) {
-        dart.throw(new core.UnsupportedError("Cannot removeRange on immutable List."));
-      }
-      replaceRange(start, end, iterable) {
-        IterableOfE()._check(iterable);
-        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
-      }
-      fillRange(start, end, fillValue) {
-        if (fillValue === void 0) fillValue = null;
-        E._check(fillValue);
-        dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
-      }
-    }
-    dart.addTypeTests(ImmutableListMixin);
-    ImmutableListMixin[dart.implements] = () => [ListOfE()];
-    dart.setSignature(ImmutableListMixin, {
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [E]),
-        addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
-        sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
-        shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
-        insert: dart.definiteFunctionType(dart.void, [core.int, E]),
-        insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
-        removeAt: dart.definiteFunctionType(E, [core.int]),
-        removeLast: dart.definiteFunctionType(E, []),
-        remove: dart.definiteFunctionType(core.bool, [core.Object]),
-        removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
-        removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-        replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
-        fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
-      })
-    });
-    dart.defineExtensionMembers(ImmutableListMixin, [
-      'add',
-      'addAll',
-      'sort',
-      'shuffle',
-      'insert',
-      'insertAll',
-      'setAll',
-      'removeAt',
-      'removeLast',
-      'remove',
-      'removeWhere',
-      'retainWhere',
-      'setRange',
-      'removeRange',
-      'replaceRange',
-      'fillRange',
-      'iterator'
-    ]);
-    return ImmutableListMixin;
-  });
-  html$.ImmutableListMixin = ImmutableListMixin();
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.item](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
+      if (dart.notNull(end) < dart.notNull(start) || dart.notNull(end) > dart.notNull(length)) {
+        dart.throw(new core.RangeError.range(end, start, length));
       }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.DomStringList[dart.implements] = () => [ListOfString()];
-  dart.setSignature(html$.DomStringList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
-      [__getter__]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
-  html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.DomStringMap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
-  });
-  html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.EffectModel, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
-  });
-  dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
-  const _childElements = Symbol('_childElements');
-  const _element$ = Symbol('_element');
-  const _filter$0 = Symbol('_filter');
-  html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
-    _wrap(element) {
-      this[_childElements] = html$.HtmlCollection._check(element[_children]);
-      this[_element$] = element;
-    }
-    contains(element) {
-      return this[_childElements][dartx.contains](element);
-    }
-    get isEmpty() {
-      return this[_element$][_firstElementChild] == null;
-    }
-    get length() {
-      return this[_childElements][dartx.length];
     }
     _get(index) {
-      return html$.Element._check(this[_childElements][dartx._get](index));
+      if (typeof index == 'number' && index == index[dartx.toInt]()) {
+        this[_checkIndex](dart.asInt(index));
+      }
+      return E.as(super._get(index));
     }
     _set(index, value) {
-      this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
+      E._check(value);
+      if (typeof index == 'number' && index == index[dartx.toInt]()) {
+        this[_checkIndex](dart.asInt(index));
+      }
+      super._set(index, value);
       return value;
     }
-    set length(newLength) {
-      dart.throw(new core.UnsupportedError('Cannot resize element lists'));
+    get length() {
+      let len = this[_jsObject].length;
+      if (typeof len === "number" && len >>> 0 === len) {
+        return len;
+      }
+      dart.throw(new core.StateError('Bad JsArray length'));
+    }
+    set length(length) {
+      super._set('length', length);
     }
     add(value) {
-      this[_element$][dartx.append](value);
-      return value;
-    }
-    get iterator() {
-      return this[dartx.toList]()[dartx.iterator];
+      E._check(value);
+      this.callMethod('push', JSArrayOfE().of([value]));
     }
     addAll(iterable) {
-      if (html$._ChildNodeListLazy.is(iterable)) {
-        iterable = ListOfElement().from(iterable);
-      }
-      for (let element of iterable) {
-        this[_element$][dartx.append](element);
-      }
-    }
-    sort(compare) {
-      if (compare === void 0) compare = null;
-      dart.throw(new core.UnsupportedError('Cannot sort element lists'));
-    }
-    shuffle(random) {
-      if (random === void 0) random = null;
-      dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
-    }
-    removeWhere(test) {
-      this[_filter$0](test, false);
-    }
-    retainWhere(test) {
-      this[_filter$0](test, true);
-    }
-    [_filter$0](test, retainMatching) {
-      let removed = null;
-      if (dart.test(retainMatching)) {
-        removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
-      } else {
-        removed = this[_element$][dartx.children][dartx.where](test);
-      }
-      for (let e of core.Iterable._check(removed))
-        dart.dsend(e, 'remove');
-    }
-    setRange(start, end, iterable, skipCount) {
-      if (skipCount === void 0) skipCount = 0;
-      dart.throw(new core.UnimplementedError());
-    }
-    replaceRange(start, end, iterable) {
-      dart.throw(new core.UnimplementedError());
-    }
-    fillRange(start, end, fillValue) {
-      if (fillValue === void 0) fillValue = null;
-      dart.throw(new core.UnimplementedError());
-    }
-    remove(object) {
-      if (html$.Element.is(object)) {
-        let element = object;
-        if (core.identical(element[dartx.parentNode], this[_element$])) {
-          this[_element$][_removeChild](element);
-          return true;
-        }
-      }
-      return false;
+      IterableOfE()._check(iterable);
+      let list = iterable instanceof Array ? iterable : core.List.from(iterable);
+      this.callMethod('push', core.List._check(list));
     }
     insert(index, element) {
-      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
-        dart.throw(new core.RangeError.range(index, 0, this.length));
-      }
-      if (index == this.length) {
-        this[_element$][dartx.append](element);
-      } else {
-        this[_element$][dartx.insertBefore](element, this._get(index));
-      }
-    }
-    setAll(index, iterable) {
-      dart.throw(new core.UnimplementedError());
-    }
-    clear() {
-      this[_element$][_clearChildren]();
+      E._check(element);
+      this[_checkInsertIndex](index);
+      this.callMethod('splice', JSArrayOfObject().of([index, 0, element]));
     }
     removeAt(index) {
-      let result = this._get(index);
-      if (result != null) {
-        this[_element$][_removeChild](result);
-      }
-      return result;
+      this[_checkIndex](index);
+      return E.as(dart.dindex(this.callMethod('splice', JSArrayOfint().of([index, 1])), 0));
     }
     removeLast() {
-      let result = this.last;
-      if (result != null) {
-        this[_element$][_removeChild](result);
-      }
-      return result;
+      if (this.length == 0) dart.throw(new core.RangeError(-1));
+      return E.as(this.callMethod('pop'));
     }
-    get first() {
-      let result = this[_element$][_firstElementChild];
-      if (result == null) dart.throw(new core.StateError("No elements"));
-      return result;
+    removeRange(start, end) {
+      js.JsArray._checkRange(start, end, this.length);
+      this.callMethod('splice', JSArrayOfint().of([start, dart.notNull(end) - dart.notNull(start)]));
     }
-    get last() {
-      let result = this[_element$][_lastElementChild];
-      if (result == null) dart.throw(new core.StateError("No elements"));
-      return result;
-    }
-    get single() {
-      if (dart.notNull(this.length) > 1) dart.throw(new core.StateError("More than one element"));
-      return this.first;
-    }
-    get rawList() {
-      return this[_childElements];
-    }
-  };
-  dart.addSimpleTypeTests(html$._ChildrenElementList);
-  dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
-  html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
-  dart.setSignature(html$._ChildrenElementList, {
-    constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
-    fields: () => ({
-      [_element$]: html$.Element,
-      [_childElements]: html$.HtmlCollection
-    }),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
-    }),
-    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      _get: dart.definiteFunctionType(html$.Element, [core.int]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
-      add: dart.definiteFunctionType(html$.Element, [html$.Element]),
-      [_filter$0]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
-    })
-  });
-  dart.defineExtensionMembers(html$._ChildrenElementList, [
-    'contains',
-    '_get',
-    '_set',
-    'add',
-    'addAll',
-    'sort',
-    'shuffle',
-    'removeWhere',
-    'retainWhere',
-    'setRange',
-    'replaceRange',
-    'fillRange',
-    'remove',
-    'insert',
-    'setAll',
-    'clear',
-    'removeAt',
-    'removeLast',
-    'isEmpty',
-    'length',
-    'length',
-    'iterator',
-    'first',
-    'last',
-    'single'
-  ]);
-  html$.ElementList$ = dart.generic(T => {
-    class ElementList extends collection.ListBase$(T) {}
-    return ElementList;
-  });
-  html$.ElementList = ElementList();
-  const _nodeList = Symbol('_nodeList');
-  const _forElementList = Symbol('_forElementList');
-  html$._FrozenElementList$ = dart.generic(E => {
-    let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
-    let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
-    let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
-    class _FrozenElementList extends collection.ListBase$(E) {
-      _wrap(nodeList) {
-        this[_nodeList] = nodeList;
-      }
-      get length() {
-        return this[_nodeList][dartx.length];
-      }
-      _get(index) {
-        return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
-      }
-      _set(index, value) {
-        E._check(value);
-        dart.throw(new core.UnsupportedError('Cannot modify list'));
-        return value;
-      }
-      set length(newLength) {
-        dart.throw(new core.UnsupportedError('Cannot modify list'));
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        dart.throw(new core.UnsupportedError('Cannot sort list'));
-      }
-      shuffle(random) {
-        if (random === void 0) random = null;
-        dart.throw(new core.UnsupportedError('Cannot shuffle list'));
-      }
-      get first() {
-        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
-      }
-      get last() {
-        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
-      }
-      get single() {
-        return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
-      }
-      get classes() {
-        return html$._MultiElementCssClassSet.new(this);
-      }
-      get style() {
-        return new html$._CssStyleDeclarationSet(this);
-      }
-      set classes(value) {
-        this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
-      }
-      get contentEdge() {
-        return new html$._ContentCssListRect(this);
-      }
-      get paddingEdge() {
-        return this.first[dartx.paddingEdge];
-      }
-      get borderEdge() {
-        return this.first[dartx.borderEdge];
-      }
-      get marginEdge() {
-        return this.first[dartx.marginEdge];
-      }
-      get rawList() {
-        return this[_nodeList];
-      }
-      get onAbort() {
-        return html$.Element.abortEvent[_forElementList](this);
-      }
-      get onBeforeCopy() {
-        return html$.Element.beforeCopyEvent[_forElementList](this);
-      }
-      get onBeforeCut() {
-        return html$.Element.beforeCutEvent[_forElementList](this);
-      }
-      get onBeforePaste() {
-        return html$.Element.beforePasteEvent[_forElementList](this);
-      }
-      get onBlur() {
-        return html$.Element.blurEvent[_forElementList](this);
-      }
-      get onCanPlay() {
-        return html$.Element.canPlayEvent[_forElementList](this);
-      }
-      get onCanPlayThrough() {
-        return html$.Element.canPlayThroughEvent[_forElementList](this);
-      }
-      get onChange() {
-        return html$.Element.changeEvent[_forElementList](this);
-      }
-      get onClick() {
-        return html$.Element.clickEvent[_forElementList](this);
-      }
-      get onContextMenu() {
-        return html$.Element.contextMenuEvent[_forElementList](this);
-      }
-      get onCopy() {
-        return html$.Element.copyEvent[_forElementList](this);
-      }
-      get onCut() {
-        return html$.Element.cutEvent[_forElementList](this);
-      }
-      get onDoubleClick() {
-        return html$.Element.doubleClickEvent[_forElementList](this);
-      }
-      get onDrag() {
-        return html$.Element.dragEvent[_forElementList](this);
-      }
-      get onDragEnd() {
-        return html$.Element.dragEndEvent[_forElementList](this);
-      }
-      get onDragEnter() {
-        return html$.Element.dragEnterEvent[_forElementList](this);
-      }
-      get onDragLeave() {
-        return html$.Element.dragLeaveEvent[_forElementList](this);
-      }
-      get onDragOver() {
-        return html$.Element.dragOverEvent[_forElementList](this);
-      }
-      get onDragStart() {
-        return html$.Element.dragStartEvent[_forElementList](this);
-      }
-      get onDrop() {
-        return html$.Element.dropEvent[_forElementList](this);
-      }
-      get onDurationChange() {
-        return html$.Element.durationChangeEvent[_forElementList](this);
-      }
-      get onEmptied() {
-        return html$.Element.emptiedEvent[_forElementList](this);
-      }
-      get onEnded() {
-        return html$.Element.endedEvent[_forElementList](this);
-      }
-      get onError() {
-        return html$.Element.errorEvent[_forElementList](this);
-      }
-      get onFocus() {
-        return html$.Element.focusEvent[_forElementList](this);
-      }
-      get onInput() {
-        return html$.Element.inputEvent[_forElementList](this);
-      }
-      get onInvalid() {
-        return html$.Element.invalidEvent[_forElementList](this);
-      }
-      get onKeyDown() {
-        return html$.Element.keyDownEvent[_forElementList](this);
-      }
-      get onKeyPress() {
-        return html$.Element.keyPressEvent[_forElementList](this);
-      }
-      get onKeyUp() {
-        return html$.Element.keyUpEvent[_forElementList](this);
-      }
-      get onLoad() {
-        return html$.Element.loadEvent[_forElementList](this);
-      }
-      get onLoadedData() {
-        return html$.Element.loadedDataEvent[_forElementList](this);
-      }
-      get onLoadedMetadata() {
-        return html$.Element.loadedMetadataEvent[_forElementList](this);
-      }
-      get onMouseDown() {
-        return html$.Element.mouseDownEvent[_forElementList](this);
-      }
-      get onMouseEnter() {
-        return html$.Element.mouseEnterEvent[_forElementList](this);
-      }
-      get onMouseLeave() {
-        return html$.Element.mouseLeaveEvent[_forElementList](this);
-      }
-      get onMouseMove() {
-        return html$.Element.mouseMoveEvent[_forElementList](this);
-      }
-      get onMouseOut() {
-        return html$.Element.mouseOutEvent[_forElementList](this);
-      }
-      get onMouseOver() {
-        return html$.Element.mouseOverEvent[_forElementList](this);
-      }
-      get onMouseUp() {
-        return html$.Element.mouseUpEvent[_forElementList](this);
-      }
-      get onMouseWheel() {
-        return html$.Element.mouseWheelEvent[_forElementList](this);
-      }
-      get onPaste() {
-        return html$.Element.pasteEvent[_forElementList](this);
-      }
-      get onPause() {
-        return html$.Element.pauseEvent[_forElementList](this);
-      }
-      get onPlay() {
-        return html$.Element.playEvent[_forElementList](this);
-      }
-      get onPlaying() {
-        return html$.Element.playingEvent[_forElementList](this);
-      }
-      get onRateChange() {
-        return html$.Element.rateChangeEvent[_forElementList](this);
-      }
-      get onReset() {
-        return html$.Element.resetEvent[_forElementList](this);
-      }
-      get onResize() {
-        return html$.Element.resizeEvent[_forElementList](this);
-      }
-      get onScroll() {
-        return html$.Element.scrollEvent[_forElementList](this);
-      }
-      get onSearch() {
-        return html$.Element.searchEvent[_forElementList](this);
-      }
-      get onSeeked() {
-        return html$.Element.seekedEvent[_forElementList](this);
-      }
-      get onSeeking() {
-        return html$.Element.seekingEvent[_forElementList](this);
-      }
-      get onSelect() {
-        return html$.Element.selectEvent[_forElementList](this);
-      }
-      get onSelectStart() {
-        return html$.Element.selectStartEvent[_forElementList](this);
-      }
-      get onStalled() {
-        return html$.Element.stalledEvent[_forElementList](this);
-      }
-      get onSubmit() {
-        return html$.Element.submitEvent[_forElementList](this);
-      }
-      get onSuspend() {
-        return html$.Element.suspendEvent[_forElementList](this);
-      }
-      get onTimeUpdate() {
-        return html$.Element.timeUpdateEvent[_forElementList](this);
-      }
-      get onTouchCancel() {
-        return html$.Element.touchCancelEvent[_forElementList](this);
-      }
-      get onTouchEnd() {
-        return html$.Element.touchEndEvent[_forElementList](this);
-      }
-      get onTouchEnter() {
-        return html$.Element.touchEnterEvent[_forElementList](this);
-      }
-      get onTouchLeave() {
-        return html$.Element.touchLeaveEvent[_forElementList](this);
-      }
-      get onTouchMove() {
-        return html$.Element.touchMoveEvent[_forElementList](this);
-      }
-      get onTouchStart() {
-        return html$.Element.touchStartEvent[_forElementList](this);
-      }
-      get onTransitionEnd() {
-        return html$.Element.transitionEndEvent[_forElementList](this);
-      }
-      get onVolumeChange() {
-        return html$.Element.volumeChangeEvent[_forElementList](this);
-      }
-      get onWaiting() {
-        return html$.Element.waitingEvent[_forElementList](this);
-      }
-      get onFullscreenChange() {
-        return html$.Element.fullscreenChangeEvent[_forElementList](this);
-      }
-      get onFullscreenError() {
-        return html$.Element.fullscreenErrorEvent[_forElementList](this);
-      }
-    }
-    dart.defineNamedConstructor(_FrozenElementList, '_wrap');
-    _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
-    dart.setSignature(_FrozenElementList, {
-      constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
-      fields: () => ({[_nodeList]: ListOfNode()}),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        classes: dart.definiteFunctionType(html$.CssClassSet, []),
-        style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
-        contentEdge: dart.definiteFunctionType(html$.CssRect, []),
-        paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
-        borderEdge: dart.definiteFunctionType(html$.CssRect, []),
-        marginEdge: dart.definiteFunctionType(html$.CssRect, []),
-        rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
-        onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-        onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-        onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-        onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-        onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
-        onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
-        onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
-        onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
-        onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
-        onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
-        onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
-        onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
-      }),
-      setters: () => ({
-        length: dart.definiteFunctionType(dart.void, [core.int]),
-        classes: dart.definiteFunctionType(dart.void, [IterableOfString()])
-      }),
-      methods: () => ({
-        _get: dart.definiteFunctionType(E, [core.int]),
-        _set: dart.definiteFunctionType(dart.void, [core.int, E])
-      })
-    });
-    dart.defineExtensionMembers(_FrozenElementList, [
-      '_get',
-      '_set',
-      'sort',
-      'shuffle',
-      'length',
-      'length',
-      'first',
-      'last',
-      'single'
-    ]);
-    return _FrozenElementList;
-  });
-  html$._FrozenElementList = _FrozenElementList();
-  html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
-    static createElement_tag(tag, typeExtension) {
-      if (typeExtension != null) {
-        return document.createElement(tag, typeExtension);
-      }
-      return document.createElement(tag);
-    }
-  };
-  dart.setSignature(html$._ElementFactoryProvider, {
-    statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
-    names: ['createElement_tag']
-  });
-  const _value$2 = Symbol('_value');
-  html$.ScrollAlignment = class ScrollAlignment extends core.Object {
-    _internal(value) {
-      this[_value$2] = value;
-    }
-    toString() {
-      return dart.str`ScrollAlignment.${this[_value$2]}`;
-    }
-  };
-  dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
-  dart.setSignature(html$.ScrollAlignment, {
-    constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
-    fields: () => ({[_value$2]: dart.dynamic}),
-    sfields: () => ({
-      TOP: html$.ScrollAlignment,
-      CENTER: html$.ScrollAlignment,
-      BOTTOM: html$.ScrollAlignment
-    })
-  });
-  dart.defineLazy(html$.ScrollAlignment, {
-    get TOP() {
-      return dart.const(new html$.ScrollAlignment._internal('TOP'));
-    },
-    get CENTER() {
-      return dart.const(new html$.ScrollAlignment._internal('CENTER'));
-    },
-    get BOTTOM() {
-      return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
-    }
-  });
-  const __setter__ = Symbol('__setter__');
-  dart.defineExtensionNames([
-    'height',
-    'name',
-    'src',
-    'type',
-    'width'
-  ]);
-  html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.name] = null;
-      this[dartx.src] = null;
-      this[dartx.type] = null;
-      this[dartx.width] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('embed');
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [__setter__](...args) {
-      return this.__setter__.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.EmbedElement, 'created');
-  dart.setSignature(html$.EmbedElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.EmbedElement, []),
-      new: dart.definiteFunctionType(html$.EmbedElement, []),
-      created: dart.definiteFunctionType(html$.EmbedElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: core.String,
-      [dartx.name]: core.String,
-      [dartx.src]: core.String,
-      [dartx.type]: core.String,
-      [dartx.width]: core.String
-    }),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
-  html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
-  html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
-  html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
-  dart.defineExtensionNames([
-    'colno',
-    'error',
-    'filename',
-    'lineno',
-    'message'
-  ]);
-  html$.ErrorEvent = class ErrorEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ErrorEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ErrorEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ErrorEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ErrorEvent(type);
-    }
-    get [dartx.colno]() {
-      return this.colno;
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.filename]() {
-      return this.filename;
-    }
-    get [dartx.lineno]() {
-      return this.lineno;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-  };
-  dart.setSignature(html$.ErrorEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ErrorEvent, []),
-      new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.colno]: core.int,
-      [dartx.error]: core.Object,
-      [dartx.filename]: core.String,
-      [dartx.lineno]: core.int,
-      [dartx.message]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
-  dart.defineExtensionNames([
-    'close',
-    'onError',
-    'onMessage',
-    'onOpen',
-    'readyState',
-    'url',
-    'withCredentials'
-  ]);
-  html$.EventSource = class EventSource extends html$.EventTarget {
-    static new(url, opts) {
-      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
-      let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
-      return html$.EventSource._factoryEventSource(url, parsedOptions);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static _factoryEventSource(url, eventSourceInitDict) {
-      if (eventSourceInitDict === void 0) eventSourceInitDict = null;
-      if (eventSourceInitDict != null) {
-        let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
-        return html$.EventSource._create_1(url, eventSourceInitDict_1);
-      }
-      return html$.EventSource._create_2(url);
-    }
-    static _create_1(url, eventSourceInitDict) {
-      return new self.EventSource(url, eventSourceInitDict);
-    }
-    static _create_2(url) {
-      return new self.EventSource(url);
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-    get [dartx.withCredentials]() {
-      return this.withCredentials;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    get [dartx.onError]() {
-      return html$.EventSource.errorEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.EventSource.messageEvent.forTarget(this);
-    }
-    get [dartx.onOpen]() {
-      return html$.EventSource.openEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.EventSource, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
-      _: dart.definiteFunctionType(html$.EventSource, [])
-    }),
-    fields: () => ({
-      [dartx.readyState]: core.int,
-      [dartx.url]: core.String,
-      [dartx.withCredentials]: core.bool
-    }),
-    getters: () => ({
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
-      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
-    sfields: () => ({
-      errorEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      openEvent: EventStreamProviderOfEvent(),
-      CLOSED: core.int,
-      CONNECTING: core.int,
-      OPEN: core.int
-    }),
-    statics: () => ({
-      _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
-      _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
-    }),
-    names: ['_factoryEventSource', '_create_1', '_create_2']
-  });
-  html$.EventSource.CLOSED = 2;
-  html$.EventSource.CONNECTING = 0;
-  html$.EventSource.OPEN = 1;
-  dart.defineLazy(html$.EventSource, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get openEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('open'));
-    }
-  });
-  dart.registerExtension(dart.global.EventSource, html$.EventSource);
-  const _ptr = Symbol('_ptr');
-  html$.Events = class Events extends core.Object {
-    new(ptr) {
-      this[_ptr] = ptr;
-    }
-    _get(type) {
-      return new (_EventStreamOfEvent())(this[_ptr], type, false);
-    }
-  };
-  dart.setSignature(html$.Events, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
-    fields: () => ({[_ptr]: html$.EventTarget}),
-    methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
-  });
-  html$.ElementEvents = class ElementEvents extends html$.Events {
-    new(ptr) {
-      super.new(ptr);
-    }
-    _get(type) {
-      if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
-        if (dart.test(html_common.Device.isWebKit)) {
-          return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
-        }
-      }
-      return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
-    }
-  };
-  dart.setSignature(html$.ElementEvents, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
-    sfields: () => ({webkitEvents: MapOfString$String()})
-  });
-  dart.defineLazy(html$.ElementEvents, {
-    get webkitEvents() {
-      return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
-    }
-  });
-  dart.defineExtensionNames([
-    'waitUntil'
-  ]);
-  html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ExtendableEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ExtendableEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ExtendableEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ExtendableEvent(type);
-    }
-    [dartx.waitUntil](...args) {
-      return this.waitUntil.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ExtendableEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ExtendableEvent, []),
-      new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
-    }),
-    methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
-  dart.defineExtensionNames([
-    'protocol',
-    'provider'
-  ]);
-  html$.FederatedCredential = class FederatedCredential extends html$.Credential {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(data) {
-      let data_1 = html_common.convertDartToNative_Dictionary(data);
-      return html$.FederatedCredential._create_1(data_1);
-    }
-    static _create_1(data) {
-      return new self.FederatedCredential(data);
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    get [dartx.provider]() {
-      return this.provider;
-    }
-  };
-  dart.setSignature(html$.FederatedCredential, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FederatedCredential, []),
-      new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
-    }),
-    fields: () => ({
-      [dartx.protocol]: core.String,
-      [dartx.provider]: core.String
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
-  dart.defineExtensionNames([
-    'respondWith',
-    'isReload',
-    'request'
-  ]);
-  html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.FetchEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.FetchEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.FetchEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.FetchEvent(type);
-    }
-    get [dartx.isReload]() {
-      return this.isReload;
-    }
-    get [dartx.request]() {
-      return this.request;
-    }
-    [dartx.respondWith](...args) {
-      return this.respondWith.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.FetchEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FetchEvent, []),
-      new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.isReload]: core.bool,
-      [dartx.request]: html$._Request
-    }),
-    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'setCustomValidity',
-    'disabled',
-    'elements',
-    'form',
-    'name',
-    'type',
-    'validationMessage',
-    'validity',
-    'willValidate'
-  ]);
-  html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
-    }
-    created() {
-      this[dartx.disabled] = null;
-      this[dartx.elements] = null;
-      this[dartx.form] = null;
-      this[dartx.name] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.elements]() {
-      return this.elements;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.FieldSetElement, 'created');
-  dart.setSignature(html$.FieldSetElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FieldSetElement, []),
-      new: dart.definiteFunctionType(html$.FieldSetElement, []),
-      created: dart.definiteFunctionType(html$.FieldSetElement, [])
-    }),
-    fields: () => ({
-      [dartx.disabled]: core.bool,
-      [dartx.elements]: html$.HtmlFormControlsCollection,
-      [dartx.form]: html$.FormElement,
-      [dartx.name]: core.String,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.willValidate]: core.bool
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
-  const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
-  dart.defineExtensionNames([
-    'lastModifiedDate',
-    'lastModified',
-    'name',
-    'relativePath'
-  ]);
-  html$.File = class File extends html$.Blob {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(fileBits, fileName, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return html$.File._create_1(fileBits, fileName, options_1);
-      }
-      return html$.File._create_2(fileBits, fileName);
-    }
-    static _create_1(fileBits, fileName, options) {
-      return new self.File(fileBits, fileName, options);
-    }
-    static _create_2(fileBits, fileName) {
-      return new self.File(fileBits, fileName);
-    }
-    get [dartx.lastModified]() {
-      return this.lastModified;
-    }
-    get [dartx.lastModifiedDate]() {
-      return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
-    }
-    get [_get_lastModifiedDate]() {
-      return this.lastModifiedDate;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.relativePath]() {
-      return this.webkitRelativePath;
-    }
-  };
-  dart.setSignature(html$.File, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.File, []),
-      new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.lastModified]: core.int,
-      [_get_lastModifiedDate]: dart.dynamic,
-      [dartx.name]: core.String,
-      [dartx.relativePath]: core.String
-    }),
-    getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.File, html$.File);
-  html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
-  const _createWriter = Symbol('_createWriter');
-  const _file$ = Symbol('_file');
-  dart.defineExtensionNames([
-    'createWriter',
-    'file'
-  ]);
-  html$.FileEntry = class FileEntry extends html$.Entry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_createWriter](...args) {
-      return this.createWriter.apply(this, args);
-    }
-    [dartx.createWriter]() {
-      let completer = CompleterOfFileWriter().new();
-      this[_createWriter](dart.fn(value => {
-        completer.complete(value);
-      }, FileWriterToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [_file$](...args) {
-      return this.file.apply(this, args);
-    }
-    [dartx.file]() {
-      let completer = CompleterOfFile$().new();
-      this[_file$](dart.fn(value => {
-        completer.complete(value);
-      }, FileToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-  };
-  dart.setSignature(html$.FileEntry, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
-    methods: () => ({
-      [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
-      [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
-      [_file$]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
-      [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
-    })
-  });
-  dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
-  dart.defineExtensionNames([
-    'code'
-  ]);
-  html$.FileError = class FileError extends html$.DomError {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-  };
-  dart.setSignature(html$.FileError, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
-    fields: () => ({[dartx.code]: core.int}),
-    sfields: () => ({
-      ABORT_ERR: core.int,
-      ENCODING_ERR: core.int,
-      INVALID_MODIFICATION_ERR: core.int,
-      INVALID_STATE_ERR: core.int,
-      NOT_FOUND_ERR: core.int,
-      NOT_READABLE_ERR: core.int,
-      NO_MODIFICATION_ALLOWED_ERR: core.int,
-      PATH_EXISTS_ERR: core.int,
-      QUOTA_EXCEEDED_ERR: core.int,
-      SECURITY_ERR: core.int,
-      SYNTAX_ERR: core.int,
-      TYPE_MISMATCH_ERR: core.int
-    })
-  });
-  html$.FileError.ABORT_ERR = 3;
-  html$.FileError.ENCODING_ERR = 5;
-  html$.FileError.INVALID_MODIFICATION_ERR = 9;
-  html$.FileError.INVALID_STATE_ERR = 7;
-  html$.FileError.NOT_FOUND_ERR = 1;
-  html$.FileError.NOT_READABLE_ERR = 4;
-  html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
-  html$.FileError.PATH_EXISTS_ERR = 12;
-  html$.FileError.QUOTA_EXCEEDED_ERR = 10;
-  html$.FileError.SECURITY_ERR = 2;
-  html$.FileError.SYNTAX_ERR = 8;
-  html$.FileError.TYPE_MISMATCH_ERR = 11;
-  dart.registerExtension(dart.global.FileError, html$.FileError);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
-  dart.setSignature(html$.FileList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
-      [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.FileList, html$.FileList);
-  dart.defineExtensionNames([
-    'result',
-    'abort',
-    'readAsArrayBuffer',
-    'readAsDataUrl',
-    'readAsText',
-    'onAbort',
-    'onError',
-    'onLoad',
-    'onLoadEnd',
-    'onLoadStart',
-    'onProgress',
-    'error',
-    'readyState'
-  ]);
-  html$.FileReader = class FileReader extends html$.EventTarget {
-    get [dartx.result]() {
-      let res = this.result;
-      if (typed_data.ByteBuffer.is(res)) {
-        return typed_data.Uint8List.view(res);
-      }
-      return res;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.FileReader._create_1();
-    }
-    static _create_1() {
-      return new self.FileReader();
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.readAsArrayBuffer](...args) {
-      return this.readAsArrayBuffer.apply(this, args);
-    }
-    [dartx.readAsDataUrl](...args) {
-      return this.readAsDataURL.apply(this, args);
-    }
-    [dartx.readAsText](...args) {
-      return this.readAsText.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return html$.FileReader.abortEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.FileReader.errorEvent.forTarget(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.FileReader.loadEvent.forTarget(this);
-    }
-    get [dartx.onLoadEnd]() {
-      return html$.FileReader.loadEndEvent.forTarget(this);
-    }
-    get [dartx.onLoadStart]() {
-      return html$.FileReader.loadStartEvent.forTarget(this);
-    }
-    get [dartx.onProgress]() {
-      return html$.FileReader.progressEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.FileReader, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FileReader, []),
-      new: dart.definiteFunctionType(html$.FileReader, [])
-    }),
-    fields: () => ({
-      [dartx.error]: html$.FileError,
-      [dartx.readyState]: core.int
-    }),
-    getters: () => ({
-      [dartx.result]: dart.definiteFunctionType(core.Object, []),
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
-      [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
-      [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfProgressEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      loadEvent: EventStreamProviderOfProgressEvent(),
-      loadEndEvent: EventStreamProviderOfProgressEvent(),
-      loadStartEvent: EventStreamProviderOfProgressEvent(),
-      progressEvent: EventStreamProviderOfProgressEvent(),
-      DONE: core.int,
-      EMPTY: core.int,
-      LOADING: core.int
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
-    names: ['_create_1']
-  });
-  html$.FileReader.DONE = 2;
-  html$.FileReader.EMPTY = 0;
-  html$.FileReader.LOADING = 1;
-  dart.defineLazy(html$.FileReader, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
-    },
-    get loadEndEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
-    },
-    get loadStartEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
-    },
-    get progressEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
-    }
-  });
-  dart.registerExtension(dart.global.FileReader, html$.FileReader);
-  dart.defineExtensionNames([
-    'type'
-  ]);
-  html$.FileStream = class FileStream extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.FileStream, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
-    fields: () => ({[dartx.type]: core.String})
-  });
-  dart.registerExtension(dart.global.Stream, html$.FileStream);
-  dart.defineExtensionNames([
-    'name',
-    'root'
-  ]);
-  html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!window.webkitRequestFileSystem;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.root]() {
-      return this.root;
-    }
-  };
-  dart.setSignature(html$.FileSystem, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
-    fields: () => ({
-      [dartx.name]: core.String,
-      [dartx.root]: html$.DirectoryEntry
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
-  html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
-  dart.defineExtensionNames([
-    'abort',
-    'seek',
-    'truncate',
-    'write',
-    'onAbort',
-    'onError',
-    'onProgress',
-    'onWrite',
-    'onWriteEnd',
-    'onWriteStart',
-    'error',
-    'length',
-    'position',
-    'readyState'
-  ]);
-  html$.FileWriter = class FileWriter extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.position]() {
-      return this.position;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.seek](...args) {
-      return this.seek.apply(this, args);
-    }
-    [dartx.truncate](...args) {
-      return this.truncate.apply(this, args);
-    }
-    [dartx.write](...args) {
-      return this.write.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return html$.FileWriter.abortEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.FileWriter.errorEvent.forTarget(this);
-    }
-    get [dartx.onProgress]() {
-      return html$.FileWriter.progressEvent.forTarget(this);
-    }
-    get [dartx.onWrite]() {
-      return html$.FileWriter.writeEvent.forTarget(this);
-    }
-    get [dartx.onWriteEnd]() {
-      return html$.FileWriter.writeEndEvent.forTarget(this);
-    }
-    get [dartx.onWriteStart]() {
-      return html$.FileWriter.writeStartEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.FileWriter, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
-    fields: () => ({
-      [dartx.error]: html$.FileError,
-      [dartx.length]: core.int,
-      [dartx.position]: core.int,
-      [dartx.readyState]: core.int
-    }),
-    getters: () => ({
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfProgressEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      progressEvent: EventStreamProviderOfProgressEvent(),
-      writeEvent: EventStreamProviderOfProgressEvent(),
-      writeEndEvent: EventStreamProviderOfProgressEvent(),
-      writeStartEvent: EventStreamProviderOfProgressEvent(),
-      DONE: core.int,
-      INIT: core.int,
-      WRITING: core.int
-    })
-  });
-  html$.FileWriter.DONE = 2;
-  html$.FileWriter.INIT = 0;
-  html$.FileWriter.WRITING = 1;
-  dart.defineLazy(html$.FileWriter, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get progressEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
-    },
-    get writeEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('write'));
-    },
-    get writeEndEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('writeend'));
-    },
-    get writeStartEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
-    }
-  });
-  dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
-  html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
-  const _get_relatedTarget = Symbol('_get_relatedTarget');
-  dart.defineExtensionNames([
-    'relatedTarget'
-  ]);
-  html$.FocusEvent = class FocusEvent extends html$.UIEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.FocusEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.FocusEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.FocusEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.FocusEvent(type);
-    }
-    get [dartx.relatedTarget]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
-    }
-    get [_get_relatedTarget]() {
-      return this.relatedTarget;
-    }
-  };
-  dart.setSignature(html$.FocusEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FocusEvent, []),
-      new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
-    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
-  dart.defineExtensionNames([
-    'load',
-    'family',
-    'featureSettings',
-    'loaded',
-    'status',
-    'stretch',
-    'style',
-    'unicodeRange',
-    'variant',
-    'weight'
-  ]);
-  html$.FontFace = class FontFace extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(family, source, descriptors) {
-      if (descriptors === void 0) descriptors = null;
-      if (descriptors != null) {
-        let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
-        return html$.FontFace._create_1(family, source, descriptors_1);
-      }
-      return html$.FontFace._create_2(family, source);
-    }
-    static _create_1(family, source, descriptors) {
-      return new self.FontFace(family, source, descriptors);
-    }
-    static _create_2(family, source) {
-      return new self.FontFace(family, source);
-    }
-    get [dartx.family]() {
-      return this.family;
-    }
-    set [dartx.family](value) {
-      this.family = value;
-    }
-    get [dartx.featureSettings]() {
-      return this.featureSettings;
-    }
-    set [dartx.featureSettings](value) {
-      this.featureSettings = value;
-    }
-    get [dartx.loaded]() {
-      return this.loaded;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    get [dartx.stretch]() {
-      return this.stretch;
-    }
-    set [dartx.stretch](value) {
-      this.stretch = value;
-    }
-    get [dartx.style]() {
-      return this.style;
-    }
-    set [dartx.style](value) {
-      this.style = value;
-    }
-    get [dartx.unicodeRange]() {
-      return this.unicodeRange;
-    }
-    set [dartx.unicodeRange](value) {
-      this.unicodeRange = value;
-    }
-    get [dartx.variant]() {
-      return this.variant;
-    }
-    set [dartx.variant](value) {
-      this.variant = value;
-    }
-    get [dartx.weight]() {
-      return this.weight;
-    }
-    set [dartx.weight](value) {
-      this.weight = value;
-    }
-    [dartx.load](...args) {
-      return this.load.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.FontFace, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FontFace, []),
-      new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.family]: core.String,
-      [dartx.featureSettings]: core.String,
-      [dartx.loaded]: async.Future,
-      [dartx.status]: core.String,
-      [dartx.stretch]: core.String,
-      [dartx.style]: core.String,
-      [dartx.unicodeRange]: core.String,
-      [dartx.variant]: core.String,
-      [dartx.weight]: core.String
-    }),
-    methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.FontFace, html$.FontFace);
-  dart.defineExtensionNames([
-    'add',
-    'check',
-    'clear',
-    'delete',
-    'forEach',
-    'has',
-    'size',
-    'status'
-  ]);
-  html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    [dartx.add](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.check](...args) {
-      return this.check.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.delete](...args) {
-      return this.delete.apply(this, args);
-    }
-    [dartx.forEach](...args) {
-      return this.forEach.apply(this, args);
-    }
-    [dartx.has](...args) {
-      return this.has.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.FontFaceSet, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
-    fields: () => ({
-      [dartx.size]: core.int,
-      [dartx.status]: core.String
-    }),
-    methods: () => ({
-      [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
-      [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
-      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-      [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
-      [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
-      [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
-    })
-  });
-  dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
-  html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
-  dart.defineExtensionNames([
-    'fontfaces'
-  ]);
-  html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.fontfaces]() {
-      return this.fontfaces;
-    }
-  };
-  dart.setSignature(html$.FontFaceSetLoadEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
-    fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
-  });
-  dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
-  dart.defineExtensionNames([
-    'append',
-    'appendBlob',
-    'delete',
-    'get',
-    'getAll',
-    'has',
-    'set'
-  ]);
-  html$.FormData = class FormData extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(form) {
-      if (form === void 0) form = null;
-      if (form != null) {
-        return html$.FormData._create_1(form);
-      }
-      return html$.FormData._create_2();
-    }
-    static _create_1(form) {
-      return new self.FormData(form);
-    }
-    static _create_2() {
-      return new self.FormData();
-    }
-    static get supported() {
-      return !!window.FormData;
-    }
-    [dartx.append](...args) {
-      return this.append.apply(this, args);
-    }
-    [dartx.appendBlob](...args) {
-      return this.append.apply(this, args);
-    }
-    [dartx.delete](...args) {
-      return this.delete.apply(this, args);
-    }
-    [dartx.get](...args) {
-      return this.get.apply(this, args);
-    }
-    [dartx.getAll](...args) {
-      return this.getAll.apply(this, args);
-    }
-    [dartx.has](...args) {
-      return this.has.apply(this, args);
-    }
-    [dartx.set](...args) {
-      return this.set.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.FormData, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FormData, []),
-      new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
-    }),
-    methods: () => ({
-      [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
-      [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
-      [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
-      [dartx.has]: dart.definiteFunctionType(core.bool, [core.String]),
-      [dartx.set]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic], [core.String])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.FormData, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.FormData, html$.FormData);
-  const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
-  dart.defineExtensionNames([
-    'checkValidity',
-    'item',
-    'reportValidity',
-    'requestAutocomplete',
-    'reset',
-    'submit',
-    'acceptCharset',
-    'action',
-    'autocomplete',
-    'encoding',
-    'enctype',
-    'length',
-    'method',
-    'name',
-    'noValidate',
-    'target'
-  ]);
-  html$.FormElement = class FormElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.FormElement._check(html$.document[dartx.createElement]("form"));
-    }
-    created() {
-      this[dartx.acceptCharset] = null;
-      this[dartx.action] = null;
-      this[dartx.autocomplete] = null;
-      this[dartx.encoding] = null;
-      this[dartx.enctype] = null;
-      this[dartx.length] = null;
-      this[dartx.method] = null;
-      this[dartx.name] = null;
-      this[dartx.noValidate] = null;
-      this[dartx.target] = null;
-      super.created();
-    }
-    get [dartx.acceptCharset]() {
-      return this.acceptCharset;
-    }
-    set [dartx.acceptCharset](value) {
-      this.acceptCharset = value;
-    }
-    get [dartx.action]() {
-      return this.action;
-    }
-    set [dartx.action](value) {
-      this.action = value;
-    }
-    get [dartx.autocomplete]() {
-      return this.autocomplete;
-    }
-    set [dartx.autocomplete](value) {
-      this.autocomplete = value;
-    }
-    get [dartx.encoding]() {
-      return this.encoding;
-    }
-    set [dartx.encoding](value) {
-      this.encoding = value;
-    }
-    get [dartx.enctype]() {
-      return this.enctype;
-    }
-    set [dartx.enctype](value) {
-      this.enctype = value;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.method]() {
-      return this.method;
-    }
-    set [dartx.method](value) {
-      this.method = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.noValidate]() {
-      return this.noValidate;
-    }
-    set [dartx.noValidate](value) {
-      this.noValidate = value;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    set [dartx.target](value) {
-      this.target = value;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.requestAutocomplete](details) {
-      let details_1 = html_common.convertDartToNative_Dictionary(details);
-      this[_requestAutocomplete_1](details_1);
-      return;
-    }
-    [_requestAutocomplete_1](...args) {
-      return this.requestAutocomplete.apply(this, args);
-    }
-    [dartx.reset](...args) {
-      return this.reset.apply(this, args);
-    }
-    [dartx.submit](...args) {
-      return this.submit.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.FormElement, 'created');
-  dart.setSignature(html$.FormElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.FormElement, []),
-      new: dart.definiteFunctionType(html$.FormElement, []),
-      created: dart.definiteFunctionType(html$.FormElement, [])
-    }),
-    fields: () => ({
-      [dartx.acceptCharset]: core.String,
-      [dartx.action]: core.String,
-      [dartx.autocomplete]: core.String,
-      [dartx.encoding]: core.String,
-      [dartx.enctype]: core.String,
-      [dartx.length]: core.int,
-      [dartx.method]: core.String,
-      [dartx.name]: core.String,
-      [dartx.noValidate]: core.bool,
-      [dartx.target]: core.String
-    }),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
-      [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
-      [dartx.submit]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
-  html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
-  dart.defineExtensionNames([
-    'axes',
-    'buttons',
-    'connected',
-    'id',
-    'index',
-    'mapping',
-    'timestamp'
-  ]);
-  html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.axes]() {
-      return this.axes;
-    }
-    get [dartx.buttons]() {
-      return this.buttons;
-    }
-    get [dartx.connected]() {
-      return this.connected;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.index]() {
-      return this.index;
-    }
-    get [dartx.mapping]() {
-      return this.mapping;
-    }
-    get [dartx.timestamp]() {
-      return this.timestamp;
-    }
-  };
-  dart.setSignature(html$.Gamepad, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
-    fields: () => ({
-      [dartx.axes]: ListOfnum(),
-      [dartx.buttons]: ListOfGamepadButton(),
-      [dartx.connected]: core.bool,
-      [dartx.id]: core.String,
-      [dartx.index]: core.int,
-      [dartx.mapping]: core.String,
-      [dartx.timestamp]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
-  dart.defineExtensionNames([
-    'pressed',
-    'value'
-  ]);
-  html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.pressed]() {
-      return this.pressed;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-  };
-  dart.setSignature(html$.GamepadButton, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
-    fields: () => ({
-      [dartx.pressed]: core.bool,
-      [dartx.value]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
-  dart.defineExtensionNames([
-    'gamepad'
-  ]);
-  html$.GamepadEvent = class GamepadEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.GamepadEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.GamepadEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.GamepadEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.GamepadEvent(type);
-    }
-    get [dartx.gamepad]() {
-      return this.gamepad;
-    }
-  };
-  dart.setSignature(html$.GamepadEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.GamepadEvent, []),
-      new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.gamepad]: html$.Gamepad}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
-  dart.defineExtensionNames([
-    'getRegisteredRegions',
-    'registerRegion',
-    'unregisterRegion'
-  ]);
-  html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getRegisteredRegions](...args) {
-      return this.getRegisteredRegions.apply(this, args);
-    }
-    [dartx.registerRegion](...args) {
-      return this.registerRegion.apply(this, args);
-    }
-    [dartx.unregisterRegion](...args) {
-      return this.unregisterRegion.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Geofencing, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
-    methods: () => ({
-      [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
-      [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
-      [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
-  dart.defineExtensionNames([
-    'id',
-    'region'
-  ]);
-  html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.region]() {
-      return this.region;
-    }
-  };
-  dart.setSignature(html$.GeofencingEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
-    fields: () => ({
-      [dartx.id]: core.String,
-      [dartx.region]: html$.GeofencingRegion
-    })
-  });
-  dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
-  const _getCurrentPosition = Symbol('_getCurrentPosition');
-  const _ensurePosition = Symbol('_ensurePosition');
-  const _watchPosition = Symbol('_watchPosition');
-  const _clearWatch = Symbol('_clearWatch');
-  const _getCurrentPosition_1 = Symbol('_getCurrentPosition_1');
-  const _getCurrentPosition_2 = Symbol('_getCurrentPosition_2');
-  const _getCurrentPosition_3 = Symbol('_getCurrentPosition_3');
-  const _watchPosition_1 = Symbol('_watchPosition_1');
-  const _watchPosition_2 = Symbol('_watchPosition_2');
-  const _watchPosition_3 = Symbol('_watchPosition_3');
-  dart.defineExtensionNames([
-    'getCurrentPosition',
-    'watchPosition'
-  ]);
-  html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
-    [dartx.getCurrentPosition](opts) {
-      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
-      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
-      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
-      let options = dart.map();
-      if (enableHighAccuracy != null) {
-        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
-      }
-      if (timeout != null) {
-        options[dartx._set]('timeout', timeout.inMilliseconds);
-      }
-      if (maximumAge != null) {
-        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
-      }
-      let completer = CompleterOfGeoposition().new();
-      try {
-        this[_getCurrentPosition](dart.fn(position => {
-          completer.complete(this[_ensurePosition](position));
-        }, GeopositionToNull()), dart.fn(error => {
-          completer.completeError(error);
-        }, PositionErrorToNull()), options);
-      } catch (e) {
-        let stacktrace = dart.stackTrace(e);
-        completer.completeError(e, stacktrace);
-      }
-
-      return completer.future;
-    }
-    [dartx.watchPosition](opts) {
-      let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
-      let timeout = opts && 'timeout' in opts ? opts.timeout : null;
-      let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
-      let options = dart.map();
-      if (enableHighAccuracy != null) {
-        options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
-      }
-      if (timeout != null) {
-        options[dartx._set]('timeout', timeout.inMilliseconds);
-      }
-      if (maximumAge != null) {
-        options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
-      }
-      let watchId = null;
-      let controller = null;
-      controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
-          dart.assert(watchId == null);
-          watchId = this[_watchPosition](dart.fn(position => {
-            controller.add(this[_ensurePosition](position));
-          }, GeopositionToNull()), dart.fn(error => {
-            controller.addError(error);
-          }, PositionErrorToNull()), options);
-        }, VoidToNull()), onCancel: dart.fn(() => {
-          dart.assert(watchId != null);
-          this[_clearWatch](watchId);
-        }, VoidToNull())});
-      return controller.stream;
-    }
-    [_ensurePosition](domPosition) {
-      try {
-        if (html$.Geoposition.is(domPosition)) {
-          return domPosition;
-        }
-      } catch (e) {
-      }
-
-      return new html$._GeopositionWrapper(domPosition);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_clearWatch](...args) {
-      return this.clearWatch.apply(this, args);
-    }
-    [_getCurrentPosition](successCallback, errorCallback, options) {
-      if (errorCallback === void 0) errorCallback = null;
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        this[_getCurrentPosition_1](successCallback, errorCallback, options_1);
-        return;
-      }
-      if (errorCallback != null) {
-        this[_getCurrentPosition_2](successCallback, errorCallback);
-        return;
-      }
-      this[_getCurrentPosition_3](successCallback);
-      return;
-    }
-    [_getCurrentPosition_1](...args) {
-      return this.getCurrentPosition.apply(this, args);
-    }
-    [_getCurrentPosition_2](...args) {
-      return this.getCurrentPosition.apply(this, args);
-    }
-    [_getCurrentPosition_3](...args) {
-      return this.getCurrentPosition.apply(this, args);
-    }
-    [_watchPosition](successCallback, errorCallback, options) {
-      if (errorCallback === void 0) errorCallback = null;
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_watchPosition_1](successCallback, errorCallback, options_1);
-      }
-      if (errorCallback != null) {
-        return this[_watchPosition_2](successCallback, errorCallback);
-      }
-      return this[_watchPosition_3](successCallback);
-    }
-    [_watchPosition_1](...args) {
-      return this.watchPosition.apply(this, args);
-    }
-    [_watchPosition_2](...args) {
-      return this.watchPosition.apply(this, args);
-    }
-    [_watchPosition_3](...args) {
-      return this.watchPosition.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Geolocation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
-    methods: () => ({
-      [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
-      [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
-      [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
-      [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
-      [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
-      [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
-      [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
-      [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
-      [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
-      [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
-      [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
-    })
-  });
-  dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
-  html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
-    new(ptr) {
-      this[_ptr] = ptr;
-    }
-    get coords() {
-      return this[_ptr].coords;
-    }
-    get timestamp() {
-      return this[_ptr].timestamp;
-    }
-  };
-  html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
-  dart.setSignature(html$._GeopositionWrapper, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
-    fields: () => ({[_ptr]: dart.dynamic}),
-    getters: () => ({
-      coords: dart.definiteFunctionType(html$.Coordinates, []),
-      timestamp: dart.definiteFunctionType(core.int, [])
-    })
-  });
-  dart.defineExtensionNames([
-    'coords',
-    'timestamp'
-  ]);
-  html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.coords]() {
-      return this.coords;
-    }
-    get [dartx.timestamp]() {
-      return this.timestamp;
-    }
-  };
-  dart.setSignature(html$.Geoposition, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
-    fields: () => ({
-      [dartx.coords]: html$.Coordinates,
-      [dartx.timestamp]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
-  dart.defineExtensionNames([
-    'onAbort',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onRateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onStalled',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onVolumeChange',
-    'onWaiting'
-  ]);
-  html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get onAbort() {
-      return html$.GlobalEventHandlers.abortEvent.forTarget(this);
-    }
-    get onBlur() {
-      return html$.GlobalEventHandlers.blurEvent.forTarget(this);
-    }
-    get onCanPlay() {
-      return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
-    }
-    get onCanPlayThrough() {
-      return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
-    }
-    get onChange() {
-      return html$.GlobalEventHandlers.changeEvent.forTarget(this);
-    }
-    get onClick() {
-      return html$.GlobalEventHandlers.clickEvent.forTarget(this);
-    }
-    get onContextMenu() {
-      return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
-    }
-    get onDoubleClick() {
-      return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
-    }
-    get onDrag() {
-      return html$.GlobalEventHandlers.dragEvent.forTarget(this);
-    }
-    get onDragEnd() {
-      return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
-    }
-    get onDragEnter() {
-      return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
-    }
-    get onDragLeave() {
-      return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
-    }
-    get onDragOver() {
-      return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
-    }
-    get onDragStart() {
-      return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
-    }
-    get onDrop() {
-      return html$.GlobalEventHandlers.dropEvent.forTarget(this);
-    }
-    get onDurationChange() {
-      return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
-    }
-    get onEmptied() {
-      return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
-    }
-    get onEnded() {
-      return html$.GlobalEventHandlers.endedEvent.forTarget(this);
-    }
-    get onError() {
-      return html$.GlobalEventHandlers.errorEvent.forTarget(this);
-    }
-    get onFocus() {
-      return html$.GlobalEventHandlers.focusEvent.forTarget(this);
-    }
-    get onInput() {
-      return html$.GlobalEventHandlers.inputEvent.forTarget(this);
-    }
-    get onInvalid() {
-      return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
-    }
-    get onKeyDown() {
-      return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
-    }
-    get onKeyPress() {
-      return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
-    }
-    get onKeyUp() {
-      return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
-    }
-    get onLoad() {
-      return html$.GlobalEventHandlers.loadEvent.forTarget(this);
-    }
-    get onLoadedData() {
-      return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
-    }
-    get onLoadedMetadata() {
-      return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
-    }
-    get onMouseDown() {
-      return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
-    }
-    get onMouseEnter() {
-      return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
-    }
-    get onMouseLeave() {
-      return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
-    }
-    get onMouseMove() {
-      return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
-    }
-    get onMouseOut() {
-      return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
-    }
-    get onMouseOver() {
-      return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
-    }
-    get onMouseUp() {
-      return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
-    }
-    get onMouseWheel() {
-      return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
-    }
-    get onPause() {
-      return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
-    }
-    get onPlay() {
-      return html$.GlobalEventHandlers.playEvent.forTarget(this);
-    }
-    get onPlaying() {
-      return html$.GlobalEventHandlers.playingEvent.forTarget(this);
-    }
-    get onRateChange() {
-      return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
-    }
-    get onReset() {
-      return html$.GlobalEventHandlers.resetEvent.forTarget(this);
-    }
-    get onResize() {
-      return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
-    }
-    get onScroll() {
-      return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
-    }
-    get onSeeked() {
-      return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
-    }
-    get onSeeking() {
-      return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
-    }
-    get onSelect() {
-      return html$.GlobalEventHandlers.selectEvent.forTarget(this);
-    }
-    get onStalled() {
-      return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
-    }
-    get onSubmit() {
-      return html$.GlobalEventHandlers.submitEvent.forTarget(this);
-    }
-    get onSuspend() {
-      return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
-    }
-    get onTimeUpdate() {
-      return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
-    }
-    get onVolumeChange() {
-      return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
-    }
-    get onWaiting() {
-      return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
-    }
-  };
-  html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
-  dart.setSignature(html$.GlobalEventHandlers, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
-    getters: () => ({
-      onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
-      onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfEvent(),
-      blurEvent: EventStreamProviderOfEvent(),
-      canPlayEvent: EventStreamProviderOfEvent(),
-      canPlayThroughEvent: EventStreamProviderOfEvent(),
-      changeEvent: EventStreamProviderOfEvent(),
-      clickEvent: EventStreamProviderOfMouseEvent(),
-      contextMenuEvent: EventStreamProviderOfMouseEvent(),
-      doubleClickEvent: EventStreamProviderOfEvent(),
-      dragEvent: EventStreamProviderOfMouseEvent(),
-      dragEndEvent: EventStreamProviderOfMouseEvent(),
-      dragEnterEvent: EventStreamProviderOfMouseEvent(),
-      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
-      dragOverEvent: EventStreamProviderOfMouseEvent(),
-      dragStartEvent: EventStreamProviderOfMouseEvent(),
-      dropEvent: EventStreamProviderOfMouseEvent(),
-      durationChangeEvent: EventStreamProviderOfEvent(),
-      emptiedEvent: EventStreamProviderOfEvent(),
-      endedEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      focusEvent: EventStreamProviderOfEvent(),
-      inputEvent: EventStreamProviderOfEvent(),
-      invalidEvent: EventStreamProviderOfEvent(),
-      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
-      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
-      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
-      loadEvent: EventStreamProviderOfEvent(),
-      loadedDataEvent: EventStreamProviderOfEvent(),
-      loadedMetadataEvent: EventStreamProviderOfEvent(),
-      mouseDownEvent: EventStreamProviderOfMouseEvent(),
-      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
-      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
-      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
-      mouseOutEvent: EventStreamProviderOfMouseEvent(),
-      mouseOverEvent: EventStreamProviderOfMouseEvent(),
-      mouseUpEvent: EventStreamProviderOfMouseEvent(),
-      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
-      pauseEvent: EventStreamProviderOfEvent(),
-      playEvent: EventStreamProviderOfEvent(),
-      playingEvent: EventStreamProviderOfEvent(),
-      rateChangeEvent: EventStreamProviderOfEvent(),
-      resetEvent: EventStreamProviderOfEvent(),
-      resizeEvent: EventStreamProviderOfEvent(),
-      scrollEvent: EventStreamProviderOfEvent(),
-      seekedEvent: EventStreamProviderOfEvent(),
-      seekingEvent: EventStreamProviderOfEvent(),
-      selectEvent: EventStreamProviderOfEvent(),
-      stalledEvent: EventStreamProviderOfEvent(),
-      submitEvent: EventStreamProviderOfEvent(),
-      suspendEvent: EventStreamProviderOfEvent(),
-      timeUpdateEvent: EventStreamProviderOfEvent(),
-      volumeChangeEvent: EventStreamProviderOfEvent(),
-      waitingEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineExtensionMembers(html$.GlobalEventHandlers, [
-    'onAbort',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onRateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onStalled',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onVolumeChange',
-    'onWaiting'
-  ]);
-  dart.defineLazy(html$.GlobalEventHandlers, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('abort'));
-    },
-    get blurEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('blur'));
-    },
-    get canPlayEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
-    },
-    get canPlayThroughEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
-    },
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    },
-    get clickEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
-    },
-    get contextMenuEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
-    },
-    get doubleClickEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
-    },
-    get dragEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
-    },
-    get dragEndEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
-    },
-    get dragEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
-    },
-    get dragLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
-    },
-    get dragOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
-    },
-    get dragStartEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
-    },
-    get dropEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
-    },
-    get durationChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
-    },
-    get emptiedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
-    },
-    get endedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ended'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get focusEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('focus'));
-    },
-    get inputEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('input'));
-    },
-    get invalidEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
-    },
-    get keyDownEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
-    },
-    get keyPressEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
-    },
-    get keyUpEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('load'));
-    },
-    get loadedDataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
-    },
-    get loadedMetadataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
-    },
-    get mouseDownEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
-    },
-    get mouseEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
-    },
-    get mouseLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
-    },
-    get mouseMoveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
-    },
-    get mouseOutEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
-    },
-    get mouseOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
-    },
-    get mouseUpEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
-    },
-    get mouseWheelEvent() {
-      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
-    },
-    get pauseEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pause'));
-    },
-    get playEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('play'));
-    },
-    get playingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('playing'));
-    },
-    get rateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
-    },
-    get resetEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('reset'));
-    },
-    get resizeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('resize'));
-    },
-    get scrollEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
-    },
-    get seekedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
-    },
-    get seekingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
-    },
-    get selectEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('select'));
-    },
-    get stalledEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
-    },
-    get submitEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('submit'));
-    },
-    get suspendEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
-    },
-    get timeUpdateEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
-    },
-    get volumeChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
-    },
-    get waitingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
-    }
-  });
-  dart.defineExtensionNames([
-    'color'
-  ]);
-  html$.HRElement = class HRElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
-    }
-    created() {
-      this[dartx.color] = null;
-      super.created();
-    }
-    get [dartx.color]() {
-      return this.color;
-    }
-    set [dartx.color](value) {
-      this.color = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.HRElement, 'created');
-  dart.setSignature(html$.HRElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.HRElement, []),
-      new: dart.definiteFunctionType(html$.HRElement, []),
-      created: dart.definiteFunctionType(html$.HRElement, [])
-    }),
-    fields: () => ({[dartx.color]: core.String})
-  });
-  dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
-  const _initHashChangeEvent = Symbol('_initHashChangeEvent');
-  dart.defineExtensionNames([
-    'newUrl',
-    'oldUrl'
-  ]);
-  html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
-      let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
-      let options = dart.map({canBubble: canBubble, cancelable: cancelable, oldURL: oldUrl, newURL: newUrl}, core.String, core.Object);
-      return new self.HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.HashChangeEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.HashChangeEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.HashChangeEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.HashChangeEvent(type);
-    }
-    static get supported() {
-      return html_common.Device.isEventTypeSupported('HashChangeEvent');
-    }
-    get [dartx.newUrl]() {
-      return this.newURL;
-    }
-    get [dartx.oldUrl]() {
-      return this.oldURL;
-    }
-    [_initHashChangeEvent](...args) {
-      return this.initHashChangeEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.HashChangeEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
-      _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.newUrl]: core.String,
-      [dartx.oldUrl]: core.String
-    }),
-    methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
-  html$.HeadElement = class HeadElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.HeadElement, 'created');
-  dart.setSignature(html$.HeadElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.HeadElement, []),
-      new: dart.definiteFunctionType(html$.HeadElement, []),
-      created: dart.definiteFunctionType(html$.HeadElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
-  html$.Headers = class Headers extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(input) {
-      if (input === void 0) input = null;
-      if (input == null) {
-        return html$.Headers._create_1();
-      }
-      if (html$.Headers.is(input)) {
-        return html$.Headers._create_2(input);
-      }
-      if (core.Map.is(input)) {
-        let input_1 = html_common.convertDartToNative_Dictionary(input);
-        return html$.Headers._create_3(input_1);
-      }
-      if (ListOfObject().is(input)) {
-        return html$.Headers._create_4(input);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1() {
-      return new self.Headers();
-    }
-    static _create_2(input) {
-      return new self.Headers(input);
-    }
-    static _create_3(input) {
-      return new self.Headers(input);
-    }
-    static _create_4(input) {
-      return new self.Headers(input);
-    }
-  };
-  dart.setSignature(html$.Headers, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.Headers, []),
-      new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.Headers, []),
-      _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
-      _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3', '_create_4']
-  });
-  dart.registerExtension(dart.global.Headers, html$.Headers);
-  html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static h1() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
-    }
-    static h2() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
-    }
-    static h3() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
-    }
-    static h4() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
-    }
-    static h5() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
-    }
-    static h6() {
-      return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.HeadingElement, 'created');
-  dart.setSignature(html$.HeadingElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.HeadingElement, []),
-      h1: dart.definiteFunctionType(html$.HeadingElement, []),
-      h2: dart.definiteFunctionType(html$.HeadingElement, []),
-      h3: dart.definiteFunctionType(html$.HeadingElement, []),
-      h4: dart.definiteFunctionType(html$.HeadingElement, []),
-      h5: dart.definiteFunctionType(html$.HeadingElement, []),
-      h6: dart.definiteFunctionType(html$.HeadingElement, []),
-      created: dart.definiteFunctionType(html$.HeadingElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
-  const _get_options = Symbol('_get_options');
-  const _get_state = Symbol('_get_state');
-  const _pushState_1 = Symbol('_pushState_1');
-  const _pushState_2 = Symbol('_pushState_2');
-  const _replaceState_1 = Symbol('_replaceState_1');
-  const _replaceState_2 = Symbol('_replaceState_2');
-  dart.defineExtensionNames([
-    'options',
-    'state',
-    'back',
-    'forward',
-    'go',
-    'pushState',
-    'replaceState',
-    'length'
-  ]);
-  html$.History = class History extends _interceptors.Interceptor {
-    static get supportsState() {
-      return !!window.history.pushState;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.options]() {
-      return html_common.convertNativeToDart_Dictionary(this[_get_options]);
-    }
-    get [_get_options]() {
-      return this.options;
-    }
-    get [dartx.state]() {
-      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
-    }
-    get [_get_state]() {
-      return this.state;
-    }
-    [dartx.back](...args) {
-      return this.back.apply(this, args);
-    }
-    [dartx.forward](...args) {
-      return this.forward.apply(this, args);
-    }
-    [dartx.go](...args) {
-      return this.go.apply(this, args);
-    }
-    [dartx.pushState](data, title, url, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
-        let options_2 = html_common.convertDartToNative_Dictionary(options);
-        this[_pushState_1](data_1, title, url, options_2);
-        return;
-      }
-      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
-      this[_pushState_2](data_1, title, url);
-      return;
-    }
-    [_pushState_1](...args) {
-      return this.pushState.apply(this, args);
-    }
-    [_pushState_2](...args) {
-      return this.pushState.apply(this, args);
-    }
-    [dartx.replaceState](data, title, url, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
-        let options_2 = html_common.convertDartToNative_Dictionary(options);
-        this[_replaceState_1](data_1, title, url, options_2);
-        return;
-      }
-      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
-      this[_replaceState_2](data_1, title, url);
-      return;
-    }
-    [_replaceState_1](...args) {
-      return this.replaceState.apply(this, args);
-    }
-    [_replaceState_2](...args) {
-      return this.replaceState.apply(this, args);
-    }
-  };
-  html$.History[dart.implements] = () => [html$.HistoryBase];
-  dart.setSignature(html$.History, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
-    fields: () => ({
-      [dartx.length]: core.int,
-      [_get_options]: dart.dynamic,
-      [_get_state]: dart.dynamic
-    }),
-    getters: () => ({
-      [dartx.options]: dart.definiteFunctionType(core.Map, []),
-      [dartx.state]: dart.definiteFunctionType(dart.dynamic, [])
-    }),
-    methods: () => ({
-      [dartx.back]: dart.definiteFunctionType(dart.void, []),
-      [dartx.forward]: dart.definiteFunctionType(dart.void, []),
-      [dartx.go]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [dartx.pushState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
-      [_pushState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_pushState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      [dartx.replaceState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
-      [_replaceState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_replaceState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.History, html$.History);
-  dart.defineExtensionNames([
-    'deviceId',
-    'deviceName',
-    'hardwareUnitId'
-  ]);
-  html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.deviceId]() {
-      return this.deviceId;
-    }
-    get [dartx.deviceName]() {
-      return this.deviceName;
-    }
-    get [dartx.hardwareUnitId]() {
-      return this.hardwareUnitId;
-    }
-  };
-  dart.setSignature(html$.VRDevice, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
-    fields: () => ({
-      [dartx.deviceId]: core.String,
-      [dartx.deviceName]: core.String,
-      [dartx.hardwareUnitId]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
-  dart.defineExtensionNames([
-    'getEyeParameters',
-    'setFieldOfView'
-  ]);
-  html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getEyeParameters](...args) {
-      return this.getEyeParameters.apply(this, args);
-    }
-    [dartx.setFieldOfView](...args) {
-      return this.setFieldOfView.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.HmdvrDevice, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
-    methods: () => ({
-      [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
-      [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
-    })
-  });
-  dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item',
-    'namedItem'
-  ]);
-  html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-  };
-  html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-  dart.setSignature(html$.HtmlCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
-      [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
-      [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
-  dart.defineExtensionNames([
-    'caretRangeFromPoint',
-    'elementFromPoint',
-    'getCssCanvasContext',
-    'head',
-    'lastModified',
-    'preferredStylesheetSet',
-    'referrer',
-    'selectedStylesheetSet',
-    'selectedStylesheetSet',
-    'styleSheets',
-    'title',
-    'title',
-    'exitFullscreen',
-    'registerElement',
-    'register',
-    'onVisibilityChange',
-    'createElementUpgrader',
-    'body'
-  ]);
-  html$.HtmlDocument = class HtmlDocument extends html$.Document {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.body]() {
-      return this.body;
-    }
-    set [dartx.body](value) {
-      this.body = value;
-    }
-    [dartx.caretRangeFromPoint](x, y) {
-      return this[_caretRangeFromPoint](x, y);
-    }
-    [dartx.elementFromPoint](x, y) {
-      return this[_elementFromPoint](x, y);
-    }
-    static get supportsCssCanvasContext() {
-      return !!document.getCSSCanvasContext;
-    }
-    [dartx.getCssCanvasContext](contextId, name, width, height) {
-      return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
-    }
-    get [dartx.head]() {
-      return this[_head$0];
-    }
-    get [dartx.lastModified]() {
-      return this[_lastModified];
-    }
-    get [dartx.preferredStylesheetSet]() {
-      return this[_preferredStylesheetSet];
-    }
-    get [dartx.referrer]() {
-      return this[_referrer];
-    }
-    get [dartx.selectedStylesheetSet]() {
-      return this[_selectedStylesheetSet];
-    }
-    set [dartx.selectedStylesheetSet](value) {
-      this[_selectedStylesheetSet] = value;
-    }
-    get [dartx.styleSheets]() {
-      return this[_styleSheets];
-    }
-    get [dartx.title]() {
-      return this[_title];
-    }
-    set [dartx.title](value) {
-      this[_title] = value;
-    }
-    [dartx.exitFullscreen]() {
-      this[_webkitExitFullscreen]();
-    }
-    [dartx.registerElement](tag, customElementClass, opts) {
-      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
-      html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
-    }
-    [dartx.register](tag, customElementClass, opts) {
-      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
-      return this[dartx.registerElement](tag, customElementClass, {extendsTag: extendsTag});
-    }
-    static _determineVisibilityChangeEventType(e) {
-      if (typeof e.hidden !== "undefined") {
-        return 'visibilitychange';
-      } else if (typeof e.mozHidden !== "undefined") {
-        return 'mozvisibilitychange';
-      } else if (typeof e.msHidden !== "undefined") {
-        return 'msvisibilitychange';
-      } else if (typeof e.webkitHidden !== "undefined") {
-        return 'webkitvisibilitychange';
-      }
-      return 'visibilitychange';
-    }
-    get [dartx.onVisibilityChange]() {
-      return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
-    }
-    [dartx.createElementUpgrader](type, opts) {
-      let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
-      return new html$._JSElementUpgrader(this, type, extendsTag);
-    }
-  };
-  dart.setSignature(html$.HtmlDocument, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
-    fields: () => ({[dartx.body]: html$.BodyElement}),
-    getters: () => ({
-      [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
-      [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
-      [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
-      [dartx.referrer]: dart.definiteFunctionType(core.String, []),
-      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
-      [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
-      [dartx.title]: dart.definiteFunctionType(core.String, []),
-      [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    setters: () => ({
-      [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    methods: () => ({
-      [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
-      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
-      [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
-      [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
-      [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
-      [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
-    }),
-    sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
-    sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
-    names: ['_determineVisibilityChangeEventType']
-  });
-  dart.defineLazy(html$.HtmlDocument, {
-    get visibilityChangeEvent() {
-      return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
-    }
-  });
-  dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
-  dart.defineExtensionNames([
-    'item',
-    'namedItem'
-  ]);
-  html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.HtmlFormControlsCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
-  });
-  dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
-  html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
-  dart.setSignature(html$.HtmlHtmlElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
-      new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
-      created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
-  const _item = Symbol('_item');
-  html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.HtmlOptionsCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
-    methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
-  });
-  dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
-  const _get_response = Symbol('_get_response');
-  dart.defineExtensionNames([
-    'onAbort',
-    'onError',
-    'onLoad',
-    'onLoadEnd',
-    'onLoadStart',
-    'onProgress',
-    'onTimeout'
-  ]);
-  html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.onAbort]() {
-      return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
-    }
-    get [dartx.onLoadEnd]() {
-      return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
-    }
-    get [dartx.onLoadStart]() {
-      return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
-    }
-    get [dartx.onProgress]() {
-      return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
-    }
-    get [dartx.onTimeout]() {
-      return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.HttpRequestEventTarget, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
-    getters: () => ({
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
-      [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
-    }),
-    sfields: () => ({
-      abortEvent: EventStreamProviderOfProgressEvent(),
-      errorEvent: EventStreamProviderOfProgressEvent(),
-      loadEvent: EventStreamProviderOfProgressEvent(),
-      loadEndEvent: EventStreamProviderOfProgressEvent(),
-      loadStartEvent: EventStreamProviderOfProgressEvent(),
-      progressEvent: EventStreamProviderOfProgressEvent(),
-      timeoutEvent: EventStreamProviderOfProgressEvent()
-    })
-  });
-  dart.defineLazy(html$.HttpRequestEventTarget, {
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('error'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
-    },
-    get loadEndEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
-    },
-    get loadStartEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
-    },
-    get progressEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
-    },
-    get timeoutEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
-    }
-  });
-  dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
-  dart.defineExtensionNames([
-    'responseHeaders',
-    'open',
-    'response',
-    'abort',
-    'getAllResponseHeaders',
-    'getResponseHeader',
-    'overrideMimeType',
-    'send',
-    'setRequestHeader',
-    'onReadyStateChange',
-    'readyState',
-    'responseText',
-    'responseType',
-    'responseUrl',
-    'responseXml',
-    'status',
-    'statusText',
-    'timeout',
-    'upload',
-    'withCredentials'
-  ]);
-  html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
-    static getString(url, opts) {
-      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
-      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
-      return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
-    }
-    static postFormData(url, data, opts) {
-      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
-      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
-      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
-      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
-      let parts = [];
-      data[dartx.forEach](dart.fn((key, value) => {
-        parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
-      }, StringAndStringToNull()));
-      let formData = parts[dartx.join]('&');
-      if (requestHeaders == null) {
-        requestHeaders = dart.map({}, core.String, core.String);
-      }
-      requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
-      return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
-    }
-    static request(url, opts) {
-      let method = opts && 'method' in opts ? opts.method : null;
-      let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
-      let responseType = opts && 'responseType' in opts ? opts.responseType : null;
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-      let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
-      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
-      let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
-      let completer = CompleterOfHttpRequest().new();
-      let xhr = html$.HttpRequest.new();
-      if (method == null) {
-        method = 'GET';
-      }
-      xhr[dartx.open](method, url, {async: true});
-      if (withCredentials != null) {
-        xhr[dartx.withCredentials] = withCredentials;
-      }
-      if (responseType != null) {
-        xhr[dartx.responseType] = responseType;
-      }
-      if (mimeType != null) {
-        xhr[dartx.overrideMimeType](mimeType);
-      }
-      if (requestHeaders != null) {
-        requestHeaders[dartx.forEach](dart.fn((header, value) => {
-          xhr[dartx.setRequestHeader](header, value);
-        }, StringAndStringToNull()));
-      }
-      if (onProgress != null) {
-        xhr[dartx.onProgress].listen(onProgress);
-      }
-      xhr[dartx.onLoad].listen(dart.fn(e => {
-        let accepted = dart.notNull(xhr[dartx.status]) >= 200 && dart.notNull(xhr[dartx.status]) < 300;
-        let fileUri = xhr[dartx.status] == 0;
-        let notModified = xhr[dartx.status] == 304;
-        let unknownRedirect = dart.notNull(xhr[dartx.status]) > 307 && dart.notNull(xhr[dartx.status]) < 400;
-        if (accepted || fileUri || notModified || unknownRedirect) {
-          completer.complete(xhr);
-        } else {
-          completer.completeError(e);
-        }
-      }, ProgressEventToNull()));
-      xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
-      if (sendData != null) {
-        xhr[dartx.send](sendData);
-      } else {
-        xhr[dartx.send]();
-      }
-      return completer.future;
-    }
-    static get supportsProgressEvent() {
-      let xhr = html$.HttpRequest.new();
-      return "onprogress" in xhr;
-    }
-    static get supportsCrossOrigin() {
-      let xhr = html$.HttpRequest.new();
-      return "withCredentials" in xhr;
-    }
-    static get supportsLoadEndEvent() {
-      let xhr = html$.HttpRequest.new();
-      return "onloadend" in xhr;
-    }
-    static get supportsOverrideMimeType() {
-      let xhr = html$.HttpRequest.new();
-      return "overrideMimeType" in xhr;
-    }
-    static requestCrossOrigin(url, opts) {
-      let method = opts && 'method' in opts ? opts.method : null;
-      let sendData = opts && 'sendData' in opts ? opts.sendData : null;
-      if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
-        return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
-      }
-      let completer = CompleterOfString().new();
-      if (method == null) {
-        method = 'GET';
-      }
-      let xhr = new XDomainRequest();
-      xhr.open(method, url);
-      xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
-        let response = xhr.responseText;
-        completer.complete(response);
-      }, dynamicToNull$()), 1);
-      xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
-        completer.completeError(e);
-      }, dynamicToNull$()), 1);
-      xhr.onprogress = {};
-      xhr.ontimeout = {};
-      xhr.timeout = Number.MAX_VALUE;
-      if (sendData != null) {
-        xhr.send(sendData);
-      } else {
-        xhr.send();
-      }
-      return completer.future;
-    }
-    get [dartx.responseHeaders]() {
-      let headers = dart.map({}, core.String, core.String);
-      let headersString = this[dartx.getAllResponseHeaders]();
-      if (headersString == null) {
-        return headers;
-      }
-      let headersList = headersString[dartx.split]('\r\n');
-      for (let header of headersList) {
-        if (dart.test(header[dartx.isEmpty])) {
-          continue;
-        }
-        let splitIdx = header[dartx.indexOf](': ');
-        if (splitIdx == -1) {
-          continue;
-        }
-        let key = header[dartx.substring](0, splitIdx)[dartx.toLowerCase]();
-        let value = header[dartx.substring](dart.notNull(splitIdx) + 2);
-        if (dart.test(headers[dartx.containsKey](key))) {
-          headers[dartx._set](key, dart.str`${headers[dartx._get](key)}, ${value}`);
-        } else {
-          headers[dartx._set](key, value);
-        }
-      }
-      return headers;
-    }
-    [dartx.open](...args) {
-      return this.open.apply(this, args);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.HttpRequest._create_1();
-    }
-    static _create_1() {
-      return new XMLHttpRequest();
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.response]() {
-      return html$._convertNativeToDart_XHR_Response(this[_get_response]);
-    }
-    get [_get_response]() {
-      return this.response;
-    }
-    get [dartx.responseText]() {
-      return this.responseText;
-    }
-    get [dartx.responseType]() {
-      return this.responseType;
-    }
-    set [dartx.responseType](value) {
-      this.responseType = value;
-    }
-    get [dartx.responseUrl]() {
-      return this.responseURL;
-    }
-    get [dartx.responseXml]() {
-      return this.responseXML;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    get [dartx.statusText]() {
-      return this.statusText;
-    }
-    get [dartx.timeout]() {
-      return this.timeout;
-    }
-    set [dartx.timeout](value) {
-      this.timeout = value;
-    }
-    get [dartx.upload]() {
-      return this.upload;
-    }
-    get [dartx.withCredentials]() {
-      return this.withCredentials;
-    }
-    set [dartx.withCredentials](value) {
-      this.withCredentials = value;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.getAllResponseHeaders](...args) {
-      return this.getAllResponseHeaders.apply(this, args);
-    }
-    [dartx.getResponseHeader](...args) {
-      return this.getResponseHeader.apply(this, args);
-    }
-    [dartx.overrideMimeType](...args) {
-      return this.overrideMimeType.apply(this, args);
-    }
-    [dartx.send](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.setRequestHeader](...args) {
-      return this.setRequestHeader.apply(this, args);
-    }
-    get [dartx.onReadyStateChange]() {
-      return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.HttpRequest, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.HttpRequest, []),
-      new: dart.definiteFunctionType(html$.HttpRequest, [])
-    }),
-    fields: () => ({
-      [dartx.readyState]: core.int,
-      [_get_response]: dart.dynamic,
-      [dartx.responseText]: core.String,
-      [dartx.responseType]: core.String,
-      [dartx.responseUrl]: core.String,
-      [dartx.responseXml]: html$.Document,
-      [dartx.status]: core.int,
-      [dartx.statusText]: core.String,
-      [dartx.timeout]: core.int,
-      [dartx.upload]: html$.HttpRequestUpload,
-      [dartx.withCredentials]: core.bool
-    }),
-    getters: () => ({
-      [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-      [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
-    }),
-    methods: () => ({
-      [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getAllResponseHeaders]: dart.definiteFunctionType(core.String, []),
-      [dartx.getResponseHeader]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.overrideMimeType]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.send]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
-      [dartx.setRequestHeader]: dart.definiteFunctionType(dart.void, [core.String, core.String])
-    }),
-    sfields: () => ({
-      readyStateChangeEvent: EventStreamProviderOfProgressEvent(),
-      DONE: core.int,
-      HEADERS_RECEIVED: core.int,
-      LOADING: core.int,
-      OPENED: core.int,
-      UNSENT: core.int
-    }),
-    sgetters: () => ({
-      supportsProgressEvent: dart.definiteFunctionType(core.bool, []),
-      supportsCrossOrigin: dart.definiteFunctionType(core.bool, []),
-      supportsLoadEndEvent: dart.definiteFunctionType(core.bool, []),
-      supportsOverrideMimeType: dart.definiteFunctionType(core.bool, [])
-    }),
-    statics: () => ({
-      getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
-      postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
-      request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
-      requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
-      _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
-    }),
-    names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
-  });
-  html$.HttpRequest.DONE = 4;
-  html$.HttpRequest.HEADERS_RECEIVED = 2;
-  html$.HttpRequest.LOADING = 3;
-  html$.HttpRequest.OPENED = 1;
-  html$.HttpRequest.UNSENT = 0;
-  dart.defineLazy(html$.HttpRequest, {
-    get readyStateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
-    }
-  });
-  dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
-  html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.HttpRequestUpload, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
-  });
-  dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
-  const _get_contentWindow = Symbol('_get_contentWindow');
-  dart.defineExtensionNames([
-    'contentWindow',
-    'allowFullscreen',
-    'height',
-    'name',
-    'sandbox',
-    'src',
-    'srcdoc',
-    'width'
-  ]);
-  html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
-    }
-    created() {
-      this[dartx.allowFullscreen] = null;
-      this[_get_contentWindow] = null;
-      this[dartx.height] = null;
-      this[dartx.name] = null;
-      this[dartx.sandbox] = null;
-      this[dartx.src] = null;
-      this[dartx.srcdoc] = null;
-      this[dartx.width] = null;
-      super.created();
-    }
-    get [dartx.allowFullscreen]() {
-      return this.allowFullscreen;
-    }
-    set [dartx.allowFullscreen](value) {
-      this.allowFullscreen = value;
-    }
-    get [dartx.contentWindow]() {
-      return html$._convertNativeToDart_Window(this[_get_contentWindow]);
-    }
-    get [_get_contentWindow]() {
-      return this.contentWindow;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.sandbox]() {
-      return this.sandbox;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.srcdoc]() {
-      return this.srcdoc;
-    }
-    set [dartx.srcdoc](value) {
-      this.srcdoc = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.IFrameElement, 'created');
-  dart.setSignature(html$.IFrameElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.IFrameElement, []),
-      new: dart.definiteFunctionType(html$.IFrameElement, []),
-      created: dart.definiteFunctionType(html$.IFrameElement, [])
-    }),
-    fields: () => ({
-      [dartx.allowFullscreen]: core.bool,
-      [_get_contentWindow]: dart.dynamic,
-      [dartx.height]: core.String,
-      [dartx.name]: core.String,
-      [dartx.sandbox]: html$.DomSettableTokenList,
-      [dartx.src]: core.String,
-      [dartx.srcdoc]: core.String,
-      [dartx.width]: core.String
-    }),
-    getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
-  });
-  dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
-  dart.defineExtensionNames([
-    'height',
-    'width'
-  ]);
-  html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  dart.setSignature(html$.ImageBitmap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
-    fields: () => ({
-      [dartx.height]: core.int,
-      [dartx.width]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
-  dart.defineExtensionNames([
-    'data',
-    'height',
-    'width'
-  ]);
-  html$.ImageData = class ImageData extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(data_OR_sw, sh_OR_sw, sh) {
-      if (sh === void 0) sh = null;
-      if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
-        return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
-      }
-      if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
-        return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
-      }
-      if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
-        return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1(data_OR_sw, sh_OR_sw) {
-      return new self.ImageData(data_OR_sw, sh_OR_sw);
-    }
-    static _create_2(data_OR_sw, sh_OR_sw) {
-      return new self.ImageData(data_OR_sw, sh_OR_sw);
-    }
-    static _create_3(data_OR_sw, sh_OR_sw, sh) {
-      return new self.ImageData(data_OR_sw, sh_OR_sw, sh);
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  dart.setSignature(html$.ImageData, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ImageData, []),
-      new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
-    }),
-    fields: () => ({
-      [dartx.data]: typed_data.Uint8ClampedList,
-      [dartx.height]: core.int,
-      [dartx.width]: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.registerExtension(dart.global.ImageData, html$.ImageData);
-  dart.defineExtensionNames([
-    'alt',
-    'complete',
-    'crossOrigin',
-    'currentSrc',
-    'height',
-    'isMap',
-    'naturalHeight',
-    'naturalWidth',
-    'sizes',
-    'src',
-    'srcset',
-    'useMap',
-    'width'
-  ]);
-  html$.ImageElement = class ImageElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(opts) {
-      let src = opts && 'src' in opts ? opts.src : null;
-      let width = opts && 'width' in opts ? opts.width : null;
-      let height = opts && 'height' in opts ? opts.height : null;
-      let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
-      if (src != null) e[dartx.src] = src;
-      if (width != null) e[dartx.width] = width;
-      if (height != null) e[dartx.height] = height;
-      return e;
-    }
-    created() {
-      this[dartx.alt] = null;
-      this[dartx.complete] = null;
-      this[dartx.crossOrigin] = null;
-      this[dartx.currentSrc] = null;
-      this[dartx.height] = null;
-      this[dartx.isMap] = null;
-      this[dartx.naturalHeight] = null;
-      this[dartx.naturalWidth] = null;
-      this[dartx.sizes] = null;
-      this[dartx.src] = null;
-      this[dartx.srcset] = null;
-      this[dartx.useMap] = null;
-      this[dartx.width] = null;
-      super.created();
-    }
-    get [dartx.alt]() {
-      return this.alt;
-    }
-    set [dartx.alt](value) {
-      this.alt = value;
-    }
-    get [dartx.complete]() {
-      return this.complete;
-    }
-    get [dartx.crossOrigin]() {
-      return this.crossOrigin;
-    }
-    set [dartx.crossOrigin](value) {
-      this.crossOrigin = value;
-    }
-    get [dartx.currentSrc]() {
-      return this.currentSrc;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.isMap]() {
-      return this.isMap;
-    }
-    set [dartx.isMap](value) {
-      this.isMap = value;
-    }
-    get [dartx.naturalHeight]() {
-      return this.naturalHeight;
-    }
-    get [dartx.naturalWidth]() {
-      return this.naturalWidth;
-    }
-    get [dartx.sizes]() {
-      return this.sizes;
-    }
-    set [dartx.sizes](value) {
-      this.sizes = value;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.srcset]() {
-      return this.srcset;
-    }
-    set [dartx.srcset](value) {
-      this.srcset = value;
-    }
-    get [dartx.useMap]() {
-      return this.useMap;
-    }
-    set [dartx.useMap](value) {
-      this.useMap = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.ImageElement, 'created');
-  html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
-  dart.setSignature(html$.ImageElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ImageElement, []),
-      new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
-      created: dart.definiteFunctionType(html$.ImageElement, [])
-    }),
-    fields: () => ({
-      [dartx.alt]: core.String,
-      [dartx.complete]: core.bool,
-      [dartx.crossOrigin]: core.String,
-      [dartx.currentSrc]: core.String,
-      [dartx.height]: core.int,
-      [dartx.isMap]: core.bool,
-      [dartx.naturalHeight]: core.int,
-      [dartx.naturalWidth]: core.int,
-      [dartx.sizes]: core.String,
-      [dartx.src]: core.String,
-      [dartx.srcset]: core.String,
-      [dartx.useMap]: core.String,
-      [dartx.width]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
-  dart.defineExtensionNames([
-    'inspect'
-  ]);
-  html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.inspect](...args) {
-      return this.inspect.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.InjectedScriptHost, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
-    methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
-  });
-  dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
-  dart.defineExtensionNames([
-    'firesTouchEvents'
-  ]);
-  html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(deviceInitDict) {
-      if (deviceInitDict === void 0) deviceInitDict = null;
-      if (deviceInitDict != null) {
-        let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
-        return html$.InputDevice._create_1(deviceInitDict_1);
-      }
-      return html$.InputDevice._create_2();
-    }
-    static _create_1(deviceInitDict) {
-      return new self.InputDevice(deviceInitDict);
-    }
-    static _create_2() {
-      return new self.InputDevice();
-    }
-    get [dartx.firesTouchEvents]() {
-      return this.firesTouchEvents;
-    }
-  };
-  dart.setSignature(html$.InputDevice, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.InputDevice, []),
-      new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
-    }),
-    fields: () => ({[dartx.firesTouchEvents]: core.bool}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.InputDevice, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
-  const _get_valueAsDate = Symbol('_get_valueAsDate');
-  const _set_valueAsDate = Symbol('_set_valueAsDate');
-  dart.defineExtensionNames([
-    'valueAsDate',
-    'valueAsDate',
-    'checkValidity',
-    'reportValidity',
-    'select',
-    'setCustomValidity',
-    'setRangeText',
-    'setSelectionRange',
-    'stepDown',
-    'stepUp',
-    'accept',
-    'alt',
-    'autocapitalize',
-    'autocomplete',
-    'autofocus',
-    'capture',
-    'checked',
-    'defaultChecked',
-    'defaultValue',
-    'dirName',
-    'disabled',
-    'files',
-    'form',
-    'formAction',
-    'formEnctype',
-    'formMethod',
-    'formNoValidate',
-    'formTarget',
-    'height',
-    'incremental',
-    'indeterminate',
-    'inputMode',
-    'labels',
-    'list',
-    'max',
-    'maxLength',
-    'min',
-    'minLength',
-    'multiple',
-    'name',
-    'pattern',
-    'placeholder',
-    'readOnly',
-    'required',
-    'selectionDirection',
-    'selectionEnd',
-    'selectionStart',
-    'size',
-    'src',
-    'step',
-    'type',
-    'validationMessage',
-    'validity',
-    'value',
-    'valueAsNumber',
-    'entries',
-    'directory',
-    'width',
-    'willValidate'
-  ]);
-  html$.InputElement = class InputElement extends html$.HtmlElement {
-    static new(opts) {
-      let type = opts && 'type' in opts ? opts.type : null;
-      let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
-      if (type != null) {
-        try {
-          e[dartx.type] = type;
-        } catch (_) {
-        }
-
-      }
-      return e;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.accept] = null;
-      this[dartx.alt] = null;
-      this[dartx.autocapitalize] = null;
-      this[dartx.autocomplete] = null;
-      this[dartx.autofocus] = null;
-      this[dartx.capture] = null;
-      this[dartx.checked] = null;
-      this[dartx.defaultChecked] = null;
-      this[dartx.defaultValue] = null;
-      this[dartx.dirName] = null;
-      this[dartx.disabled] = null;
-      this[dartx.files] = null;
-      this[dartx.form] = null;
-      this[dartx.formAction] = null;
-      this[dartx.formEnctype] = null;
-      this[dartx.formMethod] = null;
-      this[dartx.formNoValidate] = null;
-      this[dartx.formTarget] = null;
-      this[dartx.height] = null;
-      this[dartx.incremental] = null;
-      this[dartx.indeterminate] = null;
-      this[dartx.inputMode] = null;
-      this[dartx.labels] = null;
-      this[dartx.list] = null;
-      this[dartx.max] = null;
-      this[dartx.maxLength] = null;
-      this[dartx.min] = null;
-      this[dartx.minLength] = null;
-      this[dartx.multiple] = null;
-      this[dartx.name] = null;
-      this[dartx.pattern] = null;
-      this[dartx.placeholder] = null;
-      this[dartx.readOnly] = null;
-      this[dartx.required] = null;
-      this[dartx.selectionDirection] = null;
-      this[dartx.selectionEnd] = null;
-      this[dartx.selectionStart] = null;
-      this[dartx.size] = null;
-      this[dartx.src] = null;
-      this[dartx.step] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.value] = null;
-      this[_get_valueAsDate] = null;
-      this[dartx.valueAsNumber] = null;
-      this[dartx.entries] = null;
-      this[dartx.directory] = null;
-      this[dartx.width] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    get [dartx.accept]() {
-      return this.accept;
-    }
-    set [dartx.accept](value) {
-      this.accept = value;
-    }
-    get [dartx.alt]() {
-      return this.alt;
-    }
-    set [dartx.alt](value) {
-      this.alt = value;
-    }
-    get [dartx.autocapitalize]() {
-      return this.autocapitalize;
-    }
-    set [dartx.autocapitalize](value) {
-      this.autocapitalize = value;
-    }
-    get [dartx.autocomplete]() {
-      return this.autocomplete;
-    }
-    set [dartx.autocomplete](value) {
-      this.autocomplete = value;
-    }
-    get [dartx.autofocus]() {
-      return this.autofocus;
-    }
-    set [dartx.autofocus](value) {
-      this.autofocus = value;
-    }
-    get [dartx.capture]() {
-      return this.capture;
-    }
-    set [dartx.capture](value) {
-      this.capture = value;
-    }
-    get [dartx.checked]() {
-      return this.checked;
-    }
-    set [dartx.checked](value) {
-      this.checked = value;
-    }
-    get [dartx.defaultChecked]() {
-      return this.defaultChecked;
-    }
-    set [dartx.defaultChecked](value) {
-      this.defaultChecked = value;
-    }
-    get [dartx.defaultValue]() {
-      return this.defaultValue;
-    }
-    set [dartx.defaultValue](value) {
-      this.defaultValue = value;
-    }
-    get [dartx.dirName]() {
-      return this.dirName;
-    }
-    set [dartx.dirName](value) {
-      this.dirName = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.files]() {
-      return this.files;
-    }
-    set [dartx.files](value) {
-      this.files = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.formAction]() {
-      return this.formAction;
-    }
-    set [dartx.formAction](value) {
-      this.formAction = value;
-    }
-    get [dartx.formEnctype]() {
-      return this.formEnctype;
-    }
-    set [dartx.formEnctype](value) {
-      this.formEnctype = value;
-    }
-    get [dartx.formMethod]() {
-      return this.formMethod;
-    }
-    set [dartx.formMethod](value) {
-      this.formMethod = value;
-    }
-    get [dartx.formNoValidate]() {
-      return this.formNoValidate;
-    }
-    set [dartx.formNoValidate](value) {
-      this.formNoValidate = value;
-    }
-    get [dartx.formTarget]() {
-      return this.formTarget;
-    }
-    set [dartx.formTarget](value) {
-      this.formTarget = value;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.incremental]() {
-      return this.incremental;
-    }
-    set [dartx.incremental](value) {
-      this.incremental = value;
-    }
-    get [dartx.indeterminate]() {
-      return this.indeterminate;
-    }
-    set [dartx.indeterminate](value) {
-      this.indeterminate = value;
-    }
-    get [dartx.inputMode]() {
-      return this.inputMode;
-    }
-    set [dartx.inputMode](value) {
-      this.inputMode = value;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.list]() {
-      return this.list;
-    }
-    get [dartx.max]() {
-      return this.max;
-    }
-    set [dartx.max](value) {
-      this.max = value;
-    }
-    get [dartx.maxLength]() {
-      return this.maxLength;
-    }
-    set [dartx.maxLength](value) {
-      this.maxLength = value;
-    }
-    get [dartx.min]() {
-      return this.min;
-    }
-    set [dartx.min](value) {
-      this.min = value;
-    }
-    get [dartx.minLength]() {
-      return this.minLength;
-    }
-    set [dartx.minLength](value) {
-      this.minLength = value;
-    }
-    get [dartx.multiple]() {
-      return this.multiple;
-    }
-    set [dartx.multiple](value) {
-      this.multiple = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.pattern]() {
-      return this.pattern;
-    }
-    set [dartx.pattern](value) {
-      this.pattern = value;
-    }
-    get [dartx.placeholder]() {
-      return this.placeholder;
-    }
-    set [dartx.placeholder](value) {
-      this.placeholder = value;
-    }
-    get [dartx.readOnly]() {
-      return this.readOnly;
-    }
-    set [dartx.readOnly](value) {
-      this.readOnly = value;
-    }
-    get [dartx.required]() {
-      return this.required;
-    }
-    set [dartx.required](value) {
-      this.required = value;
-    }
-    get [dartx.selectionDirection]() {
-      return this.selectionDirection;
-    }
-    set [dartx.selectionDirection](value) {
-      this.selectionDirection = value;
-    }
-    get [dartx.selectionEnd]() {
-      return this.selectionEnd;
-    }
-    set [dartx.selectionEnd](value) {
-      this.selectionEnd = value;
-    }
-    get [dartx.selectionStart]() {
-      return this.selectionStart;
-    }
-    set [dartx.selectionStart](value) {
-      this.selectionStart = value;
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    set [dartx.size](value) {
-      this.size = value;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.step]() {
-      return this.step;
-    }
-    set [dartx.step](value) {
-      this.step = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.valueAsDate]() {
-      return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
-    }
-    get [_get_valueAsDate]() {
-      return this.valueAsDate;
-    }
-    set [dartx.valueAsDate](value) {
-      this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
-    }
-    set [_set_valueAsDate](value) {
-      this.valueAsDate = value;
-    }
-    get [dartx.valueAsNumber]() {
-      return this.valueAsNumber;
-    }
-    set [dartx.valueAsNumber](value) {
-      this.valueAsNumber = value;
-    }
-    get [dartx.entries]() {
-      return this.webkitEntries;
-    }
-    get [dartx.directory]() {
-      return this.webkitdirectory;
-    }
-    set [dartx.directory](value) {
-      this.webkitdirectory = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.select](...args) {
-      return this.select.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-    [dartx.setRangeText](...args) {
-      return this.setRangeText.apply(this, args);
-    }
-    [dartx.setSelectionRange](...args) {
-      return this.setSelectionRange.apply(this, args);
-    }
-    [dartx.stepDown](...args) {
-      return this.stepDown.apply(this, args);
-    }
-    [dartx.stepUp](...args) {
-      return this.stepUp.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.InputElement, 'created');
-  html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
-  dart.setSignature(html$.InputElement, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
-      _: dart.definiteFunctionType(html$.InputElement, []),
-      created: dart.definiteFunctionType(html$.InputElement, [])
-    }),
-    fields: () => ({
-      [dartx.accept]: core.String,
-      [dartx.alt]: core.String,
-      [dartx.autocapitalize]: core.String,
-      [dartx.autocomplete]: core.String,
-      [dartx.autofocus]: core.bool,
-      [dartx.capture]: core.bool,
-      [dartx.checked]: core.bool,
-      [dartx.defaultChecked]: core.bool,
-      [dartx.defaultValue]: core.String,
-      [dartx.dirName]: core.String,
-      [dartx.disabled]: core.bool,
-      [dartx.files]: ListOfFile(),
-      [dartx.form]: html$.FormElement,
-      [dartx.formAction]: core.String,
-      [dartx.formEnctype]: core.String,
-      [dartx.formMethod]: core.String,
-      [dartx.formNoValidate]: core.bool,
-      [dartx.formTarget]: core.String,
-      [dartx.height]: core.int,
-      [dartx.incremental]: core.bool,
-      [dartx.indeterminate]: core.bool,
-      [dartx.inputMode]: core.String,
-      [dartx.labels]: ListOfNode(),
-      [dartx.list]: html$.HtmlElement,
-      [dartx.max]: core.String,
-      [dartx.maxLength]: core.int,
-      [dartx.min]: core.String,
-      [dartx.minLength]: core.int,
-      [dartx.multiple]: core.bool,
-      [dartx.name]: core.String,
-      [dartx.pattern]: core.String,
-      [dartx.placeholder]: core.String,
-      [dartx.readOnly]: core.bool,
-      [dartx.required]: core.bool,
-      [dartx.selectionDirection]: core.String,
-      [dartx.selectionEnd]: core.int,
-      [dartx.selectionStart]: core.int,
-      [dartx.size]: core.int,
-      [dartx.src]: core.String,
-      [dartx.step]: core.String,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.value]: core.String,
-      [_get_valueAsDate]: dart.dynamic,
-      [dartx.valueAsNumber]: core.num,
-      [dartx.entries]: ListOfEntry(),
-      [dartx.directory]: core.bool,
-      [dartx.width]: core.int,
-      [dartx.willValidate]: core.bool
-    }),
-    getters: () => ({[dartx.valueAsDate]: dart.definiteFunctionType(core.DateTime, [])}),
-    setters: () => ({
-      [dartx.valueAsDate]: dart.definiteFunctionType(dart.void, [core.DateTime]),
-      [_set_valueAsDate]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.select]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
-      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String]),
-      [dartx.stepDown]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
-  dart.defineExtensionNames([
-    'autofocus',
-    'disabled',
-    'incremental',
-    'indeterminate',
-    'name',
-    'value'
-  ]);
-  html$.InputElementBase = class InputElementBase extends core.Object {
-    new() {
-      this[autofocus] = null;
-      this[disabled] = null;
-      this[incremental] = null;
-      this[indeterminate] = null;
-      this[name] = null;
-      this[value$] = null;
-    }
-    get autofocus() {
-      return this[autofocus];
-    }
-    set autofocus(value) {
-      this[autofocus] = value;
-    }
-    get disabled() {
-      return this[disabled];
-    }
-    set disabled(value) {
-      this[disabled] = value;
-    }
-    get incremental() {
-      return this[incremental];
-    }
-    set incremental(value) {
-      this[incremental] = value;
-    }
-    get indeterminate() {
-      return this[indeterminate];
-    }
-    set indeterminate(value) {
-      this[indeterminate] = value;
-    }
-    get name() {
-      return this[name];
-    }
-    set name(value) {
-      this[name] = value;
-    }
-    get value() {
-      return this[value$];
-    }
-    set value(value) {
-      this[value$] = value;
-    }
-  };
-  const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
-  const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
-  const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
-  const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
-  const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
-  const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
-  html$.InputElementBase[dart.implements] = () => [html$.Element];
-  dart.setSignature(html$.InputElementBase, {
-    fields: () => ({
-      autofocus: core.bool,
-      disabled: core.bool,
-      incremental: core.bool,
-      indeterminate: core.bool,
-      name: core.String,
-      value: core.String
-    })
-  });
-  dart.defineExtensionMembers(html$.InputElementBase, [
-    'autofocus',
-    'autofocus',
-    'disabled',
-    'disabled',
-    'incremental',
-    'incremental',
-    'indeterminate',
-    'indeterminate',
-    'name',
-    'name',
-    'value',
-    'value'
-  ]);
-  html$.HiddenInputElement = class HiddenInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'hidden'});
-    }
-  };
-  html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.HiddenInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
-  });
-  dart.defineExtensionNames([
-    'autocomplete',
-    'maxLength',
-    'pattern',
-    'placeholder',
-    'readOnly',
-    'required',
-    'size',
-    'selectionDirection',
-    'selectionEnd',
-    'selectionStart'
-  ]);
-  html$.TextInputElementBase = class TextInputElementBase extends core.Object {
-    new() {
-      this[autocomplete] = null;
-      this[maxLength] = null;
-      this[pattern] = null;
-      this[placeholder] = null;
-      this[readOnly] = null;
-      this[required] = null;
-      this[size] = null;
-      this[selectionDirection] = null;
-      this[selectionEnd] = null;
-      this[selectionStart] = null;
-    }
-    get autocomplete() {
-      return this[autocomplete];
-    }
-    set autocomplete(value) {
-      this[autocomplete] = value;
-    }
-    get maxLength() {
-      return this[maxLength];
-    }
-    set maxLength(value) {
-      this[maxLength] = value;
-    }
-    get pattern() {
-      return this[pattern];
-    }
-    set pattern(value) {
-      this[pattern] = value;
-    }
-    get placeholder() {
-      return this[placeholder];
-    }
-    set placeholder(value) {
-      this[placeholder] = value;
-    }
-    get readOnly() {
-      return this[readOnly];
-    }
-    set readOnly(value) {
-      this[readOnly] = value;
-    }
-    get required() {
-      return this[required];
-    }
-    set required(value) {
-      this[required] = value;
-    }
-    get size() {
-      return this[size];
-    }
-    set size(value) {
-      this[size] = value;
-    }
-    get selectionDirection() {
-      return this[selectionDirection];
-    }
-    set selectionDirection(value) {
-      this[selectionDirection] = value;
-    }
-    get selectionEnd() {
-      return this[selectionEnd];
-    }
-    set selectionEnd(value) {
-      this[selectionEnd] = value;
-    }
-    get selectionStart() {
-      return this[selectionStart];
-    }
-    set selectionStart(value) {
-      this[selectionStart] = value;
-    }
-  };
-  const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
-  const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
-  const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
-  const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
-  const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
-  const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
-  const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
-  const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
-  const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
-  const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
-  html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.TextInputElementBase, {
-    fields: () => ({
-      autocomplete: core.String,
-      maxLength: core.int,
-      pattern: core.String,
-      placeholder: core.String,
-      readOnly: core.bool,
-      required: core.bool,
-      size: core.int,
-      selectionDirection: core.String,
-      selectionEnd: core.int,
-      selectionStart: core.int
-    })
-  });
-  dart.defineExtensionMembers(html$.TextInputElementBase, [
-    'autocomplete',
-    'autocomplete',
-    'maxLength',
-    'maxLength',
-    'pattern',
-    'pattern',
-    'placeholder',
-    'placeholder',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required',
-    'size',
-    'size',
-    'selectionDirection',
-    'selectionDirection',
-    'selectionEnd',
-    'selectionEnd',
-    'selectionStart',
-    'selectionStart'
-  ]);
-  dart.defineExtensionNames([
-    'dirName'
-  ]);
-  html$.SearchInputElement = class SearchInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'search'});
-    }
-    get dirName() {
-      return this[dirName];
-    }
-    set dirName(value) {
-      this[dirName] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
-    }
-  };
-  const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
-  html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.SearchInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
-    fields: () => ({dirName: core.String}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
-  dart.defineExtensionNames([
-    'dirName'
-  ]);
-  html$.TextInputElement = class TextInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'text'});
-    }
-    get dirName() {
-      return this[dirName$];
-    }
-    set dirName(value) {
-      this[dirName$] = value;
-    }
-  };
-  const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
-  html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.TextInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
-    fields: () => ({dirName: core.String})
-  });
-  dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
-  html$.UrlInputElement = class UrlInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'url'});
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
-    }
-  };
-  html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.UrlInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'tel'});
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
-    }
-  };
-  html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.TelephoneInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionNames([
-    'autocomplete',
-    'autofocus',
-    'maxLength',
-    'multiple',
-    'pattern',
-    'placeholder',
-    'readOnly',
-    'required',
-    'size'
-  ]);
-  html$.EmailInputElement = class EmailInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'email'});
-    }
-    get autocomplete() {
-      return this[autocomplete$];
-    }
-    set autocomplete(value) {
-      this[autocomplete$] = value;
-    }
-    get autofocus() {
-      return this[autofocus$];
-    }
-    set autofocus(value) {
-      this[autofocus$] = value;
-    }
-    get maxLength() {
-      return this[maxLength$];
-    }
-    set maxLength(value) {
-      this[maxLength$] = value;
-    }
-    get multiple() {
-      return this[multiple];
-    }
-    set multiple(value) {
-      this[multiple] = value;
-    }
-    get pattern() {
-      return this[pattern$];
-    }
-    set pattern(value) {
-      this[pattern$] = value;
-    }
-    get placeholder() {
-      return this[placeholder$];
-    }
-    set placeholder(value) {
-      this[placeholder$] = value;
-    }
-    get readOnly() {
-      return this[readOnly$];
-    }
-    set readOnly(value) {
-      this[readOnly$] = value;
-    }
-    get required() {
-      return this[required$];
-    }
-    set required(value) {
-      this[required$] = value;
-    }
-    get size() {
-      return this[size$];
-    }
-    set size(value) {
-      this[size$] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
-    }
-  };
-  const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
-  const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
-  const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
-  const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
-  const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
-  const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
-  const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
-  const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
-  const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
-  html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.EmailInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
-    fields: () => ({
-      autocomplete: core.String,
-      autofocus: core.bool,
-      maxLength: core.int,
-      multiple: core.bool,
-      pattern: core.String,
-      placeholder: core.String,
-      readOnly: core.bool,
-      required: core.bool,
-      size: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.EmailInputElement, [
-    'autocomplete',
-    'autocomplete',
-    'autofocus',
-    'autofocus',
-    'maxLength',
-    'maxLength',
-    'multiple',
-    'multiple',
-    'pattern',
-    'pattern',
-    'placeholder',
-    'placeholder',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required',
-    'size',
-    'size'
-  ]);
-  html$.PasswordInputElement = class PasswordInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'password'});
-    }
-  };
-  html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
-  dart.setSignature(html$.PasswordInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
-  });
-  dart.defineExtensionNames([
-    'max',
-    'min',
-    'step',
-    'valueAsNumber'
-  ]);
-  html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
-    new() {
-      this[max] = null;
-      this[min] = null;
-      this[step] = null;
-      this[valueAsNumber] = null;
-    }
-    get max() {
-      return this[max];
-    }
-    set max(value) {
-      this[max] = value;
-    }
-    get min() {
-      return this[min];
-    }
-    set min(value) {
-      this[min] = value;
-    }
-    get step() {
-      return this[step];
-    }
-    set step(value) {
-      this[step] = value;
-    }
-    get valueAsNumber() {
-      return this[valueAsNumber];
-    }
-    set valueAsNumber(value) {
-      this[valueAsNumber] = value;
-    }
-  };
-  const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
-  const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
-  const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
-  const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
-  html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.RangeInputElementBase, {
-    fields: () => ({
-      max: core.String,
-      min: core.String,
-      step: core.String,
-      valueAsNumber: core.num
-    })
-  });
-  dart.defineExtensionMembers(html$.RangeInputElementBase, [
-    'max',
-    'max',
-    'min',
-    'min',
-    'step',
-    'step',
-    'valueAsNumber',
-    'valueAsNumber'
-  ]);
-  dart.defineExtensionNames([
-    'valueAsDate',
-    'readOnly',
-    'required'
-  ]);
-  html$.DateInputElement = class DateInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'date'});
-    }
-    get valueAsDate() {
-      return this[valueAsDate];
-    }
-    set valueAsDate(value) {
-      this[valueAsDate] = value;
-    }
-    get readOnly() {
-      return this[readOnly$0];
-    }
-    set readOnly(value) {
-      this[readOnly$0] = value;
-    }
-    get required() {
-      return this[required$0];
-    }
-    set required(value) {
-      this[required$0] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
-    }
-  };
-  const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
-  const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
-  const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
-  html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.DateInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
-    fields: () => ({
-      valueAsDate: core.DateTime,
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.DateInputElement, [
-    'valueAsDate',
-    'valueAsDate',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required'
-  ]);
-  dart.defineExtensionNames([
-    'valueAsDate',
-    'readOnly',
-    'required'
-  ]);
-  html$.MonthInputElement = class MonthInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'month'});
-    }
-    get valueAsDate() {
-      return this[valueAsDate$];
-    }
-    set valueAsDate(value) {
-      this[valueAsDate$] = value;
-    }
-    get readOnly() {
-      return this[readOnly$1];
-    }
-    set readOnly(value) {
-      this[readOnly$1] = value;
-    }
-    get required() {
-      return this[required$1];
-    }
-    set required(value) {
-      this[required$1] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
-    }
-  };
-  const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
-  const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
-  const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
-  html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.MonthInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
-    fields: () => ({
-      valueAsDate: core.DateTime,
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.MonthInputElement, [
-    'valueAsDate',
-    'valueAsDate',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required'
-  ]);
-  dart.defineExtensionNames([
-    'valueAsDate',
-    'readOnly',
-    'required'
-  ]);
-  html$.WeekInputElement = class WeekInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'week'});
-    }
-    get valueAsDate() {
-      return this[valueAsDate$0];
-    }
-    set valueAsDate(value) {
-      this[valueAsDate$0] = value;
-    }
-    get readOnly() {
-      return this[readOnly$2];
-    }
-    set readOnly(value) {
-      this[readOnly$2] = value;
-    }
-    get required() {
-      return this[required$2];
-    }
-    set required(value) {
-      this[required$2] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
-    }
-  };
-  const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
-  const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
-  const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
-  html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.WeekInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
-    fields: () => ({
-      valueAsDate: core.DateTime,
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.WeekInputElement, [
-    'valueAsDate',
-    'valueAsDate',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required'
-  ]);
-  dart.defineExtensionNames([
-    'valueAsDate',
-    'readOnly',
-    'required'
-  ]);
-  html$.TimeInputElement = class TimeInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'time'});
-    }
-    get valueAsDate() {
-      return this[valueAsDate$1];
-    }
-    set valueAsDate(value) {
-      this[valueAsDate$1] = value;
-    }
-    get readOnly() {
-      return this[readOnly$3];
-    }
-    set readOnly(value) {
-      this[readOnly$3] = value;
-    }
-    get required() {
-      return this[required$3];
-    }
-    set required(value) {
-      this[required$3] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
-    }
-  };
-  const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
-  const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
-  const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
-  html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.TimeInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
-    fields: () => ({
-      valueAsDate: core.DateTime,
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.TimeInputElement, [
-    'valueAsDate',
-    'valueAsDate',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required'
-  ]);
-  dart.defineExtensionNames([
-    'readOnly',
-    'required'
-  ]);
-  html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'datetime-local'});
-    }
-    get readOnly() {
-      return this[readOnly$4];
-    }
-    set readOnly(value) {
-      this[readOnly$4] = value;
-    }
-    get required() {
-      return this[required$4];
-    }
-    set required(value) {
-      this[required$4] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
-    }
-  };
-  const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
-  const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
-  html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.LocalDateTimeInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
-    fields: () => ({
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
-  dart.defineExtensionNames([
-    'placeholder',
-    'readOnly',
-    'required'
-  ]);
-  html$.NumberInputElement = class NumberInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'number'});
-    }
-    get placeholder() {
-      return this[placeholder$0];
-    }
-    set placeholder(value) {
-      this[placeholder$0] = value;
-    }
-    get readOnly() {
-      return this[readOnly$5];
-    }
-    set readOnly(value) {
-      this[readOnly$5] = value;
-    }
-    get required() {
-      return this[required$5];
-    }
-    set required(value) {
-      this[required$5] = value;
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
-    }
-  };
-  const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
-  const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
-  const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
-  html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.NumberInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
-    fields: () => ({
-      placeholder: core.String,
-      readOnly: core.bool,
-      required: core.bool
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionMembers(html$.NumberInputElement, [
-    'placeholder',
-    'placeholder',
-    'readOnly',
-    'readOnly',
-    'required',
-    'required'
-  ]);
-  html$.RangeInputElement = class RangeInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'range'});
-    }
-    static get supported() {
-      return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
-    }
-  };
-  html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
-  dart.setSignature(html$.RangeInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineExtensionNames([
-    'checked',
-    'required'
-  ]);
-  html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'checkbox'});
-    }
-    get checked() {
-      return this[checked];
-    }
-    set checked(value) {
-      this[checked] = value;
-    }
-    get required() {
-      return this[required$6];
-    }
-    set required(value) {
-      this[required$6] = value;
-    }
-  };
-  const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
-  const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
-  html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.CheckboxInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
-    fields: () => ({
-      checked: core.bool,
-      required: core.bool
-    })
-  });
-  dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
-  dart.defineExtensionNames([
-    'checked',
-    'required'
-  ]);
-  html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'radio'});
-    }
-    get checked() {
-      return this[checked$];
-    }
-    set checked(value) {
-      this[checked$] = value;
-    }
-    get required() {
-      return this[required$7];
-    }
-    set required(value) {
-      this[required$7] = value;
-    }
-  };
-  const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
-  const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
-  html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.RadioButtonInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
-    fields: () => ({
-      checked: core.bool,
-      required: core.bool
-    })
-  });
-  dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
-  dart.defineExtensionNames([
-    'accept',
-    'multiple',
-    'required',
-    'files'
-  ]);
-  html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'file'});
-    }
-    get accept() {
-      return this[accept];
-    }
-    set accept(value) {
-      this[accept] = value;
-    }
-    get multiple() {
-      return this[multiple$];
-    }
-    set multiple(value) {
-      this[multiple$] = value;
-    }
-    get required() {
-      return this[required$8];
-    }
-    set required(value) {
-      this[required$8] = value;
-    }
-    get files() {
-      return this[files];
-    }
-    set files(value) {
-      this[files] = value;
-    }
-  };
-  const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
-  const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
-  const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
-  const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
-  html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.FileUploadInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
-    fields: () => ({
-      accept: core.String,
-      multiple: core.bool,
-      required: core.bool,
-      files: ListOfFile()
-    })
-  });
-  dart.defineExtensionMembers(html$.FileUploadInputElement, [
-    'accept',
-    'accept',
-    'multiple',
-    'multiple',
-    'required',
-    'required',
-    'files',
-    'files'
-  ]);
-  dart.defineExtensionNames([
-    'formAction',
-    'formEnctype',
-    'formMethod',
-    'formNoValidate',
-    'formTarget'
-  ]);
-  html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'submit'});
-    }
-    get formAction() {
-      return this[formAction];
-    }
-    set formAction(value) {
-      this[formAction] = value;
-    }
-    get formEnctype() {
-      return this[formEnctype];
-    }
-    set formEnctype(value) {
-      this[formEnctype] = value;
-    }
-    get formMethod() {
-      return this[formMethod];
-    }
-    set formMethod(value) {
-      this[formMethod] = value;
-    }
-    get formNoValidate() {
-      return this[formNoValidate];
-    }
-    set formNoValidate(value) {
-      this[formNoValidate] = value;
-    }
-    get formTarget() {
-      return this[formTarget];
-    }
-    set formTarget(value) {
-      this[formTarget] = value;
-    }
-  };
-  const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
-  const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
-  const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
-  const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
-  const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
-  html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.SubmitButtonInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
-    fields: () => ({
-      formAction: core.String,
-      formEnctype: core.String,
-      formMethod: core.String,
-      formNoValidate: core.bool,
-      formTarget: core.String
-    })
-  });
-  dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
-    'formAction',
-    'formAction',
-    'formEnctype',
-    'formEnctype',
-    'formMethod',
-    'formMethod',
-    'formNoValidate',
-    'formNoValidate',
-    'formTarget',
-    'formTarget'
-  ]);
-  dart.defineExtensionNames([
-    'alt',
-    'formAction',
-    'formEnctype',
-    'formMethod',
-    'formNoValidate',
-    'formTarget',
-    'height',
-    'src',
-    'width'
-  ]);
-  html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'image'});
-    }
-    get alt() {
-      return this[alt];
-    }
-    set alt(value) {
-      this[alt] = value;
-    }
-    get formAction() {
-      return this[formAction$];
-    }
-    set formAction(value) {
-      this[formAction$] = value;
-    }
-    get formEnctype() {
-      return this[formEnctype$];
-    }
-    set formEnctype(value) {
-      this[formEnctype$] = value;
-    }
-    get formMethod() {
-      return this[formMethod$];
-    }
-    set formMethod(value) {
-      this[formMethod$] = value;
-    }
-    get formNoValidate() {
-      return this[formNoValidate$];
-    }
-    set formNoValidate(value) {
-      this[formNoValidate$] = value;
-    }
-    get formTarget() {
-      return this[formTarget$];
-    }
-    set formTarget(value) {
-      this[formTarget$] = value;
-    }
-    get height() {
-      return this[height];
-    }
-    set height(value) {
-      this[height] = value;
-    }
-    get src() {
-      return this[src];
-    }
-    set src(value) {
-      this[src] = value;
-    }
-    get width() {
-      return this[width];
-    }
-    set width(value) {
-      this[width] = value;
-    }
-  };
-  const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
-  const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
-  const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
-  const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
-  const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
-  const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
-  const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
-  const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
-  const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
-  html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.ImageButtonInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
-    fields: () => ({
-      alt: core.String,
-      formAction: core.String,
-      formEnctype: core.String,
-      formMethod: core.String,
-      formNoValidate: core.bool,
-      formTarget: core.String,
-      height: core.int,
-      src: core.String,
-      width: core.int
-    })
-  });
-  dart.defineExtensionMembers(html$.ImageButtonInputElement, [
-    'alt',
-    'alt',
-    'formAction',
-    'formAction',
-    'formEnctype',
-    'formEnctype',
-    'formMethod',
-    'formMethod',
-    'formNoValidate',
-    'formNoValidate',
-    'formTarget',
-    'formTarget',
-    'height',
-    'height',
-    'src',
-    'src',
-    'width',
-    'width'
-  ]);
-  html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'reset'});
-    }
-  };
-  html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.ResetButtonInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
-  });
-  html$.ButtonInputElement = class ButtonInputElement extends core.Object {
-    static new() {
-      return html$.InputElement.new({type: 'button'});
-    }
-  };
-  html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
-  dart.setSignature(html$.ButtonInputElement, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
-  });
-  const _initKeyboardEvent = Symbol('_initKeyboardEvent');
-  const _keyIdentifier = Symbol('_keyIdentifier');
-  dart.defineExtensionNames([
-    'keyCode',
-    'charCode',
-    'which',
-    'getModifierState',
-    'altKey',
-    'code',
-    'ctrlKey',
-    'key',
-    'keyLocation',
-    'location',
-    'metaKey',
-    'repeat',
-    'shiftKey'
-  ]);
-  html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
-    static new(type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
-      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
-      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
-      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
-      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
-      if (view == null) {
-        view = html$.window;
-      }
-      let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
-      e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
-      return e;
-    }
-    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
-      if (typeof this.initKeyEvent == "function") {
-        this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
-      } else {
-        this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
-      }
-    }
-    get [dartx.keyCode]() {
-      return this[_keyCode];
-    }
-    get [dartx.charCode]() {
-      return this[_charCode];
-    }
-    get [dartx.which]() {
-      return this[_which];
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.KeyboardEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.KeyboardEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.KeyboardEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.KeyboardEvent(type);
-    }
-    get [dartx.altKey]() {
-      return this.altKey;
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-    get [dartx.ctrlKey]() {
-      return this.ctrlKey;
-    }
-    get [dartx.key]() {
-      return this.key;
-    }
-    get [_keyIdentifier]() {
-      return this.keyIdentifier;
-    }
-    get [dartx.keyLocation]() {
-      return this.keyLocation;
-    }
-    get [dartx.location]() {
-      return this.location;
-    }
-    get [dartx.metaKey]() {
-      return this.metaKey;
-    }
-    get [dartx.repeat]() {
-      return this.repeat;
-    }
-    get [dartx.shiftKey]() {
-      return this.shiftKey;
-    }
-    [dartx.getModifierState](...args) {
-      return this.getModifierState.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.KeyboardEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
-      _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.altKey]: core.bool,
-      [dartx.code]: core.String,
-      [dartx.ctrlKey]: core.bool,
-      [dartx.key]: core.String,
-      [_keyIdentifier]: core.String,
-      [dartx.keyLocation]: core.int,
-      [dartx.location]: core.int,
-      [dartx.metaKey]: core.bool,
-      [dartx.repeat]: core.bool,
-      [dartx.shiftKey]: core.bool
-    }),
-    getters: () => ({
-      [dartx.keyCode]: dart.definiteFunctionType(core.int, []),
-      [dartx.charCode]: dart.definiteFunctionType(core.int, []),
-      [dartx.which]: dart.definiteFunctionType(core.int, [])
-    }),
-    methods: () => ({
-      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
-      [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    sfields: () => ({
-      DOM_KEY_LOCATION_LEFT: core.int,
-      DOM_KEY_LOCATION_NUMPAD: core.int,
-      DOM_KEY_LOCATION_RIGHT: core.int,
-      DOM_KEY_LOCATION_STANDARD: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
-  html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
-  html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
-  html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
-  dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
-  html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(target, keyframes, timing) {
-      if (timing === void 0) timing = null;
-      if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
-        return html$.KeyframeEffect._create_1(target, keyframes);
-      }
-      if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
-        return html$.KeyframeEffect._create_2(target, keyframes, timing);
-      }
-      if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
-        let timing_1 = html_common.convertDartToNative_Dictionary(timing);
-        return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1(target, keyframes) {
-      return new self.KeyframeEffect(target, keyframes);
-    }
-    static _create_2(target, keyframes, timing) {
-      return new self.KeyframeEffect(target, keyframes, timing);
-    }
-    static _create_3(target, keyframes, timing) {
-      return new self.KeyframeEffect(target, keyframes, timing);
-    }
-  };
-  dart.setSignature(html$.KeyframeEffect, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.KeyframeEffect, []),
-      new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'setCustomValidity',
-    'autofocus',
-    'challenge',
-    'disabled',
-    'form',
-    'keytype',
-    'labels',
-    'name',
-    'type',
-    'validationMessage',
-    'validity',
-    'willValidate'
-  ]);
-  html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
-    }
-    created() {
-      this[dartx.autofocus] = null;
-      this[dartx.challenge] = null;
-      this[dartx.disabled] = null;
-      this[dartx.form] = null;
-      this[dartx.keytype] = null;
-      this[dartx.labels] = null;
-      this[dartx.name] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
-    }
-    get [dartx.autofocus]() {
-      return this.autofocus;
-    }
-    set [dartx.autofocus](value) {
-      this.autofocus = value;
-    }
-    get [dartx.challenge]() {
-      return this.challenge;
-    }
-    set [dartx.challenge](value) {
-      this.challenge = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.keytype]() {
-      return this.keytype;
-    }
-    set [dartx.keytype](value) {
-      this.keytype = value;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.KeygenElement, 'created');
-  dart.setSignature(html$.KeygenElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.KeygenElement, []),
-      new: dart.definiteFunctionType(html$.KeygenElement, []),
-      created: dart.definiteFunctionType(html$.KeygenElement, [])
-    }),
-    fields: () => ({
-      [dartx.autofocus]: core.bool,
-      [dartx.challenge]: core.String,
-      [dartx.disabled]: core.bool,
-      [dartx.form]: html$.FormElement,
-      [dartx.keytype]: core.String,
-      [dartx.labels]: ListOfNode(),
-      [dartx.name]: core.String,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.willValidate]: core.bool
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
-  dart.defineExtensionNames([
-    'value'
-  ]);
-  html$.LIElement = class LIElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.LIElement._check(html$.document[dartx.createElement]("li"));
-    }
-    created() {
-      this[dartx.value] = null;
-      super.created();
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.LIElement, 'created');
-  dart.setSignature(html$.LIElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.LIElement, []),
-      new: dart.definiteFunctionType(html$.LIElement, []),
-      created: dart.definiteFunctionType(html$.LIElement, [])
-    }),
-    fields: () => ({[dartx.value]: core.int})
-  });
-  dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
-  dart.defineExtensionNames([
-    'control',
-    'form',
-    'htmlFor'
-  ]);
-  html$.LabelElement = class LabelElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
-    }
-    created() {
-      this[dartx.control] = null;
-      this[dartx.form] = null;
-      this[dartx.htmlFor] = null;
-      super.created();
-    }
-    get [dartx.control]() {
-      return this.control;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.htmlFor]() {
-      return this.htmlFor;
-    }
-    set [dartx.htmlFor](value) {
-      this.htmlFor = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.LabelElement, 'created');
-  dart.setSignature(html$.LabelElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.LabelElement, []),
-      new: dart.definiteFunctionType(html$.LabelElement, []),
-      created: dart.definiteFunctionType(html$.LabelElement, [])
-    }),
-    fields: () => ({
-      [dartx.control]: html$.HtmlElement,
-      [dartx.form]: html$.FormElement,
-      [dartx.htmlFor]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
-  dart.defineExtensionNames([
-    'form'
-  ]);
-  html$.LegendElement = class LegendElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
-    }
-    created() {
-      this[dartx.form] = null;
-      super.created();
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-  };
-  dart.defineNamedConstructor(html$.LegendElement, 'created');
-  dart.setSignature(html$.LegendElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.LegendElement, []),
-      new: dart.definiteFunctionType(html$.LegendElement, []),
-      created: dart.definiteFunctionType(html$.LegendElement, [])
-    }),
-    fields: () => ({[dartx.form]: html$.FormElement})
-  });
-  dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
-  dart.defineExtensionNames([
-    'supportsImport',
-    'crossOrigin',
-    'disabled',
-    'href',
-    'hreflang',
-    'import',
-    'integrity',
-    'media',
-    'rel',
-    'sheet',
-    'sizes',
-    'type'
-  ]);
-  html$.LinkElement = class LinkElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
-    }
-    created() {
-      this[dartx.crossOrigin] = null;
-      this[dartx.disabled] = null;
-      this[dartx.href] = null;
-      this[dartx.hreflang] = null;
-      this[dartx.import] = null;
-      this[dartx.integrity] = null;
-      this[dartx.media] = null;
-      this[dartx.rel] = null;
-      this[dartx.sheet] = null;
-      this[dartx.sizes] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.crossOrigin]() {
-      return this.crossOrigin;
-    }
-    set [dartx.crossOrigin](value) {
-      this.crossOrigin = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.hreflang]() {
-      return this.hreflang;
-    }
-    set [dartx.hreflang](value) {
-      this.hreflang = value;
-    }
-    get [dartx.import]() {
-      return this.import;
-    }
-    get [dartx.integrity]() {
-      return this.integrity;
-    }
-    set [dartx.integrity](value) {
-      this.integrity = value;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    set [dartx.media](value) {
-      this.media = value;
-    }
-    get [dartx.rel]() {
-      return this.rel;
-    }
-    set [dartx.rel](value) {
-      this.rel = value;
-    }
-    get [dartx.sheet]() {
-      return this.sheet;
-    }
-    get [dartx.sizes]() {
-      return this.sizes;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.supportsImport]() {
-      return "import" in this;
-    }
-  };
-  dart.defineNamedConstructor(html$.LinkElement, 'created');
-  dart.setSignature(html$.LinkElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.LinkElement, []),
-      new: dart.definiteFunctionType(html$.LinkElement, []),
-      created: dart.definiteFunctionType(html$.LinkElement, [])
-    }),
-    fields: () => ({
-      [dartx.crossOrigin]: core.String,
-      [dartx.disabled]: core.bool,
-      [dartx.href]: core.String,
-      [dartx.hreflang]: core.String,
-      [dartx.import]: html$.Document,
-      [dartx.integrity]: core.String,
-      [dartx.media]: core.String,
-      [dartx.rel]: core.String,
-      [dartx.sheet]: html$.StyleSheet,
-      [dartx.sizes]: html$.DomSettableTokenList,
-      [dartx.type]: core.String
-    }),
-    getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
-  dart.defineExtensionNames([
-    'assign',
-    'reload',
-    'replace',
-    'origin',
-    'toString',
-    'ancestorOrigins',
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'pathname',
-    'port',
-    'protocol',
-    'search'
-  ]);
-  html$.Location = class Location extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.ancestorOrigins]() {
-      return this.ancestorOrigins;
-    }
-    get [dartx.hash]() {
-      return this.hash;
-    }
-    set [dartx.hash](value) {
-      this.hash = value;
-    }
-    get [dartx.host]() {
-      return this.host;
-    }
-    set [dartx.host](value) {
-      this.host = value;
-    }
-    get [dartx.hostname]() {
-      return this.hostname;
-    }
-    set [dartx.hostname](value) {
-      this.hostname = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.pathname]() {
-      return this.pathname;
-    }
-    set [dartx.pathname](value) {
-      this.pathname = value;
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-    set [dartx.port](value) {
-      this.port = value;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    set [dartx.protocol](value) {
-      this.protocol = value;
-    }
-    get [dartx.search]() {
-      return this.search;
-    }
-    set [dartx.search](value) {
-      this.search = value;
-    }
-    [dartx.assign](...args) {
-      return this.assign.apply(this, args);
-    }
-    [dartx.reload](...args) {
-      return this.reload.apply(this, args);
-    }
-    [dartx.replace](...args) {
-      return this.replace.apply(this, args);
-    }
-    get [dartx.origin]() {
-      if ("origin" in this) {
-        return this.origin;
-      }
-      return dart.str`${this[dartx.protocol]}//${this[dartx.host]}`;
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-  };
-  html$.Location[dart.implements] = () => [html$.LocationBase];
-  dart.setSignature(html$.Location, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
-    fields: () => ({
-      [dartx.ancestorOrigins]: ListOfString(),
-      [dartx.hash]: core.String,
-      [dartx.host]: core.String,
-      [dartx.hostname]: core.String,
-      [dartx.href]: core.String,
-      [dartx.pathname]: core.String,
-      [dartx.port]: core.String,
-      [dartx.protocol]: core.String,
-      [dartx.search]: core.String
-    }),
-    getters: () => ({[dartx.origin]: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({
-      [dartx.assign]: dart.definiteFunctionType(dart.void, [], [core.String]),
-      [dartx.reload]: dart.definiteFunctionType(dart.void, []),
-      [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Location, html$.Location);
-  dart.defineExtensionNames([
-    'areas',
-    'name'
-  ]);
-  html$.MapElement = class MapElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MapElement._check(html$.document[dartx.createElement]("map"));
-    }
-    created() {
-      this[dartx.areas] = null;
-      this[dartx.name] = null;
-      super.created();
-    }
-    get [dartx.areas]() {
-      return this.areas;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.MapElement, 'created');
-  dart.setSignature(html$.MapElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MapElement, []),
-      new: dart.definiteFunctionType(html$.MapElement, []),
-      created: dart.definiteFunctionType(html$.MapElement, [])
-    }),
-    fields: () => ({
-      [dartx.areas]: ListOfNode(),
-      [dartx.name]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
-  dart.defineExtensionNames([
-    'pause',
-    'play',
-    'unpause',
-    'buffered',
-    'currentTime',
-    'defaultPlaybackRate',
-    'duration',
-    'muted',
-    'paused',
-    'playbackRate',
-    'playbackState',
-    'played',
-    'seekable',
-    'volume'
-  ]);
-  html$.MediaController = class MediaController extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MediaController._create_1();
-    }
-    static _create_1() {
-      return new self.MediaController();
-    }
-    get [dartx.buffered]() {
-      return this.buffered;
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    set [dartx.currentTime](value) {
-      this.currentTime = value;
-    }
-    get [dartx.defaultPlaybackRate]() {
-      return this.defaultPlaybackRate;
-    }
-    set [dartx.defaultPlaybackRate](value) {
-      this.defaultPlaybackRate = value;
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    get [dartx.muted]() {
-      return this.muted;
-    }
-    set [dartx.muted](value) {
-      this.muted = value;
-    }
-    get [dartx.paused]() {
-      return this.paused;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    set [dartx.playbackRate](value) {
-      this.playbackRate = value;
-    }
-    get [dartx.playbackState]() {
-      return this.playbackState;
-    }
-    get [dartx.played]() {
-      return this.played;
-    }
-    get [dartx.seekable]() {
-      return this.seekable;
-    }
-    get [dartx.volume]() {
-      return this.volume;
-    }
-    set [dartx.volume](value) {
-      this.volume = value;
-    }
-    [dartx.pause](...args) {
-      return this.pause.apply(this, args);
-    }
-    [dartx.play](...args) {
-      return this.play.apply(this, args);
-    }
-    [dartx.unpause](...args) {
-      return this.unpause.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaController, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaController, []),
-      new: dart.definiteFunctionType(html$.MediaController, [])
-    }),
-    fields: () => ({
-      [dartx.buffered]: html$.TimeRanges,
-      [dartx.currentTime]: core.num,
-      [dartx.defaultPlaybackRate]: core.num,
-      [dartx.duration]: core.double,
-      [dartx.muted]: core.bool,
-      [dartx.paused]: core.bool,
-      [dartx.playbackRate]: core.num,
-      [dartx.playbackState]: core.String,
-      [dartx.played]: html$.TimeRanges,
-      [dartx.seekable]: html$.TimeRanges,
-      [dartx.volume]: core.num
-    }),
-    methods: () => ({
-      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
-      [dartx.play]: dart.definiteFunctionType(dart.void, []),
-      [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.MediaController, html$.MediaController);
-  dart.defineExtensionNames([
-    'deviceId',
-    'groupId',
-    'kind',
-    'label'
-  ]);
-  html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.deviceId]() {
-      return this.deviceId;
-    }
-    get [dartx.groupId]() {
-      return this.groupId;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-  };
-  dart.setSignature(html$.MediaDeviceInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
-    fields: () => ({
-      [dartx.deviceId]: core.String,
-      [dartx.groupId]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
-  const _getUserMedia_1 = Symbol('_getUserMedia_1');
-  dart.defineExtensionNames([
-    'enumerateDevices',
-    'getUserMedia'
-  ]);
-  html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.enumerateDevices](...args) {
-      return this.enumerateDevices.apply(this, args);
-    }
-    [dartx.getUserMedia](options) {
-      let options_1 = html_common.convertDartToNative_Dictionary(options);
-      return this[_getUserMedia_1](options_1);
-    }
-    [_getUserMedia_1](...args) {
-      return this.getUserMedia.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaDevices, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
-    methods: () => ({
-      [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
-      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
-      [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
-  dart.defineExtensionNames([
-    'initData',
-    'initDataType'
-  ]);
-  html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MediaEncryptedEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MediaEncryptedEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MediaEncryptedEvent(type);
-    }
-    get [dartx.initData]() {
-      return this.initData;
-    }
-    get [dartx.initDataType]() {
-      return this.initDataType;
-    }
-  };
-  dart.setSignature(html$.MediaEncryptedEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
-      new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.initData]: typed_data.ByteBuffer,
-      [dartx.initDataType]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
-  dart.defineExtensionNames([
-    'code'
-  ]);
-  html$.MediaError = class MediaError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-  };
-  dart.setSignature(html$.MediaError, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
-    fields: () => ({[dartx.code]: core.int}),
-    sfields: () => ({
-      MEDIA_ERR_ABORTED: core.int,
-      MEDIA_ERR_DECODE: core.int,
-      MEDIA_ERR_NETWORK: core.int,
-      MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
-    })
-  });
-  html$.MediaError.MEDIA_ERR_ABORTED = 1;
-  html$.MediaError.MEDIA_ERR_DECODE = 3;
-  html$.MediaError.MEDIA_ERR_NETWORK = 2;
-  html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
-  dart.registerExtension(dart.global.MediaError, html$.MediaError);
-  dart.defineExtensionNames([
-    'code',
-    'systemCode'
-  ]);
-  html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-    get [dartx.systemCode]() {
-      return this.systemCode;
-    }
-  };
-  dart.setSignature(html$.MediaKeyError, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
-    fields: () => ({
-      [dartx.code]: core.int,
-      [dartx.systemCode]: core.int
-    }),
-    sfields: () => ({
-      MEDIA_KEYERR_CLIENT: core.int,
-      MEDIA_KEYERR_DOMAIN: core.int,
-      MEDIA_KEYERR_HARDWARECHANGE: core.int,
-      MEDIA_KEYERR_OUTPUT: core.int,
-      MEDIA_KEYERR_SERVICE: core.int,
-      MEDIA_KEYERR_UNKNOWN: core.int
-    })
-  });
-  html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
-  html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
-  html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
-  html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
-  html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
-  html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
-  dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
-  dart.defineExtensionNames([
-    'defaultUrl',
-    'errorCode',
-    'initData',
-    'keySystem',
-    'message',
-    'sessionId',
-    'systemCode'
-  ]);
-  html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MediaKeyEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MediaKeyEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MediaKeyEvent(type);
-    }
-    get [dartx.defaultUrl]() {
-      return this.defaultURL;
-    }
-    get [dartx.errorCode]() {
-      return this.errorCode;
-    }
-    get [dartx.initData]() {
-      return this.initData;
-    }
-    get [dartx.keySystem]() {
-      return this.keySystem;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    get [dartx.sessionId]() {
-      return this.sessionId;
-    }
-    get [dartx.systemCode]() {
-      return this.systemCode;
-    }
-  };
-  dart.setSignature(html$.MediaKeyEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
-      new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.defaultUrl]: core.String,
-      [dartx.errorCode]: html$.MediaKeyError,
-      [dartx.initData]: typed_data.Uint8List,
-      [dartx.keySystem]: core.String,
-      [dartx.message]: typed_data.Uint8List,
-      [dartx.sessionId]: core.String,
-      [dartx.systemCode]: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
-  dart.defineExtensionNames([
-    'message',
-    'messageType'
-  ]);
-  html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MediaKeyMessageEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MediaKeyMessageEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MediaKeyMessageEvent(type);
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    get [dartx.messageType]() {
-      return this.messageType;
-    }
-  };
-  dart.setSignature(html$.MediaKeyMessageEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
-      new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.message]: typed_data.ByteBuffer,
-      [dartx.messageType]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
-  const _update$ = Symbol('_update');
-  dart.defineExtensionNames([
-    'close',
-    'generateRequest',
-    'load',
-    'remove',
-    'closed',
-    'expiration',
-    'keyStatuses',
-    'sessionId'
-  ]);
-  html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.closed]() {
-      return this.closed;
-    }
-    get [dartx.expiration]() {
-      return this.expiration;
-    }
-    get [dartx.keyStatuses]() {
-      return this.keyStatuses;
-    }
-    get [dartx.sessionId]() {
-      return this.sessionId;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.generateRequest](...args) {
-      return this.generateRequest.apply(this, args);
-    }
-    [dartx.load](...args) {
-      return this.load.apply(this, args);
-    }
-    [dartx.remove](...args) {
-      return this.remove.apply(this, args);
-    }
-    [_update$](...args) {
-      return this.update.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaKeySession, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
-    fields: () => ({
-      [dartx.closed]: async.Future,
-      [dartx.expiration]: core.double,
-      [dartx.keyStatuses]: html$.MediaKeyStatusMap,
-      [dartx.sessionId]: core.String
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(async.Future, []),
-      [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
-      [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.remove]: dart.definiteFunctionType(async.Future, []),
-      [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
-  dart.defineExtensionNames([
-    'size'
-  ]);
-  html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-  };
-  dart.setSignature(html$.MediaKeyStatusMap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
-    fields: () => ({[dartx.size]: core.int})
-  });
-  dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
-  const _getConfiguration_1 = Symbol('_getConfiguration_1');
-  dart.defineExtensionNames([
-    'createMediaKeys',
-    'getConfiguration',
-    'keySystem'
-  ]);
-  html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.keySystem]() {
-      return this.keySystem;
-    }
-    [dartx.createMediaKeys](...args) {
-      return this.createMediaKeys.apply(this, args);
-    }
-    [dartx.getConfiguration]() {
-      return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
-    }
-    [_getConfiguration_1](...args) {
-      return this.getConfiguration.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaKeySystemAccess, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
-    fields: () => ({[dartx.keySystem]: core.String}),
-    methods: () => ({
-      [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
-      [dartx.getConfiguration]: dart.definiteFunctionType(core.Map, []),
-      [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
-    })
-  });
-  dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
-  const _createSession = Symbol('_createSession');
-  dart.defineExtensionNames([
-    'setServerCertificate'
-  ]);
-  html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_createSession](...args) {
-      return this.createSession.apply(this, args);
-    }
-    [dartx.setServerCertificate](...args) {
-      return this.setServerCertificate.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaKeys, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
-    methods: () => ({
-      [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
-      [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
-  dart.defineExtensionNames([
-    'appendMedium',
-    'deleteMedium',
-    'item',
-    'length',
-    'mediaText'
-  ]);
-  html$.MediaList = class MediaList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.mediaText]() {
-      return this.mediaText;
-    }
-    set [dartx.mediaText](value) {
-      this.mediaText = value;
-    }
-    [dartx.appendMedium](...args) {
-      return this.appendMedium.apply(this, args);
-    }
-    [dartx.deleteMedium](...args) {
-      return this.deleteMedium.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
-    fields: () => ({
-      [dartx.length]: core.int,
-      [dartx.mediaText]: core.String
-    }),
-    methods: () => ({
-      [dartx.appendMedium]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.deleteMedium]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.MediaList, html$.MediaList);
-  dart.defineExtensionNames([
-    'addListener',
-    'removeListener',
-    'onChange',
-    'matches',
-    'media'
-  ]);
-  html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.matches]() {
-      return this.matches;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    [dartx.addListener](...args) {
-      return this.addListener.apply(this, args);
-    }
-    [dartx.removeListener](...args) {
-      return this.removeListener.apply(this, args);
-    }
-    get [dartx.onChange]() {
-      return html$.MediaQueryList.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.MediaQueryList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
-    fields: () => ({
-      [dartx.matches]: core.bool,
-      [dartx.media]: core.String
-    }),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
-      [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
-    }),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.MediaQueryList, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
-  dart.defineExtensionNames([
-    'matches',
-    'media'
-  ]);
-  html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MediaQueryListEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MediaQueryListEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MediaQueryListEvent(type);
-    }
-    get [dartx.matches]() {
-      return this.matches;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-  };
-  dart.setSignature(html$.MediaQueryListEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
-      new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.matches]: core.bool,
-      [dartx.media]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
-  dart.defineExtensionNames([
-    'activate',
-    'deactivate'
-  ]);
-  html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MediaSession._create_1();
-    }
-    static _create_1() {
-      return new self.MediaSession();
-    }
-    [dartx.activate](...args) {
-      return this.activate.apply(this, args);
-    }
-    [dartx.deactivate](...args) {
-      return this.deactivate.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaSession, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaSession, []),
-      new: dart.definiteFunctionType(html$.MediaSession, [])
-    }),
-    methods: () => ({
-      [dartx.activate]: dart.definiteFunctionType(dart.void, []),
-      [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
-  dart.defineExtensionNames([
-    'addSourceBuffer',
-    'endOfStream',
-    'removeSourceBuffer',
-    'activeSourceBuffers',
-    'duration',
-    'readyState',
-    'sourceBuffers'
-  ]);
-  html$.MediaSource = class MediaSource extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MediaSource._create_1();
-    }
-    static _create_1() {
-      return new self.MediaSource();
-    }
-    static get supported() {
-      return !!window.MediaSource;
-    }
-    get [dartx.activeSourceBuffers]() {
-      return this.activeSourceBuffers;
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    set [dartx.duration](value) {
-      this.duration = value;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.sourceBuffers]() {
-      return this.sourceBuffers;
-    }
-    [dartx.addSourceBuffer](...args) {
-      return this.addSourceBuffer.apply(this, args);
-    }
-    [dartx.endOfStream](...args) {
-      return this.endOfStream.apply(this, args);
-    }
-    [dartx.removeSourceBuffer](...args) {
-      return this.removeSourceBuffer.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MediaSource, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaSource, []),
-      new: dart.definiteFunctionType(html$.MediaSource, [])
-    }),
-    fields: () => ({
-      [dartx.activeSourceBuffers]: html$.SourceBufferList,
-      [dartx.duration]: core.num,
-      [dartx.readyState]: core.String,
-      [dartx.sourceBuffers]: html$.SourceBufferList
-    }),
-    methods: () => ({
-      [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
-      [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
-      [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaSource, []),
-      isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    names: ['_create_1', 'isTypeSupported']
-  });
-  dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
-  dart.defineExtensionNames([
-    'addTrack',
-    'clone',
-    'getAudioTracks',
-    'getTrackById',
-    'getTracks',
-    'getVideoTracks',
-    'removeTrack',
-    'stop',
-    'onAddTrack',
-    'onEnded',
-    'onRemoveTrack',
-    'active',
-    'ended',
-    'id',
-    'label'
-  ]);
-  html$.MediaStream = class MediaStream extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(stream_OR_tracks) {
-      if (stream_OR_tracks === void 0) stream_OR_tracks = null;
-      if (stream_OR_tracks == null) {
-        return html$.MediaStream._create_1();
-      }
-      if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
-        return html$.MediaStream._create_2(stream_OR_tracks);
-      }
-      if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
-        return html$.MediaStream._create_3(stream_OR_tracks);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1() {
-      return new self.MediaStream();
-    }
-    static _create_2(stream_OR_tracks) {
-      return new self.MediaStream(stream_OR_tracks);
-    }
-    static _create_3(stream_OR_tracks) {
-      return new self.MediaStream(stream_OR_tracks);
-    }
-    get [dartx.active]() {
-      return this.active;
-    }
-    get [dartx.ended]() {
-      return this.ended;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    [dartx.addTrack](...args) {
-      return this.addTrack.apply(this, args);
-    }
-    [dartx.clone](...args) {
-      return this.clone.apply(this, args);
-    }
-    [dartx.getAudioTracks](...args) {
-      return this.getAudioTracks.apply(this, args);
-    }
-    [dartx.getTrackById](...args) {
-      return this.getTrackById.apply(this, args);
-    }
-    [dartx.getTracks](...args) {
-      return this.getTracks.apply(this, args);
-    }
-    [dartx.getVideoTracks](...args) {
-      return this.getVideoTracks.apply(this, args);
-    }
-    [dartx.removeTrack](...args) {
-      return this.removeTrack.apply(this, args);
-    }
-    [dartx.stop](...args) {
-      return this.stop.apply(this, args);
-    }
-    get [dartx.onAddTrack]() {
-      return html$.MediaStream.addTrackEvent.forTarget(this);
-    }
-    get [dartx.onEnded]() {
-      return html$.MediaStream.endedEvent.forTarget(this);
-    }
-    get [dartx.onRemoveTrack]() {
-      return html$.MediaStream.removeTrackEvent.forTarget(this);
-    }
-    static get supported() {
-      return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
-    }
-  };
-  dart.setSignature(html$.MediaStream, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaStream, []),
-      new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
-    }),
-    fields: () => ({
-      [dartx.active]: core.bool,
-      [dartx.ended]: core.bool,
-      [dartx.id]: core.String,
-      [dartx.label]: core.String
-    }),
-    getters: () => ({
-      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
-      [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
-      [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
-      [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
-      [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
-      [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
-      [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      addTrackEvent: EventStreamProviderOfEvent(),
-      endedEvent: EventStreamProviderOfEvent(),
-      removeTrackEvent: EventStreamProviderOfEvent()
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaStream, []),
-      _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.defineLazy(html$.MediaStream, {
-    get addTrackEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
-    },
-    get endedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ended'));
-    },
-    get removeTrackEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
-    }
-  });
-  dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
-  dart.defineExtensionNames([
-    'stream'
-  ]);
-  html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MediaStreamEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MediaStreamEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MediaStreamEvent(type);
-    }
-    static get supported() {
-      return html_common.Device.isEventTypeSupported('MediaStreamEvent');
-    }
-    get [dartx.stream]() {
-      return this.stream;
-    }
-  };
-  dart.setSignature(html$.MediaStreamEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
-      new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.stream]: html$.MediaStream}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
-  dart.defineExtensionNames([
-    'clone',
-    'stop',
-    'onEnded',
-    'onMute',
-    'onUnmute',
-    'enabled',
-    'id',
-    'kind',
-    'label',
-    'muted',
-    'readyState'
-  ]);
-  html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.enabled]() {
-      return this.enabled;
-    }
-    set [dartx.enabled](value) {
-      this.enabled = value;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.muted]() {
-      return this.muted;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    [dartx.clone](...args) {
-      return this.clone.apply(this, args);
-    }
-    static getSources() {
-      let completer = CompleterOfListOfSourceInfo().new();
-      html$.MediaStreamTrack._getSources(dart.fn(value => {
-        completer.complete(value);
-      }, ListOfSourceInfoToNull()));
-      return completer.future;
-    }
-    [dartx.stop](...args) {
-      return this.stop.apply(this, args);
-    }
-    get [dartx.onEnded]() {
-      return html$.MediaStreamTrack.endedEvent.forTarget(this);
-    }
-    get [dartx.onMute]() {
-      return html$.MediaStreamTrack.muteEvent.forTarget(this);
-    }
-    get [dartx.onUnmute]() {
-      return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.MediaStreamTrack, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
-    fields: () => ({
-      [dartx.enabled]: core.bool,
-      [dartx.id]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String,
-      [dartx.muted]: core.bool,
-      [dartx.readyState]: core.String
-    }),
-    getters: () => ({
-      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      endedEvent: EventStreamProviderOfEvent(),
-      muteEvent: EventStreamProviderOfEvent(),
-      unmuteEvent: EventStreamProviderOfEvent()
-    }),
-    statics: () => ({
-      _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
-      getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
-    }),
-    names: ['_getSources', 'getSources']
-  });
-  dart.defineLazy(html$.MediaStreamTrack, {
-    get endedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ended'));
-    },
-    get muteEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('mute'));
-    },
-    get unmuteEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('unmute'));
-    }
-  });
-  dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
-  dart.defineExtensionNames([
-    'track'
-  ]);
-  html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return html_common.Device.isEventTypeSupported('MediaStreamTrackEvent');
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-  };
-  dart.setSignature(html$.MediaStreamTrackEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
-    fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
-  html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
-  dart.defineExtensionNames([
-    'jsHeapSizeLimit',
-    'totalJSHeapSize',
-    'usedJSHeapSize'
-  ]);
-  html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.jsHeapSizeLimit]() {
-      return this.jsHeapSizeLimit;
-    }
-    get [dartx.totalJSHeapSize]() {
-      return this.totalJSHeapSize;
-    }
-    get [dartx.usedJSHeapSize]() {
-      return this.usedJSHeapSize;
-    }
-  };
-  dart.setSignature(html$.MemoryInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
-    fields: () => ({
-      [dartx.jsHeapSizeLimit]: core.int,
-      [dartx.totalJSHeapSize]: core.int,
-      [dartx.usedJSHeapSize]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
-  dart.defineExtensionNames([
-    'label',
-    'type'
-  ]);
-  html$.MenuElement = class MenuElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
-    }
-    created() {
-      this[dartx.label] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    set [dartx.label](value) {
-      this.label = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.MenuElement, 'created');
-  dart.setSignature(html$.MenuElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MenuElement, []),
-      new: dart.definiteFunctionType(html$.MenuElement, []),
-      created: dart.definiteFunctionType(html$.MenuElement, [])
-    }),
-    fields: () => ({
-      [dartx.label]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
-  dart.defineExtensionNames([
-    'checked',
-    'defaultValue',
-    'disabled',
-    'icon',
-    'label',
-    'radiogroup',
-    'type'
-  ]);
-  html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.checked] = null;
-      this[dartx.defaultValue] = null;
-      this[dartx.disabled] = null;
-      this[dartx.icon] = null;
-      this[dartx.label] = null;
-      this[dartx.radiogroup] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.checked]() {
-      return this.checked;
-    }
-    set [dartx.checked](value) {
-      this.checked = value;
-    }
-    get [dartx.defaultValue]() {
-      return this.default;
-    }
-    set [dartx.defaultValue](value) {
-      this.default = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.icon]() {
-      return this.icon;
-    }
-    set [dartx.icon](value) {
-      this.icon = value;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    set [dartx.label](value) {
-      this.label = value;
-    }
-    get [dartx.radiogroup]() {
-      return this.radiogroup;
-    }
-    set [dartx.radiogroup](value) {
-      this.radiogroup = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.MenuItemElement, 'created');
-  dart.setSignature(html$.MenuItemElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MenuItemElement, []),
-      created: dart.definiteFunctionType(html$.MenuItemElement, [])
-    }),
-    fields: () => ({
-      [dartx.checked]: core.bool,
-      [dartx.defaultValue]: core.bool,
-      [dartx.disabled]: core.bool,
-      [dartx.icon]: core.String,
-      [dartx.label]: core.String,
-      [dartx.radiogroup]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
-  dart.defineExtensionNames([
-    'port1',
-    'port2'
-  ]);
-  html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.port1]() {
-      return this.port1;
-    }
-    get [dartx.port2]() {
-      return this.port2;
-    }
-  };
-  dart.setSignature(html$.MessageChannel, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
-    fields: () => ({
-      [dartx.port1]: html$.MessagePort,
-      [dartx.port2]: html$.MessagePort
-    })
-  });
-  dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
-  const _initMessageEvent = Symbol('_initMessageEvent');
-  const _get_data = Symbol('_get_data');
-  const _get_source = Symbol('_get_source');
-  dart.defineExtensionNames([
-    'data',
-    'source',
-    'lastEventId',
-    'origin'
-  ]);
-  html$.MessageEvent = class MessageEvent extends html$.Event {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
-      let data = opts && 'data' in opts ? opts.data : null;
-      let origin = opts && 'origin' in opts ? opts.origin : null;
-      let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
-      let source = opts && 'source' in opts ? opts.source : null;
-      let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
-      if (source == null) {
-        source = html$.window;
-      }
-      if (!dart.test(html_common.Device.isIE)) {
-        return new self.MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
-      }
-      let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
-      event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
-      return event;
-    }
-    get [dartx.data]() {
-      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
-    }
-    get [_get_data]() {
-      return this.data;
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MessageEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MessageEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MessageEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MessageEvent(type);
-    }
-    get [dartx.lastEventId]() {
-      return this.lastEventId;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.source]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_source]);
-    }
-    get [_get_source]() {
-      return this.source;
-    }
-    [_initMessageEvent](...args) {
-      return this.initMessageEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MessageEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
-      _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_get_data]: dart.dynamic,
-      [dartx.lastEventId]: core.String,
-      [dartx.origin]: core.String,
-      [_get_source]: dart.dynamic
-    }),
-    getters: () => ({
-      [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
-    }),
-    methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
-  dart.defineExtensionNames([
-    'close',
-    'postMessage',
-    'start',
-    'onMessage'
-  ]);
-  html$.MessagePort = class MessagePort extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [dartx.start](...args) {
-      return this.start.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.MessagePort.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.MessagePort, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.start]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.MessagePort, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
-  dart.defineExtensionNames([
-    'content',
-    'httpEquiv',
-    'name'
-  ]);
-  html$.MetaElement = class MetaElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
-    }
-    created() {
-      this[dartx.content] = null;
-      this[dartx.httpEquiv] = null;
-      this[dartx.name] = null;
-      super.created();
-    }
-    get [dartx.content]() {
-      return this.content;
-    }
-    set [dartx.content](value) {
-      this.content = value;
-    }
-    get [dartx.httpEquiv]() {
-      return this.httpEquiv;
-    }
-    set [dartx.httpEquiv](value) {
-      this.httpEquiv = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.MetaElement, 'created');
-  dart.setSignature(html$.MetaElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MetaElement, []),
-      new: dart.definiteFunctionType(html$.MetaElement, []),
-      created: dart.definiteFunctionType(html$.MetaElement, [])
-    }),
-    fields: () => ({
-      [dartx.content]: core.String,
-      [dartx.httpEquiv]: core.String,
-      [dartx.name]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
-  const _get_modificationTime = Symbol('_get_modificationTime');
-  dart.defineExtensionNames([
-    'modificationTime',
-    'size'
-  ]);
-  html$.Metadata = class Metadata extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.modificationTime]() {
-      return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
-    }
-    get [_get_modificationTime]() {
-      return this.modificationTime;
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-  };
-  dart.setSignature(html$.Metadata, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
-    fields: () => ({
-      [_get_modificationTime]: dart.dynamic,
-      [dartx.size]: core.int
-    }),
-    getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
-  });
-  dart.registerExtension(dart.global.Metadata, html$.Metadata);
-  html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
-  dart.defineExtensionNames([
-    'high',
-    'labels',
-    'low',
-    'max',
-    'min',
-    'optimum',
-    'value'
-  ]);
-  html$.MeterElement = class MeterElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
-    }
-    created() {
-      this[dartx.high] = null;
-      this[dartx.labels] = null;
-      this[dartx.low] = null;
-      this[dartx.max] = null;
-      this[dartx.min] = null;
-      this[dartx.optimum] = null;
-      this[dartx.value] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('meter');
-    }
-    get [dartx.high]() {
-      return this.high;
-    }
-    set [dartx.high](value) {
-      this.high = value;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.low]() {
-      return this.low;
-    }
-    set [dartx.low](value) {
-      this.low = value;
-    }
-    get [dartx.max]() {
-      return this.max;
-    }
-    set [dartx.max](value) {
-      this.max = value;
-    }
-    get [dartx.min]() {
-      return this.min;
-    }
-    set [dartx.min](value) {
-      this.min = value;
-    }
-    get [dartx.optimum]() {
-      return this.optimum;
-    }
-    set [dartx.optimum](value) {
-      this.optimum = value;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.MeterElement, 'created');
-  dart.setSignature(html$.MeterElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MeterElement, []),
-      new: dart.definiteFunctionType(html$.MeterElement, []),
-      created: dart.definiteFunctionType(html$.MeterElement, [])
-    }),
-    fields: () => ({
-      [dartx.high]: core.num,
-      [dartx.labels]: ListOfNode(),
-      [dartx.low]: core.num,
-      [dartx.max]: core.num,
-      [dartx.min]: core.num,
-      [dartx.optimum]: core.num,
-      [dartx.value]: core.num
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
-  dart.defineExtensionNames([
-    'inputs',
-    'outputs',
-    'sysexEnabled'
-  ]);
-  html$.MidiAccess = class MidiAccess extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.inputs]() {
-      return this.inputs;
-    }
-    get [dartx.outputs]() {
-      return this.outputs;
-    }
-    get [dartx.sysexEnabled]() {
-      return this.sysexEnabled;
-    }
-  };
-  dart.setSignature(html$.MidiAccess, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
-    fields: () => ({
-      [dartx.inputs]: html$.MidiInputMap,
-      [dartx.outputs]: html$.MidiOutputMap,
-      [dartx.sysexEnabled]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
-  dart.defineExtensionNames([
-    'port'
-  ]);
-  html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MidiConnectionEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new MIDIConnectionEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new MIDIConnectionEvent(type);
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-  };
-  dart.setSignature(html$.MidiConnectionEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
-      new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.port]: html$.MidiPort}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
-  dart.defineExtensionNames([
-    'close',
-    'open',
-    'connection',
-    'id',
-    'manufacturer',
-    'name',
-    'state',
-    'type',
-    'version'
-  ]);
-  html$.MidiPort = class MidiPort extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.connection]() {
-      return this.connection;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.manufacturer]() {
-      return this.manufacturer;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.state]() {
-      return this.state;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.version]() {
-      return this.version;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.open](...args) {
-      return this.open.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MidiPort, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
-    fields: () => ({
-      [dartx.connection]: core.String,
-      [dartx.id]: core.String,
-      [dartx.manufacturer]: core.String,
-      [dartx.name]: core.String,
-      [dartx.state]: core.String,
-      [dartx.type]: core.String,
-      [dartx.version]: core.String
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(async.Future, []),
-      [dartx.open]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
-  dart.defineExtensionNames([
-    'onMidiMessage'
-  ]);
-  html$.MidiInput = class MidiInput extends html$.MidiPort {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.onMidiMessage]() {
-      return html$.MidiInput.midiMessageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.MidiInput, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
-    getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
-    sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
-  });
-  dart.defineLazy(html$.MidiInput, {
-    get midiMessageEvent() {
-      return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
-    }
-  });
-  dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
-  dart.defineExtensionNames([
-    'size'
-  ]);
-  html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-  };
-  dart.setSignature(html$.MidiInputMap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
-    fields: () => ({[dartx.size]: core.int})
-  });
-  dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
-  dart.defineExtensionNames([
-    'data',
-    'receivedTime'
-  ]);
-  html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MidiMessageEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new MIDIMessageEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new MIDIMessageEvent(type);
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    get [dartx.receivedTime]() {
-      return this.receivedTime;
-    }
-  };
-  dart.setSignature(html$.MidiMessageEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
-      new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.data]: typed_data.Uint8List,
-      [dartx.receivedTime]: core.double
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
-  dart.defineExtensionNames([
-    'send'
-  ]);
-  html$.MidiOutput = class MidiOutput extends html$.MidiPort {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.send](...args) {
-      return this.send.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.MidiOutput, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
-    methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
-  });
-  dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
-  dart.defineExtensionNames([
-    'size'
-  ]);
-  html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-  };
-  dart.setSignature(html$.MidiOutputMap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
-    fields: () => ({[dartx.size]: core.int})
-  });
-  dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
-  dart.defineExtensionNames([
-    'description',
-    'enabledPlugin',
-    'suffixes',
-    'type'
-  ]);
-  html$.MimeType = class MimeType extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.description]() {
-      return this.description;
-    }
-    get [dartx.enabledPlugin]() {
-      return this.enabledPlugin;
-    }
-    get [dartx.suffixes]() {
-      return this.suffixes;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.MimeType, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
-    fields: () => ({
-      [dartx.description]: core.String,
-      [dartx.enabledPlugin]: html$.Plugin,
-      [dartx.suffixes]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.MimeType, html$.MimeType);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item',
-    'namedItem'
-  ]);
-  html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-  };
-  html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
-  dart.setSignature(html$.MimeTypeArray, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
-      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
-      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
-  dart.defineExtensionNames([
-    'cite',
-    'dateTime'
-  ]);
-  html$.ModElement = class ModElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.cite] = null;
-      this[dartx.dateTime] = null;
-      super.created();
-    }
-    get [dartx.cite]() {
-      return this.cite;
-    }
-    set [dartx.cite](value) {
-      this.cite = value;
-    }
-    get [dartx.dateTime]() {
-      return this.dateTime;
-    }
-    set [dartx.dateTime](value) {
-      this.dateTime = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.ModElement, 'created');
-  dart.setSignature(html$.ModElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ModElement, []),
-      created: dart.definiteFunctionType(html$.ModElement, [])
-    }),
-    fields: () => ({
-      [dartx.cite]: core.String,
-      [dartx.dateTime]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
-  const _initMouseEvent = Symbol('_initMouseEvent');
-  const _clientX = Symbol('_clientX');
-  const _clientY = Symbol('_clientY');
-  const _layerX = Symbol('_layerX');
-  const _layerY = Symbol('_layerY');
-  const _movementX = Symbol('_movementX');
-  const _movementY = Symbol('_movementY');
-  const _pageX = Symbol('_pageX');
-  const _pageY = Symbol('_pageY');
-  const _screenX = Symbol('_screenX');
-  const _screenY = Symbol('_screenY');
-  const _webkitMovementX = Symbol('_webkitMovementX');
-  const _webkitMovementY = Symbol('_webkitMovementY');
-  const _initMouseEvent_1 = Symbol('_initMouseEvent_1');
-  dart.defineExtensionNames([
-    'relatedTarget',
-    'client',
-    'movement',
-    'offset',
-    'screen',
-    'layer',
-    'page',
-    'altKey',
-    'button',
-    'buttons',
-    'ctrlKey',
-    'dataTransfer',
-    'fromElement',
-    'metaKey',
-    'region',
-    'shiftKey',
-    'toElement'
-  ]);
-  html$.MouseEvent = class MouseEvent extends html$.UIEvent {
-    static new(type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let detail = opts && 'detail' in opts ? opts.detail : 0;
-      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
-      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
-      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
-      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
-      let button = opts && 'button' in opts ? opts.button : 0;
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
-      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
-      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
-      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
-      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
-      if (view == null) {
-        view = html$.window;
-      }
-      let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
-      event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
-      return event;
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.MouseEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.MouseEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.MouseEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.MouseEvent(type);
-    }
-    get [dartx.altKey]() {
-      return this.altKey;
-    }
-    get [dartx.button]() {
-      return this.button;
-    }
-    get [dartx.buttons]() {
-      return this.buttons;
-    }
-    get [_clientX]() {
-      return this.clientX;
-    }
-    get [_clientY]() {
-      return this.clientY;
-    }
-    get [dartx.ctrlKey]() {
-      return this.ctrlKey;
-    }
-    get [dartx.dataTransfer]() {
-      return this.dataTransfer;
-    }
-    get [dartx.fromElement]() {
-      return this.fromElement;
-    }
-    get [_layerX]() {
-      return this.layerX;
-    }
-    get [_layerY]() {
-      return this.layerY;
-    }
-    get [dartx.metaKey]() {
-      return this.metaKey;
-    }
-    get [_movementX]() {
-      return this.movementX;
-    }
-    get [_movementY]() {
-      return this.movementY;
-    }
-    get [_pageX]() {
-      return this.pageX;
-    }
-    get [_pageY]() {
-      return this.pageY;
-    }
-    get [dartx.region]() {
-      return this.region;
-    }
-    get [dartx.relatedTarget]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
-    }
-    get [_get_relatedTarget]() {
-      return this.relatedTarget;
-    }
-    get [_screenX]() {
-      return this.screenX;
-    }
-    get [_screenY]() {
-      return this.screenY;
-    }
-    get [dartx.shiftKey]() {
-      return this.shiftKey;
-    }
-    get [dartx.toElement]() {
-      return this.toElement;
-    }
-    get [_webkitMovementX]() {
-      return this.webkitMovementX;
-    }
-    get [_webkitMovementY]() {
-      return this.webkitMovementY;
-    }
-    [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
-      let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
-      this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
-      return;
-    }
-    [_initMouseEvent_1](...args) {
-      return this.initMouseEvent.apply(this, args);
-    }
-    get [dartx.client]() {
-      return new (PointOfnum())(this[_clientX], this[_clientY]);
-    }
-    get [dartx.movement]() {
-      return new (PointOfnum())(this[_webkitMovementX], this[_webkitMovementY]);
-    }
-    get [dartx.offset]() {
-      if (!!this.offsetX) {
-        let x = this.offsetX;
-        let y = this.offsetY;
-        return new (PointOfnum())(x, y);
-      } else {
-        if (!html$.Element.is(this[dartx.target])) {
-          dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
-        }
-        let target = html$.Element._check(this[dartx.target]);
-        let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
-        return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
-      }
-    }
-    get [dartx.screen]() {
-      return new (PointOfnum())(this[_screenX], this[_screenY]);
-    }
-    get [dartx.layer]() {
-      return new (PointOfnum())(this[_layerX], this[_layerY]);
-    }
-    get [dartx.page]() {
-      return new (PointOfnum())(this[_pageX], this[_pageY]);
-    }
-  };
-  dart.setSignature(html$.MouseEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
-      _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.altKey]: core.bool,
-      [dartx.button]: core.int,
-      [dartx.buttons]: core.int,
-      [_clientX]: core.int,
-      [_clientY]: core.int,
-      [dartx.ctrlKey]: core.bool,
-      [dartx.dataTransfer]: html$.DataTransfer,
-      [dartx.fromElement]: html$.Node,
-      [_layerX]: core.int,
-      [_layerY]: core.int,
-      [dartx.metaKey]: core.bool,
-      [_movementX]: core.int,
-      [_movementY]: core.int,
-      [_pageX]: core.int,
-      [_pageY]: core.int,
-      [dartx.region]: core.String,
-      [_get_relatedTarget]: dart.dynamic,
-      [_screenX]: core.int,
-      [_screenY]: core.int,
-      [dartx.shiftKey]: core.bool,
-      [dartx.toElement]: html$.Node,
-      [_webkitMovementX]: core.int,
-      [_webkitMovementY]: core.int
-    }),
-    getters: () => ({
-      [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
-      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.layer]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
-    }),
-    methods: () => ({
-      [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
-      [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
-  dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
-  html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
-  const _observe_1 = Symbol('_observe_1');
-  const _observe = Symbol('_observe');
-  const _call = Symbol('_call');
-  dart.defineExtensionNames([
-    'disconnect',
-    'takeRecords',
-    'observe'
-  ]);
-  html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
-    [dartx.disconnect](...args) {
-      return this.disconnect.apply(this, args);
-    }
-    [_observe](target, options) {
-      let options_1 = html_common.convertDartToNative_Dictionary(options);
-      this[_observe_1](target, options_1);
-      return;
-    }
-    [_observe_1](...args) {
-      return this.observe.apply(this, args);
-    }
-    [dartx.takeRecords](...args) {
-      return this.takeRecords.apply(this, args);
-    }
-    static get supported() {
-      return !!(window.MutationObserver || window.WebKitMutationObserver);
-    }
-    [dartx.observe](target, opts) {
-      let childList = opts && 'childList' in opts ? opts.childList : null;
-      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
-      let characterData = opts && 'characterData' in opts ? opts.characterData : null;
-      let subtree = opts && 'subtree' in opts ? opts.subtree : null;
-      let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
-      let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
-      let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
-      let parsedOptions = html$.MutationObserver._createDict();
-      function override(key, value) {
-        if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
-      }
-      dart.fn(override, dynamicAnddynamicToNull());
-      override('childList', childList);
-      override('attributes', attributes);
-      override('characterData', characterData);
-      override('subtree', subtree);
-      override('attributeOldValue', attributeOldValue);
-      override('characterDataOldValue', characterDataOldValue);
-      if (attributeFilter != null) {
-        override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
-      }
-      this[_call](target, parsedOptions);
-    }
-    static _createDict() {
-      return {};
-    }
-    static _add(m, key, value) {
-      m[key] = value;
-    }
-    static _fixupList(list) {
-      return list;
-    }
-    [_call](...args) {
-      return this.observe.apply(this, args);
-    }
-    static new(callback) {
-      0;
-      return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html$._wrapBinaryZone(ListOfMutationRecord(), html$.MutationObserver, dart.void)(callback), 2));
-    }
-  };
-  dart.setSignature(html$.MutationObserver, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
-    methods: () => ({
-      [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
-      [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
-      [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
-      [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
-      [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
-      [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
-    }),
-    sfields: () => ({_boolKeys: MapOfString$bool()}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _createDict: dart.definiteFunctionType(dart.dynamic, []),
-      _add: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
-      _fixupList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    }),
-    names: ['_createDict', '_add', '_fixupList']
-  });
-  html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
-  dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
-  dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
-  dart.defineExtensionNames([
-    'addedNodes',
-    'attributeName',
-    'attributeNamespace',
-    'nextSibling',
-    'oldValue',
-    'previousSibling',
-    'removedNodes',
-    'target',
-    'type'
-  ]);
-  html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.addedNodes]() {
-      return this.addedNodes;
-    }
-    get [dartx.attributeName]() {
-      return this.attributeName;
-    }
-    get [dartx.attributeNamespace]() {
-      return this.attributeNamespace;
-    }
-    get [dartx.nextSibling]() {
-      return this.nextSibling;
-    }
-    get [dartx.oldValue]() {
-      return this.oldValue;
-    }
-    get [dartx.previousSibling]() {
-      return this.previousSibling;
-    }
-    get [dartx.removedNodes]() {
-      return this.removedNodes;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.MutationRecord, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
-    fields: () => ({
-      [dartx.addedNodes]: ListOfNode(),
-      [dartx.attributeName]: core.String,
-      [dartx.attributeNamespace]: core.String,
-      [dartx.nextSibling]: html$.Node,
-      [dartx.oldValue]: core.String,
-      [dartx.previousSibling]: html$.Node,
-      [dartx.removedNodes]: ListOfNode(),
-      [dartx.target]: html$.Node,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
-  const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
-  const _getUserMedia = Symbol('_getUserMedia');
-  const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
-  const _requestMidiAccess_2 = Symbol('_requestMidiAccess_2');
-  dart.defineExtensionNames([
-    'language',
-    'getUserMedia',
-    'getBattery',
-    'getGamepads',
-    'getVRDevices',
-    'registerProtocolHandler',
-    'requestMidiAccess',
-    'requestMediaKeySystemAccess',
-    'sendBeacon',
-    'getStorageUpdates',
-    'bluetooth',
-    'connection',
-    'credentials',
-    'doNotTrack',
-    'geolocation',
-    'maxTouchPoints',
-    'mediaDevices',
-    'mimeTypes',
-    'permissions',
-    'presentation',
-    'productSub',
-    'serviceWorker',
-    'services',
-    'storageQuota',
-    'vendor',
-    'vendorSub',
-    'persistentStorage',
-    'temporaryStorage',
-    'hardwareConcurrency',
-    'appCodeName',
-    'appName',
-    'appVersion',
-    'dartEnabled',
-    'platform',
-    'product',
-    'userAgent',
-    'languages',
-    'onLine',
-    'cookieEnabled'
-  ]);
-  html$.Navigator = class Navigator extends _interceptors.Interceptor {
-    get [dartx.language]() {
-      return this.language || this.userLanguage;
-    }
-    [dartx.getUserMedia](opts) {
-      let audio = opts && 'audio' in opts ? opts.audio : false;
-      let video = opts && 'video' in opts ? opts.video : false;
-      let completer = CompleterOfMediaStream().new();
-      let options = dart.map({audio: audio, video: video}, core.String, dart.dynamic);
-      this[_ensureGetUserMedia]();
-      this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
-        completer.complete(stream);
-      }, MediaStreamToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, NavigatorUserMediaErrorToNull()));
-      return completer.future;
-    }
-    [_ensureGetUserMedia]() {
-      if (!this.getUserMedia) {
-        this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
-      }
-    }
-    [_getUserMedia](...args) {
-      return this.getUserMedia.apply(this, args);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.bluetooth]() {
-      return this.bluetooth;
-    }
-    get [dartx.connection]() {
-      return this.connection;
-    }
-    get [dartx.credentials]() {
-      return this.credentials;
-    }
-    get [dartx.doNotTrack]() {
-      return this.doNotTrack;
-    }
-    get [dartx.geolocation]() {
-      return this.geolocation;
-    }
-    get [dartx.maxTouchPoints]() {
-      return this.maxTouchPoints;
-    }
-    get [dartx.mediaDevices]() {
-      return this.mediaDevices;
-    }
-    get [dartx.mimeTypes]() {
-      return this.mimeTypes;
-    }
-    get [dartx.permissions]() {
-      return this.permissions;
-    }
-    get [dartx.presentation]() {
-      return this.presentation;
-    }
-    get [dartx.productSub]() {
-      return this.productSub;
-    }
-    get [dartx.serviceWorker]() {
-      return this.serviceWorker;
-    }
-    get [dartx.services]() {
-      return this.services;
-    }
-    get [dartx.storageQuota]() {
-      return this.storageQuota;
-    }
-    get [dartx.vendor]() {
-      return this.vendor;
-    }
-    get [dartx.vendorSub]() {
-      return this.vendorSub;
-    }
-    get [dartx.persistentStorage]() {
-      return this.webkitPersistentStorage;
-    }
-    get [dartx.temporaryStorage]() {
-      return this.webkitTemporaryStorage;
-    }
-    [dartx.getBattery](...args) {
-      return this.getBattery.apply(this, args);
-    }
-    [dartx.getGamepads](...args) {
-      return this.getGamepads.apply(this, args);
-    }
-    [dartx.getVRDevices](...args) {
-      return this.getVRDevices.apply(this, args);
-    }
-    [dartx.registerProtocolHandler](...args) {
-      return this.registerProtocolHandler.apply(this, args);
-    }
-    [dartx.requestMidiAccess](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_requestMidiAccess_1](options_1);
-      }
-      return this[_requestMidiAccess_2]();
-    }
-    [_requestMidiAccess_1](...args) {
-      return this.requestMIDIAccess.apply(this, args);
-    }
-    [_requestMidiAccess_2](...args) {
-      return this.requestMIDIAccess.apply(this, args);
-    }
-    [dartx.requestMediaKeySystemAccess](...args) {
-      return this.requestMediaKeySystemAccess.apply(this, args);
-    }
-    [dartx.sendBeacon](...args) {
-      return this.sendBeacon.apply(this, args);
-    }
-    get [dartx.hardwareConcurrency]() {
-      return this.hardwareConcurrency;
-    }
-    get [dartx.appCodeName]() {
-      return this.appCodeName;
-    }
-    get [dartx.appName]() {
-      return this.appName;
-    }
-    get [dartx.appVersion]() {
-      return this.appVersion;
-    }
-    get [dartx.dartEnabled]() {
-      return this.dartEnabled;
-    }
-    get [dartx.platform]() {
-      return this.platform;
-    }
-    get [dartx.product]() {
-      return this.product;
-    }
-    get [dartx.userAgent]() {
-      return this.userAgent;
-    }
-    get [dartx.languages]() {
-      return this.languages;
-    }
-    get [dartx.onLine]() {
-      return this.onLine;
-    }
-    get [dartx.cookieEnabled]() {
-      return this.cookieEnabled;
-    }
-    [dartx.getStorageUpdates](...args) {
-      return this.getStorageUpdates.apply(this, args);
-    }
-  };
-  html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
-  dart.setSignature(html$.Navigator, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
-    fields: () => ({
-      [dartx.bluetooth]: html$.Bluetooth,
-      [dartx.connection]: html$.NetworkInformation,
-      [dartx.credentials]: html$.CredentialsContainer,
-      [dartx.doNotTrack]: core.String,
-      [dartx.geolocation]: html$.Geolocation,
-      [dartx.maxTouchPoints]: core.int,
-      [dartx.mediaDevices]: html$.MediaDevices,
-      [dartx.mimeTypes]: html$.MimeTypeArray,
-      [dartx.permissions]: html$.Permissions,
-      [dartx.presentation]: html$.Presentation,
-      [dartx.productSub]: core.String,
-      [dartx.serviceWorker]: html$.ServiceWorkerContainer,
-      [dartx.services]: html$.ServicePortCollection,
-      [dartx.storageQuota]: html$.StorageQuota,
-      [dartx.vendor]: core.String,
-      [dartx.vendorSub]: core.String,
-      [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
-      [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
-      [dartx.hardwareConcurrency]: core.int,
-      [dartx.appCodeName]: core.String,
-      [dartx.appName]: core.String,
-      [dartx.appVersion]: core.String,
-      [dartx.dartEnabled]: core.bool,
-      [dartx.platform]: core.String,
-      [dartx.product]: core.String,
-      [dartx.userAgent]: core.String,
-      [dartx.languages]: ListOfString(),
-      [dartx.onLine]: core.bool,
-      [dartx.cookieEnabled]: core.bool
-    }),
-    getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({
-      [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
-      [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
-      [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
-      [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
-      [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
-      [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
-      [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_requestMidiAccess_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_requestMidiAccess_2]: dart.definiteFunctionType(async.Future, []),
-      [dartx.requestMediaKeySystemAccess]: dart.definiteFunctionType(async.Future, [core.String, ListOfMap()]),
-      [dartx.sendBeacon]: dart.definiteFunctionType(core.bool, [core.String, core.Object]),
-      [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.Navigator, html$.Navigator);
-  dart.defineExtensionNames([
-    'hardwareConcurrency'
-  ]);
-  html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get hardwareConcurrency() {
-      return this[hardwareConcurrency];
-    }
-    set hardwareConcurrency(value) {
-      super.hardwareConcurrency = value;
-    }
-  };
-  const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
-  dart.setSignature(html$.NavigatorCpu, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
-    fields: () => ({hardwareConcurrency: core.int})
-  });
-  dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
-  dart.defineExtensionNames([
-    'appCodeName',
-    'appName',
-    'appVersion',
-    'dartEnabled',
-    'platform',
-    'product',
-    'userAgent'
-  ]);
-  html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get appCodeName() {
-      return this[appCodeName];
-    }
-    set appCodeName(value) {
-      super.appCodeName = value;
-    }
-    get appName() {
-      return this[appName];
-    }
-    set appName(value) {
-      super.appName = value;
-    }
-    get appVersion() {
-      return this[appVersion];
-    }
-    set appVersion(value) {
-      super.appVersion = value;
-    }
-    get dartEnabled() {
-      return this[dartEnabled];
-    }
-    set dartEnabled(value) {
-      super.dartEnabled = value;
-    }
-    get platform() {
-      return this[platform];
-    }
-    set platform(value) {
-      super.platform = value;
-    }
-    get product() {
-      return this[product];
-    }
-    set product(value) {
-      super.product = value;
-    }
-    get userAgent() {
-      return this[userAgent];
-    }
-    set userAgent(value) {
-      super.userAgent = value;
-    }
-  };
-  const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
-  const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
-  const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
-  const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
-  const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
-  const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
-  const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
-  dart.setSignature(html$.NavigatorID, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
-    fields: () => ({
-      appCodeName: core.String,
-      appName: core.String,
-      appVersion: core.String,
-      dartEnabled: core.bool,
-      platform: core.String,
-      product: core.String,
-      userAgent: core.String
-    })
-  });
-  dart.defineExtensionMembers(html$.NavigatorID, [
-    'appCodeName',
-    'appName',
-    'appVersion',
-    'dartEnabled',
-    'platform',
-    'product',
-    'userAgent'
-  ]);
-  dart.defineExtensionNames([
-    'language',
-    'languages'
-  ]);
-  html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get language() {
-      return this[language];
-    }
-    set language(value) {
-      super.language = value;
-    }
-    get languages() {
-      return this[languages];
-    }
-    set languages(value) {
-      super.languages = value;
-    }
-  };
-  const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
-  const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
-  dart.setSignature(html$.NavigatorLanguage, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
-    fields: () => ({
-      language: core.String,
-      languages: ListOfString()
-    })
-  });
-  dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
-  dart.defineExtensionNames([
-    'onLine'
-  ]);
-  html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get onLine() {
-      return this[onLine];
-    }
-    set onLine(value) {
-      super.onLine = value;
-    }
-  };
-  const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
-  dart.setSignature(html$.NavigatorOnLine, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
-    fields: () => ({onLine: core.bool})
-  });
-  dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
-  dart.defineExtensionNames([
-    'getStorageUpdates',
-    'cookieEnabled'
-  ]);
-  html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.cookieEnabled]() {
-      return this.cookieEnabled;
-    }
-    [dartx.getStorageUpdates](...args) {
-      return this.getStorageUpdates.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.NavigatorStorageUtils, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
-    fields: () => ({[dartx.cookieEnabled]: core.bool}),
-    methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
-  });
-  dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
-  dart.defineExtensionNames([
-    'constraintName',
-    'message',
-    'name'
-  ]);
-  html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.constraintName]() {
-      return this.constraintName;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-  };
-  dart.setSignature(html$.NavigatorUserMediaError, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
-    fields: () => ({
-      [dartx.constraintName]: core.String,
-      [dartx.message]: core.String,
-      [dartx.name]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
-  html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
-  html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
-  dart.defineExtensionNames([
-    'type'
-  ]);
-  html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.NetworkInformation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
-    fields: () => ({[dartx.type]: core.String})
-  });
-  dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
-  html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
-    new(this$) {
-      this[_this] = this$;
-    }
-    get first() {
-      let result = this[_this].firstChild;
-      if (result == null) dart.throw(new core.StateError("No elements"));
-      return result;
-    }
-    get last() {
-      let result = this[_this].lastChild;
-      if (result == null) dart.throw(new core.StateError("No elements"));
-      return result;
-    }
-    get single() {
-      let l = this.length;
-      if (l == 0) dart.throw(new core.StateError("No elements"));
-      if (dart.notNull(l) > 1) dart.throw(new core.StateError("More than one element"));
-      return this[_this].firstChild;
-    }
-    add(value) {
-      this[_this][dartx.append](value);
-    }
-    addAll(iterable) {
-      if (html$._ChildNodeListLazy.is(iterable)) {
-        let otherList = iterable;
-        if (!core.identical(otherList[_this], this[_this])) {
-          for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
-            this[_this][dartx.append](otherList[_this][dartx.firstChild]);
-          }
-        }
-        return;
-      }
-      for (let node of iterable) {
-        this[_this][dartx.append](node);
-      }
-    }
-    insert(index, node) {
-      if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
-        dart.throw(new core.RangeError.range(index, 0, this.length));
-      }
-      if (index == this.length) {
-        this[_this][dartx.append](node);
-      } else {
-        this[_this][dartx.insertBefore](node, this._get(index));
-      }
-    }
-    insertAll(index, iterable) {
-      if (index == this.length) {
-        this.addAll(iterable);
-      } else {
-        let item = this._get(index);
-        this[_this][dartx.insertAllBefore](iterable, item);
-      }
-    }
-    setAll(index, iterable) {
-      dart.throw(new core.UnsupportedError("Cannot setAll on Node list"));
-    }
-    removeLast() {
-      let result = this.last;
-      if (result != null) {
-        this[_this][_removeChild](result);
-      }
-      return result;
-    }
-    removeAt(index) {
-      let result = this._get(index);
-      if (result != null) {
-        this[_this][_removeChild](result);
-      }
-      return result;
-    }
-    remove(object) {
-      if (!html$.Node.is(object)) return false;
-      let node = html$.Node._check(object);
-      if (!core.identical(this[_this], node[dartx.parentNode])) return false;
-      this[_this][_removeChild](node);
-      return true;
-    }
-    [_filter$0](test, removeMatching) {
-      let child = this[_this][dartx.firstChild];
-      while (child != null) {
-        let nextChild = child[dartx.nextNode];
-        if (test(child) == removeMatching) {
-          this[_this][_removeChild](child);
-        }
-        child = nextChild;
-      }
-    }
-    removeWhere(test) {
-      this[_filter$0](test, true);
-    }
-    retainWhere(test) {
-      this[_filter$0](test, false);
-    }
-    clear() {
-      this[_this][_clearChildren]();
-    }
-    _set(index, value) {
-      this[_this][_replaceChild](value, this._get(index));
-      return value;
-    }
-    get iterator() {
-      return this[_this][dartx.childNodes][dartx.iterator];
+    setRange(start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      js.JsArray._checkRange(start, end, this.length);
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (length == 0) return;
+      if (dart.notNull(skipCount) < 0) dart.throw(new core.ArgumentError(skipCount));
+      let args = JSArrayOfObject().of([start, length]);
+      args[dartx.addAll](iterable[dartx.skip](skipCount)[dartx.take](length));
+      this.callMethod('splice', args);
     }
     sort(compare) {
       if (compare === void 0) compare = null;
-      dart.throw(new core.UnsupportedError("Cannot sort Node list"));
+      this.callMethod('sort', compare == null ? [] : JSArrayOfEAndEToint().of([compare]));
     }
-    shuffle(random) {
-      if (random === void 0) random = null;
-      dart.throw(new core.UnsupportedError("Cannot shuffle Node list"));
-    }
-    setRange(start, end, iterable, skipCount) {
-      if (skipCount === void 0) skipCount = 0;
-      dart.throw(new core.UnsupportedError("Cannot setRange on Node list"));
-    }
-    fillRange(start, end, fill) {
-      if (fill === void 0) fill = null;
-      dart.throw(new core.UnsupportedError("Cannot fillRange on Node list"));
-    }
-    get length() {
-      return this[_this][dartx.childNodes][dartx.length];
-    }
-    set length(value) {
-      dart.throw(new core.UnsupportedError("Cannot set length on immutable List."));
-    }
-    _get(index) {
-      return this[_this][dartx.childNodes][dartx._get](index);
-    }
-    get rawList() {
-      return this[_this][dartx.childNodes];
-    }
-  };
-  dart.addSimpleTypeTests(html$._ChildNodeListLazy);
-  html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
-  dart.setSignature(html$._ChildNodeListLazy, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
-    fields: () => ({[_this]: html$.Node}),
-    getters: () => ({
-      length: dart.definiteFunctionType(core.int, []),
-      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
+  }
+  dart.addTypeTests(JsArray);
+  dart.defineNamedConstructor(JsArray, 'from');
+  dart.defineNamedConstructor(JsArray, '_fromJs');
+  dart.setSignature(JsArray, {
+    constructors: () => ({
+      new: dart.definiteFunctionType(js.JsArray$(E), []),
+      from: dart.definiteFunctionType(js.JsArray$(E), [IterableOfE()]),
+      _fromJs: dart.definiteFunctionType(js.JsArray$(E), [dart.dynamic])
     }),
+    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
     setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
     methods: () => ({
-      [_filter$0]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
-      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
-      _get: dart.definiteFunctionType(html$.Node, [core.int])
-    })
+      [_checkIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+      [_checkInsertIndex]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+      _get: dart.definiteFunctionType(E, [core.Object]),
+      _set: dart.definiteFunctionType(dart.void, [core.Object, E])
+    }),
+    statics: () => ({_checkRange: dart.definiteFunctionType(dart.dynamic, [core.int, core.int, core.int])}),
+    names: ['_checkRange']
   });
-  dart.defineExtensionMembers(html$._ChildNodeListLazy, [
+  dart.defineExtensionMembers(JsArray, [
+    '_get',
+    '_set',
     'add',
     'addAll',
     'insert',
-    'insertAll',
-    'setAll',
-    'removeLast',
     'removeAt',
-    'remove',
-    'removeWhere',
-    'retainWhere',
-    'clear',
-    '_set',
-    'sort',
-    'shuffle',
+    'removeLast',
+    'removeRange',
     'setRange',
-    'fillRange',
-    '_get',
-    'first',
-    'last',
-    'single',
-    'iterator',
+    'sort',
     'length',
     'length'
   ]);
-  html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
+  return JsArray;
+});
+js.JsArray = JsArray();
+js._isBrowserType = function(o) {
+  return o instanceof Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window);
+};
+dart.fn(js._isBrowserType, dynamicTobool$());
+const _dartObj = Symbol('_dartObj');
+js._DartObject = class _DartObject extends core.Object {
+  new(dartObj) {
+    this[_dartObj] = dartObj;
+  }
+};
+dart.setSignature(js._DartObject, {
+  constructors: () => ({new: dart.definiteFunctionType(js._DartObject, [dart.dynamic])}),
+  fields: () => ({[_dartObj]: dart.dynamic})
+});
+js._convertToJS = function(o) {
+  if (o == null || typeof o == 'string' || typeof o == 'number' || typeof o == 'boolean' || dart.test(js._isBrowserType(o))) {
+    return o;
+  } else if (core.DateTime.is(o)) {
+    return _js_helper.Primitives.lazyAsJsDate(o);
+  } else if (js.JsObject.is(o)) {
+    return o[_jsObject];
+  } else if (core.Function.is(o)) {
+    return js._putIfAbsent(js._jsProxies, o, js._wrapDartFunction);
+  } else {
+    return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
+  }
+};
+dart.fn(js._convertToJS, dynamicTodynamic$());
+js._wrapDartFunction = function(f) {
+  let wrapper = function() {
+    let args = Array.prototype.map.call(arguments, js._convertToDart);
+    return js._convertToJS(f(...args));
   };
-  dart.setSignature(html$.NodeFilter, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
-    sfields: () => ({
-      FILTER_ACCEPT: core.int,
-      FILTER_REJECT: core.int,
-      FILTER_SKIP: core.int,
-      SHOW_ALL: core.int,
-      SHOW_COMMENT: core.int,
-      SHOW_DOCUMENT: core.int,
-      SHOW_DOCUMENT_FRAGMENT: core.int,
-      SHOW_DOCUMENT_TYPE: core.int,
-      SHOW_ELEMENT: core.int,
-      SHOW_PROCESSING_INSTRUCTION: core.int,
-      SHOW_TEXT: core.int
-    })
-  });
-  html$.NodeFilter.FILTER_ACCEPT = 1;
-  html$.NodeFilter.FILTER_REJECT = 2;
-  html$.NodeFilter.FILTER_SKIP = 3;
-  html$.NodeFilter.SHOW_ALL = 4294967295;
-  html$.NodeFilter.SHOW_COMMENT = 128;
-  html$.NodeFilter.SHOW_DOCUMENT = 256;
-  html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
-  html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
-  html$.NodeFilter.SHOW_ELEMENT = 1;
-  html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
-  html$.NodeFilter.SHOW_TEXT = 4;
-  dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
-  dart.defineExtensionNames([
-    'detach',
-    'nextNode',
-    'previousNode',
-    'pointerBeforeReferenceNode',
-    'referenceNode',
-    'root',
-    'whatToShow'
-  ]);
-  html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
-    static new(root, whatToShow) {
-      return html$.document[_createNodeIterator](root, whatToShow, null);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.pointerBeforeReferenceNode]() {
-      return this.pointerBeforeReferenceNode;
-    }
-    get [dartx.referenceNode]() {
-      return this.referenceNode;
-    }
-    get [dartx.root]() {
-      return this.root;
-    }
-    get [dartx.whatToShow]() {
-      return this.whatToShow;
-    }
-    [dartx.detach](...args) {
-      return this.detach.apply(this, args);
-    }
-    [dartx.nextNode](...args) {
-      return this.nextNode.apply(this, args);
-    }
-    [dartx.previousNode](...args) {
-      return this.previousNode.apply(this, args);
-    }
+  js._dartProxies.set(wrapper, f);
+  return wrapper;
+};
+dart.fn(js._wrapDartFunction, dynamicTodynamic$());
+js._convertToDart = function(o) {
+  if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
+    return o;
+  } else if (o instanceof Date) {
+    let ms = o.getTime();
+    return new core.DateTime.fromMillisecondsSinceEpoch(dart.asInt(ms));
+  } else if (js._DartObject.is(o) && dart.jsobject != dart.getReifiedType(o)) {
+    return o[_dartObj];
+  } else {
+    return js._wrapToDart(o);
+  }
+};
+dart.fn(js._convertToDart, dynamicToObject());
+js._wrapToDart = function(o) {
+  return js._putIfAbsent(js._dartProxies, o, js._wrapToDartHelper);
+};
+dart.fn(js._wrapToDart, dynamicToObject());
+js._wrapToDartHelper = function(o) {
+  if (typeof o == "function") {
+    return new js.JsFunction._fromJs(o);
+  }
+  if (o instanceof Array) {
+    return new js.JsArray._fromJs(o);
+  }
+  return new js.JsObject._fromJs(o);
+};
+dart.fn(js._wrapToDartHelper, dynamicToObject());
+dart.defineLazy(js, {
+  get _dartProxies() {
+    return new WeakMap();
+  }
+});
+dart.defineLazy(js, {
+  get _jsProxies() {
+    return new WeakMap();
+  }
+});
+js._putIfAbsent = function(weakMap, o, getValue) {
+  let value = weakMap.get(o);
+  if (value == null) {
+    value = dart.dcall(getValue, o);
+    weakMap.set(o, value);
+  }
+  return value;
+};
+dart.fn(js._putIfAbsent, dynamicAnddynamicAndFnToObject());
+js.allowInterop = function(F) {
+  return f => {
+    return f;
   };
-  dart.setSignature(html$.NodeIterator, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
-      _: dart.definiteFunctionType(html$.NodeIterator, [])
-    }),
-    fields: () => ({
-      [dartx.pointerBeforeReferenceNode]: core.bool,
-      [dartx.referenceNode]: html$.Node,
-      [dartx.root]: html$.Node,
-      [dartx.whatToShow]: core.int
-    }),
-    methods: () => ({
-      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
-      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
-    })
-  });
-  dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt'
-  ]);
-  html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+};
+dart.fn(js.allowInterop, FToF());
+dart.defineLazy(js, {
+  get _interopCaptureThisExpando() {
+    return new (ExpandoOfFunction())();
+  },
+  set _interopCaptureThisExpando(_) {}
+});
+js.allowInteropCaptureThis = function(f) {
+  let ret = js._interopCaptureThisExpando._get(f);
+  if (ret == null) {
+    ret = function() {
+      let args = [this];
+      for (let arg of arguments) {
+        args.push(arg);
       }
-      dart.throw(new core.StateError("No elements"));
+      return f(...args);
+    };
+    js._interopCaptureThisExpando._set(f, ret);
+  }
+  return ret;
+};
+dart.fn(js.allowInteropCaptureThis, FunctionToFunction());
+js_util.jsify = function(object) {
+  if (!core.Map.is(object) && !core.Iterable.is(object)) {
+    dart.throw(new core.ArgumentError("object must be a Map or Iterable"));
+  }
+  return js_util._convertDataTree(object);
+};
+dart.fn(js_util.jsify, dynamicTodynamic$());
+js_util._convertDataTree = function(data) {
+  let _convertedObjects = collection.HashMap.identity();
+  function _convert(o) {
+    if (dart.test(_convertedObjects.containsKey(o))) {
+      return _convertedObjects._get(o);
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
+    if (core.Map.is(o)) {
+      let convertedMap = {};
+      _convertedObjects._set(o, convertedMap);
+      for (let key of o[dartx.keys]) {
+        convertedMap[key] = _convert(o[dartx._get](key));
       }
-      dart.throw(new core.StateError("No elements"));
+      return convertedMap;
+    } else if (core.Iterable.is(o)) {
+      let convertedList = [];
+      _convertedObjects._set(o, convertedList);
+      convertedList[dartx.addAll](o[dartx.map](dart.dynamic)(_convert));
+      return convertedList;
+    } else {
+      return o;
     }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
+  }
+  dart.fn(_convert, dynamicTodynamic$());
+  return _convert(data);
+};
+dart.fn(js_util._convertDataTree, dynamicTodynamic$());
+js_util.newObject = function() {
+  return {};
+};
+dart.fn(js_util.newObject, VoidTodynamic$());
+js_util.hasProperty = function(o, name) {
+  return name in o;
+};
+dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
+js_util.getProperty = function(o, name) {
+  return o[name];
+};
+dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
+js_util.setProperty = function(o, name, value) {
+  return o[name] = value;
+};
+dart.fn(js_util.setProperty, dynamicAnddynamicAnddynamicTodynamic());
+js_util.callMethod = function(o, method, args) {
+  return o[method].apply(o, args);
+};
+dart.fn(js_util.callMethod, dynamicAndStringAndListTodynamic());
+js_util.instanceof = function(o, type) {
+  return o instanceof type;
+};
+dart.fn(js_util.instanceof, dynamicAndFunctionTodynamic());
+js_util.callConstructor = function(constr, arguments$) {
+  if (arguments$ == null) {
+    return new constr();
+  }
+  if (arguments$ instanceof Array) {
+    let argumentCount = arguments$.length;
+    switch (argumentCount) {
+      case 0:
+      {
+        return new constr();
       }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [_item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-  dart.setSignature(html$.NodeList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
-      [_item]: dart.definiteFunctionType(html$.Node, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.NodeList, html$.NodeList);
-  dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
-  dart.defineExtensionNames([
-    'nextElementSibling',
-    'previousElementSibling'
-  ]);
-  html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.nextElementSibling]() {
-      return this.nextElementSibling;
-    }
-    get [dartx.previousElementSibling]() {
-      return this.previousElementSibling;
-    }
-  };
-  dart.setSignature(html$.NonDocumentTypeChildNode, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
-    fields: () => ({
-      [dartx.nextElementSibling]: html$.Element,
-      [dartx.previousElementSibling]: html$.Element
-    })
-  });
-  dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
-  dart.defineExtensionNames([
-    'getElementById'
-  ]);
-  html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getElementById](...args) {
-      return this.getElementById.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.NonElementParentNode, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
-    methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
-  });
-  dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
-  dart.defineExtensionNames([
-    'close',
-    'onClick',
-    'onClose',
-    'onError',
-    'onShow',
-    'body',
-    'data',
-    'dir',
-    'icon',
-    'lang',
-    'permission',
-    'silent',
-    'tag',
-    'title',
-    'vibrate'
-  ]);
-  html$.Notification = class Notification extends html$.EventTarget {
-    static new(title, opts) {
-      let dir = opts && 'dir' in opts ? opts.dir : null;
-      let body = opts && 'body' in opts ? opts.body : null;
-      let lang = opts && 'lang' in opts ? opts.lang : null;
-      let tag = opts && 'tag' in opts ? opts.tag : null;
-      let icon = opts && 'icon' in opts ? opts.icon : null;
-      let parsedOptions = dart.map();
-      if (dir != null) parsedOptions[dartx._set]('dir', dir);
-      if (body != null) parsedOptions[dartx._set]('body', body);
-      if (lang != null) parsedOptions[dartx._set]('lang', lang);
-      if (tag != null) parsedOptions[dartx._set]('tag', tag);
-      if (icon != null) parsedOptions[dartx._set]('icon', icon);
-      return html$.Notification._factoryNotification(title, parsedOptions);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static _factoryNotification(title, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return html$.Notification._create_1(title, options_1);
+      case 1:
+      {
+        let arg0 = arguments$[0];
+        return new constr(arg0);
       }
-      return html$.Notification._create_2(title);
-    }
-    static _create_1(title, options) {
-      return new self.Notification(title, options);
-    }
-    static _create_2(title) {
-      return new self.Notification(title);
-    }
-    static get supported() {
-      return !!window.Notification;
-    }
-    get [dartx.body]() {
-      return this.body;
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    get [dartx.dir]() {
-      return this.dir;
-    }
-    get [dartx.icon]() {
-      return this.icon;
-    }
-    get [dartx.lang]() {
-      return this.lang;
-    }
-    get [dartx.permission]() {
-      return this.permission;
-    }
-    get [dartx.silent]() {
-      return this.silent;
-    }
-    get [dartx.tag]() {
-      return this.tag;
-    }
-    get [dartx.title]() {
-      return this.title;
-    }
-    get [dartx.vibrate]() {
-      return this.vibrate;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    static requestPermission() {
-      let completer = CompleterOfString().new();
-      html$.Notification._requestPermission(dart.fn(value => {
-        completer.complete(value);
-      }, StringToNull()));
-      return completer.future;
-    }
-    get [dartx.onClick]() {
-      return html$.Notification.clickEvent.forTarget(this);
-    }
-    get [dartx.onClose]() {
-      return html$.Notification.closeEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.Notification.errorEvent.forTarget(this);
-    }
-    get [dartx.onShow]() {
-      return html$.Notification.showEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.Notification, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
-      _: dart.definiteFunctionType(html$.Notification, [])
-    }),
-    fields: () => ({
-      [dartx.body]: core.String,
-      [dartx.data]: core.Object,
-      [dartx.dir]: core.String,
-      [dartx.icon]: core.String,
-      [dartx.lang]: core.String,
-      [dartx.permission]: core.String,
-      [dartx.silent]: core.bool,
-      [dartx.tag]: core.String,
-      [dartx.title]: core.String,
-      [dartx.vibrate]: ListOfint()
-    }),
-    getters: () => ({
-      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
-    sfields: () => ({
-      clickEvent: EventStreamProviderOfEvent(),
-      closeEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      showEvent: EventStreamProviderOfEvent()
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
-      _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
-      _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
-      requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
-    }),
-    names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
-  });
-  dart.defineLazy(html$.Notification, {
-    get clickEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('click'));
-    },
-    get closeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('close'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get showEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('show'));
-    }
-  });
-  dart.registerExtension(dart.global.Notification, html$.Notification);
-  dart.defineExtensionNames([
-    'notification'
-  ]);
-  html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.NotificationEvent._create_1(type, eventInitDict_1);
+      case 2:
+      {
+        let arg0 = arguments$[0];
+        let arg1 = arguments$[1];
+        return new constr(arg0, arg1);
       }
-      return html$.NotificationEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.NotificationEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.NotificationEvent(type);
-    }
-    get [dartx.notification]() {
-      return this.notification;
-    }
-  };
-  dart.setSignature(html$.NotificationEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.NotificationEvent, []),
-      new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.notification]: html$.Notification}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
-  html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
-  dart.defineExtensionNames([
-    'reversed',
-    'start',
-    'type'
-  ]);
-  html$.OListElement = class OListElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
-    }
-    created() {
-      this[dartx.reversed] = null;
-      this[dartx.start] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.reversed]() {
-      return this.reversed;
-    }
-    set [dartx.reversed](value) {
-      this.reversed = value;
-    }
-    get [dartx.start]() {
-      return this.start;
-    }
-    set [dartx.start](value) {
-      this.start = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.OListElement, 'created');
-  dart.setSignature(html$.OListElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.OListElement, []),
-      new: dart.definiteFunctionType(html$.OListElement, []),
-      created: dart.definiteFunctionType(html$.OListElement, [])
-    }),
-    fields: () => ({
-      [dartx.reversed]: core.bool,
-      [dartx.start]: core.int,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'setCustomValidity',
-    'data',
-    'form',
-    'height',
-    'name',
-    'type',
-    'useMap',
-    'validationMessage',
-    'validity',
-    'width',
-    'willValidate'
-  ]);
-  html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
-    }
-    created() {
-      this[dartx.data] = null;
-      this[dartx.form] = null;
-      this[dartx.height] = null;
-      this[dartx.name] = null;
-      this[dartx.type] = null;
-      this[dartx.useMap] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.width] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('object');
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    set [dartx.data](value) {
-      this.data = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.useMap]() {
-      return this.useMap;
-    }
-    set [dartx.useMap](value) {
-      this.useMap = value;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [__setter__](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.ObjectElement, 'created');
-  dart.setSignature(html$.ObjectElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ObjectElement, []),
-      new: dart.definiteFunctionType(html$.ObjectElement, []),
-      created: dart.definiteFunctionType(html$.ObjectElement, [])
-    }),
-    fields: () => ({
-      [dartx.data]: core.String,
-      [dartx.form]: html$.FormElement,
-      [dartx.height]: core.String,
-      [dartx.name]: core.String,
-      [dartx.type]: core.String,
-      [dartx.useMap]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.width]: core.String,
-      [dartx.willValidate]: core.bool
-    }),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
-  dart.defineExtensionNames([
-    'disabled',
-    'label'
-  ]);
-  html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
-    }
-    created() {
-      this[dartx.disabled] = null;
-      this[dartx.label] = null;
-      super.created();
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    set [dartx.label](value) {
-      this.label = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.OptGroupElement, 'created');
-  dart.setSignature(html$.OptGroupElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.OptGroupElement, []),
-      new: dart.definiteFunctionType(html$.OptGroupElement, []),
-      created: dart.definiteFunctionType(html$.OptGroupElement, [])
-    }),
-    fields: () => ({
-      [dartx.disabled]: core.bool,
-      [dartx.label]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
-  dart.defineExtensionNames([
-    'defaultSelected',
-    'disabled',
-    'form',
-    'index',
-    'label',
-    'selected',
-    'value'
-  ]);
-  html$.OptionElement = class OptionElement extends html$.HtmlElement {
-    static new(opts) {
-      let data = opts && 'data' in opts ? opts.data : '';
-      let value = opts && 'value' in opts ? opts.value : '';
-      let selected = opts && 'selected' in opts ? opts.selected : false;
-      return html$.OptionElement._(data, value, null, selected);
-    }
-    static _(data, value, defaultSelected, selected) {
-      if (data === void 0) data = null;
-      if (value === void 0) value = null;
-      if (defaultSelected === void 0) defaultSelected = null;
-      if (selected === void 0) selected = null;
-      if (selected != null) {
-        return html$.OptionElement._create_1(data, value, defaultSelected, selected);
+      case 3:
+      {
+        let arg0 = arguments$[0];
+        let arg1 = arguments$[1];
+        let arg2 = arguments$[2];
+        return new constr(arg0, arg1, arg2);
       }
-      if (defaultSelected != null) {
-        return html$.OptionElement._create_2(data, value, defaultSelected);
-      }
-      if (value != null) {
-        return html$.OptionElement._create_3(data, value);
-      }
-      if (data != null) {
-        return html$.OptionElement._create_4(data);
-      }
-      return html$.OptionElement._create_5();
-    }
-    static _create_1(data, value, defaultSelected, selected) {
-      return new Option(data, value, defaultSelected, selected);
-    }
-    static _create_2(data, value, defaultSelected) {
-      return new Option(data, value, defaultSelected);
-    }
-    static _create_3(data, value) {
-      return new Option(data, value);
-    }
-    static _create_4(data) {
-      return new Option(data);
-    }
-    static _create_5() {
-      return new Option();
-    }
-    created() {
-      this[dartx.defaultSelected] = null;
-      this[dartx.disabled] = null;
-      this[dartx.form] = null;
-      this[dartx.index] = null;
-      this[dartx.label] = null;
-      this[dartx.selected] = null;
-      this[dartx.value] = null;
-      super.created();
-    }
-    get [dartx.defaultSelected]() {
-      return this.defaultSelected;
-    }
-    set [dartx.defaultSelected](value) {
-      this.defaultSelected = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.index]() {
-      return this.index;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    set [dartx.label](value) {
-      this.label = value;
-    }
-    get [dartx.selected]() {
-      return this.selected;
-    }
-    set [dartx.selected](value) {
-      this.selected = value;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.OptionElement, 'created');
-  dart.setSignature(html$.OptionElement, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
-      _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
-      created: dart.definiteFunctionType(html$.OptionElement, [])
-    }),
-    fields: () => ({
-      [dartx.defaultSelected]: core.bool,
-      [dartx.disabled]: core.bool,
-      [dartx.form]: html$.FormElement,
-      [dartx.index]: core.int,
-      [dartx.label]: core.String,
-      [dartx.selected]: core.bool,
-      [dartx.value]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
-      _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
-      _create_5: dart.definiteFunctionType(html$.OptionElement, [])
-    }),
-    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
-  });
-  dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'setCustomValidity',
-    'defaultValue',
-    'form',
-    'htmlFor',
-    'labels',
-    'name',
-    'type',
-    'validationMessage',
-    'validity',
-    'value',
-    'willValidate'
-  ]);
-  html$.OutputElement = class OutputElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
-    }
-    created() {
-      this[dartx.defaultValue] = null;
-      this[dartx.form] = null;
-      this[dartx.htmlFor] = null;
-      this[dartx.labels] = null;
-      this[dartx.name] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.value] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('output');
-    }
-    get [dartx.defaultValue]() {
-      return this.defaultValue;
-    }
-    set [dartx.defaultValue](value) {
-      this.defaultValue = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.htmlFor]() {
-      return this.htmlFor;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.OutputElement, 'created');
-  dart.setSignature(html$.OutputElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.OutputElement, []),
-      new: dart.definiteFunctionType(html$.OutputElement, []),
-      created: dart.definiteFunctionType(html$.OutputElement, [])
-    }),
-    fields: () => ({
-      [dartx.defaultValue]: core.String,
-      [dartx.form]: html$.FormElement,
-      [dartx.htmlFor]: html$.DomSettableTokenList,
-      [dartx.labels]: ListOfNode(),
-      [dartx.name]: core.String,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.value]: core.String,
-      [dartx.willValidate]: core.bool
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
-  dart.defineExtensionNames([
-    'persisted'
-  ]);
-  html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.PageTransitionEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.PageTransitionEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.PageTransitionEvent(type);
-    }
-    get [dartx.persisted]() {
-      return this.persisted;
-    }
-  };
-  dart.setSignature(html$.PageTransitionEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
-      new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.persisted]: core.bool}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
-  html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.ParagraphElement, 'created');
-  dart.setSignature(html$.ParagraphElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ParagraphElement, []),
-      new: dart.definiteFunctionType(html$.ParagraphElement, []),
-      created: dart.definiteFunctionType(html$.ParagraphElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
-  dart.defineExtensionNames([
-    'name',
-    'value'
-  ]);
-  html$.ParamElement = class ParamElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
-    }
-    created() {
-      this[dartx.name] = null;
-      this[dartx.value] = null;
-      super.created();
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.ParamElement, 'created');
-  dart.setSignature(html$.ParamElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ParamElement, []),
-      new: dart.definiteFunctionType(html$.ParamElement, []),
-      created: dart.definiteFunctionType(html$.ParamElement, [])
-    }),
-    fields: () => ({
-      [dartx.name]: core.String,
-      [dartx.value]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
-  html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.ParentNode, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
-    fields: () => ({
-      [_childElementCount]: core.int,
-      [_children]: ListOfNode(),
-      [_firstElementChild]: html$.Element,
-      [_lastElementChild]: html$.Element
-    })
-  });
-  dart.defineExtensionNames([
-    'formData',
-    'password'
-  ]);
-  html$.PasswordCredential = class PasswordCredential extends html$.Credential {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(id, password, name, iconURL) {
-      if (name === void 0) name = null;
-      if (iconURL === void 0) iconURL = null;
-      if (iconURL != null) {
-        return html$.PasswordCredential._create_1(id, password, name, iconURL);
-      }
-      if (name != null) {
-        return html$.PasswordCredential._create_2(id, password, name);
-      }
-      return html$.PasswordCredential._create_3(id, password);
-    }
-    static _create_1(id, password, name, iconURL) {
-      return new self.PasswordCredential(id, password, name, iconURL);
-    }
-    static _create_2(id, password, name) {
-      return new self.PasswordCredential(id, password, name);
-    }
-    static _create_3(id, password) {
-      return new self.PasswordCredential(id, password);
-    }
-    get [dartx.formData]() {
-      return this.formData;
-    }
-    get [dartx.password]() {
-      return this.password;
-    }
-  };
-  dart.setSignature(html$.PasswordCredential, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PasswordCredential, []),
-      new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
-    }),
-    fields: () => ({
-      [dartx.formData]: html$.FormData,
-      [dartx.password]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
-  dart.defineExtensionNames([
-    'addPath',
-    'arc',
-    'arcTo',
-    'bezierCurveTo',
-    'closePath',
-    'ellipse',
-    'lineTo',
-    'moveTo',
-    'quadraticCurveTo',
-    'rect'
-  ]);
-  html$.Path2D = class Path2D extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(path_OR_text) {
-      if (path_OR_text === void 0) path_OR_text = null;
-      if (path_OR_text == null) {
-        return html$.Path2D._create_1();
-      }
-      if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
-        return html$.Path2D._create_2(path_OR_text);
-      }
-      if (typeof path_OR_text == 'string' || path_OR_text == null) {
-        return html$.Path2D._create_3(path_OR_text);
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    static _create_1() {
-      return new Path2D();
-    }
-    static _create_2(path_OR_text) {
-      return new Path2D(path_OR_text);
-    }
-    static _create_3(path_OR_text) {
-      return new Path2D(path_OR_text);
-    }
-    [dartx.addPath](...args) {
-      return this.addPath.apply(this, args);
-    }
-    [dartx.arc](...args) {
-      return this.arc.apply(this, args);
-    }
-    [dartx.arcTo](...args) {
-      return this.arcTo.apply(this, args);
-    }
-    [dartx.bezierCurveTo](...args) {
-      return this.bezierCurveTo.apply(this, args);
-    }
-    [dartx.closePath](...args) {
-      return this.closePath.apply(this, args);
-    }
-    [dartx.ellipse](...args) {
-      return this.ellipse.apply(this, args);
-    }
-    [dartx.lineTo](...args) {
-      return this.lineTo.apply(this, args);
-    }
-    [dartx.moveTo](...args) {
-      return this.moveTo.apply(this, args);
-    }
-    [dartx.quadraticCurveTo](...args) {
-      return this.quadraticCurveTo.apply(this, args);
-    }
-    [dartx.rect](...args) {
-      return this.rect.apply(this, args);
-    }
-  };
-  html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
-  dart.setSignature(html$.Path2D, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.Path2D, []),
-      new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
-    }),
-    methods: () => ({
-      [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
-      [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
-      [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
-      [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
-      [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
-      [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.Path2D, []),
-      _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.registerExtension(dart.global.Path2D, html$.Path2D);
-  dart.defineExtensionNames([
-    'clearFrameTimings',
-    'clearMarks',
-    'clearMeasures',
-    'getEntries',
-    'getEntriesByName',
-    'getEntriesByType',
-    'mark',
-    'measure',
-    'now',
-    'setFrameTimingBufferSize',
-    'clearResourceTimings',
-    'setResourceTimingBufferSize',
-    'onResourceTimingBufferFull',
-    'memory',
-    'navigation',
-    'timing'
-  ]);
-  html$.Performance = class Performance extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!window.performance;
-    }
-    get [dartx.memory]() {
-      return this.memory;
-    }
-    get [dartx.navigation]() {
-      return this.navigation;
-    }
-    get [dartx.timing]() {
-      return this.timing;
-    }
-    [dartx.clearFrameTimings](...args) {
-      return this.clearFrameTimings.apply(this, args);
-    }
-    [dartx.clearMarks](...args) {
-      return this.clearMarks.apply(this, args);
-    }
-    [dartx.clearMeasures](...args) {
-      return this.clearMeasures.apply(this, args);
-    }
-    [dartx.getEntries](...args) {
-      return this.getEntries.apply(this, args);
-    }
-    [dartx.getEntriesByName](...args) {
-      return this.getEntriesByName.apply(this, args);
-    }
-    [dartx.getEntriesByType](...args) {
-      return this.getEntriesByType.apply(this, args);
-    }
-    [dartx.mark](...args) {
-      return this.mark.apply(this, args);
-    }
-    [dartx.measure](...args) {
-      return this.measure.apply(this, args);
-    }
-    [dartx.now](...args) {
-      return this.now.apply(this, args);
-    }
-    [dartx.setFrameTimingBufferSize](...args) {
-      return this.setFrameTimingBufferSize.apply(this, args);
-    }
-    [dartx.clearResourceTimings](...args) {
-      return this.webkitClearResourceTimings.apply(this, args);
-    }
-    [dartx.setResourceTimingBufferSize](...args) {
-      return this.webkitSetResourceTimingBufferSize.apply(this, args);
-    }
-    get [dartx.onResourceTimingBufferFull]() {
-      return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.Performance, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
-    fields: () => ({
-      [dartx.memory]: html$.MemoryInfo,
-      [dartx.navigation]: html$.PerformanceNavigation,
-      [dartx.timing]: html$.PerformanceTiming
-    }),
-    getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
-      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
-      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
-      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
-      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.now]: dart.definiteFunctionType(core.double, []),
-      [dartx.setFrameTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineLazy(html$.Performance, {
-    get resourceTimingBufferFullEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
-    }
-  });
-  dart.registerExtension(dart.global.Performance, html$.Performance);
-  dart.defineExtensionNames([
-    'duration',
-    'entryType',
-    'name',
-    'startTime'
-  ]);
-  html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    get [dartx.entryType]() {
-      return this.entryType;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.startTime]() {
-      return this.startTime;
-    }
-  };
-  dart.setSignature(html$.PerformanceEntry, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
-    fields: () => ({
-      [dartx.duration]: core.double,
-      [dartx.entryType]: core.String,
-      [dartx.name]: core.String,
-      [dartx.startTime]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
-  dart.defineExtensionNames([
-    'sourceFrame'
-  ]);
-  html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.sourceFrame]() {
-      return this.sourceFrame;
-    }
-  };
-  dart.setSignature(html$.PerformanceCompositeTiming, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
-    fields: () => ({[dartx.sourceFrame]: core.int})
-  });
-  dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
-  html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.PerformanceMark, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
-  });
-  dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
-  html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.PerformanceMeasure, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
-  });
-  dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
-  dart.defineExtensionNames([
-    'redirectCount',
-    'type'
-  ]);
-  html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.redirectCount]() {
-      return this.redirectCount;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.PerformanceNavigation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
-    fields: () => ({
-      [dartx.redirectCount]: core.int,
-      [dartx.type]: core.int
-    }),
-    sfields: () => ({
-      TYPE_BACK_FORWARD: core.int,
-      TYPE_NAVIGATE: core.int,
-      TYPE_RELOAD: core.int,
-      TYPE_RESERVED: core.int
-    })
-  });
-  html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
-  html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
-  html$.PerformanceNavigation.TYPE_RELOAD = 1;
-  html$.PerformanceNavigation.TYPE_RESERVED = 255;
-  dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
-  dart.defineExtensionNames([
-    'sourceFrame'
-  ]);
-  html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.sourceFrame]() {
-      return this.sourceFrame;
-    }
-  };
-  dart.setSignature(html$.PerformanceRenderTiming, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
-    fields: () => ({[dartx.sourceFrame]: core.int})
-  });
-  dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
-  dart.defineExtensionNames([
-    'connectEnd',
-    'connectStart',
-    'domainLookupEnd',
-    'domainLookupStart',
-    'fetchStart',
-    'initiatorType',
-    'redirectEnd',
-    'redirectStart',
-    'requestStart',
-    'responseEnd',
-    'responseStart',
-    'secureConnectionStart',
-    'workerStart'
-  ]);
-  html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.connectEnd]() {
-      return this.connectEnd;
-    }
-    get [dartx.connectStart]() {
-      return this.connectStart;
-    }
-    get [dartx.domainLookupEnd]() {
-      return this.domainLookupEnd;
-    }
-    get [dartx.domainLookupStart]() {
-      return this.domainLookupStart;
-    }
-    get [dartx.fetchStart]() {
-      return this.fetchStart;
-    }
-    get [dartx.initiatorType]() {
-      return this.initiatorType;
-    }
-    get [dartx.redirectEnd]() {
-      return this.redirectEnd;
-    }
-    get [dartx.redirectStart]() {
-      return this.redirectStart;
-    }
-    get [dartx.requestStart]() {
-      return this.requestStart;
-    }
-    get [dartx.responseEnd]() {
-      return this.responseEnd;
-    }
-    get [dartx.responseStart]() {
-      return this.responseStart;
-    }
-    get [dartx.secureConnectionStart]() {
-      return this.secureConnectionStart;
-    }
-    get [dartx.workerStart]() {
-      return this.workerStart;
-    }
-  };
-  dart.setSignature(html$.PerformanceResourceTiming, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
-    fields: () => ({
-      [dartx.connectEnd]: core.double,
-      [dartx.connectStart]: core.double,
-      [dartx.domainLookupEnd]: core.double,
-      [dartx.domainLookupStart]: core.double,
-      [dartx.fetchStart]: core.double,
-      [dartx.initiatorType]: core.String,
-      [dartx.redirectEnd]: core.double,
-      [dartx.redirectStart]: core.double,
-      [dartx.requestStart]: core.double,
-      [dartx.responseEnd]: core.double,
-      [dartx.responseStart]: core.double,
-      [dartx.secureConnectionStart]: core.double,
-      [dartx.workerStart]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
-  dart.defineExtensionNames([
-    'connectEnd',
-    'connectStart',
-    'domComplete',
-    'domContentLoadedEventEnd',
-    'domContentLoadedEventStart',
-    'domInteractive',
-    'domLoading',
-    'domainLookupEnd',
-    'domainLookupStart',
-    'fetchStart',
-    'loadEventEnd',
-    'loadEventStart',
-    'navigationStart',
-    'redirectEnd',
-    'redirectStart',
-    'requestStart',
-    'responseEnd',
-    'responseStart',
-    'secureConnectionStart',
-    'unloadEventEnd',
-    'unloadEventStart'
-  ]);
-  html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.connectEnd]() {
-      return this.connectEnd;
-    }
-    get [dartx.connectStart]() {
-      return this.connectStart;
-    }
-    get [dartx.domComplete]() {
-      return this.domComplete;
-    }
-    get [dartx.domContentLoadedEventEnd]() {
-      return this.domContentLoadedEventEnd;
-    }
-    get [dartx.domContentLoadedEventStart]() {
-      return this.domContentLoadedEventStart;
-    }
-    get [dartx.domInteractive]() {
-      return this.domInteractive;
-    }
-    get [dartx.domLoading]() {
-      return this.domLoading;
-    }
-    get [dartx.domainLookupEnd]() {
-      return this.domainLookupEnd;
-    }
-    get [dartx.domainLookupStart]() {
-      return this.domainLookupStart;
-    }
-    get [dartx.fetchStart]() {
-      return this.fetchStart;
-    }
-    get [dartx.loadEventEnd]() {
-      return this.loadEventEnd;
-    }
-    get [dartx.loadEventStart]() {
-      return this.loadEventStart;
-    }
-    get [dartx.navigationStart]() {
-      return this.navigationStart;
-    }
-    get [dartx.redirectEnd]() {
-      return this.redirectEnd;
-    }
-    get [dartx.redirectStart]() {
-      return this.redirectStart;
-    }
-    get [dartx.requestStart]() {
-      return this.requestStart;
-    }
-    get [dartx.responseEnd]() {
-      return this.responseEnd;
-    }
-    get [dartx.responseStart]() {
-      return this.responseStart;
-    }
-    get [dartx.secureConnectionStart]() {
-      return this.secureConnectionStart;
-    }
-    get [dartx.unloadEventEnd]() {
-      return this.unloadEventEnd;
-    }
-    get [dartx.unloadEventStart]() {
-      return this.unloadEventStart;
-    }
-  };
-  dart.setSignature(html$.PerformanceTiming, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
-    fields: () => ({
-      [dartx.connectEnd]: core.int,
-      [dartx.connectStart]: core.int,
-      [dartx.domComplete]: core.int,
-      [dartx.domContentLoadedEventEnd]: core.int,
-      [dartx.domContentLoadedEventStart]: core.int,
-      [dartx.domInteractive]: core.int,
-      [dartx.domLoading]: core.int,
-      [dartx.domainLookupEnd]: core.int,
-      [dartx.domainLookupStart]: core.int,
-      [dartx.fetchStart]: core.int,
-      [dartx.loadEventEnd]: core.int,
-      [dartx.loadEventStart]: core.int,
-      [dartx.navigationStart]: core.int,
-      [dartx.redirectEnd]: core.int,
-      [dartx.redirectStart]: core.int,
-      [dartx.requestStart]: core.int,
-      [dartx.responseEnd]: core.int,
-      [dartx.responseStart]: core.int,
-      [dartx.secureConnectionStart]: core.int,
-      [dartx.unloadEventEnd]: core.int,
-      [dartx.unloadEventStart]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
-  dart.defineExtensionNames([
-    'registration'
-  ]);
-  html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, init) {
-      let init_1 = html_common.convertDartToNative_Dictionary(init);
-      return html$.PeriodicSyncEvent._create_1(type, init_1);
-    }
-    static _create_1(type, init) {
-      return new self.PeriodicSyncEvent(type, init);
-    }
-    get [dartx.registration]() {
-      return this.registration;
-    }
-  };
-  dart.setSignature(html$.PeriodicSyncEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
-      new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
-    }),
-    fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
-  const _register_1 = Symbol('_register_1');
-  const _register_2 = Symbol('_register_2');
-  dart.defineExtensionNames([
-    'getRegistration',
-    'getRegistrations',
-    'permissionState',
-    'register',
-    'minPossiblePeriod'
-  ]);
-  html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.minPossiblePeriod]() {
-      return this.minPossiblePeriod;
-    }
-    [dartx.getRegistration](...args) {
-      return this.getRegistration.apply(this, args);
-    }
-    [dartx.getRegistrations](...args) {
-      return this.getRegistrations.apply(this, args);
-    }
-    [dartx.permissionState](...args) {
-      return this.permissionState.apply(this, args);
-    }
-    [dartx.register](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_register_1](options_1);
-      }
-      return this[_register_2]();
-    }
-    [_register_1](...args) {
-      return this.register.apply(this, args);
-    }
-    [_register_2](...args) {
-      return this.register.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PeriodicSyncManager, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
-    fields: () => ({[dartx.minPossiblePeriod]: core.int}),
-    methods: () => ({
-      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
-      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
-      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_register_2]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
-  dart.defineExtensionNames([
-    'unregister',
-    'minPeriod',
-    'networkState',
-    'powerState',
-    'tag'
-  ]);
-  html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.minPeriod]() {
-      return this.minPeriod;
-    }
-    get [dartx.networkState]() {
-      return this.networkState;
-    }
-    get [dartx.powerState]() {
-      return this.powerState;
-    }
-    get [dartx.tag]() {
-      return this.tag;
-    }
-    [dartx.unregister](...args) {
-      return this.unregister.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PeriodicSyncRegistration, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
-    fields: () => ({
-      [dartx.minPeriod]: core.int,
-      [dartx.networkState]: core.String,
-      [dartx.powerState]: core.String,
-      [dartx.tag]: core.String
-    }),
-    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
-  });
-  dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
-  dart.defineExtensionNames([
-    'onChange',
-    'state',
-    'status'
-  ]);
-  html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.state]() {
-      return this.state;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    get [dartx.onChange]() {
-      return html$.PermissionStatus.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.PermissionStatus, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
-    fields: () => ({
-      [dartx.state]: core.String,
-      [dartx.status]: core.String
-    }),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.PermissionStatus, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
-  dart.defineExtensionNames([
-    'query'
-  ]);
-  html$.Permissions = class Permissions extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.query](...args) {
-      return this.query.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Permissions, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
-    methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
-  });
-  dart.registerExtension(dart.global.Permissions, html$.Permissions);
-  html$.PictureElement = class PictureElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.PictureElement, 'created');
-  dart.setSignature(html$.PictureElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PictureElement, []),
-      created: dart.definiteFunctionType(html$.PictureElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
-  dart.defineExtensionNames([
-    'item',
-    'namedItem',
-    'description',
-    'filename',
-    'length',
-    'name'
-  ]);
-  html$.Plugin = class Plugin extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.description]() {
-      return this.description;
-    }
-    get [dartx.filename]() {
-      return this.filename;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Plugin, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
-    fields: () => ({
-      [dartx.description]: core.String,
-      [dartx.filename]: core.String,
-      [dartx.length]: core.int,
-      [dartx.name]: core.String
-    }),
-    methods: () => ({
-      [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
-      [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Plugin, html$.Plugin);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item',
-    'namedItem',
-    'refresh'
-  ]);
-  html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-    [dartx.refresh](...args) {
-      return this.refresh.apply(this, args);
-    }
-  };
-  html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
-  dart.setSignature(html$.PluginArray, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
-      [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
-      [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
-      [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
-    })
-  });
-  dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
-  dart.defineExtensionNames([
-    'createdCallback',
-    'closeable',
-    'message'
-  ]);
-  html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.closeable] = null;
-      this[dartx.message] = null;
-      super.created();
-    }
-    get [dartx.closeable]() {
-      return this.closeable;
-    }
-    set [dartx.closeable](value) {
-      this.closeable = value;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-    set [dartx.message](value) {
-      this.message = value;
-    }
-    [dartx.createdCallback](...args) {
-      return this.createdCallback.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
-  dart.setSignature(html$.PluginPlaceholderElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
-      created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
-    }),
-    fields: () => ({
-      [dartx.closeable]: core.bool,
-      [dartx.message]: core.String
-    }),
-    methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
-  });
-  dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
-  dart.defineExtensionNames([
-    'height',
-    'isPrimary',
-    'pointerId',
-    'pointerType',
-    'pressure',
-    'tiltX',
-    'tiltY',
-    'width'
-  ]);
-  html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.PointerEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.PointerEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.PointerEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.PointerEvent(type);
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.isPrimary]() {
-      return this.isPrimary;
-    }
-    get [dartx.pointerId]() {
-      return this.pointerId;
-    }
-    get [dartx.pointerType]() {
-      return this.pointerType;
-    }
-    get [dartx.pressure]() {
-      return this.pressure;
-    }
-    get [dartx.tiltX]() {
-      return this.tiltX;
-    }
-    get [dartx.tiltY]() {
-      return this.tiltY;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  dart.setSignature(html$.PointerEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PointerEvent, []),
-      new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.height]: core.double,
-      [dartx.isPrimary]: core.bool,
-      [dartx.pointerId]: core.int,
-      [dartx.pointerType]: core.String,
-      [dartx.pressure]: core.double,
-      [dartx.tiltX]: core.int,
-      [dartx.tiltY]: core.int,
-      [dartx.width]: core.double
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
-  dart.defineExtensionNames([
-    'state'
-  ]);
-  html$.PopStateEvent = class PopStateEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.PopStateEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.PopStateEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.PopStateEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.PopStateEvent(type);
-    }
-    get [dartx.state]() {
-      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
-    }
-    get [_get_state]() {
-      return this.state;
-    }
-  };
-  dart.setSignature(html$.PopStateEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PopStateEvent, []),
-      new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[_get_state]: dart.dynamic}),
-    getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
-  html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
-  dart.defineExtensionNames([
-    'code',
-    'message'
-  ]);
-  html$.PositionError = class PositionError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-  };
-  dart.setSignature(html$.PositionError, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
-    fields: () => ({
-      [dartx.code]: core.int,
-      [dartx.message]: core.String
-    }),
-    sfields: () => ({
-      PERMISSION_DENIED: core.int,
-      POSITION_UNAVAILABLE: core.int,
-      TIMEOUT: core.int
-    })
-  });
-  html$.PositionError.PERMISSION_DENIED = 1;
-  html$.PositionError.POSITION_UNAVAILABLE = 2;
-  html$.PositionError.TIMEOUT = 3;
-  dart.registerExtension(dart.global.PositionError, html$.PositionError);
-  html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
-  dart.defineExtensionNames([
-    'getImmediateState',
-    'getState',
-    'resetSensor'
-  ]);
-  html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getImmediateState](...args) {
-      return this.getImmediateState.apply(this, args);
-    }
-    [dartx.getState](...args) {
-      return this.getState.apply(this, args);
-    }
-    [dartx.resetSensor](...args) {
-      return this.resetSensor.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PositionSensorVRDevice, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
-    methods: () => ({
-      [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
-      [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
-      [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
-  html$.PreElement = class PreElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.PreElement, 'created');
-  dart.setSignature(html$.PreElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PreElement, []),
-      new: dart.definiteFunctionType(html$.PreElement, []),
-      created: dart.definiteFunctionType(html$.PreElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
-  dart.defineExtensionNames([
-    'getAvailability',
-    'joinSession',
-    'startSession',
-    'session'
-  ]);
-  html$.Presentation = class Presentation extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.session]() {
-      return this.session;
-    }
-    [dartx.getAvailability](...args) {
-      return this.getAvailability.apply(this, args);
-    }
-    [dartx.joinSession](...args) {
-      return this.joinSession.apply(this, args);
-    }
-    [dartx.startSession](...args) {
-      return this.startSession.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Presentation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
-    fields: () => ({[dartx.session]: html$.PresentationSession}),
-    methods: () => ({
-      [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
-      [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Presentation, html$.Presentation);
-  dart.defineExtensionNames([
-    'onChange',
-    'value'
-  ]);
-  html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    get [dartx.onChange]() {
-      return html$.PresentationAvailability.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.PresentationAvailability, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
-    fields: () => ({[dartx.value]: core.bool}),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.PresentationAvailability, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
-  dart.defineExtensionNames([
-    'close',
-    'send',
-    'onMessage',
-    'binaryType',
-    'id',
-    'state'
-  ]);
-  html$.PresentationSession = class PresentationSession extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.binaryType]() {
-      return this.binaryType;
-    }
-    set [dartx.binaryType](value) {
-      this.binaryType = value;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.state]() {
-      return this.state;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.send](...args) {
-      return this.send.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.PresentationSession.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.PresentationSession, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
-    fields: () => ({
-      [dartx.binaryType]: core.String,
-      [dartx.id]: core.String,
-      [dartx.state]: core.String
-    }),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.PresentationSession, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
-  dart.defineExtensionNames([
-    'sheet',
-    'target'
-  ]);
-  html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.sheet]() {
-      return this.sheet;
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-  };
-  dart.setSignature(html$.ProcessingInstruction, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
-    fields: () => ({
-      [dartx.sheet]: html$.StyleSheet,
-      [dartx.target]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
-  dart.defineExtensionNames([
-    'labels',
-    'max',
-    'position',
-    'value'
-  ]);
-  html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
-    }
-    created() {
-      this[dartx.labels] = null;
-      this[dartx.max] = null;
-      this[dartx.position] = null;
-      this[dartx.value] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('progress');
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.max]() {
-      return this.max;
-    }
-    set [dartx.max](value) {
-      this.max = value;
-    }
-    get [dartx.position]() {
-      return this.position;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.ProgressElement, 'created');
-  dart.setSignature(html$.ProgressElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ProgressElement, []),
-      new: dart.definiteFunctionType(html$.ProgressElement, []),
-      created: dart.definiteFunctionType(html$.ProgressElement, [])
-    }),
-    fields: () => ({
-      [dartx.labels]: ListOfNode(),
-      [dartx.max]: core.num,
-      [dartx.position]: core.double,
-      [dartx.value]: core.num
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
-  dart.defineExtensionNames([
-    'lengthComputable',
-    'loaded',
-    'total'
-  ]);
-  html$.ProgressEvent = class ProgressEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ProgressEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ProgressEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ProgressEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ProgressEvent(type);
-    }
-    get [dartx.lengthComputable]() {
-      return this.lengthComputable;
-    }
-    get [dartx.loaded]() {
-      return this.loaded;
-    }
-    get [dartx.total]() {
-      return this.total;
-    }
-  };
-  dart.setSignature(html$.ProgressEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ProgressEvent, []),
-      new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.lengthComputable]: core.bool,
-      [dartx.loaded]: core.int,
-      [dartx.total]: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
-  dart.defineExtensionNames([
-    'promise',
-    'reason'
-  ]);
-  html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.PromiseRejectionEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.PromiseRejectionEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.PromiseRejectionEvent(type);
-    }
-    get [dartx.promise]() {
-      return this.promise;
-    }
-    get [dartx.reason]() {
-      return this.reason;
-    }
-  };
-  dart.setSignature(html$.PromiseRejectionEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
-      new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.promise]: async.Future,
-      [dartx.reason]: core.Object
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
-  dart.defineExtensionNames([
-    'data'
-  ]);
-  html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.PushEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.PushEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.PushEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.PushEvent(type);
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-  };
-  dart.setSignature(html$.PushEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PushEvent, []),
-      new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.data]: html$.PushMessageData}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
-  const _permissionState_1 = Symbol('_permissionState_1');
-  const _permissionState_2 = Symbol('_permissionState_2');
-  const _subscribe_1 = Symbol('_subscribe_1');
-  const _subscribe_2 = Symbol('_subscribe_2');
-  dart.defineExtensionNames([
-    'getSubscription',
-    'permissionState',
-    'subscribe'
-  ]);
-  html$.PushManager = class PushManager extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getSubscription](...args) {
-      return this.getSubscription.apply(this, args);
-    }
-    [dartx.permissionState](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_permissionState_1](options_1);
-      }
-      return this[_permissionState_2]();
-    }
-    [_permissionState_1](...args) {
-      return this.permissionState.apply(this, args);
-    }
-    [_permissionState_2](...args) {
-      return this.permissionState.apply(this, args);
-    }
-    [dartx.subscribe](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_subscribe_1](options_1);
-      }
-      return this[_subscribe_2]();
-    }
-    [_subscribe_1](...args) {
-      return this.subscribe.apply(this, args);
-    }
-    [_subscribe_2](...args) {
-      return this.subscribe.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PushManager, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
-    methods: () => ({
-      [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
-      [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_permissionState_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_permissionState_2]: dart.definiteFunctionType(async.Future, []),
-      [dartx.subscribe]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_subscribe_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.PushManager, html$.PushManager);
-  dart.defineExtensionNames([
-    'arrayBuffer',
-    'blob',
-    'json',
-    'text'
-  ]);
-  html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(message) {
-      return html$.PushMessageData._create_1(message);
-    }
-    static _create_1(message) {
-      return new self.PushMessageData(message);
-    }
-    [dartx.arrayBuffer](...args) {
-      return this.arrayBuffer.apply(this, args);
-    }
-    [dartx.blob](...args) {
-      return this.blob.apply(this, args);
-    }
-    [dartx.json](...args) {
-      return this.json.apply(this, args);
-    }
-    [dartx.text](...args) {
-      return this.text.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PushMessageData, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.PushMessageData, []),
-      new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
-    }),
-    methods: () => ({
-      [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-      [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
-      [dartx.json]: dart.definiteFunctionType(core.Object, []),
-      [dartx.text]: dart.definiteFunctionType(core.String, [])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
-  dart.defineExtensionNames([
-    'unsubscribe',
-    'endpoint'
-  ]);
-  html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.endpoint]() {
-      return this.endpoint;
-    }
-    [dartx.unsubscribe](...args) {
-      return this.unsubscribe.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.PushSubscription, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
-    fields: () => ({[dartx.endpoint]: core.String}),
-    methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
-  });
-  dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
-  dart.defineExtensionNames([
-    'cite'
-  ]);
-  html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
-    }
-    created() {
-      this[dartx.cite] = null;
-      super.created();
-    }
-    get [dartx.cite]() {
-      return this.cite;
-    }
-    set [dartx.cite](value) {
-      this.cite = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.QuoteElement, 'created');
-  dart.setSignature(html$.QuoteElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.QuoteElement, []),
-      new: dart.definiteFunctionType(html$.QuoteElement, []),
-      created: dart.definiteFunctionType(html$.QuoteElement, [])
-    }),
-    fields: () => ({[dartx.cite]: core.String})
-  });
-  dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
-  html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
-  html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
-  html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
-  dart.defineExtensionNames([
-    'cloneContents',
-    'cloneRange',
-    'collapse',
-    'compareBoundaryPoints',
-    'comparePoint',
-    'createContextualFragment',
-    'deleteContents',
-    'detach',
-    'expand',
-    'extractContents',
-    'getBoundingClientRect',
-    'getClientRects',
-    'insertNode',
-    'isPointInRange',
-    'selectNode',
-    'selectNodeContents',
-    'setEnd',
-    'setEndAfter',
-    'setEndBefore',
-    'setStart',
-    'setStartAfter',
-    'setStartBefore',
-    'surroundContents',
-    'collapsed',
-    'commonAncestorContainer',
-    'endContainer',
-    'endOffset',
-    'startContainer',
-    'startOffset'
-  ]);
-  html$.Range = class Range extends _interceptors.Interceptor {
-    static new() {
-      return html$.document[dartx.createRange]();
-    }
-    static fromPoint(point) {
-      return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.collapsed]() {
-      return this.collapsed;
-    }
-    get [dartx.commonAncestorContainer]() {
-      return this.commonAncestorContainer;
-    }
-    get [dartx.endContainer]() {
-      return this.endContainer;
-    }
-    get [dartx.endOffset]() {
-      return this.endOffset;
-    }
-    get [dartx.startContainer]() {
-      return this.startContainer;
-    }
-    get [dartx.startOffset]() {
-      return this.startOffset;
-    }
-    [dartx.cloneContents](...args) {
-      return this.cloneContents.apply(this, args);
-    }
-    [dartx.cloneRange](...args) {
-      return this.cloneRange.apply(this, args);
-    }
-    [dartx.collapse](...args) {
-      return this.collapse.apply(this, args);
-    }
-    [dartx.compareBoundaryPoints](...args) {
-      return this.compareBoundaryPoints.apply(this, args);
-    }
-    [dartx.comparePoint](...args) {
-      return this.comparePoint.apply(this, args);
-    }
-    [dartx.createContextualFragment](...args) {
-      return this.createContextualFragment.apply(this, args);
-    }
-    [dartx.deleteContents](...args) {
-      return this.deleteContents.apply(this, args);
-    }
-    [dartx.detach](...args) {
-      return this.detach.apply(this, args);
-    }
-    [dartx.expand](...args) {
-      return this.expand.apply(this, args);
-    }
-    [dartx.extractContents](...args) {
-      return this.extractContents.apply(this, args);
-    }
-    [dartx.getBoundingClientRect](...args) {
-      return this.getBoundingClientRect.apply(this, args);
-    }
-    [dartx.getClientRects](...args) {
-      return this.getClientRects.apply(this, args);
-    }
-    [dartx.insertNode](...args) {
-      return this.insertNode.apply(this, args);
-    }
-    [dartx.isPointInRange](...args) {
-      return this.isPointInRange.apply(this, args);
-    }
-    [dartx.selectNode](...args) {
-      return this.selectNode.apply(this, args);
-    }
-    [dartx.selectNodeContents](...args) {
-      return this.selectNodeContents.apply(this, args);
-    }
-    [dartx.setEnd](...args) {
-      return this.setEnd.apply(this, args);
-    }
-    [dartx.setEndAfter](...args) {
-      return this.setEndAfter.apply(this, args);
-    }
-    [dartx.setEndBefore](...args) {
-      return this.setEndBefore.apply(this, args);
-    }
-    [dartx.setStart](...args) {
-      return this.setStart.apply(this, args);
-    }
-    [dartx.setStartAfter](...args) {
-      return this.setStartAfter.apply(this, args);
-    }
-    [dartx.setStartBefore](...args) {
-      return this.setStartBefore.apply(this, args);
-    }
-    [dartx.surroundContents](...args) {
-      return this.surroundContents.apply(this, args);
-    }
-    static get supportsCreateContextualFragment() {
-      return "createContextualFragment" in window.Range.prototype;
-    }
-  };
-  dart.setSignature(html$.Range, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.Range, []),
-      fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
-      _: dart.definiteFunctionType(html$.Range, [])
-    }),
-    fields: () => ({
-      [dartx.collapsed]: core.bool,
-      [dartx.commonAncestorContainer]: html$.Node,
-      [dartx.endContainer]: html$.Node,
-      [dartx.endOffset]: core.int,
-      [dartx.startContainer]: html$.Node,
-      [dartx.startOffset]: core.int
-    }),
-    methods: () => ({
-      [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
-      [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
-      [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
-      [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
-      [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
-      [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
-      [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
-      [dartx.detach]: dart.definiteFunctionType(dart.void, []),
-      [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
-      [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
-      [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
-      [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
-      [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
-      [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
-      [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
-    }),
-    sfields: () => ({
-      END_TO_END: core.int,
-      END_TO_START: core.int,
-      START_TO_END: core.int,
-      START_TO_START: core.int
-    }),
-    sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
-  });
-  html$.Range.END_TO_END = 2;
-  html$.Range.END_TO_START = 3;
-  html$.Range.START_TO_END = 1;
-  html$.Range.START_TO_START = 0;
-  dart.registerExtension(dart.global.Range, html$.Range);
-  dart.defineExtensionNames([
-    'cancel',
-    'getReader'
-  ]);
-  html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.getReader](...args) {
-      return this.getReader.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ReadableByteStream, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
-    })
-  });
-  dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
-  dart.defineExtensionNames([
-    'cancel',
-    'read',
-    'releaseLock',
-    'closed'
-  ]);
-  html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.closed]() {
-      return this.closed;
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.read](...args) {
-      return this.read.apply(this, args);
-    }
-    [dartx.releaseLock](...args) {
-      return this.releaseLock.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ReadableByteStreamReader, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
-    fields: () => ({[dartx.closed]: async.Future}),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-      [dartx.read]: dart.definiteFunctionType(async.Future, []),
-      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
-  dart.defineExtensionNames([
-    'cancel',
-    'getReader'
-  ]);
-  html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.getReader](...args) {
-      return this.getReader.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ReadableStream, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-      [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
-    })
-  });
-  dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
-  dart.defineExtensionNames([
-    'cancel',
-    'read',
-    'releaseLock',
-    'closed'
-  ]);
-  html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.closed]() {
-      return this.closed;
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.read](...args) {
-      return this.read.apply(this, args);
-    }
-    [dartx.releaseLock](...args) {
-      return this.releaseLock.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ReadableStreamReader, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
-    fields: () => ({[dartx.closed]: async.Future}),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-      [dartx.read]: dart.definiteFunctionType(async.Future, []),
-      [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
-  dart.defineExtensionNames([
-    'relatedTarget'
-  ]);
-  html$.RelatedEvent = class RelatedEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.RelatedEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.RelatedEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.RelatedEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.RelatedEvent(type);
-    }
-    get [dartx.relatedTarget]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
-    }
-    get [_get_relatedTarget]() {
-      return this.relatedTarget;
-    }
-  };
-  dart.setSignature(html$.RelatedEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.RelatedEvent, []),
-      new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[_get_relatedTarget]: dart.dynamic}),
-    getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
-  html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
-  dart.defineExtensionNames([
-    'url'
-  ]);
-  html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-  };
-  dart.setSignature(html$.ResourceProgressEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
-    fields: () => ({[dartx.url]: core.String})
-  });
-  dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
-  dart.defineExtensionNames([
-    'close',
-    'send',
-    'sendBlob',
-    'sendByteBuffer',
-    'sendString',
-    'sendTypedData',
-    'onClose',
-    'onError',
-    'onMessage',
-    'onOpen',
-    'binaryType',
-    'bufferedAmount',
-    'id',
-    'label',
-    'maxRetransmitTime',
-    'maxRetransmits',
-    'negotiated',
-    'ordered',
-    'protocol',
-    'readyState',
-    'reliable'
-  ]);
-  html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.binaryType]() {
-      return this.binaryType;
-    }
-    set [dartx.binaryType](value) {
-      this.binaryType = value;
-    }
-    get [dartx.bufferedAmount]() {
-      return this.bufferedAmount;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.maxRetransmitTime]() {
-      return this.maxRetransmitTime;
-    }
-    get [dartx.maxRetransmits]() {
-      return this.maxRetransmits;
-    }
-    get [dartx.negotiated]() {
-      return this.negotiated;
-    }
-    get [dartx.ordered]() {
-      return this.ordered;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.reliable]() {
-      return this.reliable;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.send](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendBlob](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendByteBuffer](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendString](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendTypedData](...args) {
-      return this.send.apply(this, args);
-    }
-    get [dartx.onClose]() {
-      return html$.RtcDataChannel.closeEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.RtcDataChannel.errorEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.RtcDataChannel.messageEvent.forTarget(this);
-    }
-    get [dartx.onOpen]() {
-      return html$.RtcDataChannel.openEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.RtcDataChannel, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
-    fields: () => ({
-      [dartx.binaryType]: core.String,
-      [dartx.bufferedAmount]: core.int,
-      [dartx.id]: core.int,
-      [dartx.label]: core.String,
-      [dartx.maxRetransmitTime]: core.int,
-      [dartx.maxRetransmits]: core.int,
-      [dartx.negotiated]: core.bool,
-      [dartx.ordered]: core.bool,
-      [dartx.protocol]: core.String,
-      [dartx.readyState]: core.String,
-      [dartx.reliable]: core.bool
-    }),
-    getters: () => ({
-      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
-      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
-      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
-      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
-    }),
-    sfields: () => ({
-      closeEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      openEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(html$.RtcDataChannel, {
-    get closeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('close'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get openEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('open'));
-    }
-  });
-  dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
-  dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
-  dart.defineExtensionNames([
-    'channel'
-  ]);
-  html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.channel]() {
-      return this.channel;
-    }
-  };
-  dart.setSignature(html$.RtcDataChannelEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
-    fields: () => ({[dartx.channel]: html$.RtcDataChannel})
-  });
-  dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
-  dart.defineExtensionNames([
-    'insertDtmf',
-    'onToneChange',
-    'canInsertDtmf',
-    'duration',
-    'interToneGap',
-    'toneBuffer',
-    'track'
-  ]);
-  html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.canInsertDtmf]() {
-      return this.canInsertDTMF;
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    get [dartx.interToneGap]() {
-      return this.interToneGap;
-    }
-    get [dartx.toneBuffer]() {
-      return this.toneBuffer;
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-    [dartx.insertDtmf](...args) {
-      return this.insertDTMF.apply(this, args);
-    }
-    get [dartx.onToneChange]() {
-      return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.RtcDtmfSender, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
-    fields: () => ({
-      [dartx.canInsertDtmf]: core.bool,
-      [dartx.duration]: core.int,
-      [dartx.interToneGap]: core.int,
-      [dartx.toneBuffer]: core.String,
-      [dartx.track]: html$.MediaStreamTrack
-    }),
-    getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
-    methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
-    sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
-  });
-  dart.defineLazy(html$.RtcDtmfSender, {
-    get toneChangeEvent() {
-      return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
-    }
-  });
-  dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
-  dart.defineExtensionNames([
-    'tone'
-  ]);
-  html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
-    }
-    static _create_1(type, eventInitDict) {
-      return new RTCDTMFToneChangeEvent(type, eventInitDict);
-    }
-    get [dartx.tone]() {
-      return this.tone;
-    }
-  };
-  dart.setSignature(html$.RtcDtmfToneChangeEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
-      new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
-    }),
-    fields: () => ({[dartx.tone]: core.String}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
-  dart.defineExtensionNames([
-    'candidate',
-    'sdpMLineIndex',
-    'sdpMid'
-  ]);
-  html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
-    static new(dictionary) {
-      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
-      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.candidate]() {
-      return this.candidate;
-    }
-    set [dartx.candidate](value) {
-      this.candidate = value;
-    }
-    get [dartx.sdpMLineIndex]() {
-      return this.sdpMLineIndex;
-    }
-    set [dartx.sdpMLineIndex](value) {
-      this.sdpMLineIndex = value;
-    }
-    get [dartx.sdpMid]() {
-      return this.sdpMid;
-    }
-    set [dartx.sdpMid](value) {
-      this.sdpMid = value;
-    }
-  };
-  dart.setSignature(html$.RtcIceCandidate, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
-      _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
-    }),
-    fields: () => ({
-      [dartx.candidate]: core.String,
-      [dartx.sdpMLineIndex]: core.int,
-      [dartx.sdpMid]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
-  dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
-  dart.defineExtensionNames([
-    'candidate'
-  ]);
-  html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.candidate]() {
-      return this.candidate;
-    }
-  };
-  dart.setSignature(html$.RtcIceCandidateEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
-    fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
-  });
-  dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
-  dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
-  const _createOffer = Symbol('_createOffer');
-  const _createAnswer = Symbol('_createAnswer');
-  const _getStats = Symbol('_getStats');
-  const _addStream_1 = Symbol('_addStream_1');
-  const _addStream_2 = Symbol('_addStream_2');
-  const _createAnswer_1 = Symbol('_createAnswer_1');
-  const _createAnswer_2 = Symbol('_createAnswer_2');
-  const _createDataChannel_1 = Symbol('_createDataChannel_1');
-  const _createDataChannel_2 = Symbol('_createDataChannel_2');
-  const _createOffer_1 = Symbol('_createOffer_1');
-  const _createOffer_2 = Symbol('_createOffer_2');
-  const _setLocalDescription = Symbol('_setLocalDescription');
-  const _setRemoteDescription = Symbol('_setRemoteDescription');
-  const _updateIce_1 = Symbol('_updateIce_1');
-  const _updateIce_2 = Symbol('_updateIce_2');
-  const _updateIce_3 = Symbol('_updateIce_3');
-  dart.defineExtensionNames([
-    'createOffer',
-    'createAnswer',
-    'getStats',
-    'addIceCandidate',
-    'addStream',
-    'close',
-    'createDtmfSender',
-    'createDataChannel',
-    'getLocalStreams',
-    'getRemoteStreams',
-    'getStreamById',
-    'removeStream',
-    'setLocalDescription',
-    'setRemoteDescription',
-    'updateIce',
-    'onAddStream',
-    'onDataChannel',
-    'onIceCandidate',
-    'onIceConnectionStateChange',
-    'onNegotiationNeeded',
-    'onRemoveStream',
-    'onSignalingStateChange',
-    'iceConnectionState',
-    'iceGatheringState',
-    'localDescription',
-    'remoteDescription',
-    'signalingState'
-  ]);
-  html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
-    static new(rtcIceServers, mediaConstraints) {
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
-      if (mediaConstraints != null) {
-        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
-      } else {
-        return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
+      case 4:
+      {
+        let arg0 = arguments$[0];
+        let arg1 = arguments$[1];
+        let arg2 = arguments$[2];
+        let arg3 = arguments$[3];
+        return new constr(arg0, arg1, arg2, arg3);
       }
     }
-    static get supported() {
-      try {
-        html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
-        return true;
-      } catch (_) {
-        return false;
-      }
-
-      return false;
+  }
+  let args = [null];
+  args[dartx.addAll](arguments$);
+  let factoryFunction = constr.bind.apply(constr, args);
+  String(factoryFunction);
+  return new factoryFunction();
+};
+dart.fn(js_util.callConstructor, FunctionAndListTodynamic());
+math.E = 2.718281828459045;
+math.LN10 = 2.302585092994046;
+math.LN2 = 0.6931471805599453;
+math.LOG2E = 1.4426950408889634;
+math.LOG10E = 0.4342944819032518;
+math.PI = 3.141592653589793;
+math.SQRT1_2 = 0.7071067811865476;
+math.SQRT2 = 1.4142135623730951;
+math.min = function(T) {
+  return (a, b) => {
+    return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
+  };
+};
+dart.fn(math.min, TAndTToT());
+math.max = function(T) {
+  return (a, b) => {
+    return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
+  };
+};
+dart.fn(math.max, TAndTToT$());
+math.atan2 = function(a, b) {
+  return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
+};
+dart.fn(math.atan2, numAndnumTodouble());
+math.pow = function(x, exponent) {
+  _js_helper.checkNum(x);
+  _js_helper.checkNum(exponent);
+  return Math.pow(x, exponent);
+};
+dart.fn(math.pow, numAndnumTonum());
+math.sin = function(x) {
+  return Math.sin(_js_helper.checkNum(x));
+};
+dart.fn(math.sin, numTodouble());
+math.cos = function(x) {
+  return Math.cos(_js_helper.checkNum(x));
+};
+dart.fn(math.cos, numTodouble());
+math.tan = function(x) {
+  return Math.tan(_js_helper.checkNum(x));
+};
+dart.fn(math.tan, numTodouble());
+math.acos = function(x) {
+  return Math.acos(_js_helper.checkNum(x));
+};
+dart.fn(math.acos, numTodouble());
+math.asin = function(x) {
+  return Math.asin(_js_helper.checkNum(x));
+};
+dart.fn(math.asin, numTodouble());
+math.atan = function(x) {
+  return Math.atan(_js_helper.checkNum(x));
+};
+dart.fn(math.atan, numTodouble());
+math.sqrt = function(x) {
+  return Math.sqrt(_js_helper.checkNum(x));
+};
+dart.fn(math.sqrt, numTodouble());
+math.exp = function(x) {
+  return Math.exp(_js_helper.checkNum(x));
+};
+dart.fn(math.exp, numTodouble());
+math.log = function(x) {
+  return Math.log(_js_helper.checkNum(x));
+};
+dart.fn(math.log, numTodouble());
+math._POW2_32 = 4294967296;
+math._JSRandom = class _JSRandom extends core.Object {
+  new() {
+  }
+  nextInt(max) {
+    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
+      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
     }
-    [dartx.createOffer](mediaConstraints) {
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      let completer = CompleterOfRtcSessionDescription().new();
-      this[_createOffer](dart.fn(value => {
-        completer.complete(value);
-      }, RtcSessionDescriptionToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, StringToNull()), mediaConstraints);
-      return completer.future;
+    return Math.random() * max >>> 0;
+  }
+  nextDouble() {
+    return Math.random();
+  }
+  nextBool() {
+    return Math.random() < 0.5;
+  }
+};
+math._JSRandom[dart.implements] = () => [math.Random];
+dart.setSignature(math._JSRandom, {
+  constructors: () => ({new: dart.definiteFunctionType(math._JSRandom, [])}),
+  methods: () => ({
+    nextInt: dart.definiteFunctionType(core.int, [core.int]),
+    nextDouble: dart.definiteFunctionType(core.double, []),
+    nextBool: dart.definiteFunctionType(core.bool, [])
+  })
+});
+const _lo = Symbol('_lo');
+const _hi = Symbol('_hi');
+const _nextState = Symbol('_nextState');
+math._Random = class _Random extends core.Object {
+  new(seed) {
+    this[_lo] = 0;
+    this[_hi] = 0;
+    let empty_seed = 0;
+    if (dart.notNull(seed) < 0) {
+      empty_seed = -1;
     }
-    [dartx.createAnswer](mediaConstraints) {
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      let completer = CompleterOfRtcSessionDescription().new();
-      this[_createAnswer](dart.fn(value => {
-        completer.complete(value);
-      }, RtcSessionDescriptionToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, StringToNull()), mediaConstraints);
-      return completer.future;
+    do {
+      let low = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
+      seed = ((dart.notNull(seed) - low) / math._POW2_32)[dartx.truncate]();
+      let high = (dart.notNull(seed) & math._Random._MASK32) >>> 0;
+      seed = ((dart.notNull(seed) - high) / math._POW2_32)[dartx.truncate]();
+      let tmplow = low << 21 >>> 0;
+      let tmphigh = (high << 21 | low[dartx['>>']](11)) >>> 0;
+      tmplow = ((~low & math._Random._MASK32) >>> 0) + tmplow;
+      low = (tmplow & math._Random._MASK32) >>> 0;
+      high = ((~high >>> 0) + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+      tmphigh = high[dartx['>>']](24);
+      tmplow = (low[dartx['>>']](24) | high << 8) >>> 0;
+      low = (low ^ tmplow) >>> 0;
+      high = (high ^ tmphigh) >>> 0;
+      tmplow = low * 265;
+      low = (tmplow & math._Random._MASK32) >>> 0;
+      high = (high * 265 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+      tmphigh = high[dartx['>>']](14);
+      tmplow = (low[dartx['>>']](14) | high << 18) >>> 0;
+      low = (low ^ tmplow) >>> 0;
+      high = (high ^ tmphigh) >>> 0;
+      tmplow = low * 21;
+      low = (tmplow & math._Random._MASK32) >>> 0;
+      high = (high * 21 + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+      tmphigh = high[dartx['>>']](28);
+      tmplow = (low[dartx['>>']](28) | high << 4) >>> 0;
+      low = (low ^ tmplow) >>> 0;
+      high = (high ^ tmphigh) >>> 0;
+      tmplow = low << 31 >>> 0;
+      tmphigh = (high << 31 | low[dartx['>>']](1)) >>> 0;
+      tmplow = tmplow + low;
+      low = (tmplow & math._Random._MASK32) >>> 0;
+      high = (high + tmphigh + ((tmplow - low) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+      tmplow = dart.notNull(this[_lo]) * 1037;
+      this[_lo] = (tmplow & math._Random._MASK32) >>> 0;
+      this[_hi] = (dart.notNull(this[_hi]) * 1037 + ((tmplow - dart.notNull(this[_lo])) / 4294967296)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+      this[_lo] = (dart.notNull(this[_lo]) ^ low) >>> 0;
+      this[_hi] = (dart.notNull(this[_hi]) ^ high) >>> 0;
+    } while (seed != empty_seed);
+    if (this[_hi] == 0 && this[_lo] == 0) {
+      this[_lo] = 23063;
     }
-    [dartx.getStats](selector) {
-      let completer = CompleterOfRtcStatsResponse().new();
-      this[_getStats](dart.fn(value => {
-        completer.complete(value);
-      }, RtcStatsResponseToNull()), selector);
-      return completer.future;
+    this[_nextState]();
+    this[_nextState]();
+    this[_nextState]();
+    this[_nextState]();
+  }
+  [_nextState]() {
+    let tmpHi = 4294901760 * dart.notNull(this[_lo]);
+    let tmpHiLo = (tmpHi & math._Random._MASK32) >>> 0;
+    let tmpHiHi = tmpHi - tmpHiLo;
+    let tmpLo = 55905 * dart.notNull(this[_lo]);
+    let tmpLoLo = (tmpLo & math._Random._MASK32) >>> 0;
+    let tmpLoHi = tmpLo - tmpLoLo;
+    let newLo = tmpLoLo + tmpHiLo + dart.notNull(this[_hi]);
+    this[_lo] = (newLo & math._Random._MASK32) >>> 0;
+    let newLoHi = newLo - dart.notNull(this[_lo]);
+    this[_hi] = (((tmpLoHi + tmpHiHi + newLoHi) / math._POW2_32)[dartx.truncate]() & math._Random._MASK32) >>> 0;
+    dart.assert(dart.notNull(this[_lo]) < math._POW2_32);
+    dart.assert(dart.notNull(this[_hi]) < math._POW2_32);
+  }
+  nextInt(max) {
+    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
+      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
     }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
+    if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
+      this[_nextState]();
+      return (dart.notNull(this[_lo]) & dart.notNull(max) - 1) >>> 0;
     }
-    get [dartx.iceConnectionState]() {
-      return this.iceConnectionState;
-    }
-    get [dartx.iceGatheringState]() {
-      return this.iceGatheringState;
-    }
-    get [dartx.localDescription]() {
-      return this.localDescription;
-    }
-    get [dartx.remoteDescription]() {
-      return this.remoteDescription;
-    }
-    get [dartx.signalingState]() {
-      return this.signalingState;
-    }
-    [dartx.addIceCandidate](...args) {
-      return this.addIceCandidate.apply(this, args);
-    }
-    [dartx.addStream](stream, mediaConstraints) {
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      if (mediaConstraints != null) {
-        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
-        this[_addStream_1](stream, mediaConstraints_1);
+    let rnd32 = null;
+    let result = null;
+    do {
+      this[_nextState]();
+      rnd32 = this[_lo];
+      result = dart.asInt(rnd32[dartx.remainder](max));
+    } while (dart.notNull(rnd32) - dart.notNull(result) + dart.notNull(max) >= math._POW2_32);
+    return result;
+  }
+  nextDouble() {
+    this[_nextState]();
+    let bits26 = (dart.notNull(this[_lo]) & (1 << 26) - 1) >>> 0;
+    this[_nextState]();
+    let bits27 = (dart.notNull(this[_lo]) & (1 << 27) - 1) >>> 0;
+    return (bits26 * math._Random._POW2_27_D + bits27) / math._Random._POW2_53_D;
+  }
+  nextBool() {
+    this[_nextState]();
+    return (dart.notNull(this[_lo]) & 1) == 0;
+  }
+};
+math._Random[dart.implements] = () => [math.Random];
+dart.setSignature(math._Random, {
+  constructors: () => ({new: dart.definiteFunctionType(math._Random, [core.int])}),
+  fields: () => ({
+    [_lo]: core.int,
+    [_hi]: core.int
+  }),
+  methods: () => ({
+    [_nextState]: dart.definiteFunctionType(dart.void, []),
+    nextInt: dart.definiteFunctionType(core.int, [core.int]),
+    nextDouble: dart.definiteFunctionType(core.double, []),
+    nextBool: dart.definiteFunctionType(core.bool, [])
+  }),
+  sfields: () => ({
+    _POW2_53_D: core.double,
+    _POW2_27_D: core.double,
+    _MASK32: core.int
+  })
+});
+math._Random._POW2_53_D = 1.0 * 9007199254740992;
+math._Random._POW2_27_D = 1.0 * (1 << 27);
+math._Random._MASK32 = 4294967295;
+const _buffer$0 = Symbol('_buffer');
+const _getRandomBytes = Symbol('_getRandomBytes');
+math._JSSecureRandom = class _JSSecureRandom extends core.Object {
+  new() {
+    this[_buffer$0] = typed_data.ByteData.new(8);
+    let crypto = self.crypto;
+    if (crypto != null) {
+      let getRandomValues = crypto.getRandomValues;
+      if (getRandomValues != null) {
         return;
       }
-      this[_addStream_2](stream);
-      return;
     }
-    [_addStream_1](...args) {
-      return this.addStream.apply(this, args);
+    dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
+  }
+  [_getRandomBytes](start, length) {
+    crypto.getRandomValues(this[_buffer$0][dartx.buffer][dartx.asUint8List](start, length));
+  }
+  nextBool() {
+    this[_getRandomBytes](0, 1);
+    return this[_buffer$0][dartx.getUint8](0)[dartx.isOdd];
+  }
+  nextDouble() {
+    this[_getRandomBytes](1, 7);
+    this[_buffer$0][dartx.setUint8](0, 63);
+    let highByte = this[_buffer$0][dartx.getUint8](1);
+    this[_buffer$0][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
+    let result = dart.notNull(this[_buffer$0][dartx.getFloat64](0)) - 1.0;
+    if ((dart.notNull(highByte) & 16) != 0) {
+      result = result + 1.1102230246251565e-16;
     }
-    [_addStream_2](...args) {
-      return this.addStream.apply(this, args);
+    return result;
+  }
+  nextInt(max) {
+    if (dart.notNull(max) <= 0 || dart.notNull(max) > math._POW2_32) {
+      dart.throw(new core.RangeError(dart.str`max must be in range 0 < max ≤ 2^32, was ${max}`));
     }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [_createAnswer](successCallback, failureCallback, mediaConstraints) {
-      if (failureCallback === void 0) failureCallback = null;
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      if (mediaConstraints != null) {
-        let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
-        this[_createAnswer_1](successCallback, failureCallback, mediaConstraints_1);
-        return;
-      }
-      this[_createAnswer_2](successCallback, failureCallback);
-      return;
-    }
-    [_createAnswer_1](...args) {
-      return this.createAnswer.apply(this, args);
-    }
-    [_createAnswer_2](...args) {
-      return this.createAnswer.apply(this, args);
-    }
-    [dartx.createDtmfSender](...args) {
-      return this.createDTMFSender.apply(this, args);
-    }
-    [dartx.createDataChannel](label, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_createDataChannel_1](label, options_1);
-      }
-      return this[_createDataChannel_2](label);
-    }
-    [_createDataChannel_1](...args) {
-      return this.createDataChannel.apply(this, args);
-    }
-    [_createDataChannel_2](...args) {
-      return this.createDataChannel.apply(this, args);
-    }
-    [_createOffer](successCallback, failureCallback, rtcOfferOptions) {
-      if (failureCallback === void 0) failureCallback = null;
-      if (rtcOfferOptions === void 0) rtcOfferOptions = null;
-      if (rtcOfferOptions != null) {
-        let rtcOfferOptions_1 = html_common.convertDartToNative_Dictionary(rtcOfferOptions);
-        this[_createOffer_1](successCallback, failureCallback, rtcOfferOptions_1);
-        return;
-      }
-      this[_createOffer_2](successCallback, failureCallback);
-      return;
-    }
-    [_createOffer_1](...args) {
-      return this.createOffer.apply(this, args);
-    }
-    [_createOffer_2](...args) {
-      return this.createOffer.apply(this, args);
-    }
-    [dartx.getLocalStreams](...args) {
-      return this.getLocalStreams.apply(this, args);
-    }
-    [dartx.getRemoteStreams](...args) {
-      return this.getRemoteStreams.apply(this, args);
-    }
-    [_getStats](...args) {
-      return this.getStats.apply(this, args);
-    }
-    [dartx.getStreamById](...args) {
-      return this.getStreamById.apply(this, args);
-    }
-    [dartx.removeStream](...args) {
-      return this.removeStream.apply(this, args);
-    }
-    [_setLocalDescription](...args) {
-      return this.setLocalDescription.apply(this, args);
-    }
-    [dartx.setLocalDescription](description) {
-      let completer = async.Completer.new();
-      this[_setLocalDescription](description, dart.fn(() => {
-        completer.complete();
-      }, VoidToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, StringToNull()));
-      return completer.future;
-    }
-    [_setRemoteDescription](...args) {
-      return this.setRemoteDescription.apply(this, args);
-    }
-    [dartx.setRemoteDescription](description) {
-      let completer = async.Completer.new();
-      this[_setRemoteDescription](description, dart.fn(() => {
-        completer.complete();
-      }, VoidToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, StringToNull()));
-      return completer.future;
-    }
-    [dartx.updateIce](configuration, mediaConstraints) {
-      if (configuration === void 0) configuration = null;
-      if (mediaConstraints === void 0) mediaConstraints = null;
-      if (mediaConstraints != null) {
-        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
-        let mediaConstraints_2 = html_common.convertDartToNative_Dictionary(mediaConstraints);
-        this[_updateIce_1](configuration_1, mediaConstraints_2);
-        return;
-      }
-      if (configuration != null) {
-        let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
-        this[_updateIce_2](configuration_1);
-        return;
-      }
-      this[_updateIce_3]();
-      return;
-    }
-    [_updateIce_1](...args) {
-      return this.updateIce.apply(this, args);
-    }
-    [_updateIce_2](...args) {
-      return this.updateIce.apply(this, args);
-    }
-    [_updateIce_3](...args) {
-      return this.updateIce.apply(this, args);
-    }
-    get [dartx.onAddStream]() {
-      return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
-    }
-    get [dartx.onDataChannel]() {
-      return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
-    }
-    get [dartx.onIceCandidate]() {
-      return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
-    }
-    get [dartx.onIceConnectionStateChange]() {
-      return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
-    }
-    get [dartx.onNegotiationNeeded]() {
-      return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
-    }
-    get [dartx.onRemoveStream]() {
-      return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
-    }
-    get [dartx.onSignalingStateChange]() {
-      return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.RtcPeerConnection, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
-      _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
-    }),
-    fields: () => ({
-      [dartx.iceConnectionState]: core.String,
-      [dartx.iceGatheringState]: core.String,
-      [dartx.localDescription]: html$.RtcSessionDescription,
-      [dartx.remoteDescription]: html$.RtcSessionDescription,
-      [dartx.signalingState]: core.String
-    }),
-    getters: () => ({
-      [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
-      [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
-      [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
-      [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
-      [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
-      [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
-      [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
-      [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
-      [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
-      [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
-      [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
-      [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
-      [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
-      [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
-      [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
-      [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
-      [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
-      [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
-      [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
-      [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
-      [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
-      [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
-      [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
-      [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
-      [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
-      [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
-      [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
-      [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
-      [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
-      [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
-      [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_updateIce_3]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      addStreamEvent: EventStreamProviderOfMediaStreamEvent(),
-      dataChannelEvent: EventStreamProviderOfRtcDataChannelEvent(),
-      iceCandidateEvent: EventStreamProviderOfRtcIceCandidateEvent(),
-      iceConnectionStateChangeEvent: EventStreamProviderOfEvent(),
-      negotiationNeededEvent: EventStreamProviderOfEvent(),
-      removeStreamEvent: EventStreamProviderOfMediaStreamEvent(),
-      signalingStateChangeEvent: EventStreamProviderOfEvent()
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineLazy(html$.RtcPeerConnection, {
-    get addStreamEvent() {
-      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
-    },
-    get dataChannelEvent() {
-      return dart.const(new (EventStreamProviderOfRtcDataChannelEvent())('datachannel'));
-    },
-    get iceCandidateEvent() {
-      return dart.const(new (EventStreamProviderOfRtcIceCandidateEvent())('icecandidate'));
-    },
-    get iceConnectionStateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('iceconnectionstatechange'));
-    },
-    get negotiationNeededEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('negotiationneeded'));
-    },
-    get removeStreamEvent() {
-      return dart.const(new (EventStreamProviderOfMediaStreamEvent())('removestream'));
-    },
-    get signalingStateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
-    }
-  });
-  dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
-  dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
-  dart.defineExtensionNames([
-    'sdp',
-    'type'
-  ]);
-  html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
-    static new(dictionary) {
-      let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
-      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.sdp]() {
-      return this.sdp;
-    }
-    set [dartx.sdp](value) {
-      this.sdp = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.setSignature(html$.RtcSessionDescription, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
-      _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
-    }),
-    fields: () => ({
-      [dartx.sdp]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
-  dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
-  const _get_timestamp = Symbol('_get_timestamp');
-  dart.defineExtensionNames([
-    'timestamp',
-    'names',
-    'stat',
-    'id',
-    'type'
-  ]);
-  html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.timestamp]() {
-      return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
-    }
-    get [_get_timestamp]() {
-      return this.timestamp;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.names](...args) {
-      return this.names.apply(this, args);
-    }
-    [dartx.stat](...args) {
-      return this.stat.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.RtcStatsReport, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
-    fields: () => ({
-      [dartx.id]: core.String,
-      [_get_timestamp]: dart.dynamic,
-      [dartx.type]: core.String
-    }),
-    getters: () => ({[dartx.timestamp]: dart.definiteFunctionType(core.DateTime, [])}),
-    methods: () => ({
-      [dartx.names]: dart.definiteFunctionType(core.List$(core.String), []),
-      [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
-  dart.defineExtensionNames([
-    'namedItem',
-    'result'
-  ]);
-  html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-    [dartx.result](...args) {
-      return this.result.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.RtcStatsResponse, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
-    methods: () => ({
-      [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
-      [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
-    })
-  });
-  dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
-  const _availLeft = Symbol('_availLeft');
-  const _availTop = Symbol('_availTop');
-  const _availWidth = Symbol('_availWidth');
-  const _availHeight = Symbol('_availHeight');
-  dart.defineExtensionNames([
-    'available',
-    'colorDepth',
-    'height',
-    'orientation',
-    'pixelDepth',
-    'width'
-  ]);
-  html$.Screen = class Screen extends _interceptors.Interceptor {
-    get [dartx.available]() {
-      return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [_availHeight]() {
-      return this.availHeight;
-    }
-    get [_availLeft]() {
-      return this.availLeft;
-    }
-    get [_availTop]() {
-      return this.availTop;
-    }
-    get [_availWidth]() {
-      return this.availWidth;
-    }
-    get [dartx.colorDepth]() {
-      return this.colorDepth;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.orientation]() {
-      return this.orientation;
-    }
-    get [dartx.pixelDepth]() {
-      return this.pixelDepth;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  dart.setSignature(html$.Screen, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
-    fields: () => ({
-      [_availHeight]: core.int,
-      [_availLeft]: core.int,
-      [_availTop]: core.int,
-      [_availWidth]: core.int,
-      [dartx.colorDepth]: core.int,
-      [dartx.height]: core.int,
-      [dartx.orientation]: html$.ScreenOrientation,
-      [dartx.pixelDepth]: core.int,
-      [dartx.width]: core.int
-    }),
-    getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
-  });
-  dart.registerExtension(dart.global.Screen, html$.Screen);
-  dart.defineExtensionNames([
-    'lock',
-    'unlock',
-    'onChange',
-    'angle',
-    'type'
-  ]);
-  html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.angle]() {
-      return this.angle;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.lock](...args) {
-      return this.lock.apply(this, args);
-    }
-    [dartx.unlock](...args) {
-      return this.unlock.apply(this, args);
-    }
-    get [dartx.onChange]() {
-      return html$.ScreenOrientation.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.ScreenOrientation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
-    fields: () => ({
-      [dartx.angle]: core.int,
-      [dartx.type]: core.String
-    }),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.ScreenOrientation, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
-  dart.defineExtensionNames([
-    'async',
-    'charset',
-    'crossOrigin',
-    'defer',
-    'integrity',
-    'nonce',
-    'src',
-    'type'
-  ]);
-  html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
-    }
-    created() {
-      this[dartx.async] = null;
-      this[dartx.charset] = null;
-      this[dartx.crossOrigin] = null;
-      this[dartx.defer] = null;
-      this[dartx.integrity] = null;
-      this[dartx.nonce] = null;
-      this[dartx.src] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.async]() {
-      return this.async;
-    }
-    set [dartx.async](value) {
-      this.async = value;
-    }
-    get [dartx.charset]() {
-      return this.charset;
-    }
-    set [dartx.charset](value) {
-      this.charset = value;
-    }
-    get [dartx.crossOrigin]() {
-      return this.crossOrigin;
-    }
-    set [dartx.crossOrigin](value) {
-      this.crossOrigin = value;
-    }
-    get [dartx.defer]() {
-      return this.defer;
-    }
-    set [dartx.defer](value) {
-      this.defer = value;
-    }
-    get [dartx.integrity]() {
-      return this.integrity;
-    }
-    set [dartx.integrity](value) {
-      this.integrity = value;
-    }
-    get [dartx.nonce]() {
-      return this.nonce;
-    }
-    set [dartx.nonce](value) {
-      this.nonce = value;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.ScriptElement, 'created');
-  dart.setSignature(html$.ScriptElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ScriptElement, []),
-      new: dart.definiteFunctionType(html$.ScriptElement, []),
-      created: dart.definiteFunctionType(html$.ScriptElement, [])
-    }),
-    fields: () => ({
-      [dartx.async]: core.bool,
-      [dartx.charset]: core.String,
-      [dartx.crossOrigin]: core.String,
-      [dartx.defer]: core.bool,
-      [dartx.integrity]: core.String,
-      [dartx.nonce]: core.String,
-      [dartx.src]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
-  dart.defineExtensionNames([
-    'consumeDelta',
-    'deltaGranularity',
-    'deltaX',
-    'deltaY',
-    'fromUserInput',
-    'inInertialPhase',
-    'isBeginning',
-    'isEnding',
-    'shouldPropagate',
-    'velocityX',
-    'velocityY'
-  ]);
-  html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
-      if (deltaX === void 0) deltaX = null;
-      if (deltaY === void 0) deltaY = null;
-      if (deltaGranularity === void 0) deltaGranularity = null;
-      if (velocityX === void 0) velocityX = null;
-      if (velocityY === void 0) velocityY = null;
-      if (inInertialPhase === void 0) inInertialPhase = null;
-      if (isBeginning === void 0) isBeginning = null;
-      if (isEnding === void 0) isEnding = null;
-      if (isEnding != null) {
-        return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
-      }
-      if (isBeginning != null) {
-        return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
-      }
-      if (inInertialPhase != null) {
-        return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
-      }
-      if (velocityY != null) {
-        return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
-      }
-      if (velocityX != null) {
-        return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
-      }
-      if (deltaGranularity != null) {
-        return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
-      }
-      if (deltaY != null) {
-        return html$.ScrollState._create_7(deltaX, deltaY);
-      }
-      if (deltaX != null) {
-        return html$.ScrollState._create_8(deltaX);
-      }
-      return html$.ScrollState._create_9();
-    }
-    static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
-    }
-    static _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
-    }
-    static _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
-    }
-    static _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
-    }
-    static _create_5(deltaX, deltaY, deltaGranularity, velocityX) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX);
-    }
-    static _create_6(deltaX, deltaY, deltaGranularity) {
-      return new self.ScrollState(deltaX, deltaY, deltaGranularity);
-    }
-    static _create_7(deltaX, deltaY) {
-      return new self.ScrollState(deltaX, deltaY);
-    }
-    static _create_8(deltaX) {
-      return new self.ScrollState(deltaX);
-    }
-    static _create_9() {
-      return new self.ScrollState();
-    }
-    get [dartx.deltaGranularity]() {
-      return this.deltaGranularity;
-    }
-    get [dartx.deltaX]() {
-      return this.deltaX;
-    }
-    get [dartx.deltaY]() {
-      return this.deltaY;
-    }
-    get [dartx.fromUserInput]() {
-      return this.fromUserInput;
-    }
-    get [dartx.inInertialPhase]() {
-      return this.inInertialPhase;
-    }
-    get [dartx.isBeginning]() {
-      return this.isBeginning;
-    }
-    get [dartx.isEnding]() {
-      return this.isEnding;
-    }
-    get [dartx.shouldPropagate]() {
-      return this.shouldPropagate;
-    }
-    get [dartx.velocityX]() {
-      return this.velocityX;
-    }
-    get [dartx.velocityY]() {
-      return this.velocityY;
-    }
-    [dartx.consumeDelta](...args) {
-      return this.consumeDelta.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ScrollState, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ScrollState, []),
-      new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
-    }),
-    fields: () => ({
-      [dartx.deltaGranularity]: core.double,
-      [dartx.deltaX]: core.double,
-      [dartx.deltaY]: core.double,
-      [dartx.fromUserInput]: core.bool,
-      [dartx.inInertialPhase]: core.bool,
-      [dartx.isBeginning]: core.bool,
-      [dartx.isEnding]: core.bool,
-      [dartx.shouldPropagate]: core.bool,
-      [dartx.velocityX]: core.double,
-      [dartx.velocityY]: core.double
-    }),
-    methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
-      _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
-      _create_9: dart.definiteFunctionType(html$.ScrollState, [])
-    }),
-    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
-  });
-  dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
-  dart.defineExtensionNames([
-    'blockedUri',
-    'columnNumber',
-    'documentUri',
-    'effectiveDirective',
-    'lineNumber',
-    'originalPolicy',
-    'referrer',
-    'sourceFile',
-    'statusCode',
-    'violatedDirective'
-  ]);
-  html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.SecurityPolicyViolationEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.SecurityPolicyViolationEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.SecurityPolicyViolationEvent(type);
-    }
-    get [dartx.blockedUri]() {
-      return this.blockedURI;
-    }
-    get [dartx.columnNumber]() {
-      return this.columnNumber;
-    }
-    get [dartx.documentUri]() {
-      return this.documentURI;
-    }
-    get [dartx.effectiveDirective]() {
-      return this.effectiveDirective;
-    }
-    get [dartx.lineNumber]() {
-      return this.lineNumber;
-    }
-    get [dartx.originalPolicy]() {
-      return this.originalPolicy;
-    }
-    get [dartx.referrer]() {
-      return this.referrer;
-    }
-    get [dartx.sourceFile]() {
-      return this.sourceFile;
-    }
-    get [dartx.statusCode]() {
-      return this.statusCode;
-    }
-    get [dartx.violatedDirective]() {
-      return this.violatedDirective;
-    }
-  };
-  dart.setSignature(html$.SecurityPolicyViolationEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
-      new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.blockedUri]: core.String,
-      [dartx.columnNumber]: core.int,
-      [dartx.documentUri]: core.String,
-      [dartx.effectiveDirective]: core.String,
-      [dartx.lineNumber]: core.int,
-      [dartx.originalPolicy]: core.String,
-      [dartx.referrer]: core.String,
-      [dartx.sourceFile]: core.String,
-      [dartx.statusCode]: core.int,
-      [dartx.violatedDirective]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
-  dart.defineExtensionNames([
-    'add',
-    'checkValidity',
-    'item',
-    'namedItem',
-    'reportValidity',
-    'setCustomValidity',
-    'options',
-    'selectedOptions',
-    'autofocus',
-    'disabled',
-    'form',
-    'labels',
-    'length',
-    'multiple',
-    'name',
-    'required',
-    'selectedIndex',
-    'size',
-    'type',
-    'validationMessage',
-    'validity',
-    'value',
-    'willValidate'
-  ]);
-  html$.SelectElement = class SelectElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
-    }
-    created() {
-      this[dartx.autofocus] = null;
-      this[dartx.disabled] = null;
-      this[dartx.form] = null;
-      this[dartx.labels] = null;
-      this[dartx.length] = null;
-      this[dartx.multiple] = null;
-      this[dartx.name] = null;
-      this[dartx.required] = null;
-      this[dartx.selectedIndex] = null;
-      this[dartx.size] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.value] = null;
-      this[dartx.willValidate] = null;
-      super.created();
-    }
-    get [dartx.autofocus]() {
-      return this.autofocus;
-    }
-    set [dartx.autofocus](value) {
-      this.autofocus = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    set [dartx.length](value) {
-      this.length = value;
-    }
-    get [dartx.multiple]() {
-      return this.multiple;
-    }
-    set [dartx.multiple](value) {
-      this.multiple = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.required]() {
-      return this.required;
-    }
-    set [dartx.required](value) {
-      this.required = value;
-    }
-    get [dartx.selectedIndex]() {
-      return this.selectedIndex;
-    }
-    set [dartx.selectedIndex](value) {
-      this.selectedIndex = value;
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    set [dartx.size](value) {
-      this.size = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    [__setter__](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.add](...args) {
-      return this.add.apply(this, args);
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.namedItem](...args) {
-      return this.namedItem.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-    get [dartx.options]() {
-      let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
-      return new (UnmodifiableListViewOfOptionElement())(options);
-    }
-    get [dartx.selectedOptions]() {
-      if (dart.test(this[dartx.multiple])) {
-        let options = this[dartx.options][dartx.where](dart.fn(o => o[dartx.selected], OptionElementTobool()))[dartx.toList]();
-        return new (UnmodifiableListViewOfOptionElement())(options);
-      } else {
-        return JSArrayOfOptionElement().of([this[dartx.options][dartx._get](this[dartx.selectedIndex])]);
-      }
-    }
-  };
-  dart.defineNamedConstructor(html$.SelectElement, 'created');
-  dart.setSignature(html$.SelectElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SelectElement, []),
-      new: dart.definiteFunctionType(html$.SelectElement, []),
-      created: dart.definiteFunctionType(html$.SelectElement, [])
-    }),
-    fields: () => ({
-      [dartx.autofocus]: core.bool,
-      [dartx.disabled]: core.bool,
-      [dartx.form]: html$.FormElement,
-      [dartx.labels]: ListOfNode(),
-      [dartx.length]: core.int,
-      [dartx.multiple]: core.bool,
-      [dartx.name]: core.String,
-      [dartx.required]: core.bool,
-      [dartx.selectedIndex]: core.int,
-      [dartx.size]: core.int,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.value]: core.String,
-      [dartx.willValidate]: core.bool
-    }),
-    getters: () => ({
-      [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
-      [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
-    }),
-    methods: () => ({
-      [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
-      [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
-      [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
-  dart.defineExtensionNames([
-    'addRange',
-    'collapse',
-    'collapseToEnd',
-    'collapseToStart',
-    'containsNode',
-    'deleteFromDocument',
-    'empty',
-    'extend',
-    'getRangeAt',
-    'modify',
-    'removeAllRanges',
-    'selectAllChildren',
-    'setBaseAndExtent',
-    'setPosition',
-    'anchorNode',
-    'anchorOffset',
-    'baseNode',
-    'baseOffset',
-    'extentNode',
-    'extentOffset',
-    'focusNode',
-    'focusOffset',
-    'isCollapsed',
-    'rangeCount',
-    'type'
-  ]);
-  html$.Selection = class Selection extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.anchorNode]() {
-      return this.anchorNode;
-    }
-    get [dartx.anchorOffset]() {
-      return this.anchorOffset;
-    }
-    get [dartx.baseNode]() {
-      return this.baseNode;
-    }
-    get [dartx.baseOffset]() {
-      return this.baseOffset;
-    }
-    get [dartx.extentNode]() {
-      return this.extentNode;
-    }
-    get [dartx.extentOffset]() {
-      return this.extentOffset;
-    }
-    get [dartx.focusNode]() {
-      return this.focusNode;
-    }
-    get [dartx.focusOffset]() {
-      return this.focusOffset;
-    }
-    get [dartx.isCollapsed]() {
-      return this.isCollapsed;
-    }
-    get [dartx.rangeCount]() {
-      return this.rangeCount;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.addRange](...args) {
-      return this.addRange.apply(this, args);
-    }
-    [dartx.collapse](...args) {
-      return this.collapse.apply(this, args);
-    }
-    [dartx.collapseToEnd](...args) {
-      return this.collapseToEnd.apply(this, args);
-    }
-    [dartx.collapseToStart](...args) {
-      return this.collapseToStart.apply(this, args);
-    }
-    [dartx.containsNode](...args) {
-      return this.containsNode.apply(this, args);
-    }
-    [dartx.deleteFromDocument](...args) {
-      return this.deleteFromDocument.apply(this, args);
-    }
-    [dartx.empty](...args) {
-      return this.empty.apply(this, args);
-    }
-    [dartx.extend](...args) {
-      return this.extend.apply(this, args);
-    }
-    [dartx.getRangeAt](...args) {
-      return this.getRangeAt.apply(this, args);
-    }
-    [dartx.modify](...args) {
-      return this.modify.apply(this, args);
-    }
-    [dartx.removeAllRanges](...args) {
-      return this.removeAllRanges.apply(this, args);
-    }
-    [dartx.selectAllChildren](...args) {
-      return this.selectAllChildren.apply(this, args);
-    }
-    [dartx.setBaseAndExtent](...args) {
-      return this.setBaseAndExtent.apply(this, args);
-    }
-    [dartx.setPosition](...args) {
-      return this.setPosition.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.Selection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
-    fields: () => ({
-      [dartx.anchorNode]: html$.Node,
-      [dartx.anchorOffset]: core.int,
-      [dartx.baseNode]: html$.Node,
-      [dartx.baseOffset]: core.int,
-      [dartx.extentNode]: html$.Node,
-      [dartx.extentOffset]: core.int,
-      [dartx.focusNode]: html$.Node,
-      [dartx.focusOffset]: core.int,
-      [dartx.isCollapsed]: core.bool,
-      [dartx.rangeCount]: core.int,
-      [dartx.type]: core.String
-    }),
-    methods: () => ({
-      [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
-      [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
-      [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
-      [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
-      [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
-      [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
-      [dartx.empty]: dart.definiteFunctionType(dart.void, []),
-      [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
-      [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
-      [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
-      [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
-      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.Selection, html$.Selection);
-  dart.defineExtensionNames([
-    'close',
-    'postMessage',
-    'data',
-    'name',
-    'targetUrl'
-  ]);
-  html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.targetUrl]() {
-      return this.targetURL;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ServicePort, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
-    fields: () => ({
-      [dartx.data]: core.Object,
-      [dartx.name]: core.String,
-      [dartx.targetUrl]: core.String
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
-  const _connect_1 = Symbol('_connect_1');
-  const _connect_2 = Symbol('_connect_2');
-  dart.defineExtensionNames([
-    'connect',
-    'match',
-    'matchAll',
-    'onMessage'
-  ]);
-  html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.connect](url, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_connect_1](url, options_1);
-      }
-      return this[_connect_2](url);
-    }
-    [_connect_1](...args) {
-      return this.connect.apply(this, args);
-    }
-    [_connect_2](...args) {
-      return this.connect.apply(this, args);
-    }
-    [dartx.match](options) {
-      let options_1 = html_common.convertDartToNative_Dictionary(options);
-      return this[_match_1](options_1);
-    }
-    [_match_1](...args) {
-      return this.match.apply(this, args);
-    }
-    [dartx.matchAll](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_matchAll_1](options_1);
-      }
-      return this[_matchAll_2]();
-    }
-    [_matchAll_1](...args) {
-      return this.matchAll.apply(this, args);
-    }
-    [_matchAll_2](...args) {
-      return this.matchAll.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.ServicePortCollection.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.ServicePortCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
-      [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_connect_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.match]: dart.definiteFunctionType(async.Future, [core.Map]),
-      [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_matchAll_2]: dart.definiteFunctionType(async.Future, [])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.ServicePortCollection, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
-  dart.defineExtensionNames([
-    'respondWith',
-    'origin',
-    'targetUrl'
-  ]);
-  html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ServicePortConnectEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ServicePortConnectEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ServicePortConnectEvent(type);
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.targetUrl]() {
-      return this.targetURL;
-    }
-    [dartx.respondWith](...args) {
-      return this.respondWith.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ServicePortConnectEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
-      new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.origin]: core.String,
-      [dartx.targetUrl]: core.String
-    }),
-    methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
-  dart.defineExtensionNames([
-    'getRegistration',
-    'getRegistrations',
-    'register',
-    'onMessage',
-    'controller',
-    'ready'
-  ]);
-  html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.controller]() {
-      return this.controller;
-    }
-    get [dartx.ready]() {
-      return this.ready;
-    }
-    [dartx.getRegistration](...args) {
-      return this.getRegistration.apply(this, args);
-    }
-    [dartx.getRegistrations](...args) {
-      return this.getRegistrations.apply(this, args);
-    }
-    [dartx.register](url, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_register_1](url, options_1);
-      }
-      return this[_register_2](url);
-    }
-    [_register_1](...args) {
-      return this.register.apply(this, args);
-    }
-    [_register_2](...args) {
-      return this.register.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.ServiceWorkerContainer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
-    fields: () => ({
-      [dartx.controller]: html$._ServiceWorker,
-      [dartx.ready]: async.Future
-    }),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({
-      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
-      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
-      [dartx.register]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
-      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_register_2]: dart.definiteFunctionType(async.Future, [dart.dynamic])
-    }),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.ServiceWorkerContainer, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
-  dart.defineExtensionNames([
-    'skipWaiting',
-    'onMessage',
-    'clients',
-    'ports',
-    'registration'
-  ]);
-  html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.clients]() {
-      return this.clients;
-    }
-    get [dartx.ports]() {
-      return this.ports;
-    }
-    get [dartx.registration]() {
-      return this.registration;
-    }
-    [dartx.skipWaiting](...args) {
-      return this.skipWaiting.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.ServiceWorkerGlobalScope, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
-    fields: () => ({
-      [dartx.clients]: html$.Clients,
-      [dartx.ports]: html$.StashedPortCollection,
-      [dartx.registration]: html$.ServiceWorkerRegistration
-    }),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.ServiceWorkerGlobalScope, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
-  dart.defineExtensionNames([
-    'data',
-    'lastEventId',
-    'origin',
-    'ports',
-    'source'
-  ]);
-  html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
-    get [dartx.data]() {
-      return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
-    }
-    get [_get_data]() {
-      return this.data;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.ServiceWorkerMessageEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.ServiceWorkerMessageEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.ServiceWorkerMessageEvent(type);
-    }
-    get [dartx.lastEventId]() {
-      return this.lastEventId;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.ports]() {
-      return this.ports;
-    }
-    get [dartx.source]() {
-      return this.source;
-    }
-  };
-  dart.setSignature(html$.ServiceWorkerMessageEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
-      new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_get_data]: dart.dynamic,
-      [dartx.lastEventId]: core.String,
-      [dartx.origin]: core.String,
-      [dartx.ports]: ListOfMessagePort(),
-      [dartx.source]: core.Object
-    }),
-    getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
-  const _getNotifications_1 = Symbol('_getNotifications_1');
-  const _getNotifications_2 = Symbol('_getNotifications_2');
-  const _showNotification_1 = Symbol('_showNotification_1');
-  const _showNotification_2 = Symbol('_showNotification_2');
-  dart.defineExtensionNames([
-    'getNotifications',
-    'showNotification',
-    'unregister',
-    'update',
-    'active',
-    'geofencing',
-    'installing',
-    'periodicSync',
-    'pushManager',
-    'scope',
-    'sync',
-    'waiting'
-  ]);
-  html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.active]() {
-      return this.active;
-    }
-    get [dartx.geofencing]() {
-      return this.geofencing;
-    }
-    get [dartx.installing]() {
-      return this.installing;
-    }
-    get [dartx.periodicSync]() {
-      return this.periodicSync;
-    }
-    get [dartx.pushManager]() {
-      return this.pushManager;
-    }
-    get [dartx.scope]() {
-      return this.scope;
-    }
-    get [dartx.sync]() {
-      return this.sync;
-    }
-    get [dartx.waiting]() {
-      return this.waiting;
-    }
-    [dartx.getNotifications](filter) {
-      if (filter === void 0) filter = null;
-      if (filter != null) {
-        let filter_1 = html_common.convertDartToNative_Dictionary(filter);
-        return this[_getNotifications_1](filter_1);
-      }
-      return this[_getNotifications_2]();
-    }
-    [_getNotifications_1](...args) {
-      return this.getNotifications.apply(this, args);
-    }
-    [_getNotifications_2](...args) {
-      return this.getNotifications.apply(this, args);
-    }
-    [dartx.showNotification](title, options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_showNotification_1](title, options_1);
-      }
-      return this[_showNotification_2](title);
-    }
-    [_showNotification_1](...args) {
-      return this.showNotification.apply(this, args);
-    }
-    [_showNotification_2](...args) {
-      return this.showNotification.apply(this, args);
-    }
-    [dartx.unregister](...args) {
-      return this.unregister.apply(this, args);
-    }
-    [dartx.update](...args) {
-      return this.update.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.ServiceWorkerRegistration, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
-    fields: () => ({
-      [dartx.active]: html$._ServiceWorker,
-      [dartx.geofencing]: html$.Geofencing,
-      [dartx.installing]: html$._ServiceWorker,
-      [dartx.periodicSync]: html$.PeriodicSyncManager,
-      [dartx.pushManager]: html$.PushManager,
-      [dartx.scope]: core.String,
-      [dartx.sync]: html$.SyncManager,
-      [dartx.waiting]: html$._ServiceWorker
-    }),
-    methods: () => ({
-      [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_getNotifications_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_getNotifications_2]: dart.definiteFunctionType(async.Future, []),
-      [dartx.showNotification]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
-      [_showNotification_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_showNotification_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.unregister]: dart.definiteFunctionType(async.Future, []),
-      [dartx.update]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
-  dart.defineExtensionNames([
-    'getDistributedNodes'
-  ]);
-  html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('shadow');
-    }
-    [dartx.getDistributedNodes](...args) {
-      return this.getDistributedNodes.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.ShadowElement, 'created');
-  dart.setSignature(html$.ShadowElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.ShadowElement, []),
-      new: dart.definiteFunctionType(html$.ShadowElement, []),
-      created: dart.definiteFunctionType(html$.ShadowElement, [])
-    }),
-    methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
-  dart.defineExtensionNames([
-    'clone',
-    'elementFromPoint',
-    'elementsFromPoint',
-    'getSelection',
-    'resetStyleInheritance',
-    'resetStyleInheritance',
-    'applyAuthorStyles',
-    'applyAuthorStyles',
-    'activeElement',
-    'delegatesFocus',
-    'host',
-    'innerHtml',
-    'olderShadowRoot',
-    'styleSheets'
-  ]);
-  html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.activeElement]() {
-      return this.activeElement;
-    }
-    get [dartx.delegatesFocus]() {
-      return this.delegatesFocus;
-    }
-    get [dartx.host]() {
-      return this.host;
-    }
-    get [dartx.innerHtml]() {
-      return this.innerHTML;
-    }
-    set [dartx.innerHtml](value) {
-      this.innerHTML = value;
-    }
-    get [dartx.olderShadowRoot]() {
-      return this.olderShadowRoot;
-    }
-    get [dartx.styleSheets]() {
-      return this.styleSheets;
-    }
-    [dartx.clone](...args) {
-      return this.cloneNode.apply(this, args);
-    }
-    [dartx.elementFromPoint](...args) {
-      return this.elementFromPoint.apply(this, args);
-    }
-    [dartx.elementsFromPoint](...args) {
-      return this.elementsFromPoint.apply(this, args);
-    }
-    [dartx.getSelection](...args) {
-      return this.getSelection.apply(this, args);
-    }
-    static get supported() {
-      return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
-    }
-    static _shadowRootDeprecationReport() {
-      if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
-        html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
-        html$.ShadowRoot._shadowRootDeprecationReported = true;
-      }
-    }
-    get [dartx.resetStyleInheritance]() {
-      html$.ShadowRoot._shadowRootDeprecationReport();
-      return false;
-    }
-    set [dartx.resetStyleInheritance](value) {
-      html$.ShadowRoot._shadowRootDeprecationReport();
-    }
-    get [dartx.applyAuthorStyles]() {
-      html$.ShadowRoot._shadowRootDeprecationReport();
-      return false;
-    }
-    set [dartx.applyAuthorStyles](value) {
-      html$.ShadowRoot._shadowRootDeprecationReport();
-    }
-  };
-  const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
-  dart.setSignature(html$.ShadowRoot, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
-    fields: () => ({
-      [dartx.activeElement]: html$.Element,
-      [dartx.delegatesFocus]: core.bool,
-      [dartx.host]: html$.Element,
-      [dartx.innerHtml]: core.String,
-      [dartx.olderShadowRoot]: html$.ShadowRoot,
-      [dartx.styleSheets]: ListOfStyleSheet()
-    }),
-    getters: () => ({
-      [dartx.resetStyleInheritance]: dart.definiteFunctionType(core.bool, []),
-      [dartx.applyAuthorStyles]: dart.definiteFunctionType(core.bool, [])
-    }),
-    setters: () => ({
-      [dartx.resetStyleInheritance]: dart.definiteFunctionType(dart.void, [core.bool]),
-      [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
-    }),
-    methods: () => ({
-      [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
-      [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
-      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
-    }),
-    sfields: () => ({_shadowRootDeprecationReported: core.bool}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
-    names: ['_shadowRootDeprecationReport']
-  });
-  html$.ShadowRoot._shadowRootDeprecationReported = false;
-  dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
-  dart.defineExtensionNames([
-    'byteLength'
-  ]);
-  html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.byteLength]() {
-      return this.byteLength;
-    }
-  };
-  dart.setSignature(html$.SharedArrayBuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
-    fields: () => ({[dartx.byteLength]: core.int})
-  });
-  dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
-  dart.defineExtensionNames([
-    'onError',
-    'port',
-    'workerStart'
-  ]);
-  html$.SharedWorker = class SharedWorker extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(scriptURL, name) {
-      if (name === void 0) name = null;
-      if (name != null) {
-        return html$.SharedWorker._create_1(scriptURL, name);
-      }
-      return html$.SharedWorker._create_2(scriptURL);
-    }
-    static _create_1(scriptURL, name) {
-      return new self.SharedWorker(scriptURL, name);
-    }
-    static _create_2(scriptURL) {
-      return new self.SharedWorker(scriptURL);
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-    get [dartx.workerStart]() {
-      return this.workerStart;
-    }
-    get [dartx.onError]() {
-      return html$.SharedWorker.errorEvent.forTarget(this);
-    }
-  };
-  html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
-  dart.setSignature(html$.SharedWorker, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SharedWorker, []),
-      new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
-    }),
-    fields: () => ({
-      [dartx.port]: html$.MessagePort,
-      [dartx.workerStart]: core.double
-    }),
-    getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.defineLazy(html$.SharedWorker, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    }
-  });
-  dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
-  dart.defineExtensionNames([
-    'onConnect',
-    'name'
-  ]);
-  html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.onConnect]() {
-      return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.SharedWorkerGlobalScope, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
-    fields: () => ({[dartx.name]: core.String}),
-    getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.SharedWorkerGlobalScope, {
-    get connectEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('connect'));
-    }
-  });
-  dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
-  dart.defineExtensionNames([
-    'abort',
-    'appendBuffer',
-    'appendStream',
-    'appendTypedData',
-    'remove',
-    'appendWindowEnd',
-    'appendWindowStart',
-    'buffered',
-    'mode',
-    'timestampOffset',
-    'trackDefaults',
-    'updating'
-  ]);
-  html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.appendWindowEnd]() {
-      return this.appendWindowEnd;
-    }
-    set [dartx.appendWindowEnd](value) {
-      this.appendWindowEnd = value;
-    }
-    get [dartx.appendWindowStart]() {
-      return this.appendWindowStart;
-    }
-    set [dartx.appendWindowStart](value) {
-      this.appendWindowStart = value;
-    }
-    get [dartx.buffered]() {
-      return this.buffered;
-    }
-    get [dartx.mode]() {
-      return this.mode;
-    }
-    set [dartx.mode](value) {
-      this.mode = value;
-    }
-    get [dartx.timestampOffset]() {
-      return this.timestampOffset;
-    }
-    set [dartx.timestampOffset](value) {
-      this.timestampOffset = value;
-    }
-    get [dartx.trackDefaults]() {
-      return this.trackDefaults;
-    }
-    set [dartx.trackDefaults](value) {
-      this.trackDefaults = value;
-    }
-    get [dartx.updating]() {
-      return this.updating;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.appendBuffer](...args) {
-      return this.appendBuffer.apply(this, args);
-    }
-    [dartx.appendStream](...args) {
-      return this.appendStream.apply(this, args);
-    }
-    [dartx.appendTypedData](...args) {
-      return this.appendBuffer.apply(this, args);
-    }
-    [dartx.remove](...args) {
-      return this.remove.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.SourceBuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
-    fields: () => ({
-      [dartx.appendWindowEnd]: core.num,
-      [dartx.appendWindowStart]: core.num,
-      [dartx.buffered]: html$.TimeRanges,
-      [dartx.mode]: core.String,
-      [dartx.timestampOffset]: core.num,
-      [dartx.trackDefaults]: html$.TrackDefaultList,
-      [dartx.updating]: core.bool
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
-      [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
-      [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
-      [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
-    })
-  });
-  dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
-  dart.setSignature(html$.SourceBufferList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
-      [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
-  dart.defineExtensionNames([
-    'media',
-    'sizes',
-    'src',
-    'srcset',
-    'type'
-  ]);
-  html$.SourceElement = class SourceElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
-    }
-    created() {
-      this[dartx.media] = null;
-      this[dartx.sizes] = null;
-      this[dartx.src] = null;
-      this[dartx.srcset] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    set [dartx.media](value) {
-      this.media = value;
-    }
-    get [dartx.sizes]() {
-      return this.sizes;
-    }
-    set [dartx.sizes](value) {
-      this.sizes = value;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.srcset]() {
-      return this.srcset;
-    }
-    set [dartx.srcset](value) {
-      this.srcset = value;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.SourceElement, 'created');
-  dart.setSignature(html$.SourceElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SourceElement, []),
-      new: dart.definiteFunctionType(html$.SourceElement, []),
-      created: dart.definiteFunctionType(html$.SourceElement, [])
-    }),
-    fields: () => ({
-      [dartx.media]: core.String,
-      [dartx.sizes]: core.String,
-      [dartx.src]: core.String,
-      [dartx.srcset]: core.String,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
-  dart.defineExtensionNames([
-    'facing',
-    'id',
-    'kind',
-    'label'
-  ]);
-  html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.facing]() {
-      return this.facing;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-  };
-  dart.setSignature(html$.SourceInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
-    fields: () => ({
-      [dartx.facing]: core.String,
-      [dartx.id]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
-  html$.SpanElement = class SpanElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.SpanElement, 'created');
-  dart.setSignature(html$.SpanElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpanElement, []),
-      new: dart.definiteFunctionType(html$.SpanElement, []),
-      created: dart.definiteFunctionType(html$.SpanElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
-  dart.defineExtensionNames([
-    'src',
-    'weight'
-  ]);
-  html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.SpeechGrammar._create_1();
-    }
-    static _create_1() {
-      return new self.SpeechGrammar();
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.weight]() {
-      return this.weight;
-    }
-    set [dartx.weight](value) {
-      this.weight = value;
-    }
-  };
-  dart.setSignature(html$.SpeechGrammar, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechGrammar, []),
-      new: dart.definiteFunctionType(html$.SpeechGrammar, [])
-    }),
-    fields: () => ({
-      [dartx.src]: core.String,
-      [dartx.weight]: core.num
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'addFromString',
-    'addFromUri',
-    'item'
-  ]);
-  html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.SpeechGrammarList._create_1();
-    }
-    static _create_1() {
-      return new self.SpeechGrammarList();
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.addFromString](...args) {
-      return this.addFromString.apply(this, args);
-    }
-    [dartx.addFromUri](...args) {
-      return this.addFromUri.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
-  dart.setSignature(html$.SpeechGrammarList, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
-      new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
-    }),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
-      [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
-      [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
-      [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
-  dart.defineExtensionNames([
-    'abort',
-    'start',
-    'stop',
-    'onAudioEnd',
-    'onAudioStart',
-    'onEnd',
-    'onError',
-    'onNoMatch',
-    'onResult',
-    'onSoundEnd',
-    'onSoundStart',
-    'onSpeechEnd',
-    'onSpeechStart',
-    'onStart',
-    'audioTrack',
-    'continuous',
-    'grammars',
-    'interimResults',
-    'lang',
-    'maxAlternatives',
-    'serviceUri'
-  ]);
-  html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
-    }
-    get [dartx.audioTrack]() {
-      return this.audioTrack;
-    }
-    set [dartx.audioTrack](value) {
-      this.audioTrack = value;
-    }
-    get [dartx.continuous]() {
-      return this.continuous;
-    }
-    set [dartx.continuous](value) {
-      this.continuous = value;
-    }
-    get [dartx.grammars]() {
-      return this.grammars;
-    }
-    set [dartx.grammars](value) {
-      this.grammars = value;
-    }
-    get [dartx.interimResults]() {
-      return this.interimResults;
-    }
-    set [dartx.interimResults](value) {
-      this.interimResults = value;
-    }
-    get [dartx.lang]() {
-      return this.lang;
-    }
-    set [dartx.lang](value) {
-      this.lang = value;
-    }
-    get [dartx.maxAlternatives]() {
-      return this.maxAlternatives;
-    }
-    set [dartx.maxAlternatives](value) {
-      this.maxAlternatives = value;
-    }
-    get [dartx.serviceUri]() {
-      return this.serviceURI;
-    }
-    set [dartx.serviceUri](value) {
-      this.serviceURI = value;
-    }
-    [dartx.abort](...args) {
-      return this.abort.apply(this, args);
-    }
-    [dartx.start](...args) {
-      return this.start.apply(this, args);
-    }
-    [dartx.stop](...args) {
-      return this.stop.apply(this, args);
-    }
-    get [dartx.onAudioEnd]() {
-      return html$.SpeechRecognition.audioEndEvent.forTarget(this);
-    }
-    get [dartx.onAudioStart]() {
-      return html$.SpeechRecognition.audioStartEvent.forTarget(this);
-    }
-    get [dartx.onEnd]() {
-      return html$.SpeechRecognition.endEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.SpeechRecognition.errorEvent.forTarget(this);
-    }
-    get [dartx.onNoMatch]() {
-      return html$.SpeechRecognition.noMatchEvent.forTarget(this);
-    }
-    get [dartx.onResult]() {
-      return html$.SpeechRecognition.resultEvent.forTarget(this);
-    }
-    get [dartx.onSoundEnd]() {
-      return html$.SpeechRecognition.soundEndEvent.forTarget(this);
-    }
-    get [dartx.onSoundStart]() {
-      return html$.SpeechRecognition.soundStartEvent.forTarget(this);
-    }
-    get [dartx.onSpeechEnd]() {
-      return html$.SpeechRecognition.speechEndEvent.forTarget(this);
-    }
-    get [dartx.onSpeechStart]() {
-      return html$.SpeechRecognition.speechStartEvent.forTarget(this);
-    }
-    get [dartx.onStart]() {
-      return html$.SpeechRecognition.startEvent.forTarget(this);
-    }
-    static new() {
-      return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
-    }
-  };
-  dart.setSignature(html$.SpeechRecognition, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechRecognition, []),
-      new: dart.definiteFunctionType(html$.SpeechRecognition, [])
-    }),
-    fields: () => ({
-      [dartx.audioTrack]: html$.MediaStreamTrack,
-      [dartx.continuous]: core.bool,
-      [dartx.grammars]: html$.SpeechGrammarList,
-      [dartx.interimResults]: core.bool,
-      [dartx.lang]: core.String,
-      [dartx.maxAlternatives]: core.int,
-      [dartx.serviceUri]: core.String
-    }),
-    getters: () => ({
-      [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
-      [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
-      [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
-      [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-      [dartx.start]: dart.definiteFunctionType(dart.void, []),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      audioEndEvent: EventStreamProviderOfEvent(),
-      audioStartEvent: EventStreamProviderOfEvent(),
-      endEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfSpeechRecognitionError(),
-      noMatchEvent: EventStreamProviderOfSpeechRecognitionEvent(),
-      resultEvent: EventStreamProviderOfSpeechRecognitionEvent(),
-      soundEndEvent: EventStreamProviderOfEvent(),
-      soundStartEvent: EventStreamProviderOfEvent(),
-      speechEndEvent: EventStreamProviderOfEvent(),
-      speechStartEvent: EventStreamProviderOfEvent(),
-      startEvent: EventStreamProviderOfEvent()
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.defineLazy(html$.SpeechRecognition, {
-    get audioEndEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('audioend'));
-    },
-    get audioStartEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('audiostart'));
-    },
-    get endEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('end'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechRecognitionError())('error'));
-    },
-    get noMatchEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('nomatch'));
-    },
-    get resultEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('result'));
-    },
-    get soundEndEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('soundend'));
-    },
-    get soundStartEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('soundstart'));
-    },
-    get speechEndEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('speechend'));
-    },
-    get speechStartEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('speechstart'));
-    },
-    get startEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('start'));
-    }
-  });
-  dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
-  dart.defineExtensionNames([
-    'confidence',
-    'transcript'
-  ]);
-  html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.confidence]() {
-      return this.confidence;
-    }
-    get [dartx.transcript]() {
-      return this.transcript;
-    }
-  };
-  dart.setSignature(html$.SpeechRecognitionAlternative, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
-    fields: () => ({
-      [dartx.confidence]: core.double,
-      [dartx.transcript]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
-  dart.defineExtensionNames([
-    'error',
-    'message'
-  ]);
-  html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, initDict) {
-      if (initDict === void 0) initDict = null;
-      if (initDict != null) {
-        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
-        return html$.SpeechRecognitionError._create_1(type, initDict_1);
-      }
-      return html$.SpeechRecognitionError._create_2(type);
-    }
-    static _create_1(type, initDict) {
-      return new self.SpeechRecognitionError(type, initDict);
-    }
-    static _create_2(type) {
-      return new self.SpeechRecognitionError(type);
-    }
-    get [dartx.error]() {
-      return this.error;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-  };
-  dart.setSignature(html$.SpeechRecognitionError, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
-      new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.error]: core.String,
-      [dartx.message]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
-  dart.defineExtensionNames([
-    'emma',
-    'interpretation',
-    'resultIndex',
-    'results'
-  ]);
-  html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, initDict) {
-      if (initDict === void 0) initDict = null;
-      if (initDict != null) {
-        let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
-        return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
-      }
-      return html$.SpeechRecognitionEvent._create_2(type);
-    }
-    static _create_1(type, initDict) {
-      return new self.SpeechRecognitionEvent(type, initDict);
-    }
-    static _create_2(type) {
-      return new self.SpeechRecognitionEvent(type);
-    }
-    get [dartx.emma]() {
-      return this.emma;
-    }
-    get [dartx.interpretation]() {
-      return this.interpretation;
-    }
-    get [dartx.resultIndex]() {
-      return this.resultIndex;
-    }
-    get [dartx.results]() {
-      return this.results;
-    }
-  };
-  dart.setSignature(html$.SpeechRecognitionEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
-      new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.emma]: html$.Document,
-      [dartx.interpretation]: html$.Document,
-      [dartx.resultIndex]: core.int,
-      [dartx.results]: ListOfSpeechRecognitionResult()
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
-  dart.defineExtensionNames([
-    'item',
-    'isFinal',
-    'length'
-  ]);
-  html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.isFinal]() {
-      return this.isFinal;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.SpeechRecognitionResult, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
-    fields: () => ({
-      [dartx.isFinal]: core.bool,
-      [dartx.length]: core.int
-    }),
-    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
-  });
-  dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
-  dart.defineExtensionNames([
-    'cancel',
-    'getVoices',
-    'pause',
-    'resume',
-    'speak',
-    'paused',
-    'pending',
-    'speaking'
-  ]);
-  html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.paused]() {
-      return this.paused;
-    }
-    get [dartx.pending]() {
-      return this.pending;
-    }
-    get [dartx.speaking]() {
-      return this.speaking;
-    }
-    [dartx.cancel](...args) {
-      return this.cancel.apply(this, args);
-    }
-    [dartx.getVoices](...args) {
-      return this.getVoices.apply(this, args);
-    }
-    [dartx.pause](...args) {
-      return this.pause.apply(this, args);
-    }
-    [dartx.resume](...args) {
-      return this.resume.apply(this, args);
-    }
-    [dartx.speak](...args) {
-      return this.speak.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.SpeechSynthesis, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
-    fields: () => ({
-      [dartx.paused]: core.bool,
-      [dartx.pending]: core.bool,
-      [dartx.speaking]: core.bool
-    }),
-    methods: () => ({
-      [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
-      [dartx.pause]: dart.definiteFunctionType(dart.void, []),
-      [dartx.resume]: dart.definiteFunctionType(dart.void, []),
-      [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
-    })
-  });
-  dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
-  dart.defineExtensionNames([
-    'charIndex',
-    'elapsedTime',
-    'name',
-    'utterance'
-  ]);
-  html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.charIndex]() {
-      return this.charIndex;
-    }
-    get [dartx.elapsedTime]() {
-      return this.elapsedTime;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.utterance]() {
-      return this.utterance;
-    }
-  };
-  dart.setSignature(html$.SpeechSynthesisEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
-    fields: () => ({
-      [dartx.charIndex]: core.int,
-      [dartx.elapsedTime]: core.double,
-      [dartx.name]: core.String,
-      [dartx.utterance]: html$.SpeechSynthesisUtterance
-    })
-  });
-  dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
-  dart.defineExtensionNames([
-    'onBoundary',
-    'onEnd',
-    'onError',
-    'onMark',
-    'onPause',
-    'onResume',
-    'onStart',
-    'lang',
-    'pitch',
-    'rate',
-    'text',
-    'voice',
-    'volume'
-  ]);
-  html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(text) {
-      if (text === void 0) text = null;
-      if (text != null) {
-        return html$.SpeechSynthesisUtterance._create_1(text);
-      }
-      return html$.SpeechSynthesisUtterance._create_2();
-    }
-    static _create_1(text) {
-      return new self.SpeechSynthesisUtterance(text);
-    }
-    static _create_2() {
-      return new self.SpeechSynthesisUtterance();
-    }
-    get [dartx.lang]() {
-      return this.lang;
-    }
-    set [dartx.lang](value) {
-      this.lang = value;
-    }
-    get [dartx.pitch]() {
-      return this.pitch;
-    }
-    set [dartx.pitch](value) {
-      this.pitch = value;
-    }
-    get [dartx.rate]() {
-      return this.rate;
-    }
-    set [dartx.rate](value) {
-      this.rate = value;
-    }
-    get [dartx.text]() {
-      return this.text;
-    }
-    set [dartx.text](value) {
-      this.text = value;
-    }
-    get [dartx.voice]() {
-      return this.voice;
-    }
-    set [dartx.voice](value) {
-      this.voice = value;
-    }
-    get [dartx.volume]() {
-      return this.volume;
-    }
-    set [dartx.volume](value) {
-      this.volume = value;
-    }
-    get [dartx.onBoundary]() {
-      return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
-    }
-    get [dartx.onEnd]() {
-      return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
-    }
-    get [dartx.onMark]() {
-      return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
-    }
-    get [dartx.onPause]() {
-      return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
-    }
-    get [dartx.onResume]() {
-      return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
-    }
-    get [dartx.onStart]() {
-      return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.SpeechSynthesisUtterance, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
-      new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
-    }),
-    fields: () => ({
-      [dartx.lang]: core.String,
-      [dartx.pitch]: core.num,
-      [dartx.rate]: core.num,
-      [dartx.text]: core.String,
-      [dartx.voice]: html$.SpeechSynthesisVoice,
-      [dartx.volume]: core.num
-    }),
-    getters: () => ({
-      [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
-      [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
-      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
-      [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
-    }),
-    sfields: () => ({
-      boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
-      endEvent: EventStreamProviderOfSpeechSynthesisEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      markEvent: EventStreamProviderOfSpeechSynthesisEvent(),
-      pauseEvent: EventStreamProviderOfEvent(),
-      resumeEvent: EventStreamProviderOfSpeechSynthesisEvent(),
-      startEvent: EventStreamProviderOfSpeechSynthesisEvent()
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.defineLazy(html$.SpeechSynthesisUtterance, {
-    get boundaryEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
-    },
-    get endEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('end'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get markEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('mark'));
-    },
-    get pauseEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pause'));
-    },
-    get resumeEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('resume'));
-    },
-    get startEvent() {
-      return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
-    }
-  });
-  dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
-  dart.defineExtensionNames([
-    'defaultValue',
-    'lang',
-    'localService',
-    'name',
-    'voiceUri'
-  ]);
-  html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.defaultValue]() {
-      return this.default;
-    }
-    get [dartx.lang]() {
-      return this.lang;
-    }
-    get [dartx.localService]() {
-      return this.localService;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.voiceUri]() {
-      return this.voiceURI;
-    }
-  };
-  dart.setSignature(html$.SpeechSynthesisVoice, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
-    fields: () => ({
-      [dartx.defaultValue]: core.bool,
-      [dartx.lang]: core.String,
-      [dartx.localService]: core.bool,
-      [dartx.name]: core.String,
-      [dartx.voiceUri]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
-  dart.defineExtensionNames([
-    'name'
-  ]);
-  html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-  };
-  dart.setSignature(html$.StashedMessagePort, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
-    fields: () => ({[dartx.name]: core.String})
-  });
-  dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
-  dart.defineExtensionNames([
-    'add',
-    'onMessage'
-  ]);
-  html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.add](...args) {
-      return this.add.apply(this, args);
-    }
-    get [dartx.onMessage]() {
-      return html$.StashedPortCollection.messageEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.StashedPortCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
-    getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
-    methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
-    sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
-  });
-  dart.defineLazy(html$.StashedPortCollection, {
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
-  const _getItem = Symbol('_getItem');
-  const _setItem = Symbol('_setItem');
-  const _removeItem = Symbol('_removeItem');
-  const _key = Symbol('_key');
-  const _length$3 = Symbol('_length');
-  const __delete__ = Symbol('__delete__');
-  dart.defineExtensionNames([
-    'addAll',
-    'containsValue',
-    'containsKey',
-    '_get',
-    '_set',
-    'putIfAbsent',
-    'remove',
-    'clear',
-    'forEach',
-    'keys',
-    'values',
-    'length',
-    'isEmpty',
-    'isNotEmpty'
-  ]);
-  html$.Storage = class Storage extends _interceptors.Interceptor {
-    [dartx.addAll](other) {
-      other[dartx.forEach](dart.fn((k, v) => {
-        this[dartx._set](k, v);
-      }, StringAndStringToNull()));
-    }
-    [dartx.containsValue](value) {
-      return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
-    }
-    [dartx.containsKey](key) {
-      return this[_getItem](core.String._check(key)) != null;
-    }
-    [dartx._get](key) {
-      return this[_getItem](core.String._check(key));
-    }
-    [dartx._set](key, value) {
-      this[_setItem](key, value);
-      return value;
-    }
-    [dartx.putIfAbsent](key, ifAbsent) {
-      if (!dart.test(this[dartx.containsKey](key))) this[dartx._set](key, ifAbsent());
-      return this[dartx._get](key);
-    }
-    [dartx.remove](key) {
-      let value = this[dartx._get](key);
-      this[_removeItem](core.String._check(key));
-      return value;
-    }
-    [dartx.clear]() {
-      return this[_clear$1]();
-    }
-    [dartx.forEach](f) {
-      for (let i = 0; true; i++) {
-        let key = this[_key](i);
-        if (key == null) return;
-        f(key, this[dartx._get](key));
-      }
-    }
-    get [dartx.keys]() {
-      let keys = JSArrayOfString().of([]);
-      this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
-      return keys;
-    }
-    get [dartx.values]() {
-      let values = JSArrayOfString().of([]);
-      this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
-      return values;
-    }
-    get [dartx.length]() {
-      return this[_length$3];
-    }
-    get [dartx.isEmpty]() {
-      return this[_key](0) == null;
-    }
-    get [dartx.isNotEmpty]() {
-      return !dart.test(this[dartx.isEmpty]);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [_length$3]() {
-      return this.length;
-    }
-    [__delete__](...args) {
-      return this.__delete__.apply(this, args);
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [__setter__](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [_clear$1](...args) {
-      return this.clear.apply(this, args);
-    }
-    [_getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [_key](...args) {
-      return this.key.apply(this, args);
-    }
-    [_removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [_setItem](...args) {
-      return this.setItem.apply(this, args);
-    }
-  };
-  html$.Storage[dart.implements] = () => [MapOfString$String()];
-  dart.setSignature(html$.Storage, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
-    fields: () => ({[_length$3]: core.int}),
-    getters: () => ({
-      [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      [dartx.length]: dart.definiteFunctionType(core.int, []),
-      [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      [dartx.addAll]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-      [dartx.containsValue]: dart.definiteFunctionType(core.bool, [core.Object]),
-      [dartx.containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
-      [dartx._get]: dart.definiteFunctionType(core.String, [core.Object]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.putIfAbsent]: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
-      [dartx.remove]: dart.definiteFunctionType(core.String, [core.Object]),
-      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-      [dartx.forEach]: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
-      [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-      [_clear$1]: dart.definiteFunctionType(dart.void, []),
-      [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
-      [_key]: dart.definiteFunctionType(core.String, [core.int]),
-      [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
-      [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
-    })
-  });
-  dart.registerExtension(dart.global.Storage, html$.Storage);
-  html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
-  const _initStorageEvent = Symbol('_initStorageEvent');
-  dart.defineExtensionNames([
-    'key',
-    'newValue',
-    'oldValue',
-    'storageArea',
-    'url'
-  ]);
-  html$.StorageEvent = class StorageEvent extends html$.Event {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
-      let key = opts && 'key' in opts ? opts.key : null;
-      let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
-      let newValue = opts && 'newValue' in opts ? opts.newValue : null;
-      let url = opts && 'url' in opts ? opts.url : null;
-      let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
-      let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
-      e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
-      return e;
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.StorageEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.StorageEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.StorageEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.StorageEvent(type);
-    }
-    get [dartx.key]() {
-      return this.key;
-    }
-    get [dartx.newValue]() {
-      return this.newValue;
-    }
-    get [dartx.oldValue]() {
-      return this.oldValue;
-    }
-    get [dartx.storageArea]() {
-      return this.storageArea;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-    [_initStorageEvent](...args) {
-      return this.initStorageEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.StorageEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
-      _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.key]: core.String,
-      [dartx.newValue]: core.String,
-      [dartx.oldValue]: core.String,
-      [dartx.storageArea]: html$.Storage,
-      [dartx.url]: core.String
-    }),
-    methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
-  dart.defineExtensionNames([
-    'quota',
-    'usage'
-  ]);
-  html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.quota]() {
-      return this.quota;
-    }
-    get [dartx.usage]() {
-      return this.usage;
-    }
-  };
-  dart.setSignature(html$.StorageInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
-    fields: () => ({
-      [dartx.quota]: core.int,
-      [dartx.usage]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
-  dart.defineExtensionNames([
-    'queryInfo',
-    'requestPersistentQuota',
-    'supportedTypes'
-  ]);
-  html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.supportedTypes]() {
-      return this.supportedTypes;
-    }
-    [dartx.queryInfo](...args) {
-      return this.queryInfo.apply(this, args);
-    }
-    [dartx.requestPersistentQuota](...args) {
-      return this.requestPersistentQuota.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.StorageQuota, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
-    fields: () => ({[dartx.supportedTypes]: ListOfString()}),
-    methods: () => ({
-      [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
-  html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
-  html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
-  html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
-  dart.defineExtensionNames([
-    'disabled',
-    'media',
-    'sheet',
-    'type'
-  ]);
-  html$.StyleElement = class StyleElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
-    }
-    created() {
-      this[dartx.disabled] = null;
-      this[dartx.media] = null;
-      this[dartx.sheet] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    set [dartx.media](value) {
-      this.media = value;
-    }
-    get [dartx.sheet]() {
-      return this.sheet;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.StyleElement, 'created');
-  dart.setSignature(html$.StyleElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.StyleElement, []),
-      new: dart.definiteFunctionType(html$.StyleElement, []),
-      created: dart.definiteFunctionType(html$.StyleElement, [])
-    }),
-    fields: () => ({
-      [dartx.disabled]: core.bool,
-      [dartx.media]: core.String,
-      [dartx.sheet]: html$.StyleSheet,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
-  dart.defineExtensionNames([
-    'matchMedium',
-    'type'
-  ]);
-  html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.matchMedium](...args) {
-      return this.matchMedium.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.StyleMedia, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
-    fields: () => ({[dartx.type]: core.String}),
-    methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
-  });
-  dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
-  dart.defineExtensionNames([
-    'registration'
-  ]);
-  html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, init) {
-      let init_1 = html_common.convertDartToNative_Dictionary(init);
-      return html$.SyncEvent._create_1(type, init_1);
-    }
-    static _create_1(type, init) {
-      return new self.SyncEvent(type, init);
-    }
-    get [dartx.registration]() {
-      return this.registration;
-    }
-  };
-  dart.setSignature(html$.SyncEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.SyncEvent, []),
-      new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
-    }),
-    fields: () => ({[dartx.registration]: html$.SyncRegistration}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
-  dart.defineExtensionNames([
-    'getRegistration',
-    'getRegistrations',
-    'permissionState',
-    'register'
-  ]);
-  html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getRegistration](...args) {
-      return this.getRegistration.apply(this, args);
-    }
-    [dartx.getRegistrations](...args) {
-      return this.getRegistrations.apply(this, args);
-    }
-    [dartx.permissionState](...args) {
-      return this.permissionState.apply(this, args);
-    }
-    [dartx.register](options) {
-      if (options === void 0) options = null;
-      if (options != null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options);
-        return this[_register_1](options_1);
-      }
-      return this[_register_2]();
-    }
-    [_register_1](...args) {
-      return this.register.apply(this, args);
-    }
-    [_register_2](...args) {
-      return this.register.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.SyncManager, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
-    methods: () => ({
-      [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
-      [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
-      [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
-      [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
-      [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [_register_2]: dart.definiteFunctionType(async.Future, [])
-    })
-  });
-  dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
-  dart.defineExtensionNames([
-    'unregister',
-    'tag'
-  ]);
-  html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.tag]() {
-      return this.tag;
-    }
-    [dartx.unregister](...args) {
-      return this.unregister.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.SyncRegistration, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
-    fields: () => ({[dartx.tag]: core.String}),
-    methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
-  });
-  dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
-  html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
-  dart.setSignature(html$.TableCaptionElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableCaptionElement, []),
-      new: dart.definiteFunctionType(html$.TableCaptionElement, []),
-      created: dart.definiteFunctionType(html$.TableCaptionElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
-  dart.defineExtensionNames([
-    'cellIndex',
-    'colSpan',
-    'headers',
-    'rowSpan'
-  ]);
-  html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
-    }
-    created() {
-      this[dartx.cellIndex] = null;
-      this[dartx.colSpan] = null;
-      this[dartx.headers] = null;
-      this[dartx.rowSpan] = null;
-      super.created();
-    }
-    get [dartx.cellIndex]() {
-      return this.cellIndex;
-    }
-    get [dartx.colSpan]() {
-      return this.colSpan;
-    }
-    set [dartx.colSpan](value) {
-      this.colSpan = value;
-    }
-    get [dartx.headers]() {
-      return this.headers;
-    }
-    set [dartx.headers](value) {
-      this.headers = value;
-    }
-    get [dartx.rowSpan]() {
-      return this.rowSpan;
-    }
-    set [dartx.rowSpan](value) {
-      this.rowSpan = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.TableCellElement, 'created');
-  dart.setSignature(html$.TableCellElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableCellElement, []),
-      new: dart.definiteFunctionType(html$.TableCellElement, []),
-      created: dart.definiteFunctionType(html$.TableCellElement, [])
-    }),
-    fields: () => ({
-      [dartx.cellIndex]: core.int,
-      [dartx.colSpan]: core.int,
-      [dartx.headers]: core.String,
-      [dartx.rowSpan]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
-  dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
-  dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
-  dart.defineExtensionNames([
-    'span'
-  ]);
-  html$.TableColElement = class TableColElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
-    }
-    created() {
-      this[dartx.span] = null;
-      super.created();
-    }
-    get [dartx.span]() {
-      return this.span;
-    }
-    set [dartx.span](value) {
-      this.span = value;
-    }
-  };
-  dart.defineNamedConstructor(html$.TableColElement, 'created');
-  dart.setSignature(html$.TableColElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableColElement, []),
-      new: dart.definiteFunctionType(html$.TableColElement, []),
-      created: dart.definiteFunctionType(html$.TableColElement, [])
-    }),
-    fields: () => ({[dartx.span]: core.int})
-  });
-  dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
-  const _tBodies = Symbol('_tBodies');
-  const _rows = Symbol('_rows');
-  const _createCaption = Symbol('_createCaption');
-  const _createTBody = Symbol('_createTBody');
-  const _createTFoot = Symbol('_createTFoot');
-  const _createTHead = Symbol('_createTHead');
-  const _insertRow = Symbol('_insertRow');
-  const _nativeCreateTBody = Symbol('_nativeCreateTBody');
-  dart.defineExtensionNames([
-    'tBodies',
-    'rows',
-    'addRow',
-    'createCaption',
-    'createTBody',
-    'createTFoot',
-    'createTHead',
-    'insertRow',
-    'createFragment',
-    'deleteCaption',
-    'deleteRow',
-    'deleteTFoot',
-    'deleteTHead',
-    'caption',
-    'tFoot',
-    'tHead'
-  ]);
-  html$.TableElement = class TableElement extends html$.HtmlElement {
-    get [dartx.tBodies]() {
-      return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
-    }
-    get [dartx.rows]() {
-      return new (_WrappedListOfTableRowElement())(this[_rows]);
-    }
-    [dartx.addRow]() {
-      return this[dartx.insertRow](-1);
-    }
-    [dartx.createCaption]() {
-      return html$.TableCaptionElement._check(this[_createCaption]());
-    }
-    [dartx.createTBody]() {
-      return this[_createTBody]();
-    }
-    [dartx.createTFoot]() {
-      return html$.TableSectionElement._check(this[_createTFoot]());
-    }
-    [dartx.createTHead]() {
-      return html$.TableSectionElement._check(this[_createTHead]());
-    }
-    [dartx.insertRow](index) {
-      return html$.TableRowElement._check(this[_insertRow](index));
-    }
-    [_createTBody]() {
-      if (!!this.createTBody) {
-        return this[_nativeCreateTBody]();
-      }
-      let tbody = html$.Element.tag('tbody');
-      this[dartx.children][dartx.add](tbody);
-      return html$.TableSectionElement._check(tbody);
-    }
-    [_nativeCreateTBody](...args) {
-      return this.createTBody.apply(this, args);
-    }
-    [dartx.createFragment](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
-        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-      }
-      let contextualHtml = dart.str`<table>${html}</table>`;
-      let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
-      let fragment = html$.DocumentFragment.new();
-      fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
-      return fragment;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TableElement._check(html$.document[dartx.createElement]("table"));
-    }
-    created() {
-      this[dartx.caption] = null;
-      this[_rows] = null;
-      this[_tBodies] = null;
-      this[dartx.tFoot] = null;
-      this[dartx.tHead] = null;
-      super.created();
-    }
-    get [dartx.caption]() {
-      return this.caption;
-    }
-    set [dartx.caption](value) {
-      this.caption = value;
-    }
-    get [_rows]() {
-      return this.rows;
-    }
-    get [_tBodies]() {
-      return this.tBodies;
-    }
-    get [dartx.tFoot]() {
-      return this.tFoot;
-    }
-    set [dartx.tFoot](value) {
-      this.tFoot = value;
-    }
-    get [dartx.tHead]() {
-      return this.tHead;
-    }
-    set [dartx.tHead](value) {
-      this.tHead = value;
-    }
-    [_createCaption](...args) {
-      return this.createCaption.apply(this, args);
-    }
-    [_createTFoot](...args) {
-      return this.createTFoot.apply(this, args);
-    }
-    [_createTHead](...args) {
-      return this.createTHead.apply(this, args);
-    }
-    [dartx.deleteCaption](...args) {
-      return this.deleteCaption.apply(this, args);
-    }
-    [dartx.deleteRow](...args) {
-      return this.deleteRow.apply(this, args);
-    }
-    [dartx.deleteTFoot](...args) {
-      return this.deleteTFoot.apply(this, args);
-    }
-    [dartx.deleteTHead](...args) {
-      return this.deleteTHead.apply(this, args);
-    }
-    [_insertRow](...args) {
-      return this.insertRow.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.TableElement, 'created');
-  dart.setSignature(html$.TableElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableElement, []),
-      new: dart.definiteFunctionType(html$.TableElement, []),
-      created: dart.definiteFunctionType(html$.TableElement, [])
-    }),
-    fields: () => ({
-      [dartx.caption]: html$.TableCaptionElement,
-      [_rows]: ListOfNode(),
-      [_tBodies]: ListOfNode(),
-      [dartx.tFoot]: html$.TableSectionElement,
-      [dartx.tHead]: html$.TableSectionElement
-    }),
-    getters: () => ({
-      [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
-      [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
-    }),
-    methods: () => ({
-      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
-      [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
-      [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
-      [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
-      [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
-      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
-      [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
-      [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
-      [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
-      [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
-      [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
-      [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
-      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
-      [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
-      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
-  const _cells = Symbol('_cells');
-  const _insertCell = Symbol('_insertCell');
-  dart.defineExtensionNames([
-    'cells',
-    'addCell',
-    'insertCell',
-    'createFragment',
-    'deleteCell',
-    'rowIndex',
-    'sectionRowIndex'
-  ]);
-  html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
-    get [dartx.cells]() {
-      return new (_WrappedListOfTableCellElement())(this[_cells]);
-    }
-    [dartx.addCell]() {
-      return this[dartx.insertCell](-1);
-    }
-    [dartx.insertCell](index) {
-      return html$.TableCellElement._check(this[_insertCell](index));
-    }
-    [dartx.createFragment](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
-        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-      }
-      let fragment = html$.DocumentFragment.new();
-      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
-      let row = section[dartx.nodes][dartx.single];
-      fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
-      return fragment;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
-    }
-    created() {
-      this[_cells] = null;
-      this[dartx.rowIndex] = null;
-      this[dartx.sectionRowIndex] = null;
-      super.created();
-    }
-    get [_cells]() {
-      return this.cells;
-    }
-    get [dartx.rowIndex]() {
-      return this.rowIndex;
-    }
-    get [dartx.sectionRowIndex]() {
-      return this.sectionRowIndex;
-    }
-    [dartx.deleteCell](...args) {
-      return this.deleteCell.apply(this, args);
-    }
-    [_insertCell](...args) {
-      return this.insertCell.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.TableRowElement, 'created');
-  dart.setSignature(html$.TableRowElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableRowElement, []),
-      new: dart.definiteFunctionType(html$.TableRowElement, []),
-      created: dart.definiteFunctionType(html$.TableRowElement, [])
-    }),
-    fields: () => ({
-      [_cells]: ListOfNode(),
-      [dartx.rowIndex]: core.int,
-      [dartx.sectionRowIndex]: core.int
-    }),
-    getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
-    methods: () => ({
-      [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
-      [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
-      [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
-  dart.defineExtensionNames([
-    'rows',
-    'addRow',
-    'insertRow',
-    'createFragment',
-    'deleteRow'
-  ]);
-  html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
-    get [dartx.rows]() {
-      return new (_WrappedListOfTableRowElement())(this[_rows]);
-    }
-    [dartx.addRow]() {
-      return this[dartx.insertRow](-1);
-    }
-    [dartx.insertRow](index) {
-      return html$.TableRowElement._check(this[_insertRow](index));
-    }
-    [dartx.createFragment](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (dart.test(html$.Range.supportsCreateContextualFragment)) {
-        return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-      }
-      let fragment = html$.DocumentFragment.new();
-      let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
-      fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
-      return fragment;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[_rows] = null;
-      super.created();
-    }
-    get [_rows]() {
-      return this.rows;
-    }
-    [dartx.deleteRow](...args) {
-      return this.deleteRow.apply(this, args);
-    }
-    [_insertRow](...args) {
-      return this.insertRow.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.TableSectionElement, 'created');
-  dart.setSignature(html$.TableSectionElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TableSectionElement, []),
-      created: dart.definiteFunctionType(html$.TableSectionElement, [])
-    }),
-    fields: () => ({[_rows]: ListOfNode()}),
-    getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
-    methods: () => ({
-      [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
-      [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
-      [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
-  dart.defineExtensionNames([
-    'setInnerHtml',
-    'content'
-  ]);
-  html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
-    }
-    created() {
-      this[dartx.content] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('template');
-    }
-    get [dartx.content]() {
-      return this.content;
-    }
-    [dartx.setInnerHtml](html, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      this[dartx.text] = null;
-      let fragment = this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-      this[dartx.content][dartx.append](fragment);
-    }
-  };
-  dart.defineNamedConstructor(html$.TemplateElement, 'created');
-  dart.setSignature(html$.TemplateElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TemplateElement, []),
-      new: dart.definiteFunctionType(html$.TemplateElement, []),
-      created: dart.definiteFunctionType(html$.TemplateElement, [])
-    }),
-    fields: () => ({[dartx.content]: html$.DocumentFragment}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
-  dart.defineExtensionNames([
-    'checkValidity',
-    'reportValidity',
-    'select',
-    'setCustomValidity',
-    'setRangeText',
-    'setSelectionRange',
-    'autocapitalize',
-    'autofocus',
-    'cols',
-    'defaultValue',
-    'dirName',
-    'disabled',
-    'form',
-    'inputMode',
-    'labels',
-    'maxLength',
-    'minLength',
-    'name',
-    'placeholder',
-    'readOnly',
-    'required',
-    'rows',
-    'selectionDirection',
-    'selectionEnd',
-    'selectionStart',
-    'textLength',
-    'type',
-    'validationMessage',
-    'validity',
-    'value',
-    'willValidate',
-    'wrap'
-  ]);
-  html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
-    }
-    created() {
-      this[dartx.autocapitalize] = null;
-      this[dartx.autofocus] = null;
-      this[dartx.cols] = null;
-      this[dartx.defaultValue] = null;
-      this[dartx.dirName] = null;
-      this[dartx.disabled] = null;
-      this[dartx.form] = null;
-      this[dartx.inputMode] = null;
-      this[dartx.labels] = null;
-      this[dartx.maxLength] = null;
-      this[dartx.minLength] = null;
-      this[dartx.name] = null;
-      this[dartx.placeholder] = null;
-      this[dartx.readOnly] = null;
-      this[dartx.required] = null;
-      this[dartx.rows] = null;
-      this[dartx.selectionDirection] = null;
-      this[dartx.selectionEnd] = null;
-      this[dartx.selectionStart] = null;
-      this[dartx.textLength] = null;
-      this[dartx.type] = null;
-      this[dartx.validationMessage] = null;
-      this[dartx.validity] = null;
-      this[dartx.value] = null;
-      this[dartx.willValidate] = null;
-      this[dartx.wrap] = null;
-      super.created();
-    }
-    get [dartx.autocapitalize]() {
-      return this.autocapitalize;
-    }
-    set [dartx.autocapitalize](value) {
-      this.autocapitalize = value;
-    }
-    get [dartx.autofocus]() {
-      return this.autofocus;
-    }
-    set [dartx.autofocus](value) {
-      this.autofocus = value;
-    }
-    get [dartx.cols]() {
-      return this.cols;
-    }
-    set [dartx.cols](value) {
-      this.cols = value;
-    }
-    get [dartx.defaultValue]() {
-      return this.defaultValue;
-    }
-    set [dartx.defaultValue](value) {
-      this.defaultValue = value;
-    }
-    get [dartx.dirName]() {
-      return this.dirName;
-    }
-    set [dartx.dirName](value) {
-      this.dirName = value;
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.form]() {
-      return this.form;
-    }
-    get [dartx.inputMode]() {
-      return this.inputMode;
-    }
-    set [dartx.inputMode](value) {
-      this.inputMode = value;
-    }
-    get [dartx.labels]() {
-      return this.labels;
-    }
-    get [dartx.maxLength]() {
-      return this.maxLength;
-    }
-    set [dartx.maxLength](value) {
-      this.maxLength = value;
-    }
-    get [dartx.minLength]() {
-      return this.minLength;
-    }
-    set [dartx.minLength](value) {
-      this.minLength = value;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.placeholder]() {
-      return this.placeholder;
-    }
-    set [dartx.placeholder](value) {
-      this.placeholder = value;
-    }
-    get [dartx.readOnly]() {
-      return this.readOnly;
-    }
-    set [dartx.readOnly](value) {
-      this.readOnly = value;
-    }
-    get [dartx.required]() {
-      return this.required;
-    }
-    set [dartx.required](value) {
-      this.required = value;
-    }
-    get [dartx.rows]() {
-      return this.rows;
-    }
-    set [dartx.rows](value) {
-      this.rows = value;
-    }
-    get [dartx.selectionDirection]() {
-      return this.selectionDirection;
-    }
-    set [dartx.selectionDirection](value) {
-      this.selectionDirection = value;
-    }
-    get [dartx.selectionEnd]() {
-      return this.selectionEnd;
-    }
-    set [dartx.selectionEnd](value) {
-      this.selectionEnd = value;
-    }
-    get [dartx.selectionStart]() {
-      return this.selectionStart;
-    }
-    set [dartx.selectionStart](value) {
-      this.selectionStart = value;
-    }
-    get [dartx.textLength]() {
-      return this.textLength;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.validationMessage]() {
-      return this.validationMessage;
-    }
-    get [dartx.validity]() {
-      return this.validity;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.willValidate]() {
-      return this.willValidate;
-    }
-    get [dartx.wrap]() {
-      return this.wrap;
-    }
-    set [dartx.wrap](value) {
-      this.wrap = value;
-    }
-    [dartx.checkValidity](...args) {
-      return this.checkValidity.apply(this, args);
-    }
-    [dartx.reportValidity](...args) {
-      return this.reportValidity.apply(this, args);
-    }
-    [dartx.select](...args) {
-      return this.select.apply(this, args);
-    }
-    [dartx.setCustomValidity](...args) {
-      return this.setCustomValidity.apply(this, args);
-    }
-    [dartx.setRangeText](...args) {
-      return this.setRangeText.apply(this, args);
-    }
-    [dartx.setSelectionRange](...args) {
-      return this.setSelectionRange.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.TextAreaElement, 'created');
-  dart.setSignature(html$.TextAreaElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TextAreaElement, []),
-      new: dart.definiteFunctionType(html$.TextAreaElement, []),
-      created: dart.definiteFunctionType(html$.TextAreaElement, [])
-    }),
-    fields: () => ({
-      [dartx.autocapitalize]: core.String,
-      [dartx.autofocus]: core.bool,
-      [dartx.cols]: core.int,
-      [dartx.defaultValue]: core.String,
-      [dartx.dirName]: core.String,
-      [dartx.disabled]: core.bool,
-      [dartx.form]: html$.FormElement,
-      [dartx.inputMode]: core.String,
-      [dartx.labels]: ListOfNode(),
-      [dartx.maxLength]: core.int,
-      [dartx.minLength]: core.int,
-      [dartx.name]: core.String,
-      [dartx.placeholder]: core.String,
-      [dartx.readOnly]: core.bool,
-      [dartx.required]: core.bool,
-      [dartx.rows]: core.int,
-      [dartx.selectionDirection]: core.String,
-      [dartx.selectionEnd]: core.int,
-      [dartx.selectionStart]: core.int,
-      [dartx.textLength]: core.int,
-      [dartx.type]: core.String,
-      [dartx.validationMessage]: core.String,
-      [dartx.validity]: html$.ValidityState,
-      [dartx.value]: core.String,
-      [dartx.willValidate]: core.bool,
-      [dartx.wrap]: core.String
-    }),
-    methods: () => ({
-      [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
-      [dartx.select]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
-      [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
-  const _initTextEvent = Symbol('_initTextEvent');
-  dart.defineExtensionNames([
-    'data'
-  ]);
-  html$.TextEvent = class TextEvent extends html$.UIEvent {
-    static new(type, opts) {
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
-      let view = opts && 'view' in opts ? opts.view : null;
-      let data = opts && 'data' in opts ? opts.data : null;
-      if (view == null) {
-        view = html$.window;
-      }
-      let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
-      e[_initTextEvent](type, canBubble, cancelable, view, data);
-      return e;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.data]() {
-      return this.data;
-    }
-    [_initTextEvent](...args) {
-      return this.initTextEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.TextEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
-      _: dart.definiteFunctionType(html$.TextEvent, [])
-    }),
-    fields: () => ({[dartx.data]: core.String}),
-    methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
-  });
-  dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
-  dart.defineExtensionNames([
-    'actualBoundingBoxAscent',
-    'actualBoundingBoxDescent',
-    'actualBoundingBoxLeft',
-    'actualBoundingBoxRight',
-    'alphabeticBaseline',
-    'emHeightAscent',
-    'emHeightDescent',
-    'fontBoundingBoxAscent',
-    'fontBoundingBoxDescent',
-    'hangingBaseline',
-    'ideographicBaseline',
-    'width'
-  ]);
-  html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.actualBoundingBoxAscent]() {
-      return this.actualBoundingBoxAscent;
-    }
-    get [dartx.actualBoundingBoxDescent]() {
-      return this.actualBoundingBoxDescent;
-    }
-    get [dartx.actualBoundingBoxLeft]() {
-      return this.actualBoundingBoxLeft;
-    }
-    get [dartx.actualBoundingBoxRight]() {
-      return this.actualBoundingBoxRight;
-    }
-    get [dartx.alphabeticBaseline]() {
-      return this.alphabeticBaseline;
-    }
-    get [dartx.emHeightAscent]() {
-      return this.emHeightAscent;
-    }
-    get [dartx.emHeightDescent]() {
-      return this.emHeightDescent;
-    }
-    get [dartx.fontBoundingBoxAscent]() {
-      return this.fontBoundingBoxAscent;
-    }
-    get [dartx.fontBoundingBoxDescent]() {
-      return this.fontBoundingBoxDescent;
-    }
-    get [dartx.hangingBaseline]() {
-      return this.hangingBaseline;
-    }
-    get [dartx.ideographicBaseline]() {
-      return this.ideographicBaseline;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  dart.setSignature(html$.TextMetrics, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
-    fields: () => ({
-      [dartx.actualBoundingBoxAscent]: core.double,
-      [dartx.actualBoundingBoxDescent]: core.double,
-      [dartx.actualBoundingBoxLeft]: core.double,
-      [dartx.actualBoundingBoxRight]: core.double,
-      [dartx.alphabeticBaseline]: core.double,
-      [dartx.emHeightAscent]: core.double,
-      [dartx.emHeightDescent]: core.double,
-      [dartx.fontBoundingBoxAscent]: core.double,
-      [dartx.fontBoundingBoxDescent]: core.double,
-      [dartx.hangingBaseline]: core.double,
-      [dartx.ideographicBaseline]: core.double,
-      [dartx.width]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
-  dart.defineExtensionNames([
-    'addCue',
-    'addRegion',
-    'removeCue',
-    'removeRegion',
-    'onCueChange',
-    'activeCues',
-    'cues',
-    'id',
-    'kind',
-    'label',
-    'language',
-    'mode',
-    'regions'
-  ]);
-  html$.TextTrack = class TextTrack extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.activeCues]() {
-      return this.activeCues;
-    }
-    get [dartx.cues]() {
-      return this.cues;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.language]() {
-      return this.language;
-    }
-    get [dartx.mode]() {
-      return this.mode;
-    }
-    set [dartx.mode](value) {
-      this.mode = value;
-    }
-    get [dartx.regions]() {
-      return this.regions;
-    }
-    [dartx.addCue](...args) {
-      return this.addCue.apply(this, args);
-    }
-    [dartx.addRegion](...args) {
-      return this.addRegion.apply(this, args);
-    }
-    [dartx.removeCue](...args) {
-      return this.removeCue.apply(this, args);
-    }
-    [dartx.removeRegion](...args) {
-      return this.removeRegion.apply(this, args);
-    }
-    get [dartx.onCueChange]() {
-      return html$.TextTrack.cueChangeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.TextTrack, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
-    fields: () => ({
-      [dartx.activeCues]: html$.TextTrackCueList,
-      [dartx.cues]: html$.TextTrackCueList,
-      [dartx.id]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String,
-      [dartx.language]: core.String,
-      [dartx.mode]: core.String,
-      [dartx.regions]: html$.VttRegionList
-    }),
-    getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
-      [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
-      [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
-      [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
-    }),
-    sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.TextTrack, {
-    get cueChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
-    }
-  });
-  dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
-  dart.defineExtensionNames([
-    'onEnter',
-    'onExit',
-    'endTime',
-    'id',
-    'pauseOnExit',
-    'startTime',
-    'track'
-  ]);
-  html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.endTime]() {
-      return this.endTime;
-    }
-    set [dartx.endTime](value) {
-      this.endTime = value;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    set [dartx.id](value) {
-      this.id = value;
-    }
-    get [dartx.pauseOnExit]() {
-      return this.pauseOnExit;
-    }
-    set [dartx.pauseOnExit](value) {
-      this.pauseOnExit = value;
-    }
-    get [dartx.startTime]() {
-      return this.startTime;
-    }
-    set [dartx.startTime](value) {
-      this.startTime = value;
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-    get [dartx.onEnter]() {
-      return html$.TextTrackCue.enterEvent.forTarget(this);
-    }
-    get [dartx.onExit]() {
-      return html$.TextTrackCue.exitEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.TextTrackCue, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
-    fields: () => ({
-      [dartx.endTime]: core.num,
-      [dartx.id]: core.String,
-      [dartx.pauseOnExit]: core.bool,
-      [dartx.startTime]: core.num,
-      [dartx.track]: html$.TextTrack
-    }),
-    getters: () => ({
-      [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    sfields: () => ({
-      enterEvent: EventStreamProviderOfEvent(),
-      exitEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(html$.TextTrackCue, {
-    get enterEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('enter'));
-    },
-    get exitEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('exit'));
-    }
-  });
-  dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'getCueById',
-    'item'
-  ]);
-  html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.getCueById](...args) {
-      return this.getCueById.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
-  dart.setSignature(html$.TextTrackCueList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
-      [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'getTrackById',
-    'item',
-    'onAddTrack',
-    'onChange'
-  ]);
-  html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.getTrackById](...args) {
-      return this.getTrackById.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    get [dartx.onAddTrack]() {
-      return html$.TextTrackList.addTrackEvent.forTarget(this);
-    }
-    get [dartx.onChange]() {
-      return html$.TextTrackList.changeEvent.forTarget(this);
-    }
-  };
-  html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
-  dart.setSignature(html$.TextTrackList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
-    getters: () => ({
-      [dartx.length]: dart.definiteFunctionType(core.int, []),
-      [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
-      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
-      [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
-    }),
-    sfields: () => ({
-      addTrackEvent: EventStreamProviderOfTrackEvent(),
-      changeEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(html$.TextTrackList, {
-    get addTrackEvent() {
-      return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
-    },
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
-  dart.defineExtensionNames([
-    'end',
-    'start',
-    'length'
-  ]);
-  html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.end](...args) {
-      return this.end.apply(this, args);
-    }
-    [dartx.start](...args) {
-      return this.start.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.TimeRanges, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
-    fields: () => ({[dartx.length]: core.int}),
-    methods: () => ({
-      [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
-      [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
-  html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
-  html$.TitleElement = class TitleElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.TitleElement, 'created');
-  dart.setSignature(html$.TitleElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TitleElement, []),
-      new: dart.definiteFunctionType(html$.TitleElement, []),
-      created: dart.definiteFunctionType(html$.TitleElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
-  const _radiusX = Symbol('_radiusX');
-  const _radiusY = Symbol('_radiusY');
-  const __clientX = Symbol('__clientX');
-  const __clientY = Symbol('__clientY');
-  const __screenX = Symbol('__screenX');
-  const __screenY = Symbol('__screenY');
-  const __pageX = Symbol('__pageX');
-  const __pageY = Symbol('__pageY');
-  const __radiusX = Symbol('__radiusX');
-  const __radiusY = Symbol('__radiusY');
-  dart.defineExtensionNames([
-    'target',
-    'client',
-    'page',
-    'screen',
-    'radiusX',
-    'radiusY',
-    'force',
-    'identifier',
-    'rotationAngle'
-  ]);
-  html$.Touch = class Touch extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [_clientX]() {
-      return this.clientX;
-    }
-    get [_clientY]() {
-      return this.clientY;
-    }
-    get [dartx.force]() {
-      return this.force;
-    }
-    get [dartx.identifier]() {
-      return this.identifier;
-    }
-    get [_pageX]() {
-      return this.pageX;
-    }
-    get [_pageY]() {
-      return this.pageY;
-    }
-    get [_radiusX]() {
-      return this.radiusX;
-    }
-    get [_radiusY]() {
-      return this.radiusY;
-    }
-    get [dartx.rotationAngle]() {
-      return this.rotationAngle;
-    }
-    get [_screenX]() {
-      return this.screenX;
-    }
-    get [_screenY]() {
-      return this.screenY;
-    }
-    get [dartx.target]() {
-      return html$._convertNativeToDart_EventTarget(this[_get_target]);
-    }
-    get [_get_target]() {
-      return this.target;
-    }
-    get [__clientX]() {
-      return this.clientX[dartx.round]();
-    }
-    get [__clientY]() {
-      return this.clientY[dartx.round]();
-    }
-    get [__screenX]() {
-      return this.screenX[dartx.round]();
-    }
-    get [__screenY]() {
-      return this.screenY[dartx.round]();
-    }
-    get [__pageX]() {
-      return this.pageX[dartx.round]();
-    }
-    get [__pageY]() {
-      return this.pageY[dartx.round]();
-    }
-    get [__radiusX]() {
-      return this.radiusX[dartx.round]();
-    }
-    get [__radiusY]() {
-      return this.radiusY[dartx.round]();
-    }
-    get [dartx.client]() {
-      return new (PointOfnum())(this[__clientX], this[__clientY]);
-    }
-    get [dartx.page]() {
-      return new (PointOfnum())(this[__pageX], this[__pageY]);
-    }
-    get [dartx.screen]() {
-      return new (PointOfnum())(this[__screenX], this[__screenY]);
-    }
-    get [dartx.radiusX]() {
-      return this[__radiusX];
-    }
-    get [dartx.radiusY]() {
-      return this[__radiusY];
-    }
-  };
-  dart.setSignature(html$.Touch, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
-    fields: () => ({
-      [_clientX]: core.double,
-      [_clientY]: core.double,
-      [dartx.force]: core.double,
-      [dartx.identifier]: core.int,
-      [_pageX]: core.double,
-      [_pageY]: core.double,
-      [_radiusX]: core.double,
-      [_radiusY]: core.double,
-      [dartx.rotationAngle]: core.double,
-      [_screenX]: core.double,
-      [_screenY]: core.double,
-      [_get_target]: dart.dynamic
-    }),
-    getters: () => ({
-      [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
-      [__clientX]: dart.definiteFunctionType(core.int, []),
-      [__clientY]: dart.definiteFunctionType(core.int, []),
-      [__screenX]: dart.definiteFunctionType(core.int, []),
-      [__screenY]: dart.definiteFunctionType(core.int, []),
-      [__pageX]: dart.definiteFunctionType(core.int, []),
-      [__pageY]: dart.definiteFunctionType(core.int, []),
-      [__radiusX]: dart.definiteFunctionType(core.int, []),
-      [__radiusY]: dart.definiteFunctionType(core.int, []),
-      [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.radiusX]: dart.definiteFunctionType(core.int, []),
-      [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
-    })
-  });
-  dart.registerExtension(dart.global.Touch, html$.Touch);
-  const _initTouchEvent = Symbol('_initTouchEvent');
-  dart.defineExtensionNames([
-    'altKey',
-    'changedTouches',
-    'ctrlKey',
-    'metaKey',
-    'shiftKey',
-    'targetTouches',
-    'touches'
-  ]);
-  html$.TouchEvent = class TouchEvent extends html$.UIEvent {
-    static new(touches, targetTouches, changedTouches, type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
-      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
-      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
-      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
-      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
-      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
-      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
-      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
-      if (view == null) {
-        view = html$.window;
-      }
-      let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
-      e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
-      return e;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.altKey]() {
-      return this.altKey;
-    }
-    get [dartx.changedTouches]() {
-      return this.changedTouches;
-    }
-    get [dartx.ctrlKey]() {
-      return this.ctrlKey;
-    }
-    get [dartx.metaKey]() {
-      return this.metaKey;
-    }
-    get [dartx.shiftKey]() {
-      return this.shiftKey;
-    }
-    get [dartx.targetTouches]() {
-      return this.targetTouches;
-    }
-    get [dartx.touches]() {
-      return this.touches;
-    }
-    [_initTouchEvent](...args) {
-      return this.initTouchEvent.apply(this, args);
-    }
-    static get supported() {
-      return html_common.Device.isEventTypeSupported('TouchEvent');
-    }
-  };
-  dart.setSignature(html$.TouchEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
-      _: dart.definiteFunctionType(html$.TouchEvent, [])
-    }),
-    fields: () => ({
-      [dartx.altKey]: core.bool,
-      [dartx.changedTouches]: html$.TouchList,
-      [dartx.ctrlKey]: core.bool,
-      [dartx.metaKey]: core.bool,
-      [dartx.shiftKey]: core.bool,
-      [dartx.targetTouches]: html$.TouchList,
-      [dartx.touches]: html$.TouchList
-    }),
-    methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
-    static new() {
-      return null;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!document.createTouchList;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
-  dart.setSignature(html$.TouchList, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.TouchList, []),
-      _: dart.definiteFunctionType(html$.TouchList, [])
-    }),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
-      [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.TouchList, html$.TouchList);
-  dart.defineExtensionNames([
-    'byteStreamTrackID',
-    'kinds',
-    'label',
-    'language',
-    'type'
-  ]);
-  html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, language, label, kinds, byteStreamTrackID) {
-      if (byteStreamTrackID === void 0) byteStreamTrackID = null;
-      if (byteStreamTrackID != null) {
-        let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
-        return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
-      }
-      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
-      return html$.TrackDefault._create_2(type, language, label, kinds_1);
-    }
-    static _create_1(type, language, label, kinds, byteStreamTrackID) {
-      return new self.TrackDefault(type, language, label, kinds, byteStreamTrackID);
-    }
-    static _create_2(type, language, label, kinds) {
-      return new self.TrackDefault(type, language, label, kinds);
-    }
-    get [dartx.byteStreamTrackID]() {
-      return this.byteStreamTrackID;
-    }
-    get [dartx.kinds]() {
-      return this.kinds;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.language]() {
-      return this.language;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(html$.TrackDefault, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TrackDefault, []),
-      new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
-    }),
-    fields: () => ({
-      [dartx.byteStreamTrackID]: core.String,
-      [dartx.kinds]: ListOfString(),
-      [dartx.label]: core.String,
-      [dartx.language]: core.String,
-      [dartx.type]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
-  dart.defineExtensionNames([
-    'item',
-    'length'
-  ]);
-  html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(trackDefaults) {
-      if (trackDefaults === void 0) trackDefaults = null;
-      if (trackDefaults != null) {
-        return html$.TrackDefaultList._create_1(trackDefaults);
-      }
-      return html$.TrackDefaultList._create_2();
-    }
-    static _create_1(trackDefaults) {
-      return new self.TrackDefaultList(trackDefaults);
-    }
-    static _create_2() {
-      return new self.TrackDefaultList();
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.TrackDefaultList, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TrackDefaultList, []),
-      new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
-    }),
-    fields: () => ({[dartx.length]: core.int}),
-    methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
-  dart.defineExtensionNames([
-    'defaultValue',
-    'kind',
-    'label',
-    'readyState',
-    'src',
-    'srclang',
-    'track'
-  ]);
-  html$.TrackElement = class TrackElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
-    }
-    created() {
-      this[dartx.defaultValue] = null;
-      this[dartx.kind] = null;
-      this[dartx.label] = null;
-      this[dartx.readyState] = null;
-      this[dartx.src] = null;
-      this[dartx.srclang] = null;
-      this[dartx.track] = null;
-      super.created();
-    }
-    static get supported() {
-      return html$.Element.isTagSupported('track');
-    }
-    get [dartx.defaultValue]() {
-      return this.default;
-    }
-    set [dartx.defaultValue](value) {
-      this.default = value;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    set [dartx.kind](value) {
-      this.kind = value;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    set [dartx.label](value) {
-      this.label = value;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.src]() {
-      return this.src;
-    }
-    set [dartx.src](value) {
-      this.src = value;
-    }
-    get [dartx.srclang]() {
-      return this.srclang;
-    }
-    set [dartx.srclang](value) {
-      this.srclang = value;
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-  };
-  dart.defineNamedConstructor(html$.TrackElement, 'created');
-  dart.setSignature(html$.TrackElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TrackElement, []),
-      new: dart.definiteFunctionType(html$.TrackElement, []),
-      created: dart.definiteFunctionType(html$.TrackElement, [])
-    }),
-    fields: () => ({
-      [dartx.defaultValue]: core.bool,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String,
-      [dartx.readyState]: core.int,
-      [dartx.src]: core.String,
-      [dartx.srclang]: core.String,
-      [dartx.track]: html$.TextTrack
-    }),
-    sfields: () => ({
-      ERROR: core.int,
-      LOADED: core.int,
-      LOADING: core.int,
-      NONE: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  html$.TrackElement.ERROR = 3;
-  html$.TrackElement.LOADED = 2;
-  html$.TrackElement.LOADING = 1;
-  html$.TrackElement.NONE = 0;
-  dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
-  dart.defineExtensionNames([
-    'track'
-  ]);
-  html$.TrackEvent = class TrackEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.TrackEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.TrackEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.TrackEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.TrackEvent(type);
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-  };
-  dart.setSignature(html$.TrackEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TrackEvent, []),
-      new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({[dartx.track]: core.Object}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
-  dart.defineExtensionNames([
-    'elapsedTime',
-    'propertyName',
-    'pseudoElement'
-  ]);
-  html$.TransitionEvent = class TransitionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.TransitionEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.TransitionEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.TransitionEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.TransitionEvent(type);
-    }
-    get [dartx.elapsedTime]() {
-      return this.elapsedTime;
-    }
-    get [dartx.propertyName]() {
-      return this.propertyName;
-    }
-    get [dartx.pseudoElement]() {
-      return this.pseudoElement;
-    }
-  };
-  dart.setSignature(html$.TransitionEvent, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.TransitionEvent, []),
-      new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.elapsedTime]: core.double,
-      [dartx.propertyName]: core.String,
-      [dartx.pseudoElement]: core.String
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
-  dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
-  dart.defineExtensionNames([
-    'firstChild',
-    'lastChild',
-    'nextNode',
-    'nextSibling',
-    'parentNode',
-    'previousNode',
-    'previousSibling',
-    'currentNode',
-    'filter',
-    'root',
-    'whatToShow'
-  ]);
-  html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
-    static new(root, whatToShow) {
-      return html$.document[_createTreeWalker](root, whatToShow, null);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.currentNode]() {
-      return this.currentNode;
-    }
-    set [dartx.currentNode](value) {
-      this.currentNode = value;
-    }
-    get [dartx.filter]() {
-      return this.filter;
-    }
-    get [dartx.root]() {
-      return this.root;
-    }
-    get [dartx.whatToShow]() {
-      return this.whatToShow;
-    }
-    [dartx.firstChild](...args) {
-      return this.firstChild.apply(this, args);
-    }
-    [dartx.lastChild](...args) {
-      return this.lastChild.apply(this, args);
-    }
-    [dartx.nextNode](...args) {
-      return this.nextNode.apply(this, args);
-    }
-    [dartx.nextSibling](...args) {
-      return this.nextSibling.apply(this, args);
-    }
-    [dartx.parentNode](...args) {
-      return this.parentNode.apply(this, args);
-    }
-    [dartx.previousNode](...args) {
-      return this.previousNode.apply(this, args);
-    }
-    [dartx.previousSibling](...args) {
-      return this.previousSibling.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.TreeWalker, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
-      _: dart.definiteFunctionType(html$.TreeWalker, [])
-    }),
-    fields: () => ({
-      [dartx.currentNode]: html$.Node,
-      [dartx.filter]: html$.NodeFilter,
-      [dartx.root]: html$.Node,
-      [dartx.whatToShow]: core.int
-    }),
-    methods: () => ({
-      [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
-    })
-  });
-  dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
-  html$.UListElement = class UListElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.UListElement, 'created');
-  dart.setSignature(html$.UListElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.UListElement, []),
-      new: dart.definiteFunctionType(html$.UListElement, []),
-      created: dart.definiteFunctionType(html$.UListElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
-  html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$.UnknownElement, 'created');
-  dart.setSignature(html$.UnknownElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.UnknownElement, []),
-      created: dart.definiteFunctionType(html$.UnknownElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
-  dart.defineExtensionNames([
-    'toString',
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'password',
-    'pathname',
-    'port',
-    'protocol',
-    'search',
-    'username'
-  ]);
-  html$.Url = class Url extends _interceptors.Interceptor {
-    static createObjectUrl(blob_OR_source_OR_stream) {
-      return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
-    }
-    static createObjectUrlFromSource(source) {
-      return (self.URL || self.webkitURL).createObjectURL(source);
-    }
-    static createObjectUrlFromStream(stream) {
-      return (self.URL || self.webkitURL).createObjectURL(stream);
-    }
-    static createObjectUrlFromBlob(blob) {
-      return (self.URL || self.webkitURL).createObjectURL(blob);
-    }
-    static revokeObjectUrl(url) {
-      return (self.URL || self.webkitURL).revokeObjectURL(url);
-    }
-    [dartx.toString]() {
-      return String(this);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.hash]() {
-      return this.hash;
-    }
-    set [dartx.hash](value) {
-      this.hash = value;
-    }
-    get [dartx.host]() {
-      return this.host;
-    }
-    set [dartx.host](value) {
-      this.host = value;
-    }
-    get [dartx.hostname]() {
-      return this.hostname;
-    }
-    set [dartx.hostname](value) {
-      this.hostname = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-    set [dartx.href](value) {
-      this.href = value;
-    }
-    get [dartx.origin]() {
-      return this.origin;
-    }
-    get [dartx.password]() {
-      return this.password;
-    }
-    set [dartx.password](value) {
-      this.password = value;
-    }
-    get [dartx.pathname]() {
-      return this.pathname;
-    }
-    set [dartx.pathname](value) {
-      this.pathname = value;
-    }
-    get [dartx.port]() {
-      return this.port;
-    }
-    set [dartx.port](value) {
-      this.port = value;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    set [dartx.protocol](value) {
-      this.protocol = value;
-    }
-    get [dartx.search]() {
-      return this.search;
-    }
-    set [dartx.search](value) {
-      this.search = value;
-    }
-    get [dartx.username]() {
-      return this.username;
-    }
-    set [dartx.username](value) {
-      this.username = value;
-    }
-  };
-  html$.Url[dart.implements] = () => [html$.UrlUtils];
-  dart.setSignature(html$.Url, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
-    fields: () => ({
-      [dartx.hash]: core.String,
-      [dartx.host]: core.String,
-      [dartx.hostname]: core.String,
-      [dartx.href]: core.String,
-      [dartx.origin]: core.String,
-      [dartx.password]: core.String,
-      [dartx.pathname]: core.String,
-      [dartx.port]: core.String,
-      [dartx.protocol]: core.String,
-      [dartx.search]: core.String,
-      [dartx.username]: core.String
-    }),
-    statics: () => ({
-      createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
-      createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
-      createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
-      createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
-      revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
-    }),
-    names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
-  });
-  dart.registerExtension(dart.global.URL, html$.Url);
-  dart.defineExtensionNames([
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'password',
-    'pathname',
-    'port',
-    'protocol',
-    'search',
-    'username'
-  ]);
-  html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get hash() {
-      return this[hash];
-    }
-    set hash(value) {
-      this[hash] = value;
-    }
-    get host() {
-      return this[host];
-    }
-    set host(value) {
-      this[host] = value;
-    }
-    get hostname() {
-      return this[hostname];
-    }
-    set hostname(value) {
-      this[hostname] = value;
-    }
-    get href() {
-      return this[href];
-    }
-    set href(value) {
-      this[href] = value;
-    }
-    get origin() {
-      return this[origin];
-    }
-    set origin(value) {
-      super.origin = value;
-    }
-    get password() {
-      return this[password];
-    }
-    set password(value) {
-      this[password] = value;
-    }
-    get pathname() {
-      return this[pathname];
-    }
-    set pathname(value) {
-      this[pathname] = value;
-    }
-    get port() {
-      return this[port];
-    }
-    set port(value) {
-      this[port] = value;
-    }
-    get protocol() {
-      return this[protocol];
-    }
-    set protocol(value) {
-      this[protocol] = value;
-    }
-    get search() {
-      return this[search];
-    }
-    set search(value) {
-      this[search] = value;
-    }
-    get username() {
-      return this[username];
-    }
-    set username(value) {
-      this[username] = value;
-    }
-  };
-  const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
-  const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
-  const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
-  const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
-  const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
-  const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
-  const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
-  const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
-  const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
-  const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
-  const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
-  dart.setSignature(html$.UrlUtils, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
-    fields: () => ({
-      hash: core.String,
-      host: core.String,
-      hostname: core.String,
-      href: core.String,
-      origin: core.String,
-      password: core.String,
-      pathname: core.String,
-      port: core.String,
-      protocol: core.String,
-      search: core.String,
-      username: core.String
-    })
-  });
-  dart.defineExtensionMembers(html$.UrlUtils, [
-    'hash',
-    'hash',
-    'host',
-    'host',
-    'hostname',
-    'hostname',
-    'href',
-    'href',
-    'origin',
-    'password',
-    'password',
-    'pathname',
-    'pathname',
-    'port',
-    'port',
-    'protocol',
-    'protocol',
-    'search',
-    'search',
-    'username',
-    'username'
-  ]);
-  dart.defineExtensionNames([
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'pathname',
-    'port',
-    'protocol',
-    'search'
-  ]);
-  html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get hash() {
-      return this[hash$];
-    }
-    set hash(value) {
-      super.hash = value;
-    }
-    get host() {
-      return this[host$];
-    }
-    set host(value) {
-      super.host = value;
-    }
-    get hostname() {
-      return this[hostname$];
-    }
-    set hostname(value) {
-      super.hostname = value;
-    }
-    get href() {
-      return this[href$];
-    }
-    set href(value) {
-      super.href = value;
-    }
-    get origin() {
-      return this[origin$];
-    }
-    set origin(value) {
-      super.origin = value;
-    }
-    get pathname() {
-      return this[pathname$];
-    }
-    set pathname(value) {
-      super.pathname = value;
-    }
-    get port() {
-      return this[port$];
-    }
-    set port(value) {
-      super.port = value;
-    }
-    get protocol() {
-      return this[protocol$];
-    }
-    set protocol(value) {
-      super.protocol = value;
-    }
-    get search() {
-      return this[search$];
-    }
-    set search(value) {
-      super.search = value;
-    }
-  };
-  const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
-  const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
-  const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
-  const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
-  const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
-  const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
-  const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
-  const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
-  const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
-  dart.setSignature(html$.UrlUtilsReadOnly, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
-    fields: () => ({
-      hash: core.String,
-      host: core.String,
-      hostname: core.String,
-      href: core.String,
-      origin: core.String,
-      pathname: core.String,
-      port: core.String,
-      protocol: core.String,
-      search: core.String
-    })
-  });
-  dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
-    'hash',
-    'host',
-    'hostname',
-    'href',
-    'origin',
-    'pathname',
-    'port',
-    'protocol',
-    'search'
-  ]);
-  dart.defineExtensionNames([
-    'currentFieldOfView',
-    'eyeTranslation',
-    'maximumFieldOfView',
-    'minimumFieldOfView',
-    'recommendedFieldOfView',
-    'renderRect'
-  ]);
-  html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.currentFieldOfView]() {
-      return this.currentFieldOfView;
-    }
-    get [dartx.eyeTranslation]() {
-      return this.eyeTranslation;
-    }
-    get [dartx.maximumFieldOfView]() {
-      return this.maximumFieldOfView;
-    }
-    get [dartx.minimumFieldOfView]() {
-      return this.minimumFieldOfView;
-    }
-    get [dartx.recommendedFieldOfView]() {
-      return this.recommendedFieldOfView;
-    }
-    get [dartx.renderRect]() {
-      return this.renderRect;
-    }
-  };
-  dart.setSignature(html$.VREyeParameters, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
-    fields: () => ({
-      [dartx.currentFieldOfView]: html$.VRFieldOfView,
-      [dartx.eyeTranslation]: html$.DomPoint,
-      [dartx.maximumFieldOfView]: html$.VRFieldOfView,
-      [dartx.minimumFieldOfView]: html$.VRFieldOfView,
-      [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
-      [dartx.renderRect]: html$._DomRect
-    })
-  });
-  dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
-  dart.defineExtensionNames([
-    'downDegrees',
-    'leftDegrees',
-    'rightDegrees',
-    'upDegrees'
-  ]);
-  html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(fov) {
-      if (fov === void 0) fov = null;
-      if (fov != null) {
-        let fov_1 = html_common.convertDartToNative_Dictionary(fov);
-        return html$.VRFieldOfView._create_1(fov_1);
-      }
-      return html$.VRFieldOfView._create_2();
-    }
-    static _create_1(fov) {
-      return new self.VRFieldOfView(fov);
-    }
-    static _create_2() {
-      return new self.VRFieldOfView();
-    }
-    get [dartx.downDegrees]() {
-      return this.downDegrees;
-    }
-    set [dartx.downDegrees](value) {
-      this.downDegrees = value;
-    }
-    get [dartx.leftDegrees]() {
-      return this.leftDegrees;
-    }
-    set [dartx.leftDegrees](value) {
-      this.leftDegrees = value;
-    }
-    get [dartx.rightDegrees]() {
-      return this.rightDegrees;
-    }
-    set [dartx.rightDegrees](value) {
-      this.rightDegrees = value;
-    }
-    get [dartx.upDegrees]() {
-      return this.upDegrees;
-    }
-    set [dartx.upDegrees](value) {
-      this.upDegrees = value;
-    }
-  };
-  dart.setSignature(html$.VRFieldOfView, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.VRFieldOfView, []),
-      new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.downDegrees]: core.num,
-      [dartx.leftDegrees]: core.num,
-      [dartx.rightDegrees]: core.num,
-      [dartx.upDegrees]: core.num
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
-  dart.defineExtensionNames([
-    'angularAcceleration',
-    'angularVelocity',
-    'linearAcceleration',
-    'linearVelocity',
-    'orientation',
-    'position',
-    'timeStamp'
-  ]);
-  html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.angularAcceleration]() {
-      return this.angularAcceleration;
-    }
-    get [dartx.angularVelocity]() {
-      return this.angularVelocity;
-    }
-    get [dartx.linearAcceleration]() {
-      return this.linearAcceleration;
-    }
-    get [dartx.linearVelocity]() {
-      return this.linearVelocity;
-    }
-    get [dartx.orientation]() {
-      return this.orientation;
-    }
-    get [dartx.position]() {
-      return this.position;
-    }
-    get [dartx.timeStamp]() {
-      return this.timeStamp;
-    }
-  };
-  dart.setSignature(html$.VRPositionState, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
-    fields: () => ({
-      [dartx.angularAcceleration]: html$.DomPoint,
-      [dartx.angularVelocity]: html$.DomPoint,
-      [dartx.linearAcceleration]: html$.DomPoint,
-      [dartx.linearVelocity]: html$.DomPoint,
-      [dartx.orientation]: html$.DomPoint,
-      [dartx.position]: html$.DomPoint,
-      [dartx.timeStamp]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
-  dart.defineExtensionNames([
-    'badInput',
-    'customError',
-    'patternMismatch',
-    'rangeOverflow',
-    'rangeUnderflow',
-    'stepMismatch',
-    'tooLong',
-    'tooShort',
-    'typeMismatch',
-    'valid',
-    'valueMissing'
-  ]);
-  html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.badInput]() {
-      return this.badInput;
-    }
-    get [dartx.customError]() {
-      return this.customError;
-    }
-    get [dartx.patternMismatch]() {
-      return this.patternMismatch;
-    }
-    get [dartx.rangeOverflow]() {
-      return this.rangeOverflow;
-    }
-    get [dartx.rangeUnderflow]() {
-      return this.rangeUnderflow;
-    }
-    get [dartx.stepMismatch]() {
-      return this.stepMismatch;
-    }
-    get [dartx.tooLong]() {
-      return this.tooLong;
-    }
-    get [dartx.tooShort]() {
-      return this.tooShort;
-    }
-    get [dartx.typeMismatch]() {
-      return this.typeMismatch;
-    }
-    get [dartx.valid]() {
-      return this.valid;
-    }
-    get [dartx.valueMissing]() {
-      return this.valueMissing;
-    }
-  };
-  dart.setSignature(html$.ValidityState, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
-    fields: () => ({
-      [dartx.badInput]: core.bool,
-      [dartx.customError]: core.bool,
-      [dartx.patternMismatch]: core.bool,
-      [dartx.rangeOverflow]: core.bool,
-      [dartx.rangeUnderflow]: core.bool,
-      [dartx.stepMismatch]: core.bool,
-      [dartx.tooLong]: core.bool,
-      [dartx.tooShort]: core.bool,
-      [dartx.typeMismatch]: core.bool,
-      [dartx.valid]: core.bool,
-      [dartx.valueMissing]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
-  dart.defineExtensionNames([
-    'getVideoPlaybackQuality',
-    'enterFullscreen',
-    'exitFullscreen',
-    'height',
-    'poster',
-    'videoHeight',
-    'videoWidth',
-    'decodedFrameCount',
-    'droppedFrameCount',
-    'width'
-  ]);
-  html$.VideoElement = class VideoElement extends html$.MediaElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.poster] = null;
-      this[dartx.videoHeight] = null;
-      this[dartx.videoWidth] = null;
-      this[dartx.decodedFrameCount] = null;
-      this[dartx.droppedFrameCount] = null;
-      this[dartx.width] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.poster]() {
-      return this.poster;
-    }
-    set [dartx.poster](value) {
-      this.poster = value;
-    }
-    get [dartx.videoHeight]() {
-      return this.videoHeight;
-    }
-    get [dartx.videoWidth]() {
-      return this.videoWidth;
-    }
-    get [dartx.decodedFrameCount]() {
-      return this.webkitDecodedFrameCount;
-    }
-    get [dartx.droppedFrameCount]() {
-      return this.webkitDroppedFrameCount;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    [dartx.getVideoPlaybackQuality](...args) {
-      return this.getVideoPlaybackQuality.apply(this, args);
-    }
-    [dartx.enterFullscreen](...args) {
-      return this.webkitEnterFullscreen.apply(this, args);
-    }
-    [dartx.exitFullscreen](...args) {
-      return this.webkitExitFullscreen.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(html$.VideoElement, 'created');
-  html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
-  dart.setSignature(html$.VideoElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.VideoElement, []),
-      new: dart.definiteFunctionType(html$.VideoElement, []),
-      created: dart.definiteFunctionType(html$.VideoElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: core.int,
-      [dartx.poster]: core.String,
-      [dartx.videoHeight]: core.int,
-      [dartx.videoWidth]: core.int,
-      [dartx.decodedFrameCount]: core.int,
-      [dartx.droppedFrameCount]: core.int,
-      [dartx.width]: core.int
-    }),
-    methods: () => ({
-      [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
-      [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
-      [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
-  dart.defineExtensionNames([
-    'corruptedVideoFrames',
-    'creationTime',
-    'droppedVideoFrames',
-    'totalVideoFrames'
-  ]);
-  html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.corruptedVideoFrames]() {
-      return this.corruptedVideoFrames;
-    }
-    get [dartx.creationTime]() {
-      return this.creationTime;
-    }
-    get [dartx.droppedVideoFrames]() {
-      return this.droppedVideoFrames;
-    }
-    get [dartx.totalVideoFrames]() {
-      return this.totalVideoFrames;
-    }
-  };
-  dart.setSignature(html$.VideoPlaybackQuality, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
-    fields: () => ({
-      [dartx.corruptedVideoFrames]: core.int,
-      [dartx.creationTime]: core.double,
-      [dartx.droppedVideoFrames]: core.int,
-      [dartx.totalVideoFrames]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
-  dart.defineExtensionNames([
-    'id',
-    'kind',
-    'label',
-    'language',
-    'selected'
-  ]);
-  html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    get [dartx.kind]() {
-      return this.kind;
-    }
-    get [dartx.label]() {
-      return this.label;
-    }
-    get [dartx.language]() {
-      return this.language;
-    }
-    get [dartx.selected]() {
-      return this.selected;
-    }
-    set [dartx.selected](value) {
-      this.selected = value;
-    }
-  };
-  dart.setSignature(html$.VideoTrack, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
-    fields: () => ({
-      [dartx.id]: core.String,
-      [dartx.kind]: core.String,
-      [dartx.label]: core.String,
-      [dartx.language]: core.String,
-      [dartx.selected]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
-  dart.defineExtensionNames([
-    'getTrackById',
-    'onChange',
-    'length',
-    'selectedIndex'
-  ]);
-  html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.selectedIndex]() {
-      return this.selectedIndex;
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.getTrackById](...args) {
-      return this.getTrackById.apply(this, args);
-    }
-    get [dartx.onChange]() {
-      return html$.VideoTrackList.changeEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.VideoTrackList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
-    fields: () => ({
-      [dartx.length]: core.int,
-      [dartx.selectedIndex]: core.int
-    }),
-    getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
-      [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
-    }),
-    sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
-  });
-  dart.defineLazy(html$.VideoTrackList, {
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    }
-  });
-  dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
-  html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
-  dart.defineExtensionNames([
-    'getCueAsHtml',
-    'align',
-    'line',
-    'position',
-    'regionId',
-    'size',
-    'snapToLines',
-    'text',
-    'vertical'
-  ]);
-  html$.VttCue = class VttCue extends html$.TextTrackCue {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(startTime, endTime, text) {
-      return html$.VttCue._create_1(startTime, endTime, text);
-    }
-    static _create_1(startTime, endTime, text) {
-      return new VTTCue(startTime, endTime, text);
-    }
-    get [dartx.align]() {
-      return this.align;
-    }
-    set [dartx.align](value) {
-      this.align = value;
-    }
-    get [dartx.line]() {
-      return this.line;
-    }
-    set [dartx.line](value) {
-      this.line = value;
-    }
-    get [dartx.position]() {
-      return this.position;
-    }
-    set [dartx.position](value) {
-      this.position = value;
-    }
-    get [dartx.regionId]() {
-      return this.regionId;
-    }
-    set [dartx.regionId](value) {
-      this.regionId = value;
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    set [dartx.size](value) {
-      this.size = value;
-    }
-    get [dartx.snapToLines]() {
-      return this.snapToLines;
-    }
-    set [dartx.snapToLines](value) {
-      this.snapToLines = value;
-    }
-    get [dartx.text]() {
-      return this.text;
-    }
-    set [dartx.text](value) {
-      this.text = value;
-    }
-    get [dartx.vertical]() {
-      return this.vertical;
-    }
-    set [dartx.vertical](value) {
-      this.vertical = value;
-    }
-    [dartx.getCueAsHtml](...args) {
-      return this.getCueAsHTML.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.VttCue, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.VttCue, []),
-      new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
-    }),
-    fields: () => ({
-      [dartx.align]: core.String,
-      [dartx.line]: core.Object,
-      [dartx.position]: core.Object,
-      [dartx.regionId]: core.String,
-      [dartx.size]: core.num,
-      [dartx.snapToLines]: core.bool,
-      [dartx.text]: core.String,
-      [dartx.vertical]: core.String
-    }),
-    methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.VTTCue, html$.VttCue);
-  dart.defineExtensionNames([
-    'height',
-    'id',
-    'regionAnchorX',
-    'regionAnchorY',
-    'scroll',
-    'track',
-    'viewportAnchorX',
-    'viewportAnchorY',
-    'width'
-  ]);
-  html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.VttRegion._create_1();
-    }
-    static _create_1() {
-      return new VTTRegion();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.id]() {
-      return this.id;
-    }
-    set [dartx.id](value) {
-      this.id = value;
-    }
-    get [dartx.regionAnchorX]() {
-      return this.regionAnchorX;
-    }
-    set [dartx.regionAnchorX](value) {
-      this.regionAnchorX = value;
-    }
-    get [dartx.regionAnchorY]() {
-      return this.regionAnchorY;
-    }
-    set [dartx.regionAnchorY](value) {
-      this.regionAnchorY = value;
-    }
-    get [dartx.scroll]() {
-      return this.scroll;
-    }
-    set [dartx.scroll](value) {
-      this.scroll = value;
-    }
-    get [dartx.track]() {
-      return this.track;
-    }
-    get [dartx.viewportAnchorX]() {
-      return this.viewportAnchorX;
-    }
-    set [dartx.viewportAnchorX](value) {
-      this.viewportAnchorX = value;
-    }
-    get [dartx.viewportAnchorY]() {
-      return this.viewportAnchorY;
-    }
-    set [dartx.viewportAnchorY](value) {
-      this.viewportAnchorY = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-  };
-  dart.setSignature(html$.VttRegion, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.VttRegion, []),
-      new: dart.definiteFunctionType(html$.VttRegion, [])
-    }),
-    fields: () => ({
-      [dartx.height]: core.int,
-      [dartx.id]: core.String,
-      [dartx.regionAnchorX]: core.num,
-      [dartx.regionAnchorY]: core.num,
-      [dartx.scroll]: core.String,
-      [dartx.track]: html$.TextTrack,
-      [dartx.viewportAnchorX]: core.num,
-      [dartx.viewportAnchorY]: core.num,
-      [dartx.width]: core.num
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
-  dart.defineExtensionNames([
-    'getRegionById',
-    'item',
-    'length'
-  ]);
-  html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx.getRegionById](...args) {
-      return this.getRegionById.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.VttRegionList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
-    fields: () => ({[dartx.length]: core.int}),
-    methods: () => ({
-      [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
-  dart.defineExtensionNames([
-    'close',
-    'send',
-    'sendBlob',
-    'sendByteBuffer',
-    'sendString',
-    'sendTypedData',
-    'onClose',
-    'onError',
-    'onMessage',
-    'onOpen',
-    'binaryType',
-    'bufferedAmount',
-    'extensions',
-    'protocol',
-    'readyState',
-    'url'
-  ]);
-  html$.WebSocket = class WebSocket extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(url, protocols) {
-      if (protocols === void 0) protocols = null;
-      if (protocols != null) {
-        return html$.WebSocket._create_1(url, protocols);
-      }
-      return html$.WebSocket._create_2(url);
-    }
-    static _create_1(url, protocols) {
-      return new self.WebSocket(url, protocols);
-    }
-    static _create_2(url) {
-      return new self.WebSocket(url);
-    }
-    static get supported() {
-      return typeof window.WebSocket != "undefined";
-    }
-    get [dartx.binaryType]() {
-      return this.binaryType;
-    }
-    set [dartx.binaryType](value) {
-      this.binaryType = value;
-    }
-    get [dartx.bufferedAmount]() {
-      return this.bufferedAmount;
-    }
-    get [dartx.extensions]() {
-      return this.extensions;
-    }
-    get [dartx.protocol]() {
-      return this.protocol;
-    }
-    get [dartx.readyState]() {
-      return this.readyState;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.send](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendBlob](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendByteBuffer](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendString](...args) {
-      return this.send.apply(this, args);
-    }
-    [dartx.sendTypedData](...args) {
-      return this.send.apply(this, args);
-    }
-    get [dartx.onClose]() {
-      return html$.WebSocket.closeEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.WebSocket.errorEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.WebSocket.messageEvent.forTarget(this);
-    }
-    get [dartx.onOpen]() {
-      return html$.WebSocket.openEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.WebSocket, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.WebSocket, []),
-      new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
-    }),
-    fields: () => ({
-      [dartx.binaryType]: core.String,
-      [dartx.bufferedAmount]: core.int,
-      [dartx.extensions]: core.String,
-      [dartx.protocol]: core.String,
-      [dartx.readyState]: core.int,
-      [dartx.url]: core.String
-    }),
-    getters: () => ({
-      [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
-      [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    methods: () => ({
-      [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
-      [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
-      [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
-      [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
-    }),
-    sfields: () => ({
-      closeEvent: EventStreamProviderOfCloseEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      openEvent: EventStreamProviderOfEvent(),
-      CLOSED: core.int,
-      CLOSING: core.int,
-      CONNECTING: core.int,
-      OPEN: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  html$.WebSocket.CLOSED = 3;
-  html$.WebSocket.CLOSING = 2;
-  html$.WebSocket.CONNECTING = 0;
-  html$.WebSocket.OPEN = 1;
-  dart.defineLazy(html$.WebSocket, {
-    get closeEvent() {
-      return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get openEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('open'));
-    }
-  });
-  dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
-  const _deltaX = Symbol('_deltaX');
-  const _deltaY = Symbol('_deltaY');
-  const _wheelDelta = Symbol('_wheelDelta');
-  const _wheelDeltaX = Symbol('_wheelDeltaX');
-  const _hasInitMouseScrollEvent = Symbol('_hasInitMouseScrollEvent');
-  const _initMouseScrollEvent = Symbol('_initMouseScrollEvent');
-  const _hasInitWheelEvent = Symbol('_hasInitWheelEvent');
-  const _initWheelEvent = Symbol('_initWheelEvent');
-  dart.defineExtensionNames([
-    'deltaY',
-    'deltaX',
-    'deltaMode',
-    'deltaZ'
-  ]);
-  html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
-    static new(type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
-      let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
-      let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
-      let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
-      let detail = opts && 'detail' in opts ? opts.detail : 0;
-      let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
-      let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
-      let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
-      let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
-      let button = opts && 'button' in opts ? opts.button : 0;
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
-      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
-      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
-      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
-      let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
-      let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
-      if (view == null) {
-        view = html$.window;
-      }
-      return new self.WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
-    }
-    static _(type, eventInitDict) {
-      if (eventInitDict === void 0) eventInitDict = null;
-      if (eventInitDict != null) {
-        let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-        return html$.WheelEvent._create_1(type, eventInitDict_1);
-      }
-      return html$.WheelEvent._create_2(type);
-    }
-    static _create_1(type, eventInitDict) {
-      return new self.WheelEvent(type, eventInitDict);
-    }
-    static _create_2(type) {
-      return new self.WheelEvent(type);
-    }
-    get [_deltaX]() {
-      return this.deltaX;
-    }
-    get [_deltaY]() {
-      return this.deltaY;
-    }
-    get [dartx.deltaZ]() {
-      return this.deltaZ;
-    }
-    get [dartx.deltaY]() {
-      if (this.deltaY !== undefined) {
-        return this[_deltaY];
-      }
-      dart.throw(new core.UnsupportedError('deltaY is not supported'));
-    }
-    get [dartx.deltaX]() {
-      if (this.deltaX !== undefined) {
-        return this[_deltaX];
-      }
-      dart.throw(new core.UnsupportedError('deltaX is not supported'));
-    }
-    get [dartx.deltaMode]() {
-      if (!!this.deltaMode) {
-        return this.deltaMode;
-      }
-      return 0;
-    }
-    get [_wheelDelta]() {
-      return this.wheelDelta;
-    }
-    get [_wheelDeltaX]() {
-      return this.wheelDeltaX;
-    }
-    get [_detail]() {
-      return this.detail;
-    }
-    get [_hasInitMouseScrollEvent]() {
-      return !!this.initMouseScrollEvent;
-    }
-    [_initMouseScrollEvent](...args) {
-      return this.initMouseScrollEvent.apply(this, args);
-    }
-    get [_hasInitWheelEvent]() {
-      return !!this.initWheelEvent;
-    }
-    [_initWheelEvent](...args) {
-      return this.initWheelEvent.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.WheelEvent, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
-      _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
-    }),
-    fields: () => ({
-      [_deltaX]: core.double,
-      [_deltaY]: core.double,
-      [dartx.deltaZ]: core.double
-    }),
-    getters: () => ({
-      [dartx.deltaY]: dart.definiteFunctionType(core.num, []),
-      [dartx.deltaX]: dart.definiteFunctionType(core.num, []),
-      [dartx.deltaMode]: dart.definiteFunctionType(core.int, []),
-      [_wheelDelta]: dart.definiteFunctionType(core.num, []),
-      [_wheelDeltaX]: dart.definiteFunctionType(core.num, []),
-      [_detail]: dart.definiteFunctionType(core.num, []),
-      [_hasInitMouseScrollEvent]: dart.definiteFunctionType(core.bool, []),
-      [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
-      [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
-    }),
-    sfields: () => ({
-      DOM_DELTA_LINE: core.int,
-      DOM_DELTA_PAGE: core.int,
-      DOM_DELTA_PIXEL: core.int
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  html$.WheelEvent.DOM_DELTA_LINE = 1;
-  html$.WheelEvent.DOM_DELTA_PAGE = 2;
-  html$.WheelEvent.DOM_DELTA_PIXEL = 0;
-  dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
-  const _open2 = Symbol('_open2');
-  const _open3 = Symbol('_open3');
-  const _location = Symbol('_location');
-  const _ensureRequestAnimationFrame = Symbol('_ensureRequestAnimationFrame');
-  const _requestAnimationFrame = Symbol('_requestAnimationFrame');
-  const _cancelAnimationFrame = Symbol('_cancelAnimationFrame');
-  const _requestFileSystem = Symbol('_requestFileSystem');
-  const _get_opener = Symbol('_get_opener');
-  const _pageXOffset = Symbol('_pageXOffset');
-  const _pageYOffset = Symbol('_pageYOffset');
-  const _get_parent = Symbol('_get_parent');
-  const _get_self = Symbol('_get_self');
-  const _get_top = Symbol('_get_top');
-  const __getter___1 = Symbol('__getter___1');
-  const __getter___2 = Symbol('__getter___2');
-  const _scroll_4 = Symbol('_scroll_4');
-  const _scroll_5 = Symbol('_scroll_5');
-  const _scrollBy_4 = Symbol('_scrollBy_4');
-  const _scrollBy_5 = Symbol('_scrollBy_5');
-  const _scrollTo_4 = Symbol('_scrollTo_4');
-  const _scrollTo_5 = Symbol('_scrollTo_5');
-  const __requestFileSystem = Symbol('__requestFileSystem');
-  const _resolveLocalFileSystemUrl = Symbol('_resolveLocalFileSystemUrl');
-  dart.defineExtensionNames([
-    'animationFrame',
-    'document',
-    'open',
-    'location',
-    'location',
-    'requestAnimationFrame',
-    'cancelAnimationFrame',
-    'indexedDB',
-    'console',
-    'requestFileSystem',
-    'opener',
-    'opener',
-    'parent',
-    'self',
-    'top',
-    'window',
-    'alert',
-    'close',
-    'confirm',
-    'fetch',
-    'find',
-    'getMatchedCssRules',
-    'getSelection',
-    'matchMedia',
-    'moveBy',
-    'openDatabase',
-    'postMessage',
-    'print',
-    'resizeBy',
-    'resizeTo',
-    'scroll',
-    'scrollBy',
-    'scrollTo',
-    'stop',
-    'resolveLocalFileSystemUrl',
-    'atob',
-    'btoa',
-    'onContentLoaded',
-    'onAbort',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onDoubleClick',
-    'onDeviceMotion',
-    'onDeviceOrientation',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onHashChange',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onLoadStart',
-    'onMessage',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onOffline',
-    'onOnline',
-    'onPageHide',
-    'onPageShow',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onPopState',
-    'onProgress',
-    'onRateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSearch',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onStalled',
-    'onStorage',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onTouchCancel',
-    'onTouchEnd',
-    'onTouchMove',
-    'onTouchStart',
-    'onTransitionEnd',
-    'onUnload',
-    'onVolumeChange',
-    'onWaiting',
-    'onAnimationEnd',
-    'onAnimationIteration',
-    'onAnimationStart',
-    'onBeforeUnload',
-    'moveTo',
-    'pageXOffset',
-    'pageYOffset',
-    'scrollX',
-    'scrollY',
-    'applicationCache',
-    'caches',
-    'closed',
-    'crypto',
-    'defaultStatus',
-    'defaultstatus',
-    'devicePixelRatio',
-    'history',
-    'innerHeight',
-    'innerWidth',
-    'localStorage',
-    'locationbar',
-    'menubar',
-    'name',
-    'navigator',
-    'offscreenBuffering',
-    'orientation',
-    'outerHeight',
-    'outerWidth',
-    'performance',
-    'screen',
-    'screenLeft',
-    'screenTop',
-    'screenX',
-    'screenY',
-    'scrollbars',
-    'sessionStorage',
-    'speechSynthesis',
-    'status',
-    'statusbar',
-    'styleMedia',
-    'toolbar'
-  ]);
-  html$.Window = class Window extends html$.EventTarget {
-    get [dartx.animationFrame]() {
-      let completer = CompleterOfnum().sync();
-      this[dartx.requestAnimationFrame](dart.fn(time => {
-        completer.complete(time);
-      }, numToNull()));
-      return completer.future;
-    }
-    get [dartx.document]() {
-      return this.document;
-    }
-    [_open2](url, name) {
-      return this.open(url, name);
-    }
-    [_open3](url, name, options) {
-      return this.open(url, name, options);
-    }
-    [dartx.open](url, name, options) {
-      if (options === void 0) options = null;
-      if (options == null) {
-        return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
-      } else {
-        return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
-      }
-    }
-    get [dartx.location]() {
-      return html$.Location._check(this[_location]);
-    }
-    set [dartx.location](value) {
-      this[_location] = value;
-    }
-    get [_location]() {
-      return this.location;
-    }
-    set [_location](value) {
-      this.location = value;
-    }
-    [dartx.requestAnimationFrame](callback) {
-      this[_ensureRequestAnimationFrame]();
-      return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
-    }
-    [dartx.cancelAnimationFrame](id) {
-      this[_ensureRequestAnimationFrame]();
-      this[_cancelAnimationFrame](id);
-    }
-    [_requestAnimationFrame](...args) {
-      return this.requestAnimationFrame.apply(this, args);
-    }
-    [_cancelAnimationFrame](...args) {
-      return this.cancelAnimationFrame.apply(this, args);
-    }
-    [_ensureRequestAnimationFrame]() {
-      if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
-      (function($this) {
-        var vendors = ['ms', 'moz', 'webkit', 'o'];
-        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
-          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
-          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+    let byteCount = 1;
+    if (dart.notNull(max) > 255) {
+      byteCount++;
+      if (dart.notNull(max) > 65535) {
+        byteCount++;
+        if (dart.notNull(max) > 16777215) {
+          byteCount++;
         }
-        if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
-        $this.requestAnimationFrame = function(callback) {
-          return window.setTimeout(function() {
-            callback(Date.now());
-          }, 16);
-        };
-        $this.cancelAnimationFrame = function(id) {
-          clearTimeout(id);
-        };
-      })(this);
-    }
-    get [dartx.indexedDB]() {
-      return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
-    }
-    get [dartx.console]() {
-      return html$.Console._safeConsole;
-    }
-    [dartx.requestFileSystem](size, opts) {
-      let persistent = opts && 'persistent' in opts ? opts.persistent : false;
-      return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
-    }
-    static get supportsPointConversions() {
-      return html$.DomPoint.supported;
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.applicationCache]() {
-      return this.applicationCache;
-    }
-    get [dartx.caches]() {
-      return this.caches;
-    }
-    get [dartx.closed]() {
-      return this.closed;
-    }
-    get [dartx.crypto]() {
-      return this.crypto;
-    }
-    get [dartx.defaultStatus]() {
-      return this.defaultStatus;
-    }
-    set [dartx.defaultStatus](value) {
-      this.defaultStatus = value;
-    }
-    get [dartx.defaultstatus]() {
-      return this.defaultstatus;
-    }
-    set [dartx.defaultstatus](value) {
-      this.defaultstatus = value;
-    }
-    get [dartx.devicePixelRatio]() {
-      return this.devicePixelRatio;
-    }
-    get [dartx.history]() {
-      return this.history;
-    }
-    get [dartx.innerHeight]() {
-      return this.innerHeight;
-    }
-    get [dartx.innerWidth]() {
-      return this.innerWidth;
-    }
-    get [dartx.localStorage]() {
-      return this.localStorage;
-    }
-    get [dartx.locationbar]() {
-      return this.locationbar;
-    }
-    get [dartx.menubar]() {
-      return this.menubar;
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    set [dartx.name](value) {
-      this.name = value;
-    }
-    get [dartx.navigator]() {
-      return this.navigator;
-    }
-    get [dartx.offscreenBuffering]() {
-      return this.offscreenBuffering;
-    }
-    get [dartx.opener]() {
-      return html$._convertNativeToDart_Window(this[_get_opener]);
-    }
-    get [_get_opener]() {
-      return this.opener;
-    }
-    set [dartx.opener](value) {
-      this.opener = value;
-    }
-    get [dartx.orientation]() {
-      return this.orientation;
-    }
-    get [dartx.outerHeight]() {
-      return this.outerHeight;
-    }
-    get [dartx.outerWidth]() {
-      return this.outerWidth;
-    }
-    get [_pageXOffset]() {
-      return this.pageXOffset;
-    }
-    get [_pageYOffset]() {
-      return this.pageYOffset;
-    }
-    get [dartx.parent]() {
-      return html$._convertNativeToDart_Window(this[_get_parent]);
-    }
-    get [_get_parent]() {
-      return this.parent;
-    }
-    get [dartx.performance]() {
-      return this.performance;
-    }
-    get [dartx.screen]() {
-      return this.screen;
-    }
-    get [dartx.screenLeft]() {
-      return this.screenLeft;
-    }
-    get [dartx.screenTop]() {
-      return this.screenTop;
-    }
-    get [dartx.screenX]() {
-      return this.screenX;
-    }
-    get [dartx.screenY]() {
-      return this.screenY;
-    }
-    get [dartx.scrollbars]() {
-      return this.scrollbars;
-    }
-    get [dartx.self]() {
-      return html$._convertNativeToDart_Window(this[_get_self]);
-    }
-    get [_get_self]() {
-      return this.self;
-    }
-    get [dartx.sessionStorage]() {
-      return this.sessionStorage;
-    }
-    get [dartx.speechSynthesis]() {
-      return this.speechSynthesis;
-    }
-    get [dartx.status]() {
-      return this.status;
-    }
-    set [dartx.status](value) {
-      this.status = value;
-    }
-    get [dartx.statusbar]() {
-      return this.statusbar;
-    }
-    get [dartx.styleMedia]() {
-      return this.styleMedia;
-    }
-    get [dartx.toolbar]() {
-      return this.toolbar;
-    }
-    get [dartx.top]() {
-      return html$._convertNativeToDart_Window(this[_get_top]);
-    }
-    get [_get_top]() {
-      return this.top;
-    }
-    get [dartx.window]() {
-      return html$._convertNativeToDart_Window(this[_get_window]);
-    }
-    get [_get_window]() {
-      return this.window;
-    }
-    [__getter__](index_OR_name) {
-      if (typeof index_OR_name == 'number') {
-        return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
       }
-      if (typeof index_OR_name == 'string') {
-        return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
+    }
+    this[_buffer$0][dartx.setUint32](0, 0);
+    let start = 4 - byteCount;
+    let randomLimit = dart.asInt(math.pow(256, byteCount));
+    while (true) {
+      this[_getRandomBytes](start, byteCount);
+      let random = this[_buffer$0][dartx.getUint32](0);
+      if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
+        return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
       }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [__getter___1](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [__getter___2](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.alert](...args) {
-      return this.alert.apply(this, args);
-    }
-    [dartx.close](...args) {
-      return this.close.apply(this, args);
-    }
-    [dartx.confirm](...args) {
-      return this.confirm.apply(this, args);
-    }
-    [dartx.fetch](input, init) {
-      if (init === void 0) init = null;
-      if (init != null) {
-        let init_1 = html_common.convertDartToNative_Dictionary(init);
-        return this[_fetch_1](input, init_1);
+      let result = dart.asInt(random[dartx.remainder](max));
+      if (dart.notNull(random) - dart.notNull(result) + dart.notNull(max) < dart.notNull(randomLimit)) {
+        return result;
       }
-      return this[_fetch_2](input);
     }
-    [_fetch_1](...args) {
-      return this.fetch.apply(this, args);
+  }
+};
+math._JSSecureRandom[dart.implements] = () => [math.Random];
+dart.setSignature(math._JSSecureRandom, {
+  constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
+  fields: () => ({[_buffer$0]: typed_data.ByteData}),
+  methods: () => ({
+    [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    nextBool: dart.definiteFunctionType(core.bool, []),
+    nextDouble: dart.definiteFunctionType(core.double, []),
+    nextInt: dart.definiteFunctionType(core.int, [core.int])
+  })
+});
+math._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
+  static combine(hash, value) {
+    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
+    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
+    return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
+  }
+  static finish(hash) {
+    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
+    hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
+    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
+  }
+  static hash2(a, b) {
+    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
+  }
+  static hash4(a, b, c, d) {
+    return math._JenkinsSmiHash.finish(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(math._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
+  }
+};
+dart.setSignature(math._JenkinsSmiHash, {
+  statics: () => ({
+    combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    finish: dart.definiteFunctionType(core.int, [core.int]),
+    hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
+    hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['combine', 'finish', 'hash2', 'hash4']
+});
+math.Point$ = dart.generic(T => {
+  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
+  class Point extends core.Object {
+    new(x, y) {
+      this.x = x;
+      this.y = y;
     }
-    [_fetch_2](...args) {
-      return this.fetch.apply(this, args);
+    toString() {
+      return dart.str`Point(${this.x}, ${this.y})`;
     }
-    [dartx.find](...args) {
-      return this.find.apply(this, args);
+    ['=='](other) {
+      if (!PointOfnum().is(other)) return false;
+      return dart.equals(this.x, dart.dload(other, 'x')) && dart.equals(this.y, dart.dload(other, 'y'));
     }
-    [_getComputedStyle](...args) {
-      return this.getComputedStyle.apply(this, args);
+    get hashCode() {
+      return math._JenkinsSmiHash.hash2(dart.hashCode(this.x), dart.hashCode(this.y));
     }
-    [dartx.getMatchedCssRules](...args) {
-      return this.getMatchedCSSRules.apply(this, args);
+    ['+'](other) {
+      PointOfT()._check(other);
+      return new (PointOfT())(dart.notNull(this.x) + dart.notNull(other.x), dart.notNull(this.y) + dart.notNull(other.y));
     }
-    [dartx.getSelection](...args) {
-      return this.getSelection.apply(this, args);
+    ['-'](other) {
+      PointOfT()._check(other);
+      return new (PointOfT())(dart.notNull(this.x) - dart.notNull(other.x), dart.notNull(this.y) - dart.notNull(other.y));
     }
-    [dartx.matchMedia](...args) {
-      return this.matchMedia.apply(this, args);
+    ['*'](factor) {
+      return new (PointOfT())(dart.notNull(this.x) * dart.notNull(factor), dart.notNull(this.y) * dart.notNull(factor));
     }
-    [dartx.moveBy](...args) {
-      return this.moveBy.apply(this, args);
+    get magnitude() {
+      return math.sqrt(dart.notNull(this.x) * dart.notNull(this.x) + dart.notNull(this.y) * dart.notNull(this.y));
     }
-    [_moveTo](...args) {
-      return this.moveTo.apply(this, args);
+    distanceTo(other) {
+      PointOfT()._check(other);
+      let dx = dart.notNull(this.x) - dart.notNull(other.x);
+      let dy = dart.notNull(this.y) - dart.notNull(other.y);
+      return math.sqrt(dx * dx + dy * dy);
     }
-    [dartx.openDatabase](...args) {
-      return this.openDatabase.apply(this, args);
+    squaredDistanceTo(other) {
+      PointOfT()._check(other);
+      let dx = dart.notNull(this.x) - dart.notNull(other.x);
+      let dy = dart.notNull(this.y) - dart.notNull(other.y);
+      return dx * dx + dy * dy;
     }
-    [dartx.postMessage](message, targetOrigin, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, targetOrigin, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1, targetOrigin);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [dartx.print](...args) {
-      return this.print.apply(this, args);
-    }
-    [dartx.resizeBy](...args) {
-      return this.resizeBy.apply(this, args);
-    }
-    [dartx.resizeTo](...args) {
-      return this.resizeTo.apply(this, args);
-    }
-    [dartx.scroll](options_OR_x, y, scrollOptions) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (scrollOptions === void 0) scrollOptions = null;
-      if (options_OR_x == null && y == null && scrollOptions == null) {
-        this[_scroll_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scroll_2](options_1);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scroll_3](options_OR_x, y);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scroll_4](options_OR_x, y);
-        return;
-      }
-      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
-        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
-        this[_scroll_5](options_OR_x, y, scrollOptions_1);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scroll_1](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_2](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_3](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_4](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [_scroll_5](...args) {
-      return this.scroll.apply(this, args);
-    }
-    [dartx.scrollBy](options_OR_x, y, scrollOptions) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (scrollOptions === void 0) scrollOptions = null;
-      if (options_OR_x == null && y == null && scrollOptions == null) {
-        this[_scrollBy_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scrollBy_2](options_1);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scrollBy_3](options_OR_x, y);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scrollBy_4](options_OR_x, y);
-        return;
-      }
-      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
-        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
-        this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scrollBy_1](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_2](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_3](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_4](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [_scrollBy_5](...args) {
-      return this.scrollBy.apply(this, args);
-    }
-    [dartx.scrollTo](options_OR_x, y, scrollOptions) {
-      if (options_OR_x === void 0) options_OR_x = null;
-      if (y === void 0) y = null;
-      if (scrollOptions === void 0) scrollOptions = null;
-      if (options_OR_x == null && y == null && scrollOptions == null) {
-        this[_scrollTo_1]();
-        return;
-      }
-      if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
-        let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
-        this[_scrollTo_2](options_1);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scrollTo_3](options_OR_x, y);
-        return;
-      }
-      if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
-        this[_scrollTo_4](options_OR_x, y);
-        return;
-      }
-      if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
-        let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
-        this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_scrollTo_1](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_2](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_3](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_4](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [_scrollTo_5](...args) {
-      return this.scrollTo.apply(this, args);
-    }
-    [dartx.stop](...args) {
-      return this.stop.apply(this, args);
-    }
-    [__requestFileSystem](...args) {
-      return this.webkitRequestFileSystem.apply(this, args);
-    }
-    [_requestFileSystem](type, size) {
-      let completer = CompleterOfFileSystem().new();
-      this[__requestFileSystem](type, size, dart.fn(value => {
-        completer.complete(value);
-      }, FileSystemToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [_resolveLocalFileSystemUrl](...args) {
-      return this.webkitResolveLocalFileSystemURL.apply(this, args);
-    }
-    [dartx.resolveLocalFileSystemUrl](url) {
-      let completer = CompleterOfEntry().new();
-      this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
-        completer.complete(value);
-      }, EntryToNull()), dart.fn(error => {
-        completer.completeError(error);
-      }, FileErrorToNull()));
-      return completer.future;
-    }
-    [dartx.atob](...args) {
-      return this.atob.apply(this, args);
-    }
-    [dartx.btoa](...args) {
-      return this.btoa.apply(this, args);
-    }
-    [_setInterval_String](...args) {
-      return this.setInterval.apply(this, args);
-    }
-    [_setTimeout_String](...args) {
-      return this.setTimeout.apply(this, args);
-    }
-    [_clearInterval](...args) {
-      return this.clearInterval.apply(this, args);
-    }
-    [_clearTimeout](...args) {
-      return this.clearTimeout.apply(this, args);
-    }
-    [_setInterval](...args) {
-      return this.setInterval.apply(this, args);
-    }
-    [_setTimeout](...args) {
-      return this.setTimeout.apply(this, args);
-    }
-    get [dartx.onContentLoaded]() {
-      return html$.Window.contentLoadedEvent.forTarget(this);
-    }
-    get [dartx.onAbort]() {
-      return html$.Element.abortEvent.forTarget(this);
-    }
-    get [dartx.onBlur]() {
-      return html$.Element.blurEvent.forTarget(this);
-    }
-    get [dartx.onCanPlay]() {
-      return html$.Element.canPlayEvent.forTarget(this);
-    }
-    get [dartx.onCanPlayThrough]() {
-      return html$.Element.canPlayThroughEvent.forTarget(this);
-    }
-    get [dartx.onChange]() {
-      return html$.Element.changeEvent.forTarget(this);
-    }
-    get [dartx.onClick]() {
-      return html$.Element.clickEvent.forTarget(this);
-    }
-    get [dartx.onContextMenu]() {
-      return html$.Element.contextMenuEvent.forTarget(this);
-    }
-    get [dartx.onDoubleClick]() {
-      return html$.Element.doubleClickEvent.forTarget(this);
-    }
-    get [dartx.onDeviceMotion]() {
-      return html$.Window.deviceMotionEvent.forTarget(this);
-    }
-    get [dartx.onDeviceOrientation]() {
-      return html$.Window.deviceOrientationEvent.forTarget(this);
-    }
-    get [dartx.onDrag]() {
-      return html$.Element.dragEvent.forTarget(this);
-    }
-    get [dartx.onDragEnd]() {
-      return html$.Element.dragEndEvent.forTarget(this);
-    }
-    get [dartx.onDragEnter]() {
-      return html$.Element.dragEnterEvent.forTarget(this);
-    }
-    get [dartx.onDragLeave]() {
-      return html$.Element.dragLeaveEvent.forTarget(this);
-    }
-    get [dartx.onDragOver]() {
-      return html$.Element.dragOverEvent.forTarget(this);
-    }
-    get [dartx.onDragStart]() {
-      return html$.Element.dragStartEvent.forTarget(this);
-    }
-    get [dartx.onDrop]() {
-      return html$.Element.dropEvent.forTarget(this);
-    }
-    get [dartx.onDurationChange]() {
-      return html$.Element.durationChangeEvent.forTarget(this);
-    }
-    get [dartx.onEmptied]() {
-      return html$.Element.emptiedEvent.forTarget(this);
-    }
-    get [dartx.onEnded]() {
-      return html$.Element.endedEvent.forTarget(this);
-    }
-    get [dartx.onError]() {
-      return html$.Element.errorEvent.forTarget(this);
-    }
-    get [dartx.onFocus]() {
-      return html$.Element.focusEvent.forTarget(this);
-    }
-    get [dartx.onHashChange]() {
-      return html$.Window.hashChangeEvent.forTarget(this);
-    }
-    get [dartx.onInput]() {
-      return html$.Element.inputEvent.forTarget(this);
-    }
-    get [dartx.onInvalid]() {
-      return html$.Element.invalidEvent.forTarget(this);
-    }
-    get [dartx.onKeyDown]() {
-      return html$.Element.keyDownEvent.forTarget(this);
-    }
-    get [dartx.onKeyPress]() {
-      return html$.Element.keyPressEvent.forTarget(this);
-    }
-    get [dartx.onKeyUp]() {
-      return html$.Element.keyUpEvent.forTarget(this);
-    }
-    get [dartx.onLoad]() {
-      return html$.Element.loadEvent.forTarget(this);
-    }
-    get [dartx.onLoadedData]() {
-      return html$.Element.loadedDataEvent.forTarget(this);
-    }
-    get [dartx.onLoadedMetadata]() {
-      return html$.Element.loadedMetadataEvent.forTarget(this);
-    }
-    get [dartx.onLoadStart]() {
-      return html$.Window.loadStartEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.Window.messageEvent.forTarget(this);
-    }
-    get [dartx.onMouseDown]() {
-      return html$.Element.mouseDownEvent.forTarget(this);
-    }
-    get [dartx.onMouseEnter]() {
-      return html$.Element.mouseEnterEvent.forTarget(this);
-    }
-    get [dartx.onMouseLeave]() {
-      return html$.Element.mouseLeaveEvent.forTarget(this);
-    }
-    get [dartx.onMouseMove]() {
-      return html$.Element.mouseMoveEvent.forTarget(this);
-    }
-    get [dartx.onMouseOut]() {
-      return html$.Element.mouseOutEvent.forTarget(this);
-    }
-    get [dartx.onMouseOver]() {
-      return html$.Element.mouseOverEvent.forTarget(this);
-    }
-    get [dartx.onMouseUp]() {
-      return html$.Element.mouseUpEvent.forTarget(this);
-    }
-    get [dartx.onMouseWheel]() {
-      return html$.Element.mouseWheelEvent.forTarget(this);
-    }
-    get [dartx.onOffline]() {
-      return html$.Window.offlineEvent.forTarget(this);
-    }
-    get [dartx.onOnline]() {
-      return html$.Window.onlineEvent.forTarget(this);
-    }
-    get [dartx.onPageHide]() {
-      return html$.Window.pageHideEvent.forTarget(this);
-    }
-    get [dartx.onPageShow]() {
-      return html$.Window.pageShowEvent.forTarget(this);
-    }
-    get [dartx.onPause]() {
-      return html$.Element.pauseEvent.forTarget(this);
-    }
-    get [dartx.onPlay]() {
-      return html$.Element.playEvent.forTarget(this);
-    }
-    get [dartx.onPlaying]() {
-      return html$.Element.playingEvent.forTarget(this);
-    }
-    get [dartx.onPopState]() {
-      return html$.Window.popStateEvent.forTarget(this);
-    }
-    get [dartx.onProgress]() {
-      return html$.Window.progressEvent.forTarget(this);
-    }
-    get [dartx.onRateChange]() {
-      return html$.Element.rateChangeEvent.forTarget(this);
-    }
-    get [dartx.onReset]() {
-      return html$.Element.resetEvent.forTarget(this);
-    }
-    get [dartx.onResize]() {
-      return html$.Element.resizeEvent.forTarget(this);
-    }
-    get [dartx.onScroll]() {
-      return html$.Element.scrollEvent.forTarget(this);
-    }
-    get [dartx.onSearch]() {
-      return html$.Element.searchEvent.forTarget(this);
-    }
-    get [dartx.onSeeked]() {
-      return html$.Element.seekedEvent.forTarget(this);
-    }
-    get [dartx.onSeeking]() {
-      return html$.Element.seekingEvent.forTarget(this);
-    }
-    get [dartx.onSelect]() {
-      return html$.Element.selectEvent.forTarget(this);
-    }
-    get [dartx.onStalled]() {
-      return html$.Element.stalledEvent.forTarget(this);
-    }
-    get [dartx.onStorage]() {
-      return html$.Window.storageEvent.forTarget(this);
-    }
-    get [dartx.onSubmit]() {
-      return html$.Element.submitEvent.forTarget(this);
-    }
-    get [dartx.onSuspend]() {
-      return html$.Element.suspendEvent.forTarget(this);
-    }
-    get [dartx.onTimeUpdate]() {
-      return html$.Element.timeUpdateEvent.forTarget(this);
-    }
-    get [dartx.onTouchCancel]() {
-      return html$.Element.touchCancelEvent.forTarget(this);
-    }
-    get [dartx.onTouchEnd]() {
-      return html$.Element.touchEndEvent.forTarget(this);
-    }
-    get [dartx.onTouchMove]() {
-      return html$.Element.touchMoveEvent.forTarget(this);
-    }
-    get [dartx.onTouchStart]() {
-      return html$.Element.touchStartEvent.forTarget(this);
-    }
-    get [dartx.onTransitionEnd]() {
-      return html$.Element.transitionEndEvent.forTarget(this);
-    }
-    get [dartx.onUnload]() {
-      return html$.Window.unloadEvent.forTarget(this);
-    }
-    get [dartx.onVolumeChange]() {
-      return html$.Element.volumeChangeEvent.forTarget(this);
-    }
-    get [dartx.onWaiting]() {
-      return html$.Element.waitingEvent.forTarget(this);
-    }
-    get [dartx.onAnimationEnd]() {
-      return html$.Window.animationEndEvent.forTarget(this);
-    }
-    get [dartx.onAnimationIteration]() {
-      return html$.Window.animationIterationEvent.forTarget(this);
-    }
-    get [dartx.onAnimationStart]() {
-      return html$.Window.animationStartEvent.forTarget(this);
-    }
-    get [dartx.onBeforeUnload]() {
-      return html$.Window.beforeUnloadEvent.forTarget(this);
-    }
-    [dartx.moveTo](p) {
-      this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
-    }
-    get [dartx.pageXOffset]() {
-      return this.pageXOffset[dartx.round]();
-    }
-    get [dartx.pageYOffset]() {
-      return this.pageYOffset[dartx.round]();
-    }
-    get [dartx.scrollX]() {
-      return "scrollX" in this ? this.scrollX[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollLeft];
-    }
-    get [dartx.scrollY]() {
-      return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
-    }
-  };
-  html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
-  dart.setSignature(html$.Window, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
+  }
+  dart.addTypeTests(Point);
+  dart.setSignature(Point, {
+    constructors: () => ({new: dart.definiteFunctionType(math.Point$(T), [T, T])}),
     fields: () => ({
-      [dartx.applicationCache]: html$.ApplicationCache,
-      [dartx.caches]: html$.CacheStorage,
-      [dartx.closed]: core.bool,
-      [dartx.crypto]: html$.Crypto,
-      [dartx.defaultStatus]: core.String,
-      [dartx.defaultstatus]: core.String,
-      [dartx.devicePixelRatio]: core.double,
-      [dartx.history]: html$.History,
-      [dartx.innerHeight]: core.int,
-      [dartx.innerWidth]: core.int,
-      [dartx.localStorage]: html$.Storage,
-      [dartx.locationbar]: html$.BarProp,
-      [dartx.menubar]: html$.BarProp,
-      [dartx.name]: core.String,
-      [dartx.navigator]: html$.Navigator,
-      [dartx.offscreenBuffering]: core.bool,
-      [_get_opener]: dart.dynamic,
-      [dartx.orientation]: core.int,
-      [dartx.outerHeight]: core.int,
-      [dartx.outerWidth]: core.int,
-      [_pageXOffset]: core.double,
-      [_pageYOffset]: core.double,
-      [_get_parent]: dart.dynamic,
-      [dartx.performance]: html$.Performance,
-      [dartx.screen]: html$.Screen,
-      [dartx.screenLeft]: core.int,
-      [dartx.screenTop]: core.int,
-      [dartx.screenX]: core.int,
-      [dartx.screenY]: core.int,
-      [dartx.scrollbars]: html$.BarProp,
-      [_get_self]: dart.dynamic,
-      [dartx.sessionStorage]: html$.Storage,
-      [dartx.speechSynthesis]: html$.SpeechSynthesis,
-      [dartx.status]: core.String,
-      [dartx.statusbar]: html$.BarProp,
-      [dartx.styleMedia]: html$.StyleMedia,
-      [dartx.toolbar]: html$.BarProp,
-      [_get_top]: dart.dynamic,
-      [_get_window]: dart.dynamic
+      x: T,
+      y: T
     }),
-    getters: () => ({
-      [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
-      [dartx.document]: dart.definiteFunctionType(html$.Document, []),
-      [dartx.location]: dart.definiteFunctionType(html$.Location, []),
-      [_location]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
-      [dartx.console]: dart.definiteFunctionType(html$.Console, []),
-      [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
-      [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
-      [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
-      [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
-      [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
-      [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
-      [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
-      [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
-      [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
-      [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
-      [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
-      [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
-      [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
-      [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
-      [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
-      [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
-      [dartx.scrollY]: dart.definiteFunctionType(core.int, [])
-    }),
-    setters: () => ({
-      [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
-    }),
+    getters: () => ({magnitude: dart.definiteFunctionType(core.double, [])}),
     methods: () => ({
-      [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
-      [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
-      [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
-      [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
-      [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
-      [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
-      [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
-      [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
-      [dartx.close]: dart.definiteFunctionType(dart.void, []),
-      [dartx.confirm]: dart.definiteFunctionType(core.bool, [], [core.String]),
-      [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
-      [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
-      [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
-      [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
-      [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
-      [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
-      [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
-      [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
-      [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      [dartx.print]: dart.definiteFunctionType(dart.void, []),
-      [dartx.resizeBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.resizeTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
-      [_scroll_1]: dart.definiteFunctionType(dart.void, []),
-      [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [_scroll_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [_scroll_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
-      [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
-      [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
-      [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [_scrollBy_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [_scrollBy_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
-      [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
-      [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
-      [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, []),
-      [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
-      [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
-      [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
-      [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
-      [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
-      [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
-      [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
-      [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
-      [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-      [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
-      [dartx.moveTo]: dart.definiteFunctionType(dart.void, [PointOfnum()])
-    }),
-    sfields: () => ({
-      contentLoadedEvent: EventStreamProviderOfEvent(),
-      deviceMotionEvent: EventStreamProviderOfDeviceMotionEvent(),
-      deviceOrientationEvent: EventStreamProviderOfDeviceOrientationEvent(),
-      hashChangeEvent: EventStreamProviderOfEvent(),
-      loadStartEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      offlineEvent: EventStreamProviderOfEvent(),
-      onlineEvent: EventStreamProviderOfEvent(),
-      pageHideEvent: EventStreamProviderOfEvent(),
-      pageShowEvent: EventStreamProviderOfEvent(),
-      popStateEvent: EventStreamProviderOfPopStateEvent(),
-      progressEvent: EventStreamProviderOfEvent(),
-      storageEvent: EventStreamProviderOfStorageEvent(),
-      unloadEvent: EventStreamProviderOfEvent(),
-      animationEndEvent: EventStreamProviderOfAnimationEvent(),
-      animationIterationEvent: EventStreamProviderOfAnimationEvent(),
-      animationStartEvent: EventStreamProviderOfAnimationEvent(),
-      PERSISTENT: core.int,
-      TEMPORARY: core.int,
-      beforeUnloadEvent: EventStreamProviderOfBeforeUnloadEvent()
-    }),
-    sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
-  });
-  html$.Window.PERSISTENT = 1;
-  html$.Window.TEMPORARY = 0;
-  dart.defineLazy(html$.Window, {
-    get contentLoadedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
-    },
-    get deviceMotionEvent() {
-      return dart.const(new (EventStreamProviderOfDeviceMotionEvent())('devicemotion'));
-    },
-    get deviceOrientationEvent() {
-      return dart.const(new (EventStreamProviderOfDeviceOrientationEvent())('deviceorientation'));
-    },
-    get hashChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
-    },
-    get loadStartEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadstart'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get offlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('offline'));
-    },
-    get onlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('online'));
-    },
-    get pageHideEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pagehide'));
-    },
-    get pageShowEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pageshow'));
-    },
-    get popStateEvent() {
-      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
-    },
-    get progressEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('progress'));
-    },
-    get storageEvent() {
-      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
-    },
-    get unloadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('unload'));
-    },
-    get animationEndEvent() {
-      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationEnd'));
-    },
-    get animationIterationEvent() {
-      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationIteration'));
-    },
-    get animationStartEvent() {
-      return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
-    },
-    get beforeUnloadEvent() {
-      return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
-    }
-  });
-  dart.registerExtension(dart.global.Window, html$.Window);
-  dart.registerExtension(dart.global.DOMWindow, html$.Window);
-  const _returnValue = Symbol('_returnValue');
-  html$._WrappedEvent = class _WrappedEvent extends core.Object {
-    new(wrapped) {
-      this.wrapped = wrapped;
-      this[_selector] = null;
-    }
-    get bubbles() {
-      return this.wrapped[dartx.bubbles];
-    }
-    get cancelable() {
-      return this.wrapped[dartx.cancelable];
-    }
-    get currentTarget() {
-      return this.wrapped[dartx.currentTarget];
-    }
-    get defaultPrevented() {
-      return this.wrapped[dartx.defaultPrevented];
-    }
-    get eventPhase() {
-      return this.wrapped[dartx.eventPhase];
-    }
-    get target() {
-      return this.wrapped[dartx.target];
-    }
-    get timeStamp() {
-      return this.wrapped[dartx.timeStamp];
-    }
-    get type() {
-      return this.wrapped[dartx.type];
-    }
-    [_initEvent](eventTypeArg, canBubbleArg, cancelableArg) {
-      dart.throw(new core.UnsupportedError('Cannot initialize this Event.'));
-    }
-    preventDefault() {
-      this.wrapped[dartx.preventDefault]();
-    }
-    stopImmediatePropagation() {
-      this.wrapped[dartx.stopImmediatePropagation]();
-    }
-    stopPropagation() {
-      this.wrapped[dartx.stopPropagation]();
-    }
-    get matchingTarget() {
-      if (this[_selector] == null) {
-        dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
-      }
-      let currentTarget = html$.Element._check(this.currentTarget);
-      let target = html$.Element._check(this.target);
-      let matchedTarget = null;
-      do {
-        if (dart.test(target[dartx.matches](this[_selector]))) return target;
-        target = target[dartx.parent];
-      } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
-      dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
-    }
-    get path() {
-      return ListOfNode()._check(this.wrapped[dartx.path]);
-    }
-    get [_get_currentTarget]() {
-      return this.wrapped[_get_currentTarget];
-    }
-    get [_get_target]() {
-      return this.wrapped[_get_target];
-    }
-  };
-  html$._WrappedEvent[dart.implements] = () => [html$.Event];
-  dart.setSignature(html$._WrappedEvent, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
-    fields: () => ({
-      wrapped: html$.Event,
-      [_selector]: core.String
-    }),
-    getters: () => ({
-      bubbles: dart.definiteFunctionType(core.bool, []),
-      cancelable: dart.definiteFunctionType(core.bool, []),
-      currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
-      defaultPrevented: dart.definiteFunctionType(core.bool, []),
-      eventPhase: dart.definiteFunctionType(core.int, []),
-      target: dart.definiteFunctionType(html$.EventTarget, []),
-      timeStamp: dart.definiteFunctionType(core.int, []),
-      type: dart.definiteFunctionType(core.String, []),
-      matchingTarget: dart.definiteFunctionType(html$.Element, []),
-      path: dart.definiteFunctionType(core.List$(html$.Node), []),
-      [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
-      [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
-    }),
-    methods: () => ({
-      [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
-      preventDefault: dart.definiteFunctionType(dart.void, []),
-      stopImmediatePropagation: dart.definiteFunctionType(dart.void, []),
-      stopPropagation: dart.definiteFunctionType(dart.void, [])
+      '+': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
+      '-': dart.definiteFunctionType(math.Point$(T), [PointOfT()]),
+      '*': dart.definiteFunctionType(math.Point$(T), [core.num]),
+      distanceTo: dart.definiteFunctionType(core.double, [PointOfT()]),
+      squaredDistanceTo: dart.definiteFunctionType(T, [PointOfT()])
     })
   });
-  html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
-    new(base) {
-      this[_returnValue] = null;
-      super.new(base);
-    }
-    get returnValue() {
-      return this[_returnValue];
-    }
-    set returnValue(value) {
-      this[_returnValue] = value;
-      if ("returnValue" in this.wrapped) {
-        this.wrapped.returnValue = value;
-      }
-    }
-  };
-  html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
-  dart.setSignature(html$._BeforeUnloadEvent, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
-    fields: () => ({[_returnValue]: core.String}),
-    getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
-    setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
-  });
-  const _eventType = Symbol('_eventType');
-  html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
-    new(eventType) {
-      this[_eventType] = eventType;
-    }
-    forTarget(e, opts) {
-      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-      let stream = new (_EventStreamOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
-      let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
-      stream.listen(dart.fn(event => {
-        let wrapped = new html$._BeforeUnloadEvent(event);
-        controller.add(wrapped);
-      }, BeforeUnloadEventToNull()));
-      return controller.stream;
-    }
-    getEventType(target) {
-      return this[_eventType];
-    }
-    forElement(e, opts) {
-      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-      return new (_ElementEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
-    }
-    [_forElementList](e, opts) {
-      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-      return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
-    }
-  };
-  html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
-  dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
-    fields: () => ({[_eventType]: core.String}),
-    methods: () => ({
-      forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
-      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
-      forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
-      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
-    })
-  });
-  html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.WindowBase64, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
-  });
+  return Point;
+});
+math.Point = Point$();
+let const$82;
+math.Random = class Random extends core.Object {
+  static new(seed) {
+    if (seed === void 0) seed = null;
+    return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
+  }
+  static secure() {
+    return math.Random._secureRandom;
+  }
+};
+dart.setSignature(math.Random, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(math.Random, [], [core.int]),
+    secure: dart.definiteFunctionType(math.Random, [])
+  }),
+  sfields: () => ({_secureRandom: math._JSSecureRandom})
+});
+dart.defineLazy(math.Random, {
+  get _secureRandom() {
+    return new math._JSSecureRandom();
+  }
+});
+math._RectangleBase$ = dart.generic(T => {
+  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
+  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
   dart.defineExtensionNames([
-    'focus',
-    'focused',
-    'visibilityState'
-  ]);
-  html$.WindowClient = class WindowClient extends html$.Client {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.focused]() {
-      return this.focused;
-    }
-    get [dartx.visibilityState]() {
-      return this.visibilityState;
-    }
-    [dartx.focus](...args) {
-      return this.focus.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.WindowClient, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
-    fields: () => ({
-      [dartx.focused]: core.bool,
-      [dartx.visibilityState]: core.String
-    }),
-    methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
-  });
-  dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
-  dart.defineExtensionNames([
-    'onHashChange',
-    'onMessage',
-    'onOffline',
-    'onOnline',
-    'onPopState',
-    'onStorage',
-    'onUnload'
-  ]);
-  html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get onHashChange() {
-      return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
-    }
-    get onMessage() {
-      return html$.WindowEventHandlers.messageEvent.forTarget(this);
-    }
-    get onOffline() {
-      return html$.WindowEventHandlers.offlineEvent.forTarget(this);
-    }
-    get onOnline() {
-      return html$.WindowEventHandlers.onlineEvent.forTarget(this);
-    }
-    get onPopState() {
-      return html$.WindowEventHandlers.popStateEvent.forTarget(this);
-    }
-    get onStorage() {
-      return html$.WindowEventHandlers.storageEvent.forTarget(this);
-    }
-    get onUnload() {
-      return html$.WindowEventHandlers.unloadEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(html$.WindowEventHandlers, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
-    getters: () => ({
-      onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
-      onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
-      onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
-      onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
-    }),
-    sfields: () => ({
-      hashChangeEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent(),
-      offlineEvent: EventStreamProviderOfEvent(),
-      onlineEvent: EventStreamProviderOfEvent(),
-      popStateEvent: EventStreamProviderOfPopStateEvent(),
-      storageEvent: EventStreamProviderOfStorageEvent(),
-      unloadEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineExtensionMembers(html$.WindowEventHandlers, [
-    'onHashChange',
-    'onMessage',
-    'onOffline',
-    'onOnline',
-    'onPopState',
-    'onStorage',
-    'onUnload'
-  ]);
-  dart.defineLazy(html$.WindowEventHandlers, {
-    get hashChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    },
-    get offlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('offline'));
-    },
-    get onlineEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('online'));
-    },
-    get popStateEvent() {
-      return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
-    },
-    get storageEvent() {
-      return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
-    },
-    get unloadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('unload'));
-    }
-  });
-  dart.defineExtensionNames([
-    'postMessage',
-    'terminate',
-    'onError',
-    'onMessage'
-  ]);
-  html$.Worker = class Worker extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(scriptUrl) {
-      return html$.Worker._create_1(scriptUrl);
-    }
-    static _create_1(scriptUrl) {
-      return new self.Worker(scriptUrl);
-    }
-    static get supported() {
-      return typeof window.Worker != "undefined";
-    }
-    [dartx.postMessage](message, transfer) {
-      if (transfer === void 0) transfer = null;
-      if (transfer != null) {
-        let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-        this[_postMessage_1](message_1, transfer);
-        return;
-      }
-      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
-      this[_postMessage_2](message_1);
-      return;
-    }
-    [_postMessage_1](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [_postMessage_2](...args) {
-      return this.postMessage.apply(this, args);
-    }
-    [dartx.terminate](...args) {
-      return this.terminate.apply(this, args);
-    }
-    get [dartx.onError]() {
-      return html$.Worker.errorEvent.forTarget(this);
-    }
-    get [dartx.onMessage]() {
-      return html$.Worker.messageEvent.forTarget(this);
-    }
-  };
-  html$.Worker[dart.implements] = () => [html$.AbstractWorker];
-  dart.setSignature(html$.Worker, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.Worker, []),
-      new: dart.definiteFunctionType(html$.Worker, [core.String])
-    }),
-    getters: () => ({
-      [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
-      [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
-    }),
-    methods: () => ({
-      [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
-      [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
-      [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      errorEvent: EventStreamProviderOfEvent(),
-      messageEvent: EventStreamProviderOfMessageEvent()
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.defineLazy(html$.Worker, {
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get messageEvent() {
-      return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
-    }
-  });
-  dart.registerExtension(dart.global.Worker, html$.Worker);
-  html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.WorkerConsole, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
-  });
-  dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
-  dart.defineExtensionNames([
-    'clearMarks',
-    'clearMeasures',
-    'getEntries',
-    'getEntriesByName',
-    'getEntriesByType',
-    'mark',
-    'measure',
-    'now',
-    'clearResourceTimings',
-    'setResourceTimingBufferSize',
-    'memory'
-  ]);
-  html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.memory]() {
-      return this.memory;
-    }
-    [dartx.clearMarks](...args) {
-      return this.clearMarks.apply(this, args);
-    }
-    [dartx.clearMeasures](...args) {
-      return this.clearMeasures.apply(this, args);
-    }
-    [dartx.getEntries](...args) {
-      return this.getEntries.apply(this, args);
-    }
-    [dartx.getEntriesByName](...args) {
-      return this.getEntriesByName.apply(this, args);
-    }
-    [dartx.getEntriesByType](...args) {
-      return this.getEntriesByType.apply(this, args);
-    }
-    [dartx.mark](...args) {
-      return this.mark.apply(this, args);
-    }
-    [dartx.measure](...args) {
-      return this.measure.apply(this, args);
-    }
-    [dartx.now](...args) {
-      return this.now.apply(this, args);
-    }
-    [dartx.clearResourceTimings](...args) {
-      return this.webkitClearResourceTimings.apply(this, args);
-    }
-    [dartx.setResourceTimingBufferSize](...args) {
-      return this.webkitSetResourceTimingBufferSize.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.WorkerPerformance, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
-    fields: () => ({[dartx.memory]: html$.MemoryInfo}),
-    methods: () => ({
-      [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
-      [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
-      [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
-      [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
-      [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.now]: dart.definiteFunctionType(core.double, []),
-      [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
-  dart.defineExtensionNames([
-    'createExpression',
-    'createNSResolver',
-    'evaluate'
-  ]);
-  html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.XPathEvaluator._create_1();
-    }
-    static _create_1() {
-      return new self.XPathEvaluator();
-    }
-    [dartx.createExpression](...args) {
-      return this.createExpression.apply(this, args);
-    }
-    [dartx.createNSResolver](...args) {
-      return this.createNSResolver.apply(this, args);
-    }
-    [dartx.evaluate](...args) {
-      return this.evaluate.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XPathEvaluator, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.XPathEvaluator, []),
-      new: dart.definiteFunctionType(html$.XPathEvaluator, [])
-    }),
-    methods: () => ({
-      [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
-      [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
-      [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
-  dart.defineExtensionNames([
-    'evaluate'
-  ]);
-  html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.evaluate](...args) {
-      return this.evaluate.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XPathExpression, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
-    methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
-  });
-  dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
-  dart.defineExtensionNames([
-    'lookupNamespaceUri'
-  ]);
-  html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.lookupNamespaceUri](...args) {
-      return this.lookupNamespaceURI.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XPathNSResolver, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
-    methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
-  });
-  dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
-  dart.defineExtensionNames([
-    'iterateNext',
-    'snapshotItem',
-    'booleanValue',
-    'invalidIteratorState',
-    'numberValue',
-    'resultType',
-    'singleNodeValue',
-    'snapshotLength',
-    'stringValue'
-  ]);
-  html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.booleanValue]() {
-      return this.booleanValue;
-    }
-    get [dartx.invalidIteratorState]() {
-      return this.invalidIteratorState;
-    }
-    get [dartx.numberValue]() {
-      return this.numberValue;
-    }
-    get [dartx.resultType]() {
-      return this.resultType;
-    }
-    get [dartx.singleNodeValue]() {
-      return this.singleNodeValue;
-    }
-    get [dartx.snapshotLength]() {
-      return this.snapshotLength;
-    }
-    get [dartx.stringValue]() {
-      return this.stringValue;
-    }
-    [dartx.iterateNext](...args) {
-      return this.iterateNext.apply(this, args);
-    }
-    [dartx.snapshotItem](...args) {
-      return this.snapshotItem.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XPathResult, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
-    fields: () => ({
-      [dartx.booleanValue]: core.bool,
-      [dartx.invalidIteratorState]: core.bool,
-      [dartx.numberValue]: core.double,
-      [dartx.resultType]: core.int,
-      [dartx.singleNodeValue]: html$.Node,
-      [dartx.snapshotLength]: core.int,
-      [dartx.stringValue]: core.String
-    }),
-    methods: () => ({
-      [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
-      [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
-    }),
-    sfields: () => ({
-      ANY_TYPE: core.int,
-      ANY_UNORDERED_NODE_TYPE: core.int,
-      BOOLEAN_TYPE: core.int,
-      FIRST_ORDERED_NODE_TYPE: core.int,
-      NUMBER_TYPE: core.int,
-      ORDERED_NODE_ITERATOR_TYPE: core.int,
-      ORDERED_NODE_SNAPSHOT_TYPE: core.int,
-      STRING_TYPE: core.int,
-      UNORDERED_NODE_ITERATOR_TYPE: core.int,
-      UNORDERED_NODE_SNAPSHOT_TYPE: core.int
-    })
-  });
-  html$.XPathResult.ANY_TYPE = 0;
-  html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
-  html$.XPathResult.BOOLEAN_TYPE = 3;
-  html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
-  html$.XPathResult.NUMBER_TYPE = 1;
-  html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
-  html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
-  html$.XPathResult.STRING_TYPE = 2;
-  html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
-  html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
-  dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
-  html$.XmlDocument = class XmlDocument extends html$.Document {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$.XmlDocument, {
-    constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
-  });
-  dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
-  dart.defineExtensionNames([
-    'serializeToString'
-  ]);
-  html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.XmlSerializer._create_1();
-    }
-    static _create_1() {
-      return new XMLSerializer();
-    }
-    [dartx.serializeToString](...args) {
-      return this.serializeToString.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XmlSerializer, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.XmlSerializer, []),
-      new: dart.definiteFunctionType(html$.XmlSerializer, [])
-    }),
-    methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
-  dart.defineExtensionNames([
-    'clearParameters',
-    'getParameter',
-    'importStylesheet',
-    'removeParameter',
-    'reset',
-    'setParameter',
-    'transformToDocument',
-    'transformToFragment'
-  ]);
-  html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$.XsltProcessor._create_1();
-    }
-    static _create_1() {
-      return new XSLTProcessor();
-    }
-    static get supported() {
-      return !!window.XSLTProcessor;
-    }
-    [dartx.clearParameters](...args) {
-      return this.clearParameters.apply(this, args);
-    }
-    [dartx.getParameter](...args) {
-      return this.getParameter.apply(this, args);
-    }
-    [dartx.importStylesheet](...args) {
-      return this.importStylesheet.apply(this, args);
-    }
-    [dartx.removeParameter](...args) {
-      return this.removeParameter.apply(this, args);
-    }
-    [dartx.reset](...args) {
-      return this.reset.apply(this, args);
-    }
-    [dartx.setParameter](...args) {
-      return this.setParameter.apply(this, args);
-    }
-    [dartx.transformToDocument](...args) {
-      return this.transformToDocument.apply(this, args);
-    }
-    [dartx.transformToFragment](...args) {
-      return this.transformToFragment.apply(this, args);
-    }
-  };
-  dart.setSignature(html$.XsltProcessor, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$.XsltProcessor, []),
-      new: dart.definiteFunctionType(html$.XsltProcessor, [])
-    }),
-    methods: () => ({
-      [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
-      [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      [dartx.reset]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-      [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
-      [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
-  dart.defineExtensionNames([
-    'name',
-    'value'
-  ]);
-  html$._Attr = class _Attr extends html$.Node {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.setSignature(html$._Attr, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
-    fields: () => ({
-      [dartx.name]: core.String,
-      [dartx.value]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.Attr, html$._Attr);
-  html$._Cache = class _Cache extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._Cache, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
-  });
-  dart.registerExtension(dart.global.Cache, html$._Cache);
-  html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._CanvasPathMethods, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
-  });
-  dart.defineExtensionNames([
+    'right',
+    'bottom',
     'toString',
     '==',
     'hashCode',
@@ -93857,1533 +53629,91 @@
     'topLeft',
     'topRight',
     'bottomRight',
-    'bottomLeft',
-    'bottom',
-    'height',
-    'left',
-    'right',
-    'top',
-    'width'
+    'bottomLeft'
   ]);
-  html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
-    [dartx.toString]() {
-      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
-    }
-    [dartx['==']](other) {
-      if (!RectangleOfnum().is(other)) return false;
-      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
-    }
-    get [dartx.hashCode]() {
-      return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
-    }
-    [dartx.intersection](other) {
-      let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
-      let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-      if (dart.notNull(x0) <= dart.notNull(x1)) {
-        let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
-        let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-        if (dart.notNull(y0) <= dart.notNull(y1)) {
-          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
-        }
-      }
-      return null;
-    }
-    [dartx.intersects](other) {
-      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-    }
-    [dartx.boundingBox](other) {
-      let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-      let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-      let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
-      let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
-      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
-    }
-    [dartx.containsRectangle](another) {
-      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
-    }
-    [dartx.containsPoint](another) {
-      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
-    }
-    get [dartx.topLeft]() {
-      return new (PointOfnum())(this[dartx.left], this[dartx.top]);
-    }
-    get [dartx.topRight]() {
-      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
-    }
-    get [dartx.bottomRight]() {
-      return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-    }
-    get [dartx.bottomLeft]() {
-      return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.bottom]() {
-      return this.bottom;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.left]() {
-      return this.left;
-    }
-    get [dartx.right]() {
-      return this.right;
-    }
-    get [dartx.top]() {
-      return this.top;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-  };
-  html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
-  dart.setSignature(html$._ClientRect, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
-    fields: () => ({
-      [dartx.bottom]: core.double,
-      [dartx.height]: core.double,
-      [dartx.left]: core.double,
-      [dartx.right]: core.double,
-      [dartx.top]: core.double,
-      [dartx.width]: core.double
-    }),
-    getters: () => ({
-      [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
-      [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), [])
-    }),
-    methods: () => ({
-      [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
-      [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-      [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
-      [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-      [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
-    })
-  });
-  dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
-  html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
-    static combine(hash, value) {
-      hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
-      hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
-      return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
-    }
-    static finish(hash) {
-      hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
-      hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
-      return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
-    }
-    static hash2(a, b) {
-      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
-    }
-    static hash4(a, b, c, d) {
-      return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
-    }
-  };
-  dart.setSignature(html$._JenkinsSmiHash, {
-    statics: () => ({
-      combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      finish: dart.definiteFunctionType(core.int, [core.int]),
-      hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
-      hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
-    }),
-    names: ['combine', 'finish', 'hash2', 'hash4']
-  });
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.item](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
-  dart.setSignature(html$._ClientRectList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, RectangleOfnum()]),
-      [__getter__]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
-      [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
-  dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
-  dart.setSignature(html$._CssRuleList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
-      [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
-  html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._DOMFileSystemSync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
-  });
-  dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
-  html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._EntrySync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
-  });
-  dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
-  html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._DirectoryEntrySync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
-  });
-  dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
-  html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._DirectoryReaderSync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
-  });
-  dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
-  html$._DocumentType = class _DocumentType extends html$.Node {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  html$._DocumentType[dart.implements] = () => [html$.ChildNode];
-  dart.setSignature(html$._DocumentType, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
-  });
-  dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
-  dart.defineExtensionNames([
-    'height',
-    'height',
-    'width',
-    'width',
-    'x',
-    'x',
-    'y',
-    'y'
-  ]);
-  html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(x, y, width, height) {
-      if (x === void 0) x = null;
-      if (y === void 0) y = null;
-      if (width === void 0) width = null;
-      if (height === void 0) height = null;
-      if (height != null) {
-        return html$._DomRect._create_1(x, y, width, height);
-      }
-      if (width != null) {
-        return html$._DomRect._create_2(x, y, width);
-      }
-      if (y != null) {
-        return html$._DomRect._create_3(x, y);
-      }
-      if (x != null) {
-        return html$._DomRect._create_4(x);
-      }
-      return html$._DomRect._create_5();
-    }
-    static _create_1(x, y, width, height) {
-      return new DOMRect(x, y, width, height);
-    }
-    static _create_2(x, y, width) {
-      return new DOMRect(x, y, width);
-    }
-    static _create_3(x, y) {
-      return new DOMRect(x, y);
-    }
-    static _create_4(x) {
-      return new DOMRect(x);
-    }
-    static _create_5() {
-      return new DOMRect();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(html$._DomRect, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._DomRect, []),
-      new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
-    }),
-    setters: () => ({
-      [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.width]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
-      _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
-      _create_5: dart.definiteFunctionType(html$._DomRect, [])
-    }),
-    names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
-  });
-  dart.registerExtension(dart.global.DOMRect, html$._DomRect);
-  html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._FileEntrySync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
-  });
-  dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
-  html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return html$._FileReaderSync._create_1();
-    }
-    static _create_1() {
-      return new FileReaderSync();
-    }
-  };
-  dart.setSignature(html$._FileReaderSync, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._FileReaderSync, []),
-      new: dart.definiteFunctionType(html$._FileReaderSync, [])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
-  html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._FileWriterSync, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
-  });
-  dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
-  dart.setSignature(html$._GamepadList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
-      [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
-  html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [_item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  dart.setSignature(html$._HTMLAllCollection, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
-    methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
-  });
-  dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
-  html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
-  dart.setSignature(html$._HTMLAppletElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
-      created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
-  html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
-  dart.setSignature(html$._HTMLDirectoryElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
-      created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
-  html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
-  dart.setSignature(html$._HTMLFontElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLFontElement, []),
-      created: dart.definiteFunctionType(html$._HTMLFontElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
-  html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
-  dart.setSignature(html$._HTMLFrameElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
-      created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
-  html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
-  html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
-  dart.setSignature(html$._HTMLFrameSetElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
-      created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
-  html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
-  dart.setSignature(html$._HTMLMarqueeElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
-      created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'getNamedItem',
-    'getNamedItemNS',
-    'item',
-    'removeNamedItem',
-    'removeNamedItemNS',
-    'setNamedItem',
-    'setNamedItemNS'
-  ]);
-  html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.getNamedItem](...args) {
-      return this.getNamedItem.apply(this, args);
-    }
-    [dartx.getNamedItemNS](...args) {
-      return this.getNamedItemNS.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-    [dartx.removeNamedItem](...args) {
-      return this.removeNamedItem.apply(this, args);
-    }
-    [dartx.removeNamedItemNS](...args) {
-      return this.removeNamedItemNS.apply(this, args);
-    }
-    [dartx.setNamedItem](...args) {
-      return this.setNamedItem.apply(this, args);
-    }
-    [dartx.setNamedItemNS](...args) {
-      return this.setNamedItemNS.apply(this, args);
-    }
-  };
-  html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-  dart.setSignature(html$._NamedNodeMap, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
-      [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
-      [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
-      [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
-      [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
-      [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
-      [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
-      [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
-    })
-  });
-  dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
-  dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
-  html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._PagePopupController, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
-  });
-  dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
-  dart.defineExtensionNames([
-    'clone',
-    'context',
-    'credentials',
-    'headers',
-    'mode',
-    'referrer',
-    'url'
-  ]);
-  html$._Request = class _Request extends html$.Body {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(input, requestInitDict) {
-      if (requestInitDict === void 0) requestInitDict = null;
-      if (requestInitDict != null) {
-        let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
-        return html$._Request._create_1(input, requestInitDict_1);
-      }
-      return html$._Request._create_2(input);
-    }
-    static _create_1(input, requestInitDict) {
-      return new Request(input, requestInitDict);
-    }
-    static _create_2(input) {
-      return new Request(input);
-    }
-    get [dartx.context]() {
-      return this.context;
-    }
-    get [dartx.credentials]() {
-      return this.credentials;
-    }
-    get [dartx.headers]() {
-      return this.headers;
-    }
-    get [dartx.mode]() {
-      return this.mode;
-    }
-    get [dartx.referrer]() {
-      return this.referrer;
-    }
-    get [dartx.url]() {
-      return this.url;
-    }
-    [dartx.clone](...args) {
-      return this.clone.apply(this, args);
-    }
-  };
-  dart.setSignature(html$._Request, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._Request, []),
-      new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
-    }),
-    fields: () => ({
-      [dartx.context]: core.String,
-      [dartx.credentials]: core.String,
-      [dartx.headers]: html$.Headers,
-      [dartx.mode]: core.String,
-      [dartx.referrer]: core.String,
-      [dartx.url]: core.String
-    }),
-    methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.Request, html$._Request);
-  html$._Response = class _Response extends html$.Body {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(body, responseInitDict) {
-      if (body === void 0) body = null;
-      if (responseInitDict === void 0) responseInitDict = null;
-      if (responseInitDict != null) {
-        let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
-        return html$._Response._create_1(body, responseInitDict_1);
-      }
-      if (body != null) {
-        return html$._Response._create_2(body);
-      }
-      return html$._Response._create_3();
-    }
-    static _create_1(body, responseInitDict) {
-      return new Response(body, responseInitDict);
-    }
-    static _create_2(body) {
-      return new Response(body);
-    }
-    static _create_3() {
-      return new Response();
-    }
-  };
-  dart.setSignature(html$._Response, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._Response, []),
-      new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
-      _create_3: dart.definiteFunctionType(html$._Response, [])
-    }),
-    names: ['_create_1', '_create_2', '_create_3']
-  });
-  dart.registerExtension(dart.global.Response, html$._Response);
-  html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
-  dart.setSignature(html$._ServiceWorker, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
-  });
-  dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
-  dart.setSignature(html$._SpeechRecognitionResultList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
-      [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[index];
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [__getter__](...args) {
-      return this.__getter__.apply(this, args);
-    }
-    [dartx.item](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
-  dart.setSignature(html$._StyleSheetList, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
-      [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
-      [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
-  html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._SubtleCrypto, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
-  });
-  dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
-  html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(cssValue) {
-      if (cssValue === void 0) cssValue = null;
-      if (cssValue != null) {
-        return html$._WebKitCSSMatrix._create_1(cssValue);
-      }
-      return html$._WebKitCSSMatrix._create_2();
-    }
-    static _create_1(cssValue) {
-      return new WebKitCSSMatrix(cssValue);
-    }
-    static _create_2() {
-      return new WebKitCSSMatrix();
-    }
-  };
-  dart.setSignature(html$._WebKitCSSMatrix, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
-      new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
-    }),
-    statics: () => ({
-      _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
-      _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
-    }),
-    names: ['_create_1', '_create_2']
-  });
-  dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
-  html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._WindowTimers, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
-  });
-  html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
-  dart.setSignature(html$._WorkerLocation, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
-  });
-  dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
-  html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
-  dart.setSignature(html$._WorkerNavigator, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
-  });
-  dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
-  html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(html$._XMLHttpRequestProgressEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
-  });
-  dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
-  const _matches = Symbol('_matches');
-  html$._AttributeMap = class _AttributeMap extends core.Object {
-    new(element) {
-      this[_element$] = element;
-    }
-    addAll(other) {
-      other[dartx.forEach](dart.fn((k, v) => {
-        this._set(k, v);
-      }, StringAndStringToNull()));
-    }
-    containsValue(value) {
-      for (let v of this.values) {
-        if (dart.equals(value, v)) {
-          return true;
-        }
-      }
-      return false;
-    }
-    putIfAbsent(key, ifAbsent) {
-      if (!dart.test(this[dartx.containsKey](key))) {
-        this._set(key, ifAbsent());
-      }
-      return this._get(key);
-    }
-    clear() {
-      for (let key of this.keys) {
-        this[dartx.remove](key);
-      }
-    }
-    forEach(f) {
-      for (let key of this.keys) {
-        let value = this._get(key);
-        f(key, value);
-      }
-    }
-    get keys() {
-      let attributes = this[_element$][_attributes$];
-      let keys = JSArrayOfString().of([]);
-      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
-        let attr = html$._Attr._check(attributes[dartx._get](i));
-        if (dart.test(this[_matches](attr))) {
-          keys[dartx.add](attr[dartx.name]);
-        }
-      }
-      return keys;
-    }
-    get values() {
-      let attributes = this[_element$][_attributes$];
-      let values = JSArrayOfString().of([]);
-      for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
-        let attr = html$._Attr._check(attributes[dartx._get](i));
-        if (dart.test(this[_matches](attr))) {
-          values[dartx.add](attr[dartx.value]);
-        }
-      }
-      return values;
-    }
-    get isEmpty() {
-      return this[dartx.length] == 0;
-    }
-    get isNotEmpty() {
-      return !dart.test(this.isEmpty);
-    }
-  };
-  html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
-  dart.setSignature(html$._AttributeMap, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
-    fields: () => ({[_element$]: html$.Element}),
-    getters: () => ({
-      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
-      clear: dart.definiteFunctionType(dart.void, []),
-      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
-    })
-  });
-  dart.defineExtensionMembers(html$._AttributeMap, [
-    'addAll',
-    'containsValue',
-    'putIfAbsent',
-    'clear',
-    'forEach',
-    'keys',
-    'values',
-    'isEmpty',
-    'isNotEmpty'
-  ]);
-  html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
-    new(element) {
-      super.new(element);
-    }
-    containsKey(key) {
-      return this[_element$][_hasAttribute](core.String._check(key));
-    }
-    _get(key) {
-      return this[_element$][dartx.getAttribute](core.String._check(key));
-    }
-    _set(key, value) {
-      this[_element$][dartx.setAttribute](key, value);
-      return value;
-    }
-    remove(key) {
-      let value = this[_element$][dartx.getAttribute](core.String._check(key));
-      this[_element$][_removeAttribute](core.String._check(key));
-      return value;
-    }
-    get length() {
-      return this.keys[dartx.length];
-    }
-    [_matches](node) {
-      return node[_namespaceUri] == null;
-    }
-  };
-  dart.setSignature(html$._ElementAttributeMap, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
-    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-      _get: dart.definiteFunctionType(core.String, [core.Object]),
-      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      remove: dart.definiteFunctionType(core.String, [core.Object]),
-      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
-    })
-  });
-  dart.defineExtensionMembers(html$._ElementAttributeMap, [
-    'containsKey',
-    '_get',
-    '_set',
-    'remove',
-    'length'
-  ]);
-  const _namespace = Symbol('_namespace');
-  html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
-    new(element, namespace) {
-      this[_namespace] = namespace;
-      super.new(element);
-    }
-    containsKey(key) {
-      return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
-    }
-    _get(key) {
-      return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
-    }
-    _set(key, value) {
-      this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
-      return value;
-    }
-    remove(key) {
-      let value = this._get(key);
-      this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
-      return value;
-    }
-    get length() {
-      return this.keys[dartx.length];
-    }
-    [_matches](node) {
-      return node[_namespaceUri] == this[_namespace];
-    }
-  };
-  dart.setSignature(html$._NamespacedAttributeMap, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
-    fields: () => ({[_namespace]: core.String}),
-    getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
-    methods: () => ({
-      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-      _get: dart.definiteFunctionType(core.String, [core.Object]),
-      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      remove: dart.definiteFunctionType(core.String, [core.Object]),
-      [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
-    })
-  });
-  dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
-    'containsKey',
-    '_get',
-    '_set',
-    'remove',
-    'length'
-  ]);
-  const _attr = Symbol('_attr');
-  const _strip = Symbol('_strip');
-  const _toHyphenedName = Symbol('_toHyphenedName');
-  const _toCamelCase = Symbol('_toCamelCase');
-  html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
-    new(attributes) {
-      this[_attributes$] = attributes;
-    }
-    addAll(other) {
-      other[dartx.forEach](dart.fn((k, v) => {
-        this._set(k, v);
-      }, StringAndStringToNull()));
-    }
-    containsValue(value) {
-      return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
-    }
-    containsKey(key) {
-      return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
-    }
-    _get(key) {
-      return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
-    }
-    _set(key, value) {
-      this[_attributes$][dartx._set](this[_attr](key), value);
-      return value;
-    }
-    putIfAbsent(key, ifAbsent) {
-      return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
-    }
-    remove(key) {
-      return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
-    }
-    clear() {
-      for (let key of this.keys) {
-        this.remove(key);
-      }
-    }
-    forEach(f) {
-      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
-        if (dart.test(this[_matches](key))) {
-          f(this[_strip](key), value);
-        }
-      }, StringAndStringToNull()));
-    }
-    get keys() {
-      let keys = JSArrayOfString().of([]);
-      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
-        if (dart.test(this[_matches](key))) {
-          keys[dartx.add](this[_strip](key));
-        }
-      }, StringAndStringToNull()));
-      return keys;
-    }
-    get values() {
-      let values = JSArrayOfString().of([]);
-      this[_attributes$][dartx.forEach](dart.fn((key, value) => {
-        if (dart.test(this[_matches](key))) {
-          values[dartx.add](value);
-        }
-      }, StringAndStringToNull()));
-      return values;
-    }
-    get length() {
-      return this.keys[dartx.length];
-    }
-    get isEmpty() {
-      return this.length == 0;
-    }
-    get isNotEmpty() {
-      return !dart.test(this.isEmpty);
-    }
-    [_attr](key) {
-      return dart.str`data-${this[_toHyphenedName](key)}`;
-    }
-    [_matches](key) {
-      return key[dartx.startsWith]('data-');
-    }
-    [_strip](key) {
-      return this[_toCamelCase](key[dartx.substring](5));
-    }
-    [_toCamelCase](hyphenedName, opts) {
-      let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
-      let segments = hyphenedName[dartx.split]('-');
-      let start = dart.test(startUppercase) ? 0 : 1;
-      for (let i = start; i < dart.notNull(segments[dartx.length]); i++) {
-        let segment = segments[dartx._get](i);
-        if (dart.notNull(segment[dartx.length]) > 0) {
-          segments[dartx._set](i, dart.str`${segment[dartx._get](0)[dartx.toUpperCase]()}${segment[dartx.substring](1)}`);
-        }
-      }
-      return segments[dartx.join]('');
-    }
-    [_toHyphenedName](word) {
-      let sb = new core.StringBuffer();
-      for (let i = 0; i < dart.notNull(word[dartx.length]); i++) {
-        let lower = word[dartx._get](i)[dartx.toLowerCase]();
-        if (word[dartx._get](i) != lower && i > 0) sb.write('-');
-        sb.write(lower);
-      }
-      return sb.toString();
-    }
-  };
-  html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
-  dart.setSignature(html$._DataAttributeMap, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
-    fields: () => ({[_attributes$]: MapOfString$String()}),
-    getters: () => ({
-      keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      values: dart.definiteFunctionType(core.Iterable$(core.String), []),
-      length: dart.definiteFunctionType(core.int, []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, [])
-    }),
-    methods: () => ({
-      addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-      containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
-      containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
-      _get: dart.definiteFunctionType(core.String, [core.Object]),
-      _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-      putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
-      remove: dart.definiteFunctionType(core.String, [core.Object]),
-      clear: dart.definiteFunctionType(dart.void, []),
-      forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
-      [_attr]: dart.definiteFunctionType(core.String, [core.String]),
-      [_matches]: dart.definiteFunctionType(core.bool, [core.String]),
-      [_strip]: dart.definiteFunctionType(core.String, [core.String]),
-      [_toCamelCase]: dart.definiteFunctionType(core.String, [core.String], {startUppercase: core.bool}),
-      [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
-    })
-  });
-  dart.defineExtensionMembers(html$._DataAttributeMap, [
-    'addAll',
-    'containsValue',
-    'containsKey',
-    '_get',
-    '_set',
-    'putIfAbsent',
-    'remove',
-    'clear',
-    'forEach',
-    'keys',
-    'values',
-    'length',
-    'isEmpty',
-    'isNotEmpty'
-  ]);
-  html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
-  html$.WindowBase = class WindowBase extends core.Object {};
-  html$.WindowBase[dart.implements] = () => [html$.EventTarget];
-  html$.LocationBase = class LocationBase extends core.Object {};
-  html$.HistoryBase = class HistoryBase extends core.Object {};
-  html$.CssClassSet = class CssClassSet extends core.Object {};
-  html$.CssClassSet[dart.implements] = () => [SetOfString()];
-  const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
-  html$.CssRect = class CssRect extends core.Object {
-    new(element) {
-      this[_element$] = element;
-    }
-    set height(newHeight) {
-      dart.throw(new core.UnsupportedError("Can only set height for content rect."));
-    }
-    set width(newWidth) {
-      dart.throw(new core.UnsupportedError("Can only set width for content rect."));
-    }
-    [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
-      let styles = this[_element$][dartx.getComputedStyle]();
-      let val = 0;
-      for (let measurement of dimensions) {
-        if (augmentingMeasurement == html$._MARGIN) {
-          val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
-        }
-        if (augmentingMeasurement == html$._CONTENT) {
-          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
-        }
-        if (augmentingMeasurement != html$._MARGIN) {
-          val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
-        }
-      }
-      return val;
+  class _RectangleBase extends core.Object {
+    new() {
     }
     get right() {
-      return dart.notNull(this.left) + dart.notNull(this.width);
+      return dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]);
     }
     get bottom() {
-      return dart.notNull(this.top) + dart.notNull(this.height);
+      return dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
     }
     toString() {
-      return dart.str`Rectangle (${this.left}, ${this.top}) ${this.width} x ${this.height}`;
+      return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
     }
     ['=='](other) {
       if (!RectangleOfnum().is(other)) return false;
-      return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
+      let otherRect = RectangleOfnum().as(other);
+      return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
     }
     get hashCode() {
-      return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
+      return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
     }
     intersection(other) {
-      let x0 = math.max(core.num)(this.left, other[dartx.left]);
-      let x1 = math.min(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+      RectangleOfT()._check(other);
+      let x0 = math.max(T)(this[dartx.left], other[dartx.left]);
+      let x1 = math.min(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
       if (dart.notNull(x0) <= dart.notNull(x1)) {
-        let y0 = math.max(core.num)(this.top, other[dartx.top]);
-        let y1 = math.min(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+        let y0 = math.max(T)(this[dartx.top], other[dartx.top]);
+        let y1 = math.min(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
         if (dart.notNull(y0) <= dart.notNull(y1)) {
-          return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
+          return new (RectangleOfT())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
         }
       }
       return null;
     }
     intersects(other) {
-      return dart.notNull(this.left) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this.top) + dart.notNull(this.height);
+      return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
     }
     boundingBox(other) {
-      let right = math.max(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
-      let bottom = math.max(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
-      let left = math.min(core.num)(this.left, other[dartx.left]);
-      let top = math.min(core.num)(this.top, other[dartx.top]);
-      return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
+      RectangleOfT()._check(other);
+      let right = math.max(T)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+      let bottom = math.max(T)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+      let left = math.min(T)(this[dartx.left], other[dartx.left]);
+      let top = math.min(T)(this[dartx.top], other[dartx.top]);
+      return new (RectangleOfT())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
     }
     containsRectangle(another) {
-      return dart.notNull(this.left) <= dart.notNull(another[dartx.left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this.top) <= dart.notNull(another[dartx.top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
+      return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
     }
     containsPoint(another) {
-      return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
+      return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
     }
     get topLeft() {
-      return new (PointOfnum())(this.left, this.top);
+      return new (PointOfT())(this[dartx.left], this[dartx.top]);
     }
     get topRight() {
-      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), this.top);
+      return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
     }
     get bottomRight() {
-      return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
+      return new (PointOfT())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
     }
     get bottomLeft() {
-      return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
+      return new (PointOfT())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
     }
-  };
-  html$.CssRect[dart.implements] = () => [RectangleOfnum()];
-  dart.setSignature(html$.CssRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
-    fields: () => ({[_element$]: html$.Element}),
+  }
+  dart.addTypeTests(_RectangleBase);
+  dart.setSignature(_RectangleBase, {
+    constructors: () => ({new: dart.definiteFunctionType(math._RectangleBase$(T), [])}),
     getters: () => ({
-      right: dart.definiteFunctionType(core.num, []),
-      bottom: dart.definiteFunctionType(core.num, []),
-      topLeft: dart.definiteFunctionType(math.Point$(core.num), []),
-      topRight: dart.definiteFunctionType(math.Point$(core.num), []),
-      bottomRight: dart.definiteFunctionType(math.Point$(core.num), []),
-      bottomLeft: dart.definiteFunctionType(math.Point$(core.num), [])
-    }),
-    setters: () => ({
-      height: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-      width: dart.definiteFunctionType(dart.void, [dart.dynamic])
+      right: dart.definiteFunctionType(T, []),
+      bottom: dart.definiteFunctionType(T, []),
+      topLeft: dart.definiteFunctionType(math.Point$(T), []),
+      topRight: dart.definiteFunctionType(math.Point$(T), []),
+      bottomRight: dart.definiteFunctionType(math.Point$(T), []),
+      bottomLeft: dart.definiteFunctionType(math.Point$(T), [])
     }),
     methods: () => ({
-      [_addOrSubtractToBoxModel]: dart.definiteFunctionType(core.num, [ListOfString(), core.String]),
-      intersection: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+      intersection: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
       intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
-      boundingBox: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+      boundingBox: dart.definiteFunctionType(math.Rectangle$(T), [RectangleOfT()]),
       containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
       containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
     })
   });
-  dart.defineExtensionMembers(html$.CssRect, [
+  dart.defineExtensionMembers(_RectangleBase, [
     'toString',
     '==',
     'intersection',
@@ -95399,7632 +53729,30 @@
     'bottomRight',
     'bottomLeft'
   ]);
-  html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
-    new(element) {
-      super.new(element);
-    }
-    get height() {
-      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
-    }
-    get width() {
-      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
-    }
-    set height(newHeight) {
-      if (html$.Dimension.is(newHeight)) {
-        if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
-        this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
-      } else if (typeof newHeight == 'number') {
-        if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
-        this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
-      } else {
-        dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
-      }
-    }
-    set width(newWidth) {
-      if (html$.Dimension.is(newWidth)) {
-        if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
-        this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
-      } else if (typeof newWidth == 'number') {
-        if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
-        this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
-      } else {
-        dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
-      }
-    }
+  return _RectangleBase;
+});
+math._RectangleBase = _RectangleBase();
+math.Rectangle$ = dart.generic(T => {
+  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
+  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
+  dart.defineExtensionNames([
+    'left',
+    'top',
+    'width',
+    'height'
+  ]);
+  class Rectangle extends math._RectangleBase$(T) {
     get left() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
+      return this[left$];
+    }
+    set left(value) {
+      super.left = value;
     }
     get top() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
+      return this[top$];
     }
-  };
-  dart.setSignature(html$._ContentCssRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
-    getters: () => ({
-      height: dart.definiteFunctionType(core.num, []),
-      width: dart.definiteFunctionType(core.num, []),
-      left: dart.definiteFunctionType(core.num, []),
-      top: dart.definiteFunctionType(core.num, [])
-    })
-  });
-  dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
-  const _elementList = Symbol('_elementList');
-  html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
-    new(elementList) {
-      this[_elementList] = null;
-      super.new(elementList[dartx.first]);
-      this[_elementList] = elementList;
-    }
-    set height(newHeight) {
-      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
-    }
-    get height() {
-      return super.height;
-    }
-    set width(newWidth) {
-      this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
-    }
-    get width() {
-      return super.width;
-    }
-  };
-  dart.setSignature(html$._ContentCssListRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
-    fields: () => ({[_elementList]: ListOfElement()})
-  });
-  html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
-    new(element) {
-      super.new(html$.Element._check(element));
-    }
-    get height() {
-      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
-    }
-    set height(value) {
-      super.height = value;
-    }
-    get width() {
-      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
-    }
-    set width(value) {
-      super.width = value;
-    }
-    get left() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
-    }
-    get top() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
-    }
-  };
-  dart.setSignature(html$._PaddingCssRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
-    getters: () => ({
-      height: dart.definiteFunctionType(core.num, []),
-      width: dart.definiteFunctionType(core.num, []),
-      left: dart.definiteFunctionType(core.num, []),
-      top: dart.definiteFunctionType(core.num, [])
-    })
-  });
-  dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
-  html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
-    new(element) {
-      super.new(html$.Element._check(element));
-    }
-    get height() {
-      return this[_element$][dartx.offsetHeight];
-    }
-    set height(value) {
-      super.height = value;
-    }
-    get width() {
-      return this[_element$][dartx.offsetWidth];
-    }
-    set width(value) {
-      super.width = value;
-    }
-    get left() {
-      return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
-    }
-    get top() {
-      return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
-    }
-  };
-  dart.setSignature(html$._BorderCssRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
-    getters: () => ({
-      height: dart.definiteFunctionType(core.num, []),
-      width: dart.definiteFunctionType(core.num, []),
-      left: dart.definiteFunctionType(core.num, []),
-      top: dart.definiteFunctionType(core.num, [])
-    })
-  });
-  dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
-  html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
-    new(element) {
-      super.new(html$.Element._check(element));
-    }
-    get height() {
-      return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
-    }
-    set height(value) {
-      super.height = value;
-    }
-    get width() {
-      return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
-    }
-    set width(value) {
-      super.width = value;
-    }
-    get left() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
-    }
-    get top() {
-      return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
-    }
-  };
-  dart.setSignature(html$._MarginCssRect, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
-    getters: () => ({
-      height: dart.definiteFunctionType(core.num, []),
-      width: dart.definiteFunctionType(core.num, []),
-      left: dart.definiteFunctionType(core.num, []),
-      top: dart.definiteFunctionType(core.num, [])
-    })
-  });
-  dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
-  dart.defineLazy(html$, {
-    get _HEIGHT() {
-      return JSArrayOfString().of(['top', 'bottom']);
-    }
-  });
-  dart.defineLazy(html$, {
-    get _WIDTH() {
-      return JSArrayOfString().of(['right', 'left']);
-    }
-  });
-  html$._CONTENT = 'content';
-  html$._PADDING = 'padding';
-  html$._MARGIN = 'margin';
-  const _sets = Symbol('_sets');
-  const _validateToken = Symbol('_validateToken');
-  html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
-    [_validateToken](value) {
-      if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
-      dart.throw(new core.ArgumentError.value(value, 'value', 'Not a valid class token'));
-    }
-    toString() {
-      return this.readClasses().join(' ');
-    }
-    toggle(value, shouldAdd) {
-      if (shouldAdd === void 0) shouldAdd = null;
-      this[_validateToken](value);
-      let s = this.readClasses();
-      let result = false;
-      if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
-      if (dart.test(shouldAdd)) {
-        s.add(value);
-        result = true;
-      } else {
-        s.remove(value);
-      }
-      this.writeClasses(s);
-      return result;
-    }
-    get frozen() {
-      return false;
-    }
-    get iterator() {
-      return this.readClasses().iterator;
-    }
-    [Symbol.iterator]() {
-      return new dart.JsIterator(this.iterator);
-    }
-    forEach(f) {
-      this.readClasses().forEach(f);
-    }
-    join(separator) {
-      if (separator === void 0) separator = "";
-      return this.readClasses().join(separator);
-    }
-    map(T) {
-      return f => {
-        return this.readClasses().map(T)(f);
-      };
-    }
-    where(f) {
-      return this.readClasses().where(f);
-    }
-    expand(T) {
-      return f => {
-        return this.readClasses().expand(T)(f);
-      };
-    }
-    every(f) {
-      return this.readClasses().every(f);
-    }
-    any(f) {
-      return this.readClasses().any(f);
-    }
-    get isEmpty() {
-      return this.readClasses().isEmpty;
-    }
-    get isNotEmpty() {
-      return this.readClasses().isNotEmpty;
-    }
-    get length() {
-      return this.readClasses().length;
-    }
-    reduce(combine) {
-      return this.readClasses().reduce(combine);
-    }
-    fold(T) {
-      return (initialValue, combine) => {
-        return this.readClasses().fold(T)(initialValue, combine);
-      };
-    }
-    contains(value) {
-      if (!(typeof value == 'string')) return false;
-      this[_validateToken](core.String._check(value));
-      return this.readClasses().contains(value);
-    }
-    lookup(value) {
-      return core.String._check(dart.test(this.contains(value)) ? value : null);
-    }
-    add(value) {
-      this[_validateToken](value);
-      return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
-    }
-    remove(value) {
-      this[_validateToken](core.String._check(value));
-      if (!(typeof value == 'string')) return false;
-      let s = this.readClasses();
-      let result = s.remove(value);
-      this.writeClasses(s);
-      return result;
-    }
-    addAll(iterable) {
-      this.modify(dart.fn(s => s.addAll(iterable[dartx.map](core.String)(dart.bind(this, _validateToken))), SetOfStringTovoid()));
-    }
-    removeAll(iterable) {
-      this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
-    }
-    toggleAll(iterable, shouldAdd) {
-      if (shouldAdd === void 0) shouldAdd = null;
-      iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
-    }
-    retainAll(iterable) {
-      this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
-    }
-    removeWhere(test) {
-      this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
-    }
-    retainWhere(test) {
-      this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
-    }
-    containsAll(collection) {
-      return this.readClasses().containsAll(collection);
-    }
-    intersection(other) {
-      return this.readClasses().intersection(other);
-    }
-    union(other) {
-      return this.readClasses().union(other);
-    }
-    difference(other) {
-      return this.readClasses().difference(other);
-    }
-    get first() {
-      return this.readClasses().first;
-    }
-    get last() {
-      return this.readClasses().last;
-    }
-    get single() {
-      return this.readClasses().single;
-    }
-    toList(opts) {
-      let growable = opts && 'growable' in opts ? opts.growable : true;
-      return this.readClasses().toList({growable: growable});
-    }
-    toSet() {
-      return this.readClasses().toSet();
-    }
-    take(n) {
-      return this.readClasses().take(n);
-    }
-    takeWhile(test) {
-      return this.readClasses().takeWhile(test);
-    }
-    skip(n) {
-      return this.readClasses().skip(n);
-    }
-    skipWhile(test) {
-      return this.readClasses().skipWhile(test);
-    }
-    firstWhere(test, opts) {
-      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-      return this.readClasses().firstWhere(test, {orElse: orElse});
-    }
-    lastWhere(test, opts) {
-      let orElse = opts && 'orElse' in opts ? opts.orElse : null;
-      return this.readClasses().lastWhere(test, {orElse: orElse});
-    }
-    singleWhere(test) {
-      return this.readClasses().singleWhere(test);
-    }
-    elementAt(index) {
-      return this.readClasses().elementAt(index);
-    }
-    clear() {
-      this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
-    }
-    modify(f) {
-      let s = this.readClasses();
-      let ret = f(s);
-      this.writeClasses(s);
-      return ret;
-    }
-  };
-  html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
-  dart.setSignature(html_common.CssClassSetImpl, {
-    getters: () => ({
-      frozen: dart.definiteFunctionType(core.bool, []),
-      iterator: dart.definiteFunctionType(core.Iterator$(core.String), []),
-      isEmpty: dart.definiteFunctionType(core.bool, []),
-      isNotEmpty: dart.definiteFunctionType(core.bool, []),
-      length: dart.definiteFunctionType(core.int, []),
-      first: dart.definiteFunctionType(core.String, []),
-      last: dart.definiteFunctionType(core.String, []),
-      single: dart.definiteFunctionType(core.String, [])
-    }),
-    methods: () => ({
-      [_validateToken]: dart.definiteFunctionType(core.String, [core.String]),
-      toggle: dart.definiteFunctionType(core.bool, [core.String], [core.bool]),
-      forEach: dart.definiteFunctionType(dart.void, [StringTovoid()]),
-      join: dart.definiteFunctionType(core.String, [], [core.String]),
-      map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [core.String])]]),
-      where: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
-      expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [core.String])]]),
-      every: dart.definiteFunctionType(core.bool, [StringTobool()]),
-      any: dart.definiteFunctionType(core.bool, [StringTobool()]),
-      reduce: dart.definiteFunctionType(core.String, [StringAndStringToString()]),
-      fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, core.String])]]),
-      contains: dart.definiteFunctionType(core.bool, [core.Object]),
-      lookup: dart.definiteFunctionType(core.String, [core.Object]),
-      add: dart.definiteFunctionType(core.bool, [core.String]),
-      remove: dart.definiteFunctionType(core.bool, [core.Object]),
-      addAll: dart.definiteFunctionType(dart.void, [IterableOfString()]),
-      removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
-      toggleAll: dart.definiteFunctionType(dart.void, [IterableOfString()], [core.bool]),
-      retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
-      removeWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
-      retainWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
-      containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
-      intersection: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
-      union: dart.definiteFunctionType(core.Set$(core.String), [SetOfString()]),
-      difference: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
-      toList: dart.definiteFunctionType(core.List$(core.String), [], {growable: core.bool}),
-      toSet: dart.definiteFunctionType(core.Set$(core.String), []),
-      take: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
-      takeWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
-      skip: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
-      skipWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
-      firstWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
-      lastWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
-      singleWhere: dart.definiteFunctionType(core.String, [StringTobool()]),
-      elementAt: dart.definiteFunctionType(core.String, [core.int]),
-      clear: dart.definiteFunctionType(dart.void, []),
-      modify: dart.definiteFunctionType(dart.dynamic, [SetOfStringTodynamic()])
-    }),
-    sfields: () => ({_validTokenRE: core.RegExp})
-  });
-  dart.defineExtensionMembers(html_common.CssClassSetImpl, [
-    'toString',
-    'forEach',
-    'join',
-    'map',
-    'where',
-    'expand',
-    'every',
-    'any',
-    'reduce',
-    'fold',
-    'contains',
-    'toList',
-    'toSet',
-    'take',
-    'takeWhile',
-    'skip',
-    'skipWhile',
-    'firstWhere',
-    'lastWhere',
-    'singleWhere',
-    'elementAt',
-    'iterator',
-    'isEmpty',
-    'isNotEmpty',
-    'length',
-    'first',
-    'last',
-    'single'
-  ]);
-  dart.defineLazy(html_common.CssClassSetImpl, {
-    get _validTokenRE() {
-      return core.RegExp.new('^\\S+$');
-    }
-  });
-  html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
-    static new(elements) {
-      return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
-    }
-    _(elementIterable, sets) {
-      this[_elementIterable] = elementIterable;
-      this[_sets] = sets;
-    }
-    readClasses() {
-      let s = LinkedHashSetOfString().new();
-      this[_sets][dartx.forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
-      return s;
-    }
-    writeClasses(s) {
-      let classes = s.join(' ');
-      for (let e of this[_elementIterable]) {
-        e[dartx.className] = classes;
-      }
-    }
-    modify(f) {
-      this[_sets][dartx.forEach](dart.fn(e => e.modify(f), CssClassSetImplTovoid()));
-    }
-    toggle(value, shouldAdd) {
-      if (shouldAdd === void 0) shouldAdd = null;
-      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool()));
-    }
-    remove(value) {
-      return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
-    }
-  };
-  dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
-  dart.setSignature(html$._MultiElementCssClassSet, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
-      _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
-    }),
-    fields: () => ({
-      [_elementIterable]: IterableOfElement(),
-      [_sets]: ListOfCssClassSetImpl()
-    }),
-    methods: () => ({
-      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
-      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
-    })
-  });
-  html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
-    new(element) {
-      this[_element$] = element;
-    }
-    readClasses() {
-      let s = LinkedHashSetOfString().new();
-      let classname = this[_element$][dartx.className];
-      for (let name of classname[dartx.split](' ')) {
-        let trimmed = name[dartx.trim]();
-        if (!dart.test(trimmed[dartx.isEmpty])) {
-          s.add(trimmed);
-        }
-      }
-      return s;
-    }
-    writeClasses(s) {
-      this[_element$][dartx.className] = s.join(' ');
-    }
-    get length() {
-      return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
-    }
-    get isEmpty() {
-      return this.length == 0;
-    }
-    get isNotEmpty() {
-      return this.length != 0;
-    }
-    clear() {
-      this[_element$][dartx.className] = '';
-    }
-    contains(value) {
-      return html$._ElementCssClassSet._contains(this[_element$], value);
-    }
-    add(value) {
-      return html$._ElementCssClassSet._add(this[_element$], value);
-    }
-    remove(value) {
-      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
-    }
-    toggle(value, shouldAdd) {
-      if (shouldAdd === void 0) shouldAdd = null;
-      return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
-    }
-    addAll(iterable) {
-      html$._ElementCssClassSet._addAll(this[_element$], iterable);
-    }
-    removeAll(iterable) {
-      html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
-    }
-    retainAll(iterable) {
-      html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
-    }
-    removeWhere(test) {
-      html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
-    }
-    retainWhere(test) {
-      html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
-    }
-    static _contains(_element, value) {
-      return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
-    }
-    static _add(_element, value) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
-      html$._ElementCssClassSet._classListAdd(list, value);
-      return added;
-    }
-    static _remove(_element, value) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
-      html$._ElementCssClassSet._classListRemove(list, value);
-      return removed;
-    }
-    static _toggle(_element, value, shouldAdd) {
-      return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
-    }
-    static _toggleDefault(_element, value) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      return html$._ElementCssClassSet._classListToggle1(list, value);
-    }
-    static _toggleOnOff(_element, value, shouldAdd) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      if (dart.test(shouldAdd)) {
-        html$._ElementCssClassSet._classListAdd(list, value);
-        return true;
-      } else {
-        html$._ElementCssClassSet._classListRemove(list, value);
-        return false;
-      }
-    }
-    static _addAll(_element, iterable) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      for (let value of iterable) {
-        html$._ElementCssClassSet._classListAdd(list, value);
-      }
-    }
-    static _removeAll(_element, iterable) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      for (let value of iterable) {
-        html$._ElementCssClassSet._classListRemove(list, value);
-      }
-    }
-    static _removeWhere(_element, test, doRemove) {
-      let list = html$._ElementCssClassSet._classListOf(_element);
-      let i = 0;
-      while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
-        let item = list[dartx.item](i);
-        if (doRemove == test(item)) {
-          html$._ElementCssClassSet._classListRemove(list, item);
-        } else {
-          ++i;
-        }
-      }
-    }
-    static _classListOf(e) {
-      return e.classList;
-    }
-    static _classListLength(list) {
-      return list.length;
-    }
-    static _classListContains(list, value) {
-      return list.contains(value);
-    }
-    static _classListContainsBeforeAddOrRemove(list, value) {
-      return list.contains(value);
-    }
-    static _classListAdd(list, value) {
-      list.add(value);
-    }
-    static _classListRemove(list, value) {
-      list.remove(value);
-    }
-    static _classListToggle1(list, value) {
-      return list.toggle(value);
-    }
-    static _classListToggle2(list, value, shouldAdd) {
-      return list.toggle(value, shouldAdd);
-    }
-  };
-  dart.setSignature(html$._ElementCssClassSet, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
-    fields: () => ({[_element$]: html$.Element}),
-    methods: () => ({
-      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
-      writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
-    }),
-    statics: () => ({
-      _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
-      _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
-      _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
-      _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
-      _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
-      _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
-      _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
-      _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
-      _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
-      _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
-      _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
-      _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
-      _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
-      _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
-      _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
-      _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
-      _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
-    }),
-    names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
-  });
-  dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
-  const _unit = Symbol('_unit');
-  html$.Dimension = class Dimension extends core.Object {
-    percent(value) {
-      this[_value$2] = value;
-      this[_unit] = '%';
-    }
-    px(value) {
-      this[_value$2] = value;
-      this[_unit] = 'px';
-    }
-    pc(value) {
-      this[_value$2] = value;
-      this[_unit] = 'pc';
-    }
-    pt(value) {
-      this[_value$2] = value;
-      this[_unit] = 'pt';
-    }
-    inch(value) {
-      this[_value$2] = value;
-      this[_unit] = 'in';
-    }
-    cm(value) {
-      this[_value$2] = value;
-      this[_unit] = 'cm';
-    }
-    mm(value) {
-      this[_value$2] = value;
-      this[_unit] = 'mm';
-    }
-    em(value) {
-      this[_value$2] = value;
-      this[_unit] = 'em';
-    }
-    ex(value) {
-      this[_value$2] = value;
-      this[_unit] = 'ex';
-    }
-    css(cssValue) {
-      this[_value$2] = null;
-      this[_unit] = null;
-      if (cssValue == '') cssValue = '0px';
-      if (dart.test(cssValue[dartx.endsWith]('%'))) {
-        this[_unit] = '%';
-      } else {
-        this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
-      }
-      if (dart.test(cssValue[dartx.contains]('.'))) {
-        this[_value$2] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
-      } else {
-        this[_value$2] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
-      }
-    }
-    toString() {
-      return dart.str`${this[_value$2]}${this[_unit]}`;
-    }
-    get value() {
-      return this[_value$2];
-    }
-  };
-  dart.defineNamedConstructor(html$.Dimension, 'percent');
-  dart.defineNamedConstructor(html$.Dimension, 'px');
-  dart.defineNamedConstructor(html$.Dimension, 'pc');
-  dart.defineNamedConstructor(html$.Dimension, 'pt');
-  dart.defineNamedConstructor(html$.Dimension, 'inch');
-  dart.defineNamedConstructor(html$.Dimension, 'cm');
-  dart.defineNamedConstructor(html$.Dimension, 'mm');
-  dart.defineNamedConstructor(html$.Dimension, 'em');
-  dart.defineNamedConstructor(html$.Dimension, 'ex');
-  dart.defineNamedConstructor(html$.Dimension, 'css');
-  dart.setSignature(html$.Dimension, {
-    constructors: () => ({
-      percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      px: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      em: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
-      css: dart.definiteFunctionType(html$.Dimension, [core.String])
-    }),
-    fields: () => ({
-      [_value$2]: core.num,
-      [_unit]: core.String
-    }),
-    getters: () => ({value: dart.definiteFunctionType(core.num, [])})
-  });
-  html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
-  html$.EventStreamProvider$ = dart.generic(T => {
-    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
-    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
-    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
-    class EventStreamProvider extends core.Object {
-      new(eventType) {
-        this[_eventType] = eventType;
-      }
-      forTarget(e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_EventStreamOfT())(e, this[_eventType], useCapture);
-      }
-      forElement(e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_ElementEventStreamImplOfT())(e, this[_eventType], useCapture);
-      }
-      [_forElementList](e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_ElementListEventStreamImplOfT())(e, this[_eventType], useCapture);
-      }
-      getEventType(target) {
-        return this[_eventType];
-      }
-    }
-    dart.addTypeTests(EventStreamProvider);
-    dart.setSignature(EventStreamProvider, {
-      constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
-      fields: () => ({[_eventType]: core.String}),
-      methods: () => ({
-        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
-        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
-        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
-        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
-      })
-    });
-    return EventStreamProvider;
-  });
-  html$.EventStreamProvider = EventStreamProvider();
-  html$.ElementStream$ = dart.generic(T => {
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class ElementStream extends core.Object {}
-    dart.addTypeTests(ElementStream);
-    ElementStream[dart.implements] = () => [StreamOfT()];
-    return ElementStream;
-  });
-  html$.ElementStream = ElementStream();
-  const _target$0 = Symbol('_target');
-  const _useCapture = Symbol('_useCapture');
-  html$._EventStream$ = dart.generic(T => {
-    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _EventStream extends async.Stream$(T) {
-      new(target, eventType, useCapture) {
-        this[_target$0] = target;
-        this[_eventType] = eventType;
-        this[_useCapture] = useCapture;
-        super.new();
-      }
-      asBroadcastStream(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        return this;
-      }
-      get isBroadcast() {
-        return true;
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, this[_useCapture]);
-      }
-    }
-    dart.setSignature(_EventStream, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
-      fields: () => ({
-        [_target$0]: html$.EventTarget,
-        [_eventType]: core.String,
-        [_useCapture]: core.bool
-      }),
-      methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
-    });
-    return _EventStream;
-  });
-  html$._EventStream = _EventStream();
-  html$._matchesWithAncestors = function(event, selector) {
-    let target = event[dartx.target];
-    return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
-  };
-  dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
-  html$._ElementEventStreamImpl$ = dart.generic(T => {
-    let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
-    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
-    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
-    class _ElementEventStreamImpl extends html$._EventStream$(T) {
-      new(target, eventType, useCapture) {
-        super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
-      }
-      matches(selector) {
-        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
-          e[_selector] = selector;
-          return e;
-        }, TToT()));
-      }
-      capture(onData) {
-        return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, true);
-      }
-    }
-    _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
-    dart.setSignature(_ElementEventStreamImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
-      methods: () => ({
-        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
-        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
-      })
-    });
-    return _ElementEventStreamImpl;
-  });
-  html$._ElementEventStreamImpl = _ElementEventStreamImpl();
-  const _targetList = Symbol('_targetList');
-  html$._ElementListEventStreamImpl$ = dart.generic(T => {
-    let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
-    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
-    let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
-    let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
-    let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
-    class _ElementListEventStreamImpl extends async.Stream$(T) {
-      new(targetList, eventType, useCapture) {
-        this[_targetList] = targetList;
-        this[_eventType] = eventType;
-        this[_useCapture] = useCapture;
-        super.new();
-      }
-      matches(selector) {
-        return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
-          e[_selector] = selector;
-          return e;
-        }, TToT()));
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        let pool = new (_StreamPoolOfT()).broadcast();
-        for (let target of this[_targetList]) {
-          pool.add(new (_EventStreamOfT())(target, this[_eventType], this[_useCapture]));
-        }
-        return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-      }
-      capture(onData) {
-        let pool = new (_StreamPoolOfT()).broadcast();
-        for (let target of this[_targetList]) {
-          pool.add(new (_EventStreamOfT())(target, this[_eventType], true));
-        }
-        return pool.stream.listen(onData);
-      }
-      asBroadcastStream(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        return this;
-      }
-      get isBroadcast() {
-        return true;
-      }
-    }
-    _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
-    dart.setSignature(_ElementListEventStreamImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
-      fields: () => ({
-        [_targetList]: IterableOfElement(),
-        [_useCapture]: core.bool,
-        [_eventType]: core.String
-      }),
-      methods: () => ({
-        matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
-        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-        capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
-      })
-    });
-    return _ElementListEventStreamImpl;
-  });
-  html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
-  html$._EventListener$ = dart.generic(T => {
-    const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
-    return _EventListener;
-  });
-  html$._EventListener = _EventListener();
-  const _onData$0 = Symbol('_onData');
-  const _pauseCount$0 = Symbol('_pauseCount');
-  const _tryResume = Symbol('_tryResume');
-  const _canceled = Symbol('_canceled');
-  const _unlisten = Symbol('_unlisten');
-  html$._EventStreamSubscription$ = dart.generic(T => {
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    class _EventStreamSubscription extends async.StreamSubscription$(T) {
-      new(target, eventType, onData, useCapture) {
-        this[_target$0] = target;
-        this[_eventType] = eventType;
-        this[_useCapture] = useCapture;
-        this[_onData$0] = onData == null ? null : html$._wrapZone(html$.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
-        this[_pauseCount$0] = 0;
-        this[_tryResume]();
-      }
-      cancel() {
-        if (dart.test(this[_canceled])) return null;
-        this[_unlisten]();
-        this[_target$0] = null;
-        this[_onData$0] = null;
-        return null;
-      }
-      get [_canceled]() {
-        return this[_target$0] == null;
-      }
-      onData(handleData) {
-        if (dart.test(this[_canceled])) {
-          dart.throw(new core.StateError("Subscription has been canceled."));
-        }
-        this[_unlisten]();
-        this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
-        this[_tryResume]();
-      }
-      onError(handleError) {}
-      onDone(handleDone) {}
-      pause(resumeSignal) {
-        if (resumeSignal === void 0) resumeSignal = null;
-        if (dart.test(this[_canceled])) return;
-        this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
-        this[_unlisten]();
-        if (resumeSignal != null) {
-          resumeSignal.whenComplete(dart.bind(this, 'resume'));
-        }
-      }
-      get isPaused() {
-        return dart.notNull(this[_pauseCount$0]) > 0;
-      }
-      resume() {
-        if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
-        this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
-        this[_tryResume]();
-      }
-      [_tryResume]() {
-        if (this[_onData$0] != null && !dart.test(this.isPaused)) {
-          this[_target$0][dartx.addEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
-        }
-      }
-      [_unlisten]() {
-        if (this[_onData$0] != null) {
-          this[_target$0][dartx.removeEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
-        }
-      }
-      asFuture(E) {
-        return futureValue => {
-          if (futureValue === void 0) futureValue = null;
-          let completer = async.Completer$(E).new();
-          return completer.future;
-        };
-      }
-    }
-    dart.setSignature(_EventStreamSubscription, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
-      fields: () => ({
-        [_pauseCount$0]: core.int,
-        [_target$0]: html$.EventTarget,
-        [_eventType]: core.String,
-        [_onData$0]: html$.EventListener,
-        [_useCapture]: core.bool
-      }),
-      getters: () => ({
-        [_canceled]: dart.definiteFunctionType(core.bool, []),
-        isPaused: dart.definiteFunctionType(core.bool, [])
-      }),
-      methods: () => ({
-        cancel: dart.definiteFunctionType(async.Future, []),
-        onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
-        onError: dart.definiteFunctionType(dart.void, [core.Function]),
-        onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
-        pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
-        resume: dart.definiteFunctionType(dart.void, []),
-        [_tryResume]: dart.definiteFunctionType(dart.void, []),
-        [_unlisten]: dart.definiteFunctionType(dart.void, []),
-        asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
-      })
-    });
-    return _EventStreamSubscription;
-  });
-  html$._EventStreamSubscription = _EventStreamSubscription();
-  html$.CustomStream$ = dart.generic(T => {
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    class CustomStream extends core.Object {}
-    dart.addTypeTests(CustomStream);
-    CustomStream[dart.implements] = () => [StreamOfT()];
-    return CustomStream;
-  });
-  html$.CustomStream = CustomStream();
-  const _streamController = Symbol('_streamController');
-  const _type$ = Symbol('_type');
-  html$._CustomEventStreamImpl$ = dart.generic(T => {
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
-    let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
-    class _CustomEventStreamImpl extends async.Stream$(T) {
-      new(type) {
-        this[_streamController] = null;
-        this[_type$] = null;
-        super.new();
-        this[_type$] = type;
-        this[_streamController] = StreamControllerOfT().broadcast({sync: true});
-      }
-      listen(onData, opts) {
-        let onError = opts && 'onError' in opts ? opts.onError : null;
-        let onDone = opts && 'onDone' in opts ? opts.onDone : null;
-        let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-        return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
-      }
-      asBroadcastStream(opts) {
-        let onListen = opts && 'onListen' in opts ? opts.onListen : null;
-        let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
-        return this[_streamController].stream;
-      }
-      get isBroadcast() {
-        return true;
-      }
-      add(event) {
-        T._check(event);
-        if (event[dartx.type] == this[_type$]) this[_streamController].add(event);
-      }
-    }
-    _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
-    dart.setSignature(_CustomEventStreamImpl, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
-      fields: () => ({
-        [_streamController]: StreamControllerOfT(),
-        [_type$]: core.String
-      }),
-      methods: () => ({
-        listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
-        add: dart.definiteFunctionType(dart.void, [T])
-      })
-    });
-    return _CustomEventStreamImpl;
-  });
-  html$._CustomEventStreamImpl = _CustomEventStreamImpl();
-  const _parent$ = Symbol('_parent');
-  const _shadowKeyCode = Symbol('_shadowKeyCode');
-  const _shadowCharCode = Symbol('_shadowCharCode');
-  const _shadowAltKey = Symbol('_shadowAltKey');
-  const _realKeyCode = Symbol('_realKeyCode');
-  const _realCharCode = Symbol('_realCharCode');
-  const _realAltKey = Symbol('_realAltKey');
-  const _currentTarget = Symbol('_currentTarget');
-  const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
-  html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
-    get keyCode() {
-      return this[_shadowKeyCode];
-    }
-    get charCode() {
-      return this.type == 'keypress' ? this[_shadowCharCode] : 0;
-    }
-    get altKey() {
-      return this[_shadowAltKey];
-    }
-    get which() {
-      return this.keyCode;
-    }
-    get [_realKeyCode]() {
-      return this[_parent$].keyCode;
-    }
-    get [_realCharCode]() {
-      return this[_parent$].charCode;
-    }
-    get [_realAltKey]() {
-      return this[_parent$].altKey;
-    }
-    static _makeRecord() {
-      let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
-      return _js_helper.makeLeafDispatchRecord(interceptor);
-    }
-    wrap(parent) {
-      this[_parent$] = null;
-      this[_shadowAltKey] = null;
-      this[_shadowCharCode] = null;
-      this[_shadowKeyCode] = null;
-      this[_currentTarget] = null;
-      super.new(parent);
-      this[_parent$] = parent;
-      this[_shadowAltKey] = this[_realAltKey];
-      this[_shadowCharCode] = this[_realCharCode];
-      this[_shadowKeyCode] = this[_realKeyCode];
-      this[_currentTarget] = this[_parent$][dartx.currentTarget];
-    }
-    static new(type, opts) {
-      let view = opts && 'view' in opts ? opts.view : null;
-      let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
-      let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-      let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
-      let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
-      let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
-      let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
-      let altKey = opts && 'altKey' in opts ? opts.altKey : false;
-      let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
-      let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
-      let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
-      if (view == null) {
-        view = html$.window;
-      }
-      let eventObj = null;
-      if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
-        eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
-        eventObj.keyCode = keyCode;
-        eventObj.which = keyCode;
-        eventObj.charCode = charCode;
-        eventObj.keyLocation = keyLocation;
-        eventObj.ctrlKey = ctrlKey;
-        eventObj.altKey = altKey;
-        eventObj.shiftKey = shiftKey;
-        eventObj.metaKey = metaKey;
-      } else {
-        eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
-        Object.defineProperty(eventObj, 'keyCode', {
-          get: function() {
-            return this.keyCodeVal;
-          }
-        });
-        Object.defineProperty(eventObj, 'which', {
-          get: function() {
-            return this.keyCodeVal;
-          }
-        });
-        Object.defineProperty(eventObj, 'charCode', {
-          get: function() {
-            return this.charCodeVal;
-          }
-        });
-        let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
-        dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
-        eventObj.keyCodeVal = keyCode;
-        eventObj.charCodeVal = charCode;
-      }
-      _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
-      let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
-      if (keyEvent[_currentTarget] == null) {
-        keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
-      }
-      return keyEvent;
-    }
-    static get canUseDispatchEvent() {
-      return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
-    }
-    get currentTarget() {
-      return this[_currentTarget];
-    }
-    static _convertToHexString(charCode, keyCode) {
-      if (charCode != -1) {
-        let hex = charCode[dartx.toRadixString](16);
-        let sb = new core.StringBuffer('U+');
-        for (let i = 0; i < 4 - dart.notNull(hex[dartx.length]); i++)
-          sb.write('0');
-        sb.write(hex);
-        return sb.toString();
-      } else {
-        return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
-      }
-    }
-    get code() {
-      return this[_parent$][dartx.code];
-    }
-    get ctrlKey() {
-      return this[_parent$][dartx.ctrlKey];
-    }
-    get detail() {
-      return this[_parent$][dartx.detail];
-    }
-    get key() {
-      return this[_parent$][dartx.key];
-    }
-    get keyLocation() {
-      return this[_parent$][dartx.keyLocation];
-    }
-    get metaKey() {
-      return this[_parent$][dartx.metaKey];
-    }
-    get shiftKey() {
-      return this[_parent$][dartx.shiftKey];
-    }
-    get sourceDevice() {
-      return this[_parent$][dartx.sourceDevice];
-    }
-    get view() {
-      return html$.Window._check(this[_parent$][dartx.view]);
-    }
-    [_initUIEvent](type, canBubble, cancelable, view, detail) {
-      dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
-    }
-    get [_shadowKeyIdentifier]() {
-      return this[_parent$].keyIdentifier;
-    }
-    get [_charCode]() {
-      return this.charCode;
-    }
-    get [_keyCode]() {
-      return this.keyCode;
-    }
-    get [_which]() {
-      return this.which;
-    }
-    get [_keyIdentifier]() {
-      dart.throw(new core.UnsupportedError("keyIdentifier is unsupported."));
-    }
-    [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
-      dart.throw(new core.UnsupportedError("Cannot initialize a KeyboardEvent from a KeyEvent."));
-    }
-    getModifierState(keyArgument) {
-      return dart.throw(new core.UnimplementedError());
-    }
-    get location() {
-      return dart.throw(new core.UnimplementedError());
-    }
-    get repeat() {
-      return dart.throw(new core.UnimplementedError());
-    }
-    get [_get_view]() {
-      return dart.throw(new core.UnimplementedError());
-    }
-  };
-  dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
-  html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
-  dart.setSignature(html$.KeyEvent, {
-    constructors: () => ({
-      wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
-      new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
-    }),
-    fields: () => ({
-      [_parent$]: html$.KeyboardEvent,
-      [_shadowAltKey]: core.bool,
-      [_shadowCharCode]: core.int,
-      [_shadowKeyCode]: core.int,
-      [_currentTarget]: html$.EventTarget
-    }),
-    getters: () => ({
-      keyCode: dart.definiteFunctionType(core.int, []),
-      charCode: dart.definiteFunctionType(core.int, []),
-      altKey: dart.definiteFunctionType(core.bool, []),
-      which: dart.definiteFunctionType(core.int, []),
-      [_realKeyCode]: dart.definiteFunctionType(core.int, []),
-      [_realCharCode]: dart.definiteFunctionType(core.int, []),
-      [_realAltKey]: dart.definiteFunctionType(core.bool, []),
-      code: dart.definiteFunctionType(core.String, []),
-      ctrlKey: dart.definiteFunctionType(core.bool, []),
-      detail: dart.definiteFunctionType(core.int, []),
-      key: dart.definiteFunctionType(core.String, []),
-      keyLocation: dart.definiteFunctionType(core.int, []),
-      metaKey: dart.definiteFunctionType(core.bool, []),
-      shiftKey: dart.definiteFunctionType(core.bool, []),
-      sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
-      view: dart.definiteFunctionType(html$.Window, []),
-      [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
-      [_charCode]: dart.definiteFunctionType(core.int, []),
-      [_keyCode]: dart.definiteFunctionType(core.int, []),
-      [_which]: dart.definiteFunctionType(core.int, []),
-      [_keyIdentifier]: dart.definiteFunctionType(core.String, []),
-      location: dart.definiteFunctionType(core.int, []),
-      repeat: dart.definiteFunctionType(core.bool, []),
-      [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
-    }),
-    methods: () => ({
-      [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
-      [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
-      getModifierState: dart.definiteFunctionType(core.bool, [core.String])
-    }),
-    sfields: () => ({
-      _keyboardEventDispatchRecord: dart.dynamic,
-      keyDownEvent: EventStreamProviderOfKeyEvent(),
-      keyUpEvent: EventStreamProviderOfKeyEvent(),
-      keyPressEvent: EventStreamProviderOfKeyEvent()
-    }),
-    sgetters: () => ({canUseDispatchEvent: dart.definiteFunctionType(core.bool, [])}),
-    statics: () => ({
-      _makeRecord: dart.definiteFunctionType(dart.dynamic, []),
-      _convertToHexString: dart.definiteFunctionType(core.String, [core.int, core.int])
-    }),
-    names: ['_makeRecord', '_convertToHexString']
-  });
-  dart.defineLazy(html$.KeyEvent, {
-    get _keyboardEventDispatchRecord() {
-      return html$.KeyEvent._makeRecord();
-    },
-    get keyDownEvent() {
-      return new html$._KeyboardEventHandler('keydown');
-    },
-    set keyDownEvent(_) {},
-    get keyUpEvent() {
-      return new html$._KeyboardEventHandler('keyup');
-    },
-    set keyUpEvent(_) {},
-    get keyPressEvent() {
-      return new html$._KeyboardEventHandler('keypress');
-    },
-    set keyPressEvent(_) {}
-  });
-  html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
-    new(type) {
-      super.new(type);
-    }
-    add(event) {
-      if (event.type == this[_type$]) {
-        event.currentTarget[dartx.dispatchEvent](event[_parent$]);
-        this[_streamController].add(event);
-      }
-    }
-  };
-  dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
-  html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
-  dart.setSignature(html$._CustomKeyEventStreamImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])})
-  });
-  const _subscriptions = Symbol('_subscriptions');
-  const _controller$1 = Symbol('_controller');
-  html$._StreamPool$ = dart.generic(T => {
-    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
-    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
-    let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
-    let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-    class _StreamPool extends core.Object {
-      broadcast() {
-        this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
-        this[_controller$1] = null;
-        this[_controller$1] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
-      }
-      get stream() {
-        return this[_controller$1].stream;
-      }
-      add(stream) {
-        StreamOfT()._check(stream);
-        if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
-        this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$1], 'add'), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
-      }
-      remove(stream) {
-        StreamOfT()._check(stream);
-        let subscription = this[_subscriptions][dartx.remove](stream);
-        if (subscription != null) subscription.cancel();
-      }
-      close() {
-        for (let subscription of this[_subscriptions][dartx.values]) {
-          subscription.cancel();
-        }
-        this[_subscriptions][dartx.clear]();
-        this[_controller$1].close();
-      }
-    }
-    dart.addTypeTests(_StreamPool);
-    dart.defineNamedConstructor(_StreamPool, 'broadcast');
-    dart.setSignature(_StreamPool, {
-      constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
-      fields: () => ({
-        [_controller$1]: StreamControllerOfT(),
-        [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
-      }),
-      getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
-      methods: () => ({
-        add: dart.definiteFunctionType(dart.void, [StreamOfT()]),
-        remove: dart.definiteFunctionType(dart.void, [StreamOfT()]),
-        close: dart.definiteFunctionType(dart.void, [])
-      })
-    });
-    return _StreamPool;
-  });
-  html$._StreamPool = _StreamPool();
-  const _eventTypeGetter = Symbol('_eventTypeGetter');
-  html$._CustomEventStreamProvider$ = dart.generic(T => {
-    let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
-    let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
-    let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
-    let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
-    class _CustomEventStreamProvider extends core.Object {
-      new(eventTypeGetter) {
-        this[_eventTypeGetter] = eventTypeGetter;
-      }
-      forTarget(e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_EventStreamOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
-      }
-      forElement(e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_ElementEventStreamImplOfT())(e, dart.dcall(this[_eventTypeGetter], e), useCapture);
-      }
-      [_forElementList](e, opts) {
-        let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-        return new (_ElementListEventStreamImplOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
-      }
-      getEventType(target) {
-        return core.String._check(dart.dcall(this[_eventTypeGetter], target));
-      }
-      get [_eventType]() {
-        return dart.throw(new core.UnsupportedError('Access type through getEventType method.'));
-      }
-    }
-    dart.addTypeTests(_CustomEventStreamProvider);
-    _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
-    dart.setSignature(_CustomEventStreamProvider, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
-      fields: () => ({[_eventTypeGetter]: dart.dynamic}),
-      getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
-      methods: () => ({
-        forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
-        forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
-        [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
-        getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
-      })
-    });
-    return _CustomEventStreamProvider;
-  });
-  html$._CustomEventStreamProvider = _CustomEventStreamProvider();
-  html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
-    new(opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
-      if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
-        for (let attr of html$._Html5NodeValidator._standardAttributes) {
-          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
-        }
-        for (let attr of html$._Html5NodeValidator._uriAttributes) {
-          html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
-        }
-      }
-    }
-    allowsElement(element) {
-      return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
-    }
-    allowsAttribute(element, attributeName, value) {
-      let tagName = html$.Element._safeTagName(element);
-      let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
-      if (validator == null) {
-        validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
-      }
-      if (validator == null) {
-        return false;
-      }
-      return core.bool._check(dart.dcall(validator, element, attributeName, value, this));
-    }
-    static _standardAttributeValidator(element, attributeName, value, context) {
-      return true;
-    }
-    static _uriAttributeValidator(element, attributeName, value, context) {
-      return context.uriPolicy.allowsUri(value);
-    }
-  };
-  html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
-  dart.setSignature(html$._Html5NodeValidator, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
-    fields: () => ({uriPolicy: html$.UriPolicy}),
-    methods: () => ({
-      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
-      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
-    }),
-    sfields: () => ({
-      _allowedElements: SetOfString(),
-      _standardAttributes: ListOfString(),
-      _uriAttributes: ListOfString(),
-      _attributeValidators: MapOfString$Function()
-    }),
-    statics: () => ({
-      _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
-      _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
-    }),
-    names: ['_standardAttributeValidator', '_uriAttributeValidator']
-  });
-  html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
-  html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
-  dart.defineLazy(html$._Html5NodeValidator, {
-    get _allowedElements() {
-      return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
-    },
-    get _attributeValidators() {
-      return dart.map({}, core.String, core.Function);
-    }
-  });
-  html$.KeyCode = class KeyCode extends core.Object {
-    static isCharacterKey(keyCode) {
-      if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
-        return true;
-      }
-      if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
-        return true;
-      }
-      return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
-    }
-    static _convertKeyCodeToKeyName(keyCode) {
-      switch (keyCode) {
-        case html$.KeyCode.ALT:
-        {
-          return html$._KeyName.ALT;
-        }
-        case html$.KeyCode.BACKSPACE:
-        {
-          return html$._KeyName.BACKSPACE;
-        }
-        case html$.KeyCode.CAPS_LOCK:
-        {
-          return html$._KeyName.CAPS_LOCK;
-        }
-        case html$.KeyCode.CTRL:
-        {
-          return html$._KeyName.CONTROL;
-        }
-        case html$.KeyCode.DELETE:
-        {
-          return html$._KeyName.DEL;
-        }
-        case html$.KeyCode.DOWN:
-        {
-          return html$._KeyName.DOWN;
-        }
-        case html$.KeyCode.END:
-        {
-          return html$._KeyName.END;
-        }
-        case html$.KeyCode.ENTER:
-        {
-          return html$._KeyName.ENTER;
-        }
-        case html$.KeyCode.ESC:
-        {
-          return html$._KeyName.ESC;
-        }
-        case html$.KeyCode.F1:
-        {
-          return html$._KeyName.F1;
-        }
-        case html$.KeyCode.F2:
-        {
-          return html$._KeyName.F2;
-        }
-        case html$.KeyCode.F3:
-        {
-          return html$._KeyName.F3;
-        }
-        case html$.KeyCode.F4:
-        {
-          return html$._KeyName.F4;
-        }
-        case html$.KeyCode.F5:
-        {
-          return html$._KeyName.F5;
-        }
-        case html$.KeyCode.F6:
-        {
-          return html$._KeyName.F6;
-        }
-        case html$.KeyCode.F7:
-        {
-          return html$._KeyName.F7;
-        }
-        case html$.KeyCode.F8:
-        {
-          return html$._KeyName.F8;
-        }
-        case html$.KeyCode.F9:
-        {
-          return html$._KeyName.F9;
-        }
-        case html$.KeyCode.F10:
-        {
-          return html$._KeyName.F10;
-        }
-        case html$.KeyCode.F11:
-        {
-          return html$._KeyName.F11;
-        }
-        case html$.KeyCode.F12:
-        {
-          return html$._KeyName.F12;
-        }
-        case html$.KeyCode.HOME:
-        {
-          return html$._KeyName.HOME;
-        }
-        case html$.KeyCode.INSERT:
-        {
-          return html$._KeyName.INSERT;
-        }
-        case html$.KeyCode.LEFT:
-        {
-          return html$._KeyName.LEFT;
-        }
-        case html$.KeyCode.META:
-        {
-          return html$._KeyName.META;
-        }
-        case html$.KeyCode.NUMLOCK:
-        {
-          return html$._KeyName.NUM_LOCK;
-        }
-        case html$.KeyCode.PAGE_DOWN:
-        {
-          return html$._KeyName.PAGE_DOWN;
-        }
-        case html$.KeyCode.PAGE_UP:
-        {
-          return html$._KeyName.PAGE_UP;
-        }
-        case html$.KeyCode.PAUSE:
-        {
-          return html$._KeyName.PAUSE;
-        }
-        case html$.KeyCode.PRINT_SCREEN:
-        {
-          return html$._KeyName.PRINT_SCREEN;
-        }
-        case html$.KeyCode.RIGHT:
-        {
-          return html$._KeyName.RIGHT;
-        }
-        case html$.KeyCode.SCROLL_LOCK:
-        {
-          return html$._KeyName.SCROLL;
-        }
-        case html$.KeyCode.SHIFT:
-        {
-          return html$._KeyName.SHIFT;
-        }
-        case html$.KeyCode.SPACE:
-        {
-          return html$._KeyName.SPACEBAR;
-        }
-        case html$.KeyCode.TAB:
-        {
-          return html$._KeyName.TAB;
-        }
-        case html$.KeyCode.UP:
-        {
-          return html$._KeyName.UP;
-        }
-        case html$.KeyCode.WIN_IME:
-        case html$.KeyCode.WIN_KEY:
-        case html$.KeyCode.WIN_KEY_LEFT:
-        case html$.KeyCode.WIN_KEY_RIGHT:
-        {
-          return html$._KeyName.WIN;
-        }
-        default:
-        {
-          return html$._KeyName.UNIDENTIFIED;
-        }
-      }
-      return html$._KeyName.UNIDENTIFIED;
-    }
-  };
-  dart.setSignature(html$.KeyCode, {
-    sfields: () => ({
-      WIN_KEY_FF_LINUX: core.int,
-      MAC_ENTER: core.int,
-      BACKSPACE: core.int,
-      TAB: core.int,
-      NUM_CENTER: core.int,
-      ENTER: core.int,
-      SHIFT: core.int,
-      CTRL: core.int,
-      ALT: core.int,
-      PAUSE: core.int,
-      CAPS_LOCK: core.int,
-      ESC: core.int,
-      SPACE: core.int,
-      PAGE_UP: core.int,
-      PAGE_DOWN: core.int,
-      END: core.int,
-      HOME: core.int,
-      LEFT: core.int,
-      UP: core.int,
-      RIGHT: core.int,
-      DOWN: core.int,
-      NUM_NORTH_EAST: core.int,
-      NUM_SOUTH_EAST: core.int,
-      NUM_SOUTH_WEST: core.int,
-      NUM_NORTH_WEST: core.int,
-      NUM_WEST: core.int,
-      NUM_NORTH: core.int,
-      NUM_EAST: core.int,
-      NUM_SOUTH: core.int,
-      PRINT_SCREEN: core.int,
-      INSERT: core.int,
-      NUM_INSERT: core.int,
-      DELETE: core.int,
-      NUM_DELETE: core.int,
-      ZERO: core.int,
-      ONE: core.int,
-      TWO: core.int,
-      THREE: core.int,
-      FOUR: core.int,
-      FIVE: core.int,
-      SIX: core.int,
-      SEVEN: core.int,
-      EIGHT: core.int,
-      NINE: core.int,
-      FF_SEMICOLON: core.int,
-      FF_EQUALS: core.int,
-      QUESTION_MARK: core.int,
-      A: core.int,
-      B: core.int,
-      C: core.int,
-      D: core.int,
-      E: core.int,
-      F: core.int,
-      G: core.int,
-      H: core.int,
-      I: core.int,
-      J: core.int,
-      K: core.int,
-      L: core.int,
-      M: core.int,
-      N: core.int,
-      O: core.int,
-      P: core.int,
-      Q: core.int,
-      R: core.int,
-      S: core.int,
-      T: core.int,
-      U: core.int,
-      V: core.int,
-      W: core.int,
-      X: core.int,
-      Y: core.int,
-      Z: core.int,
-      META: core.int,
-      WIN_KEY_LEFT: core.int,
-      WIN_KEY_RIGHT: core.int,
-      CONTEXT_MENU: core.int,
-      NUM_ZERO: core.int,
-      NUM_ONE: core.int,
-      NUM_TWO: core.int,
-      NUM_THREE: core.int,
-      NUM_FOUR: core.int,
-      NUM_FIVE: core.int,
-      NUM_SIX: core.int,
-      NUM_SEVEN: core.int,
-      NUM_EIGHT: core.int,
-      NUM_NINE: core.int,
-      NUM_MULTIPLY: core.int,
-      NUM_PLUS: core.int,
-      NUM_MINUS: core.int,
-      NUM_PERIOD: core.int,
-      NUM_DIVISION: core.int,
-      F1: core.int,
-      F2: core.int,
-      F3: core.int,
-      F4: core.int,
-      F5: core.int,
-      F6: core.int,
-      F7: core.int,
-      F8: core.int,
-      F9: core.int,
-      F10: core.int,
-      F11: core.int,
-      F12: core.int,
-      NUMLOCK: core.int,
-      SCROLL_LOCK: core.int,
-      FIRST_MEDIA_KEY: core.int,
-      LAST_MEDIA_KEY: core.int,
-      SEMICOLON: core.int,
-      DASH: core.int,
-      EQUALS: core.int,
-      COMMA: core.int,
-      PERIOD: core.int,
-      SLASH: core.int,
-      APOSTROPHE: core.int,
-      TILDE: core.int,
-      SINGLE_QUOTE: core.int,
-      OPEN_SQUARE_BRACKET: core.int,
-      BACKSLASH: core.int,
-      CLOSE_SQUARE_BRACKET: core.int,
-      WIN_KEY: core.int,
-      MAC_FF_META: core.int,
-      WIN_IME: core.int,
-      UNKNOWN: core.int
-    }),
-    statics: () => ({
-      isCharacterKey: dart.definiteFunctionType(core.bool, [core.int]),
-      _convertKeyCodeToKeyName: dart.definiteFunctionType(core.String, [core.int])
-    }),
-    names: ['isCharacterKey', '_convertKeyCodeToKeyName']
-  });
-  html$.KeyCode.WIN_KEY_FF_LINUX = 0;
-  html$.KeyCode.MAC_ENTER = 3;
-  html$.KeyCode.BACKSPACE = 8;
-  html$.KeyCode.TAB = 9;
-  html$.KeyCode.NUM_CENTER = 12;
-  html$.KeyCode.ENTER = 13;
-  html$.KeyCode.SHIFT = 16;
-  html$.KeyCode.CTRL = 17;
-  html$.KeyCode.ALT = 18;
-  html$.KeyCode.PAUSE = 19;
-  html$.KeyCode.CAPS_LOCK = 20;
-  html$.KeyCode.ESC = 27;
-  html$.KeyCode.SPACE = 32;
-  html$.KeyCode.PAGE_UP = 33;
-  html$.KeyCode.PAGE_DOWN = 34;
-  html$.KeyCode.END = 35;
-  html$.KeyCode.HOME = 36;
-  html$.KeyCode.LEFT = 37;
-  html$.KeyCode.UP = 38;
-  html$.KeyCode.RIGHT = 39;
-  html$.KeyCode.DOWN = 40;
-  html$.KeyCode.NUM_NORTH_EAST = 33;
-  html$.KeyCode.NUM_SOUTH_EAST = 34;
-  html$.KeyCode.NUM_SOUTH_WEST = 35;
-  html$.KeyCode.NUM_NORTH_WEST = 36;
-  html$.KeyCode.NUM_WEST = 37;
-  html$.KeyCode.NUM_NORTH = 38;
-  html$.KeyCode.NUM_EAST = 39;
-  html$.KeyCode.NUM_SOUTH = 40;
-  html$.KeyCode.PRINT_SCREEN = 44;
-  html$.KeyCode.INSERT = 45;
-  html$.KeyCode.NUM_INSERT = 45;
-  html$.KeyCode.DELETE = 46;
-  html$.KeyCode.NUM_DELETE = 46;
-  html$.KeyCode.ZERO = 48;
-  html$.KeyCode.ONE = 49;
-  html$.KeyCode.TWO = 50;
-  html$.KeyCode.THREE = 51;
-  html$.KeyCode.FOUR = 52;
-  html$.KeyCode.FIVE = 53;
-  html$.KeyCode.SIX = 54;
-  html$.KeyCode.SEVEN = 55;
-  html$.KeyCode.EIGHT = 56;
-  html$.KeyCode.NINE = 57;
-  html$.KeyCode.FF_SEMICOLON = 59;
-  html$.KeyCode.FF_EQUALS = 61;
-  html$.KeyCode.QUESTION_MARK = 63;
-  html$.KeyCode.A = 65;
-  html$.KeyCode.B = 66;
-  html$.KeyCode.C = 67;
-  html$.KeyCode.D = 68;
-  html$.KeyCode.E = 69;
-  html$.KeyCode.F = 70;
-  html$.KeyCode.G = 71;
-  html$.KeyCode.H = 72;
-  html$.KeyCode.I = 73;
-  html$.KeyCode.J = 74;
-  html$.KeyCode.K = 75;
-  html$.KeyCode.L = 76;
-  html$.KeyCode.M = 77;
-  html$.KeyCode.N = 78;
-  html$.KeyCode.O = 79;
-  html$.KeyCode.P = 80;
-  html$.KeyCode.Q = 81;
-  html$.KeyCode.R = 82;
-  html$.KeyCode.S = 83;
-  html$.KeyCode.T = 84;
-  html$.KeyCode.U = 85;
-  html$.KeyCode.V = 86;
-  html$.KeyCode.W = 87;
-  html$.KeyCode.X = 88;
-  html$.KeyCode.Y = 89;
-  html$.KeyCode.Z = 90;
-  html$.KeyCode.META = 91;
-  html$.KeyCode.WIN_KEY_LEFT = 91;
-  html$.KeyCode.WIN_KEY_RIGHT = 92;
-  html$.KeyCode.CONTEXT_MENU = 93;
-  html$.KeyCode.NUM_ZERO = 96;
-  html$.KeyCode.NUM_ONE = 97;
-  html$.KeyCode.NUM_TWO = 98;
-  html$.KeyCode.NUM_THREE = 99;
-  html$.KeyCode.NUM_FOUR = 100;
-  html$.KeyCode.NUM_FIVE = 101;
-  html$.KeyCode.NUM_SIX = 102;
-  html$.KeyCode.NUM_SEVEN = 103;
-  html$.KeyCode.NUM_EIGHT = 104;
-  html$.KeyCode.NUM_NINE = 105;
-  html$.KeyCode.NUM_MULTIPLY = 106;
-  html$.KeyCode.NUM_PLUS = 107;
-  html$.KeyCode.NUM_MINUS = 109;
-  html$.KeyCode.NUM_PERIOD = 110;
-  html$.KeyCode.NUM_DIVISION = 111;
-  html$.KeyCode.F1 = 112;
-  html$.KeyCode.F2 = 113;
-  html$.KeyCode.F3 = 114;
-  html$.KeyCode.F4 = 115;
-  html$.KeyCode.F5 = 116;
-  html$.KeyCode.F6 = 117;
-  html$.KeyCode.F7 = 118;
-  html$.KeyCode.F8 = 119;
-  html$.KeyCode.F9 = 120;
-  html$.KeyCode.F10 = 121;
-  html$.KeyCode.F11 = 122;
-  html$.KeyCode.F12 = 123;
-  html$.KeyCode.NUMLOCK = 144;
-  html$.KeyCode.SCROLL_LOCK = 145;
-  html$.KeyCode.FIRST_MEDIA_KEY = 166;
-  html$.KeyCode.LAST_MEDIA_KEY = 183;
-  html$.KeyCode.SEMICOLON = 186;
-  html$.KeyCode.DASH = 189;
-  html$.KeyCode.EQUALS = 187;
-  html$.KeyCode.COMMA = 188;
-  html$.KeyCode.PERIOD = 190;
-  html$.KeyCode.SLASH = 191;
-  html$.KeyCode.APOSTROPHE = 192;
-  html$.KeyCode.TILDE = 192;
-  html$.KeyCode.SINGLE_QUOTE = 222;
-  html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
-  html$.KeyCode.BACKSLASH = 220;
-  html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
-  html$.KeyCode.WIN_KEY = 224;
-  html$.KeyCode.MAC_FF_META = 224;
-  html$.KeyCode.WIN_IME = 229;
-  html$.KeyCode.UNKNOWN = -1;
-  html$.KeyLocation = class KeyLocation extends core.Object {};
-  dart.setSignature(html$.KeyLocation, {
-    sfields: () => ({
-      STANDARD: core.int,
-      LEFT: core.int,
-      RIGHT: core.int,
-      NUMPAD: core.int,
-      MOBILE: core.int,
-      JOYSTICK: core.int
-    })
-  });
-  html$.KeyLocation.STANDARD = 0;
-  html$.KeyLocation.LEFT = 1;
-  html$.KeyLocation.RIGHT = 2;
-  html$.KeyLocation.NUMPAD = 3;
-  html$.KeyLocation.MOBILE = 4;
-  html$.KeyLocation.JOYSTICK = 5;
-  html$._KeyName = class _KeyName extends core.Object {};
-  dart.setSignature(html$._KeyName, {
-    sfields: () => ({
-      ACCEPT: core.String,
-      ADD: core.String,
-      AGAIN: core.String,
-      ALL_CANDIDATES: core.String,
-      ALPHANUMERIC: core.String,
-      ALT: core.String,
-      ALT_GRAPH: core.String,
-      APPS: core.String,
-      ATTN: core.String,
-      BROWSER_BACK: core.String,
-      BROWSER_FAVORTIES: core.String,
-      BROWSER_FORWARD: core.String,
-      BROWSER_NAME: core.String,
-      BROWSER_REFRESH: core.String,
-      BROWSER_SEARCH: core.String,
-      BROWSER_STOP: core.String,
-      CAMERA: core.String,
-      CAPS_LOCK: core.String,
-      CLEAR: core.String,
-      CODE_INPUT: core.String,
-      COMPOSE: core.String,
-      CONTROL: core.String,
-      CRSEL: core.String,
-      CONVERT: core.String,
-      COPY: core.String,
-      CUT: core.String,
-      DECIMAL: core.String,
-      DIVIDE: core.String,
-      DOWN: core.String,
-      DOWN_LEFT: core.String,
-      DOWN_RIGHT: core.String,
-      EJECT: core.String,
-      END: core.String,
-      ENTER: core.String,
-      ERASE_EOF: core.String,
-      EXECUTE: core.String,
-      EXSEL: core.String,
-      FN: core.String,
-      F1: core.String,
-      F2: core.String,
-      F3: core.String,
-      F4: core.String,
-      F5: core.String,
-      F6: core.String,
-      F7: core.String,
-      F8: core.String,
-      F9: core.String,
-      F10: core.String,
-      F11: core.String,
-      F12: core.String,
-      F13: core.String,
-      F14: core.String,
-      F15: core.String,
-      F16: core.String,
-      F17: core.String,
-      F18: core.String,
-      F19: core.String,
-      F20: core.String,
-      F21: core.String,
-      F22: core.String,
-      F23: core.String,
-      F24: core.String,
-      FINAL_MODE: core.String,
-      FIND: core.String,
-      FULL_WIDTH: core.String,
-      HALF_WIDTH: core.String,
-      HANGUL_MODE: core.String,
-      HANJA_MODE: core.String,
-      HELP: core.String,
-      HIRAGANA: core.String,
-      HOME: core.String,
-      INSERT: core.String,
-      JAPANESE_HIRAGANA: core.String,
-      JAPANESE_KATAKANA: core.String,
-      JAPANESE_ROMAJI: core.String,
-      JUNJA_MODE: core.String,
-      KANA_MODE: core.String,
-      KANJI_MODE: core.String,
-      KATAKANA: core.String,
-      LAUNCH_APPLICATION_1: core.String,
-      LAUNCH_APPLICATION_2: core.String,
-      LAUNCH_MAIL: core.String,
-      LEFT: core.String,
-      MENU: core.String,
-      META: core.String,
-      MEDIA_NEXT_TRACK: core.String,
-      MEDIA_PAUSE_PLAY: core.String,
-      MEDIA_PREVIOUS_TRACK: core.String,
-      MEDIA_STOP: core.String,
-      MODE_CHANGE: core.String,
-      NEXT_CANDIDATE: core.String,
-      NON_CONVERT: core.String,
-      NUM_LOCK: core.String,
-      PAGE_DOWN: core.String,
-      PAGE_UP: core.String,
-      PASTE: core.String,
-      PAUSE: core.String,
-      PLAY: core.String,
-      POWER: core.String,
-      PREVIOUS_CANDIDATE: core.String,
-      PRINT_SCREEN: core.String,
-      PROCESS: core.String,
-      PROPS: core.String,
-      RIGHT: core.String,
-      ROMAN_CHARACTERS: core.String,
-      SCROLL: core.String,
-      SELECT: core.String,
-      SELECT_MEDIA: core.String,
-      SEPARATOR: core.String,
-      SHIFT: core.String,
-      SOFT_1: core.String,
-      SOFT_2: core.String,
-      SOFT_3: core.String,
-      SOFT_4: core.String,
-      STOP: core.String,
-      SUBTRACT: core.String,
-      SYMBOL_LOCK: core.String,
-      UP: core.String,
-      UP_LEFT: core.String,
-      UP_RIGHT: core.String,
-      UNDO: core.String,
-      VOLUME_DOWN: core.String,
-      VOLUMN_MUTE: core.String,
-      VOLUMN_UP: core.String,
-      WIN: core.String,
-      ZOOM: core.String,
-      BACKSPACE: core.String,
-      TAB: core.String,
-      CANCEL: core.String,
-      ESC: core.String,
-      SPACEBAR: core.String,
-      DEL: core.String,
-      DEAD_GRAVE: core.String,
-      DEAD_EACUTE: core.String,
-      DEAD_CIRCUMFLEX: core.String,
-      DEAD_TILDE: core.String,
-      DEAD_MACRON: core.String,
-      DEAD_BREVE: core.String,
-      DEAD_ABOVE_DOT: core.String,
-      DEAD_UMLAUT: core.String,
-      DEAD_ABOVE_RING: core.String,
-      DEAD_DOUBLEACUTE: core.String,
-      DEAD_CARON: core.String,
-      DEAD_CEDILLA: core.String,
-      DEAD_OGONEK: core.String,
-      DEAD_IOTA: core.String,
-      DEAD_VOICED_SOUND: core.String,
-      DEC_SEMIVOICED_SOUND: core.String,
-      UNIDENTIFIED: core.String
-    })
-  });
-  html$._KeyName.ACCEPT = "Accept";
-  html$._KeyName.ADD = "Add";
-  html$._KeyName.AGAIN = "Again";
-  html$._KeyName.ALL_CANDIDATES = "AllCandidates";
-  html$._KeyName.ALPHANUMERIC = "Alphanumeric";
-  html$._KeyName.ALT = "Alt";
-  html$._KeyName.ALT_GRAPH = "AltGraph";
-  html$._KeyName.APPS = "Apps";
-  html$._KeyName.ATTN = "Attn";
-  html$._KeyName.BROWSER_BACK = "BrowserBack";
-  html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
-  html$._KeyName.BROWSER_FORWARD = "BrowserForward";
-  html$._KeyName.BROWSER_NAME = "BrowserHome";
-  html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
-  html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
-  html$._KeyName.BROWSER_STOP = "BrowserStop";
-  html$._KeyName.CAMERA = "Camera";
-  html$._KeyName.CAPS_LOCK = "CapsLock";
-  html$._KeyName.CLEAR = "Clear";
-  html$._KeyName.CODE_INPUT = "CodeInput";
-  html$._KeyName.COMPOSE = "Compose";
-  html$._KeyName.CONTROL = "Control";
-  html$._KeyName.CRSEL = "Crsel";
-  html$._KeyName.CONVERT = "Convert";
-  html$._KeyName.COPY = "Copy";
-  html$._KeyName.CUT = "Cut";
-  html$._KeyName.DECIMAL = "Decimal";
-  html$._KeyName.DIVIDE = "Divide";
-  html$._KeyName.DOWN = "Down";
-  html$._KeyName.DOWN_LEFT = "DownLeft";
-  html$._KeyName.DOWN_RIGHT = "DownRight";
-  html$._KeyName.EJECT = "Eject";
-  html$._KeyName.END = "End";
-  html$._KeyName.ENTER = "Enter";
-  html$._KeyName.ERASE_EOF = "EraseEof";
-  html$._KeyName.EXECUTE = "Execute";
-  html$._KeyName.EXSEL = "Exsel";
-  html$._KeyName.FN = "Fn";
-  html$._KeyName.F1 = "F1";
-  html$._KeyName.F2 = "F2";
-  html$._KeyName.F3 = "F3";
-  html$._KeyName.F4 = "F4";
-  html$._KeyName.F5 = "F5";
-  html$._KeyName.F6 = "F6";
-  html$._KeyName.F7 = "F7";
-  html$._KeyName.F8 = "F8";
-  html$._KeyName.F9 = "F9";
-  html$._KeyName.F10 = "F10";
-  html$._KeyName.F11 = "F11";
-  html$._KeyName.F12 = "F12";
-  html$._KeyName.F13 = "F13";
-  html$._KeyName.F14 = "F14";
-  html$._KeyName.F15 = "F15";
-  html$._KeyName.F16 = "F16";
-  html$._KeyName.F17 = "F17";
-  html$._KeyName.F18 = "F18";
-  html$._KeyName.F19 = "F19";
-  html$._KeyName.F20 = "F20";
-  html$._KeyName.F21 = "F21";
-  html$._KeyName.F22 = "F22";
-  html$._KeyName.F23 = "F23";
-  html$._KeyName.F24 = "F24";
-  html$._KeyName.FINAL_MODE = "FinalMode";
-  html$._KeyName.FIND = "Find";
-  html$._KeyName.FULL_WIDTH = "FullWidth";
-  html$._KeyName.HALF_WIDTH = "HalfWidth";
-  html$._KeyName.HANGUL_MODE = "HangulMode";
-  html$._KeyName.HANJA_MODE = "HanjaMode";
-  html$._KeyName.HELP = "Help";
-  html$._KeyName.HIRAGANA = "Hiragana";
-  html$._KeyName.HOME = "Home";
-  html$._KeyName.INSERT = "Insert";
-  html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
-  html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
-  html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
-  html$._KeyName.JUNJA_MODE = "JunjaMode";
-  html$._KeyName.KANA_MODE = "KanaMode";
-  html$._KeyName.KANJI_MODE = "KanjiMode";
-  html$._KeyName.KATAKANA = "Katakana";
-  html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
-  html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
-  html$._KeyName.LAUNCH_MAIL = "LaunchMail";
-  html$._KeyName.LEFT = "Left";
-  html$._KeyName.MENU = "Menu";
-  html$._KeyName.META = "Meta";
-  html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
-  html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
-  html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
-  html$._KeyName.MEDIA_STOP = "MediaStop";
-  html$._KeyName.MODE_CHANGE = "ModeChange";
-  html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
-  html$._KeyName.NON_CONVERT = "Nonconvert";
-  html$._KeyName.NUM_LOCK = "NumLock";
-  html$._KeyName.PAGE_DOWN = "PageDown";
-  html$._KeyName.PAGE_UP = "PageUp";
-  html$._KeyName.PASTE = "Paste";
-  html$._KeyName.PAUSE = "Pause";
-  html$._KeyName.PLAY = "Play";
-  html$._KeyName.POWER = "Power";
-  html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
-  html$._KeyName.PRINT_SCREEN = "PrintScreen";
-  html$._KeyName.PROCESS = "Process";
-  html$._KeyName.PROPS = "Props";
-  html$._KeyName.RIGHT = "Right";
-  html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
-  html$._KeyName.SCROLL = "Scroll";
-  html$._KeyName.SELECT = "Select";
-  html$._KeyName.SELECT_MEDIA = "SelectMedia";
-  html$._KeyName.SEPARATOR = "Separator";
-  html$._KeyName.SHIFT = "Shift";
-  html$._KeyName.SOFT_1 = "Soft1";
-  html$._KeyName.SOFT_2 = "Soft2";
-  html$._KeyName.SOFT_3 = "Soft3";
-  html$._KeyName.SOFT_4 = "Soft4";
-  html$._KeyName.STOP = "Stop";
-  html$._KeyName.SUBTRACT = "Subtract";
-  html$._KeyName.SYMBOL_LOCK = "SymbolLock";
-  html$._KeyName.UP = "Up";
-  html$._KeyName.UP_LEFT = "UpLeft";
-  html$._KeyName.UP_RIGHT = "UpRight";
-  html$._KeyName.UNDO = "Undo";
-  html$._KeyName.VOLUME_DOWN = "VolumeDown";
-  html$._KeyName.VOLUMN_MUTE = "VolumeMute";
-  html$._KeyName.VOLUMN_UP = "VolumeUp";
-  html$._KeyName.WIN = "Win";
-  html$._KeyName.ZOOM = "Zoom";
-  html$._KeyName.BACKSPACE = "Backspace";
-  html$._KeyName.TAB = "Tab";
-  html$._KeyName.CANCEL = "Cancel";
-  html$._KeyName.ESC = "Esc";
-  html$._KeyName.SPACEBAR = "Spacebar";
-  html$._KeyName.DEL = "Del";
-  html$._KeyName.DEAD_GRAVE = "DeadGrave";
-  html$._KeyName.DEAD_EACUTE = "DeadEacute";
-  html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
-  html$._KeyName.DEAD_TILDE = "DeadTilde";
-  html$._KeyName.DEAD_MACRON = "DeadMacron";
-  html$._KeyName.DEAD_BREVE = "DeadBreve";
-  html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
-  html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
-  html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
-  html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
-  html$._KeyName.DEAD_CARON = "DeadCaron";
-  html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
-  html$._KeyName.DEAD_OGONEK = "DeadOgonek";
-  html$._KeyName.DEAD_IOTA = "DeadIota";
-  html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
-  html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
-  html$._KeyName.UNIDENTIFIED = "Unidentified";
-  const _stream$0 = Symbol('_stream');
-  const _keyDownList = Symbol('_keyDownList');
-  const _capsLockOn = Symbol('_capsLockOn');
-  const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
-  const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
-  const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
-  const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
-  html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
-    forTarget(e, opts) {
-      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-      let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$], e);
-      return handler[_stream$0];
-    }
-    new(type) {
-      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
-      this[_type$] = type;
-      this[_stream$0] = new html$._CustomKeyEventStreamImpl('event');
-      this[_target$0] = null;
-      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
-    }
-    initializeAllEventListeners(type, target) {
-      this[_keyDownList] = JSArrayOfKeyEvent().of([]);
-      this[_type$] = type;
-      this[_target$0] = target;
-      this[_stream$0] = null;
-      super.new(html$._KeyboardEventHandler._EVENT_TYPE);
-      html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
-      html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
-      html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
-      this[_stream$0] = new html$._CustomKeyEventStreamImpl(this[_type$]);
-    }
-    get [_capsLockOn]() {
-      return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
-    }
-    [_determineKeyCodeForKeypress](event) {
-      for (let prevEvent of this[_keyDownList]) {
-        if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
-          return prevEvent.keyCode;
-        }
-        if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
-          return prevEvent.keyCode;
-        }
-      }
-      return html$.KeyCode.UNKNOWN;
-    }
-    [_findCharCodeKeyDown](event) {
-      if (event[dartx.keyLocation] == 3) {
-        switch (event[dartx.keyCode]) {
-          case html$.KeyCode.NUM_ZERO:
-          {
-            return html$.KeyCode.ZERO;
-          }
-          case html$.KeyCode.NUM_ONE:
-          {
-            return html$.KeyCode.ONE;
-          }
-          case html$.KeyCode.NUM_TWO:
-          {
-            return html$.KeyCode.TWO;
-          }
-          case html$.KeyCode.NUM_THREE:
-          {
-            return html$.KeyCode.THREE;
-          }
-          case html$.KeyCode.NUM_FOUR:
-          {
-            return html$.KeyCode.FOUR;
-          }
-          case html$.KeyCode.NUM_FIVE:
-          {
-            return html$.KeyCode.FIVE;
-          }
-          case html$.KeyCode.NUM_SIX:
-          {
-            return html$.KeyCode.SIX;
-          }
-          case html$.KeyCode.NUM_SEVEN:
-          {
-            return html$.KeyCode.SEVEN;
-          }
-          case html$.KeyCode.NUM_EIGHT:
-          {
-            return html$.KeyCode.EIGHT;
-          }
-          case html$.KeyCode.NUM_NINE:
-          {
-            return html$.KeyCode.NINE;
-          }
-          case html$.KeyCode.NUM_MULTIPLY:
-          {
-            return 42;
-          }
-          case html$.KeyCode.NUM_PLUS:
-          {
-            return 43;
-          }
-          case html$.KeyCode.NUM_MINUS:
-          {
-            return 45;
-          }
-          case html$.KeyCode.NUM_PERIOD:
-          {
-            return 46;
-          }
-          case html$.KeyCode.NUM_DIVISION:
-          {
-            return 47;
-          }
-        }
-      } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
-        return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
-      }
-      switch (event[dartx.keyCode]) {
-        case html$.KeyCode.SEMICOLON:
-        {
-          return html$.KeyCode.FF_SEMICOLON;
-        }
-        case html$.KeyCode.EQUALS:
-        {
-          return html$.KeyCode.FF_EQUALS;
-        }
-        case html$.KeyCode.COMMA:
-        {
-          return 44;
-        }
-        case html$.KeyCode.DASH:
-        {
-          return 45;
-        }
-        case html$.KeyCode.PERIOD:
-        {
-          return 46;
-        }
-        case html$.KeyCode.SLASH:
-        {
-          return 47;
-        }
-        case html$.KeyCode.APOSTROPHE:
-        {
-          return 96;
-        }
-        case html$.KeyCode.OPEN_SQUARE_BRACKET:
-        {
-          return 91;
-        }
-        case html$.KeyCode.BACKSLASH:
-        {
-          return 92;
-        }
-        case html$.KeyCode.CLOSE_SQUARE_BRACKET:
-        {
-          return 93;
-        }
-        case html$.KeyCode.SINGLE_QUOTE:
-        {
-          return 39;
-        }
-      }
-      return event[dartx.keyCode];
-    }
-    [_firesKeyPressEvent](event) {
-      if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
-        return true;
-      }
-      if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
-        return html$.KeyCode.isCharacterKey(event.keyCode);
-      }
-      if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
-        return false;
-      }
-      if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
-        return false;
-      }
-      if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
-        return false;
-      }
-      switch (event.keyCode) {
-        case html$.KeyCode.ENTER:
-        {
-          return !dart.test(html_common.Device.isIE);
-        }
-        case html$.KeyCode.ESC:
-        {
-          return !dart.test(html_common.Device.isWebKit);
-        }
-      }
-      return html$.KeyCode.isCharacterKey(event.keyCode);
-    }
-    [_normalizeKeyCodes](event) {
-      if (dart.test(html_common.Device.isFirefox)) {
-        switch (event[dartx.keyCode]) {
-          case html$.KeyCode.FF_EQUALS:
-          {
-            return html$.KeyCode.EQUALS;
-          }
-          case html$.KeyCode.FF_SEMICOLON:
-          {
-            return html$.KeyCode.SEMICOLON;
-          }
-          case html$.KeyCode.MAC_FF_META:
-          {
-            return html$.KeyCode.META;
-          }
-          case html$.KeyCode.WIN_KEY_FF_LINUX:
-          {
-            return html$.KeyCode.WIN_KEY;
-          }
-        }
-      }
-      return event[dartx.keyCode];
-    }
-    processKeyDown(e) {
-      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
-        this[_keyDownList][dartx.clear]();
-      }
-      let event = new html$.KeyEvent.wrap(e);
-      event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
-      event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
-      if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
-        this.processKeyPress(e);
-      }
-      this[_keyDownList][dartx.add](event);
-      this[_stream$0].add(event);
-    }
-    processKeyPress(event) {
-      let e = new html$.KeyEvent.wrap(event);
-      if (dart.test(html_common.Device.isIE)) {
-        if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
-          e[_shadowCharCode] = 0;
-        } else {
-          e[_shadowCharCode] = e.keyCode;
-        }
-      } else if (dart.test(html_common.Device.isOpera)) {
-        e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
-      }
-      e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
-      if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
-        e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
-      }
-      e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
-      this[_stream$0].add(e);
-    }
-    processKeyUp(event) {
-      let e = new html$.KeyEvent.wrap(event);
-      let toRemove = null;
-      for (let key of this[_keyDownList]) {
-        if (key.keyCode == e.keyCode) {
-          toRemove = key;
-        }
-      }
-      if (toRemove != null) {
-        this[_keyDownList][dartx.removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
-      } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
-        this[_keyDownList][dartx.removeLast]();
-      }
-      this[_stream$0].add(e);
-    }
-  };
-  dart.addSimpleTypeTests(html$._KeyboardEventHandler);
-  dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
-  dart.setSignature(html$._KeyboardEventHandler, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
-      initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
-    }),
-    fields: () => ({
-      [_keyDownList]: ListOfKeyEvent(),
-      [_type$]: core.String,
-      [_target$0]: html$.EventTarget,
-      [_stream$0]: html$._CustomKeyEventStreamImpl
-    }),
-    getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
-    methods: () => ({
-      forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
-      [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
-      [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
-      [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
-      [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
-      processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
-      processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
-      processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
-    }),
-    sfields: () => ({
-      _ROMAN_ALPHABET_OFFSET: core.int,
-      _EVENT_TYPE: core.String,
-      _keyIdentifier: MapOfString$int()
-    })
-  });
-  html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
-  html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
-  dart.defineLazy(html$._KeyboardEventHandler, {
-    get _ROMAN_ALPHABET_OFFSET() {
-      return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
-    }
-  });
-  html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
-    static onKeyPress(target) {
-      return new html$._KeyboardEventHandler('keypress').forTarget(target);
-    }
-    static onKeyUp(target) {
-      return new html$._KeyboardEventHandler('keyup').forTarget(target);
-    }
-    static onKeyDown(target) {
-      return new html$._KeyboardEventHandler('keydown').forTarget(target);
-    }
-  };
-  dart.setSignature(html$.KeyboardEventStream, {
-    statics: () => ({
-      onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
-      onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
-      onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
-    }),
-    names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
-  });
-  const _validators = Symbol('_validators');
-  html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
-    new() {
-      this[_validators] = JSArrayOfNodeValidator().of([]);
-    }
-    common() {
-      this[_validators] = JSArrayOfNodeValidator().of([]);
-      this.allowHtml5();
-      this.allowTemplating();
-    }
-    allowNavigation(uriPolicy) {
-      if (uriPolicy === void 0) uriPolicy = null;
-      if (uriPolicy == null) {
-        uriPolicy = html$.UriPolicy.new();
-      }
-      this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
-    }
-    allowImages(uriPolicy) {
-      if (uriPolicy === void 0) uriPolicy = null;
-      if (uriPolicy == null) {
-        uriPolicy = html$.UriPolicy.new();
-      }
-      this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
-    }
-    allowTextElements() {
-      this.add(html$._SimpleNodeValidator.allowTextElements());
-    }
-    allowInlineStyles(opts) {
-      let tagName = opts && 'tagName' in opts ? opts.tagName : null;
-      if (tagName == null) {
-        tagName = '*';
-      } else {
-        tagName = tagName[dartx.toUpperCase]();
-      }
-      this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
-    }
-    allowHtml5(opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
-    }
-    allowSvg() {
-      this.add(new html$._SvgNodeValidator());
-    }
-    allowCustomElement(tagName, opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
-      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
-      let tagNameUpper = tagName[dartx.toUpperCase]();
-      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
-      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
-      if (uriPolicy == null) {
-        uriPolicy = html$.UriPolicy.new();
-      }
-      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
-    }
-    allowTagExtension(tagName, baseName, opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
-      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
-      let baseNameUpper = baseName[dartx.toUpperCase]();
-      let tagNameUpper = tagName[dartx.toUpperCase]();
-      let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
-      let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
-      if (uriPolicy == null) {
-        uriPolicy = html$.UriPolicy.new();
-      }
-      this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
-    }
-    allowElement(tagName, opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      let attributes = opts && 'attributes' in opts ? opts.attributes : null;
-      let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
-      this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
-    }
-    allowTemplating() {
-      this.add(new html$._TemplatingNodeValidator());
-    }
-    add(validator) {
-      this[_validators][dartx.add](validator);
-    }
-    allowsElement(element) {
-      return this[_validators][dartx.any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
-    }
-    allowsAttribute(element, attributeName, value) {
-      return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
-    }
-  };
-  dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
-  html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
-  dart.setSignature(html$.NodeValidatorBuilder, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
-      common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
-    }),
-    fields: () => ({[_validators]: ListOfNodeValidator()}),
-    methods: () => ({
-      allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
-      allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
-      allowTextElements: dart.definiteFunctionType(dart.void, []),
-      allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
-      allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
-      allowSvg: dart.definiteFunctionType(dart.void, []),
-      allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
-      allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
-      allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
-      allowTemplating: dart.definiteFunctionType(dart.void, []),
-      add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
-      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
-      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
-    })
-  });
-  let const$83;
-  let const$84;
-  let const$85;
-  let const$86;
-  let const$87;
-  let const$88;
-  let const$89;
-  let const$90;
-  let const$91;
-  let const$92;
-  html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
-    static allowNavigation(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
-    }
-    static allowImages(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
-    }
-    static allowTextElements() {
-      return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
-    }
-    new(uriPolicy, opts) {
-      let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
-      let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
-      let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
-      this.allowedElements = SetOfString().new();
-      this.allowedAttributes = SetOfString().new();
-      this.allowedUriAttributes = SetOfString().new();
-      this.uriPolicy = uriPolicy;
-      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
-      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
-      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
-      let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
-      let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
-      this.allowedAttributes.addAll(legalAttributes);
-      this.allowedUriAttributes.addAll(allowedUriAttributes);
-      this.allowedUriAttributes.addAll(extraUriAttributes);
-    }
-    allowsElement(element) {
-      return this.allowedElements.contains(html$.Element._safeTagName(element));
-    }
-    allowsAttribute(element, attributeName, value) {
-      let tagName = html$.Element._safeTagName(element);
-      if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
-        return this.uriPolicy.allowsUri(value);
-      } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
-        return this.uriPolicy.allowsUri(value);
-      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
-        return true;
-      } else if (dart.test(this.allowedAttributes.contains(dart.str`*::${attributeName}`))) {
-        return true;
-      } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::*`))) {
-        return true;
-      } else if (dart.test(this.allowedAttributes.contains('*::*'))) {
-        return true;
-      }
-      return false;
-    }
-  };
-  html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
-  dart.setSignature(html$._SimpleNodeValidator, {
-    constructors: () => ({
-      allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
-      allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
-      allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
-      new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
-    }),
-    fields: () => ({
-      allowedElements: SetOfString(),
-      allowedAttributes: SetOfString(),
-      allowedUriAttributes: SetOfString(),
-      uriPolicy: html$.UriPolicy
-    }),
-    methods: () => ({
-      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
-      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
-    })
-  });
-  html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
-    new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
-      this.allowTypeExtension = allowTypeExtension == true;
-      this.allowCustomTag = allowCustomTag == true;
-      super.new(uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
-    }
-    allowsElement(element) {
-      if (dart.test(this.allowTypeExtension)) {
-        let isAttr = element[dartx.attributes][dartx._get]('is');
-        if (isAttr != null) {
-          return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
-        }
-      }
-      return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
-    }
-    allowsAttribute(element, attributeName, value) {
-      if (dart.test(this.allowsElement(element))) {
-        if (dart.test(this.allowTypeExtension) && attributeName == 'is' && dart.test(this.allowedElements.contains(value[dartx.toUpperCase]()))) {
-          return true;
-        }
-        return super.allowsAttribute(element, attributeName, value);
-      }
-      return false;
-    }
-  };
-  dart.setSignature(html$._CustomElementNodeValidator, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
-    fields: () => ({
-      allowTypeExtension: core.bool,
-      allowCustomTag: core.bool
-    })
-  });
-  const _templateAttrs = Symbol('_templateAttrs');
-  html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
-    new() {
-      this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
-      super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
-    }
-    allowsAttribute(element, attributeName, value) {
-      if (dart.test(super.allowsAttribute(element, attributeName, value))) {
-        return true;
-      }
-      if (attributeName == 'template' && value == "") {
-        return true;
-      }
-      if (element[dartx.attributes][dartx._get]('template') == "") {
-        return this[_templateAttrs].contains(attributeName);
-      }
-      return false;
-    }
-  };
-  dart.setSignature(html$._TemplatingNodeValidator, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
-    fields: () => ({[_templateAttrs]: SetOfString()}),
-    sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
-  });
-  html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
-  html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
-    allowsElement(element) {
-      if (svg$.ScriptElement.is(element)) {
-        return false;
-      }
-      if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
-        return false;
-      }
-      if (svg$.SvgElement.is(element)) {
-        return true;
-      }
-      return false;
-    }
-    allowsAttribute(element, attributeName, value) {
-      if (attributeName == 'is' || dart.test(attributeName[dartx.startsWith]('on'))) {
-        return false;
-      }
-      return this.allowsElement(element);
-    }
-  };
-  html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
-  dart.setSignature(html$._SvgNodeValidator, {
-    methods: () => ({
-      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
-      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
-    })
-  });
-  html$.ReadyState = class ReadyState extends core.Object {};
-  dart.setSignature(html$.ReadyState, {
-    sfields: () => ({
-      LOADING: core.String,
-      INTERACTIVE: core.String,
-      COMPLETE: core.String
-    })
-  });
-  html$.ReadyState.LOADING = "loading";
-  html$.ReadyState.INTERACTIVE = "interactive";
-  html$.ReadyState.COMPLETE = "complete";
-  const _list$ = Symbol('_list');
-  html$._WrappedList$ = dart.generic(E => {
-    let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
-    let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
-    class _WrappedList extends collection.ListBase$(E) {
-      new(list) {
-        this[_list$] = list;
-      }
-      get iterator() {
-        return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
-      }
-      get length() {
-        return this[_list$][dartx.length];
-      }
-      add(element) {
-        E._check(element);
-        this[_list$][dartx.add](element);
-      }
-      remove(element) {
-        return this[_list$][dartx.remove](element);
-      }
-      clear() {
-        this[_list$][dartx.clear]();
-      }
-      _get(index) {
-        return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
-      }
-      _set(index, value) {
-        E._check(value);
-        this[_list$][dartx._set](index, value);
-        return value;
-      }
-      set length(newLength) {
-        this[_list$][dartx.length] = newLength;
-      }
-      sort(compare) {
-        if (compare === void 0) compare = null;
-        this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
-      }
-      indexOf(element, start) {
-        if (start === void 0) start = 0;
-        return this[_list$][dartx.indexOf](html$.Node._check(element), start);
-      }
-      lastIndexOf(element, start) {
-        if (start === void 0) start = null;
-        return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
-      }
-      insert(index, element) {
-        E._check(element);
-        return this[_list$][dartx.insert](index, element);
-      }
-      removeAt(index) {
-        return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
-      }
-      setRange(start, end, iterable, skipCount) {
-        IterableOfE()._check(iterable);
-        if (skipCount === void 0) skipCount = 0;
-        this[_list$][dartx.setRange](start, end, iterable, skipCount);
-      }
-      removeRange(start, end) {
-        this[_list$][dartx.removeRange](start, end);
-      }
-      replaceRange(start, end, iterable) {
-        IterableOfE()._check(iterable);
-        this[_list$][dartx.replaceRange](start, end, iterable);
-      }
-      fillRange(start, end, fillValue) {
-        if (fillValue === void 0) fillValue = null;
-        E._check(fillValue);
-        this[_list$][dartx.fillRange](start, end, fillValue);
-      }
-      get rawList() {
-        return this[_list$];
-      }
-    }
-    _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
-    dart.setSignature(_WrappedList, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
-      fields: () => ({[_list$]: ListOfNode()}),
-      getters: () => ({
-        length: dart.definiteFunctionType(core.int, []),
-        rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
-      }),
-      setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-      methods: () => ({
-        _get: dart.definiteFunctionType(E, [core.int]),
-        _set: dart.definiteFunctionType(dart.void, [core.int, E])
-      })
-    });
-    dart.defineExtensionMembers(_WrappedList, [
-      'add',
-      'remove',
-      'clear',
-      '_get',
-      '_set',
-      'sort',
-      'indexOf',
-      'lastIndexOf',
-      'insert',
-      'removeAt',
-      'setRange',
-      'removeRange',
-      'replaceRange',
-      'fillRange',
-      'iterator',
-      'length',
-      'length'
-    ]);
-    return _WrappedList;
-  });
-  html$._WrappedList = _WrappedList();
-  const _iterator$1 = Symbol('_iterator');
-  html$._WrappedIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    class _WrappedIterator extends core.Object {
-      new(iterator) {
-        this[_iterator$1] = iterator;
-      }
-      moveNext() {
-        return this[_iterator$1].moveNext();
-      }
-      get current() {
-        return html$._downcast(html$.Node, E)(this[_iterator$1].current);
-      }
-    }
-    dart.addTypeTests(_WrappedIterator);
-    _WrappedIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_WrappedIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
-      fields: () => ({[_iterator$1]: IteratorOfNode()}),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _WrappedIterator;
-  });
-  html$._WrappedIterator = _WrappedIterator();
-  html$._downcast = function(From, To) {
-    return x => {
-      return To._check(x);
-    };
-  };
-  dart.fn(html$._downcast, FromToTo());
-  html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
-    static get(url, onComplete, withCredentials) {
-      let request = html$.HttpRequest.new();
-      request[dartx.open]('GET', url, {async: true});
-      request[dartx.withCredentials] = withCredentials;
-      request[dartx.onReadyStateChange].listen(dart.fn(e => {
-        if (request[dartx.readyState] == html$.HttpRequest.DONE) {
-          onComplete(request);
-        }
-      }, ProgressEventToNull()));
-      request[dartx.send]();
-      return request;
-    }
-  };
-  dart.setSignature(html$._HttpRequestUtils, {
-    statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
-    names: ['get']
-  });
-  const _array = Symbol('_array');
-  const _current$4 = Symbol('_current');
-  html$.FixedSizeListIterator$ = dart.generic(T => {
-    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
-    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
-    class FixedSizeListIterator extends core.Object {
-      new(array) {
-        this[_array] = array;
-        this[_position$1] = -1;
-        this[_length$3] = array[dartx.length];
-        this[_current$4] = null;
-      }
-      moveNext() {
-        let nextPosition = dart.notNull(this[_position$1]) + 1;
-        if (nextPosition < dart.notNull(this[_length$3])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
-          this[_position$1] = nextPosition;
-          return true;
-        }
-        this[_current$4] = null;
-        this[_position$1] = this[_length$3];
-        return false;
-      }
-      get current() {
-        return this[_current$4];
-      }
-    }
-    dart.addTypeTests(FixedSizeListIterator);
-    FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
-    dart.setSignature(FixedSizeListIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
-      fields: () => ({
-        [_array]: ListOfT(),
-        [_length$3]: core.int,
-        [_position$1]: core.int,
-        [_current$4]: T
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return FixedSizeListIterator;
-  });
-  html$.FixedSizeListIterator = FixedSizeListIterator();
-  html$._VariableSizeListIterator$ = dart.generic(T => {
-    let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
-    let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
-    class _VariableSizeListIterator extends core.Object {
-      new(array) {
-        this[_array] = array;
-        this[_position$1] = -1;
-        this[_current$4] = null;
-      }
-      moveNext() {
-        let nextPosition = dart.notNull(this[_position$1]) + 1;
-        if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
-          this[_position$1] = nextPosition;
-          return true;
-        }
-        this[_current$4] = null;
-        this[_position$1] = this[_array][dartx.length];
-        return false;
-      }
-      get current() {
-        return this[_current$4];
-      }
-    }
-    dart.addTypeTests(_VariableSizeListIterator);
-    _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
-    dart.setSignature(_VariableSizeListIterator, {
-      constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
-      fields: () => ({
-        [_array]: ListOfT(),
-        [_position$1]: core.int,
-        [_current$4]: T
-      }),
-      getters: () => ({current: dart.definiteFunctionType(T, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _VariableSizeListIterator;
-  });
-  html$._VariableSizeListIterator = _VariableSizeListIterator();
-  html$._convertNativeToDart_Window = function(win) {
-    if (win == null) return null;
-    return html$._DOMWindowCrossFrame._createSafe(win);
-  };
-  dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
-  html$._convertNativeToDart_EventTarget = function(e) {
-    if (e == null) {
-      return null;
-    }
-    if ("postMessage" in e) {
-      let window = html$._DOMWindowCrossFrame._createSafe(e);
-      if (html$.EventTarget.is(window)) {
-        return window;
-      }
-      return null;
-    } else
-      return html$.EventTarget._check(e);
-  };
-  dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
-  const _window = Symbol('_window');
-  html$._convertDartToNative_EventTarget = function(e) {
-    if (html$._DOMWindowCrossFrame.is(e)) {
-      return html$.EventTarget._check(e[_window]);
-    } else {
-      return html$.EventTarget._check(e);
-    }
-  };
-  dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
-  html$._convertNativeToDart_XHR_Response = function(o) {
-    if (html$.Document.is(o)) {
-      return o;
-    }
-    return html_common.convertNativeToDart_SerializedScriptValue(o);
-  };
-  dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
-  html$._callConstructor = function(constructor, interceptor) {
-    return dart.fn(receiver => {
-      _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
-      receiver.constructor = receiver.__proto__.constructor;
-      return constructor(receiver);
-    }, dynamicTodynamic$());
-  };
-  dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
-  html$._callAttached = function(receiver) {
-    return dart.dsend(receiver, 'attached');
-  };
-  dart.fn(html$._callAttached, dynamicTodynamic$());
-  html$._callDetached = function(receiver) {
-    return dart.dsend(receiver, 'detached');
-  };
-  dart.fn(html$._callDetached, dynamicTodynamic$());
-  html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
-    return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
-  };
-  dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
-  html$._makeCallbackMethod = function(callback) {
-    return (function(invokeCallback) {
-      return function() {
-        return invokeCallback(this);
-      };
-    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
-  };
-  dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
-  html$._makeCallbackMethod3 = function(callback) {
-    return (function(invokeCallback) {
-      return function(arg1, arg2, arg3) {
-        return invokeCallback(this, arg1, arg2, arg3);
-      };
-    })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
-  };
-  dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
-  html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
-    let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
-    if (interceptorClass == null) {
-      dart.throw(new core.ArgumentError(type));
-    }
-    let interceptor = interceptorClass.prototype;
-    let constructor = _interceptors.findConstructorForNativeSubclassType(type, 'created');
-    if (constructor == null) {
-      dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
-    }
-    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
-    let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
-    if (baseClassName == null) {
-      dart.throw(new core.ArgumentError(type));
-    }
-    if (extendsTagName == null) {
-      if (baseClassName != 'HTMLElement') {
-        dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
-      }
-    } else {
-      if (!(document.createElement(extendsTagName) instanceof window[baseClassName])) {
-        dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
-      }
-    }
-    let baseConstructor = context[baseClassName];
-    let properties = {};
-    properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
-    properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
-    properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
-    properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
-    let baseProto = baseConstructor.prototype;
-    let proto = Object.create(baseProto, properties);
-    _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
-    let options = {prototype: proto};
-    if (extendsTagName != null) {
-      options.extends = extendsTagName;
-    }
-    document.registerElement(tag, options);
-  };
-  dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
-  html$._initializeCustomElement = function(e) {
-  };
-  dart.fn(html$._initializeCustomElement, ElementTovoid$());
-  const _interceptor = Symbol('_interceptor');
-  const _constructor = Symbol('_constructor');
-  const _nativeType = Symbol('_nativeType');
-  html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
-    new(document, type, extendsTag) {
-      this[_interceptor] = null;
-      this[_constructor] = null;
-      this[_nativeType] = null;
-      let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
-      if (interceptorClass == null) {
-        dart.throw(new core.ArgumentError(type));
-      }
-      this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, 'created');
-      if (this[_constructor] == null) {
-        dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
-      }
-      _interceptors.getNativeInterceptor(html$.Element.tag('article'));
-      let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
-      if (baseClassName == null) {
-        dart.throw(new core.ArgumentError(type));
-      }
-      if (extendsTag == null) {
-        if (!dart.equals(baseClassName, 'HTMLElement')) {
-          dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
-        }
-        this[_nativeType] = dart.wrapType(html$.HtmlElement);
-      } else {
-        let element = document[dartx.createElement](extendsTag);
-        if (!(element instanceof window[baseClassName])) {
-          dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
-        }
-        this[_nativeType] = dart.runtimeType(element);
-      }
-      this[_interceptor] = interceptorClass.prototype;
-    }
-    upgrade(element) {
-      if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
-        dart.throw(new core.ArgumentError(dart.str`element is not subclass of ${this[_nativeType]}`));
-      }
-      _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
-      this[_constructor](element);
-      return element;
-    }
-  };
-  html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
-  dart.setSignature(html$._JSElementUpgrader, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
-    fields: () => ({
-      [_interceptor]: dart.dynamic,
-      [_constructor]: dart.dynamic,
-      [_nativeType]: dart.dynamic
-    }),
-    methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
-  });
-  html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
-    get history() {
-      return html$._HistoryCrossFrame._createSafe(this[_window].history);
-    }
-    get location() {
-      return html$._LocationCrossFrame._createSafe(this[_window].location);
-    }
-    get closed() {
-      return this[_window].closed;
-    }
-    get opener() {
-      return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
-    }
-    get parent() {
-      return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
-    }
-    get top() {
-      return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
-    }
-    close() {
-      return this[_window].close();
-    }
-    postMessage(message, targetOrigin, messagePorts) {
-      if (messagePorts === void 0) messagePorts = null;
-      if (messagePorts == null) {
-        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
-      } else {
-        this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
-      }
-    }
-    new(window) {
-      this[_window] = window;
-    }
-    static _createSafe(w) {
-      if (core.identical(w, html$.window)) {
-        return html$.WindowBase._check(w);
-      } else {
-        return new html$._DOMWindowCrossFrame(w);
-      }
-    }
-    get on() {
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-    [_addEventListener](type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-    addEventListener(type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-    dispatchEvent(event) {
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-    [_removeEventListener](type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-    removeEventListener(type, listener, useCapture) {
-      if (useCapture === void 0) useCapture = null;
-      return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
-    }
-  };
-  html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
-  dart.setSignature(html$._DOMWindowCrossFrame, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
-    fields: () => ({[_window]: dart.dynamic}),
-    getters: () => ({
-      history: dart.definiteFunctionType(html$.HistoryBase, []),
-      location: dart.definiteFunctionType(html$.LocationBase, []),
-      closed: dart.definiteFunctionType(core.bool, []),
-      opener: dart.definiteFunctionType(html$.WindowBase, []),
-      parent: dart.definiteFunctionType(html$.WindowBase, []),
-      top: dart.definiteFunctionType(html$.WindowBase, []),
-      on: dart.definiteFunctionType(html$.Events, [])
-    }),
-    methods: () => ({
-      close: dart.definiteFunctionType(dart.void, []),
-      postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
-      [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
-      [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
-      removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
-    }),
-    statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
-    names: ['_createSafe']
-  });
-  dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
-    'close',
-    'postMessage',
-    'history',
-    'location',
-    'closed',
-    'opener',
-    'parent',
-    'top'
-  ]);
-  html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
-    set href(val) {
-      return html$._LocationCrossFrame._setHref(this[_location], val);
-    }
-    static _setHref(location, val) {
-      location.href = val;
-    }
-    new(location) {
-      this[_location] = location;
-    }
-    static _createSafe(location) {
-      if (core.identical(location, html$.window[dartx.location])) {
-        return html$.LocationBase._check(location);
-      } else {
-        return new html$._LocationCrossFrame(location);
-      }
-    }
-  };
-  html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
-  dart.setSignature(html$._LocationCrossFrame, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
-    fields: () => ({[_location]: dart.dynamic}),
-    setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
-    statics: () => ({
-      _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-      _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
-    }),
-    names: ['_setHref', '_createSafe']
-  });
-  dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
-  const _history = Symbol('_history');
-  html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
-    back() {
-      return this[_history].back();
-    }
-    forward() {
-      return this[_history].forward();
-    }
-    go(distance) {
-      return this[_history].go(distance);
-    }
-    new(history) {
-      this[_history] = history;
-    }
-    static _createSafe(h) {
-      if (core.identical(h, html$.window[dartx.history])) {
-        return html$.HistoryBase._check(h);
-      } else {
-        return new html$._HistoryCrossFrame(h);
-      }
-    }
-  };
-  html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
-  dart.setSignature(html$._HistoryCrossFrame, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
-    fields: () => ({[_history]: dart.dynamic}),
-    methods: () => ({
-      back: dart.definiteFunctionType(dart.void, []),
-      forward: dart.definiteFunctionType(dart.void, []),
-      go: dart.definiteFunctionType(dart.void, [core.int])
-    }),
-    statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
-    names: ['_createSafe']
-  });
-  dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
-  html$.Platform = class Platform extends core.Object {};
-  dart.setSignature(html$.Platform, {
-    sfields: () => ({
-      supportsTypedData: core.bool,
-      supportsSimd: core.bool
-    })
-  });
-  html$.Platform.supportsSimd = false;
-  dart.defineLazy(html$.Platform, {
-    get supportsTypedData() {
-      return !!window.ArrayBuffer;
-    }
-  });
-  html$._wrapZoneCallback$ = dart.generic((A, R) => {
-    const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
-    return _wrapZoneCallback;
-  });
-  html$._wrapZoneCallback = _wrapZoneCallback();
-  html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
-    const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
-    return _wrapZoneBinaryCallback;
-  });
-  html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
-  html$._wrapZone = function(A, R) {
-    return callback => {
-      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
-      if (callback == null) return null;
-      return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
-    };
-  };
-  dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
-  html$._wrapBinaryZone = function(A, B, R) {
-    return callback => {
-      if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
-      if (callback == null) return null;
-      return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
-    };
-  };
-  dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
-  html$.query = function(relativeSelectors) {
-    return html$.document[dartx.query](relativeSelectors);
-  };
-  dart.fn(html$.query, StringToElement());
-  html$.queryAll = function(relativeSelectors) {
-    return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
-  };
-  dart.fn(html$.queryAll, StringToElementListOfElement());
-  html$.querySelector = function(selectors) {
-    return html$.document[dartx.querySelector](selectors);
-  };
-  dart.fn(html$.querySelector, StringToElement());
-  html$.querySelectorAll = function(selectors) {
-    return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
-  };
-  dart.fn(html$.querySelectorAll, StringToElementListOfElement());
-  html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
-  html$.NodeValidator = class NodeValidator extends core.Object {
-    static new(opts) {
-      let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-      return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
-    }
-    static throws(base) {
-      return new html$._ThrowsNodeValidator(base);
-    }
-  };
-  dart.setSignature(html$.NodeValidator, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
-      throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
-    })
-  });
-  html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
-    static new(validator) {
-      return new html$._ValidatingTreeSanitizer(validator);
-    }
-  };
-  dart.setSignature(html$.NodeTreeSanitizer, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
-    sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
-  });
-  dart.defineLazy(html$.NodeTreeSanitizer, {
-    get trusted() {
-      return dart.const(new html$._TrustedHtmlTreeSanitizer());
-    }
-  });
-  html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
-    new() {
-    }
-    sanitizeTree(node) {}
-  };
-  html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
-  dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
-    methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
-  });
-  html$.UriPolicy = class UriPolicy extends core.Object {
-    static new() {
-      return new html$._SameOriginUriPolicy();
-    }
-  };
-  dart.setSignature(html$.UriPolicy, {
-    constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
-  });
-  const _hiddenAnchor = Symbol('_hiddenAnchor');
-  const _loc = Symbol('_loc');
-  html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
-    new() {
-      this[_hiddenAnchor] = html$.AnchorElement.new();
-      this[_loc] = html$.window[dartx.location];
-    }
-    allowsUri(uri) {
-      this[_hiddenAnchor][dartx.href] = uri;
-      return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
-    }
-  };
-  html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
-  dart.setSignature(html$._SameOriginUriPolicy, {
-    fields: () => ({
-      [_hiddenAnchor]: html$.AnchorElement,
-      [_loc]: html$.Location
-    }),
-    methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
-  });
-  html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
-    new(validator) {
-      this.validator = validator;
-    }
-    allowsElement(element) {
-      if (!dart.test(this.validator.allowsElement(element))) {
-        dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
-      }
-      return true;
-    }
-    allowsAttribute(element, attributeName, value) {
-      if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
-        dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
-      }
-    }
-  };
-  html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
-  dart.setSignature(html$._ThrowsNodeValidator, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
-    fields: () => ({validator: html$.NodeValidator}),
-    methods: () => ({
-      allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
-      allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
-    })
-  });
-  const _removeNode = Symbol('_removeNode');
-  const _sanitizeElement = Symbol('_sanitizeElement');
-  const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
-  html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
-    new(validator) {
-      this.validator = validator;
-    }
-    sanitizeTree(node) {
-      const walk = (function(node, parent) {
-        this.sanitizeNode(node, parent);
-        let child = node[dartx.lastChild];
-        while (child != null) {
-          let nextChild = child[dartx.previousNode];
-          walk(child, node);
-          child = nextChild;
-        }
-      }).bind(this);
-      dart.fn(walk, NodeAndNodeTovoid());
-      walk(node, null);
-    }
-    [_removeNode](node, parent) {
-      if (parent == null) {
-        node[dartx.remove]();
-      } else {
-        parent[_removeChild](node);
-      }
-    }
-    [_sanitizeUntrustedElement](element, parent) {
-      let corrupted = true;
-      let attrs = null;
-      let isAttr = null;
-      try {
-        attrs = dart.dload(element, 'attributes');
-        isAttr = dart.dindex(attrs, 'is');
-        let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
-        corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
-      } catch (e) {
-      }
-
-      let elementText = 'element unprintable';
-      try {
-        elementText = dart.toString(element);
-      } catch (e) {
-      }
-
-      try {
-        let elementTagName = html$.Element._safeTagName(element);
-        this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
-      } catch (e$) {
-        if (core.ArgumentError.is(e$)) {
-          throw e$;
-        } else {
-          let e = e$;
-          this[_removeNode](html$.Node._check(element), parent);
-          html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
-        }
-      }
-
-    }
-    [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
-      if (false != corrupted) {
-        this[_removeNode](element, parent);
-        html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
-        return;
-      }
-      if (!dart.test(this.validator.allowsElement(element))) {
-        this[_removeNode](element, parent);
-        html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
-        return;
-      }
-      if (isAttr != null) {
-        if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
-          this[_removeNode](element, parent);
-          html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
-          return;
-        }
-      }
-      let keys = attrs[dartx.keys][dartx.toList]();
-      for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
-        let name = keys[dartx._get](i);
-        if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
-          html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
-          attrs[dartx.remove](name);
-        }
-      }
-      if (html$.TemplateElement.is(element)) {
-        let template = element;
-        this.sanitizeTree(template[dartx.content]);
-      }
-    }
-    sanitizeNode(node, parent) {
-      switch (node[dartx.nodeType]) {
-        case html$.Node.ELEMENT_NODE:
-        {
-          this[_sanitizeUntrustedElement](node, parent);
-          break;
-        }
-        case html$.Node.COMMENT_NODE:
-        case html$.Node.DOCUMENT_FRAGMENT_NODE:
-        case html$.Node.TEXT_NODE:
-        case html$.Node.CDATA_SECTION_NODE:
-        {
-          break;
-        }
-        default:
-        {
-          this[_removeNode](node, parent);
-        }
-      }
-    }
-  };
-  html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
-  dart.setSignature(html$._ValidatingTreeSanitizer, {
-    constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
-    fields: () => ({validator: html$.NodeValidator}),
-    methods: () => ({
-      sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
-      [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
-      [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
-      [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
-      sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
-    })
-  });
-  html_common.convertDartToNative_SerializedScriptValue = function(value) {
-    return html_common.convertDartToNative_PrepareForStructuredClone(value);
-  };
-  dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
-  html_common.convertNativeToDart_SerializedScriptValue = function(object) {
-    return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
-  };
-  dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
-  html_common._StructuredClone = class _StructuredClone extends core.Object {
-    new() {
-      this.values = [];
-      this.copies = [];
-    }
-    findSlot(value) {
-      let length = this.values[dartx.length];
-      for (let i = 0; i < dart.notNull(length); i++) {
-        if (core.identical(this.values[dartx._get](i), value)) return i;
-      }
-      this.values[dartx.add](value);
-      this.copies[dartx.add](null);
-      return length;
-    }
-    readSlot(i) {
-      return this.copies[dartx._get](i);
-    }
-    writeSlot(i, x) {
-      this.copies[dartx._set](i, x);
-    }
-    cleanupSlots() {}
-    walk(e) {
-      if (e == null) return e;
-      if (typeof e == 'boolean') return e;
-      if (typeof e == 'number') return e;
-      if (typeof e == 'string') return e;
-      if (core.DateTime.is(e)) {
-        return html_common.convertDartToNative_DateTime(e);
-      }
-      if (core.RegExp.is(e)) {
-        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
-      }
-      if (html$.File.is(e)) return e;
-      if (html$.Blob.is(e)) return e;
-      if (html$.FileList.is(e)) return e;
-      if (html$.ImageData.is(e)) return e;
-      if (dart.test(this.cloneNotRequired(e))) return e;
-      if (core.Map.is(e)) {
-        let slot = this.findSlot(e);
-        let copy = this.readSlot(slot);
-        if (copy != null) return copy;
-        copy = this.newJsMap();
-        this.writeSlot(slot, copy);
-        e[dartx.forEach](dart.fn((key, value) => {
-          this.putIntoMap(copy, key, this.walk(value));
-        }, dynamicAnddynamicToNull()));
-        return copy;
-      }
-      if (core.List.is(e)) {
-        let slot = this.findSlot(e);
-        let copy = this.readSlot(slot);
-        if (copy != null) return copy;
-        copy = this.copyList(e, slot);
-        return copy;
-      }
-      dart.throw(new core.UnimplementedError('structured clone of other type'));
-    }
-    copyList(e, slot) {
-      let i = 0;
-      let length = e[dartx.length];
-      let copy = this.newJsList(length);
-      this.writeSlot(slot, copy);
-      for (; i < dart.notNull(length); i++) {
-        copy[dartx._set](i, this.walk(e[dartx._get](i)));
-      }
-      return copy;
-    }
-    convertDartToNative_PrepareForStructuredClone(value) {
-      let copy = this.walk(value);
-      this.cleanupSlots();
-      return copy;
-    }
-  };
-  dart.setSignature(html_common._StructuredClone, {
-    fields: () => ({
-      values: core.List,
-      copies: core.List
-    }),
-    methods: () => ({
-      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
-      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
-      cleanupSlots: dart.definiteFunctionType(dart.dynamic, []),
-      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      copyList: dart.definiteFunctionType(core.List, [core.List, core.int]),
-      convertDartToNative_PrepareForStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    })
-  });
-  html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
-    new() {
-      this.values = [];
-      this.copies = [];
-      this.mustCopy = false;
-    }
-    findSlot(value) {
-      let length = this.values[dartx.length];
-      for (let i = 0; i < dart.notNull(length); i++) {
-        if (dart.test(this.identicalInJs(this.values[dartx._get](i), value))) return i;
-      }
-      this.values[dartx.add](value);
-      this.copies[dartx.add](null);
-      return length;
-    }
-    readSlot(i) {
-      return this.copies[dartx._get](i);
-    }
-    writeSlot(i, x) {
-      this.copies[dartx._set](i, x);
-    }
-    walk(e) {
-      if (e == null) return e;
-      if (typeof e == 'boolean') return e;
-      if (typeof e == 'number') return e;
-      if (typeof e == 'string') return e;
-      if (dart.test(html_common.isJavaScriptDate(e))) {
-        return html_common.convertNativeToDart_DateTime(e);
-      }
-      if (dart.test(html_common.isJavaScriptRegExp(e))) {
-        dart.throw(new core.UnimplementedError('structured clone of RegExp'));
-      }
-      if (dart.test(html_common.isJavaScriptPromise(e))) {
-        return html_common.convertNativePromiseToDartFuture(e);
-      }
-      if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
-        let slot = this.findSlot(e);
-        let copy = this.readSlot(slot);
-        if (copy != null) return copy;
-        copy = dart.map();
-        this.writeSlot(slot, copy);
-        this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
-        return copy;
-      }
-      if (dart.test(html_common.isJavaScriptArray(e))) {
-        let l = e;
-        let slot = this.findSlot(l);
-        let copy = this.readSlot(slot);
-        if (copy != null) return copy;
-        let length = l[dartx.length];
-        copy = dart.test(this.mustCopy) ? this.newDartList(length) : l;
-        this.writeSlot(slot, copy);
-        for (let i = 0; i < dart.notNull(length); i++) {
-          copy[dartx._set](i, this.walk(l[dartx._get](i)));
-        }
-        return copy;
-      }
-      return e;
-    }
-    convertNativeToDart_AcceptStructuredClone(object, opts) {
-      let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
-      this.mustCopy = core.bool._check(mustCopy);
-      let copy = this.walk(object);
-      return copy;
-    }
-  };
-  dart.setSignature(html_common._AcceptStructuredClone, {
-    fields: () => ({
-      values: core.List,
-      copies: core.List,
-      mustCopy: core.bool
-    }),
-    methods: () => ({
-      findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
-      readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
-      writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
-      walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
-      convertNativeToDart_AcceptStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
-    })
-  });
-  html_common.ContextAttributes = class ContextAttributes extends core.Object {
-    new(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
-      this.alpha = alpha;
-      this.antialias = antialias;
-      this.depth = depth;
-      this.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
-      this.premultipliedAlpha = premultipliedAlpha;
-      this.preserveDrawingBuffer = preserveDrawingBuffer;
-      this.stencil = stencil;
-    }
-  };
-  dart.setSignature(html_common.ContextAttributes, {
-    constructors: () => ({new: dart.definiteFunctionType(html_common.ContextAttributes, [core.bool, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool])}),
-    fields: () => ({
-      alpha: core.bool,
-      antialias: core.bool,
-      depth: core.bool,
-      premultipliedAlpha: core.bool,
-      preserveDrawingBuffer: core.bool,
-      stencil: core.bool,
-      failIfMajorPerformanceCaveat: core.bool
-    })
-  });
-  html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
-    return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
-  };
-  dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
-  html_common._TypedImageData = class _TypedImageData extends core.Object {
-    new(data, height, width) {
-      this.data = data;
-      this.height = height;
-      this.width = width;
-    }
-  };
-  html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
-  dart.setSignature(html_common._TypedImageData, {
-    constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
-    fields: () => ({
-      data: typed_data.Uint8ClampedList,
-      height: core.int,
-      width: core.int
-    })
-  });
-  html_common.convertNativeToDart_ImageData = function(nativeImageData) {
-    0;
-    if (html$.ImageData.is(nativeImageData)) {
-      let data = nativeImageData[dartx.data];
-      if (data.constructor === Array) {
-        if (typeof CanvasPixelArray !== "undefined") {
-          data.constructor = CanvasPixelArray;
-          data.BYTES_PER_ELEMENT = 1;
-        }
-      }
-      return nativeImageData;
-    }
-    return new html_common._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
-  };
-  dart.fn(html_common.convertNativeToDart_ImageData, dynamicToImageData());
-  html_common.convertDartToNative_ImageData = function(imageData) {
-    if (html_common._TypedImageData.is(imageData)) {
-      return {data: imageData.data, height: imageData.height, width: imageData.width};
-    }
-    return imageData;
-  };
-  dart.fn(html_common.convertDartToNative_ImageData, ImageDataTodynamic());
-  html_common._serializedScriptValue = 'num|String|bool|' + 'JSExtendableArray|=Object|' + 'Blob|File|NativeByteBuffer|NativeTypedData';
-  html_common.annotation_Creates_SerializedScriptValue = dart.const(new _js_helper.Creates(html_common._serializedScriptValue));
-  html_common.annotation_Returns_SerializedScriptValue = dart.const(new _js_helper.Returns(html_common._serializedScriptValue));
-  html_common.convertNativeToDart_Dictionary = function(object) {
-    if (object == null) return null;
-    let dict = dart.map();
-    let keys = Object.getOwnPropertyNames(object);
-    for (let key of core.Iterable._check(keys)) {
-      dict[dartx._set](key, object[key]);
-    }
-    return dict;
-  };
-  dart.fn(html_common.convertNativeToDart_Dictionary, dynamicToMap());
-  html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
-    if (postCreate === void 0) postCreate = null;
-    if (dict == null) return null;
-    let object = {};
-    if (postCreate != null) {
-      dart.dcall(postCreate, object);
-    }
-    dict[dartx.forEach](dart.fn((key, value) => {
-      object[key] = value;
-    }, StringAnddynamicToNull()));
-    return object;
-  };
-  dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
-  html_common.convertDartToNative_StringArray = function(input) {
-    return input;
-  };
-  dart.fn(html_common.convertDartToNative_StringArray, ListOfStringToList());
-  html_common.convertNativeToDart_DateTime = function(date) {
-    let millisSinceEpoch = date.getTime();
-    return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
-  };
-  dart.fn(html_common.convertNativeToDart_DateTime, dynamicToDateTime());
-  html_common.convertDartToNative_DateTime = function(date) {
-    return new Date(date.millisecondsSinceEpoch);
-  };
-  dart.fn(html_common.convertDartToNative_DateTime, DateTimeTodynamic());
-  html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
-    return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
-  };
-  dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
-  html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
-    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
-    return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
-  };
-  dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
-  html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
-    new() {
-      super.new();
-    }
-    newJsMap() {
-      return {};
-    }
-    putIntoMap(map, key, value) {
-      return map[key] = value;
-    }
-    newJsList(length) {
-      return new Array(length);
-    }
-    cloneNotRequired(e) {
-      return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e);
-    }
-  };
-  dart.setSignature(html_common._StructuredCloneDart2Js, {
-    methods: () => ({
-      newJsMap: dart.definiteFunctionType(dart.dynamic, []),
-      putIntoMap: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
-      newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      cloneNotRequired: dart.definiteFunctionType(core.bool, [dart.dynamic])
-    })
-  });
-  html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
-    new() {
-      super.new();
-    }
-    newJsList(length) {
-      return new Array(length);
-    }
-    newDartList(length) {
-      return this.newJsList(length);
-    }
-    identicalInJs(a, b) {
-      return core.identical(a, b);
-    }
-    forEachJsField(object, action) {
-      for (let key of Object.keys(object)) {
-        dart.dcall(action, key, object[key]);
-      }
-    }
-  };
-  dart.setSignature(html_common._AcceptStructuredCloneDart2Js, {
-    methods: () => ({
-      newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      newDartList: dart.definiteFunctionType(core.List, [dart.dynamic]),
-      identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
-      forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dynamicAnddynamicTodynamic()])
-    })
-  });
-  html_common.isJavaScriptDate = function(value) {
-    return value instanceof Date;
-  };
-  dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
-  html_common.isJavaScriptRegExp = function(value) {
-    return value instanceof RegExp;
-  };
-  dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
-  html_common.isJavaScriptArray = function(value) {
-    return value instanceof Array;
-  };
-  dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
-  html_common.isJavaScriptSimpleObject = function(value) {
-    let proto = Object.getPrototypeOf(value);
-    return proto === Object.prototype || proto === null;
-  };
-  dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
-  html_common.isImmutableJavaScriptArray = function(value) {
-    return !!value.immutable$list;
-  };
-  dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
-  html_common.isJavaScriptPromise = function(value) {
-    return typeof Promise != "undefined" && value instanceof Promise;
-  };
-  dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
-  html_common.convertNativePromiseToDartFuture = function(promise) {
-    let completer = async.Completer.new();
-    let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
-    let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
-    let newPromise = promise.then(then).catch(error);
-    return completer.future;
-  };
-  dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
-  html_common.Device = class Device extends core.Object {
-    static get userAgent() {
-      return html$.window[dartx.navigator][dartx.userAgent];
-    }
-    static get isOpera() {
-      if (html_common.Device._isOpera == null) {
-        html_common.Device._isOpera = html_common.Device.userAgent[dartx.contains]("Opera", 0);
-      }
-      return html_common.Device._isOpera;
-    }
-    static get isIE() {
-      if (html_common.Device._isIE == null) {
-        html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("Trident/", 0));
-      }
-      return html_common.Device._isIE;
-    }
-    static get isFirefox() {
-      if (html_common.Device._isFirefox == null) {
-        html_common.Device._isFirefox = html_common.Device.userAgent[dartx.contains]("Firefox", 0);
-      }
-      return html_common.Device._isFirefox;
-    }
-    static get isWebKit() {
-      if (html_common.Device._isWebKit == null) {
-        html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("WebKit", 0));
-      }
-      return html_common.Device._isWebKit;
-    }
-    static get cssPrefix() {
-      let prefix = html_common.Device._cachedCssPrefix;
-      if (prefix != null) return prefix;
-      if (dart.test(html_common.Device.isFirefox)) {
-        prefix = '-moz-';
-      } else if (dart.test(html_common.Device.isIE)) {
-        prefix = '-ms-';
-      } else if (dart.test(html_common.Device.isOpera)) {
-        prefix = '-o-';
-      } else {
-        prefix = '-webkit-';
-      }
-      return html_common.Device._cachedCssPrefix = prefix;
-    }
-    static get propertyPrefix() {
-      let prefix = html_common.Device._cachedPropertyPrefix;
-      if (prefix != null) return prefix;
-      if (dart.test(html_common.Device.isFirefox)) {
-        prefix = 'moz';
-      } else if (dart.test(html_common.Device.isIE)) {
-        prefix = 'ms';
-      } else if (dart.test(html_common.Device.isOpera)) {
-        prefix = 'o';
-      } else {
-        prefix = 'webkit';
-      }
-      return html_common.Device._cachedPropertyPrefix = prefix;
-    }
-    static isEventTypeSupported(eventType) {
-      try {
-        let e = html$.Event.eventType(eventType, '');
-        return html$.Event.is(e);
-      } catch (_) {
-      }
-
-      return false;
-    }
-  };
-  dart.setSignature(html_common.Device, {
-    sfields: () => ({
-      _isOpera: core.bool,
-      _isIE: core.bool,
-      _isFirefox: core.bool,
-      _isWebKit: core.bool,
-      _cachedCssPrefix: core.String,
-      _cachedPropertyPrefix: core.String
-    }),
-    sgetters: () => ({
-      userAgent: dart.definiteFunctionType(core.String, []),
-      isOpera: dart.definiteFunctionType(core.bool, []),
-      isIE: dart.definiteFunctionType(core.bool, []),
-      isFirefox: dart.definiteFunctionType(core.bool, []),
-      isWebKit: dart.definiteFunctionType(core.bool, []),
-      cssPrefix: dart.definiteFunctionType(core.String, []),
-      propertyPrefix: dart.definiteFunctionType(core.String, [])
-    }),
-    statics: () => ({isEventTypeSupported: dart.definiteFunctionType(core.bool, [core.String])}),
-    names: ['isEventTypeSupported']
-  });
-  html_common.Device._isOpera = null;
-  html_common.Device._isIE = null;
-  html_common.Device._isFirefox = null;
-  html_common.Device._isWebKit = null;
-  html_common.Device._cachedCssPrefix = null;
-  html_common.Device._cachedPropertyPrefix = null;
-  const _childNodes = Symbol('_childNodes');
-  const _node = Symbol('_node');
-  const _iterable$0 = Symbol('_iterable');
-  const _filtered = Symbol('_filtered');
-  html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
-    new(node) {
-      this[_childNodes] = node[dartx.nodes];
-      this[_node] = node;
-    }
-    get [_iterable$0]() {
-      return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
-    }
-    get [_filtered]() {
-      return ListOfElement().from(this[_iterable$0], {growable: false});
-    }
-    forEach(f) {
-      this[_filtered][dartx.forEach](f);
-    }
-    _set(index, value) {
-      this._get(index)[dartx.replaceWith](value);
-      return value;
-    }
-    set length(newLength) {
-      let len = this.length;
-      if (dart.notNull(newLength) >= dart.notNull(len)) {
-        return;
-      } else if (dart.notNull(newLength) < 0) {
-        dart.throw(new core.ArgumentError("Invalid list length"));
-      }
-      this.removeRange(newLength, len);
-    }
-    add(value) {
-      this[_childNodes][dartx.add](value);
-    }
-    addAll(iterable) {
-      for (let element of iterable) {
-        this.add(element);
-      }
-    }
-    contains(needle) {
-      if (!html$.Element.is(needle)) return false;
-      let element = html$.Element._check(needle);
-      return dart.equals(element[dartx.parentNode], this[_node]);
-    }
-    get reversed() {
-      return this[_filtered][dartx.reversed];
-    }
-    sort(compare) {
-      if (compare === void 0) compare = null;
-      dart.throw(new core.UnsupportedError('Cannot sort filtered list'));
-    }
-    setRange(start, end, iterable, skipCount) {
-      if (skipCount === void 0) skipCount = 0;
-      dart.throw(new core.UnsupportedError('Cannot setRange on filtered list'));
-    }
-    fillRange(start, end, fillValue) {
-      if (fillValue === void 0) fillValue = null;
-      dart.throw(new core.UnsupportedError('Cannot fillRange on filtered list'));
-    }
-    replaceRange(start, end, iterable) {
-      dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
-    }
-    removeRange(start, end) {
-      core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
-    }
-    clear() {
-      this[_childNodes][dartx.clear]();
-    }
-    removeLast() {
-      let result = this[_iterable$0][dartx.last];
-      if (result != null) {
-        result[dartx.remove]();
-      }
-      return result;
-    }
-    insert(index, value) {
-      if (index == this.length) {
-        this.add(value);
-      } else {
-        let element = this[_iterable$0][dartx.elementAt](index);
-        element[dartx.parentNode][dartx.insertBefore](value, element);
-      }
-    }
-    insertAll(index, iterable) {
-      if (index == this.length) {
-        this.addAll(iterable);
-      } else {
-        let element = this[_iterable$0][dartx.elementAt](index);
-        element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
-      }
-    }
-    removeAt(index) {
-      let result = this._get(index);
-      result[dartx.remove]();
-      return result;
-    }
-    remove(element) {
-      if (!html$.Element.is(element)) return false;
-      if (dart.test(this.contains(element))) {
-        html$.Element.as(element)[dartx.remove]();
-        return true;
-      } else {
-        return false;
-      }
-    }
-    get length() {
-      return this[_iterable$0][dartx.length];
-    }
-    _get(index) {
-      return this[_iterable$0][dartx.elementAt](index);
-    }
-    get iterator() {
-      return this[_filtered][dartx.iterator];
-    }
-    get rawList() {
-      return this[_node][dartx.childNodes];
-    }
-  };
-  dart.addSimpleTypeTests(html_common.FilteredElementList);
-  html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
-  dart.setSignature(html_common.FilteredElementList, {
-    constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
-    fields: () => ({
-      [_node]: html$.Node,
-      [_childNodes]: ListOfNode()
-    }),
-    getters: () => ({
-      [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
-      [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
-      length: dart.definiteFunctionType(core.int, []),
-      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
-    }),
-    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
-      _get: dart.definiteFunctionType(html$.Element, [core.int])
-    })
-  });
-  dart.defineExtensionMembers(html_common.FilteredElementList, [
-    'forEach',
-    '_set',
-    'add',
-    'addAll',
-    'contains',
-    'sort',
-    'setRange',
-    'fillRange',
-    'replaceRange',
-    'removeRange',
-    'clear',
-    'removeLast',
-    'insert',
-    'insertAll',
-    'removeAt',
-    'remove',
-    '_get',
-    'length',
-    'reversed',
-    'length',
-    'iterator'
-  ]);
-  html_common.Lists = class Lists extends core.Object {
-    static indexOf(a, element, startIndex, endIndex) {
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) < 0) {
-        startIndex = 0;
-      }
-      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static lastIndexOf(a, element, startIndex) {
-      if (dart.notNull(startIndex) < 0) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        startIndex = dart.notNull(a[dartx.length]) - 1;
-      }
-      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static getRange(a, start, end, accumulator) {
-      if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
-      if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
-      if (dart.notNull(end) > dart.notNull(a[dartx.length])) dart.throw(new core.RangeError.value(end));
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        accumulator[dartx.add](a[dartx._get](i));
-      }
-      return accumulator;
-    }
-  };
-  dart.setSignature(html_common.Lists, {
-    statics: () => ({
-      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-      getRange: dart.definiteFunctionType(core.List, [core.List, core.int, core.int, core.List])
-    }),
-    names: ['indexOf', 'lastIndexOf', 'getRange']
-  });
-  html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
-  svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
-    static createSvgElement_tag(tag) {
-      let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
-      return svg$.SvgElement._check(temp);
-    }
-  };
-  dart.setSignature(svg$._SvgElementFactoryProvider, {
-    statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
-    names: ['createSvgElement_tag']
-  });
-  const _children$ = Symbol('_children');
-  const _svgClassName = Symbol('_svgClassName');
-  dart.defineExtensionNames([
-    'classes',
-    'children',
-    'children',
-    'outerHtml',
-    'innerHtml',
-    'innerHtml',
-    'createFragment',
-    'insertAdjacentText',
-    'insertAdjacentHtml',
-    'insertAdjacentElement',
-    'isContentEditable',
-    'click',
-    'blur',
-    'focus',
-    'onAbort',
-    'onBlur',
-    'onCanPlay',
-    'onCanPlayThrough',
-    'onChange',
-    'onClick',
-    'onContextMenu',
-    'onDoubleClick',
-    'onDrag',
-    'onDragEnd',
-    'onDragEnter',
-    'onDragLeave',
-    'onDragOver',
-    'onDragStart',
-    'onDrop',
-    'onDurationChange',
-    'onEmptied',
-    'onEnded',
-    'onError',
-    'onFocus',
-    'onInput',
-    'onInvalid',
-    'onKeyDown',
-    'onKeyPress',
-    'onKeyUp',
-    'onLoad',
-    'onLoadedData',
-    'onLoadedMetadata',
-    'onMouseDown',
-    'onMouseEnter',
-    'onMouseLeave',
-    'onMouseMove',
-    'onMouseOut',
-    'onMouseOver',
-    'onMouseUp',
-    'onMouseWheel',
-    'onPause',
-    'onPlay',
-    'onPlaying',
-    'onRateChange',
-    'onReset',
-    'onResize',
-    'onScroll',
-    'onSeeked',
-    'onSeeking',
-    'onSelect',
-    'onStalled',
-    'onSubmit',
-    'onSuspend',
-    'onTimeUpdate',
-    'onVolumeChange',
-    'onWaiting',
-    'ownerSvgElement',
-    'viewportElement'
-  ]);
-  svg$.SvgElement = class SvgElement extends html$.Element {
-    static tag(tag) {
-      return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
-    }
-    static svg(svg, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (validator == null && treeSanitizer == null) {
-        validator = new html$.NodeValidatorBuilder.common();
-        validator.allowSvg();
-      }
-      let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
-      let parentElement = null;
-      if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
-        parentElement = html$.document[dartx.body];
-      } else {
-        parentElement = svg$.SvgSvgElement.new();
-      }
-      let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
-      return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
-    }
-    get [dartx.classes]() {
-      return new svg$._AttributeClassSet(this);
-    }
-    set [dartx.classes](value) {
-      super[dartx.classes] = value;
-    }
-    get [dartx.children]() {
-      return new html_common.FilteredElementList(this);
-    }
-    set [dartx.children](value) {
-      let children = this[dartx.children];
-      children[dartx.clear]();
-      children[dartx.addAll](value);
-    }
-    get [dartx.outerHtml]() {
-      let container = html$.Element.tag("div");
-      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
-      container[dartx.children][dartx.add](cloned);
-      return container[dartx.innerHtml];
-    }
-    get [dartx.innerHtml]() {
-      let container = html$.Element.tag("div");
-      let cloned = svg$.SvgElement._check(this[dartx.clone](true));
-      container[dartx.children][dartx.addAll](cloned[dartx.children]);
-      return container[dartx.innerHtml];
-    }
-    set [dartx.innerHtml](value) {
-      this[dartx.setInnerHtml](value);
-    }
-    [dartx.createFragment](svg, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      if (treeSanitizer == null) {
-        if (validator == null) {
-          validator = new html$.NodeValidatorBuilder.common();
-          validator.allowSvg();
-        }
-        treeSanitizer = html$.NodeTreeSanitizer.new(validator);
-      }
-      let html = dart.str`<svg version="1.1">${svg}</svg>`;
-      let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
-      let svgFragment = html$.DocumentFragment.new();
-      let root = fragment[dartx.nodes][dartx.single];
-      while (root[dartx.firstChild] != null) {
-        svgFragment[dartx.append](root[dartx.firstChild]);
-      }
-      return svgFragment;
-    }
-    [dartx.insertAdjacentText](where, text) {
-      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentText on SVG."));
-    }
-    [dartx.insertAdjacentHtml](where, text, opts) {
-      let validator = opts && 'validator' in opts ? opts.validator : null;
-      let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentHtml on SVG."));
-    }
-    [dartx.insertAdjacentElement](where, element) {
-      dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
-    }
-    get [_children$]() {
-      dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
-    }
-    get [dartx.isContentEditable]() {
-      return false;
-    }
-    [dartx.click]() {
-      dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
-    }
-    static isTagSupported(tag) {
-      let e = svg$.SvgElement.tag(tag);
-      return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.ownerSvgElement] = null;
-      this[dartx.viewportElement] = null;
-      super.created();
-    }
-    get [_svgClassName]() {
-      return this.className;
-    }
-    get [dartx.ownerSvgElement]() {
-      return this.ownerSVGElement;
-    }
-    get [dartx.viewportElement]() {
-      return this.viewportElement;
-    }
-    [dartx.blur](...args) {
-      return this.blur.apply(this, args);
-    }
-    [dartx.focus](...args) {
-      return this.focus.apply(this, args);
-    }
-    get [dartx.onAbort]() {
-      return svg$.SvgElement.abortEvent.forElement(this);
-    }
-    get [dartx.onBlur]() {
-      return svg$.SvgElement.blurEvent.forElement(this);
-    }
-    get [dartx.onCanPlay]() {
-      return svg$.SvgElement.canPlayEvent.forElement(this);
-    }
-    get [dartx.onCanPlayThrough]() {
-      return svg$.SvgElement.canPlayThroughEvent.forElement(this);
-    }
-    get [dartx.onChange]() {
-      return svg$.SvgElement.changeEvent.forElement(this);
-    }
-    get [dartx.onClick]() {
-      return svg$.SvgElement.clickEvent.forElement(this);
-    }
-    get [dartx.onContextMenu]() {
-      return svg$.SvgElement.contextMenuEvent.forElement(this);
-    }
-    get [dartx.onDoubleClick]() {
-      return svg$.SvgElement.doubleClickEvent.forElement(this);
-    }
-    get [dartx.onDrag]() {
-      return svg$.SvgElement.dragEvent.forElement(this);
-    }
-    get [dartx.onDragEnd]() {
-      return svg$.SvgElement.dragEndEvent.forElement(this);
-    }
-    get [dartx.onDragEnter]() {
-      return svg$.SvgElement.dragEnterEvent.forElement(this);
-    }
-    get [dartx.onDragLeave]() {
-      return svg$.SvgElement.dragLeaveEvent.forElement(this);
-    }
-    get [dartx.onDragOver]() {
-      return svg$.SvgElement.dragOverEvent.forElement(this);
-    }
-    get [dartx.onDragStart]() {
-      return svg$.SvgElement.dragStartEvent.forElement(this);
-    }
-    get [dartx.onDrop]() {
-      return svg$.SvgElement.dropEvent.forElement(this);
-    }
-    get [dartx.onDurationChange]() {
-      return svg$.SvgElement.durationChangeEvent.forElement(this);
-    }
-    get [dartx.onEmptied]() {
-      return svg$.SvgElement.emptiedEvent.forElement(this);
-    }
-    get [dartx.onEnded]() {
-      return svg$.SvgElement.endedEvent.forElement(this);
-    }
-    get [dartx.onError]() {
-      return svg$.SvgElement.errorEvent.forElement(this);
-    }
-    get [dartx.onFocus]() {
-      return svg$.SvgElement.focusEvent.forElement(this);
-    }
-    get [dartx.onInput]() {
-      return svg$.SvgElement.inputEvent.forElement(this);
-    }
-    get [dartx.onInvalid]() {
-      return svg$.SvgElement.invalidEvent.forElement(this);
-    }
-    get [dartx.onKeyDown]() {
-      return svg$.SvgElement.keyDownEvent.forElement(this);
-    }
-    get [dartx.onKeyPress]() {
-      return svg$.SvgElement.keyPressEvent.forElement(this);
-    }
-    get [dartx.onKeyUp]() {
-      return svg$.SvgElement.keyUpEvent.forElement(this);
-    }
-    get [dartx.onLoad]() {
-      return svg$.SvgElement.loadEvent.forElement(this);
-    }
-    get [dartx.onLoadedData]() {
-      return svg$.SvgElement.loadedDataEvent.forElement(this);
-    }
-    get [dartx.onLoadedMetadata]() {
-      return svg$.SvgElement.loadedMetadataEvent.forElement(this);
-    }
-    get [dartx.onMouseDown]() {
-      return svg$.SvgElement.mouseDownEvent.forElement(this);
-    }
-    get [dartx.onMouseEnter]() {
-      return svg$.SvgElement.mouseEnterEvent.forElement(this);
-    }
-    get [dartx.onMouseLeave]() {
-      return svg$.SvgElement.mouseLeaveEvent.forElement(this);
-    }
-    get [dartx.onMouseMove]() {
-      return svg$.SvgElement.mouseMoveEvent.forElement(this);
-    }
-    get [dartx.onMouseOut]() {
-      return svg$.SvgElement.mouseOutEvent.forElement(this);
-    }
-    get [dartx.onMouseOver]() {
-      return svg$.SvgElement.mouseOverEvent.forElement(this);
-    }
-    get [dartx.onMouseUp]() {
-      return svg$.SvgElement.mouseUpEvent.forElement(this);
-    }
-    get [dartx.onMouseWheel]() {
-      return svg$.SvgElement.mouseWheelEvent.forElement(this);
-    }
-    get [dartx.onPause]() {
-      return svg$.SvgElement.pauseEvent.forElement(this);
-    }
-    get [dartx.onPlay]() {
-      return svg$.SvgElement.playEvent.forElement(this);
-    }
-    get [dartx.onPlaying]() {
-      return svg$.SvgElement.playingEvent.forElement(this);
-    }
-    get [dartx.onRateChange]() {
-      return svg$.SvgElement.rateChangeEvent.forElement(this);
-    }
-    get [dartx.onReset]() {
-      return svg$.SvgElement.resetEvent.forElement(this);
-    }
-    get [dartx.onResize]() {
-      return svg$.SvgElement.resizeEvent.forElement(this);
-    }
-    get [dartx.onScroll]() {
-      return svg$.SvgElement.scrollEvent.forElement(this);
-    }
-    get [dartx.onSeeked]() {
-      return svg$.SvgElement.seekedEvent.forElement(this);
-    }
-    get [dartx.onSeeking]() {
-      return svg$.SvgElement.seekingEvent.forElement(this);
-    }
-    get [dartx.onSelect]() {
-      return svg$.SvgElement.selectEvent.forElement(this);
-    }
-    get [dartx.onStalled]() {
-      return svg$.SvgElement.stalledEvent.forElement(this);
-    }
-    get [dartx.onSubmit]() {
-      return svg$.SvgElement.submitEvent.forElement(this);
-    }
-    get [dartx.onSuspend]() {
-      return svg$.SvgElement.suspendEvent.forElement(this);
-    }
-    get [dartx.onTimeUpdate]() {
-      return svg$.SvgElement.timeUpdateEvent.forElement(this);
-    }
-    get [dartx.onVolumeChange]() {
-      return svg$.SvgElement.volumeChangeEvent.forElement(this);
-    }
-    get [dartx.onWaiting]() {
-      return svg$.SvgElement.waitingEvent.forElement(this);
-    }
-  };
-  dart.defineNamedConstructor(svg$.SvgElement, 'created');
-  svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
-  dart.setSignature(svg$.SvgElement, {
-    constructors: () => ({
-      tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
-      svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
-      _: dart.definiteFunctionType(svg$.SvgElement, []),
-      created: dart.definiteFunctionType(svg$.SvgElement, [])
-    }),
-    fields: () => ({
-      [dartx.ownerSvgElement]: svg$.SvgSvgElement,
-      [dartx.viewportElement]: svg$.SvgElement
-    }),
-    getters: () => ({
-      [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
-      [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
-    }),
-    sfields: () => ({
-      _START_TAG_REGEXP: core.RegExp,
-      abortEvent: EventStreamProviderOfEvent(),
-      blurEvent: EventStreamProviderOfEvent(),
-      canPlayEvent: EventStreamProviderOfEvent(),
-      canPlayThroughEvent: EventStreamProviderOfEvent(),
-      changeEvent: EventStreamProviderOfEvent(),
-      clickEvent: EventStreamProviderOfMouseEvent(),
-      contextMenuEvent: EventStreamProviderOfMouseEvent(),
-      doubleClickEvent: EventStreamProviderOfEvent(),
-      dragEvent: EventStreamProviderOfMouseEvent(),
-      dragEndEvent: EventStreamProviderOfMouseEvent(),
-      dragEnterEvent: EventStreamProviderOfMouseEvent(),
-      dragLeaveEvent: EventStreamProviderOfMouseEvent(),
-      dragOverEvent: EventStreamProviderOfMouseEvent(),
-      dragStartEvent: EventStreamProviderOfMouseEvent(),
-      dropEvent: EventStreamProviderOfMouseEvent(),
-      durationChangeEvent: EventStreamProviderOfEvent(),
-      emptiedEvent: EventStreamProviderOfEvent(),
-      endedEvent: EventStreamProviderOfEvent(),
-      errorEvent: EventStreamProviderOfEvent(),
-      focusEvent: EventStreamProviderOfEvent(),
-      inputEvent: EventStreamProviderOfEvent(),
-      invalidEvent: EventStreamProviderOfEvent(),
-      keyDownEvent: EventStreamProviderOfKeyboardEvent(),
-      keyPressEvent: EventStreamProviderOfKeyboardEvent(),
-      keyUpEvent: EventStreamProviderOfKeyboardEvent(),
-      loadEvent: EventStreamProviderOfEvent(),
-      loadedDataEvent: EventStreamProviderOfEvent(),
-      loadedMetadataEvent: EventStreamProviderOfEvent(),
-      mouseDownEvent: EventStreamProviderOfMouseEvent(),
-      mouseEnterEvent: EventStreamProviderOfMouseEvent(),
-      mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
-      mouseMoveEvent: EventStreamProviderOfMouseEvent(),
-      mouseOutEvent: EventStreamProviderOfMouseEvent(),
-      mouseOverEvent: EventStreamProviderOfMouseEvent(),
-      mouseUpEvent: EventStreamProviderOfMouseEvent(),
-      mouseWheelEvent: EventStreamProviderOfWheelEvent(),
-      pauseEvent: EventStreamProviderOfEvent(),
-      playEvent: EventStreamProviderOfEvent(),
-      playingEvent: EventStreamProviderOfEvent(),
-      rateChangeEvent: EventStreamProviderOfEvent(),
-      resetEvent: EventStreamProviderOfEvent(),
-      resizeEvent: EventStreamProviderOfEvent(),
-      scrollEvent: EventStreamProviderOfEvent(),
-      seekedEvent: EventStreamProviderOfEvent(),
-      seekingEvent: EventStreamProviderOfEvent(),
-      selectEvent: EventStreamProviderOfEvent(),
-      stalledEvent: EventStreamProviderOfEvent(),
-      submitEvent: EventStreamProviderOfEvent(),
-      suspendEvent: EventStreamProviderOfEvent(),
-      timeUpdateEvent: EventStreamProviderOfEvent(),
-      volumeChangeEvent: EventStreamProviderOfEvent(),
-      waitingEvent: EventStreamProviderOfEvent()
-    })
-  });
-  dart.defineLazy(svg$.SvgElement, {
-    get _START_TAG_REGEXP() {
-      return core.RegExp.new('<(\\w+)');
-    },
-    get abortEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('abort'));
-    },
-    get blurEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('blur'));
-    },
-    get canPlayEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplay'));
-    },
-    get canPlayThroughEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
-    },
-    get changeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('change'));
-    },
-    get clickEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
-    },
-    get contextMenuEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
-    },
-    get doubleClickEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
-    },
-    get dragEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
-    },
-    get dragEndEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
-    },
-    get dragEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
-    },
-    get dragLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
-    },
-    get dragOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
-    },
-    get dragStartEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
-    },
-    get dropEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
-    },
-    get durationChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
-    },
-    get emptiedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('emptied'));
-    },
-    get endedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ended'));
-    },
-    get errorEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('error'));
-    },
-    get focusEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('focus'));
-    },
-    get inputEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('input'));
-    },
-    get invalidEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('invalid'));
-    },
-    get keyDownEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
-    },
-    get keyPressEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
-    },
-    get keyUpEvent() {
-      return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
-    },
-    get loadEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('load'));
-    },
-    get loadedDataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
-    },
-    get loadedMetadataEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
-    },
-    get mouseDownEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
-    },
-    get mouseEnterEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
-    },
-    get mouseLeaveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
-    },
-    get mouseMoveEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
-    },
-    get mouseOutEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
-    },
-    get mouseOverEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
-    },
-    get mouseUpEvent() {
-      return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
-    },
-    get mouseWheelEvent() {
-      return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
-    },
-    get pauseEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('pause'));
-    },
-    get playEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('play'));
-    },
-    get playingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('playing'));
-    },
-    get rateChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
-    },
-    get resetEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('reset'));
-    },
-    get resizeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('resize'));
-    },
-    get scrollEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('scroll'));
-    },
-    get seekedEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeked'));
-    },
-    get seekingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('seeking'));
-    },
-    get selectEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('select'));
-    },
-    get stalledEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('stalled'));
-    },
-    get submitEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('submit'));
-    },
-    get suspendEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('suspend'));
-    },
-    get timeUpdateEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
-    },
-    get volumeChangeEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
-    },
-    get waitingEvent() {
-      return dart.const(new (EventStreamProviderOfEvent())('waiting'));
-    }
-  });
-  dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
-  dart.defineExtensionNames([
-    'getBBox',
-    'getCtm',
-    'getScreenCtm',
-    'getTransformToElement',
-    'hasExtension',
-    'farthestViewportElement',
-    'nearestViewportElement',
-    'transform',
-    'requiredExtensions',
-    'requiredFeatures',
-    'systemLanguage'
-  ]);
-  svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.farthestViewportElement] = null;
-      this[dartx.nearestViewportElement] = null;
-      this[dartx.transform] = null;
-      this[dartx.requiredExtensions] = null;
-      this[dartx.requiredFeatures] = null;
-      this[dartx.systemLanguage] = null;
-      super.created();
-    }
-    get [dartx.farthestViewportElement]() {
-      return this.farthestViewportElement;
-    }
-    get [dartx.nearestViewportElement]() {
-      return this.nearestViewportElement;
-    }
-    get [dartx.transform]() {
-      return this.transform;
-    }
-    [dartx.getBBox](...args) {
-      return this.getBBox.apply(this, args);
-    }
-    [dartx.getCtm](...args) {
-      return this.getCTM.apply(this, args);
-    }
-    [dartx.getScreenCtm](...args) {
-      return this.getScreenCTM.apply(this, args);
-    }
-    [dartx.getTransformToElement](...args) {
-      return this.getTransformToElement.apply(this, args);
-    }
-    get [dartx.requiredExtensions]() {
-      return this.requiredExtensions;
-    }
-    get [dartx.requiredFeatures]() {
-      return this.requiredFeatures;
-    }
-    get [dartx.systemLanguage]() {
-      return this.systemLanguage;
-    }
-    [dartx.hasExtension](...args) {
-      return this.hasExtension.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
-  svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
-  dart.setSignature(svg$.GraphicsElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.GraphicsElement, []),
-      created: dart.definiteFunctionType(svg$.GraphicsElement, [])
-    }),
-    fields: () => ({
-      [dartx.farthestViewportElement]: svg$.SvgElement,
-      [dartx.nearestViewportElement]: svg$.SvgElement,
-      [dartx.transform]: svg$.AnimatedTransformList,
-      [dartx.requiredExtensions]: svg$.StringList,
-      [dartx.requiredFeatures]: svg$.StringList,
-      [dartx.systemLanguage]: svg$.StringList
-    }),
-    methods: () => ({
-      [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
-      [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
-      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
-  dart.defineExtensionNames([
-    'target',
-    'href'
-  ]);
-  svg$.AElement = class AElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
-    }
-    created() {
-      this[dartx.target] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.target]() {
-      return this.target;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.AElement, 'created');
-  svg$.AElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.AElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.AElement, []),
-      new: dart.definiteFunctionType(svg$.AElement, []),
-      created: dart.definiteFunctionType(svg$.AElement, [])
-    }),
-    fields: () => ({
-      [dartx.target]: svg$.AnimatedString,
-      [dartx.href]: svg$.AnimatedString
-    })
-  });
-  dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
-  dart.defineExtensionNames([
-    'convertToSpecifiedUnits',
-    'newValueSpecifiedUnits',
-    'unitType',
-    'value',
-    'valueAsString',
-    'valueInSpecifiedUnits'
-  ]);
-  svg$.Angle = class Angle extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.unitType]() {
-      return this.unitType;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.valueAsString]() {
-      return this.valueAsString;
-    }
-    set [dartx.valueAsString](value) {
-      this.valueAsString = value;
-    }
-    get [dartx.valueInSpecifiedUnits]() {
-      return this.valueInSpecifiedUnits;
-    }
-    set [dartx.valueInSpecifiedUnits](value) {
-      this.valueInSpecifiedUnits = value;
-    }
-    [dartx.convertToSpecifiedUnits](...args) {
-      return this.convertToSpecifiedUnits.apply(this, args);
-    }
-    [dartx.newValueSpecifiedUnits](...args) {
-      return this.newValueSpecifiedUnits.apply(this, args);
-    }
-  };
-  dart.setSignature(svg$.Angle, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
-    fields: () => ({
-      [dartx.unitType]: core.int,
-      [dartx.value]: core.num,
-      [dartx.valueAsString]: core.String,
-      [dartx.valueInSpecifiedUnits]: core.num
-    }),
-    methods: () => ({
-      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
-    }),
-    sfields: () => ({
-      SVG_ANGLETYPE_DEG: core.int,
-      SVG_ANGLETYPE_GRAD: core.int,
-      SVG_ANGLETYPE_RAD: core.int,
-      SVG_ANGLETYPE_UNKNOWN: core.int,
-      SVG_ANGLETYPE_UNSPECIFIED: core.int
-    })
-  });
-  svg$.Angle.SVG_ANGLETYPE_DEG = 2;
-  svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
-  svg$.Angle.SVG_ANGLETYPE_RAD = 3;
-  svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
-  svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
-  dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
-  dart.defineExtensionNames([
-    'beginElement',
-    'beginElementAt',
-    'endElement',
-    'endElementAt',
-    'getCurrentTime',
-    'getSimpleDuration',
-    'getStartTime',
-    'hasExtension',
-    'targetElement',
-    'requiredExtensions',
-    'requiredFeatures',
-    'systemLanguage'
-  ]);
-  svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
-    }
-    created() {
-      this[dartx.targetElement] = null;
-      this[dartx.requiredExtensions] = null;
-      this[dartx.requiredFeatures] = null;
-      this[dartx.systemLanguage] = null;
-      super.created();
-    }
-    get [dartx.targetElement]() {
-      return this.targetElement;
-    }
-    [dartx.beginElement](...args) {
-      return this.beginElement.apply(this, args);
-    }
-    [dartx.beginElementAt](...args) {
-      return this.beginElementAt.apply(this, args);
-    }
-    [dartx.endElement](...args) {
-      return this.endElement.apply(this, args);
-    }
-    [dartx.endElementAt](...args) {
-      return this.endElementAt.apply(this, args);
-    }
-    [dartx.getCurrentTime](...args) {
-      return this.getCurrentTime.apply(this, args);
-    }
-    [dartx.getSimpleDuration](...args) {
-      return this.getSimpleDuration.apply(this, args);
-    }
-    [dartx.getStartTime](...args) {
-      return this.getStartTime.apply(this, args);
-    }
-    get [dartx.requiredExtensions]() {
-      return this.requiredExtensions;
-    }
-    get [dartx.requiredFeatures]() {
-      return this.requiredFeatures;
-    }
-    get [dartx.systemLanguage]() {
-      return this.systemLanguage;
-    }
-    [dartx.hasExtension](...args) {
-      return this.hasExtension.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.AnimationElement, 'created');
-  svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
-  dart.setSignature(svg$.AnimationElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.AnimationElement, []),
-      new: dart.definiteFunctionType(svg$.AnimationElement, []),
-      created: dart.definiteFunctionType(svg$.AnimationElement, [])
-    }),
-    fields: () => ({
-      [dartx.targetElement]: svg$.SvgElement,
-      [dartx.requiredExtensions]: svg$.StringList,
-      [dartx.requiredFeatures]: svg$.StringList,
-      [dartx.systemLanguage]: svg$.StringList
-    }),
-    methods: () => ({
-      [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
-      [dartx.beginElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.endElement]: dart.definiteFunctionType(dart.void, []),
-      [dartx.endElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
-      [dartx.getSimpleDuration]: dart.definiteFunctionType(core.double, []),
-      [dartx.getStartTime]: dart.definiteFunctionType(core.double, []),
-      [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
-  svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.AnimateElement, 'created');
-  dart.setSignature(svg$.AnimateElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.AnimateElement, []),
-      new: dart.definiteFunctionType(svg$.AnimateElement, []),
-      created: dart.definiteFunctionType(svg$.AnimateElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
-  svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
-  dart.setSignature(svg$.AnimateMotionElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
-      new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
-      created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
-  svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
-  dart.setSignature(svg$.AnimateTransformElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
-      new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
-      created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedAngle, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.Angle,
-      [dartx.baseVal]: svg$.Angle
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-    set [dartx.baseVal](value) {
-      this.baseVal = value;
-    }
-  };
-  dart.setSignature(svg$.AnimatedBoolean, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
-    fields: () => ({
-      [dartx.animVal]: core.bool,
-      [dartx.baseVal]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-    set [dartx.baseVal](value) {
-      this.baseVal = value;
-    }
-  };
-  dart.setSignature(svg$.AnimatedEnumeration, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
-    fields: () => ({
-      [dartx.animVal]: core.int,
-      [dartx.baseVal]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-    set [dartx.baseVal](value) {
-      this.baseVal = value;
-    }
-  };
-  dart.setSignature(svg$.AnimatedInteger, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
-    fields: () => ({
-      [dartx.animVal]: core.int,
-      [dartx.baseVal]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedLength, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.Length,
-      [dartx.baseVal]: svg$.Length
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedLengthList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.LengthList,
-      [dartx.baseVal]: svg$.LengthList
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-    set [dartx.baseVal](value) {
-      this.baseVal = value;
-    }
-  };
-  dart.setSignature(svg$.AnimatedNumber, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
-    fields: () => ({
-      [dartx.animVal]: core.double,
-      [dartx.baseVal]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedNumberList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.NumberList,
-      [dartx.baseVal]: svg$.NumberList
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.PreserveAspectRatio,
-      [dartx.baseVal]: svg$.PreserveAspectRatio
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedRect, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.Rect,
-      [dartx.baseVal]: svg$.Rect
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-    set [dartx.baseVal](value) {
-      this.baseVal = value;
-    }
-  };
-  dart.setSignature(svg$.AnimatedString, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
-    fields: () => ({
-      [dartx.animVal]: core.String,
-      [dartx.baseVal]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
-  dart.defineExtensionNames([
-    'animVal',
-    'baseVal'
-  ]);
-  svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.animVal]() {
-      return this.animVal;
-    }
-    get [dartx.baseVal]() {
-      return this.baseVal;
-    }
-  };
-  dart.setSignature(svg$.AnimatedTransformList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
-    fields: () => ({
-      [dartx.animVal]: svg$.TransformList,
-      [dartx.baseVal]: svg$.TransformList
-    })
-  });
-  dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
-  dart.defineExtensionNames([
-    'isPointInFill',
-    'isPointInStroke'
-  ]);
-  svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-    [dartx.isPointInFill](...args) {
-      return this.isPointInFill.apply(this, args);
-    }
-    [dartx.isPointInStroke](...args) {
-      return this.isPointInStroke.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.GeometryElement, 'created');
-  dart.setSignature(svg$.GeometryElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.GeometryElement, []),
-      created: dart.definiteFunctionType(svg$.GeometryElement, [])
-    }),
-    methods: () => ({
-      [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
-      [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
-    })
-  });
-  dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
-  dart.defineExtensionNames([
-    'cx',
-    'cy',
-    'r'
-  ]);
-  svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
-    }
-    created() {
-      this[dartx.cx] = null;
-      this[dartx.cy] = null;
-      this[dartx.r] = null;
-      super.created();
-    }
-    get [dartx.cx]() {
-      return this.cx;
-    }
-    get [dartx.cy]() {
-      return this.cy;
-    }
-    get [dartx.r]() {
-      return this.r;
-    }
-  };
-  dart.defineNamedConstructor(svg$.CircleElement, 'created');
-  dart.setSignature(svg$.CircleElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.CircleElement, []),
-      new: dart.definiteFunctionType(svg$.CircleElement, []),
-      created: dart.definiteFunctionType(svg$.CircleElement, [])
-    }),
-    fields: () => ({
-      [dartx.cx]: svg$.AnimatedLength,
-      [dartx.cy]: svg$.AnimatedLength,
-      [dartx.r]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
-  dart.defineExtensionNames([
-    'clipPathUnits'
-  ]);
-  svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
-    }
-    created() {
-      this[dartx.clipPathUnits] = null;
-      super.created();
-    }
-    get [dartx.clipPathUnits]() {
-      return this.clipPathUnits;
-    }
-  };
-  dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
-  dart.setSignature(svg$.ClipPathElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.ClipPathElement, []),
-      new: dart.definiteFunctionType(svg$.ClipPathElement, []),
-      created: dart.definiteFunctionType(svg$.ClipPathElement, [])
-    }),
-    fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
-  });
-  dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
-  svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.DefsElement, 'created');
-  dart.setSignature(svg$.DefsElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.DefsElement, []),
-      new: dart.definiteFunctionType(svg$.DefsElement, []),
-      created: dart.definiteFunctionType(svg$.DefsElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
-  svg$.DescElement = class DescElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.DescElement, 'created');
-  dart.setSignature(svg$.DescElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.DescElement, []),
-      new: dart.definiteFunctionType(svg$.DescElement, []),
-      created: dart.definiteFunctionType(svg$.DescElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
-  svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.DiscardElement, 'created');
-  dart.setSignature(svg$.DiscardElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.DiscardElement, []),
-      created: dart.definiteFunctionType(svg$.DiscardElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
-  dart.defineExtensionNames([
-    'cx',
-    'cy',
-    'rx',
-    'ry'
-  ]);
-  svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
-    }
-    created() {
-      this[dartx.cx] = null;
-      this[dartx.cy] = null;
-      this[dartx.rx] = null;
-      this[dartx.ry] = null;
-      super.created();
-    }
-    get [dartx.cx]() {
-      return this.cx;
-    }
-    get [dartx.cy]() {
-      return this.cy;
-    }
-    get [dartx.rx]() {
-      return this.rx;
-    }
-    get [dartx.ry]() {
-      return this.ry;
-    }
-  };
-  dart.defineNamedConstructor(svg$.EllipseElement, 'created');
-  dart.setSignature(svg$.EllipseElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.EllipseElement, []),
-      new: dart.definiteFunctionType(svg$.EllipseElement, []),
-      created: dart.definiteFunctionType(svg$.EllipseElement, [])
-    }),
-    fields: () => ({
-      [dartx.cx]: svg$.AnimatedLength,
-      [dartx.cy]: svg$.AnimatedLength,
-      [dartx.rx]: svg$.AnimatedLength,
-      [dartx.ry]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
-  dart.defineExtensionNames([
-    'in1',
-    'in2',
-    'mode',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.in2] = null;
-      this[dartx.mode] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.in2]() {
-      return this.in2;
-    }
-    get [dartx.mode]() {
-      return this.mode;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
-  svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEBlendElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEBlendElement, []),
-      new: dart.definiteFunctionType(svg$.FEBlendElement, []),
-      created: dart.definiteFunctionType(svg$.FEBlendElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.in2]: svg$.AnimatedString,
-      [dartx.mode]: svg$.AnimatedEnumeration,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_FEBLEND_MODE_DARKEN: core.int,
-      SVG_FEBLEND_MODE_LIGHTEN: core.int,
-      SVG_FEBLEND_MODE_MULTIPLY: core.int,
-      SVG_FEBLEND_MODE_NORMAL: core.int,
-      SVG_FEBLEND_MODE_SCREEN: core.int,
-      SVG_FEBLEND_MODE_UNKNOWN: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
-  svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
-  dart.defineExtensionNames([
-    'in1',
-    'type',
-    'values',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.type] = null;
-      this[dartx.values] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.values]() {
-      return this.values;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
-  svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEColorMatrixElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
-      new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
-      created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.type]: svg$.AnimatedEnumeration,
-      [dartx.values]: svg$.AnimatedNumberList,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
-      SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: core.int,
-      SVG_FECOLORMATRIX_TYPE_MATRIX: core.int,
-      SVG_FECOLORMATRIX_TYPE_SATURATE: core.int,
-      SVG_FECOLORMATRIX_TYPE_UNKNOWN: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
-  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
-  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
-  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
-  svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
-  dart.defineExtensionNames([
-    'in1',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
-  svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEComponentTransferElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
-      new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
-      created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
-  dart.defineExtensionNames([
-    'in1',
-    'in2',
-    'k1',
-    'k2',
-    'k3',
-    'k4',
-    'operator',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.in2] = null;
-      this[dartx.k1] = null;
-      this[dartx.k2] = null;
-      this[dartx.k3] = null;
-      this[dartx.k4] = null;
-      this[dartx.operator] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.in2]() {
-      return this.in2;
-    }
-    get [dartx.k1]() {
-      return this.k1;
-    }
-    get [dartx.k2]() {
-      return this.k2;
-    }
-    get [dartx.k3]() {
-      return this.k3;
-    }
-    get [dartx.k4]() {
-      return this.k4;
-    }
-    get [dartx.operator]() {
-      return this.operator;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
-  svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FECompositeElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FECompositeElement, []),
-      created: dart.definiteFunctionType(svg$.FECompositeElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.in2]: svg$.AnimatedString,
-      [dartx.k1]: svg$.AnimatedNumber,
-      [dartx.k2]: svg$.AnimatedNumber,
-      [dartx.k3]: svg$.AnimatedNumber,
-      [dartx.k4]: svg$.AnimatedNumber,
-      [dartx.operator]: svg$.AnimatedEnumeration,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
-      SVG_FECOMPOSITE_OPERATOR_ATOP: core.int,
-      SVG_FECOMPOSITE_OPERATOR_IN: core.int,
-      SVG_FECOMPOSITE_OPERATOR_OUT: core.int,
-      SVG_FECOMPOSITE_OPERATOR_OVER: core.int,
-      SVG_FECOMPOSITE_OPERATOR_UNKNOWN: core.int,
-      SVG_FECOMPOSITE_OPERATOR_XOR: core.int
-    })
-  });
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
-  svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
-  dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
-  dart.defineExtensionNames([
-    'bias',
-    'divisor',
-    'edgeMode',
-    'in1',
-    'kernelMatrix',
-    'kernelUnitLengthX',
-    'kernelUnitLengthY',
-    'orderX',
-    'orderY',
-    'preserveAlpha',
-    'targetX',
-    'targetY',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
-    }
-    created() {
-      this[dartx.bias] = null;
-      this[dartx.divisor] = null;
-      this[dartx.edgeMode] = null;
-      this[dartx.in1] = null;
-      this[dartx.kernelMatrix] = null;
-      this[dartx.kernelUnitLengthX] = null;
-      this[dartx.kernelUnitLengthY] = null;
-      this[dartx.orderX] = null;
-      this[dartx.orderY] = null;
-      this[dartx.preserveAlpha] = null;
-      this[dartx.targetX] = null;
-      this[dartx.targetY] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
-    }
-    get [dartx.bias]() {
-      return this.bias;
-    }
-    get [dartx.divisor]() {
-      return this.divisor;
-    }
-    get [dartx.edgeMode]() {
-      return this.edgeMode;
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.kernelMatrix]() {
-      return this.kernelMatrix;
-    }
-    get [dartx.kernelUnitLengthX]() {
-      return this.kernelUnitLengthX;
-    }
-    get [dartx.kernelUnitLengthY]() {
-      return this.kernelUnitLengthY;
-    }
-    get [dartx.orderX]() {
-      return this.orderX;
-    }
-    get [dartx.orderY]() {
-      return this.orderY;
-    }
-    get [dartx.preserveAlpha]() {
-      return this.preserveAlpha;
-    }
-    get [dartx.targetX]() {
-      return this.targetX;
-    }
-    get [dartx.targetY]() {
-      return this.targetY;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
-  svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEConvolveMatrixElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
-      new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
-      created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
-    }),
-    fields: () => ({
-      [dartx.bias]: svg$.AnimatedNumber,
-      [dartx.divisor]: svg$.AnimatedNumber,
-      [dartx.edgeMode]: svg$.AnimatedEnumeration,
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.kernelMatrix]: svg$.AnimatedNumberList,
-      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
-      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
-      [dartx.orderX]: svg$.AnimatedInteger,
-      [dartx.orderY]: svg$.AnimatedInteger,
-      [dartx.preserveAlpha]: svg$.AnimatedBoolean,
-      [dartx.targetX]: svg$.AnimatedInteger,
-      [dartx.targetY]: svg$.AnimatedInteger,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_EDGEMODE_DUPLICATE: core.int,
-      SVG_EDGEMODE_NONE: core.int,
-      SVG_EDGEMODE_UNKNOWN: core.int,
-      SVG_EDGEMODE_WRAP: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
-  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
-  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
-  svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
-  dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
-  dart.defineExtensionNames([
-    'diffuseConstant',
-    'in1',
-    'kernelUnitLengthX',
-    'kernelUnitLengthY',
-    'surfaceScale',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
-    }
-    created() {
-      this[dartx.diffuseConstant] = null;
-      this[dartx.in1] = null;
-      this[dartx.kernelUnitLengthX] = null;
-      this[dartx.kernelUnitLengthY] = null;
-      this[dartx.surfaceScale] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
-    }
-    get [dartx.diffuseConstant]() {
-      return this.diffuseConstant;
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.kernelUnitLengthX]() {
-      return this.kernelUnitLengthX;
-    }
-    get [dartx.kernelUnitLengthY]() {
-      return this.kernelUnitLengthY;
-    }
-    get [dartx.surfaceScale]() {
-      return this.surfaceScale;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
-  svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEDiffuseLightingElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
-      new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
-      created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
-    }),
-    fields: () => ({
-      [dartx.diffuseConstant]: svg$.AnimatedNumber,
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
-      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
-      [dartx.surfaceScale]: svg$.AnimatedNumber,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
-  dart.defineExtensionNames([
-    'in1',
-    'in2',
-    'scale',
-    'xChannelSelector',
-    'yChannelSelector',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.in2] = null;
-      this[dartx.scale] = null;
-      this[dartx.xChannelSelector] = null;
-      this[dartx.yChannelSelector] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.in2]() {
-      return this.in2;
-    }
-    get [dartx.scale]() {
-      return this.scale;
-    }
-    get [dartx.xChannelSelector]() {
-      return this.xChannelSelector;
-    }
-    get [dartx.yChannelSelector]() {
-      return this.yChannelSelector;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
-  svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEDisplacementMapElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
-      new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
-      created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.in2]: svg$.AnimatedString,
-      [dartx.scale]: svg$.AnimatedNumber,
-      [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
-      [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_CHANNEL_A: core.int,
-      SVG_CHANNEL_B: core.int,
-      SVG_CHANNEL_G: core.int,
-      SVG_CHANNEL_R: core.int,
-      SVG_CHANNEL_UNKNOWN: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
-  svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
-  svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
-  svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
-  svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
-  dart.defineExtensionNames([
-    'azimuth',
-    'elevation'
-  ]);
-  svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
-    }
-    created() {
-      this[dartx.azimuth] = null;
-      this[dartx.elevation] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
-    }
-    get [dartx.azimuth]() {
-      return this.azimuth;
-    }
-    get [dartx.elevation]() {
-      return this.elevation;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
-  dart.setSignature(svg$.FEDistantLightElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
-      new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
-      created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
-    }),
-    fields: () => ({
-      [dartx.azimuth]: svg$.AnimatedNumber,
-      [dartx.elevation]: svg$.AnimatedNumber
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
-  dart.defineExtensionNames([
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
-  svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEFloodElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEFloodElement, []),
-      new: dart.definiteFunctionType(svg$.FEFloodElement, []),
-      created: dart.definiteFunctionType(svg$.FEFloodElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
-  svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
-  dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
-      created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
-  svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
-  dart.setSignature(svg$.FEFuncAElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
-      new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
-      created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
-  svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
-  dart.setSignature(svg$.FEFuncBElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
-      new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
-      created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
-  svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
-  dart.setSignature(svg$.FEFuncGElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
-      new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
-      created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
-  svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
-  dart.setSignature(svg$.FEFuncRElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
-      new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
-      created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
-  dart.defineExtensionNames([
-    'setStdDeviation',
-    'in1',
-    'stdDeviationX',
-    'stdDeviationY',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.stdDeviationX] = null;
-      this[dartx.stdDeviationY] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.stdDeviationX]() {
-      return this.stdDeviationX;
-    }
-    get [dartx.stdDeviationY]() {
-      return this.stdDeviationY;
-    }
-    [dartx.setStdDeviation](...args) {
-      return this.setStdDeviation.apply(this, args);
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
-  svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEGaussianBlurElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
-      new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
-      created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.stdDeviationX]: svg$.AnimatedNumber,
-      [dartx.stdDeviationY]: svg$.AnimatedNumber,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
-  dart.defineExtensionNames([
-    'preserveAspectRatio',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y',
-    'href'
-  ]);
-  svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
-    }
-    created() {
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEImageElement, 'created');
-  svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
-  dart.setSignature(svg$.FEImageElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEImageElement, []),
-      new: dart.definiteFunctionType(svg$.FEImageElement, []),
-      created: dart.definiteFunctionType(svg$.FEImageElement, [])
-    }),
-    fields: () => ({
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.href]: svg$.AnimatedString
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
-  dart.defineExtensionNames([
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
-  svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEMergeElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEMergeElement, []),
-      new: dart.definiteFunctionType(svg$.FEMergeElement, []),
-      created: dart.definiteFunctionType(svg$.FEMergeElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
-  dart.defineExtensionNames([
-    'in1'
-  ]);
-  svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
-  dart.setSignature(svg$.FEMergeNodeElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
-      new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
-      created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
-    }),
-    fields: () => ({[dartx.in1]: svg$.AnimatedString}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
-  dart.defineExtensionNames([
-    'in1',
-    'operator',
-    'radiusX',
-    'radiusY',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.operator] = null;
-      this[dartx.radiusX] = null;
-      this[dartx.radiusY] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.operator]() {
-      return this.operator;
-    }
-    get [dartx.radiusX]() {
-      return this.radiusX;
-    }
-    get [dartx.radiusY]() {
-      return this.radiusY;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
-  svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEMorphologyElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
-      created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.operator]: svg$.AnimatedEnumeration,
-      [dartx.radiusX]: svg$.AnimatedNumber,
-      [dartx.radiusY]: svg$.AnimatedNumber,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
-      SVG_MORPHOLOGY_OPERATOR_ERODE: core.int,
-      SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
-    })
-  });
-  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
-  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
-  svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
-  dart.defineExtensionNames([
-    'dx',
-    'dy',
-    'in1',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
-    }
-    created() {
-      this[dartx.dx] = null;
-      this[dartx.dy] = null;
-      this[dartx.in1] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
-    }
-    get [dartx.dx]() {
-      return this.dx;
-    }
-    get [dartx.dy]() {
-      return this.dy;
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
-  svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FEOffsetElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
-      new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
-      created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
-    }),
-    fields: () => ({
-      [dartx.dx]: svg$.AnimatedNumber,
-      [dartx.dy]: svg$.AnimatedNumber,
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
-  dart.defineExtensionNames([
-    'x',
-    'y',
-    'z'
-  ]);
-  svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
-    }
-    created() {
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.z] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.z]() {
-      return this.z;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
-  dart.setSignature(svg$.FEPointLightElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
-      new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
-      created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
-    }),
-    fields: () => ({
-      [dartx.x]: svg$.AnimatedNumber,
-      [dartx.y]: svg$.AnimatedNumber,
-      [dartx.z]: svg$.AnimatedNumber
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
-  dart.defineExtensionNames([
-    'in1',
-    'kernelUnitLengthX',
-    'kernelUnitLengthY',
-    'specularConstant',
-    'specularExponent',
-    'surfaceScale',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.kernelUnitLengthX] = null;
-      this[dartx.kernelUnitLengthY] = null;
-      this[dartx.specularConstant] = null;
-      this[dartx.specularExponent] = null;
-      this[dartx.surfaceScale] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.kernelUnitLengthX]() {
-      return this.kernelUnitLengthX;
-    }
-    get [dartx.kernelUnitLengthY]() {
-      return this.kernelUnitLengthY;
-    }
-    get [dartx.specularConstant]() {
-      return this.specularConstant;
-    }
-    get [dartx.specularExponent]() {
-      return this.specularExponent;
-    }
-    get [dartx.surfaceScale]() {
-      return this.surfaceScale;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
-  svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FESpecularLightingElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
-      new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
-      created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
-      [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
-      [dartx.specularConstant]: svg$.AnimatedNumber,
-      [dartx.specularExponent]: svg$.AnimatedNumber,
-      [dartx.surfaceScale]: svg$.AnimatedNumber,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
-  dart.defineExtensionNames([
-    'limitingConeAngle',
-    'pointsAtX',
-    'pointsAtY',
-    'pointsAtZ',
-    'specularExponent',
-    'x',
-    'y',
-    'z'
-  ]);
-  svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
-    }
-    created() {
-      this[dartx.limitingConeAngle] = null;
-      this[dartx.pointsAtX] = null;
-      this[dartx.pointsAtY] = null;
-      this[dartx.pointsAtZ] = null;
-      this[dartx.specularExponent] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.z] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
-    }
-    get [dartx.limitingConeAngle]() {
-      return this.limitingConeAngle;
-    }
-    get [dartx.pointsAtX]() {
-      return this.pointsAtX;
-    }
-    get [dartx.pointsAtY]() {
-      return this.pointsAtY;
-    }
-    get [dartx.pointsAtZ]() {
-      return this.pointsAtZ;
-    }
-    get [dartx.specularExponent]() {
-      return this.specularExponent;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.z]() {
-      return this.z;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
-  dart.setSignature(svg$.FESpotLightElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
-      new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
-      created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
-    }),
-    fields: () => ({
-      [dartx.limitingConeAngle]: svg$.AnimatedNumber,
-      [dartx.pointsAtX]: svg$.AnimatedNumber,
-      [dartx.pointsAtY]: svg$.AnimatedNumber,
-      [dartx.pointsAtZ]: svg$.AnimatedNumber,
-      [dartx.specularExponent]: svg$.AnimatedNumber,
-      [dartx.x]: svg$.AnimatedNumber,
-      [dartx.y]: svg$.AnimatedNumber,
-      [dartx.z]: svg$.AnimatedNumber
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
-  dart.defineExtensionNames([
-    'in1',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FETileElement = class FETileElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
-    }
-    created() {
-      this[dartx.in1] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
-    }
-    get [dartx.in1]() {
-      return this.in1;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FETileElement, 'created');
-  svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FETileElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FETileElement, []),
-      new: dart.definiteFunctionType(svg$.FETileElement, []),
-      created: dart.definiteFunctionType(svg$.FETileElement, [])
-    }),
-    fields: () => ({
-      [dartx.in1]: svg$.AnimatedString,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
-  dart.defineExtensionNames([
-    'baseFrequencyX',
-    'baseFrequencyY',
-    'numOctaves',
-    'seed',
-    'stitchTiles',
-    'type',
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
-    }
-    created() {
-      this[dartx.baseFrequencyX] = null;
-      this[dartx.baseFrequencyY] = null;
-      this[dartx.numOctaves] = null;
-      this[dartx.seed] = null;
-      this[dartx.stitchTiles] = null;
-      this[dartx.type] = null;
-      this[dartx.height] = null;
-      this[dartx.result] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
-    }
-    get [dartx.baseFrequencyX]() {
-      return this.baseFrequencyX;
-    }
-    get [dartx.baseFrequencyY]() {
-      return this.baseFrequencyY;
-    }
-    get [dartx.numOctaves]() {
-      return this.numOctaves;
-    }
-    get [dartx.seed]() {
-      return this.seed;
-    }
-    get [dartx.stitchTiles]() {
-      return this.stitchTiles;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.result]() {
-      return this.result;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
-  svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$.FETurbulenceElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
-      new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
-      created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
-    }),
-    fields: () => ({
-      [dartx.baseFrequencyX]: svg$.AnimatedNumber,
-      [dartx.baseFrequencyY]: svg$.AnimatedNumber,
-      [dartx.numOctaves]: svg$.AnimatedInteger,
-      [dartx.seed]: svg$.AnimatedNumber,
-      [dartx.stitchTiles]: svg$.AnimatedEnumeration,
-      [dartx.type]: svg$.AnimatedEnumeration,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.result]: svg$.AnimatedString,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sfields: () => ({
-      SVG_STITCHTYPE_NOSTITCH: core.int,
-      SVG_STITCHTYPE_STITCH: core.int,
-      SVG_STITCHTYPE_UNKNOWN: core.int,
-      SVG_TURBULENCE_TYPE_FRACTALNOISE: core.int,
-      SVG_TURBULENCE_TYPE_TURBULENCE: core.int,
-      SVG_TURBULENCE_TYPE_UNKNOWN: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
-  svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
-  svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
-  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
-  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
-  svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
-  dart.defineExtensionNames([
-    'filterUnits',
-    'height',
-    'primitiveUnits',
-    'width',
-    'x',
-    'y',
-    'href'
-  ]);
-  svg$.FilterElement = class FilterElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
-    }
-    created() {
-      this[dartx.filterUnits] = null;
-      this[dartx.height] = null;
-      this[dartx.primitiveUnits] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
-    }
-    get [dartx.filterUnits]() {
-      return this.filterUnits;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.primitiveUnits]() {
-      return this.primitiveUnits;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.FilterElement, 'created');
-  svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.FilterElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.FilterElement, []),
-      new: dart.definiteFunctionType(svg$.FilterElement, []),
-      created: dart.definiteFunctionType(svg$.FilterElement, [])
-    }),
-    fields: () => ({
-      [dartx.filterUnits]: svg$.AnimatedEnumeration,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.href]: svg$.AnimatedString
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
-  dart.defineExtensionNames([
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get height() {
-      return this[height$];
-    }
-    set height(value) {
-      super.height = value;
-    }
-    get result() {
-      return this[result];
-    }
-    set result(value) {
-      super.result = value;
+    set top(value) {
+      super.top = value;
     }
     get width() {
       return this[width$];
@@ -103032,7690 +53760,56963 @@
     set width(value) {
       super.width = value;
     }
-    get x() {
-      return this[x];
+    get height() {
+      return this[height$];
     }
-    set x(value) {
-      super.x = value;
+    set height(value) {
+      super.height = value;
     }
-    get y() {
-      return this[y];
+    new(left, top, width, height) {
+      this[left$] = left;
+      this[top$] = top;
+      this[width$] = dart.notNull(width) < 0 ? -dart.notNull(width) * 0 : width;
+      this[height$] = dart.notNull(height) < 0 ? -dart.notNull(height) * 0 : height;
+      super.new();
     }
-    set y(value) {
-      super.y = value;
+    static fromPoints(a, b) {
+      let left = math.min(T)(a.x, b.x);
+      let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
+      let top = math.min(T)(a.y, b.y);
+      let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
+      return new (RectangleOfT())(left, top, width, height);
     }
-  };
-  const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
-  const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
-  const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
-  const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
-  const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
-  dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
-    fields: () => ({
-      height: svg$.AnimatedLength,
-      result: svg$.AnimatedString,
-      width: svg$.AnimatedLength,
-      x: svg$.AnimatedLength,
-      y: svg$.AnimatedLength
-    })
-  });
-  dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
-    'height',
-    'result',
-    'width',
-    'x',
-    'y'
-  ]);
-  dart.defineExtensionNames([
-    'preserveAspectRatio',
-    'viewBox'
-  ]);
-  svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get preserveAspectRatio() {
-      return this[preserveAspectRatio];
-    }
-    set preserveAspectRatio(value) {
-      super.preserveAspectRatio = value;
-    }
-    get viewBox() {
-      return this[viewBox];
-    }
-    set viewBox(value) {
-      super.viewBox = value;
-    }
-  };
-  const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
-  const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
-  dart.setSignature(svg$.FitToViewBox, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
-    fields: () => ({
-      preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
-      viewBox: svg$.AnimatedRect
-    })
-  });
-  dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
-  dart.defineExtensionNames([
-    'height',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
-  dart.setSignature(svg$.ForeignObjectElement, {
+  }
+  const left$ = Symbol(Rectangle.name + "." + 'left'.toString());
+  const top$ = Symbol(Rectangle.name + "." + 'top'.toString());
+  const width$ = Symbol(Rectangle.name + "." + 'width'.toString());
+  const height$ = Symbol(Rectangle.name + "." + 'height'.toString());
+  dart.setSignature(Rectangle, {
     constructors: () => ({
-      _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
-      new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
-      created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
+      new: dart.definiteFunctionType(math.Rectangle$(T), [T, T, T, T]),
+      fromPoints: dart.definiteFunctionType(math.Rectangle$(T), [PointOfT(), PointOfT()])
     }),
     fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+      left: T,
+      top: T,
+      width: T,
+      height: T
+    })
   });
-  dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
-  svg$.GElement = class GElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
+  dart.defineExtensionMembers(Rectangle, ['left', 'top', 'width', 'height']);
+  return Rectangle;
+});
+math.Rectangle = Rectangle();
+const _width = Symbol('_width');
+const _height = Symbol('_height');
+math.MutableRectangle$ = dart.generic(T => {
+  let MutableRectangleOfT = () => (MutableRectangleOfT = dart.constFn(math.MutableRectangle$(T)))();
+  let RectangleOfT = () => (RectangleOfT = dart.constFn(math.Rectangle$(T)))();
+  let PointOfT = () => (PointOfT = dart.constFn(math.Point$(T)))();
+  class MutableRectangle extends math._RectangleBase$(T) {
+    get left() {
+      return this[left$];
     }
-    static new() {
-      return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
+    set left(value) {
+      this[left$] = value;
     }
-    created() {
-      super.created();
+    get top() {
+      return this[top$];
     }
-  };
-  dart.defineNamedConstructor(svg$.GElement, 'created');
-  dart.setSignature(svg$.GElement, {
+    set top(value) {
+      this[top$] = value;
+    }
+    new(left, top, width, height) {
+      this[left$] = left;
+      this[top$] = top;
+      this[_width] = dart.notNull(width) < 0 ? math._clampToZero(T)(width) : width;
+      this[_height] = dart.notNull(height) < 0 ? math._clampToZero(T)(height) : height;
+      super.new();
+    }
+    static fromPoints(a, b) {
+      let left = math.min(T)(a.x, b.x);
+      let width = dart.notNull(math.max(T)(a.x, b.x)) - dart.notNull(left);
+      let top = math.min(T)(a.y, b.y);
+      let height = dart.notNull(math.max(T)(a.y, b.y)) - dart.notNull(top);
+      return new (MutableRectangleOfT())(left, top, width, height);
+    }
+    get width() {
+      return this[_width];
+    }
+    set width(width) {
+      T._check(width);
+      if (dart.notNull(width) < 0) width = math._clampToZero(T)(width);
+      this[_width] = width;
+    }
+    get height() {
+      return this[_height];
+    }
+    set height(height) {
+      T._check(height);
+      if (dart.notNull(height) < 0) height = math._clampToZero(T)(height);
+      this[_height] = height;
+    }
+  }
+  const left$ = Symbol(MutableRectangle.name + "." + 'left'.toString());
+  const top$ = Symbol(MutableRectangle.name + "." + 'top'.toString());
+  MutableRectangle[dart.implements] = () => [RectangleOfT()];
+  dart.setSignature(MutableRectangle, {
     constructors: () => ({
-      _: dart.definiteFunctionType(svg$.GElement, []),
-      new: dart.definiteFunctionType(svg$.GElement, []),
-      created: dart.definiteFunctionType(svg$.GElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
-  dart.defineExtensionNames([
-    'height',
-    'preserveAspectRatio',
-    'width',
-    'x',
-    'y',
-    'href'
-  ]);
-  svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.ImageElement, 'created');
-  svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.ImageElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.ImageElement, []),
-      new: dart.definiteFunctionType(svg$.ImageElement, []),
-      created: dart.definiteFunctionType(svg$.ImageElement, [])
+      new: dart.definiteFunctionType(math.MutableRectangle$(T), [T, T, T, T]),
+      fromPoints: dart.definiteFunctionType(math.MutableRectangle$(T), [PointOfT(), PointOfT()])
     }),
     fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.href]: svg$.AnimatedString
+      left: T,
+      top: T,
+      [_width]: T,
+      [_height]: T
+    }),
+    getters: () => ({
+      width: dart.definiteFunctionType(T, []),
+      height: dart.definiteFunctionType(T, [])
+    }),
+    setters: () => ({
+      width: dart.definiteFunctionType(dart.void, [T]),
+      height: dart.definiteFunctionType(dart.void, [T])
     })
   });
-  dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
-  dart.defineExtensionNames([
-    'convertToSpecifiedUnits',
-    'newValueSpecifiedUnits',
-    'unitType',
-    'value',
-    'valueAsString',
-    'valueInSpecifiedUnits'
-  ]);
-  svg$.Length = class Length extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.unitType]() {
-      return this.unitType;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    get [dartx.valueAsString]() {
-      return this.valueAsString;
-    }
-    set [dartx.valueAsString](value) {
-      this.valueAsString = value;
-    }
-    get [dartx.valueInSpecifiedUnits]() {
-      return this.valueInSpecifiedUnits;
-    }
-    set [dartx.valueInSpecifiedUnits](value) {
-      this.valueInSpecifiedUnits = value;
-    }
-    [dartx.convertToSpecifiedUnits](...args) {
-      return this.convertToSpecifiedUnits.apply(this, args);
-    }
-    [dartx.newValueSpecifiedUnits](...args) {
-      return this.newValueSpecifiedUnits.apply(this, args);
-    }
+  dart.defineExtensionMembers(MutableRectangle, ['left', 'top', 'width', 'height']);
+  return MutableRectangle;
+});
+math.MutableRectangle = MutableRectangle();
+math._clampToZero = function(T) {
+  return value => {
+    dart.assert(dart.notNull(value) < 0);
+    return -dart.notNull(value) * 0;
   };
-  dart.setSignature(svg$.Length, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
-    fields: () => ({
-      [dartx.unitType]: core.int,
-      [dartx.value]: core.num,
-      [dartx.valueAsString]: core.String,
-      [dartx.valueInSpecifiedUnits]: core.num
-    }),
-    methods: () => ({
-      [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
-    }),
-    sfields: () => ({
-      SVG_LENGTHTYPE_CM: core.int,
-      SVG_LENGTHTYPE_EMS: core.int,
-      SVG_LENGTHTYPE_EXS: core.int,
-      SVG_LENGTHTYPE_IN: core.int,
-      SVG_LENGTHTYPE_MM: core.int,
-      SVG_LENGTHTYPE_NUMBER: core.int,
-      SVG_LENGTHTYPE_PC: core.int,
-      SVG_LENGTHTYPE_PERCENTAGE: core.int,
-      SVG_LENGTHTYPE_PT: core.int,
-      SVG_LENGTHTYPE_PX: core.int,
-      SVG_LENGTHTYPE_UNKNOWN: core.int
-    })
-  });
-  svg$.Length.SVG_LENGTHTYPE_CM = 6;
-  svg$.Length.SVG_LENGTHTYPE_EMS = 3;
-  svg$.Length.SVG_LENGTHTYPE_EXS = 4;
-  svg$.Length.SVG_LENGTHTYPE_IN = 8;
-  svg$.Length.SVG_LENGTHTYPE_MM = 7;
-  svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
-  svg$.Length.SVG_LENGTHTYPE_PC = 10;
-  svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
-  svg$.Length.SVG_LENGTHTYPE_PT = 9;
-  svg$.Length.SVG_LENGTHTYPE_PX = 5;
-  svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGLength, svg$.Length);
-  const __setter__$ = Symbol('__setter__');
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'appendItem',
-    'clear',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'numberOfItems'
-  ]);
-  svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.getItem](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+};
+dart.fn(math._clampToZero, TToT());
+mirrors.MirrorSystem = class MirrorSystem extends core.Object {
+  findLibrary(libraryName) {
+    return this.libraries[dartx.values][dartx.singleWhere](dart.fn(library => dart.equals(library.simpleName, libraryName), LibraryMirrorTobool()));
+  }
+  static getName(symbol) {
+    return _js_mirrors.getName(symbol);
+  }
+  static getSymbol(name, library) {
+    if (library === void 0) library = null;
+    return _js_mirrors.getSymbol(name, library);
+  }
+};
+dart.setSignature(mirrors.MirrorSystem, {
+  methods: () => ({findLibrary: dart.definiteFunctionType(mirrors.LibraryMirror, [core.Symbol])}),
+  statics: () => ({
+    getName: dart.definiteFunctionType(core.String, [core.Symbol]),
+    getSymbol: dart.definiteFunctionType(core.Symbol, [core.String], [mirrors.LibraryMirror])
+  }),
+  names: ['getName', 'getSymbol']
+});
+mirrors.currentMirrorSystem = function() {
+  return mirrors.MirrorSystem._check(_js_mirrors.currentJsMirrorSystem);
+};
+dart.fn(mirrors.currentMirrorSystem, VoidToMirrorSystem());
+mirrors.reflect = function(reflectee) {
+  return _js_mirrors.reflect(reflectee);
+};
+dart.lazyFn(mirrors.reflect, () => ObjectToInstanceMirror());
+mirrors.reflectClass = function(key) {
+  if (!core.Type.is(key) || dart.equals(key, dart.wrapType(dart.dynamic))) {
+    dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
+  }
+  let tm = mirrors.reflectType(key);
+  if (!mirrors.ClassMirror.is(tm)) {
+    dart.throw(new core.ArgumentError(dart.str`${key} does not denote a class`));
+  }
+  return mirrors.ClassMirror._check(mirrors.ClassMirror.as(tm).originalDeclaration);
+};
+dart.lazyFn(mirrors.reflectClass, () => TypeToClassMirror());
+mirrors.reflectType = function(key) {
+  if (dart.equals(key, dart.wrapType(dart.dynamic))) {
+    return mirrors.currentMirrorSystem().dynamicType;
+  }
+  return _js_mirrors.reflectType(key);
+};
+dart.lazyFn(mirrors.reflectType, () => TypeToTypeMirror());
+mirrors.Mirror = class Mirror extends core.Object {};
+mirrors.IsolateMirror = class IsolateMirror extends core.Object {};
+mirrors.IsolateMirror[dart.implements] = () => [mirrors.Mirror];
+mirrors.DeclarationMirror = class DeclarationMirror extends core.Object {};
+mirrors.DeclarationMirror[dart.implements] = () => [mirrors.Mirror];
+mirrors.ObjectMirror = class ObjectMirror extends core.Object {};
+mirrors.ObjectMirror[dart.implements] = () => [mirrors.Mirror];
+mirrors.InstanceMirror = class InstanceMirror extends core.Object {};
+mirrors.InstanceMirror[dart.implements] = () => [mirrors.ObjectMirror];
+mirrors.ClosureMirror = class ClosureMirror extends core.Object {};
+mirrors.ClosureMirror[dart.implements] = () => [mirrors.InstanceMirror];
+mirrors.LibraryMirror = class LibraryMirror extends core.Object {};
+mirrors.LibraryMirror[dart.implements] = () => [mirrors.DeclarationMirror, mirrors.ObjectMirror];
+mirrors.LibraryDependencyMirror = class LibraryDependencyMirror extends core.Object {};
+mirrors.LibraryDependencyMirror[dart.implements] = () => [mirrors.Mirror];
+mirrors.CombinatorMirror = class CombinatorMirror extends core.Object {};
+mirrors.CombinatorMirror[dart.implements] = () => [mirrors.Mirror];
+mirrors.TypeMirror = class TypeMirror extends core.Object {};
+mirrors.TypeMirror[dart.implements] = () => [mirrors.DeclarationMirror];
+mirrors.ClassMirror = class ClassMirror extends core.Object {};
+mirrors.ClassMirror[dart.implements] = () => [mirrors.TypeMirror, mirrors.ObjectMirror];
+mirrors.FunctionTypeMirror = class FunctionTypeMirror extends core.Object {};
+mirrors.FunctionTypeMirror[dart.implements] = () => [mirrors.ClassMirror];
+mirrors.TypeVariableMirror = class TypeVariableMirror extends mirrors.TypeMirror {};
+mirrors.TypedefMirror = class TypedefMirror extends core.Object {};
+mirrors.TypedefMirror[dart.implements] = () => [mirrors.TypeMirror];
+mirrors.MethodMirror = class MethodMirror extends core.Object {};
+mirrors.MethodMirror[dart.implements] = () => [mirrors.DeclarationMirror];
+mirrors.VariableMirror = class VariableMirror extends core.Object {};
+mirrors.VariableMirror[dart.implements] = () => [mirrors.DeclarationMirror];
+mirrors.ParameterMirror = class ParameterMirror extends core.Object {};
+mirrors.ParameterMirror[dart.implements] = () => [mirrors.VariableMirror];
+mirrors.SourceLocation = class SourceLocation extends core.Object {};
+mirrors.Comment = class Comment extends core.Object {
+  new(text, trimmedText, isDocComment) {
+    this.text = text;
+    this.trimmedText = trimmedText;
+    this.isDocComment = isDocComment;
+  }
+};
+dart.setSignature(mirrors.Comment, {
+  constructors: () => ({new: dart.definiteFunctionType(mirrors.Comment, [core.String, core.String, core.bool])}),
+  fields: () => ({
+    text: core.String,
+    trimmedText: core.String,
+    isDocComment: core.bool
+  })
+});
+mirrors.MirrorsUsed = class MirrorsUsed extends core.Object {
+  new(opts) {
+    let symbols = opts && 'symbols' in opts ? opts.symbols : null;
+    let targets = opts && 'targets' in opts ? opts.targets : null;
+    let metaTargets = opts && 'metaTargets' in opts ? opts.metaTargets : null;
+    let override = opts && 'override' in opts ? opts.override : null;
+    this.symbols = symbols;
+    this.targets = targets;
+    this.metaTargets = metaTargets;
+    this.override = override;
+  }
+};
+dart.setSignature(mirrors.MirrorsUsed, {
+  constructors: () => ({new: dart.definiteFunctionType(mirrors.MirrorsUsed, [], {symbols: dart.dynamic, targets: dart.dynamic, metaTargets: dart.dynamic, override: dart.dynamic})}),
+  fields: () => ({
+    symbols: dart.dynamic,
+    targets: dart.dynamic,
+    metaTargets: dart.dynamic,
+    override: dart.dynamic
+  })
+});
+typed_data.ByteBuffer = class ByteBuffer extends core.Object {};
+typed_data.TypedData = class TypedData extends core.Object {};
+const _littleEndian = Symbol('_littleEndian');
+typed_data.Endianness = class Endianness extends core.Object {
+  _(littleEndian) {
+    this[_littleEndian] = littleEndian;
+  }
+};
+dart.defineNamedConstructor(typed_data.Endianness, '_');
+dart.setSignature(typed_data.Endianness, {
+  constructors: () => ({_: dart.definiteFunctionType(typed_data.Endianness, [core.bool])}),
+  fields: () => ({[_littleEndian]: core.bool}),
+  sfields: () => ({
+    BIG_ENDIAN: typed_data.Endianness,
+    LITTLE_ENDIAN: typed_data.Endianness,
+    HOST_ENDIAN: typed_data.Endianness
+  })
+});
+dart.defineLazy(typed_data.Endianness, {
+  get BIG_ENDIAN() {
+    return dart.const(new typed_data.Endianness._(false));
+  },
+  get LITTLE_ENDIAN() {
+    return dart.const(new typed_data.Endianness._(true));
+  },
+  get HOST_ENDIAN() {
+    return typed_data.ByteData.view(typed_data.Uint16List.fromList(JSArrayOfint().of([1]))[dartx.buffer])[dartx.getInt8](0) == 1 ? typed_data.Endianness.LITTLE_ENDIAN : typed_data.Endianness.BIG_ENDIAN;
+  }
+});
+typed_data.ByteData = class ByteData extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeByteData.new(length);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asByteData](offsetInBytes, length);
+  }
+};
+typed_data.ByteData[dart.implements] = () => [typed_data.TypedData];
+dart.setSignature(typed_data.ByteData, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.ByteData, [core.int]),
+    view: dart.definiteFunctionType(typed_data.ByteData, [typed_data.ByteBuffer], [core.int, core.int])
+  })
+});
+typed_data.Int8List = class Int8List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeInt8List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt8List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asInt8List](offsetInBytes, length);
+  }
+};
+typed_data.Int8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Int8List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int8List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Int8List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Int8List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Int8List.BYTES_PER_ELEMENT = 1;
+typed_data.Uint8List = class Uint8List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeUint8List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint8List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asUint8List](offsetInBytes, length);
+  }
+};
+typed_data.Uint8List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Uint8List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Uint8List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Uint8List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Uint8List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Uint8List.BYTES_PER_ELEMENT = 1;
+typed_data.Uint8ClampedList = class Uint8ClampedList extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeUint8ClampedList.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint8ClampedList.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asUint8ClampedList](offsetInBytes, length);
+  }
+};
+typed_data.Uint8ClampedList[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Uint8ClampedList, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Uint8ClampedList, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Uint8ClampedList, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Uint8ClampedList, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Uint8ClampedList.BYTES_PER_ELEMENT = 1;
+typed_data.Int16List = class Int16List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeInt16List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt16List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asInt16List](offsetInBytes, length);
+  }
+};
+typed_data.Int16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Int16List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int16List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Int16List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Int16List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Int16List.BYTES_PER_ELEMENT = 2;
+typed_data.Uint16List = class Uint16List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeUint16List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint16List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asUint16List](offsetInBytes, length);
+  }
+};
+typed_data.Uint16List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Uint16List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Uint16List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Uint16List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Uint16List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Uint16List.BYTES_PER_ELEMENT = 2;
+typed_data.Int32List = class Int32List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeInt32List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt32List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asInt32List](offsetInBytes, length);
+  }
+};
+typed_data.Int32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Int32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int32List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Int32List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Int32List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Int32List.BYTES_PER_ELEMENT = 4;
+typed_data.Uint32List = class Uint32List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeUint32List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeUint32List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asUint32List](offsetInBytes, length);
+  }
+};
+typed_data.Uint32List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Uint32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Uint32List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Uint32List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Uint32List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Uint32List.BYTES_PER_ELEMENT = 4;
+typed_data.Int64List = class Int64List extends core.Object {
+  static new(length) {
+    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
+  }
+  static fromList(elements) {
+    dart.throw(new core.UnsupportedError("Int64List not supported by dart2js."));
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asInt64List](offsetInBytes, length);
+  }
+};
+typed_data.Int64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Int64List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int64List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Int64List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Int64List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Int64List.BYTES_PER_ELEMENT = 8;
+typed_data.Uint64List = class Uint64List extends core.Object {
+  static new(length) {
+    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
+  }
+  static fromList(elements) {
+    dart.throw(new core.UnsupportedError("Uint64List not supported by dart2js."));
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asUint64List](offsetInBytes, length);
+  }
+};
+typed_data.Uint64List[dart.implements] = () => [ListOfint(), typed_data.TypedData];
+dart.setSignature(typed_data.Uint64List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Uint64List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Uint64List, [ListOfint()]),
+    view: dart.definiteFunctionType(typed_data.Uint64List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Uint64List.BYTES_PER_ELEMENT = 8;
+typed_data.Float32List = class Float32List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeFloat32List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat32List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asFloat32List](offsetInBytes, length);
+  }
+};
+typed_data.Float32List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
+dart.setSignature(typed_data.Float32List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float32List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Float32List, [ListOfdouble()]),
+    view: dart.definiteFunctionType(typed_data.Float32List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Float32List.BYTES_PER_ELEMENT = 4;
+typed_data.Float64List = class Float64List extends core.Object {
+  static new(length) {
+    return _native_typed_data.NativeFloat64List.new(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat64List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asFloat64List](offsetInBytes, length);
+  }
+};
+typed_data.Float64List[dart.implements] = () => [ListOfdouble(), typed_data.TypedData];
+dart.setSignature(typed_data.Float64List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float64List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Float64List, [ListOfdouble()]),
+    view: dart.definiteFunctionType(typed_data.Float64List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Float64List.BYTES_PER_ELEMENT = 8;
+typed_data.Float32x4List = class Float32x4List extends core.Object {
+  static new(length) {
+    return new _native_typed_data.NativeFloat32x4List(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat32x4List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asFloat32x4List](offsetInBytes, length);
+  }
+};
+typed_data.Float32x4List[dart.implements] = () => [ListOfFloat32x4(), typed_data.TypedData];
+dart.setSignature(typed_data.Float32x4List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float32x4List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Float32x4List, [ListOfFloat32x4()]),
+    view: dart.definiteFunctionType(typed_data.Float32x4List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Float32x4List.BYTES_PER_ELEMENT = 16;
+typed_data.Int32x4List = class Int32x4List extends core.Object {
+  static new(length) {
+    return new _native_typed_data.NativeInt32x4List(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeInt32x4List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asInt32x4List](offsetInBytes, length);
+  }
+};
+typed_data.Int32x4List[dart.implements] = () => [ListOfInt32x4(), typed_data.TypedData];
+dart.setSignature(typed_data.Int32x4List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Int32x4List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Int32x4List, [ListOfInt32x4()]),
+    view: dart.definiteFunctionType(typed_data.Int32x4List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Int32x4List.BYTES_PER_ELEMENT = 16;
+typed_data.Float64x2List = class Float64x2List extends core.Object {
+  static new(length) {
+    return new _native_typed_data.NativeFloat64x2List(length);
+  }
+  static fromList(elements) {
+    return _native_typed_data.NativeFloat64x2List.fromList(elements);
+  }
+  static view(buffer, offsetInBytes, length) {
+    if (offsetInBytes === void 0) offsetInBytes = 0;
+    if (length === void 0) length = null;
+    return buffer[dartx.asFloat64x2List](offsetInBytes, length);
+  }
+};
+typed_data.Float64x2List[dart.implements] = () => [ListOfFloat64x2(), typed_data.TypedData];
+dart.setSignature(typed_data.Float64x2List, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(typed_data.Float64x2List, [core.int]),
+    fromList: dart.definiteFunctionType(typed_data.Float64x2List, [ListOfFloat64x2()]),
+    view: dart.definiteFunctionType(typed_data.Float64x2List, [typed_data.ByteBuffer], [core.int, core.int])
+  }),
+  sfields: () => ({BYTES_PER_ELEMENT: core.int})
+});
+typed_data.Float64x2List.BYTES_PER_ELEMENT = 16;
+indexed_db._KeyRangeFactoryProvider = class _KeyRangeFactoryProvider extends core.Object {
+  static createKeyRange_only(value) {
+    return indexed_db._KeyRangeFactoryProvider._only(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(value));
+  }
+  static createKeyRange_lowerBound(bound, open) {
+    if (open === void 0) open = false;
+    return indexed_db._KeyRangeFactoryProvider._lowerBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
+  }
+  static createKeyRange_upperBound(bound, open) {
+    if (open === void 0) open = false;
+    return indexed_db._KeyRangeFactoryProvider._upperBound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(bound), open);
+  }
+  static createKeyRange_bound(lower, upper, lowerOpen, upperOpen) {
+    if (lowerOpen === void 0) lowerOpen = false;
+    if (upperOpen === void 0) upperOpen = false;
+    return indexed_db._KeyRangeFactoryProvider._bound(indexed_db._KeyRangeFactoryProvider._class(), indexed_db._KeyRangeFactoryProvider._translateKey(lower), indexed_db._KeyRangeFactoryProvider._translateKey(upper), lowerOpen, upperOpen);
+  }
+  static _class() {
+    if (indexed_db._KeyRangeFactoryProvider._cachedClass != null) return indexed_db._KeyRangeFactoryProvider._cachedClass;
+    return indexed_db._KeyRangeFactoryProvider._cachedClass = indexed_db._KeyRangeFactoryProvider._uncachedClass();
+  }
+  static _uncachedClass() {
+    return window.webkitIDBKeyRange || window.mozIDBKeyRange || window.msIDBKeyRange || window.IDBKeyRange;
+  }
+  static _translateKey(idbkey) {
+    return idbkey;
+  }
+  static _only(cls, value) {
+    return cls.only(value);
+  }
+  static _lowerBound(cls, bound, open) {
+    return cls.lowerBound(bound, open);
+  }
+  static _upperBound(cls, bound, open) {
+    return cls.upperBound(bound, open);
+  }
+  static _bound(cls, lower, upper, lowerOpen, upperOpen) {
+    return cls.bound(lower, upper, lowerOpen, upperOpen);
+  }
+};
+dart.setSignature(indexed_db._KeyRangeFactoryProvider, {
+  sfields: () => ({_cachedClass: dart.dynamic}),
+  statics: () => ({
+    createKeyRange_only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
+    createKeyRange_lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
+    createKeyRange_upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
+    createKeyRange_bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
+    _class: dart.definiteFunctionType(dart.dynamic, []),
+    _uncachedClass: dart.definiteFunctionType(dart.dynamic, []),
+    _translateKey: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic]),
+    _lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['createKeyRange_only', 'createKeyRange_lowerBound', 'createKeyRange_upperBound', 'createKeyRange_bound', '_class', '_uncachedClass', '_translateKey', '_only', '_lowerBound', '_upperBound', '_bound']
+});
+indexed_db._KeyRangeFactoryProvider._cachedClass = null;
+indexed_db._convertNativeToDart_IDBKey = function(nativeKey) {
+  function containsDate(object) {
+    if (dart.test(html_common.isJavaScriptDate(object))) return true;
+    if (core.List.is(object)) {
+      for (let i = 0; i < dart.notNull(object[dartx.length]); i++) {
+        if (dart.test(containsDate(object[dartx._get](i)))) return true;
       }
-      dart.throw(new core.StateError("No elements"));
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
+    return false;
+  }
+  dart.fn(containsDate, dynamicTobool$());
+  if (dart.test(containsDate(nativeKey))) {
+    dart.throw(new core.UnimplementedError('Key containing DateTime'));
+  }
+  return nativeKey;
+};
+dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
+indexed_db._convertDartToNative_IDBKey = function(dartKey) {
+  return dartKey;
+};
+dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
+indexed_db._convertNativeToDart_IDBAny = function(object) {
+  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
+};
+dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
+indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
+indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
+indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
+const _delete$ = Symbol('_delete');
+const _update = Symbol('_update');
+const _update_1 = Symbol('_update_1');
+dart.defineExtensionNames([
+  'delete',
+  'update',
+  'next',
+  'advance',
+  'continuePrimaryKey',
+  'direction',
+  'key',
+  'primaryKey',
+  'source'
+]);
+indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
+  [dartx.delete]() {
+    try {
+      return indexed_db._completeRequest(dart.dynamic)(this[_delete$]());
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.update](value) {
+    try {
+      return indexed_db._completeRequest(dart.dynamic)(this[_update](value));
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.next](key) {
+    if (key === void 0) key = null;
+    if (key == null) {
+      this.continue();
+    } else {
+      this.continue(key);
+    }
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.direction]() {
+    return this.direction;
+  }
+  get [dartx.key]() {
+    return this.key;
+  }
+  get [dartx.primaryKey]() {
+    return this.primaryKey;
+  }
+  get [dartx.source]() {
+    return this.source;
+  }
+  [dartx.advance](...args) {
+    return this.advance.apply(this, args);
+  }
+  [dartx.continuePrimaryKey](...args) {
+    return this.continuePrimaryKey.apply(this, args);
+  }
+  [_delete$](...args) {
+    return this.delete.apply(this, args);
+  }
+  [_update](value) {
+    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
+    return this[_update_1](value_1);
+  }
+  [_update_1](...args) {
+    return this.update.apply(this, args);
+  }
+};
+dart.setSignature(indexed_db.Cursor, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Cursor, [])}),
+  fields: () => ({
+    [dartx.direction]: core.String,
+    [dartx.key]: core.Object,
+    [dartx.primaryKey]: core.Object,
+    [dartx.source]: core.Object
+  }),
+  methods: () => ({
+    [dartx.delete]: dart.definiteFunctionType(async.Future, []),
+    [dartx.update]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
+    [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
+    [_delete$]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
+    [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.IDBCursor, indexed_db.Cursor);
+const _get_value = Symbol('_get_value');
+dart.defineExtensionNames([
+  'value'
+]);
+indexed_db.CursorWithValue = class CursorWithValue extends indexed_db.Cursor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.value]() {
+    return indexed_db._convertNativeToDart_IDBAny(this[_get_value]);
+  }
+  get [_get_value]() {
+    return this.value;
+  }
+};
+dart.setSignature(indexed_db.CursorWithValue, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.CursorWithValue, [])}),
+  fields: () => ({[_get_value]: dart.dynamic}),
+  getters: () => ({[dartx.value]: dart.definiteFunctionType(dart.dynamic, [])})
+});
+dart.registerExtension(dart.global.IDBCursorWithValue, indexed_db.CursorWithValue);
+const _createObjectStore = Symbol('_createObjectStore');
+const _transaction = Symbol('_transaction');
+const _createObjectStore_1 = Symbol('_createObjectStore_1');
+const _createObjectStore_2 = Symbol('_createObjectStore_2');
+const _addEventListener = Symbol('_addEventListener');
+const _removeEventListener = Symbol('_removeEventListener');
+dart.defineExtensionNames([
+  'on',
+  'addEventListener',
+  'removeEventListener',
+  'dispatchEvent'
+]);
+html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
+  _created() {
+    super.new();
+  }
+  get [dartx.on]() {
+    return new html$.Events(this);
+  }
+  [dartx.addEventListener](type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    if (listener != null) {
+      this[_addEventListener](type, listener, useCapture);
+    }
+  }
+  [dartx.removeEventListener](type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    if (listener != null) {
+      this[_removeEventListener](type, listener, useCapture);
+    }
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_addEventListener](...args) {
+    return this.addEventListener.apply(this, args);
+  }
+  [dartx.dispatchEvent](...args) {
+    return this.dispatchEvent.apply(this, args);
+  }
+  [_removeEventListener](...args) {
+    return this.removeEventListener.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.EventTarget, '_created');
+dart.setSignature(html$.EventTarget, {
+  constructors: () => ({
+    _created: dart.definiteFunctionType(html$.EventTarget, []),
+    _: dart.definiteFunctionType(html$.EventTarget, [])
+  }),
+  getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
+  methods: () => ({
+    [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
+    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
+  })
+});
+dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
+dart.defineExtensionNames([
+  'createObjectStore',
+  'transaction',
+  'transactionStore',
+  'transactionList',
+  'transactionStores',
+  'close',
+  'deleteObjectStore',
+  'onAbort',
+  'onClose',
+  'onError',
+  'onVersionChange',
+  'name',
+  'objectStoreNames',
+  'version'
+]);
+indexed_db.Database = class Database extends html$.EventTarget {
+  [dartx.createObjectStore](name, opts) {
+    let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
+    let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
+    let options = dart.map();
+    if (keyPath != null) {
+      options[dartx._set]('keyPath', keyPath);
+    }
+    if (autoIncrement != null) {
+      options[dartx._set]('autoIncrement', autoIncrement);
+    }
+    return this[_createObjectStore](name, options);
+  }
+  [dartx.transaction](storeName_OR_storeNames, mode) {
+    if (mode != 'readonly' && mode != 'readwrite') {
+      dart.throw(new core.ArgumentError(mode));
+    }
+    return this[_transaction](storeName_OR_storeNames, mode);
+  }
+  [dartx.transactionStore](storeName, mode) {
+    if (mode != 'readonly' && mode != 'readwrite') {
+      dart.throw(new core.ArgumentError(mode));
+    }
+    return this[_transaction](storeName, mode);
+  }
+  [dartx.transactionList](storeNames, mode) {
+    if (mode != 'readonly' && mode != 'readwrite') {
+      dart.throw(new core.ArgumentError(mode));
+    }
+    let storeNames_1 = html_common.convertDartToNative_StringArray(storeNames);
+    return this[_transaction](storeNames_1, mode);
+  }
+  [dartx.transactionStores](storeNames, mode) {
+    if (mode != 'readonly' && mode != 'readwrite') {
+      dart.throw(new core.ArgumentError(mode));
+    }
+    return this[_transaction](storeNames, mode);
+  }
+  [_transaction](...args) {
+    return this.transaction.apply(this, args);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.objectStoreNames]() {
+    return this.objectStoreNames;
+  }
+  get [dartx.version]() {
+    return this.version;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [_createObjectStore](name, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_createObjectStore_1](name, options_1);
+    }
+    return this[_createObjectStore_2](name);
+  }
+  [_createObjectStore_1](...args) {
+    return this.createObjectStore.apply(this, args);
+  }
+  [_createObjectStore_2](...args) {
+    return this.createObjectStore.apply(this, args);
+  }
+  [dartx.deleteObjectStore](...args) {
+    return this.deleteObjectStore.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return indexed_db.Database.abortEvent.forTarget(this);
+  }
+  get [dartx.onClose]() {
+    return indexed_db.Database.closeEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return indexed_db.Database.errorEvent.forTarget(this);
+  }
+  get [dartx.onVersionChange]() {
+    return indexed_db.Database.versionChangeEvent.forTarget(this);
+  }
+};
+dart.setSignature(indexed_db.Database, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Database, [])}),
+  fields: () => ({
+    [dartx.name]: core.String,
+    [dartx.objectStoreNames]: ListOfString(),
+    [dartx.version]: core.Object
+  }),
+  getters: () => ({
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
+  }),
+  methods: () => ({
+    [dartx.createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], {keyPath: core.String, autoIncrement: core.bool}),
+    [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
+    [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
+    [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
+    [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
+    [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
+    [_createObjectStore_1]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic, dart.dynamic]),
+    [_createObjectStore_2]: dart.definiteFunctionType(indexed_db.ObjectStore, [dart.dynamic]),
+    [dartx.deleteObjectStore]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfEvent(),
+    closeEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    versionChangeEvent: EventStreamProviderOfVersionChangeEvent()
+  })
+});
+dart.defineLazy(indexed_db.Database, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('abort'));
+  },
+  get closeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('close'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get versionChangeEvent() {
+    return dart.const(new (EventStreamProviderOfVersionChangeEvent())('versionchange'));
+  }
+});
+dart.registerExtension(dart.global.IDBDatabase, indexed_db.Database);
+const _open = Symbol('_open');
+const _deleteDatabase = Symbol('_deleteDatabase');
+const _webkitGetDatabaseNames = Symbol('_webkitGetDatabaseNames');
+dart.defineExtensionNames([
+  'open',
+  'deleteDatabase',
+  'getDatabaseNames',
+  'supportsDatabaseNames',
+  'cmp'
+]);
+indexed_db.IdbFactory = class IdbFactory extends _interceptors.Interceptor {
+  static get supported() {
+    return !!(window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB);
+  }
+  [dartx.open](name, opts) {
+    let version = opts && 'version' in opts ? opts.version : null;
+    let onUpgradeNeeded = opts && 'onUpgradeNeeded' in opts ? opts.onUpgradeNeeded : null;
+    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
+    if (version == null != (onUpgradeNeeded == null)) {
+      return FutureOfDatabase().error(new core.ArgumentError('version and onUpgradeNeeded must be specified together'));
+    }
+    try {
+      let request = null;
+      if (version != null) {
+        request = this[_open](name, version);
+      } else {
+        request = this[_open](name);
       }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
+      if (onUpgradeNeeded != null) {
+        dart.dsend(dart.dload(request, 'onUpgradeNeeded'), 'listen', onUpgradeNeeded);
       }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
-  };
-  svg$.LengthList[dart.implements] = () => [ListOfLength()];
-  dart.setSignature(svg$.LengthList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
-    fields: () => ({[dartx.numberOfItems]: core.int}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
-      [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
-      [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
-  dart.defineExtensionNames([
-    'x1',
-    'x2',
-    'y1',
-    'y2'
-  ]);
-  svg$.LineElement = class LineElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
-    }
-    created() {
-      this[dartx.x1] = null;
-      this[dartx.x2] = null;
-      this[dartx.y1] = null;
-      this[dartx.y2] = null;
-      super.created();
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-  };
-  dart.defineNamedConstructor(svg$.LineElement, 'created');
-  dart.setSignature(svg$.LineElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.LineElement, []),
-      new: dart.definiteFunctionType(svg$.LineElement, []),
-      created: dart.definiteFunctionType(svg$.LineElement, [])
-    }),
-    fields: () => ({
-      [dartx.x1]: svg$.AnimatedLength,
-      [dartx.x2]: svg$.AnimatedLength,
-      [dartx.y1]: svg$.AnimatedLength,
-      [dartx.y2]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
-  dart.defineExtensionNames([
-    'gradientTransform',
-    'gradientUnits',
-    'spreadMethod',
-    'href'
-  ]);
-  svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.gradientTransform] = null;
-      this[dartx.gradientUnits] = null;
-      this[dartx.spreadMethod] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.gradientTransform]() {
-      return this.gradientTransform;
-    }
-    get [dartx.gradientUnits]() {
-      return this.gradientUnits;
-    }
-    get [dartx.spreadMethod]() {
-      return this.spreadMethod;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$._GradientElement, 'created');
-  svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$._GradientElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$._GradientElement, []),
-      created: dart.definiteFunctionType(svg$._GradientElement, [])
-    }),
-    fields: () => ({
-      [dartx.gradientTransform]: svg$.AnimatedTransformList,
-      [dartx.gradientUnits]: svg$.AnimatedEnumeration,
-      [dartx.spreadMethod]: svg$.AnimatedEnumeration,
-      [dartx.href]: svg$.AnimatedString
-    }),
-    sfields: () => ({
-      SVG_SPREADMETHOD_PAD: core.int,
-      SVG_SPREADMETHOD_REFLECT: core.int,
-      SVG_SPREADMETHOD_REPEAT: core.int,
-      SVG_SPREADMETHOD_UNKNOWN: core.int
-    })
-  });
-  svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
-  svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
-  svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
-  svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
-  dart.defineExtensionNames([
-    'x1',
-    'x2',
-    'y1',
-    'y2'
-  ]);
-  svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
-    }
-    created() {
-      this[dartx.x1] = null;
-      this[dartx.x2] = null;
-      this[dartx.y1] = null;
-      this[dartx.y2] = null;
-      super.created();
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-  };
-  dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
-  dart.setSignature(svg$.LinearGradientElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
-      new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
-      created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
-    }),
-    fields: () => ({
-      [dartx.x1]: svg$.AnimatedLength,
-      [dartx.x2]: svg$.AnimatedLength,
-      [dartx.y1]: svg$.AnimatedLength,
-      [dartx.y2]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
-  dart.defineExtensionNames([
-    'setOrientToAngle',
-    'setOrientToAuto',
-    'markerHeight',
-    'markerUnits',
-    'markerWidth',
-    'orientAngle',
-    'orientType',
-    'refX',
-    'refY',
-    'preserveAspectRatio',
-    'viewBox'
-  ]);
-  svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
-    }
-    created() {
-      this[dartx.markerHeight] = null;
-      this[dartx.markerUnits] = null;
-      this[dartx.markerWidth] = null;
-      this[dartx.orientAngle] = null;
-      this[dartx.orientType] = null;
-      this[dartx.refX] = null;
-      this[dartx.refY] = null;
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.viewBox] = null;
-      super.created();
-    }
-    get [dartx.markerHeight]() {
-      return this.markerHeight;
-    }
-    get [dartx.markerUnits]() {
-      return this.markerUnits;
-    }
-    get [dartx.markerWidth]() {
-      return this.markerWidth;
-    }
-    get [dartx.orientAngle]() {
-      return this.orientAngle;
-    }
-    get [dartx.orientType]() {
-      return this.orientType;
-    }
-    get [dartx.refX]() {
-      return this.refX;
-    }
-    get [dartx.refY]() {
-      return this.refY;
-    }
-    [dartx.setOrientToAngle](...args) {
-      return this.setOrientToAngle.apply(this, args);
-    }
-    [dartx.setOrientToAuto](...args) {
-      return this.setOrientToAuto.apply(this, args);
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-  };
-  dart.defineNamedConstructor(svg$.MarkerElement, 'created');
-  svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
-  dart.setSignature(svg$.MarkerElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.MarkerElement, []),
-      new: dart.definiteFunctionType(svg$.MarkerElement, []),
-      created: dart.definiteFunctionType(svg$.MarkerElement, [])
-    }),
-    fields: () => ({
-      [dartx.markerHeight]: svg$.AnimatedLength,
-      [dartx.markerUnits]: svg$.AnimatedEnumeration,
-      [dartx.markerWidth]: svg$.AnimatedLength,
-      [dartx.orientAngle]: svg$.AnimatedAngle,
-      [dartx.orientType]: svg$.AnimatedEnumeration,
-      [dartx.refX]: svg$.AnimatedLength,
-      [dartx.refY]: svg$.AnimatedLength,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect
-    }),
-    methods: () => ({
-      [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
-      [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
-    }),
-    sfields: () => ({
-      SVG_MARKERUNITS_STROKEWIDTH: core.int,
-      SVG_MARKERUNITS_UNKNOWN: core.int,
-      SVG_MARKERUNITS_USERSPACEONUSE: core.int,
-      SVG_MARKER_ORIENT_ANGLE: core.int,
-      SVG_MARKER_ORIENT_AUTO: core.int,
-      SVG_MARKER_ORIENT_UNKNOWN: core.int
-    })
-  });
-  svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
-  svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
-  svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
-  svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
-  svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
-  svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
-  dart.defineExtensionNames([
-    'hasExtension',
-    'height',
-    'maskContentUnits',
-    'maskUnits',
-    'width',
-    'x',
-    'y',
-    'requiredExtensions',
-    'requiredFeatures',
-    'systemLanguage'
-  ]);
-  svg$.MaskElement = class MaskElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.maskContentUnits] = null;
-      this[dartx.maskUnits] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.requiredExtensions] = null;
-      this[dartx.requiredFeatures] = null;
-      this[dartx.systemLanguage] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.maskContentUnits]() {
-      return this.maskContentUnits;
-    }
-    get [dartx.maskUnits]() {
-      return this.maskUnits;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.requiredExtensions]() {
-      return this.requiredExtensions;
-    }
-    get [dartx.requiredFeatures]() {
-      return this.requiredFeatures;
-    }
-    get [dartx.systemLanguage]() {
-      return this.systemLanguage;
-    }
-    [dartx.hasExtension](...args) {
-      return this.hasExtension.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.MaskElement, 'created');
-  svg$.MaskElement[dart.implements] = () => [svg$.Tests];
-  dart.setSignature(svg$.MaskElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.MaskElement, []),
-      new: dart.definiteFunctionType(svg$.MaskElement, []),
-      created: dart.definiteFunctionType(svg$.MaskElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
-      [dartx.maskUnits]: svg$.AnimatedEnumeration,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.requiredExtensions]: svg$.StringList,
-      [dartx.requiredFeatures]: svg$.StringList,
-      [dartx.systemLanguage]: svg$.StringList
-    }),
-    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
-  });
-  dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
-  dart.defineExtensionNames([
-    'flipX',
-    'flipY',
-    'inverse',
-    'multiply',
-    'rotate',
-    'rotateFromVector',
-    'scale',
-    'scaleNonUniform',
-    'skewX',
-    'skewY',
-    'translate',
-    'a',
-    'b',
-    'c',
-    'd',
-    'e',
-    'f'
-  ]);
-  svg$.Matrix = class Matrix extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.a]() {
-      return this.a;
-    }
-    set [dartx.a](value) {
-      this.a = value;
-    }
-    get [dartx.b]() {
-      return this.b;
-    }
-    set [dartx.b](value) {
-      this.b = value;
-    }
-    get [dartx.c]() {
-      return this.c;
-    }
-    set [dartx.c](value) {
-      this.c = value;
-    }
-    get [dartx.d]() {
-      return this.d;
-    }
-    set [dartx.d](value) {
-      this.d = value;
-    }
-    get [dartx.e]() {
-      return this.e;
-    }
-    set [dartx.e](value) {
-      this.e = value;
-    }
-    get [dartx.f]() {
-      return this.f;
-    }
-    set [dartx.f](value) {
-      this.f = value;
-    }
-    [dartx.flipX](...args) {
-      return this.flipX.apply(this, args);
-    }
-    [dartx.flipY](...args) {
-      return this.flipY.apply(this, args);
-    }
-    [dartx.inverse](...args) {
-      return this.inverse.apply(this, args);
-    }
-    [dartx.multiply](...args) {
-      return this.multiply.apply(this, args);
-    }
-    [dartx.rotate](...args) {
-      return this.rotate.apply(this, args);
-    }
-    [dartx.rotateFromVector](...args) {
-      return this.rotateFromVector.apply(this, args);
-    }
-    [dartx.scale](...args) {
-      return this.scale.apply(this, args);
-    }
-    [dartx.scaleNonUniform](...args) {
-      return this.scaleNonUniform.apply(this, args);
-    }
-    [dartx.skewX](...args) {
-      return this.skewX.apply(this, args);
-    }
-    [dartx.skewY](...args) {
-      return this.skewY.apply(this, args);
-    }
-    [dartx.translate](...args) {
-      return this.translate.apply(this, args);
-    }
-  };
-  dart.setSignature(svg$.Matrix, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
-    fields: () => ({
-      [dartx.a]: core.num,
-      [dartx.b]: core.num,
-      [dartx.c]: core.num,
-      [dartx.d]: core.num,
-      [dartx.e]: core.num,
-      [dartx.f]: core.num
-    }),
-    methods: () => ({
-      [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
-      [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
-      [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
-      [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
-      [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
-      [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
-      [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
-      [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
-    })
-  });
-  dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
-  svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.MetadataElement, 'created');
-  dart.setSignature(svg$.MetadataElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.MetadataElement, []),
-      created: dart.definiteFunctionType(svg$.MetadataElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
-  dart.defineExtensionNames([
-    'value'
-  ]);
-  svg$.Number = class Number extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-  };
-  dart.setSignature(svg$.Number, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
-    fields: () => ({[dartx.value]: core.num})
-  });
-  dart.registerExtension(dart.global.SVGNumber, svg$.Number);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'appendItem',
-    'clear',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'numberOfItems'
-  ]);
-  svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.getItem](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+      if (onBlocked != null) {
+        dart.dsend(dart.dload(request, 'onBlocked'), 'listen', onBlocked);
       }
-      dart.throw(new core.StateError("No elements"));
+      return indexed_db._completeRequest(indexed_db.Database)(indexed_db.Request._check(request));
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return FutureOfDatabase().error(e, stacktrace);
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
+
+  }
+  [dartx.deleteDatabase](name, opts) {
+    let onBlocked = opts && 'onBlocked' in opts ? opts.onBlocked : null;
+    try {
+      let request = this[_deleteDatabase](name);
+      if (onBlocked != null) {
+        request[dartx.onBlocked].listen(onBlocked);
       }
-      dart.throw(new core.StateError("No elements"));
+      let completer = CompleterOfIdbFactory().sync();
+      request[dartx.onSuccess].listen(dart.fn(e => {
+        completer.complete(this);
+      }, EventToNull()));
+      request[dartx.onError].listen(dart.bind(completer, 'completeError'));
+      return completer.future;
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return FutureOfIdbFactory().error(e, stacktrace);
     }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
+
+  }
+  [dartx.getDatabaseNames]() {
+    try {
+      let request = this[_webkitGetDatabaseNames]();
+      return indexed_db._completeRequest(ListOfString())(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return FutureOfListOfString().error(e, stacktrace);
+    }
+
+  }
+  get [dartx.supportsDatabaseNames]() {
+    return dart.test(indexed_db.IdbFactory.supported) && !!(this.getDatabaseNames || this.webkitGetDatabaseNames);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.cmp](...args) {
+    return this.cmp.apply(this, args);
+  }
+  [_deleteDatabase](...args) {
+    return this.deleteDatabase.apply(this, args);
+  }
+  [_open](...args) {
+    return this.open.apply(this, args);
+  }
+  [_webkitGetDatabaseNames](...args) {
+    return this.webkitGetDatabaseNames.apply(this, args);
+  }
+};
+dart.setSignature(indexed_db.IdbFactory, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.IdbFactory, [])}),
+  getters: () => ({[dartx.supportsDatabaseNames]: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({
+    [dartx.open]: dart.definiteFunctionType(async.Future$(indexed_db.Database), [core.String], {version: core.int, onUpgradeNeeded: dynamicTovoid(), onBlocked: dynamicTovoid()}),
+    [dartx.deleteDatabase]: dart.definiteFunctionType(async.Future$(indexed_db.IdbFactory), [core.String], {onBlocked: EventTovoid()}),
+    [dartx.getDatabaseNames]: dart.definiteFunctionType(async.Future$(core.List$(core.String)), []),
+    [dartx.cmp]: dart.definiteFunctionType(core.int, [core.Object, core.Object]),
+    [_deleteDatabase]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String]),
+    [_open]: dart.definiteFunctionType(indexed_db.OpenDBRequest, [core.String], [core.int]),
+    [_webkitGetDatabaseNames]: dart.definiteFunctionType(indexed_db.Request, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.IDBFactory, indexed_db.IdbFactory);
+indexed_db._completeRequest = function(T) {
+  return request => {
+    let completer = async.Completer$(T).sync();
+    request[dartx.onSuccess].listen(dart.fn(e => {
+      let result = indexed_db._cast(T)(request[dartx.result]);
+      completer.complete(result);
+    }, EventToNull()));
+    request[dartx.onError].listen(dart.bind(completer, 'completeError'));
+    return completer.future;
+  };
+};
+dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
+const _count$0 = Symbol('_count');
+const _get$ = Symbol('_get');
+const _getKey$ = Symbol('_getKey');
+const _openCursor = Symbol('_openCursor');
+const _openKeyCursor = Symbol('_openKeyCursor');
+dart.defineExtensionNames([
+  'count',
+  'get',
+  'getKey',
+  'openCursor',
+  'openKeyCursor',
+  'getAll',
+  'getAllKeys',
+  'keyPath',
+  'multiEntry',
+  'name',
+  'objectStore',
+  'unique'
+]);
+indexed_db.Index = class Index extends _interceptors.Interceptor {
+  [dartx.count](key_OR_range) {
+    if (key_OR_range === void 0) key_OR_range = null;
+    try {
+      let request = this[_count$0](key_OR_range);
+      return indexed_db._completeRequest(core.int)(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return FutureOfint().error(e, stacktrace);
+    }
+
+  }
+  [dartx.get](key) {
+    try {
+      let request = this[_get$](key);
+      return indexed_db._completeRequest(dart.dynamic)(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.getKey](key) {
+    try {
+      let request = this[_getKey$](key);
+      return indexed_db._completeRequest(dart.dynamic)(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.openCursor](opts) {
+    let key = opts && 'key' in opts ? opts.key : null;
+    let range = opts && 'range' in opts ? opts.range : null;
+    let direction = opts && 'direction' in opts ? opts.direction : null;
+    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
+    let key_OR_range = null;
+    if (key != null) {
+      if (range != null) {
+        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
       }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
+      key_OR_range = key;
+    } else {
+      key_OR_range = range;
     }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
+    let request = null;
+    if (direction == null) {
+      request = this[_openCursor](key_OR_range, "next");
+    } else {
+      request = this[_openCursor](key_OR_range, direction);
     }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
-  };
-  svg$.NumberList[dart.implements] = () => [ListOfNumber()];
-  dart.setSignature(svg$.NumberList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
-    fields: () => ({[dartx.numberOfItems]: core.int}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
-      [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
-      [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
-  dart.defineExtensionNames([
-    'createSvgPathSegArcAbs',
-    'createSvgPathSegArcRel',
-    'createSvgPathSegClosePath',
-    'createSvgPathSegCurvetoCubicAbs',
-    'createSvgPathSegCurvetoCubicRel',
-    'createSvgPathSegCurvetoCubicSmoothAbs',
-    'createSvgPathSegCurvetoCubicSmoothRel',
-    'createSvgPathSegCurvetoQuadraticAbs',
-    'createSvgPathSegCurvetoQuadraticRel',
-    'createSvgPathSegCurvetoQuadraticSmoothAbs',
-    'createSvgPathSegCurvetoQuadraticSmoothRel',
-    'createSvgPathSegLinetoAbs',
-    'createSvgPathSegLinetoHorizontalAbs',
-    'createSvgPathSegLinetoHorizontalRel',
-    'createSvgPathSegLinetoRel',
-    'createSvgPathSegLinetoVerticalAbs',
-    'createSvgPathSegLinetoVerticalRel',
-    'createSvgPathSegMovetoAbs',
-    'createSvgPathSegMovetoRel',
-    'getPathSegAtLength',
-    'getPointAtLength',
-    'getTotalLength',
-    'animatedNormalizedPathSegList',
-    'animatedPathSegList',
-    'normalizedPathSegList',
-    'pathLength',
-    'pathSegList'
-  ]);
-  svg$.PathElement = class PathElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
-    }
-    created() {
-      this[dartx.animatedNormalizedPathSegList] = null;
-      this[dartx.animatedPathSegList] = null;
-      this[dartx.normalizedPathSegList] = null;
-      this[dartx.pathLength] = null;
-      this[dartx.pathSegList] = null;
-      super.created();
-    }
-    get [dartx.animatedNormalizedPathSegList]() {
-      return this.animatedNormalizedPathSegList;
-    }
-    get [dartx.animatedPathSegList]() {
-      return this.animatedPathSegList;
-    }
-    get [dartx.normalizedPathSegList]() {
-      return this.normalizedPathSegList;
-    }
-    get [dartx.pathLength]() {
-      return this.pathLength;
-    }
-    get [dartx.pathSegList]() {
-      return this.pathSegList;
-    }
-    [dartx.createSvgPathSegArcAbs](...args) {
-      return this.createSVGPathSegArcAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegArcRel](...args) {
-      return this.createSVGPathSegArcRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegClosePath](...args) {
-      return this.createSVGPathSegClosePath.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoCubicAbs](...args) {
-      return this.createSVGPathSegCurvetoCubicAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoCubicRel](...args) {
-      return this.createSVGPathSegCurvetoCubicRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoCubicSmoothAbs](...args) {
-      return this.createSVGPathSegCurvetoCubicSmoothAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoCubicSmoothRel](...args) {
-      return this.createSVGPathSegCurvetoCubicSmoothRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoQuadraticAbs](...args) {
-      return this.createSVGPathSegCurvetoQuadraticAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoQuadraticRel](...args) {
-      return this.createSVGPathSegCurvetoQuadraticRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs](...args) {
-      return this.createSVGPathSegCurvetoQuadraticSmoothAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel](...args) {
-      return this.createSVGPathSegCurvetoQuadraticSmoothRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoAbs](...args) {
-      return this.createSVGPathSegLinetoAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoHorizontalAbs](...args) {
-      return this.createSVGPathSegLinetoHorizontalAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoHorizontalRel](...args) {
-      return this.createSVGPathSegLinetoHorizontalRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoRel](...args) {
-      return this.createSVGPathSegLinetoRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoVerticalAbs](...args) {
-      return this.createSVGPathSegLinetoVerticalAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegLinetoVerticalRel](...args) {
-      return this.createSVGPathSegLinetoVerticalRel.apply(this, args);
-    }
-    [dartx.createSvgPathSegMovetoAbs](...args) {
-      return this.createSVGPathSegMovetoAbs.apply(this, args);
-    }
-    [dartx.createSvgPathSegMovetoRel](...args) {
-      return this.createSVGPathSegMovetoRel.apply(this, args);
-    }
-    [dartx.getPathSegAtLength](...args) {
-      return this.getPathSegAtLength.apply(this, args);
-    }
-    [dartx.getPointAtLength](...args) {
-      return this.getPointAtLength.apply(this, args);
-    }
-    [dartx.getTotalLength](...args) {
-      return this.getTotalLength.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.PathElement, 'created');
-  dart.setSignature(svg$.PathElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.PathElement, []),
-      new: dart.definiteFunctionType(svg$.PathElement, []),
-      created: dart.definiteFunctionType(svg$.PathElement, [])
-    }),
-    fields: () => ({
-      [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
-      [dartx.animatedPathSegList]: svg$.PathSegList,
-      [dartx.normalizedPathSegList]: svg$.PathSegList,
-      [dartx.pathLength]: svg$.AnimatedNumber,
-      [dartx.pathSegList]: svg$.PathSegList
-    }),
-    methods: () => ({
-      [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
-      [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
-      [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
-      [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
-      [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
-      [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
-      [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
-      [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
-      [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
-      [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
-      [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
-      [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
-      [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
-      [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
-      [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
-      [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
-  dart.defineExtensionNames([
-    'pathSegType',
-    'pathSegTypeAsLetter'
-  ]);
-  svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.pathSegType]() {
-      return this.pathSegType;
-    }
-    get [dartx.pathSegTypeAsLetter]() {
-      return this.pathSegTypeAsLetter;
-    }
-  };
-  dart.setSignature(svg$.PathSeg, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
-    fields: () => ({
-      [dartx.pathSegType]: core.int,
-      [dartx.pathSegTypeAsLetter]: core.String
-    }),
-    sfields: () => ({
-      PATHSEG_ARC_ABS: core.int,
-      PATHSEG_ARC_REL: core.int,
-      PATHSEG_CLOSEPATH: core.int,
-      PATHSEG_CURVETO_CUBIC_ABS: core.int,
-      PATHSEG_CURVETO_CUBIC_REL: core.int,
-      PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: core.int,
-      PATHSEG_CURVETO_CUBIC_SMOOTH_REL: core.int,
-      PATHSEG_CURVETO_QUADRATIC_ABS: core.int,
-      PATHSEG_CURVETO_QUADRATIC_REL: core.int,
-      PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: core.int,
-      PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: core.int,
-      PATHSEG_LINETO_ABS: core.int,
-      PATHSEG_LINETO_HORIZONTAL_ABS: core.int,
-      PATHSEG_LINETO_HORIZONTAL_REL: core.int,
-      PATHSEG_LINETO_REL: core.int,
-      PATHSEG_LINETO_VERTICAL_ABS: core.int,
-      PATHSEG_LINETO_VERTICAL_REL: core.int,
-      PATHSEG_MOVETO_ABS: core.int,
-      PATHSEG_MOVETO_REL: core.int,
-      PATHSEG_UNKNOWN: core.int
-    })
-  });
-  svg$.PathSeg.PATHSEG_ARC_ABS = 10;
-  svg$.PathSeg.PATHSEG_ARC_REL = 11;
-  svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
-  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
-  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
-  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
-  svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
-  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
-  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
-  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
-  svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
-  svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
-  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
-  svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
-  svg$.PathSeg.PATHSEG_LINETO_REL = 5;
-  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
-  svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
-  svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
-  svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
-  svg$.PathSeg.PATHSEG_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
-  dart.defineExtensionNames([
-    'angle',
-    'largeArcFlag',
-    'r1',
-    'r2',
-    'sweepFlag',
-    'x',
-    'y'
-  ]);
-  svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.angle]() {
-      return this.angle;
-    }
-    set [dartx.angle](value) {
-      this.angle = value;
-    }
-    get [dartx.largeArcFlag]() {
-      return this.largeArcFlag;
-    }
-    set [dartx.largeArcFlag](value) {
-      this.largeArcFlag = value;
-    }
-    get [dartx.r1]() {
-      return this.r1;
-    }
-    set [dartx.r1](value) {
-      this.r1 = value;
-    }
-    get [dartx.r2]() {
-      return this.r2;
-    }
-    set [dartx.r2](value) {
-      this.r2 = value;
-    }
-    get [dartx.sweepFlag]() {
-      return this.sweepFlag;
-    }
-    set [dartx.sweepFlag](value) {
-      this.sweepFlag = value;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegArcAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
-    fields: () => ({
-      [dartx.angle]: core.num,
-      [dartx.largeArcFlag]: core.bool,
-      [dartx.r1]: core.num,
-      [dartx.r2]: core.num,
-      [dartx.sweepFlag]: core.bool,
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
-  dart.defineExtensionNames([
-    'angle',
-    'largeArcFlag',
-    'r1',
-    'r2',
-    'sweepFlag',
-    'x',
-    'y'
-  ]);
-  svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.angle]() {
-      return this.angle;
-    }
-    set [dartx.angle](value) {
-      this.angle = value;
-    }
-    get [dartx.largeArcFlag]() {
-      return this.largeArcFlag;
-    }
-    set [dartx.largeArcFlag](value) {
-      this.largeArcFlag = value;
-    }
-    get [dartx.r1]() {
-      return this.r1;
-    }
-    set [dartx.r1](value) {
-      this.r1 = value;
-    }
-    get [dartx.r2]() {
-      return this.r2;
-    }
-    set [dartx.r2](value) {
-      this.r2 = value;
-    }
-    get [dartx.sweepFlag]() {
-      return this.sweepFlag;
-    }
-    set [dartx.sweepFlag](value) {
-      this.sweepFlag = value;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegArcRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
-    fields: () => ({
-      [dartx.angle]: core.num,
-      [dartx.largeArcFlag]: core.bool,
-      [dartx.r1]: core.num,
-      [dartx.r2]: core.num,
-      [dartx.sweepFlag]: core.bool,
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
-  svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(svg$.PathSegClosePath, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
-  });
-  dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
-  dart.defineExtensionNames([
-    'x',
-    'x1',
-    'x2',
-    'y',
-    'y1',
-    'y2'
-  ]);
-  svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    set [dartx.x1](value) {
-      this.x1 = value;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    set [dartx.x2](value) {
-      this.x2 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    set [dartx.y1](value) {
-      this.y1 = value;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-    set [dartx.y2](value) {
-      this.y2 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x1]: core.num,
-      [dartx.x2]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y1]: core.num,
-      [dartx.y2]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
-  dart.defineExtensionNames([
-    'x',
-    'x1',
-    'x2',
-    'y',
-    'y1',
-    'y2'
-  ]);
-  svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    set [dartx.x1](value) {
-      this.x1 = value;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    set [dartx.x2](value) {
-      this.x2 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    set [dartx.y1](value) {
-      this.y1 = value;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-    set [dartx.y2](value) {
-      this.y2 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoCubicRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x1]: core.num,
-      [dartx.x2]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y1]: core.num,
-      [dartx.y2]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
-  dart.defineExtensionNames([
-    'x',
-    'x2',
-    'y',
-    'y2'
-  ]);
-  svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    set [dartx.x2](value) {
-      this.x2 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-    set [dartx.y2](value) {
-      this.y2 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x2]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y2]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
-  dart.defineExtensionNames([
-    'x',
-    'x2',
-    'y',
-    'y2'
-  ]);
-  svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x2]() {
-      return this.x2;
-    }
-    set [dartx.x2](value) {
-      this.x2 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y2]() {
-      return this.y2;
-    }
-    set [dartx.y2](value) {
-      this.y2 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x2]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y2]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
-  dart.defineExtensionNames([
-    'x',
-    'x1',
-    'y',
-    'y1'
-  ]);
-  svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    set [dartx.x1](value) {
-      this.x1 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    set [dartx.y1](value) {
-      this.y1 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x1]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y1]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
-  dart.defineExtensionNames([
-    'x',
-    'x1',
-    'y',
-    'y1'
-  ]);
-  svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.x1]() {
-      return this.x1;
-    }
-    set [dartx.x1](value) {
-      this.x1 = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    get [dartx.y1]() {
-      return this.y1;
-    }
-    set [dartx.y1](value) {
-      this.y1 = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.x1]: core.num,
-      [dartx.y]: core.num,
-      [dartx.y1]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
-  dart.defineExtensionNames([
-    'x'
-  ]);
-  svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
-    fields: () => ({[dartx.x]: core.num})
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
-  dart.defineExtensionNames([
-    'x'
-  ]);
-  svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
-    fields: () => ({[dartx.x]: core.num})
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
-  dart.defineExtensionNames([
-    'y'
-  ]);
-  svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
-    fields: () => ({[dartx.y]: core.num})
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
-  dart.defineExtensionNames([
-    'y'
-  ]);
-  svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegLinetoVerticalRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
-    fields: () => ({[dartx.y]: core.num})
-  });
-  dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'appendItem',
-    'clear',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'numberOfItems'
-  ]);
-  svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.getItem](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
+  }
+  [dartx.openKeyCursor](opts) {
+    let key = opts && 'key' in opts ? opts.key : null;
+    let range = opts && 'range' in opts ? opts.range : null;
+    let direction = opts && 'direction' in opts ? opts.direction : null;
+    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
+    let key_OR_range = null;
+    if (key != null) {
+      if (range != null) {
+        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
       }
-      dart.throw(new core.StateError("No elements"));
+      key_OR_range = key;
+    } else {
+      key_OR_range = range;
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
+    let request = null;
+    if (direction == null) {
+      request = this[_openKeyCursor](key_OR_range, "next");
+    } else {
+      request = this[_openKeyCursor](key_OR_range, direction);
+    }
+    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.Cursor)(indexed_db.Request._check(request), autoAdvance);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.keyPath]() {
+    return this.keyPath;
+  }
+  get [dartx.multiEntry]() {
+    return this.multiEntry;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.objectStore]() {
+    return this.objectStore;
+  }
+  get [dartx.unique]() {
+    return this.unique;
+  }
+  [_count$0](...args) {
+    return this.count.apply(this, args);
+  }
+  [_get$](...args) {
+    return this.get.apply(this, args);
+  }
+  [dartx.getAll](...args) {
+    return this.getAll.apply(this, args);
+  }
+  [dartx.getAllKeys](...args) {
+    return this.getAllKeys.apply(this, args);
+  }
+  [_getKey$](...args) {
+    return this.getKey.apply(this, args);
+  }
+  [_openCursor](...args) {
+    return this.openCursor.apply(this, args);
+  }
+  [_openKeyCursor](...args) {
+    return this.openKeyCursor.apply(this, args);
+  }
+};
+dart.setSignature(indexed_db.Index, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Index, [])}),
+  fields: () => ({
+    [dartx.keyPath]: core.Object,
+    [dartx.multiEntry]: core.bool,
+    [dartx.name]: core.String,
+    [dartx.objectStore]: indexed_db.ObjectStore,
+    [dartx.unique]: core.bool
+  }),
+  methods: () => ({
+    [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
+    [dartx.get]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
+    [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
+    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
+    [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
+    [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
+    [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
+  })
+});
+dart.registerExtension(dart.global.IDBIndex, indexed_db.Index);
+dart.defineExtensionNames([
+  'lower',
+  'lowerOpen',
+  'upper',
+  'upperOpen'
+]);
+indexed_db.KeyRange = class KeyRange extends _interceptors.Interceptor {
+  static only(value) {
+    return indexed_db._KeyRangeFactoryProvider.createKeyRange_only(value);
+  }
+  static lowerBound(bound, open) {
+    if (open === void 0) open = false;
+    return indexed_db._KeyRangeFactoryProvider.createKeyRange_lowerBound(bound, open);
+  }
+  static upperBound(bound, open) {
+    if (open === void 0) open = false;
+    return indexed_db._KeyRangeFactoryProvider.createKeyRange_upperBound(bound, open);
+  }
+  static bound(lower, upper, lowerOpen, upperOpen) {
+    if (lowerOpen === void 0) lowerOpen = false;
+    if (upperOpen === void 0) upperOpen = false;
+    return indexed_db._KeyRangeFactoryProvider.createKeyRange_bound(lower, upper, lowerOpen, upperOpen);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.lower]() {
+    return this.lower;
+  }
+  get [dartx.lowerOpen]() {
+    return this.lowerOpen;
+  }
+  get [dartx.upper]() {
+    return this.upper;
+  }
+  get [dartx.upperOpen]() {
+    return this.upperOpen;
+  }
+};
+dart.setSignature(indexed_db.KeyRange, {
+  constructors: () => ({
+    only: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic]),
+    lowerBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
+    upperBound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic], [core.bool]),
+    bound: dart.definiteFunctionType(indexed_db.KeyRange, [dart.dynamic, dart.dynamic], [core.bool, core.bool]),
+    _: dart.definiteFunctionType(indexed_db.KeyRange, [])
+  }),
+  fields: () => ({
+    [dartx.lower]: core.Object,
+    [dartx.lowerOpen]: core.bool,
+    [dartx.upper]: core.Object,
+    [dartx.upperOpen]: core.bool
+  }),
+  statics: () => ({
+    bound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object, core.Object], [core.bool, core.bool]),
+    lowerBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool]),
+    only_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object]),
+    upperBound_: dart.definiteFunctionType(indexed_db.KeyRange, [core.Object], [core.bool])
+  }),
+  names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
+});
+dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
+const _add$3 = Symbol('_add');
+const _clear$0 = Symbol('_clear');
+const _put = Symbol('_put');
+const _createIndex = Symbol('_createIndex');
+const _add_1 = Symbol('_add_1');
+const _add_2 = Symbol('_add_2');
+const _createIndex_1 = Symbol('_createIndex_1');
+const _createIndex_2 = Symbol('_createIndex_2');
+const _put_1 = Symbol('_put_1');
+const _put_2 = Symbol('_put_2');
+dart.defineExtensionNames([
+  'add',
+  'clear',
+  'delete',
+  'count',
+  'put',
+  'getObject',
+  'openCursor',
+  'createIndex',
+  'deleteIndex',
+  'getAll',
+  'getAllKeys',
+  'index',
+  'openKeyCursor',
+  'autoIncrement',
+  'indexNames',
+  'keyPath',
+  'name',
+  'transaction'
+]);
+indexed_db.ObjectStore = class ObjectStore extends _interceptors.Interceptor {
+  [dartx.add](value, key) {
+    if (key === void 0) key = null;
+    try {
+      let request = null;
+      if (key != null) {
+        request = this[_add$3](value, key);
+      } else {
+        request = this[_add$3](value);
       }
-      dart.throw(new core.StateError("No elements"));
+      return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
     }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
+
+  }
+  [dartx.clear]() {
+    try {
+      return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.delete](key_OR_keyRange) {
+    try {
+      return indexed_db._completeRequest(dart.dynamic)(this[_delete$](key_OR_keyRange));
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
+    }
+
+  }
+  [dartx.count](key_OR_range) {
+    if (key_OR_range === void 0) key_OR_range = null;
+    try {
+      let request = this[_count$0](key_OR_range);
+      return indexed_db._completeRequest(core.int)(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return FutureOfint().error(e, stacktrace);
+    }
+
+  }
+  [dartx.put](value, key) {
+    if (key === void 0) key = null;
+    try {
+      let request = null;
+      if (key != null) {
+        request = this[_put](value, key);
+      } else {
+        request = this[_put](value);
       }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
+      return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
     }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
+
+  }
+  [dartx.getObject](key) {
+    try {
+      let request = this[_get$](key);
+      return indexed_db._completeRequest(dart.dynamic)(request);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      return async.Future.error(e, stacktrace);
     }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
-  };
-  svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
-  dart.setSignature(svg$.PathSegList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
-    fields: () => ({[dartx.numberOfItems]: core.int}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
-      [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
-      [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegMovetoAbs, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
-  dart.defineExtensionNames([
-    'x',
-    'y'
-  ]);
-  svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.PathSegMovetoRel, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
-  dart.defineExtensionNames([
-    'hasExtension',
-    'height',
-    'patternContentUnits',
-    'patternTransform',
-    'patternUnits',
-    'width',
-    'x',
-    'y',
-    'preserveAspectRatio',
-    'viewBox',
-    'requiredExtensions',
-    'requiredFeatures',
-    'systemLanguage',
-    'href'
-  ]);
-  svg$.PatternElement = class PatternElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.patternContentUnits] = null;
-      this[dartx.patternTransform] = null;
-      this[dartx.patternUnits] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.viewBox] = null;
-      this[dartx.requiredExtensions] = null;
-      this[dartx.requiredFeatures] = null;
-      this[dartx.systemLanguage] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.patternContentUnits]() {
-      return this.patternContentUnits;
-    }
-    get [dartx.patternTransform]() {
-      return this.patternTransform;
-    }
-    get [dartx.patternUnits]() {
-      return this.patternUnits;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-    get [dartx.requiredExtensions]() {
-      return this.requiredExtensions;
-    }
-    get [dartx.requiredFeatures]() {
-      return this.requiredFeatures;
-    }
-    get [dartx.systemLanguage]() {
-      return this.systemLanguage;
-    }
-    [dartx.hasExtension](...args) {
-      return this.hasExtension.apply(this, args);
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.PatternElement, 'created');
-  svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
-  dart.setSignature(svg$.PatternElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.PatternElement, []),
-      new: dart.definiteFunctionType(svg$.PatternElement, []),
-      created: dart.definiteFunctionType(svg$.PatternElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
-      [dartx.patternTransform]: svg$.AnimatedTransformList,
-      [dartx.patternUnits]: svg$.AnimatedEnumeration,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect,
-      [dartx.requiredExtensions]: svg$.StringList,
-      [dartx.requiredFeatures]: svg$.StringList,
-      [dartx.systemLanguage]: svg$.StringList,
-      [dartx.href]: svg$.AnimatedString
-    }),
-    methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
-  });
-  dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
-  dart.defineExtensionNames([
-    'matrixTransform',
-    'x',
-    'y'
-  ]);
-  svg$.Point = class Point extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-    [dartx.matrixTransform](...args) {
-      return this.matrixTransform.apply(this, args);
-    }
-  };
-  dart.setSignature(svg$.Point, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
-    fields: () => ({
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    }),
-    methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
-  });
-  dart.registerExtension(dart.global.SVGPoint, svg$.Point);
-  dart.defineExtensionNames([
-    'appendItem',
-    'clear',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'length',
-    'numberOfItems'
-  ]);
-  svg$.PointList = class PointList extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
-  };
-  dart.setSignature(svg$.PointList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
-    fields: () => ({
-      [dartx.length]: core.int,
-      [dartx.numberOfItems]: core.int
-    }),
-    methods: () => ({
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
-      [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
-      [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
-  dart.defineExtensionNames([
-    'animatedPoints',
-    'points'
-  ]);
-  svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
-    }
-    created() {
-      this[dartx.animatedPoints] = null;
-      this[dartx.points] = null;
-      super.created();
-    }
-    get [dartx.animatedPoints]() {
-      return this.animatedPoints;
-    }
-    get [dartx.points]() {
-      return this.points;
-    }
-  };
-  dart.defineNamedConstructor(svg$.PolygonElement, 'created');
-  dart.setSignature(svg$.PolygonElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.PolygonElement, []),
-      new: dart.definiteFunctionType(svg$.PolygonElement, []),
-      created: dart.definiteFunctionType(svg$.PolygonElement, [])
-    }),
-    fields: () => ({
-      [dartx.animatedPoints]: svg$.PointList,
-      [dartx.points]: svg$.PointList
-    })
-  });
-  dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
-  dart.defineExtensionNames([
-    'animatedPoints',
-    'points'
-  ]);
-  svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
-    }
-    created() {
-      this[dartx.animatedPoints] = null;
-      this[dartx.points] = null;
-      super.created();
-    }
-    get [dartx.animatedPoints]() {
-      return this.animatedPoints;
-    }
-    get [dartx.points]() {
-      return this.points;
-    }
-  };
-  dart.defineNamedConstructor(svg$.PolylineElement, 'created');
-  dart.setSignature(svg$.PolylineElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.PolylineElement, []),
-      new: dart.definiteFunctionType(svg$.PolylineElement, []),
-      created: dart.definiteFunctionType(svg$.PolylineElement, [])
-    }),
-    fields: () => ({
-      [dartx.animatedPoints]: svg$.PointList,
-      [dartx.points]: svg$.PointList
-    })
-  });
-  dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
-  dart.defineExtensionNames([
-    'align',
-    'meetOrSlice'
-  ]);
-  svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.align]() {
-      return this.align;
-    }
-    set [dartx.align](value) {
-      this.align = value;
-    }
-    get [dartx.meetOrSlice]() {
-      return this.meetOrSlice;
-    }
-    set [dartx.meetOrSlice](value) {
-      this.meetOrSlice = value;
-    }
-  };
-  dart.setSignature(svg$.PreserveAspectRatio, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
-    fields: () => ({
-      [dartx.align]: core.int,
-      [dartx.meetOrSlice]: core.int
-    }),
-    sfields: () => ({
-      SVG_MEETORSLICE_MEET: core.int,
-      SVG_MEETORSLICE_SLICE: core.int,
-      SVG_MEETORSLICE_UNKNOWN: core.int,
-      SVG_PRESERVEASPECTRATIO_NONE: core.int,
-      SVG_PRESERVEASPECTRATIO_UNKNOWN: core.int,
-      SVG_PRESERVEASPECTRATIO_XMAXYMAX: core.int,
-      SVG_PRESERVEASPECTRATIO_XMAXYMID: core.int,
-      SVG_PRESERVEASPECTRATIO_XMAXYMIN: core.int,
-      SVG_PRESERVEASPECTRATIO_XMIDYMAX: core.int,
-      SVG_PRESERVEASPECTRATIO_XMIDYMID: core.int,
-      SVG_PRESERVEASPECTRATIO_XMIDYMIN: core.int,
-      SVG_PRESERVEASPECTRATIO_XMINYMAX: core.int,
-      SVG_PRESERVEASPECTRATIO_XMINYMID: core.int,
-      SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
-    })
-  });
-  svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
-  svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
-  svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
-  svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
-  dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
-  dart.defineExtensionNames([
-    'cx',
-    'cy',
-    'fr',
-    'fx',
-    'fy',
-    'r'
-  ]);
-  svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
-    }
-    created() {
-      this[dartx.cx] = null;
-      this[dartx.cy] = null;
-      this[dartx.fr] = null;
-      this[dartx.fx] = null;
-      this[dartx.fy] = null;
-      this[dartx.r] = null;
-      super.created();
-    }
-    get [dartx.cx]() {
-      return this.cx;
-    }
-    get [dartx.cy]() {
-      return this.cy;
-    }
-    get [dartx.fr]() {
-      return this.fr;
-    }
-    get [dartx.fx]() {
-      return this.fx;
-    }
-    get [dartx.fy]() {
-      return this.fy;
-    }
-    get [dartx.r]() {
-      return this.r;
-    }
-  };
-  dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
-  dart.setSignature(svg$.RadialGradientElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
-      new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
-      created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
-    }),
-    fields: () => ({
-      [dartx.cx]: svg$.AnimatedLength,
-      [dartx.cy]: svg$.AnimatedLength,
-      [dartx.fr]: svg$.AnimatedLength,
-      [dartx.fx]: svg$.AnimatedLength,
-      [dartx.fy]: svg$.AnimatedLength,
-      [dartx.r]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
-  dart.defineExtensionNames([
-    'height',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.Rect = class Rect extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    set [dartx.height](value) {
-      this.height = value;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    set [dartx.width](value) {
-      this.width = value;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    set [dartx.x](value) {
-      this.x = value;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    set [dartx.y](value) {
-      this.y = value;
-    }
-  };
-  dart.setSignature(svg$.Rect, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
-    fields: () => ({
-      [dartx.height]: core.num,
-      [dartx.width]: core.num,
-      [dartx.x]: core.num,
-      [dartx.y]: core.num
-    })
-  });
-  dart.registerExtension(dart.global.SVGRect, svg$.Rect);
-  dart.defineExtensionNames([
-    'height',
-    'rx',
-    'ry',
-    'width',
-    'x',
-    'y'
-  ]);
-  svg$.RectElement = class RectElement extends svg$.GeometryElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.rx] = null;
-      this[dartx.ry] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.rx]() {
-      return this.rx;
-    }
-    get [dartx.ry]() {
-      return this.ry;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.RectElement, 'created');
-  dart.setSignature(svg$.RectElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.RectElement, []),
-      new: dart.definiteFunctionType(svg$.RectElement, []),
-      created: dart.definiteFunctionType(svg$.RectElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.rx]: svg$.AnimatedLength,
-      [dartx.ry]: svg$.AnimatedLength,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength
-    })
-  });
-  dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
-  dart.defineExtensionNames([
-    'type',
-    'href'
-  ]);
-  svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
-    }
-    created() {
-      this[dartx.type] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.ScriptElement, 'created');
-  svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.ScriptElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.ScriptElement, []),
-      new: dart.definiteFunctionType(svg$.ScriptElement, []),
-      created: dart.definiteFunctionType(svg$.ScriptElement, [])
-    }),
-    fields: () => ({
-      [dartx.type]: core.String,
-      [dartx.href]: svg$.AnimatedString
-    })
-  });
-  dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
-  svg$.SetElement = class SetElement extends svg$.AnimationElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
-    }
-  };
-  dart.defineNamedConstructor(svg$.SetElement, 'created');
-  dart.setSignature(svg$.SetElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.SetElement, []),
-      new: dart.definiteFunctionType(svg$.SetElement, []),
-      created: dart.definiteFunctionType(svg$.SetElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
-  dart.defineExtensionNames([
-    'gradientOffset'
-  ]);
-  svg$.StopElement = class StopElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
-    }
-    created() {
-      this[dartx.gradientOffset] = null;
-      super.created();
-    }
-    get [dartx.gradientOffset]() {
-      return this.offset;
-    }
-  };
-  dart.defineNamedConstructor(svg$.StopElement, 'created');
-  dart.setSignature(svg$.StopElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.StopElement, []),
-      new: dart.definiteFunctionType(svg$.StopElement, []),
-      created: dart.definiteFunctionType(svg$.StopElement, [])
-    }),
-    fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
-  });
-  dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'appendItem',
-    'clear',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'numberOfItems'
-  ]);
-  svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.getItem](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+
+  }
+  [dartx.openCursor](opts) {
+    let key = opts && 'key' in opts ? opts.key : null;
+    let range = opts && 'range' in opts ? opts.range : null;
+    let direction = opts && 'direction' in opts ? opts.direction : null;
+    let autoAdvance = opts && 'autoAdvance' in opts ? opts.autoAdvance : null;
+    let key_OR_range = null;
+    if (key != null) {
+      if (range != null) {
+        dart.throw(new core.ArgumentError('Cannot specify both key and range.'));
       }
-      dart.throw(new core.StateError("No elements"));
+      key_OR_range = key;
+    } else {
+      key_OR_range = range;
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
+    let request = null;
+    if (direction == null) {
+      request = this[_openCursor](key_OR_range);
+    } else {
+      request = this[_openCursor](key_OR_range, direction);
     }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
+    return indexed_db.ObjectStore._cursorStreamFromResult(indexed_db.CursorWithValue)(indexed_db.Request._check(request), autoAdvance);
+  }
+  [dartx.createIndex](name, keyPath, opts) {
+    let unique = opts && 'unique' in opts ? opts.unique : null;
+    let multiEntry = opts && 'multiEntry' in opts ? opts.multiEntry : null;
+    let options = dart.map();
+    if (unique != null) {
+      options[dartx._set]('unique', unique);
     }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
+    if (multiEntry != null) {
+      options[dartx._set]('multiEntry', multiEntry);
     }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
+    return this[_createIndex](name, keyPath, options);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.autoIncrement]() {
+    return this.autoIncrement;
+  }
+  get [dartx.indexNames]() {
+    return this.indexNames;
+  }
+  get [dartx.keyPath]() {
+    return this.keyPath;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.transaction]() {
+    return this.transaction;
+  }
+  [_add$3](value, key) {
+    if (key === void 0) key = null;
+    if (key != null) {
+      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
+      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
+      return this[_add_1](value_1, key_2);
     }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
+    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
+    return this[_add_2](value_1);
+  }
+  [_add_1](...args) {
+    return this.add.apply(this, args);
+  }
+  [_add_2](...args) {
+    return this.add.apply(this, args);
+  }
+  [_clear$0](...args) {
+    return this.clear.apply(this, args);
+  }
+  [_count$0](...args) {
+    return this.count.apply(this, args);
+  }
+  [_createIndex](name, keyPath, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_createIndex_1](name, keyPath, options_1);
     }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
+    return this[_createIndex_2](name, keyPath);
+  }
+  [_createIndex_1](...args) {
+    return this.createIndex.apply(this, args);
+  }
+  [_createIndex_2](...args) {
+    return this.createIndex.apply(this, args);
+  }
+  [_delete$](...args) {
+    return this.delete.apply(this, args);
+  }
+  [dartx.deleteIndex](...args) {
+    return this.deleteIndex.apply(this, args);
+  }
+  [_get$](...args) {
+    return this.get.apply(this, args);
+  }
+  [dartx.getAll](...args) {
+    return this.getAll.apply(this, args);
+  }
+  [dartx.getAllKeys](...args) {
+    return this.getAllKeys.apply(this, args);
+  }
+  [dartx.index](...args) {
+    return this.index.apply(this, args);
+  }
+  [_openCursor](...args) {
+    return this.openCursor.apply(this, args);
+  }
+  [dartx.openKeyCursor](...args) {
+    return this.openKeyCursor.apply(this, args);
+  }
+  [_put](value, key) {
+    if (key === void 0) key = null;
+    if (key != null) {
+      let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
+      let key_2 = html_common.convertDartToNative_SerializedScriptValue(key);
+      return this[_put_1](value_1, key_2);
     }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
+    let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
+    return this[_put_2](value_1);
+  }
+  [_put_1](...args) {
+    return this.put.apply(this, args);
+  }
+  [_put_2](...args) {
+    return this.put.apply(this, args);
+  }
+  static _cursorStreamFromResult(T) {
+    return (request, autoAdvance) => {
+      let controller = async.StreamController$(T).new({sync: true});
+      request[dartx.onError].listen(dart.bind(controller, 'addError'));
+      request[dartx.onSuccess].listen(dart.fn(e => {
+        let cursor = indexed_db._cast(T)(request[dartx.result]);
+        if (cursor == null) {
+          controller.close();
+        } else {
+          controller.add(cursor);
+          if (autoAdvance == true && dart.test(controller.hasListener)) {
+            cursor[dartx.next]();
+          }
+        }
+      }, EventToNull()));
+      return controller.stream;
+    };
+  }
+};
+dart.setSignature(indexed_db.ObjectStore, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.ObjectStore, [])}),
+  fields: () => ({
+    [dartx.autoIncrement]: core.bool,
+    [dartx.indexNames]: ListOfString(),
+    [dartx.keyPath]: core.Object,
+    [dartx.name]: core.String,
+    [dartx.transaction]: indexed_db.Transaction
+  }),
+  methods: () => ({
+    [dartx.add]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
+    [dartx.clear]: dart.definiteFunctionType(async.Future, []),
+    [dartx.delete]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.count]: dart.definiteFunctionType(async.Future$(core.int), [], [dart.dynamic]),
+    [dartx.put]: dart.definiteFunctionType(async.Future, [dart.dynamic], [dart.dynamic]),
+    [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
+    [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
+    [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
+    [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
+    [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
+    [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
+    [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
+    [_delete$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
+    [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
+    [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
+    [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
+    [dartx.openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
+    [_put]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
+    [_put_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
+    [_put_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
+  }),
+  statics: () => ({_cursorStreamFromResult: dart.definiteFunctionType(T => [async.Stream$(T), [indexed_db.Request, core.bool]])}),
+  names: ['_cursorStreamFromResult']
+});
+dart.registerExtension(dart.global.IDBObjectStore, indexed_db.ObjectStore);
+indexed_db._cast = function(To) {
+  return x => {
+    return To._check(x);
   };
-  svg$.StringList[dart.implements] = () => [ListOfString()];
-  dart.setSignature(svg$.StringList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
-    fields: () => ({[dartx.numberOfItems]: core.int}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
-      [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(core.String, [core.String, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(core.String, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
-  dart.defineExtensionNames([
-    'disabled',
-    'media',
-    'sheet',
-    'type'
-  ]);
-  svg$.StyleElement = class StyleElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
-    }
-    created() {
-      this[dartx.disabled] = null;
-      this[dartx.media] = null;
-      this[dartx.sheet] = null;
-      this[dartx.type] = null;
-      super.created();
-    }
-    get [dartx.disabled]() {
-      return this.disabled;
-    }
-    set [dartx.disabled](value) {
-      this.disabled = value;
-    }
-    get [dartx.media]() {
-      return this.media;
-    }
-    set [dartx.media](value) {
-      this.media = value;
-    }
-    get [dartx.sheet]() {
-      return this.sheet;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-  };
-  dart.defineNamedConstructor(svg$.StyleElement, 'created');
-  dart.setSignature(svg$.StyleElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.StyleElement, []),
-      new: dart.definiteFunctionType(svg$.StyleElement, []),
-      created: dart.definiteFunctionType(svg$.StyleElement, [])
-    }),
-    fields: () => ({
-      [dartx.disabled]: core.bool,
-      [dartx.media]: core.String,
-      [dartx.sheet]: html$.StyleSheet,
-      [dartx.type]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
-  const _element$0 = Symbol('_element');
-  svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
-    new(element) {
-      this[_element$0] = element;
-    }
-    readClasses() {
-      let classname = this[_element$0][dartx.attributes][dartx._get]('class');
-      let s = LinkedHashSetOfString().new();
-      if (classname == null) {
-        return s;
+};
+dart.fn(indexed_db._cast, dynamicToTo());
+const _get_result = Symbol('_get_result');
+dart.defineExtensionNames([
+  'result',
+  'onError',
+  'onSuccess',
+  'error',
+  'readyState',
+  'source',
+  'transaction'
+]);
+indexed_db.Request = class Request extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.result]() {
+    return indexed_db._convertNativeToDart_IDBAny(this[_get_result]);
+  }
+  get [_get_result]() {
+    return this.result;
+  }
+  get [dartx.source]() {
+    return this.source;
+  }
+  get [dartx.transaction]() {
+    return this.transaction;
+  }
+  get [dartx.onError]() {
+    return indexed_db.Request.errorEvent.forTarget(this);
+  }
+  get [dartx.onSuccess]() {
+    return indexed_db.Request.successEvent.forTarget(this);
+  }
+};
+dart.setSignature(indexed_db.Request, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
+  fields: () => ({
+    [dartx.error]: html$.DomError,
+    [dartx.readyState]: core.String,
+    [_get_result]: dart.dynamic,
+    [dartx.source]: core.Object,
+    [dartx.transaction]: indexed_db.Transaction
+  }),
+  getters: () => ({
+    [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  sfields: () => ({
+    errorEvent: EventStreamProviderOfEvent(),
+    successEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(indexed_db.Request, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get successEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('success'));
+  }
+});
+dart.registerExtension(dart.global.IDBRequest, indexed_db.Request);
+dart.defineExtensionNames([
+  'onBlocked',
+  'onUpgradeNeeded'
+]);
+indexed_db.OpenDBRequest = class OpenDBRequest extends indexed_db.Request {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.onBlocked]() {
+    return indexed_db.OpenDBRequest.blockedEvent.forTarget(this);
+  }
+  get [dartx.onUpgradeNeeded]() {
+    return indexed_db.OpenDBRequest.upgradeNeededEvent.forTarget(this);
+  }
+};
+dart.setSignature(indexed_db.OpenDBRequest, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
+  getters: () => ({
+    [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
+  }),
+  sfields: () => ({
+    blockedEvent: EventStreamProviderOfEvent(),
+    upgradeNeededEvent: EventStreamProviderOfVersionChangeEvent()
+  })
+});
+dart.defineLazy(indexed_db.OpenDBRequest, {
+  get blockedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('blocked'));
+  },
+  get upgradeNeededEvent() {
+    return dart.const(new (EventStreamProviderOfVersionChangeEvent())('upgradeneeded'));
+  }
+});
+dart.registerExtension(dart.global.IDBOpenDBRequest, indexed_db.OpenDBRequest);
+dart.registerExtension(dart.global.IDBVersionChangeRequest, indexed_db.OpenDBRequest);
+dart.defineExtensionNames([
+  'completed',
+  'abort',
+  'objectStore',
+  'onAbort',
+  'onComplete',
+  'onError',
+  'db',
+  'error',
+  'mode',
+  'objectStoreNames'
+]);
+indexed_db.Transaction = class Transaction extends html$.EventTarget {
+  get [dartx.completed]() {
+    let completer = CompleterOfDatabase().new();
+    this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
+      completer.complete(this[dartx.db]);
+    }, EventToNull()));
+    this[dartx.onError].first.then(dart.dynamic)(dart.fn(e => {
+      completer.completeError(e);
+    }, EventToNull()));
+    this[dartx.onAbort].first.then(dart.dynamic)(dart.fn(e => {
+      if (!dart.test(completer.isCompleted)) {
+        completer.completeError(e);
       }
-      for (let name of classname[dartx.split](' ')) {
-        let trimmed = name[dartx.trim]();
-        if (!dart.test(trimmed[dartx.isEmpty])) {
-          s.add(trimmed);
+    }, EventToNull()));
+    return completer.future;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.db]() {
+    return this.db;
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.mode]() {
+    return this.mode;
+  }
+  get [dartx.objectStoreNames]() {
+    return this.objectStoreNames;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.objectStore](...args) {
+    return this.objectStore.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return indexed_db.Transaction.abortEvent.forTarget(this);
+  }
+  get [dartx.onComplete]() {
+    return indexed_db.Transaction.completeEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return indexed_db.Transaction.errorEvent.forTarget(this);
+  }
+};
+dart.setSignature(indexed_db.Transaction, {
+  constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
+  fields: () => ({
+    [dartx.db]: indexed_db.Database,
+    [dartx.error]: html$.DomError,
+    [dartx.mode]: core.String,
+    [dartx.objectStoreNames]: ListOfString()
+  }),
+  getters: () => ({
+    [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.objectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfEvent(),
+    completeEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(indexed_db.Transaction, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('abort'));
+  },
+  get completeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('complete'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  }
+});
+dart.registerExtension(dart.global.IDBTransaction, indexed_db.Transaction);
+const _createEvent = Symbol('_createEvent');
+const _initEvent = Symbol('_initEvent');
+const _selector = Symbol('_selector');
+const _get_currentTarget = Symbol('_get_currentTarget');
+const _get_target = Symbol('_get_target');
+dart.defineExtensionNames([
+  'matchingTarget',
+  'currentTarget',
+  'target',
+  'preventDefault',
+  'stopImmediatePropagation',
+  'stopPropagation',
+  'bubbles',
+  'cancelable',
+  'defaultPrevented',
+  'eventPhase',
+  'path',
+  'timeStamp',
+  'type'
+]);
+html$.Event = class Event extends _interceptors.Interceptor {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
+  }
+  static eventType(type, name, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let e = html$.document[_createEvent](type);
+    e[_initEvent](name, canBubble, cancelable);
+    return e;
+  }
+  get [_selector]() {
+    return this._selector;
+  }
+  set [_selector](value) {
+    this._selector = value;
+  }
+  get [dartx.matchingTarget]() {
+    if (this[_selector] == null) {
+      dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
+    }
+    let currentTarget = html$.Element._check(this[dartx.currentTarget]);
+    let target = html$.Element._check(this[dartx.target]);
+    let matchedTarget = null;
+    do {
+      if (dart.test(target[dartx.matches](this[_selector]))) return target;
+      target = target[dartx.parent];
+    } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
+    dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.Event._create_1(type, eventInitDict_1);
+    }
+    return html$.Event._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.Event(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.Event(type);
+  }
+  get [dartx.bubbles]() {
+    return this.bubbles;
+  }
+  get [dartx.cancelable]() {
+    return this.cancelable;
+  }
+  get [dartx.currentTarget]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
+  }
+  get [_get_currentTarget]() {
+    return this.currentTarget;
+  }
+  get [dartx.defaultPrevented]() {
+    return this.defaultPrevented;
+  }
+  get [dartx.eventPhase]() {
+    return this.eventPhase;
+  }
+  get [dartx.path]() {
+    return this.path;
+  }
+  get [dartx.target]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_target]);
+  }
+  get [_get_target]() {
+    return this.target;
+  }
+  get [dartx.timeStamp]() {
+    return this.timeStamp;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [_initEvent](...args) {
+    return this.initEvent.apply(this, args);
+  }
+  [dartx.preventDefault](...args) {
+    return this.preventDefault.apply(this, args);
+  }
+  [dartx.stopImmediatePropagation](...args) {
+    return this.stopImmediatePropagation.apply(this, args);
+  }
+  [dartx.stopPropagation](...args) {
+    return this.stopPropagation.apply(this, args);
+  }
+};
+dart.setSignature(html$.Event, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
+    eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
+    _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_selector]: core.String,
+    [dartx.bubbles]: core.bool,
+    [dartx.cancelable]: core.bool,
+    [_get_currentTarget]: dart.dynamic,
+    [dartx.defaultPrevented]: core.bool,
+    [dartx.eventPhase]: core.int,
+    [dartx.path]: ListOfEventTarget(),
+    [_get_target]: dart.dynamic,
+    [dartx.timeStamp]: core.int,
+    [dartx.type]: core.String
+  }),
+  getters: () => ({
+    [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
+    [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
+    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
+  }),
+  methods: () => ({
+    [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
+    [dartx.preventDefault]: dart.definiteFunctionType(dart.void, []),
+    [dartx.stopImmediatePropagation]: dart.definiteFunctionType(dart.void, []),
+    [dartx.stopPropagation]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    AT_TARGET: core.int,
+    BUBBLING_PHASE: core.int,
+    CAPTURING_PHASE: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+html$.Event.AT_TARGET = 2;
+html$.Event.BUBBLING_PHASE = 3;
+html$.Event.CAPTURING_PHASE = 1;
+dart.registerExtension(dart.global.Event, html$.Event);
+dart.registerExtension(dart.global.InputEvent, html$.Event);
+dart.defineExtensionNames([
+  'dataLoss',
+  'dataLossMessage',
+  'newVersion',
+  'oldVersion'
+]);
+indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return indexed_db.VersionChangeEvent._create_1(type, eventInitDict_1);
+    }
+    return indexed_db.VersionChangeEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new IDBVersionChangeEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new IDBVersionChangeEvent(type);
+  }
+  get [dartx.dataLoss]() {
+    return this.dataLoss;
+  }
+  get [dartx.dataLossMessage]() {
+    return this.dataLossMessage;
+  }
+  get [dartx.newVersion]() {
+    return this.newVersion;
+  }
+  get [dartx.oldVersion]() {
+    return this.oldVersion;
+  }
+};
+dart.setSignature(indexed_db.VersionChangeEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(indexed_db.VersionChangeEvent, []),
+    new: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.dataLoss]: core.String,
+    [dartx.dataLossMessage]: core.String,
+    [dartx.newVersion]: core.int,
+    [dartx.oldVersion]: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(indexed_db.VersionChangeEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
+dart.copyProperties(html$, {
+  get window() {
+    return window;
+  }
+});
+dart.copyProperties(html$, {
+  get document() {
+    return document;
+  }
+});
+const _xtag = Symbol('_xtag');
+const _attributes$ = Symbol('_attributes');
+const _innerHtml = Symbol('_innerHtml');
+const _scrollHeight = Symbol('_scrollHeight');
+const _scrollLeft = Symbol('_scrollLeft');
+const _scrollTop = Symbol('_scrollTop');
+const _scrollWidth = Symbol('_scrollWidth');
+const _childElementCount = Symbol('_childElementCount');
+const _children = Symbol('_children');
+const _firstElementChild = Symbol('_firstElementChild');
+const _lastElementChild = Symbol('_lastElementChild');
+const _querySelectorAll = Symbol('_querySelectorAll');
+const _getComputedStyle = Symbol('_getComputedStyle');
+const _animate = Symbol('_animate');
+const _localName = Symbol('_localName');
+const _namespaceUri = Symbol('_namespaceUri');
+const _scrollIntoView = Symbol('_scrollIntoView');
+const _scrollIntoViewIfNeeded = Symbol('_scrollIntoViewIfNeeded');
+const _insertAdjacentText = Symbol('_insertAdjacentText');
+const _insertAdjacentNode = Symbol('_insertAdjacentNode');
+const _insertAdjacentHtml = Symbol('_insertAdjacentHtml');
+const _insertAdjacentElement = Symbol('_insertAdjacentElement');
+const _canBeUsedToCreateContextualFragment = Symbol('_canBeUsedToCreateContextualFragment');
+const _cannotBeUsedToCreateContextualFragment = Symbol('_cannotBeUsedToCreateContextualFragment');
+const _getElementsByTagName = Symbol('_getElementsByTagName');
+const _hasAttribute = Symbol('_hasAttribute');
+const _hasAttributeNS = Symbol('_hasAttributeNS');
+const _removeAttribute = Symbol('_removeAttribute');
+const _removeAttributeNS = Symbol('_removeAttributeNS');
+const _scroll_1 = Symbol('_scroll_1');
+const _scroll_2 = Symbol('_scroll_2');
+const _scroll_3 = Symbol('_scroll_3');
+const _scrollBy_1 = Symbol('_scrollBy_1');
+const _scrollBy_2 = Symbol('_scrollBy_2');
+const _scrollBy_3 = Symbol('_scrollBy_3');
+const _scrollTo_1 = Symbol('_scrollTo_1');
+const _scrollTo_2 = Symbol('_scrollTo_2');
+const _scrollTo_3 = Symbol('_scrollTo_3');
+const _removeChild = Symbol('_removeChild');
+const _replaceChild = Symbol('_replaceChild');
+const _this = Symbol('_this');
+const _clearChildren = Symbol('_clearChildren');
+dart.defineExtensionNames([
+  'nodes',
+  'nodes',
+  'remove',
+  'replaceWith',
+  'insertAllBefore',
+  'toString',
+  'append',
+  'clone',
+  'contains',
+  'hasChildNodes',
+  'insertBefore',
+  'childNodes',
+  'baseUri',
+  'firstChild',
+  'lastChild',
+  'nextNode',
+  'nodeName',
+  'nodeType',
+  'nodeValue',
+  'ownerDocument',
+  'parent',
+  'parentNode',
+  'previousNode',
+  'text'
+]);
+html$.Node = class Node extends html$.EventTarget {
+  _created() {
+    this[dartx.childNodes] = null;
+    this[dartx.baseUri] = null;
+    this[dartx.firstChild] = null;
+    this[dartx.lastChild] = null;
+    this[_localName] = null;
+    this[_namespaceUri] = null;
+    this[dartx.nextNode] = null;
+    this[dartx.nodeName] = null;
+    this[dartx.nodeType] = null;
+    this[dartx.nodeValue] = null;
+    this[dartx.ownerDocument] = null;
+    this[dartx.parent] = null;
+    this[dartx.parentNode] = null;
+    this[dartx.previousNode] = null;
+    this[dartx.text] = null;
+    super._created();
+  }
+  get [dartx.nodes]() {
+    return new html$._ChildNodeListLazy(this);
+  }
+  set [dartx.nodes](value) {
+    let copy = value[dartx.toList]();
+    this[dartx.text] = '';
+    for (let node of copy) {
+      this[dartx.append](node);
+    }
+  }
+  [dartx.remove]() {
+    if (this[dartx.parentNode] != null) {
+      let parent = this[dartx.parentNode];
+      this[dartx.parentNode][_removeChild](this);
+    }
+  }
+  [dartx.replaceWith](otherNode) {
+    try {
+      let parent = this[dartx.parentNode];
+      parent[_replaceChild](otherNode, this);
+    } catch (e) {
+    }
+
+    ;
+    return this;
+  }
+  [dartx.insertAllBefore](newNodes, refChild) {
+    if (html$._ChildNodeListLazy.is(newNodes)) {
+      let otherList = newNodes;
+      if (core.identical(otherList[_this], this)) {
+        dart.throw(new core.ArgumentError(newNodes));
+      }
+      for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
+        this[dartx.insertBefore](otherList[_this][dartx.firstChild], refChild);
+      }
+    } else {
+      for (let node of newNodes) {
+        this[dartx.insertBefore](node, refChild);
+      }
+    }
+  }
+  [_clearChildren]() {
+    while (this[dartx.firstChild] != null) {
+      this[_removeChild](this[dartx.firstChild]);
+    }
+  }
+  [dartx.toString]() {
+    let value = this[dartx.nodeValue];
+    return value == null ? super.toString() : value;
+  }
+  get [dartx.childNodes]() {
+    return this.childNodes;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.baseUri]() {
+    return this.baseURI;
+  }
+  get [dartx.firstChild]() {
+    return this.firstChild;
+  }
+  get [dartx.lastChild]() {
+    return this.lastChild;
+  }
+  get [_localName]() {
+    return this.localName;
+  }
+  get [_namespaceUri]() {
+    return this.namespaceURI;
+  }
+  get [dartx.nextNode]() {
+    return this.nextSibling;
+  }
+  get [dartx.nodeName]() {
+    return this.nodeName;
+  }
+  get [dartx.nodeType]() {
+    return this.nodeType;
+  }
+  get [dartx.nodeValue]() {
+    return this.nodeValue;
+  }
+  get [dartx.ownerDocument]() {
+    return this.ownerDocument;
+  }
+  get [dartx.parent]() {
+    return this.parentElement;
+  }
+  get [dartx.parentNode]() {
+    return this.parentNode;
+  }
+  get [dartx.previousNode]() {
+    return this.previousSibling;
+  }
+  get [dartx.text]() {
+    return this.textContent;
+  }
+  set [dartx.text](value) {
+    this.textContent = value;
+  }
+  [dartx.append](...args) {
+    return this.appendChild.apply(this, args);
+  }
+  [dartx.clone](...args) {
+    return this.cloneNode.apply(this, args);
+  }
+  [dartx.contains](...args) {
+    return this.contains.apply(this, args);
+  }
+  [dartx.hasChildNodes](...args) {
+    return this.hasChildNodes.apply(this, args);
+  }
+  [dartx.insertBefore](...args) {
+    return this.insertBefore.apply(this, args);
+  }
+  [_removeChild](...args) {
+    return this.removeChild.apply(this, args);
+  }
+  [_replaceChild](...args) {
+    return this.replaceChild.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.Node, '_created');
+dart.setSignature(html$.Node, {
+  constructors: () => ({
+    _created: dart.definiteFunctionType(html$.Node, []),
+    _: dart.definiteFunctionType(html$.Node, [])
+  }),
+  fields: () => ({
+    [dartx.childNodes]: ListOfNode(),
+    [dartx.baseUri]: core.String,
+    [dartx.firstChild]: html$.Node,
+    [dartx.lastChild]: html$.Node,
+    [_localName]: core.String,
+    [_namespaceUri]: core.String,
+    [dartx.nextNode]: html$.Node,
+    [dartx.nodeName]: core.String,
+    [dartx.nodeType]: core.int,
+    [dartx.nodeValue]: core.String,
+    [dartx.ownerDocument]: html$.Document,
+    [dartx.parent]: html$.Element,
+    [dartx.parentNode]: html$.Node,
+    [dartx.previousNode]: html$.Node,
+    [dartx.text]: core.String
+  }),
+  getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
+  setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
+  methods: () => ({
+    [dartx.remove]: dart.definiteFunctionType(dart.void, []),
+    [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
+    [_clearChildren]: dart.definiteFunctionType(dart.void, []),
+    [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
+    [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
+    [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
+    [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
+    [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
+  }),
+  sfields: () => ({
+    ATTRIBUTE_NODE: core.int,
+    CDATA_SECTION_NODE: core.int,
+    COMMENT_NODE: core.int,
+    DOCUMENT_FRAGMENT_NODE: core.int,
+    DOCUMENT_NODE: core.int,
+    DOCUMENT_TYPE_NODE: core.int,
+    ELEMENT_NODE: core.int,
+    ENTITY_NODE: core.int,
+    ENTITY_REFERENCE_NODE: core.int,
+    NOTATION_NODE: core.int,
+    PROCESSING_INSTRUCTION_NODE: core.int,
+    TEXT_NODE: core.int
+  })
+});
+html$.Node.ATTRIBUTE_NODE = 2;
+html$.Node.CDATA_SECTION_NODE = 4;
+html$.Node.COMMENT_NODE = 8;
+html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
+html$.Node.DOCUMENT_NODE = 9;
+html$.Node.DOCUMENT_TYPE_NODE = 10;
+html$.Node.ELEMENT_NODE = 1;
+html$.Node.ENTITY_NODE = 6;
+html$.Node.ENTITY_REFERENCE_NODE = 5;
+html$.Node.NOTATION_NODE = 12;
+html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
+html$.Node.TEXT_NODE = 3;
+dart.registerExtension(dart.global.Node, html$.Node);
+dart.defineExtensionNames([
+  'attributes',
+  'attributes',
+  'children',
+  'children',
+  'querySelectorAll',
+  'query',
+  'queryAll',
+  'classes',
+  'classes',
+  'dataset',
+  'dataset',
+  'getNamespacedAttributes',
+  'getComputedStyle',
+  'client',
+  'offset',
+  'appendText',
+  'appendHtml',
+  'attached',
+  'detached',
+  'enteredView',
+  'leftView',
+  'animate',
+  'attributeChanged',
+  'xtag',
+  'xtag',
+  'localName',
+  'namespaceUri',
+  'toString',
+  'scrollIntoView',
+  'insertAdjacentText',
+  'insertAdjacentHtml',
+  'insertAdjacentElement',
+  'matches',
+  'matchesWithAncestors',
+  'createShadowRoot',
+  'shadowRoot',
+  'contentEdge',
+  'paddingEdge',
+  'borderEdge',
+  'marginEdge',
+  'documentOffset',
+  'offsetTo',
+  'createFragment',
+  'innerHtml',
+  'setInnerHtml',
+  'innerHtml',
+  'on',
+  'offsetHeight',
+  'offsetLeft',
+  'offsetTop',
+  'offsetWidth',
+  'scrollHeight',
+  'scrollLeft',
+  'scrollLeft',
+  'scrollTop',
+  'scrollTop',
+  'scrollWidth',
+  'isContentEditable',
+  'blur',
+  'click',
+  'focus',
+  'outerHtml',
+  'closest',
+  'getAnimations',
+  'getAttribute',
+  'getAttributeNS',
+  'getBoundingClientRect',
+  'getClientRects',
+  'getDestinationInsertionPoints',
+  'getElementsByClassName',
+  'requestFullscreen',
+  'requestPointerLock',
+  'scroll',
+  'scrollBy',
+  'scrollTo',
+  'setAttribute',
+  'setAttributeNS',
+  'after',
+  'before',
+  'querySelector',
+  'onAbort',
+  'onBeforeCopy',
+  'onBeforeCut',
+  'onBeforePaste',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onCopy',
+  'onCut',
+  'onDoubleClick',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onPaste',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onRateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSearch',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onSelectStart',
+  'onStalled',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onTouchCancel',
+  'onTouchEnd',
+  'onTouchEnter',
+  'onTouchLeave',
+  'onTouchMove',
+  'onTouchStart',
+  'onTransitionEnd',
+  'onVolumeChange',
+  'onWaiting',
+  'onFullscreenChange',
+  'onFullscreenError',
+  'offsetParent',
+  'contentEditable',
+  'contextMenu',
+  'dir',
+  'draggable',
+  'hidden',
+  'lang',
+  'spellcheck',
+  'style',
+  'tabIndex',
+  'title',
+  'translate',
+  'dropzone',
+  'className',
+  'clientHeight',
+  'clientLeft',
+  'clientTop',
+  'clientWidth',
+  'computedName',
+  'computedRole',
+  'id',
+  'tagName',
+  'nextElementSibling',
+  'previousElementSibling'
+]);
+html$.Element = class Element extends html$.Node {
+  static html(html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
+  }
+  created() {
+    this[_xtag] = null;
+    this[dartx.offsetParent] = null;
+    this[dartx.contentEditable] = null;
+    this[dartx.contextMenu] = null;
+    this[dartx.dir] = null;
+    this[dartx.draggable] = null;
+    this[dartx.hidden] = null;
+    this[dartx.lang] = null;
+    this[dartx.spellcheck] = null;
+    this[dartx.style] = null;
+    this[dartx.tabIndex] = null;
+    this[dartx.title] = null;
+    this[dartx.translate] = null;
+    this[dartx.dropzone] = null;
+    this[_attributes$] = null;
+    this[dartx.className] = null;
+    this[dartx.clientHeight] = null;
+    this[dartx.clientLeft] = null;
+    this[dartx.clientTop] = null;
+    this[dartx.clientWidth] = null;
+    this[dartx.computedName] = null;
+    this[dartx.computedRole] = null;
+    this[dartx.id] = null;
+    this[_innerHtml] = null;
+    this[_scrollHeight] = null;
+    this[_scrollLeft] = null;
+    this[_scrollTop] = null;
+    this[_scrollWidth] = null;
+    this[dartx.tagName] = null;
+    this[dartx.nextElementSibling] = null;
+    this[dartx.previousElementSibling] = null;
+    this[_childElementCount] = null;
+    this[_children] = null;
+    this[_firstElementChild] = null;
+    this[_lastElementChild] = null;
+    super._created();
+  }
+  static tag(tag, typeExtention) {
+    if (typeExtention === void 0) typeExtention = null;
+    return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
+  }
+  static a() {
+    return html$.Element.tag('a');
+  }
+  static article() {
+    return html$.Element.tag('article');
+  }
+  static aside() {
+    return html$.Element.tag('aside');
+  }
+  static audio() {
+    return html$.Element.tag('audio');
+  }
+  static br() {
+    return html$.Element.tag('br');
+  }
+  static canvas() {
+    return html$.Element.tag('canvas');
+  }
+  static div() {
+    return html$.Element.tag('div');
+  }
+  static footer() {
+    return html$.Element.tag('footer');
+  }
+  static header() {
+    return html$.Element.tag('header');
+  }
+  static hr() {
+    return html$.Element.tag('hr');
+  }
+  static iframe() {
+    return html$.Element.tag('iframe');
+  }
+  static img() {
+    return html$.Element.tag('img');
+  }
+  static li() {
+    return html$.Element.tag('li');
+  }
+  static nav() {
+    return html$.Element.tag('nav');
+  }
+  static ol() {
+    return html$.Element.tag('ol');
+  }
+  static option() {
+    return html$.Element.tag('option');
+  }
+  static p() {
+    return html$.Element.tag('p');
+  }
+  static pre() {
+    return html$.Element.tag('pre');
+  }
+  static section() {
+    return html$.Element.tag('section');
+  }
+  static select() {
+    return html$.Element.tag('select');
+  }
+  static span() {
+    return html$.Element.tag('span');
+  }
+  static svg() {
+    return html$.Element.tag('svg');
+  }
+  static table() {
+    return html$.Element.tag('table');
+  }
+  static td() {
+    return html$.Element.tag('td');
+  }
+  static textarea() {
+    return html$.Element.tag('textarea');
+  }
+  static th() {
+    return html$.Element.tag('th');
+  }
+  static tr() {
+    return html$.Element.tag('tr');
+  }
+  static ul() {
+    return html$.Element.tag('ul');
+  }
+  static video() {
+    return html$.Element.tag('video');
+  }
+  get [dartx.attributes]() {
+    return new html$._ElementAttributeMap(this);
+  }
+  set [dartx.attributes](value) {
+    let attributes = this[dartx.attributes];
+    attributes[dartx.clear]();
+    for (let key of value[dartx.keys]) {
+      attributes[dartx._set](key, value[dartx._get](key));
+    }
+  }
+  get [dartx.children]() {
+    return new html$._ChildrenElementList._wrap(this);
+  }
+  set [dartx.children](value) {
+    let copy = value[dartx.toList]();
+    let children = this[dartx.children];
+    children[dartx.clear]();
+    children[dartx.addAll](copy);
+  }
+  [dartx.querySelectorAll](T) {
+    return selectors => {
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+    };
+  }
+  [dartx.query](relativeSelectors) {
+    return this[dartx.querySelector](relativeSelectors);
+  }
+  [dartx.queryAll](T) {
+    return relativeSelectors => {
+      return this[dartx.querySelectorAll](T)(relativeSelectors);
+    };
+  }
+  get [dartx.classes]() {
+    return new html$._ElementCssClassSet(this);
+  }
+  set [dartx.classes](value) {
+    let classSet = this[dartx.classes];
+    classSet.clear();
+    classSet.addAll(value);
+  }
+  get [dartx.dataset]() {
+    return new html$._DataAttributeMap(this[dartx.attributes]);
+  }
+  set [dartx.dataset](value) {
+    let data = this[dartx.dataset];
+    data[dartx.clear]();
+    for (let key of value[dartx.keys]) {
+      data[dartx._set](key, value[dartx._get](key));
+    }
+  }
+  [dartx.getNamespacedAttributes](namespace) {
+    return new html$._NamespacedAttributeMap(this, namespace);
+  }
+  [dartx.getComputedStyle](pseudoElement) {
+    if (pseudoElement === void 0) pseudoElement = null;
+    if (pseudoElement == null) {
+      pseudoElement = '';
+    }
+    return html$.window[_getComputedStyle](this, pseudoElement);
+  }
+  get [dartx.client]() {
+    return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
+  }
+  get [dartx.offset]() {
+    return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
+  }
+  [dartx.appendText](text) {
+    this[dartx.append](html$.Text.new(text));
+  }
+  [dartx.appendHtml](text, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
+  }
+  static isTagSupported(tag) {
+    let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
+    return html$.Element.is(e) && !html$.UnknownElement.is(e);
+  }
+  [dartx.attached]() {
+    this[dartx.enteredView]();
+  }
+  [dartx.detached]() {
+    this[dartx.leftView]();
+  }
+  [dartx.enteredView]() {}
+  [dartx.leftView]() {}
+  [dartx.animate](frames, timing) {
+    if (timing === void 0) timing = null;
+    if (!core.Iterable.is(frames) || !dart.test(frames[dartx.every](dart.fn(x => core.Map.is(x), MapOfString$dynamicTobool())))) {
+      dart.throw(new core.ArgumentError("The frames parameter should be a List of Maps " + "with frame information"));
+    }
+    let convertedFrames = null;
+    if (core.Iterable.is(frames)) {
+      convertedFrames = frames[dartx.map](dart.dynamic)(html_common.convertDartToNative_Dictionary)[dartx.toList]();
+    } else {
+      convertedFrames = frames;
+    }
+    let convertedTiming = core.Map.is(timing) ? html_common.convertDartToNative_Dictionary(timing) : timing;
+    return convertedTiming == null ? this[_animate](convertedFrames) : this[_animate](convertedFrames, convertedTiming);
+  }
+  [_animate](...args) {
+    return this.animate.apply(this, args);
+  }
+  [dartx.attributeChanged](name, oldValue, newValue) {}
+  get [_xtag]() {
+    return this._xtag;
+  }
+  set [_xtag](value) {
+    this._xtag = value;
+  }
+  get [dartx.xtag]() {
+    return this[_xtag] != null ? this[_xtag] : this;
+  }
+  set [dartx.xtag](value) {
+    this[_xtag] = value;
+  }
+  get [dartx.localName]() {
+    return this[_localName];
+  }
+  get [dartx.namespaceUri]() {
+    return this[_namespaceUri];
+  }
+  [dartx.toString]() {
+    return this[dartx.localName];
+  }
+  [dartx.scrollIntoView](alignment) {
+    if (alignment === void 0) alignment = null;
+    let hasScrollIntoViewIfNeeded = true;
+    hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
+    if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
+      this[_scrollIntoView](true);
+    } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
+      this[_scrollIntoView](false);
+    } else if (hasScrollIntoViewIfNeeded) {
+      if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
+        this[_scrollIntoViewIfNeeded](true);
+      } else {
+        this[_scrollIntoViewIfNeeded]();
+      }
+    } else {
+      this[_scrollIntoView]();
+    }
+  }
+  static _determineMouseWheelEventType(e) {
+    return 'wheel';
+  }
+  static _determineTransitionEventType(e) {
+    if (dart.test(html_common.Device.isWebKit)) {
+      return 'webkitTransitionEnd';
+    } else if (dart.test(html_common.Device.isOpera)) {
+      return 'oTransitionEnd';
+    }
+    return 'transitionend';
+  }
+  [dartx.insertAdjacentText](where, text) {
+    if (!!this.insertAdjacentText) {
+      this[_insertAdjacentText](where, text);
+    } else {
+      this[_insertAdjacentNode](where, html$.Text.new(text));
+    }
+  }
+  [_insertAdjacentText](...args) {
+    return this.insertAdjacentText.apply(this, args);
+  }
+  [dartx.insertAdjacentHtml](where, html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
+      this[_insertAdjacentHtml](where, html);
+    } else {
+      this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
+    }
+  }
+  [_insertAdjacentHtml](...args) {
+    return this.insertAdjacentHTML.apply(this, args);
+  }
+  [dartx.insertAdjacentElement](where, element) {
+    if (!!this.insertAdjacentElement) {
+      this[_insertAdjacentElement](where, element);
+    } else {
+      this[_insertAdjacentNode](where, element);
+    }
+    return element;
+  }
+  [_insertAdjacentElement](...args) {
+    return this.insertAdjacentElement.apply(this, args);
+  }
+  [_insertAdjacentNode](where, node) {
+    switch (where[dartx.toLowerCase]()) {
+      case 'beforebegin':
+      {
+        this[dartx.parentNode][dartx.insertBefore](node, this);
+        break;
+      }
+      case 'afterbegin':
+      {
+        let first = dart.notNull(this[dartx.nodes][dartx.length]) > 0 ? this[dartx.nodes][dartx._get](0) : null;
+        this[dartx.insertBefore](node, first);
+        break;
+      }
+      case 'beforeend':
+      {
+        this[dartx.append](node);
+        break;
+      }
+      case 'afterend':
+      {
+        this[dartx.parentNode][dartx.insertBefore](node, this[dartx.nextNode]);
+        break;
+      }
+      default:
+      {
+        dart.throw(new core.ArgumentError(dart.str`Invalid position ${where}`));
+      }
+    }
+  }
+  [dartx.matches](selectors) {
+    if (!!this.matches) {
+      return this.matches(selectors);
+    } else if (!!this.webkitMatchesSelector) {
+      return this.webkitMatchesSelector(selectors);
+    } else if (!!this.mozMatchesSelector) {
+      return this.mozMatchesSelector(selectors);
+    } else if (!!this.msMatchesSelector) {
+      return this.msMatchesSelector(selectors);
+    } else if (!!this.oMatchesSelector) {
+      return this.oMatchesSelector(selectors);
+    } else {
+      dart.throw(new core.UnsupportedError("Not supported on this platform"));
+    }
+  }
+  [dartx.matchesWithAncestors](selectors) {
+    let elem = this;
+    do {
+      if (dart.test(elem[dartx.matches](selectors))) return true;
+      elem = elem[dartx.parent];
+    } while (elem != null);
+    return false;
+  }
+  [dartx.createShadowRoot]() {
+    return (this.createShadowRoot || this.webkitCreateShadowRoot).call(this);
+  }
+  get [dartx.shadowRoot]() {
+    return this.shadowRoot || this.webkitShadowRoot;
+  }
+  get [dartx.contentEdge]() {
+    return new html$._ContentCssRect(this);
+  }
+  get [dartx.paddingEdge]() {
+    return new html$._PaddingCssRect(this);
+  }
+  get [dartx.borderEdge]() {
+    return new html$._BorderCssRect(this);
+  }
+  get [dartx.marginEdge]() {
+    return new html$._MarginCssRect(this);
+  }
+  get [dartx.documentOffset]() {
+    return this[dartx.offsetTo](html$.document[dartx.documentElement]);
+  }
+  [dartx.offsetTo](parent) {
+    return html$.Element._offsetToHelper(this, parent);
+  }
+  static _offsetToHelper(current, parent) {
+    let sameAsParent = core.identical(current, parent);
+    let foundAsParent = sameAsParent || parent[dartx.tagName] == 'HTML';
+    if (current == null || sameAsParent) {
+      if (foundAsParent) return new (PointOfnum())(0, 0);
+      dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
+    }
+    let parentOffset = current[dartx.offsetParent];
+    let p = html$.Element._offsetToHelper(parentOffset, parent);
+    return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
+  }
+  [dartx.createFragment](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (treeSanitizer == null) {
+      if (validator == null) {
+        if (html$.Element._defaultValidator == null) {
+          html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
+        }
+        validator = html$.Element._defaultValidator;
+      }
+      if (html$.Element._defaultSanitizer == null) {
+        html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
+      } else {
+        html$.Element._defaultSanitizer.validator = validator;
+      }
+      treeSanitizer = html$.Element._defaultSanitizer;
+    } else if (validator != null) {
+      dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
+    }
+    if (html$.Element._parseDocument == null) {
+      html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
+      html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
+      let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
+      base[dartx.href] = html$.document[dartx.baseUri];
+      html$.Element._parseDocument[dartx.head][dartx.append](base);
+    }
+    let contextElement = null;
+    if (html$.BodyElement.is(this)) {
+      contextElement = html$.Element._parseDocument[dartx.body];
+    } else {
+      contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
+      html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
+    }
+    let fragment = null;
+    if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
+      html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
+      fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
+    } else {
+      dart.dput(contextElement, _innerHtml, html);
+      fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
+      while (dart.dload(contextElement, 'firstChild') != null) {
+        dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
+      }
+    }
+    if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
+      dart.dsend(contextElement, 'remove');
+    }
+    treeSanitizer.sanitizeTree(html$.Node._check(fragment));
+    html$.document[dartx.adoptNode](html$.Node._check(fragment));
+    return html$.DocumentFragment._check(fragment);
+  }
+  get [_canBeUsedToCreateContextualFragment]() {
+    return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
+  }
+  get [_cannotBeUsedToCreateContextualFragment]() {
+    return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
+  }
+  set [dartx.innerHtml](html) {
+    this[dartx.setInnerHtml](html);
+  }
+  [dartx.setInnerHtml](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    this[dartx.text] = null;
+    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
+      this[_innerHtml] = html;
+    } else {
+      this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
+    }
+  }
+  get [dartx.innerHtml]() {
+    return this[_innerHtml];
+  }
+  get [dartx.on]() {
+    return new html$.ElementEvents(this);
+  }
+  static _hasCorruptedAttributes(element) {
+    return (function(element) {
+      if (!(element.attributes instanceof NamedNodeMap)) {
+        return true;
+      }
+      var childNodes = element.childNodes;
+      if (element.lastChild && element.lastChild !== childNodes[childNodes.length - 1]) {
+        return true;
+      }
+      if (element.children) {
+        if (!(element.children instanceof HTMLCollection || element.children instanceof NodeList)) {
+          return true;
         }
       }
+      var length = 0;
+      if (element.children) {
+        length = element.children.length;
+      }
+      for (var i = 0; i < length; i++) {
+        var child = element.children[i];
+        if (child.id == 'attributes' || child.name == 'attributes' || child.id == 'lastChild' || child.name == 'lastChild' || child.id == 'children' || child.name == 'children') {
+          return true;
+        }
+      }
+      return false;
+    })(element);
+  }
+  static _hasCorruptedAttributesAdditionalCheck(element) {
+    return !(element.attributes instanceof NamedNodeMap);
+  }
+  static _safeTagName(element) {
+    let result = 'element tag unavailable';
+    try {
+      if (typeof dart.dload(element, 'tagName') == 'string') {
+        result = core.String._check(dart.dload(element, 'tagName'));
+      }
+    } catch (e) {
+    }
+
+    return result;
+  }
+  get [dartx.offsetParent]() {
+    return this.offsetParent;
+  }
+  get [dartx.offsetHeight]() {
+    return this.offsetHeight[dartx.round]();
+  }
+  get [dartx.offsetLeft]() {
+    return this.offsetLeft[dartx.round]();
+  }
+  get [dartx.offsetTop]() {
+    return this.offsetTop[dartx.round]();
+  }
+  get [dartx.offsetWidth]() {
+    return this.offsetWidth[dartx.round]();
+  }
+  get [dartx.scrollHeight]() {
+    return this.scrollHeight[dartx.round]();
+  }
+  get [dartx.scrollLeft]() {
+    return this.scrollLeft[dartx.round]();
+  }
+  set [dartx.scrollLeft](value) {
+    this.scrollLeft = value[dartx.round]();
+  }
+  get [dartx.scrollTop]() {
+    return this.scrollTop[dartx.round]();
+  }
+  set [dartx.scrollTop](value) {
+    this.scrollTop = value[dartx.round]();
+  }
+  get [dartx.scrollWidth]() {
+    return this.scrollWidth[dartx.round]();
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.contentEditable]() {
+    return this.contentEditable;
+  }
+  set [dartx.contentEditable](value) {
+    this.contentEditable = value;
+  }
+  get [dartx.contextMenu]() {
+    return this.contextMenu;
+  }
+  set [dartx.contextMenu](value) {
+    this.contextMenu = value;
+  }
+  get [dartx.dir]() {
+    return this.dir;
+  }
+  set [dartx.dir](value) {
+    this.dir = value;
+  }
+  get [dartx.draggable]() {
+    return this.draggable;
+  }
+  set [dartx.draggable](value) {
+    this.draggable = value;
+  }
+  get [dartx.hidden]() {
+    return this.hidden;
+  }
+  set [dartx.hidden](value) {
+    this.hidden = value;
+  }
+  get [dartx.isContentEditable]() {
+    return this.isContentEditable;
+  }
+  get [dartx.lang]() {
+    return this.lang;
+  }
+  set [dartx.lang](value) {
+    this.lang = value;
+  }
+  get [dartx.spellcheck]() {
+    return this.spellcheck;
+  }
+  set [dartx.spellcheck](value) {
+    this.spellcheck = value;
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+  get [dartx.tabIndex]() {
+    return this.tabIndex;
+  }
+  set [dartx.tabIndex](value) {
+    this.tabIndex = value;
+  }
+  get [dartx.title]() {
+    return this.title;
+  }
+  set [dartx.title](value) {
+    this.title = value;
+  }
+  get [dartx.translate]() {
+    return this.translate;
+  }
+  set [dartx.translate](value) {
+    this.translate = value;
+  }
+  get [dartx.dropzone]() {
+    return this.webkitdropzone;
+  }
+  set [dartx.dropzone](value) {
+    this.webkitdropzone = value;
+  }
+  [dartx.blur](...args) {
+    return this.blur.apply(this, args);
+  }
+  [dartx.click](...args) {
+    return this.click.apply(this, args);
+  }
+  [dartx.focus](...args) {
+    return this.focus.apply(this, args);
+  }
+  get [_attributes$]() {
+    return this.attributes;
+  }
+  get [dartx.className]() {
+    return this.className;
+  }
+  set [dartx.className](value) {
+    this.className = value;
+  }
+  get [dartx.clientHeight]() {
+    return this.clientHeight;
+  }
+  get [dartx.clientLeft]() {
+    return this.clientLeft;
+  }
+  get [dartx.clientTop]() {
+    return this.clientTop;
+  }
+  get [dartx.clientWidth]() {
+    return this.clientWidth;
+  }
+  get [dartx.computedName]() {
+    return this.computedName;
+  }
+  get [dartx.computedRole]() {
+    return this.computedRole;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  set [dartx.id](value) {
+    this.id = value;
+  }
+  get [_innerHtml]() {
+    return this.innerHTML;
+  }
+  set [_innerHtml](value) {
+    this.innerHTML = value;
+  }
+  get [dartx.outerHtml]() {
+    return this.outerHTML;
+  }
+  get [_scrollHeight]() {
+    return this.scrollHeight;
+  }
+  get [_scrollLeft]() {
+    return this.scrollLeft;
+  }
+  set [_scrollLeft](value) {
+    this.scrollLeft = value;
+  }
+  get [_scrollTop]() {
+    return this.scrollTop;
+  }
+  set [_scrollTop](value) {
+    this.scrollTop = value;
+  }
+  get [_scrollWidth]() {
+    return this.scrollWidth;
+  }
+  get [dartx.tagName]() {
+    return this.tagName;
+  }
+  [dartx.closest](...args) {
+    return this.closest.apply(this, args);
+  }
+  [dartx.getAnimations](...args) {
+    return this.getAnimations.apply(this, args);
+  }
+  [dartx.getAttribute](...args) {
+    return this.getAttribute.apply(this, args);
+  }
+  [dartx.getAttributeNS](...args) {
+    return this.getAttributeNS.apply(this, args);
+  }
+  [dartx.getBoundingClientRect](...args) {
+    return this.getBoundingClientRect.apply(this, args);
+  }
+  [dartx.getClientRects](...args) {
+    return this.getClientRects.apply(this, args);
+  }
+  [dartx.getDestinationInsertionPoints](...args) {
+    return this.getDestinationInsertionPoints.apply(this, args);
+  }
+  [dartx.getElementsByClassName](...args) {
+    return this.getElementsByClassName.apply(this, args);
+  }
+  [_getElementsByTagName](...args) {
+    return this.getElementsByTagName.apply(this, args);
+  }
+  [_hasAttribute](...args) {
+    return this.hasAttribute.apply(this, args);
+  }
+  [_hasAttributeNS](...args) {
+    return this.hasAttributeNS.apply(this, args);
+  }
+  [_removeAttribute](...args) {
+    return this.removeAttribute.apply(this, args);
+  }
+  [_removeAttributeNS](...args) {
+    return this.removeAttributeNS.apply(this, args);
+  }
+  [dartx.requestFullscreen](...args) {
+    return this.requestFullscreen.apply(this, args);
+  }
+  [dartx.requestPointerLock](...args) {
+    return this.requestPointerLock.apply(this, args);
+  }
+  [dartx.scroll](options_OR_x, y) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (options_OR_x == null && y == null) {
+      this[_scroll_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scroll_2](options_1);
+      return;
+    }
+    if (y != null && typeof options_OR_x == 'number') {
+      this[_scroll_3](options_OR_x, y);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scroll_1](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_2](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_3](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [dartx.scrollBy](options_OR_x, y) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (options_OR_x == null && y == null) {
+      this[_scrollBy_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scrollBy_2](options_1);
+      return;
+    }
+    if (y != null && typeof options_OR_x == 'number') {
+      this[_scrollBy_3](options_OR_x, y);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scrollBy_1](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_2](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_3](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollIntoView](...args) {
+    return this.scrollIntoView.apply(this, args);
+  }
+  [_scrollIntoViewIfNeeded](...args) {
+    return this.scrollIntoViewIfNeeded.apply(this, args);
+  }
+  [dartx.scrollTo](options_OR_x, y) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (options_OR_x == null && y == null) {
+      this[_scrollTo_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scrollTo_2](options_1);
+      return;
+    }
+    if (y != null && typeof options_OR_x == 'number') {
+      this[_scrollTo_3](options_OR_x, y);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scrollTo_1](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_2](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_3](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [dartx.setAttribute](...args) {
+    return this.setAttribute.apply(this, args);
+  }
+  [dartx.setAttributeNS](...args) {
+    return this.setAttributeNS.apply(this, args);
+  }
+  [dartx.after](...args) {
+    return this.after.apply(this, args);
+  }
+  [dartx.before](...args) {
+    return this.before.apply(this, args);
+  }
+  get [dartx.nextElementSibling]() {
+    return this.nextElementSibling;
+  }
+  get [dartx.previousElementSibling]() {
+    return this.previousElementSibling;
+  }
+  get [_childElementCount]() {
+    return this.childElementCount;
+  }
+  get [_children]() {
+    return this.children;
+  }
+  get [_firstElementChild]() {
+    return this.firstElementChild;
+  }
+  get [_lastElementChild]() {
+    return this.lastElementChild;
+  }
+  [dartx.querySelector](...args) {
+    return this.querySelector.apply(this, args);
+  }
+  [_querySelectorAll](...args) {
+    return this.querySelectorAll.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return html$.Element.abortEvent.forElement(this);
+  }
+  get [dartx.onBeforeCopy]() {
+    return html$.Element.beforeCopyEvent.forElement(this);
+  }
+  get [dartx.onBeforeCut]() {
+    return html$.Element.beforeCutEvent.forElement(this);
+  }
+  get [dartx.onBeforePaste]() {
+    return html$.Element.beforePasteEvent.forElement(this);
+  }
+  get [dartx.onBlur]() {
+    return html$.Element.blurEvent.forElement(this);
+  }
+  get [dartx.onCanPlay]() {
+    return html$.Element.canPlayEvent.forElement(this);
+  }
+  get [dartx.onCanPlayThrough]() {
+    return html$.Element.canPlayThroughEvent.forElement(this);
+  }
+  get [dartx.onChange]() {
+    return html$.Element.changeEvent.forElement(this);
+  }
+  get [dartx.onClick]() {
+    return html$.Element.clickEvent.forElement(this);
+  }
+  get [dartx.onContextMenu]() {
+    return html$.Element.contextMenuEvent.forElement(this);
+  }
+  get [dartx.onCopy]() {
+    return html$.Element.copyEvent.forElement(this);
+  }
+  get [dartx.onCut]() {
+    return html$.Element.cutEvent.forElement(this);
+  }
+  get [dartx.onDoubleClick]() {
+    return html$.Element.doubleClickEvent.forElement(this);
+  }
+  get [dartx.onDrag]() {
+    return html$.Element.dragEvent.forElement(this);
+  }
+  get [dartx.onDragEnd]() {
+    return html$.Element.dragEndEvent.forElement(this);
+  }
+  get [dartx.onDragEnter]() {
+    return html$.Element.dragEnterEvent.forElement(this);
+  }
+  get [dartx.onDragLeave]() {
+    return html$.Element.dragLeaveEvent.forElement(this);
+  }
+  get [dartx.onDragOver]() {
+    return html$.Element.dragOverEvent.forElement(this);
+  }
+  get [dartx.onDragStart]() {
+    return html$.Element.dragStartEvent.forElement(this);
+  }
+  get [dartx.onDrop]() {
+    return html$.Element.dropEvent.forElement(this);
+  }
+  get [dartx.onDurationChange]() {
+    return html$.Element.durationChangeEvent.forElement(this);
+  }
+  get [dartx.onEmptied]() {
+    return html$.Element.emptiedEvent.forElement(this);
+  }
+  get [dartx.onEnded]() {
+    return html$.Element.endedEvent.forElement(this);
+  }
+  get [dartx.onError]() {
+    return html$.Element.errorEvent.forElement(this);
+  }
+  get [dartx.onFocus]() {
+    return html$.Element.focusEvent.forElement(this);
+  }
+  get [dartx.onInput]() {
+    return html$.Element.inputEvent.forElement(this);
+  }
+  get [dartx.onInvalid]() {
+    return html$.Element.invalidEvent.forElement(this);
+  }
+  get [dartx.onKeyDown]() {
+    return html$.Element.keyDownEvent.forElement(this);
+  }
+  get [dartx.onKeyPress]() {
+    return html$.Element.keyPressEvent.forElement(this);
+  }
+  get [dartx.onKeyUp]() {
+    return html$.Element.keyUpEvent.forElement(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.Element.loadEvent.forElement(this);
+  }
+  get [dartx.onLoadedData]() {
+    return html$.Element.loadedDataEvent.forElement(this);
+  }
+  get [dartx.onLoadedMetadata]() {
+    return html$.Element.loadedMetadataEvent.forElement(this);
+  }
+  get [dartx.onMouseDown]() {
+    return html$.Element.mouseDownEvent.forElement(this);
+  }
+  get [dartx.onMouseEnter]() {
+    return html$.Element.mouseEnterEvent.forElement(this);
+  }
+  get [dartx.onMouseLeave]() {
+    return html$.Element.mouseLeaveEvent.forElement(this);
+  }
+  get [dartx.onMouseMove]() {
+    return html$.Element.mouseMoveEvent.forElement(this);
+  }
+  get [dartx.onMouseOut]() {
+    return html$.Element.mouseOutEvent.forElement(this);
+  }
+  get [dartx.onMouseOver]() {
+    return html$.Element.mouseOverEvent.forElement(this);
+  }
+  get [dartx.onMouseUp]() {
+    return html$.Element.mouseUpEvent.forElement(this);
+  }
+  get [dartx.onMouseWheel]() {
+    return html$.Element.mouseWheelEvent.forElement(this);
+  }
+  get [dartx.onPaste]() {
+    return html$.Element.pasteEvent.forElement(this);
+  }
+  get [dartx.onPause]() {
+    return html$.Element.pauseEvent.forElement(this);
+  }
+  get [dartx.onPlay]() {
+    return html$.Element.playEvent.forElement(this);
+  }
+  get [dartx.onPlaying]() {
+    return html$.Element.playingEvent.forElement(this);
+  }
+  get [dartx.onRateChange]() {
+    return html$.Element.rateChangeEvent.forElement(this);
+  }
+  get [dartx.onReset]() {
+    return html$.Element.resetEvent.forElement(this);
+  }
+  get [dartx.onResize]() {
+    return html$.Element.resizeEvent.forElement(this);
+  }
+  get [dartx.onScroll]() {
+    return html$.Element.scrollEvent.forElement(this);
+  }
+  get [dartx.onSearch]() {
+    return html$.Element.searchEvent.forElement(this);
+  }
+  get [dartx.onSeeked]() {
+    return html$.Element.seekedEvent.forElement(this);
+  }
+  get [dartx.onSeeking]() {
+    return html$.Element.seekingEvent.forElement(this);
+  }
+  get [dartx.onSelect]() {
+    return html$.Element.selectEvent.forElement(this);
+  }
+  get [dartx.onSelectStart]() {
+    return html$.Element.selectStartEvent.forElement(this);
+  }
+  get [dartx.onStalled]() {
+    return html$.Element.stalledEvent.forElement(this);
+  }
+  get [dartx.onSubmit]() {
+    return html$.Element.submitEvent.forElement(this);
+  }
+  get [dartx.onSuspend]() {
+    return html$.Element.suspendEvent.forElement(this);
+  }
+  get [dartx.onTimeUpdate]() {
+    return html$.Element.timeUpdateEvent.forElement(this);
+  }
+  get [dartx.onTouchCancel]() {
+    return html$.Element.touchCancelEvent.forElement(this);
+  }
+  get [dartx.onTouchEnd]() {
+    return html$.Element.touchEndEvent.forElement(this);
+  }
+  get [dartx.onTouchEnter]() {
+    return html$.Element.touchEnterEvent.forElement(this);
+  }
+  get [dartx.onTouchLeave]() {
+    return html$.Element.touchLeaveEvent.forElement(this);
+  }
+  get [dartx.onTouchMove]() {
+    return html$.Element.touchMoveEvent.forElement(this);
+  }
+  get [dartx.onTouchStart]() {
+    return html$.Element.touchStartEvent.forElement(this);
+  }
+  get [dartx.onTransitionEnd]() {
+    return html$.Element.transitionEndEvent.forElement(this);
+  }
+  get [dartx.onVolumeChange]() {
+    return html$.Element.volumeChangeEvent.forElement(this);
+  }
+  get [dartx.onWaiting]() {
+    return html$.Element.waitingEvent.forElement(this);
+  }
+  get [dartx.onFullscreenChange]() {
+    return html$.Element.fullscreenChangeEvent.forElement(this);
+  }
+  get [dartx.onFullscreenError]() {
+    return html$.Element.fullscreenErrorEvent.forElement(this);
+  }
+};
+dart.defineNamedConstructor(html$.Element, 'created');
+html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
+dart.setSignature(html$.Element, {
+  constructors: () => ({
+    html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    created: dart.definiteFunctionType(html$.Element, []),
+    tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
+    a: dart.definiteFunctionType(html$.Element, []),
+    article: dart.definiteFunctionType(html$.Element, []),
+    aside: dart.definiteFunctionType(html$.Element, []),
+    audio: dart.definiteFunctionType(html$.Element, []),
+    br: dart.definiteFunctionType(html$.Element, []),
+    canvas: dart.definiteFunctionType(html$.Element, []),
+    div: dart.definiteFunctionType(html$.Element, []),
+    footer: dart.definiteFunctionType(html$.Element, []),
+    header: dart.definiteFunctionType(html$.Element, []),
+    hr: dart.definiteFunctionType(html$.Element, []),
+    iframe: dart.definiteFunctionType(html$.Element, []),
+    img: dart.definiteFunctionType(html$.Element, []),
+    li: dart.definiteFunctionType(html$.Element, []),
+    nav: dart.definiteFunctionType(html$.Element, []),
+    ol: dart.definiteFunctionType(html$.Element, []),
+    option: dart.definiteFunctionType(html$.Element, []),
+    p: dart.definiteFunctionType(html$.Element, []),
+    pre: dart.definiteFunctionType(html$.Element, []),
+    section: dart.definiteFunctionType(html$.Element, []),
+    select: dart.definiteFunctionType(html$.Element, []),
+    span: dart.definiteFunctionType(html$.Element, []),
+    svg: dart.definiteFunctionType(html$.Element, []),
+    table: dart.definiteFunctionType(html$.Element, []),
+    td: dart.definiteFunctionType(html$.Element, []),
+    textarea: dart.definiteFunctionType(html$.Element, []),
+    th: dart.definiteFunctionType(html$.Element, []),
+    tr: dart.definiteFunctionType(html$.Element, []),
+    ul: dart.definiteFunctionType(html$.Element, []),
+    video: dart.definiteFunctionType(html$.Element, []),
+    _: dart.definiteFunctionType(html$.Element, [])
+  }),
+  fields: () => ({
+    [_xtag]: html$.Element,
+    [dartx.offsetParent]: html$.Element,
+    [dartx.contentEditable]: core.String,
+    [dartx.contextMenu]: html$.MenuElement,
+    [dartx.dir]: core.String,
+    [dartx.draggable]: core.bool,
+    [dartx.hidden]: core.bool,
+    [dartx.lang]: core.String,
+    [dartx.spellcheck]: core.bool,
+    [dartx.style]: html$.CssStyleDeclaration,
+    [dartx.tabIndex]: core.int,
+    [dartx.title]: core.String,
+    [dartx.translate]: core.bool,
+    [dartx.dropzone]: core.String,
+    [_attributes$]: html$._NamedNodeMap,
+    [dartx.className]: core.String,
+    [dartx.clientHeight]: core.int,
+    [dartx.clientLeft]: core.int,
+    [dartx.clientTop]: core.int,
+    [dartx.clientWidth]: core.int,
+    [dartx.computedName]: core.String,
+    [dartx.computedRole]: core.String,
+    [dartx.id]: core.String,
+    [_innerHtml]: core.String,
+    [_scrollHeight]: core.int,
+    [_scrollLeft]: core.num,
+    [_scrollTop]: core.num,
+    [_scrollWidth]: core.int,
+    [dartx.tagName]: core.String,
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element,
+    [_childElementCount]: core.int,
+    [_children]: ListOfNode(),
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
+  }),
+  getters: () => ({
+    [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
+    [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
+    [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
+    [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
+    [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.localName]: dart.definiteFunctionType(core.String, []),
+    [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
+    [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
+    [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
+    [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
+    [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
+    [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
+    [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
+    [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
+    [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
+    [dartx.offsetWidth]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollHeight]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollLeft]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollTop]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
+    [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
+    [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
+    [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
+    [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
+  }),
+  setters: () => ({
+    [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
+    [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
+    [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
+    [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
+    [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
+    [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  methods: () => ({
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
+    [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
+    [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [dartx.attached]: dart.definiteFunctionType(dart.void, []),
+    [dartx.detached]: dart.definiteFunctionType(dart.void, []),
+    [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
+    [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
+    [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
+    [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
+    [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
+    [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
+    [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
+    [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
+    [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
+    [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
+    [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [dartx.blur]: dart.definiteFunctionType(dart.void, []),
+    [dartx.click]: dart.definiteFunctionType(dart.void, []),
+    [dartx.focus]: dart.definiteFunctionType(dart.void, []),
+    [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
+    [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
+    [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
+    [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
+    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
+    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
+    [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
+    [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_removeAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.requestFullscreen]: dart.definiteFunctionType(dart.void, []),
+    [dartx.requestPointerLock]: dart.definiteFunctionType(dart.void, []),
+    [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
+    [_scroll_1]: dart.definiteFunctionType(dart.void, []),
+    [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
+    [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
+    [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
+    [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
+    [_scrollIntoView]: dart.definiteFunctionType(dart.void, [], [core.bool]),
+    [_scrollIntoViewIfNeeded]: dart.definiteFunctionType(dart.void, [], [core.bool]),
+    [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.num]),
+    [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
+    [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, dart.dynamic]),
+    [dartx.setAttribute]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
+    [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
+  }),
+  sfields: () => ({
+    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
+    transitionEndEvent: EventStreamProviderOfTransitionEvent(),
+    _parseDocument: html$.HtmlDocument,
+    _parseRange: html$.Range,
+    _defaultValidator: html$.NodeValidatorBuilder,
+    _defaultSanitizer: html$._ValidatingTreeSanitizer,
+    _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
+    abortEvent: EventStreamProviderOfEvent(),
+    beforeCopyEvent: EventStreamProviderOfEvent(),
+    beforeCutEvent: EventStreamProviderOfEvent(),
+    beforePasteEvent: EventStreamProviderOfEvent(),
+    blurEvent: EventStreamProviderOfEvent(),
+    canPlayEvent: EventStreamProviderOfEvent(),
+    canPlayThroughEvent: EventStreamProviderOfEvent(),
+    changeEvent: EventStreamProviderOfEvent(),
+    clickEvent: EventStreamProviderOfMouseEvent(),
+    contextMenuEvent: EventStreamProviderOfMouseEvent(),
+    copyEvent: EventStreamProviderOfClipboardEvent(),
+    cutEvent: EventStreamProviderOfClipboardEvent(),
+    doubleClickEvent: EventStreamProviderOfEvent(),
+    dragEvent: EventStreamProviderOfMouseEvent(),
+    dragEndEvent: EventStreamProviderOfMouseEvent(),
+    dragEnterEvent: EventStreamProviderOfMouseEvent(),
+    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
+    dragOverEvent: EventStreamProviderOfMouseEvent(),
+    dragStartEvent: EventStreamProviderOfMouseEvent(),
+    dropEvent: EventStreamProviderOfMouseEvent(),
+    durationChangeEvent: EventStreamProviderOfEvent(),
+    emptiedEvent: EventStreamProviderOfEvent(),
+    endedEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    focusEvent: EventStreamProviderOfEvent(),
+    inputEvent: EventStreamProviderOfEvent(),
+    invalidEvent: EventStreamProviderOfEvent(),
+    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
+    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
+    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
+    loadEvent: EventStreamProviderOfEvent(),
+    loadedDataEvent: EventStreamProviderOfEvent(),
+    loadedMetadataEvent: EventStreamProviderOfEvent(),
+    mouseDownEvent: EventStreamProviderOfMouseEvent(),
+    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
+    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
+    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
+    mouseOutEvent: EventStreamProviderOfMouseEvent(),
+    mouseOverEvent: EventStreamProviderOfMouseEvent(),
+    mouseUpEvent: EventStreamProviderOfMouseEvent(),
+    pasteEvent: EventStreamProviderOfClipboardEvent(),
+    pauseEvent: EventStreamProviderOfEvent(),
+    playEvent: EventStreamProviderOfEvent(),
+    playingEvent: EventStreamProviderOfEvent(),
+    rateChangeEvent: EventStreamProviderOfEvent(),
+    resetEvent: EventStreamProviderOfEvent(),
+    resizeEvent: EventStreamProviderOfEvent(),
+    scrollEvent: EventStreamProviderOfEvent(),
+    searchEvent: EventStreamProviderOfEvent(),
+    seekedEvent: EventStreamProviderOfEvent(),
+    seekingEvent: EventStreamProviderOfEvent(),
+    selectEvent: EventStreamProviderOfEvent(),
+    selectStartEvent: EventStreamProviderOfEvent(),
+    stalledEvent: EventStreamProviderOfEvent(),
+    submitEvent: EventStreamProviderOfEvent(),
+    suspendEvent: EventStreamProviderOfEvent(),
+    timeUpdateEvent: EventStreamProviderOfEvent(),
+    touchCancelEvent: EventStreamProviderOfTouchEvent(),
+    touchEndEvent: EventStreamProviderOfTouchEvent(),
+    touchEnterEvent: EventStreamProviderOfTouchEvent(),
+    touchLeaveEvent: EventStreamProviderOfTouchEvent(),
+    touchMoveEvent: EventStreamProviderOfTouchEvent(),
+    touchStartEvent: EventStreamProviderOfTouchEvent(),
+    volumeChangeEvent: EventStreamProviderOfEvent(),
+    waitingEvent: EventStreamProviderOfEvent(),
+    fullscreenChangeEvent: EventStreamProviderOfEvent(),
+    fullscreenErrorEvent: EventStreamProviderOfEvent()
+  }),
+  statics: () => ({
+    isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
+    _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
+    _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
+    _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
+    _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
+  }),
+  names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
+});
+html$.Element._parseDocument = null;
+html$.Element._parseRange = null;
+html$.Element._defaultValidator = null;
+html$.Element._defaultSanitizer = null;
+html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
+dart.defineLazy(html$.Element, {
+  get mouseWheelEvent() {
+    return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
+  },
+  get transitionEndEvent() {
+    return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
+  },
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('abort'));
+  },
+  get beforeCopyEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('beforecopy'));
+  },
+  get beforeCutEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('beforecut'));
+  },
+  get beforePasteEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('beforepaste'));
+  },
+  get blurEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('blur'));
+  },
+  get canPlayEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
+  },
+  get canPlayThroughEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
+  },
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  },
+  get clickEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
+  },
+  get contextMenuEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
+  },
+  get copyEvent() {
+    return dart.const(new (EventStreamProviderOfClipboardEvent())('copy'));
+  },
+  get cutEvent() {
+    return dart.const(new (EventStreamProviderOfClipboardEvent())('cut'));
+  },
+  get doubleClickEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
+  },
+  get dragEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
+  },
+  get dragEndEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
+  },
+  get dragEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
+  },
+  get dragLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
+  },
+  get dragOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
+  },
+  get dragStartEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
+  },
+  get dropEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
+  },
+  get durationChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
+  },
+  get emptiedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
+  },
+  get endedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ended'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get focusEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('focus'));
+  },
+  get inputEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('input'));
+  },
+  get invalidEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
+  },
+  get keyDownEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
+  },
+  get keyPressEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
+  },
+  get keyUpEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('load'));
+  },
+  get loadedDataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
+  },
+  get loadedMetadataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
+  },
+  get mouseDownEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
+  },
+  get mouseEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
+  },
+  get mouseLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
+  },
+  get mouseMoveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
+  },
+  get mouseOutEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
+  },
+  get mouseOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
+  },
+  get mouseUpEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
+  },
+  get pasteEvent() {
+    return dart.const(new (EventStreamProviderOfClipboardEvent())('paste'));
+  },
+  get pauseEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pause'));
+  },
+  get playEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('play'));
+  },
+  get playingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('playing'));
+  },
+  get rateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
+  },
+  get resetEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('reset'));
+  },
+  get resizeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('resize'));
+  },
+  get scrollEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
+  },
+  get searchEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('search'));
+  },
+  get seekedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
+  },
+  get seekingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
+  },
+  get selectEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('select'));
+  },
+  get selectStartEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('selectstart'));
+  },
+  get stalledEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
+  },
+  get submitEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('submit'));
+  },
+  get suspendEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
+  },
+  get timeUpdateEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
+  },
+  get touchCancelEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchcancel'));
+  },
+  get touchEndEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchend'));
+  },
+  get touchEnterEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchenter'));
+  },
+  get touchLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchleave'));
+  },
+  get touchMoveEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchmove'));
+  },
+  get touchStartEvent() {
+    return dart.const(new (EventStreamProviderOfTouchEvent())('touchstart'));
+  },
+  get volumeChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
+  },
+  get waitingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
+  },
+  get fullscreenChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenchange'));
+  },
+  get fullscreenErrorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
+  }
+});
+dart.registerExtension(dart.global.Element, html$.Element);
+html$.HtmlElement = class HtmlElement extends html$.Element {
+  static new() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.HtmlElement, 'created');
+dart.setSignature(html$.HtmlElement, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.HtmlElement, []),
+    created: dart.definiteFunctionType(html$.HtmlElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
+html$._EntryArray = class _EntryArray extends core.Object {};
+html$._EntryArray[dart.implements] = () => [ListOfEntry()];
+dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
+html$.spawnDomUri = function(uri, args, message) {
+  dart.throw(new core.UnimplementedError());
+};
+dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
+html$.createCustomUpgrader = function(customElementClass, $this) {
+  return $this;
+};
+dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
+dart.defineExtensionNames([
+  'onError'
+]);
+html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get onError() {
+    return html$.AbstractWorker.errorEvent.forTarget(this);
+  }
+};
+html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
+dart.setSignature(html$.AbstractWorker, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
+  getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
+});
+dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
+dart.defineLazy(html$.AbstractWorker, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  }
+});
+dart.defineExtensionNames([
+  'toString',
+  'download',
+  'hreflang',
+  'rel',
+  'target',
+  'type',
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'password',
+  'pathname',
+  'port',
+  'protocol',
+  'search',
+  'username'
+]);
+html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(opts) {
+    let href = opts && 'href' in opts ? opts.href : null;
+    let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
+    if (href != null) e[dartx.href] = href;
+    return e;
+  }
+  created() {
+    this[dartx.download] = null;
+    this[dartx.hreflang] = null;
+    this[dartx.rel] = null;
+    this[dartx.target] = null;
+    this[dartx.type] = null;
+    this[dartx.hash] = null;
+    this[dartx.host] = null;
+    this[dartx.hostname] = null;
+    this[dartx.href] = null;
+    this[dartx.origin] = null;
+    this[dartx.password] = null;
+    this[dartx.pathname] = null;
+    this[dartx.port] = null;
+    this[dartx.protocol] = null;
+    this[dartx.search] = null;
+    this[dartx.username] = null;
+    super.created();
+  }
+  get [dartx.download]() {
+    return this.download;
+  }
+  set [dartx.download](value) {
+    this.download = value;
+  }
+  get [dartx.hreflang]() {
+    return this.hreflang;
+  }
+  set [dartx.hreflang](value) {
+    this.hreflang = value;
+  }
+  get [dartx.rel]() {
+    return this.rel;
+  }
+  set [dartx.rel](value) {
+    this.rel = value;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  set [dartx.target](value) {
+    this.target = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.hash]() {
+    return this.hash;
+  }
+  set [dartx.hash](value) {
+    this.hash = value;
+  }
+  get [dartx.host]() {
+    return this.host;
+  }
+  set [dartx.host](value) {
+    this.host = value;
+  }
+  get [dartx.hostname]() {
+    return this.hostname;
+  }
+  set [dartx.hostname](value) {
+    this.hostname = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.password]() {
+    return this.password;
+  }
+  set [dartx.password](value) {
+    this.password = value;
+  }
+  get [dartx.pathname]() {
+    return this.pathname;
+  }
+  set [dartx.pathname](value) {
+    this.pathname = value;
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+  set [dartx.port](value) {
+    this.port = value;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  set [dartx.protocol](value) {
+    this.protocol = value;
+  }
+  get [dartx.search]() {
+    return this.search;
+  }
+  set [dartx.search](value) {
+    this.search = value;
+  }
+  get [dartx.username]() {
+    return this.username;
+  }
+  set [dartx.username](value) {
+    this.username = value;
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+};
+dart.defineNamedConstructor(html$.AnchorElement, 'created');
+html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.AnchorElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AnchorElement, []),
+    new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
+    created: dart.definiteFunctionType(html$.AnchorElement, [])
+  }),
+  fields: () => ({
+    [dartx.download]: core.String,
+    [dartx.hreflang]: core.String,
+    [dartx.rel]: core.String,
+    [dartx.target]: core.String,
+    [dartx.type]: core.String,
+    [dartx.hash]: core.String,
+    [dartx.host]: core.String,
+    [dartx.hostname]: core.String,
+    [dartx.href]: core.String,
+    [dartx.origin]: core.String,
+    [dartx.password]: core.String,
+    [dartx.pathname]: core.String,
+    [dartx.port]: core.String,
+    [dartx.protocol]: core.String,
+    [dartx.search]: core.String,
+    [dartx.username]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
+dart.defineExtensionNames([
+  'cancel',
+  'finish',
+  'pause',
+  'play',
+  'reverse',
+  'currentTime',
+  'effect',
+  'endClip',
+  'finished',
+  'playState',
+  'playbackRate',
+  'ready',
+  'startClip',
+  'startTime'
+]);
+html$.Animation = class Animation extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!document.body.animate;
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  set [dartx.currentTime](value) {
+    this.currentTime = value;
+  }
+  get [dartx.effect]() {
+    return this.effect;
+  }
+  set [dartx.effect](value) {
+    this.effect = value;
+  }
+  get [dartx.endClip]() {
+    return this.endClip;
+  }
+  set [dartx.endClip](value) {
+    this.endClip = value;
+  }
+  get [dartx.finished]() {
+    return this.finished;
+  }
+  get [dartx.playState]() {
+    return this.playState;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  set [dartx.playbackRate](value) {
+    this.playbackRate = value;
+  }
+  get [dartx.ready]() {
+    return this.ready;
+  }
+  get [dartx.startClip]() {
+    return this.startClip;
+  }
+  set [dartx.startClip](value) {
+    this.startClip = value;
+  }
+  get [dartx.startTime]() {
+    return this.startTime;
+  }
+  set [dartx.startTime](value) {
+    this.startTime = value;
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.finish](...args) {
+    return this.finish.apply(this, args);
+  }
+  [dartx.pause](...args) {
+    return this.pause.apply(this, args);
+  }
+  [dartx.play](...args) {
+    return this.play.apply(this, args);
+  }
+  [dartx.reverse](...args) {
+    return this.reverse.apply(this, args);
+  }
+};
+dart.setSignature(html$.Animation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
+  fields: () => ({
+    [dartx.currentTime]: core.num,
+    [dartx.effect]: html$.AnimationEffectReadOnly,
+    [dartx.endClip]: core.num,
+    [dartx.finished]: async.Future,
+    [dartx.playState]: core.String,
+    [dartx.playbackRate]: core.num,
+    [dartx.ready]: async.Future,
+    [dartx.startClip]: core.num,
+    [dartx.startTime]: core.num
+  }),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
+    [dartx.finish]: dart.definiteFunctionType(dart.void, []),
+    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
+    [dartx.play]: dart.definiteFunctionType(dart.void, []),
+    [dartx.reverse]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.Animation, html$.Animation);
+const _get_computedTiming = Symbol('_get_computedTiming');
+dart.defineExtensionNames([
+  'computedTiming',
+  'timing'
+]);
+html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.computedTiming]() {
+    return html_common.convertNativeToDart_Dictionary(this[_get_computedTiming]);
+  }
+  get [_get_computedTiming]() {
+    return this.computedTiming;
+  }
+  get [dartx.timing]() {
+    return this.timing;
+  }
+};
+dart.setSignature(html$.AnimationEffectReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
+  fields: () => ({
+    [_get_computedTiming]: dart.dynamic,
+    [dartx.timing]: html$.AnimationEffectTiming
+  }),
+  getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
+});
+dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
+dart.defineExtensionNames([
+  'delay',
+  'direction',
+  'duration',
+  'easing',
+  'endDelay',
+  'fill',
+  'iterationStart',
+  'iterations',
+  'playbackRate'
+]);
+html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.delay]() {
+    return this.delay;
+  }
+  set [dartx.delay](value) {
+    this.delay = value;
+  }
+  get [dartx.direction]() {
+    return this.direction;
+  }
+  set [dartx.direction](value) {
+    this.direction = value;
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  set [dartx.duration](value) {
+    this.duration = value;
+  }
+  get [dartx.easing]() {
+    return this.easing;
+  }
+  set [dartx.easing](value) {
+    this.easing = value;
+  }
+  get [dartx.endDelay]() {
+    return this.endDelay;
+  }
+  set [dartx.endDelay](value) {
+    this.endDelay = value;
+  }
+  get [dartx.fill]() {
+    return this.fill;
+  }
+  set [dartx.fill](value) {
+    this.fill = value;
+  }
+  get [dartx.iterationStart]() {
+    return this.iterationStart;
+  }
+  set [dartx.iterationStart](value) {
+    this.iterationStart = value;
+  }
+  get [dartx.iterations]() {
+    return this.iterations;
+  }
+  set [dartx.iterations](value) {
+    this.iterations = value;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  set [dartx.playbackRate](value) {
+    this.playbackRate = value;
+  }
+};
+dart.setSignature(html$.AnimationEffectTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
+  fields: () => ({
+    [dartx.delay]: core.num,
+    [dartx.direction]: core.String,
+    [dartx.duration]: core.Object,
+    [dartx.easing]: core.String,
+    [dartx.endDelay]: core.num,
+    [dartx.fill]: core.String,
+    [dartx.iterationStart]: core.num,
+    [dartx.iterations]: core.num,
+    [dartx.playbackRate]: core.num
+  })
+});
+dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
+dart.defineExtensionNames([
+  'animationName',
+  'elapsedTime'
+]);
+html$.AnimationEvent = class AnimationEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.AnimationEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.AnimationEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.AnimationEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.AnimationEvent(type);
+  }
+  get [dartx.animationName]() {
+    return this.animationName;
+  }
+  get [dartx.elapsedTime]() {
+    return this.elapsedTime;
+  }
+};
+dart.setSignature(html$.AnimationEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AnimationEvent, []),
+    new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.animationName]: core.String,
+    [dartx.elapsedTime]: core.double
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
+dart.defineExtensionNames([
+  'currentTime',
+  'timelineTime'
+]);
+html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.AnimationPlayerEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.AnimationPlayerEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.AnimationPlayerEvent(type);
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  get [dartx.timelineTime]() {
+    return this.timelineTime;
+  }
+};
+dart.setSignature(html$.AnimationPlayerEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
+    new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.currentTime]: core.double,
+    [dartx.timelineTime]: core.double
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
+dart.defineExtensionNames([
+  'getAnimations',
+  'play',
+  'currentTime',
+  'playbackRate'
+]);
+html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  set [dartx.currentTime](value) {
+    this.currentTime = value;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  set [dartx.playbackRate](value) {
+    this.playbackRate = value;
+  }
+  [dartx.getAnimations](...args) {
+    return this.getAnimations.apply(this, args);
+  }
+  [dartx.play](...args) {
+    return this.play.apply(this, args);
+  }
+};
+dart.setSignature(html$.AnimationTimeline, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
+  fields: () => ({
+    [dartx.currentTime]: core.num,
+    [dartx.playbackRate]: core.num
+  }),
+  methods: () => ({
+    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
+    [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
+  })
+});
+dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
+dart.defineExtensionNames([
+  'outcome',
+  'platform'
+]);
+html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.outcome]() {
+    return this.outcome;
+  }
+  get [dartx.platform]() {
+    return this.platform;
+  }
+};
+dart.setSignature(html$.AppBannerPromptResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
+  fields: () => ({
+    [dartx.outcome]: core.String,
+    [dartx.platform]: core.String
+  })
+});
+dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
+dart.defineExtensionNames([
+  'abort',
+  'swapCache',
+  'update',
+  'onCached',
+  'onChecking',
+  'onDownloading',
+  'onError',
+  'onNoUpdate',
+  'onObsolete',
+  'onProgress',
+  'onUpdateReady',
+  'status'
+]);
+html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!window.applicationCache;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.swapCache](...args) {
+    return this.swapCache.apply(this, args);
+  }
+  [dartx.update](...args) {
+    return this.update.apply(this, args);
+  }
+  get [dartx.onCached]() {
+    return html$.ApplicationCache.cachedEvent.forTarget(this);
+  }
+  get [dartx.onChecking]() {
+    return html$.ApplicationCache.checkingEvent.forTarget(this);
+  }
+  get [dartx.onDownloading]() {
+    return html$.ApplicationCache.downloadingEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.ApplicationCache.errorEvent.forTarget(this);
+  }
+  get [dartx.onNoUpdate]() {
+    return html$.ApplicationCache.noUpdateEvent.forTarget(this);
+  }
+  get [dartx.onObsolete]() {
+    return html$.ApplicationCache.obsoleteEvent.forTarget(this);
+  }
+  get [dartx.onProgress]() {
+    return html$.ApplicationCache.progressEvent.forTarget(this);
+  }
+  get [dartx.onUpdateReady]() {
+    return html$.ApplicationCache.updateReadyEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.ApplicationCache, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
+  fields: () => ({[dartx.status]: core.int}),
+  getters: () => ({
+    [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.swapCache]: dart.definiteFunctionType(dart.void, []),
+    [dartx.update]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    cachedEvent: EventStreamProviderOfEvent(),
+    checkingEvent: EventStreamProviderOfEvent(),
+    downloadingEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    noUpdateEvent: EventStreamProviderOfEvent(),
+    obsoleteEvent: EventStreamProviderOfEvent(),
+    progressEvent: EventStreamProviderOfProgressEvent(),
+    updateReadyEvent: EventStreamProviderOfEvent(),
+    CHECKING: core.int,
+    DOWNLOADING: core.int,
+    IDLE: core.int,
+    OBSOLETE: core.int,
+    UNCACHED: core.int,
+    UPDATEREADY: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+html$.ApplicationCache.CHECKING = 2;
+html$.ApplicationCache.DOWNLOADING = 3;
+html$.ApplicationCache.IDLE = 1;
+html$.ApplicationCache.OBSOLETE = 5;
+html$.ApplicationCache.UNCACHED = 0;
+html$.ApplicationCache.UPDATEREADY = 4;
+dart.defineLazy(html$.ApplicationCache, {
+  get cachedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('cached'));
+  },
+  get checkingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('checking'));
+  },
+  get downloadingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('downloading'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get noUpdateEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('noupdate'));
+  },
+  get obsoleteEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('obsolete'));
+  },
+  get progressEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
+  },
+  get updateReadyEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('updateready'));
+  }
+});
+dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
+dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
+dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
+dart.defineExtensionNames([
+  'message',
+  'reason',
+  'status',
+  'url'
+]);
+html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ApplicationCacheErrorEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ApplicationCacheErrorEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ApplicationCacheErrorEvent(type);
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  get [dartx.reason]() {
+    return this.reason;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+};
+dart.setSignature(html$.ApplicationCacheErrorEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
+    new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.message]: core.String,
+    [dartx.reason]: core.String,
+    [dartx.status]: core.int,
+    [dartx.url]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
+dart.defineExtensionNames([
+  'toString',
+  'alt',
+  'coords',
+  'shape',
+  'target',
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'password',
+  'pathname',
+  'port',
+  'protocol',
+  'search',
+  'username'
+]);
+html$.AreaElement = class AreaElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
+  }
+  created() {
+    this[dartx.alt] = null;
+    this[dartx.coords] = null;
+    this[dartx.shape] = null;
+    this[dartx.target] = null;
+    this[dartx.hash] = null;
+    this[dartx.host] = null;
+    this[dartx.hostname] = null;
+    this[dartx.href] = null;
+    this[dartx.origin] = null;
+    this[dartx.password] = null;
+    this[dartx.pathname] = null;
+    this[dartx.port] = null;
+    this[dartx.protocol] = null;
+    this[dartx.search] = null;
+    this[dartx.username] = null;
+    super.created();
+  }
+  get [dartx.alt]() {
+    return this.alt;
+  }
+  set [dartx.alt](value) {
+    this.alt = value;
+  }
+  get [dartx.coords]() {
+    return this.coords;
+  }
+  set [dartx.coords](value) {
+    this.coords = value;
+  }
+  get [dartx.shape]() {
+    return this.shape;
+  }
+  set [dartx.shape](value) {
+    this.shape = value;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  set [dartx.target](value) {
+    this.target = value;
+  }
+  get [dartx.hash]() {
+    return this.hash;
+  }
+  set [dartx.hash](value) {
+    this.hash = value;
+  }
+  get [dartx.host]() {
+    return this.host;
+  }
+  set [dartx.host](value) {
+    this.host = value;
+  }
+  get [dartx.hostname]() {
+    return this.hostname;
+  }
+  set [dartx.hostname](value) {
+    this.hostname = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.password]() {
+    return this.password;
+  }
+  set [dartx.password](value) {
+    this.password = value;
+  }
+  get [dartx.pathname]() {
+    return this.pathname;
+  }
+  set [dartx.pathname](value) {
+    this.pathname = value;
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+  set [dartx.port](value) {
+    this.port = value;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  set [dartx.protocol](value) {
+    this.protocol = value;
+  }
+  get [dartx.search]() {
+    return this.search;
+  }
+  set [dartx.search](value) {
+    this.search = value;
+  }
+  get [dartx.username]() {
+    return this.username;
+  }
+  set [dartx.username](value) {
+    this.username = value;
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+};
+dart.defineNamedConstructor(html$.AreaElement, 'created');
+html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.AreaElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AreaElement, []),
+    new: dart.definiteFunctionType(html$.AreaElement, []),
+    created: dart.definiteFunctionType(html$.AreaElement, [])
+  }),
+  fields: () => ({
+    [dartx.alt]: core.String,
+    [dartx.coords]: core.String,
+    [dartx.shape]: core.String,
+    [dartx.target]: core.String,
+    [dartx.hash]: core.String,
+    [dartx.host]: core.String,
+    [dartx.hostname]: core.String,
+    [dartx.href]: core.String,
+    [dartx.origin]: core.String,
+    [dartx.password]: core.String,
+    [dartx.pathname]: core.String,
+    [dartx.port]: core.String,
+    [dartx.protocol]: core.String,
+    [dartx.search]: core.String,
+    [dartx.username]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
+dart.defineExtensionNames([
+  'addTextTrack',
+  'canPlayType',
+  'load',
+  'pause',
+  'play',
+  'setMediaKeys',
+  'setSinkId',
+  'addKey',
+  'cancelKeyRequest',
+  'generateKeyRequest',
+  'onKeyAdded',
+  'onKeyError',
+  'onKeyMessage',
+  'onNeedKey',
+  'audioTracks',
+  'autoplay',
+  'buffered',
+  'controller',
+  'controls',
+  'crossOrigin',
+  'currentSrc',
+  'currentTime',
+  'defaultMuted',
+  'defaultPlaybackRate',
+  'duration',
+  'ended',
+  'error',
+  'loop',
+  'mediaGroup',
+  'mediaKeys',
+  'muted',
+  'networkState',
+  'paused',
+  'playbackRate',
+  'played',
+  'preload',
+  'readyState',
+  'seekable',
+  'seeking',
+  'session',
+  'sinkId',
+  'src',
+  'textTracks',
+  'videoTracks',
+  'volume',
+  'audioDecodedByteCount',
+  'videoDecodedByteCount'
+]);
+html$.MediaElement = class MediaElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.audioTracks] = null;
+    this[dartx.autoplay] = null;
+    this[dartx.buffered] = null;
+    this[dartx.controller] = null;
+    this[dartx.controls] = null;
+    this[dartx.crossOrigin] = null;
+    this[dartx.currentSrc] = null;
+    this[dartx.currentTime] = null;
+    this[dartx.defaultMuted] = null;
+    this[dartx.defaultPlaybackRate] = null;
+    this[dartx.duration] = null;
+    this[dartx.ended] = null;
+    this[dartx.error] = null;
+    this[dartx.loop] = null;
+    this[dartx.mediaGroup] = null;
+    this[dartx.mediaKeys] = null;
+    this[dartx.muted] = null;
+    this[dartx.networkState] = null;
+    this[dartx.paused] = null;
+    this[dartx.playbackRate] = null;
+    this[dartx.played] = null;
+    this[dartx.preload] = null;
+    this[dartx.readyState] = null;
+    this[dartx.seekable] = null;
+    this[dartx.seeking] = null;
+    this[dartx.session] = null;
+    this[dartx.sinkId] = null;
+    this[dartx.src] = null;
+    this[dartx.textTracks] = null;
+    this[dartx.videoTracks] = null;
+    this[dartx.volume] = null;
+    this[dartx.audioDecodedByteCount] = null;
+    this[dartx.videoDecodedByteCount] = null;
+    super.created();
+  }
+  get [dartx.audioTracks]() {
+    return this.audioTracks;
+  }
+  get [dartx.autoplay]() {
+    return this.autoplay;
+  }
+  set [dartx.autoplay](value) {
+    this.autoplay = value;
+  }
+  get [dartx.buffered]() {
+    return this.buffered;
+  }
+  get [dartx.controller]() {
+    return this.controller;
+  }
+  set [dartx.controller](value) {
+    this.controller = value;
+  }
+  get [dartx.controls]() {
+    return this.controls;
+  }
+  set [dartx.controls](value) {
+    this.controls = value;
+  }
+  get [dartx.crossOrigin]() {
+    return this.crossOrigin;
+  }
+  set [dartx.crossOrigin](value) {
+    this.crossOrigin = value;
+  }
+  get [dartx.currentSrc]() {
+    return this.currentSrc;
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  set [dartx.currentTime](value) {
+    this.currentTime = value;
+  }
+  get [dartx.defaultMuted]() {
+    return this.defaultMuted;
+  }
+  set [dartx.defaultMuted](value) {
+    this.defaultMuted = value;
+  }
+  get [dartx.defaultPlaybackRate]() {
+    return this.defaultPlaybackRate;
+  }
+  set [dartx.defaultPlaybackRate](value) {
+    this.defaultPlaybackRate = value;
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  get [dartx.ended]() {
+    return this.ended;
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.loop]() {
+    return this.loop;
+  }
+  set [dartx.loop](value) {
+    this.loop = value;
+  }
+  get [dartx.mediaGroup]() {
+    return this.mediaGroup;
+  }
+  set [dartx.mediaGroup](value) {
+    this.mediaGroup = value;
+  }
+  get [dartx.mediaKeys]() {
+    return this.mediaKeys;
+  }
+  get [dartx.muted]() {
+    return this.muted;
+  }
+  set [dartx.muted](value) {
+    this.muted = value;
+  }
+  get [dartx.networkState]() {
+    return this.networkState;
+  }
+  get [dartx.paused]() {
+    return this.paused;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  set [dartx.playbackRate](value) {
+    this.playbackRate = value;
+  }
+  get [dartx.played]() {
+    return this.played;
+  }
+  get [dartx.preload]() {
+    return this.preload;
+  }
+  set [dartx.preload](value) {
+    this.preload = value;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.seekable]() {
+    return this.seekable;
+  }
+  get [dartx.seeking]() {
+    return this.seeking;
+  }
+  get [dartx.session]() {
+    return this.session;
+  }
+  set [dartx.session](value) {
+    this.session = value;
+  }
+  get [dartx.sinkId]() {
+    return this.sinkId;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.textTracks]() {
+    return this.textTracks;
+  }
+  get [dartx.videoTracks]() {
+    return this.videoTracks;
+  }
+  get [dartx.volume]() {
+    return this.volume;
+  }
+  set [dartx.volume](value) {
+    this.volume = value;
+  }
+  get [dartx.audioDecodedByteCount]() {
+    return this.webkitAudioDecodedByteCount;
+  }
+  get [dartx.videoDecodedByteCount]() {
+    return this.webkitVideoDecodedByteCount;
+  }
+  [dartx.addTextTrack](...args) {
+    return this.addTextTrack.apply(this, args);
+  }
+  [dartx.canPlayType](...args) {
+    return this.canPlayType.apply(this, args);
+  }
+  [dartx.load](...args) {
+    return this.load.apply(this, args);
+  }
+  [dartx.pause](...args) {
+    return this.pause.apply(this, args);
+  }
+  [dartx.play](...args) {
+    return this.play.apply(this, args);
+  }
+  [dartx.setMediaKeys](...args) {
+    return this.setMediaKeys.apply(this, args);
+  }
+  [dartx.setSinkId](...args) {
+    return this.setSinkId.apply(this, args);
+  }
+  [dartx.addKey](...args) {
+    return this.webkitAddKey.apply(this, args);
+  }
+  [dartx.cancelKeyRequest](...args) {
+    return this.webkitCancelKeyRequest.apply(this, args);
+  }
+  [dartx.generateKeyRequest](...args) {
+    return this.webkitGenerateKeyRequest.apply(this, args);
+  }
+  get [dartx.onKeyAdded]() {
+    return html$.MediaElement.keyAddedEvent.forElement(this);
+  }
+  get [dartx.onKeyError]() {
+    return html$.MediaElement.keyErrorEvent.forElement(this);
+  }
+  get [dartx.onKeyMessage]() {
+    return html$.MediaElement.keyMessageEvent.forElement(this);
+  }
+  get [dartx.onNeedKey]() {
+    return html$.MediaElement.needKeyEvent.forElement(this);
+  }
+};
+dart.defineNamedConstructor(html$.MediaElement, 'created');
+dart.setSignature(html$.MediaElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaElement, []),
+    created: dart.definiteFunctionType(html$.MediaElement, [])
+  }),
+  fields: () => ({
+    [dartx.audioTracks]: html$.AudioTrackList,
+    [dartx.autoplay]: core.bool,
+    [dartx.buffered]: html$.TimeRanges,
+    [dartx.controller]: html$.MediaController,
+    [dartx.controls]: core.bool,
+    [dartx.crossOrigin]: core.String,
+    [dartx.currentSrc]: core.String,
+    [dartx.currentTime]: core.num,
+    [dartx.defaultMuted]: core.bool,
+    [dartx.defaultPlaybackRate]: core.num,
+    [dartx.duration]: core.double,
+    [dartx.ended]: core.bool,
+    [dartx.error]: html$.MediaError,
+    [dartx.loop]: core.bool,
+    [dartx.mediaGroup]: core.String,
+    [dartx.mediaKeys]: html$.MediaKeys,
+    [dartx.muted]: core.bool,
+    [dartx.networkState]: core.int,
+    [dartx.paused]: core.bool,
+    [dartx.playbackRate]: core.num,
+    [dartx.played]: html$.TimeRanges,
+    [dartx.preload]: core.String,
+    [dartx.readyState]: core.int,
+    [dartx.seekable]: html$.TimeRanges,
+    [dartx.seeking]: core.bool,
+    [dartx.session]: html$.MediaSession,
+    [dartx.sinkId]: core.String,
+    [dartx.src]: core.String,
+    [dartx.textTracks]: html$.TextTrackList,
+    [dartx.videoTracks]: html$.VideoTrackList,
+    [dartx.volume]: core.num,
+    [dartx.audioDecodedByteCount]: core.int,
+    [dartx.videoDecodedByteCount]: core.int
+  }),
+  getters: () => ({
+    [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
+  }),
+  methods: () => ({
+    [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
+    [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
+    [dartx.load]: dart.definiteFunctionType(dart.void, []),
+    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
+    [dartx.play]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
+    [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
+    [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.generateKeyRequest]: dart.definiteFunctionType(dart.void, [core.String], [typed_data.Uint8List])
+  }),
+  sfields: () => ({
+    keyAddedEvent: EventStreamProviderOfMediaKeyEvent(),
+    keyErrorEvent: EventStreamProviderOfMediaKeyEvent(),
+    keyMessageEvent: EventStreamProviderOfMediaKeyEvent(),
+    needKeyEvent: EventStreamProviderOfMediaKeyEvent(),
+    HAVE_CURRENT_DATA: core.int,
+    HAVE_ENOUGH_DATA: core.int,
+    HAVE_FUTURE_DATA: core.int,
+    HAVE_METADATA: core.int,
+    HAVE_NOTHING: core.int,
+    NETWORK_EMPTY: core.int,
+    NETWORK_IDLE: core.int,
+    NETWORK_LOADING: core.int,
+    NETWORK_NO_SOURCE: core.int
+  })
+});
+html$.MediaElement.HAVE_CURRENT_DATA = 2;
+html$.MediaElement.HAVE_ENOUGH_DATA = 4;
+html$.MediaElement.HAVE_FUTURE_DATA = 3;
+html$.MediaElement.HAVE_METADATA = 1;
+html$.MediaElement.HAVE_NOTHING = 0;
+html$.MediaElement.NETWORK_EMPTY = 0;
+html$.MediaElement.NETWORK_IDLE = 1;
+html$.MediaElement.NETWORK_LOADING = 2;
+html$.MediaElement.NETWORK_NO_SOURCE = 3;
+dart.defineLazy(html$.MediaElement, {
+  get keyAddedEvent() {
+    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
+  },
+  get keyErrorEvent() {
+    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyerror'));
+  },
+  get keyMessageEvent() {
+    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeymessage'));
+  },
+  get needKeyEvent() {
+    return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
+  }
+});
+dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
+html$.AudioElement = class AudioElement extends html$.MediaElement {
+  static _(src) {
+    if (src === void 0) src = null;
+    if (src != null) {
+      return html$.AudioElement._create_1(src);
+    }
+    return html$.AudioElement._create_2();
+  }
+  static _create_1(src) {
+    return new Audio(src);
+  }
+  static _create_2() {
+    return new Audio();
+  }
+  created() {
+    super.created();
+  }
+  static new(src) {
+    if (src === void 0) src = null;
+    return html$.AudioElement._(src);
+  }
+};
+dart.defineNamedConstructor(html$.AudioElement, 'created');
+dart.setSignature(html$.AudioElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
+    created: dart.definiteFunctionType(html$.AudioElement, []),
+    new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AudioElement, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
+dart.defineExtensionNames([
+  'enabled',
+  'id',
+  'kind',
+  'label',
+  'language'
+]);
+html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.enabled]() {
+    return this.enabled;
+  }
+  set [dartx.enabled](value) {
+    this.enabled = value;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.language]() {
+    return this.language;
+  }
+};
+dart.setSignature(html$.AudioTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
+  fields: () => ({
+    [dartx.enabled]: core.bool,
+    [dartx.id]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String,
+    [dartx.language]: core.String
+  })
+});
+dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
+const __getter__ = Symbol('__getter__');
+dart.defineExtensionNames([
+  'getTrackById',
+  'onChange',
+  'length'
+]);
+html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.getTrackById](...args) {
+    return this.getTrackById.apply(this, args);
+  }
+  get [dartx.onChange]() {
+    return html$.AudioTrackList.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.AudioTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
+  fields: () => ({[dartx.length]: core.int}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
+  }),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.AudioTrackList, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
+dart.defineExtensionNames([
+  'reason'
+]);
+html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.AutocompleteErrorEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.AutocompleteErrorEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.AutocompleteErrorEvent(type);
+  }
+  get [dartx.reason]() {
+    return this.reason;
+  }
+};
+dart.setSignature(html$.AutocompleteErrorEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
+    new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.reason]: core.String}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
+html$.BRElement = class BRElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.BRElement._check(html$.document[dartx.createElement]("br"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.BRElement, 'created');
+dart.setSignature(html$.BRElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.BRElement, []),
+    new: dart.definiteFunctionType(html$.BRElement, []),
+    created: dart.definiteFunctionType(html$.BRElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
+dart.defineExtensionNames([
+  'visible'
+]);
+html$.BarProp = class BarProp extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.visible]() {
+    return this.visible;
+  }
+};
+dart.setSignature(html$.BarProp, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
+  fields: () => ({[dartx.visible]: core.bool})
+});
+dart.registerExtension(dart.global.BarProp, html$.BarProp);
+dart.defineExtensionNames([
+  'href',
+  'target'
+]);
+html$.BaseElement = class BaseElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
+  }
+  created() {
+    this[dartx.href] = null;
+    this[dartx.target] = null;
+    super.created();
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  set [dartx.target](value) {
+    this.target = value;
+  }
+};
+dart.defineNamedConstructor(html$.BaseElement, 'created');
+dart.setSignature(html$.BaseElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.BaseElement, []),
+    new: dart.definiteFunctionType(html$.BaseElement, []),
+    created: dart.definiteFunctionType(html$.BaseElement, [])
+  }),
+  fields: () => ({
+    [dartx.href]: core.String,
+    [dartx.target]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
+dart.defineExtensionNames([
+  'charging',
+  'chargingTime',
+  'dischargingTime',
+  'level'
+]);
+html$.BatteryManager = class BatteryManager extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.charging]() {
+    return this.charging;
+  }
+  get [dartx.chargingTime]() {
+    return this.chargingTime;
+  }
+  get [dartx.dischargingTime]() {
+    return this.dischargingTime;
+  }
+  get [dartx.level]() {
+    return this.level;
+  }
+};
+dart.setSignature(html$.BatteryManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
+  fields: () => ({
+    [dartx.charging]: core.bool,
+    [dartx.chargingTime]: core.double,
+    [dartx.dischargingTime]: core.double,
+    [dartx.level]: core.double
+  })
+});
+dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
+dart.defineExtensionNames([
+  'platforms',
+  'prompt',
+  'userChoice'
+]);
+html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.BeforeInstallPromptEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.BeforeInstallPromptEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.BeforeInstallPromptEvent(type);
+  }
+  get [dartx.platforms]() {
+    return this.platforms;
+  }
+  get [dartx.userChoice]() {
+    return this.userChoice;
+  }
+  [dartx.prompt](...args) {
+    return this.prompt.apply(this, args);
+  }
+};
+dart.setSignature(html$.BeforeInstallPromptEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
+    new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.userChoice]: async.Future}),
+  getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
+  methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
+dart.defineExtensionNames([
+  'returnValue',
+  'returnValue'
+]);
+html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.returnValue]() {
+    return this.returnValue;
+  }
+  set [dartx.returnValue](value) {
+    this.returnValue = value;
+  }
+};
+dart.setSignature(html$.BeforeUnloadEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
+  getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
+  setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
+});
+dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
+dart.defineExtensionNames([
+  'close',
+  'slice',
+  'size',
+  'type'
+]);
+html$.Blob = class Blob extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.slice](...args) {
+    return this.slice.apply(this, args);
+  }
+  static new(blobParts, type, endings) {
+    if (type === void 0) type = null;
+    if (endings === void 0) endings = null;
+    if (type == null && endings == null) {
+      return html$.Blob._check(html$.Blob._create_1(blobParts));
+    }
+    let bag = html$.Blob._create_bag();
+    if (type != null) html$.Blob._bag_set(bag, 'type', type);
+    if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
+    return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
+  }
+  static _create_1(parts) {
+    return new self.Blob(parts);
+  }
+  static _create_2(parts, bag) {
+    return new self.Blob(parts, bag);
+  }
+  static _create_bag() {
+    return {};
+  }
+  static _bag_set(bag, key, value) {
+    bag[key] = value;
+  }
+};
+dart.setSignature(html$.Blob, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.Blob, []),
+    new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
+  }),
+  fields: () => ({
+    [dartx.size]: core.int,
+    [dartx.type]: core.String
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
+    _create_bag: dart.definiteFunctionType(dart.dynamic, []),
+    _bag_set: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
+});
+dart.registerExtension(dart.global.Blob, html$.Blob);
+const _requestDevice_1 = Symbol('_requestDevice_1');
+dart.defineExtensionNames([
+  'requestDevice'
+]);
+html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.requestDevice](options) {
+    let options_1 = html_common.convertDartToNative_Dictionary(options);
+    return this[_requestDevice_1](options_1);
+  }
+  [_requestDevice_1](...args) {
+    return this.requestDevice.apply(this, args);
+  }
+};
+dart.setSignature(html$.Bluetooth, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
+  methods: () => ({
+    [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
+    [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
+dart.defineExtensionNames([
+  'connectGatt',
+  'deviceClass',
+  'instanceID',
+  'name',
+  'paired',
+  'productID',
+  'productVersion',
+  'vendorID',
+  'vendorIDSource'
+]);
+html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.deviceClass]() {
+    return this.deviceClass;
+  }
+  get [dartx.instanceID]() {
+    return this.instanceID;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.paired]() {
+    return this.paired;
+  }
+  get [dartx.productID]() {
+    return this.productID;
+  }
+  get [dartx.productVersion]() {
+    return this.productVersion;
+  }
+  get [dartx.vendorID]() {
+    return this.vendorID;
+  }
+  get [dartx.vendorIDSource]() {
+    return this.vendorIDSource;
+  }
+  [dartx.connectGatt](...args) {
+    return this.connectGATT.apply(this, args);
+  }
+};
+dart.setSignature(html$.BluetoothDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
+  fields: () => ({
+    [dartx.deviceClass]: core.int,
+    [dartx.instanceID]: core.String,
+    [dartx.name]: core.String,
+    [dartx.paired]: core.bool,
+    [dartx.productID]: core.int,
+    [dartx.productVersion]: core.int,
+    [dartx.vendorID]: core.int,
+    [dartx.vendorIDSource]: core.String
+  }),
+  methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
+});
+dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
+dart.defineExtensionNames([
+  'readValue',
+  'writeValue',
+  'uuid'
+]);
+html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.uuid]() {
+    return this.uuid;
+  }
+  [dartx.readValue](...args) {
+    return this.readValue.apply(this, args);
+  }
+  [dartx.writeValue](...args) {
+    return this.writeValue.apply(this, args);
+  }
+};
+dart.setSignature(html$.BluetoothGattCharacteristic, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
+  fields: () => ({[dartx.uuid]: core.String}),
+  methods: () => ({
+    [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
+    [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
+dart.defineExtensionNames([
+  'getPrimaryService',
+  'connected'
+]);
+html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.connected]() {
+    return this.connected;
+  }
+  [dartx.getPrimaryService](...args) {
+    return this.getPrimaryService.apply(this, args);
+  }
+};
+dart.setSignature(html$.BluetoothGattRemoteServer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
+  fields: () => ({[dartx.connected]: core.bool}),
+  methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
+});
+dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
+dart.defineExtensionNames([
+  'getCharacteristic',
+  'isPrimary',
+  'uuid'
+]);
+html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.isPrimary]() {
+    return this.isPrimary;
+  }
+  get [dartx.uuid]() {
+    return this.uuid;
+  }
+  [dartx.getCharacteristic](...args) {
+    return this.getCharacteristic.apply(this, args);
+  }
+};
+dart.setSignature(html$.BluetoothGattService, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
+  fields: () => ({
+    [dartx.isPrimary]: core.bool,
+    [dartx.uuid]: core.String
+  }),
+  methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
+});
+dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
+html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.BluetoothUuid, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
+  statics: () => ({
+    canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
+    getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
+    getDescriptor: dart.definiteFunctionType(core.String, [core.Object]),
+    getService: dart.definiteFunctionType(core.String, [core.Object])
+  }),
+  names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
+});
+dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
+dart.defineExtensionNames([
+  'arrayBuffer',
+  'blob',
+  'json',
+  'text',
+  'bodyUsed'
+]);
+html$.Body = class Body extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.bodyUsed]() {
+    return this.bodyUsed;
+  }
+  [dartx.arrayBuffer](...args) {
+    return this.arrayBuffer.apply(this, args);
+  }
+  [dartx.blob](...args) {
+    return this.blob.apply(this, args);
+  }
+  [dartx.json](...args) {
+    return this.json.apply(this, args);
+  }
+  [dartx.text](...args) {
+    return this.text.apply(this, args);
+  }
+};
+dart.setSignature(html$.Body, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
+  fields: () => ({[dartx.bodyUsed]: core.bool}),
+  methods: () => ({
+    [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
+    [dartx.blob]: dart.definiteFunctionType(async.Future, []),
+    [dartx.json]: dart.definiteFunctionType(async.Future, []),
+    [dartx.text]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.Body, html$.Body);
+dart.defineExtensionNames([
+  'onBlur',
+  'onError',
+  'onFocus',
+  'onHashChange',
+  'onLoad',
+  'onMessage',
+  'onOffline',
+  'onOnline',
+  'onPopState',
+  'onResize',
+  'onScroll',
+  'onStorage',
+  'onUnload'
+]);
+html$.BodyElement = class BodyElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
+  }
+  created() {
+    super.created();
+  }
+  get [dartx.onBlur]() {
+    return html$.BodyElement.blurEvent.forElement(this);
+  }
+  get [dartx.onError]() {
+    return html$.BodyElement.errorEvent.forElement(this);
+  }
+  get [dartx.onFocus]() {
+    return html$.BodyElement.focusEvent.forElement(this);
+  }
+  get [dartx.onHashChange]() {
+    return html$.BodyElement.hashChangeEvent.forElement(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.BodyElement.loadEvent.forElement(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.BodyElement.messageEvent.forElement(this);
+  }
+  get [dartx.onOffline]() {
+    return html$.BodyElement.offlineEvent.forElement(this);
+  }
+  get [dartx.onOnline]() {
+    return html$.BodyElement.onlineEvent.forElement(this);
+  }
+  get [dartx.onPopState]() {
+    return html$.BodyElement.popStateEvent.forElement(this);
+  }
+  get [dartx.onResize]() {
+    return html$.BodyElement.resizeEvent.forElement(this);
+  }
+  get [dartx.onScroll]() {
+    return html$.BodyElement.scrollEvent.forElement(this);
+  }
+  get [dartx.onStorage]() {
+    return html$.BodyElement.storageEvent.forElement(this);
+  }
+  get [dartx.onUnload]() {
+    return html$.BodyElement.unloadEvent.forElement(this);
+  }
+};
+dart.defineNamedConstructor(html$.BodyElement, 'created');
+html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
+dart.setSignature(html$.BodyElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.BodyElement, []),
+    new: dart.definiteFunctionType(html$.BodyElement, []),
+    created: dart.definiteFunctionType(html$.BodyElement, [])
+  }),
+  getters: () => ({
+    [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
+    [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
+    [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
+    [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
+  }),
+  sfields: () => ({
+    blurEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    focusEvent: EventStreamProviderOfEvent(),
+    hashChangeEvent: EventStreamProviderOfEvent(),
+    loadEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    offlineEvent: EventStreamProviderOfEvent(),
+    onlineEvent: EventStreamProviderOfEvent(),
+    popStateEvent: EventStreamProviderOfPopStateEvent(),
+    resizeEvent: EventStreamProviderOfEvent(),
+    scrollEvent: EventStreamProviderOfEvent(),
+    storageEvent: EventStreamProviderOfStorageEvent(),
+    unloadEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(html$.BodyElement, {
+  get blurEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('blur'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get focusEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('focus'));
+  },
+  get hashChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('load'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get offlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('offline'));
+  },
+  get onlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('online'));
+  },
+  get popStateEvent() {
+    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
+  },
+  get resizeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('resize'));
+  },
+  get scrollEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
+  },
+  get storageEvent() {
+    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
+  },
+  get unloadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('unload'));
+  }
+});
+dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'setCustomValidity',
+  'autofocus',
+  'disabled',
+  'form',
+  'formAction',
+  'formEnctype',
+  'formMethod',
+  'formNoValidate',
+  'formTarget',
+  'labels',
+  'name',
+  'type',
+  'validationMessage',
+  'validity',
+  'value',
+  'willValidate'
+]);
+html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
+  }
+  created() {
+    this[dartx.autofocus] = null;
+    this[dartx.disabled] = null;
+    this[dartx.form] = null;
+    this[dartx.formAction] = null;
+    this[dartx.formEnctype] = null;
+    this[dartx.formMethod] = null;
+    this[dartx.formNoValidate] = null;
+    this[dartx.formTarget] = null;
+    this[dartx.labels] = null;
+    this[dartx.name] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.value] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  get [dartx.autofocus]() {
+    return this.autofocus;
+  }
+  set [dartx.autofocus](value) {
+    this.autofocus = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.formAction]() {
+    return this.formAction;
+  }
+  set [dartx.formAction](value) {
+    this.formAction = value;
+  }
+  get [dartx.formEnctype]() {
+    return this.formEnctype;
+  }
+  set [dartx.formEnctype](value) {
+    this.formEnctype = value;
+  }
+  get [dartx.formMethod]() {
+    return this.formMethod;
+  }
+  set [dartx.formMethod](value) {
+    this.formMethod = value;
+  }
+  get [dartx.formNoValidate]() {
+    return this.formNoValidate;
+  }
+  set [dartx.formNoValidate](value) {
+    this.formNoValidate = value;
+  }
+  get [dartx.formTarget]() {
+    return this.formTarget;
+  }
+  set [dartx.formTarget](value) {
+    this.formTarget = value;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.ButtonElement, 'created');
+dart.setSignature(html$.ButtonElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ButtonElement, []),
+    new: dart.definiteFunctionType(html$.ButtonElement, []),
+    created: dart.definiteFunctionType(html$.ButtonElement, [])
+  }),
+  fields: () => ({
+    [dartx.autofocus]: core.bool,
+    [dartx.disabled]: core.bool,
+    [dartx.form]: html$.FormElement,
+    [dartx.formAction]: core.String,
+    [dartx.formEnctype]: core.String,
+    [dartx.formMethod]: core.String,
+    [dartx.formNoValidate]: core.bool,
+    [dartx.formTarget]: core.String,
+    [dartx.labels]: ListOfNode(),
+    [dartx.name]: core.String,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.value]: core.String,
+    [dartx.willValidate]: core.bool
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
+const _createTextNode = Symbol('_createTextNode');
+dart.defineExtensionNames([
+  'appendData',
+  'deleteData',
+  'insertData',
+  'replaceData',
+  'substringData',
+  'after',
+  'before',
+  'data',
+  'length',
+  'nextElementSibling',
+  'previousElementSibling'
+]);
+html$.CharacterData = class CharacterData extends html$.Node {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  set [dartx.data](value) {
+    this.data = value;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.appendData](...args) {
+    return this.appendData.apply(this, args);
+  }
+  [dartx.deleteData](...args) {
+    return this.deleteData.apply(this, args);
+  }
+  [dartx.insertData](...args) {
+    return this.insertData.apply(this, args);
+  }
+  [dartx.replaceData](...args) {
+    return this.replaceData.apply(this, args);
+  }
+  [dartx.substringData](...args) {
+    return this.substringData.apply(this, args);
+  }
+  [dartx.after](...args) {
+    return this.after.apply(this, args);
+  }
+  [dartx.before](...args) {
+    return this.before.apply(this, args);
+  }
+  get [dartx.nextElementSibling]() {
+    return this.nextElementSibling;
+  }
+  get [dartx.previousElementSibling]() {
+    return this.previousElementSibling;
+  }
+};
+html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
+dart.setSignature(html$.CharacterData, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
+  fields: () => ({
+    [dartx.data]: core.String,
+    [dartx.length]: core.int,
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element
+  }),
+  methods: () => ({
+    [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.deleteData]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.insertData]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
+    [dartx.replaceData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.String]),
+    [dartx.substringData]: dart.definiteFunctionType(core.String, [core.int, core.int]),
+    [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
+    [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
+  })
+});
+dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
+dart.defineExtensionNames([
+  'getDestinationInsertionPoints',
+  'splitText',
+  'wholeText'
+]);
+html$.Text = class Text extends html$.CharacterData {
+  static new(data) {
+    return html$.document[_createTextNode](data);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.wholeText]() {
+    return this.wholeText;
+  }
+  [dartx.getDestinationInsertionPoints](...args) {
+    return this.getDestinationInsertionPoints.apply(this, args);
+  }
+  [dartx.splitText](...args) {
+    return this.splitText.apply(this, args);
+  }
+};
+dart.setSignature(html$.Text, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.Text, [core.String]),
+    _: dart.definiteFunctionType(html$.Text, [])
+  }),
+  fields: () => ({[dartx.wholeText]: core.String}),
+  methods: () => ({
+    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
+    [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
+  })
+});
+dart.registerExtension(dart.global.Text, html$.Text);
+html$.CDataSection = class CDataSection extends html$.Text {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.CDataSection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
+});
+dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
+const _match_1 = Symbol('_match_1');
+const _match_2 = Symbol('_match_2');
+dart.defineExtensionNames([
+  'delete',
+  'has',
+  'keys',
+  'match',
+  'open'
+]);
+html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.delete](...args) {
+    return this.delete.apply(this, args);
+  }
+  [dartx.has](...args) {
+    return this.has.apply(this, args);
+  }
+  [dartx.keys](...args) {
+    return this.keys.apply(this, args);
+  }
+  [dartx.match](request, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_match_1](request, options_1);
+    }
+    return this[_match_2](request);
+  }
+  [_match_1](...args) {
+    return this.match.apply(this, args);
+  }
+  [_match_2](...args) {
+    return this.match.apply(this, args);
+  }
+  [dartx.open](...args) {
+    return this.open.apply(this, args);
+  }
+};
+dart.setSignature(html$.CacheStorage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
+  methods: () => ({
+    [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.keys]: dart.definiteFunctionType(async.Future, []),
+    [dartx.match]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
+    [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_match_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
+  })
+});
+dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
+const _getContext_1 = Symbol('_getContext_1');
+const _getContext_2 = Symbol('_getContext_2');
+const _toDataUrl = Symbol('_toDataUrl');
+dart.defineExtensionNames([
+  'getContext',
+  'onWebGlContextLost',
+  'onWebGlContextRestored',
+  'context2D',
+  'getContext3d',
+  'toDataUrl',
+  'height',
+  'width'
+]);
+html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(opts) {
+    let width = opts && 'width' in opts ? opts.width : null;
+    let height = opts && 'height' in opts ? opts.height : null;
+    let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
+    if (width != null) e[dartx.width] = width;
+    if (height != null) e[dartx.height] = height;
+    return e;
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.width] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  [dartx.getContext](contextId, attributes) {
+    if (attributes === void 0) attributes = null;
+    if (attributes != null) {
+      let attributes_1 = html_common.convertDartToNative_Dictionary(attributes);
+      return this[_getContext_1](contextId, attributes_1);
+    }
+    return this[_getContext_2](contextId);
+  }
+  [_getContext_1](...args) {
+    return this.getContext.apply(this, args);
+  }
+  [_getContext_2](...args) {
+    return this.getContext.apply(this, args);
+  }
+  [_toDataUrl](...args) {
+    return this.toDataURL.apply(this, args);
+  }
+  get [dartx.onWebGlContextLost]() {
+    return html$.CanvasElement.webGlContextLostEvent.forElement(this);
+  }
+  get [dartx.onWebGlContextRestored]() {
+    return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
+  }
+  get [dartx.context2D]() {
+    return this.getContext('2d');
+  }
+  [dartx.getContext3d](opts) {
+    let alpha = opts && 'alpha' in opts ? opts.alpha : true;
+    let depth = opts && 'depth' in opts ? opts.depth : true;
+    let stencil = opts && 'stencil' in opts ? opts.stencil : false;
+    let antialias = opts && 'antialias' in opts ? opts.antialias : true;
+    let premultipliedAlpha = opts && 'premultipliedAlpha' in opts ? opts.premultipliedAlpha : true;
+    let preserveDrawingBuffer = opts && 'preserveDrawingBuffer' in opts ? opts.preserveDrawingBuffer : false;
+    let options = dart.map({alpha: alpha, depth: depth, stencil: stencil, antialias: antialias, premultipliedAlpha: premultipliedAlpha, preserveDrawingBuffer: preserveDrawingBuffer}, core.String, dart.dynamic);
+    let context = this[dartx.getContext]('webgl', options);
+    if (context == null) {
+      context = this[dartx.getContext]('experimental-webgl', options);
+    }
+    return web_gl.RenderingContext._check(context);
+  }
+  [dartx.toDataUrl](type, quality) {
+    if (type === void 0) type = 'image/png';
+    if (quality === void 0) quality = null;
+    return this[_toDataUrl](type, quality);
+  }
+};
+dart.defineNamedConstructor(html$.CanvasElement, 'created');
+html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.CanvasElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.CanvasElement, []),
+    new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
+    created: dart.definiteFunctionType(html$.CanvasElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: core.int,
+    [dartx.width]: core.int
+  }),
+  getters: () => ({
+    [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
+    [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
+    [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
+  }),
+  methods: () => ({
+    [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
+    [_getContext_1]: dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic]),
+    [_getContext_2]: dart.definiteFunctionType(core.Object, [dart.dynamic]),
+    [_toDataUrl]: dart.definiteFunctionType(core.String, [core.String], [dart.dynamic]),
+    [dartx.getContext3d]: dart.definiteFunctionType(web_gl.RenderingContext, [], {alpha: dart.dynamic, depth: dart.dynamic, stencil: dart.dynamic, antialias: dart.dynamic, premultipliedAlpha: dart.dynamic, preserveDrawingBuffer: dart.dynamic}),
+    [dartx.toDataUrl]: dart.definiteFunctionType(core.String, [], [core.String, core.num])
+  }),
+  sfields: () => ({
+    webGlContextLostEvent: EventStreamProviderOfContextEvent(),
+    webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
+  })
+});
+dart.defineLazy(html$.CanvasElement, {
+  get webGlContextLostEvent() {
+    return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
+  },
+  get webGlContextRestoredEvent() {
+    return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
+  }
+});
+dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
+dart.defineExtensionNames([
+  'addColorStop'
+]);
+html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.addColorStop](...args) {
+    return this.addColorStop.apply(this, args);
+  }
+};
+dart.setSignature(html$.CanvasGradient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
+  methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
+});
+dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
+dart.defineExtensionNames([
+  'setTransform'
+]);
+html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.setTransform](...args) {
+    return this.setTransform.apply(this, args);
+  }
+};
+dart.setSignature(html$.CanvasPattern, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
+  methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
+});
+dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
+html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
+const _addHitRegion_1 = Symbol('_addHitRegion_1');
+const _addHitRegion_2 = Symbol('_addHitRegion_2');
+const _createImageData_1 = Symbol('_createImageData_1');
+const _createImageData_2 = Symbol('_createImageData_2');
+const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
+const _getImageData_1 = Symbol('_getImageData_1');
+const _getLineDash = Symbol('_getLineDash');
+const _putImageData_1 = Symbol('_putImageData_1');
+const _putImageData_2 = Symbol('_putImageData_2');
+const _arc = Symbol('_arc');
+dart.defineExtensionNames([
+  'addHitRegion',
+  'beginPath',
+  'clearHitRegions',
+  'clearRect',
+  'clip',
+  'createImageData',
+  'createLinearGradient',
+  'createPattern',
+  'createRadialGradient',
+  'drawFocusIfNeeded',
+  'fillRect',
+  'getContextAttributes',
+  'getImageData',
+  'isContextLost',
+  'isPointInPath',
+  'isPointInStroke',
+  'measureText',
+  'putImageData',
+  'removeHitRegion',
+  'resetTransform',
+  'restore',
+  'rotate',
+  'save',
+  'scale',
+  'scrollPathIntoView',
+  'setTransform',
+  'stroke',
+  'strokeRect',
+  'strokeText',
+  'transform',
+  'translate',
+  'arcTo',
+  'bezierCurveTo',
+  'closePath',
+  'ellipse',
+  'lineTo',
+  'moveTo',
+  'quadraticCurveTo',
+  'rect',
+  'createImageDataFromImageData',
+  'setFillColorRgb',
+  'setFillColorHsl',
+  'setStrokeColorRgb',
+  'setStrokeColorHsl',
+  'arc',
+  'createPatternFromImage',
+  'drawImageToRect',
+  'drawImage',
+  'drawImageScaled',
+  'drawImageScaledFromSource',
+  'lineDashOffset',
+  'lineDashOffset',
+  'getLineDash',
+  'setLineDash',
+  'fillText',
+  'fill',
+  'backingStorePixelRatio',
+  'canvas',
+  'currentTransform',
+  'direction',
+  'fillStyle',
+  'filter',
+  'font',
+  'globalAlpha',
+  'globalCompositeOperation',
+  'imageSmoothingEnabled',
+  'lineCap',
+  'lineJoin',
+  'lineWidth',
+  'miterLimit',
+  'shadowBlur',
+  'shadowColor',
+  'shadowOffsetX',
+  'shadowOffsetY',
+  'strokeStyle',
+  'textAlign',
+  'textBaseline'
+]);
+html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.canvas]() {
+    return this.canvas;
+  }
+  get [dartx.currentTransform]() {
+    return this.currentTransform;
+  }
+  set [dartx.currentTransform](value) {
+    this.currentTransform = value;
+  }
+  get [dartx.direction]() {
+    return this.direction;
+  }
+  set [dartx.direction](value) {
+    this.direction = value;
+  }
+  get [dartx.fillStyle]() {
+    return this.fillStyle;
+  }
+  set [dartx.fillStyle](value) {
+    this.fillStyle = value;
+  }
+  get [dartx.filter]() {
+    return this.filter;
+  }
+  set [dartx.filter](value) {
+    this.filter = value;
+  }
+  get [dartx.font]() {
+    return this.font;
+  }
+  set [dartx.font](value) {
+    this.font = value;
+  }
+  get [dartx.globalAlpha]() {
+    return this.globalAlpha;
+  }
+  set [dartx.globalAlpha](value) {
+    this.globalAlpha = value;
+  }
+  get [dartx.globalCompositeOperation]() {
+    return this.globalCompositeOperation;
+  }
+  set [dartx.globalCompositeOperation](value) {
+    this.globalCompositeOperation = value;
+  }
+  get [dartx.imageSmoothingEnabled]() {
+    return this.imageSmoothingEnabled;
+  }
+  set [dartx.imageSmoothingEnabled](value) {
+    this.imageSmoothingEnabled = value;
+  }
+  get [dartx.lineCap]() {
+    return this.lineCap;
+  }
+  set [dartx.lineCap](value) {
+    this.lineCap = value;
+  }
+  get [dartx.lineJoin]() {
+    return this.lineJoin;
+  }
+  set [dartx.lineJoin](value) {
+    this.lineJoin = value;
+  }
+  get [dartx.lineWidth]() {
+    return this.lineWidth;
+  }
+  set [dartx.lineWidth](value) {
+    this.lineWidth = value;
+  }
+  get [dartx.miterLimit]() {
+    return this.miterLimit;
+  }
+  set [dartx.miterLimit](value) {
+    this.miterLimit = value;
+  }
+  get [dartx.shadowBlur]() {
+    return this.shadowBlur;
+  }
+  set [dartx.shadowBlur](value) {
+    this.shadowBlur = value;
+  }
+  get [dartx.shadowColor]() {
+    return this.shadowColor;
+  }
+  set [dartx.shadowColor](value) {
+    this.shadowColor = value;
+  }
+  get [dartx.shadowOffsetX]() {
+    return this.shadowOffsetX;
+  }
+  set [dartx.shadowOffsetX](value) {
+    this.shadowOffsetX = value;
+  }
+  get [dartx.shadowOffsetY]() {
+    return this.shadowOffsetY;
+  }
+  set [dartx.shadowOffsetY](value) {
+    this.shadowOffsetY = value;
+  }
+  get [dartx.strokeStyle]() {
+    return this.strokeStyle;
+  }
+  set [dartx.strokeStyle](value) {
+    this.strokeStyle = value;
+  }
+  get [dartx.textAlign]() {
+    return this.textAlign;
+  }
+  set [dartx.textAlign](value) {
+    this.textAlign = value;
+  }
+  get [dartx.textBaseline]() {
+    return this.textBaseline;
+  }
+  set [dartx.textBaseline](value) {
+    this.textBaseline = value;
+  }
+  [dartx.addHitRegion](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[_addHitRegion_1](options_1);
+      return;
+    }
+    this[_addHitRegion_2]();
+    return;
+  }
+  [_addHitRegion_1](...args) {
+    return this.addHitRegion.apply(this, args);
+  }
+  [_addHitRegion_2](...args) {
+    return this.addHitRegion.apply(this, args);
+  }
+  [dartx.beginPath](...args) {
+    return this.beginPath.apply(this, args);
+  }
+  [dartx.clearHitRegions](...args) {
+    return this.clearHitRegions.apply(this, args);
+  }
+  [dartx.clearRect](...args) {
+    return this.clearRect.apply(this, args);
+  }
+  [dartx.clip](...args) {
+    return this.clip.apply(this, args);
+  }
+  [dartx.createImageData](imagedata_OR_sw, sh) {
+    if (sh === void 0) sh = null;
+    if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
+      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
+      return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
+    }
+    if (sh != null && typeof imagedata_OR_sw == 'number') {
+      return html_common.convertNativeToDart_ImageData(this[_createImageData_2](imagedata_OR_sw, sh));
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_createImageData_1](...args) {
+    return this.createImageData.apply(this, args);
+  }
+  [_createImageData_2](...args) {
+    return this.createImageData.apply(this, args);
+  }
+  [dartx.createLinearGradient](...args) {
+    return this.createLinearGradient.apply(this, args);
+  }
+  [dartx.createPattern](...args) {
+    return this.createPattern.apply(this, args);
+  }
+  [dartx.createRadialGradient](...args) {
+    return this.createRadialGradient.apply(this, args);
+  }
+  [dartx.drawFocusIfNeeded](...args) {
+    return this.drawFocusIfNeeded.apply(this, args);
+  }
+  [dartx.fillRect](...args) {
+    return this.fillRect.apply(this, args);
+  }
+  [dartx.getContextAttributes]() {
+    return html_common.convertNativeToDart_Dictionary(this[_getContextAttributes_1]());
+  }
+  [_getContextAttributes_1](...args) {
+    return this.getContextAttributes.apply(this, args);
+  }
+  [dartx.getImageData](sx, sy, sw, sh) {
+    return html_common.convertNativeToDart_ImageData(this[_getImageData_1](sx, sy, sw, sh));
+  }
+  [_getImageData_1](...args) {
+    return this.getImageData.apply(this, args);
+  }
+  [_getLineDash](...args) {
+    return this.getLineDash.apply(this, args);
+  }
+  [dartx.isContextLost](...args) {
+    return this.isContextLost.apply(this, args);
+  }
+  [dartx.isPointInPath](...args) {
+    return this.isPointInPath.apply(this, args);
+  }
+  [dartx.isPointInStroke](...args) {
+    return this.isPointInStroke.apply(this, args);
+  }
+  [dartx.measureText](...args) {
+    return this.measureText.apply(this, args);
+  }
+  [dartx.putImageData](imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+    if (dirtyX === void 0) dirtyX = null;
+    if (dirtyY === void 0) dirtyY = null;
+    if (dirtyWidth === void 0) dirtyWidth = null;
+    if (dirtyHeight === void 0) dirtyHeight = null;
+    if (dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
+      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
+      this[_putImageData_1](imagedata_1, dx, dy);
+      return;
+    }
+    if (dirtyHeight != null && dirtyWidth != null && dirtyY != null && dirtyX != null) {
+      let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata);
+      this[_putImageData_2](imagedata_1, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_putImageData_1](...args) {
+    return this.putImageData.apply(this, args);
+  }
+  [_putImageData_2](...args) {
+    return this.putImageData.apply(this, args);
+  }
+  [dartx.removeHitRegion](...args) {
+    return this.removeHitRegion.apply(this, args);
+  }
+  [dartx.resetTransform](...args) {
+    return this.resetTransform.apply(this, args);
+  }
+  [dartx.restore](...args) {
+    return this.restore.apply(this, args);
+  }
+  [dartx.rotate](...args) {
+    return this.rotate.apply(this, args);
+  }
+  [dartx.save](...args) {
+    return this.save.apply(this, args);
+  }
+  [dartx.scale](...args) {
+    return this.scale.apply(this, args);
+  }
+  [dartx.scrollPathIntoView](...args) {
+    return this.scrollPathIntoView.apply(this, args);
+  }
+  [dartx.setTransform](...args) {
+    return this.setTransform.apply(this, args);
+  }
+  [dartx.stroke](...args) {
+    return this.stroke.apply(this, args);
+  }
+  [dartx.strokeRect](...args) {
+    return this.strokeRect.apply(this, args);
+  }
+  [dartx.strokeText](...args) {
+    return this.strokeText.apply(this, args);
+  }
+  [dartx.transform](...args) {
+    return this.transform.apply(this, args);
+  }
+  [dartx.translate](...args) {
+    return this.translate.apply(this, args);
+  }
+  [_arc](...args) {
+    return this.arc.apply(this, args);
+  }
+  [dartx.arcTo](...args) {
+    return this.arcTo.apply(this, args);
+  }
+  [dartx.bezierCurveTo](...args) {
+    return this.bezierCurveTo.apply(this, args);
+  }
+  [dartx.closePath](...args) {
+    return this.closePath.apply(this, args);
+  }
+  [dartx.ellipse](...args) {
+    return this.ellipse.apply(this, args);
+  }
+  [dartx.lineTo](...args) {
+    return this.lineTo.apply(this, args);
+  }
+  [dartx.moveTo](...args) {
+    return this.moveTo.apply(this, args);
+  }
+  [dartx.quadraticCurveTo](...args) {
+    return this.quadraticCurveTo.apply(this, args);
+  }
+  [dartx.rect](...args) {
+    return this.rect.apply(this, args);
+  }
+  [dartx.createImageDataFromImageData](imagedata) {
+    return this.createImageData(imagedata);
+  }
+  [dartx.setFillColorRgb](r, g, b, a) {
+    if (a === void 0) a = 1;
+    this[dartx.fillStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
+  }
+  [dartx.setFillColorHsl](h, s, l, a) {
+    if (a === void 0) a = 1;
+    this[dartx.fillStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
+  }
+  [dartx.setStrokeColorRgb](r, g, b, a) {
+    if (a === void 0) a = 1;
+    this[dartx.strokeStyle] = dart.str`rgba(${r}, ${g}, ${b}, ${a})`;
+  }
+  [dartx.setStrokeColorHsl](h, s, l, a) {
+    if (a === void 0) a = 1;
+    this[dartx.strokeStyle] = dart.str`hsla(${h}, ${s}%, ${l}%, ${a})`;
+  }
+  [dartx.arc](x, y, radius, startAngle, endAngle, anticlockwise) {
+    if (anticlockwise === void 0) anticlockwise = false;
+    this.arc(x, y, radius, startAngle, endAngle, anticlockwise);
+  }
+  [dartx.createPatternFromImage](image, repetitionType) {
+    return this.createPattern(image, repetitionType);
+  }
+  [dartx.drawImageToRect](source, destRect, opts) {
+    let sourceRect = opts && 'sourceRect' in opts ? opts.sourceRect : null;
+    if (sourceRect == null) {
+      this[dartx.drawImageScaled](source, destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
+    } else {
+      this[dartx.drawImageScaledFromSource](source, sourceRect[dartx.left], sourceRect[dartx.top], sourceRect[dartx.width], sourceRect[dartx.height], destRect[dartx.left], destRect[dartx.top], destRect[dartx.width], destRect[dartx.height]);
+    }
+  }
+  [dartx.drawImage](...args) {
+    return this.drawImage.apply(this, args);
+  }
+  [dartx.drawImageScaled](...args) {
+    return this.drawImage.apply(this, args);
+  }
+  [dartx.drawImageScaledFromSource](...args) {
+    return this.drawImage.apply(this, args);
+  }
+  get [dartx.lineDashOffset]() {
+    return this.lineDashOffset || this.webkitLineDashOffset;
+  }
+  set [dartx.lineDashOffset](value) {
+    typeof this.lineDashOffset != "undefined" ? this.lineDashOffset = value : this.webkitLineDashOffset = value;
+  }
+  [dartx.getLineDash]() {
+    if (!!this.getLineDash) {
+      return this.getLineDash();
+    } else if (!!this.webkitLineDash) {
+      return this.webkitLineDash;
+    }
+  }
+  [dartx.setLineDash](dash) {
+    if (!!this.setLineDash) {
+      this.setLineDash(dash);
+    } else if (!!this.webkitLineDash) {
+      this.webkitLineDash = dash;
+    }
+  }
+  [dartx.fillText](text, x, y, maxWidth) {
+    if (maxWidth === void 0) maxWidth = null;
+    if (maxWidth != null) {
+      this.fillText(text, x, y, maxWidth);
+    } else {
+      this.fillText(text, x, y);
+    }
+  }
+  [dartx.fill](winding) {
+    if (winding === void 0) winding = 'nonzero';
+    this.fill(winding);
+  }
+  get [dartx.backingStorePixelRatio]() {
+    return 1.0;
+  }
+};
+html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
+dart.setSignature(html$.CanvasRenderingContext2D, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
+  fields: () => ({
+    [dartx.canvas]: html$.CanvasElement,
+    [dartx.currentTransform]: svg$.Matrix,
+    [dartx.direction]: core.String,
+    [dartx.fillStyle]: core.Object,
+    [dartx.filter]: core.String,
+    [dartx.font]: core.String,
+    [dartx.globalAlpha]: core.num,
+    [dartx.globalCompositeOperation]: core.String,
+    [dartx.imageSmoothingEnabled]: core.bool,
+    [dartx.lineCap]: core.String,
+    [dartx.lineJoin]: core.String,
+    [dartx.lineWidth]: core.num,
+    [dartx.miterLimit]: core.num,
+    [dartx.shadowBlur]: core.num,
+    [dartx.shadowColor]: core.String,
+    [dartx.shadowOffsetX]: core.num,
+    [dartx.shadowOffsetY]: core.num,
+    [dartx.strokeStyle]: core.Object,
+    [dartx.textAlign]: core.String,
+    [dartx.textBaseline]: core.String
+  }),
+  getters: () => ({
+    [dartx.lineDashOffset]: dart.definiteFunctionType(core.num, []),
+    [dartx.backingStorePixelRatio]: dart.definiteFunctionType(core.double, [])
+  }),
+  setters: () => ({[dartx.lineDashOffset]: dart.definiteFunctionType(dart.void, [core.num])}),
+  methods: () => ({
+    [dartx.addHitRegion]: dart.definiteFunctionType(dart.void, [], [core.Map]),
+    [_addHitRegion_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_addHitRegion_2]: dart.definiteFunctionType(dart.void, []),
+    [dartx.beginPath]: dart.definiteFunctionType(dart.void, []),
+    [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
+    [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
+    [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
+    [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
+    [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
+    [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
+    [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
+    [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
+    [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
+    [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
+    [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
+    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
+    [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
+    [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
+    [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.resetTransform]: dart.definiteFunctionType(dart.void, []),
+    [dartx.restore]: dart.definiteFunctionType(dart.void, []),
+    [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.save]: dart.definiteFunctionType(dart.void, []),
+    [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
+    [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
+    [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
+    [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.translate]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [_arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
+    [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
+    [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
+    [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
+    [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
+    [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
+    [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
+    [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
+    [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
+    [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
+    [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
+    [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
+    [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
+    [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
+    [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
+    [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
+    [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
+  })
+});
+dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
+html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.ChildNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
+});
+html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.ChromiumValuebuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
+});
+dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
+dart.defineExtensionNames([
+  'id'
+]);
+html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+};
+dart.setSignature(html$.GeofencingRegion, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
+  fields: () => ({[dartx.id]: core.String})
+});
+dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
+dart.defineExtensionNames([
+  'latitude',
+  'longitude',
+  'radius'
+]);
+html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(init) {
+    let init_1 = html_common.convertDartToNative_Dictionary(init);
+    return html$.CircularGeofencingRegion._create_1(init_1);
+  }
+  static _create_1(init) {
+    return new self.CircularGeofencingRegion(init);
+  }
+  get [dartx.latitude]() {
+    return this.latitude;
+  }
+  get [dartx.longitude]() {
+    return this.longitude;
+  }
+  get [dartx.radius]() {
+    return this.radius;
+  }
+};
+dart.setSignature(html$.CircularGeofencingRegion, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
+    new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
+  }),
+  fields: () => ({
+    [dartx.latitude]: core.double,
+    [dartx.longitude]: core.double,
+    [dartx.radius]: core.double
+  }),
+  sfields: () => ({
+    MAX_RADIUS: core.num,
+    MIN_RADIUS: core.num
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
+  names: ['_create_1']
+});
+html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
+html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
+dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
+const _postMessage_1 = Symbol('_postMessage_1');
+const _postMessage_2 = Symbol('_postMessage_2');
+dart.defineExtensionNames([
+  'postMessage',
+  'frameType',
+  'id',
+  'url'
+]);
+html$.Client = class Client extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.frameType]() {
+    return this.frameType;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+};
+dart.setSignature(html$.Client, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
+  fields: () => ({
+    [dartx.frameType]: core.String,
+    [dartx.id]: core.String,
+    [dartx.url]: core.String
+  }),
+  methods: () => ({
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.Client, html$.Client);
+const _matchAll_1 = Symbol('_matchAll_1');
+const _matchAll_2 = Symbol('_matchAll_2');
+dart.defineExtensionNames([
+  'claim',
+  'matchAll',
+  'openWindow'
+]);
+html$.Clients = class Clients extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.claim](...args) {
+    return this.claim.apply(this, args);
+  }
+  [dartx.matchAll](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_matchAll_1](options_1);
+    }
+    return this[_matchAll_2]();
+  }
+  [_matchAll_1](...args) {
+    return this.matchAll.apply(this, args);
+  }
+  [_matchAll_2](...args) {
+    return this.matchAll.apply(this, args);
+  }
+  [dartx.openWindow](...args) {
+    return this.openWindow.apply(this, args);
+  }
+};
+dart.setSignature(html$.Clients, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
+  methods: () => ({
+    [dartx.claim]: dart.definiteFunctionType(async.Future, []),
+    [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_matchAll_2]: dart.definiteFunctionType(async.Future, []),
+    [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
+  })
+});
+dart.registerExtension(dart.global.Clients, html$.Clients);
+dart.defineExtensionNames([
+  'clipboardData'
+]);
+html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.clipboardData]() {
+    return this.clipboardData;
+  }
+};
+dart.setSignature(html$.ClipboardEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
+  fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
+});
+dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
+dart.defineExtensionNames([
+  'code',
+  'reason',
+  'wasClean'
+]);
+html$.CloseEvent = class CloseEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.CloseEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.CloseEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.CloseEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.CloseEvent(type);
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+  get [dartx.reason]() {
+    return this.reason;
+  }
+  get [dartx.wasClean]() {
+    return this.wasClean;
+  }
+};
+dart.setSignature(html$.CloseEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.CloseEvent, []),
+    new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.code]: core.int,
+    [dartx.reason]: core.String,
+    [dartx.wasClean]: core.bool
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
+html$.Comment = class Comment extends html$.CharacterData {
+  static new(data) {
+    if (data === void 0) data = null;
+    if (data != null) {
+      return html$.document.createComment(data);
+    }
+    return html$.document.createComment("");
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.Comment, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
+    _: dart.definiteFunctionType(html$.Comment, [])
+  })
+});
+dart.registerExtension(dart.global.Comment, html$.Comment);
+const _initCompositionEvent = Symbol('_initCompositionEvent');
+const _initUIEvent = Symbol('_initUIEvent');
+const _charCode = Symbol('_charCode');
+const _keyCode = Symbol('_keyCode');
+const _get_view = Symbol('_get_view');
+const _which = Symbol('_which');
+dart.defineExtensionNames([
+  'view',
+  'detail',
+  'sourceDevice'
+]);
+html$.UIEvent = class UIEvent extends html$.Event {
+  static new(type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let detail = opts && 'detail' in opts ? opts.detail : 0;
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    if (view == null) {
+      view = html$.window;
+    }
+    let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
+    e[_initUIEvent](type, canBubble, cancelable, view, detail);
+    return e;
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.UIEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.UIEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.UIEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.UIEvent(type);
+  }
+  get [_charCode]() {
+    return this.charCode;
+  }
+  get [dartx.detail]() {
+    return this.detail;
+  }
+  get [_keyCode]() {
+    return this.keyCode;
+  }
+  get [dartx.sourceDevice]() {
+    return this.sourceDevice;
+  }
+  get [dartx.view]() {
+    return html$._convertNativeToDart_Window(this[_get_view]);
+  }
+  get [_get_view]() {
+    return this.view;
+  }
+  get [_which]() {
+    return this.which;
+  }
+  [_initUIEvent](...args) {
+    return this.initUIEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.UIEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
+    _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_charCode]: core.int,
+    [dartx.detail]: core.int,
+    [_keyCode]: core.int,
+    [dartx.sourceDevice]: html$.InputDevice,
+    [_get_view]: dart.dynamic,
+    [_which]: core.int
+  }),
+  getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
+  methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
+dart.defineExtensionNames([
+  'data'
+]);
+html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
+    let view = opts && 'view' in opts ? opts.view : null;
+    let data = opts && 'data' in opts ? opts.data : null;
+    let locale = opts && 'locale' in opts ? opts.locale : null;
+    if (view == null) {
+      view = html$.window;
+    }
+    let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
+    if (dart.test(html_common.Device.isFirefox)) {
+      e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
+    } else {
+      e[_initCompositionEvent](type, canBubble, cancelable, view, data);
+    }
+    return e;
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.CompositionEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.CompositionEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.CompositionEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.CompositionEvent(type);
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  [_initCompositionEvent](...args) {
+    return this.initCompositionEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.CompositionEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
+    _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.data]: core.String}),
+  methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
+dart.defineExtensionNames([
+  'disconnect',
+  'supports',
+  'opacity',
+  'scrollLeft',
+  'scrollTop',
+  'transform'
+]);
+html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(element, attributeArray) {
+    return html$.CompositorProxy._create_1(element, attributeArray);
+  }
+  static _create_1(element, attributeArray) {
+    return new self.CompositorProxy(element, attributeArray);
+  }
+  get [dartx.opacity]() {
+    return this.opacity;
+  }
+  set [dartx.opacity](value) {
+    this.opacity = value;
+  }
+  get [dartx.scrollLeft]() {
+    return this.scrollLeft;
+  }
+  set [dartx.scrollLeft](value) {
+    this.scrollLeft = value;
+  }
+  get [dartx.scrollTop]() {
+    return this.scrollTop;
+  }
+  set [dartx.scrollTop](value) {
+    this.scrollTop = value;
+  }
+  get [dartx.transform]() {
+    return this.transform;
+  }
+  set [dartx.transform](value) {
+    this.transform = value;
+  }
+  [dartx.disconnect](...args) {
+    return this.disconnect.apply(this, args);
+  }
+  [dartx.supports](...args) {
+    return this.supports.apply(this, args);
+  }
+};
+dart.setSignature(html$.CompositorProxy, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.CompositorProxy, []),
+    new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
+  }),
+  fields: () => ({
+    [dartx.opacity]: core.num,
+    [dartx.scrollLeft]: core.num,
+    [dartx.scrollTop]: core.num,
+    [dartx.transform]: html$.DomMatrix
+  }),
+  methods: () => ({
+    [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
+    [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
+dart.defineExtensionNames([
+  'postMessage',
+  'terminate',
+  'onError',
+  'onMessage'
+]);
+html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(scriptUrl) {
+    return html$.CompositorWorker._create_1(scriptUrl);
+  }
+  static _create_1(scriptUrl) {
+    return new self.CompositorWorker(scriptUrl);
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [dartx.terminate](...args) {
+    return this.terminate.apply(this, args);
+  }
+  get [dartx.onError]() {
+    return html$.CompositorWorker.errorEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.CompositorWorker.messageEvent.forTarget(this);
+  }
+};
+html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.CompositorWorker, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.CompositorWorker, []),
+    new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
+  }),
+  getters: () => ({
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
+  }),
+  methods: () => ({
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    errorEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent()
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.defineLazy(html$.CompositorWorker, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
+const _fetch_1 = Symbol('_fetch_1');
+const _fetch_2 = Symbol('_fetch_2');
+const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
+const _webkitResolveLocalFileSystemUrl = Symbol('_webkitResolveLocalFileSystemUrl');
+const _setInterval_String = Symbol('_setInterval_String');
+const _setTimeout_String = Symbol('_setTimeout_String');
+const _clearInterval = Symbol('_clearInterval');
+const _clearTimeout = Symbol('_clearTimeout');
+const _setInterval = Symbol('_setInterval');
+const _setTimeout = Symbol('_setTimeout');
+dart.defineExtensionNames([
+  'close',
+  'fetch',
+  'importScripts',
+  'webkitRequestFileSystem',
+  'requestFileSystemSync',
+  'resolveLocalFileSystemSyncUrl',
+  'webkitResolveLocalFileSystemUrl',
+  'atob',
+  'btoa',
+  'onError',
+  'caches',
+  'console',
+  'crypto',
+  'indexedDB',
+  'location',
+  'navigator',
+  'performance',
+  'self'
+]);
+html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.caches]() {
+    return this.caches;
+  }
+  get [dartx.console]() {
+    return this.console;
+  }
+  get [dartx.crypto]() {
+    return this.crypto;
+  }
+  get [dartx.indexedDB]() {
+    return this.indexedDB;
+  }
+  get [dartx.location]() {
+    return this.location;
+  }
+  get [dartx.navigator]() {
+    return this.navigator;
+  }
+  get [dartx.performance]() {
+    return this.performance;
+  }
+  get [dartx.self]() {
+    return this.self;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.fetch](input, init) {
+    if (init === void 0) init = null;
+    if (init != null) {
+      let init_1 = html_common.convertDartToNative_Dictionary(init);
+      return this[_fetch_1](input, init_1);
+    }
+    return this[_fetch_2](input);
+  }
+  [_fetch_1](...args) {
+    return this.fetch.apply(this, args);
+  }
+  [_fetch_2](...args) {
+    return this.fetch.apply(this, args);
+  }
+  [dartx.importScripts](...args) {
+    return this.importScripts.apply(this, args);
+  }
+  [_webkitRequestFileSystem](...args) {
+    return this.webkitRequestFileSystem.apply(this, args);
+  }
+  [dartx.webkitRequestFileSystem](type, size) {
+    let completer = CompleterOfFileSystem().new();
+    this[_webkitRequestFileSystem](type, size, dart.fn(value => {
+      completer.complete(value);
+    }, FileSystemToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [dartx.requestFileSystemSync](...args) {
+    return this.webkitRequestFileSystemSync.apply(this, args);
+  }
+  [dartx.resolveLocalFileSystemSyncUrl](...args) {
+    return this.webkitResolveLocalFileSystemSyncURL.apply(this, args);
+  }
+  [_webkitResolveLocalFileSystemUrl](...args) {
+    return this.webkitResolveLocalFileSystemURL.apply(this, args);
+  }
+  [dartx.webkitResolveLocalFileSystemUrl](url) {
+    let completer = CompleterOfEntry().new();
+    this[_webkitResolveLocalFileSystemUrl](url, dart.fn(value => {
+      completer.complete(value);
+    }, EntryToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [dartx.atob](...args) {
+    return this.atob.apply(this, args);
+  }
+  [dartx.btoa](...args) {
+    return this.btoa.apply(this, args);
+  }
+  [_setInterval_String](...args) {
+    return this.setInterval.apply(this, args);
+  }
+  [_setTimeout_String](...args) {
+    return this.setTimeout.apply(this, args);
+  }
+  [_clearInterval](...args) {
+    return this.clearInterval.apply(this, args);
+  }
+  [_clearTimeout](...args) {
+    return this.clearTimeout.apply(this, args);
+  }
+  [_setInterval](...args) {
+    return this.setInterval.apply(this, args);
+  }
+  [_setTimeout](...args) {
+    return this.setTimeout.apply(this, args);
+  }
+  get [dartx.onError]() {
+    return html$.WorkerGlobalScope.errorEvent.forTarget(this);
+  }
+};
+html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
+dart.setSignature(html$.WorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
+  fields: () => ({
+    [dartx.caches]: html$.CacheStorage,
+    [dartx.console]: html$.WorkerConsole,
+    [dartx.crypto]: html$.Crypto,
+    [dartx.indexedDB]: indexed_db.IdbFactory,
+    [dartx.location]: html$._WorkerLocation,
+    [dartx.navigator]: html$._WorkerNavigator,
+    [dartx.performance]: html$.WorkerPerformance,
+    [dartx.self]: html$.WorkerGlobalScope
+  }),
+  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
+    [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
+    [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
+    [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
+    [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
+    [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
+    [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
+    [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
+    [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
+    [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+    [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int])
+  }),
+  sfields: () => ({
+    errorEvent: EventStreamProviderOfEvent(),
+    PERSISTENT: core.int,
+    TEMPORARY: core.int
+  })
+});
+html$.WorkerGlobalScope.PERSISTENT = 1;
+html$.WorkerGlobalScope.TEMPORARY = 0;
+dart.defineLazy(html$.WorkerGlobalScope, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  }
+});
+dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
+dart.defineExtensionNames([
+  'cancelAnimationFrame',
+  'postMessage',
+  'requestAnimationFrame',
+  'onMessage'
+]);
+html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.cancelAnimationFrame](...args) {
+    return this.cancelAnimationFrame.apply(this, args);
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [dartx.requestAnimationFrame](...args) {
+    return this.requestAnimationFrame.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.CompositorWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.CompositorWorkerGlobalScope, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
+const _isConsoleDefined = Symbol('_isConsoleDefined');
+html$.Console = class Console extends core.Object {
+  _safe() {
+  }
+  get [_isConsoleDefined]() {
+    return typeof console != "undefined";
+  }
+  get memory() {
+    return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
+  }
+  assertCondition(condition, arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
+  }
+  clear(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.clear(arg) : null;
+  }
+  count(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.count(arg) : null;
+  }
+  debug(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.debug(arg) : null;
+  }
+  dir(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.dir(arg) : null;
+  }
+  dirxml(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.dirxml(arg) : null;
+  }
+  error(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.error(arg) : null;
+  }
+  group(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.group(arg) : null;
+  }
+  groupCollapsed(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.groupCollapsed(arg) : null;
+  }
+  groupEnd() {
+    return dart.test(this[_isConsoleDefined]) ? console.groupEnd() : null;
+  }
+  info(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.info(arg) : null;
+  }
+  log(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.log(arg) : null;
+  }
+  markTimeline(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.markTimeline(arg) : null;
+  }
+  profile(title) {
+    return dart.test(this[_isConsoleDefined]) ? console.profile(title) : null;
+  }
+  profileEnd(title) {
+    return dart.test(this[_isConsoleDefined]) ? console.profileEnd(title) : null;
+  }
+  table(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.table(arg) : null;
+  }
+  time(title) {
+    return dart.test(this[_isConsoleDefined]) ? console.time(title) : null;
+  }
+  timeEnd(title) {
+    return dart.test(this[_isConsoleDefined]) ? console.timeEnd(title) : null;
+  }
+  timeStamp(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.timeStamp(arg) : null;
+  }
+  trace(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.trace(arg) : null;
+  }
+  warn(arg) {
+    return dart.test(this[_isConsoleDefined]) ? console.warn(arg) : null;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.defineNamedConstructor(html$.Console, '_safe');
+dart.setSignature(html$.Console, {
+  constructors: () => ({
+    _safe: dart.definiteFunctionType(html$.Console, []),
+    _: dart.definiteFunctionType(html$.Console, [])
+  }),
+  getters: () => ({
+    [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
+    memory: dart.definiteFunctionType(html$.MemoryInfo, [])
+  }),
+  methods: () => ({
+    assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
+    clear: dart.definiteFunctionType(dart.void, [core.Object]),
+    count: dart.definiteFunctionType(dart.void, [core.Object]),
+    debug: dart.definiteFunctionType(dart.void, [core.Object]),
+    dir: dart.definiteFunctionType(dart.void, [core.Object]),
+    dirxml: dart.definiteFunctionType(dart.void, [core.Object]),
+    error: dart.definiteFunctionType(dart.void, [core.Object]),
+    group: dart.definiteFunctionType(dart.void, [core.Object]),
+    groupCollapsed: dart.definiteFunctionType(dart.void, [core.Object]),
+    groupEnd: dart.definiteFunctionType(dart.void, []),
+    info: dart.definiteFunctionType(dart.void, [core.Object]),
+    log: dart.definiteFunctionType(dart.void, [core.Object]),
+    markTimeline: dart.definiteFunctionType(dart.void, [core.Object]),
+    profile: dart.definiteFunctionType(dart.void, [core.String]),
+    profileEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    table: dart.definiteFunctionType(dart.void, [core.Object]),
+    time: dart.definiteFunctionType(dart.void, [core.String]),
+    timeEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    timeStamp: dart.definiteFunctionType(dart.void, [core.Object]),
+    trace: dart.definiteFunctionType(dart.void, [core.Object]),
+    warn: dart.definiteFunctionType(dart.void, [core.Object])
+  }),
+  sfields: () => ({_safeConsole: html$.Console})
+});
+dart.defineLazy(html$.Console, {
+  get _safeConsole() {
+    return dart.const(new html$.Console._safe());
+  }
+});
+dart.defineExtensionNames([
+  'assertCondition',
+  'timeline',
+  'timelineEnd'
+]);
+html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.assertCondition](...args) {
+    return this.assert.apply(this, args);
+  }
+  [dartx.timeline](...args) {
+    return this.timeline.apply(this, args);
+  }
+  [dartx.timelineEnd](...args) {
+    return this.timelineEnd.apply(this, args);
+  }
+};
+dart.setSignature(html$.ConsoleBase, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
+  methods: () => ({
+    [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
+    [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
+dart.defineExtensionNames([
+  'getDistributedNodes',
+  'select'
+]);
+html$.ContentElement = class ContentElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
+  }
+  created() {
+    this[dartx.select] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('content');
+  }
+  get [dartx.select]() {
+    return this.select;
+  }
+  set [dartx.select](value) {
+    this.select = value;
+  }
+  [dartx.getDistributedNodes](...args) {
+    return this.getDistributedNodes.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.ContentElement, 'created');
+dart.setSignature(html$.ContentElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ContentElement, []),
+    new: dart.definiteFunctionType(html$.ContentElement, []),
+    created: dart.definiteFunctionType(html$.ContentElement, [])
+  }),
+  fields: () => ({[dartx.select]: core.String}),
+  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
+dart.defineExtensionNames([
+  'accuracy',
+  'altitude',
+  'altitudeAccuracy',
+  'heading',
+  'latitude',
+  'longitude',
+  'speed'
+]);
+html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.accuracy]() {
+    return this.accuracy;
+  }
+  get [dartx.altitude]() {
+    return this.altitude;
+  }
+  get [dartx.altitudeAccuracy]() {
+    return this.altitudeAccuracy;
+  }
+  get [dartx.heading]() {
+    return this.heading;
+  }
+  get [dartx.latitude]() {
+    return this.latitude;
+  }
+  get [dartx.longitude]() {
+    return this.longitude;
+  }
+  get [dartx.speed]() {
+    return this.speed;
+  }
+};
+dart.setSignature(html$.Coordinates, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
+  fields: () => ({
+    [dartx.accuracy]: core.double,
+    [dartx.altitude]: core.double,
+    [dartx.altitudeAccuracy]: core.double,
+    [dartx.heading]: core.double,
+    [dartx.latitude]: core.double,
+    [dartx.longitude]: core.double,
+    [dartx.speed]: core.double
+  })
+});
+dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
+dart.defineExtensionNames([
+  'iconUrl',
+  'id',
+  'name',
+  'type'
+]);
+html$.Credential = class Credential extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.iconUrl]() {
+    return this.iconURL;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.Credential, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
+  fields: () => ({
+    [dartx.iconUrl]: core.String,
+    [dartx.id]: core.String,
+    [dartx.name]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.Credential, html$.Credential);
+const _request_1 = Symbol('_request_1');
+const _request_2 = Symbol('_request_2');
+dart.defineExtensionNames([
+  'notifySignedIn',
+  'request',
+  'requireUserMediation'
+]);
+html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.notifySignedIn](...args) {
+    return this.notifySignedIn.apply(this, args);
+  }
+  [dartx.request](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_request_1](options_1);
+    }
+    return this[_request_2]();
+  }
+  [_request_1](...args) {
+    return this.request.apply(this, args);
+  }
+  [_request_2](...args) {
+    return this.request.apply(this, args);
+  }
+  [dartx.requireUserMediation](...args) {
+    return this.requireUserMediation.apply(this, args);
+  }
+};
+dart.setSignature(html$.CredentialsContainer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
+  methods: () => ({
+    [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
+    [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_request_2]: dart.definiteFunctionType(async.Future, []),
+    [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
+dart.defineExtensionNames([
+  'acceptConnection',
+  'client'
+]);
+html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.client]() {
+    return this.client;
+  }
+  [dartx.acceptConnection](...args) {
+    return this.acceptConnection.apply(this, args);
+  }
+};
+dart.setSignature(html$.CrossOriginConnectEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
+  fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
+  methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
+});
+dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
+dart.defineExtensionNames([
+  'postMessage',
+  'origin',
+  'targetUrl'
+]);
+html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.targetUrl]() {
+    return this.targetUrl;
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+};
+dart.setSignature(html$.CrossOriginServiceWorkerClient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
+  fields: () => ({
+    [dartx.origin]: core.String,
+    [dartx.targetUrl]: core.String
+  }),
+  methods: () => ({
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
+const _getRandomValues = Symbol('_getRandomValues');
+dart.defineExtensionNames([
+  'getRandomValues',
+  'subtle'
+]);
+html$.Crypto = class Crypto extends _interceptors.Interceptor {
+  [dartx.getRandomValues](array) {
+    return this[_getRandomValues](array);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!(window.crypto && window.crypto.getRandomValues);
+  }
+  get [dartx.subtle]() {
+    return this.subtle;
+  }
+  [_getRandomValues](...args) {
+    return this.getRandomValues.apply(this, args);
+  }
+};
+dart.setSignature(html$.Crypto, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
+  fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
+  methods: () => ({
+    [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
+    [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.Crypto, html$.Crypto);
+dart.defineExtensionNames([
+  'algorithm',
+  'extractable',
+  'type',
+  'usages'
+]);
+html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.algorithm]() {
+    return this.algorithm;
+  }
+  get [dartx.extractable]() {
+    return this.extractable;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.usages]() {
+    return this.usages;
+  }
+};
+dart.setSignature(html$.CryptoKey, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
+  fields: () => ({
+    [dartx.algorithm]: core.Object,
+    [dartx.extractable]: core.bool,
+    [dartx.type]: core.String,
+    [dartx.usages]: ListOfString()
+  })
+});
+dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
+html$.Css = class Css extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.Css, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
+  statics: () => ({
+    supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
+    supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  names: ['supports', 'supportsCondition']
+});
+dart.registerExtension(dart.global.CSS, html$.Css);
+dart.defineExtensionNames([
+  'cssText',
+  'parentRule',
+  'parentStyleSheet',
+  'type'
+]);
+html$.CssRule = class CssRule extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cssText]() {
+    return this.cssText;
+  }
+  set [dartx.cssText](value) {
+    this.cssText = value;
+  }
+  get [dartx.parentRule]() {
+    return this.parentRule;
+  }
+  get [dartx.parentStyleSheet]() {
+    return this.parentStyleSheet;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.CssRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
+  fields: () => ({
+    [dartx.cssText]: core.String,
+    [dartx.parentRule]: html$.CssRule,
+    [dartx.parentStyleSheet]: html$.CssStyleSheet,
+    [dartx.type]: core.int
+  }),
+  sfields: () => ({
+    CHARSET_RULE: core.int,
+    FONT_FACE_RULE: core.int,
+    IMPORT_RULE: core.int,
+    KEYFRAMES_RULE: core.int,
+    KEYFRAME_RULE: core.int,
+    MEDIA_RULE: core.int,
+    PAGE_RULE: core.int,
+    STYLE_RULE: core.int,
+    SUPPORTS_RULE: core.int,
+    VIEWPORT_RULE: core.int,
+    WEBKIT_KEYFRAMES_RULE: core.int,
+    WEBKIT_KEYFRAME_RULE: core.int
+  })
+});
+html$.CssRule.CHARSET_RULE = 2;
+html$.CssRule.FONT_FACE_RULE = 5;
+html$.CssRule.IMPORT_RULE = 3;
+html$.CssRule.KEYFRAMES_RULE = 7;
+html$.CssRule.KEYFRAME_RULE = 8;
+html$.CssRule.MEDIA_RULE = 4;
+html$.CssRule.PAGE_RULE = 6;
+html$.CssRule.STYLE_RULE = 1;
+html$.CssRule.SUPPORTS_RULE = 12;
+html$.CssRule.VIEWPORT_RULE = 15;
+html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
+html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
+dart.registerExtension(dart.global.CSSRule, html$.CssRule);
+dart.defineExtensionNames([
+  'encoding'
+]);
+html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.encoding]() {
+    return this.encoding;
+  }
+  set [dartx.encoding](value) {
+    this.encoding = value;
+  }
+};
+dart.setSignature(html$.CssCharsetRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
+  fields: () => ({[dartx.encoding]: core.String})
+});
+dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
+dart.defineExtensionNames([
+  'style'
+]);
+html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+};
+dart.setSignature(html$.CssFontFaceRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
+  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
+});
+dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
+dart.defineExtensionNames([
+  'deleteRule',
+  'insertRule',
+  'cssRules'
+]);
+html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cssRules]() {
+    return this.cssRules;
+  }
+  [dartx.deleteRule](...args) {
+    return this.deleteRule.apply(this, args);
+  }
+  [dartx.insertRule](...args) {
+    return this.insertRule.apply(this, args);
+  }
+};
+dart.setSignature(html$.CssGroupingRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
+  fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
+  methods: () => ({
+    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
+  })
+});
+dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
+dart.defineExtensionNames([
+  'href',
+  'media',
+  'styleSheet'
+]);
+html$.CssImportRule = class CssImportRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  get [dartx.styleSheet]() {
+    return this.styleSheet;
+  }
+};
+dart.setSignature(html$.CssImportRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
+  fields: () => ({
+    [dartx.href]: core.String,
+    [dartx.media]: html$.MediaList,
+    [dartx.styleSheet]: html$.CssStyleSheet
+  })
+});
+dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
+dart.defineExtensionNames([
+  'keyText',
+  'style'
+]);
+html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.keyText]() {
+    return this.keyText;
+  }
+  set [dartx.keyText](value) {
+    this.keyText = value;
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+};
+dart.setSignature(html$.CssKeyframeRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
+  fields: () => ({
+    [dartx.keyText]: core.String,
+    [dartx.style]: html$.CssStyleDeclaration
+  })
+});
+dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
+dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
+dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
+dart.defineExtensionNames([
+  'appendRule',
+  'deleteRule',
+  'findRule',
+  'cssRules',
+  'name'
+]);
+html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cssRules]() {
+    return this.cssRules;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.appendRule](...args) {
+    return this.appendRule.apply(this, args);
+  }
+  [dartx.deleteRule](...args) {
+    return this.deleteRule.apply(this, args);
+  }
+  [dartx.findRule](...args) {
+    return this.findRule.apply(this, args);
+  }
+};
+dart.setSignature(html$.CssKeyframesRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
+  fields: () => ({
+    [dartx.cssRules]: ListOfCssRule(),
+    [dartx.name]: core.String
+  }),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
+    [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
+  })
+});
+dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
+dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
+dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
+dart.defineExtensionNames([
+  'media'
+]);
+html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+};
+dart.setSignature(html$.CssMediaRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
+  fields: () => ({[dartx.media]: html$.MediaList})
+});
+dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
+dart.defineExtensionNames([
+  'selectorText',
+  'style'
+]);
+html$.CssPageRule = class CssPageRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.selectorText]() {
+    return this.selectorText;
+  }
+  set [dartx.selectorText](value) {
+    this.selectorText = value;
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+};
+dart.setSignature(html$.CssPageRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
+  fields: () => ({
+    [dartx.selectorText]: core.String,
+    [dartx.style]: html$.CssStyleDeclaration
+  })
+});
+dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
+const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
+const _supportsProperty = Symbol('_supportsProperty');
+const _getPropertyValue = Symbol('_getPropertyValue');
+const _setPropertyHelper = Symbol('_setPropertyHelper');
+const _browserPropertyName = Symbol('_browserPropertyName');
+const _background = Symbol('_background');
+const _backgroundAttachment = Symbol('_backgroundAttachment');
+const _backgroundColor = Symbol('_backgroundColor');
+const _backgroundImage = Symbol('_backgroundImage');
+const _backgroundPosition = Symbol('_backgroundPosition');
+const _backgroundRepeat = Symbol('_backgroundRepeat');
+const _border = Symbol('_border');
+const _borderBottom = Symbol('_borderBottom');
+const _borderBottomColor = Symbol('_borderBottomColor');
+const _borderBottomStyle = Symbol('_borderBottomStyle');
+const _borderBottomWidth = Symbol('_borderBottomWidth');
+const _borderCollapse = Symbol('_borderCollapse');
+const _borderColor = Symbol('_borderColor');
+const _borderLeft = Symbol('_borderLeft');
+const _borderLeftColor = Symbol('_borderLeftColor');
+const _borderLeftStyle = Symbol('_borderLeftStyle');
+const _borderLeftWidth = Symbol('_borderLeftWidth');
+const _borderRight = Symbol('_borderRight');
+const _borderRightColor = Symbol('_borderRightColor');
+const _borderRightStyle = Symbol('_borderRightStyle');
+const _borderRightWidth = Symbol('_borderRightWidth');
+const _borderSpacing = Symbol('_borderSpacing');
+const _borderStyle = Symbol('_borderStyle');
+const _borderTop = Symbol('_borderTop');
+const _borderTopColor = Symbol('_borderTopColor');
+const _borderTopStyle = Symbol('_borderTopStyle');
+const _borderTopWidth = Symbol('_borderTopWidth');
+const _borderWidth = Symbol('_borderWidth');
+const _bottom = Symbol('_bottom');
+const _captionSide = Symbol('_captionSide');
+const _clear$1 = Symbol('_clear');
+const _clip = Symbol('_clip');
+const _color = Symbol('_color');
+const _content = Symbol('_content');
+const _cursor = Symbol('_cursor');
+const _direction = Symbol('_direction');
+const _display = Symbol('_display');
+const _emptyCells = Symbol('_emptyCells');
+const _font = Symbol('_font');
+const _fontFamily = Symbol('_fontFamily');
+const _fontSize = Symbol('_fontSize');
+const _fontStyle = Symbol('_fontStyle');
+const _fontVariant = Symbol('_fontVariant');
+const _fontWeight = Symbol('_fontWeight');
+const _height$ = Symbol('_height');
+const _left = Symbol('_left');
+const _letterSpacing = Symbol('_letterSpacing');
+const _lineHeight = Symbol('_lineHeight');
+const _listStyle = Symbol('_listStyle');
+const _listStyleImage = Symbol('_listStyleImage');
+const _listStylePosition = Symbol('_listStylePosition');
+const _listStyleType = Symbol('_listStyleType');
+const _margin = Symbol('_margin');
+const _marginBottom = Symbol('_marginBottom');
+const _marginLeft = Symbol('_marginLeft');
+const _marginRight = Symbol('_marginRight');
+const _marginTop = Symbol('_marginTop');
+const _maxHeight = Symbol('_maxHeight');
+const _maxWidth = Symbol('_maxWidth');
+const _minHeight = Symbol('_minHeight');
+const _minWidth = Symbol('_minWidth');
+const _outline = Symbol('_outline');
+const _outlineColor = Symbol('_outlineColor');
+const _outlineStyle = Symbol('_outlineStyle');
+const _outlineWidth = Symbol('_outlineWidth');
+const _overflow = Symbol('_overflow');
+const _padding = Symbol('_padding');
+const _paddingBottom = Symbol('_paddingBottom');
+const _paddingLeft = Symbol('_paddingLeft');
+const _paddingRight = Symbol('_paddingRight');
+const _paddingTop = Symbol('_paddingTop');
+const _pageBreakAfter = Symbol('_pageBreakAfter');
+const _pageBreakBefore = Symbol('_pageBreakBefore');
+const _pageBreakInside = Symbol('_pageBreakInside');
+const _position$1 = Symbol('_position');
+const _quotes = Symbol('_quotes');
+const _right = Symbol('_right');
+const _tableLayout = Symbol('_tableLayout');
+const _textAlign = Symbol('_textAlign');
+const _textDecoration = Symbol('_textDecoration');
+const _textIndent = Symbol('_textIndent');
+const _textTransform = Symbol('_textTransform');
+const _top = Symbol('_top');
+const _unicodeBidi = Symbol('_unicodeBidi');
+const _verticalAlign = Symbol('_verticalAlign');
+const _visibility = Symbol('_visibility');
+const _whiteSpace = Symbol('_whiteSpace');
+const _width$ = Symbol('_width');
+const _wordSpacing = Symbol('_wordSpacing');
+const _zIndex = Symbol('_zIndex');
+dart.defineExtensionNames([
+  'alignContent',
+  'alignContent',
+  'alignItems',
+  'alignItems',
+  'alignSelf',
+  'alignSelf',
+  'animation',
+  'animation',
+  'animationDelay',
+  'animationDelay',
+  'animationDirection',
+  'animationDirection',
+  'animationDuration',
+  'animationDuration',
+  'animationFillMode',
+  'animationFillMode',
+  'animationIterationCount',
+  'animationIterationCount',
+  'animationName',
+  'animationName',
+  'animationPlayState',
+  'animationPlayState',
+  'animationTimingFunction',
+  'animationTimingFunction',
+  'appRegion',
+  'appRegion',
+  'appearance',
+  'appearance',
+  'aspectRatio',
+  'aspectRatio',
+  'backfaceVisibility',
+  'backfaceVisibility',
+  'background',
+  'background',
+  'backgroundAttachment',
+  'backgroundAttachment',
+  'backgroundBlendMode',
+  'backgroundBlendMode',
+  'backgroundClip',
+  'backgroundClip',
+  'backgroundColor',
+  'backgroundColor',
+  'backgroundComposite',
+  'backgroundComposite',
+  'backgroundImage',
+  'backgroundImage',
+  'backgroundOrigin',
+  'backgroundOrigin',
+  'backgroundPosition',
+  'backgroundPosition',
+  'backgroundPositionX',
+  'backgroundPositionX',
+  'backgroundPositionY',
+  'backgroundPositionY',
+  'backgroundRepeat',
+  'backgroundRepeat',
+  'backgroundRepeatX',
+  'backgroundRepeatX',
+  'backgroundRepeatY',
+  'backgroundRepeatY',
+  'backgroundSize',
+  'backgroundSize',
+  'border',
+  'border',
+  'borderAfter',
+  'borderAfter',
+  'borderAfterColor',
+  'borderAfterColor',
+  'borderAfterStyle',
+  'borderAfterStyle',
+  'borderAfterWidth',
+  'borderAfterWidth',
+  'borderBefore',
+  'borderBefore',
+  'borderBeforeColor',
+  'borderBeforeColor',
+  'borderBeforeStyle',
+  'borderBeforeStyle',
+  'borderBeforeWidth',
+  'borderBeforeWidth',
+  'borderBottom',
+  'borderBottom',
+  'borderBottomColor',
+  'borderBottomColor',
+  'borderBottomLeftRadius',
+  'borderBottomLeftRadius',
+  'borderBottomRightRadius',
+  'borderBottomRightRadius',
+  'borderBottomStyle',
+  'borderBottomStyle',
+  'borderBottomWidth',
+  'borderBottomWidth',
+  'borderCollapse',
+  'borderCollapse',
+  'borderColor',
+  'borderColor',
+  'borderEnd',
+  'borderEnd',
+  'borderEndColor',
+  'borderEndColor',
+  'borderEndStyle',
+  'borderEndStyle',
+  'borderEndWidth',
+  'borderEndWidth',
+  'borderFit',
+  'borderFit',
+  'borderHorizontalSpacing',
+  'borderHorizontalSpacing',
+  'borderImage',
+  'borderImage',
+  'borderImageOutset',
+  'borderImageOutset',
+  'borderImageRepeat',
+  'borderImageRepeat',
+  'borderImageSlice',
+  'borderImageSlice',
+  'borderImageSource',
+  'borderImageSource',
+  'borderImageWidth',
+  'borderImageWidth',
+  'borderLeft',
+  'borderLeft',
+  'borderLeftColor',
+  'borderLeftColor',
+  'borderLeftStyle',
+  'borderLeftStyle',
+  'borderLeftWidth',
+  'borderLeftWidth',
+  'borderRadius',
+  'borderRadius',
+  'borderRight',
+  'borderRight',
+  'borderRightColor',
+  'borderRightColor',
+  'borderRightStyle',
+  'borderRightStyle',
+  'borderRightWidth',
+  'borderRightWidth',
+  'borderSpacing',
+  'borderSpacing',
+  'borderStart',
+  'borderStart',
+  'borderStartColor',
+  'borderStartColor',
+  'borderStartStyle',
+  'borderStartStyle',
+  'borderStartWidth',
+  'borderStartWidth',
+  'borderStyle',
+  'borderStyle',
+  'borderTop',
+  'borderTop',
+  'borderTopColor',
+  'borderTopColor',
+  'borderTopLeftRadius',
+  'borderTopLeftRadius',
+  'borderTopRightRadius',
+  'borderTopRightRadius',
+  'borderTopStyle',
+  'borderTopStyle',
+  'borderTopWidth',
+  'borderTopWidth',
+  'borderVerticalSpacing',
+  'borderVerticalSpacing',
+  'borderWidth',
+  'borderWidth',
+  'bottom',
+  'bottom',
+  'boxAlign',
+  'boxAlign',
+  'boxDecorationBreak',
+  'boxDecorationBreak',
+  'boxDirection',
+  'boxDirection',
+  'boxFlex',
+  'boxFlex',
+  'boxFlexGroup',
+  'boxFlexGroup',
+  'boxLines',
+  'boxLines',
+  'boxOrdinalGroup',
+  'boxOrdinalGroup',
+  'boxOrient',
+  'boxOrient',
+  'boxPack',
+  'boxPack',
+  'boxReflect',
+  'boxReflect',
+  'boxShadow',
+  'boxShadow',
+  'boxSizing',
+  'boxSizing',
+  'captionSide',
+  'captionSide',
+  'clear',
+  'clear',
+  'clip',
+  'clip',
+  'clipPath',
+  'clipPath',
+  'color',
+  'color',
+  'columnBreakAfter',
+  'columnBreakAfter',
+  'columnBreakBefore',
+  'columnBreakBefore',
+  'columnBreakInside',
+  'columnBreakInside',
+  'columnCount',
+  'columnCount',
+  'columnFill',
+  'columnFill',
+  'columnGap',
+  'columnGap',
+  'columnRule',
+  'columnRule',
+  'columnRuleColor',
+  'columnRuleColor',
+  'columnRuleStyle',
+  'columnRuleStyle',
+  'columnRuleWidth',
+  'columnRuleWidth',
+  'columnSpan',
+  'columnSpan',
+  'columnWidth',
+  'columnWidth',
+  'columns',
+  'columns',
+  'content',
+  'content',
+  'counterIncrement',
+  'counterIncrement',
+  'counterReset',
+  'counterReset',
+  'cursor',
+  'cursor',
+  'direction',
+  'direction',
+  'display',
+  'display',
+  'emptyCells',
+  'emptyCells',
+  'filter',
+  'filter',
+  'flex',
+  'flex',
+  'flexBasis',
+  'flexBasis',
+  'flexDirection',
+  'flexDirection',
+  'flexFlow',
+  'flexFlow',
+  'flexGrow',
+  'flexGrow',
+  'flexShrink',
+  'flexShrink',
+  'flexWrap',
+  'flexWrap',
+  'float',
+  'float',
+  'font',
+  'font',
+  'fontFamily',
+  'fontFamily',
+  'fontFeatureSettings',
+  'fontFeatureSettings',
+  'fontKerning',
+  'fontKerning',
+  'fontSize',
+  'fontSize',
+  'fontSizeDelta',
+  'fontSizeDelta',
+  'fontSmoothing',
+  'fontSmoothing',
+  'fontStretch',
+  'fontStretch',
+  'fontStyle',
+  'fontStyle',
+  'fontVariant',
+  'fontVariant',
+  'fontVariantLigatures',
+  'fontVariantLigatures',
+  'fontWeight',
+  'fontWeight',
+  'grid',
+  'grid',
+  'gridArea',
+  'gridArea',
+  'gridAutoColumns',
+  'gridAutoColumns',
+  'gridAutoFlow',
+  'gridAutoFlow',
+  'gridAutoRows',
+  'gridAutoRows',
+  'gridColumn',
+  'gridColumn',
+  'gridColumnEnd',
+  'gridColumnEnd',
+  'gridColumnStart',
+  'gridColumnStart',
+  'gridRow',
+  'gridRow',
+  'gridRowEnd',
+  'gridRowEnd',
+  'gridRowStart',
+  'gridRowStart',
+  'gridTemplate',
+  'gridTemplate',
+  'gridTemplateAreas',
+  'gridTemplateAreas',
+  'gridTemplateColumns',
+  'gridTemplateColumns',
+  'gridTemplateRows',
+  'gridTemplateRows',
+  'height',
+  'height',
+  'highlight',
+  'highlight',
+  'hyphenateCharacter',
+  'hyphenateCharacter',
+  'imageRendering',
+  'imageRendering',
+  'isolation',
+  'isolation',
+  'justifyContent',
+  'justifyContent',
+  'justifySelf',
+  'justifySelf',
+  'left',
+  'left',
+  'letterSpacing',
+  'letterSpacing',
+  'lineBoxContain',
+  'lineBoxContain',
+  'lineBreak',
+  'lineBreak',
+  'lineClamp',
+  'lineClamp',
+  'lineHeight',
+  'lineHeight',
+  'listStyle',
+  'listStyle',
+  'listStyleImage',
+  'listStyleImage',
+  'listStylePosition',
+  'listStylePosition',
+  'listStyleType',
+  'listStyleType',
+  'locale',
+  'locale',
+  'logicalHeight',
+  'logicalHeight',
+  'logicalWidth',
+  'logicalWidth',
+  'margin',
+  'margin',
+  'marginAfter',
+  'marginAfter',
+  'marginAfterCollapse',
+  'marginAfterCollapse',
+  'marginBefore',
+  'marginBefore',
+  'marginBeforeCollapse',
+  'marginBeforeCollapse',
+  'marginBottom',
+  'marginBottom',
+  'marginBottomCollapse',
+  'marginBottomCollapse',
+  'marginCollapse',
+  'marginCollapse',
+  'marginEnd',
+  'marginEnd',
+  'marginLeft',
+  'marginLeft',
+  'marginRight',
+  'marginRight',
+  'marginStart',
+  'marginStart',
+  'marginTop',
+  'marginTop',
+  'marginTopCollapse',
+  'marginTopCollapse',
+  'mask',
+  'mask',
+  'maskBoxImage',
+  'maskBoxImage',
+  'maskBoxImageOutset',
+  'maskBoxImageOutset',
+  'maskBoxImageRepeat',
+  'maskBoxImageRepeat',
+  'maskBoxImageSlice',
+  'maskBoxImageSlice',
+  'maskBoxImageSource',
+  'maskBoxImageSource',
+  'maskBoxImageWidth',
+  'maskBoxImageWidth',
+  'maskClip',
+  'maskClip',
+  'maskComposite',
+  'maskComposite',
+  'maskImage',
+  'maskImage',
+  'maskOrigin',
+  'maskOrigin',
+  'maskPosition',
+  'maskPosition',
+  'maskPositionX',
+  'maskPositionX',
+  'maskPositionY',
+  'maskPositionY',
+  'maskRepeat',
+  'maskRepeat',
+  'maskRepeatX',
+  'maskRepeatX',
+  'maskRepeatY',
+  'maskRepeatY',
+  'maskSize',
+  'maskSize',
+  'maskSourceType',
+  'maskSourceType',
+  'maxHeight',
+  'maxHeight',
+  'maxLogicalHeight',
+  'maxLogicalHeight',
+  'maxLogicalWidth',
+  'maxLogicalWidth',
+  'maxWidth',
+  'maxWidth',
+  'maxZoom',
+  'maxZoom',
+  'minHeight',
+  'minHeight',
+  'minLogicalHeight',
+  'minLogicalHeight',
+  'minLogicalWidth',
+  'minLogicalWidth',
+  'minWidth',
+  'minWidth',
+  'minZoom',
+  'minZoom',
+  'mixBlendMode',
+  'mixBlendMode',
+  'objectFit',
+  'objectFit',
+  'objectPosition',
+  'objectPosition',
+  'opacity',
+  'opacity',
+  'order',
+  'order',
+  'orientation',
+  'orientation',
+  'orphans',
+  'orphans',
+  'outline',
+  'outline',
+  'outlineColor',
+  'outlineColor',
+  'outlineOffset',
+  'outlineOffset',
+  'outlineStyle',
+  'outlineStyle',
+  'outlineWidth',
+  'outlineWidth',
+  'overflow',
+  'overflow',
+  'overflowWrap',
+  'overflowWrap',
+  'overflowX',
+  'overflowX',
+  'overflowY',
+  'overflowY',
+  'padding',
+  'padding',
+  'paddingAfter',
+  'paddingAfter',
+  'paddingBefore',
+  'paddingBefore',
+  'paddingBottom',
+  'paddingBottom',
+  'paddingEnd',
+  'paddingEnd',
+  'paddingLeft',
+  'paddingLeft',
+  'paddingRight',
+  'paddingRight',
+  'paddingStart',
+  'paddingStart',
+  'paddingTop',
+  'paddingTop',
+  'page',
+  'page',
+  'pageBreakAfter',
+  'pageBreakAfter',
+  'pageBreakBefore',
+  'pageBreakBefore',
+  'pageBreakInside',
+  'pageBreakInside',
+  'perspective',
+  'perspective',
+  'perspectiveOrigin',
+  'perspectiveOrigin',
+  'perspectiveOriginX',
+  'perspectiveOriginX',
+  'perspectiveOriginY',
+  'perspectiveOriginY',
+  'pointerEvents',
+  'pointerEvents',
+  'position',
+  'position',
+  'printColorAdjust',
+  'printColorAdjust',
+  'quotes',
+  'quotes',
+  'resize',
+  'resize',
+  'right',
+  'right',
+  'rtlOrdering',
+  'rtlOrdering',
+  'rubyPosition',
+  'rubyPosition',
+  'scrollBehavior',
+  'scrollBehavior',
+  'shapeImageThreshold',
+  'shapeImageThreshold',
+  'shapeMargin',
+  'shapeMargin',
+  'shapeOutside',
+  'shapeOutside',
+  'size',
+  'size',
+  'speak',
+  'speak',
+  'src',
+  'src',
+  'tabSize',
+  'tabSize',
+  'tableLayout',
+  'tableLayout',
+  'tapHighlightColor',
+  'tapHighlightColor',
+  'textAlign',
+  'textAlign',
+  'textAlignLast',
+  'textAlignLast',
+  'textCombine',
+  'textCombine',
+  'textDecoration',
+  'textDecoration',
+  'textDecorationColor',
+  'textDecorationColor',
+  'textDecorationLine',
+  'textDecorationLine',
+  'textDecorationStyle',
+  'textDecorationStyle',
+  'textDecorationsInEffect',
+  'textDecorationsInEffect',
+  'textEmphasis',
+  'textEmphasis',
+  'textEmphasisColor',
+  'textEmphasisColor',
+  'textEmphasisPosition',
+  'textEmphasisPosition',
+  'textEmphasisStyle',
+  'textEmphasisStyle',
+  'textFillColor',
+  'textFillColor',
+  'textIndent',
+  'textIndent',
+  'textJustify',
+  'textJustify',
+  'textLineThroughColor',
+  'textLineThroughColor',
+  'textLineThroughMode',
+  'textLineThroughMode',
+  'textLineThroughStyle',
+  'textLineThroughStyle',
+  'textLineThroughWidth',
+  'textLineThroughWidth',
+  'textOrientation',
+  'textOrientation',
+  'textOverflow',
+  'textOverflow',
+  'textOverlineColor',
+  'textOverlineColor',
+  'textOverlineMode',
+  'textOverlineMode',
+  'textOverlineStyle',
+  'textOverlineStyle',
+  'textOverlineWidth',
+  'textOverlineWidth',
+  'textRendering',
+  'textRendering',
+  'textSecurity',
+  'textSecurity',
+  'textShadow',
+  'textShadow',
+  'textStroke',
+  'textStroke',
+  'textStrokeColor',
+  'textStrokeColor',
+  'textStrokeWidth',
+  'textStrokeWidth',
+  'textTransform',
+  'textTransform',
+  'textUnderlineColor',
+  'textUnderlineColor',
+  'textUnderlineMode',
+  'textUnderlineMode',
+  'textUnderlinePosition',
+  'textUnderlinePosition',
+  'textUnderlineStyle',
+  'textUnderlineStyle',
+  'textUnderlineWidth',
+  'textUnderlineWidth',
+  'top',
+  'top',
+  'touchAction',
+  'touchAction',
+  'touchActionDelay',
+  'touchActionDelay',
+  'transform',
+  'transform',
+  'transformOrigin',
+  'transformOrigin',
+  'transformOriginX',
+  'transformOriginX',
+  'transformOriginY',
+  'transformOriginY',
+  'transformOriginZ',
+  'transformOriginZ',
+  'transformStyle',
+  'transformStyle',
+  'transition',
+  'transition',
+  'transitionDelay',
+  'transitionDelay',
+  'transitionDuration',
+  'transitionDuration',
+  'transitionProperty',
+  'transitionProperty',
+  'transitionTimingFunction',
+  'transitionTimingFunction',
+  'unicodeBidi',
+  'unicodeBidi',
+  'unicodeRange',
+  'unicodeRange',
+  'userDrag',
+  'userDrag',
+  'userModify',
+  'userModify',
+  'userSelect',
+  'userSelect',
+  'userZoom',
+  'userZoom',
+  'verticalAlign',
+  'verticalAlign',
+  'visibility',
+  'visibility',
+  'whiteSpace',
+  'whiteSpace',
+  'widows',
+  'widows',
+  'width',
+  'width',
+  'willChange',
+  'willChange',
+  'wordBreak',
+  'wordBreak',
+  'wordSpacing',
+  'wordSpacing',
+  'wordWrap',
+  'wordWrap',
+  'wrapFlow',
+  'wrapFlow',
+  'wrapThrough',
+  'wrapThrough',
+  'writingMode',
+  'writingMode',
+  'zIndex',
+  'zIndex',
+  'zoom',
+  'zoom'
+]);
+html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
+  get alignContent() {
+    return this[dartx.getPropertyValue]('align-content');
+  }
+  set alignContent(value) {
+    this[dartx.setProperty]('align-content', value, '');
+  }
+  get alignItems() {
+    return this[dartx.getPropertyValue]('align-items');
+  }
+  set alignItems(value) {
+    this[dartx.setProperty]('align-items', value, '');
+  }
+  get alignSelf() {
+    return this[dartx.getPropertyValue]('align-self');
+  }
+  set alignSelf(value) {
+    this[dartx.setProperty]('align-self', value, '');
+  }
+  get animation() {
+    return this[dartx.getPropertyValue]('animation');
+  }
+  set animation(value) {
+    this[dartx.setProperty]('animation', value, '');
+  }
+  get animationDelay() {
+    return this[dartx.getPropertyValue]('animation-delay');
+  }
+  set animationDelay(value) {
+    this[dartx.setProperty]('animation-delay', value, '');
+  }
+  get animationDirection() {
+    return this[dartx.getPropertyValue]('animation-direction');
+  }
+  set animationDirection(value) {
+    this[dartx.setProperty]('animation-direction', value, '');
+  }
+  get animationDuration() {
+    return this[dartx.getPropertyValue]('animation-duration');
+  }
+  set animationDuration(value) {
+    this[dartx.setProperty]('animation-duration', value, '');
+  }
+  get animationFillMode() {
+    return this[dartx.getPropertyValue]('animation-fill-mode');
+  }
+  set animationFillMode(value) {
+    this[dartx.setProperty]('animation-fill-mode', value, '');
+  }
+  get animationIterationCount() {
+    return this[dartx.getPropertyValue]('animation-iteration-count');
+  }
+  set animationIterationCount(value) {
+    this[dartx.setProperty]('animation-iteration-count', value, '');
+  }
+  get animationName() {
+    return this[dartx.getPropertyValue]('animation-name');
+  }
+  set animationName(value) {
+    this[dartx.setProperty]('animation-name', value, '');
+  }
+  get animationPlayState() {
+    return this[dartx.getPropertyValue]('animation-play-state');
+  }
+  set animationPlayState(value) {
+    this[dartx.setProperty]('animation-play-state', value, '');
+  }
+  get animationTimingFunction() {
+    return this[dartx.getPropertyValue]('animation-timing-function');
+  }
+  set animationTimingFunction(value) {
+    this[dartx.setProperty]('animation-timing-function', value, '');
+  }
+  get appRegion() {
+    return this[dartx.getPropertyValue]('app-region');
+  }
+  set appRegion(value) {
+    this[dartx.setProperty]('app-region', value, '');
+  }
+  get appearance() {
+    return this[dartx.getPropertyValue]('appearance');
+  }
+  set appearance(value) {
+    this[dartx.setProperty]('appearance', value, '');
+  }
+  get aspectRatio() {
+    return this[dartx.getPropertyValue]('aspect-ratio');
+  }
+  set aspectRatio(value) {
+    this[dartx.setProperty]('aspect-ratio', value, '');
+  }
+  get backfaceVisibility() {
+    return this[dartx.getPropertyValue]('backface-visibility');
+  }
+  set backfaceVisibility(value) {
+    this[dartx.setProperty]('backface-visibility', value, '');
+  }
+  get background() {
+    return this[dartx.getPropertyValue]('background');
+  }
+  set background(value) {
+    this[dartx.setProperty]('background', value, '');
+  }
+  get backgroundAttachment() {
+    return this[dartx.getPropertyValue]('background-attachment');
+  }
+  set backgroundAttachment(value) {
+    this[dartx.setProperty]('background-attachment', value, '');
+  }
+  get backgroundBlendMode() {
+    return this[dartx.getPropertyValue]('background-blend-mode');
+  }
+  set backgroundBlendMode(value) {
+    this[dartx.setProperty]('background-blend-mode', value, '');
+  }
+  get backgroundClip() {
+    return this[dartx.getPropertyValue]('background-clip');
+  }
+  set backgroundClip(value) {
+    this[dartx.setProperty]('background-clip', value, '');
+  }
+  get backgroundColor() {
+    return this[dartx.getPropertyValue]('background-color');
+  }
+  set backgroundColor(value) {
+    this[dartx.setProperty]('background-color', value, '');
+  }
+  get backgroundComposite() {
+    return this[dartx.getPropertyValue]('background-composite');
+  }
+  set backgroundComposite(value) {
+    this[dartx.setProperty]('background-composite', value, '');
+  }
+  get backgroundImage() {
+    return this[dartx.getPropertyValue]('background-image');
+  }
+  set backgroundImage(value) {
+    this[dartx.setProperty]('background-image', value, '');
+  }
+  get backgroundOrigin() {
+    return this[dartx.getPropertyValue]('background-origin');
+  }
+  set backgroundOrigin(value) {
+    this[dartx.setProperty]('background-origin', value, '');
+  }
+  get backgroundPosition() {
+    return this[dartx.getPropertyValue]('background-position');
+  }
+  set backgroundPosition(value) {
+    this[dartx.setProperty]('background-position', value, '');
+  }
+  get backgroundPositionX() {
+    return this[dartx.getPropertyValue]('background-position-x');
+  }
+  set backgroundPositionX(value) {
+    this[dartx.setProperty]('background-position-x', value, '');
+  }
+  get backgroundPositionY() {
+    return this[dartx.getPropertyValue]('background-position-y');
+  }
+  set backgroundPositionY(value) {
+    this[dartx.setProperty]('background-position-y', value, '');
+  }
+  get backgroundRepeat() {
+    return this[dartx.getPropertyValue]('background-repeat');
+  }
+  set backgroundRepeat(value) {
+    this[dartx.setProperty]('background-repeat', value, '');
+  }
+  get backgroundRepeatX() {
+    return this[dartx.getPropertyValue]('background-repeat-x');
+  }
+  set backgroundRepeatX(value) {
+    this[dartx.setProperty]('background-repeat-x', value, '');
+  }
+  get backgroundRepeatY() {
+    return this[dartx.getPropertyValue]('background-repeat-y');
+  }
+  set backgroundRepeatY(value) {
+    this[dartx.setProperty]('background-repeat-y', value, '');
+  }
+  get backgroundSize() {
+    return this[dartx.getPropertyValue]('background-size');
+  }
+  set backgroundSize(value) {
+    this[dartx.setProperty]('background-size', value, '');
+  }
+  get border() {
+    return this[dartx.getPropertyValue]('border');
+  }
+  set border(value) {
+    this[dartx.setProperty]('border', value, '');
+  }
+  get borderAfter() {
+    return this[dartx.getPropertyValue]('border-after');
+  }
+  set borderAfter(value) {
+    this[dartx.setProperty]('border-after', value, '');
+  }
+  get borderAfterColor() {
+    return this[dartx.getPropertyValue]('border-after-color');
+  }
+  set borderAfterColor(value) {
+    this[dartx.setProperty]('border-after-color', value, '');
+  }
+  get borderAfterStyle() {
+    return this[dartx.getPropertyValue]('border-after-style');
+  }
+  set borderAfterStyle(value) {
+    this[dartx.setProperty]('border-after-style', value, '');
+  }
+  get borderAfterWidth() {
+    return this[dartx.getPropertyValue]('border-after-width');
+  }
+  set borderAfterWidth(value) {
+    this[dartx.setProperty]('border-after-width', value, '');
+  }
+  get borderBefore() {
+    return this[dartx.getPropertyValue]('border-before');
+  }
+  set borderBefore(value) {
+    this[dartx.setProperty]('border-before', value, '');
+  }
+  get borderBeforeColor() {
+    return this[dartx.getPropertyValue]('border-before-color');
+  }
+  set borderBeforeColor(value) {
+    this[dartx.setProperty]('border-before-color', value, '');
+  }
+  get borderBeforeStyle() {
+    return this[dartx.getPropertyValue]('border-before-style');
+  }
+  set borderBeforeStyle(value) {
+    this[dartx.setProperty]('border-before-style', value, '');
+  }
+  get borderBeforeWidth() {
+    return this[dartx.getPropertyValue]('border-before-width');
+  }
+  set borderBeforeWidth(value) {
+    this[dartx.setProperty]('border-before-width', value, '');
+  }
+  get borderBottom() {
+    return this[dartx.getPropertyValue]('border-bottom');
+  }
+  set borderBottom(value) {
+    this[dartx.setProperty]('border-bottom', value, '');
+  }
+  get borderBottomColor() {
+    return this[dartx.getPropertyValue]('border-bottom-color');
+  }
+  set borderBottomColor(value) {
+    this[dartx.setProperty]('border-bottom-color', value, '');
+  }
+  get borderBottomLeftRadius() {
+    return this[dartx.getPropertyValue]('border-bottom-left-radius');
+  }
+  set borderBottomLeftRadius(value) {
+    this[dartx.setProperty]('border-bottom-left-radius', value, '');
+  }
+  get borderBottomRightRadius() {
+    return this[dartx.getPropertyValue]('border-bottom-right-radius');
+  }
+  set borderBottomRightRadius(value) {
+    this[dartx.setProperty]('border-bottom-right-radius', value, '');
+  }
+  get borderBottomStyle() {
+    return this[dartx.getPropertyValue]('border-bottom-style');
+  }
+  set borderBottomStyle(value) {
+    this[dartx.setProperty]('border-bottom-style', value, '');
+  }
+  get borderBottomWidth() {
+    return this[dartx.getPropertyValue]('border-bottom-width');
+  }
+  set borderBottomWidth(value) {
+    this[dartx.setProperty]('border-bottom-width', value, '');
+  }
+  get borderCollapse() {
+    return this[dartx.getPropertyValue]('border-collapse');
+  }
+  set borderCollapse(value) {
+    this[dartx.setProperty]('border-collapse', value, '');
+  }
+  get borderColor() {
+    return this[dartx.getPropertyValue]('border-color');
+  }
+  set borderColor(value) {
+    this[dartx.setProperty]('border-color', value, '');
+  }
+  get borderEnd() {
+    return this[dartx.getPropertyValue]('border-end');
+  }
+  set borderEnd(value) {
+    this[dartx.setProperty]('border-end', value, '');
+  }
+  get borderEndColor() {
+    return this[dartx.getPropertyValue]('border-end-color');
+  }
+  set borderEndColor(value) {
+    this[dartx.setProperty]('border-end-color', value, '');
+  }
+  get borderEndStyle() {
+    return this[dartx.getPropertyValue]('border-end-style');
+  }
+  set borderEndStyle(value) {
+    this[dartx.setProperty]('border-end-style', value, '');
+  }
+  get borderEndWidth() {
+    return this[dartx.getPropertyValue]('border-end-width');
+  }
+  set borderEndWidth(value) {
+    this[dartx.setProperty]('border-end-width', value, '');
+  }
+  get borderFit() {
+    return this[dartx.getPropertyValue]('border-fit');
+  }
+  set borderFit(value) {
+    this[dartx.setProperty]('border-fit', value, '');
+  }
+  get borderHorizontalSpacing() {
+    return this[dartx.getPropertyValue]('border-horizontal-spacing');
+  }
+  set borderHorizontalSpacing(value) {
+    this[dartx.setProperty]('border-horizontal-spacing', value, '');
+  }
+  get borderImage() {
+    return this[dartx.getPropertyValue]('border-image');
+  }
+  set borderImage(value) {
+    this[dartx.setProperty]('border-image', value, '');
+  }
+  get borderImageOutset() {
+    return this[dartx.getPropertyValue]('border-image-outset');
+  }
+  set borderImageOutset(value) {
+    this[dartx.setProperty]('border-image-outset', value, '');
+  }
+  get borderImageRepeat() {
+    return this[dartx.getPropertyValue]('border-image-repeat');
+  }
+  set borderImageRepeat(value) {
+    this[dartx.setProperty]('border-image-repeat', value, '');
+  }
+  get borderImageSlice() {
+    return this[dartx.getPropertyValue]('border-image-slice');
+  }
+  set borderImageSlice(value) {
+    this[dartx.setProperty]('border-image-slice', value, '');
+  }
+  get borderImageSource() {
+    return this[dartx.getPropertyValue]('border-image-source');
+  }
+  set borderImageSource(value) {
+    this[dartx.setProperty]('border-image-source', value, '');
+  }
+  get borderImageWidth() {
+    return this[dartx.getPropertyValue]('border-image-width');
+  }
+  set borderImageWidth(value) {
+    this[dartx.setProperty]('border-image-width', value, '');
+  }
+  get borderLeft() {
+    return this[dartx.getPropertyValue]('border-left');
+  }
+  set borderLeft(value) {
+    this[dartx.setProperty]('border-left', value, '');
+  }
+  get borderLeftColor() {
+    return this[dartx.getPropertyValue]('border-left-color');
+  }
+  set borderLeftColor(value) {
+    this[dartx.setProperty]('border-left-color', value, '');
+  }
+  get borderLeftStyle() {
+    return this[dartx.getPropertyValue]('border-left-style');
+  }
+  set borderLeftStyle(value) {
+    this[dartx.setProperty]('border-left-style', value, '');
+  }
+  get borderLeftWidth() {
+    return this[dartx.getPropertyValue]('border-left-width');
+  }
+  set borderLeftWidth(value) {
+    this[dartx.setProperty]('border-left-width', value, '');
+  }
+  get borderRadius() {
+    return this[dartx.getPropertyValue]('border-radius');
+  }
+  set borderRadius(value) {
+    this[dartx.setProperty]('border-radius', value, '');
+  }
+  get borderRight() {
+    return this[dartx.getPropertyValue]('border-right');
+  }
+  set borderRight(value) {
+    this[dartx.setProperty]('border-right', value, '');
+  }
+  get borderRightColor() {
+    return this[dartx.getPropertyValue]('border-right-color');
+  }
+  set borderRightColor(value) {
+    this[dartx.setProperty]('border-right-color', value, '');
+  }
+  get borderRightStyle() {
+    return this[dartx.getPropertyValue]('border-right-style');
+  }
+  set borderRightStyle(value) {
+    this[dartx.setProperty]('border-right-style', value, '');
+  }
+  get borderRightWidth() {
+    return this[dartx.getPropertyValue]('border-right-width');
+  }
+  set borderRightWidth(value) {
+    this[dartx.setProperty]('border-right-width', value, '');
+  }
+  get borderSpacing() {
+    return this[dartx.getPropertyValue]('border-spacing');
+  }
+  set borderSpacing(value) {
+    this[dartx.setProperty]('border-spacing', value, '');
+  }
+  get borderStart() {
+    return this[dartx.getPropertyValue]('border-start');
+  }
+  set borderStart(value) {
+    this[dartx.setProperty]('border-start', value, '');
+  }
+  get borderStartColor() {
+    return this[dartx.getPropertyValue]('border-start-color');
+  }
+  set borderStartColor(value) {
+    this[dartx.setProperty]('border-start-color', value, '');
+  }
+  get borderStartStyle() {
+    return this[dartx.getPropertyValue]('border-start-style');
+  }
+  set borderStartStyle(value) {
+    this[dartx.setProperty]('border-start-style', value, '');
+  }
+  get borderStartWidth() {
+    return this[dartx.getPropertyValue]('border-start-width');
+  }
+  set borderStartWidth(value) {
+    this[dartx.setProperty]('border-start-width', value, '');
+  }
+  get borderStyle() {
+    return this[dartx.getPropertyValue]('border-style');
+  }
+  set borderStyle(value) {
+    this[dartx.setProperty]('border-style', value, '');
+  }
+  get borderTop() {
+    return this[dartx.getPropertyValue]('border-top');
+  }
+  set borderTop(value) {
+    this[dartx.setProperty]('border-top', value, '');
+  }
+  get borderTopColor() {
+    return this[dartx.getPropertyValue]('border-top-color');
+  }
+  set borderTopColor(value) {
+    this[dartx.setProperty]('border-top-color', value, '');
+  }
+  get borderTopLeftRadius() {
+    return this[dartx.getPropertyValue]('border-top-left-radius');
+  }
+  set borderTopLeftRadius(value) {
+    this[dartx.setProperty]('border-top-left-radius', value, '');
+  }
+  get borderTopRightRadius() {
+    return this[dartx.getPropertyValue]('border-top-right-radius');
+  }
+  set borderTopRightRadius(value) {
+    this[dartx.setProperty]('border-top-right-radius', value, '');
+  }
+  get borderTopStyle() {
+    return this[dartx.getPropertyValue]('border-top-style');
+  }
+  set borderTopStyle(value) {
+    this[dartx.setProperty]('border-top-style', value, '');
+  }
+  get borderTopWidth() {
+    return this[dartx.getPropertyValue]('border-top-width');
+  }
+  set borderTopWidth(value) {
+    this[dartx.setProperty]('border-top-width', value, '');
+  }
+  get borderVerticalSpacing() {
+    return this[dartx.getPropertyValue]('border-vertical-spacing');
+  }
+  set borderVerticalSpacing(value) {
+    this[dartx.setProperty]('border-vertical-spacing', value, '');
+  }
+  get borderWidth() {
+    return this[dartx.getPropertyValue]('border-width');
+  }
+  set borderWidth(value) {
+    this[dartx.setProperty]('border-width', value, '');
+  }
+  get bottom() {
+    return this[dartx.getPropertyValue]('bottom');
+  }
+  set bottom(value) {
+    this[dartx.setProperty]('bottom', value, '');
+  }
+  get boxAlign() {
+    return this[dartx.getPropertyValue]('box-align');
+  }
+  set boxAlign(value) {
+    this[dartx.setProperty]('box-align', value, '');
+  }
+  get boxDecorationBreak() {
+    return this[dartx.getPropertyValue]('box-decoration-break');
+  }
+  set boxDecorationBreak(value) {
+    this[dartx.setProperty]('box-decoration-break', value, '');
+  }
+  get boxDirection() {
+    return this[dartx.getPropertyValue]('box-direction');
+  }
+  set boxDirection(value) {
+    this[dartx.setProperty]('box-direction', value, '');
+  }
+  get boxFlex() {
+    return this[dartx.getPropertyValue]('box-flex');
+  }
+  set boxFlex(value) {
+    this[dartx.setProperty]('box-flex', value, '');
+  }
+  get boxFlexGroup() {
+    return this[dartx.getPropertyValue]('box-flex-group');
+  }
+  set boxFlexGroup(value) {
+    this[dartx.setProperty]('box-flex-group', value, '');
+  }
+  get boxLines() {
+    return this[dartx.getPropertyValue]('box-lines');
+  }
+  set boxLines(value) {
+    this[dartx.setProperty]('box-lines', value, '');
+  }
+  get boxOrdinalGroup() {
+    return this[dartx.getPropertyValue]('box-ordinal-group');
+  }
+  set boxOrdinalGroup(value) {
+    this[dartx.setProperty]('box-ordinal-group', value, '');
+  }
+  get boxOrient() {
+    return this[dartx.getPropertyValue]('box-orient');
+  }
+  set boxOrient(value) {
+    this[dartx.setProperty]('box-orient', value, '');
+  }
+  get boxPack() {
+    return this[dartx.getPropertyValue]('box-pack');
+  }
+  set boxPack(value) {
+    this[dartx.setProperty]('box-pack', value, '');
+  }
+  get boxReflect() {
+    return this[dartx.getPropertyValue]('box-reflect');
+  }
+  set boxReflect(value) {
+    this[dartx.setProperty]('box-reflect', value, '');
+  }
+  get boxShadow() {
+    return this[dartx.getPropertyValue]('box-shadow');
+  }
+  set boxShadow(value) {
+    this[dartx.setProperty]('box-shadow', value, '');
+  }
+  get boxSizing() {
+    return this[dartx.getPropertyValue]('box-sizing');
+  }
+  set boxSizing(value) {
+    this[dartx.setProperty]('box-sizing', value, '');
+  }
+  get captionSide() {
+    return this[dartx.getPropertyValue]('caption-side');
+  }
+  set captionSide(value) {
+    this[dartx.setProperty]('caption-side', value, '');
+  }
+  get clear() {
+    return this[dartx.getPropertyValue]('clear');
+  }
+  set clear(value) {
+    this[dartx.setProperty]('clear', value, '');
+  }
+  get clip() {
+    return this[dartx.getPropertyValue]('clip');
+  }
+  set clip(value) {
+    this[dartx.setProperty]('clip', value, '');
+  }
+  get clipPath() {
+    return this[dartx.getPropertyValue]('clip-path');
+  }
+  set clipPath(value) {
+    this[dartx.setProperty]('clip-path', value, '');
+  }
+  get color() {
+    return this[dartx.getPropertyValue]('color');
+  }
+  set color(value) {
+    this[dartx.setProperty]('color', value, '');
+  }
+  get columnBreakAfter() {
+    return this[dartx.getPropertyValue]('column-break-after');
+  }
+  set columnBreakAfter(value) {
+    this[dartx.setProperty]('column-break-after', value, '');
+  }
+  get columnBreakBefore() {
+    return this[dartx.getPropertyValue]('column-break-before');
+  }
+  set columnBreakBefore(value) {
+    this[dartx.setProperty]('column-break-before', value, '');
+  }
+  get columnBreakInside() {
+    return this[dartx.getPropertyValue]('column-break-inside');
+  }
+  set columnBreakInside(value) {
+    this[dartx.setProperty]('column-break-inside', value, '');
+  }
+  get columnCount() {
+    return this[dartx.getPropertyValue]('column-count');
+  }
+  set columnCount(value) {
+    this[dartx.setProperty]('column-count', value, '');
+  }
+  get columnFill() {
+    return this[dartx.getPropertyValue]('column-fill');
+  }
+  set columnFill(value) {
+    this[dartx.setProperty]('column-fill', value, '');
+  }
+  get columnGap() {
+    return this[dartx.getPropertyValue]('column-gap');
+  }
+  set columnGap(value) {
+    this[dartx.setProperty]('column-gap', value, '');
+  }
+  get columnRule() {
+    return this[dartx.getPropertyValue]('column-rule');
+  }
+  set columnRule(value) {
+    this[dartx.setProperty]('column-rule', value, '');
+  }
+  get columnRuleColor() {
+    return this[dartx.getPropertyValue]('column-rule-color');
+  }
+  set columnRuleColor(value) {
+    this[dartx.setProperty]('column-rule-color', value, '');
+  }
+  get columnRuleStyle() {
+    return this[dartx.getPropertyValue]('column-rule-style');
+  }
+  set columnRuleStyle(value) {
+    this[dartx.setProperty]('column-rule-style', value, '');
+  }
+  get columnRuleWidth() {
+    return this[dartx.getPropertyValue]('column-rule-width');
+  }
+  set columnRuleWidth(value) {
+    this[dartx.setProperty]('column-rule-width', value, '');
+  }
+  get columnSpan() {
+    return this[dartx.getPropertyValue]('column-span');
+  }
+  set columnSpan(value) {
+    this[dartx.setProperty]('column-span', value, '');
+  }
+  get columnWidth() {
+    return this[dartx.getPropertyValue]('column-width');
+  }
+  set columnWidth(value) {
+    this[dartx.setProperty]('column-width', value, '');
+  }
+  get columns() {
+    return this[dartx.getPropertyValue]('columns');
+  }
+  set columns(value) {
+    this[dartx.setProperty]('columns', value, '');
+  }
+  get content() {
+    return this[dartx.getPropertyValue]('content');
+  }
+  set content(value) {
+    this[dartx.setProperty]('content', value, '');
+  }
+  get counterIncrement() {
+    return this[dartx.getPropertyValue]('counter-increment');
+  }
+  set counterIncrement(value) {
+    this[dartx.setProperty]('counter-increment', value, '');
+  }
+  get counterReset() {
+    return this[dartx.getPropertyValue]('counter-reset');
+  }
+  set counterReset(value) {
+    this[dartx.setProperty]('counter-reset', value, '');
+  }
+  get cursor() {
+    return this[dartx.getPropertyValue]('cursor');
+  }
+  set cursor(value) {
+    this[dartx.setProperty]('cursor', value, '');
+  }
+  get direction() {
+    return this[dartx.getPropertyValue]('direction');
+  }
+  set direction(value) {
+    this[dartx.setProperty]('direction', value, '');
+  }
+  get display() {
+    return this[dartx.getPropertyValue]('display');
+  }
+  set display(value) {
+    this[dartx.setProperty]('display', value, '');
+  }
+  get emptyCells() {
+    return this[dartx.getPropertyValue]('empty-cells');
+  }
+  set emptyCells(value) {
+    this[dartx.setProperty]('empty-cells', value, '');
+  }
+  get filter() {
+    return this[dartx.getPropertyValue]('filter');
+  }
+  set filter(value) {
+    this[dartx.setProperty]('filter', value, '');
+  }
+  get flex() {
+    return this[dartx.getPropertyValue]('flex');
+  }
+  set flex(value) {
+    this[dartx.setProperty]('flex', value, '');
+  }
+  get flexBasis() {
+    return this[dartx.getPropertyValue]('flex-basis');
+  }
+  set flexBasis(value) {
+    this[dartx.setProperty]('flex-basis', value, '');
+  }
+  get flexDirection() {
+    return this[dartx.getPropertyValue]('flex-direction');
+  }
+  set flexDirection(value) {
+    this[dartx.setProperty]('flex-direction', value, '');
+  }
+  get flexFlow() {
+    return this[dartx.getPropertyValue]('flex-flow');
+  }
+  set flexFlow(value) {
+    this[dartx.setProperty]('flex-flow', value, '');
+  }
+  get flexGrow() {
+    return this[dartx.getPropertyValue]('flex-grow');
+  }
+  set flexGrow(value) {
+    this[dartx.setProperty]('flex-grow', value, '');
+  }
+  get flexShrink() {
+    return this[dartx.getPropertyValue]('flex-shrink');
+  }
+  set flexShrink(value) {
+    this[dartx.setProperty]('flex-shrink', value, '');
+  }
+  get flexWrap() {
+    return this[dartx.getPropertyValue]('flex-wrap');
+  }
+  set flexWrap(value) {
+    this[dartx.setProperty]('flex-wrap', value, '');
+  }
+  get float() {
+    return this[dartx.getPropertyValue]('float');
+  }
+  set float(value) {
+    this[dartx.setProperty]('float', value, '');
+  }
+  get font() {
+    return this[dartx.getPropertyValue]('font');
+  }
+  set font(value) {
+    this[dartx.setProperty]('font', value, '');
+  }
+  get fontFamily() {
+    return this[dartx.getPropertyValue]('font-family');
+  }
+  set fontFamily(value) {
+    this[dartx.setProperty]('font-family', value, '');
+  }
+  get fontFeatureSettings() {
+    return this[dartx.getPropertyValue]('font-feature-settings');
+  }
+  set fontFeatureSettings(value) {
+    this[dartx.setProperty]('font-feature-settings', value, '');
+  }
+  get fontKerning() {
+    return this[dartx.getPropertyValue]('font-kerning');
+  }
+  set fontKerning(value) {
+    this[dartx.setProperty]('font-kerning', value, '');
+  }
+  get fontSize() {
+    return this[dartx.getPropertyValue]('font-size');
+  }
+  set fontSize(value) {
+    this[dartx.setProperty]('font-size', value, '');
+  }
+  get fontSizeDelta() {
+    return this[dartx.getPropertyValue]('font-size-delta');
+  }
+  set fontSizeDelta(value) {
+    this[dartx.setProperty]('font-size-delta', value, '');
+  }
+  get fontSmoothing() {
+    return this[dartx.getPropertyValue]('font-smoothing');
+  }
+  set fontSmoothing(value) {
+    this[dartx.setProperty]('font-smoothing', value, '');
+  }
+  get fontStretch() {
+    return this[dartx.getPropertyValue]('font-stretch');
+  }
+  set fontStretch(value) {
+    this[dartx.setProperty]('font-stretch', value, '');
+  }
+  get fontStyle() {
+    return this[dartx.getPropertyValue]('font-style');
+  }
+  set fontStyle(value) {
+    this[dartx.setProperty]('font-style', value, '');
+  }
+  get fontVariant() {
+    return this[dartx.getPropertyValue]('font-variant');
+  }
+  set fontVariant(value) {
+    this[dartx.setProperty]('font-variant', value, '');
+  }
+  get fontVariantLigatures() {
+    return this[dartx.getPropertyValue]('font-variant-ligatures');
+  }
+  set fontVariantLigatures(value) {
+    this[dartx.setProperty]('font-variant-ligatures', value, '');
+  }
+  get fontWeight() {
+    return this[dartx.getPropertyValue]('font-weight');
+  }
+  set fontWeight(value) {
+    this[dartx.setProperty]('font-weight', value, '');
+  }
+  get grid() {
+    return this[dartx.getPropertyValue]('grid');
+  }
+  set grid(value) {
+    this[dartx.setProperty]('grid', value, '');
+  }
+  get gridArea() {
+    return this[dartx.getPropertyValue]('grid-area');
+  }
+  set gridArea(value) {
+    this[dartx.setProperty]('grid-area', value, '');
+  }
+  get gridAutoColumns() {
+    return this[dartx.getPropertyValue]('grid-auto-columns');
+  }
+  set gridAutoColumns(value) {
+    this[dartx.setProperty]('grid-auto-columns', value, '');
+  }
+  get gridAutoFlow() {
+    return this[dartx.getPropertyValue]('grid-auto-flow');
+  }
+  set gridAutoFlow(value) {
+    this[dartx.setProperty]('grid-auto-flow', value, '');
+  }
+  get gridAutoRows() {
+    return this[dartx.getPropertyValue]('grid-auto-rows');
+  }
+  set gridAutoRows(value) {
+    this[dartx.setProperty]('grid-auto-rows', value, '');
+  }
+  get gridColumn() {
+    return this[dartx.getPropertyValue]('grid-column');
+  }
+  set gridColumn(value) {
+    this[dartx.setProperty]('grid-column', value, '');
+  }
+  get gridColumnEnd() {
+    return this[dartx.getPropertyValue]('grid-column-end');
+  }
+  set gridColumnEnd(value) {
+    this[dartx.setProperty]('grid-column-end', value, '');
+  }
+  get gridColumnStart() {
+    return this[dartx.getPropertyValue]('grid-column-start');
+  }
+  set gridColumnStart(value) {
+    this[dartx.setProperty]('grid-column-start', value, '');
+  }
+  get gridRow() {
+    return this[dartx.getPropertyValue]('grid-row');
+  }
+  set gridRow(value) {
+    this[dartx.setProperty]('grid-row', value, '');
+  }
+  get gridRowEnd() {
+    return this[dartx.getPropertyValue]('grid-row-end');
+  }
+  set gridRowEnd(value) {
+    this[dartx.setProperty]('grid-row-end', value, '');
+  }
+  get gridRowStart() {
+    return this[dartx.getPropertyValue]('grid-row-start');
+  }
+  set gridRowStart(value) {
+    this[dartx.setProperty]('grid-row-start', value, '');
+  }
+  get gridTemplate() {
+    return this[dartx.getPropertyValue]('grid-template');
+  }
+  set gridTemplate(value) {
+    this[dartx.setProperty]('grid-template', value, '');
+  }
+  get gridTemplateAreas() {
+    return this[dartx.getPropertyValue]('grid-template-areas');
+  }
+  set gridTemplateAreas(value) {
+    this[dartx.setProperty]('grid-template-areas', value, '');
+  }
+  get gridTemplateColumns() {
+    return this[dartx.getPropertyValue]('grid-template-columns');
+  }
+  set gridTemplateColumns(value) {
+    this[dartx.setProperty]('grid-template-columns', value, '');
+  }
+  get gridTemplateRows() {
+    return this[dartx.getPropertyValue]('grid-template-rows');
+  }
+  set gridTemplateRows(value) {
+    this[dartx.setProperty]('grid-template-rows', value, '');
+  }
+  get height() {
+    return this[dartx.getPropertyValue]('height');
+  }
+  set height(value) {
+    this[dartx.setProperty]('height', value, '');
+  }
+  get highlight() {
+    return this[dartx.getPropertyValue]('highlight');
+  }
+  set highlight(value) {
+    this[dartx.setProperty]('highlight', value, '');
+  }
+  get hyphenateCharacter() {
+    return this[dartx.getPropertyValue]('hyphenate-character');
+  }
+  set hyphenateCharacter(value) {
+    this[dartx.setProperty]('hyphenate-character', value, '');
+  }
+  get imageRendering() {
+    return this[dartx.getPropertyValue]('image-rendering');
+  }
+  set imageRendering(value) {
+    this[dartx.setProperty]('image-rendering', value, '');
+  }
+  get isolation() {
+    return this[dartx.getPropertyValue]('isolation');
+  }
+  set isolation(value) {
+    this[dartx.setProperty]('isolation', value, '');
+  }
+  get justifyContent() {
+    return this[dartx.getPropertyValue]('justify-content');
+  }
+  set justifyContent(value) {
+    this[dartx.setProperty]('justify-content', value, '');
+  }
+  get justifySelf() {
+    return this[dartx.getPropertyValue]('justify-self');
+  }
+  set justifySelf(value) {
+    this[dartx.setProperty]('justify-self', value, '');
+  }
+  get left() {
+    return this[dartx.getPropertyValue]('left');
+  }
+  set left(value) {
+    this[dartx.setProperty]('left', value, '');
+  }
+  get letterSpacing() {
+    return this[dartx.getPropertyValue]('letter-spacing');
+  }
+  set letterSpacing(value) {
+    this[dartx.setProperty]('letter-spacing', value, '');
+  }
+  get lineBoxContain() {
+    return this[dartx.getPropertyValue]('line-box-contain');
+  }
+  set lineBoxContain(value) {
+    this[dartx.setProperty]('line-box-contain', value, '');
+  }
+  get lineBreak() {
+    return this[dartx.getPropertyValue]('line-break');
+  }
+  set lineBreak(value) {
+    this[dartx.setProperty]('line-break', value, '');
+  }
+  get lineClamp() {
+    return this[dartx.getPropertyValue]('line-clamp');
+  }
+  set lineClamp(value) {
+    this[dartx.setProperty]('line-clamp', value, '');
+  }
+  get lineHeight() {
+    return this[dartx.getPropertyValue]('line-height');
+  }
+  set lineHeight(value) {
+    this[dartx.setProperty]('line-height', value, '');
+  }
+  get listStyle() {
+    return this[dartx.getPropertyValue]('list-style');
+  }
+  set listStyle(value) {
+    this[dartx.setProperty]('list-style', value, '');
+  }
+  get listStyleImage() {
+    return this[dartx.getPropertyValue]('list-style-image');
+  }
+  set listStyleImage(value) {
+    this[dartx.setProperty]('list-style-image', value, '');
+  }
+  get listStylePosition() {
+    return this[dartx.getPropertyValue]('list-style-position');
+  }
+  set listStylePosition(value) {
+    this[dartx.setProperty]('list-style-position', value, '');
+  }
+  get listStyleType() {
+    return this[dartx.getPropertyValue]('list-style-type');
+  }
+  set listStyleType(value) {
+    this[dartx.setProperty]('list-style-type', value, '');
+  }
+  get locale() {
+    return this[dartx.getPropertyValue]('locale');
+  }
+  set locale(value) {
+    this[dartx.setProperty]('locale', value, '');
+  }
+  get logicalHeight() {
+    return this[dartx.getPropertyValue]('logical-height');
+  }
+  set logicalHeight(value) {
+    this[dartx.setProperty]('logical-height', value, '');
+  }
+  get logicalWidth() {
+    return this[dartx.getPropertyValue]('logical-width');
+  }
+  set logicalWidth(value) {
+    this[dartx.setProperty]('logical-width', value, '');
+  }
+  get margin() {
+    return this[dartx.getPropertyValue]('margin');
+  }
+  set margin(value) {
+    this[dartx.setProperty]('margin', value, '');
+  }
+  get marginAfter() {
+    return this[dartx.getPropertyValue]('margin-after');
+  }
+  set marginAfter(value) {
+    this[dartx.setProperty]('margin-after', value, '');
+  }
+  get marginAfterCollapse() {
+    return this[dartx.getPropertyValue]('margin-after-collapse');
+  }
+  set marginAfterCollapse(value) {
+    this[dartx.setProperty]('margin-after-collapse', value, '');
+  }
+  get marginBefore() {
+    return this[dartx.getPropertyValue]('margin-before');
+  }
+  set marginBefore(value) {
+    this[dartx.setProperty]('margin-before', value, '');
+  }
+  get marginBeforeCollapse() {
+    return this[dartx.getPropertyValue]('margin-before-collapse');
+  }
+  set marginBeforeCollapse(value) {
+    this[dartx.setProperty]('margin-before-collapse', value, '');
+  }
+  get marginBottom() {
+    return this[dartx.getPropertyValue]('margin-bottom');
+  }
+  set marginBottom(value) {
+    this[dartx.setProperty]('margin-bottom', value, '');
+  }
+  get marginBottomCollapse() {
+    return this[dartx.getPropertyValue]('margin-bottom-collapse');
+  }
+  set marginBottomCollapse(value) {
+    this[dartx.setProperty]('margin-bottom-collapse', value, '');
+  }
+  get marginCollapse() {
+    return this[dartx.getPropertyValue]('margin-collapse');
+  }
+  set marginCollapse(value) {
+    this[dartx.setProperty]('margin-collapse', value, '');
+  }
+  get marginEnd() {
+    return this[dartx.getPropertyValue]('margin-end');
+  }
+  set marginEnd(value) {
+    this[dartx.setProperty]('margin-end', value, '');
+  }
+  get marginLeft() {
+    return this[dartx.getPropertyValue]('margin-left');
+  }
+  set marginLeft(value) {
+    this[dartx.setProperty]('margin-left', value, '');
+  }
+  get marginRight() {
+    return this[dartx.getPropertyValue]('margin-right');
+  }
+  set marginRight(value) {
+    this[dartx.setProperty]('margin-right', value, '');
+  }
+  get marginStart() {
+    return this[dartx.getPropertyValue]('margin-start');
+  }
+  set marginStart(value) {
+    this[dartx.setProperty]('margin-start', value, '');
+  }
+  get marginTop() {
+    return this[dartx.getPropertyValue]('margin-top');
+  }
+  set marginTop(value) {
+    this[dartx.setProperty]('margin-top', value, '');
+  }
+  get marginTopCollapse() {
+    return this[dartx.getPropertyValue]('margin-top-collapse');
+  }
+  set marginTopCollapse(value) {
+    this[dartx.setProperty]('margin-top-collapse', value, '');
+  }
+  get mask() {
+    return this[dartx.getPropertyValue]('mask');
+  }
+  set mask(value) {
+    this[dartx.setProperty]('mask', value, '');
+  }
+  get maskBoxImage() {
+    return this[dartx.getPropertyValue]('mask-box-image');
+  }
+  set maskBoxImage(value) {
+    this[dartx.setProperty]('mask-box-image', value, '');
+  }
+  get maskBoxImageOutset() {
+    return this[dartx.getPropertyValue]('mask-box-image-outset');
+  }
+  set maskBoxImageOutset(value) {
+    this[dartx.setProperty]('mask-box-image-outset', value, '');
+  }
+  get maskBoxImageRepeat() {
+    return this[dartx.getPropertyValue]('mask-box-image-repeat');
+  }
+  set maskBoxImageRepeat(value) {
+    this[dartx.setProperty]('mask-box-image-repeat', value, '');
+  }
+  get maskBoxImageSlice() {
+    return this[dartx.getPropertyValue]('mask-box-image-slice');
+  }
+  set maskBoxImageSlice(value) {
+    this[dartx.setProperty]('mask-box-image-slice', value, '');
+  }
+  get maskBoxImageSource() {
+    return this[dartx.getPropertyValue]('mask-box-image-source');
+  }
+  set maskBoxImageSource(value) {
+    this[dartx.setProperty]('mask-box-image-source', value, '');
+  }
+  get maskBoxImageWidth() {
+    return this[dartx.getPropertyValue]('mask-box-image-width');
+  }
+  set maskBoxImageWidth(value) {
+    this[dartx.setProperty]('mask-box-image-width', value, '');
+  }
+  get maskClip() {
+    return this[dartx.getPropertyValue]('mask-clip');
+  }
+  set maskClip(value) {
+    this[dartx.setProperty]('mask-clip', value, '');
+  }
+  get maskComposite() {
+    return this[dartx.getPropertyValue]('mask-composite');
+  }
+  set maskComposite(value) {
+    this[dartx.setProperty]('mask-composite', value, '');
+  }
+  get maskImage() {
+    return this[dartx.getPropertyValue]('mask-image');
+  }
+  set maskImage(value) {
+    this[dartx.setProperty]('mask-image', value, '');
+  }
+  get maskOrigin() {
+    return this[dartx.getPropertyValue]('mask-origin');
+  }
+  set maskOrigin(value) {
+    this[dartx.setProperty]('mask-origin', value, '');
+  }
+  get maskPosition() {
+    return this[dartx.getPropertyValue]('mask-position');
+  }
+  set maskPosition(value) {
+    this[dartx.setProperty]('mask-position', value, '');
+  }
+  get maskPositionX() {
+    return this[dartx.getPropertyValue]('mask-position-x');
+  }
+  set maskPositionX(value) {
+    this[dartx.setProperty]('mask-position-x', value, '');
+  }
+  get maskPositionY() {
+    return this[dartx.getPropertyValue]('mask-position-y');
+  }
+  set maskPositionY(value) {
+    this[dartx.setProperty]('mask-position-y', value, '');
+  }
+  get maskRepeat() {
+    return this[dartx.getPropertyValue]('mask-repeat');
+  }
+  set maskRepeat(value) {
+    this[dartx.setProperty]('mask-repeat', value, '');
+  }
+  get maskRepeatX() {
+    return this[dartx.getPropertyValue]('mask-repeat-x');
+  }
+  set maskRepeatX(value) {
+    this[dartx.setProperty]('mask-repeat-x', value, '');
+  }
+  get maskRepeatY() {
+    return this[dartx.getPropertyValue]('mask-repeat-y');
+  }
+  set maskRepeatY(value) {
+    this[dartx.setProperty]('mask-repeat-y', value, '');
+  }
+  get maskSize() {
+    return this[dartx.getPropertyValue]('mask-size');
+  }
+  set maskSize(value) {
+    this[dartx.setProperty]('mask-size', value, '');
+  }
+  get maskSourceType() {
+    return this[dartx.getPropertyValue]('mask-source-type');
+  }
+  set maskSourceType(value) {
+    this[dartx.setProperty]('mask-source-type', value, '');
+  }
+  get maxHeight() {
+    return this[dartx.getPropertyValue]('max-height');
+  }
+  set maxHeight(value) {
+    this[dartx.setProperty]('max-height', value, '');
+  }
+  get maxLogicalHeight() {
+    return this[dartx.getPropertyValue]('max-logical-height');
+  }
+  set maxLogicalHeight(value) {
+    this[dartx.setProperty]('max-logical-height', value, '');
+  }
+  get maxLogicalWidth() {
+    return this[dartx.getPropertyValue]('max-logical-width');
+  }
+  set maxLogicalWidth(value) {
+    this[dartx.setProperty]('max-logical-width', value, '');
+  }
+  get maxWidth() {
+    return this[dartx.getPropertyValue]('max-width');
+  }
+  set maxWidth(value) {
+    this[dartx.setProperty]('max-width', value, '');
+  }
+  get maxZoom() {
+    return this[dartx.getPropertyValue]('max-zoom');
+  }
+  set maxZoom(value) {
+    this[dartx.setProperty]('max-zoom', value, '');
+  }
+  get minHeight() {
+    return this[dartx.getPropertyValue]('min-height');
+  }
+  set minHeight(value) {
+    this[dartx.setProperty]('min-height', value, '');
+  }
+  get minLogicalHeight() {
+    return this[dartx.getPropertyValue]('min-logical-height');
+  }
+  set minLogicalHeight(value) {
+    this[dartx.setProperty]('min-logical-height', value, '');
+  }
+  get minLogicalWidth() {
+    return this[dartx.getPropertyValue]('min-logical-width');
+  }
+  set minLogicalWidth(value) {
+    this[dartx.setProperty]('min-logical-width', value, '');
+  }
+  get minWidth() {
+    return this[dartx.getPropertyValue]('min-width');
+  }
+  set minWidth(value) {
+    this[dartx.setProperty]('min-width', value, '');
+  }
+  get minZoom() {
+    return this[dartx.getPropertyValue]('min-zoom');
+  }
+  set minZoom(value) {
+    this[dartx.setProperty]('min-zoom', value, '');
+  }
+  get mixBlendMode() {
+    return this[dartx.getPropertyValue]('mix-blend-mode');
+  }
+  set mixBlendMode(value) {
+    this[dartx.setProperty]('mix-blend-mode', value, '');
+  }
+  get objectFit() {
+    return this[dartx.getPropertyValue]('object-fit');
+  }
+  set objectFit(value) {
+    this[dartx.setProperty]('object-fit', value, '');
+  }
+  get objectPosition() {
+    return this[dartx.getPropertyValue]('object-position');
+  }
+  set objectPosition(value) {
+    this[dartx.setProperty]('object-position', value, '');
+  }
+  get opacity() {
+    return this[dartx.getPropertyValue]('opacity');
+  }
+  set opacity(value) {
+    this[dartx.setProperty]('opacity', value, '');
+  }
+  get order() {
+    return this[dartx.getPropertyValue]('order');
+  }
+  set order(value) {
+    this[dartx.setProperty]('order', value, '');
+  }
+  get orientation() {
+    return this[dartx.getPropertyValue]('orientation');
+  }
+  set orientation(value) {
+    this[dartx.setProperty]('orientation', value, '');
+  }
+  get orphans() {
+    return this[dartx.getPropertyValue]('orphans');
+  }
+  set orphans(value) {
+    this[dartx.setProperty]('orphans', value, '');
+  }
+  get outline() {
+    return this[dartx.getPropertyValue]('outline');
+  }
+  set outline(value) {
+    this[dartx.setProperty]('outline', value, '');
+  }
+  get outlineColor() {
+    return this[dartx.getPropertyValue]('outline-color');
+  }
+  set outlineColor(value) {
+    this[dartx.setProperty]('outline-color', value, '');
+  }
+  get outlineOffset() {
+    return this[dartx.getPropertyValue]('outline-offset');
+  }
+  set outlineOffset(value) {
+    this[dartx.setProperty]('outline-offset', value, '');
+  }
+  get outlineStyle() {
+    return this[dartx.getPropertyValue]('outline-style');
+  }
+  set outlineStyle(value) {
+    this[dartx.setProperty]('outline-style', value, '');
+  }
+  get outlineWidth() {
+    return this[dartx.getPropertyValue]('outline-width');
+  }
+  set outlineWidth(value) {
+    this[dartx.setProperty]('outline-width', value, '');
+  }
+  get overflow() {
+    return this[dartx.getPropertyValue]('overflow');
+  }
+  set overflow(value) {
+    this[dartx.setProperty]('overflow', value, '');
+  }
+  get overflowWrap() {
+    return this[dartx.getPropertyValue]('overflow-wrap');
+  }
+  set overflowWrap(value) {
+    this[dartx.setProperty]('overflow-wrap', value, '');
+  }
+  get overflowX() {
+    return this[dartx.getPropertyValue]('overflow-x');
+  }
+  set overflowX(value) {
+    this[dartx.setProperty]('overflow-x', value, '');
+  }
+  get overflowY() {
+    return this[dartx.getPropertyValue]('overflow-y');
+  }
+  set overflowY(value) {
+    this[dartx.setProperty]('overflow-y', value, '');
+  }
+  get padding() {
+    return this[dartx.getPropertyValue]('padding');
+  }
+  set padding(value) {
+    this[dartx.setProperty]('padding', value, '');
+  }
+  get paddingAfter() {
+    return this[dartx.getPropertyValue]('padding-after');
+  }
+  set paddingAfter(value) {
+    this[dartx.setProperty]('padding-after', value, '');
+  }
+  get paddingBefore() {
+    return this[dartx.getPropertyValue]('padding-before');
+  }
+  set paddingBefore(value) {
+    this[dartx.setProperty]('padding-before', value, '');
+  }
+  get paddingBottom() {
+    return this[dartx.getPropertyValue]('padding-bottom');
+  }
+  set paddingBottom(value) {
+    this[dartx.setProperty]('padding-bottom', value, '');
+  }
+  get paddingEnd() {
+    return this[dartx.getPropertyValue]('padding-end');
+  }
+  set paddingEnd(value) {
+    this[dartx.setProperty]('padding-end', value, '');
+  }
+  get paddingLeft() {
+    return this[dartx.getPropertyValue]('padding-left');
+  }
+  set paddingLeft(value) {
+    this[dartx.setProperty]('padding-left', value, '');
+  }
+  get paddingRight() {
+    return this[dartx.getPropertyValue]('padding-right');
+  }
+  set paddingRight(value) {
+    this[dartx.setProperty]('padding-right', value, '');
+  }
+  get paddingStart() {
+    return this[dartx.getPropertyValue]('padding-start');
+  }
+  set paddingStart(value) {
+    this[dartx.setProperty]('padding-start', value, '');
+  }
+  get paddingTop() {
+    return this[dartx.getPropertyValue]('padding-top');
+  }
+  set paddingTop(value) {
+    this[dartx.setProperty]('padding-top', value, '');
+  }
+  get page() {
+    return this[dartx.getPropertyValue]('page');
+  }
+  set page(value) {
+    this[dartx.setProperty]('page', value, '');
+  }
+  get pageBreakAfter() {
+    return this[dartx.getPropertyValue]('page-break-after');
+  }
+  set pageBreakAfter(value) {
+    this[dartx.setProperty]('page-break-after', value, '');
+  }
+  get pageBreakBefore() {
+    return this[dartx.getPropertyValue]('page-break-before');
+  }
+  set pageBreakBefore(value) {
+    this[dartx.setProperty]('page-break-before', value, '');
+  }
+  get pageBreakInside() {
+    return this[dartx.getPropertyValue]('page-break-inside');
+  }
+  set pageBreakInside(value) {
+    this[dartx.setProperty]('page-break-inside', value, '');
+  }
+  get perspective() {
+    return this[dartx.getPropertyValue]('perspective');
+  }
+  set perspective(value) {
+    this[dartx.setProperty]('perspective', value, '');
+  }
+  get perspectiveOrigin() {
+    return this[dartx.getPropertyValue]('perspective-origin');
+  }
+  set perspectiveOrigin(value) {
+    this[dartx.setProperty]('perspective-origin', value, '');
+  }
+  get perspectiveOriginX() {
+    return this[dartx.getPropertyValue]('perspective-origin-x');
+  }
+  set perspectiveOriginX(value) {
+    this[dartx.setProperty]('perspective-origin-x', value, '');
+  }
+  get perspectiveOriginY() {
+    return this[dartx.getPropertyValue]('perspective-origin-y');
+  }
+  set perspectiveOriginY(value) {
+    this[dartx.setProperty]('perspective-origin-y', value, '');
+  }
+  get pointerEvents() {
+    return this[dartx.getPropertyValue]('pointer-events');
+  }
+  set pointerEvents(value) {
+    this[dartx.setProperty]('pointer-events', value, '');
+  }
+  get position() {
+    return this[dartx.getPropertyValue]('position');
+  }
+  set position(value) {
+    this[dartx.setProperty]('position', value, '');
+  }
+  get printColorAdjust() {
+    return this[dartx.getPropertyValue]('print-color-adjust');
+  }
+  set printColorAdjust(value) {
+    this[dartx.setProperty]('print-color-adjust', value, '');
+  }
+  get quotes() {
+    return this[dartx.getPropertyValue]('quotes');
+  }
+  set quotes(value) {
+    this[dartx.setProperty]('quotes', value, '');
+  }
+  get resize() {
+    return this[dartx.getPropertyValue]('resize');
+  }
+  set resize(value) {
+    this[dartx.setProperty]('resize', value, '');
+  }
+  get right() {
+    return this[dartx.getPropertyValue]('right');
+  }
+  set right(value) {
+    this[dartx.setProperty]('right', value, '');
+  }
+  get rtlOrdering() {
+    return this[dartx.getPropertyValue]('rtl-ordering');
+  }
+  set rtlOrdering(value) {
+    this[dartx.setProperty]('rtl-ordering', value, '');
+  }
+  get rubyPosition() {
+    return this[dartx.getPropertyValue]('ruby-position');
+  }
+  set rubyPosition(value) {
+    this[dartx.setProperty]('ruby-position', value, '');
+  }
+  get scrollBehavior() {
+    return this[dartx.getPropertyValue]('scroll-behavior');
+  }
+  set scrollBehavior(value) {
+    this[dartx.setProperty]('scroll-behavior', value, '');
+  }
+  get shapeImageThreshold() {
+    return this[dartx.getPropertyValue]('shape-image-threshold');
+  }
+  set shapeImageThreshold(value) {
+    this[dartx.setProperty]('shape-image-threshold', value, '');
+  }
+  get shapeMargin() {
+    return this[dartx.getPropertyValue]('shape-margin');
+  }
+  set shapeMargin(value) {
+    this[dartx.setProperty]('shape-margin', value, '');
+  }
+  get shapeOutside() {
+    return this[dartx.getPropertyValue]('shape-outside');
+  }
+  set shapeOutside(value) {
+    this[dartx.setProperty]('shape-outside', value, '');
+  }
+  get size() {
+    return this[dartx.getPropertyValue]('size');
+  }
+  set size(value) {
+    this[dartx.setProperty]('size', value, '');
+  }
+  get speak() {
+    return this[dartx.getPropertyValue]('speak');
+  }
+  set speak(value) {
+    this[dartx.setProperty]('speak', value, '');
+  }
+  get src() {
+    return this[dartx.getPropertyValue]('src');
+  }
+  set src(value) {
+    this[dartx.setProperty]('src', value, '');
+  }
+  get tabSize() {
+    return this[dartx.getPropertyValue]('tab-size');
+  }
+  set tabSize(value) {
+    this[dartx.setProperty]('tab-size', value, '');
+  }
+  get tableLayout() {
+    return this[dartx.getPropertyValue]('table-layout');
+  }
+  set tableLayout(value) {
+    this[dartx.setProperty]('table-layout', value, '');
+  }
+  get tapHighlightColor() {
+    return this[dartx.getPropertyValue]('tap-highlight-color');
+  }
+  set tapHighlightColor(value) {
+    this[dartx.setProperty]('tap-highlight-color', value, '');
+  }
+  get textAlign() {
+    return this[dartx.getPropertyValue]('text-align');
+  }
+  set textAlign(value) {
+    this[dartx.setProperty]('text-align', value, '');
+  }
+  get textAlignLast() {
+    return this[dartx.getPropertyValue]('text-align-last');
+  }
+  set textAlignLast(value) {
+    this[dartx.setProperty]('text-align-last', value, '');
+  }
+  get textCombine() {
+    return this[dartx.getPropertyValue]('text-combine');
+  }
+  set textCombine(value) {
+    this[dartx.setProperty]('text-combine', value, '');
+  }
+  get textDecoration() {
+    return this[dartx.getPropertyValue]('text-decoration');
+  }
+  set textDecoration(value) {
+    this[dartx.setProperty]('text-decoration', value, '');
+  }
+  get textDecorationColor() {
+    return this[dartx.getPropertyValue]('text-decoration-color');
+  }
+  set textDecorationColor(value) {
+    this[dartx.setProperty]('text-decoration-color', value, '');
+  }
+  get textDecorationLine() {
+    return this[dartx.getPropertyValue]('text-decoration-line');
+  }
+  set textDecorationLine(value) {
+    this[dartx.setProperty]('text-decoration-line', value, '');
+  }
+  get textDecorationStyle() {
+    return this[dartx.getPropertyValue]('text-decoration-style');
+  }
+  set textDecorationStyle(value) {
+    this[dartx.setProperty]('text-decoration-style', value, '');
+  }
+  get textDecorationsInEffect() {
+    return this[dartx.getPropertyValue]('text-decorations-in-effect');
+  }
+  set textDecorationsInEffect(value) {
+    this[dartx.setProperty]('text-decorations-in-effect', value, '');
+  }
+  get textEmphasis() {
+    return this[dartx.getPropertyValue]('text-emphasis');
+  }
+  set textEmphasis(value) {
+    this[dartx.setProperty]('text-emphasis', value, '');
+  }
+  get textEmphasisColor() {
+    return this[dartx.getPropertyValue]('text-emphasis-color');
+  }
+  set textEmphasisColor(value) {
+    this[dartx.setProperty]('text-emphasis-color', value, '');
+  }
+  get textEmphasisPosition() {
+    return this[dartx.getPropertyValue]('text-emphasis-position');
+  }
+  set textEmphasisPosition(value) {
+    this[dartx.setProperty]('text-emphasis-position', value, '');
+  }
+  get textEmphasisStyle() {
+    return this[dartx.getPropertyValue]('text-emphasis-style');
+  }
+  set textEmphasisStyle(value) {
+    this[dartx.setProperty]('text-emphasis-style', value, '');
+  }
+  get textFillColor() {
+    return this[dartx.getPropertyValue]('text-fill-color');
+  }
+  set textFillColor(value) {
+    this[dartx.setProperty]('text-fill-color', value, '');
+  }
+  get textIndent() {
+    return this[dartx.getPropertyValue]('text-indent');
+  }
+  set textIndent(value) {
+    this[dartx.setProperty]('text-indent', value, '');
+  }
+  get textJustify() {
+    return this[dartx.getPropertyValue]('text-justify');
+  }
+  set textJustify(value) {
+    this[dartx.setProperty]('text-justify', value, '');
+  }
+  get textLineThroughColor() {
+    return this[dartx.getPropertyValue]('text-line-through-color');
+  }
+  set textLineThroughColor(value) {
+    this[dartx.setProperty]('text-line-through-color', value, '');
+  }
+  get textLineThroughMode() {
+    return this[dartx.getPropertyValue]('text-line-through-mode');
+  }
+  set textLineThroughMode(value) {
+    this[dartx.setProperty]('text-line-through-mode', value, '');
+  }
+  get textLineThroughStyle() {
+    return this[dartx.getPropertyValue]('text-line-through-style');
+  }
+  set textLineThroughStyle(value) {
+    this[dartx.setProperty]('text-line-through-style', value, '');
+  }
+  get textLineThroughWidth() {
+    return this[dartx.getPropertyValue]('text-line-through-width');
+  }
+  set textLineThroughWidth(value) {
+    this[dartx.setProperty]('text-line-through-width', value, '');
+  }
+  get textOrientation() {
+    return this[dartx.getPropertyValue]('text-orientation');
+  }
+  set textOrientation(value) {
+    this[dartx.setProperty]('text-orientation', value, '');
+  }
+  get textOverflow() {
+    return this[dartx.getPropertyValue]('text-overflow');
+  }
+  set textOverflow(value) {
+    this[dartx.setProperty]('text-overflow', value, '');
+  }
+  get textOverlineColor() {
+    return this[dartx.getPropertyValue]('text-overline-color');
+  }
+  set textOverlineColor(value) {
+    this[dartx.setProperty]('text-overline-color', value, '');
+  }
+  get textOverlineMode() {
+    return this[dartx.getPropertyValue]('text-overline-mode');
+  }
+  set textOverlineMode(value) {
+    this[dartx.setProperty]('text-overline-mode', value, '');
+  }
+  get textOverlineStyle() {
+    return this[dartx.getPropertyValue]('text-overline-style');
+  }
+  set textOverlineStyle(value) {
+    this[dartx.setProperty]('text-overline-style', value, '');
+  }
+  get textOverlineWidth() {
+    return this[dartx.getPropertyValue]('text-overline-width');
+  }
+  set textOverlineWidth(value) {
+    this[dartx.setProperty]('text-overline-width', value, '');
+  }
+  get textRendering() {
+    return this[dartx.getPropertyValue]('text-rendering');
+  }
+  set textRendering(value) {
+    this[dartx.setProperty]('text-rendering', value, '');
+  }
+  get textSecurity() {
+    return this[dartx.getPropertyValue]('text-security');
+  }
+  set textSecurity(value) {
+    this[dartx.setProperty]('text-security', value, '');
+  }
+  get textShadow() {
+    return this[dartx.getPropertyValue]('text-shadow');
+  }
+  set textShadow(value) {
+    this[dartx.setProperty]('text-shadow', value, '');
+  }
+  get textStroke() {
+    return this[dartx.getPropertyValue]('text-stroke');
+  }
+  set textStroke(value) {
+    this[dartx.setProperty]('text-stroke', value, '');
+  }
+  get textStrokeColor() {
+    return this[dartx.getPropertyValue]('text-stroke-color');
+  }
+  set textStrokeColor(value) {
+    this[dartx.setProperty]('text-stroke-color', value, '');
+  }
+  get textStrokeWidth() {
+    return this[dartx.getPropertyValue]('text-stroke-width');
+  }
+  set textStrokeWidth(value) {
+    this[dartx.setProperty]('text-stroke-width', value, '');
+  }
+  get textTransform() {
+    return this[dartx.getPropertyValue]('text-transform');
+  }
+  set textTransform(value) {
+    this[dartx.setProperty]('text-transform', value, '');
+  }
+  get textUnderlineColor() {
+    return this[dartx.getPropertyValue]('text-underline-color');
+  }
+  set textUnderlineColor(value) {
+    this[dartx.setProperty]('text-underline-color', value, '');
+  }
+  get textUnderlineMode() {
+    return this[dartx.getPropertyValue]('text-underline-mode');
+  }
+  set textUnderlineMode(value) {
+    this[dartx.setProperty]('text-underline-mode', value, '');
+  }
+  get textUnderlinePosition() {
+    return this[dartx.getPropertyValue]('text-underline-position');
+  }
+  set textUnderlinePosition(value) {
+    this[dartx.setProperty]('text-underline-position', value, '');
+  }
+  get textUnderlineStyle() {
+    return this[dartx.getPropertyValue]('text-underline-style');
+  }
+  set textUnderlineStyle(value) {
+    this[dartx.setProperty]('text-underline-style', value, '');
+  }
+  get textUnderlineWidth() {
+    return this[dartx.getPropertyValue]('text-underline-width');
+  }
+  set textUnderlineWidth(value) {
+    this[dartx.setProperty]('text-underline-width', value, '');
+  }
+  get top() {
+    return this[dartx.getPropertyValue]('top');
+  }
+  set top(value) {
+    this[dartx.setProperty]('top', value, '');
+  }
+  get touchAction() {
+    return this[dartx.getPropertyValue]('touch-action');
+  }
+  set touchAction(value) {
+    this[dartx.setProperty]('touch-action', value, '');
+  }
+  get touchActionDelay() {
+    return this[dartx.getPropertyValue]('touch-action-delay');
+  }
+  set touchActionDelay(value) {
+    this[dartx.setProperty]('touch-action-delay', value, '');
+  }
+  get transform() {
+    return this[dartx.getPropertyValue]('transform');
+  }
+  set transform(value) {
+    this[dartx.setProperty]('transform', value, '');
+  }
+  get transformOrigin() {
+    return this[dartx.getPropertyValue]('transform-origin');
+  }
+  set transformOrigin(value) {
+    this[dartx.setProperty]('transform-origin', value, '');
+  }
+  get transformOriginX() {
+    return this[dartx.getPropertyValue]('transform-origin-x');
+  }
+  set transformOriginX(value) {
+    this[dartx.setProperty]('transform-origin-x', value, '');
+  }
+  get transformOriginY() {
+    return this[dartx.getPropertyValue]('transform-origin-y');
+  }
+  set transformOriginY(value) {
+    this[dartx.setProperty]('transform-origin-y', value, '');
+  }
+  get transformOriginZ() {
+    return this[dartx.getPropertyValue]('transform-origin-z');
+  }
+  set transformOriginZ(value) {
+    this[dartx.setProperty]('transform-origin-z', value, '');
+  }
+  get transformStyle() {
+    return this[dartx.getPropertyValue]('transform-style');
+  }
+  set transformStyle(value) {
+    this[dartx.setProperty]('transform-style', value, '');
+  }
+  get transition() {
+    return this[dartx.getPropertyValue]('transition');
+  }
+  set transition(value) {
+    this[dartx.setProperty]('transition', value, '');
+  }
+  get transitionDelay() {
+    return this[dartx.getPropertyValue]('transition-delay');
+  }
+  set transitionDelay(value) {
+    this[dartx.setProperty]('transition-delay', value, '');
+  }
+  get transitionDuration() {
+    return this[dartx.getPropertyValue]('transition-duration');
+  }
+  set transitionDuration(value) {
+    this[dartx.setProperty]('transition-duration', value, '');
+  }
+  get transitionProperty() {
+    return this[dartx.getPropertyValue]('transition-property');
+  }
+  set transitionProperty(value) {
+    this[dartx.setProperty]('transition-property', value, '');
+  }
+  get transitionTimingFunction() {
+    return this[dartx.getPropertyValue]('transition-timing-function');
+  }
+  set transitionTimingFunction(value) {
+    this[dartx.setProperty]('transition-timing-function', value, '');
+  }
+  get unicodeBidi() {
+    return this[dartx.getPropertyValue]('unicode-bidi');
+  }
+  set unicodeBidi(value) {
+    this[dartx.setProperty]('unicode-bidi', value, '');
+  }
+  get unicodeRange() {
+    return this[dartx.getPropertyValue]('unicode-range');
+  }
+  set unicodeRange(value) {
+    this[dartx.setProperty]('unicode-range', value, '');
+  }
+  get userDrag() {
+    return this[dartx.getPropertyValue]('user-drag');
+  }
+  set userDrag(value) {
+    this[dartx.setProperty]('user-drag', value, '');
+  }
+  get userModify() {
+    return this[dartx.getPropertyValue]('user-modify');
+  }
+  set userModify(value) {
+    this[dartx.setProperty]('user-modify', value, '');
+  }
+  get userSelect() {
+    return this[dartx.getPropertyValue]('user-select');
+  }
+  set userSelect(value) {
+    this[dartx.setProperty]('user-select', value, '');
+  }
+  get userZoom() {
+    return this[dartx.getPropertyValue]('user-zoom');
+  }
+  set userZoom(value) {
+    this[dartx.setProperty]('user-zoom', value, '');
+  }
+  get verticalAlign() {
+    return this[dartx.getPropertyValue]('vertical-align');
+  }
+  set verticalAlign(value) {
+    this[dartx.setProperty]('vertical-align', value, '');
+  }
+  get visibility() {
+    return this[dartx.getPropertyValue]('visibility');
+  }
+  set visibility(value) {
+    this[dartx.setProperty]('visibility', value, '');
+  }
+  get whiteSpace() {
+    return this[dartx.getPropertyValue]('white-space');
+  }
+  set whiteSpace(value) {
+    this[dartx.setProperty]('white-space', value, '');
+  }
+  get widows() {
+    return this[dartx.getPropertyValue]('widows');
+  }
+  set widows(value) {
+    this[dartx.setProperty]('widows', value, '');
+  }
+  get width() {
+    return this[dartx.getPropertyValue]('width');
+  }
+  set width(value) {
+    this[dartx.setProperty]('width', value, '');
+  }
+  get willChange() {
+    return this[dartx.getPropertyValue]('will-change');
+  }
+  set willChange(value) {
+    this[dartx.setProperty]('will-change', value, '');
+  }
+  get wordBreak() {
+    return this[dartx.getPropertyValue]('word-break');
+  }
+  set wordBreak(value) {
+    this[dartx.setProperty]('word-break', value, '');
+  }
+  get wordSpacing() {
+    return this[dartx.getPropertyValue]('word-spacing');
+  }
+  set wordSpacing(value) {
+    this[dartx.setProperty]('word-spacing', value, '');
+  }
+  get wordWrap() {
+    return this[dartx.getPropertyValue]('word-wrap');
+  }
+  set wordWrap(value) {
+    this[dartx.setProperty]('word-wrap', value, '');
+  }
+  get wrapFlow() {
+    return this[dartx.getPropertyValue]('wrap-flow');
+  }
+  set wrapFlow(value) {
+    this[dartx.setProperty]('wrap-flow', value, '');
+  }
+  get wrapThrough() {
+    return this[dartx.getPropertyValue]('wrap-through');
+  }
+  set wrapThrough(value) {
+    this[dartx.setProperty]('wrap-through', value, '');
+  }
+  get writingMode() {
+    return this[dartx.getPropertyValue]('writing-mode');
+  }
+  set writingMode(value) {
+    this[dartx.setProperty]('writing-mode', value, '');
+  }
+  get zIndex() {
+    return this[dartx.getPropertyValue]('z-index');
+  }
+  set zIndex(value) {
+    this[dartx.setProperty]('z-index', value, '');
+  }
+  get zoom() {
+    return this[dartx.getPropertyValue]('zoom');
+  }
+  set zoom(value) {
+    this[dartx.setProperty]('zoom', value, '');
+  }
+};
+dart.setSignature(html$.CssStyleDeclarationBase, {
+  getters: () => ({
+    alignContent: dart.definiteFunctionType(core.String, []),
+    alignItems: dart.definiteFunctionType(core.String, []),
+    alignSelf: dart.definiteFunctionType(core.String, []),
+    animation: dart.definiteFunctionType(core.String, []),
+    animationDelay: dart.definiteFunctionType(core.String, []),
+    animationDirection: dart.definiteFunctionType(core.String, []),
+    animationDuration: dart.definiteFunctionType(core.String, []),
+    animationFillMode: dart.definiteFunctionType(core.String, []),
+    animationIterationCount: dart.definiteFunctionType(core.String, []),
+    animationName: dart.definiteFunctionType(core.String, []),
+    animationPlayState: dart.definiteFunctionType(core.String, []),
+    animationTimingFunction: dart.definiteFunctionType(core.String, []),
+    appRegion: dart.definiteFunctionType(core.String, []),
+    appearance: dart.definiteFunctionType(core.String, []),
+    aspectRatio: dart.definiteFunctionType(core.String, []),
+    backfaceVisibility: dart.definiteFunctionType(core.String, []),
+    background: dart.definiteFunctionType(core.String, []),
+    backgroundAttachment: dart.definiteFunctionType(core.String, []),
+    backgroundBlendMode: dart.definiteFunctionType(core.String, []),
+    backgroundClip: dart.definiteFunctionType(core.String, []),
+    backgroundColor: dart.definiteFunctionType(core.String, []),
+    backgroundComposite: dart.definiteFunctionType(core.String, []),
+    backgroundImage: dart.definiteFunctionType(core.String, []),
+    backgroundOrigin: dart.definiteFunctionType(core.String, []),
+    backgroundPosition: dart.definiteFunctionType(core.String, []),
+    backgroundPositionX: dart.definiteFunctionType(core.String, []),
+    backgroundPositionY: dart.definiteFunctionType(core.String, []),
+    backgroundRepeat: dart.definiteFunctionType(core.String, []),
+    backgroundRepeatX: dart.definiteFunctionType(core.String, []),
+    backgroundRepeatY: dart.definiteFunctionType(core.String, []),
+    backgroundSize: dart.definiteFunctionType(core.String, []),
+    border: dart.definiteFunctionType(core.String, []),
+    borderAfter: dart.definiteFunctionType(core.String, []),
+    borderAfterColor: dart.definiteFunctionType(core.String, []),
+    borderAfterStyle: dart.definiteFunctionType(core.String, []),
+    borderAfterWidth: dart.definiteFunctionType(core.String, []),
+    borderBefore: dart.definiteFunctionType(core.String, []),
+    borderBeforeColor: dart.definiteFunctionType(core.String, []),
+    borderBeforeStyle: dart.definiteFunctionType(core.String, []),
+    borderBeforeWidth: dart.definiteFunctionType(core.String, []),
+    borderBottom: dart.definiteFunctionType(core.String, []),
+    borderBottomColor: dart.definiteFunctionType(core.String, []),
+    borderBottomLeftRadius: dart.definiteFunctionType(core.String, []),
+    borderBottomRightRadius: dart.definiteFunctionType(core.String, []),
+    borderBottomStyle: dart.definiteFunctionType(core.String, []),
+    borderBottomWidth: dart.definiteFunctionType(core.String, []),
+    borderCollapse: dart.definiteFunctionType(core.String, []),
+    borderColor: dart.definiteFunctionType(core.String, []),
+    borderEnd: dart.definiteFunctionType(core.String, []),
+    borderEndColor: dart.definiteFunctionType(core.String, []),
+    borderEndStyle: dart.definiteFunctionType(core.String, []),
+    borderEndWidth: dart.definiteFunctionType(core.String, []),
+    borderFit: dart.definiteFunctionType(core.String, []),
+    borderHorizontalSpacing: dart.definiteFunctionType(core.String, []),
+    borderImage: dart.definiteFunctionType(core.String, []),
+    borderImageOutset: dart.definiteFunctionType(core.String, []),
+    borderImageRepeat: dart.definiteFunctionType(core.String, []),
+    borderImageSlice: dart.definiteFunctionType(core.String, []),
+    borderImageSource: dart.definiteFunctionType(core.String, []),
+    borderImageWidth: dart.definiteFunctionType(core.String, []),
+    borderLeft: dart.definiteFunctionType(core.String, []),
+    borderLeftColor: dart.definiteFunctionType(core.String, []),
+    borderLeftStyle: dart.definiteFunctionType(core.String, []),
+    borderLeftWidth: dart.definiteFunctionType(core.String, []),
+    borderRadius: dart.definiteFunctionType(core.String, []),
+    borderRight: dart.definiteFunctionType(core.String, []),
+    borderRightColor: dart.definiteFunctionType(core.String, []),
+    borderRightStyle: dart.definiteFunctionType(core.String, []),
+    borderRightWidth: dart.definiteFunctionType(core.String, []),
+    borderSpacing: dart.definiteFunctionType(core.String, []),
+    borderStart: dart.definiteFunctionType(core.String, []),
+    borderStartColor: dart.definiteFunctionType(core.String, []),
+    borderStartStyle: dart.definiteFunctionType(core.String, []),
+    borderStartWidth: dart.definiteFunctionType(core.String, []),
+    borderStyle: dart.definiteFunctionType(core.String, []),
+    borderTop: dart.definiteFunctionType(core.String, []),
+    borderTopColor: dart.definiteFunctionType(core.String, []),
+    borderTopLeftRadius: dart.definiteFunctionType(core.String, []),
+    borderTopRightRadius: dart.definiteFunctionType(core.String, []),
+    borderTopStyle: dart.definiteFunctionType(core.String, []),
+    borderTopWidth: dart.definiteFunctionType(core.String, []),
+    borderVerticalSpacing: dart.definiteFunctionType(core.String, []),
+    borderWidth: dart.definiteFunctionType(core.String, []),
+    bottom: dart.definiteFunctionType(core.String, []),
+    boxAlign: dart.definiteFunctionType(core.String, []),
+    boxDecorationBreak: dart.definiteFunctionType(core.String, []),
+    boxDirection: dart.definiteFunctionType(core.String, []),
+    boxFlex: dart.definiteFunctionType(core.String, []),
+    boxFlexGroup: dart.definiteFunctionType(core.String, []),
+    boxLines: dart.definiteFunctionType(core.String, []),
+    boxOrdinalGroup: dart.definiteFunctionType(core.String, []),
+    boxOrient: dart.definiteFunctionType(core.String, []),
+    boxPack: dart.definiteFunctionType(core.String, []),
+    boxReflect: dart.definiteFunctionType(core.String, []),
+    boxShadow: dart.definiteFunctionType(core.String, []),
+    boxSizing: dart.definiteFunctionType(core.String, []),
+    captionSide: dart.definiteFunctionType(core.String, []),
+    clear: dart.definiteFunctionType(core.String, []),
+    clip: dart.definiteFunctionType(core.String, []),
+    clipPath: dart.definiteFunctionType(core.String, []),
+    color: dart.definiteFunctionType(core.String, []),
+    columnBreakAfter: dart.definiteFunctionType(core.String, []),
+    columnBreakBefore: dart.definiteFunctionType(core.String, []),
+    columnBreakInside: dart.definiteFunctionType(core.String, []),
+    columnCount: dart.definiteFunctionType(core.String, []),
+    columnFill: dart.definiteFunctionType(core.String, []),
+    columnGap: dart.definiteFunctionType(core.String, []),
+    columnRule: dart.definiteFunctionType(core.String, []),
+    columnRuleColor: dart.definiteFunctionType(core.String, []),
+    columnRuleStyle: dart.definiteFunctionType(core.String, []),
+    columnRuleWidth: dart.definiteFunctionType(core.String, []),
+    columnSpan: dart.definiteFunctionType(core.String, []),
+    columnWidth: dart.definiteFunctionType(core.String, []),
+    columns: dart.definiteFunctionType(core.String, []),
+    content: dart.definiteFunctionType(core.String, []),
+    counterIncrement: dart.definiteFunctionType(core.String, []),
+    counterReset: dart.definiteFunctionType(core.String, []),
+    cursor: dart.definiteFunctionType(core.String, []),
+    direction: dart.definiteFunctionType(core.String, []),
+    display: dart.definiteFunctionType(core.String, []),
+    emptyCells: dart.definiteFunctionType(core.String, []),
+    filter: dart.definiteFunctionType(core.String, []),
+    flex: dart.definiteFunctionType(core.String, []),
+    flexBasis: dart.definiteFunctionType(core.String, []),
+    flexDirection: dart.definiteFunctionType(core.String, []),
+    flexFlow: dart.definiteFunctionType(core.String, []),
+    flexGrow: dart.definiteFunctionType(core.String, []),
+    flexShrink: dart.definiteFunctionType(core.String, []),
+    flexWrap: dart.definiteFunctionType(core.String, []),
+    float: dart.definiteFunctionType(core.String, []),
+    font: dart.definiteFunctionType(core.String, []),
+    fontFamily: dart.definiteFunctionType(core.String, []),
+    fontFeatureSettings: dart.definiteFunctionType(core.String, []),
+    fontKerning: dart.definiteFunctionType(core.String, []),
+    fontSize: dart.definiteFunctionType(core.String, []),
+    fontSizeDelta: dart.definiteFunctionType(core.String, []),
+    fontSmoothing: dart.definiteFunctionType(core.String, []),
+    fontStretch: dart.definiteFunctionType(core.String, []),
+    fontStyle: dart.definiteFunctionType(core.String, []),
+    fontVariant: dart.definiteFunctionType(core.String, []),
+    fontVariantLigatures: dart.definiteFunctionType(core.String, []),
+    fontWeight: dart.definiteFunctionType(core.String, []),
+    grid: dart.definiteFunctionType(core.String, []),
+    gridArea: dart.definiteFunctionType(core.String, []),
+    gridAutoColumns: dart.definiteFunctionType(core.String, []),
+    gridAutoFlow: dart.definiteFunctionType(core.String, []),
+    gridAutoRows: dart.definiteFunctionType(core.String, []),
+    gridColumn: dart.definiteFunctionType(core.String, []),
+    gridColumnEnd: dart.definiteFunctionType(core.String, []),
+    gridColumnStart: dart.definiteFunctionType(core.String, []),
+    gridRow: dart.definiteFunctionType(core.String, []),
+    gridRowEnd: dart.definiteFunctionType(core.String, []),
+    gridRowStart: dart.definiteFunctionType(core.String, []),
+    gridTemplate: dart.definiteFunctionType(core.String, []),
+    gridTemplateAreas: dart.definiteFunctionType(core.String, []),
+    gridTemplateColumns: dart.definiteFunctionType(core.String, []),
+    gridTemplateRows: dart.definiteFunctionType(core.String, []),
+    height: dart.definiteFunctionType(core.String, []),
+    highlight: dart.definiteFunctionType(core.String, []),
+    hyphenateCharacter: dart.definiteFunctionType(core.String, []),
+    imageRendering: dart.definiteFunctionType(core.String, []),
+    isolation: dart.definiteFunctionType(core.String, []),
+    justifyContent: dart.definiteFunctionType(core.String, []),
+    justifySelf: dart.definiteFunctionType(core.String, []),
+    left: dart.definiteFunctionType(core.String, []),
+    letterSpacing: dart.definiteFunctionType(core.String, []),
+    lineBoxContain: dart.definiteFunctionType(core.String, []),
+    lineBreak: dart.definiteFunctionType(core.String, []),
+    lineClamp: dart.definiteFunctionType(core.String, []),
+    lineHeight: dart.definiteFunctionType(core.String, []),
+    listStyle: dart.definiteFunctionType(core.String, []),
+    listStyleImage: dart.definiteFunctionType(core.String, []),
+    listStylePosition: dart.definiteFunctionType(core.String, []),
+    listStyleType: dart.definiteFunctionType(core.String, []),
+    locale: dart.definiteFunctionType(core.String, []),
+    logicalHeight: dart.definiteFunctionType(core.String, []),
+    logicalWidth: dart.definiteFunctionType(core.String, []),
+    margin: dart.definiteFunctionType(core.String, []),
+    marginAfter: dart.definiteFunctionType(core.String, []),
+    marginAfterCollapse: dart.definiteFunctionType(core.String, []),
+    marginBefore: dart.definiteFunctionType(core.String, []),
+    marginBeforeCollapse: dart.definiteFunctionType(core.String, []),
+    marginBottom: dart.definiteFunctionType(core.String, []),
+    marginBottomCollapse: dart.definiteFunctionType(core.String, []),
+    marginCollapse: dart.definiteFunctionType(core.String, []),
+    marginEnd: dart.definiteFunctionType(core.String, []),
+    marginLeft: dart.definiteFunctionType(core.String, []),
+    marginRight: dart.definiteFunctionType(core.String, []),
+    marginStart: dart.definiteFunctionType(core.String, []),
+    marginTop: dart.definiteFunctionType(core.String, []),
+    marginTopCollapse: dart.definiteFunctionType(core.String, []),
+    mask: dart.definiteFunctionType(core.String, []),
+    maskBoxImage: dart.definiteFunctionType(core.String, []),
+    maskBoxImageOutset: dart.definiteFunctionType(core.String, []),
+    maskBoxImageRepeat: dart.definiteFunctionType(core.String, []),
+    maskBoxImageSlice: dart.definiteFunctionType(core.String, []),
+    maskBoxImageSource: dart.definiteFunctionType(core.String, []),
+    maskBoxImageWidth: dart.definiteFunctionType(core.String, []),
+    maskClip: dart.definiteFunctionType(core.String, []),
+    maskComposite: dart.definiteFunctionType(core.String, []),
+    maskImage: dart.definiteFunctionType(core.String, []),
+    maskOrigin: dart.definiteFunctionType(core.String, []),
+    maskPosition: dart.definiteFunctionType(core.String, []),
+    maskPositionX: dart.definiteFunctionType(core.String, []),
+    maskPositionY: dart.definiteFunctionType(core.String, []),
+    maskRepeat: dart.definiteFunctionType(core.String, []),
+    maskRepeatX: dart.definiteFunctionType(core.String, []),
+    maskRepeatY: dart.definiteFunctionType(core.String, []),
+    maskSize: dart.definiteFunctionType(core.String, []),
+    maskSourceType: dart.definiteFunctionType(core.String, []),
+    maxHeight: dart.definiteFunctionType(core.String, []),
+    maxLogicalHeight: dart.definiteFunctionType(core.String, []),
+    maxLogicalWidth: dart.definiteFunctionType(core.String, []),
+    maxWidth: dart.definiteFunctionType(core.String, []),
+    maxZoom: dart.definiteFunctionType(core.String, []),
+    minHeight: dart.definiteFunctionType(core.String, []),
+    minLogicalHeight: dart.definiteFunctionType(core.String, []),
+    minLogicalWidth: dart.definiteFunctionType(core.String, []),
+    minWidth: dart.definiteFunctionType(core.String, []),
+    minZoom: dart.definiteFunctionType(core.String, []),
+    mixBlendMode: dart.definiteFunctionType(core.String, []),
+    objectFit: dart.definiteFunctionType(core.String, []),
+    objectPosition: dart.definiteFunctionType(core.String, []),
+    opacity: dart.definiteFunctionType(core.String, []),
+    order: dart.definiteFunctionType(core.String, []),
+    orientation: dart.definiteFunctionType(core.String, []),
+    orphans: dart.definiteFunctionType(core.String, []),
+    outline: dart.definiteFunctionType(core.String, []),
+    outlineColor: dart.definiteFunctionType(core.String, []),
+    outlineOffset: dart.definiteFunctionType(core.String, []),
+    outlineStyle: dart.definiteFunctionType(core.String, []),
+    outlineWidth: dart.definiteFunctionType(core.String, []),
+    overflow: dart.definiteFunctionType(core.String, []),
+    overflowWrap: dart.definiteFunctionType(core.String, []),
+    overflowX: dart.definiteFunctionType(core.String, []),
+    overflowY: dart.definiteFunctionType(core.String, []),
+    padding: dart.definiteFunctionType(core.String, []),
+    paddingAfter: dart.definiteFunctionType(core.String, []),
+    paddingBefore: dart.definiteFunctionType(core.String, []),
+    paddingBottom: dart.definiteFunctionType(core.String, []),
+    paddingEnd: dart.definiteFunctionType(core.String, []),
+    paddingLeft: dart.definiteFunctionType(core.String, []),
+    paddingRight: dart.definiteFunctionType(core.String, []),
+    paddingStart: dart.definiteFunctionType(core.String, []),
+    paddingTop: dart.definiteFunctionType(core.String, []),
+    page: dart.definiteFunctionType(core.String, []),
+    pageBreakAfter: dart.definiteFunctionType(core.String, []),
+    pageBreakBefore: dart.definiteFunctionType(core.String, []),
+    pageBreakInside: dart.definiteFunctionType(core.String, []),
+    perspective: dart.definiteFunctionType(core.String, []),
+    perspectiveOrigin: dart.definiteFunctionType(core.String, []),
+    perspectiveOriginX: dart.definiteFunctionType(core.String, []),
+    perspectiveOriginY: dart.definiteFunctionType(core.String, []),
+    pointerEvents: dart.definiteFunctionType(core.String, []),
+    position: dart.definiteFunctionType(core.String, []),
+    printColorAdjust: dart.definiteFunctionType(core.String, []),
+    quotes: dart.definiteFunctionType(core.String, []),
+    resize: dart.definiteFunctionType(core.String, []),
+    right: dart.definiteFunctionType(core.String, []),
+    rtlOrdering: dart.definiteFunctionType(core.String, []),
+    rubyPosition: dart.definiteFunctionType(core.String, []),
+    scrollBehavior: dart.definiteFunctionType(core.String, []),
+    shapeImageThreshold: dart.definiteFunctionType(core.String, []),
+    shapeMargin: dart.definiteFunctionType(core.String, []),
+    shapeOutside: dart.definiteFunctionType(core.String, []),
+    size: dart.definiteFunctionType(core.String, []),
+    speak: dart.definiteFunctionType(core.String, []),
+    src: dart.definiteFunctionType(core.String, []),
+    tabSize: dart.definiteFunctionType(core.String, []),
+    tableLayout: dart.definiteFunctionType(core.String, []),
+    tapHighlightColor: dart.definiteFunctionType(core.String, []),
+    textAlign: dart.definiteFunctionType(core.String, []),
+    textAlignLast: dart.definiteFunctionType(core.String, []),
+    textCombine: dart.definiteFunctionType(core.String, []),
+    textDecoration: dart.definiteFunctionType(core.String, []),
+    textDecorationColor: dart.definiteFunctionType(core.String, []),
+    textDecorationLine: dart.definiteFunctionType(core.String, []),
+    textDecorationStyle: dart.definiteFunctionType(core.String, []),
+    textDecorationsInEffect: dart.definiteFunctionType(core.String, []),
+    textEmphasis: dart.definiteFunctionType(core.String, []),
+    textEmphasisColor: dart.definiteFunctionType(core.String, []),
+    textEmphasisPosition: dart.definiteFunctionType(core.String, []),
+    textEmphasisStyle: dart.definiteFunctionType(core.String, []),
+    textFillColor: dart.definiteFunctionType(core.String, []),
+    textIndent: dart.definiteFunctionType(core.String, []),
+    textJustify: dart.definiteFunctionType(core.String, []),
+    textLineThroughColor: dart.definiteFunctionType(core.String, []),
+    textLineThroughMode: dart.definiteFunctionType(core.String, []),
+    textLineThroughStyle: dart.definiteFunctionType(core.String, []),
+    textLineThroughWidth: dart.definiteFunctionType(core.String, []),
+    textOrientation: dart.definiteFunctionType(core.String, []),
+    textOverflow: dart.definiteFunctionType(core.String, []),
+    textOverlineColor: dart.definiteFunctionType(core.String, []),
+    textOverlineMode: dart.definiteFunctionType(core.String, []),
+    textOverlineStyle: dart.definiteFunctionType(core.String, []),
+    textOverlineWidth: dart.definiteFunctionType(core.String, []),
+    textRendering: dart.definiteFunctionType(core.String, []),
+    textSecurity: dart.definiteFunctionType(core.String, []),
+    textShadow: dart.definiteFunctionType(core.String, []),
+    textStroke: dart.definiteFunctionType(core.String, []),
+    textStrokeColor: dart.definiteFunctionType(core.String, []),
+    textStrokeWidth: dart.definiteFunctionType(core.String, []),
+    textTransform: dart.definiteFunctionType(core.String, []),
+    textUnderlineColor: dart.definiteFunctionType(core.String, []),
+    textUnderlineMode: dart.definiteFunctionType(core.String, []),
+    textUnderlinePosition: dart.definiteFunctionType(core.String, []),
+    textUnderlineStyle: dart.definiteFunctionType(core.String, []),
+    textUnderlineWidth: dart.definiteFunctionType(core.String, []),
+    top: dart.definiteFunctionType(core.String, []),
+    touchAction: dart.definiteFunctionType(core.String, []),
+    touchActionDelay: dart.definiteFunctionType(core.String, []),
+    transform: dart.definiteFunctionType(core.String, []),
+    transformOrigin: dart.definiteFunctionType(core.String, []),
+    transformOriginX: dart.definiteFunctionType(core.String, []),
+    transformOriginY: dart.definiteFunctionType(core.String, []),
+    transformOriginZ: dart.definiteFunctionType(core.String, []),
+    transformStyle: dart.definiteFunctionType(core.String, []),
+    transition: dart.definiteFunctionType(core.String, []),
+    transitionDelay: dart.definiteFunctionType(core.String, []),
+    transitionDuration: dart.definiteFunctionType(core.String, []),
+    transitionProperty: dart.definiteFunctionType(core.String, []),
+    transitionTimingFunction: dart.definiteFunctionType(core.String, []),
+    unicodeBidi: dart.definiteFunctionType(core.String, []),
+    unicodeRange: dart.definiteFunctionType(core.String, []),
+    userDrag: dart.definiteFunctionType(core.String, []),
+    userModify: dart.definiteFunctionType(core.String, []),
+    userSelect: dart.definiteFunctionType(core.String, []),
+    userZoom: dart.definiteFunctionType(core.String, []),
+    verticalAlign: dart.definiteFunctionType(core.String, []),
+    visibility: dart.definiteFunctionType(core.String, []),
+    whiteSpace: dart.definiteFunctionType(core.String, []),
+    widows: dart.definiteFunctionType(core.String, []),
+    width: dart.definiteFunctionType(core.String, []),
+    willChange: dart.definiteFunctionType(core.String, []),
+    wordBreak: dart.definiteFunctionType(core.String, []),
+    wordSpacing: dart.definiteFunctionType(core.String, []),
+    wordWrap: dart.definiteFunctionType(core.String, []),
+    wrapFlow: dart.definiteFunctionType(core.String, []),
+    wrapThrough: dart.definiteFunctionType(core.String, []),
+    writingMode: dart.definiteFunctionType(core.String, []),
+    zIndex: dart.definiteFunctionType(core.String, []),
+    zoom: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({
+    alignContent: dart.definiteFunctionType(dart.void, [core.String]),
+    alignItems: dart.definiteFunctionType(dart.void, [core.String]),
+    alignSelf: dart.definiteFunctionType(dart.void, [core.String]),
+    animation: dart.definiteFunctionType(dart.void, [core.String]),
+    animationDelay: dart.definiteFunctionType(dart.void, [core.String]),
+    animationDirection: dart.definiteFunctionType(dart.void, [core.String]),
+    animationDuration: dart.definiteFunctionType(dart.void, [core.String]),
+    animationFillMode: dart.definiteFunctionType(dart.void, [core.String]),
+    animationIterationCount: dart.definiteFunctionType(dart.void, [core.String]),
+    animationName: dart.definiteFunctionType(dart.void, [core.String]),
+    animationPlayState: dart.definiteFunctionType(dart.void, [core.String]),
+    animationTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
+    appRegion: dart.definiteFunctionType(dart.void, [core.String]),
+    appearance: dart.definiteFunctionType(dart.void, [core.String]),
+    aspectRatio: dart.definiteFunctionType(dart.void, [core.String]),
+    backfaceVisibility: dart.definiteFunctionType(dart.void, [core.String]),
+    background: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundAttachment: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundClip: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundColor: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundComposite: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundImage: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundOrigin: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundPosition: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundPositionX: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundPositionY: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundRepeat: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
+    backgroundSize: dart.definiteFunctionType(dart.void, [core.String]),
+    border: dart.definiteFunctionType(dart.void, [core.String]),
+    borderAfter: dart.definiteFunctionType(dart.void, [core.String]),
+    borderAfterColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderAfterStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderAfterWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBefore: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBeforeColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBeforeStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBeforeWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottom: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottomColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottomLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottomRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottomStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderBottomWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    borderColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    borderEndColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderEndStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderEndWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderFit: dart.definiteFunctionType(dart.void, [core.String]),
+    borderHorizontalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImage: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImageSource: dart.definiteFunctionType(dart.void, [core.String]),
+    borderImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderLeft: dart.definiteFunctionType(dart.void, [core.String]),
+    borderLeftColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderLeftStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderLeftWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderRadius: dart.definiteFunctionType(dart.void, [core.String]),
+    borderRight: dart.definiteFunctionType(dart.void, [core.String]),
+    borderRightColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderRightStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderRightWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderSpacing: dart.definiteFunctionType(dart.void, [core.String]),
+    borderStart: dart.definiteFunctionType(dart.void, [core.String]),
+    borderStartColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderStartStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderStartWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTop: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTopColor: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTopLeftRadius: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTopRightRadius: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTopStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    borderTopWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    borderVerticalSpacing: dart.definiteFunctionType(dart.void, [core.String]),
+    borderWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    bottom: dart.definiteFunctionType(dart.void, [core.String]),
+    boxAlign: dart.definiteFunctionType(dart.void, [core.String]),
+    boxDecorationBreak: dart.definiteFunctionType(dart.void, [core.String]),
+    boxDirection: dart.definiteFunctionType(dart.void, [core.String]),
+    boxFlex: dart.definiteFunctionType(dart.void, [core.String]),
+    boxFlexGroup: dart.definiteFunctionType(dart.void, [core.String]),
+    boxLines: dart.definiteFunctionType(dart.void, [core.String]),
+    boxOrdinalGroup: dart.definiteFunctionType(dart.void, [core.String]),
+    boxOrient: dart.definiteFunctionType(dart.void, [core.String]),
+    boxPack: dart.definiteFunctionType(dart.void, [core.String]),
+    boxReflect: dart.definiteFunctionType(dart.void, [core.String]),
+    boxShadow: dart.definiteFunctionType(dart.void, [core.String]),
+    boxSizing: dart.definiteFunctionType(dart.void, [core.String]),
+    captionSide: dart.definiteFunctionType(dart.void, [core.String]),
+    clear: dart.definiteFunctionType(dart.void, [core.String]),
+    clip: dart.definiteFunctionType(dart.void, [core.String]),
+    clipPath: dart.definiteFunctionType(dart.void, [core.String]),
+    color: dart.definiteFunctionType(dart.void, [core.String]),
+    columnBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
+    columnBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
+    columnBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
+    columnCount: dart.definiteFunctionType(dart.void, [core.String]),
+    columnFill: dart.definiteFunctionType(dart.void, [core.String]),
+    columnGap: dart.definiteFunctionType(dart.void, [core.String]),
+    columnRule: dart.definiteFunctionType(dart.void, [core.String]),
+    columnRuleColor: dart.definiteFunctionType(dart.void, [core.String]),
+    columnRuleStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    columnRuleWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    columnSpan: dart.definiteFunctionType(dart.void, [core.String]),
+    columnWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    columns: dart.definiteFunctionType(dart.void, [core.String]),
+    content: dart.definiteFunctionType(dart.void, [core.String]),
+    counterIncrement: dart.definiteFunctionType(dart.void, [core.String]),
+    counterReset: dart.definiteFunctionType(dart.void, [core.String]),
+    cursor: dart.definiteFunctionType(dart.void, [core.String]),
+    direction: dart.definiteFunctionType(dart.void, [core.String]),
+    display: dart.definiteFunctionType(dart.void, [core.String]),
+    emptyCells: dart.definiteFunctionType(dart.void, [core.String]),
+    filter: dart.definiteFunctionType(dart.void, [core.String]),
+    flex: dart.definiteFunctionType(dart.void, [core.String]),
+    flexBasis: dart.definiteFunctionType(dart.void, [core.String]),
+    flexDirection: dart.definiteFunctionType(dart.void, [core.String]),
+    flexFlow: dart.definiteFunctionType(dart.void, [core.String]),
+    flexGrow: dart.definiteFunctionType(dart.void, [core.String]),
+    flexShrink: dart.definiteFunctionType(dart.void, [core.String]),
+    flexWrap: dart.definiteFunctionType(dart.void, [core.String]),
+    float: dart.definiteFunctionType(dart.void, [core.String]),
+    font: dart.definiteFunctionType(dart.void, [core.String]),
+    fontFamily: dart.definiteFunctionType(dart.void, [core.String]),
+    fontFeatureSettings: dart.definiteFunctionType(dart.void, [core.String]),
+    fontKerning: dart.definiteFunctionType(dart.void, [core.String]),
+    fontSize: dart.definiteFunctionType(dart.void, [core.String]),
+    fontSizeDelta: dart.definiteFunctionType(dart.void, [core.String]),
+    fontSmoothing: dart.definiteFunctionType(dart.void, [core.String]),
+    fontStretch: dart.definiteFunctionType(dart.void, [core.String]),
+    fontStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    fontVariant: dart.definiteFunctionType(dart.void, [core.String]),
+    fontVariantLigatures: dart.definiteFunctionType(dart.void, [core.String]),
+    fontWeight: dart.definiteFunctionType(dart.void, [core.String]),
+    grid: dart.definiteFunctionType(dart.void, [core.String]),
+    gridArea: dart.definiteFunctionType(dart.void, [core.String]),
+    gridAutoColumns: dart.definiteFunctionType(dart.void, [core.String]),
+    gridAutoFlow: dart.definiteFunctionType(dart.void, [core.String]),
+    gridAutoRows: dart.definiteFunctionType(dart.void, [core.String]),
+    gridColumn: dart.definiteFunctionType(dart.void, [core.String]),
+    gridColumnEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    gridColumnStart: dart.definiteFunctionType(dart.void, [core.String]),
+    gridRow: dart.definiteFunctionType(dart.void, [core.String]),
+    gridRowEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    gridRowStart: dart.definiteFunctionType(dart.void, [core.String]),
+    gridTemplate: dart.definiteFunctionType(dart.void, [core.String]),
+    gridTemplateAreas: dart.definiteFunctionType(dart.void, [core.String]),
+    gridTemplateColumns: dart.definiteFunctionType(dart.void, [core.String]),
+    gridTemplateRows: dart.definiteFunctionType(dart.void, [core.String]),
+    height: dart.definiteFunctionType(dart.void, [core.String]),
+    highlight: dart.definiteFunctionType(dart.void, [core.String]),
+    hyphenateCharacter: dart.definiteFunctionType(dart.void, [core.String]),
+    imageRendering: dart.definiteFunctionType(dart.void, [core.String]),
+    isolation: dart.definiteFunctionType(dart.void, [core.String]),
+    justifyContent: dart.definiteFunctionType(dart.void, [core.String]),
+    justifySelf: dart.definiteFunctionType(dart.void, [core.String]),
+    left: dart.definiteFunctionType(dart.void, [core.String]),
+    letterSpacing: dart.definiteFunctionType(dart.void, [core.String]),
+    lineBoxContain: dart.definiteFunctionType(dart.void, [core.String]),
+    lineBreak: dart.definiteFunctionType(dart.void, [core.String]),
+    lineClamp: dart.definiteFunctionType(dart.void, [core.String]),
+    lineHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    listStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    listStyleImage: dart.definiteFunctionType(dart.void, [core.String]),
+    listStylePosition: dart.definiteFunctionType(dart.void, [core.String]),
+    listStyleType: dart.definiteFunctionType(dart.void, [core.String]),
+    locale: dart.definiteFunctionType(dart.void, [core.String]),
+    logicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    logicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    margin: dart.definiteFunctionType(dart.void, [core.String]),
+    marginAfter: dart.definiteFunctionType(dart.void, [core.String]),
+    marginAfterCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    marginBefore: dart.definiteFunctionType(dart.void, [core.String]),
+    marginBeforeCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    marginBottom: dart.definiteFunctionType(dart.void, [core.String]),
+    marginBottomCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    marginCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    marginEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    marginLeft: dart.definiteFunctionType(dart.void, [core.String]),
+    marginRight: dart.definiteFunctionType(dart.void, [core.String]),
+    marginStart: dart.definiteFunctionType(dart.void, [core.String]),
+    marginTop: dart.definiteFunctionType(dart.void, [core.String]),
+    marginTopCollapse: dart.definiteFunctionType(dart.void, [core.String]),
+    mask: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImage: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImageOutset: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImageRepeat: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImageSlice: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImageSource: dart.definiteFunctionType(dart.void, [core.String]),
+    maskBoxImageWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    maskClip: dart.definiteFunctionType(dart.void, [core.String]),
+    maskComposite: dart.definiteFunctionType(dart.void, [core.String]),
+    maskImage: dart.definiteFunctionType(dart.void, [core.String]),
+    maskOrigin: dart.definiteFunctionType(dart.void, [core.String]),
+    maskPosition: dart.definiteFunctionType(dart.void, [core.String]),
+    maskPositionX: dart.definiteFunctionType(dart.void, [core.String]),
+    maskPositionY: dart.definiteFunctionType(dart.void, [core.String]),
+    maskRepeat: dart.definiteFunctionType(dart.void, [core.String]),
+    maskRepeatX: dart.definiteFunctionType(dart.void, [core.String]),
+    maskRepeatY: dart.definiteFunctionType(dart.void, [core.String]),
+    maskSize: dart.definiteFunctionType(dart.void, [core.String]),
+    maskSourceType: dart.definiteFunctionType(dart.void, [core.String]),
+    maxHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    maxLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    maxLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    maxWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    maxZoom: dart.definiteFunctionType(dart.void, [core.String]),
+    minHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    minLogicalHeight: dart.definiteFunctionType(dart.void, [core.String]),
+    minLogicalWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    minWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    minZoom: dart.definiteFunctionType(dart.void, [core.String]),
+    mixBlendMode: dart.definiteFunctionType(dart.void, [core.String]),
+    objectFit: dart.definiteFunctionType(dart.void, [core.String]),
+    objectPosition: dart.definiteFunctionType(dart.void, [core.String]),
+    opacity: dart.definiteFunctionType(dart.void, [core.String]),
+    order: dart.definiteFunctionType(dart.void, [core.String]),
+    orientation: dart.definiteFunctionType(dart.void, [core.String]),
+    orphans: dart.definiteFunctionType(dart.void, [core.String]),
+    outline: dart.definiteFunctionType(dart.void, [core.String]),
+    outlineColor: dart.definiteFunctionType(dart.void, [core.String]),
+    outlineOffset: dart.definiteFunctionType(dart.void, [core.String]),
+    outlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    outlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    overflow: dart.definiteFunctionType(dart.void, [core.String]),
+    overflowWrap: dart.definiteFunctionType(dart.void, [core.String]),
+    overflowX: dart.definiteFunctionType(dart.void, [core.String]),
+    overflowY: dart.definiteFunctionType(dart.void, [core.String]),
+    padding: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingAfter: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingBefore: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingBottom: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingEnd: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingLeft: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingRight: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingStart: dart.definiteFunctionType(dart.void, [core.String]),
+    paddingTop: dart.definiteFunctionType(dart.void, [core.String]),
+    page: dart.definiteFunctionType(dart.void, [core.String]),
+    pageBreakAfter: dart.definiteFunctionType(dart.void, [core.String]),
+    pageBreakBefore: dart.definiteFunctionType(dart.void, [core.String]),
+    pageBreakInside: dart.definiteFunctionType(dart.void, [core.String]),
+    perspective: dart.definiteFunctionType(dart.void, [core.String]),
+    perspectiveOrigin: dart.definiteFunctionType(dart.void, [core.String]),
+    perspectiveOriginX: dart.definiteFunctionType(dart.void, [core.String]),
+    perspectiveOriginY: dart.definiteFunctionType(dart.void, [core.String]),
+    pointerEvents: dart.definiteFunctionType(dart.void, [core.String]),
+    position: dart.definiteFunctionType(dart.void, [core.String]),
+    printColorAdjust: dart.definiteFunctionType(dart.void, [core.String]),
+    quotes: dart.definiteFunctionType(dart.void, [core.String]),
+    resize: dart.definiteFunctionType(dart.void, [core.String]),
+    right: dart.definiteFunctionType(dart.void, [core.String]),
+    rtlOrdering: dart.definiteFunctionType(dart.void, [core.String]),
+    rubyPosition: dart.definiteFunctionType(dart.void, [core.String]),
+    scrollBehavior: dart.definiteFunctionType(dart.void, [core.String]),
+    shapeImageThreshold: dart.definiteFunctionType(dart.void, [core.String]),
+    shapeMargin: dart.definiteFunctionType(dart.void, [core.String]),
+    shapeOutside: dart.definiteFunctionType(dart.void, [core.String]),
+    size: dart.definiteFunctionType(dart.void, [core.String]),
+    speak: dart.definiteFunctionType(dart.void, [core.String]),
+    src: dart.definiteFunctionType(dart.void, [core.String]),
+    tabSize: dart.definiteFunctionType(dart.void, [core.String]),
+    tableLayout: dart.definiteFunctionType(dart.void, [core.String]),
+    tapHighlightColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textAlign: dart.definiteFunctionType(dart.void, [core.String]),
+    textAlignLast: dart.definiteFunctionType(dart.void, [core.String]),
+    textCombine: dart.definiteFunctionType(dart.void, [core.String]),
+    textDecoration: dart.definiteFunctionType(dart.void, [core.String]),
+    textDecorationColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textDecorationLine: dart.definiteFunctionType(dart.void, [core.String]),
+    textDecorationStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    textDecorationsInEffect: dart.definiteFunctionType(dart.void, [core.String]),
+    textEmphasis: dart.definiteFunctionType(dart.void, [core.String]),
+    textEmphasisColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textEmphasisPosition: dart.definiteFunctionType(dart.void, [core.String]),
+    textEmphasisStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    textFillColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textIndent: dart.definiteFunctionType(dart.void, [core.String]),
+    textJustify: dart.definiteFunctionType(dart.void, [core.String]),
+    textLineThroughColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textLineThroughMode: dart.definiteFunctionType(dart.void, [core.String]),
+    textLineThroughStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    textLineThroughWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    textOrientation: dart.definiteFunctionType(dart.void, [core.String]),
+    textOverflow: dart.definiteFunctionType(dart.void, [core.String]),
+    textOverlineColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textOverlineMode: dart.definiteFunctionType(dart.void, [core.String]),
+    textOverlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    textOverlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    textRendering: dart.definiteFunctionType(dart.void, [core.String]),
+    textSecurity: dart.definiteFunctionType(dart.void, [core.String]),
+    textShadow: dart.definiteFunctionType(dart.void, [core.String]),
+    textStroke: dart.definiteFunctionType(dart.void, [core.String]),
+    textStrokeColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textStrokeWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    textTransform: dart.definiteFunctionType(dart.void, [core.String]),
+    textUnderlineColor: dart.definiteFunctionType(dart.void, [core.String]),
+    textUnderlineMode: dart.definiteFunctionType(dart.void, [core.String]),
+    textUnderlinePosition: dart.definiteFunctionType(dart.void, [core.String]),
+    textUnderlineStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    textUnderlineWidth: dart.definiteFunctionType(dart.void, [core.String]),
+    top: dart.definiteFunctionType(dart.void, [core.String]),
+    touchAction: dart.definiteFunctionType(dart.void, [core.String]),
+    touchActionDelay: dart.definiteFunctionType(dart.void, [core.String]),
+    transform: dart.definiteFunctionType(dart.void, [core.String]),
+    transformOrigin: dart.definiteFunctionType(dart.void, [core.String]),
+    transformOriginX: dart.definiteFunctionType(dart.void, [core.String]),
+    transformOriginY: dart.definiteFunctionType(dart.void, [core.String]),
+    transformOriginZ: dart.definiteFunctionType(dart.void, [core.String]),
+    transformStyle: dart.definiteFunctionType(dart.void, [core.String]),
+    transition: dart.definiteFunctionType(dart.void, [core.String]),
+    transitionDelay: dart.definiteFunctionType(dart.void, [core.String]),
+    transitionDuration: dart.definiteFunctionType(dart.void, [core.String]),
+    transitionProperty: dart.definiteFunctionType(dart.void, [core.String]),
+    transitionTimingFunction: dart.definiteFunctionType(dart.void, [core.String]),
+    unicodeBidi: dart.definiteFunctionType(dart.void, [core.String]),
+    unicodeRange: dart.definiteFunctionType(dart.void, [core.String]),
+    userDrag: dart.definiteFunctionType(dart.void, [core.String]),
+    userModify: dart.definiteFunctionType(dart.void, [core.String]),
+    userSelect: dart.definiteFunctionType(dart.void, [core.String]),
+    userZoom: dart.definiteFunctionType(dart.void, [core.String]),
+    verticalAlign: dart.definiteFunctionType(dart.void, [core.String]),
+    visibility: dart.definiteFunctionType(dart.void, [core.String]),
+    whiteSpace: dart.definiteFunctionType(dart.void, [core.String]),
+    widows: dart.definiteFunctionType(dart.void, [core.String]),
+    width: dart.definiteFunctionType(dart.void, [core.String]),
+    willChange: dart.definiteFunctionType(dart.void, [core.String]),
+    wordBreak: dart.definiteFunctionType(dart.void, [core.String]),
+    wordSpacing: dart.definiteFunctionType(dart.void, [core.String]),
+    wordWrap: dart.definiteFunctionType(dart.void, [core.String]),
+    wrapFlow: dart.definiteFunctionType(dart.void, [core.String]),
+    wrapThrough: dart.definiteFunctionType(dart.void, [core.String]),
+    writingMode: dart.definiteFunctionType(dart.void, [core.String]),
+    zIndex: dart.definiteFunctionType(dart.void, [core.String]),
+    zoom: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
+  'alignContent',
+  'alignContent',
+  'alignItems',
+  'alignItems',
+  'alignSelf',
+  'alignSelf',
+  'animation',
+  'animation',
+  'animationDelay',
+  'animationDelay',
+  'animationDirection',
+  'animationDirection',
+  'animationDuration',
+  'animationDuration',
+  'animationFillMode',
+  'animationFillMode',
+  'animationIterationCount',
+  'animationIterationCount',
+  'animationName',
+  'animationName',
+  'animationPlayState',
+  'animationPlayState',
+  'animationTimingFunction',
+  'animationTimingFunction',
+  'appRegion',
+  'appRegion',
+  'appearance',
+  'appearance',
+  'aspectRatio',
+  'aspectRatio',
+  'backfaceVisibility',
+  'backfaceVisibility',
+  'background',
+  'background',
+  'backgroundAttachment',
+  'backgroundAttachment',
+  'backgroundBlendMode',
+  'backgroundBlendMode',
+  'backgroundClip',
+  'backgroundClip',
+  'backgroundColor',
+  'backgroundColor',
+  'backgroundComposite',
+  'backgroundComposite',
+  'backgroundImage',
+  'backgroundImage',
+  'backgroundOrigin',
+  'backgroundOrigin',
+  'backgroundPosition',
+  'backgroundPosition',
+  'backgroundPositionX',
+  'backgroundPositionX',
+  'backgroundPositionY',
+  'backgroundPositionY',
+  'backgroundRepeat',
+  'backgroundRepeat',
+  'backgroundRepeatX',
+  'backgroundRepeatX',
+  'backgroundRepeatY',
+  'backgroundRepeatY',
+  'backgroundSize',
+  'backgroundSize',
+  'border',
+  'border',
+  'borderAfter',
+  'borderAfter',
+  'borderAfterColor',
+  'borderAfterColor',
+  'borderAfterStyle',
+  'borderAfterStyle',
+  'borderAfterWidth',
+  'borderAfterWidth',
+  'borderBefore',
+  'borderBefore',
+  'borderBeforeColor',
+  'borderBeforeColor',
+  'borderBeforeStyle',
+  'borderBeforeStyle',
+  'borderBeforeWidth',
+  'borderBeforeWidth',
+  'borderBottom',
+  'borderBottom',
+  'borderBottomColor',
+  'borderBottomColor',
+  'borderBottomLeftRadius',
+  'borderBottomLeftRadius',
+  'borderBottomRightRadius',
+  'borderBottomRightRadius',
+  'borderBottomStyle',
+  'borderBottomStyle',
+  'borderBottomWidth',
+  'borderBottomWidth',
+  'borderCollapse',
+  'borderCollapse',
+  'borderColor',
+  'borderColor',
+  'borderEnd',
+  'borderEnd',
+  'borderEndColor',
+  'borderEndColor',
+  'borderEndStyle',
+  'borderEndStyle',
+  'borderEndWidth',
+  'borderEndWidth',
+  'borderFit',
+  'borderFit',
+  'borderHorizontalSpacing',
+  'borderHorizontalSpacing',
+  'borderImage',
+  'borderImage',
+  'borderImageOutset',
+  'borderImageOutset',
+  'borderImageRepeat',
+  'borderImageRepeat',
+  'borderImageSlice',
+  'borderImageSlice',
+  'borderImageSource',
+  'borderImageSource',
+  'borderImageWidth',
+  'borderImageWidth',
+  'borderLeft',
+  'borderLeft',
+  'borderLeftColor',
+  'borderLeftColor',
+  'borderLeftStyle',
+  'borderLeftStyle',
+  'borderLeftWidth',
+  'borderLeftWidth',
+  'borderRadius',
+  'borderRadius',
+  'borderRight',
+  'borderRight',
+  'borderRightColor',
+  'borderRightColor',
+  'borderRightStyle',
+  'borderRightStyle',
+  'borderRightWidth',
+  'borderRightWidth',
+  'borderSpacing',
+  'borderSpacing',
+  'borderStart',
+  'borderStart',
+  'borderStartColor',
+  'borderStartColor',
+  'borderStartStyle',
+  'borderStartStyle',
+  'borderStartWidth',
+  'borderStartWidth',
+  'borderStyle',
+  'borderStyle',
+  'borderTop',
+  'borderTop',
+  'borderTopColor',
+  'borderTopColor',
+  'borderTopLeftRadius',
+  'borderTopLeftRadius',
+  'borderTopRightRadius',
+  'borderTopRightRadius',
+  'borderTopStyle',
+  'borderTopStyle',
+  'borderTopWidth',
+  'borderTopWidth',
+  'borderVerticalSpacing',
+  'borderVerticalSpacing',
+  'borderWidth',
+  'borderWidth',
+  'bottom',
+  'bottom',
+  'boxAlign',
+  'boxAlign',
+  'boxDecorationBreak',
+  'boxDecorationBreak',
+  'boxDirection',
+  'boxDirection',
+  'boxFlex',
+  'boxFlex',
+  'boxFlexGroup',
+  'boxFlexGroup',
+  'boxLines',
+  'boxLines',
+  'boxOrdinalGroup',
+  'boxOrdinalGroup',
+  'boxOrient',
+  'boxOrient',
+  'boxPack',
+  'boxPack',
+  'boxReflect',
+  'boxReflect',
+  'boxShadow',
+  'boxShadow',
+  'boxSizing',
+  'boxSizing',
+  'captionSide',
+  'captionSide',
+  'clear',
+  'clear',
+  'clip',
+  'clip',
+  'clipPath',
+  'clipPath',
+  'color',
+  'color',
+  'columnBreakAfter',
+  'columnBreakAfter',
+  'columnBreakBefore',
+  'columnBreakBefore',
+  'columnBreakInside',
+  'columnBreakInside',
+  'columnCount',
+  'columnCount',
+  'columnFill',
+  'columnFill',
+  'columnGap',
+  'columnGap',
+  'columnRule',
+  'columnRule',
+  'columnRuleColor',
+  'columnRuleColor',
+  'columnRuleStyle',
+  'columnRuleStyle',
+  'columnRuleWidth',
+  'columnRuleWidth',
+  'columnSpan',
+  'columnSpan',
+  'columnWidth',
+  'columnWidth',
+  'columns',
+  'columns',
+  'content',
+  'content',
+  'counterIncrement',
+  'counterIncrement',
+  'counterReset',
+  'counterReset',
+  'cursor',
+  'cursor',
+  'direction',
+  'direction',
+  'display',
+  'display',
+  'emptyCells',
+  'emptyCells',
+  'filter',
+  'filter',
+  'flex',
+  'flex',
+  'flexBasis',
+  'flexBasis',
+  'flexDirection',
+  'flexDirection',
+  'flexFlow',
+  'flexFlow',
+  'flexGrow',
+  'flexGrow',
+  'flexShrink',
+  'flexShrink',
+  'flexWrap',
+  'flexWrap',
+  'float',
+  'float',
+  'font',
+  'font',
+  'fontFamily',
+  'fontFamily',
+  'fontFeatureSettings',
+  'fontFeatureSettings',
+  'fontKerning',
+  'fontKerning',
+  'fontSize',
+  'fontSize',
+  'fontSizeDelta',
+  'fontSizeDelta',
+  'fontSmoothing',
+  'fontSmoothing',
+  'fontStretch',
+  'fontStretch',
+  'fontStyle',
+  'fontStyle',
+  'fontVariant',
+  'fontVariant',
+  'fontVariantLigatures',
+  'fontVariantLigatures',
+  'fontWeight',
+  'fontWeight',
+  'grid',
+  'grid',
+  'gridArea',
+  'gridArea',
+  'gridAutoColumns',
+  'gridAutoColumns',
+  'gridAutoFlow',
+  'gridAutoFlow',
+  'gridAutoRows',
+  'gridAutoRows',
+  'gridColumn',
+  'gridColumn',
+  'gridColumnEnd',
+  'gridColumnEnd',
+  'gridColumnStart',
+  'gridColumnStart',
+  'gridRow',
+  'gridRow',
+  'gridRowEnd',
+  'gridRowEnd',
+  'gridRowStart',
+  'gridRowStart',
+  'gridTemplate',
+  'gridTemplate',
+  'gridTemplateAreas',
+  'gridTemplateAreas',
+  'gridTemplateColumns',
+  'gridTemplateColumns',
+  'gridTemplateRows',
+  'gridTemplateRows',
+  'height',
+  'height',
+  'highlight',
+  'highlight',
+  'hyphenateCharacter',
+  'hyphenateCharacter',
+  'imageRendering',
+  'imageRendering',
+  'isolation',
+  'isolation',
+  'justifyContent',
+  'justifyContent',
+  'justifySelf',
+  'justifySelf',
+  'left',
+  'left',
+  'letterSpacing',
+  'letterSpacing',
+  'lineBoxContain',
+  'lineBoxContain',
+  'lineBreak',
+  'lineBreak',
+  'lineClamp',
+  'lineClamp',
+  'lineHeight',
+  'lineHeight',
+  'listStyle',
+  'listStyle',
+  'listStyleImage',
+  'listStyleImage',
+  'listStylePosition',
+  'listStylePosition',
+  'listStyleType',
+  'listStyleType',
+  'locale',
+  'locale',
+  'logicalHeight',
+  'logicalHeight',
+  'logicalWidth',
+  'logicalWidth',
+  'margin',
+  'margin',
+  'marginAfter',
+  'marginAfter',
+  'marginAfterCollapse',
+  'marginAfterCollapse',
+  'marginBefore',
+  'marginBefore',
+  'marginBeforeCollapse',
+  'marginBeforeCollapse',
+  'marginBottom',
+  'marginBottom',
+  'marginBottomCollapse',
+  'marginBottomCollapse',
+  'marginCollapse',
+  'marginCollapse',
+  'marginEnd',
+  'marginEnd',
+  'marginLeft',
+  'marginLeft',
+  'marginRight',
+  'marginRight',
+  'marginStart',
+  'marginStart',
+  'marginTop',
+  'marginTop',
+  'marginTopCollapse',
+  'marginTopCollapse',
+  'mask',
+  'mask',
+  'maskBoxImage',
+  'maskBoxImage',
+  'maskBoxImageOutset',
+  'maskBoxImageOutset',
+  'maskBoxImageRepeat',
+  'maskBoxImageRepeat',
+  'maskBoxImageSlice',
+  'maskBoxImageSlice',
+  'maskBoxImageSource',
+  'maskBoxImageSource',
+  'maskBoxImageWidth',
+  'maskBoxImageWidth',
+  'maskClip',
+  'maskClip',
+  'maskComposite',
+  'maskComposite',
+  'maskImage',
+  'maskImage',
+  'maskOrigin',
+  'maskOrigin',
+  'maskPosition',
+  'maskPosition',
+  'maskPositionX',
+  'maskPositionX',
+  'maskPositionY',
+  'maskPositionY',
+  'maskRepeat',
+  'maskRepeat',
+  'maskRepeatX',
+  'maskRepeatX',
+  'maskRepeatY',
+  'maskRepeatY',
+  'maskSize',
+  'maskSize',
+  'maskSourceType',
+  'maskSourceType',
+  'maxHeight',
+  'maxHeight',
+  'maxLogicalHeight',
+  'maxLogicalHeight',
+  'maxLogicalWidth',
+  'maxLogicalWidth',
+  'maxWidth',
+  'maxWidth',
+  'maxZoom',
+  'maxZoom',
+  'minHeight',
+  'minHeight',
+  'minLogicalHeight',
+  'minLogicalHeight',
+  'minLogicalWidth',
+  'minLogicalWidth',
+  'minWidth',
+  'minWidth',
+  'minZoom',
+  'minZoom',
+  'mixBlendMode',
+  'mixBlendMode',
+  'objectFit',
+  'objectFit',
+  'objectPosition',
+  'objectPosition',
+  'opacity',
+  'opacity',
+  'order',
+  'order',
+  'orientation',
+  'orientation',
+  'orphans',
+  'orphans',
+  'outline',
+  'outline',
+  'outlineColor',
+  'outlineColor',
+  'outlineOffset',
+  'outlineOffset',
+  'outlineStyle',
+  'outlineStyle',
+  'outlineWidth',
+  'outlineWidth',
+  'overflow',
+  'overflow',
+  'overflowWrap',
+  'overflowWrap',
+  'overflowX',
+  'overflowX',
+  'overflowY',
+  'overflowY',
+  'padding',
+  'padding',
+  'paddingAfter',
+  'paddingAfter',
+  'paddingBefore',
+  'paddingBefore',
+  'paddingBottom',
+  'paddingBottom',
+  'paddingEnd',
+  'paddingEnd',
+  'paddingLeft',
+  'paddingLeft',
+  'paddingRight',
+  'paddingRight',
+  'paddingStart',
+  'paddingStart',
+  'paddingTop',
+  'paddingTop',
+  'page',
+  'page',
+  'pageBreakAfter',
+  'pageBreakAfter',
+  'pageBreakBefore',
+  'pageBreakBefore',
+  'pageBreakInside',
+  'pageBreakInside',
+  'perspective',
+  'perspective',
+  'perspectiveOrigin',
+  'perspectiveOrigin',
+  'perspectiveOriginX',
+  'perspectiveOriginX',
+  'perspectiveOriginY',
+  'perspectiveOriginY',
+  'pointerEvents',
+  'pointerEvents',
+  'position',
+  'position',
+  'printColorAdjust',
+  'printColorAdjust',
+  'quotes',
+  'quotes',
+  'resize',
+  'resize',
+  'right',
+  'right',
+  'rtlOrdering',
+  'rtlOrdering',
+  'rubyPosition',
+  'rubyPosition',
+  'scrollBehavior',
+  'scrollBehavior',
+  'shapeImageThreshold',
+  'shapeImageThreshold',
+  'shapeMargin',
+  'shapeMargin',
+  'shapeOutside',
+  'shapeOutside',
+  'size',
+  'size',
+  'speak',
+  'speak',
+  'src',
+  'src',
+  'tabSize',
+  'tabSize',
+  'tableLayout',
+  'tableLayout',
+  'tapHighlightColor',
+  'tapHighlightColor',
+  'textAlign',
+  'textAlign',
+  'textAlignLast',
+  'textAlignLast',
+  'textCombine',
+  'textCombine',
+  'textDecoration',
+  'textDecoration',
+  'textDecorationColor',
+  'textDecorationColor',
+  'textDecorationLine',
+  'textDecorationLine',
+  'textDecorationStyle',
+  'textDecorationStyle',
+  'textDecorationsInEffect',
+  'textDecorationsInEffect',
+  'textEmphasis',
+  'textEmphasis',
+  'textEmphasisColor',
+  'textEmphasisColor',
+  'textEmphasisPosition',
+  'textEmphasisPosition',
+  'textEmphasisStyle',
+  'textEmphasisStyle',
+  'textFillColor',
+  'textFillColor',
+  'textIndent',
+  'textIndent',
+  'textJustify',
+  'textJustify',
+  'textLineThroughColor',
+  'textLineThroughColor',
+  'textLineThroughMode',
+  'textLineThroughMode',
+  'textLineThroughStyle',
+  'textLineThroughStyle',
+  'textLineThroughWidth',
+  'textLineThroughWidth',
+  'textOrientation',
+  'textOrientation',
+  'textOverflow',
+  'textOverflow',
+  'textOverlineColor',
+  'textOverlineColor',
+  'textOverlineMode',
+  'textOverlineMode',
+  'textOverlineStyle',
+  'textOverlineStyle',
+  'textOverlineWidth',
+  'textOverlineWidth',
+  'textRendering',
+  'textRendering',
+  'textSecurity',
+  'textSecurity',
+  'textShadow',
+  'textShadow',
+  'textStroke',
+  'textStroke',
+  'textStrokeColor',
+  'textStrokeColor',
+  'textStrokeWidth',
+  'textStrokeWidth',
+  'textTransform',
+  'textTransform',
+  'textUnderlineColor',
+  'textUnderlineColor',
+  'textUnderlineMode',
+  'textUnderlineMode',
+  'textUnderlinePosition',
+  'textUnderlinePosition',
+  'textUnderlineStyle',
+  'textUnderlineStyle',
+  'textUnderlineWidth',
+  'textUnderlineWidth',
+  'top',
+  'top',
+  'touchAction',
+  'touchAction',
+  'touchActionDelay',
+  'touchActionDelay',
+  'transform',
+  'transform',
+  'transformOrigin',
+  'transformOrigin',
+  'transformOriginX',
+  'transformOriginX',
+  'transformOriginY',
+  'transformOriginY',
+  'transformOriginZ',
+  'transformOriginZ',
+  'transformStyle',
+  'transformStyle',
+  'transition',
+  'transition',
+  'transitionDelay',
+  'transitionDelay',
+  'transitionDuration',
+  'transitionDuration',
+  'transitionProperty',
+  'transitionProperty',
+  'transitionTimingFunction',
+  'transitionTimingFunction',
+  'unicodeBidi',
+  'unicodeBidi',
+  'unicodeRange',
+  'unicodeRange',
+  'userDrag',
+  'userDrag',
+  'userModify',
+  'userModify',
+  'userSelect',
+  'userSelect',
+  'userZoom',
+  'userZoom',
+  'verticalAlign',
+  'verticalAlign',
+  'visibility',
+  'visibility',
+  'whiteSpace',
+  'whiteSpace',
+  'widows',
+  'widows',
+  'width',
+  'width',
+  'willChange',
+  'willChange',
+  'wordBreak',
+  'wordBreak',
+  'wordSpacing',
+  'wordSpacing',
+  'wordWrap',
+  'wordWrap',
+  'wrapFlow',
+  'wrapFlow',
+  'wrapThrough',
+  'wrapThrough',
+  'writingMode',
+  'writingMode',
+  'zIndex',
+  'zIndex',
+  'zoom',
+  'zoom'
+]);
+dart.defineExtensionNames([
+  'getPropertyValue',
+  'supportsProperty',
+  'setProperty',
+  'getPropertyPriority',
+  'item',
+  'removeProperty',
+  'background',
+  'background',
+  'backgroundAttachment',
+  'backgroundAttachment',
+  'backgroundColor',
+  'backgroundColor',
+  'backgroundImage',
+  'backgroundImage',
+  'backgroundPosition',
+  'backgroundPosition',
+  'backgroundRepeat',
+  'backgroundRepeat',
+  'border',
+  'border',
+  'borderBottom',
+  'borderBottom',
+  'borderBottomColor',
+  'borderBottomColor',
+  'borderBottomStyle',
+  'borderBottomStyle',
+  'borderBottomWidth',
+  'borderBottomWidth',
+  'borderCollapse',
+  'borderCollapse',
+  'borderColor',
+  'borderColor',
+  'borderLeft',
+  'borderLeft',
+  'borderLeftColor',
+  'borderLeftColor',
+  'borderLeftStyle',
+  'borderLeftStyle',
+  'borderLeftWidth',
+  'borderLeftWidth',
+  'borderRight',
+  'borderRight',
+  'borderRightColor',
+  'borderRightColor',
+  'borderRightStyle',
+  'borderRightStyle',
+  'borderRightWidth',
+  'borderRightWidth',
+  'borderSpacing',
+  'borderSpacing',
+  'borderStyle',
+  'borderStyle',
+  'borderTop',
+  'borderTop',
+  'borderTopColor',
+  'borderTopColor',
+  'borderTopStyle',
+  'borderTopStyle',
+  'borderTopWidth',
+  'borderTopWidth',
+  'borderWidth',
+  'borderWidth',
+  'bottom',
+  'bottom',
+  'captionSide',
+  'captionSide',
+  'clear',
+  'clear',
+  'clip',
+  'clip',
+  'color',
+  'color',
+  'content',
+  'content',
+  'cursor',
+  'cursor',
+  'direction',
+  'direction',
+  'display',
+  'display',
+  'emptyCells',
+  'emptyCells',
+  'font',
+  'font',
+  'fontFamily',
+  'fontFamily',
+  'fontSize',
+  'fontSize',
+  'fontStyle',
+  'fontStyle',
+  'fontVariant',
+  'fontVariant',
+  'fontWeight',
+  'fontWeight',
+  'height',
+  'height',
+  'left',
+  'left',
+  'letterSpacing',
+  'letterSpacing',
+  'lineHeight',
+  'lineHeight',
+  'listStyle',
+  'listStyle',
+  'listStyleImage',
+  'listStyleImage',
+  'listStylePosition',
+  'listStylePosition',
+  'listStyleType',
+  'listStyleType',
+  'margin',
+  'margin',
+  'marginBottom',
+  'marginBottom',
+  'marginLeft',
+  'marginLeft',
+  'marginRight',
+  'marginRight',
+  'marginTop',
+  'marginTop',
+  'maxHeight',
+  'maxHeight',
+  'maxWidth',
+  'maxWidth',
+  'minHeight',
+  'minHeight',
+  'minWidth',
+  'minWidth',
+  'outline',
+  'outline',
+  'outlineColor',
+  'outlineColor',
+  'outlineStyle',
+  'outlineStyle',
+  'outlineWidth',
+  'outlineWidth',
+  'overflow',
+  'overflow',
+  'padding',
+  'padding',
+  'paddingBottom',
+  'paddingBottom',
+  'paddingLeft',
+  'paddingLeft',
+  'paddingRight',
+  'paddingRight',
+  'paddingTop',
+  'paddingTop',
+  'pageBreakAfter',
+  'pageBreakAfter',
+  'pageBreakBefore',
+  'pageBreakBefore',
+  'pageBreakInside',
+  'pageBreakInside',
+  'position',
+  'position',
+  'quotes',
+  'quotes',
+  'right',
+  'right',
+  'tableLayout',
+  'tableLayout',
+  'textAlign',
+  'textAlign',
+  'textDecoration',
+  'textDecoration',
+  'textIndent',
+  'textIndent',
+  'textTransform',
+  'textTransform',
+  'top',
+  'top',
+  'unicodeBidi',
+  'unicodeBidi',
+  'verticalAlign',
+  'verticalAlign',
+  'visibility',
+  'visibility',
+  'whiteSpace',
+  'whiteSpace',
+  'width',
+  'width',
+  'wordSpacing',
+  'wordSpacing',
+  'zIndex',
+  'zIndex',
+  'cssText',
+  'length',
+  'parentRule'
+]);
+html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
+  static new() {
+    return html$.CssStyleDeclaration.css('');
+  }
+  static css(css) {
+    let style = html$.Element.tag('div')[dartx.style];
+    style[dartx.cssText] = css;
+    return style;
+  }
+  [dartx.getPropertyValue](propertyName) {
+    let propValue = this[_getPropertyValueHelper](propertyName);
+    return propValue != null ? propValue : '';
+  }
+  [_getPropertyValueHelper](propertyName) {
+    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
+      return this[_getPropertyValue](propertyName);
+    } else {
+      return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
+    }
+  }
+  [dartx.supportsProperty](propertyName) {
+    return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
+  }
+  [_supportsProperty](propertyName) {
+    return propertyName in this;
+  }
+  [dartx.setProperty](propertyName, value, priority) {
+    if (priority === void 0) priority = null;
+    return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
+  }
+  [_browserPropertyName](propertyName) {
+    let name = html$.CssStyleDeclaration._readCache(propertyName);
+    if (typeof name == 'string') return name;
+    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
+      name = propertyName;
+    } else {
+      name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
+    }
+    html$.CssStyleDeclaration._writeCache(propertyName, name);
+    return name;
+  }
+  static _readCache(key) {
+    return html$.CssStyleDeclaration._propertyCache[key];
+  }
+  static _writeCache(key, value) {
+    html$.CssStyleDeclaration._propertyCache[key] = value;
+  }
+  static _camelCase(hyphenated) {
+    let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
+    return replacedMs.replace(/-([\da-z])/ig, (_, letter) => letter.toUpperCase());
+  }
+  [_setPropertyHelper](propertyName, value, priority) {
+    if (priority === void 0) priority = null;
+    if (value == null) value = '';
+    if (priority == null) priority = '';
+    this.setProperty(propertyName, value, priority);
+  }
+  static get supportsTransitions() {
+    return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cssText]() {
+    return this.cssText;
+  }
+  set [dartx.cssText](value) {
+    this.cssText = value;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.parentRule]() {
+    return this.parentRule;
+  }
+  [dartx.getPropertyPriority](...args) {
+    return this.getPropertyPriority.apply(this, args);
+  }
+  [_getPropertyValue](...args) {
+    return this.getPropertyValue.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.removeProperty](...args) {
+    return this.removeProperty.apply(this, args);
+  }
+  get [dartx.background]() {
+    return this[_background];
+  }
+  set [dartx.background](value) {
+    this[_background] = value == null ? '' : value;
+  }
+  get [_background]() {
+    return this.background;
+  }
+  set [_background](value) {
+    this.background = value;
+  }
+  get [dartx.backgroundAttachment]() {
+    return this[_backgroundAttachment];
+  }
+  set [dartx.backgroundAttachment](value) {
+    this[_backgroundAttachment] = value == null ? '' : value;
+  }
+  get [_backgroundAttachment]() {
+    return this.backgroundAttachment;
+  }
+  set [_backgroundAttachment](value) {
+    this.backgroundAttachment = value;
+  }
+  get [dartx.backgroundColor]() {
+    return this[_backgroundColor];
+  }
+  set [dartx.backgroundColor](value) {
+    this[_backgroundColor] = value == null ? '' : value;
+  }
+  get [_backgroundColor]() {
+    return this.backgroundColor;
+  }
+  set [_backgroundColor](value) {
+    this.backgroundColor = value;
+  }
+  get [dartx.backgroundImage]() {
+    return this[_backgroundImage];
+  }
+  set [dartx.backgroundImage](value) {
+    this[_backgroundImage] = value == null ? '' : value;
+  }
+  get [_backgroundImage]() {
+    return this.backgroundImage;
+  }
+  set [_backgroundImage](value) {
+    this.backgroundImage = value;
+  }
+  get [dartx.backgroundPosition]() {
+    return this[_backgroundPosition];
+  }
+  set [dartx.backgroundPosition](value) {
+    this[_backgroundPosition] = value == null ? '' : value;
+  }
+  get [_backgroundPosition]() {
+    return this.backgroundPosition;
+  }
+  set [_backgroundPosition](value) {
+    this.backgroundPosition = value;
+  }
+  get [dartx.backgroundRepeat]() {
+    return this[_backgroundRepeat];
+  }
+  set [dartx.backgroundRepeat](value) {
+    this[_backgroundRepeat] = value == null ? '' : value;
+  }
+  get [_backgroundRepeat]() {
+    return this.backgroundRepeat;
+  }
+  set [_backgroundRepeat](value) {
+    this.backgroundRepeat = value;
+  }
+  get [dartx.border]() {
+    return this[_border];
+  }
+  set [dartx.border](value) {
+    this[_border] = value == null ? '' : value;
+  }
+  get [_border]() {
+    return this.border;
+  }
+  set [_border](value) {
+    this.border = value;
+  }
+  get [dartx.borderBottom]() {
+    return this[_borderBottom];
+  }
+  set [dartx.borderBottom](value) {
+    this[_borderBottom] = value == null ? '' : value;
+  }
+  get [_borderBottom]() {
+    return this.borderBottom;
+  }
+  set [_borderBottom](value) {
+    this.borderBottom = value;
+  }
+  get [dartx.borderBottomColor]() {
+    return this[_borderBottomColor];
+  }
+  set [dartx.borderBottomColor](value) {
+    this[_borderBottomColor] = value == null ? '' : value;
+  }
+  get [_borderBottomColor]() {
+    return this.borderBottomColor;
+  }
+  set [_borderBottomColor](value) {
+    this.borderBottomColor = value;
+  }
+  get [dartx.borderBottomStyle]() {
+    return this[_borderBottomStyle];
+  }
+  set [dartx.borderBottomStyle](value) {
+    this[_borderBottomStyle] = value == null ? '' : value;
+  }
+  get [_borderBottomStyle]() {
+    return this.borderBottomStyle;
+  }
+  set [_borderBottomStyle](value) {
+    this.borderBottomStyle = value;
+  }
+  get [dartx.borderBottomWidth]() {
+    return this[_borderBottomWidth];
+  }
+  set [dartx.borderBottomWidth](value) {
+    this[_borderBottomWidth] = value == null ? '' : value;
+  }
+  get [_borderBottomWidth]() {
+    return this.borderBottomWidth;
+  }
+  set [_borderBottomWidth](value) {
+    this.borderBottomWidth = value;
+  }
+  get [dartx.borderCollapse]() {
+    return this[_borderCollapse];
+  }
+  set [dartx.borderCollapse](value) {
+    this[_borderCollapse] = value == null ? '' : value;
+  }
+  get [_borderCollapse]() {
+    return this.borderCollapse;
+  }
+  set [_borderCollapse](value) {
+    this.borderCollapse = value;
+  }
+  get [dartx.borderColor]() {
+    return this[_borderColor];
+  }
+  set [dartx.borderColor](value) {
+    this[_borderColor] = value == null ? '' : value;
+  }
+  get [_borderColor]() {
+    return this.borderColor;
+  }
+  set [_borderColor](value) {
+    this.borderColor = value;
+  }
+  get [dartx.borderLeft]() {
+    return this[_borderLeft];
+  }
+  set [dartx.borderLeft](value) {
+    this[_borderLeft] = value == null ? '' : value;
+  }
+  get [_borderLeft]() {
+    return this.borderLeft;
+  }
+  set [_borderLeft](value) {
+    this.borderLeft = value;
+  }
+  get [dartx.borderLeftColor]() {
+    return this[_borderLeftColor];
+  }
+  set [dartx.borderLeftColor](value) {
+    this[_borderLeftColor] = value == null ? '' : value;
+  }
+  get [_borderLeftColor]() {
+    return this.borderLeftColor;
+  }
+  set [_borderLeftColor](value) {
+    this.borderLeftColor = value;
+  }
+  get [dartx.borderLeftStyle]() {
+    return this[_borderLeftStyle];
+  }
+  set [dartx.borderLeftStyle](value) {
+    this[_borderLeftStyle] = value == null ? '' : value;
+  }
+  get [_borderLeftStyle]() {
+    return this.borderLeftStyle;
+  }
+  set [_borderLeftStyle](value) {
+    this.borderLeftStyle = value;
+  }
+  get [dartx.borderLeftWidth]() {
+    return this[_borderLeftWidth];
+  }
+  set [dartx.borderLeftWidth](value) {
+    this[_borderLeftWidth] = value == null ? '' : value;
+  }
+  get [_borderLeftWidth]() {
+    return this.borderLeftWidth;
+  }
+  set [_borderLeftWidth](value) {
+    this.borderLeftWidth = value;
+  }
+  get [dartx.borderRight]() {
+    return this[_borderRight];
+  }
+  set [dartx.borderRight](value) {
+    this[_borderRight] = value == null ? '' : value;
+  }
+  get [_borderRight]() {
+    return this.borderRight;
+  }
+  set [_borderRight](value) {
+    this.borderRight = value;
+  }
+  get [dartx.borderRightColor]() {
+    return this[_borderRightColor];
+  }
+  set [dartx.borderRightColor](value) {
+    this[_borderRightColor] = value == null ? '' : value;
+  }
+  get [_borderRightColor]() {
+    return this.borderRightColor;
+  }
+  set [_borderRightColor](value) {
+    this.borderRightColor = value;
+  }
+  get [dartx.borderRightStyle]() {
+    return this[_borderRightStyle];
+  }
+  set [dartx.borderRightStyle](value) {
+    this[_borderRightStyle] = value == null ? '' : value;
+  }
+  get [_borderRightStyle]() {
+    return this.borderRightStyle;
+  }
+  set [_borderRightStyle](value) {
+    this.borderRightStyle = value;
+  }
+  get [dartx.borderRightWidth]() {
+    return this[_borderRightWidth];
+  }
+  set [dartx.borderRightWidth](value) {
+    this[_borderRightWidth] = value == null ? '' : value;
+  }
+  get [_borderRightWidth]() {
+    return this.borderRightWidth;
+  }
+  set [_borderRightWidth](value) {
+    this.borderRightWidth = value;
+  }
+  get [dartx.borderSpacing]() {
+    return this[_borderSpacing];
+  }
+  set [dartx.borderSpacing](value) {
+    this[_borderSpacing] = value == null ? '' : value;
+  }
+  get [_borderSpacing]() {
+    return this.borderSpacing;
+  }
+  set [_borderSpacing](value) {
+    this.borderSpacing = value;
+  }
+  get [dartx.borderStyle]() {
+    return this[_borderStyle];
+  }
+  set [dartx.borderStyle](value) {
+    this[_borderStyle] = value == null ? '' : value;
+  }
+  get [_borderStyle]() {
+    return this.borderStyle;
+  }
+  set [_borderStyle](value) {
+    this.borderStyle = value;
+  }
+  get [dartx.borderTop]() {
+    return this[_borderTop];
+  }
+  set [dartx.borderTop](value) {
+    this[_borderTop] = value == null ? '' : value;
+  }
+  get [_borderTop]() {
+    return this.borderTop;
+  }
+  set [_borderTop](value) {
+    this.borderTop = value;
+  }
+  get [dartx.borderTopColor]() {
+    return this[_borderTopColor];
+  }
+  set [dartx.borderTopColor](value) {
+    this[_borderTopColor] = value == null ? '' : value;
+  }
+  get [_borderTopColor]() {
+    return this.borderTopColor;
+  }
+  set [_borderTopColor](value) {
+    this.borderTopColor = value;
+  }
+  get [dartx.borderTopStyle]() {
+    return this[_borderTopStyle];
+  }
+  set [dartx.borderTopStyle](value) {
+    this[_borderTopStyle] = value == null ? '' : value;
+  }
+  get [_borderTopStyle]() {
+    return this.borderTopStyle;
+  }
+  set [_borderTopStyle](value) {
+    this.borderTopStyle = value;
+  }
+  get [dartx.borderTopWidth]() {
+    return this[_borderTopWidth];
+  }
+  set [dartx.borderTopWidth](value) {
+    this[_borderTopWidth] = value == null ? '' : value;
+  }
+  get [_borderTopWidth]() {
+    return this.borderTopWidth;
+  }
+  set [_borderTopWidth](value) {
+    this.borderTopWidth = value;
+  }
+  get [dartx.borderWidth]() {
+    return this[_borderWidth];
+  }
+  set [dartx.borderWidth](value) {
+    this[_borderWidth] = value == null ? '' : value;
+  }
+  get [_borderWidth]() {
+    return this.borderWidth;
+  }
+  set [_borderWidth](value) {
+    this.borderWidth = value;
+  }
+  get [dartx.bottom]() {
+    return this[_bottom];
+  }
+  set [dartx.bottom](value) {
+    this[_bottom] = value == null ? '' : value;
+  }
+  get [_bottom]() {
+    return this.bottom;
+  }
+  set [_bottom](value) {
+    this.bottom = value;
+  }
+  get [dartx.captionSide]() {
+    return this[_captionSide];
+  }
+  set [dartx.captionSide](value) {
+    this[_captionSide] = value == null ? '' : value;
+  }
+  get [_captionSide]() {
+    return this.captionSide;
+  }
+  set [_captionSide](value) {
+    this.captionSide = value;
+  }
+  get [dartx.clear]() {
+    return this[_clear$1];
+  }
+  set [dartx.clear](value) {
+    this[_clear$1] = value == null ? '' : value;
+  }
+  get [_clear$1]() {
+    return this.clear;
+  }
+  set [_clear$1](value) {
+    this.clear = value;
+  }
+  get [dartx.clip]() {
+    return this[_clip];
+  }
+  set [dartx.clip](value) {
+    this[_clip] = value == null ? '' : value;
+  }
+  get [_clip]() {
+    return this.clip;
+  }
+  set [_clip](value) {
+    this.clip = value;
+  }
+  get [dartx.color]() {
+    return this[_color];
+  }
+  set [dartx.color](value) {
+    this[_color] = value == null ? '' : value;
+  }
+  get [_color]() {
+    return this.color;
+  }
+  set [_color](value) {
+    this.color = value;
+  }
+  get [dartx.content]() {
+    return this[_content];
+  }
+  set [dartx.content](value) {
+    this[_content] = value == null ? '' : value;
+  }
+  get [_content]() {
+    return this.content;
+  }
+  set [_content](value) {
+    this.content = value;
+  }
+  get [dartx.cursor]() {
+    return this[_cursor];
+  }
+  set [dartx.cursor](value) {
+    this[_cursor] = value == null ? '' : value;
+  }
+  get [_cursor]() {
+    return this.cursor;
+  }
+  set [_cursor](value) {
+    this.cursor = value;
+  }
+  get [dartx.direction]() {
+    return this[_direction];
+  }
+  set [dartx.direction](value) {
+    this[_direction] = value == null ? '' : value;
+  }
+  get [_direction]() {
+    return this.direction;
+  }
+  set [_direction](value) {
+    this.direction = value;
+  }
+  get [dartx.display]() {
+    return this[_display];
+  }
+  set [dartx.display](value) {
+    this[_display] = value == null ? '' : value;
+  }
+  get [_display]() {
+    return this.display;
+  }
+  set [_display](value) {
+    this.display = value;
+  }
+  get [dartx.emptyCells]() {
+    return this[_emptyCells];
+  }
+  set [dartx.emptyCells](value) {
+    this[_emptyCells] = value == null ? '' : value;
+  }
+  get [_emptyCells]() {
+    return this.emptyCells;
+  }
+  set [_emptyCells](value) {
+    this.emptyCells = value;
+  }
+  get [dartx.font]() {
+    return this[_font];
+  }
+  set [dartx.font](value) {
+    this[_font] = value == null ? '' : value;
+  }
+  get [_font]() {
+    return this.font;
+  }
+  set [_font](value) {
+    this.font = value;
+  }
+  get [dartx.fontFamily]() {
+    return this[_fontFamily];
+  }
+  set [dartx.fontFamily](value) {
+    this[_fontFamily] = value == null ? '' : value;
+  }
+  get [_fontFamily]() {
+    return this.fontFamily;
+  }
+  set [_fontFamily](value) {
+    this.fontFamily = value;
+  }
+  get [dartx.fontSize]() {
+    return this[_fontSize];
+  }
+  set [dartx.fontSize](value) {
+    this[_fontSize] = value == null ? '' : value;
+  }
+  get [_fontSize]() {
+    return this.fontSize;
+  }
+  set [_fontSize](value) {
+    this.fontSize = value;
+  }
+  get [dartx.fontStyle]() {
+    return this[_fontStyle];
+  }
+  set [dartx.fontStyle](value) {
+    this[_fontStyle] = value == null ? '' : value;
+  }
+  get [_fontStyle]() {
+    return this.fontStyle;
+  }
+  set [_fontStyle](value) {
+    this.fontStyle = value;
+  }
+  get [dartx.fontVariant]() {
+    return this[_fontVariant];
+  }
+  set [dartx.fontVariant](value) {
+    this[_fontVariant] = value == null ? '' : value;
+  }
+  get [_fontVariant]() {
+    return this.fontVariant;
+  }
+  set [_fontVariant](value) {
+    this.fontVariant = value;
+  }
+  get [dartx.fontWeight]() {
+    return this[_fontWeight];
+  }
+  set [dartx.fontWeight](value) {
+    this[_fontWeight] = value == null ? '' : value;
+  }
+  get [_fontWeight]() {
+    return this.fontWeight;
+  }
+  set [_fontWeight](value) {
+    this.fontWeight = value;
+  }
+  get [dartx.height]() {
+    return this[_height$];
+  }
+  set [dartx.height](value) {
+    this[_height$] = value == null ? '' : value;
+  }
+  get [_height$]() {
+    return this.height;
+  }
+  set [_height$](value) {
+    this.height = value;
+  }
+  get [dartx.left]() {
+    return this[_left];
+  }
+  set [dartx.left](value) {
+    this[_left] = value == null ? '' : value;
+  }
+  get [_left]() {
+    return this.left;
+  }
+  set [_left](value) {
+    this.left = value;
+  }
+  get [dartx.letterSpacing]() {
+    return this[_letterSpacing];
+  }
+  set [dartx.letterSpacing](value) {
+    this[_letterSpacing] = value == null ? '' : value;
+  }
+  get [_letterSpacing]() {
+    return this.letterSpacing;
+  }
+  set [_letterSpacing](value) {
+    this.letterSpacing = value;
+  }
+  get [dartx.lineHeight]() {
+    return this[_lineHeight];
+  }
+  set [dartx.lineHeight](value) {
+    this[_lineHeight] = value == null ? '' : value;
+  }
+  get [_lineHeight]() {
+    return this.lineHeight;
+  }
+  set [_lineHeight](value) {
+    this.lineHeight = value;
+  }
+  get [dartx.listStyle]() {
+    return this[_listStyle];
+  }
+  set [dartx.listStyle](value) {
+    this[_listStyle] = value == null ? '' : value;
+  }
+  get [_listStyle]() {
+    return this.listStyle;
+  }
+  set [_listStyle](value) {
+    this.listStyle = value;
+  }
+  get [dartx.listStyleImage]() {
+    return this[_listStyleImage];
+  }
+  set [dartx.listStyleImage](value) {
+    this[_listStyleImage] = value == null ? '' : value;
+  }
+  get [_listStyleImage]() {
+    return this.listStyleImage;
+  }
+  set [_listStyleImage](value) {
+    this.listStyleImage = value;
+  }
+  get [dartx.listStylePosition]() {
+    return this[_listStylePosition];
+  }
+  set [dartx.listStylePosition](value) {
+    this[_listStylePosition] = value == null ? '' : value;
+  }
+  get [_listStylePosition]() {
+    return this.listStylePosition;
+  }
+  set [_listStylePosition](value) {
+    this.listStylePosition = value;
+  }
+  get [dartx.listStyleType]() {
+    return this[_listStyleType];
+  }
+  set [dartx.listStyleType](value) {
+    this[_listStyleType] = value == null ? '' : value;
+  }
+  get [_listStyleType]() {
+    return this.listStyleType;
+  }
+  set [_listStyleType](value) {
+    this.listStyleType = value;
+  }
+  get [dartx.margin]() {
+    return this[_margin];
+  }
+  set [dartx.margin](value) {
+    this[_margin] = value == null ? '' : value;
+  }
+  get [_margin]() {
+    return this.margin;
+  }
+  set [_margin](value) {
+    this.margin = value;
+  }
+  get [dartx.marginBottom]() {
+    return this[_marginBottom];
+  }
+  set [dartx.marginBottom](value) {
+    this[_marginBottom] = value == null ? '' : value;
+  }
+  get [_marginBottom]() {
+    return this.marginBottom;
+  }
+  set [_marginBottom](value) {
+    this.marginBottom = value;
+  }
+  get [dartx.marginLeft]() {
+    return this[_marginLeft];
+  }
+  set [dartx.marginLeft](value) {
+    this[_marginLeft] = value == null ? '' : value;
+  }
+  get [_marginLeft]() {
+    return this.marginLeft;
+  }
+  set [_marginLeft](value) {
+    this.marginLeft = value;
+  }
+  get [dartx.marginRight]() {
+    return this[_marginRight];
+  }
+  set [dartx.marginRight](value) {
+    this[_marginRight] = value == null ? '' : value;
+  }
+  get [_marginRight]() {
+    return this.marginRight;
+  }
+  set [_marginRight](value) {
+    this.marginRight = value;
+  }
+  get [dartx.marginTop]() {
+    return this[_marginTop];
+  }
+  set [dartx.marginTop](value) {
+    this[_marginTop] = value == null ? '' : value;
+  }
+  get [_marginTop]() {
+    return this.marginTop;
+  }
+  set [_marginTop](value) {
+    this.marginTop = value;
+  }
+  get [dartx.maxHeight]() {
+    return this[_maxHeight];
+  }
+  set [dartx.maxHeight](value) {
+    this[_maxHeight] = value == null ? '' : value;
+  }
+  get [_maxHeight]() {
+    return this.maxHeight;
+  }
+  set [_maxHeight](value) {
+    this.maxHeight = value;
+  }
+  get [dartx.maxWidth]() {
+    return this[_maxWidth];
+  }
+  set [dartx.maxWidth](value) {
+    this[_maxWidth] = value == null ? '' : value;
+  }
+  get [_maxWidth]() {
+    return this.maxWidth;
+  }
+  set [_maxWidth](value) {
+    this.maxWidth = value;
+  }
+  get [dartx.minHeight]() {
+    return this[_minHeight];
+  }
+  set [dartx.minHeight](value) {
+    this[_minHeight] = value == null ? '' : value;
+  }
+  get [_minHeight]() {
+    return this.minHeight;
+  }
+  set [_minHeight](value) {
+    this.minHeight = value;
+  }
+  get [dartx.minWidth]() {
+    return this[_minWidth];
+  }
+  set [dartx.minWidth](value) {
+    this[_minWidth] = value == null ? '' : value;
+  }
+  get [_minWidth]() {
+    return this.minWidth;
+  }
+  set [_minWidth](value) {
+    this.minWidth = value;
+  }
+  get [dartx.outline]() {
+    return this[_outline];
+  }
+  set [dartx.outline](value) {
+    this[_outline] = value == null ? '' : value;
+  }
+  get [_outline]() {
+    return this.outline;
+  }
+  set [_outline](value) {
+    this.outline = value;
+  }
+  get [dartx.outlineColor]() {
+    return this[_outlineColor];
+  }
+  set [dartx.outlineColor](value) {
+    this[_outlineColor] = value == null ? '' : value;
+  }
+  get [_outlineColor]() {
+    return this.outlineColor;
+  }
+  set [_outlineColor](value) {
+    this.outlineColor = value;
+  }
+  get [dartx.outlineStyle]() {
+    return this[_outlineStyle];
+  }
+  set [dartx.outlineStyle](value) {
+    this[_outlineStyle] = value == null ? '' : value;
+  }
+  get [_outlineStyle]() {
+    return this.outlineStyle;
+  }
+  set [_outlineStyle](value) {
+    this.outlineStyle = value;
+  }
+  get [dartx.outlineWidth]() {
+    return this[_outlineWidth];
+  }
+  set [dartx.outlineWidth](value) {
+    this[_outlineWidth] = value == null ? '' : value;
+  }
+  get [_outlineWidth]() {
+    return this.outlineWidth;
+  }
+  set [_outlineWidth](value) {
+    this.outlineWidth = value;
+  }
+  get [dartx.overflow]() {
+    return this[_overflow];
+  }
+  set [dartx.overflow](value) {
+    this[_overflow] = value == null ? '' : value;
+  }
+  get [_overflow]() {
+    return this.overflow;
+  }
+  set [_overflow](value) {
+    this.overflow = value;
+  }
+  get [dartx.padding]() {
+    return this[_padding];
+  }
+  set [dartx.padding](value) {
+    this[_padding] = value == null ? '' : value;
+  }
+  get [_padding]() {
+    return this.padding;
+  }
+  set [_padding](value) {
+    this.padding = value;
+  }
+  get [dartx.paddingBottom]() {
+    return this[_paddingBottom];
+  }
+  set [dartx.paddingBottom](value) {
+    this[_paddingBottom] = value == null ? '' : value;
+  }
+  get [_paddingBottom]() {
+    return this.paddingBottom;
+  }
+  set [_paddingBottom](value) {
+    this.paddingBottom = value;
+  }
+  get [dartx.paddingLeft]() {
+    return this[_paddingLeft];
+  }
+  set [dartx.paddingLeft](value) {
+    this[_paddingLeft] = value == null ? '' : value;
+  }
+  get [_paddingLeft]() {
+    return this.paddingLeft;
+  }
+  set [_paddingLeft](value) {
+    this.paddingLeft = value;
+  }
+  get [dartx.paddingRight]() {
+    return this[_paddingRight];
+  }
+  set [dartx.paddingRight](value) {
+    this[_paddingRight] = value == null ? '' : value;
+  }
+  get [_paddingRight]() {
+    return this.paddingRight;
+  }
+  set [_paddingRight](value) {
+    this.paddingRight = value;
+  }
+  get [dartx.paddingTop]() {
+    return this[_paddingTop];
+  }
+  set [dartx.paddingTop](value) {
+    this[_paddingTop] = value == null ? '' : value;
+  }
+  get [_paddingTop]() {
+    return this.paddingTop;
+  }
+  set [_paddingTop](value) {
+    this.paddingTop = value;
+  }
+  get [dartx.pageBreakAfter]() {
+    return this[_pageBreakAfter];
+  }
+  set [dartx.pageBreakAfter](value) {
+    this[_pageBreakAfter] = value == null ? '' : value;
+  }
+  get [_pageBreakAfter]() {
+    return this.pageBreakAfter;
+  }
+  set [_pageBreakAfter](value) {
+    this.pageBreakAfter = value;
+  }
+  get [dartx.pageBreakBefore]() {
+    return this[_pageBreakBefore];
+  }
+  set [dartx.pageBreakBefore](value) {
+    this[_pageBreakBefore] = value == null ? '' : value;
+  }
+  get [_pageBreakBefore]() {
+    return this.pageBreakBefore;
+  }
+  set [_pageBreakBefore](value) {
+    this.pageBreakBefore = value;
+  }
+  get [dartx.pageBreakInside]() {
+    return this[_pageBreakInside];
+  }
+  set [dartx.pageBreakInside](value) {
+    this[_pageBreakInside] = value == null ? '' : value;
+  }
+  get [_pageBreakInside]() {
+    return this.pageBreakInside;
+  }
+  set [_pageBreakInside](value) {
+    this.pageBreakInside = value;
+  }
+  get [dartx.position]() {
+    return this[_position$1];
+  }
+  set [dartx.position](value) {
+    this[_position$1] = value == null ? '' : value;
+  }
+  get [_position$1]() {
+    return this.position;
+  }
+  set [_position$1](value) {
+    this.position = value;
+  }
+  get [dartx.quotes]() {
+    return this[_quotes];
+  }
+  set [dartx.quotes](value) {
+    this[_quotes] = value == null ? '' : value;
+  }
+  get [_quotes]() {
+    return this.quotes;
+  }
+  set [_quotes](value) {
+    this.quotes = value;
+  }
+  get [dartx.right]() {
+    return this[_right];
+  }
+  set [dartx.right](value) {
+    this[_right] = value == null ? '' : value;
+  }
+  get [_right]() {
+    return this.right;
+  }
+  set [_right](value) {
+    this.right = value;
+  }
+  get [dartx.tableLayout]() {
+    return this[_tableLayout];
+  }
+  set [dartx.tableLayout](value) {
+    this[_tableLayout] = value == null ? '' : value;
+  }
+  get [_tableLayout]() {
+    return this.tableLayout;
+  }
+  set [_tableLayout](value) {
+    this.tableLayout = value;
+  }
+  get [dartx.textAlign]() {
+    return this[_textAlign];
+  }
+  set [dartx.textAlign](value) {
+    this[_textAlign] = value == null ? '' : value;
+  }
+  get [_textAlign]() {
+    return this.textAlign;
+  }
+  set [_textAlign](value) {
+    this.textAlign = value;
+  }
+  get [dartx.textDecoration]() {
+    return this[_textDecoration];
+  }
+  set [dartx.textDecoration](value) {
+    this[_textDecoration] = value == null ? '' : value;
+  }
+  get [_textDecoration]() {
+    return this.textDecoration;
+  }
+  set [_textDecoration](value) {
+    this.textDecoration = value;
+  }
+  get [dartx.textIndent]() {
+    return this[_textIndent];
+  }
+  set [dartx.textIndent](value) {
+    this[_textIndent] = value == null ? '' : value;
+  }
+  get [_textIndent]() {
+    return this.textIndent;
+  }
+  set [_textIndent](value) {
+    this.textIndent = value;
+  }
+  get [dartx.textTransform]() {
+    return this[_textTransform];
+  }
+  set [dartx.textTransform](value) {
+    this[_textTransform] = value == null ? '' : value;
+  }
+  get [_textTransform]() {
+    return this.textTransform;
+  }
+  set [_textTransform](value) {
+    this.textTransform = value;
+  }
+  get [dartx.top]() {
+    return this[_top];
+  }
+  set [dartx.top](value) {
+    this[_top] = value == null ? '' : value;
+  }
+  get [_top]() {
+    return this.top;
+  }
+  set [_top](value) {
+    this.top = value;
+  }
+  get [dartx.unicodeBidi]() {
+    return this[_unicodeBidi];
+  }
+  set [dartx.unicodeBidi](value) {
+    this[_unicodeBidi] = value == null ? '' : value;
+  }
+  get [_unicodeBidi]() {
+    return this.unicodeBidi;
+  }
+  set [_unicodeBidi](value) {
+    this.unicodeBidi = value;
+  }
+  get [dartx.verticalAlign]() {
+    return this[_verticalAlign];
+  }
+  set [dartx.verticalAlign](value) {
+    this[_verticalAlign] = value == null ? '' : value;
+  }
+  get [_verticalAlign]() {
+    return this.verticalAlign;
+  }
+  set [_verticalAlign](value) {
+    this.verticalAlign = value;
+  }
+  get [dartx.visibility]() {
+    return this[_visibility];
+  }
+  set [dartx.visibility](value) {
+    this[_visibility] = value == null ? '' : value;
+  }
+  get [_visibility]() {
+    return this.visibility;
+  }
+  set [_visibility](value) {
+    this.visibility = value;
+  }
+  get [dartx.whiteSpace]() {
+    return this[_whiteSpace];
+  }
+  set [dartx.whiteSpace](value) {
+    this[_whiteSpace] = value == null ? '' : value;
+  }
+  get [_whiteSpace]() {
+    return this.whiteSpace;
+  }
+  set [_whiteSpace](value) {
+    this.whiteSpace = value;
+  }
+  get [dartx.width]() {
+    return this[_width$];
+  }
+  set [dartx.width](value) {
+    this[_width$] = value == null ? '' : value;
+  }
+  get [_width$]() {
+    return this.width;
+  }
+  set [_width$](value) {
+    this.width = value;
+  }
+  get [dartx.wordSpacing]() {
+    return this[_wordSpacing];
+  }
+  set [dartx.wordSpacing](value) {
+    this[_wordSpacing] = value == null ? '' : value;
+  }
+  get [_wordSpacing]() {
+    return this.wordSpacing;
+  }
+  set [_wordSpacing](value) {
+    this.wordSpacing = value;
+  }
+  get [dartx.zIndex]() {
+    return this[_zIndex];
+  }
+  set [dartx.zIndex](value) {
+    this[_zIndex] = value == null ? '' : value;
+  }
+  get [_zIndex]() {
+    return this.zIndex;
+  }
+  set [_zIndex](value) {
+    this.zIndex = value;
+  }
+};
+dart.setSignature(html$.CssStyleDeclaration, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
+    css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
+    _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
+  }),
+  fields: () => ({
+    [dartx.cssText]: core.String,
+    [dartx.length]: core.int,
+    [dartx.parentRule]: html$.CssRule,
+    [_background]: core.String,
+    [_backgroundAttachment]: core.String,
+    [_backgroundColor]: core.String,
+    [_backgroundImage]: core.String,
+    [_backgroundPosition]: core.String,
+    [_backgroundRepeat]: core.String,
+    [_border]: core.String,
+    [_borderBottom]: core.String,
+    [_borderBottomColor]: core.String,
+    [_borderBottomStyle]: core.String,
+    [_borderBottomWidth]: core.String,
+    [_borderCollapse]: core.String,
+    [_borderColor]: core.String,
+    [_borderLeft]: core.String,
+    [_borderLeftColor]: core.String,
+    [_borderLeftStyle]: core.String,
+    [_borderLeftWidth]: core.String,
+    [_borderRight]: core.String,
+    [_borderRightColor]: core.String,
+    [_borderRightStyle]: core.String,
+    [_borderRightWidth]: core.String,
+    [_borderSpacing]: core.String,
+    [_borderStyle]: core.String,
+    [_borderTop]: core.String,
+    [_borderTopColor]: core.String,
+    [_borderTopStyle]: core.String,
+    [_borderTopWidth]: core.String,
+    [_borderWidth]: core.String,
+    [_bottom]: core.String,
+    [_captionSide]: core.String,
+    [_clear$1]: core.String,
+    [_clip]: core.String,
+    [_color]: core.String,
+    [_content]: core.String,
+    [_cursor]: core.String,
+    [_direction]: core.String,
+    [_display]: core.String,
+    [_emptyCells]: core.String,
+    [_font]: core.String,
+    [_fontFamily]: core.String,
+    [_fontSize]: core.String,
+    [_fontStyle]: core.String,
+    [_fontVariant]: core.String,
+    [_fontWeight]: core.String,
+    [_height$]: core.String,
+    [_left]: core.String,
+    [_letterSpacing]: core.String,
+    [_lineHeight]: core.String,
+    [_listStyle]: core.String,
+    [_listStyleImage]: core.String,
+    [_listStylePosition]: core.String,
+    [_listStyleType]: core.String,
+    [_margin]: core.String,
+    [_marginBottom]: core.String,
+    [_marginLeft]: core.String,
+    [_marginRight]: core.String,
+    [_marginTop]: core.String,
+    [_maxHeight]: core.String,
+    [_maxWidth]: core.String,
+    [_minHeight]: core.String,
+    [_minWidth]: core.String,
+    [_outline]: core.String,
+    [_outlineColor]: core.String,
+    [_outlineStyle]: core.String,
+    [_outlineWidth]: core.String,
+    [_overflow]: core.String,
+    [_padding]: core.String,
+    [_paddingBottom]: core.String,
+    [_paddingLeft]: core.String,
+    [_paddingRight]: core.String,
+    [_paddingTop]: core.String,
+    [_pageBreakAfter]: core.String,
+    [_pageBreakBefore]: core.String,
+    [_pageBreakInside]: core.String,
+    [_position$1]: core.String,
+    [_quotes]: core.String,
+    [_right]: core.String,
+    [_tableLayout]: core.String,
+    [_textAlign]: core.String,
+    [_textDecoration]: core.String,
+    [_textIndent]: core.String,
+    [_textTransform]: core.String,
+    [_top]: core.String,
+    [_unicodeBidi]: core.String,
+    [_verticalAlign]: core.String,
+    [_visibility]: core.String,
+    [_whiteSpace]: core.String,
+    [_width$]: core.String,
+    [_wordSpacing]: core.String,
+    [_zIndex]: core.String
+  }),
+  methods: () => ({
+    [dartx.getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
+    [_getPropertyValueHelper]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
+    [_supportsProperty]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.setProperty]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
+    [_browserPropertyName]: dart.definiteFunctionType(core.String, [core.String]),
+    [_setPropertyHelper]: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
+    [dartx.getPropertyPriority]: dart.definiteFunctionType(core.String, [core.String]),
+    [_getPropertyValue]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.removeProperty]: dart.definiteFunctionType(core.String, [core.String])
+  }),
+  sfields: () => ({_propertyCache: dart.dynamic}),
+  sgetters: () => ({supportsTransitions: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _readCache: dart.definiteFunctionType(core.String, [core.String]),
+    _writeCache: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    _camelCase: dart.definiteFunctionType(core.String, [core.String])
+  }),
+  names: ['_readCache', '_writeCache', '_camelCase']
+});
+dart.defineLazy(html$.CssStyleDeclaration, {
+  get _propertyCache() {
+    return {};
+  }
+});
+dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
+dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
+dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
+const _elementIterable = Symbol('_elementIterable');
+const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
+const _setAll = Symbol('_setAll');
+html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
+  new(elementIterable) {
+    this[_elementIterable] = elementIterable;
+    this[_elementCssStyleDeclarationSetIterable] = null;
+    this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
+  }
+  getPropertyValue(propertyName) {
+    return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
+  }
+  setProperty(propertyName, value, priority) {
+    if (priority === void 0) priority = null;
+    this[_elementCssStyleDeclarationSetIterable][dartx.forEach](dart.fn(e => e[dartx.setProperty](propertyName, value, priority), CssStyleDeclarationTovoid()));
+  }
+  [_setAll](propertyName, value) {
+    value = value == null ? '' : value;
+    for (let element of this[_elementIterable]) {
+      element.style[propertyName] = value;
+    }
+  }
+  set background(value) {
+    this[_setAll]('background', value);
+  }
+  get background() {
+    return super.background;
+  }
+  set backgroundAttachment(value) {
+    this[_setAll]('backgroundAttachment', value);
+  }
+  get backgroundAttachment() {
+    return super.backgroundAttachment;
+  }
+  set backgroundColor(value) {
+    this[_setAll]('backgroundColor', value);
+  }
+  get backgroundColor() {
+    return super.backgroundColor;
+  }
+  set backgroundImage(value) {
+    this[_setAll]('backgroundImage', value);
+  }
+  get backgroundImage() {
+    return super.backgroundImage;
+  }
+  set backgroundPosition(value) {
+    this[_setAll]('backgroundPosition', value);
+  }
+  get backgroundPosition() {
+    return super.backgroundPosition;
+  }
+  set backgroundRepeat(value) {
+    this[_setAll]('backgroundRepeat', value);
+  }
+  get backgroundRepeat() {
+    return super.backgroundRepeat;
+  }
+  set border(value) {
+    this[_setAll]('border', value);
+  }
+  get border() {
+    return super.border;
+  }
+  set borderBottom(value) {
+    this[_setAll]('borderBottom', value);
+  }
+  get borderBottom() {
+    return super.borderBottom;
+  }
+  set borderBottomColor(value) {
+    this[_setAll]('borderBottomColor', value);
+  }
+  get borderBottomColor() {
+    return super.borderBottomColor;
+  }
+  set borderBottomStyle(value) {
+    this[_setAll]('borderBottomStyle', value);
+  }
+  get borderBottomStyle() {
+    return super.borderBottomStyle;
+  }
+  set borderBottomWidth(value) {
+    this[_setAll]('borderBottomWidth', value);
+  }
+  get borderBottomWidth() {
+    return super.borderBottomWidth;
+  }
+  set borderCollapse(value) {
+    this[_setAll]('borderCollapse', value);
+  }
+  get borderCollapse() {
+    return super.borderCollapse;
+  }
+  set borderColor(value) {
+    this[_setAll]('borderColor', value);
+  }
+  get borderColor() {
+    return super.borderColor;
+  }
+  set borderLeft(value) {
+    this[_setAll]('borderLeft', value);
+  }
+  get borderLeft() {
+    return super.borderLeft;
+  }
+  set borderLeftColor(value) {
+    this[_setAll]('borderLeftColor', value);
+  }
+  get borderLeftColor() {
+    return super.borderLeftColor;
+  }
+  set borderLeftStyle(value) {
+    this[_setAll]('borderLeftStyle', value);
+  }
+  get borderLeftStyle() {
+    return super.borderLeftStyle;
+  }
+  set borderLeftWidth(value) {
+    this[_setAll]('borderLeftWidth', value);
+  }
+  get borderLeftWidth() {
+    return super.borderLeftWidth;
+  }
+  set borderRight(value) {
+    this[_setAll]('borderRight', value);
+  }
+  get borderRight() {
+    return super.borderRight;
+  }
+  set borderRightColor(value) {
+    this[_setAll]('borderRightColor', value);
+  }
+  get borderRightColor() {
+    return super.borderRightColor;
+  }
+  set borderRightStyle(value) {
+    this[_setAll]('borderRightStyle', value);
+  }
+  get borderRightStyle() {
+    return super.borderRightStyle;
+  }
+  set borderRightWidth(value) {
+    this[_setAll]('borderRightWidth', value);
+  }
+  get borderRightWidth() {
+    return super.borderRightWidth;
+  }
+  set borderSpacing(value) {
+    this[_setAll]('borderSpacing', value);
+  }
+  get borderSpacing() {
+    return super.borderSpacing;
+  }
+  set borderStyle(value) {
+    this[_setAll]('borderStyle', value);
+  }
+  get borderStyle() {
+    return super.borderStyle;
+  }
+  set borderTop(value) {
+    this[_setAll]('borderTop', value);
+  }
+  get borderTop() {
+    return super.borderTop;
+  }
+  set borderTopColor(value) {
+    this[_setAll]('borderTopColor', value);
+  }
+  get borderTopColor() {
+    return super.borderTopColor;
+  }
+  set borderTopStyle(value) {
+    this[_setAll]('borderTopStyle', value);
+  }
+  get borderTopStyle() {
+    return super.borderTopStyle;
+  }
+  set borderTopWidth(value) {
+    this[_setAll]('borderTopWidth', value);
+  }
+  get borderTopWidth() {
+    return super.borderTopWidth;
+  }
+  set borderWidth(value) {
+    this[_setAll]('borderWidth', value);
+  }
+  get borderWidth() {
+    return super.borderWidth;
+  }
+  set bottom(value) {
+    this[_setAll]('bottom', value);
+  }
+  get bottom() {
+    return super.bottom;
+  }
+  set captionSide(value) {
+    this[_setAll]('captionSide', value);
+  }
+  get captionSide() {
+    return super.captionSide;
+  }
+  set clear(value) {
+    this[_setAll]('clear', value);
+  }
+  get clear() {
+    return super.clear;
+  }
+  set clip(value) {
+    this[_setAll]('clip', value);
+  }
+  get clip() {
+    return super.clip;
+  }
+  set color(value) {
+    this[_setAll]('color', value);
+  }
+  get color() {
+    return super.color;
+  }
+  set content(value) {
+    this[_setAll]('content', value);
+  }
+  get content() {
+    return super.content;
+  }
+  set cursor(value) {
+    this[_setAll]('cursor', value);
+  }
+  get cursor() {
+    return super.cursor;
+  }
+  set direction(value) {
+    this[_setAll]('direction', value);
+  }
+  get direction() {
+    return super.direction;
+  }
+  set display(value) {
+    this[_setAll]('display', value);
+  }
+  get display() {
+    return super.display;
+  }
+  set emptyCells(value) {
+    this[_setAll]('emptyCells', value);
+  }
+  get emptyCells() {
+    return super.emptyCells;
+  }
+  set font(value) {
+    this[_setAll]('font', value);
+  }
+  get font() {
+    return super.font;
+  }
+  set fontFamily(value) {
+    this[_setAll]('fontFamily', value);
+  }
+  get fontFamily() {
+    return super.fontFamily;
+  }
+  set fontSize(value) {
+    this[_setAll]('fontSize', value);
+  }
+  get fontSize() {
+    return super.fontSize;
+  }
+  set fontStyle(value) {
+    this[_setAll]('fontStyle', value);
+  }
+  get fontStyle() {
+    return super.fontStyle;
+  }
+  set fontVariant(value) {
+    this[_setAll]('fontVariant', value);
+  }
+  get fontVariant() {
+    return super.fontVariant;
+  }
+  set fontWeight(value) {
+    this[_setAll]('fontWeight', value);
+  }
+  get fontWeight() {
+    return super.fontWeight;
+  }
+  set height(value) {
+    this[_setAll]('height', value);
+  }
+  get height() {
+    return super.height;
+  }
+  set left(value) {
+    this[_setAll]('left', value);
+  }
+  get left() {
+    return super.left;
+  }
+  set letterSpacing(value) {
+    this[_setAll]('letterSpacing', value);
+  }
+  get letterSpacing() {
+    return super.letterSpacing;
+  }
+  set lineHeight(value) {
+    this[_setAll]('lineHeight', value);
+  }
+  get lineHeight() {
+    return super.lineHeight;
+  }
+  set listStyle(value) {
+    this[_setAll]('listStyle', value);
+  }
+  get listStyle() {
+    return super.listStyle;
+  }
+  set listStyleImage(value) {
+    this[_setAll]('listStyleImage', value);
+  }
+  get listStyleImage() {
+    return super.listStyleImage;
+  }
+  set listStylePosition(value) {
+    this[_setAll]('listStylePosition', value);
+  }
+  get listStylePosition() {
+    return super.listStylePosition;
+  }
+  set listStyleType(value) {
+    this[_setAll]('listStyleType', value);
+  }
+  get listStyleType() {
+    return super.listStyleType;
+  }
+  set margin(value) {
+    this[_setAll]('margin', value);
+  }
+  get margin() {
+    return super.margin;
+  }
+  set marginBottom(value) {
+    this[_setAll]('marginBottom', value);
+  }
+  get marginBottom() {
+    return super.marginBottom;
+  }
+  set marginLeft(value) {
+    this[_setAll]('marginLeft', value);
+  }
+  get marginLeft() {
+    return super.marginLeft;
+  }
+  set marginRight(value) {
+    this[_setAll]('marginRight', value);
+  }
+  get marginRight() {
+    return super.marginRight;
+  }
+  set marginTop(value) {
+    this[_setAll]('marginTop', value);
+  }
+  get marginTop() {
+    return super.marginTop;
+  }
+  set maxHeight(value) {
+    this[_setAll]('maxHeight', value);
+  }
+  get maxHeight() {
+    return super.maxHeight;
+  }
+  set maxWidth(value) {
+    this[_setAll]('maxWidth', value);
+  }
+  get maxWidth() {
+    return super.maxWidth;
+  }
+  set minHeight(value) {
+    this[_setAll]('minHeight', value);
+  }
+  get minHeight() {
+    return super.minHeight;
+  }
+  set minWidth(value) {
+    this[_setAll]('minWidth', value);
+  }
+  get minWidth() {
+    return super.minWidth;
+  }
+  set outline(value) {
+    this[_setAll]('outline', value);
+  }
+  get outline() {
+    return super.outline;
+  }
+  set outlineColor(value) {
+    this[_setAll]('outlineColor', value);
+  }
+  get outlineColor() {
+    return super.outlineColor;
+  }
+  set outlineStyle(value) {
+    this[_setAll]('outlineStyle', value);
+  }
+  get outlineStyle() {
+    return super.outlineStyle;
+  }
+  set outlineWidth(value) {
+    this[_setAll]('outlineWidth', value);
+  }
+  get outlineWidth() {
+    return super.outlineWidth;
+  }
+  set overflow(value) {
+    this[_setAll]('overflow', value);
+  }
+  get overflow() {
+    return super.overflow;
+  }
+  set padding(value) {
+    this[_setAll]('padding', value);
+  }
+  get padding() {
+    return super.padding;
+  }
+  set paddingBottom(value) {
+    this[_setAll]('paddingBottom', value);
+  }
+  get paddingBottom() {
+    return super.paddingBottom;
+  }
+  set paddingLeft(value) {
+    this[_setAll]('paddingLeft', value);
+  }
+  get paddingLeft() {
+    return super.paddingLeft;
+  }
+  set paddingRight(value) {
+    this[_setAll]('paddingRight', value);
+  }
+  get paddingRight() {
+    return super.paddingRight;
+  }
+  set paddingTop(value) {
+    this[_setAll]('paddingTop', value);
+  }
+  get paddingTop() {
+    return super.paddingTop;
+  }
+  set pageBreakAfter(value) {
+    this[_setAll]('pageBreakAfter', value);
+  }
+  get pageBreakAfter() {
+    return super.pageBreakAfter;
+  }
+  set pageBreakBefore(value) {
+    this[_setAll]('pageBreakBefore', value);
+  }
+  get pageBreakBefore() {
+    return super.pageBreakBefore;
+  }
+  set pageBreakInside(value) {
+    this[_setAll]('pageBreakInside', value);
+  }
+  get pageBreakInside() {
+    return super.pageBreakInside;
+  }
+  set position(value) {
+    this[_setAll]('position', value);
+  }
+  get position() {
+    return super.position;
+  }
+  set quotes(value) {
+    this[_setAll]('quotes', value);
+  }
+  get quotes() {
+    return super.quotes;
+  }
+  set right(value) {
+    this[_setAll]('right', value);
+  }
+  get right() {
+    return super.right;
+  }
+  set tableLayout(value) {
+    this[_setAll]('tableLayout', value);
+  }
+  get tableLayout() {
+    return super.tableLayout;
+  }
+  set textAlign(value) {
+    this[_setAll]('textAlign', value);
+  }
+  get textAlign() {
+    return super.textAlign;
+  }
+  set textDecoration(value) {
+    this[_setAll]('textDecoration', value);
+  }
+  get textDecoration() {
+    return super.textDecoration;
+  }
+  set textIndent(value) {
+    this[_setAll]('textIndent', value);
+  }
+  get textIndent() {
+    return super.textIndent;
+  }
+  set textTransform(value) {
+    this[_setAll]('textTransform', value);
+  }
+  get textTransform() {
+    return super.textTransform;
+  }
+  set top(value) {
+    this[_setAll]('top', value);
+  }
+  get top() {
+    return super.top;
+  }
+  set unicodeBidi(value) {
+    this[_setAll]('unicodeBidi', value);
+  }
+  get unicodeBidi() {
+    return super.unicodeBidi;
+  }
+  set verticalAlign(value) {
+    this[_setAll]('verticalAlign', value);
+  }
+  get verticalAlign() {
+    return super.verticalAlign;
+  }
+  set visibility(value) {
+    this[_setAll]('visibility', value);
+  }
+  get visibility() {
+    return super.visibility;
+  }
+  set whiteSpace(value) {
+    this[_setAll]('whiteSpace', value);
+  }
+  get whiteSpace() {
+    return super.whiteSpace;
+  }
+  set width(value) {
+    this[_setAll]('width', value);
+  }
+  get width() {
+    return super.width;
+  }
+  set wordSpacing(value) {
+    this[_setAll]('wordSpacing', value);
+  }
+  get wordSpacing() {
+    return super.wordSpacing;
+  }
+  set zIndex(value) {
+    this[_setAll]('zIndex', value);
+  }
+  get zIndex() {
+    return super.zIndex;
+  }
+};
+dart.setSignature(html$._CssStyleDeclarationSet, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
+  fields: () => ({
+    [_elementIterable]: IterableOfElement(),
+    [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
+  }),
+  methods: () => ({
+    getPropertyValue: dart.definiteFunctionType(core.String, [core.String]),
+    setProperty: dart.definiteFunctionType(dart.void, [core.String, core.String], [core.String]),
+    [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
+  })
+});
+dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
+  'getPropertyValue',
+  'setProperty',
+  'background',
+  'backgroundAttachment',
+  'backgroundColor',
+  'backgroundImage',
+  'backgroundPosition',
+  'backgroundRepeat',
+  'border',
+  'borderBottom',
+  'borderBottomColor',
+  'borderBottomStyle',
+  'borderBottomWidth',
+  'borderCollapse',
+  'borderColor',
+  'borderLeft',
+  'borderLeftColor',
+  'borderLeftStyle',
+  'borderLeftWidth',
+  'borderRight',
+  'borderRightColor',
+  'borderRightStyle',
+  'borderRightWidth',
+  'borderSpacing',
+  'borderStyle',
+  'borderTop',
+  'borderTopColor',
+  'borderTopStyle',
+  'borderTopWidth',
+  'borderWidth',
+  'bottom',
+  'captionSide',
+  'clear',
+  'clip',
+  'color',
+  'content',
+  'cursor',
+  'direction',
+  'display',
+  'emptyCells',
+  'font',
+  'fontFamily',
+  'fontSize',
+  'fontStyle',
+  'fontVariant',
+  'fontWeight',
+  'height',
+  'left',
+  'letterSpacing',
+  'lineHeight',
+  'listStyle',
+  'listStyleImage',
+  'listStylePosition',
+  'listStyleType',
+  'margin',
+  'marginBottom',
+  'marginLeft',
+  'marginRight',
+  'marginTop',
+  'maxHeight',
+  'maxWidth',
+  'minHeight',
+  'minWidth',
+  'outline',
+  'outlineColor',
+  'outlineStyle',
+  'outlineWidth',
+  'overflow',
+  'padding',
+  'paddingBottom',
+  'paddingLeft',
+  'paddingRight',
+  'paddingTop',
+  'pageBreakAfter',
+  'pageBreakBefore',
+  'pageBreakInside',
+  'position',
+  'quotes',
+  'right',
+  'tableLayout',
+  'textAlign',
+  'textDecoration',
+  'textIndent',
+  'textTransform',
+  'top',
+  'unicodeBidi',
+  'verticalAlign',
+  'visibility',
+  'whiteSpace',
+  'width',
+  'wordSpacing',
+  'zIndex'
+]);
+dart.defineExtensionNames([
+  'selectorText',
+  'style'
+]);
+html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.selectorText]() {
+    return this.selectorText;
+  }
+  set [dartx.selectorText](value) {
+    this.selectorText = value;
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+};
+dart.setSignature(html$.CssStyleRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
+  fields: () => ({
+    [dartx.selectorText]: core.String,
+    [dartx.style]: html$.CssStyleDeclaration
+  })
+});
+dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
+dart.defineExtensionNames([
+  'disabled',
+  'href',
+  'media',
+  'ownerNode',
+  'parentStyleSheet',
+  'title',
+  'type'
+]);
+html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  get [dartx.ownerNode]() {
+    return this.ownerNode;
+  }
+  get [dartx.parentStyleSheet]() {
+    return this.parentStyleSheet;
+  }
+  get [dartx.title]() {
+    return this.title;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.StyleSheet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
+  fields: () => ({
+    [dartx.disabled]: core.bool,
+    [dartx.href]: core.String,
+    [dartx.media]: html$.MediaList,
+    [dartx.ownerNode]: html$.Node,
+    [dartx.parentStyleSheet]: html$.StyleSheet,
+    [dartx.title]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
+dart.defineExtensionNames([
+  'addRule',
+  'deleteRule',
+  'insertRule',
+  'removeRule',
+  'cssRules',
+  'ownerRule',
+  'rules'
+]);
+html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cssRules]() {
+    return this.cssRules;
+  }
+  get [dartx.ownerRule]() {
+    return this.ownerRule;
+  }
+  get [dartx.rules]() {
+    return this.rules;
+  }
+  [dartx.addRule](...args) {
+    return this.addRule.apply(this, args);
+  }
+  [dartx.deleteRule](...args) {
+    return this.deleteRule.apply(this, args);
+  }
+  [dartx.insertRule](...args) {
+    return this.insertRule.apply(this, args);
+  }
+  [dartx.removeRule](...args) {
+    return this.removeRule.apply(this, args);
+  }
+};
+dart.setSignature(html$.CssStyleSheet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
+  fields: () => ({
+    [dartx.cssRules]: ListOfCssRule(),
+    [dartx.ownerRule]: html$.CssRule,
+    [dartx.rules]: ListOfCssRule()
+  }),
+  methods: () => ({
+    [dartx.addRule]: dart.definiteFunctionType(core.int, [core.String, core.String], [core.int]),
+    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String], [core.int]),
+    [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
+  })
+});
+dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
+dart.defineExtensionNames([
+  'deleteRule',
+  'insertRule',
+  'conditionText',
+  'cssRules'
+]);
+html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.conditionText]() {
+    return this.conditionText;
+  }
+  get [dartx.cssRules]() {
+    return this.cssRules;
+  }
+  [dartx.deleteRule](...args) {
+    return this.deleteRule.apply(this, args);
+  }
+  [dartx.insertRule](...args) {
+    return this.insertRule.apply(this, args);
+  }
+};
+dart.setSignature(html$.CssSupportsRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
+  fields: () => ({
+    [dartx.conditionText]: core.String,
+    [dartx.cssRules]: ListOfCssRule()
+  }),
+  methods: () => ({
+    [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
+  })
+});
+dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
+dart.defineExtensionNames([
+  'style'
+]);
+html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+};
+dart.setSignature(html$.CssViewportRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
+  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
+});
+dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
+const _dartDetail = Symbol('_dartDetail');
+const _initCustomEvent = Symbol('_initCustomEvent');
+const _detail = Symbol('_detail');
+const _get__detail = Symbol('_get__detail');
+dart.defineExtensionNames([
+  'detail'
+]);
+html$.CustomEvent = class CustomEvent extends html$.Event {
+  get [_dartDetail]() {
+    return this._dartDetail;
+  }
+  set [_dartDetail](value) {
+    this._dartDetail = value;
+  }
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let detail = opts && 'detail' in opts ? opts.detail : null;
+    let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
+    e[_dartDetail] = detail;
+    if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
+      try {
+        detail = html_common.convertDartToNative_SerializedScriptValue(detail);
+        e[_initCustomEvent](type, canBubble, cancelable, detail);
+      } catch (_) {
+        e[_initCustomEvent](type, canBubble, cancelable, null);
+      }
+
+    } else {
+      e[_initCustomEvent](type, canBubble, cancelable, null);
+    }
+    return e;
+  }
+  get [dartx.detail]() {
+    if (this[_dartDetail] != null) {
+      return this[_dartDetail];
+    }
+    return this[_detail];
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.CustomEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.CustomEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.CustomEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.CustomEvent(type);
+  }
+  get [_detail]() {
+    return html_common.convertNativeToDart_SerializedScriptValue(this[_get__detail]);
+  }
+  get [_get__detail]() {
+    return this.detail;
+  }
+  [_initCustomEvent](...args) {
+    return this.initCustomEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.CustomEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
+    _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_dartDetail]: dart.dynamic,
+    [_get__detail]: dart.dynamic
+  }),
+  getters: () => ({
+    [dartx.detail]: dart.definiteFunctionType(dart.dynamic, []),
+    [_detail]: dart.definiteFunctionType(dart.dynamic, [])
+  }),
+  methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
+html$.DListElement = class DListElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.DListElement, 'created');
+dart.setSignature(html$.DListElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DListElement, []),
+    new: dart.definiteFunctionType(html$.DListElement, []),
+    created: dart.definiteFunctionType(html$.DListElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
+dart.defineExtensionNames([
+  'options'
+]);
+html$.DataListElement = class DataListElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
+  }
+  created() {
+    this[dartx.options] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('datalist');
+  }
+  get [dartx.options]() {
+    return this.options;
+  }
+};
+dart.defineNamedConstructor(html$.DataListElement, 'created');
+dart.setSignature(html$.DataListElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DataListElement, []),
+    new: dart.definiteFunctionType(html$.DataListElement, []),
+    created: dart.definiteFunctionType(html$.DataListElement, [])
+  }),
+  fields: () => ({[dartx.options]: ListOfNode()}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
+dart.defineExtensionNames([
+  'clearData',
+  'getData',
+  'setData',
+  'setDragImage',
+  'dropEffect',
+  'effectAllowed',
+  'files',
+  'items',
+  'types'
+]);
+html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.dropEffect]() {
+    return this.dropEffect;
+  }
+  set [dartx.dropEffect](value) {
+    this.dropEffect = value;
+  }
+  get [dartx.effectAllowed]() {
+    return this.effectAllowed;
+  }
+  set [dartx.effectAllowed](value) {
+    this.effectAllowed = value;
+  }
+  get [dartx.files]() {
+    return this.files;
+  }
+  get [dartx.items]() {
+    return this.items;
+  }
+  get [dartx.types]() {
+    return this.types;
+  }
+  [dartx.clearData](...args) {
+    return this.clearData.apply(this, args);
+  }
+  [dartx.getData](...args) {
+    return this.getData.apply(this, args);
+  }
+  [dartx.setData](...args) {
+    return this.setData.apply(this, args);
+  }
+  [dartx.setDragImage](...args) {
+    return this.setDragImage.apply(this, args);
+  }
+};
+dart.setSignature(html$.DataTransfer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
+  fields: () => ({
+    [dartx.dropEffect]: core.String,
+    [dartx.effectAllowed]: core.String,
+    [dartx.files]: ListOfFile(),
+    [dartx.items]: html$.DataTransferItemList,
+    [dartx.types]: ListOfString()
+  }),
+  methods: () => ({
+    [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
+    [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
+  })
+});
+dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
+const _getAsString = Symbol('_getAsString');
+dart.defineExtensionNames([
+  'getAsFile',
+  'getAsString',
+  'getAsEntry',
+  'kind',
+  'type'
+]);
+html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.getAsFile](...args) {
+    return this.getAsFile.apply(this, args);
+  }
+  [_getAsString](...args) {
+    return this.getAsString.apply(this, args);
+  }
+  [dartx.getAsString]() {
+    let completer = CompleterOfString().new();
+    this[_getAsString](dart.fn(value => {
+      completer.complete(value);
+    }, StringToNull()));
+    return completer.future;
+  }
+  [dartx.getAsEntry](...args) {
+    return this.webkitGetAsEntry.apply(this, args);
+  }
+};
+dart.setSignature(html$.DataTransferItem, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
+  fields: () => ({
+    [dartx.kind]: core.String,
+    [dartx.type]: core.String
+  }),
+  methods: () => ({
+    [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
+    [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
+    [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
+    [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
+  })
+});
+dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
+dart.defineExtensionNames([
+  'add',
+  'addData',
+  'addFile',
+  'clear',
+  'item',
+  'remove',
+  '_get',
+  'length'
+]);
+html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.add](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.addData](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.addFile](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.remove](...args) {
+    return this.remove.apply(this, args);
+  }
+  [dartx._get](index) {
+    return this[index];
+  }
+};
+dart.setSignature(html$.DataTransferItemList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
+  fields: () => ({[dartx.length]: core.int}),
+  methods: () => ({
+    [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
+    [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
+    [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
+    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
+    [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
+    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
+  })
+});
+dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
+html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
+dart.defineExtensionNames([
+  'postMessage',
+  'onMessage'
+]);
+html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.DedicatedWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
+dart.defineExtensionNames([
+  'session'
+]);
+html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.DefaultSessionStartEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.DefaultSessionStartEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.DefaultSessionStartEvent(type);
+  }
+  get [dartx.session]() {
+    return this.session;
+  }
+};
+dart.setSignature(html$.DefaultSessionStartEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
+    new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.session]: html$.PresentationSession}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
+dart.defineExtensionNames([
+  'queryUsageAndQuota',
+  'requestQuota'
+]);
+html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.queryUsageAndQuota](...args) {
+    return this.queryUsageAndQuota.apply(this, args);
+  }
+  [dartx.requestQuota](...args) {
+    return this.requestQuota.apply(this, args);
+  }
+};
+dart.setSignature(html$.DeprecatedStorageInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
+  methods: () => ({
+    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
+    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
+  }),
+  sfields: () => ({
+    PERSISTENT: core.int,
+    TEMPORARY: core.int
+  })
+});
+html$.DeprecatedStorageInfo.PERSISTENT = 1;
+html$.DeprecatedStorageInfo.TEMPORARY = 0;
+dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
+dart.defineExtensionNames([
+  'queryUsageAndQuota',
+  'requestQuota'
+]);
+html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.queryUsageAndQuota](...args) {
+    return this.queryUsageAndQuota.apply(this, args);
+  }
+  [dartx.requestQuota](...args) {
+    return this.requestQuota.apply(this, args);
+  }
+};
+dart.setSignature(html$.DeprecatedStorageQuota, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
+  methods: () => ({
+    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
+    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
+  })
+});
+dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
+dart.defineExtensionNames([
+  'open'
+]);
+html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
+  }
+  created() {
+    this[dartx.open] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('details');
+  }
+  get [dartx.open]() {
+    return this.open;
+  }
+  set [dartx.open](value) {
+    this.open = value;
+  }
+};
+dart.defineNamedConstructor(html$.DetailsElement, 'created');
+dart.setSignature(html$.DetailsElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DetailsElement, []),
+    new: dart.definiteFunctionType(html$.DetailsElement, []),
+    created: dart.definiteFunctionType(html$.DetailsElement, [])
+  }),
+  fields: () => ({[dartx.open]: core.bool}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
+dart.defineExtensionNames([
+  'x',
+  'y',
+  'z'
+]);
+html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.z]() {
+    return this.z;
+  }
+};
+dart.setSignature(html$.DeviceAcceleration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
+  fields: () => ({
+    [dartx.x]: core.double,
+    [dartx.y]: core.double,
+    [dartx.z]: core.double
+  })
+});
+dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
+dart.defineExtensionNames([
+  'value'
+]);
+html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.DeviceLightEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.DeviceLightEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.DeviceLightEvent(type);
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+};
+dart.setSignature(html$.DeviceLightEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
+    new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.value]: core.double}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
+dart.defineExtensionNames([
+  'initDeviceMotionEvent',
+  'acceleration',
+  'accelerationIncludingGravity',
+  'interval',
+  'rotationRate'
+]);
+html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.acceleration]() {
+    return this.acceleration;
+  }
+  get [dartx.accelerationIncludingGravity]() {
+    return this.accelerationIncludingGravity;
+  }
+  get [dartx.interval]() {
+    return this.interval;
+  }
+  get [dartx.rotationRate]() {
+    return this.rotationRate;
+  }
+  [dartx.initDeviceMotionEvent](...args) {
+    return this.initDeviceMotionEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.DeviceMotionEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
+  fields: () => ({
+    [dartx.acceleration]: html$.DeviceAcceleration,
+    [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
+    [dartx.interval]: core.double,
+    [dartx.rotationRate]: html$.DeviceRotationRate
+  }),
+  methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
+});
+dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
+const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
+dart.defineExtensionNames([
+  'absolute',
+  'alpha',
+  'beta',
+  'gamma'
+]);
+html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let alpha = opts && 'alpha' in opts ? opts.alpha : 0;
+    let beta = opts && 'beta' in opts ? opts.beta : 0;
+    let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
+    let absolute = opts && 'absolute' in opts ? opts.absolute : false;
+    let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
+    e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
+    return e;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.absolute]() {
+    return this.absolute;
+  }
+  get [dartx.alpha]() {
+    return this.alpha;
+  }
+  get [dartx.beta]() {
+    return this.beta;
+  }
+  get [dartx.gamma]() {
+    return this.gamma;
+  }
+  [_initDeviceOrientationEvent](...args) {
+    return this.initDeviceOrientationEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.DeviceOrientationEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
+    _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
+  }),
+  fields: () => ({
+    [dartx.absolute]: core.bool,
+    [dartx.alpha]: core.double,
+    [dartx.beta]: core.double,
+    [dartx.gamma]: core.double
+  }),
+  methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
+});
+dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
+dart.defineExtensionNames([
+  'alpha',
+  'beta',
+  'gamma'
+]);
+html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.alpha]() {
+    return this.alpha;
+  }
+  get [dartx.beta]() {
+    return this.beta;
+  }
+  get [dartx.gamma]() {
+    return this.gamma;
+  }
+};
+dart.setSignature(html$.DeviceRotationRate, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
+  fields: () => ({
+    [dartx.alpha]: core.double,
+    [dartx.beta]: core.double,
+    [dartx.gamma]: core.double
+  })
+});
+dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
+dart.defineExtensionNames([
+  'close',
+  'show',
+  'showModal',
+  'open',
+  'returnValue'
+]);
+html$.DialogElement = class DialogElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.open] = null;
+    this[dartx.returnValue] = null;
+    super.created();
+  }
+  get [dartx.open]() {
+    return this.open;
+  }
+  set [dartx.open](value) {
+    this.open = value;
+  }
+  get [dartx.returnValue]() {
+    return this.returnValue;
+  }
+  set [dartx.returnValue](value) {
+    this.returnValue = value;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.show](...args) {
+    return this.show.apply(this, args);
+  }
+  [dartx.showModal](...args) {
+    return this.showModal.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.DialogElement, 'created');
+dart.setSignature(html$.DialogElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DialogElement, []),
+    created: dart.definiteFunctionType(html$.DialogElement, [])
+  }),
+  fields: () => ({
+    [dartx.open]: core.bool,
+    [dartx.returnValue]: core.String
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.show]: dart.definiteFunctionType(dart.void, []),
+    [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
+const _getDirectory = Symbol('_getDirectory');
+const _getFile = Symbol('_getFile');
+const __getDirectory_1 = Symbol('__getDirectory_1');
+const __getDirectory_2 = Symbol('__getDirectory_2');
+const __getDirectory_3 = Symbol('__getDirectory_3');
+const __getDirectory_4 = Symbol('__getDirectory_4');
+const __getDirectory = Symbol('__getDirectory');
+const __getFile_1 = Symbol('__getFile_1');
+const __getFile_2 = Symbol('__getFile_2');
+const __getFile_3 = Symbol('__getFile_3');
+const __getFile_4 = Symbol('__getFile_4');
+const __getFile = Symbol('__getFile');
+const _removeRecursively = Symbol('_removeRecursively');
+const _copyTo = Symbol('_copyTo');
+const _getMetadata = Symbol('_getMetadata');
+const _getParent = Symbol('_getParent');
+const _moveTo = Symbol('_moveTo');
+const _remove$ = Symbol('_remove');
+dart.defineExtensionNames([
+  'copyTo',
+  'getMetadata',
+  'getParent',
+  'moveTo',
+  'remove',
+  'toUrl',
+  'filesystem',
+  'fullPath',
+  'isDirectory',
+  'isFile',
+  'name'
+]);
+html$.Entry = class Entry extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.filesystem]() {
+    return this.filesystem;
+  }
+  get [dartx.fullPath]() {
+    return this.fullPath;
+  }
+  get [dartx.isDirectory]() {
+    return this.isDirectory;
+  }
+  get [dartx.isFile]() {
+    return this.isFile;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  [_copyTo](...args) {
+    return this.copyTo.apply(this, args);
+  }
+  [dartx.copyTo](parent, opts) {
+    let name = opts && 'name' in opts ? opts.name : null;
+    let completer = CompleterOfEntry().new();
+    this[_copyTo](parent, {name: name, successCallback: dart.fn(value => {
+        completer.complete(value);
+      }, EntryToNull()), errorCallback: dart.fn(error => {
+        completer.completeError(error);
+      }, FileErrorToNull())});
+    return completer.future;
+  }
+  [_getMetadata](...args) {
+    return this.getMetadata.apply(this, args);
+  }
+  [dartx.getMetadata]() {
+    let completer = CompleterOfMetadata().new();
+    this[_getMetadata](dart.fn(value => {
+      completer.complete(value);
+    }, MetadataToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [_getParent](...args) {
+    return this.getParent.apply(this, args);
+  }
+  [dartx.getParent]() {
+    let completer = CompleterOfEntry().new();
+    this[_getParent](dart.fn(value => {
+      completer.complete(value);
+    }, EntryToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [_moveTo](...args) {
+    return this.moveTo.apply(this, args);
+  }
+  [dartx.moveTo](parent, opts) {
+    let name = opts && 'name' in opts ? opts.name : null;
+    let completer = CompleterOfEntry().new();
+    this[_moveTo](parent, {name: name, successCallback: dart.fn(value => {
+        completer.complete(value);
+      }, EntryToNull()), errorCallback: dart.fn(error => {
+        completer.completeError(error);
+      }, FileErrorToNull())});
+    return completer.future;
+  }
+  [_remove$](...args) {
+    return this.remove.apply(this, args);
+  }
+  [dartx.remove]() {
+    let completer = async.Completer.new();
+    this[_remove$](dart.fn(() => {
+      completer.complete();
+    }, VoidToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [dartx.toUrl](...args) {
+    return this.toURL.apply(this, args);
+  }
+};
+dart.setSignature(html$.Entry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
+  fields: () => ({
+    [dartx.filesystem]: html$.FileSystem,
+    [dartx.fullPath]: core.String,
+    [dartx.isDirectory]: core.bool,
+    [dartx.isFile]: core.bool,
+    [dartx.name]: core.String
+  }),
+  methods: () => ({
+    [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
+    [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
+    [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
+    [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
+    [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
+    [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
+    [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
+    [dartx.remove]: dart.definiteFunctionType(async.Future, []),
+    [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
+  })
+});
+dart.registerExtension(dart.global.Entry, html$.Entry);
+dart.defineExtensionNames([
+  'createDirectory',
+  'getDirectory',
+  'createFile',
+  'getFile',
+  'createReader',
+  'removeRecursively'
+]);
+html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
+  [dartx.createDirectory](path, opts) {
+    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
+    return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
+  }
+  [dartx.getDirectory](path) {
+    return this[_getDirectory](path);
+  }
+  [dartx.createFile](path, opts) {
+    let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
+    return this[_getFile](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
+  }
+  [dartx.getFile](path) {
+    return this[_getFile](path);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.createReader](...args) {
+    return this.createReader.apply(this, args);
+  }
+  [__getDirectory](path, opts) {
+    let options = opts && 'options' in opts ? opts.options : null;
+    let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
+    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
+    if (errorCallback != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getDirectory_1](path, options_1, successCallback, errorCallback);
+      return;
+    }
+    if (successCallback != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getDirectory_2](path, options_1, successCallback);
+      return;
+    }
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getDirectory_3](path, options_1);
+      return;
+    }
+    this[__getDirectory_4](path);
+    return;
+  }
+  [__getDirectory_1](...args) {
+    return this.getDirectory.apply(this, args);
+  }
+  [__getDirectory_2](...args) {
+    return this.getDirectory.apply(this, args);
+  }
+  [__getDirectory_3](...args) {
+    return this.getDirectory.apply(this, args);
+  }
+  [__getDirectory_4](...args) {
+    return this.getDirectory.apply(this, args);
+  }
+  [_getDirectory](path, opts) {
+    let options = opts && 'options' in opts ? opts.options : null;
+    let completer = CompleterOfEntry().new();
+    this[__getDirectory](path, {options: options, successCallback: dart.fn(value => {
+        completer.complete(value);
+      }, EntryToNull()), errorCallback: dart.fn(error => {
+        completer.completeError(error);
+      }, FileErrorToNull())});
+    return completer.future;
+  }
+  [__getFile](path, opts) {
+    let options = opts && 'options' in opts ? opts.options : null;
+    let successCallback = opts && 'successCallback' in opts ? opts.successCallback : null;
+    let errorCallback = opts && 'errorCallback' in opts ? opts.errorCallback : null;
+    if (errorCallback != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getFile_1](path, options_1, successCallback, errorCallback);
+      return;
+    }
+    if (successCallback != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getFile_2](path, options_1, successCallback);
+      return;
+    }
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[__getFile_3](path, options_1);
+      return;
+    }
+    this[__getFile_4](path);
+    return;
+  }
+  [__getFile_1](...args) {
+    return this.getFile.apply(this, args);
+  }
+  [__getFile_2](...args) {
+    return this.getFile.apply(this, args);
+  }
+  [__getFile_3](...args) {
+    return this.getFile.apply(this, args);
+  }
+  [__getFile_4](...args) {
+    return this.getFile.apply(this, args);
+  }
+  [_getFile](path, opts) {
+    let options = opts && 'options' in opts ? opts.options : null;
+    let completer = CompleterOfEntry().new();
+    this[__getFile](path, {options: options, successCallback: dart.fn(value => {
+        completer.complete(value);
+      }, EntryToNull()), errorCallback: dart.fn(error => {
+        completer.completeError(error);
+      }, FileErrorToNull())});
+    return completer.future;
+  }
+  [_removeRecursively](...args) {
+    return this.removeRecursively.apply(this, args);
+  }
+  [dartx.removeRecursively]() {
+    let completer = async.Completer.new();
+    this[_removeRecursively](dart.fn(() => {
+      completer.complete();
+    }, VoidToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+};
+dart.setSignature(html$.DirectoryEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
+  methods: () => ({
+    [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
+    [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
+    [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
+    [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
+    [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
+    [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
+    [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
+    [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
+    [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
+    [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
+    [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
+const _readEntries = Symbol('_readEntries');
+dart.defineExtensionNames([
+  'readEntries'
+]);
+html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_readEntries](...args) {
+    return this.readEntries.apply(this, args);
+  }
+  [dartx.readEntries]() {
+    let completer = CompleterOfListOfEntry().new();
+    this[_readEntries](dart.fn(value => {
+      completer.complete(value);
+    }, ListOfEntryToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+};
+dart.setSignature(html$.DirectoryReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
+  methods: () => ({
+    [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
+    [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
+  })
+});
+dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
+html$.DivElement = class DivElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.DivElement._check(html$.document[dartx.createElement]("div"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.DivElement, 'created');
+dart.setSignature(html$.DivElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DivElement, []),
+    new: dart.definiteFunctionType(html$.DivElement, []),
+    created: dart.definiteFunctionType(html$.DivElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
+const _body = Symbol('_body');
+const _get_window = Symbol('_get_window');
+const _head$0 = Symbol('_head');
+const _lastModified = Symbol('_lastModified');
+const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
+const _referrer = Symbol('_referrer');
+const _selectedStylesheetSet = Symbol('_selectedStylesheetSet');
+const _styleSheets = Symbol('_styleSheets');
+const _title = Symbol('_title');
+const _visibilityState = Symbol('_visibilityState');
+const _webkitFullscreenElement = Symbol('_webkitFullscreenElement');
+const _webkitFullscreenEnabled = Symbol('_webkitFullscreenEnabled');
+const _webkitHidden = Symbol('_webkitHidden');
+const _webkitVisibilityState = Symbol('_webkitVisibilityState');
+const _caretRangeFromPoint = Symbol('_caretRangeFromPoint');
+const _createElement = Symbol('_createElement');
+const _createElementNS = Symbol('_createElementNS');
+const _createTouch_1 = Symbol('_createTouch_1');
+const _createTouch = Symbol('_createTouch');
+const _createTouchList = Symbol('_createTouchList');
+const _elementFromPoint = Symbol('_elementFromPoint');
+const _getCssCanvasContext = Symbol('_getCssCanvasContext');
+const _webkitExitFullscreen = Symbol('_webkitExitFullscreen');
+const _createElement_2 = Symbol('_createElement_2');
+const _createElementNS_2 = Symbol('_createElementNS_2');
+const _createNodeIterator = Symbol('_createNodeIterator');
+const _createTreeWalker = Symbol('_createTreeWalker');
+dart.defineExtensionNames([
+  'window',
+  'adoptNode',
+  'createDocumentFragment',
+  'createRange',
+  'elementsFromPoint',
+  'execCommand',
+  'exitFullscreen',
+  'exitPointerLock',
+  'getElementsByClassName',
+  'getElementsByName',
+  'getElementsByTagName',
+  'importNode',
+  'queryCommandEnabled',
+  'queryCommandIndeterm',
+  'queryCommandState',
+  'queryCommandSupported',
+  'queryCommandValue',
+  'transformDocumentToTreeView',
+  'getElementById',
+  'querySelector',
+  'onAbort',
+  'onBeforeCopy',
+  'onBeforeCut',
+  'onBeforePaste',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onCopy',
+  'onCut',
+  'onDoubleClick',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onPaste',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onPointerLockChange',
+  'onPointerLockError',
+  'onRateChange',
+  'onReadyStateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSearch',
+  'onSecurityPolicyViolation',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onSelectionChange',
+  'onSelectStart',
+  'onStalled',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onTouchCancel',
+  'onTouchEnd',
+  'onTouchMove',
+  'onTouchStart',
+  'onVolumeChange',
+  'onWaiting',
+  'onFullscreenChange',
+  'onFullscreenError',
+  'querySelectorAll',
+  'query',
+  'queryAll',
+  'supportsRegisterElement',
+  'supportsRegister',
+  'createElement',
+  'createElementNS',
+  'visibilityState',
+  'activeElement',
+  'contentType',
+  'cookie',
+  'currentScript',
+  'documentElement',
+  'domain',
+  'fonts',
+  'fullscreenElement',
+  'fullscreenEnabled',
+  'hidden',
+  'implementation',
+  'origin',
+  'pointerLockElement',
+  'readyState',
+  'rootElement',
+  'scrollingElement',
+  'timeline'
+]);
+html$.Document = class Document extends html$.Node {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.activeElement]() {
+    return this.activeElement;
+  }
+  get [_body]() {
+    return this.body;
+  }
+  set [_body](value) {
+    this.body = value;
+  }
+  get [dartx.contentType]() {
+    return this.contentType;
+  }
+  get [dartx.cookie]() {
+    return this.cookie;
+  }
+  set [dartx.cookie](value) {
+    this.cookie = value;
+  }
+  get [dartx.currentScript]() {
+    return this.currentScript;
+  }
+  get [dartx.window]() {
+    return html$._convertNativeToDart_Window(this[_get_window]);
+  }
+  get [_get_window]() {
+    return this.defaultView;
+  }
+  get [dartx.documentElement]() {
+    return this.documentElement;
+  }
+  get [dartx.domain]() {
+    return this.domain;
+  }
+  get [dartx.fonts]() {
+    return this.fonts;
+  }
+  get [dartx.fullscreenElement]() {
+    return this.fullscreenElement;
+  }
+  get [dartx.fullscreenEnabled]() {
+    return this.fullscreenEnabled;
+  }
+  get [_head$0]() {
+    return this.head;
+  }
+  get [dartx.hidden]() {
+    return this.hidden;
+  }
+  get [dartx.implementation]() {
+    return this.implementation;
+  }
+  get [_lastModified]() {
+    return this.lastModified;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.pointerLockElement]() {
+    return this.pointerLockElement;
+  }
+  get [_preferredStylesheetSet]() {
+    return this.preferredStylesheetSet;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [_referrer]() {
+    return this.referrer;
+  }
+  get [dartx.rootElement]() {
+    return this.rootElement;
+  }
+  get [dartx.scrollingElement]() {
+    return this.scrollingElement;
+  }
+  get [_selectedStylesheetSet]() {
+    return this.selectedStylesheetSet;
+  }
+  set [_selectedStylesheetSet](value) {
+    this.selectedStylesheetSet = value;
+  }
+  get [_styleSheets]() {
+    return this.styleSheets;
+  }
+  get [dartx.timeline]() {
+    return this.timeline;
+  }
+  get [_title]() {
+    return this.title;
+  }
+  set [_title](value) {
+    this.title = value;
+  }
+  get [_visibilityState]() {
+    return this.visibilityState;
+  }
+  get [_webkitFullscreenElement]() {
+    return this.webkitFullscreenElement;
+  }
+  get [_webkitFullscreenEnabled]() {
+    return this.webkitFullscreenEnabled;
+  }
+  get [_webkitHidden]() {
+    return this.webkitHidden;
+  }
+  get [_webkitVisibilityState]() {
+    return this.webkitVisibilityState;
+  }
+  [dartx.adoptNode](...args) {
+    return this.adoptNode.apply(this, args);
+  }
+  [_caretRangeFromPoint](...args) {
+    return this.caretRangeFromPoint.apply(this, args);
+  }
+  [dartx.createDocumentFragment](...args) {
+    return this.createDocumentFragment.apply(this, args);
+  }
+  [_createElement](...args) {
+    return this.createElement.apply(this, args);
+  }
+  [_createElementNS](...args) {
+    return this.createElementNS.apply(this, args);
+  }
+  [_createEvent](...args) {
+    return this.createEvent.apply(this, args);
+  }
+  [dartx.createRange](...args) {
+    return this.createRange.apply(this, args);
+  }
+  [_createTextNode](...args) {
+    return this.createTextNode.apply(this, args);
+  }
+  [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
+    let target_1 = html$._convertDartToNative_EventTarget(target);
+    return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
+  }
+  [_createTouch_1](...args) {
+    return this.createTouch.apply(this, args);
+  }
+  [_createTouchList](...args) {
+    return this.createTouchList.apply(this, args);
+  }
+  [_elementFromPoint](...args) {
+    return this.elementFromPoint.apply(this, args);
+  }
+  [dartx.elementsFromPoint](...args) {
+    return this.elementsFromPoint.apply(this, args);
+  }
+  [dartx.execCommand](...args) {
+    return this.execCommand.apply(this, args);
+  }
+  [dartx.exitFullscreen](...args) {
+    return this.exitFullscreen.apply(this, args);
+  }
+  [dartx.exitPointerLock](...args) {
+    return this.exitPointerLock.apply(this, args);
+  }
+  [_getCssCanvasContext](...args) {
+    return this.getCSSCanvasContext.apply(this, args);
+  }
+  [dartx.getElementsByClassName](...args) {
+    return this.getElementsByClassName.apply(this, args);
+  }
+  [dartx.getElementsByName](...args) {
+    return this.getElementsByName.apply(this, args);
+  }
+  [dartx.getElementsByTagName](...args) {
+    return this.getElementsByTagName.apply(this, args);
+  }
+  [dartx.importNode](...args) {
+    return this.importNode.apply(this, args);
+  }
+  [dartx.queryCommandEnabled](...args) {
+    return this.queryCommandEnabled.apply(this, args);
+  }
+  [dartx.queryCommandIndeterm](...args) {
+    return this.queryCommandIndeterm.apply(this, args);
+  }
+  [dartx.queryCommandState](...args) {
+    return this.queryCommandState.apply(this, args);
+  }
+  [dartx.queryCommandSupported](...args) {
+    return this.queryCommandSupported.apply(this, args);
+  }
+  [dartx.queryCommandValue](...args) {
+    return this.queryCommandValue.apply(this, args);
+  }
+  [dartx.transformDocumentToTreeView](...args) {
+    return this.transformDocumentToTreeView.apply(this, args);
+  }
+  [_webkitExitFullscreen](...args) {
+    return this.webkitExitFullscreen.apply(this, args);
+  }
+  [dartx.getElementById](...args) {
+    return this.getElementById.apply(this, args);
+  }
+  get [_childElementCount]() {
+    return this.childElementCount;
+  }
+  get [_children]() {
+    return this.children;
+  }
+  get [_firstElementChild]() {
+    return this.firstElementChild;
+  }
+  get [_lastElementChild]() {
+    return this.lastElementChild;
+  }
+  [dartx.querySelector](...args) {
+    return this.querySelector.apply(this, args);
+  }
+  [_querySelectorAll](...args) {
+    return this.querySelectorAll.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return html$.Element.abortEvent.forTarget(this);
+  }
+  get [dartx.onBeforeCopy]() {
+    return html$.Element.beforeCopyEvent.forTarget(this);
+  }
+  get [dartx.onBeforeCut]() {
+    return html$.Element.beforeCutEvent.forTarget(this);
+  }
+  get [dartx.onBeforePaste]() {
+    return html$.Element.beforePasteEvent.forTarget(this);
+  }
+  get [dartx.onBlur]() {
+    return html$.Element.blurEvent.forTarget(this);
+  }
+  get [dartx.onCanPlay]() {
+    return html$.Element.canPlayEvent.forTarget(this);
+  }
+  get [dartx.onCanPlayThrough]() {
+    return html$.Element.canPlayThroughEvent.forTarget(this);
+  }
+  get [dartx.onChange]() {
+    return html$.Element.changeEvent.forTarget(this);
+  }
+  get [dartx.onClick]() {
+    return html$.Element.clickEvent.forTarget(this);
+  }
+  get [dartx.onContextMenu]() {
+    return html$.Element.contextMenuEvent.forTarget(this);
+  }
+  get [dartx.onCopy]() {
+    return html$.Element.copyEvent.forTarget(this);
+  }
+  get [dartx.onCut]() {
+    return html$.Element.cutEvent.forTarget(this);
+  }
+  get [dartx.onDoubleClick]() {
+    return html$.Element.doubleClickEvent.forTarget(this);
+  }
+  get [dartx.onDrag]() {
+    return html$.Element.dragEvent.forTarget(this);
+  }
+  get [dartx.onDragEnd]() {
+    return html$.Element.dragEndEvent.forTarget(this);
+  }
+  get [dartx.onDragEnter]() {
+    return html$.Element.dragEnterEvent.forTarget(this);
+  }
+  get [dartx.onDragLeave]() {
+    return html$.Element.dragLeaveEvent.forTarget(this);
+  }
+  get [dartx.onDragOver]() {
+    return html$.Element.dragOverEvent.forTarget(this);
+  }
+  get [dartx.onDragStart]() {
+    return html$.Element.dragStartEvent.forTarget(this);
+  }
+  get [dartx.onDrop]() {
+    return html$.Element.dropEvent.forTarget(this);
+  }
+  get [dartx.onDurationChange]() {
+    return html$.Element.durationChangeEvent.forTarget(this);
+  }
+  get [dartx.onEmptied]() {
+    return html$.Element.emptiedEvent.forTarget(this);
+  }
+  get [dartx.onEnded]() {
+    return html$.Element.endedEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.Element.errorEvent.forTarget(this);
+  }
+  get [dartx.onFocus]() {
+    return html$.Element.focusEvent.forTarget(this);
+  }
+  get [dartx.onInput]() {
+    return html$.Element.inputEvent.forTarget(this);
+  }
+  get [dartx.onInvalid]() {
+    return html$.Element.invalidEvent.forTarget(this);
+  }
+  get [dartx.onKeyDown]() {
+    return html$.Element.keyDownEvent.forTarget(this);
+  }
+  get [dartx.onKeyPress]() {
+    return html$.Element.keyPressEvent.forTarget(this);
+  }
+  get [dartx.onKeyUp]() {
+    return html$.Element.keyUpEvent.forTarget(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.Element.loadEvent.forTarget(this);
+  }
+  get [dartx.onLoadedData]() {
+    return html$.Element.loadedDataEvent.forTarget(this);
+  }
+  get [dartx.onLoadedMetadata]() {
+    return html$.Element.loadedMetadataEvent.forTarget(this);
+  }
+  get [dartx.onMouseDown]() {
+    return html$.Element.mouseDownEvent.forTarget(this);
+  }
+  get [dartx.onMouseEnter]() {
+    return html$.Element.mouseEnterEvent.forTarget(this);
+  }
+  get [dartx.onMouseLeave]() {
+    return html$.Element.mouseLeaveEvent.forTarget(this);
+  }
+  get [dartx.onMouseMove]() {
+    return html$.Element.mouseMoveEvent.forTarget(this);
+  }
+  get [dartx.onMouseOut]() {
+    return html$.Element.mouseOutEvent.forTarget(this);
+  }
+  get [dartx.onMouseOver]() {
+    return html$.Element.mouseOverEvent.forTarget(this);
+  }
+  get [dartx.onMouseUp]() {
+    return html$.Element.mouseUpEvent.forTarget(this);
+  }
+  get [dartx.onMouseWheel]() {
+    return html$.Element.mouseWheelEvent.forTarget(this);
+  }
+  get [dartx.onPaste]() {
+    return html$.Element.pasteEvent.forTarget(this);
+  }
+  get [dartx.onPause]() {
+    return html$.Element.pauseEvent.forTarget(this);
+  }
+  get [dartx.onPlay]() {
+    return html$.Element.playEvent.forTarget(this);
+  }
+  get [dartx.onPlaying]() {
+    return html$.Element.playingEvent.forTarget(this);
+  }
+  get [dartx.onPointerLockChange]() {
+    return html$.Document.pointerLockChangeEvent.forTarget(this);
+  }
+  get [dartx.onPointerLockError]() {
+    return html$.Document.pointerLockErrorEvent.forTarget(this);
+  }
+  get [dartx.onRateChange]() {
+    return html$.Element.rateChangeEvent.forTarget(this);
+  }
+  get [dartx.onReadyStateChange]() {
+    return html$.Document.readyStateChangeEvent.forTarget(this);
+  }
+  get [dartx.onReset]() {
+    return html$.Element.resetEvent.forTarget(this);
+  }
+  get [dartx.onResize]() {
+    return html$.Element.resizeEvent.forTarget(this);
+  }
+  get [dartx.onScroll]() {
+    return html$.Element.scrollEvent.forTarget(this);
+  }
+  get [dartx.onSearch]() {
+    return html$.Element.searchEvent.forTarget(this);
+  }
+  get [dartx.onSecurityPolicyViolation]() {
+    return html$.Document.securityPolicyViolationEvent.forTarget(this);
+  }
+  get [dartx.onSeeked]() {
+    return html$.Element.seekedEvent.forTarget(this);
+  }
+  get [dartx.onSeeking]() {
+    return html$.Element.seekingEvent.forTarget(this);
+  }
+  get [dartx.onSelect]() {
+    return html$.Element.selectEvent.forTarget(this);
+  }
+  get [dartx.onSelectionChange]() {
+    return html$.Document.selectionChangeEvent.forTarget(this);
+  }
+  get [dartx.onSelectStart]() {
+    return html$.Element.selectStartEvent.forTarget(this);
+  }
+  get [dartx.onStalled]() {
+    return html$.Element.stalledEvent.forTarget(this);
+  }
+  get [dartx.onSubmit]() {
+    return html$.Element.submitEvent.forTarget(this);
+  }
+  get [dartx.onSuspend]() {
+    return html$.Element.suspendEvent.forTarget(this);
+  }
+  get [dartx.onTimeUpdate]() {
+    return html$.Element.timeUpdateEvent.forTarget(this);
+  }
+  get [dartx.onTouchCancel]() {
+    return html$.Element.touchCancelEvent.forTarget(this);
+  }
+  get [dartx.onTouchEnd]() {
+    return html$.Element.touchEndEvent.forTarget(this);
+  }
+  get [dartx.onTouchMove]() {
+    return html$.Element.touchMoveEvent.forTarget(this);
+  }
+  get [dartx.onTouchStart]() {
+    return html$.Element.touchStartEvent.forTarget(this);
+  }
+  get [dartx.onVolumeChange]() {
+    return html$.Element.volumeChangeEvent.forTarget(this);
+  }
+  get [dartx.onWaiting]() {
+    return html$.Element.waitingEvent.forTarget(this);
+  }
+  get [dartx.onFullscreenChange]() {
+    return html$.Element.fullscreenChangeEvent.forTarget(this);
+  }
+  get [dartx.onFullscreenError]() {
+    return html$.Element.fullscreenErrorEvent.forTarget(this);
+  }
+  [dartx.querySelectorAll](T) {
+    return selectors => {
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+    };
+  }
+  [dartx.query](relativeSelectors) {
+    return this[dartx.querySelector](relativeSelectors);
+  }
+  [dartx.queryAll](T) {
+    return relativeSelectors => {
+      return this[dartx.querySelectorAll](T)(relativeSelectors);
+    };
+  }
+  get [dartx.supportsRegisterElement]() {
+    return "registerElement" in this;
+  }
+  get [dartx.supportsRegister]() {
+    return this[dartx.supportsRegisterElement];
+  }
+  [dartx.createElement](tagName, typeExtension) {
+    if (typeExtension === void 0) typeExtension = null;
+    return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
+  }
+  [_createElement_2](tagName) {
+    return this.createElement(tagName);
+  }
+  [_createElementNS_2](namespaceURI, qualifiedName) {
+    return this.createElementNS(namespaceURI, qualifiedName);
+  }
+  [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
+    if (typeExtension === void 0) typeExtension = null;
+    return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
+  }
+  [_createNodeIterator](root, whatToShow, filter) {
+    if (whatToShow === void 0) whatToShow = null;
+    if (filter === void 0) filter = null;
+    return this.createNodeIterator(root, whatToShow, filter, false);
+  }
+  [_createTreeWalker](root, whatToShow, filter) {
+    if (whatToShow === void 0) whatToShow = null;
+    if (filter === void 0) filter = null;
+    return this.createTreeWalker(root, whatToShow, filter, false);
+  }
+  get [dartx.visibilityState]() {
+    return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
+  }
+};
+dart.setSignature(html$.Document, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
+  fields: () => ({
+    [dartx.activeElement]: html$.Element,
+    [_body]: html$.HtmlElement,
+    [dartx.contentType]: core.String,
+    [dartx.cookie]: core.String,
+    [dartx.currentScript]: html$.ScriptElement,
+    [_get_window]: dart.dynamic,
+    [dartx.documentElement]: html$.Element,
+    [dartx.domain]: core.String,
+    [dartx.fonts]: html$.FontFaceSet,
+    [dartx.fullscreenElement]: html$.Element,
+    [dartx.fullscreenEnabled]: core.bool,
+    [_head$0]: html$.HeadElement,
+    [dartx.hidden]: core.bool,
+    [dartx.implementation]: html$.DomImplementation,
+    [_lastModified]: core.String,
+    [dartx.origin]: core.String,
+    [dartx.pointerLockElement]: html$.Element,
+    [_preferredStylesheetSet]: core.String,
+    [dartx.readyState]: core.String,
+    [_referrer]: core.String,
+    [dartx.rootElement]: svg$.SvgSvgElement,
+    [dartx.scrollingElement]: html$.Element,
+    [_selectedStylesheetSet]: core.String,
+    [_styleSheets]: ListOfStyleSheet(),
+    [dartx.timeline]: html$.AnimationTimeline,
+    [_title]: core.String,
+    [_visibilityState]: core.String,
+    [_webkitFullscreenElement]: html$.Element,
+    [_webkitFullscreenEnabled]: core.bool,
+    [_webkitHidden]: core.bool,
+    [_webkitVisibilityState]: core.String,
+    [_childElementCount]: core.int,
+    [_children]: ListOfNode(),
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
+  }),
+  getters: () => ({
+    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
+    [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
+    [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
+  }),
+  methods: () => ({
+    [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
+    [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
+    [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
+    [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
+    [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
+    [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
+    [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
+    [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
+    [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
+    [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
+    [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
+    [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
+    [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
+    [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
+    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
+    [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.queryCommandSupported]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
+    [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
+    [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
+    [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
+    [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
+  }),
+  sfields: () => ({
+    pointerLockChangeEvent: EventStreamProviderOfEvent(),
+    pointerLockErrorEvent: EventStreamProviderOfEvent(),
+    readyStateChangeEvent: EventStreamProviderOfEvent(),
+    securityPolicyViolationEvent: EventStreamProviderOfSecurityPolicyViolationEvent(),
+    selectionChangeEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(html$.Document, {
+  get pointerLockChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
+  },
+  get pointerLockErrorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pointerlockerror'));
+  },
+  get readyStateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('readystatechange'));
+  },
+  get securityPolicyViolationEvent() {
+    return dart.const(new (EventStreamProviderOfSecurityPolicyViolationEvent())('securitypolicyviolation'));
+  },
+  get selectionChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
+  }
+});
+dart.registerExtension(dart.global.Document, html$.Document);
+const _docChildren = Symbol('_docChildren');
+dart.defineExtensionNames([
+  'children',
+  'children',
+  'querySelectorAll',
+  'innerHtml',
+  'innerHtml',
+  'setInnerHtml',
+  'appendText',
+  'appendHtml',
+  'query',
+  'queryAll',
+  'getElementById',
+  'querySelector'
+]);
+html$.DocumentFragment = class DocumentFragment extends html$.Node {
+  static new() {
+    return html$.document[dartx.createDocumentFragment]();
+  }
+  static html(html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+  }
+  static svg(svgContent, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
+  }
+  get [_children]() {
+    return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
+  }
+  get [_docChildren]() {
+    return this._docChildren;
+  }
+  set [_docChildren](value) {
+    this._docChildren = value;
+  }
+  get [dartx.children]() {
+    if (this[_docChildren] == null) {
+      this[_docChildren] = new html_common.FilteredElementList(this);
+    }
+    return this[_docChildren];
+  }
+  set [dartx.children](value) {
+    let copy = value[dartx.toList]();
+    let children = this[dartx.children];
+    children[dartx.clear]();
+    children[dartx.addAll](copy);
+  }
+  [dartx.querySelectorAll](T) {
+    return selectors => {
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+    };
+  }
+  get [dartx.innerHtml]() {
+    let e = html$.Element.tag("div");
+    e[dartx.append](this[dartx.clone](true));
+    return e[dartx.innerHtml];
+  }
+  set [dartx.innerHtml](value) {
+    this[dartx.setInnerHtml](value);
+  }
+  [dartx.setInnerHtml](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    this[dartx.nodes][dartx.clear]();
+    this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
+  }
+  [dartx.appendText](text) {
+    this[dartx.append](html$.Text.new(text));
+  }
+  [dartx.appendHtml](text, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
+  }
+  [dartx.query](relativeSelectors) {
+    return this[dartx.querySelector](relativeSelectors);
+  }
+  [dartx.queryAll](T) {
+    return relativeSelectors => {
+      return this[dartx.querySelectorAll](T)(relativeSelectors);
+    };
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getElementById](...args) {
+    return this.getElementById.apply(this, args);
+  }
+  get [_childElementCount]() {
+    return this.childElementCount;
+  }
+  get [_firstElementChild]() {
+    return this.firstElementChild;
+  }
+  get [_lastElementChild]() {
+    return this.lastElementChild;
+  }
+  [dartx.querySelector](...args) {
+    return this.querySelector.apply(this, args);
+  }
+  [_querySelectorAll](...args) {
+    return this.querySelectorAll.apply(this, args);
+  }
+};
+html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
+dart.setSignature(html$.DocumentFragment, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.DocumentFragment, []),
+    html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    _: dart.definiteFunctionType(html$.DocumentFragment, [])
+  }),
+  fields: () => ({
+    [_docChildren]: ListOfElement(),
+    [_childElementCount]: core.int,
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
+  }),
+  getters: () => ({
+    [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
+    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
+    [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
+  }),
+  setters: () => ({
+    [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
+    [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  methods: () => ({
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
+  })
+});
+dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
+dart.defineExtensionNames([
+  'message',
+  'name'
+]);
+html$.DomError = class DomError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(name, message) {
+    if (message === void 0) message = null;
+    if (message != null) {
+      return html$.DomError._create_1(name, message);
+    }
+    return html$.DomError._create_2(name);
+  }
+  static _create_1(name, message) {
+    return new DOMError(name, message);
+  }
+  static _create_2(name) {
+    return new DOMError(name);
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+};
+dart.setSignature(html$.DomError, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomError, []),
+    new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
+  }),
+  fields: () => ({
+    [dartx.message]: core.String,
+    [dartx.name]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.DOMError, html$.DomError);
+dart.defineExtensionNames([
+  'name',
+  'toString',
+  'message'
+]);
+html$.DomException = class DomException extends _interceptors.Interceptor {
+  get [dartx.name]() {
+    let errorName = this.name;
+    if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
+    if (dart.test(html_common.Device.isWebKit) && errorName == 'SYNTAX_ERR') return 'SyntaxError';
+    return errorName;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+};
+dart.setSignature(html$.DomException, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
+  fields: () => ({[dartx.message]: core.String}),
+  getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
+  sfields: () => ({
+    INDEX_SIZE: core.String,
+    HIERARCHY_REQUEST: core.String,
+    WRONG_DOCUMENT: core.String,
+    INVALID_CHARACTER: core.String,
+    NO_MODIFICATION_ALLOWED: core.String,
+    NOT_FOUND: core.String,
+    NOT_SUPPORTED: core.String,
+    INVALID_STATE: core.String,
+    SYNTAX: core.String,
+    INVALID_MODIFICATION: core.String,
+    NAMESPACE: core.String,
+    INVALID_ACCESS: core.String,
+    TYPE_MISMATCH: core.String,
+    SECURITY: core.String,
+    NETWORK: core.String,
+    ABORT: core.String,
+    URL_MISMATCH: core.String,
+    QUOTA_EXCEEDED: core.String,
+    TIMEOUT: core.String,
+    INVALID_NODE_TYPE: core.String,
+    DATA_CLONE: core.String
+  })
+});
+html$.DomException.INDEX_SIZE = 'IndexSizeError';
+html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
+html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
+html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
+html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
+html$.DomException.NOT_FOUND = 'NotFoundError';
+html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
+html$.DomException.INVALID_STATE = 'InvalidStateError';
+html$.DomException.SYNTAX = 'SyntaxError';
+html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
+html$.DomException.NAMESPACE = 'NamespaceError';
+html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
+html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
+html$.DomException.SECURITY = 'SecurityError';
+html$.DomException.NETWORK = 'NetworkError';
+html$.DomException.ABORT = 'AbortError';
+html$.DomException.URL_MISMATCH = 'URLMismatchError';
+html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
+html$.DomException.TIMEOUT = 'TimeoutError';
+html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
+html$.DomException.DATA_CLONE = 'DataCloneError';
+dart.registerExtension(dart.global.DOMException, html$.DomException);
+dart.defineExtensionNames([
+  'createDocument',
+  'createDocumentType',
+  'createHtmlDocument',
+  'hasFeature'
+]);
+html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.createDocument](...args) {
+    return this.createDocument.apply(this, args);
+  }
+  [dartx.createDocumentType](...args) {
+    return this.createDocumentType.apply(this, args);
+  }
+  [dartx.createHtmlDocument](...args) {
+    return this.createHTMLDocument.apply(this, args);
+  }
+  [dartx.hasFeature](...args) {
+    return this.hasFeature.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomImplementation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
+  methods: () => ({
+    [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
+    [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
+    [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
+    [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
+  })
+});
+dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
+dart.defineExtensionNames([
+  'next'
+]);
+html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.next](...args) {
+    return this.next.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomIterator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
+  methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
+});
+dart.registerExtension(dart.global.Iterator, html$.DomIterator);
+dart.defineExtensionNames([
+  'a',
+  'b',
+  'c',
+  'd',
+  'e',
+  'f',
+  'is2D',
+  'isIdentity',
+  'm11',
+  'm12',
+  'm13',
+  'm14',
+  'm21',
+  'm22',
+  'm23',
+  'm24',
+  'm31',
+  'm32',
+  'm33',
+  'm34',
+  'm41',
+  'm42',
+  'm43',
+  'm44',
+  'multiply',
+  'scale',
+  'scale3d',
+  'scaleNonUniform',
+  'toFloat32Array',
+  'toFloat64Array',
+  'translate'
+]);
+html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.a]() {
+    return this.a;
+  }
+  get [dartx.b]() {
+    return this.b;
+  }
+  get [dartx.c]() {
+    return this.c;
+  }
+  get [dartx.d]() {
+    return this.d;
+  }
+  get [dartx.e]() {
+    return this.e;
+  }
+  get [dartx.f]() {
+    return this.f;
+  }
+  get [dartx.is2D]() {
+    return this.is2D;
+  }
+  get [dartx.isIdentity]() {
+    return this.isIdentity;
+  }
+  get [dartx.m11]() {
+    return this.m11;
+  }
+  get [dartx.m12]() {
+    return this.m12;
+  }
+  get [dartx.m13]() {
+    return this.m13;
+  }
+  get [dartx.m14]() {
+    return this.m14;
+  }
+  get [dartx.m21]() {
+    return this.m21;
+  }
+  get [dartx.m22]() {
+    return this.m22;
+  }
+  get [dartx.m23]() {
+    return this.m23;
+  }
+  get [dartx.m24]() {
+    return this.m24;
+  }
+  get [dartx.m31]() {
+    return this.m31;
+  }
+  get [dartx.m32]() {
+    return this.m32;
+  }
+  get [dartx.m33]() {
+    return this.m33;
+  }
+  get [dartx.m34]() {
+    return this.m34;
+  }
+  get [dartx.m41]() {
+    return this.m41;
+  }
+  get [dartx.m42]() {
+    return this.m42;
+  }
+  get [dartx.m43]() {
+    return this.m43;
+  }
+  get [dartx.m44]() {
+    return this.m44;
+  }
+  [dartx.multiply](...args) {
+    return this.multiply.apply(this, args);
+  }
+  [dartx.scale](...args) {
+    return this.scale.apply(this, args);
+  }
+  [dartx.scale3d](...args) {
+    return this.scale3d.apply(this, args);
+  }
+  [dartx.scaleNonUniform](...args) {
+    return this.scaleNonUniform.apply(this, args);
+  }
+  [dartx.toFloat32Array](...args) {
+    return this.toFloat32Array.apply(this, args);
+  }
+  [dartx.toFloat64Array](...args) {
+    return this.toFloat64Array.apply(this, args);
+  }
+  [dartx.translate](...args) {
+    return this.translate.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomMatrixReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
+  getters: () => ({
+    [dartx.a]: dart.definiteFunctionType(core.num, []),
+    [dartx.b]: dart.definiteFunctionType(core.num, []),
+    [dartx.c]: dart.definiteFunctionType(core.num, []),
+    [dartx.d]: dart.definiteFunctionType(core.num, []),
+    [dartx.e]: dart.definiteFunctionType(core.num, []),
+    [dartx.f]: dart.definiteFunctionType(core.num, []),
+    [dartx.is2D]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isIdentity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.m11]: dart.definiteFunctionType(core.num, []),
+    [dartx.m12]: dart.definiteFunctionType(core.num, []),
+    [dartx.m13]: dart.definiteFunctionType(core.num, []),
+    [dartx.m14]: dart.definiteFunctionType(core.num, []),
+    [dartx.m21]: dart.definiteFunctionType(core.num, []),
+    [dartx.m22]: dart.definiteFunctionType(core.num, []),
+    [dartx.m23]: dart.definiteFunctionType(core.num, []),
+    [dartx.m24]: dart.definiteFunctionType(core.num, []),
+    [dartx.m31]: dart.definiteFunctionType(core.num, []),
+    [dartx.m32]: dart.definiteFunctionType(core.num, []),
+    [dartx.m33]: dart.definiteFunctionType(core.num, []),
+    [dartx.m34]: dart.definiteFunctionType(core.num, []),
+    [dartx.m41]: dart.definiteFunctionType(core.num, []),
+    [dartx.m42]: dart.definiteFunctionType(core.num, []),
+    [dartx.m43]: dart.definiteFunctionType(core.num, []),
+    [dartx.m44]: dart.definiteFunctionType(core.num, [])
+  }),
+  methods: () => ({
+    [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
+    [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
+    [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
+    [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
+    [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
+  })
+});
+dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
+dart.defineExtensionNames([
+  'a',
+  'a',
+  'b',
+  'b',
+  'c',
+  'c',
+  'd',
+  'd',
+  'e',
+  'e',
+  'f',
+  'f',
+  'm11',
+  'm11',
+  'm12',
+  'm12',
+  'm13',
+  'm13',
+  'm14',
+  'm14',
+  'm21',
+  'm21',
+  'm22',
+  'm22',
+  'm23',
+  'm23',
+  'm24',
+  'm24',
+  'm31',
+  'm31',
+  'm32',
+  'm32',
+  'm33',
+  'm33',
+  'm34',
+  'm34',
+  'm41',
+  'm41',
+  'm42',
+  'm42',
+  'm43',
+  'm43',
+  'm44',
+  'm44',
+  'multiplySelf',
+  'preMultiplySelf',
+  'scale3dSelf',
+  'scaleNonUniformSelf',
+  'scaleSelf',
+  'translateSelf'
+]);
+html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(other) {
+    if (other === void 0) other = null;
+    if (other == null) {
+      return html$.DomMatrix._create_1();
+    }
+    if (html$.DomMatrixReadOnly.is(other) || other == null) {
+      return html$.DomMatrix._create_2(other);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1() {
+    return new DOMMatrix();
+  }
+  static _create_2(other) {
+    return new DOMMatrix(other);
+  }
+  get [dartx.a]() {
+    return this.a;
+  }
+  set [dartx.a](value) {
+    this.a = value;
+  }
+  get [dartx.b]() {
+    return this.b;
+  }
+  set [dartx.b](value) {
+    this.b = value;
+  }
+  get [dartx.c]() {
+    return this.c;
+  }
+  set [dartx.c](value) {
+    this.c = value;
+  }
+  get [dartx.d]() {
+    return this.d;
+  }
+  set [dartx.d](value) {
+    this.d = value;
+  }
+  get [dartx.e]() {
+    return this.e;
+  }
+  set [dartx.e](value) {
+    this.e = value;
+  }
+  get [dartx.f]() {
+    return this.f;
+  }
+  set [dartx.f](value) {
+    this.f = value;
+  }
+  get [dartx.m11]() {
+    return this.m11;
+  }
+  set [dartx.m11](value) {
+    this.m11 = value;
+  }
+  get [dartx.m12]() {
+    return this.m12;
+  }
+  set [dartx.m12](value) {
+    this.m12 = value;
+  }
+  get [dartx.m13]() {
+    return this.m13;
+  }
+  set [dartx.m13](value) {
+    this.m13 = value;
+  }
+  get [dartx.m14]() {
+    return this.m14;
+  }
+  set [dartx.m14](value) {
+    this.m14 = value;
+  }
+  get [dartx.m21]() {
+    return this.m21;
+  }
+  set [dartx.m21](value) {
+    this.m21 = value;
+  }
+  get [dartx.m22]() {
+    return this.m22;
+  }
+  set [dartx.m22](value) {
+    this.m22 = value;
+  }
+  get [dartx.m23]() {
+    return this.m23;
+  }
+  set [dartx.m23](value) {
+    this.m23 = value;
+  }
+  get [dartx.m24]() {
+    return this.m24;
+  }
+  set [dartx.m24](value) {
+    this.m24 = value;
+  }
+  get [dartx.m31]() {
+    return this.m31;
+  }
+  set [dartx.m31](value) {
+    this.m31 = value;
+  }
+  get [dartx.m32]() {
+    return this.m32;
+  }
+  set [dartx.m32](value) {
+    this.m32 = value;
+  }
+  get [dartx.m33]() {
+    return this.m33;
+  }
+  set [dartx.m33](value) {
+    this.m33 = value;
+  }
+  get [dartx.m34]() {
+    return this.m34;
+  }
+  set [dartx.m34](value) {
+    this.m34 = value;
+  }
+  get [dartx.m41]() {
+    return this.m41;
+  }
+  set [dartx.m41](value) {
+    this.m41 = value;
+  }
+  get [dartx.m42]() {
+    return this.m42;
+  }
+  set [dartx.m42](value) {
+    this.m42 = value;
+  }
+  get [dartx.m43]() {
+    return this.m43;
+  }
+  set [dartx.m43](value) {
+    this.m43 = value;
+  }
+  get [dartx.m44]() {
+    return this.m44;
+  }
+  set [dartx.m44](value) {
+    this.m44 = value;
+  }
+  [dartx.multiplySelf](...args) {
+    return this.multiplySelf.apply(this, args);
+  }
+  [dartx.preMultiplySelf](...args) {
+    return this.preMultiplySelf.apply(this, args);
+  }
+  [dartx.scale3dSelf](...args) {
+    return this.scale3dSelf.apply(this, args);
+  }
+  [dartx.scaleNonUniformSelf](...args) {
+    return this.scaleNonUniformSelf.apply(this, args);
+  }
+  [dartx.scaleSelf](...args) {
+    return this.scaleSelf.apply(this, args);
+  }
+  [dartx.translateSelf](...args) {
+    return this.translateSelf.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomMatrix, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomMatrix, []),
+    new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
+  }),
+  setters: () => ({
+    [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.b]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.c]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.d]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.e]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.f]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m11]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m12]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m13]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m14]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m21]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m22]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m23]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m24]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m31]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m32]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m33]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m34]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m41]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m42]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m43]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
+  }),
+  methods: () => ({
+    [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
+    [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
+    [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
+    _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
+dart.defineExtensionNames([
+  'parseFromString'
+]);
+html$.DomParser = class DomParser extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.DomParser._create_1();
+  }
+  static _create_1() {
+    return new DOMParser();
+  }
+  [dartx.parseFromString](...args) {
+    return this.parseFromString.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomParser, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomParser, []),
+    new: dart.definiteFunctionType(html$.DomParser, [])
+  }),
+  methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.DOMParser, html$.DomParser);
+dart.defineExtensionNames([
+  'w',
+  'x',
+  'y',
+  'z'
+]);
+html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(x, y, z, w) {
+    return html$.DomPointReadOnly._create_1(x, y, z, w);
+  }
+  static _create_1(x, y, z, w) {
+    return new DOMPointReadOnly(x, y, z, w);
+  }
+  get [dartx.w]() {
+    return this.w;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.z]() {
+    return this.z;
+  }
+};
+dart.setSignature(html$.DomPointReadOnly, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
+    new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
+  }),
+  getters: () => ({
+    [dartx.w]: dart.definiteFunctionType(core.num, []),
+    [dartx.x]: dart.definiteFunctionType(core.num, []),
+    [dartx.y]: dart.definiteFunctionType(core.num, []),
+    [dartx.z]: dart.definiteFunctionType(core.num, [])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
+dart.defineExtensionNames([
+  'w',
+  'w',
+  'x',
+  'x',
+  'y',
+  'y',
+  'z',
+  'z'
+]);
+html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(point_OR_x, y, z, w) {
+    if (point_OR_x === void 0) point_OR_x = null;
+    if (y === void 0) y = null;
+    if (z === void 0) z = null;
+    if (w === void 0) w = null;
+    if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
+      let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
+      return html$.DomPoint._create_1(point_1);
+    }
+    if (point_OR_x == null && y == null && z == null && w == null) {
+      return html$.DomPoint._create_2();
+    }
+    if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
+      return html$.DomPoint._create_3(point_OR_x);
+    }
+    if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
+      return html$.DomPoint._create_4(point_OR_x, y);
+    }
+    if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
+      return html$.DomPoint._create_5(point_OR_x, y, z);
+    }
+    if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
+      return html$.DomPoint._create_6(point_OR_x, y, z, w);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1(point_OR_x) {
+    return new DOMPoint(point_OR_x);
+  }
+  static _create_2() {
+    return new DOMPoint();
+  }
+  static _create_3(point_OR_x) {
+    return new DOMPoint(point_OR_x);
+  }
+  static _create_4(point_OR_x, y) {
+    return new DOMPoint(point_OR_x, y);
+  }
+  static _create_5(point_OR_x, y, z) {
+    return new DOMPoint(point_OR_x, y, z);
+  }
+  static _create_6(point_OR_x, y, z, w) {
+    return new DOMPoint(point_OR_x, y, z, w);
+  }
+  static get supported() {
+    return !!window.DOMPoint || !!window.WebKitPoint;
+  }
+  get [dartx.w]() {
+    return this.w;
+  }
+  set [dartx.w](value) {
+    this.w = value;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.z]() {
+    return this.z;
+  }
+  set [dartx.z](value) {
+    this.z = value;
+  }
+};
+dart.setSignature(html$.DomPoint, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomPoint, []),
+    new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
+  }),
+  setters: () => ({
+    [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.y]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.z]: dart.definiteFunctionType(dart.void, [core.num])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DomPoint, []),
+    _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
+});
+dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
+dart.defineExtensionNames([
+  'toString',
+  '==',
+  'hashCode',
+  'intersection',
+  'intersects',
+  'boundingBox',
+  'containsRectangle',
+  'containsPoint',
+  'topLeft',
+  'topRight',
+  'bottomRight',
+  'bottomLeft',
+  'bottom',
+  'height',
+  'left',
+  'right',
+  'top',
+  'width',
+  'x',
+  'y'
+]);
+html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
+  [dartx.toString]() {
+    return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
+  }
+  [dartx['==']](other) {
+    if (!RectangleOfnum().is(other)) return false;
+    return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
+  }
+  get [dartx.hashCode]() {
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
+  }
+  [dartx.intersection](other) {
+    let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
+    let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    if (dart.notNull(x0) <= dart.notNull(x1)) {
+      let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
+      let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+      if (dart.notNull(y0) <= dart.notNull(y1)) {
+        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
+      }
+    }
+    return null;
+  }
+  [dartx.intersects](other) {
+    return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
+  }
+  [dartx.boundingBox](other) {
+    let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+    let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
+    let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
+    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
+  }
+  [dartx.containsRectangle](another) {
+    return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
+  }
+  [dartx.containsPoint](another) {
+    return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
+  }
+  get [dartx.topLeft]() {
+    return new (PointOfnum())(this[dartx.left], this[dartx.top]);
+  }
+  get [dartx.topRight]() {
+    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
+  }
+  get [dartx.bottomRight]() {
+    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
+  }
+  get [dartx.bottomLeft]() {
+    return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(x, y, width, height) {
+    return html$.DomRectReadOnly._create_1(x, y, width, height);
+  }
+  static _create_1(x, y, width, height) {
+    return new DOMRectReadOnly(x, y, width, height);
+  }
+  get [dartx.bottom]() {
+    return this.bottom;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.left]() {
+    return this.left;
+  }
+  get [dartx.right]() {
+    return this.right;
+  }
+  get [dartx.top]() {
+    return this.top;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$.DomRectReadOnly, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
+    new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
+  }),
+  getters: () => ({
+    [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.bottom]: dart.definiteFunctionType(core.num, []),
+    [dartx.height]: dart.definiteFunctionType(core.num, []),
+    [dartx.left]: dart.definiteFunctionType(core.num, []),
+    [dartx.right]: dart.definiteFunctionType(core.num, []),
+    [dartx.top]: dart.definiteFunctionType(core.num, []),
+    [dartx.width]: dart.definiteFunctionType(core.num, []),
+    [dartx.x]: dart.definiteFunctionType(core.num, []),
+    [dartx.y]: dart.definiteFunctionType(core.num, [])
+  }),
+  methods: () => ({
+    [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
+dart.defineExtensionNames([
+  'add',
+  'contains',
+  'item',
+  'remove',
+  'toggle',
+  'length'
+]);
+html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.add](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.contains](...args) {
+    return this.contains.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.remove](...args) {
+    return this.remove.apply(this, args);
+  }
+  [dartx.toggle](...args) {
+    return this.toggle.apply(this, args);
+  }
+};
+dart.setSignature(html$.DomTokenList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
+  fields: () => ({[dartx.length]: core.int}),
+  methods: () => ({
+    [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.contains]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
+  })
+});
+dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
+dart.defineExtensionNames([
+  'value'
+]);
+html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.setSignature(html$.DomSettableTokenList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
+  fields: () => ({[dartx.value]: core.String})
+});
+dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
+html$.ImmutableListMixin$ = dart.generic(E => {
+  let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
+  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
+  let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
+  dart.defineExtensionNames([
+    'iterator',
+    'add',
+    'addAll',
+    'sort',
+    'shuffle',
+    'insert',
+    'insertAll',
+    'setAll',
+    'removeAt',
+    'removeLast',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'setRange',
+    'removeRange',
+    'replaceRange',
+    'fillRange'
+  ]);
+  class ImmutableListMixin extends core.Object {
+    get iterator() {
+      return new (FixedSizeListIteratorOfE())(this);
+    }
+    [Symbol.iterator]() {
+      return new dart.JsIterator(this[dartx.iterator]);
+    }
+    add(value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
+    }
+    addAll(iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
+    }
+    sort(compare) {
+      if (compare === void 0) compare = null;
+      dart.throw(new core.UnsupportedError("Cannot sort immutable List."));
+    }
+    shuffle(random) {
+      if (random === void 0) random = null;
+      dart.throw(new core.UnsupportedError("Cannot shuffle immutable List."));
+    }
+    insert(index, element) {
+      E._check(element);
+      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
+    }
+    insertAll(index, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot add to immutable List."));
+    }
+    setAll(index, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
+    }
+    removeAt(pos) {
+      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
+    }
+    removeLast() {
+      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
+    }
+    remove(object) {
+      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
+    }
+    removeWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
+    }
+    retainWhere(test) {
+      dart.throw(new core.UnsupportedError("Cannot remove from immutable List."));
+    }
+    setRange(start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      dart.throw(new core.UnsupportedError("Cannot setRange on immutable List."));
+    }
+    removeRange(start, end) {
+      dart.throw(new core.UnsupportedError("Cannot removeRange on immutable List."));
+    }
+    replaceRange(start, end, iterable) {
+      IterableOfE()._check(iterable);
+      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
+    }
+    fillRange(start, end, fillValue) {
+      if (fillValue === void 0) fillValue = null;
+      E._check(fillValue);
+      dart.throw(new core.UnsupportedError("Cannot modify an immutable List."));
+    }
+  }
+  dart.addTypeTests(ImmutableListMixin);
+  ImmutableListMixin[dart.implements] = () => [ListOfE()];
+  dart.setSignature(ImmutableListMixin, {
+    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [E]),
+      addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
+      sort: dart.definiteFunctionType(dart.void, [], [EAndEToint()]),
+      shuffle: dart.definiteFunctionType(dart.void, [], [math.Random]),
+      insert: dart.definiteFunctionType(dart.void, [core.int, E]),
+      insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
+      removeAt: dart.definiteFunctionType(E, [core.int]),
+      removeLast: dart.definiteFunctionType(E, []),
+      remove: dart.definiteFunctionType(core.bool, [core.Object]),
+      removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
+      setRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()], [core.int]),
+      removeRange: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+      replaceRange: dart.definiteFunctionType(dart.void, [core.int, core.int, IterableOfE()]),
+      fillRange: dart.definiteFunctionType(dart.void, [core.int, core.int], [E])
+    })
+  });
+  dart.defineExtensionMembers(ImmutableListMixin, [
+    'add',
+    'addAll',
+    'sort',
+    'shuffle',
+    'insert',
+    'insertAll',
+    'setAll',
+    'removeAt',
+    'removeLast',
+    'remove',
+    'removeWhere',
+    'retainWhere',
+    'setRange',
+    'removeRange',
+    'replaceRange',
+    'fillRange',
+    'iterator'
+  ]);
+  return ImmutableListMixin;
+});
+html$.ImmutableListMixin = ImmutableListMixin();
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.item](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.DomStringList[dart.implements] = () => [ListOfString()];
+dart.setSignature(html$.DomStringList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
+    [__getter__]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
+  })
+});
+dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
+html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.DomStringMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
+});
+html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.EffectModel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
+});
+dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
+const _childElements = Symbol('_childElements');
+const _element$ = Symbol('_element');
+const _filter$0 = Symbol('_filter');
+html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
+  _wrap(element) {
+    this[_childElements] = html$.HtmlCollection._check(element[_children]);
+    this[_element$] = element;
+  }
+  contains(element) {
+    return this[_childElements][dartx.contains](element);
+  }
+  get isEmpty() {
+    return this[_element$][_firstElementChild] == null;
+  }
+  get length() {
+    return this[_childElements][dartx.length];
+  }
+  _get(index) {
+    return html$.Element._check(this[_childElements][dartx._get](index));
+  }
+  _set(index, value) {
+    this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
+    return value;
+  }
+  set length(newLength) {
+    dart.throw(new core.UnsupportedError('Cannot resize element lists'));
+  }
+  add(value) {
+    this[_element$][dartx.append](value);
+    return value;
+  }
+  get iterator() {
+    return this[dartx.toList]()[dartx.iterator];
+  }
+  addAll(iterable) {
+    if (html$._ChildNodeListLazy.is(iterable)) {
+      iterable = ListOfElement().from(iterable);
+    }
+    for (let element of iterable) {
+      this[_element$][dartx.append](element);
+    }
+  }
+  sort(compare) {
+    if (compare === void 0) compare = null;
+    dart.throw(new core.UnsupportedError('Cannot sort element lists'));
+  }
+  shuffle(random) {
+    if (random === void 0) random = null;
+    dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
+  }
+  removeWhere(test) {
+    this[_filter$0](test, false);
+  }
+  retainWhere(test) {
+    this[_filter$0](test, true);
+  }
+  [_filter$0](test, retainMatching) {
+    let removed = null;
+    if (dart.test(retainMatching)) {
+      removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
+    } else {
+      removed = this[_element$][dartx.children][dartx.where](test);
+    }
+    for (let e of core.Iterable._check(removed))
+      dart.dsend(e, 'remove');
+  }
+  setRange(start, end, iterable, skipCount) {
+    if (skipCount === void 0) skipCount = 0;
+    dart.throw(new core.UnimplementedError());
+  }
+  replaceRange(start, end, iterable) {
+    dart.throw(new core.UnimplementedError());
+  }
+  fillRange(start, end, fillValue) {
+    if (fillValue === void 0) fillValue = null;
+    dart.throw(new core.UnimplementedError());
+  }
+  remove(object) {
+    if (html$.Element.is(object)) {
+      let element = object;
+      if (core.identical(element[dartx.parentNode], this[_element$])) {
+        this[_element$][_removeChild](element);
+        return true;
+      }
+    }
+    return false;
+  }
+  insert(index, element) {
+    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
+      dart.throw(new core.RangeError.range(index, 0, this.length));
+    }
+    if (index == this.length) {
+      this[_element$][dartx.append](element);
+    } else {
+      this[_element$][dartx.insertBefore](element, this._get(index));
+    }
+  }
+  setAll(index, iterable) {
+    dart.throw(new core.UnimplementedError());
+  }
+  clear() {
+    this[_element$][_clearChildren]();
+  }
+  removeAt(index) {
+    let result = this._get(index);
+    if (result != null) {
+      this[_element$][_removeChild](result);
+    }
+    return result;
+  }
+  removeLast() {
+    let result = this.last;
+    if (result != null) {
+      this[_element$][_removeChild](result);
+    }
+    return result;
+  }
+  get first() {
+    let result = this[_element$][_firstElementChild];
+    if (result == null) dart.throw(new core.StateError("No elements"));
+    return result;
+  }
+  get last() {
+    let result = this[_element$][_lastElementChild];
+    if (result == null) dart.throw(new core.StateError("No elements"));
+    return result;
+  }
+  get single() {
+    if (dart.notNull(this.length) > 1) dart.throw(new core.StateError("More than one element"));
+    return this.first;
+  }
+  get rawList() {
+    return this[_childElements];
+  }
+};
+dart.addSimpleTypeTests(html$._ChildrenElementList);
+dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
+html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
+dart.setSignature(html$._ChildrenElementList, {
+  constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
+  fields: () => ({
+    [_element$]: html$.Element,
+    [_childElements]: html$.HtmlCollection
+  }),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
+  }),
+  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    _get: dart.definiteFunctionType(html$.Element, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
+    add: dart.definiteFunctionType(html$.Element, [html$.Element]),
+    [_filter$0]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
+  })
+});
+dart.defineExtensionMembers(html$._ChildrenElementList, [
+  'contains',
+  '_get',
+  '_set',
+  'add',
+  'addAll',
+  'sort',
+  'shuffle',
+  'removeWhere',
+  'retainWhere',
+  'setRange',
+  'replaceRange',
+  'fillRange',
+  'remove',
+  'insert',
+  'setAll',
+  'clear',
+  'removeAt',
+  'removeLast',
+  'isEmpty',
+  'length',
+  'length',
+  'iterator',
+  'first',
+  'last',
+  'single'
+]);
+html$.ElementList$ = dart.generic(T => {
+  class ElementList extends collection.ListBase$(T) {}
+  return ElementList;
+});
+html$.ElementList = ElementList();
+const _nodeList = Symbol('_nodeList');
+const _forElementList = Symbol('_forElementList');
+html$._FrozenElementList$ = dart.generic(E => {
+  let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
+  let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
+  let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
+  class _FrozenElementList extends collection.ListBase$(E) {
+    _wrap(nodeList) {
+      this[_nodeList] = nodeList;
+    }
+    get length() {
+      return this[_nodeList][dartx.length];
+    }
+    _get(index) {
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
+    }
+    _set(index, value) {
+      E._check(value);
+      dart.throw(new core.UnsupportedError('Cannot modify list'));
+      return value;
+    }
+    set length(newLength) {
+      dart.throw(new core.UnsupportedError('Cannot modify list'));
+    }
+    sort(compare) {
+      if (compare === void 0) compare = null;
+      dart.throw(new core.UnsupportedError('Cannot sort list'));
+    }
+    shuffle(random) {
+      if (random === void 0) random = null;
+      dart.throw(new core.UnsupportedError('Cannot shuffle list'));
+    }
+    get first() {
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
+    }
+    get last() {
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
+    }
+    get single() {
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
+    }
+    get classes() {
+      return html$._MultiElementCssClassSet.new(this);
+    }
+    get style() {
+      return new html$._CssStyleDeclarationSet(this);
+    }
+    set classes(value) {
+      this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
+    }
+    get contentEdge() {
+      return new html$._ContentCssListRect(this);
+    }
+    get paddingEdge() {
+      return this.first[dartx.paddingEdge];
+    }
+    get borderEdge() {
+      return this.first[dartx.borderEdge];
+    }
+    get marginEdge() {
+      return this.first[dartx.marginEdge];
+    }
+    get rawList() {
+      return this[_nodeList];
+    }
+    get onAbort() {
+      return html$.Element.abortEvent[_forElementList](this);
+    }
+    get onBeforeCopy() {
+      return html$.Element.beforeCopyEvent[_forElementList](this);
+    }
+    get onBeforeCut() {
+      return html$.Element.beforeCutEvent[_forElementList](this);
+    }
+    get onBeforePaste() {
+      return html$.Element.beforePasteEvent[_forElementList](this);
+    }
+    get onBlur() {
+      return html$.Element.blurEvent[_forElementList](this);
+    }
+    get onCanPlay() {
+      return html$.Element.canPlayEvent[_forElementList](this);
+    }
+    get onCanPlayThrough() {
+      return html$.Element.canPlayThroughEvent[_forElementList](this);
+    }
+    get onChange() {
+      return html$.Element.changeEvent[_forElementList](this);
+    }
+    get onClick() {
+      return html$.Element.clickEvent[_forElementList](this);
+    }
+    get onContextMenu() {
+      return html$.Element.contextMenuEvent[_forElementList](this);
+    }
+    get onCopy() {
+      return html$.Element.copyEvent[_forElementList](this);
+    }
+    get onCut() {
+      return html$.Element.cutEvent[_forElementList](this);
+    }
+    get onDoubleClick() {
+      return html$.Element.doubleClickEvent[_forElementList](this);
+    }
+    get onDrag() {
+      return html$.Element.dragEvent[_forElementList](this);
+    }
+    get onDragEnd() {
+      return html$.Element.dragEndEvent[_forElementList](this);
+    }
+    get onDragEnter() {
+      return html$.Element.dragEnterEvent[_forElementList](this);
+    }
+    get onDragLeave() {
+      return html$.Element.dragLeaveEvent[_forElementList](this);
+    }
+    get onDragOver() {
+      return html$.Element.dragOverEvent[_forElementList](this);
+    }
+    get onDragStart() {
+      return html$.Element.dragStartEvent[_forElementList](this);
+    }
+    get onDrop() {
+      return html$.Element.dropEvent[_forElementList](this);
+    }
+    get onDurationChange() {
+      return html$.Element.durationChangeEvent[_forElementList](this);
+    }
+    get onEmptied() {
+      return html$.Element.emptiedEvent[_forElementList](this);
+    }
+    get onEnded() {
+      return html$.Element.endedEvent[_forElementList](this);
+    }
+    get onError() {
+      return html$.Element.errorEvent[_forElementList](this);
+    }
+    get onFocus() {
+      return html$.Element.focusEvent[_forElementList](this);
+    }
+    get onInput() {
+      return html$.Element.inputEvent[_forElementList](this);
+    }
+    get onInvalid() {
+      return html$.Element.invalidEvent[_forElementList](this);
+    }
+    get onKeyDown() {
+      return html$.Element.keyDownEvent[_forElementList](this);
+    }
+    get onKeyPress() {
+      return html$.Element.keyPressEvent[_forElementList](this);
+    }
+    get onKeyUp() {
+      return html$.Element.keyUpEvent[_forElementList](this);
+    }
+    get onLoad() {
+      return html$.Element.loadEvent[_forElementList](this);
+    }
+    get onLoadedData() {
+      return html$.Element.loadedDataEvent[_forElementList](this);
+    }
+    get onLoadedMetadata() {
+      return html$.Element.loadedMetadataEvent[_forElementList](this);
+    }
+    get onMouseDown() {
+      return html$.Element.mouseDownEvent[_forElementList](this);
+    }
+    get onMouseEnter() {
+      return html$.Element.mouseEnterEvent[_forElementList](this);
+    }
+    get onMouseLeave() {
+      return html$.Element.mouseLeaveEvent[_forElementList](this);
+    }
+    get onMouseMove() {
+      return html$.Element.mouseMoveEvent[_forElementList](this);
+    }
+    get onMouseOut() {
+      return html$.Element.mouseOutEvent[_forElementList](this);
+    }
+    get onMouseOver() {
+      return html$.Element.mouseOverEvent[_forElementList](this);
+    }
+    get onMouseUp() {
+      return html$.Element.mouseUpEvent[_forElementList](this);
+    }
+    get onMouseWheel() {
+      return html$.Element.mouseWheelEvent[_forElementList](this);
+    }
+    get onPaste() {
+      return html$.Element.pasteEvent[_forElementList](this);
+    }
+    get onPause() {
+      return html$.Element.pauseEvent[_forElementList](this);
+    }
+    get onPlay() {
+      return html$.Element.playEvent[_forElementList](this);
+    }
+    get onPlaying() {
+      return html$.Element.playingEvent[_forElementList](this);
+    }
+    get onRateChange() {
+      return html$.Element.rateChangeEvent[_forElementList](this);
+    }
+    get onReset() {
+      return html$.Element.resetEvent[_forElementList](this);
+    }
+    get onResize() {
+      return html$.Element.resizeEvent[_forElementList](this);
+    }
+    get onScroll() {
+      return html$.Element.scrollEvent[_forElementList](this);
+    }
+    get onSearch() {
+      return html$.Element.searchEvent[_forElementList](this);
+    }
+    get onSeeked() {
+      return html$.Element.seekedEvent[_forElementList](this);
+    }
+    get onSeeking() {
+      return html$.Element.seekingEvent[_forElementList](this);
+    }
+    get onSelect() {
+      return html$.Element.selectEvent[_forElementList](this);
+    }
+    get onSelectStart() {
+      return html$.Element.selectStartEvent[_forElementList](this);
+    }
+    get onStalled() {
+      return html$.Element.stalledEvent[_forElementList](this);
+    }
+    get onSubmit() {
+      return html$.Element.submitEvent[_forElementList](this);
+    }
+    get onSuspend() {
+      return html$.Element.suspendEvent[_forElementList](this);
+    }
+    get onTimeUpdate() {
+      return html$.Element.timeUpdateEvent[_forElementList](this);
+    }
+    get onTouchCancel() {
+      return html$.Element.touchCancelEvent[_forElementList](this);
+    }
+    get onTouchEnd() {
+      return html$.Element.touchEndEvent[_forElementList](this);
+    }
+    get onTouchEnter() {
+      return html$.Element.touchEnterEvent[_forElementList](this);
+    }
+    get onTouchLeave() {
+      return html$.Element.touchLeaveEvent[_forElementList](this);
+    }
+    get onTouchMove() {
+      return html$.Element.touchMoveEvent[_forElementList](this);
+    }
+    get onTouchStart() {
+      return html$.Element.touchStartEvent[_forElementList](this);
+    }
+    get onTransitionEnd() {
+      return html$.Element.transitionEndEvent[_forElementList](this);
+    }
+    get onVolumeChange() {
+      return html$.Element.volumeChangeEvent[_forElementList](this);
+    }
+    get onWaiting() {
+      return html$.Element.waitingEvent[_forElementList](this);
+    }
+    get onFullscreenChange() {
+      return html$.Element.fullscreenChangeEvent[_forElementList](this);
+    }
+    get onFullscreenError() {
+      return html$.Element.fullscreenErrorEvent[_forElementList](this);
+    }
+  }
+  dart.defineNamedConstructor(_FrozenElementList, '_wrap');
+  _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
+  dart.setSignature(_FrozenElementList, {
+    constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
+    fields: () => ({[_nodeList]: ListOfNode()}),
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      classes: dart.definiteFunctionType(html$.CssClassSet, []),
+      style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
+      contentEdge: dart.definiteFunctionType(html$.CssRect, []),
+      paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
+      borderEdge: dart.definiteFunctionType(html$.CssRect, []),
+      marginEdge: dart.definiteFunctionType(html$.CssRect, []),
+      rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
+      onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
+      onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
+      onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
+    }),
+    setters: () => ({
+      length: dart.definiteFunctionType(dart.void, [core.int]),
+      classes: dart.definiteFunctionType(dart.void, [IterableOfString()])
+    }),
+    methods: () => ({
+      _get: dart.definiteFunctionType(E, [core.int]),
+      _set: dart.definiteFunctionType(dart.void, [core.int, E])
+    })
+  });
+  dart.defineExtensionMembers(_FrozenElementList, [
+    '_get',
+    '_set',
+    'sort',
+    'shuffle',
+    'length',
+    'length',
+    'first',
+    'last',
+    'single'
+  ]);
+  return _FrozenElementList;
+});
+html$._FrozenElementList = _FrozenElementList();
+html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
+  static createElement_tag(tag, typeExtension) {
+    if (typeExtension != null) {
+      return document.createElement(tag, typeExtension);
+    }
+    return document.createElement(tag);
+  }
+};
+dart.setSignature(html$._ElementFactoryProvider, {
+  statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
+  names: ['createElement_tag']
+});
+const _value$2 = Symbol('_value');
+html$.ScrollAlignment = class ScrollAlignment extends core.Object {
+  _internal(value) {
+    this[_value$2] = value;
+  }
+  toString() {
+    return dart.str`ScrollAlignment.${this[_value$2]}`;
+  }
+};
+dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
+dart.setSignature(html$.ScrollAlignment, {
+  constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
+  fields: () => ({[_value$2]: dart.dynamic}),
+  sfields: () => ({
+    TOP: html$.ScrollAlignment,
+    CENTER: html$.ScrollAlignment,
+    BOTTOM: html$.ScrollAlignment
+  })
+});
+dart.defineLazy(html$.ScrollAlignment, {
+  get TOP() {
+    return dart.const(new html$.ScrollAlignment._internal('TOP'));
+  },
+  get CENTER() {
+    return dart.const(new html$.ScrollAlignment._internal('CENTER'));
+  },
+  get BOTTOM() {
+    return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
+  }
+});
+const __setter__ = Symbol('__setter__');
+dart.defineExtensionNames([
+  'height',
+  'name',
+  'src',
+  'type',
+  'width'
+]);
+html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.name] = null;
+    this[dartx.src] = null;
+    this[dartx.type] = null;
+    this[dartx.width] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('embed');
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [__setter__](...args) {
+    return this.__setter__.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.EmbedElement, 'created');
+dart.setSignature(html$.EmbedElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.EmbedElement, []),
+    new: dart.definiteFunctionType(html$.EmbedElement, []),
+    created: dart.definiteFunctionType(html$.EmbedElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: core.String,
+    [dartx.name]: core.String,
+    [dartx.src]: core.String,
+    [dartx.type]: core.String,
+    [dartx.width]: core.String
+  }),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
+html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
+html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
+html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
+dart.defineExtensionNames([
+  'colno',
+  'error',
+  'filename',
+  'lineno',
+  'message'
+]);
+html$.ErrorEvent = class ErrorEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ErrorEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ErrorEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ErrorEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ErrorEvent(type);
+  }
+  get [dartx.colno]() {
+    return this.colno;
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.filename]() {
+    return this.filename;
+  }
+  get [dartx.lineno]() {
+    return this.lineno;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+};
+dart.setSignature(html$.ErrorEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ErrorEvent, []),
+    new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.colno]: core.int,
+    [dartx.error]: core.Object,
+    [dartx.filename]: core.String,
+    [dartx.lineno]: core.int,
+    [dartx.message]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
+dart.defineExtensionNames([
+  'close',
+  'onError',
+  'onMessage',
+  'onOpen',
+  'readyState',
+  'url',
+  'withCredentials'
+]);
+html$.EventSource = class EventSource extends html$.EventTarget {
+  static new(url, opts) {
+    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
+    let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
+    return html$.EventSource._factoryEventSource(url, parsedOptions);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static _factoryEventSource(url, eventSourceInitDict) {
+    if (eventSourceInitDict === void 0) eventSourceInitDict = null;
+    if (eventSourceInitDict != null) {
+      let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
+      return html$.EventSource._create_1(url, eventSourceInitDict_1);
+    }
+    return html$.EventSource._create_2(url);
+  }
+  static _create_1(url, eventSourceInitDict) {
+    return new self.EventSource(url, eventSourceInitDict);
+  }
+  static _create_2(url) {
+    return new self.EventSource(url);
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+  get [dartx.withCredentials]() {
+    return this.withCredentials;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  get [dartx.onError]() {
+    return html$.EventSource.errorEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.EventSource.messageEvent.forTarget(this);
+  }
+  get [dartx.onOpen]() {
+    return html$.EventSource.openEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.EventSource, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
+    _: dart.definiteFunctionType(html$.EventSource, [])
+  }),
+  fields: () => ({
+    [dartx.readyState]: core.int,
+    [dartx.url]: core.String,
+    [dartx.withCredentials]: core.bool
+  }),
+  getters: () => ({
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
+  sfields: () => ({
+    errorEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    openEvent: EventStreamProviderOfEvent(),
+    CLOSED: core.int,
+    CONNECTING: core.int,
+    OPEN: core.int
+  }),
+  statics: () => ({
+    _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
+    _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
+  }),
+  names: ['_factoryEventSource', '_create_1', '_create_2']
+});
+html$.EventSource.CLOSED = 2;
+html$.EventSource.CONNECTING = 0;
+html$.EventSource.OPEN = 1;
+dart.defineLazy(html$.EventSource, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get openEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('open'));
+  }
+});
+dart.registerExtension(dart.global.EventSource, html$.EventSource);
+const _ptr = Symbol('_ptr');
+html$.Events = class Events extends core.Object {
+  new(ptr) {
+    this[_ptr] = ptr;
+  }
+  _get(type) {
+    return new (_EventStreamOfEvent())(this[_ptr], type, false);
+  }
+};
+dart.setSignature(html$.Events, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
+  fields: () => ({[_ptr]: html$.EventTarget}),
+  methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
+});
+html$.ElementEvents = class ElementEvents extends html$.Events {
+  new(ptr) {
+    super.new(ptr);
+  }
+  _get(type) {
+    if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
+      if (dart.test(html_common.Device.isWebKit)) {
+        return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
+      }
+    }
+    return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
+  }
+};
+dart.setSignature(html$.ElementEvents, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
+  sfields: () => ({webkitEvents: MapOfString$String()})
+});
+dart.defineLazy(html$.ElementEvents, {
+  get webkitEvents() {
+    return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
+  }
+});
+dart.defineExtensionNames([
+  'waitUntil'
+]);
+html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ExtendableEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ExtendableEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ExtendableEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ExtendableEvent(type);
+  }
+  [dartx.waitUntil](...args) {
+    return this.waitUntil.apply(this, args);
+  }
+};
+dart.setSignature(html$.ExtendableEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ExtendableEvent, []),
+    new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
+  }),
+  methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
+dart.defineExtensionNames([
+  'protocol',
+  'provider'
+]);
+html$.FederatedCredential = class FederatedCredential extends html$.Credential {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(data) {
+    let data_1 = html_common.convertDartToNative_Dictionary(data);
+    return html$.FederatedCredential._create_1(data_1);
+  }
+  static _create_1(data) {
+    return new self.FederatedCredential(data);
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  get [dartx.provider]() {
+    return this.provider;
+  }
+};
+dart.setSignature(html$.FederatedCredential, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FederatedCredential, []),
+    new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
+  }),
+  fields: () => ({
+    [dartx.protocol]: core.String,
+    [dartx.provider]: core.String
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
+dart.defineExtensionNames([
+  'respondWith',
+  'isReload',
+  'request'
+]);
+html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.FetchEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.FetchEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.FetchEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.FetchEvent(type);
+  }
+  get [dartx.isReload]() {
+    return this.isReload;
+  }
+  get [dartx.request]() {
+    return this.request;
+  }
+  [dartx.respondWith](...args) {
+    return this.respondWith.apply(this, args);
+  }
+};
+dart.setSignature(html$.FetchEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FetchEvent, []),
+    new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.isReload]: core.bool,
+    [dartx.request]: html$._Request
+  }),
+  methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'setCustomValidity',
+  'disabled',
+  'elements',
+  'form',
+  'name',
+  'type',
+  'validationMessage',
+  'validity',
+  'willValidate'
+]);
+html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
+  }
+  created() {
+    this[dartx.disabled] = null;
+    this[dartx.elements] = null;
+    this[dartx.form] = null;
+    this[dartx.name] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.elements]() {
+    return this.elements;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.FieldSetElement, 'created');
+dart.setSignature(html$.FieldSetElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FieldSetElement, []),
+    new: dart.definiteFunctionType(html$.FieldSetElement, []),
+    created: dart.definiteFunctionType(html$.FieldSetElement, [])
+  }),
+  fields: () => ({
+    [dartx.disabled]: core.bool,
+    [dartx.elements]: html$.HtmlFormControlsCollection,
+    [dartx.form]: html$.FormElement,
+    [dartx.name]: core.String,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.willValidate]: core.bool
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
+const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
+dart.defineExtensionNames([
+  'lastModifiedDate',
+  'lastModified',
+  'name',
+  'relativePath'
+]);
+html$.File = class File extends html$.Blob {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(fileBits, fileName, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return html$.File._create_1(fileBits, fileName, options_1);
+    }
+    return html$.File._create_2(fileBits, fileName);
+  }
+  static _create_1(fileBits, fileName, options) {
+    return new self.File(fileBits, fileName, options);
+  }
+  static _create_2(fileBits, fileName) {
+    return new self.File(fileBits, fileName);
+  }
+  get [dartx.lastModified]() {
+    return this.lastModified;
+  }
+  get [dartx.lastModifiedDate]() {
+    return html_common.convertNativeToDart_DateTime(this[_get_lastModifiedDate]);
+  }
+  get [_get_lastModifiedDate]() {
+    return this.lastModifiedDate;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.relativePath]() {
+    return this.webkitRelativePath;
+  }
+};
+dart.setSignature(html$.File, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.File, []),
+    new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.lastModified]: core.int,
+    [_get_lastModifiedDate]: dart.dynamic,
+    [dartx.name]: core.String,
+    [dartx.relativePath]: core.String
+  }),
+  getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.File, html$.File);
+html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
+const _createWriter = Symbol('_createWriter');
+const _file$ = Symbol('_file');
+dart.defineExtensionNames([
+  'createWriter',
+  'file'
+]);
+html$.FileEntry = class FileEntry extends html$.Entry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_createWriter](...args) {
+    return this.createWriter.apply(this, args);
+  }
+  [dartx.createWriter]() {
+    let completer = CompleterOfFileWriter().new();
+    this[_createWriter](dart.fn(value => {
+      completer.complete(value);
+    }, FileWriterToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [_file$](...args) {
+    return this.file.apply(this, args);
+  }
+  [dartx.file]() {
+    let completer = CompleterOfFile$().new();
+    this[_file$](dart.fn(value => {
+      completer.complete(value);
+    }, FileToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+};
+dart.setSignature(html$.FileEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
+  methods: () => ({
+    [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
+    [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
+    [_file$]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
+    [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
+  })
+});
+dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
+dart.defineExtensionNames([
+  'code'
+]);
+html$.FileError = class FileError extends html$.DomError {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+};
+dart.setSignature(html$.FileError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
+  fields: () => ({[dartx.code]: core.int}),
+  sfields: () => ({
+    ABORT_ERR: core.int,
+    ENCODING_ERR: core.int,
+    INVALID_MODIFICATION_ERR: core.int,
+    INVALID_STATE_ERR: core.int,
+    NOT_FOUND_ERR: core.int,
+    NOT_READABLE_ERR: core.int,
+    NO_MODIFICATION_ALLOWED_ERR: core.int,
+    PATH_EXISTS_ERR: core.int,
+    QUOTA_EXCEEDED_ERR: core.int,
+    SECURITY_ERR: core.int,
+    SYNTAX_ERR: core.int,
+    TYPE_MISMATCH_ERR: core.int
+  })
+});
+html$.FileError.ABORT_ERR = 3;
+html$.FileError.ENCODING_ERR = 5;
+html$.FileError.INVALID_MODIFICATION_ERR = 9;
+html$.FileError.INVALID_STATE_ERR = 7;
+html$.FileError.NOT_FOUND_ERR = 1;
+html$.FileError.NOT_READABLE_ERR = 4;
+html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+html$.FileError.PATH_EXISTS_ERR = 12;
+html$.FileError.QUOTA_EXCEEDED_ERR = 10;
+html$.FileError.SECURITY_ERR = 2;
+html$.FileError.SYNTAX_ERR = 8;
+html$.FileError.TYPE_MISMATCH_ERR = 11;
+dart.registerExtension(dart.global.FileError, html$.FileError);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
+dart.setSignature(html$.FileList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
+    [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
+  })
+});
+dart.registerExtension(dart.global.FileList, html$.FileList);
+dart.defineExtensionNames([
+  'result',
+  'abort',
+  'readAsArrayBuffer',
+  'readAsDataUrl',
+  'readAsText',
+  'onAbort',
+  'onError',
+  'onLoad',
+  'onLoadEnd',
+  'onLoadStart',
+  'onProgress',
+  'error',
+  'readyState'
+]);
+html$.FileReader = class FileReader extends html$.EventTarget {
+  get [dartx.result]() {
+    let res = this.result;
+    if (typed_data.ByteBuffer.is(res)) {
+      return typed_data.Uint8List.view(res);
+    }
+    return res;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.FileReader._create_1();
+  }
+  static _create_1() {
+    return new self.FileReader();
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.readAsArrayBuffer](...args) {
+    return this.readAsArrayBuffer.apply(this, args);
+  }
+  [dartx.readAsDataUrl](...args) {
+    return this.readAsDataURL.apply(this, args);
+  }
+  [dartx.readAsText](...args) {
+    return this.readAsText.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return html$.FileReader.abortEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.FileReader.errorEvent.forTarget(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.FileReader.loadEvent.forTarget(this);
+  }
+  get [dartx.onLoadEnd]() {
+    return html$.FileReader.loadEndEvent.forTarget(this);
+  }
+  get [dartx.onLoadStart]() {
+    return html$.FileReader.loadStartEvent.forTarget(this);
+  }
+  get [dartx.onProgress]() {
+    return html$.FileReader.progressEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.FileReader, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FileReader, []),
+    new: dart.definiteFunctionType(html$.FileReader, [])
+  }),
+  fields: () => ({
+    [dartx.error]: html$.FileError,
+    [dartx.readyState]: core.int
+  }),
+  getters: () => ({
+    [dartx.result]: dart.definiteFunctionType(core.Object, []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfProgressEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    loadEvent: EventStreamProviderOfProgressEvent(),
+    loadEndEvent: EventStreamProviderOfProgressEvent(),
+    loadStartEvent: EventStreamProviderOfProgressEvent(),
+    progressEvent: EventStreamProviderOfProgressEvent(),
+    DONE: core.int,
+    EMPTY: core.int,
+    LOADING: core.int
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
+  names: ['_create_1']
+});
+html$.FileReader.DONE = 2;
+html$.FileReader.EMPTY = 0;
+html$.FileReader.LOADING = 1;
+dart.defineLazy(html$.FileReader, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
+  },
+  get loadEndEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
+  },
+  get loadStartEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
+  },
+  get progressEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
+  }
+});
+dart.registerExtension(dart.global.FileReader, html$.FileReader);
+dart.defineExtensionNames([
+  'type'
+]);
+html$.FileStream = class FileStream extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.FileStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
+  fields: () => ({[dartx.type]: core.String})
+});
+dart.registerExtension(dart.global.Stream, html$.FileStream);
+dart.defineExtensionNames([
+  'name',
+  'root'
+]);
+html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!window.webkitRequestFileSystem;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.root]() {
+    return this.root;
+  }
+};
+dart.setSignature(html$.FileSystem, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
+  fields: () => ({
+    [dartx.name]: core.String,
+    [dartx.root]: html$.DirectoryEntry
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
+html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
+dart.defineExtensionNames([
+  'abort',
+  'seek',
+  'truncate',
+  'write',
+  'onAbort',
+  'onError',
+  'onProgress',
+  'onWrite',
+  'onWriteEnd',
+  'onWriteStart',
+  'error',
+  'length',
+  'position',
+  'readyState'
+]);
+html$.FileWriter = class FileWriter extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.position]() {
+    return this.position;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.seek](...args) {
+    return this.seek.apply(this, args);
+  }
+  [dartx.truncate](...args) {
+    return this.truncate.apply(this, args);
+  }
+  [dartx.write](...args) {
+    return this.write.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return html$.FileWriter.abortEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.FileWriter.errorEvent.forTarget(this);
+  }
+  get [dartx.onProgress]() {
+    return html$.FileWriter.progressEvent.forTarget(this);
+  }
+  get [dartx.onWrite]() {
+    return html$.FileWriter.writeEvent.forTarget(this);
+  }
+  get [dartx.onWriteEnd]() {
+    return html$.FileWriter.writeEndEvent.forTarget(this);
+  }
+  get [dartx.onWriteStart]() {
+    return html$.FileWriter.writeStartEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.FileWriter, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
+  fields: () => ({
+    [dartx.error]: html$.FileError,
+    [dartx.length]: core.int,
+    [dartx.position]: core.int,
+    [dartx.readyState]: core.int
+  }),
+  getters: () => ({
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfProgressEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    progressEvent: EventStreamProviderOfProgressEvent(),
+    writeEvent: EventStreamProviderOfProgressEvent(),
+    writeEndEvent: EventStreamProviderOfProgressEvent(),
+    writeStartEvent: EventStreamProviderOfProgressEvent(),
+    DONE: core.int,
+    INIT: core.int,
+    WRITING: core.int
+  })
+});
+html$.FileWriter.DONE = 2;
+html$.FileWriter.INIT = 0;
+html$.FileWriter.WRITING = 1;
+dart.defineLazy(html$.FileWriter, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get progressEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
+  },
+  get writeEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('write'));
+  },
+  get writeEndEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('writeend'));
+  },
+  get writeStartEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
+  }
+});
+dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
+html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
+const _get_relatedTarget = Symbol('_get_relatedTarget');
+dart.defineExtensionNames([
+  'relatedTarget'
+]);
+html$.FocusEvent = class FocusEvent extends html$.UIEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.FocusEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.FocusEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.FocusEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.FocusEvent(type);
+  }
+  get [dartx.relatedTarget]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+  }
+  get [_get_relatedTarget]() {
+    return this.relatedTarget;
+  }
+};
+dart.setSignature(html$.FocusEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FocusEvent, []),
+    new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[_get_relatedTarget]: dart.dynamic}),
+  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
+dart.defineExtensionNames([
+  'load',
+  'family',
+  'featureSettings',
+  'loaded',
+  'status',
+  'stretch',
+  'style',
+  'unicodeRange',
+  'variant',
+  'weight'
+]);
+html$.FontFace = class FontFace extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(family, source, descriptors) {
+    if (descriptors === void 0) descriptors = null;
+    if (descriptors != null) {
+      let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
+      return html$.FontFace._create_1(family, source, descriptors_1);
+    }
+    return html$.FontFace._create_2(family, source);
+  }
+  static _create_1(family, source, descriptors) {
+    return new self.FontFace(family, source, descriptors);
+  }
+  static _create_2(family, source) {
+    return new self.FontFace(family, source);
+  }
+  get [dartx.family]() {
+    return this.family;
+  }
+  set [dartx.family](value) {
+    this.family = value;
+  }
+  get [dartx.featureSettings]() {
+    return this.featureSettings;
+  }
+  set [dartx.featureSettings](value) {
+    this.featureSettings = value;
+  }
+  get [dartx.loaded]() {
+    return this.loaded;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  get [dartx.stretch]() {
+    return this.stretch;
+  }
+  set [dartx.stretch](value) {
+    this.stretch = value;
+  }
+  get [dartx.style]() {
+    return this.style;
+  }
+  set [dartx.style](value) {
+    this.style = value;
+  }
+  get [dartx.unicodeRange]() {
+    return this.unicodeRange;
+  }
+  set [dartx.unicodeRange](value) {
+    this.unicodeRange = value;
+  }
+  get [dartx.variant]() {
+    return this.variant;
+  }
+  set [dartx.variant](value) {
+    this.variant = value;
+  }
+  get [dartx.weight]() {
+    return this.weight;
+  }
+  set [dartx.weight](value) {
+    this.weight = value;
+  }
+  [dartx.load](...args) {
+    return this.load.apply(this, args);
+  }
+};
+dart.setSignature(html$.FontFace, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FontFace, []),
+    new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.family]: core.String,
+    [dartx.featureSettings]: core.String,
+    [dartx.loaded]: async.Future,
+    [dartx.status]: core.String,
+    [dartx.stretch]: core.String,
+    [dartx.style]: core.String,
+    [dartx.unicodeRange]: core.String,
+    [dartx.variant]: core.String,
+    [dartx.weight]: core.String
+  }),
+  methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.FontFace, html$.FontFace);
+dart.defineExtensionNames([
+  'add',
+  'check',
+  'clear',
+  'delete',
+  'forEach',
+  'has',
+  'size',
+  'status'
+]);
+html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  [dartx.add](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.check](...args) {
+    return this.check.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.delete](...args) {
+    return this.delete.apply(this, args);
+  }
+  [dartx.forEach](...args) {
+    return this.forEach.apply(this, args);
+  }
+  [dartx.has](...args) {
+    return this.has.apply(this, args);
+  }
+};
+dart.setSignature(html$.FontFaceSet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
+  fields: () => ({
+    [dartx.size]: core.int,
+    [dartx.status]: core.String
+  }),
+  methods: () => ({
+    [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
+    [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
+    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
+    [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
+    [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
+    [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
+  })
+});
+dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
+html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
+dart.defineExtensionNames([
+  'fontfaces'
+]);
+html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.fontfaces]() {
+    return this.fontfaces;
+  }
+};
+dart.setSignature(html$.FontFaceSetLoadEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
+  fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
+});
+dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
+dart.defineExtensionNames([
+  'append',
+  'appendBlob',
+  'delete',
+  'get',
+  'getAll',
+  'has',
+  'set'
+]);
+html$.FormData = class FormData extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(form) {
+    if (form === void 0) form = null;
+    if (form != null) {
+      return html$.FormData._create_1(form);
+    }
+    return html$.FormData._create_2();
+  }
+  static _create_1(form) {
+    return new self.FormData(form);
+  }
+  static _create_2() {
+    return new self.FormData();
+  }
+  static get supported() {
+    return !!window.FormData;
+  }
+  [dartx.append](...args) {
+    return this.append.apply(this, args);
+  }
+  [dartx.appendBlob](...args) {
+    return this.append.apply(this, args);
+  }
+  [dartx.delete](...args) {
+    return this.delete.apply(this, args);
+  }
+  [dartx.get](...args) {
+    return this.get.apply(this, args);
+  }
+  [dartx.getAll](...args) {
+    return this.getAll.apply(this, args);
+  }
+  [dartx.has](...args) {
+    return this.has.apply(this, args);
+  }
+  [dartx.set](...args) {
+    return this.set.apply(this, args);
+  }
+};
+dart.setSignature(html$.FormData, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FormData, []),
+    new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
+  }),
+  methods: () => ({
+    [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
+    [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
+    [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
+    [dartx.has]: dart.definiteFunctionType(core.bool, [core.String]),
+    [dartx.set]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic], [core.String])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FormData, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.FormData, html$.FormData);
+const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
+dart.defineExtensionNames([
+  'checkValidity',
+  'item',
+  'reportValidity',
+  'requestAutocomplete',
+  'reset',
+  'submit',
+  'acceptCharset',
+  'action',
+  'autocomplete',
+  'encoding',
+  'enctype',
+  'length',
+  'method',
+  'name',
+  'noValidate',
+  'target'
+]);
+html$.FormElement = class FormElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.FormElement._check(html$.document[dartx.createElement]("form"));
+  }
+  created() {
+    this[dartx.acceptCharset] = null;
+    this[dartx.action] = null;
+    this[dartx.autocomplete] = null;
+    this[dartx.encoding] = null;
+    this[dartx.enctype] = null;
+    this[dartx.length] = null;
+    this[dartx.method] = null;
+    this[dartx.name] = null;
+    this[dartx.noValidate] = null;
+    this[dartx.target] = null;
+    super.created();
+  }
+  get [dartx.acceptCharset]() {
+    return this.acceptCharset;
+  }
+  set [dartx.acceptCharset](value) {
+    this.acceptCharset = value;
+  }
+  get [dartx.action]() {
+    return this.action;
+  }
+  set [dartx.action](value) {
+    this.action = value;
+  }
+  get [dartx.autocomplete]() {
+    return this.autocomplete;
+  }
+  set [dartx.autocomplete](value) {
+    this.autocomplete = value;
+  }
+  get [dartx.encoding]() {
+    return this.encoding;
+  }
+  set [dartx.encoding](value) {
+    this.encoding = value;
+  }
+  get [dartx.enctype]() {
+    return this.enctype;
+  }
+  set [dartx.enctype](value) {
+    this.enctype = value;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.method]() {
+    return this.method;
+  }
+  set [dartx.method](value) {
+    this.method = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.noValidate]() {
+    return this.noValidate;
+  }
+  set [dartx.noValidate](value) {
+    this.noValidate = value;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  set [dartx.target](value) {
+    this.target = value;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.requestAutocomplete](details) {
+    let details_1 = html_common.convertDartToNative_Dictionary(details);
+    this[_requestAutocomplete_1](details_1);
+    return;
+  }
+  [_requestAutocomplete_1](...args) {
+    return this.requestAutocomplete.apply(this, args);
+  }
+  [dartx.reset](...args) {
+    return this.reset.apply(this, args);
+  }
+  [dartx.submit](...args) {
+    return this.submit.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.FormElement, 'created');
+dart.setSignature(html$.FormElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.FormElement, []),
+    new: dart.definiteFunctionType(html$.FormElement, []),
+    created: dart.definiteFunctionType(html$.FormElement, [])
+  }),
+  fields: () => ({
+    [dartx.acceptCharset]: core.String,
+    [dartx.action]: core.String,
+    [dartx.autocomplete]: core.String,
+    [dartx.encoding]: core.String,
+    [dartx.enctype]: core.String,
+    [dartx.length]: core.int,
+    [dartx.method]: core.String,
+    [dartx.name]: core.String,
+    [dartx.noValidate]: core.bool,
+    [dartx.target]: core.String
+  }),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
+    [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.reset]: dart.definiteFunctionType(dart.void, []),
+    [dartx.submit]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
+html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
+dart.defineExtensionNames([
+  'axes',
+  'buttons',
+  'connected',
+  'id',
+  'index',
+  'mapping',
+  'timestamp'
+]);
+html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.axes]() {
+    return this.axes;
+  }
+  get [dartx.buttons]() {
+    return this.buttons;
+  }
+  get [dartx.connected]() {
+    return this.connected;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.index]() {
+    return this.index;
+  }
+  get [dartx.mapping]() {
+    return this.mapping;
+  }
+  get [dartx.timestamp]() {
+    return this.timestamp;
+  }
+};
+dart.setSignature(html$.Gamepad, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
+  fields: () => ({
+    [dartx.axes]: ListOfnum(),
+    [dartx.buttons]: ListOfGamepadButton(),
+    [dartx.connected]: core.bool,
+    [dartx.id]: core.String,
+    [dartx.index]: core.int,
+    [dartx.mapping]: core.String,
+    [dartx.timestamp]: core.int
+  })
+});
+dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
+dart.defineExtensionNames([
+  'pressed',
+  'value'
+]);
+html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.pressed]() {
+    return this.pressed;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+};
+dart.setSignature(html$.GamepadButton, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
+  fields: () => ({
+    [dartx.pressed]: core.bool,
+    [dartx.value]: core.double
+  })
+});
+dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
+dart.defineExtensionNames([
+  'gamepad'
+]);
+html$.GamepadEvent = class GamepadEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.GamepadEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.GamepadEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.GamepadEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.GamepadEvent(type);
+  }
+  get [dartx.gamepad]() {
+    return this.gamepad;
+  }
+};
+dart.setSignature(html$.GamepadEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.GamepadEvent, []),
+    new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.gamepad]: html$.Gamepad}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
+dart.defineExtensionNames([
+  'getRegisteredRegions',
+  'registerRegion',
+  'unregisterRegion'
+]);
+html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getRegisteredRegions](...args) {
+    return this.getRegisteredRegions.apply(this, args);
+  }
+  [dartx.registerRegion](...args) {
+    return this.registerRegion.apply(this, args);
+  }
+  [dartx.unregisterRegion](...args) {
+    return this.unregisterRegion.apply(this, args);
+  }
+};
+dart.setSignature(html$.Geofencing, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
+  methods: () => ({
+    [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
+    [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
+    [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
+  })
+});
+dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
+dart.defineExtensionNames([
+  'id',
+  'region'
+]);
+html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.region]() {
+    return this.region;
+  }
+};
+dart.setSignature(html$.GeofencingEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
+  fields: () => ({
+    [dartx.id]: core.String,
+    [dartx.region]: html$.GeofencingRegion
+  })
+});
+dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
+const _getCurrentPosition = Symbol('_getCurrentPosition');
+const _ensurePosition = Symbol('_ensurePosition');
+const _watchPosition = Symbol('_watchPosition');
+const _clearWatch = Symbol('_clearWatch');
+const _getCurrentPosition_1 = Symbol('_getCurrentPosition_1');
+const _getCurrentPosition_2 = Symbol('_getCurrentPosition_2');
+const _getCurrentPosition_3 = Symbol('_getCurrentPosition_3');
+const _watchPosition_1 = Symbol('_watchPosition_1');
+const _watchPosition_2 = Symbol('_watchPosition_2');
+const _watchPosition_3 = Symbol('_watchPosition_3');
+dart.defineExtensionNames([
+  'getCurrentPosition',
+  'watchPosition'
+]);
+html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
+  [dartx.getCurrentPosition](opts) {
+    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
+    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
+    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
+    let options = dart.map();
+    if (enableHighAccuracy != null) {
+      options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
+    }
+    if (timeout != null) {
+      options[dartx._set]('timeout', timeout.inMilliseconds);
+    }
+    if (maximumAge != null) {
+      options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
+    }
+    let completer = CompleterOfGeoposition().new();
+    try {
+      this[_getCurrentPosition](dart.fn(position => {
+        completer.complete(this[_ensurePosition](position));
+      }, GeopositionToNull()), dart.fn(error => {
+        completer.completeError(error);
+      }, PositionErrorToNull()), options);
+    } catch (e) {
+      let stacktrace = dart.stackTrace(e);
+      completer.completeError(e, stacktrace);
+    }
+
+    return completer.future;
+  }
+  [dartx.watchPosition](opts) {
+    let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
+    let timeout = opts && 'timeout' in opts ? opts.timeout : null;
+    let maximumAge = opts && 'maximumAge' in opts ? opts.maximumAge : null;
+    let options = dart.map();
+    if (enableHighAccuracy != null) {
+      options[dartx._set]('enableHighAccuracy', enableHighAccuracy);
+    }
+    if (timeout != null) {
+      options[dartx._set]('timeout', timeout.inMilliseconds);
+    }
+    if (maximumAge != null) {
+      options[dartx._set]('maximumAge', maximumAge.inMilliseconds);
+    }
+    let watchId = null;
+    let controller = null;
+    controller = StreamControllerOfGeoposition().new({sync: true, onListen: dart.fn(() => {
+        dart.assert(watchId == null);
+        watchId = this[_watchPosition](dart.fn(position => {
+          controller.add(this[_ensurePosition](position));
+        }, GeopositionToNull()), dart.fn(error => {
+          controller.addError(error);
+        }, PositionErrorToNull()), options);
+      }, VoidToNull()), onCancel: dart.fn(() => {
+        dart.assert(watchId != null);
+        this[_clearWatch](watchId);
+      }, VoidToNull())});
+    return controller.stream;
+  }
+  [_ensurePosition](domPosition) {
+    try {
+      if (html$.Geoposition.is(domPosition)) {
+        return domPosition;
+      }
+    } catch (e) {
+    }
+
+    return new html$._GeopositionWrapper(domPosition);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_clearWatch](...args) {
+    return this.clearWatch.apply(this, args);
+  }
+  [_getCurrentPosition](successCallback, errorCallback, options) {
+    if (errorCallback === void 0) errorCallback = null;
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      this[_getCurrentPosition_1](successCallback, errorCallback, options_1);
+      return;
+    }
+    if (errorCallback != null) {
+      this[_getCurrentPosition_2](successCallback, errorCallback);
+      return;
+    }
+    this[_getCurrentPosition_3](successCallback);
+    return;
+  }
+  [_getCurrentPosition_1](...args) {
+    return this.getCurrentPosition.apply(this, args);
+  }
+  [_getCurrentPosition_2](...args) {
+    return this.getCurrentPosition.apply(this, args);
+  }
+  [_getCurrentPosition_3](...args) {
+    return this.getCurrentPosition.apply(this, args);
+  }
+  [_watchPosition](successCallback, errorCallback, options) {
+    if (errorCallback === void 0) errorCallback = null;
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_watchPosition_1](successCallback, errorCallback, options_1);
+    }
+    if (errorCallback != null) {
+      return this[_watchPosition_2](successCallback, errorCallback);
+    }
+    return this[_watchPosition_3](successCallback);
+  }
+  [_watchPosition_1](...args) {
+    return this.watchPosition.apply(this, args);
+  }
+  [_watchPosition_2](...args) {
+    return this.watchPosition.apply(this, args);
+  }
+  [_watchPosition_3](...args) {
+    return this.watchPosition.apply(this, args);
+  }
+};
+dart.setSignature(html$.Geolocation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
+  methods: () => ({
+    [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
+    [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
+    [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
+    [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
+    [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
+    [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
+    [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
+    [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
+    [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
+    [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
+    [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
+  })
+});
+dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
+html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
+  new(ptr) {
+    this[_ptr] = ptr;
+  }
+  get coords() {
+    return this[_ptr].coords;
+  }
+  get timestamp() {
+    return this[_ptr].timestamp;
+  }
+};
+html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
+dart.setSignature(html$._GeopositionWrapper, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
+  fields: () => ({[_ptr]: dart.dynamic}),
+  getters: () => ({
+    coords: dart.definiteFunctionType(html$.Coordinates, []),
+    timestamp: dart.definiteFunctionType(core.int, [])
+  })
+});
+dart.defineExtensionNames([
+  'coords',
+  'timestamp'
+]);
+html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.coords]() {
+    return this.coords;
+  }
+  get [dartx.timestamp]() {
+    return this.timestamp;
+  }
+};
+dart.setSignature(html$.Geoposition, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
+  fields: () => ({
+    [dartx.coords]: html$.Coordinates,
+    [dartx.timestamp]: core.int
+  })
+});
+dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
+dart.defineExtensionNames([
+  'onAbort',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onDoubleClick',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onRateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onStalled',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onVolumeChange',
+  'onWaiting'
+]);
+html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get onAbort() {
+    return html$.GlobalEventHandlers.abortEvent.forTarget(this);
+  }
+  get onBlur() {
+    return html$.GlobalEventHandlers.blurEvent.forTarget(this);
+  }
+  get onCanPlay() {
+    return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
+  }
+  get onCanPlayThrough() {
+    return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
+  }
+  get onChange() {
+    return html$.GlobalEventHandlers.changeEvent.forTarget(this);
+  }
+  get onClick() {
+    return html$.GlobalEventHandlers.clickEvent.forTarget(this);
+  }
+  get onContextMenu() {
+    return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
+  }
+  get onDoubleClick() {
+    return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
+  }
+  get onDrag() {
+    return html$.GlobalEventHandlers.dragEvent.forTarget(this);
+  }
+  get onDragEnd() {
+    return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
+  }
+  get onDragEnter() {
+    return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
+  }
+  get onDragLeave() {
+    return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
+  }
+  get onDragOver() {
+    return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
+  }
+  get onDragStart() {
+    return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
+  }
+  get onDrop() {
+    return html$.GlobalEventHandlers.dropEvent.forTarget(this);
+  }
+  get onDurationChange() {
+    return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
+  }
+  get onEmptied() {
+    return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
+  }
+  get onEnded() {
+    return html$.GlobalEventHandlers.endedEvent.forTarget(this);
+  }
+  get onError() {
+    return html$.GlobalEventHandlers.errorEvent.forTarget(this);
+  }
+  get onFocus() {
+    return html$.GlobalEventHandlers.focusEvent.forTarget(this);
+  }
+  get onInput() {
+    return html$.GlobalEventHandlers.inputEvent.forTarget(this);
+  }
+  get onInvalid() {
+    return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
+  }
+  get onKeyDown() {
+    return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
+  }
+  get onKeyPress() {
+    return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
+  }
+  get onKeyUp() {
+    return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
+  }
+  get onLoad() {
+    return html$.GlobalEventHandlers.loadEvent.forTarget(this);
+  }
+  get onLoadedData() {
+    return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
+  }
+  get onLoadedMetadata() {
+    return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
+  }
+  get onMouseDown() {
+    return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
+  }
+  get onMouseEnter() {
+    return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
+  }
+  get onMouseLeave() {
+    return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
+  }
+  get onMouseMove() {
+    return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
+  }
+  get onMouseOut() {
+    return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
+  }
+  get onMouseOver() {
+    return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
+  }
+  get onMouseUp() {
+    return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
+  }
+  get onMouseWheel() {
+    return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
+  }
+  get onPause() {
+    return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
+  }
+  get onPlay() {
+    return html$.GlobalEventHandlers.playEvent.forTarget(this);
+  }
+  get onPlaying() {
+    return html$.GlobalEventHandlers.playingEvent.forTarget(this);
+  }
+  get onRateChange() {
+    return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
+  }
+  get onReset() {
+    return html$.GlobalEventHandlers.resetEvent.forTarget(this);
+  }
+  get onResize() {
+    return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
+  }
+  get onScroll() {
+    return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
+  }
+  get onSeeked() {
+    return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
+  }
+  get onSeeking() {
+    return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
+  }
+  get onSelect() {
+    return html$.GlobalEventHandlers.selectEvent.forTarget(this);
+  }
+  get onStalled() {
+    return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
+  }
+  get onSubmit() {
+    return html$.GlobalEventHandlers.submitEvent.forTarget(this);
+  }
+  get onSuspend() {
+    return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
+  }
+  get onTimeUpdate() {
+    return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
+  }
+  get onVolumeChange() {
+    return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
+  }
+  get onWaiting() {
+    return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
+  }
+};
+html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
+dart.setSignature(html$.GlobalEventHandlers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
+  getters: () => ({
+    onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfEvent(),
+    blurEvent: EventStreamProviderOfEvent(),
+    canPlayEvent: EventStreamProviderOfEvent(),
+    canPlayThroughEvent: EventStreamProviderOfEvent(),
+    changeEvent: EventStreamProviderOfEvent(),
+    clickEvent: EventStreamProviderOfMouseEvent(),
+    contextMenuEvent: EventStreamProviderOfMouseEvent(),
+    doubleClickEvent: EventStreamProviderOfEvent(),
+    dragEvent: EventStreamProviderOfMouseEvent(),
+    dragEndEvent: EventStreamProviderOfMouseEvent(),
+    dragEnterEvent: EventStreamProviderOfMouseEvent(),
+    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
+    dragOverEvent: EventStreamProviderOfMouseEvent(),
+    dragStartEvent: EventStreamProviderOfMouseEvent(),
+    dropEvent: EventStreamProviderOfMouseEvent(),
+    durationChangeEvent: EventStreamProviderOfEvent(),
+    emptiedEvent: EventStreamProviderOfEvent(),
+    endedEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    focusEvent: EventStreamProviderOfEvent(),
+    inputEvent: EventStreamProviderOfEvent(),
+    invalidEvent: EventStreamProviderOfEvent(),
+    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
+    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
+    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
+    loadEvent: EventStreamProviderOfEvent(),
+    loadedDataEvent: EventStreamProviderOfEvent(),
+    loadedMetadataEvent: EventStreamProviderOfEvent(),
+    mouseDownEvent: EventStreamProviderOfMouseEvent(),
+    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
+    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
+    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
+    mouseOutEvent: EventStreamProviderOfMouseEvent(),
+    mouseOverEvent: EventStreamProviderOfMouseEvent(),
+    mouseUpEvent: EventStreamProviderOfMouseEvent(),
+    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
+    pauseEvent: EventStreamProviderOfEvent(),
+    playEvent: EventStreamProviderOfEvent(),
+    playingEvent: EventStreamProviderOfEvent(),
+    rateChangeEvent: EventStreamProviderOfEvent(),
+    resetEvent: EventStreamProviderOfEvent(),
+    resizeEvent: EventStreamProviderOfEvent(),
+    scrollEvent: EventStreamProviderOfEvent(),
+    seekedEvent: EventStreamProviderOfEvent(),
+    seekingEvent: EventStreamProviderOfEvent(),
+    selectEvent: EventStreamProviderOfEvent(),
+    stalledEvent: EventStreamProviderOfEvent(),
+    submitEvent: EventStreamProviderOfEvent(),
+    suspendEvent: EventStreamProviderOfEvent(),
+    timeUpdateEvent: EventStreamProviderOfEvent(),
+    volumeChangeEvent: EventStreamProviderOfEvent(),
+    waitingEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineExtensionMembers(html$.GlobalEventHandlers, [
+  'onAbort',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onDoubleClick',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onRateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onStalled',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onVolumeChange',
+  'onWaiting'
+]);
+dart.defineLazy(html$.GlobalEventHandlers, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('abort'));
+  },
+  get blurEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('blur'));
+  },
+  get canPlayEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
+  },
+  get canPlayThroughEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
+  },
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  },
+  get clickEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
+  },
+  get contextMenuEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
+  },
+  get doubleClickEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
+  },
+  get dragEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
+  },
+  get dragEndEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
+  },
+  get dragEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
+  },
+  get dragLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
+  },
+  get dragOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
+  },
+  get dragStartEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
+  },
+  get dropEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
+  },
+  get durationChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
+  },
+  get emptiedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
+  },
+  get endedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ended'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get focusEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('focus'));
+  },
+  get inputEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('input'));
+  },
+  get invalidEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
+  },
+  get keyDownEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
+  },
+  get keyPressEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
+  },
+  get keyUpEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('load'));
+  },
+  get loadedDataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
+  },
+  get loadedMetadataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
+  },
+  get mouseDownEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
+  },
+  get mouseEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
+  },
+  get mouseLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
+  },
+  get mouseMoveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
+  },
+  get mouseOutEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
+  },
+  get mouseOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
+  },
+  get mouseUpEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
+  },
+  get mouseWheelEvent() {
+    return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
+  },
+  get pauseEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pause'));
+  },
+  get playEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('play'));
+  },
+  get playingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('playing'));
+  },
+  get rateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
+  },
+  get resetEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('reset'));
+  },
+  get resizeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('resize'));
+  },
+  get scrollEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
+  },
+  get seekedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
+  },
+  get seekingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
+  },
+  get selectEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('select'));
+  },
+  get stalledEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
+  },
+  get submitEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('submit'));
+  },
+  get suspendEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
+  },
+  get timeUpdateEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
+  },
+  get volumeChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
+  },
+  get waitingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
+  }
+});
+dart.defineExtensionNames([
+  'color'
+]);
+html$.HRElement = class HRElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
+  }
+  created() {
+    this[dartx.color] = null;
+    super.created();
+  }
+  get [dartx.color]() {
+    return this.color;
+  }
+  set [dartx.color](value) {
+    this.color = value;
+  }
+};
+dart.defineNamedConstructor(html$.HRElement, 'created');
+dart.setSignature(html$.HRElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.HRElement, []),
+    new: dart.definiteFunctionType(html$.HRElement, []),
+    created: dart.definiteFunctionType(html$.HRElement, [])
+  }),
+  fields: () => ({[dartx.color]: core.String})
+});
+dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
+const _initHashChangeEvent = Symbol('_initHashChangeEvent');
+dart.defineExtensionNames([
+  'newUrl',
+  'oldUrl'
+]);
+html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let oldUrl = opts && 'oldUrl' in opts ? opts.oldUrl : null;
+    let newUrl = opts && 'newUrl' in opts ? opts.newUrl : null;
+    let options = dart.map({canBubble: canBubble, cancelable: cancelable, oldURL: oldUrl, newURL: newUrl}, core.String, core.Object);
+    return new self.HashChangeEvent(type, html_common.convertDartToNative_Dictionary(options));
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.HashChangeEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.HashChangeEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.HashChangeEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.HashChangeEvent(type);
+  }
+  static get supported() {
+    return html_common.Device.isEventTypeSupported('HashChangeEvent');
+  }
+  get [dartx.newUrl]() {
+    return this.newURL;
+  }
+  get [dartx.oldUrl]() {
+    return this.oldURL;
+  }
+  [_initHashChangeEvent](...args) {
+    return this.initHashChangeEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.HashChangeEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
+    _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.newUrl]: core.String,
+    [dartx.oldUrl]: core.String
+  }),
+  methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
+html$.HeadElement = class HeadElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.HeadElement, 'created');
+dart.setSignature(html$.HeadElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.HeadElement, []),
+    new: dart.definiteFunctionType(html$.HeadElement, []),
+    created: dart.definiteFunctionType(html$.HeadElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
+html$.Headers = class Headers extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(input) {
+    if (input === void 0) input = null;
+    if (input == null) {
+      return html$.Headers._create_1();
+    }
+    if (html$.Headers.is(input)) {
+      return html$.Headers._create_2(input);
+    }
+    if (core.Map.is(input)) {
+      let input_1 = html_common.convertDartToNative_Dictionary(input);
+      return html$.Headers._create_3(input_1);
+    }
+    if (ListOfObject().is(input)) {
+      return html$.Headers._create_4(input);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1() {
+    return new self.Headers();
+  }
+  static _create_2(input) {
+    return new self.Headers(input);
+  }
+  static _create_3(input) {
+    return new self.Headers(input);
+  }
+  static _create_4(input) {
+    return new self.Headers(input);
+  }
+};
+dart.setSignature(html$.Headers, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.Headers, []),
+    new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.Headers, []),
+    _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3', '_create_4']
+});
+dart.registerExtension(dart.global.Headers, html$.Headers);
+html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static h1() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
+  }
+  static h2() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
+  }
+  static h3() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
+  }
+  static h4() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
+  }
+  static h5() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
+  }
+  static h6() {
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.HeadingElement, 'created');
+dart.setSignature(html$.HeadingElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.HeadingElement, []),
+    h1: dart.definiteFunctionType(html$.HeadingElement, []),
+    h2: dart.definiteFunctionType(html$.HeadingElement, []),
+    h3: dart.definiteFunctionType(html$.HeadingElement, []),
+    h4: dart.definiteFunctionType(html$.HeadingElement, []),
+    h5: dart.definiteFunctionType(html$.HeadingElement, []),
+    h6: dart.definiteFunctionType(html$.HeadingElement, []),
+    created: dart.definiteFunctionType(html$.HeadingElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
+const _get_options = Symbol('_get_options');
+const _get_state = Symbol('_get_state');
+const _pushState_1 = Symbol('_pushState_1');
+const _pushState_2 = Symbol('_pushState_2');
+const _replaceState_1 = Symbol('_replaceState_1');
+const _replaceState_2 = Symbol('_replaceState_2');
+dart.defineExtensionNames([
+  'options',
+  'state',
+  'back',
+  'forward',
+  'go',
+  'pushState',
+  'replaceState',
+  'length'
+]);
+html$.History = class History extends _interceptors.Interceptor {
+  static get supportsState() {
+    return !!window.history.pushState;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.options]() {
+    return html_common.convertNativeToDart_Dictionary(this[_get_options]);
+  }
+  get [_get_options]() {
+    return this.options;
+  }
+  get [dartx.state]() {
+    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
+  }
+  get [_get_state]() {
+    return this.state;
+  }
+  [dartx.back](...args) {
+    return this.back.apply(this, args);
+  }
+  [dartx.forward](...args) {
+    return this.forward.apply(this, args);
+  }
+  [dartx.go](...args) {
+    return this.go.apply(this, args);
+  }
+  [dartx.pushState](data, title, url, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
+      let options_2 = html_common.convertDartToNative_Dictionary(options);
+      this[_pushState_1](data_1, title, url, options_2);
+      return;
+    }
+    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
+    this[_pushState_2](data_1, title, url);
+    return;
+  }
+  [_pushState_1](...args) {
+    return this.pushState.apply(this, args);
+  }
+  [_pushState_2](...args) {
+    return this.pushState.apply(this, args);
+  }
+  [dartx.replaceState](data, title, url, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
+      let options_2 = html_common.convertDartToNative_Dictionary(options);
+      this[_replaceState_1](data_1, title, url, options_2);
+      return;
+    }
+    let data_1 = html_common.convertDartToNative_SerializedScriptValue(data);
+    this[_replaceState_2](data_1, title, url);
+    return;
+  }
+  [_replaceState_1](...args) {
+    return this.replaceState.apply(this, args);
+  }
+  [_replaceState_2](...args) {
+    return this.replaceState.apply(this, args);
+  }
+};
+html$.History[dart.implements] = () => [html$.HistoryBase];
+dart.setSignature(html$.History, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
+  fields: () => ({
+    [dartx.length]: core.int,
+    [_get_options]: dart.dynamic,
+    [_get_state]: dart.dynamic
+  }),
+  getters: () => ({
+    [dartx.options]: dart.definiteFunctionType(core.Map, []),
+    [dartx.state]: dart.definiteFunctionType(dart.dynamic, [])
+  }),
+  methods: () => ({
+    [dartx.back]: dart.definiteFunctionType(dart.void, []),
+    [dartx.forward]: dart.definiteFunctionType(dart.void, []),
+    [dartx.go]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [dartx.pushState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
+    [_pushState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_pushState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.replaceState]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, core.String], [core.Map]),
+    [_replaceState_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_replaceState_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.History, html$.History);
+dart.defineExtensionNames([
+  'deviceId',
+  'deviceName',
+  'hardwareUnitId'
+]);
+html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.deviceId]() {
+    return this.deviceId;
+  }
+  get [dartx.deviceName]() {
+    return this.deviceName;
+  }
+  get [dartx.hardwareUnitId]() {
+    return this.hardwareUnitId;
+  }
+};
+dart.setSignature(html$.VRDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
+  fields: () => ({
+    [dartx.deviceId]: core.String,
+    [dartx.deviceName]: core.String,
+    [dartx.hardwareUnitId]: core.String
+  })
+});
+dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
+dart.defineExtensionNames([
+  'getEyeParameters',
+  'setFieldOfView'
+]);
+html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getEyeParameters](...args) {
+    return this.getEyeParameters.apply(this, args);
+  }
+  [dartx.setFieldOfView](...args) {
+    return this.setFieldOfView.apply(this, args);
+  }
+};
+dart.setSignature(html$.HmdvrDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
+  methods: () => ({
+    [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
+    [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
+  })
+});
+dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item',
+  'namedItem'
+]);
+html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+};
+html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$.HtmlCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
+  })
+});
+dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
+dart.defineExtensionNames([
+  'caretRangeFromPoint',
+  'elementFromPoint',
+  'getCssCanvasContext',
+  'head',
+  'lastModified',
+  'preferredStylesheetSet',
+  'referrer',
+  'selectedStylesheetSet',
+  'selectedStylesheetSet',
+  'styleSheets',
+  'title',
+  'title',
+  'exitFullscreen',
+  'registerElement',
+  'register',
+  'onVisibilityChange',
+  'createElementUpgrader',
+  'body'
+]);
+html$.HtmlDocument = class HtmlDocument extends html$.Document {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.body]() {
+    return this.body;
+  }
+  set [dartx.body](value) {
+    this.body = value;
+  }
+  [dartx.caretRangeFromPoint](x, y) {
+    return this[_caretRangeFromPoint](x, y);
+  }
+  [dartx.elementFromPoint](x, y) {
+    return this[_elementFromPoint](x, y);
+  }
+  static get supportsCssCanvasContext() {
+    return !!document.getCSSCanvasContext;
+  }
+  [dartx.getCssCanvasContext](contextId, name, width, height) {
+    return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
+  }
+  get [dartx.head]() {
+    return this[_head$0];
+  }
+  get [dartx.lastModified]() {
+    return this[_lastModified];
+  }
+  get [dartx.preferredStylesheetSet]() {
+    return this[_preferredStylesheetSet];
+  }
+  get [dartx.referrer]() {
+    return this[_referrer];
+  }
+  get [dartx.selectedStylesheetSet]() {
+    return this[_selectedStylesheetSet];
+  }
+  set [dartx.selectedStylesheetSet](value) {
+    this[_selectedStylesheetSet] = value;
+  }
+  get [dartx.styleSheets]() {
+    return this[_styleSheets];
+  }
+  get [dartx.title]() {
+    return this[_title];
+  }
+  set [dartx.title](value) {
+    this[_title] = value;
+  }
+  [dartx.exitFullscreen]() {
+    this[_webkitExitFullscreen]();
+  }
+  [dartx.registerElement](tag, customElementClass, opts) {
+    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
+    html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
+  }
+  [dartx.register](tag, customElementClass, opts) {
+    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
+    return this[dartx.registerElement](tag, customElementClass, {extendsTag: extendsTag});
+  }
+  static _determineVisibilityChangeEventType(e) {
+    if (typeof e.hidden !== "undefined") {
+      return 'visibilitychange';
+    } else if (typeof e.mozHidden !== "undefined") {
+      return 'mozvisibilitychange';
+    } else if (typeof e.msHidden !== "undefined") {
+      return 'msvisibilitychange';
+    } else if (typeof e.webkitHidden !== "undefined") {
+      return 'webkitvisibilitychange';
+    }
+    return 'visibilitychange';
+  }
+  get [dartx.onVisibilityChange]() {
+    return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
+  }
+  [dartx.createElementUpgrader](type, opts) {
+    let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
+    return new html$._JSElementUpgrader(this, type, extendsTag);
+  }
+};
+dart.setSignature(html$.HtmlDocument, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
+  fields: () => ({[dartx.body]: html$.BodyElement}),
+  getters: () => ({
+    [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
+    [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
+    [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
+    [dartx.referrer]: dart.definiteFunctionType(core.String, []),
+    [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
+    [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
+    [dartx.title]: dart.definiteFunctionType(core.String, []),
+    [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  setters: () => ({
+    [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  methods: () => ({
+    [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
+    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
+    [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
+    [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
+    [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
+  }),
+  sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
+  sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
+  names: ['_determineVisibilityChangeEventType']
+});
+dart.defineLazy(html$.HtmlDocument, {
+  get visibilityChangeEvent() {
+    return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
+  }
+});
+dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
+dart.defineExtensionNames([
+  'item',
+  'namedItem'
+]);
+html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+};
+dart.setSignature(html$.HtmlFormControlsCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
+});
+dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
+html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
+dart.setSignature(html$.HtmlHtmlElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
+    new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
+    created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
+const _item = Symbol('_item');
+html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$.HtmlOptionsCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
+  methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
+});
+dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
+const _get_response = Symbol('_get_response');
+dart.defineExtensionNames([
+  'onAbort',
+  'onError',
+  'onLoad',
+  'onLoadEnd',
+  'onLoadStart',
+  'onProgress',
+  'onTimeout'
+]);
+html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.onAbort]() {
+    return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
+  }
+  get [dartx.onLoadEnd]() {
+    return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
+  }
+  get [dartx.onLoadStart]() {
+    return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
+  }
+  get [dartx.onProgress]() {
+    return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
+  }
+  get [dartx.onTimeout]() {
+    return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.HttpRequestEventTarget, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
+  getters: () => ({
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
+  }),
+  sfields: () => ({
+    abortEvent: EventStreamProviderOfProgressEvent(),
+    errorEvent: EventStreamProviderOfProgressEvent(),
+    loadEvent: EventStreamProviderOfProgressEvent(),
+    loadEndEvent: EventStreamProviderOfProgressEvent(),
+    loadStartEvent: EventStreamProviderOfProgressEvent(),
+    progressEvent: EventStreamProviderOfProgressEvent(),
+    timeoutEvent: EventStreamProviderOfProgressEvent()
+  })
+});
+dart.defineLazy(html$.HttpRequestEventTarget, {
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('error'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('load'));
+  },
+  get loadEndEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('loadend'));
+  },
+  get loadStartEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('loadstart'));
+  },
+  get progressEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
+  },
+  get timeoutEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
+  }
+});
+dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
+dart.defineExtensionNames([
+  'responseHeaders',
+  'open',
+  'response',
+  'abort',
+  'getAllResponseHeaders',
+  'getResponseHeader',
+  'overrideMimeType',
+  'send',
+  'setRequestHeader',
+  'onReadyStateChange',
+  'readyState',
+  'responseText',
+  'responseType',
+  'responseUrl',
+  'responseXml',
+  'status',
+  'statusText',
+  'timeout',
+  'upload',
+  'withCredentials'
+]);
+html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
+  static getString(url, opts) {
+    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
+    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
+    return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
+  }
+  static postFormData(url, data, opts) {
+    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
+    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
+    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
+    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
+    let parts = [];
+    data[dartx.forEach](dart.fn((key, value) => {
+      parts[dartx.add](dart.str`${core.Uri.encodeQueryComponent(key)}=` + dart.str`${core.Uri.encodeQueryComponent(value)}`);
+    }, StringAndStringToNull()));
+    let formData = parts[dartx.join]('&');
+    if (requestHeaders == null) {
+      requestHeaders = dart.map({}, core.String, core.String);
+    }
+    requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
+    return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
+  }
+  static request(url, opts) {
+    let method = opts && 'method' in opts ? opts.method : null;
+    let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
+    let responseType = opts && 'responseType' in opts ? opts.responseType : null;
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+    let requestHeaders = opts && 'requestHeaders' in opts ? opts.requestHeaders : null;
+    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
+    let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
+    let completer = CompleterOfHttpRequest().new();
+    let xhr = html$.HttpRequest.new();
+    if (method == null) {
+      method = 'GET';
+    }
+    xhr[dartx.open](method, url, {async: true});
+    if (withCredentials != null) {
+      xhr[dartx.withCredentials] = withCredentials;
+    }
+    if (responseType != null) {
+      xhr[dartx.responseType] = responseType;
+    }
+    if (mimeType != null) {
+      xhr[dartx.overrideMimeType](mimeType);
+    }
+    if (requestHeaders != null) {
+      requestHeaders[dartx.forEach](dart.fn((header, value) => {
+        xhr[dartx.setRequestHeader](header, value);
+      }, StringAndStringToNull()));
+    }
+    if (onProgress != null) {
+      xhr[dartx.onProgress].listen(onProgress);
+    }
+    xhr[dartx.onLoad].listen(dart.fn(e => {
+      let accepted = dart.notNull(xhr[dartx.status]) >= 200 && dart.notNull(xhr[dartx.status]) < 300;
+      let fileUri = xhr[dartx.status] == 0;
+      let notModified = xhr[dartx.status] == 304;
+      let unknownRedirect = dart.notNull(xhr[dartx.status]) > 307 && dart.notNull(xhr[dartx.status]) < 400;
+      if (accepted || fileUri || notModified || unknownRedirect) {
+        completer.complete(xhr);
+      } else {
+        completer.completeError(e);
+      }
+    }, ProgressEventToNull()));
+    xhr[dartx.onError].listen(dart.bind(completer, 'completeError'));
+    if (sendData != null) {
+      xhr[dartx.send](sendData);
+    } else {
+      xhr[dartx.send]();
+    }
+    return completer.future;
+  }
+  static get supportsProgressEvent() {
+    let xhr = html$.HttpRequest.new();
+    return "onprogress" in xhr;
+  }
+  static get supportsCrossOrigin() {
+    let xhr = html$.HttpRequest.new();
+    return "withCredentials" in xhr;
+  }
+  static get supportsLoadEndEvent() {
+    let xhr = html$.HttpRequest.new();
+    return "onloadend" in xhr;
+  }
+  static get supportsOverrideMimeType() {
+    let xhr = html$.HttpRequest.new();
+    return "overrideMimeType" in xhr;
+  }
+  static requestCrossOrigin(url, opts) {
+    let method = opts && 'method' in opts ? opts.method : null;
+    let sendData = opts && 'sendData' in opts ? opts.sendData : null;
+    if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
+      return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
+    }
+    let completer = CompleterOfString().new();
+    if (method == null) {
+      method = 'GET';
+    }
+    let xhr = new XDomainRequest();
+    xhr.open(method, url);
+    xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
+      let response = xhr.responseText;
+      completer.complete(response);
+    }, dynamicToNull$()), 1);
+    xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
+      completer.completeError(e);
+    }, dynamicToNull$()), 1);
+    xhr.onprogress = {};
+    xhr.ontimeout = {};
+    xhr.timeout = Number.MAX_VALUE;
+    if (sendData != null) {
+      xhr.send(sendData);
+    } else {
+      xhr.send();
+    }
+    return completer.future;
+  }
+  get [dartx.responseHeaders]() {
+    let headers = dart.map({}, core.String, core.String);
+    let headersString = this[dartx.getAllResponseHeaders]();
+    if (headersString == null) {
+      return headers;
+    }
+    let headersList = headersString[dartx.split]('\r\n');
+    for (let header of headersList) {
+      if (dart.test(header[dartx.isEmpty])) {
+        continue;
+      }
+      let splitIdx = header[dartx.indexOf](': ');
+      if (splitIdx == -1) {
+        continue;
+      }
+      let key = header[dartx.substring](0, splitIdx)[dartx.toLowerCase]();
+      let value = header[dartx.substring](dart.notNull(splitIdx) + 2);
+      if (dart.test(headers[dartx.containsKey](key))) {
+        headers[dartx._set](key, dart.str`${headers[dartx._get](key)}, ${value}`);
+      } else {
+        headers[dartx._set](key, value);
+      }
+    }
+    return headers;
+  }
+  [dartx.open](...args) {
+    return this.open.apply(this, args);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.HttpRequest._create_1();
+  }
+  static _create_1() {
+    return new XMLHttpRequest();
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.response]() {
+    return html$._convertNativeToDart_XHR_Response(this[_get_response]);
+  }
+  get [_get_response]() {
+    return this.response;
+  }
+  get [dartx.responseText]() {
+    return this.responseText;
+  }
+  get [dartx.responseType]() {
+    return this.responseType;
+  }
+  set [dartx.responseType](value) {
+    this.responseType = value;
+  }
+  get [dartx.responseUrl]() {
+    return this.responseURL;
+  }
+  get [dartx.responseXml]() {
+    return this.responseXML;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  get [dartx.statusText]() {
+    return this.statusText;
+  }
+  get [dartx.timeout]() {
+    return this.timeout;
+  }
+  set [dartx.timeout](value) {
+    this.timeout = value;
+  }
+  get [dartx.upload]() {
+    return this.upload;
+  }
+  get [dartx.withCredentials]() {
+    return this.withCredentials;
+  }
+  set [dartx.withCredentials](value) {
+    this.withCredentials = value;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.getAllResponseHeaders](...args) {
+    return this.getAllResponseHeaders.apply(this, args);
+  }
+  [dartx.getResponseHeader](...args) {
+    return this.getResponseHeader.apply(this, args);
+  }
+  [dartx.overrideMimeType](...args) {
+    return this.overrideMimeType.apply(this, args);
+  }
+  [dartx.send](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.setRequestHeader](...args) {
+    return this.setRequestHeader.apply(this, args);
+  }
+  get [dartx.onReadyStateChange]() {
+    return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.HttpRequest, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.HttpRequest, []),
+    new: dart.definiteFunctionType(html$.HttpRequest, [])
+  }),
+  fields: () => ({
+    [dartx.readyState]: core.int,
+    [_get_response]: dart.dynamic,
+    [dartx.responseText]: core.String,
+    [dartx.responseType]: core.String,
+    [dartx.responseUrl]: core.String,
+    [dartx.responseXml]: html$.Document,
+    [dartx.status]: core.int,
+    [dartx.statusText]: core.String,
+    [dartx.timeout]: core.int,
+    [dartx.upload]: html$.HttpRequestUpload,
+    [dartx.withCredentials]: core.bool
+  }),
+  getters: () => ({
+    [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
+  }),
+  methods: () => ({
+    [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getAllResponseHeaders]: dart.definiteFunctionType(core.String, []),
+    [dartx.getResponseHeader]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.overrideMimeType]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.send]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+    [dartx.setRequestHeader]: dart.definiteFunctionType(dart.void, [core.String, core.String])
+  }),
+  sfields: () => ({
+    readyStateChangeEvent: EventStreamProviderOfProgressEvent(),
+    DONE: core.int,
+    HEADERS_RECEIVED: core.int,
+    LOADING: core.int,
+    OPENED: core.int,
+    UNSENT: core.int
+  }),
+  sgetters: () => ({
+    supportsProgressEvent: dart.definiteFunctionType(core.bool, []),
+    supportsCrossOrigin: dart.definiteFunctionType(core.bool, []),
+    supportsLoadEndEvent: dart.definiteFunctionType(core.bool, []),
+    supportsOverrideMimeType: dart.definiteFunctionType(core.bool, [])
+  }),
+  statics: () => ({
+    getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
+    postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
+    request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
+    requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
+    _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
+  }),
+  names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
+});
+html$.HttpRequest.DONE = 4;
+html$.HttpRequest.HEADERS_RECEIVED = 2;
+html$.HttpRequest.LOADING = 3;
+html$.HttpRequest.OPENED = 1;
+html$.HttpRequest.UNSENT = 0;
+dart.defineLazy(html$.HttpRequest, {
+  get readyStateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
+  }
+});
+dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
+html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.HttpRequestUpload, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
+});
+dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
+const _get_contentWindow = Symbol('_get_contentWindow');
+dart.defineExtensionNames([
+  'contentWindow',
+  'allowFullscreen',
+  'height',
+  'name',
+  'sandbox',
+  'src',
+  'srcdoc',
+  'width'
+]);
+html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
+  }
+  created() {
+    this[dartx.allowFullscreen] = null;
+    this[_get_contentWindow] = null;
+    this[dartx.height] = null;
+    this[dartx.name] = null;
+    this[dartx.sandbox] = null;
+    this[dartx.src] = null;
+    this[dartx.srcdoc] = null;
+    this[dartx.width] = null;
+    super.created();
+  }
+  get [dartx.allowFullscreen]() {
+    return this.allowFullscreen;
+  }
+  set [dartx.allowFullscreen](value) {
+    this.allowFullscreen = value;
+  }
+  get [dartx.contentWindow]() {
+    return html$._convertNativeToDart_Window(this[_get_contentWindow]);
+  }
+  get [_get_contentWindow]() {
+    return this.contentWindow;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.sandbox]() {
+    return this.sandbox;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.srcdoc]() {
+    return this.srcdoc;
+  }
+  set [dartx.srcdoc](value) {
+    this.srcdoc = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+};
+dart.defineNamedConstructor(html$.IFrameElement, 'created');
+dart.setSignature(html$.IFrameElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.IFrameElement, []),
+    new: dart.definiteFunctionType(html$.IFrameElement, []),
+    created: dart.definiteFunctionType(html$.IFrameElement, [])
+  }),
+  fields: () => ({
+    [dartx.allowFullscreen]: core.bool,
+    [_get_contentWindow]: dart.dynamic,
+    [dartx.height]: core.String,
+    [dartx.name]: core.String,
+    [dartx.sandbox]: html$.DomSettableTokenList,
+    [dartx.src]: core.String,
+    [dartx.srcdoc]: core.String,
+    [dartx.width]: core.String
+  }),
+  getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
+});
+dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
+dart.defineExtensionNames([
+  'height',
+  'width'
+]);
+html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+dart.setSignature(html$.ImageBitmap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
+  fields: () => ({
+    [dartx.height]: core.int,
+    [dartx.width]: core.int
+  })
+});
+dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
+dart.defineExtensionNames([
+  'data',
+  'height',
+  'width'
+]);
+html$.ImageData = class ImageData extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(data_OR_sw, sh_OR_sw, sh) {
+    if (sh === void 0) sh = null;
+    if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
+      return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
+    }
+    if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
+      return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
+    }
+    if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
+      return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1(data_OR_sw, sh_OR_sw) {
+    return new self.ImageData(data_OR_sw, sh_OR_sw);
+  }
+  static _create_2(data_OR_sw, sh_OR_sw) {
+    return new self.ImageData(data_OR_sw, sh_OR_sw);
+  }
+  static _create_3(data_OR_sw, sh_OR_sw, sh) {
+    return new self.ImageData(data_OR_sw, sh_OR_sw, sh);
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+dart.setSignature(html$.ImageData, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ImageData, []),
+    new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
+  }),
+  fields: () => ({
+    [dartx.data]: typed_data.Uint8ClampedList,
+    [dartx.height]: core.int,
+    [dartx.width]: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.registerExtension(dart.global.ImageData, html$.ImageData);
+dart.defineExtensionNames([
+  'alt',
+  'complete',
+  'crossOrigin',
+  'currentSrc',
+  'height',
+  'isMap',
+  'naturalHeight',
+  'naturalWidth',
+  'sizes',
+  'src',
+  'srcset',
+  'useMap',
+  'width'
+]);
+html$.ImageElement = class ImageElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(opts) {
+    let src = opts && 'src' in opts ? opts.src : null;
+    let width = opts && 'width' in opts ? opts.width : null;
+    let height = opts && 'height' in opts ? opts.height : null;
+    let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
+    if (src != null) e[dartx.src] = src;
+    if (width != null) e[dartx.width] = width;
+    if (height != null) e[dartx.height] = height;
+    return e;
+  }
+  created() {
+    this[dartx.alt] = null;
+    this[dartx.complete] = null;
+    this[dartx.crossOrigin] = null;
+    this[dartx.currentSrc] = null;
+    this[dartx.height] = null;
+    this[dartx.isMap] = null;
+    this[dartx.naturalHeight] = null;
+    this[dartx.naturalWidth] = null;
+    this[dartx.sizes] = null;
+    this[dartx.src] = null;
+    this[dartx.srcset] = null;
+    this[dartx.useMap] = null;
+    this[dartx.width] = null;
+    super.created();
+  }
+  get [dartx.alt]() {
+    return this.alt;
+  }
+  set [dartx.alt](value) {
+    this.alt = value;
+  }
+  get [dartx.complete]() {
+    return this.complete;
+  }
+  get [dartx.crossOrigin]() {
+    return this.crossOrigin;
+  }
+  set [dartx.crossOrigin](value) {
+    this.crossOrigin = value;
+  }
+  get [dartx.currentSrc]() {
+    return this.currentSrc;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.isMap]() {
+    return this.isMap;
+  }
+  set [dartx.isMap](value) {
+    this.isMap = value;
+  }
+  get [dartx.naturalHeight]() {
+    return this.naturalHeight;
+  }
+  get [dartx.naturalWidth]() {
+    return this.naturalWidth;
+  }
+  get [dartx.sizes]() {
+    return this.sizes;
+  }
+  set [dartx.sizes](value) {
+    this.sizes = value;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.srcset]() {
+    return this.srcset;
+  }
+  set [dartx.srcset](value) {
+    this.srcset = value;
+  }
+  get [dartx.useMap]() {
+    return this.useMap;
+  }
+  set [dartx.useMap](value) {
+    this.useMap = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+};
+dart.defineNamedConstructor(html$.ImageElement, 'created');
+html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.ImageElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ImageElement, []),
+    new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
+    created: dart.definiteFunctionType(html$.ImageElement, [])
+  }),
+  fields: () => ({
+    [dartx.alt]: core.String,
+    [dartx.complete]: core.bool,
+    [dartx.crossOrigin]: core.String,
+    [dartx.currentSrc]: core.String,
+    [dartx.height]: core.int,
+    [dartx.isMap]: core.bool,
+    [dartx.naturalHeight]: core.int,
+    [dartx.naturalWidth]: core.int,
+    [dartx.sizes]: core.String,
+    [dartx.src]: core.String,
+    [dartx.srcset]: core.String,
+    [dartx.useMap]: core.String,
+    [dartx.width]: core.int
+  })
+});
+dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
+dart.defineExtensionNames([
+  'inspect'
+]);
+html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.inspect](...args) {
+    return this.inspect.apply(this, args);
+  }
+};
+dart.setSignature(html$.InjectedScriptHost, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
+  methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
+});
+dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
+dart.defineExtensionNames([
+  'firesTouchEvents'
+]);
+html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(deviceInitDict) {
+    if (deviceInitDict === void 0) deviceInitDict = null;
+    if (deviceInitDict != null) {
+      let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
+      return html$.InputDevice._create_1(deviceInitDict_1);
+    }
+    return html$.InputDevice._create_2();
+  }
+  static _create_1(deviceInitDict) {
+    return new self.InputDevice(deviceInitDict);
+  }
+  static _create_2() {
+    return new self.InputDevice();
+  }
+  get [dartx.firesTouchEvents]() {
+    return this.firesTouchEvents;
+  }
+};
+dart.setSignature(html$.InputDevice, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.InputDevice, []),
+    new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
+  }),
+  fields: () => ({[dartx.firesTouchEvents]: core.bool}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.InputDevice, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
+const _get_valueAsDate = Symbol('_get_valueAsDate');
+const _set_valueAsDate = Symbol('_set_valueAsDate');
+dart.defineExtensionNames([
+  'valueAsDate',
+  'valueAsDate',
+  'checkValidity',
+  'reportValidity',
+  'select',
+  'setCustomValidity',
+  'setRangeText',
+  'setSelectionRange',
+  'stepDown',
+  'stepUp',
+  'accept',
+  'alt',
+  'autocapitalize',
+  'autocomplete',
+  'autofocus',
+  'capture',
+  'checked',
+  'defaultChecked',
+  'defaultValue',
+  'dirName',
+  'disabled',
+  'files',
+  'form',
+  'formAction',
+  'formEnctype',
+  'formMethod',
+  'formNoValidate',
+  'formTarget',
+  'height',
+  'incremental',
+  'indeterminate',
+  'inputMode',
+  'labels',
+  'list',
+  'max',
+  'maxLength',
+  'min',
+  'minLength',
+  'multiple',
+  'name',
+  'pattern',
+  'placeholder',
+  'readOnly',
+  'required',
+  'selectionDirection',
+  'selectionEnd',
+  'selectionStart',
+  'size',
+  'src',
+  'step',
+  'type',
+  'validationMessage',
+  'validity',
+  'value',
+  'valueAsNumber',
+  'entries',
+  'directory',
+  'width',
+  'willValidate'
+]);
+html$.InputElement = class InputElement extends html$.HtmlElement {
+  static new(opts) {
+    let type = opts && 'type' in opts ? opts.type : null;
+    let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
+    if (type != null) {
+      try {
+        e[dartx.type] = type;
+      } catch (_) {
+      }
+
+    }
+    return e;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.accept] = null;
+    this[dartx.alt] = null;
+    this[dartx.autocapitalize] = null;
+    this[dartx.autocomplete] = null;
+    this[dartx.autofocus] = null;
+    this[dartx.capture] = null;
+    this[dartx.checked] = null;
+    this[dartx.defaultChecked] = null;
+    this[dartx.defaultValue] = null;
+    this[dartx.dirName] = null;
+    this[dartx.disabled] = null;
+    this[dartx.files] = null;
+    this[dartx.form] = null;
+    this[dartx.formAction] = null;
+    this[dartx.formEnctype] = null;
+    this[dartx.formMethod] = null;
+    this[dartx.formNoValidate] = null;
+    this[dartx.formTarget] = null;
+    this[dartx.height] = null;
+    this[dartx.incremental] = null;
+    this[dartx.indeterminate] = null;
+    this[dartx.inputMode] = null;
+    this[dartx.labels] = null;
+    this[dartx.list] = null;
+    this[dartx.max] = null;
+    this[dartx.maxLength] = null;
+    this[dartx.min] = null;
+    this[dartx.minLength] = null;
+    this[dartx.multiple] = null;
+    this[dartx.name] = null;
+    this[dartx.pattern] = null;
+    this[dartx.placeholder] = null;
+    this[dartx.readOnly] = null;
+    this[dartx.required] = null;
+    this[dartx.selectionDirection] = null;
+    this[dartx.selectionEnd] = null;
+    this[dartx.selectionStart] = null;
+    this[dartx.size] = null;
+    this[dartx.src] = null;
+    this[dartx.step] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.value] = null;
+    this[_get_valueAsDate] = null;
+    this[dartx.valueAsNumber] = null;
+    this[dartx.entries] = null;
+    this[dartx.directory] = null;
+    this[dartx.width] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  get [dartx.accept]() {
+    return this.accept;
+  }
+  set [dartx.accept](value) {
+    this.accept = value;
+  }
+  get [dartx.alt]() {
+    return this.alt;
+  }
+  set [dartx.alt](value) {
+    this.alt = value;
+  }
+  get [dartx.autocapitalize]() {
+    return this.autocapitalize;
+  }
+  set [dartx.autocapitalize](value) {
+    this.autocapitalize = value;
+  }
+  get [dartx.autocomplete]() {
+    return this.autocomplete;
+  }
+  set [dartx.autocomplete](value) {
+    this.autocomplete = value;
+  }
+  get [dartx.autofocus]() {
+    return this.autofocus;
+  }
+  set [dartx.autofocus](value) {
+    this.autofocus = value;
+  }
+  get [dartx.capture]() {
+    return this.capture;
+  }
+  set [dartx.capture](value) {
+    this.capture = value;
+  }
+  get [dartx.checked]() {
+    return this.checked;
+  }
+  set [dartx.checked](value) {
+    this.checked = value;
+  }
+  get [dartx.defaultChecked]() {
+    return this.defaultChecked;
+  }
+  set [dartx.defaultChecked](value) {
+    this.defaultChecked = value;
+  }
+  get [dartx.defaultValue]() {
+    return this.defaultValue;
+  }
+  set [dartx.defaultValue](value) {
+    this.defaultValue = value;
+  }
+  get [dartx.dirName]() {
+    return this.dirName;
+  }
+  set [dartx.dirName](value) {
+    this.dirName = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.files]() {
+    return this.files;
+  }
+  set [dartx.files](value) {
+    this.files = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.formAction]() {
+    return this.formAction;
+  }
+  set [dartx.formAction](value) {
+    this.formAction = value;
+  }
+  get [dartx.formEnctype]() {
+    return this.formEnctype;
+  }
+  set [dartx.formEnctype](value) {
+    this.formEnctype = value;
+  }
+  get [dartx.formMethod]() {
+    return this.formMethod;
+  }
+  set [dartx.formMethod](value) {
+    this.formMethod = value;
+  }
+  get [dartx.formNoValidate]() {
+    return this.formNoValidate;
+  }
+  set [dartx.formNoValidate](value) {
+    this.formNoValidate = value;
+  }
+  get [dartx.formTarget]() {
+    return this.formTarget;
+  }
+  set [dartx.formTarget](value) {
+    this.formTarget = value;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.incremental]() {
+    return this.incremental;
+  }
+  set [dartx.incremental](value) {
+    this.incremental = value;
+  }
+  get [dartx.indeterminate]() {
+    return this.indeterminate;
+  }
+  set [dartx.indeterminate](value) {
+    this.indeterminate = value;
+  }
+  get [dartx.inputMode]() {
+    return this.inputMode;
+  }
+  set [dartx.inputMode](value) {
+    this.inputMode = value;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.list]() {
+    return this.list;
+  }
+  get [dartx.max]() {
+    return this.max;
+  }
+  set [dartx.max](value) {
+    this.max = value;
+  }
+  get [dartx.maxLength]() {
+    return this.maxLength;
+  }
+  set [dartx.maxLength](value) {
+    this.maxLength = value;
+  }
+  get [dartx.min]() {
+    return this.min;
+  }
+  set [dartx.min](value) {
+    this.min = value;
+  }
+  get [dartx.minLength]() {
+    return this.minLength;
+  }
+  set [dartx.minLength](value) {
+    this.minLength = value;
+  }
+  get [dartx.multiple]() {
+    return this.multiple;
+  }
+  set [dartx.multiple](value) {
+    this.multiple = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.pattern]() {
+    return this.pattern;
+  }
+  set [dartx.pattern](value) {
+    this.pattern = value;
+  }
+  get [dartx.placeholder]() {
+    return this.placeholder;
+  }
+  set [dartx.placeholder](value) {
+    this.placeholder = value;
+  }
+  get [dartx.readOnly]() {
+    return this.readOnly;
+  }
+  set [dartx.readOnly](value) {
+    this.readOnly = value;
+  }
+  get [dartx.required]() {
+    return this.required;
+  }
+  set [dartx.required](value) {
+    this.required = value;
+  }
+  get [dartx.selectionDirection]() {
+    return this.selectionDirection;
+  }
+  set [dartx.selectionDirection](value) {
+    this.selectionDirection = value;
+  }
+  get [dartx.selectionEnd]() {
+    return this.selectionEnd;
+  }
+  set [dartx.selectionEnd](value) {
+    this.selectionEnd = value;
+  }
+  get [dartx.selectionStart]() {
+    return this.selectionStart;
+  }
+  set [dartx.selectionStart](value) {
+    this.selectionStart = value;
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  set [dartx.size](value) {
+    this.size = value;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.step]() {
+    return this.step;
+  }
+  set [dartx.step](value) {
+    this.step = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.valueAsDate]() {
+    return html_common.convertNativeToDart_DateTime(this[_get_valueAsDate]);
+  }
+  get [_get_valueAsDate]() {
+    return this.valueAsDate;
+  }
+  set [dartx.valueAsDate](value) {
+    this[_set_valueAsDate] = html_common.convertDartToNative_DateTime(value);
+  }
+  set [_set_valueAsDate](value) {
+    this.valueAsDate = value;
+  }
+  get [dartx.valueAsNumber]() {
+    return this.valueAsNumber;
+  }
+  set [dartx.valueAsNumber](value) {
+    this.valueAsNumber = value;
+  }
+  get [dartx.entries]() {
+    return this.webkitEntries;
+  }
+  get [dartx.directory]() {
+    return this.webkitdirectory;
+  }
+  set [dartx.directory](value) {
+    this.webkitdirectory = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.select](...args) {
+    return this.select.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+  [dartx.setRangeText](...args) {
+    return this.setRangeText.apply(this, args);
+  }
+  [dartx.setSelectionRange](...args) {
+    return this.setSelectionRange.apply(this, args);
+  }
+  [dartx.stepDown](...args) {
+    return this.stepDown.apply(this, args);
+  }
+  [dartx.stepUp](...args) {
+    return this.stepUp.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.InputElement, 'created');
+html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
+dart.setSignature(html$.InputElement, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
+    _: dart.definiteFunctionType(html$.InputElement, []),
+    created: dart.definiteFunctionType(html$.InputElement, [])
+  }),
+  fields: () => ({
+    [dartx.accept]: core.String,
+    [dartx.alt]: core.String,
+    [dartx.autocapitalize]: core.String,
+    [dartx.autocomplete]: core.String,
+    [dartx.autofocus]: core.bool,
+    [dartx.capture]: core.bool,
+    [dartx.checked]: core.bool,
+    [dartx.defaultChecked]: core.bool,
+    [dartx.defaultValue]: core.String,
+    [dartx.dirName]: core.String,
+    [dartx.disabled]: core.bool,
+    [dartx.files]: ListOfFile(),
+    [dartx.form]: html$.FormElement,
+    [dartx.formAction]: core.String,
+    [dartx.formEnctype]: core.String,
+    [dartx.formMethod]: core.String,
+    [dartx.formNoValidate]: core.bool,
+    [dartx.formTarget]: core.String,
+    [dartx.height]: core.int,
+    [dartx.incremental]: core.bool,
+    [dartx.indeterminate]: core.bool,
+    [dartx.inputMode]: core.String,
+    [dartx.labels]: ListOfNode(),
+    [dartx.list]: html$.HtmlElement,
+    [dartx.max]: core.String,
+    [dartx.maxLength]: core.int,
+    [dartx.min]: core.String,
+    [dartx.minLength]: core.int,
+    [dartx.multiple]: core.bool,
+    [dartx.name]: core.String,
+    [dartx.pattern]: core.String,
+    [dartx.placeholder]: core.String,
+    [dartx.readOnly]: core.bool,
+    [dartx.required]: core.bool,
+    [dartx.selectionDirection]: core.String,
+    [dartx.selectionEnd]: core.int,
+    [dartx.selectionStart]: core.int,
+    [dartx.size]: core.int,
+    [dartx.src]: core.String,
+    [dartx.step]: core.String,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.value]: core.String,
+    [_get_valueAsDate]: dart.dynamic,
+    [dartx.valueAsNumber]: core.num,
+    [dartx.entries]: ListOfEntry(),
+    [dartx.directory]: core.bool,
+    [dartx.width]: core.int,
+    [dartx.willValidate]: core.bool
+  }),
+  getters: () => ({[dartx.valueAsDate]: dart.definiteFunctionType(core.DateTime, [])}),
+  setters: () => ({
+    [dartx.valueAsDate]: dart.definiteFunctionType(dart.void, [core.DateTime]),
+    [_set_valueAsDate]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.select]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
+    [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String]),
+    [dartx.stepDown]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
+  })
+});
+dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
+dart.defineExtensionNames([
+  'autofocus',
+  'disabled',
+  'incremental',
+  'indeterminate',
+  'name',
+  'value'
+]);
+html$.InputElementBase = class InputElementBase extends core.Object {
+  new() {
+    this[autofocus] = null;
+    this[disabled] = null;
+    this[incremental] = null;
+    this[indeterminate] = null;
+    this[name] = null;
+    this[value$] = null;
+  }
+  get autofocus() {
+    return this[autofocus];
+  }
+  set autofocus(value) {
+    this[autofocus] = value;
+  }
+  get disabled() {
+    return this[disabled];
+  }
+  set disabled(value) {
+    this[disabled] = value;
+  }
+  get incremental() {
+    return this[incremental];
+  }
+  set incremental(value) {
+    this[incremental] = value;
+  }
+  get indeterminate() {
+    return this[indeterminate];
+  }
+  set indeterminate(value) {
+    this[indeterminate] = value;
+  }
+  get name() {
+    return this[name];
+  }
+  set name(value) {
+    this[name] = value;
+  }
+  get value() {
+    return this[value$];
+  }
+  set value(value) {
+    this[value$] = value;
+  }
+};
+const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
+const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
+const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
+const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
+const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
+const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
+html$.InputElementBase[dart.implements] = () => [html$.Element];
+dart.setSignature(html$.InputElementBase, {
+  fields: () => ({
+    autofocus: core.bool,
+    disabled: core.bool,
+    incremental: core.bool,
+    indeterminate: core.bool,
+    name: core.String,
+    value: core.String
+  })
+});
+dart.defineExtensionMembers(html$.InputElementBase, [
+  'autofocus',
+  'autofocus',
+  'disabled',
+  'disabled',
+  'incremental',
+  'incremental',
+  'indeterminate',
+  'indeterminate',
+  'name',
+  'name',
+  'value',
+  'value'
+]);
+html$.HiddenInputElement = class HiddenInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'hidden'});
+  }
+};
+html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.HiddenInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
+});
+dart.defineExtensionNames([
+  'autocomplete',
+  'maxLength',
+  'pattern',
+  'placeholder',
+  'readOnly',
+  'required',
+  'size',
+  'selectionDirection',
+  'selectionEnd',
+  'selectionStart'
+]);
+html$.TextInputElementBase = class TextInputElementBase extends core.Object {
+  new() {
+    this[autocomplete] = null;
+    this[maxLength] = null;
+    this[pattern] = null;
+    this[placeholder] = null;
+    this[readOnly] = null;
+    this[required] = null;
+    this[size] = null;
+    this[selectionDirection] = null;
+    this[selectionEnd] = null;
+    this[selectionStart] = null;
+  }
+  get autocomplete() {
+    return this[autocomplete];
+  }
+  set autocomplete(value) {
+    this[autocomplete] = value;
+  }
+  get maxLength() {
+    return this[maxLength];
+  }
+  set maxLength(value) {
+    this[maxLength] = value;
+  }
+  get pattern() {
+    return this[pattern];
+  }
+  set pattern(value) {
+    this[pattern] = value;
+  }
+  get placeholder() {
+    return this[placeholder];
+  }
+  set placeholder(value) {
+    this[placeholder] = value;
+  }
+  get readOnly() {
+    return this[readOnly];
+  }
+  set readOnly(value) {
+    this[readOnly] = value;
+  }
+  get required() {
+    return this[required];
+  }
+  set required(value) {
+    this[required] = value;
+  }
+  get size() {
+    return this[size];
+  }
+  set size(value) {
+    this[size] = value;
+  }
+  get selectionDirection() {
+    return this[selectionDirection];
+  }
+  set selectionDirection(value) {
+    this[selectionDirection] = value;
+  }
+  get selectionEnd() {
+    return this[selectionEnd];
+  }
+  set selectionEnd(value) {
+    this[selectionEnd] = value;
+  }
+  get selectionStart() {
+    return this[selectionStart];
+  }
+  set selectionStart(value) {
+    this[selectionStart] = value;
+  }
+};
+const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
+const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
+const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
+const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
+const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
+const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
+const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
+const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
+const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
+const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
+html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.TextInputElementBase, {
+  fields: () => ({
+    autocomplete: core.String,
+    maxLength: core.int,
+    pattern: core.String,
+    placeholder: core.String,
+    readOnly: core.bool,
+    required: core.bool,
+    size: core.int,
+    selectionDirection: core.String,
+    selectionEnd: core.int,
+    selectionStart: core.int
+  })
+});
+dart.defineExtensionMembers(html$.TextInputElementBase, [
+  'autocomplete',
+  'autocomplete',
+  'maxLength',
+  'maxLength',
+  'pattern',
+  'pattern',
+  'placeholder',
+  'placeholder',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required',
+  'size',
+  'size',
+  'selectionDirection',
+  'selectionDirection',
+  'selectionEnd',
+  'selectionEnd',
+  'selectionStart',
+  'selectionStart'
+]);
+dart.defineExtensionNames([
+  'dirName'
+]);
+html$.SearchInputElement = class SearchInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'search'});
+  }
+  get dirName() {
+    return this[dirName];
+  }
+  set dirName(value) {
+    this[dirName] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
+  }
+};
+const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
+html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.SearchInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
+  fields: () => ({dirName: core.String}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
+dart.defineExtensionNames([
+  'dirName'
+]);
+html$.TextInputElement = class TextInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'text'});
+  }
+  get dirName() {
+    return this[dirName$];
+  }
+  set dirName(value) {
+    this[dirName$] = value;
+  }
+};
+const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
+html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.TextInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
+  fields: () => ({dirName: core.String})
+});
+dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
+html$.UrlInputElement = class UrlInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'url'});
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
+  }
+};
+html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.UrlInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'tel'});
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
+  }
+};
+html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.TelephoneInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionNames([
+  'autocomplete',
+  'autofocus',
+  'maxLength',
+  'multiple',
+  'pattern',
+  'placeholder',
+  'readOnly',
+  'required',
+  'size'
+]);
+html$.EmailInputElement = class EmailInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'email'});
+  }
+  get autocomplete() {
+    return this[autocomplete$];
+  }
+  set autocomplete(value) {
+    this[autocomplete$] = value;
+  }
+  get autofocus() {
+    return this[autofocus$];
+  }
+  set autofocus(value) {
+    this[autofocus$] = value;
+  }
+  get maxLength() {
+    return this[maxLength$];
+  }
+  set maxLength(value) {
+    this[maxLength$] = value;
+  }
+  get multiple() {
+    return this[multiple];
+  }
+  set multiple(value) {
+    this[multiple] = value;
+  }
+  get pattern() {
+    return this[pattern$];
+  }
+  set pattern(value) {
+    this[pattern$] = value;
+  }
+  get placeholder() {
+    return this[placeholder$];
+  }
+  set placeholder(value) {
+    this[placeholder$] = value;
+  }
+  get readOnly() {
+    return this[readOnly$];
+  }
+  set readOnly(value) {
+    this[readOnly$] = value;
+  }
+  get required() {
+    return this[required$];
+  }
+  set required(value) {
+    this[required$] = value;
+  }
+  get size() {
+    return this[size$];
+  }
+  set size(value) {
+    this[size$] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
+  }
+};
+const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
+const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
+const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
+const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
+const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
+const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
+const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
+const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
+const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
+html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.EmailInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
+  fields: () => ({
+    autocomplete: core.String,
+    autofocus: core.bool,
+    maxLength: core.int,
+    multiple: core.bool,
+    pattern: core.String,
+    placeholder: core.String,
+    readOnly: core.bool,
+    required: core.bool,
+    size: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.EmailInputElement, [
+  'autocomplete',
+  'autocomplete',
+  'autofocus',
+  'autofocus',
+  'maxLength',
+  'maxLength',
+  'multiple',
+  'multiple',
+  'pattern',
+  'pattern',
+  'placeholder',
+  'placeholder',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required',
+  'size',
+  'size'
+]);
+html$.PasswordInputElement = class PasswordInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'password'});
+  }
+};
+html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.PasswordInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
+});
+dart.defineExtensionNames([
+  'max',
+  'min',
+  'step',
+  'valueAsNumber'
+]);
+html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
+  new() {
+    this[max] = null;
+    this[min] = null;
+    this[step] = null;
+    this[valueAsNumber] = null;
+  }
+  get max() {
+    return this[max];
+  }
+  set max(value) {
+    this[max] = value;
+  }
+  get min() {
+    return this[min];
+  }
+  set min(value) {
+    this[min] = value;
+  }
+  get step() {
+    return this[step];
+  }
+  set step(value) {
+    this[step] = value;
+  }
+  get valueAsNumber() {
+    return this[valueAsNumber];
+  }
+  set valueAsNumber(value) {
+    this[valueAsNumber] = value;
+  }
+};
+const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
+const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
+const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
+const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
+html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.RangeInputElementBase, {
+  fields: () => ({
+    max: core.String,
+    min: core.String,
+    step: core.String,
+    valueAsNumber: core.num
+  })
+});
+dart.defineExtensionMembers(html$.RangeInputElementBase, [
+  'max',
+  'max',
+  'min',
+  'min',
+  'step',
+  'step',
+  'valueAsNumber',
+  'valueAsNumber'
+]);
+dart.defineExtensionNames([
+  'valueAsDate',
+  'readOnly',
+  'required'
+]);
+html$.DateInputElement = class DateInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'date'});
+  }
+  get valueAsDate() {
+    return this[valueAsDate];
+  }
+  set valueAsDate(value) {
+    this[valueAsDate] = value;
+  }
+  get readOnly() {
+    return this[readOnly$0];
+  }
+  set readOnly(value) {
+    this[readOnly$0] = value;
+  }
+  get required() {
+    return this[required$0];
+  }
+  set required(value) {
+    this[required$0] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
+  }
+};
+const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
+const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
+html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.DateInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
+  fields: () => ({
+    valueAsDate: core.DateTime,
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.DateInputElement, [
+  'valueAsDate',
+  'valueAsDate',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required'
+]);
+dart.defineExtensionNames([
+  'valueAsDate',
+  'readOnly',
+  'required'
+]);
+html$.MonthInputElement = class MonthInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'month'});
+  }
+  get valueAsDate() {
+    return this[valueAsDate$];
+  }
+  set valueAsDate(value) {
+    this[valueAsDate$] = value;
+  }
+  get readOnly() {
+    return this[readOnly$1];
+  }
+  set readOnly(value) {
+    this[readOnly$1] = value;
+  }
+  get required() {
+    return this[required$1];
+  }
+  set required(value) {
+    this[required$1] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
+  }
+};
+const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
+const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
+html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.MonthInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
+  fields: () => ({
+    valueAsDate: core.DateTime,
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.MonthInputElement, [
+  'valueAsDate',
+  'valueAsDate',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required'
+]);
+dart.defineExtensionNames([
+  'valueAsDate',
+  'readOnly',
+  'required'
+]);
+html$.WeekInputElement = class WeekInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'week'});
+  }
+  get valueAsDate() {
+    return this[valueAsDate$0];
+  }
+  set valueAsDate(value) {
+    this[valueAsDate$0] = value;
+  }
+  get readOnly() {
+    return this[readOnly$2];
+  }
+  set readOnly(value) {
+    this[readOnly$2] = value;
+  }
+  get required() {
+    return this[required$2];
+  }
+  set required(value) {
+    this[required$2] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
+  }
+};
+const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
+const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
+html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.WeekInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
+  fields: () => ({
+    valueAsDate: core.DateTime,
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.WeekInputElement, [
+  'valueAsDate',
+  'valueAsDate',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required'
+]);
+dart.defineExtensionNames([
+  'valueAsDate',
+  'readOnly',
+  'required'
+]);
+html$.TimeInputElement = class TimeInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'time'});
+  }
+  get valueAsDate() {
+    return this[valueAsDate$1];
+  }
+  set valueAsDate(value) {
+    this[valueAsDate$1] = value;
+  }
+  get readOnly() {
+    return this[readOnly$3];
+  }
+  set readOnly(value) {
+    this[readOnly$3] = value;
+  }
+  get required() {
+    return this[required$3];
+  }
+  set required(value) {
+    this[required$3] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
+  }
+};
+const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
+const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
+html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.TimeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
+  fields: () => ({
+    valueAsDate: core.DateTime,
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.TimeInputElement, [
+  'valueAsDate',
+  'valueAsDate',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required'
+]);
+dart.defineExtensionNames([
+  'readOnly',
+  'required'
+]);
+html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'datetime-local'});
+  }
+  get readOnly() {
+    return this[readOnly$4];
+  }
+  set readOnly(value) {
+    this[readOnly$4] = value;
+  }
+  get required() {
+    return this[required$4];
+  }
+  set required(value) {
+    this[required$4] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
+  }
+};
+const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
+const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
+html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.LocalDateTimeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
+  fields: () => ({
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
+dart.defineExtensionNames([
+  'placeholder',
+  'readOnly',
+  'required'
+]);
+html$.NumberInputElement = class NumberInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'number'});
+  }
+  get placeholder() {
+    return this[placeholder$0];
+  }
+  set placeholder(value) {
+    this[placeholder$0] = value;
+  }
+  get readOnly() {
+    return this[readOnly$5];
+  }
+  set readOnly(value) {
+    this[readOnly$5] = value;
+  }
+  get required() {
+    return this[required$5];
+  }
+  set required(value) {
+    this[required$5] = value;
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
+  }
+};
+const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
+const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
+const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
+html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.NumberInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
+  fields: () => ({
+    placeholder: core.String,
+    readOnly: core.bool,
+    required: core.bool
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionMembers(html$.NumberInputElement, [
+  'placeholder',
+  'placeholder',
+  'readOnly',
+  'readOnly',
+  'required',
+  'required'
+]);
+html$.RangeInputElement = class RangeInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'range'});
+  }
+  static get supported() {
+    return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
+  }
+};
+html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.RangeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineExtensionNames([
+  'checked',
+  'required'
+]);
+html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'checkbox'});
+  }
+  get checked() {
+    return this[checked];
+  }
+  set checked(value) {
+    this[checked] = value;
+  }
+  get required() {
+    return this[required$6];
+  }
+  set required(value) {
+    this[required$6] = value;
+  }
+};
+const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
+const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
+html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.CheckboxInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
+  fields: () => ({
+    checked: core.bool,
+    required: core.bool
+  })
+});
+dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
+dart.defineExtensionNames([
+  'checked',
+  'required'
+]);
+html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'radio'});
+  }
+  get checked() {
+    return this[checked$];
+  }
+  set checked(value) {
+    this[checked$] = value;
+  }
+  get required() {
+    return this[required$7];
+  }
+  set required(value) {
+    this[required$7] = value;
+  }
+};
+const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
+const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
+html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.RadioButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
+  fields: () => ({
+    checked: core.bool,
+    required: core.bool
+  })
+});
+dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
+dart.defineExtensionNames([
+  'accept',
+  'multiple',
+  'required',
+  'files'
+]);
+html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'file'});
+  }
+  get accept() {
+    return this[accept];
+  }
+  set accept(value) {
+    this[accept] = value;
+  }
+  get multiple() {
+    return this[multiple$];
+  }
+  set multiple(value) {
+    this[multiple$] = value;
+  }
+  get required() {
+    return this[required$8];
+  }
+  set required(value) {
+    this[required$8] = value;
+  }
+  get files() {
+    return this[files];
+  }
+  set files(value) {
+    this[files] = value;
+  }
+};
+const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
+const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
+const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
+const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
+html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.FileUploadInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
+  fields: () => ({
+    accept: core.String,
+    multiple: core.bool,
+    required: core.bool,
+    files: ListOfFile()
+  })
+});
+dart.defineExtensionMembers(html$.FileUploadInputElement, [
+  'accept',
+  'accept',
+  'multiple',
+  'multiple',
+  'required',
+  'required',
+  'files',
+  'files'
+]);
+dart.defineExtensionNames([
+  'formAction',
+  'formEnctype',
+  'formMethod',
+  'formNoValidate',
+  'formTarget'
+]);
+html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'submit'});
+  }
+  get formAction() {
+    return this[formAction];
+  }
+  set formAction(value) {
+    this[formAction] = value;
+  }
+  get formEnctype() {
+    return this[formEnctype];
+  }
+  set formEnctype(value) {
+    this[formEnctype] = value;
+  }
+  get formMethod() {
+    return this[formMethod];
+  }
+  set formMethod(value) {
+    this[formMethod] = value;
+  }
+  get formNoValidate() {
+    return this[formNoValidate];
+  }
+  set formNoValidate(value) {
+    this[formNoValidate] = value;
+  }
+  get formTarget() {
+    return this[formTarget];
+  }
+  set formTarget(value) {
+    this[formTarget] = value;
+  }
+};
+const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
+const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
+const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
+const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
+const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
+html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.SubmitButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
+  fields: () => ({
+    formAction: core.String,
+    formEnctype: core.String,
+    formMethod: core.String,
+    formNoValidate: core.bool,
+    formTarget: core.String
+  })
+});
+dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
+  'formAction',
+  'formAction',
+  'formEnctype',
+  'formEnctype',
+  'formMethod',
+  'formMethod',
+  'formNoValidate',
+  'formNoValidate',
+  'formTarget',
+  'formTarget'
+]);
+dart.defineExtensionNames([
+  'alt',
+  'formAction',
+  'formEnctype',
+  'formMethod',
+  'formNoValidate',
+  'formTarget',
+  'height',
+  'src',
+  'width'
+]);
+html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'image'});
+  }
+  get alt() {
+    return this[alt];
+  }
+  set alt(value) {
+    this[alt] = value;
+  }
+  get formAction() {
+    return this[formAction$];
+  }
+  set formAction(value) {
+    this[formAction$] = value;
+  }
+  get formEnctype() {
+    return this[formEnctype$];
+  }
+  set formEnctype(value) {
+    this[formEnctype$] = value;
+  }
+  get formMethod() {
+    return this[formMethod$];
+  }
+  set formMethod(value) {
+    this[formMethod$] = value;
+  }
+  get formNoValidate() {
+    return this[formNoValidate$];
+  }
+  set formNoValidate(value) {
+    this[formNoValidate$] = value;
+  }
+  get formTarget() {
+    return this[formTarget$];
+  }
+  set formTarget(value) {
+    this[formTarget$] = value;
+  }
+  get height() {
+    return this[height];
+  }
+  set height(value) {
+    this[height] = value;
+  }
+  get src() {
+    return this[src];
+  }
+  set src(value) {
+    this[src] = value;
+  }
+  get width() {
+    return this[width];
+  }
+  set width(value) {
+    this[width] = value;
+  }
+};
+const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
+const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
+const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
+const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
+const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
+const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
+const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
+const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
+const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
+html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ImageButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
+  fields: () => ({
+    alt: core.String,
+    formAction: core.String,
+    formEnctype: core.String,
+    formMethod: core.String,
+    formNoValidate: core.bool,
+    formTarget: core.String,
+    height: core.int,
+    src: core.String,
+    width: core.int
+  })
+});
+dart.defineExtensionMembers(html$.ImageButtonInputElement, [
+  'alt',
+  'alt',
+  'formAction',
+  'formAction',
+  'formEnctype',
+  'formEnctype',
+  'formMethod',
+  'formMethod',
+  'formNoValidate',
+  'formNoValidate',
+  'formTarget',
+  'formTarget',
+  'height',
+  'height',
+  'src',
+  'src',
+  'width',
+  'width'
+]);
+html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'reset'});
+  }
+};
+html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ResetButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
+});
+html$.ButtonInputElement = class ButtonInputElement extends core.Object {
+  static new() {
+    return html$.InputElement.new({type: 'button'});
+  }
+};
+html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
+});
+const _initKeyboardEvent = Symbol('_initKeyboardEvent');
+const _keyIdentifier = Symbol('_keyIdentifier');
+dart.defineExtensionNames([
+  'keyCode',
+  'charCode',
+  'which',
+  'getModifierState',
+  'altKey',
+  'code',
+  'ctrlKey',
+  'key',
+  'keyLocation',
+  'location',
+  'metaKey',
+  'repeat',
+  'shiftKey'
+]);
+html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
+  static new(type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
+    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
+    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
+    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
+    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
+    if (view == null) {
+      view = html$.window;
+    }
+    let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
+    e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+    return e;
+  }
+  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
+    if (typeof this.initKeyEvent == "function") {
+      this.initKeyEvent(type, canBubble, cancelable, view, ctrlKey, altKey, shiftKey, metaKey, 0, 0);
+    } else {
+      this.initKeyboardEvent(type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+    }
+  }
+  get [dartx.keyCode]() {
+    return this[_keyCode];
+  }
+  get [dartx.charCode]() {
+    return this[_charCode];
+  }
+  get [dartx.which]() {
+    return this[_which];
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.KeyboardEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.KeyboardEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.KeyboardEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.KeyboardEvent(type);
+  }
+  get [dartx.altKey]() {
+    return this.altKey;
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+  get [dartx.ctrlKey]() {
+    return this.ctrlKey;
+  }
+  get [dartx.key]() {
+    return this.key;
+  }
+  get [_keyIdentifier]() {
+    return this.keyIdentifier;
+  }
+  get [dartx.keyLocation]() {
+    return this.keyLocation;
+  }
+  get [dartx.location]() {
+    return this.location;
+  }
+  get [dartx.metaKey]() {
+    return this.metaKey;
+  }
+  get [dartx.repeat]() {
+    return this.repeat;
+  }
+  get [dartx.shiftKey]() {
+    return this.shiftKey;
+  }
+  [dartx.getModifierState](...args) {
+    return this.getModifierState.apply(this, args);
+  }
+};
+dart.setSignature(html$.KeyboardEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
+    _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.altKey]: core.bool,
+    [dartx.code]: core.String,
+    [dartx.ctrlKey]: core.bool,
+    [dartx.key]: core.String,
+    [_keyIdentifier]: core.String,
+    [dartx.keyLocation]: core.int,
+    [dartx.location]: core.int,
+    [dartx.metaKey]: core.bool,
+    [dartx.repeat]: core.bool,
+    [dartx.shiftKey]: core.bool
+  }),
+  getters: () => ({
+    [dartx.keyCode]: dart.definiteFunctionType(core.int, []),
+    [dartx.charCode]: dart.definiteFunctionType(core.int, []),
+    [dartx.which]: dart.definiteFunctionType(core.int, [])
+  }),
+  methods: () => ({
+    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
+    [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  sfields: () => ({
+    DOM_KEY_LOCATION_LEFT: core.int,
+    DOM_KEY_LOCATION_NUMPAD: core.int,
+    DOM_KEY_LOCATION_RIGHT: core.int,
+    DOM_KEY_LOCATION_STANDARD: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
+html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
+html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
+html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
+dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
+html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(target, keyframes, timing) {
+    if (timing === void 0) timing = null;
+    if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
+      return html$.KeyframeEffect._create_1(target, keyframes);
+    }
+    if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
+      return html$.KeyframeEffect._create_2(target, keyframes, timing);
+    }
+    if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
+      let timing_1 = html_common.convertDartToNative_Dictionary(timing);
+      return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1(target, keyframes) {
+    return new self.KeyframeEffect(target, keyframes);
+  }
+  static _create_2(target, keyframes, timing) {
+    return new self.KeyframeEffect(target, keyframes, timing);
+  }
+  static _create_3(target, keyframes, timing) {
+    return new self.KeyframeEffect(target, keyframes, timing);
+  }
+};
+dart.setSignature(html$.KeyframeEffect, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.KeyframeEffect, []),
+    new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'setCustomValidity',
+  'autofocus',
+  'challenge',
+  'disabled',
+  'form',
+  'keytype',
+  'labels',
+  'name',
+  'type',
+  'validationMessage',
+  'validity',
+  'willValidate'
+]);
+html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
+  }
+  created() {
+    this[dartx.autofocus] = null;
+    this[dartx.challenge] = null;
+    this[dartx.disabled] = null;
+    this[dartx.form] = null;
+    this[dartx.keytype] = null;
+    this[dartx.labels] = null;
+    this[dartx.name] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
+  }
+  get [dartx.autofocus]() {
+    return this.autofocus;
+  }
+  set [dartx.autofocus](value) {
+    this.autofocus = value;
+  }
+  get [dartx.challenge]() {
+    return this.challenge;
+  }
+  set [dartx.challenge](value) {
+    this.challenge = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.keytype]() {
+    return this.keytype;
+  }
+  set [dartx.keytype](value) {
+    this.keytype = value;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.KeygenElement, 'created');
+dart.setSignature(html$.KeygenElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.KeygenElement, []),
+    new: dart.definiteFunctionType(html$.KeygenElement, []),
+    created: dart.definiteFunctionType(html$.KeygenElement, [])
+  }),
+  fields: () => ({
+    [dartx.autofocus]: core.bool,
+    [dartx.challenge]: core.String,
+    [dartx.disabled]: core.bool,
+    [dartx.form]: html$.FormElement,
+    [dartx.keytype]: core.String,
+    [dartx.labels]: ListOfNode(),
+    [dartx.name]: core.String,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.willValidate]: core.bool
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
+dart.defineExtensionNames([
+  'value'
+]);
+html$.LIElement = class LIElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.LIElement._check(html$.document[dartx.createElement]("li"));
+  }
+  created() {
+    this[dartx.value] = null;
+    super.created();
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.defineNamedConstructor(html$.LIElement, 'created');
+dart.setSignature(html$.LIElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.LIElement, []),
+    new: dart.definiteFunctionType(html$.LIElement, []),
+    created: dart.definiteFunctionType(html$.LIElement, [])
+  }),
+  fields: () => ({[dartx.value]: core.int})
+});
+dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
+dart.defineExtensionNames([
+  'control',
+  'form',
+  'htmlFor'
+]);
+html$.LabelElement = class LabelElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
+  }
+  created() {
+    this[dartx.control] = null;
+    this[dartx.form] = null;
+    this[dartx.htmlFor] = null;
+    super.created();
+  }
+  get [dartx.control]() {
+    return this.control;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.htmlFor]() {
+    return this.htmlFor;
+  }
+  set [dartx.htmlFor](value) {
+    this.htmlFor = value;
+  }
+};
+dart.defineNamedConstructor(html$.LabelElement, 'created');
+dart.setSignature(html$.LabelElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.LabelElement, []),
+    new: dart.definiteFunctionType(html$.LabelElement, []),
+    created: dart.definiteFunctionType(html$.LabelElement, [])
+  }),
+  fields: () => ({
+    [dartx.control]: html$.HtmlElement,
+    [dartx.form]: html$.FormElement,
+    [dartx.htmlFor]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
+dart.defineExtensionNames([
+  'form'
+]);
+html$.LegendElement = class LegendElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
+  }
+  created() {
+    this[dartx.form] = null;
+    super.created();
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+};
+dart.defineNamedConstructor(html$.LegendElement, 'created');
+dart.setSignature(html$.LegendElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.LegendElement, []),
+    new: dart.definiteFunctionType(html$.LegendElement, []),
+    created: dart.definiteFunctionType(html$.LegendElement, [])
+  }),
+  fields: () => ({[dartx.form]: html$.FormElement})
+});
+dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
+dart.defineExtensionNames([
+  'supportsImport',
+  'crossOrigin',
+  'disabled',
+  'href',
+  'hreflang',
+  'import',
+  'integrity',
+  'media',
+  'rel',
+  'sheet',
+  'sizes',
+  'type'
+]);
+html$.LinkElement = class LinkElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
+  }
+  created() {
+    this[dartx.crossOrigin] = null;
+    this[dartx.disabled] = null;
+    this[dartx.href] = null;
+    this[dartx.hreflang] = null;
+    this[dartx.import] = null;
+    this[dartx.integrity] = null;
+    this[dartx.media] = null;
+    this[dartx.rel] = null;
+    this[dartx.sheet] = null;
+    this[dartx.sizes] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.crossOrigin]() {
+    return this.crossOrigin;
+  }
+  set [dartx.crossOrigin](value) {
+    this.crossOrigin = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.hreflang]() {
+    return this.hreflang;
+  }
+  set [dartx.hreflang](value) {
+    this.hreflang = value;
+  }
+  get [dartx.import]() {
+    return this.import;
+  }
+  get [dartx.integrity]() {
+    return this.integrity;
+  }
+  set [dartx.integrity](value) {
+    this.integrity = value;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  set [dartx.media](value) {
+    this.media = value;
+  }
+  get [dartx.rel]() {
+    return this.rel;
+  }
+  set [dartx.rel](value) {
+    this.rel = value;
+  }
+  get [dartx.sheet]() {
+    return this.sheet;
+  }
+  get [dartx.sizes]() {
+    return this.sizes;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.supportsImport]() {
+    return "import" in this;
+  }
+};
+dart.defineNamedConstructor(html$.LinkElement, 'created');
+dart.setSignature(html$.LinkElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.LinkElement, []),
+    new: dart.definiteFunctionType(html$.LinkElement, []),
+    created: dart.definiteFunctionType(html$.LinkElement, [])
+  }),
+  fields: () => ({
+    [dartx.crossOrigin]: core.String,
+    [dartx.disabled]: core.bool,
+    [dartx.href]: core.String,
+    [dartx.hreflang]: core.String,
+    [dartx.import]: html$.Document,
+    [dartx.integrity]: core.String,
+    [dartx.media]: core.String,
+    [dartx.rel]: core.String,
+    [dartx.sheet]: html$.StyleSheet,
+    [dartx.sizes]: html$.DomSettableTokenList,
+    [dartx.type]: core.String
+  }),
+  getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
+dart.defineExtensionNames([
+  'assign',
+  'reload',
+  'replace',
+  'origin',
+  'toString',
+  'ancestorOrigins',
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'pathname',
+  'port',
+  'protocol',
+  'search'
+]);
+html$.Location = class Location extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.ancestorOrigins]() {
+    return this.ancestorOrigins;
+  }
+  get [dartx.hash]() {
+    return this.hash;
+  }
+  set [dartx.hash](value) {
+    this.hash = value;
+  }
+  get [dartx.host]() {
+    return this.host;
+  }
+  set [dartx.host](value) {
+    this.host = value;
+  }
+  get [dartx.hostname]() {
+    return this.hostname;
+  }
+  set [dartx.hostname](value) {
+    this.hostname = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.pathname]() {
+    return this.pathname;
+  }
+  set [dartx.pathname](value) {
+    this.pathname = value;
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+  set [dartx.port](value) {
+    this.port = value;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  set [dartx.protocol](value) {
+    this.protocol = value;
+  }
+  get [dartx.search]() {
+    return this.search;
+  }
+  set [dartx.search](value) {
+    this.search = value;
+  }
+  [dartx.assign](...args) {
+    return this.assign.apply(this, args);
+  }
+  [dartx.reload](...args) {
+    return this.reload.apply(this, args);
+  }
+  [dartx.replace](...args) {
+    return this.replace.apply(this, args);
+  }
+  get [dartx.origin]() {
+    if ("origin" in this) {
+      return this.origin;
+    }
+    return dart.str`${this[dartx.protocol]}//${this[dartx.host]}`;
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+};
+html$.Location[dart.implements] = () => [html$.LocationBase];
+dart.setSignature(html$.Location, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
+  fields: () => ({
+    [dartx.ancestorOrigins]: ListOfString(),
+    [dartx.hash]: core.String,
+    [dartx.host]: core.String,
+    [dartx.hostname]: core.String,
+    [dartx.href]: core.String,
+    [dartx.pathname]: core.String,
+    [dartx.port]: core.String,
+    [dartx.protocol]: core.String,
+    [dartx.search]: core.String
+  }),
+  getters: () => ({[dartx.origin]: dart.definiteFunctionType(core.String, [])}),
+  methods: () => ({
+    [dartx.assign]: dart.definiteFunctionType(dart.void, [], [core.String]),
+    [dartx.reload]: dart.definiteFunctionType(dart.void, []),
+    [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.registerExtension(dart.global.Location, html$.Location);
+dart.defineExtensionNames([
+  'areas',
+  'name'
+]);
+html$.MapElement = class MapElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MapElement._check(html$.document[dartx.createElement]("map"));
+  }
+  created() {
+    this[dartx.areas] = null;
+    this[dartx.name] = null;
+    super.created();
+  }
+  get [dartx.areas]() {
+    return this.areas;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+};
+dart.defineNamedConstructor(html$.MapElement, 'created');
+dart.setSignature(html$.MapElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MapElement, []),
+    new: dart.definiteFunctionType(html$.MapElement, []),
+    created: dart.definiteFunctionType(html$.MapElement, [])
+  }),
+  fields: () => ({
+    [dartx.areas]: ListOfNode(),
+    [dartx.name]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
+dart.defineExtensionNames([
+  'pause',
+  'play',
+  'unpause',
+  'buffered',
+  'currentTime',
+  'defaultPlaybackRate',
+  'duration',
+  'muted',
+  'paused',
+  'playbackRate',
+  'playbackState',
+  'played',
+  'seekable',
+  'volume'
+]);
+html$.MediaController = class MediaController extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MediaController._create_1();
+  }
+  static _create_1() {
+    return new self.MediaController();
+  }
+  get [dartx.buffered]() {
+    return this.buffered;
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  set [dartx.currentTime](value) {
+    this.currentTime = value;
+  }
+  get [dartx.defaultPlaybackRate]() {
+    return this.defaultPlaybackRate;
+  }
+  set [dartx.defaultPlaybackRate](value) {
+    this.defaultPlaybackRate = value;
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  get [dartx.muted]() {
+    return this.muted;
+  }
+  set [dartx.muted](value) {
+    this.muted = value;
+  }
+  get [dartx.paused]() {
+    return this.paused;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  set [dartx.playbackRate](value) {
+    this.playbackRate = value;
+  }
+  get [dartx.playbackState]() {
+    return this.playbackState;
+  }
+  get [dartx.played]() {
+    return this.played;
+  }
+  get [dartx.seekable]() {
+    return this.seekable;
+  }
+  get [dartx.volume]() {
+    return this.volume;
+  }
+  set [dartx.volume](value) {
+    this.volume = value;
+  }
+  [dartx.pause](...args) {
+    return this.pause.apply(this, args);
+  }
+  [dartx.play](...args) {
+    return this.play.apply(this, args);
+  }
+  [dartx.unpause](...args) {
+    return this.unpause.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaController, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaController, []),
+    new: dart.definiteFunctionType(html$.MediaController, [])
+  }),
+  fields: () => ({
+    [dartx.buffered]: html$.TimeRanges,
+    [dartx.currentTime]: core.num,
+    [dartx.defaultPlaybackRate]: core.num,
+    [dartx.duration]: core.double,
+    [dartx.muted]: core.bool,
+    [dartx.paused]: core.bool,
+    [dartx.playbackRate]: core.num,
+    [dartx.playbackState]: core.String,
+    [dartx.played]: html$.TimeRanges,
+    [dartx.seekable]: html$.TimeRanges,
+    [dartx.volume]: core.num
+  }),
+  methods: () => ({
+    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
+    [dartx.play]: dart.definiteFunctionType(dart.void, []),
+    [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.MediaController, html$.MediaController);
+dart.defineExtensionNames([
+  'deviceId',
+  'groupId',
+  'kind',
+  'label'
+]);
+html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.deviceId]() {
+    return this.deviceId;
+  }
+  get [dartx.groupId]() {
+    return this.groupId;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+};
+dart.setSignature(html$.MediaDeviceInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
+  fields: () => ({
+    [dartx.deviceId]: core.String,
+    [dartx.groupId]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String
+  })
+});
+dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
+const _getUserMedia_1 = Symbol('_getUserMedia_1');
+dart.defineExtensionNames([
+  'enumerateDevices',
+  'getUserMedia'
+]);
+html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.enumerateDevices](...args) {
+    return this.enumerateDevices.apply(this, args);
+  }
+  [dartx.getUserMedia](options) {
+    let options_1 = html_common.convertDartToNative_Dictionary(options);
+    return this[_getUserMedia_1](options_1);
+  }
+  [_getUserMedia_1](...args) {
+    return this.getUserMedia.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaDevices, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
+  methods: () => ({
+    [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
+    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
+    [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
+dart.defineExtensionNames([
+  'initData',
+  'initDataType'
+]);
+html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MediaEncryptedEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MediaEncryptedEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MediaEncryptedEvent(type);
+  }
+  get [dartx.initData]() {
+    return this.initData;
+  }
+  get [dartx.initDataType]() {
+    return this.initDataType;
+  }
+};
+dart.setSignature(html$.MediaEncryptedEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
+    new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.initData]: typed_data.ByteBuffer,
+    [dartx.initDataType]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
+dart.defineExtensionNames([
+  'code'
+]);
+html$.MediaError = class MediaError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+};
+dart.setSignature(html$.MediaError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
+  fields: () => ({[dartx.code]: core.int}),
+  sfields: () => ({
+    MEDIA_ERR_ABORTED: core.int,
+    MEDIA_ERR_DECODE: core.int,
+    MEDIA_ERR_NETWORK: core.int,
+    MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
+  })
+});
+html$.MediaError.MEDIA_ERR_ABORTED = 1;
+html$.MediaError.MEDIA_ERR_DECODE = 3;
+html$.MediaError.MEDIA_ERR_NETWORK = 2;
+html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+dart.registerExtension(dart.global.MediaError, html$.MediaError);
+dart.defineExtensionNames([
+  'code',
+  'systemCode'
+]);
+html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+  get [dartx.systemCode]() {
+    return this.systemCode;
+  }
+};
+dart.setSignature(html$.MediaKeyError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
+  fields: () => ({
+    [dartx.code]: core.int,
+    [dartx.systemCode]: core.int
+  }),
+  sfields: () => ({
+    MEDIA_KEYERR_CLIENT: core.int,
+    MEDIA_KEYERR_DOMAIN: core.int,
+    MEDIA_KEYERR_HARDWARECHANGE: core.int,
+    MEDIA_KEYERR_OUTPUT: core.int,
+    MEDIA_KEYERR_SERVICE: core.int,
+    MEDIA_KEYERR_UNKNOWN: core.int
+  })
+});
+html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
+html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
+html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
+html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
+html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
+html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
+dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
+dart.defineExtensionNames([
+  'defaultUrl',
+  'errorCode',
+  'initData',
+  'keySystem',
+  'message',
+  'sessionId',
+  'systemCode'
+]);
+html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MediaKeyEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MediaKeyEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MediaKeyEvent(type);
+  }
+  get [dartx.defaultUrl]() {
+    return this.defaultURL;
+  }
+  get [dartx.errorCode]() {
+    return this.errorCode;
+  }
+  get [dartx.initData]() {
+    return this.initData;
+  }
+  get [dartx.keySystem]() {
+    return this.keySystem;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  get [dartx.sessionId]() {
+    return this.sessionId;
+  }
+  get [dartx.systemCode]() {
+    return this.systemCode;
+  }
+};
+dart.setSignature(html$.MediaKeyEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
+    new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.defaultUrl]: core.String,
+    [dartx.errorCode]: html$.MediaKeyError,
+    [dartx.initData]: typed_data.Uint8List,
+    [dartx.keySystem]: core.String,
+    [dartx.message]: typed_data.Uint8List,
+    [dartx.sessionId]: core.String,
+    [dartx.systemCode]: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
+dart.defineExtensionNames([
+  'message',
+  'messageType'
+]);
+html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MediaKeyMessageEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MediaKeyMessageEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MediaKeyMessageEvent(type);
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  get [dartx.messageType]() {
+    return this.messageType;
+  }
+};
+dart.setSignature(html$.MediaKeyMessageEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
+    new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.message]: typed_data.ByteBuffer,
+    [dartx.messageType]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
+const _update$ = Symbol('_update');
+dart.defineExtensionNames([
+  'close',
+  'generateRequest',
+  'load',
+  'remove',
+  'closed',
+  'expiration',
+  'keyStatuses',
+  'sessionId'
+]);
+html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.closed]() {
+    return this.closed;
+  }
+  get [dartx.expiration]() {
+    return this.expiration;
+  }
+  get [dartx.keyStatuses]() {
+    return this.keyStatuses;
+  }
+  get [dartx.sessionId]() {
+    return this.sessionId;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.generateRequest](...args) {
+    return this.generateRequest.apply(this, args);
+  }
+  [dartx.load](...args) {
+    return this.load.apply(this, args);
+  }
+  [dartx.remove](...args) {
+    return this.remove.apply(this, args);
+  }
+  [_update$](...args) {
+    return this.update.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaKeySession, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
+  fields: () => ({
+    [dartx.closed]: async.Future,
+    [dartx.expiration]: core.double,
+    [dartx.keyStatuses]: html$.MediaKeyStatusMap,
+    [dartx.sessionId]: core.String
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(async.Future, []),
+    [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
+    [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.remove]: dart.definiteFunctionType(async.Future, []),
+    [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
+dart.defineExtensionNames([
+  'size'
+]);
+html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+};
+dart.setSignature(html$.MediaKeyStatusMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
+  fields: () => ({[dartx.size]: core.int})
+});
+dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
+const _getConfiguration_1 = Symbol('_getConfiguration_1');
+dart.defineExtensionNames([
+  'createMediaKeys',
+  'getConfiguration',
+  'keySystem'
+]);
+html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.keySystem]() {
+    return this.keySystem;
+  }
+  [dartx.createMediaKeys](...args) {
+    return this.createMediaKeys.apply(this, args);
+  }
+  [dartx.getConfiguration]() {
+    return html_common.convertNativeToDart_Dictionary(this[_getConfiguration_1]());
+  }
+  [_getConfiguration_1](...args) {
+    return this.getConfiguration.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaKeySystemAccess, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
+  fields: () => ({[dartx.keySystem]: core.String}),
+  methods: () => ({
+    [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
+    [dartx.getConfiguration]: dart.definiteFunctionType(core.Map, []),
+    [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
+  })
+});
+dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
+const _createSession = Symbol('_createSession');
+dart.defineExtensionNames([
+  'setServerCertificate'
+]);
+html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_createSession](...args) {
+    return this.createSession.apply(this, args);
+  }
+  [dartx.setServerCertificate](...args) {
+    return this.setServerCertificate.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaKeys, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
+  methods: () => ({
+    [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
+    [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
+dart.defineExtensionNames([
+  'appendMedium',
+  'deleteMedium',
+  'item',
+  'length',
+  'mediaText'
+]);
+html$.MediaList = class MediaList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.mediaText]() {
+    return this.mediaText;
+  }
+  set [dartx.mediaText](value) {
+    this.mediaText = value;
+  }
+  [dartx.appendMedium](...args) {
+    return this.appendMedium.apply(this, args);
+  }
+  [dartx.deleteMedium](...args) {
+    return this.deleteMedium.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
+  fields: () => ({
+    [dartx.length]: core.int,
+    [dartx.mediaText]: core.String
+  }),
+  methods: () => ({
+    [dartx.appendMedium]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.deleteMedium]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
+  })
+});
+dart.registerExtension(dart.global.MediaList, html$.MediaList);
+dart.defineExtensionNames([
+  'addListener',
+  'removeListener',
+  'onChange',
+  'matches',
+  'media'
+]);
+html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.matches]() {
+    return this.matches;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  [dartx.addListener](...args) {
+    return this.addListener.apply(this, args);
+  }
+  [dartx.removeListener](...args) {
+    return this.removeListener.apply(this, args);
+  }
+  get [dartx.onChange]() {
+    return html$.MediaQueryList.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.MediaQueryList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
+  fields: () => ({
+    [dartx.matches]: core.bool,
+    [dartx.media]: core.String
+  }),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
+    [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
+  }),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.MediaQueryList, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
+dart.defineExtensionNames([
+  'matches',
+  'media'
+]);
+html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MediaQueryListEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MediaQueryListEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MediaQueryListEvent(type);
+  }
+  get [dartx.matches]() {
+    return this.matches;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+};
+dart.setSignature(html$.MediaQueryListEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
+    new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.matches]: core.bool,
+    [dartx.media]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
+dart.defineExtensionNames([
+  'activate',
+  'deactivate'
+]);
+html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MediaSession._create_1();
+  }
+  static _create_1() {
+    return new self.MediaSession();
+  }
+  [dartx.activate](...args) {
+    return this.activate.apply(this, args);
+  }
+  [dartx.deactivate](...args) {
+    return this.deactivate.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaSession, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaSession, []),
+    new: dart.definiteFunctionType(html$.MediaSession, [])
+  }),
+  methods: () => ({
+    [dartx.activate]: dart.definiteFunctionType(dart.void, []),
+    [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
+dart.defineExtensionNames([
+  'addSourceBuffer',
+  'endOfStream',
+  'removeSourceBuffer',
+  'activeSourceBuffers',
+  'duration',
+  'readyState',
+  'sourceBuffers'
+]);
+html$.MediaSource = class MediaSource extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MediaSource._create_1();
+  }
+  static _create_1() {
+    return new self.MediaSource();
+  }
+  static get supported() {
+    return !!window.MediaSource;
+  }
+  get [dartx.activeSourceBuffers]() {
+    return this.activeSourceBuffers;
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  set [dartx.duration](value) {
+    this.duration = value;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.sourceBuffers]() {
+    return this.sourceBuffers;
+  }
+  [dartx.addSourceBuffer](...args) {
+    return this.addSourceBuffer.apply(this, args);
+  }
+  [dartx.endOfStream](...args) {
+    return this.endOfStream.apply(this, args);
+  }
+  [dartx.removeSourceBuffer](...args) {
+    return this.removeSourceBuffer.apply(this, args);
+  }
+};
+dart.setSignature(html$.MediaSource, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaSource, []),
+    new: dart.definiteFunctionType(html$.MediaSource, [])
+  }),
+  fields: () => ({
+    [dartx.activeSourceBuffers]: html$.SourceBufferList,
+    [dartx.duration]: core.num,
+    [dartx.readyState]: core.String,
+    [dartx.sourceBuffers]: html$.SourceBufferList
+  }),
+  methods: () => ({
+    [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
+    [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
+    [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaSource, []),
+    isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  names: ['_create_1', 'isTypeSupported']
+});
+dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
+dart.defineExtensionNames([
+  'addTrack',
+  'clone',
+  'getAudioTracks',
+  'getTrackById',
+  'getTracks',
+  'getVideoTracks',
+  'removeTrack',
+  'stop',
+  'onAddTrack',
+  'onEnded',
+  'onRemoveTrack',
+  'active',
+  'ended',
+  'id',
+  'label'
+]);
+html$.MediaStream = class MediaStream extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(stream_OR_tracks) {
+    if (stream_OR_tracks === void 0) stream_OR_tracks = null;
+    if (stream_OR_tracks == null) {
+      return html$.MediaStream._create_1();
+    }
+    if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
+      return html$.MediaStream._create_2(stream_OR_tracks);
+    }
+    if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
+      return html$.MediaStream._create_3(stream_OR_tracks);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1() {
+    return new self.MediaStream();
+  }
+  static _create_2(stream_OR_tracks) {
+    return new self.MediaStream(stream_OR_tracks);
+  }
+  static _create_3(stream_OR_tracks) {
+    return new self.MediaStream(stream_OR_tracks);
+  }
+  get [dartx.active]() {
+    return this.active;
+  }
+  get [dartx.ended]() {
+    return this.ended;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  [dartx.addTrack](...args) {
+    return this.addTrack.apply(this, args);
+  }
+  [dartx.clone](...args) {
+    return this.clone.apply(this, args);
+  }
+  [dartx.getAudioTracks](...args) {
+    return this.getAudioTracks.apply(this, args);
+  }
+  [dartx.getTrackById](...args) {
+    return this.getTrackById.apply(this, args);
+  }
+  [dartx.getTracks](...args) {
+    return this.getTracks.apply(this, args);
+  }
+  [dartx.getVideoTracks](...args) {
+    return this.getVideoTracks.apply(this, args);
+  }
+  [dartx.removeTrack](...args) {
+    return this.removeTrack.apply(this, args);
+  }
+  [dartx.stop](...args) {
+    return this.stop.apply(this, args);
+  }
+  get [dartx.onAddTrack]() {
+    return html$.MediaStream.addTrackEvent.forTarget(this);
+  }
+  get [dartx.onEnded]() {
+    return html$.MediaStream.endedEvent.forTarget(this);
+  }
+  get [dartx.onRemoveTrack]() {
+    return html$.MediaStream.removeTrackEvent.forTarget(this);
+  }
+  static get supported() {
+    return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
+  }
+};
+dart.setSignature(html$.MediaStream, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaStream, []),
+    new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
+  }),
+  fields: () => ({
+    [dartx.active]: core.bool,
+    [dartx.ended]: core.bool,
+    [dartx.id]: core.String,
+    [dartx.label]: core.String
+  }),
+  getters: () => ({
+    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
+    [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
+    [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
+    [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    addTrackEvent: EventStreamProviderOfEvent(),
+    endedEvent: EventStreamProviderOfEvent(),
+    removeTrackEvent: EventStreamProviderOfEvent()
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaStream, []),
+    _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.defineLazy(html$.MediaStream, {
+  get addTrackEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
+  },
+  get endedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ended'));
+  },
+  get removeTrackEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
+  }
+});
+dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
+dart.defineExtensionNames([
+  'stream'
+]);
+html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MediaStreamEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MediaStreamEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MediaStreamEvent(type);
+  }
+  static get supported() {
+    return html_common.Device.isEventTypeSupported('MediaStreamEvent');
+  }
+  get [dartx.stream]() {
+    return this.stream;
+  }
+};
+dart.setSignature(html$.MediaStreamEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
+    new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.stream]: html$.MediaStream}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
+dart.defineExtensionNames([
+  'clone',
+  'stop',
+  'onEnded',
+  'onMute',
+  'onUnmute',
+  'enabled',
+  'id',
+  'kind',
+  'label',
+  'muted',
+  'readyState'
+]);
+html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.enabled]() {
+    return this.enabled;
+  }
+  set [dartx.enabled](value) {
+    this.enabled = value;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.muted]() {
+    return this.muted;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  [dartx.clone](...args) {
+    return this.clone.apply(this, args);
+  }
+  static getSources() {
+    let completer = CompleterOfListOfSourceInfo().new();
+    html$.MediaStreamTrack._getSources(dart.fn(value => {
+      completer.complete(value);
+    }, ListOfSourceInfoToNull()));
+    return completer.future;
+  }
+  [dartx.stop](...args) {
+    return this.stop.apply(this, args);
+  }
+  get [dartx.onEnded]() {
+    return html$.MediaStreamTrack.endedEvent.forTarget(this);
+  }
+  get [dartx.onMute]() {
+    return html$.MediaStreamTrack.muteEvent.forTarget(this);
+  }
+  get [dartx.onUnmute]() {
+    return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.MediaStreamTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
+  fields: () => ({
+    [dartx.enabled]: core.bool,
+    [dartx.id]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String,
+    [dartx.muted]: core.bool,
+    [dartx.readyState]: core.String
+  }),
+  getters: () => ({
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    endedEvent: EventStreamProviderOfEvent(),
+    muteEvent: EventStreamProviderOfEvent(),
+    unmuteEvent: EventStreamProviderOfEvent()
+  }),
+  statics: () => ({
+    _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
+    getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
+  }),
+  names: ['_getSources', 'getSources']
+});
+dart.defineLazy(html$.MediaStreamTrack, {
+  get endedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ended'));
+  },
+  get muteEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('mute'));
+  },
+  get unmuteEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('unmute'));
+  }
+});
+dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
+dart.defineExtensionNames([
+  'track'
+]);
+html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return html_common.Device.isEventTypeSupported('MediaStreamTrackEvent');
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+};
+dart.setSignature(html$.MediaStreamTrackEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
+  fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
+html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
+dart.defineExtensionNames([
+  'jsHeapSizeLimit',
+  'totalJSHeapSize',
+  'usedJSHeapSize'
+]);
+html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.jsHeapSizeLimit]() {
+    return this.jsHeapSizeLimit;
+  }
+  get [dartx.totalJSHeapSize]() {
+    return this.totalJSHeapSize;
+  }
+  get [dartx.usedJSHeapSize]() {
+    return this.usedJSHeapSize;
+  }
+};
+dart.setSignature(html$.MemoryInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
+  fields: () => ({
+    [dartx.jsHeapSizeLimit]: core.int,
+    [dartx.totalJSHeapSize]: core.int,
+    [dartx.usedJSHeapSize]: core.int
+  })
+});
+dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
+dart.defineExtensionNames([
+  'label',
+  'type'
+]);
+html$.MenuElement = class MenuElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
+  }
+  created() {
+    this[dartx.label] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  set [dartx.label](value) {
+    this.label = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.MenuElement, 'created');
+dart.setSignature(html$.MenuElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MenuElement, []),
+    new: dart.definiteFunctionType(html$.MenuElement, []),
+    created: dart.definiteFunctionType(html$.MenuElement, [])
+  }),
+  fields: () => ({
+    [dartx.label]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
+dart.defineExtensionNames([
+  'checked',
+  'defaultValue',
+  'disabled',
+  'icon',
+  'label',
+  'radiogroup',
+  'type'
+]);
+html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.checked] = null;
+    this[dartx.defaultValue] = null;
+    this[dartx.disabled] = null;
+    this[dartx.icon] = null;
+    this[dartx.label] = null;
+    this[dartx.radiogroup] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.checked]() {
+    return this.checked;
+  }
+  set [dartx.checked](value) {
+    this.checked = value;
+  }
+  get [dartx.defaultValue]() {
+    return this.default;
+  }
+  set [dartx.defaultValue](value) {
+    this.default = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.icon]() {
+    return this.icon;
+  }
+  set [dartx.icon](value) {
+    this.icon = value;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  set [dartx.label](value) {
+    this.label = value;
+  }
+  get [dartx.radiogroup]() {
+    return this.radiogroup;
+  }
+  set [dartx.radiogroup](value) {
+    this.radiogroup = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.MenuItemElement, 'created');
+dart.setSignature(html$.MenuItemElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MenuItemElement, []),
+    created: dart.definiteFunctionType(html$.MenuItemElement, [])
+  }),
+  fields: () => ({
+    [dartx.checked]: core.bool,
+    [dartx.defaultValue]: core.bool,
+    [dartx.disabled]: core.bool,
+    [dartx.icon]: core.String,
+    [dartx.label]: core.String,
+    [dartx.radiogroup]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
+dart.defineExtensionNames([
+  'port1',
+  'port2'
+]);
+html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.port1]() {
+    return this.port1;
+  }
+  get [dartx.port2]() {
+    return this.port2;
+  }
+};
+dart.setSignature(html$.MessageChannel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
+  fields: () => ({
+    [dartx.port1]: html$.MessagePort,
+    [dartx.port2]: html$.MessagePort
+  })
+});
+dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
+const _initMessageEvent = Symbol('_initMessageEvent');
+const _get_data = Symbol('_get_data');
+const _get_source = Symbol('_get_source');
+dart.defineExtensionNames([
+  'data',
+  'source',
+  'lastEventId',
+  'origin'
+]);
+html$.MessageEvent = class MessageEvent extends html$.Event {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
+    let data = opts && 'data' in opts ? opts.data : null;
+    let origin = opts && 'origin' in opts ? opts.origin : null;
+    let lastEventId = opts && 'lastEventId' in opts ? opts.lastEventId : null;
+    let source = opts && 'source' in opts ? opts.source : null;
+    let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
+    if (source == null) {
+      source = html$.window;
+    }
+    if (!dart.test(html_common.Device.isIE)) {
+      return new self.MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
+    }
+    let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
+    event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
+    return event;
+  }
+  get [dartx.data]() {
+    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
+  }
+  get [_get_data]() {
+    return this.data;
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MessageEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MessageEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MessageEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MessageEvent(type);
+  }
+  get [dartx.lastEventId]() {
+    return this.lastEventId;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.source]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_source]);
+  }
+  get [_get_source]() {
+    return this.source;
+  }
+  [_initMessageEvent](...args) {
+    return this.initMessageEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.MessageEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
+    _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_get_data]: dart.dynamic,
+    [dartx.lastEventId]: core.String,
+    [dartx.origin]: core.String,
+    [_get_source]: dart.dynamic
+  }),
+  getters: () => ({
+    [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
+  }),
+  methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
+dart.defineExtensionNames([
+  'close',
+  'postMessage',
+  'start',
+  'onMessage'
+]);
+html$.MessagePort = class MessagePort extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [dartx.start](...args) {
+    return this.start.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.MessagePort.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.MessagePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.start]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.MessagePort, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
+dart.defineExtensionNames([
+  'content',
+  'httpEquiv',
+  'name'
+]);
+html$.MetaElement = class MetaElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
+  }
+  created() {
+    this[dartx.content] = null;
+    this[dartx.httpEquiv] = null;
+    this[dartx.name] = null;
+    super.created();
+  }
+  get [dartx.content]() {
+    return this.content;
+  }
+  set [dartx.content](value) {
+    this.content = value;
+  }
+  get [dartx.httpEquiv]() {
+    return this.httpEquiv;
+  }
+  set [dartx.httpEquiv](value) {
+    this.httpEquiv = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+};
+dart.defineNamedConstructor(html$.MetaElement, 'created');
+dart.setSignature(html$.MetaElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MetaElement, []),
+    new: dart.definiteFunctionType(html$.MetaElement, []),
+    created: dart.definiteFunctionType(html$.MetaElement, [])
+  }),
+  fields: () => ({
+    [dartx.content]: core.String,
+    [dartx.httpEquiv]: core.String,
+    [dartx.name]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
+const _get_modificationTime = Symbol('_get_modificationTime');
+dart.defineExtensionNames([
+  'modificationTime',
+  'size'
+]);
+html$.Metadata = class Metadata extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.modificationTime]() {
+    return html_common.convertNativeToDart_DateTime(this[_get_modificationTime]);
+  }
+  get [_get_modificationTime]() {
+    return this.modificationTime;
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+};
+dart.setSignature(html$.Metadata, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
+  fields: () => ({
+    [_get_modificationTime]: dart.dynamic,
+    [dartx.size]: core.int
+  }),
+  getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
+});
+dart.registerExtension(dart.global.Metadata, html$.Metadata);
+html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
+dart.defineExtensionNames([
+  'high',
+  'labels',
+  'low',
+  'max',
+  'min',
+  'optimum',
+  'value'
+]);
+html$.MeterElement = class MeterElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
+  }
+  created() {
+    this[dartx.high] = null;
+    this[dartx.labels] = null;
+    this[dartx.low] = null;
+    this[dartx.max] = null;
+    this[dartx.min] = null;
+    this[dartx.optimum] = null;
+    this[dartx.value] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('meter');
+  }
+  get [dartx.high]() {
+    return this.high;
+  }
+  set [dartx.high](value) {
+    this.high = value;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.low]() {
+    return this.low;
+  }
+  set [dartx.low](value) {
+    this.low = value;
+  }
+  get [dartx.max]() {
+    return this.max;
+  }
+  set [dartx.max](value) {
+    this.max = value;
+  }
+  get [dartx.min]() {
+    return this.min;
+  }
+  set [dartx.min](value) {
+    this.min = value;
+  }
+  get [dartx.optimum]() {
+    return this.optimum;
+  }
+  set [dartx.optimum](value) {
+    this.optimum = value;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.defineNamedConstructor(html$.MeterElement, 'created');
+dart.setSignature(html$.MeterElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MeterElement, []),
+    new: dart.definiteFunctionType(html$.MeterElement, []),
+    created: dart.definiteFunctionType(html$.MeterElement, [])
+  }),
+  fields: () => ({
+    [dartx.high]: core.num,
+    [dartx.labels]: ListOfNode(),
+    [dartx.low]: core.num,
+    [dartx.max]: core.num,
+    [dartx.min]: core.num,
+    [dartx.optimum]: core.num,
+    [dartx.value]: core.num
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
+dart.defineExtensionNames([
+  'inputs',
+  'outputs',
+  'sysexEnabled'
+]);
+html$.MidiAccess = class MidiAccess extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.inputs]() {
+    return this.inputs;
+  }
+  get [dartx.outputs]() {
+    return this.outputs;
+  }
+  get [dartx.sysexEnabled]() {
+    return this.sysexEnabled;
+  }
+};
+dart.setSignature(html$.MidiAccess, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
+  fields: () => ({
+    [dartx.inputs]: html$.MidiInputMap,
+    [dartx.outputs]: html$.MidiOutputMap,
+    [dartx.sysexEnabled]: core.bool
+  })
+});
+dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
+dart.defineExtensionNames([
+  'port'
+]);
+html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MidiConnectionEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new MIDIConnectionEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new MIDIConnectionEvent(type);
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+};
+dart.setSignature(html$.MidiConnectionEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
+    new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.port]: html$.MidiPort}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
+dart.defineExtensionNames([
+  'close',
+  'open',
+  'connection',
+  'id',
+  'manufacturer',
+  'name',
+  'state',
+  'type',
+  'version'
+]);
+html$.MidiPort = class MidiPort extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.connection]() {
+    return this.connection;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.manufacturer]() {
+    return this.manufacturer;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.state]() {
+    return this.state;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.version]() {
+    return this.version;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.open](...args) {
+    return this.open.apply(this, args);
+  }
+};
+dart.setSignature(html$.MidiPort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
+  fields: () => ({
+    [dartx.connection]: core.String,
+    [dartx.id]: core.String,
+    [dartx.manufacturer]: core.String,
+    [dartx.name]: core.String,
+    [dartx.state]: core.String,
+    [dartx.type]: core.String,
+    [dartx.version]: core.String
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(async.Future, []),
+    [dartx.open]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
+dart.defineExtensionNames([
+  'onMidiMessage'
+]);
+html$.MidiInput = class MidiInput extends html$.MidiPort {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.onMidiMessage]() {
+    return html$.MidiInput.midiMessageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.MidiInput, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
+  getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
+  sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
+});
+dart.defineLazy(html$.MidiInput, {
+  get midiMessageEvent() {
+    return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
+  }
+});
+dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
+dart.defineExtensionNames([
+  'size'
+]);
+html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+};
+dart.setSignature(html$.MidiInputMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
+  fields: () => ({[dartx.size]: core.int})
+});
+dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
+dart.defineExtensionNames([
+  'data',
+  'receivedTime'
+]);
+html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MidiMessageEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new MIDIMessageEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new MIDIMessageEvent(type);
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  get [dartx.receivedTime]() {
+    return this.receivedTime;
+  }
+};
+dart.setSignature(html$.MidiMessageEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
+    new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.data]: typed_data.Uint8List,
+    [dartx.receivedTime]: core.double
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
+dart.defineExtensionNames([
+  'send'
+]);
+html$.MidiOutput = class MidiOutput extends html$.MidiPort {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.send](...args) {
+    return this.send.apply(this, args);
+  }
+};
+dart.setSignature(html$.MidiOutput, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
+  methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
+});
+dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
+dart.defineExtensionNames([
+  'size'
+]);
+html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+};
+dart.setSignature(html$.MidiOutputMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
+  fields: () => ({[dartx.size]: core.int})
+});
+dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
+dart.defineExtensionNames([
+  'description',
+  'enabledPlugin',
+  'suffixes',
+  'type'
+]);
+html$.MimeType = class MimeType extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.description]() {
+    return this.description;
+  }
+  get [dartx.enabledPlugin]() {
+    return this.enabledPlugin;
+  }
+  get [dartx.suffixes]() {
+    return this.suffixes;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.MimeType, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
+  fields: () => ({
+    [dartx.description]: core.String,
+    [dartx.enabledPlugin]: html$.Plugin,
+    [dartx.suffixes]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.MimeType, html$.MimeType);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item',
+  'namedItem'
+]);
+html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+};
+html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
+dart.setSignature(html$.MimeTypeArray, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
+    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
+  })
+});
+dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
+dart.defineExtensionNames([
+  'cite',
+  'dateTime'
+]);
+html$.ModElement = class ModElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.cite] = null;
+    this[dartx.dateTime] = null;
+    super.created();
+  }
+  get [dartx.cite]() {
+    return this.cite;
+  }
+  set [dartx.cite](value) {
+    this.cite = value;
+  }
+  get [dartx.dateTime]() {
+    return this.dateTime;
+  }
+  set [dartx.dateTime](value) {
+    this.dateTime = value;
+  }
+};
+dart.defineNamedConstructor(html$.ModElement, 'created');
+dart.setSignature(html$.ModElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ModElement, []),
+    created: dart.definiteFunctionType(html$.ModElement, [])
+  }),
+  fields: () => ({
+    [dartx.cite]: core.String,
+    [dartx.dateTime]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
+const _initMouseEvent = Symbol('_initMouseEvent');
+const _clientX = Symbol('_clientX');
+const _clientY = Symbol('_clientY');
+const _layerX = Symbol('_layerX');
+const _layerY = Symbol('_layerY');
+const _movementX = Symbol('_movementX');
+const _movementY = Symbol('_movementY');
+const _pageX = Symbol('_pageX');
+const _pageY = Symbol('_pageY');
+const _screenX = Symbol('_screenX');
+const _screenY = Symbol('_screenY');
+const _webkitMovementX = Symbol('_webkitMovementX');
+const _webkitMovementY = Symbol('_webkitMovementY');
+const _initMouseEvent_1 = Symbol('_initMouseEvent_1');
+dart.defineExtensionNames([
+  'relatedTarget',
+  'client',
+  'movement',
+  'offset',
+  'screen',
+  'layer',
+  'page',
+  'altKey',
+  'button',
+  'buttons',
+  'ctrlKey',
+  'dataTransfer',
+  'fromElement',
+  'metaKey',
+  'region',
+  'shiftKey',
+  'toElement'
+]);
+html$.MouseEvent = class MouseEvent extends html$.UIEvent {
+  static new(type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let detail = opts && 'detail' in opts ? opts.detail : 0;
+    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
+    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
+    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
+    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
+    let button = opts && 'button' in opts ? opts.button : 0;
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
+    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
+    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
+    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
+    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
+    if (view == null) {
+      view = html$.window;
+    }
+    let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
+    event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
+    return event;
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.MouseEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.MouseEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.MouseEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.MouseEvent(type);
+  }
+  get [dartx.altKey]() {
+    return this.altKey;
+  }
+  get [dartx.button]() {
+    return this.button;
+  }
+  get [dartx.buttons]() {
+    return this.buttons;
+  }
+  get [_clientX]() {
+    return this.clientX;
+  }
+  get [_clientY]() {
+    return this.clientY;
+  }
+  get [dartx.ctrlKey]() {
+    return this.ctrlKey;
+  }
+  get [dartx.dataTransfer]() {
+    return this.dataTransfer;
+  }
+  get [dartx.fromElement]() {
+    return this.fromElement;
+  }
+  get [_layerX]() {
+    return this.layerX;
+  }
+  get [_layerY]() {
+    return this.layerY;
+  }
+  get [dartx.metaKey]() {
+    return this.metaKey;
+  }
+  get [_movementX]() {
+    return this.movementX;
+  }
+  get [_movementY]() {
+    return this.movementY;
+  }
+  get [_pageX]() {
+    return this.pageX;
+  }
+  get [_pageY]() {
+    return this.pageY;
+  }
+  get [dartx.region]() {
+    return this.region;
+  }
+  get [dartx.relatedTarget]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+  }
+  get [_get_relatedTarget]() {
+    return this.relatedTarget;
+  }
+  get [_screenX]() {
+    return this.screenX;
+  }
+  get [_screenY]() {
+    return this.screenY;
+  }
+  get [dartx.shiftKey]() {
+    return this.shiftKey;
+  }
+  get [dartx.toElement]() {
+    return this.toElement;
+  }
+  get [_webkitMovementX]() {
+    return this.webkitMovementX;
+  }
+  get [_webkitMovementY]() {
+    return this.webkitMovementY;
+  }
+  [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
+    let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
+    this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
+    return;
+  }
+  [_initMouseEvent_1](...args) {
+    return this.initMouseEvent.apply(this, args);
+  }
+  get [dartx.client]() {
+    return new (PointOfnum())(this[_clientX], this[_clientY]);
+  }
+  get [dartx.movement]() {
+    return new (PointOfnum())(this[_webkitMovementX], this[_webkitMovementY]);
+  }
+  get [dartx.offset]() {
+    if (!!this.offsetX) {
+      let x = this.offsetX;
+      let y = this.offsetY;
+      return new (PointOfnum())(x, y);
+    } else {
+      if (!html$.Element.is(this[dartx.target])) {
+        dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
+      }
+      let target = html$.Element._check(this[dartx.target]);
+      let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
+      return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
+    }
+  }
+  get [dartx.screen]() {
+    return new (PointOfnum())(this[_screenX], this[_screenY]);
+  }
+  get [dartx.layer]() {
+    return new (PointOfnum())(this[_layerX], this[_layerY]);
+  }
+  get [dartx.page]() {
+    return new (PointOfnum())(this[_pageX], this[_pageY]);
+  }
+};
+dart.setSignature(html$.MouseEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
+    _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.altKey]: core.bool,
+    [dartx.button]: core.int,
+    [dartx.buttons]: core.int,
+    [_clientX]: core.int,
+    [_clientY]: core.int,
+    [dartx.ctrlKey]: core.bool,
+    [dartx.dataTransfer]: html$.DataTransfer,
+    [dartx.fromElement]: html$.Node,
+    [_layerX]: core.int,
+    [_layerY]: core.int,
+    [dartx.metaKey]: core.bool,
+    [_movementX]: core.int,
+    [_movementY]: core.int,
+    [_pageX]: core.int,
+    [_pageY]: core.int,
+    [dartx.region]: core.String,
+    [_get_relatedTarget]: dart.dynamic,
+    [_screenX]: core.int,
+    [_screenY]: core.int,
+    [dartx.shiftKey]: core.bool,
+    [dartx.toElement]: html$.Node,
+    [_webkitMovementX]: core.int,
+    [_webkitMovementY]: core.int
+  }),
+  getters: () => ({
+    [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
+    [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.layer]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
+  }),
+  methods: () => ({
+    [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
+    [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
+dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
+html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
+const _observe_1 = Symbol('_observe_1');
+const _observe = Symbol('_observe');
+const _call = Symbol('_call');
+dart.defineExtensionNames([
+  'disconnect',
+  'takeRecords',
+  'observe'
+]);
+html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
+  [dartx.disconnect](...args) {
+    return this.disconnect.apply(this, args);
+  }
+  [_observe](target, options) {
+    let options_1 = html_common.convertDartToNative_Dictionary(options);
+    this[_observe_1](target, options_1);
+    return;
+  }
+  [_observe_1](...args) {
+    return this.observe.apply(this, args);
+  }
+  [dartx.takeRecords](...args) {
+    return this.takeRecords.apply(this, args);
+  }
+  static get supported() {
+    return !!(window.MutationObserver || window.WebKitMutationObserver);
+  }
+  [dartx.observe](target, opts) {
+    let childList = opts && 'childList' in opts ? opts.childList : null;
+    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
+    let characterData = opts && 'characterData' in opts ? opts.characterData : null;
+    let subtree = opts && 'subtree' in opts ? opts.subtree : null;
+    let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
+    let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
+    let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
+    let parsedOptions = html$.MutationObserver._createDict();
+    function override(key, value) {
+      if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
+    }
+    dart.fn(override, dynamicAnddynamicToNull());
+    override('childList', childList);
+    override('attributes', attributes);
+    override('characterData', characterData);
+    override('subtree', subtree);
+    override('attributeOldValue', attributeOldValue);
+    override('characterDataOldValue', characterDataOldValue);
+    if (attributeFilter != null) {
+      override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
+    }
+    this[_call](target, parsedOptions);
+  }
+  static _createDict() {
+    return {};
+  }
+  static _add(m, key, value) {
+    m[key] = value;
+  }
+  static _fixupList(list) {
+    return list;
+  }
+  [_call](...args) {
+    return this.observe.apply(this, args);
+  }
+  static new(callback) {
+    0;
+    return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html$._wrapBinaryZone(ListOfMutationRecord(), html$.MutationObserver, dart.void)(callback), 2));
+  }
+};
+dart.setSignature(html$.MutationObserver, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
+  methods: () => ({
+    [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
+    [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
+    [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
+    [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
+    [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
+    [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
+  }),
+  sfields: () => ({_boolKeys: MapOfString$bool()}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _createDict: dart.definiteFunctionType(dart.dynamic, []),
+    _add: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, dart.dynamic]),
+    _fixupList: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  }),
+  names: ['_createDict', '_add', '_fixupList']
+});
+html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
+dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
+dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
+dart.defineExtensionNames([
+  'addedNodes',
+  'attributeName',
+  'attributeNamespace',
+  'nextSibling',
+  'oldValue',
+  'previousSibling',
+  'removedNodes',
+  'target',
+  'type'
+]);
+html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.addedNodes]() {
+    return this.addedNodes;
+  }
+  get [dartx.attributeName]() {
+    return this.attributeName;
+  }
+  get [dartx.attributeNamespace]() {
+    return this.attributeNamespace;
+  }
+  get [dartx.nextSibling]() {
+    return this.nextSibling;
+  }
+  get [dartx.oldValue]() {
+    return this.oldValue;
+  }
+  get [dartx.previousSibling]() {
+    return this.previousSibling;
+  }
+  get [dartx.removedNodes]() {
+    return this.removedNodes;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.MutationRecord, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
+  fields: () => ({
+    [dartx.addedNodes]: ListOfNode(),
+    [dartx.attributeName]: core.String,
+    [dartx.attributeNamespace]: core.String,
+    [dartx.nextSibling]: html$.Node,
+    [dartx.oldValue]: core.String,
+    [dartx.previousSibling]: html$.Node,
+    [dartx.removedNodes]: ListOfNode(),
+    [dartx.target]: html$.Node,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
+const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
+const _getUserMedia = Symbol('_getUserMedia');
+const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
+const _requestMidiAccess_2 = Symbol('_requestMidiAccess_2');
+dart.defineExtensionNames([
+  'language',
+  'getUserMedia',
+  'getBattery',
+  'getGamepads',
+  'getVRDevices',
+  'registerProtocolHandler',
+  'requestMidiAccess',
+  'requestMediaKeySystemAccess',
+  'sendBeacon',
+  'getStorageUpdates',
+  'bluetooth',
+  'connection',
+  'credentials',
+  'doNotTrack',
+  'geolocation',
+  'maxTouchPoints',
+  'mediaDevices',
+  'mimeTypes',
+  'permissions',
+  'presentation',
+  'productSub',
+  'serviceWorker',
+  'services',
+  'storageQuota',
+  'vendor',
+  'vendorSub',
+  'persistentStorage',
+  'temporaryStorage',
+  'hardwareConcurrency',
+  'appCodeName',
+  'appName',
+  'appVersion',
+  'dartEnabled',
+  'platform',
+  'product',
+  'userAgent',
+  'languages',
+  'onLine',
+  'cookieEnabled'
+]);
+html$.Navigator = class Navigator extends _interceptors.Interceptor {
+  get [dartx.language]() {
+    return this.language || this.userLanguage;
+  }
+  [dartx.getUserMedia](opts) {
+    let audio = opts && 'audio' in opts ? opts.audio : false;
+    let video = opts && 'video' in opts ? opts.video : false;
+    let completer = CompleterOfMediaStream().new();
+    let options = dart.map({audio: audio, video: video}, core.String, dart.dynamic);
+    this[_ensureGetUserMedia]();
+    this[_getUserMedia](html_common.convertDartToNative_SerializedScriptValue(options), dart.fn(stream => {
+      completer.complete(stream);
+    }, MediaStreamToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, NavigatorUserMediaErrorToNull()));
+    return completer.future;
+  }
+  [_ensureGetUserMedia]() {
+    if (!this.getUserMedia) {
+      this.getUserMedia = this.getUserMedia || this.webkitGetUserMedia || this.mozGetUserMedia || this.msGetUserMedia;
+    }
+  }
+  [_getUserMedia](...args) {
+    return this.getUserMedia.apply(this, args);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.bluetooth]() {
+    return this.bluetooth;
+  }
+  get [dartx.connection]() {
+    return this.connection;
+  }
+  get [dartx.credentials]() {
+    return this.credentials;
+  }
+  get [dartx.doNotTrack]() {
+    return this.doNotTrack;
+  }
+  get [dartx.geolocation]() {
+    return this.geolocation;
+  }
+  get [dartx.maxTouchPoints]() {
+    return this.maxTouchPoints;
+  }
+  get [dartx.mediaDevices]() {
+    return this.mediaDevices;
+  }
+  get [dartx.mimeTypes]() {
+    return this.mimeTypes;
+  }
+  get [dartx.permissions]() {
+    return this.permissions;
+  }
+  get [dartx.presentation]() {
+    return this.presentation;
+  }
+  get [dartx.productSub]() {
+    return this.productSub;
+  }
+  get [dartx.serviceWorker]() {
+    return this.serviceWorker;
+  }
+  get [dartx.services]() {
+    return this.services;
+  }
+  get [dartx.storageQuota]() {
+    return this.storageQuota;
+  }
+  get [dartx.vendor]() {
+    return this.vendor;
+  }
+  get [dartx.vendorSub]() {
+    return this.vendorSub;
+  }
+  get [dartx.persistentStorage]() {
+    return this.webkitPersistentStorage;
+  }
+  get [dartx.temporaryStorage]() {
+    return this.webkitTemporaryStorage;
+  }
+  [dartx.getBattery](...args) {
+    return this.getBattery.apply(this, args);
+  }
+  [dartx.getGamepads](...args) {
+    return this.getGamepads.apply(this, args);
+  }
+  [dartx.getVRDevices](...args) {
+    return this.getVRDevices.apply(this, args);
+  }
+  [dartx.registerProtocolHandler](...args) {
+    return this.registerProtocolHandler.apply(this, args);
+  }
+  [dartx.requestMidiAccess](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_requestMidiAccess_1](options_1);
+    }
+    return this[_requestMidiAccess_2]();
+  }
+  [_requestMidiAccess_1](...args) {
+    return this.requestMIDIAccess.apply(this, args);
+  }
+  [_requestMidiAccess_2](...args) {
+    return this.requestMIDIAccess.apply(this, args);
+  }
+  [dartx.requestMediaKeySystemAccess](...args) {
+    return this.requestMediaKeySystemAccess.apply(this, args);
+  }
+  [dartx.sendBeacon](...args) {
+    return this.sendBeacon.apply(this, args);
+  }
+  get [dartx.hardwareConcurrency]() {
+    return this.hardwareConcurrency;
+  }
+  get [dartx.appCodeName]() {
+    return this.appCodeName;
+  }
+  get [dartx.appName]() {
+    return this.appName;
+  }
+  get [dartx.appVersion]() {
+    return this.appVersion;
+  }
+  get [dartx.dartEnabled]() {
+    return this.dartEnabled;
+  }
+  get [dartx.platform]() {
+    return this.platform;
+  }
+  get [dartx.product]() {
+    return this.product;
+  }
+  get [dartx.userAgent]() {
+    return this.userAgent;
+  }
+  get [dartx.languages]() {
+    return this.languages;
+  }
+  get [dartx.onLine]() {
+    return this.onLine;
+  }
+  get [dartx.cookieEnabled]() {
+    return this.cookieEnabled;
+  }
+  [dartx.getStorageUpdates](...args) {
+    return this.getStorageUpdates.apply(this, args);
+  }
+};
+html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
+dart.setSignature(html$.Navigator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
+  fields: () => ({
+    [dartx.bluetooth]: html$.Bluetooth,
+    [dartx.connection]: html$.NetworkInformation,
+    [dartx.credentials]: html$.CredentialsContainer,
+    [dartx.doNotTrack]: core.String,
+    [dartx.geolocation]: html$.Geolocation,
+    [dartx.maxTouchPoints]: core.int,
+    [dartx.mediaDevices]: html$.MediaDevices,
+    [dartx.mimeTypes]: html$.MimeTypeArray,
+    [dartx.permissions]: html$.Permissions,
+    [dartx.presentation]: html$.Presentation,
+    [dartx.productSub]: core.String,
+    [dartx.serviceWorker]: html$.ServiceWorkerContainer,
+    [dartx.services]: html$.ServicePortCollection,
+    [dartx.storageQuota]: html$.StorageQuota,
+    [dartx.vendor]: core.String,
+    [dartx.vendorSub]: core.String,
+    [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
+    [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
+    [dartx.hardwareConcurrency]: core.int,
+    [dartx.appCodeName]: core.String,
+    [dartx.appName]: core.String,
+    [dartx.appVersion]: core.String,
+    [dartx.dartEnabled]: core.bool,
+    [dartx.platform]: core.String,
+    [dartx.product]: core.String,
+    [dartx.userAgent]: core.String,
+    [dartx.languages]: ListOfString(),
+    [dartx.onLine]: core.bool,
+    [dartx.cookieEnabled]: core.bool
+  }),
+  getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
+  methods: () => ({
+    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
+    [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
+    [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
+    [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
+    [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
+    [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
+    [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_requestMidiAccess_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_requestMidiAccess_2]: dart.definiteFunctionType(async.Future, []),
+    [dartx.requestMediaKeySystemAccess]: dart.definiteFunctionType(async.Future, [core.String, ListOfMap()]),
+    [dartx.sendBeacon]: dart.definiteFunctionType(core.bool, [core.String, core.Object]),
+    [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.Navigator, html$.Navigator);
+dart.defineExtensionNames([
+  'hardwareConcurrency'
+]);
+html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get hardwareConcurrency() {
+    return this[hardwareConcurrency];
+  }
+  set hardwareConcurrency(value) {
+    super.hardwareConcurrency = value;
+  }
+};
+const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
+dart.setSignature(html$.NavigatorCpu, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
+  fields: () => ({hardwareConcurrency: core.int})
+});
+dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
+dart.defineExtensionNames([
+  'appCodeName',
+  'appName',
+  'appVersion',
+  'dartEnabled',
+  'platform',
+  'product',
+  'userAgent'
+]);
+html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get appCodeName() {
+    return this[appCodeName];
+  }
+  set appCodeName(value) {
+    super.appCodeName = value;
+  }
+  get appName() {
+    return this[appName];
+  }
+  set appName(value) {
+    super.appName = value;
+  }
+  get appVersion() {
+    return this[appVersion];
+  }
+  set appVersion(value) {
+    super.appVersion = value;
+  }
+  get dartEnabled() {
+    return this[dartEnabled];
+  }
+  set dartEnabled(value) {
+    super.dartEnabled = value;
+  }
+  get platform() {
+    return this[platform];
+  }
+  set platform(value) {
+    super.platform = value;
+  }
+  get product() {
+    return this[product];
+  }
+  set product(value) {
+    super.product = value;
+  }
+  get userAgent() {
+    return this[userAgent];
+  }
+  set userAgent(value) {
+    super.userAgent = value;
+  }
+};
+const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
+const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
+const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
+const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
+const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
+const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
+const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
+dart.setSignature(html$.NavigatorID, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
+  fields: () => ({
+    appCodeName: core.String,
+    appName: core.String,
+    appVersion: core.String,
+    dartEnabled: core.bool,
+    platform: core.String,
+    product: core.String,
+    userAgent: core.String
+  })
+});
+dart.defineExtensionMembers(html$.NavigatorID, [
+  'appCodeName',
+  'appName',
+  'appVersion',
+  'dartEnabled',
+  'platform',
+  'product',
+  'userAgent'
+]);
+dart.defineExtensionNames([
+  'language',
+  'languages'
+]);
+html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get language() {
+    return this[language];
+  }
+  set language(value) {
+    super.language = value;
+  }
+  get languages() {
+    return this[languages];
+  }
+  set languages(value) {
+    super.languages = value;
+  }
+};
+const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
+const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
+dart.setSignature(html$.NavigatorLanguage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
+  fields: () => ({
+    language: core.String,
+    languages: ListOfString()
+  })
+});
+dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
+dart.defineExtensionNames([
+  'onLine'
+]);
+html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get onLine() {
+    return this[onLine];
+  }
+  set onLine(value) {
+    super.onLine = value;
+  }
+};
+const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
+dart.setSignature(html$.NavigatorOnLine, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
+  fields: () => ({onLine: core.bool})
+});
+dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
+dart.defineExtensionNames([
+  'getStorageUpdates',
+  'cookieEnabled'
+]);
+html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.cookieEnabled]() {
+    return this.cookieEnabled;
+  }
+  [dartx.getStorageUpdates](...args) {
+    return this.getStorageUpdates.apply(this, args);
+  }
+};
+dart.setSignature(html$.NavigatorStorageUtils, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
+  fields: () => ({[dartx.cookieEnabled]: core.bool}),
+  methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
+});
+dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
+dart.defineExtensionNames([
+  'constraintName',
+  'message',
+  'name'
+]);
+html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.constraintName]() {
+    return this.constraintName;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+};
+dart.setSignature(html$.NavigatorUserMediaError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
+  fields: () => ({
+    [dartx.constraintName]: core.String,
+    [dartx.message]: core.String,
+    [dartx.name]: core.String
+  })
+});
+dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
+html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
+html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
+dart.defineExtensionNames([
+  'type'
+]);
+html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.NetworkInformation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
+  fields: () => ({[dartx.type]: core.String})
+});
+dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
+html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
+  new(this$) {
+    this[_this] = this$;
+  }
+  get first() {
+    let result = this[_this].firstChild;
+    if (result == null) dart.throw(new core.StateError("No elements"));
+    return result;
+  }
+  get last() {
+    let result = this[_this].lastChild;
+    if (result == null) dart.throw(new core.StateError("No elements"));
+    return result;
+  }
+  get single() {
+    let l = this.length;
+    if (l == 0) dart.throw(new core.StateError("No elements"));
+    if (dart.notNull(l) > 1) dart.throw(new core.StateError("More than one element"));
+    return this[_this].firstChild;
+  }
+  add(value) {
+    this[_this][dartx.append](value);
+  }
+  addAll(iterable) {
+    if (html$._ChildNodeListLazy.is(iterable)) {
+      let otherList = iterable;
+      if (!core.identical(otherList[_this], this[_this])) {
+        for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
+          this[_this][dartx.append](otherList[_this][dartx.firstChild]);
+        }
+      }
+      return;
+    }
+    for (let node of iterable) {
+      this[_this][dartx.append](node);
+    }
+  }
+  insert(index, node) {
+    if (dart.notNull(index) < 0 || dart.notNull(index) > dart.notNull(this.length)) {
+      dart.throw(new core.RangeError.range(index, 0, this.length));
+    }
+    if (index == this.length) {
+      this[_this][dartx.append](node);
+    } else {
+      this[_this][dartx.insertBefore](node, this._get(index));
+    }
+  }
+  insertAll(index, iterable) {
+    if (index == this.length) {
+      this.addAll(iterable);
+    } else {
+      let item = this._get(index);
+      this[_this][dartx.insertAllBefore](iterable, item);
+    }
+  }
+  setAll(index, iterable) {
+    dart.throw(new core.UnsupportedError("Cannot setAll on Node list"));
+  }
+  removeLast() {
+    let result = this.last;
+    if (result != null) {
+      this[_this][_removeChild](result);
+    }
+    return result;
+  }
+  removeAt(index) {
+    let result = this._get(index);
+    if (result != null) {
+      this[_this][_removeChild](result);
+    }
+    return result;
+  }
+  remove(object) {
+    if (!html$.Node.is(object)) return false;
+    let node = html$.Node._check(object);
+    if (!core.identical(this[_this], node[dartx.parentNode])) return false;
+    this[_this][_removeChild](node);
+    return true;
+  }
+  [_filter$0](test, removeMatching) {
+    let child = this[_this][dartx.firstChild];
+    while (child != null) {
+      let nextChild = child[dartx.nextNode];
+      if (test(child) == removeMatching) {
+        this[_this][_removeChild](child);
+      }
+      child = nextChild;
+    }
+  }
+  removeWhere(test) {
+    this[_filter$0](test, true);
+  }
+  retainWhere(test) {
+    this[_filter$0](test, false);
+  }
+  clear() {
+    this[_this][_clearChildren]();
+  }
+  _set(index, value) {
+    this[_this][_replaceChild](value, this._get(index));
+    return value;
+  }
+  get iterator() {
+    return this[_this][dartx.childNodes][dartx.iterator];
+  }
+  sort(compare) {
+    if (compare === void 0) compare = null;
+    dart.throw(new core.UnsupportedError("Cannot sort Node list"));
+  }
+  shuffle(random) {
+    if (random === void 0) random = null;
+    dart.throw(new core.UnsupportedError("Cannot shuffle Node list"));
+  }
+  setRange(start, end, iterable, skipCount) {
+    if (skipCount === void 0) skipCount = 0;
+    dart.throw(new core.UnsupportedError("Cannot setRange on Node list"));
+  }
+  fillRange(start, end, fill) {
+    if (fill === void 0) fill = null;
+    dart.throw(new core.UnsupportedError("Cannot fillRange on Node list"));
+  }
+  get length() {
+    return this[_this][dartx.childNodes][dartx.length];
+  }
+  set length(value) {
+    dart.throw(new core.UnsupportedError("Cannot set length on immutable List."));
+  }
+  _get(index) {
+    return this[_this][dartx.childNodes][dartx._get](index);
+  }
+  get rawList() {
+    return this[_this][dartx.childNodes];
+  }
+};
+dart.addSimpleTypeTests(html$._ChildNodeListLazy);
+html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
+dart.setSignature(html$._ChildNodeListLazy, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
+  fields: () => ({[_this]: html$.Node}),
+  getters: () => ({
+    length: dart.definiteFunctionType(core.int, []),
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
+  }),
+  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [_filter$0]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    _get: dart.definiteFunctionType(html$.Node, [core.int])
+  })
+});
+dart.defineExtensionMembers(html$._ChildNodeListLazy, [
+  'add',
+  'addAll',
+  'insert',
+  'insertAll',
+  'setAll',
+  'removeLast',
+  'removeAt',
+  'remove',
+  'removeWhere',
+  'retainWhere',
+  'clear',
+  '_set',
+  'sort',
+  'shuffle',
+  'setRange',
+  'fillRange',
+  '_get',
+  'first',
+  'last',
+  'single',
+  'iterator',
+  'length',
+  'length'
+]);
+html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.NodeFilter, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
+  sfields: () => ({
+    FILTER_ACCEPT: core.int,
+    FILTER_REJECT: core.int,
+    FILTER_SKIP: core.int,
+    SHOW_ALL: core.int,
+    SHOW_COMMENT: core.int,
+    SHOW_DOCUMENT: core.int,
+    SHOW_DOCUMENT_FRAGMENT: core.int,
+    SHOW_DOCUMENT_TYPE: core.int,
+    SHOW_ELEMENT: core.int,
+    SHOW_PROCESSING_INSTRUCTION: core.int,
+    SHOW_TEXT: core.int
+  })
+});
+html$.NodeFilter.FILTER_ACCEPT = 1;
+html$.NodeFilter.FILTER_REJECT = 2;
+html$.NodeFilter.FILTER_SKIP = 3;
+html$.NodeFilter.SHOW_ALL = 4294967295;
+html$.NodeFilter.SHOW_COMMENT = 128;
+html$.NodeFilter.SHOW_DOCUMENT = 256;
+html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
+html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
+html$.NodeFilter.SHOW_ELEMENT = 1;
+html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
+html$.NodeFilter.SHOW_TEXT = 4;
+dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
+dart.defineExtensionNames([
+  'detach',
+  'nextNode',
+  'previousNode',
+  'pointerBeforeReferenceNode',
+  'referenceNode',
+  'root',
+  'whatToShow'
+]);
+html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
+  static new(root, whatToShow) {
+    return html$.document[_createNodeIterator](root, whatToShow, null);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.pointerBeforeReferenceNode]() {
+    return this.pointerBeforeReferenceNode;
+  }
+  get [dartx.referenceNode]() {
+    return this.referenceNode;
+  }
+  get [dartx.root]() {
+    return this.root;
+  }
+  get [dartx.whatToShow]() {
+    return this.whatToShow;
+  }
+  [dartx.detach](...args) {
+    return this.detach.apply(this, args);
+  }
+  [dartx.nextNode](...args) {
+    return this.nextNode.apply(this, args);
+  }
+  [dartx.previousNode](...args) {
+    return this.previousNode.apply(this, args);
+  }
+};
+dart.setSignature(html$.NodeIterator, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
+    _: dart.definiteFunctionType(html$.NodeIterator, [])
+  }),
+  fields: () => ({
+    [dartx.pointerBeforeReferenceNode]: core.bool,
+    [dartx.referenceNode]: html$.Node,
+    [dartx.root]: html$.Node,
+    [dartx.whatToShow]: core.int
+  }),
+  methods: () => ({
+    [dartx.detach]: dart.definiteFunctionType(dart.void, []),
+    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
+  })
+});
+dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt'
+]);
+html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [_item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$.NodeList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [_item]: dart.definiteFunctionType(html$.Node, [core.int])
+  })
+});
+dart.registerExtension(dart.global.NodeList, html$.NodeList);
+dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
+dart.defineExtensionNames([
+  'nextElementSibling',
+  'previousElementSibling'
+]);
+html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.nextElementSibling]() {
+    return this.nextElementSibling;
+  }
+  get [dartx.previousElementSibling]() {
+    return this.previousElementSibling;
+  }
+};
+dart.setSignature(html$.NonDocumentTypeChildNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
+  fields: () => ({
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element
+  })
+});
+dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
+dart.defineExtensionNames([
+  'getElementById'
+]);
+html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getElementById](...args) {
+    return this.getElementById.apply(this, args);
+  }
+};
+dart.setSignature(html$.NonElementParentNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
+  methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
+});
+dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
+dart.defineExtensionNames([
+  'close',
+  'onClick',
+  'onClose',
+  'onError',
+  'onShow',
+  'body',
+  'data',
+  'dir',
+  'icon',
+  'lang',
+  'permission',
+  'silent',
+  'tag',
+  'title',
+  'vibrate'
+]);
+html$.Notification = class Notification extends html$.EventTarget {
+  static new(title, opts) {
+    let dir = opts && 'dir' in opts ? opts.dir : null;
+    let body = opts && 'body' in opts ? opts.body : null;
+    let lang = opts && 'lang' in opts ? opts.lang : null;
+    let tag = opts && 'tag' in opts ? opts.tag : null;
+    let icon = opts && 'icon' in opts ? opts.icon : null;
+    let parsedOptions = dart.map();
+    if (dir != null) parsedOptions[dartx._set]('dir', dir);
+    if (body != null) parsedOptions[dartx._set]('body', body);
+    if (lang != null) parsedOptions[dartx._set]('lang', lang);
+    if (tag != null) parsedOptions[dartx._set]('tag', tag);
+    if (icon != null) parsedOptions[dartx._set]('icon', icon);
+    return html$.Notification._factoryNotification(title, parsedOptions);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static _factoryNotification(title, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return html$.Notification._create_1(title, options_1);
+    }
+    return html$.Notification._create_2(title);
+  }
+  static _create_1(title, options) {
+    return new self.Notification(title, options);
+  }
+  static _create_2(title) {
+    return new self.Notification(title);
+  }
+  static get supported() {
+    return !!window.Notification;
+  }
+  get [dartx.body]() {
+    return this.body;
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  get [dartx.dir]() {
+    return this.dir;
+  }
+  get [dartx.icon]() {
+    return this.icon;
+  }
+  get [dartx.lang]() {
+    return this.lang;
+  }
+  get [dartx.permission]() {
+    return this.permission;
+  }
+  get [dartx.silent]() {
+    return this.silent;
+  }
+  get [dartx.tag]() {
+    return this.tag;
+  }
+  get [dartx.title]() {
+    return this.title;
+  }
+  get [dartx.vibrate]() {
+    return this.vibrate;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  static requestPermission() {
+    let completer = CompleterOfString().new();
+    html$.Notification._requestPermission(dart.fn(value => {
+      completer.complete(value);
+    }, StringToNull()));
+    return completer.future;
+  }
+  get [dartx.onClick]() {
+    return html$.Notification.clickEvent.forTarget(this);
+  }
+  get [dartx.onClose]() {
+    return html$.Notification.closeEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.Notification.errorEvent.forTarget(this);
+  }
+  get [dartx.onShow]() {
+    return html$.Notification.showEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.Notification, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
+    _: dart.definiteFunctionType(html$.Notification, [])
+  }),
+  fields: () => ({
+    [dartx.body]: core.String,
+    [dartx.data]: core.Object,
+    [dartx.dir]: core.String,
+    [dartx.icon]: core.String,
+    [dartx.lang]: core.String,
+    [dartx.permission]: core.String,
+    [dartx.silent]: core.bool,
+    [dartx.tag]: core.String,
+    [dartx.title]: core.String,
+    [dartx.vibrate]: ListOfint()
+  }),
+  getters: () => ({
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
+  sfields: () => ({
+    clickEvent: EventStreamProviderOfEvent(),
+    closeEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    showEvent: EventStreamProviderOfEvent()
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
+    _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
+    _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
+    requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
+  }),
+  names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
+});
+dart.defineLazy(html$.Notification, {
+  get clickEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('click'));
+  },
+  get closeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('close'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get showEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('show'));
+  }
+});
+dart.registerExtension(dart.global.Notification, html$.Notification);
+dart.defineExtensionNames([
+  'notification'
+]);
+html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.NotificationEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.NotificationEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.NotificationEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.NotificationEvent(type);
+  }
+  get [dartx.notification]() {
+    return this.notification;
+  }
+};
+dart.setSignature(html$.NotificationEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.NotificationEvent, []),
+    new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.notification]: html$.Notification}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
+html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
+dart.defineExtensionNames([
+  'reversed',
+  'start',
+  'type'
+]);
+html$.OListElement = class OListElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
+  }
+  created() {
+    this[dartx.reversed] = null;
+    this[dartx.start] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.reversed]() {
+    return this.reversed;
+  }
+  set [dartx.reversed](value) {
+    this.reversed = value;
+  }
+  get [dartx.start]() {
+    return this.start;
+  }
+  set [dartx.start](value) {
+    this.start = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.OListElement, 'created');
+dart.setSignature(html$.OListElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.OListElement, []),
+    new: dart.definiteFunctionType(html$.OListElement, []),
+    created: dart.definiteFunctionType(html$.OListElement, [])
+  }),
+  fields: () => ({
+    [dartx.reversed]: core.bool,
+    [dartx.start]: core.int,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'setCustomValidity',
+  'data',
+  'form',
+  'height',
+  'name',
+  'type',
+  'useMap',
+  'validationMessage',
+  'validity',
+  'width',
+  'willValidate'
+]);
+html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
+  }
+  created() {
+    this[dartx.data] = null;
+    this[dartx.form] = null;
+    this[dartx.height] = null;
+    this[dartx.name] = null;
+    this[dartx.type] = null;
+    this[dartx.useMap] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.width] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('object');
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  set [dartx.data](value) {
+    this.data = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.useMap]() {
+    return this.useMap;
+  }
+  set [dartx.useMap](value) {
+    this.useMap = value;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [__setter__](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.ObjectElement, 'created');
+dart.setSignature(html$.ObjectElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ObjectElement, []),
+    new: dart.definiteFunctionType(html$.ObjectElement, []),
+    created: dart.definiteFunctionType(html$.ObjectElement, [])
+  }),
+  fields: () => ({
+    [dartx.data]: core.String,
+    [dartx.form]: html$.FormElement,
+    [dartx.height]: core.String,
+    [dartx.name]: core.String,
+    [dartx.type]: core.String,
+    [dartx.useMap]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.width]: core.String,
+    [dartx.willValidate]: core.bool
+  }),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
+dart.defineExtensionNames([
+  'disabled',
+  'label'
+]);
+html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
+  }
+  created() {
+    this[dartx.disabled] = null;
+    this[dartx.label] = null;
+    super.created();
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  set [dartx.label](value) {
+    this.label = value;
+  }
+};
+dart.defineNamedConstructor(html$.OptGroupElement, 'created');
+dart.setSignature(html$.OptGroupElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.OptGroupElement, []),
+    new: dart.definiteFunctionType(html$.OptGroupElement, []),
+    created: dart.definiteFunctionType(html$.OptGroupElement, [])
+  }),
+  fields: () => ({
+    [dartx.disabled]: core.bool,
+    [dartx.label]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
+dart.defineExtensionNames([
+  'defaultSelected',
+  'disabled',
+  'form',
+  'index',
+  'label',
+  'selected',
+  'value'
+]);
+html$.OptionElement = class OptionElement extends html$.HtmlElement {
+  static new(opts) {
+    let data = opts && 'data' in opts ? opts.data : '';
+    let value = opts && 'value' in opts ? opts.value : '';
+    let selected = opts && 'selected' in opts ? opts.selected : false;
+    return html$.OptionElement._(data, value, null, selected);
+  }
+  static _(data, value, defaultSelected, selected) {
+    if (data === void 0) data = null;
+    if (value === void 0) value = null;
+    if (defaultSelected === void 0) defaultSelected = null;
+    if (selected === void 0) selected = null;
+    if (selected != null) {
+      return html$.OptionElement._create_1(data, value, defaultSelected, selected);
+    }
+    if (defaultSelected != null) {
+      return html$.OptionElement._create_2(data, value, defaultSelected);
+    }
+    if (value != null) {
+      return html$.OptionElement._create_3(data, value);
+    }
+    if (data != null) {
+      return html$.OptionElement._create_4(data);
+    }
+    return html$.OptionElement._create_5();
+  }
+  static _create_1(data, value, defaultSelected, selected) {
+    return new Option(data, value, defaultSelected, selected);
+  }
+  static _create_2(data, value, defaultSelected) {
+    return new Option(data, value, defaultSelected);
+  }
+  static _create_3(data, value) {
+    return new Option(data, value);
+  }
+  static _create_4(data) {
+    return new Option(data);
+  }
+  static _create_5() {
+    return new Option();
+  }
+  created() {
+    this[dartx.defaultSelected] = null;
+    this[dartx.disabled] = null;
+    this[dartx.form] = null;
+    this[dartx.index] = null;
+    this[dartx.label] = null;
+    this[dartx.selected] = null;
+    this[dartx.value] = null;
+    super.created();
+  }
+  get [dartx.defaultSelected]() {
+    return this.defaultSelected;
+  }
+  set [dartx.defaultSelected](value) {
+    this.defaultSelected = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.index]() {
+    return this.index;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  set [dartx.label](value) {
+    this.label = value;
+  }
+  get [dartx.selected]() {
+    return this.selected;
+  }
+  set [dartx.selected](value) {
+    this.selected = value;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.defineNamedConstructor(html$.OptionElement, 'created');
+dart.setSignature(html$.OptionElement, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
+    _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
+    created: dart.definiteFunctionType(html$.OptionElement, [])
+  }),
+  fields: () => ({
+    [dartx.defaultSelected]: core.bool,
+    [dartx.disabled]: core.bool,
+    [dartx.form]: html$.FormElement,
+    [dartx.index]: core.int,
+    [dartx.label]: core.String,
+    [dartx.selected]: core.bool,
+    [dartx.value]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.OptionElement, [])
+  }),
+  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
+});
+dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'setCustomValidity',
+  'defaultValue',
+  'form',
+  'htmlFor',
+  'labels',
+  'name',
+  'type',
+  'validationMessage',
+  'validity',
+  'value',
+  'willValidate'
+]);
+html$.OutputElement = class OutputElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
+  }
+  created() {
+    this[dartx.defaultValue] = null;
+    this[dartx.form] = null;
+    this[dartx.htmlFor] = null;
+    this[dartx.labels] = null;
+    this[dartx.name] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.value] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('output');
+  }
+  get [dartx.defaultValue]() {
+    return this.defaultValue;
+  }
+  set [dartx.defaultValue](value) {
+    this.defaultValue = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.htmlFor]() {
+    return this.htmlFor;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.OutputElement, 'created');
+dart.setSignature(html$.OutputElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.OutputElement, []),
+    new: dart.definiteFunctionType(html$.OutputElement, []),
+    created: dart.definiteFunctionType(html$.OutputElement, [])
+  }),
+  fields: () => ({
+    [dartx.defaultValue]: core.String,
+    [dartx.form]: html$.FormElement,
+    [dartx.htmlFor]: html$.DomSettableTokenList,
+    [dartx.labels]: ListOfNode(),
+    [dartx.name]: core.String,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.value]: core.String,
+    [dartx.willValidate]: core.bool
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
+dart.defineExtensionNames([
+  'persisted'
+]);
+html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.PageTransitionEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.PageTransitionEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.PageTransitionEvent(type);
+  }
+  get [dartx.persisted]() {
+    return this.persisted;
+  }
+};
+dart.setSignature(html$.PageTransitionEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
+    new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.persisted]: core.bool}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
+html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.ParagraphElement, 'created');
+dart.setSignature(html$.ParagraphElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ParagraphElement, []),
+    new: dart.definiteFunctionType(html$.ParagraphElement, []),
+    created: dart.definiteFunctionType(html$.ParagraphElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
+dart.defineExtensionNames([
+  'name',
+  'value'
+]);
+html$.ParamElement = class ParamElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
+  }
+  created() {
+    this[dartx.name] = null;
+    this[dartx.value] = null;
+    super.created();
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.defineNamedConstructor(html$.ParamElement, 'created');
+dart.setSignature(html$.ParamElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ParamElement, []),
+    new: dart.definiteFunctionType(html$.ParamElement, []),
+    created: dart.definiteFunctionType(html$.ParamElement, [])
+  }),
+  fields: () => ({
+    [dartx.name]: core.String,
+    [dartx.value]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
+html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.ParentNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
+  fields: () => ({
+    [_childElementCount]: core.int,
+    [_children]: ListOfNode(),
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
+  })
+});
+dart.defineExtensionNames([
+  'formData',
+  'password'
+]);
+html$.PasswordCredential = class PasswordCredential extends html$.Credential {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(id, password, name, iconURL) {
+    if (name === void 0) name = null;
+    if (iconURL === void 0) iconURL = null;
+    if (iconURL != null) {
+      return html$.PasswordCredential._create_1(id, password, name, iconURL);
+    }
+    if (name != null) {
+      return html$.PasswordCredential._create_2(id, password, name);
+    }
+    return html$.PasswordCredential._create_3(id, password);
+  }
+  static _create_1(id, password, name, iconURL) {
+    return new self.PasswordCredential(id, password, name, iconURL);
+  }
+  static _create_2(id, password, name) {
+    return new self.PasswordCredential(id, password, name);
+  }
+  static _create_3(id, password) {
+    return new self.PasswordCredential(id, password);
+  }
+  get [dartx.formData]() {
+    return this.formData;
+  }
+  get [dartx.password]() {
+    return this.password;
+  }
+};
+dart.setSignature(html$.PasswordCredential, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PasswordCredential, []),
+    new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
+  }),
+  fields: () => ({
+    [dartx.formData]: html$.FormData,
+    [dartx.password]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
+dart.defineExtensionNames([
+  'addPath',
+  'arc',
+  'arcTo',
+  'bezierCurveTo',
+  'closePath',
+  'ellipse',
+  'lineTo',
+  'moveTo',
+  'quadraticCurveTo',
+  'rect'
+]);
+html$.Path2D = class Path2D extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(path_OR_text) {
+    if (path_OR_text === void 0) path_OR_text = null;
+    if (path_OR_text == null) {
+      return html$.Path2D._create_1();
+    }
+    if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
+      return html$.Path2D._create_2(path_OR_text);
+    }
+    if (typeof path_OR_text == 'string' || path_OR_text == null) {
+      return html$.Path2D._create_3(path_OR_text);
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  static _create_1() {
+    return new Path2D();
+  }
+  static _create_2(path_OR_text) {
+    return new Path2D(path_OR_text);
+  }
+  static _create_3(path_OR_text) {
+    return new Path2D(path_OR_text);
+  }
+  [dartx.addPath](...args) {
+    return this.addPath.apply(this, args);
+  }
+  [dartx.arc](...args) {
+    return this.arc.apply(this, args);
+  }
+  [dartx.arcTo](...args) {
+    return this.arcTo.apply(this, args);
+  }
+  [dartx.bezierCurveTo](...args) {
+    return this.bezierCurveTo.apply(this, args);
+  }
+  [dartx.closePath](...args) {
+    return this.closePath.apply(this, args);
+  }
+  [dartx.ellipse](...args) {
+    return this.ellipse.apply(this, args);
+  }
+  [dartx.lineTo](...args) {
+    return this.lineTo.apply(this, args);
+  }
+  [dartx.moveTo](...args) {
+    return this.moveTo.apply(this, args);
+  }
+  [dartx.quadraticCurveTo](...args) {
+    return this.quadraticCurveTo.apply(this, args);
+  }
+  [dartx.rect](...args) {
+    return this.rect.apply(this, args);
+  }
+};
+html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
+dart.setSignature(html$.Path2D, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.Path2D, []),
+    new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
+  }),
+  methods: () => ({
+    [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
+    [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
+    [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.closePath]: dart.definiteFunctionType(dart.void, []),
+    [dartx.ellipse]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.bool]),
+    [dartx.lineTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.Path2D, []),
+    _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.registerExtension(dart.global.Path2D, html$.Path2D);
+dart.defineExtensionNames([
+  'clearFrameTimings',
+  'clearMarks',
+  'clearMeasures',
+  'getEntries',
+  'getEntriesByName',
+  'getEntriesByType',
+  'mark',
+  'measure',
+  'now',
+  'setFrameTimingBufferSize',
+  'clearResourceTimings',
+  'setResourceTimingBufferSize',
+  'onResourceTimingBufferFull',
+  'memory',
+  'navigation',
+  'timing'
+]);
+html$.Performance = class Performance extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!window.performance;
+  }
+  get [dartx.memory]() {
+    return this.memory;
+  }
+  get [dartx.navigation]() {
+    return this.navigation;
+  }
+  get [dartx.timing]() {
+    return this.timing;
+  }
+  [dartx.clearFrameTimings](...args) {
+    return this.clearFrameTimings.apply(this, args);
+  }
+  [dartx.clearMarks](...args) {
+    return this.clearMarks.apply(this, args);
+  }
+  [dartx.clearMeasures](...args) {
+    return this.clearMeasures.apply(this, args);
+  }
+  [dartx.getEntries](...args) {
+    return this.getEntries.apply(this, args);
+  }
+  [dartx.getEntriesByName](...args) {
+    return this.getEntriesByName.apply(this, args);
+  }
+  [dartx.getEntriesByType](...args) {
+    return this.getEntriesByType.apply(this, args);
+  }
+  [dartx.mark](...args) {
+    return this.mark.apply(this, args);
+  }
+  [dartx.measure](...args) {
+    return this.measure.apply(this, args);
+  }
+  [dartx.now](...args) {
+    return this.now.apply(this, args);
+  }
+  [dartx.setFrameTimingBufferSize](...args) {
+    return this.setFrameTimingBufferSize.apply(this, args);
+  }
+  [dartx.clearResourceTimings](...args) {
+    return this.webkitClearResourceTimings.apply(this, args);
+  }
+  [dartx.setResourceTimingBufferSize](...args) {
+    return this.webkitSetResourceTimingBufferSize.apply(this, args);
+  }
+  get [dartx.onResourceTimingBufferFull]() {
+    return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.Performance, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
+  fields: () => ({
+    [dartx.memory]: html$.MemoryInfo,
+    [dartx.navigation]: html$.PerformanceNavigation,
+    [dartx.timing]: html$.PerformanceTiming
+  }),
+  getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
+    [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
+    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
+    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
+    [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.now]: dart.definiteFunctionType(core.double, []),
+    [dartx.setFrameTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineLazy(html$.Performance, {
+  get resourceTimingBufferFullEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
+  }
+});
+dart.registerExtension(dart.global.Performance, html$.Performance);
+dart.defineExtensionNames([
+  'duration',
+  'entryType',
+  'name',
+  'startTime'
+]);
+html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  get [dartx.entryType]() {
+    return this.entryType;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.startTime]() {
+    return this.startTime;
+  }
+};
+dart.setSignature(html$.PerformanceEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
+  fields: () => ({
+    [dartx.duration]: core.double,
+    [dartx.entryType]: core.String,
+    [dartx.name]: core.String,
+    [dartx.startTime]: core.double
+  })
+});
+dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
+dart.defineExtensionNames([
+  'sourceFrame'
+]);
+html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.sourceFrame]() {
+    return this.sourceFrame;
+  }
+};
+dart.setSignature(html$.PerformanceCompositeTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
+  fields: () => ({[dartx.sourceFrame]: core.int})
+});
+dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
+html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.PerformanceMark, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
+});
+dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
+html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.PerformanceMeasure, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
+});
+dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
+dart.defineExtensionNames([
+  'redirectCount',
+  'type'
+]);
+html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.redirectCount]() {
+    return this.redirectCount;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.PerformanceNavigation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
+  fields: () => ({
+    [dartx.redirectCount]: core.int,
+    [dartx.type]: core.int
+  }),
+  sfields: () => ({
+    TYPE_BACK_FORWARD: core.int,
+    TYPE_NAVIGATE: core.int,
+    TYPE_RELOAD: core.int,
+    TYPE_RESERVED: core.int
+  })
+});
+html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
+html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
+html$.PerformanceNavigation.TYPE_RELOAD = 1;
+html$.PerformanceNavigation.TYPE_RESERVED = 255;
+dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
+dart.defineExtensionNames([
+  'sourceFrame'
+]);
+html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.sourceFrame]() {
+    return this.sourceFrame;
+  }
+};
+dart.setSignature(html$.PerformanceRenderTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
+  fields: () => ({[dartx.sourceFrame]: core.int})
+});
+dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
+dart.defineExtensionNames([
+  'connectEnd',
+  'connectStart',
+  'domainLookupEnd',
+  'domainLookupStart',
+  'fetchStart',
+  'initiatorType',
+  'redirectEnd',
+  'redirectStart',
+  'requestStart',
+  'responseEnd',
+  'responseStart',
+  'secureConnectionStart',
+  'workerStart'
+]);
+html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.connectEnd]() {
+    return this.connectEnd;
+  }
+  get [dartx.connectStart]() {
+    return this.connectStart;
+  }
+  get [dartx.domainLookupEnd]() {
+    return this.domainLookupEnd;
+  }
+  get [dartx.domainLookupStart]() {
+    return this.domainLookupStart;
+  }
+  get [dartx.fetchStart]() {
+    return this.fetchStart;
+  }
+  get [dartx.initiatorType]() {
+    return this.initiatorType;
+  }
+  get [dartx.redirectEnd]() {
+    return this.redirectEnd;
+  }
+  get [dartx.redirectStart]() {
+    return this.redirectStart;
+  }
+  get [dartx.requestStart]() {
+    return this.requestStart;
+  }
+  get [dartx.responseEnd]() {
+    return this.responseEnd;
+  }
+  get [dartx.responseStart]() {
+    return this.responseStart;
+  }
+  get [dartx.secureConnectionStart]() {
+    return this.secureConnectionStart;
+  }
+  get [dartx.workerStart]() {
+    return this.workerStart;
+  }
+};
+dart.setSignature(html$.PerformanceResourceTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
+  fields: () => ({
+    [dartx.connectEnd]: core.double,
+    [dartx.connectStart]: core.double,
+    [dartx.domainLookupEnd]: core.double,
+    [dartx.domainLookupStart]: core.double,
+    [dartx.fetchStart]: core.double,
+    [dartx.initiatorType]: core.String,
+    [dartx.redirectEnd]: core.double,
+    [dartx.redirectStart]: core.double,
+    [dartx.requestStart]: core.double,
+    [dartx.responseEnd]: core.double,
+    [dartx.responseStart]: core.double,
+    [dartx.secureConnectionStart]: core.double,
+    [dartx.workerStart]: core.double
+  })
+});
+dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
+dart.defineExtensionNames([
+  'connectEnd',
+  'connectStart',
+  'domComplete',
+  'domContentLoadedEventEnd',
+  'domContentLoadedEventStart',
+  'domInteractive',
+  'domLoading',
+  'domainLookupEnd',
+  'domainLookupStart',
+  'fetchStart',
+  'loadEventEnd',
+  'loadEventStart',
+  'navigationStart',
+  'redirectEnd',
+  'redirectStart',
+  'requestStart',
+  'responseEnd',
+  'responseStart',
+  'secureConnectionStart',
+  'unloadEventEnd',
+  'unloadEventStart'
+]);
+html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.connectEnd]() {
+    return this.connectEnd;
+  }
+  get [dartx.connectStart]() {
+    return this.connectStart;
+  }
+  get [dartx.domComplete]() {
+    return this.domComplete;
+  }
+  get [dartx.domContentLoadedEventEnd]() {
+    return this.domContentLoadedEventEnd;
+  }
+  get [dartx.domContentLoadedEventStart]() {
+    return this.domContentLoadedEventStart;
+  }
+  get [dartx.domInteractive]() {
+    return this.domInteractive;
+  }
+  get [dartx.domLoading]() {
+    return this.domLoading;
+  }
+  get [dartx.domainLookupEnd]() {
+    return this.domainLookupEnd;
+  }
+  get [dartx.domainLookupStart]() {
+    return this.domainLookupStart;
+  }
+  get [dartx.fetchStart]() {
+    return this.fetchStart;
+  }
+  get [dartx.loadEventEnd]() {
+    return this.loadEventEnd;
+  }
+  get [dartx.loadEventStart]() {
+    return this.loadEventStart;
+  }
+  get [dartx.navigationStart]() {
+    return this.navigationStart;
+  }
+  get [dartx.redirectEnd]() {
+    return this.redirectEnd;
+  }
+  get [dartx.redirectStart]() {
+    return this.redirectStart;
+  }
+  get [dartx.requestStart]() {
+    return this.requestStart;
+  }
+  get [dartx.responseEnd]() {
+    return this.responseEnd;
+  }
+  get [dartx.responseStart]() {
+    return this.responseStart;
+  }
+  get [dartx.secureConnectionStart]() {
+    return this.secureConnectionStart;
+  }
+  get [dartx.unloadEventEnd]() {
+    return this.unloadEventEnd;
+  }
+  get [dartx.unloadEventStart]() {
+    return this.unloadEventStart;
+  }
+};
+dart.setSignature(html$.PerformanceTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
+  fields: () => ({
+    [dartx.connectEnd]: core.int,
+    [dartx.connectStart]: core.int,
+    [dartx.domComplete]: core.int,
+    [dartx.domContentLoadedEventEnd]: core.int,
+    [dartx.domContentLoadedEventStart]: core.int,
+    [dartx.domInteractive]: core.int,
+    [dartx.domLoading]: core.int,
+    [dartx.domainLookupEnd]: core.int,
+    [dartx.domainLookupStart]: core.int,
+    [dartx.fetchStart]: core.int,
+    [dartx.loadEventEnd]: core.int,
+    [dartx.loadEventStart]: core.int,
+    [dartx.navigationStart]: core.int,
+    [dartx.redirectEnd]: core.int,
+    [dartx.redirectStart]: core.int,
+    [dartx.requestStart]: core.int,
+    [dartx.responseEnd]: core.int,
+    [dartx.responseStart]: core.int,
+    [dartx.secureConnectionStart]: core.int,
+    [dartx.unloadEventEnd]: core.int,
+    [dartx.unloadEventStart]: core.int
+  })
+});
+dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
+dart.defineExtensionNames([
+  'registration'
+]);
+html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, init) {
+    let init_1 = html_common.convertDartToNative_Dictionary(init);
+    return html$.PeriodicSyncEvent._create_1(type, init_1);
+  }
+  static _create_1(type, init) {
+    return new self.PeriodicSyncEvent(type, init);
+  }
+  get [dartx.registration]() {
+    return this.registration;
+  }
+};
+dart.setSignature(html$.PeriodicSyncEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
+    new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
+  }),
+  fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
+const _register_1 = Symbol('_register_1');
+const _register_2 = Symbol('_register_2');
+dart.defineExtensionNames([
+  'getRegistration',
+  'getRegistrations',
+  'permissionState',
+  'register',
+  'minPossiblePeriod'
+]);
+html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.minPossiblePeriod]() {
+    return this.minPossiblePeriod;
+  }
+  [dartx.getRegistration](...args) {
+    return this.getRegistration.apply(this, args);
+  }
+  [dartx.getRegistrations](...args) {
+    return this.getRegistrations.apply(this, args);
+  }
+  [dartx.permissionState](...args) {
+    return this.permissionState.apply(this, args);
+  }
+  [dartx.register](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_register_1](options_1);
+    }
+    return this[_register_2]();
+  }
+  [_register_1](...args) {
+    return this.register.apply(this, args);
+  }
+  [_register_2](...args) {
+    return this.register.apply(this, args);
+  }
+};
+dart.setSignature(html$.PeriodicSyncManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
+  fields: () => ({[dartx.minPossiblePeriod]: core.int}),
+  methods: () => ({
+    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
+    [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
+    [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_register_2]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
+dart.defineExtensionNames([
+  'unregister',
+  'minPeriod',
+  'networkState',
+  'powerState',
+  'tag'
+]);
+html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.minPeriod]() {
+    return this.minPeriod;
+  }
+  get [dartx.networkState]() {
+    return this.networkState;
+  }
+  get [dartx.powerState]() {
+    return this.powerState;
+  }
+  get [dartx.tag]() {
+    return this.tag;
+  }
+  [dartx.unregister](...args) {
+    return this.unregister.apply(this, args);
+  }
+};
+dart.setSignature(html$.PeriodicSyncRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
+  fields: () => ({
+    [dartx.minPeriod]: core.int,
+    [dartx.networkState]: core.String,
+    [dartx.powerState]: core.String,
+    [dartx.tag]: core.String
+  }),
+  methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
+});
+dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
+dart.defineExtensionNames([
+  'onChange',
+  'state',
+  'status'
+]);
+html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.state]() {
+    return this.state;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  get [dartx.onChange]() {
+    return html$.PermissionStatus.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.PermissionStatus, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
+  fields: () => ({
+    [dartx.state]: core.String,
+    [dartx.status]: core.String
+  }),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.PermissionStatus, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
+dart.defineExtensionNames([
+  'query'
+]);
+html$.Permissions = class Permissions extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.query](...args) {
+    return this.query.apply(this, args);
+  }
+};
+dart.setSignature(html$.Permissions, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
+  methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
+});
+dart.registerExtension(dart.global.Permissions, html$.Permissions);
+html$.PictureElement = class PictureElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.PictureElement, 'created');
+dart.setSignature(html$.PictureElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PictureElement, []),
+    created: dart.definiteFunctionType(html$.PictureElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
+dart.defineExtensionNames([
+  'item',
+  'namedItem',
+  'description',
+  'filename',
+  'length',
+  'name'
+]);
+html$.Plugin = class Plugin extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.description]() {
+    return this.description;
+  }
+  get [dartx.filename]() {
+    return this.filename;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+};
+dart.setSignature(html$.Plugin, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
+  fields: () => ({
+    [dartx.description]: core.String,
+    [dartx.filename]: core.String,
+    [dartx.length]: core.int,
+    [dartx.name]: core.String
+  }),
+  methods: () => ({
+    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
+  })
+});
+dart.registerExtension(dart.global.Plugin, html$.Plugin);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item',
+  'namedItem',
+  'refresh'
+]);
+html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+  [dartx.refresh](...args) {
+    return this.refresh.apply(this, args);
+  }
+};
+html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
+dart.setSignature(html$.PluginArray, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
+    [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
+    [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
+  })
+});
+dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
+dart.defineExtensionNames([
+  'createdCallback',
+  'closeable',
+  'message'
+]);
+html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.closeable] = null;
+    this[dartx.message] = null;
+    super.created();
+  }
+  get [dartx.closeable]() {
+    return this.closeable;
+  }
+  set [dartx.closeable](value) {
+    this.closeable = value;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+  set [dartx.message](value) {
+    this.message = value;
+  }
+  [dartx.createdCallback](...args) {
+    return this.createdCallback.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
+dart.setSignature(html$.PluginPlaceholderElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
+    created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
+  }),
+  fields: () => ({
+    [dartx.closeable]: core.bool,
+    [dartx.message]: core.String
+  }),
+  methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
+});
+dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
+dart.defineExtensionNames([
+  'height',
+  'isPrimary',
+  'pointerId',
+  'pointerType',
+  'pressure',
+  'tiltX',
+  'tiltY',
+  'width'
+]);
+html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.PointerEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.PointerEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.PointerEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.PointerEvent(type);
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.isPrimary]() {
+    return this.isPrimary;
+  }
+  get [dartx.pointerId]() {
+    return this.pointerId;
+  }
+  get [dartx.pointerType]() {
+    return this.pointerType;
+  }
+  get [dartx.pressure]() {
+    return this.pressure;
+  }
+  get [dartx.tiltX]() {
+    return this.tiltX;
+  }
+  get [dartx.tiltY]() {
+    return this.tiltY;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+dart.setSignature(html$.PointerEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PointerEvent, []),
+    new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.height]: core.double,
+    [dartx.isPrimary]: core.bool,
+    [dartx.pointerId]: core.int,
+    [dartx.pointerType]: core.String,
+    [dartx.pressure]: core.double,
+    [dartx.tiltX]: core.int,
+    [dartx.tiltY]: core.int,
+    [dartx.width]: core.double
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
+dart.defineExtensionNames([
+  'state'
+]);
+html$.PopStateEvent = class PopStateEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.PopStateEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.PopStateEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.PopStateEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.PopStateEvent(type);
+  }
+  get [dartx.state]() {
+    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_state]);
+  }
+  get [_get_state]() {
+    return this.state;
+  }
+};
+dart.setSignature(html$.PopStateEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PopStateEvent, []),
+    new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[_get_state]: dart.dynamic}),
+  getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
+html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
+dart.defineExtensionNames([
+  'code',
+  'message'
+]);
+html$.PositionError = class PositionError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+};
+dart.setSignature(html$.PositionError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
+  fields: () => ({
+    [dartx.code]: core.int,
+    [dartx.message]: core.String
+  }),
+  sfields: () => ({
+    PERMISSION_DENIED: core.int,
+    POSITION_UNAVAILABLE: core.int,
+    TIMEOUT: core.int
+  })
+});
+html$.PositionError.PERMISSION_DENIED = 1;
+html$.PositionError.POSITION_UNAVAILABLE = 2;
+html$.PositionError.TIMEOUT = 3;
+dart.registerExtension(dart.global.PositionError, html$.PositionError);
+html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
+dart.defineExtensionNames([
+  'getImmediateState',
+  'getState',
+  'resetSensor'
+]);
+html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getImmediateState](...args) {
+    return this.getImmediateState.apply(this, args);
+  }
+  [dartx.getState](...args) {
+    return this.getState.apply(this, args);
+  }
+  [dartx.resetSensor](...args) {
+    return this.resetSensor.apply(this, args);
+  }
+};
+dart.setSignature(html$.PositionSensorVRDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
+  methods: () => ({
+    [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
+    [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
+    [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
+html$.PreElement = class PreElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.PreElement, 'created');
+dart.setSignature(html$.PreElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PreElement, []),
+    new: dart.definiteFunctionType(html$.PreElement, []),
+    created: dart.definiteFunctionType(html$.PreElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
+dart.defineExtensionNames([
+  'getAvailability',
+  'joinSession',
+  'startSession',
+  'session'
+]);
+html$.Presentation = class Presentation extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.session]() {
+    return this.session;
+  }
+  [dartx.getAvailability](...args) {
+    return this.getAvailability.apply(this, args);
+  }
+  [dartx.joinSession](...args) {
+    return this.joinSession.apply(this, args);
+  }
+  [dartx.startSession](...args) {
+    return this.startSession.apply(this, args);
+  }
+};
+dart.setSignature(html$.Presentation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
+  fields: () => ({[dartx.session]: html$.PresentationSession}),
+  methods: () => ({
+    [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
+    [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
+  })
+});
+dart.registerExtension(dart.global.Presentation, html$.Presentation);
+dart.defineExtensionNames([
+  'onChange',
+  'value'
+]);
+html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  get [dartx.onChange]() {
+    return html$.PresentationAvailability.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.PresentationAvailability, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
+  fields: () => ({[dartx.value]: core.bool}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.PresentationAvailability, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
+dart.defineExtensionNames([
+  'close',
+  'send',
+  'onMessage',
+  'binaryType',
+  'id',
+  'state'
+]);
+html$.PresentationSession = class PresentationSession extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.binaryType]() {
+    return this.binaryType;
+  }
+  set [dartx.binaryType](value) {
+    this.binaryType = value;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.state]() {
+    return this.state;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.send](...args) {
+    return this.send.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.PresentationSession.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.PresentationSession, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
+  fields: () => ({
+    [dartx.binaryType]: core.String,
+    [dartx.id]: core.String,
+    [dartx.state]: core.String
+  }),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.PresentationSession, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
+dart.defineExtensionNames([
+  'sheet',
+  'target'
+]);
+html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.sheet]() {
+    return this.sheet;
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+};
+dart.setSignature(html$.ProcessingInstruction, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
+  fields: () => ({
+    [dartx.sheet]: html$.StyleSheet,
+    [dartx.target]: core.String
+  })
+});
+dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
+dart.defineExtensionNames([
+  'labels',
+  'max',
+  'position',
+  'value'
+]);
+html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
+  }
+  created() {
+    this[dartx.labels] = null;
+    this[dartx.max] = null;
+    this[dartx.position] = null;
+    this[dartx.value] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('progress');
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.max]() {
+    return this.max;
+  }
+  set [dartx.max](value) {
+    this.max = value;
+  }
+  get [dartx.position]() {
+    return this.position;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.defineNamedConstructor(html$.ProgressElement, 'created');
+dart.setSignature(html$.ProgressElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ProgressElement, []),
+    new: dart.definiteFunctionType(html$.ProgressElement, []),
+    created: dart.definiteFunctionType(html$.ProgressElement, [])
+  }),
+  fields: () => ({
+    [dartx.labels]: ListOfNode(),
+    [dartx.max]: core.num,
+    [dartx.position]: core.double,
+    [dartx.value]: core.num
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
+dart.defineExtensionNames([
+  'lengthComputable',
+  'loaded',
+  'total'
+]);
+html$.ProgressEvent = class ProgressEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ProgressEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ProgressEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ProgressEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ProgressEvent(type);
+  }
+  get [dartx.lengthComputable]() {
+    return this.lengthComputable;
+  }
+  get [dartx.loaded]() {
+    return this.loaded;
+  }
+  get [dartx.total]() {
+    return this.total;
+  }
+};
+dart.setSignature(html$.ProgressEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ProgressEvent, []),
+    new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.lengthComputable]: core.bool,
+    [dartx.loaded]: core.int,
+    [dartx.total]: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
+dart.defineExtensionNames([
+  'promise',
+  'reason'
+]);
+html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.PromiseRejectionEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.PromiseRejectionEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.PromiseRejectionEvent(type);
+  }
+  get [dartx.promise]() {
+    return this.promise;
+  }
+  get [dartx.reason]() {
+    return this.reason;
+  }
+};
+dart.setSignature(html$.PromiseRejectionEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
+    new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.promise]: async.Future,
+    [dartx.reason]: core.Object
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
+dart.defineExtensionNames([
+  'data'
+]);
+html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.PushEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.PushEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.PushEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.PushEvent(type);
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+};
+dart.setSignature(html$.PushEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PushEvent, []),
+    new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.data]: html$.PushMessageData}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
+const _permissionState_1 = Symbol('_permissionState_1');
+const _permissionState_2 = Symbol('_permissionState_2');
+const _subscribe_1 = Symbol('_subscribe_1');
+const _subscribe_2 = Symbol('_subscribe_2');
+dart.defineExtensionNames([
+  'getSubscription',
+  'permissionState',
+  'subscribe'
+]);
+html$.PushManager = class PushManager extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getSubscription](...args) {
+    return this.getSubscription.apply(this, args);
+  }
+  [dartx.permissionState](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_permissionState_1](options_1);
+    }
+    return this[_permissionState_2]();
+  }
+  [_permissionState_1](...args) {
+    return this.permissionState.apply(this, args);
+  }
+  [_permissionState_2](...args) {
+    return this.permissionState.apply(this, args);
+  }
+  [dartx.subscribe](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_subscribe_1](options_1);
+    }
+    return this[_subscribe_2]();
+  }
+  [_subscribe_1](...args) {
+    return this.subscribe.apply(this, args);
+  }
+  [_subscribe_2](...args) {
+    return this.subscribe.apply(this, args);
+  }
+};
+dart.setSignature(html$.PushManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
+  methods: () => ({
+    [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
+    [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_permissionState_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_permissionState_2]: dart.definiteFunctionType(async.Future, []),
+    [dartx.subscribe]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_subscribe_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.PushManager, html$.PushManager);
+dart.defineExtensionNames([
+  'arrayBuffer',
+  'blob',
+  'json',
+  'text'
+]);
+html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(message) {
+    return html$.PushMessageData._create_1(message);
+  }
+  static _create_1(message) {
+    return new self.PushMessageData(message);
+  }
+  [dartx.arrayBuffer](...args) {
+    return this.arrayBuffer.apply(this, args);
+  }
+  [dartx.blob](...args) {
+    return this.blob.apply(this, args);
+  }
+  [dartx.json](...args) {
+    return this.json.apply(this, args);
+  }
+  [dartx.text](...args) {
+    return this.text.apply(this, args);
+  }
+};
+dart.setSignature(html$.PushMessageData, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.PushMessageData, []),
+    new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
+  }),
+  methods: () => ({
+    [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
+    [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
+    [dartx.json]: dart.definiteFunctionType(core.Object, []),
+    [dartx.text]: dart.definiteFunctionType(core.String, [])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
+dart.defineExtensionNames([
+  'unsubscribe',
+  'endpoint'
+]);
+html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.endpoint]() {
+    return this.endpoint;
+  }
+  [dartx.unsubscribe](...args) {
+    return this.unsubscribe.apply(this, args);
+  }
+};
+dart.setSignature(html$.PushSubscription, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
+  fields: () => ({[dartx.endpoint]: core.String}),
+  methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
+});
+dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
+dart.defineExtensionNames([
+  'cite'
+]);
+html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
+  }
+  created() {
+    this[dartx.cite] = null;
+    super.created();
+  }
+  get [dartx.cite]() {
+    return this.cite;
+  }
+  set [dartx.cite](value) {
+    this.cite = value;
+  }
+};
+dart.defineNamedConstructor(html$.QuoteElement, 'created');
+dart.setSignature(html$.QuoteElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.QuoteElement, []),
+    new: dart.definiteFunctionType(html$.QuoteElement, []),
+    created: dart.definiteFunctionType(html$.QuoteElement, [])
+  }),
+  fields: () => ({[dartx.cite]: core.String})
+});
+dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
+html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
+html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
+html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
+dart.defineExtensionNames([
+  'cloneContents',
+  'cloneRange',
+  'collapse',
+  'compareBoundaryPoints',
+  'comparePoint',
+  'createContextualFragment',
+  'deleteContents',
+  'detach',
+  'expand',
+  'extractContents',
+  'getBoundingClientRect',
+  'getClientRects',
+  'insertNode',
+  'isPointInRange',
+  'selectNode',
+  'selectNodeContents',
+  'setEnd',
+  'setEndAfter',
+  'setEndBefore',
+  'setStart',
+  'setStartAfter',
+  'setStartBefore',
+  'surroundContents',
+  'collapsed',
+  'commonAncestorContainer',
+  'endContainer',
+  'endOffset',
+  'startContainer',
+  'startOffset'
+]);
+html$.Range = class Range extends _interceptors.Interceptor {
+  static new() {
+    return html$.document[dartx.createRange]();
+  }
+  static fromPoint(point) {
+    return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.collapsed]() {
+    return this.collapsed;
+  }
+  get [dartx.commonAncestorContainer]() {
+    return this.commonAncestorContainer;
+  }
+  get [dartx.endContainer]() {
+    return this.endContainer;
+  }
+  get [dartx.endOffset]() {
+    return this.endOffset;
+  }
+  get [dartx.startContainer]() {
+    return this.startContainer;
+  }
+  get [dartx.startOffset]() {
+    return this.startOffset;
+  }
+  [dartx.cloneContents](...args) {
+    return this.cloneContents.apply(this, args);
+  }
+  [dartx.cloneRange](...args) {
+    return this.cloneRange.apply(this, args);
+  }
+  [dartx.collapse](...args) {
+    return this.collapse.apply(this, args);
+  }
+  [dartx.compareBoundaryPoints](...args) {
+    return this.compareBoundaryPoints.apply(this, args);
+  }
+  [dartx.comparePoint](...args) {
+    return this.comparePoint.apply(this, args);
+  }
+  [dartx.createContextualFragment](...args) {
+    return this.createContextualFragment.apply(this, args);
+  }
+  [dartx.deleteContents](...args) {
+    return this.deleteContents.apply(this, args);
+  }
+  [dartx.detach](...args) {
+    return this.detach.apply(this, args);
+  }
+  [dartx.expand](...args) {
+    return this.expand.apply(this, args);
+  }
+  [dartx.extractContents](...args) {
+    return this.extractContents.apply(this, args);
+  }
+  [dartx.getBoundingClientRect](...args) {
+    return this.getBoundingClientRect.apply(this, args);
+  }
+  [dartx.getClientRects](...args) {
+    return this.getClientRects.apply(this, args);
+  }
+  [dartx.insertNode](...args) {
+    return this.insertNode.apply(this, args);
+  }
+  [dartx.isPointInRange](...args) {
+    return this.isPointInRange.apply(this, args);
+  }
+  [dartx.selectNode](...args) {
+    return this.selectNode.apply(this, args);
+  }
+  [dartx.selectNodeContents](...args) {
+    return this.selectNodeContents.apply(this, args);
+  }
+  [dartx.setEnd](...args) {
+    return this.setEnd.apply(this, args);
+  }
+  [dartx.setEndAfter](...args) {
+    return this.setEndAfter.apply(this, args);
+  }
+  [dartx.setEndBefore](...args) {
+    return this.setEndBefore.apply(this, args);
+  }
+  [dartx.setStart](...args) {
+    return this.setStart.apply(this, args);
+  }
+  [dartx.setStartAfter](...args) {
+    return this.setStartAfter.apply(this, args);
+  }
+  [dartx.setStartBefore](...args) {
+    return this.setStartBefore.apply(this, args);
+  }
+  [dartx.surroundContents](...args) {
+    return this.surroundContents.apply(this, args);
+  }
+  static get supportsCreateContextualFragment() {
+    return "createContextualFragment" in window.Range.prototype;
+  }
+};
+dart.setSignature(html$.Range, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.Range, []),
+    fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
+    _: dart.definiteFunctionType(html$.Range, [])
+  }),
+  fields: () => ({
+    [dartx.collapsed]: core.bool,
+    [dartx.commonAncestorContainer]: html$.Node,
+    [dartx.endContainer]: html$.Node,
+    [dartx.endOffset]: core.int,
+    [dartx.startContainer]: html$.Node,
+    [dartx.startOffset]: core.int
+  }),
+  methods: () => ({
+    [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
+    [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
+    [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
+    [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
+    [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
+    [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
+    [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
+    [dartx.detach]: dart.definiteFunctionType(dart.void, []),
+    [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
+    [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
+    [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
+    [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
+    [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
+    [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
+    [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
+  }),
+  sfields: () => ({
+    END_TO_END: core.int,
+    END_TO_START: core.int,
+    START_TO_END: core.int,
+    START_TO_START: core.int
+  }),
+  sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
+});
+html$.Range.END_TO_END = 2;
+html$.Range.END_TO_START = 3;
+html$.Range.START_TO_END = 1;
+html$.Range.START_TO_START = 0;
+dart.registerExtension(dart.global.Range, html$.Range);
+dart.defineExtensionNames([
+  'cancel',
+  'getReader'
+]);
+html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.getReader](...args) {
+    return this.getReader.apply(this, args);
+  }
+};
+dart.setSignature(html$.ReadableByteStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
+    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
+  })
+});
+dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
+dart.defineExtensionNames([
+  'cancel',
+  'read',
+  'releaseLock',
+  'closed'
+]);
+html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.closed]() {
+    return this.closed;
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.read](...args) {
+    return this.read.apply(this, args);
+  }
+  [dartx.releaseLock](...args) {
+    return this.releaseLock.apply(this, args);
+  }
+};
+dart.setSignature(html$.ReadableByteStreamReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
+  fields: () => ({[dartx.closed]: async.Future}),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
+    [dartx.read]: dart.definiteFunctionType(async.Future, []),
+    [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
+dart.defineExtensionNames([
+  'cancel',
+  'getReader'
+]);
+html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.getReader](...args) {
+    return this.getReader.apply(this, args);
+  }
+};
+dart.setSignature(html$.ReadableStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
+    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
+  })
+});
+dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
+dart.defineExtensionNames([
+  'cancel',
+  'read',
+  'releaseLock',
+  'closed'
+]);
+html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.closed]() {
+    return this.closed;
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.read](...args) {
+    return this.read.apply(this, args);
+  }
+  [dartx.releaseLock](...args) {
+    return this.releaseLock.apply(this, args);
+  }
+};
+dart.setSignature(html$.ReadableStreamReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
+  fields: () => ({[dartx.closed]: async.Future}),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
+    [dartx.read]: dart.definiteFunctionType(async.Future, []),
+    [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
+dart.defineExtensionNames([
+  'relatedTarget'
+]);
+html$.RelatedEvent = class RelatedEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.RelatedEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.RelatedEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.RelatedEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.RelatedEvent(type);
+  }
+  get [dartx.relatedTarget]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+  }
+  get [_get_relatedTarget]() {
+    return this.relatedTarget;
+  }
+};
+dart.setSignature(html$.RelatedEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.RelatedEvent, []),
+    new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[_get_relatedTarget]: dart.dynamic}),
+  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
+html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
+dart.defineExtensionNames([
+  'url'
+]);
+html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+};
+dart.setSignature(html$.ResourceProgressEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
+  fields: () => ({[dartx.url]: core.String})
+});
+dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
+dart.defineExtensionNames([
+  'close',
+  'send',
+  'sendBlob',
+  'sendByteBuffer',
+  'sendString',
+  'sendTypedData',
+  'onClose',
+  'onError',
+  'onMessage',
+  'onOpen',
+  'binaryType',
+  'bufferedAmount',
+  'id',
+  'label',
+  'maxRetransmitTime',
+  'maxRetransmits',
+  'negotiated',
+  'ordered',
+  'protocol',
+  'readyState',
+  'reliable'
+]);
+html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.binaryType]() {
+    return this.binaryType;
+  }
+  set [dartx.binaryType](value) {
+    this.binaryType = value;
+  }
+  get [dartx.bufferedAmount]() {
+    return this.bufferedAmount;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.maxRetransmitTime]() {
+    return this.maxRetransmitTime;
+  }
+  get [dartx.maxRetransmits]() {
+    return this.maxRetransmits;
+  }
+  get [dartx.negotiated]() {
+    return this.negotiated;
+  }
+  get [dartx.ordered]() {
+    return this.ordered;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.reliable]() {
+    return this.reliable;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.send](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendBlob](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendByteBuffer](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendString](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendTypedData](...args) {
+    return this.send.apply(this, args);
+  }
+  get [dartx.onClose]() {
+    return html$.RtcDataChannel.closeEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.RtcDataChannel.errorEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.RtcDataChannel.messageEvent.forTarget(this);
+  }
+  get [dartx.onOpen]() {
+    return html$.RtcDataChannel.openEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.RtcDataChannel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
+  fields: () => ({
+    [dartx.binaryType]: core.String,
+    [dartx.bufferedAmount]: core.int,
+    [dartx.id]: core.int,
+    [dartx.label]: core.String,
+    [dartx.maxRetransmitTime]: core.int,
+    [dartx.maxRetransmits]: core.int,
+    [dartx.negotiated]: core.bool,
+    [dartx.ordered]: core.bool,
+    [dartx.protocol]: core.String,
+    [dartx.readyState]: core.String,
+    [dartx.reliable]: core.bool
+  }),
+  getters: () => ({
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
+    [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
+  }),
+  sfields: () => ({
+    closeEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    openEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(html$.RtcDataChannel, {
+  get closeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('close'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get openEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('open'));
+  }
+});
+dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
+dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
+dart.defineExtensionNames([
+  'channel'
+]);
+html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.channel]() {
+    return this.channel;
+  }
+};
+dart.setSignature(html$.RtcDataChannelEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
+  fields: () => ({[dartx.channel]: html$.RtcDataChannel})
+});
+dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
+dart.defineExtensionNames([
+  'insertDtmf',
+  'onToneChange',
+  'canInsertDtmf',
+  'duration',
+  'interToneGap',
+  'toneBuffer',
+  'track'
+]);
+html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.canInsertDtmf]() {
+    return this.canInsertDTMF;
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  get [dartx.interToneGap]() {
+    return this.interToneGap;
+  }
+  get [dartx.toneBuffer]() {
+    return this.toneBuffer;
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+  [dartx.insertDtmf](...args) {
+    return this.insertDTMF.apply(this, args);
+  }
+  get [dartx.onToneChange]() {
+    return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.RtcDtmfSender, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
+  fields: () => ({
+    [dartx.canInsertDtmf]: core.bool,
+    [dartx.duration]: core.int,
+    [dartx.interToneGap]: core.int,
+    [dartx.toneBuffer]: core.String,
+    [dartx.track]: html$.MediaStreamTrack
+  }),
+  getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
+  methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
+  sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
+});
+dart.defineLazy(html$.RtcDtmfSender, {
+  get toneChangeEvent() {
+    return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
+  }
+});
+dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
+dart.defineExtensionNames([
+  'tone'
+]);
+html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+    return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
+  }
+  static _create_1(type, eventInitDict) {
+    return new RTCDTMFToneChangeEvent(type, eventInitDict);
+  }
+  get [dartx.tone]() {
+    return this.tone;
+  }
+};
+dart.setSignature(html$.RtcDtmfToneChangeEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
+    new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
+  }),
+  fields: () => ({[dartx.tone]: core.String}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
+dart.defineExtensionNames([
+  'candidate',
+  'sdpMLineIndex',
+  'sdpMid'
+]);
+html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
+  static new(dictionary) {
+    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
+    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.candidate]() {
+    return this.candidate;
+  }
+  set [dartx.candidate](value) {
+    this.candidate = value;
+  }
+  get [dartx.sdpMLineIndex]() {
+    return this.sdpMLineIndex;
+  }
+  set [dartx.sdpMLineIndex](value) {
+    this.sdpMLineIndex = value;
+  }
+  get [dartx.sdpMid]() {
+    return this.sdpMid;
+  }
+  set [dartx.sdpMid](value) {
+    this.sdpMid = value;
+  }
+};
+dart.setSignature(html$.RtcIceCandidate, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
+  }),
+  fields: () => ({
+    [dartx.candidate]: core.String,
+    [dartx.sdpMLineIndex]: core.int,
+    [dartx.sdpMid]: core.String
+  })
+});
+dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
+dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
+dart.defineExtensionNames([
+  'candidate'
+]);
+html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.candidate]() {
+    return this.candidate;
+  }
+};
+dart.setSignature(html$.RtcIceCandidateEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
+  fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
+});
+dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
+dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
+const _createOffer = Symbol('_createOffer');
+const _createAnswer = Symbol('_createAnswer');
+const _getStats = Symbol('_getStats');
+const _addStream_1 = Symbol('_addStream_1');
+const _addStream_2 = Symbol('_addStream_2');
+const _createAnswer_1 = Symbol('_createAnswer_1');
+const _createAnswer_2 = Symbol('_createAnswer_2');
+const _createDataChannel_1 = Symbol('_createDataChannel_1');
+const _createDataChannel_2 = Symbol('_createDataChannel_2');
+const _createOffer_1 = Symbol('_createOffer_1');
+const _createOffer_2 = Symbol('_createOffer_2');
+const _setLocalDescription = Symbol('_setLocalDescription');
+const _setRemoteDescription = Symbol('_setRemoteDescription');
+const _updateIce_1 = Symbol('_updateIce_1');
+const _updateIce_2 = Symbol('_updateIce_2');
+const _updateIce_3 = Symbol('_updateIce_3');
+dart.defineExtensionNames([
+  'createOffer',
+  'createAnswer',
+  'getStats',
+  'addIceCandidate',
+  'addStream',
+  'close',
+  'createDtmfSender',
+  'createDataChannel',
+  'getLocalStreams',
+  'getRemoteStreams',
+  'getStreamById',
+  'removeStream',
+  'setLocalDescription',
+  'setRemoteDescription',
+  'updateIce',
+  'onAddStream',
+  'onDataChannel',
+  'onIceCandidate',
+  'onIceConnectionStateChange',
+  'onNegotiationNeeded',
+  'onRemoveStream',
+  'onSignalingStateChange',
+  'iceConnectionState',
+  'iceGatheringState',
+  'localDescription',
+  'remoteDescription',
+  'signalingState'
+]);
+html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
+  static new(rtcIceServers, mediaConstraints) {
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
+    if (mediaConstraints != null) {
+      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers), html_common.convertDartToNative_SerializedScriptValue(mediaConstraints));
+    } else {
+      return new constructorName(html_common.convertDartToNative_SerializedScriptValue(rtcIceServers));
+    }
+  }
+  static get supported() {
+    try {
+      html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
+      return true;
+    } catch (_) {
+      return false;
+    }
+
+    return false;
+  }
+  [dartx.createOffer](mediaConstraints) {
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    let completer = CompleterOfRtcSessionDescription().new();
+    this[_createOffer](dart.fn(value => {
+      completer.complete(value);
+    }, RtcSessionDescriptionToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, StringToNull()), mediaConstraints);
+    return completer.future;
+  }
+  [dartx.createAnswer](mediaConstraints) {
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    let completer = CompleterOfRtcSessionDescription().new();
+    this[_createAnswer](dart.fn(value => {
+      completer.complete(value);
+    }, RtcSessionDescriptionToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, StringToNull()), mediaConstraints);
+    return completer.future;
+  }
+  [dartx.getStats](selector) {
+    let completer = CompleterOfRtcStatsResponse().new();
+    this[_getStats](dart.fn(value => {
+      completer.complete(value);
+    }, RtcStatsResponseToNull()), selector);
+    return completer.future;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.iceConnectionState]() {
+    return this.iceConnectionState;
+  }
+  get [dartx.iceGatheringState]() {
+    return this.iceGatheringState;
+  }
+  get [dartx.localDescription]() {
+    return this.localDescription;
+  }
+  get [dartx.remoteDescription]() {
+    return this.remoteDescription;
+  }
+  get [dartx.signalingState]() {
+    return this.signalingState;
+  }
+  [dartx.addIceCandidate](...args) {
+    return this.addIceCandidate.apply(this, args);
+  }
+  [dartx.addStream](stream, mediaConstraints) {
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    if (mediaConstraints != null) {
+      let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
+      this[_addStream_1](stream, mediaConstraints_1);
+      return;
+    }
+    this[_addStream_2](stream);
+    return;
+  }
+  [_addStream_1](...args) {
+    return this.addStream.apply(this, args);
+  }
+  [_addStream_2](...args) {
+    return this.addStream.apply(this, args);
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [_createAnswer](successCallback, failureCallback, mediaConstraints) {
+    if (failureCallback === void 0) failureCallback = null;
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    if (mediaConstraints != null) {
+      let mediaConstraints_1 = html_common.convertDartToNative_Dictionary(mediaConstraints);
+      this[_createAnswer_1](successCallback, failureCallback, mediaConstraints_1);
+      return;
+    }
+    this[_createAnswer_2](successCallback, failureCallback);
+    return;
+  }
+  [_createAnswer_1](...args) {
+    return this.createAnswer.apply(this, args);
+  }
+  [_createAnswer_2](...args) {
+    return this.createAnswer.apply(this, args);
+  }
+  [dartx.createDtmfSender](...args) {
+    return this.createDTMFSender.apply(this, args);
+  }
+  [dartx.createDataChannel](label, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_createDataChannel_1](label, options_1);
+    }
+    return this[_createDataChannel_2](label);
+  }
+  [_createDataChannel_1](...args) {
+    return this.createDataChannel.apply(this, args);
+  }
+  [_createDataChannel_2](...args) {
+    return this.createDataChannel.apply(this, args);
+  }
+  [_createOffer](successCallback, failureCallback, rtcOfferOptions) {
+    if (failureCallback === void 0) failureCallback = null;
+    if (rtcOfferOptions === void 0) rtcOfferOptions = null;
+    if (rtcOfferOptions != null) {
+      let rtcOfferOptions_1 = html_common.convertDartToNative_Dictionary(rtcOfferOptions);
+      this[_createOffer_1](successCallback, failureCallback, rtcOfferOptions_1);
+      return;
+    }
+    this[_createOffer_2](successCallback, failureCallback);
+    return;
+  }
+  [_createOffer_1](...args) {
+    return this.createOffer.apply(this, args);
+  }
+  [_createOffer_2](...args) {
+    return this.createOffer.apply(this, args);
+  }
+  [dartx.getLocalStreams](...args) {
+    return this.getLocalStreams.apply(this, args);
+  }
+  [dartx.getRemoteStreams](...args) {
+    return this.getRemoteStreams.apply(this, args);
+  }
+  [_getStats](...args) {
+    return this.getStats.apply(this, args);
+  }
+  [dartx.getStreamById](...args) {
+    return this.getStreamById.apply(this, args);
+  }
+  [dartx.removeStream](...args) {
+    return this.removeStream.apply(this, args);
+  }
+  [_setLocalDescription](...args) {
+    return this.setLocalDescription.apply(this, args);
+  }
+  [dartx.setLocalDescription](description) {
+    let completer = async.Completer.new();
+    this[_setLocalDescription](description, dart.fn(() => {
+      completer.complete();
+    }, VoidToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, StringToNull()));
+    return completer.future;
+  }
+  [_setRemoteDescription](...args) {
+    return this.setRemoteDescription.apply(this, args);
+  }
+  [dartx.setRemoteDescription](description) {
+    let completer = async.Completer.new();
+    this[_setRemoteDescription](description, dart.fn(() => {
+      completer.complete();
+    }, VoidToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, StringToNull()));
+    return completer.future;
+  }
+  [dartx.updateIce](configuration, mediaConstraints) {
+    if (configuration === void 0) configuration = null;
+    if (mediaConstraints === void 0) mediaConstraints = null;
+    if (mediaConstraints != null) {
+      let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
+      let mediaConstraints_2 = html_common.convertDartToNative_Dictionary(mediaConstraints);
+      this[_updateIce_1](configuration_1, mediaConstraints_2);
+      return;
+    }
+    if (configuration != null) {
+      let configuration_1 = html_common.convertDartToNative_Dictionary(configuration);
+      this[_updateIce_2](configuration_1);
+      return;
+    }
+    this[_updateIce_3]();
+    return;
+  }
+  [_updateIce_1](...args) {
+    return this.updateIce.apply(this, args);
+  }
+  [_updateIce_2](...args) {
+    return this.updateIce.apply(this, args);
+  }
+  [_updateIce_3](...args) {
+    return this.updateIce.apply(this, args);
+  }
+  get [dartx.onAddStream]() {
+    return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
+  }
+  get [dartx.onDataChannel]() {
+    return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
+  }
+  get [dartx.onIceCandidate]() {
+    return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
+  }
+  get [dartx.onIceConnectionStateChange]() {
+    return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
+  }
+  get [dartx.onNegotiationNeeded]() {
+    return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
+  }
+  get [dartx.onRemoveStream]() {
+    return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
+  }
+  get [dartx.onSignalingStateChange]() {
+    return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.RtcPeerConnection, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
+  }),
+  fields: () => ({
+    [dartx.iceConnectionState]: core.String,
+    [dartx.iceGatheringState]: core.String,
+    [dartx.localDescription]: html$.RtcSessionDescription,
+    [dartx.remoteDescription]: html$.RtcSessionDescription,
+    [dartx.signalingState]: core.String
+  }),
+  getters: () => ({
+    [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
+    [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
+    [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
+    [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
+    [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
+    [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
+    [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
+    [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
+    [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
+    [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
+    [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
+    [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
+    [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
+    [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
+    [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
+    [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
+    [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
+    [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
+    [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
+    [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
+    [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
+    [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
+    [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
+    [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
+    [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
+    [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
+    [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
+    [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_updateIce_3]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    addStreamEvent: EventStreamProviderOfMediaStreamEvent(),
+    dataChannelEvent: EventStreamProviderOfRtcDataChannelEvent(),
+    iceCandidateEvent: EventStreamProviderOfRtcIceCandidateEvent(),
+    iceConnectionStateChangeEvent: EventStreamProviderOfEvent(),
+    negotiationNeededEvent: EventStreamProviderOfEvent(),
+    removeStreamEvent: EventStreamProviderOfMediaStreamEvent(),
+    signalingStateChangeEvent: EventStreamProviderOfEvent()
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineLazy(html$.RtcPeerConnection, {
+  get addStreamEvent() {
+    return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
+  },
+  get dataChannelEvent() {
+    return dart.const(new (EventStreamProviderOfRtcDataChannelEvent())('datachannel'));
+  },
+  get iceCandidateEvent() {
+    return dart.const(new (EventStreamProviderOfRtcIceCandidateEvent())('icecandidate'));
+  },
+  get iceConnectionStateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('iceconnectionstatechange'));
+  },
+  get negotiationNeededEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('negotiationneeded'));
+  },
+  get removeStreamEvent() {
+    return dart.const(new (EventStreamProviderOfMediaStreamEvent())('removestream'));
+  },
+  get signalingStateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
+  }
+});
+dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
+dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
+dart.defineExtensionNames([
+  'sdp',
+  'type'
+]);
+html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
+  static new(dictionary) {
+    let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
+    return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.sdp]() {
+    return this.sdp;
+  }
+  set [dartx.sdp](value) {
+    this.sdp = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.setSignature(html$.RtcSessionDescription, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
+  }),
+  fields: () => ({
+    [dartx.sdp]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
+dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
+const _get_timestamp = Symbol('_get_timestamp');
+dart.defineExtensionNames([
+  'timestamp',
+  'names',
+  'stat',
+  'id',
+  'type'
+]);
+html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.timestamp]() {
+    return html_common.convertNativeToDart_DateTime(this[_get_timestamp]);
+  }
+  get [_get_timestamp]() {
+    return this.timestamp;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.names](...args) {
+    return this.names.apply(this, args);
+  }
+  [dartx.stat](...args) {
+    return this.stat.apply(this, args);
+  }
+};
+dart.setSignature(html$.RtcStatsReport, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
+  fields: () => ({
+    [dartx.id]: core.String,
+    [_get_timestamp]: dart.dynamic,
+    [dartx.type]: core.String
+  }),
+  getters: () => ({[dartx.timestamp]: dart.definiteFunctionType(core.DateTime, [])}),
+  methods: () => ({
+    [dartx.names]: dart.definiteFunctionType(core.List$(core.String), []),
+    [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
+  })
+});
+dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
+dart.defineExtensionNames([
+  'namedItem',
+  'result'
+]);
+html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+  [dartx.result](...args) {
+    return this.result.apply(this, args);
+  }
+};
+dart.setSignature(html$.RtcStatsResponse, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
+  methods: () => ({
+    [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
+    [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
+  })
+});
+dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
+const _availLeft = Symbol('_availLeft');
+const _availTop = Symbol('_availTop');
+const _availWidth = Symbol('_availWidth');
+const _availHeight = Symbol('_availHeight');
+dart.defineExtensionNames([
+  'available',
+  'colorDepth',
+  'height',
+  'orientation',
+  'pixelDepth',
+  'width'
+]);
+html$.Screen = class Screen extends _interceptors.Interceptor {
+  get [dartx.available]() {
+    return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [_availHeight]() {
+    return this.availHeight;
+  }
+  get [_availLeft]() {
+    return this.availLeft;
+  }
+  get [_availTop]() {
+    return this.availTop;
+  }
+  get [_availWidth]() {
+    return this.availWidth;
+  }
+  get [dartx.colorDepth]() {
+    return this.colorDepth;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.orientation]() {
+    return this.orientation;
+  }
+  get [dartx.pixelDepth]() {
+    return this.pixelDepth;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+dart.setSignature(html$.Screen, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
+  fields: () => ({
+    [_availHeight]: core.int,
+    [_availLeft]: core.int,
+    [_availTop]: core.int,
+    [_availWidth]: core.int,
+    [dartx.colorDepth]: core.int,
+    [dartx.height]: core.int,
+    [dartx.orientation]: html$.ScreenOrientation,
+    [dartx.pixelDepth]: core.int,
+    [dartx.width]: core.int
+  }),
+  getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
+});
+dart.registerExtension(dart.global.Screen, html$.Screen);
+dart.defineExtensionNames([
+  'lock',
+  'unlock',
+  'onChange',
+  'angle',
+  'type'
+]);
+html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.angle]() {
+    return this.angle;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.lock](...args) {
+    return this.lock.apply(this, args);
+  }
+  [dartx.unlock](...args) {
+    return this.unlock.apply(this, args);
+  }
+  get [dartx.onChange]() {
+    return html$.ScreenOrientation.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.ScreenOrientation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
+  fields: () => ({
+    [dartx.angle]: core.int,
+    [dartx.type]: core.String
+  }),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.ScreenOrientation, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
+dart.defineExtensionNames([
+  'async',
+  'charset',
+  'crossOrigin',
+  'defer',
+  'integrity',
+  'nonce',
+  'src',
+  'type'
+]);
+html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
+  }
+  created() {
+    this[dartx.async] = null;
+    this[dartx.charset] = null;
+    this[dartx.crossOrigin] = null;
+    this[dartx.defer] = null;
+    this[dartx.integrity] = null;
+    this[dartx.nonce] = null;
+    this[dartx.src] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.async]() {
+    return this.async;
+  }
+  set [dartx.async](value) {
+    this.async = value;
+  }
+  get [dartx.charset]() {
+    return this.charset;
+  }
+  set [dartx.charset](value) {
+    this.charset = value;
+  }
+  get [dartx.crossOrigin]() {
+    return this.crossOrigin;
+  }
+  set [dartx.crossOrigin](value) {
+    this.crossOrigin = value;
+  }
+  get [dartx.defer]() {
+    return this.defer;
+  }
+  set [dartx.defer](value) {
+    this.defer = value;
+  }
+  get [dartx.integrity]() {
+    return this.integrity;
+  }
+  set [dartx.integrity](value) {
+    this.integrity = value;
+  }
+  get [dartx.nonce]() {
+    return this.nonce;
+  }
+  set [dartx.nonce](value) {
+    this.nonce = value;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.ScriptElement, 'created');
+dart.setSignature(html$.ScriptElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ScriptElement, []),
+    new: dart.definiteFunctionType(html$.ScriptElement, []),
+    created: dart.definiteFunctionType(html$.ScriptElement, [])
+  }),
+  fields: () => ({
+    [dartx.async]: core.bool,
+    [dartx.charset]: core.String,
+    [dartx.crossOrigin]: core.String,
+    [dartx.defer]: core.bool,
+    [dartx.integrity]: core.String,
+    [dartx.nonce]: core.String,
+    [dartx.src]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
+dart.defineExtensionNames([
+  'consumeDelta',
+  'deltaGranularity',
+  'deltaX',
+  'deltaY',
+  'fromUserInput',
+  'inInertialPhase',
+  'isBeginning',
+  'isEnding',
+  'shouldPropagate',
+  'velocityX',
+  'velocityY'
+]);
+html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
+    if (deltaX === void 0) deltaX = null;
+    if (deltaY === void 0) deltaY = null;
+    if (deltaGranularity === void 0) deltaGranularity = null;
+    if (velocityX === void 0) velocityX = null;
+    if (velocityY === void 0) velocityY = null;
+    if (inInertialPhase === void 0) inInertialPhase = null;
+    if (isBeginning === void 0) isBeginning = null;
+    if (isEnding === void 0) isEnding = null;
+    if (isEnding != null) {
+      return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+    }
+    if (isBeginning != null) {
+      return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+    }
+    if (inInertialPhase != null) {
+      return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+    }
+    if (velocityY != null) {
+      return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+    }
+    if (velocityX != null) {
+      return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
+    }
+    if (deltaGranularity != null) {
+      return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
+    }
+    if (deltaY != null) {
+      return html$.ScrollState._create_7(deltaX, deltaY);
+    }
+    if (deltaX != null) {
+      return html$.ScrollState._create_8(deltaX);
+    }
+    return html$.ScrollState._create_9();
+  }
+  static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+  }
+  static _create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+  }
+  static _create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+  }
+  static _create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+  }
+  static _create_5(deltaX, deltaY, deltaGranularity, velocityX) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX);
+  }
+  static _create_6(deltaX, deltaY, deltaGranularity) {
+    return new self.ScrollState(deltaX, deltaY, deltaGranularity);
+  }
+  static _create_7(deltaX, deltaY) {
+    return new self.ScrollState(deltaX, deltaY);
+  }
+  static _create_8(deltaX) {
+    return new self.ScrollState(deltaX);
+  }
+  static _create_9() {
+    return new self.ScrollState();
+  }
+  get [dartx.deltaGranularity]() {
+    return this.deltaGranularity;
+  }
+  get [dartx.deltaX]() {
+    return this.deltaX;
+  }
+  get [dartx.deltaY]() {
+    return this.deltaY;
+  }
+  get [dartx.fromUserInput]() {
+    return this.fromUserInput;
+  }
+  get [dartx.inInertialPhase]() {
+    return this.inInertialPhase;
+  }
+  get [dartx.isBeginning]() {
+    return this.isBeginning;
+  }
+  get [dartx.isEnding]() {
+    return this.isEnding;
+  }
+  get [dartx.shouldPropagate]() {
+    return this.shouldPropagate;
+  }
+  get [dartx.velocityX]() {
+    return this.velocityX;
+  }
+  get [dartx.velocityY]() {
+    return this.velocityY;
+  }
+  [dartx.consumeDelta](...args) {
+    return this.consumeDelta.apply(this, args);
+  }
+};
+dart.setSignature(html$.ScrollState, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ScrollState, []),
+    new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
+  }),
+  fields: () => ({
+    [dartx.deltaGranularity]: core.double,
+    [dartx.deltaX]: core.double,
+    [dartx.deltaY]: core.double,
+    [dartx.fromUserInput]: core.bool,
+    [dartx.inInertialPhase]: core.bool,
+    [dartx.isBeginning]: core.bool,
+    [dartx.isEnding]: core.bool,
+    [dartx.shouldPropagate]: core.bool,
+    [dartx.velocityX]: core.double,
+    [dartx.velocityY]: core.double
+  }),
+  methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
+    _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
+    _create_9: dart.definiteFunctionType(html$.ScrollState, [])
+  }),
+  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
+});
+dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
+dart.defineExtensionNames([
+  'blockedUri',
+  'columnNumber',
+  'documentUri',
+  'effectiveDirective',
+  'lineNumber',
+  'originalPolicy',
+  'referrer',
+  'sourceFile',
+  'statusCode',
+  'violatedDirective'
+]);
+html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.SecurityPolicyViolationEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.SecurityPolicyViolationEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.SecurityPolicyViolationEvent(type);
+  }
+  get [dartx.blockedUri]() {
+    return this.blockedURI;
+  }
+  get [dartx.columnNumber]() {
+    return this.columnNumber;
+  }
+  get [dartx.documentUri]() {
+    return this.documentURI;
+  }
+  get [dartx.effectiveDirective]() {
+    return this.effectiveDirective;
+  }
+  get [dartx.lineNumber]() {
+    return this.lineNumber;
+  }
+  get [dartx.originalPolicy]() {
+    return this.originalPolicy;
+  }
+  get [dartx.referrer]() {
+    return this.referrer;
+  }
+  get [dartx.sourceFile]() {
+    return this.sourceFile;
+  }
+  get [dartx.statusCode]() {
+    return this.statusCode;
+  }
+  get [dartx.violatedDirective]() {
+    return this.violatedDirective;
+  }
+};
+dart.setSignature(html$.SecurityPolicyViolationEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
+    new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.blockedUri]: core.String,
+    [dartx.columnNumber]: core.int,
+    [dartx.documentUri]: core.String,
+    [dartx.effectiveDirective]: core.String,
+    [dartx.lineNumber]: core.int,
+    [dartx.originalPolicy]: core.String,
+    [dartx.referrer]: core.String,
+    [dartx.sourceFile]: core.String,
+    [dartx.statusCode]: core.int,
+    [dartx.violatedDirective]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
+dart.defineExtensionNames([
+  'add',
+  'checkValidity',
+  'item',
+  'namedItem',
+  'reportValidity',
+  'setCustomValidity',
+  'options',
+  'selectedOptions',
+  'autofocus',
+  'disabled',
+  'form',
+  'labels',
+  'length',
+  'multiple',
+  'name',
+  'required',
+  'selectedIndex',
+  'size',
+  'type',
+  'validationMessage',
+  'validity',
+  'value',
+  'willValidate'
+]);
+html$.SelectElement = class SelectElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
+  }
+  created() {
+    this[dartx.autofocus] = null;
+    this[dartx.disabled] = null;
+    this[dartx.form] = null;
+    this[dartx.labels] = null;
+    this[dartx.length] = null;
+    this[dartx.multiple] = null;
+    this[dartx.name] = null;
+    this[dartx.required] = null;
+    this[dartx.selectedIndex] = null;
+    this[dartx.size] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.value] = null;
+    this[dartx.willValidate] = null;
+    super.created();
+  }
+  get [dartx.autofocus]() {
+    return this.autofocus;
+  }
+  set [dartx.autofocus](value) {
+    this.autofocus = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  set [dartx.length](value) {
+    this.length = value;
+  }
+  get [dartx.multiple]() {
+    return this.multiple;
+  }
+  set [dartx.multiple](value) {
+    this.multiple = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.required]() {
+    return this.required;
+  }
+  set [dartx.required](value) {
+    this.required = value;
+  }
+  get [dartx.selectedIndex]() {
+    return this.selectedIndex;
+  }
+  set [dartx.selectedIndex](value) {
+    this.selectedIndex = value;
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  set [dartx.size](value) {
+    this.size = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  [__setter__](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.add](...args) {
+    return this.add.apply(this, args);
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.namedItem](...args) {
+    return this.namedItem.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+  get [dartx.options]() {
+    let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
+    return new (UnmodifiableListViewOfOptionElement())(options);
+  }
+  get [dartx.selectedOptions]() {
+    if (dart.test(this[dartx.multiple])) {
+      let options = this[dartx.options][dartx.where](dart.fn(o => o[dartx.selected], OptionElementTobool()))[dartx.toList]();
+      return new (UnmodifiableListViewOfOptionElement())(options);
+    } else {
+      return JSArrayOfOptionElement().of([this[dartx.options][dartx._get](this[dartx.selectedIndex])]);
+    }
+  }
+};
+dart.defineNamedConstructor(html$.SelectElement, 'created');
+dart.setSignature(html$.SelectElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SelectElement, []),
+    new: dart.definiteFunctionType(html$.SelectElement, []),
+    created: dart.definiteFunctionType(html$.SelectElement, [])
+  }),
+  fields: () => ({
+    [dartx.autofocus]: core.bool,
+    [dartx.disabled]: core.bool,
+    [dartx.form]: html$.FormElement,
+    [dartx.labels]: ListOfNode(),
+    [dartx.length]: core.int,
+    [dartx.multiple]: core.bool,
+    [dartx.name]: core.String,
+    [dartx.required]: core.bool,
+    [dartx.selectedIndex]: core.int,
+    [dartx.size]: core.int,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.value]: core.String,
+    [dartx.willValidate]: core.bool
+  }),
+  getters: () => ({
+    [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
+    [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
+  }),
+  methods: () => ({
+    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
+    [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
+  })
+});
+dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
+dart.defineExtensionNames([
+  'addRange',
+  'collapse',
+  'collapseToEnd',
+  'collapseToStart',
+  'containsNode',
+  'deleteFromDocument',
+  'empty',
+  'extend',
+  'getRangeAt',
+  'modify',
+  'removeAllRanges',
+  'selectAllChildren',
+  'setBaseAndExtent',
+  'setPosition',
+  'anchorNode',
+  'anchorOffset',
+  'baseNode',
+  'baseOffset',
+  'extentNode',
+  'extentOffset',
+  'focusNode',
+  'focusOffset',
+  'isCollapsed',
+  'rangeCount',
+  'type'
+]);
+html$.Selection = class Selection extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.anchorNode]() {
+    return this.anchorNode;
+  }
+  get [dartx.anchorOffset]() {
+    return this.anchorOffset;
+  }
+  get [dartx.baseNode]() {
+    return this.baseNode;
+  }
+  get [dartx.baseOffset]() {
+    return this.baseOffset;
+  }
+  get [dartx.extentNode]() {
+    return this.extentNode;
+  }
+  get [dartx.extentOffset]() {
+    return this.extentOffset;
+  }
+  get [dartx.focusNode]() {
+    return this.focusNode;
+  }
+  get [dartx.focusOffset]() {
+    return this.focusOffset;
+  }
+  get [dartx.isCollapsed]() {
+    return this.isCollapsed;
+  }
+  get [dartx.rangeCount]() {
+    return this.rangeCount;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.addRange](...args) {
+    return this.addRange.apply(this, args);
+  }
+  [dartx.collapse](...args) {
+    return this.collapse.apply(this, args);
+  }
+  [dartx.collapseToEnd](...args) {
+    return this.collapseToEnd.apply(this, args);
+  }
+  [dartx.collapseToStart](...args) {
+    return this.collapseToStart.apply(this, args);
+  }
+  [dartx.containsNode](...args) {
+    return this.containsNode.apply(this, args);
+  }
+  [dartx.deleteFromDocument](...args) {
+    return this.deleteFromDocument.apply(this, args);
+  }
+  [dartx.empty](...args) {
+    return this.empty.apply(this, args);
+  }
+  [dartx.extend](...args) {
+    return this.extend.apply(this, args);
+  }
+  [dartx.getRangeAt](...args) {
+    return this.getRangeAt.apply(this, args);
+  }
+  [dartx.modify](...args) {
+    return this.modify.apply(this, args);
+  }
+  [dartx.removeAllRanges](...args) {
+    return this.removeAllRanges.apply(this, args);
+  }
+  [dartx.selectAllChildren](...args) {
+    return this.selectAllChildren.apply(this, args);
+  }
+  [dartx.setBaseAndExtent](...args) {
+    return this.setBaseAndExtent.apply(this, args);
+  }
+  [dartx.setPosition](...args) {
+    return this.setPosition.apply(this, args);
+  }
+};
+dart.setSignature(html$.Selection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
+  fields: () => ({
+    [dartx.anchorNode]: html$.Node,
+    [dartx.anchorOffset]: core.int,
+    [dartx.baseNode]: html$.Node,
+    [dartx.baseOffset]: core.int,
+    [dartx.extentNode]: html$.Node,
+    [dartx.extentOffset]: core.int,
+    [dartx.focusNode]: html$.Node,
+    [dartx.focusOffset]: core.int,
+    [dartx.isCollapsed]: core.bool,
+    [dartx.rangeCount]: core.int,
+    [dartx.type]: core.String
+  }),
+  methods: () => ({
+    [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
+    [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
+    [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
+    [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
+    [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
+    [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
+    [dartx.empty]: dart.definiteFunctionType(dart.void, []),
+    [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
+    [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
+    [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
+    [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
+    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
+  })
+});
+dart.registerExtension(dart.global.Selection, html$.Selection);
+dart.defineExtensionNames([
+  'close',
+  'postMessage',
+  'data',
+  'name',
+  'targetUrl'
+]);
+html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.targetUrl]() {
+    return this.targetURL;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+};
+dart.setSignature(html$.ServicePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
+  fields: () => ({
+    [dartx.data]: core.Object,
+    [dartx.name]: core.String,
+    [dartx.targetUrl]: core.String
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
+const _connect_1 = Symbol('_connect_1');
+const _connect_2 = Symbol('_connect_2');
+dart.defineExtensionNames([
+  'connect',
+  'match',
+  'matchAll',
+  'onMessage'
+]);
+html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.connect](url, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_connect_1](url, options_1);
+    }
+    return this[_connect_2](url);
+  }
+  [_connect_1](...args) {
+    return this.connect.apply(this, args);
+  }
+  [_connect_2](...args) {
+    return this.connect.apply(this, args);
+  }
+  [dartx.match](options) {
+    let options_1 = html_common.convertDartToNative_Dictionary(options);
+    return this[_match_1](options_1);
+  }
+  [_match_1](...args) {
+    return this.match.apply(this, args);
+  }
+  [dartx.matchAll](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_matchAll_1](options_1);
+    }
+    return this[_matchAll_2]();
+  }
+  [_matchAll_1](...args) {
+    return this.matchAll.apply(this, args);
+  }
+  [_matchAll_2](...args) {
+    return this.matchAll.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.ServicePortCollection.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.ServicePortCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
+    [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_connect_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.match]: dart.definiteFunctionType(async.Future, [core.Map]),
+    [_match_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_matchAll_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_matchAll_2]: dart.definiteFunctionType(async.Future, [])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.ServicePortCollection, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
+dart.defineExtensionNames([
+  'respondWith',
+  'origin',
+  'targetUrl'
+]);
+html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ServicePortConnectEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ServicePortConnectEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ServicePortConnectEvent(type);
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.targetUrl]() {
+    return this.targetURL;
+  }
+  [dartx.respondWith](...args) {
+    return this.respondWith.apply(this, args);
+  }
+};
+dart.setSignature(html$.ServicePortConnectEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
+    new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.origin]: core.String,
+    [dartx.targetUrl]: core.String
+  }),
+  methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
+dart.defineExtensionNames([
+  'getRegistration',
+  'getRegistrations',
+  'register',
+  'onMessage',
+  'controller',
+  'ready'
+]);
+html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.controller]() {
+    return this.controller;
+  }
+  get [dartx.ready]() {
+    return this.ready;
+  }
+  [dartx.getRegistration](...args) {
+    return this.getRegistration.apply(this, args);
+  }
+  [dartx.getRegistrations](...args) {
+    return this.getRegistrations.apply(this, args);
+  }
+  [dartx.register](url, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_register_1](url, options_1);
+    }
+    return this[_register_2](url);
+  }
+  [_register_1](...args) {
+    return this.register.apply(this, args);
+  }
+  [_register_2](...args) {
+    return this.register.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.ServiceWorkerContainer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
+  fields: () => ({
+    [dartx.controller]: html$._ServiceWorker,
+    [dartx.ready]: async.Future
+  }),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({
+    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
+    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
+    [dartx.register]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
+    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_register_2]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+  }),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.ServiceWorkerContainer, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
+dart.defineExtensionNames([
+  'skipWaiting',
+  'onMessage',
+  'clients',
+  'ports',
+  'registration'
+]);
+html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.clients]() {
+    return this.clients;
+  }
+  get [dartx.ports]() {
+    return this.ports;
+  }
+  get [dartx.registration]() {
+    return this.registration;
+  }
+  [dartx.skipWaiting](...args) {
+    return this.skipWaiting.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.ServiceWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
+  fields: () => ({
+    [dartx.clients]: html$.Clients,
+    [dartx.ports]: html$.StashedPortCollection,
+    [dartx.registration]: html$.ServiceWorkerRegistration
+  }),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.ServiceWorkerGlobalScope, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
+dart.defineExtensionNames([
+  'data',
+  'lastEventId',
+  'origin',
+  'ports',
+  'source'
+]);
+html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
+  get [dartx.data]() {
+    return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
+  }
+  get [_get_data]() {
+    return this.data;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.ServiceWorkerMessageEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.ServiceWorkerMessageEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.ServiceWorkerMessageEvent(type);
+  }
+  get [dartx.lastEventId]() {
+    return this.lastEventId;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.ports]() {
+    return this.ports;
+  }
+  get [dartx.source]() {
+    return this.source;
+  }
+};
+dart.setSignature(html$.ServiceWorkerMessageEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
+    new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_get_data]: dart.dynamic,
+    [dartx.lastEventId]: core.String,
+    [dartx.origin]: core.String,
+    [dartx.ports]: ListOfMessagePort(),
+    [dartx.source]: core.Object
+  }),
+  getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
+const _getNotifications_1 = Symbol('_getNotifications_1');
+const _getNotifications_2 = Symbol('_getNotifications_2');
+const _showNotification_1 = Symbol('_showNotification_1');
+const _showNotification_2 = Symbol('_showNotification_2');
+dart.defineExtensionNames([
+  'getNotifications',
+  'showNotification',
+  'unregister',
+  'update',
+  'active',
+  'geofencing',
+  'installing',
+  'periodicSync',
+  'pushManager',
+  'scope',
+  'sync',
+  'waiting'
+]);
+html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.active]() {
+    return this.active;
+  }
+  get [dartx.geofencing]() {
+    return this.geofencing;
+  }
+  get [dartx.installing]() {
+    return this.installing;
+  }
+  get [dartx.periodicSync]() {
+    return this.periodicSync;
+  }
+  get [dartx.pushManager]() {
+    return this.pushManager;
+  }
+  get [dartx.scope]() {
+    return this.scope;
+  }
+  get [dartx.sync]() {
+    return this.sync;
+  }
+  get [dartx.waiting]() {
+    return this.waiting;
+  }
+  [dartx.getNotifications](filter) {
+    if (filter === void 0) filter = null;
+    if (filter != null) {
+      let filter_1 = html_common.convertDartToNative_Dictionary(filter);
+      return this[_getNotifications_1](filter_1);
+    }
+    return this[_getNotifications_2]();
+  }
+  [_getNotifications_1](...args) {
+    return this.getNotifications.apply(this, args);
+  }
+  [_getNotifications_2](...args) {
+    return this.getNotifications.apply(this, args);
+  }
+  [dartx.showNotification](title, options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_showNotification_1](title, options_1);
+    }
+    return this[_showNotification_2](title);
+  }
+  [_showNotification_1](...args) {
+    return this.showNotification.apply(this, args);
+  }
+  [_showNotification_2](...args) {
+    return this.showNotification.apply(this, args);
+  }
+  [dartx.unregister](...args) {
+    return this.unregister.apply(this, args);
+  }
+  [dartx.update](...args) {
+    return this.update.apply(this, args);
+  }
+};
+dart.setSignature(html$.ServiceWorkerRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
+  fields: () => ({
+    [dartx.active]: html$._ServiceWorker,
+    [dartx.geofencing]: html$.Geofencing,
+    [dartx.installing]: html$._ServiceWorker,
+    [dartx.periodicSync]: html$.PeriodicSyncManager,
+    [dartx.pushManager]: html$.PushManager,
+    [dartx.scope]: core.String,
+    [dartx.sync]: html$.SyncManager,
+    [dartx.waiting]: html$._ServiceWorker
+  }),
+  methods: () => ({
+    [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_getNotifications_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_getNotifications_2]: dart.definiteFunctionType(async.Future, []),
+    [dartx.showNotification]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
+    [_showNotification_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_showNotification_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.unregister]: dart.definiteFunctionType(async.Future, []),
+    [dartx.update]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
+dart.defineExtensionNames([
+  'getDistributedNodes'
+]);
+html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('shadow');
+  }
+  [dartx.getDistributedNodes](...args) {
+    return this.getDistributedNodes.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.ShadowElement, 'created');
+dart.setSignature(html$.ShadowElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.ShadowElement, []),
+    new: dart.definiteFunctionType(html$.ShadowElement, []),
+    created: dart.definiteFunctionType(html$.ShadowElement, [])
+  }),
+  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
+dart.defineExtensionNames([
+  'clone',
+  'elementFromPoint',
+  'elementsFromPoint',
+  'getSelection',
+  'resetStyleInheritance',
+  'resetStyleInheritance',
+  'applyAuthorStyles',
+  'applyAuthorStyles',
+  'activeElement',
+  'delegatesFocus',
+  'host',
+  'innerHtml',
+  'olderShadowRoot',
+  'styleSheets'
+]);
+html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.activeElement]() {
+    return this.activeElement;
+  }
+  get [dartx.delegatesFocus]() {
+    return this.delegatesFocus;
+  }
+  get [dartx.host]() {
+    return this.host;
+  }
+  get [dartx.innerHtml]() {
+    return this.innerHTML;
+  }
+  set [dartx.innerHtml](value) {
+    this.innerHTML = value;
+  }
+  get [dartx.olderShadowRoot]() {
+    return this.olderShadowRoot;
+  }
+  get [dartx.styleSheets]() {
+    return this.styleSheets;
+  }
+  [dartx.clone](...args) {
+    return this.cloneNode.apply(this, args);
+  }
+  [dartx.elementFromPoint](...args) {
+    return this.elementFromPoint.apply(this, args);
+  }
+  [dartx.elementsFromPoint](...args) {
+    return this.elementsFromPoint.apply(this, args);
+  }
+  [dartx.getSelection](...args) {
+    return this.getSelection.apply(this, args);
+  }
+  static get supported() {
+    return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
+  }
+  static _shadowRootDeprecationReport() {
+    if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
+      html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
+      html$.ShadowRoot._shadowRootDeprecationReported = true;
+    }
+  }
+  get [dartx.resetStyleInheritance]() {
+    html$.ShadowRoot._shadowRootDeprecationReport();
+    return false;
+  }
+  set [dartx.resetStyleInheritance](value) {
+    html$.ShadowRoot._shadowRootDeprecationReport();
+  }
+  get [dartx.applyAuthorStyles]() {
+    html$.ShadowRoot._shadowRootDeprecationReport();
+    return false;
+  }
+  set [dartx.applyAuthorStyles](value) {
+    html$.ShadowRoot._shadowRootDeprecationReport();
+  }
+};
+const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
+dart.setSignature(html$.ShadowRoot, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
+  fields: () => ({
+    [dartx.activeElement]: html$.Element,
+    [dartx.delegatesFocus]: core.bool,
+    [dartx.host]: html$.Element,
+    [dartx.innerHtml]: core.String,
+    [dartx.olderShadowRoot]: html$.ShadowRoot,
+    [dartx.styleSheets]: ListOfStyleSheet()
+  }),
+  getters: () => ({
+    [dartx.resetStyleInheritance]: dart.definiteFunctionType(core.bool, []),
+    [dartx.applyAuthorStyles]: dart.definiteFunctionType(core.bool, [])
+  }),
+  setters: () => ({
+    [dartx.resetStyleInheritance]: dart.definiteFunctionType(dart.void, [core.bool]),
+    [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
+  }),
+  methods: () => ({
+    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
+    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
+  }),
+  sfields: () => ({_shadowRootDeprecationReported: core.bool}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
+  names: ['_shadowRootDeprecationReport']
+});
+html$.ShadowRoot._shadowRootDeprecationReported = false;
+dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
+dart.defineExtensionNames([
+  'byteLength'
+]);
+html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.byteLength]() {
+    return this.byteLength;
+  }
+};
+dart.setSignature(html$.SharedArrayBuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
+  fields: () => ({[dartx.byteLength]: core.int})
+});
+dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
+dart.defineExtensionNames([
+  'onError',
+  'port',
+  'workerStart'
+]);
+html$.SharedWorker = class SharedWorker extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(scriptURL, name) {
+    if (name === void 0) name = null;
+    if (name != null) {
+      return html$.SharedWorker._create_1(scriptURL, name);
+    }
+    return html$.SharedWorker._create_2(scriptURL);
+  }
+  static _create_1(scriptURL, name) {
+    return new self.SharedWorker(scriptURL, name);
+  }
+  static _create_2(scriptURL) {
+    return new self.SharedWorker(scriptURL);
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+  get [dartx.workerStart]() {
+    return this.workerStart;
+  }
+  get [dartx.onError]() {
+    return html$.SharedWorker.errorEvent.forTarget(this);
+  }
+};
+html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.SharedWorker, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SharedWorker, []),
+    new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
+  }),
+  fields: () => ({
+    [dartx.port]: html$.MessagePort,
+    [dartx.workerStart]: core.double
+  }),
+  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.defineLazy(html$.SharedWorker, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  }
+});
+dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
+dart.defineExtensionNames([
+  'onConnect',
+  'name'
+]);
+html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.onConnect]() {
+    return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.SharedWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
+  fields: () => ({[dartx.name]: core.String}),
+  getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.SharedWorkerGlobalScope, {
+  get connectEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('connect'));
+  }
+});
+dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
+dart.defineExtensionNames([
+  'abort',
+  'appendBuffer',
+  'appendStream',
+  'appendTypedData',
+  'remove',
+  'appendWindowEnd',
+  'appendWindowStart',
+  'buffered',
+  'mode',
+  'timestampOffset',
+  'trackDefaults',
+  'updating'
+]);
+html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.appendWindowEnd]() {
+    return this.appendWindowEnd;
+  }
+  set [dartx.appendWindowEnd](value) {
+    this.appendWindowEnd = value;
+  }
+  get [dartx.appendWindowStart]() {
+    return this.appendWindowStart;
+  }
+  set [dartx.appendWindowStart](value) {
+    this.appendWindowStart = value;
+  }
+  get [dartx.buffered]() {
+    return this.buffered;
+  }
+  get [dartx.mode]() {
+    return this.mode;
+  }
+  set [dartx.mode](value) {
+    this.mode = value;
+  }
+  get [dartx.timestampOffset]() {
+    return this.timestampOffset;
+  }
+  set [dartx.timestampOffset](value) {
+    this.timestampOffset = value;
+  }
+  get [dartx.trackDefaults]() {
+    return this.trackDefaults;
+  }
+  set [dartx.trackDefaults](value) {
+    this.trackDefaults = value;
+  }
+  get [dartx.updating]() {
+    return this.updating;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.appendBuffer](...args) {
+    return this.appendBuffer.apply(this, args);
+  }
+  [dartx.appendStream](...args) {
+    return this.appendStream.apply(this, args);
+  }
+  [dartx.appendTypedData](...args) {
+    return this.appendBuffer.apply(this, args);
+  }
+  [dartx.remove](...args) {
+    return this.remove.apply(this, args);
+  }
+};
+dart.setSignature(html$.SourceBuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
+  fields: () => ({
+    [dartx.appendWindowEnd]: core.num,
+    [dartx.appendWindowStart]: core.num,
+    [dartx.buffered]: html$.TimeRanges,
+    [dartx.mode]: core.String,
+    [dartx.timestampOffset]: core.num,
+    [dartx.trackDefaults]: html$.TrackDefaultList,
+    [dartx.updating]: core.bool
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
+    [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
+    [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
+    [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
+  })
+});
+dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
+dart.setSignature(html$.SourceBufferList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
+    [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
+  })
+});
+dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
+dart.defineExtensionNames([
+  'media',
+  'sizes',
+  'src',
+  'srcset',
+  'type'
+]);
+html$.SourceElement = class SourceElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
+  }
+  created() {
+    this[dartx.media] = null;
+    this[dartx.sizes] = null;
+    this[dartx.src] = null;
+    this[dartx.srcset] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  set [dartx.media](value) {
+    this.media = value;
+  }
+  get [dartx.sizes]() {
+    return this.sizes;
+  }
+  set [dartx.sizes](value) {
+    this.sizes = value;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.srcset]() {
+    return this.srcset;
+  }
+  set [dartx.srcset](value) {
+    this.srcset = value;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.SourceElement, 'created');
+dart.setSignature(html$.SourceElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SourceElement, []),
+    new: dart.definiteFunctionType(html$.SourceElement, []),
+    created: dart.definiteFunctionType(html$.SourceElement, [])
+  }),
+  fields: () => ({
+    [dartx.media]: core.String,
+    [dartx.sizes]: core.String,
+    [dartx.src]: core.String,
+    [dartx.srcset]: core.String,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
+dart.defineExtensionNames([
+  'facing',
+  'id',
+  'kind',
+  'label'
+]);
+html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.facing]() {
+    return this.facing;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+};
+dart.setSignature(html$.SourceInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
+  fields: () => ({
+    [dartx.facing]: core.String,
+    [dartx.id]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String
+  })
+});
+dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
+html$.SpanElement = class SpanElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.SpanElement, 'created');
+dart.setSignature(html$.SpanElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpanElement, []),
+    new: dart.definiteFunctionType(html$.SpanElement, []),
+    created: dart.definiteFunctionType(html$.SpanElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
+dart.defineExtensionNames([
+  'src',
+  'weight'
+]);
+html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.SpeechGrammar._create_1();
+  }
+  static _create_1() {
+    return new self.SpeechGrammar();
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.weight]() {
+    return this.weight;
+  }
+  set [dartx.weight](value) {
+    this.weight = value;
+  }
+};
+dart.setSignature(html$.SpeechGrammar, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechGrammar, []),
+    new: dart.definiteFunctionType(html$.SpeechGrammar, [])
+  }),
+  fields: () => ({
+    [dartx.src]: core.String,
+    [dartx.weight]: core.num
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'addFromString',
+  'addFromUri',
+  'item'
+]);
+html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.SpeechGrammarList._create_1();
+  }
+  static _create_1() {
+    return new self.SpeechGrammarList();
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.addFromString](...args) {
+    return this.addFromString.apply(this, args);
+  }
+  [dartx.addFromUri](...args) {
+    return this.addFromUri.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
+dart.setSignature(html$.SpeechGrammarList, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
+    new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
+  }),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
+    [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
+    [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
+    [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
+dart.defineExtensionNames([
+  'abort',
+  'start',
+  'stop',
+  'onAudioEnd',
+  'onAudioStart',
+  'onEnd',
+  'onError',
+  'onNoMatch',
+  'onResult',
+  'onSoundEnd',
+  'onSoundStart',
+  'onSpeechEnd',
+  'onSpeechStart',
+  'onStart',
+  'audioTrack',
+  'continuous',
+  'grammars',
+  'interimResults',
+  'lang',
+  'maxAlternatives',
+  'serviceUri'
+]);
+html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!(window.SpeechRecognition || window.webkitSpeechRecognition);
+  }
+  get [dartx.audioTrack]() {
+    return this.audioTrack;
+  }
+  set [dartx.audioTrack](value) {
+    this.audioTrack = value;
+  }
+  get [dartx.continuous]() {
+    return this.continuous;
+  }
+  set [dartx.continuous](value) {
+    this.continuous = value;
+  }
+  get [dartx.grammars]() {
+    return this.grammars;
+  }
+  set [dartx.grammars](value) {
+    this.grammars = value;
+  }
+  get [dartx.interimResults]() {
+    return this.interimResults;
+  }
+  set [dartx.interimResults](value) {
+    this.interimResults = value;
+  }
+  get [dartx.lang]() {
+    return this.lang;
+  }
+  set [dartx.lang](value) {
+    this.lang = value;
+  }
+  get [dartx.maxAlternatives]() {
+    return this.maxAlternatives;
+  }
+  set [dartx.maxAlternatives](value) {
+    this.maxAlternatives = value;
+  }
+  get [dartx.serviceUri]() {
+    return this.serviceURI;
+  }
+  set [dartx.serviceUri](value) {
+    this.serviceURI = value;
+  }
+  [dartx.abort](...args) {
+    return this.abort.apply(this, args);
+  }
+  [dartx.start](...args) {
+    return this.start.apply(this, args);
+  }
+  [dartx.stop](...args) {
+    return this.stop.apply(this, args);
+  }
+  get [dartx.onAudioEnd]() {
+    return html$.SpeechRecognition.audioEndEvent.forTarget(this);
+  }
+  get [dartx.onAudioStart]() {
+    return html$.SpeechRecognition.audioStartEvent.forTarget(this);
+  }
+  get [dartx.onEnd]() {
+    return html$.SpeechRecognition.endEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.SpeechRecognition.errorEvent.forTarget(this);
+  }
+  get [dartx.onNoMatch]() {
+    return html$.SpeechRecognition.noMatchEvent.forTarget(this);
+  }
+  get [dartx.onResult]() {
+    return html$.SpeechRecognition.resultEvent.forTarget(this);
+  }
+  get [dartx.onSoundEnd]() {
+    return html$.SpeechRecognition.soundEndEvent.forTarget(this);
+  }
+  get [dartx.onSoundStart]() {
+    return html$.SpeechRecognition.soundStartEvent.forTarget(this);
+  }
+  get [dartx.onSpeechEnd]() {
+    return html$.SpeechRecognition.speechEndEvent.forTarget(this);
+  }
+  get [dartx.onSpeechStart]() {
+    return html$.SpeechRecognition.speechStartEvent.forTarget(this);
+  }
+  get [dartx.onStart]() {
+    return html$.SpeechRecognition.startEvent.forTarget(this);
+  }
+  static new() {
+    return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
+  }
+};
+dart.setSignature(html$.SpeechRecognition, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechRecognition, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognition, [])
+  }),
+  fields: () => ({
+    [dartx.audioTrack]: html$.MediaStreamTrack,
+    [dartx.continuous]: core.bool,
+    [dartx.grammars]: html$.SpeechGrammarList,
+    [dartx.interimResults]: core.bool,
+    [dartx.lang]: core.String,
+    [dartx.maxAlternatives]: core.int,
+    [dartx.serviceUri]: core.String
+  }),
+  getters: () => ({
+    [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
+    [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
+    [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
+    [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.abort]: dart.definiteFunctionType(dart.void, []),
+    [dartx.start]: dart.definiteFunctionType(dart.void, []),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    audioEndEvent: EventStreamProviderOfEvent(),
+    audioStartEvent: EventStreamProviderOfEvent(),
+    endEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfSpeechRecognitionError(),
+    noMatchEvent: EventStreamProviderOfSpeechRecognitionEvent(),
+    resultEvent: EventStreamProviderOfSpeechRecognitionEvent(),
+    soundEndEvent: EventStreamProviderOfEvent(),
+    soundStartEvent: EventStreamProviderOfEvent(),
+    speechEndEvent: EventStreamProviderOfEvent(),
+    speechStartEvent: EventStreamProviderOfEvent(),
+    startEvent: EventStreamProviderOfEvent()
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.defineLazy(html$.SpeechRecognition, {
+  get audioEndEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('audioend'));
+  },
+  get audioStartEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('audiostart'));
+  },
+  get endEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('end'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechRecognitionError())('error'));
+  },
+  get noMatchEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('nomatch'));
+  },
+  get resultEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechRecognitionEvent())('result'));
+  },
+  get soundEndEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('soundend'));
+  },
+  get soundStartEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('soundstart'));
+  },
+  get speechEndEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('speechend'));
+  },
+  get speechStartEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('speechstart'));
+  },
+  get startEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('start'));
+  }
+});
+dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
+dart.defineExtensionNames([
+  'confidence',
+  'transcript'
+]);
+html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.confidence]() {
+    return this.confidence;
+  }
+  get [dartx.transcript]() {
+    return this.transcript;
+  }
+};
+dart.setSignature(html$.SpeechRecognitionAlternative, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
+  fields: () => ({
+    [dartx.confidence]: core.double,
+    [dartx.transcript]: core.String
+  })
+});
+dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
+dart.defineExtensionNames([
+  'error',
+  'message'
+]);
+html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, initDict) {
+    if (initDict === void 0) initDict = null;
+    if (initDict != null) {
+      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
+      return html$.SpeechRecognitionError._create_1(type, initDict_1);
+    }
+    return html$.SpeechRecognitionError._create_2(type);
+  }
+  static _create_1(type, initDict) {
+    return new self.SpeechRecognitionError(type, initDict);
+  }
+  static _create_2(type) {
+    return new self.SpeechRecognitionError(type);
+  }
+  get [dartx.error]() {
+    return this.error;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+};
+dart.setSignature(html$.SpeechRecognitionError, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.error]: core.String,
+    [dartx.message]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
+dart.defineExtensionNames([
+  'emma',
+  'interpretation',
+  'resultIndex',
+  'results'
+]);
+html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, initDict) {
+    if (initDict === void 0) initDict = null;
+    if (initDict != null) {
+      let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
+      return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
+    }
+    return html$.SpeechRecognitionEvent._create_2(type);
+  }
+  static _create_1(type, initDict) {
+    return new self.SpeechRecognitionEvent(type, initDict);
+  }
+  static _create_2(type) {
+    return new self.SpeechRecognitionEvent(type);
+  }
+  get [dartx.emma]() {
+    return this.emma;
+  }
+  get [dartx.interpretation]() {
+    return this.interpretation;
+  }
+  get [dartx.resultIndex]() {
+    return this.resultIndex;
+  }
+  get [dartx.results]() {
+    return this.results;
+  }
+};
+dart.setSignature(html$.SpeechRecognitionEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.emma]: html$.Document,
+    [dartx.interpretation]: html$.Document,
+    [dartx.resultIndex]: core.int,
+    [dartx.results]: ListOfSpeechRecognitionResult()
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
+dart.defineExtensionNames([
+  'item',
+  'isFinal',
+  'length'
+]);
+html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.isFinal]() {
+    return this.isFinal;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$.SpeechRecognitionResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
+  fields: () => ({
+    [dartx.isFinal]: core.bool,
+    [dartx.length]: core.int
+  }),
+  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
+});
+dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
+dart.defineExtensionNames([
+  'cancel',
+  'getVoices',
+  'pause',
+  'resume',
+  'speak',
+  'paused',
+  'pending',
+  'speaking'
+]);
+html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.paused]() {
+    return this.paused;
+  }
+  get [dartx.pending]() {
+    return this.pending;
+  }
+  get [dartx.speaking]() {
+    return this.speaking;
+  }
+  [dartx.cancel](...args) {
+    return this.cancel.apply(this, args);
+  }
+  [dartx.getVoices](...args) {
+    return this.getVoices.apply(this, args);
+  }
+  [dartx.pause](...args) {
+    return this.pause.apply(this, args);
+  }
+  [dartx.resume](...args) {
+    return this.resume.apply(this, args);
+  }
+  [dartx.speak](...args) {
+    return this.speak.apply(this, args);
+  }
+};
+dart.setSignature(html$.SpeechSynthesis, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
+  fields: () => ({
+    [dartx.paused]: core.bool,
+    [dartx.pending]: core.bool,
+    [dartx.speaking]: core.bool
+  }),
+  methods: () => ({
+    [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
+    [dartx.pause]: dart.definiteFunctionType(dart.void, []),
+    [dartx.resume]: dart.definiteFunctionType(dart.void, []),
+    [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
+  })
+});
+dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
+dart.defineExtensionNames([
+  'charIndex',
+  'elapsedTime',
+  'name',
+  'utterance'
+]);
+html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.charIndex]() {
+    return this.charIndex;
+  }
+  get [dartx.elapsedTime]() {
+    return this.elapsedTime;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.utterance]() {
+    return this.utterance;
+  }
+};
+dart.setSignature(html$.SpeechSynthesisEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
+  fields: () => ({
+    [dartx.charIndex]: core.int,
+    [dartx.elapsedTime]: core.double,
+    [dartx.name]: core.String,
+    [dartx.utterance]: html$.SpeechSynthesisUtterance
+  })
+});
+dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
+dart.defineExtensionNames([
+  'onBoundary',
+  'onEnd',
+  'onError',
+  'onMark',
+  'onPause',
+  'onResume',
+  'onStart',
+  'lang',
+  'pitch',
+  'rate',
+  'text',
+  'voice',
+  'volume'
+]);
+html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(text) {
+    if (text === void 0) text = null;
+    if (text != null) {
+      return html$.SpeechSynthesisUtterance._create_1(text);
+    }
+    return html$.SpeechSynthesisUtterance._create_2();
+  }
+  static _create_1(text) {
+    return new self.SpeechSynthesisUtterance(text);
+  }
+  static _create_2() {
+    return new self.SpeechSynthesisUtterance();
+  }
+  get [dartx.lang]() {
+    return this.lang;
+  }
+  set [dartx.lang](value) {
+    this.lang = value;
+  }
+  get [dartx.pitch]() {
+    return this.pitch;
+  }
+  set [dartx.pitch](value) {
+    this.pitch = value;
+  }
+  get [dartx.rate]() {
+    return this.rate;
+  }
+  set [dartx.rate](value) {
+    this.rate = value;
+  }
+  get [dartx.text]() {
+    return this.text;
+  }
+  set [dartx.text](value) {
+    this.text = value;
+  }
+  get [dartx.voice]() {
+    return this.voice;
+  }
+  set [dartx.voice](value) {
+    this.voice = value;
+  }
+  get [dartx.volume]() {
+    return this.volume;
+  }
+  set [dartx.volume](value) {
+    this.volume = value;
+  }
+  get [dartx.onBoundary]() {
+    return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
+  }
+  get [dartx.onEnd]() {
+    return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
+  }
+  get [dartx.onMark]() {
+    return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
+  }
+  get [dartx.onPause]() {
+    return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
+  }
+  get [dartx.onResume]() {
+    return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
+  }
+  get [dartx.onStart]() {
+    return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.SpeechSynthesisUtterance, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
+    new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
+  }),
+  fields: () => ({
+    [dartx.lang]: core.String,
+    [dartx.pitch]: core.num,
+    [dartx.rate]: core.num,
+    [dartx.text]: core.String,
+    [dartx.voice]: html$.SpeechSynthesisVoice,
+    [dartx.volume]: core.num
+  }),
+  getters: () => ({
+    [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
+  }),
+  sfields: () => ({
+    boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
+    endEvent: EventStreamProviderOfSpeechSynthesisEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    markEvent: EventStreamProviderOfSpeechSynthesisEvent(),
+    pauseEvent: EventStreamProviderOfEvent(),
+    resumeEvent: EventStreamProviderOfSpeechSynthesisEvent(),
+    startEvent: EventStreamProviderOfSpeechSynthesisEvent()
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.defineLazy(html$.SpeechSynthesisUtterance, {
+  get boundaryEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
+  },
+  get endEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('end'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get markEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('mark'));
+  },
+  get pauseEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pause'));
+  },
+  get resumeEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('resume'));
+  },
+  get startEvent() {
+    return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
+  }
+});
+dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
+dart.defineExtensionNames([
+  'defaultValue',
+  'lang',
+  'localService',
+  'name',
+  'voiceUri'
+]);
+html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.defaultValue]() {
+    return this.default;
+  }
+  get [dartx.lang]() {
+    return this.lang;
+  }
+  get [dartx.localService]() {
+    return this.localService;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.voiceUri]() {
+    return this.voiceURI;
+  }
+};
+dart.setSignature(html$.SpeechSynthesisVoice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
+  fields: () => ({
+    [dartx.defaultValue]: core.bool,
+    [dartx.lang]: core.String,
+    [dartx.localService]: core.bool,
+    [dartx.name]: core.String,
+    [dartx.voiceUri]: core.String
+  })
+});
+dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
+dart.defineExtensionNames([
+  'name'
+]);
+html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+};
+dart.setSignature(html$.StashedMessagePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
+  fields: () => ({[dartx.name]: core.String})
+});
+dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
+dart.defineExtensionNames([
+  'add',
+  'onMessage'
+]);
+html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.add](...args) {
+    return this.add.apply(this, args);
+  }
+  get [dartx.onMessage]() {
+    return html$.StashedPortCollection.messageEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.StashedPortCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
+  sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
+});
+dart.defineLazy(html$.StashedPortCollection, {
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
+const _getItem = Symbol('_getItem');
+const _setItem = Symbol('_setItem');
+const _removeItem = Symbol('_removeItem');
+const _key = Symbol('_key');
+const _length$3 = Symbol('_length');
+const __delete__ = Symbol('__delete__');
+dart.defineExtensionNames([
+  'addAll',
+  'containsValue',
+  'containsKey',
+  '_get',
+  '_set',
+  'putIfAbsent',
+  'remove',
+  'clear',
+  'forEach',
+  'keys',
+  'values',
+  'length',
+  'isEmpty',
+  'isNotEmpty'
+]);
+html$.Storage = class Storage extends _interceptors.Interceptor {
+  [dartx.addAll](other) {
+    other[dartx.forEach](dart.fn((k, v) => {
+      this[dartx._set](k, v);
+    }, StringAndStringToNull()));
+  }
+  [dartx.containsValue](value) {
+    return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
+  }
+  [dartx.containsKey](key) {
+    return this[_getItem](core.String._check(key)) != null;
+  }
+  [dartx._get](key) {
+    return this[_getItem](core.String._check(key));
+  }
+  [dartx._set](key, value) {
+    this[_setItem](key, value);
+    return value;
+  }
+  [dartx.putIfAbsent](key, ifAbsent) {
+    if (!dart.test(this[dartx.containsKey](key))) this[dartx._set](key, ifAbsent());
+    return this[dartx._get](key);
+  }
+  [dartx.remove](key) {
+    let value = this[dartx._get](key);
+    this[_removeItem](core.String._check(key));
+    return value;
+  }
+  [dartx.clear]() {
+    return this[_clear$1]();
+  }
+  [dartx.forEach](f) {
+    for (let i = 0; true; i++) {
+      let key = this[_key](i);
+      if (key == null) return;
+      f(key, this[dartx._get](key));
+    }
+  }
+  get [dartx.keys]() {
+    let keys = JSArrayOfString().of([]);
+    this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
+    return keys;
+  }
+  get [dartx.values]() {
+    let values = JSArrayOfString().of([]);
+    this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
+    return values;
+  }
+  get [dartx.length]() {
+    return this[_length$3];
+  }
+  get [dartx.isEmpty]() {
+    return this[_key](0) == null;
+  }
+  get [dartx.isNotEmpty]() {
+    return !dart.test(this[dartx.isEmpty]);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [_length$3]() {
+    return this.length;
+  }
+  [__delete__](...args) {
+    return this.__delete__.apply(this, args);
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [__setter__](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [_clear$1](...args) {
+    return this.clear.apply(this, args);
+  }
+  [_getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [_key](...args) {
+    return this.key.apply(this, args);
+  }
+  [_removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [_setItem](...args) {
+    return this.setItem.apply(this, args);
+  }
+};
+html$.Storage[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$.Storage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
+  fields: () => ({[_length$3]: core.int}),
+  getters: () => ({
+    [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    [dartx.length]: dart.definiteFunctionType(core.int, []),
+    [dartx.isEmpty]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isNotEmpty]: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    [dartx.addAll]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
+    [dartx.containsValue]: dart.definiteFunctionType(core.bool, [core.Object]),
+    [dartx.containsKey]: dart.definiteFunctionType(core.bool, [core.Object]),
+    [dartx._get]: dart.definiteFunctionType(core.String, [core.Object]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.putIfAbsent]: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
+    [dartx.remove]: dart.definiteFunctionType(core.String, [core.Object]),
+    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
+    [dartx.forEach]: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
+    [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
+    [_clear$1]: dart.definiteFunctionType(dart.void, []),
+    [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
+    [_key]: dart.definiteFunctionType(core.String, [core.int]),
+    [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
+    [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
+  })
+});
+dart.registerExtension(dart.global.Storage, html$.Storage);
+html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
+const _initStorageEvent = Symbol('_initStorageEvent');
+dart.defineExtensionNames([
+  'key',
+  'newValue',
+  'oldValue',
+  'storageArea',
+  'url'
+]);
+html$.StorageEvent = class StorageEvent extends html$.Event {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
+    let key = opts && 'key' in opts ? opts.key : null;
+    let oldValue = opts && 'oldValue' in opts ? opts.oldValue : null;
+    let newValue = opts && 'newValue' in opts ? opts.newValue : null;
+    let url = opts && 'url' in opts ? opts.url : null;
+    let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
+    let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
+    e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
+    return e;
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.StorageEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.StorageEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.StorageEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.StorageEvent(type);
+  }
+  get [dartx.key]() {
+    return this.key;
+  }
+  get [dartx.newValue]() {
+    return this.newValue;
+  }
+  get [dartx.oldValue]() {
+    return this.oldValue;
+  }
+  get [dartx.storageArea]() {
+    return this.storageArea;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+  [_initStorageEvent](...args) {
+    return this.initStorageEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.StorageEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
+    _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.key]: core.String,
+    [dartx.newValue]: core.String,
+    [dartx.oldValue]: core.String,
+    [dartx.storageArea]: html$.Storage,
+    [dartx.url]: core.String
+  }),
+  methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
+dart.defineExtensionNames([
+  'quota',
+  'usage'
+]);
+html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.quota]() {
+    return this.quota;
+  }
+  get [dartx.usage]() {
+    return this.usage;
+  }
+};
+dart.setSignature(html$.StorageInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
+  fields: () => ({
+    [dartx.quota]: core.int,
+    [dartx.usage]: core.int
+  })
+});
+dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
+dart.defineExtensionNames([
+  'queryInfo',
+  'requestPersistentQuota',
+  'supportedTypes'
+]);
+html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.supportedTypes]() {
+    return this.supportedTypes;
+  }
+  [dartx.queryInfo](...args) {
+    return this.queryInfo.apply(this, args);
+  }
+  [dartx.requestPersistentQuota](...args) {
+    return this.requestPersistentQuota.apply(this, args);
+  }
+};
+dart.setSignature(html$.StorageQuota, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
+  fields: () => ({[dartx.supportedTypes]: ListOfString()}),
+  methods: () => ({
+    [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
+  })
+});
+dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
+html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
+html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
+html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
+dart.defineExtensionNames([
+  'disabled',
+  'media',
+  'sheet',
+  'type'
+]);
+html$.StyleElement = class StyleElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
+  }
+  created() {
+    this[dartx.disabled] = null;
+    this[dartx.media] = null;
+    this[dartx.sheet] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  set [dartx.media](value) {
+    this.media = value;
+  }
+  get [dartx.sheet]() {
+    return this.sheet;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(html$.StyleElement, 'created');
+dart.setSignature(html$.StyleElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.StyleElement, []),
+    new: dart.definiteFunctionType(html$.StyleElement, []),
+    created: dart.definiteFunctionType(html$.StyleElement, [])
+  }),
+  fields: () => ({
+    [dartx.disabled]: core.bool,
+    [dartx.media]: core.String,
+    [dartx.sheet]: html$.StyleSheet,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
+dart.defineExtensionNames([
+  'matchMedium',
+  'type'
+]);
+html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.matchMedium](...args) {
+    return this.matchMedium.apply(this, args);
+  }
+};
+dart.setSignature(html$.StyleMedia, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
+  fields: () => ({[dartx.type]: core.String}),
+  methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
+});
+dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
+dart.defineExtensionNames([
+  'registration'
+]);
+html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, init) {
+    let init_1 = html_common.convertDartToNative_Dictionary(init);
+    return html$.SyncEvent._create_1(type, init_1);
+  }
+  static _create_1(type, init) {
+    return new self.SyncEvent(type, init);
+  }
+  get [dartx.registration]() {
+    return this.registration;
+  }
+};
+dart.setSignature(html$.SyncEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.SyncEvent, []),
+    new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
+  }),
+  fields: () => ({[dartx.registration]: html$.SyncRegistration}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
+dart.defineExtensionNames([
+  'getRegistration',
+  'getRegistrations',
+  'permissionState',
+  'register'
+]);
+html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getRegistration](...args) {
+    return this.getRegistration.apply(this, args);
+  }
+  [dartx.getRegistrations](...args) {
+    return this.getRegistrations.apply(this, args);
+  }
+  [dartx.permissionState](...args) {
+    return this.permissionState.apply(this, args);
+  }
+  [dartx.register](options) {
+    if (options === void 0) options = null;
+    if (options != null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options);
+      return this[_register_1](options_1);
+    }
+    return this[_register_2]();
+  }
+  [_register_1](...args) {
+    return this.register.apply(this, args);
+  }
+  [_register_2](...args) {
+    return this.register.apply(this, args);
+  }
+};
+dart.setSignature(html$.SyncManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
+  methods: () => ({
+    [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
+    [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
+    [dartx.permissionState]: dart.definiteFunctionType(async.Future, []),
+    [dartx.register]: dart.definiteFunctionType(async.Future, [], [core.Map]),
+    [_register_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [_register_2]: dart.definiteFunctionType(async.Future, [])
+  })
+});
+dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
+dart.defineExtensionNames([
+  'unregister',
+  'tag'
+]);
+html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.tag]() {
+    return this.tag;
+  }
+  [dartx.unregister](...args) {
+    return this.unregister.apply(this, args);
+  }
+};
+dart.setSignature(html$.SyncRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
+  fields: () => ({[dartx.tag]: core.String}),
+  methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
+});
+dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
+html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
+dart.setSignature(html$.TableCaptionElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    new: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    created: dart.definiteFunctionType(html$.TableCaptionElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
+dart.defineExtensionNames([
+  'cellIndex',
+  'colSpan',
+  'headers',
+  'rowSpan'
+]);
+html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
+  }
+  created() {
+    this[dartx.cellIndex] = null;
+    this[dartx.colSpan] = null;
+    this[dartx.headers] = null;
+    this[dartx.rowSpan] = null;
+    super.created();
+  }
+  get [dartx.cellIndex]() {
+    return this.cellIndex;
+  }
+  get [dartx.colSpan]() {
+    return this.colSpan;
+  }
+  set [dartx.colSpan](value) {
+    this.colSpan = value;
+  }
+  get [dartx.headers]() {
+    return this.headers;
+  }
+  set [dartx.headers](value) {
+    this.headers = value;
+  }
+  get [dartx.rowSpan]() {
+    return this.rowSpan;
+  }
+  set [dartx.rowSpan](value) {
+    this.rowSpan = value;
+  }
+};
+dart.defineNamedConstructor(html$.TableCellElement, 'created');
+dart.setSignature(html$.TableCellElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableCellElement, []),
+    new: dart.definiteFunctionType(html$.TableCellElement, []),
+    created: dart.definiteFunctionType(html$.TableCellElement, [])
+  }),
+  fields: () => ({
+    [dartx.cellIndex]: core.int,
+    [dartx.colSpan]: core.int,
+    [dartx.headers]: core.String,
+    [dartx.rowSpan]: core.int
+  })
+});
+dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
+dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
+dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
+dart.defineExtensionNames([
+  'span'
+]);
+html$.TableColElement = class TableColElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
+  }
+  created() {
+    this[dartx.span] = null;
+    super.created();
+  }
+  get [dartx.span]() {
+    return this.span;
+  }
+  set [dartx.span](value) {
+    this.span = value;
+  }
+};
+dart.defineNamedConstructor(html$.TableColElement, 'created');
+dart.setSignature(html$.TableColElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableColElement, []),
+    new: dart.definiteFunctionType(html$.TableColElement, []),
+    created: dart.definiteFunctionType(html$.TableColElement, [])
+  }),
+  fields: () => ({[dartx.span]: core.int})
+});
+dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
+const _tBodies = Symbol('_tBodies');
+const _rows = Symbol('_rows');
+const _createCaption = Symbol('_createCaption');
+const _createTBody = Symbol('_createTBody');
+const _createTFoot = Symbol('_createTFoot');
+const _createTHead = Symbol('_createTHead');
+const _insertRow = Symbol('_insertRow');
+const _nativeCreateTBody = Symbol('_nativeCreateTBody');
+dart.defineExtensionNames([
+  'tBodies',
+  'rows',
+  'addRow',
+  'createCaption',
+  'createTBody',
+  'createTFoot',
+  'createTHead',
+  'insertRow',
+  'createFragment',
+  'deleteCaption',
+  'deleteRow',
+  'deleteTFoot',
+  'deleteTHead',
+  'caption',
+  'tFoot',
+  'tHead'
+]);
+html$.TableElement = class TableElement extends html$.HtmlElement {
+  get [dartx.tBodies]() {
+    return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
+  }
+  get [dartx.rows]() {
+    return new (_WrappedListOfTableRowElement())(this[_rows]);
+  }
+  [dartx.addRow]() {
+    return this[dartx.insertRow](-1);
+  }
+  [dartx.createCaption]() {
+    return html$.TableCaptionElement._check(this[_createCaption]());
+  }
+  [dartx.createTBody]() {
+    return this[_createTBody]();
+  }
+  [dartx.createTFoot]() {
+    return html$.TableSectionElement._check(this[_createTFoot]());
+  }
+  [dartx.createTHead]() {
+    return html$.TableSectionElement._check(this[_createTHead]());
+  }
+  [dartx.insertRow](index) {
+    return html$.TableRowElement._check(this[_insertRow](index));
+  }
+  [_createTBody]() {
+    if (!!this.createTBody) {
+      return this[_nativeCreateTBody]();
+    }
+    let tbody = html$.Element.tag('tbody');
+    this[dartx.children][dartx.add](tbody);
+    return html$.TableSectionElement._check(tbody);
+  }
+  [_nativeCreateTBody](...args) {
+    return this.createTBody.apply(this, args);
+  }
+  [dartx.createFragment](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
+      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    }
+    let contextualHtml = dart.str`<table>${html}</table>`;
+    let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
+    let fragment = html$.DocumentFragment.new();
+    fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
+    return fragment;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TableElement._check(html$.document[dartx.createElement]("table"));
+  }
+  created() {
+    this[dartx.caption] = null;
+    this[_rows] = null;
+    this[_tBodies] = null;
+    this[dartx.tFoot] = null;
+    this[dartx.tHead] = null;
+    super.created();
+  }
+  get [dartx.caption]() {
+    return this.caption;
+  }
+  set [dartx.caption](value) {
+    this.caption = value;
+  }
+  get [_rows]() {
+    return this.rows;
+  }
+  get [_tBodies]() {
+    return this.tBodies;
+  }
+  get [dartx.tFoot]() {
+    return this.tFoot;
+  }
+  set [dartx.tFoot](value) {
+    this.tFoot = value;
+  }
+  get [dartx.tHead]() {
+    return this.tHead;
+  }
+  set [dartx.tHead](value) {
+    this.tHead = value;
+  }
+  [_createCaption](...args) {
+    return this.createCaption.apply(this, args);
+  }
+  [_createTFoot](...args) {
+    return this.createTFoot.apply(this, args);
+  }
+  [_createTHead](...args) {
+    return this.createTHead.apply(this, args);
+  }
+  [dartx.deleteCaption](...args) {
+    return this.deleteCaption.apply(this, args);
+  }
+  [dartx.deleteRow](...args) {
+    return this.deleteRow.apply(this, args);
+  }
+  [dartx.deleteTFoot](...args) {
+    return this.deleteTFoot.apply(this, args);
+  }
+  [dartx.deleteTHead](...args) {
+    return this.deleteTHead.apply(this, args);
+  }
+  [_insertRow](...args) {
+    return this.insertRow.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.TableElement, 'created');
+dart.setSignature(html$.TableElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableElement, []),
+    new: dart.definiteFunctionType(html$.TableElement, []),
+    created: dart.definiteFunctionType(html$.TableElement, [])
+  }),
+  fields: () => ({
+    [dartx.caption]: html$.TableCaptionElement,
+    [_rows]: ListOfNode(),
+    [_tBodies]: ListOfNode(),
+    [dartx.tFoot]: html$.TableSectionElement,
+    [dartx.tHead]: html$.TableSectionElement
+  }),
+  getters: () => ({
+    [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
+    [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
+  }),
+  methods: () => ({
+    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
+    [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
+    [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
+    [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
+    [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
+    [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
+    [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
+    [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
+    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
+  })
+});
+dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
+const _cells = Symbol('_cells');
+const _insertCell = Symbol('_insertCell');
+dart.defineExtensionNames([
+  'cells',
+  'addCell',
+  'insertCell',
+  'createFragment',
+  'deleteCell',
+  'rowIndex',
+  'sectionRowIndex'
+]);
+html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
+  get [dartx.cells]() {
+    return new (_WrappedListOfTableCellElement())(this[_cells]);
+  }
+  [dartx.addCell]() {
+    return this[dartx.insertCell](-1);
+  }
+  [dartx.insertCell](index) {
+    return html$.TableCellElement._check(this[_insertCell](index));
+  }
+  [dartx.createFragment](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
+      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    }
+    let fragment = html$.DocumentFragment.new();
+    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
+    let row = section[dartx.nodes][dartx.single];
+    fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
+    return fragment;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
+  }
+  created() {
+    this[_cells] = null;
+    this[dartx.rowIndex] = null;
+    this[dartx.sectionRowIndex] = null;
+    super.created();
+  }
+  get [_cells]() {
+    return this.cells;
+  }
+  get [dartx.rowIndex]() {
+    return this.rowIndex;
+  }
+  get [dartx.sectionRowIndex]() {
+    return this.sectionRowIndex;
+  }
+  [dartx.deleteCell](...args) {
+    return this.deleteCell.apply(this, args);
+  }
+  [_insertCell](...args) {
+    return this.insertCell.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.TableRowElement, 'created');
+dart.setSignature(html$.TableRowElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableRowElement, []),
+    new: dart.definiteFunctionType(html$.TableRowElement, []),
+    created: dart.definiteFunctionType(html$.TableRowElement, [])
+  }),
+  fields: () => ({
+    [_cells]: ListOfNode(),
+    [dartx.rowIndex]: core.int,
+    [dartx.sectionRowIndex]: core.int
+  }),
+  getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
+  methods: () => ({
+    [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
+    [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
+    [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
+  })
+});
+dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
+dart.defineExtensionNames([
+  'rows',
+  'addRow',
+  'insertRow',
+  'createFragment',
+  'deleteRow'
+]);
+html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
+  get [dartx.rows]() {
+    return new (_WrappedListOfTableRowElement())(this[_rows]);
+  }
+  [dartx.addRow]() {
+    return this[dartx.insertRow](-1);
+  }
+  [dartx.insertRow](index) {
+    return html$.TableRowElement._check(this[_insertRow](index));
+  }
+  [dartx.createFragment](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
+      return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    }
+    let fragment = html$.DocumentFragment.new();
+    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
+    fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
+    return fragment;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[_rows] = null;
+    super.created();
+  }
+  get [_rows]() {
+    return this.rows;
+  }
+  [dartx.deleteRow](...args) {
+    return this.deleteRow.apply(this, args);
+  }
+  [_insertRow](...args) {
+    return this.insertRow.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.TableSectionElement, 'created');
+dart.setSignature(html$.TableSectionElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TableSectionElement, []),
+    created: dart.definiteFunctionType(html$.TableSectionElement, [])
+  }),
+  fields: () => ({[_rows]: ListOfNode()}),
+  getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
+  methods: () => ({
+    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
+    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
+    [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
+  })
+});
+dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
+dart.defineExtensionNames([
+  'setInnerHtml',
+  'content'
+]);
+html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
+  }
+  created() {
+    this[dartx.content] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('template');
+  }
+  get [dartx.content]() {
+    return this.content;
+  }
+  [dartx.setInnerHtml](html, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    this[dartx.text] = null;
+    let fragment = this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    this[dartx.content][dartx.append](fragment);
+  }
+};
+dart.defineNamedConstructor(html$.TemplateElement, 'created');
+dart.setSignature(html$.TemplateElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TemplateElement, []),
+    new: dart.definiteFunctionType(html$.TemplateElement, []),
+    created: dart.definiteFunctionType(html$.TemplateElement, [])
+  }),
+  fields: () => ({[dartx.content]: html$.DocumentFragment}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
+dart.defineExtensionNames([
+  'checkValidity',
+  'reportValidity',
+  'select',
+  'setCustomValidity',
+  'setRangeText',
+  'setSelectionRange',
+  'autocapitalize',
+  'autofocus',
+  'cols',
+  'defaultValue',
+  'dirName',
+  'disabled',
+  'form',
+  'inputMode',
+  'labels',
+  'maxLength',
+  'minLength',
+  'name',
+  'placeholder',
+  'readOnly',
+  'required',
+  'rows',
+  'selectionDirection',
+  'selectionEnd',
+  'selectionStart',
+  'textLength',
+  'type',
+  'validationMessage',
+  'validity',
+  'value',
+  'willValidate',
+  'wrap'
+]);
+html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
+  }
+  created() {
+    this[dartx.autocapitalize] = null;
+    this[dartx.autofocus] = null;
+    this[dartx.cols] = null;
+    this[dartx.defaultValue] = null;
+    this[dartx.dirName] = null;
+    this[dartx.disabled] = null;
+    this[dartx.form] = null;
+    this[dartx.inputMode] = null;
+    this[dartx.labels] = null;
+    this[dartx.maxLength] = null;
+    this[dartx.minLength] = null;
+    this[dartx.name] = null;
+    this[dartx.placeholder] = null;
+    this[dartx.readOnly] = null;
+    this[dartx.required] = null;
+    this[dartx.rows] = null;
+    this[dartx.selectionDirection] = null;
+    this[dartx.selectionEnd] = null;
+    this[dartx.selectionStart] = null;
+    this[dartx.textLength] = null;
+    this[dartx.type] = null;
+    this[dartx.validationMessage] = null;
+    this[dartx.validity] = null;
+    this[dartx.value] = null;
+    this[dartx.willValidate] = null;
+    this[dartx.wrap] = null;
+    super.created();
+  }
+  get [dartx.autocapitalize]() {
+    return this.autocapitalize;
+  }
+  set [dartx.autocapitalize](value) {
+    this.autocapitalize = value;
+  }
+  get [dartx.autofocus]() {
+    return this.autofocus;
+  }
+  set [dartx.autofocus](value) {
+    this.autofocus = value;
+  }
+  get [dartx.cols]() {
+    return this.cols;
+  }
+  set [dartx.cols](value) {
+    this.cols = value;
+  }
+  get [dartx.defaultValue]() {
+    return this.defaultValue;
+  }
+  set [dartx.defaultValue](value) {
+    this.defaultValue = value;
+  }
+  get [dartx.dirName]() {
+    return this.dirName;
+  }
+  set [dartx.dirName](value) {
+    this.dirName = value;
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.form]() {
+    return this.form;
+  }
+  get [dartx.inputMode]() {
+    return this.inputMode;
+  }
+  set [dartx.inputMode](value) {
+    this.inputMode = value;
+  }
+  get [dartx.labels]() {
+    return this.labels;
+  }
+  get [dartx.maxLength]() {
+    return this.maxLength;
+  }
+  set [dartx.maxLength](value) {
+    this.maxLength = value;
+  }
+  get [dartx.minLength]() {
+    return this.minLength;
+  }
+  set [dartx.minLength](value) {
+    this.minLength = value;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.placeholder]() {
+    return this.placeholder;
+  }
+  set [dartx.placeholder](value) {
+    this.placeholder = value;
+  }
+  get [dartx.readOnly]() {
+    return this.readOnly;
+  }
+  set [dartx.readOnly](value) {
+    this.readOnly = value;
+  }
+  get [dartx.required]() {
+    return this.required;
+  }
+  set [dartx.required](value) {
+    this.required = value;
+  }
+  get [dartx.rows]() {
+    return this.rows;
+  }
+  set [dartx.rows](value) {
+    this.rows = value;
+  }
+  get [dartx.selectionDirection]() {
+    return this.selectionDirection;
+  }
+  set [dartx.selectionDirection](value) {
+    this.selectionDirection = value;
+  }
+  get [dartx.selectionEnd]() {
+    return this.selectionEnd;
+  }
+  set [dartx.selectionEnd](value) {
+    this.selectionEnd = value;
+  }
+  get [dartx.selectionStart]() {
+    return this.selectionStart;
+  }
+  set [dartx.selectionStart](value) {
+    this.selectionStart = value;
+  }
+  get [dartx.textLength]() {
+    return this.textLength;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.validationMessage]() {
+    return this.validationMessage;
+  }
+  get [dartx.validity]() {
+    return this.validity;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.willValidate]() {
+    return this.willValidate;
+  }
+  get [dartx.wrap]() {
+    return this.wrap;
+  }
+  set [dartx.wrap](value) {
+    this.wrap = value;
+  }
+  [dartx.checkValidity](...args) {
+    return this.checkValidity.apply(this, args);
+  }
+  [dartx.reportValidity](...args) {
+    return this.reportValidity.apply(this, args);
+  }
+  [dartx.select](...args) {
+    return this.select.apply(this, args);
+  }
+  [dartx.setCustomValidity](...args) {
+    return this.setCustomValidity.apply(this, args);
+  }
+  [dartx.setRangeText](...args) {
+    return this.setRangeText.apply(this, args);
+  }
+  [dartx.setSelectionRange](...args) {
+    return this.setSelectionRange.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.TextAreaElement, 'created');
+dart.setSignature(html$.TextAreaElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TextAreaElement, []),
+    new: dart.definiteFunctionType(html$.TextAreaElement, []),
+    created: dart.definiteFunctionType(html$.TextAreaElement, [])
+  }),
+  fields: () => ({
+    [dartx.autocapitalize]: core.String,
+    [dartx.autofocus]: core.bool,
+    [dartx.cols]: core.int,
+    [dartx.defaultValue]: core.String,
+    [dartx.dirName]: core.String,
+    [dartx.disabled]: core.bool,
+    [dartx.form]: html$.FormElement,
+    [dartx.inputMode]: core.String,
+    [dartx.labels]: ListOfNode(),
+    [dartx.maxLength]: core.int,
+    [dartx.minLength]: core.int,
+    [dartx.name]: core.String,
+    [dartx.placeholder]: core.String,
+    [dartx.readOnly]: core.bool,
+    [dartx.required]: core.bool,
+    [dartx.rows]: core.int,
+    [dartx.selectionDirection]: core.String,
+    [dartx.selectionEnd]: core.int,
+    [dartx.selectionStart]: core.int,
+    [dartx.textLength]: core.int,
+    [dartx.type]: core.String,
+    [dartx.validationMessage]: core.String,
+    [dartx.validity]: html$.ValidityState,
+    [dartx.value]: core.String,
+    [dartx.willValidate]: core.bool,
+    [dartx.wrap]: core.String
+  }),
+  methods: () => ({
+    [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
+    [dartx.select]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.setRangeText]: dart.definiteFunctionType(dart.void, [core.String], {start: core.int, end: core.int, selectionMode: core.String}),
+    [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
+  })
+});
+dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
+const _initTextEvent = Symbol('_initTextEvent');
+dart.defineExtensionNames([
+  'data'
+]);
+html$.TextEvent = class TextEvent extends html$.UIEvent {
+  static new(type, opts) {
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
+    let view = opts && 'view' in opts ? opts.view : null;
+    let data = opts && 'data' in opts ? opts.data : null;
+    if (view == null) {
+      view = html$.window;
+    }
+    let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
+    e[_initTextEvent](type, canBubble, cancelable, view, data);
+    return e;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.data]() {
+    return this.data;
+  }
+  [_initTextEvent](...args) {
+    return this.initTextEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.TextEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
+    _: dart.definiteFunctionType(html$.TextEvent, [])
+  }),
+  fields: () => ({[dartx.data]: core.String}),
+  methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
+});
+dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
+dart.defineExtensionNames([
+  'actualBoundingBoxAscent',
+  'actualBoundingBoxDescent',
+  'actualBoundingBoxLeft',
+  'actualBoundingBoxRight',
+  'alphabeticBaseline',
+  'emHeightAscent',
+  'emHeightDescent',
+  'fontBoundingBoxAscent',
+  'fontBoundingBoxDescent',
+  'hangingBaseline',
+  'ideographicBaseline',
+  'width'
+]);
+html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.actualBoundingBoxAscent]() {
+    return this.actualBoundingBoxAscent;
+  }
+  get [dartx.actualBoundingBoxDescent]() {
+    return this.actualBoundingBoxDescent;
+  }
+  get [dartx.actualBoundingBoxLeft]() {
+    return this.actualBoundingBoxLeft;
+  }
+  get [dartx.actualBoundingBoxRight]() {
+    return this.actualBoundingBoxRight;
+  }
+  get [dartx.alphabeticBaseline]() {
+    return this.alphabeticBaseline;
+  }
+  get [dartx.emHeightAscent]() {
+    return this.emHeightAscent;
+  }
+  get [dartx.emHeightDescent]() {
+    return this.emHeightDescent;
+  }
+  get [dartx.fontBoundingBoxAscent]() {
+    return this.fontBoundingBoxAscent;
+  }
+  get [dartx.fontBoundingBoxDescent]() {
+    return this.fontBoundingBoxDescent;
+  }
+  get [dartx.hangingBaseline]() {
+    return this.hangingBaseline;
+  }
+  get [dartx.ideographicBaseline]() {
+    return this.ideographicBaseline;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+dart.setSignature(html$.TextMetrics, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
+  fields: () => ({
+    [dartx.actualBoundingBoxAscent]: core.double,
+    [dartx.actualBoundingBoxDescent]: core.double,
+    [dartx.actualBoundingBoxLeft]: core.double,
+    [dartx.actualBoundingBoxRight]: core.double,
+    [dartx.alphabeticBaseline]: core.double,
+    [dartx.emHeightAscent]: core.double,
+    [dartx.emHeightDescent]: core.double,
+    [dartx.fontBoundingBoxAscent]: core.double,
+    [dartx.fontBoundingBoxDescent]: core.double,
+    [dartx.hangingBaseline]: core.double,
+    [dartx.ideographicBaseline]: core.double,
+    [dartx.width]: core.double
+  })
+});
+dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
+dart.defineExtensionNames([
+  'addCue',
+  'addRegion',
+  'removeCue',
+  'removeRegion',
+  'onCueChange',
+  'activeCues',
+  'cues',
+  'id',
+  'kind',
+  'label',
+  'language',
+  'mode',
+  'regions'
+]);
+html$.TextTrack = class TextTrack extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.activeCues]() {
+    return this.activeCues;
+  }
+  get [dartx.cues]() {
+    return this.cues;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.language]() {
+    return this.language;
+  }
+  get [dartx.mode]() {
+    return this.mode;
+  }
+  set [dartx.mode](value) {
+    this.mode = value;
+  }
+  get [dartx.regions]() {
+    return this.regions;
+  }
+  [dartx.addCue](...args) {
+    return this.addCue.apply(this, args);
+  }
+  [dartx.addRegion](...args) {
+    return this.addRegion.apply(this, args);
+  }
+  [dartx.removeCue](...args) {
+    return this.removeCue.apply(this, args);
+  }
+  [dartx.removeRegion](...args) {
+    return this.removeRegion.apply(this, args);
+  }
+  get [dartx.onCueChange]() {
+    return html$.TextTrack.cueChangeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.TextTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
+  fields: () => ({
+    [dartx.activeCues]: html$.TextTrackCueList,
+    [dartx.cues]: html$.TextTrackCueList,
+    [dartx.id]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String,
+    [dartx.language]: core.String,
+    [dartx.mode]: core.String,
+    [dartx.regions]: html$.VttRegionList
+  }),
+  getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
+    [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
+    [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
+    [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
+  }),
+  sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.TextTrack, {
+  get cueChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
+  }
+});
+dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
+dart.defineExtensionNames([
+  'onEnter',
+  'onExit',
+  'endTime',
+  'id',
+  'pauseOnExit',
+  'startTime',
+  'track'
+]);
+html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.endTime]() {
+    return this.endTime;
+  }
+  set [dartx.endTime](value) {
+    this.endTime = value;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  set [dartx.id](value) {
+    this.id = value;
+  }
+  get [dartx.pauseOnExit]() {
+    return this.pauseOnExit;
+  }
+  set [dartx.pauseOnExit](value) {
+    this.pauseOnExit = value;
+  }
+  get [dartx.startTime]() {
+    return this.startTime;
+  }
+  set [dartx.startTime](value) {
+    this.startTime = value;
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+  get [dartx.onEnter]() {
+    return html$.TextTrackCue.enterEvent.forTarget(this);
+  }
+  get [dartx.onExit]() {
+    return html$.TextTrackCue.exitEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.TextTrackCue, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
+  fields: () => ({
+    [dartx.endTime]: core.num,
+    [dartx.id]: core.String,
+    [dartx.pauseOnExit]: core.bool,
+    [dartx.startTime]: core.num,
+    [dartx.track]: html$.TextTrack
+  }),
+  getters: () => ({
+    [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  sfields: () => ({
+    enterEvent: EventStreamProviderOfEvent(),
+    exitEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(html$.TextTrackCue, {
+  get enterEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('enter'));
+  },
+  get exitEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('exit'));
+  }
+});
+dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'getCueById',
+  'item'
+]);
+html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.getCueById](...args) {
+    return this.getCueById.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
+dart.setSignature(html$.TextTrackCueList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
+    [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
+  })
+});
+dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'getTrackById',
+  'item',
+  'onAddTrack',
+  'onChange'
+]);
+html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.getTrackById](...args) {
+    return this.getTrackById.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  get [dartx.onAddTrack]() {
+    return html$.TextTrackList.addTrackEvent.forTarget(this);
+  }
+  get [dartx.onChange]() {
+    return html$.TextTrackList.changeEvent.forTarget(this);
+  }
+};
+html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
+dart.setSignature(html$.TextTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
+  getters: () => ({
+    [dartx.length]: dart.definiteFunctionType(core.int, []),
+    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
+  }),
+  sfields: () => ({
+    addTrackEvent: EventStreamProviderOfTrackEvent(),
+    changeEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(html$.TextTrackList, {
+  get addTrackEvent() {
+    return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
+  },
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
+dart.defineExtensionNames([
+  'end',
+  'start',
+  'length'
+]);
+html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.end](...args) {
+    return this.end.apply(this, args);
+  }
+  [dartx.start](...args) {
+    return this.start.apply(this, args);
+  }
+};
+dart.setSignature(html$.TimeRanges, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
+  fields: () => ({[dartx.length]: core.int}),
+  methods: () => ({
+    [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
+    [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
+  })
+});
+dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
+html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
+html$.TitleElement = class TitleElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.TitleElement, 'created');
+dart.setSignature(html$.TitleElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TitleElement, []),
+    new: dart.definiteFunctionType(html$.TitleElement, []),
+    created: dart.definiteFunctionType(html$.TitleElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
+const _radiusX = Symbol('_radiusX');
+const _radiusY = Symbol('_radiusY');
+const __clientX = Symbol('__clientX');
+const __clientY = Symbol('__clientY');
+const __screenX = Symbol('__screenX');
+const __screenY = Symbol('__screenY');
+const __pageX = Symbol('__pageX');
+const __pageY = Symbol('__pageY');
+const __radiusX = Symbol('__radiusX');
+const __radiusY = Symbol('__radiusY');
+dart.defineExtensionNames([
+  'target',
+  'client',
+  'page',
+  'screen',
+  'radiusX',
+  'radiusY',
+  'force',
+  'identifier',
+  'rotationAngle'
+]);
+html$.Touch = class Touch extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [_clientX]() {
+    return this.clientX;
+  }
+  get [_clientY]() {
+    return this.clientY;
+  }
+  get [dartx.force]() {
+    return this.force;
+  }
+  get [dartx.identifier]() {
+    return this.identifier;
+  }
+  get [_pageX]() {
+    return this.pageX;
+  }
+  get [_pageY]() {
+    return this.pageY;
+  }
+  get [_radiusX]() {
+    return this.radiusX;
+  }
+  get [_radiusY]() {
+    return this.radiusY;
+  }
+  get [dartx.rotationAngle]() {
+    return this.rotationAngle;
+  }
+  get [_screenX]() {
+    return this.screenX;
+  }
+  get [_screenY]() {
+    return this.screenY;
+  }
+  get [dartx.target]() {
+    return html$._convertNativeToDart_EventTarget(this[_get_target]);
+  }
+  get [_get_target]() {
+    return this.target;
+  }
+  get [__clientX]() {
+    return this.clientX[dartx.round]();
+  }
+  get [__clientY]() {
+    return this.clientY[dartx.round]();
+  }
+  get [__screenX]() {
+    return this.screenX[dartx.round]();
+  }
+  get [__screenY]() {
+    return this.screenY[dartx.round]();
+  }
+  get [__pageX]() {
+    return this.pageX[dartx.round]();
+  }
+  get [__pageY]() {
+    return this.pageY[dartx.round]();
+  }
+  get [__radiusX]() {
+    return this.radiusX[dartx.round]();
+  }
+  get [__radiusY]() {
+    return this.radiusY[dartx.round]();
+  }
+  get [dartx.client]() {
+    return new (PointOfnum())(this[__clientX], this[__clientY]);
+  }
+  get [dartx.page]() {
+    return new (PointOfnum())(this[__pageX], this[__pageY]);
+  }
+  get [dartx.screen]() {
+    return new (PointOfnum())(this[__screenX], this[__screenY]);
+  }
+  get [dartx.radiusX]() {
+    return this[__radiusX];
+  }
+  get [dartx.radiusY]() {
+    return this[__radiusY];
+  }
+};
+dart.setSignature(html$.Touch, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
+  fields: () => ({
+    [_clientX]: core.double,
+    [_clientY]: core.double,
+    [dartx.force]: core.double,
+    [dartx.identifier]: core.int,
+    [_pageX]: core.double,
+    [_pageY]: core.double,
+    [_radiusX]: core.double,
+    [_radiusY]: core.double,
+    [dartx.rotationAngle]: core.double,
+    [_screenX]: core.double,
+    [_screenY]: core.double,
+    [_get_target]: dart.dynamic
+  }),
+  getters: () => ({
+    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
+    [__clientX]: dart.definiteFunctionType(core.int, []),
+    [__clientY]: dart.definiteFunctionType(core.int, []),
+    [__screenX]: dart.definiteFunctionType(core.int, []),
+    [__screenY]: dart.definiteFunctionType(core.int, []),
+    [__pageX]: dart.definiteFunctionType(core.int, []),
+    [__pageY]: dart.definiteFunctionType(core.int, []),
+    [__radiusX]: dart.definiteFunctionType(core.int, []),
+    [__radiusY]: dart.definiteFunctionType(core.int, []),
+    [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.screen]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.radiusX]: dart.definiteFunctionType(core.int, []),
+    [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
+  })
+});
+dart.registerExtension(dart.global.Touch, html$.Touch);
+const _initTouchEvent = Symbol('_initTouchEvent');
+dart.defineExtensionNames([
+  'altKey',
+  'changedTouches',
+  'ctrlKey',
+  'metaKey',
+  'shiftKey',
+  'targetTouches',
+  'touches'
+]);
+html$.TouchEvent = class TouchEvent extends html$.UIEvent {
+  static new(touches, targetTouches, changedTouches, type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
+    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
+    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
+    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
+    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
+    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
+    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
+    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
+    if (view == null) {
+      view = html$.window;
+    }
+    let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
+    e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+    return e;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.altKey]() {
+    return this.altKey;
+  }
+  get [dartx.changedTouches]() {
+    return this.changedTouches;
+  }
+  get [dartx.ctrlKey]() {
+    return this.ctrlKey;
+  }
+  get [dartx.metaKey]() {
+    return this.metaKey;
+  }
+  get [dartx.shiftKey]() {
+    return this.shiftKey;
+  }
+  get [dartx.targetTouches]() {
+    return this.targetTouches;
+  }
+  get [dartx.touches]() {
+    return this.touches;
+  }
+  [_initTouchEvent](...args) {
+    return this.initTouchEvent.apply(this, args);
+  }
+  static get supported() {
+    return html_common.Device.isEventTypeSupported('TouchEvent');
+  }
+};
+dart.setSignature(html$.TouchEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
+    _: dart.definiteFunctionType(html$.TouchEvent, [])
+  }),
+  fields: () => ({
+    [dartx.altKey]: core.bool,
+    [dartx.changedTouches]: html$.TouchList,
+    [dartx.ctrlKey]: core.bool,
+    [dartx.metaKey]: core.bool,
+    [dartx.shiftKey]: core.bool,
+    [dartx.targetTouches]: html$.TouchList,
+    [dartx.touches]: html$.TouchList
+  }),
+  methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
+  static new() {
+    return null;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!document.createTouchList;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
+dart.setSignature(html$.TouchList, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.TouchList, []),
+    _: dart.definiteFunctionType(html$.TouchList, [])
+  }),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
+    [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.TouchList, html$.TouchList);
+dart.defineExtensionNames([
+  'byteStreamTrackID',
+  'kinds',
+  'label',
+  'language',
+  'type'
+]);
+html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, language, label, kinds, byteStreamTrackID) {
+    if (byteStreamTrackID === void 0) byteStreamTrackID = null;
+    if (byteStreamTrackID != null) {
+      let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
+      return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
+    }
+    let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
+    return html$.TrackDefault._create_2(type, language, label, kinds_1);
+  }
+  static _create_1(type, language, label, kinds, byteStreamTrackID) {
+    return new self.TrackDefault(type, language, label, kinds, byteStreamTrackID);
+  }
+  static _create_2(type, language, label, kinds) {
+    return new self.TrackDefault(type, language, label, kinds);
+  }
+  get [dartx.byteStreamTrackID]() {
+    return this.byteStreamTrackID;
+  }
+  get [dartx.kinds]() {
+    return this.kinds;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.language]() {
+    return this.language;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(html$.TrackDefault, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TrackDefault, []),
+    new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
+  }),
+  fields: () => ({
+    [dartx.byteStreamTrackID]: core.String,
+    [dartx.kinds]: ListOfString(),
+    [dartx.label]: core.String,
+    [dartx.language]: core.String,
+    [dartx.type]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
+dart.defineExtensionNames([
+  'item',
+  'length'
+]);
+html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(trackDefaults) {
+    if (trackDefaults === void 0) trackDefaults = null;
+    if (trackDefaults != null) {
+      return html$.TrackDefaultList._create_1(trackDefaults);
+    }
+    return html$.TrackDefaultList._create_2();
+  }
+  static _create_1(trackDefaults) {
+    return new self.TrackDefaultList(trackDefaults);
+  }
+  static _create_2() {
+    return new self.TrackDefaultList();
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$.TrackDefaultList, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TrackDefaultList, []),
+    new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
+  }),
+  fields: () => ({[dartx.length]: core.int}),
+  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
+dart.defineExtensionNames([
+  'defaultValue',
+  'kind',
+  'label',
+  'readyState',
+  'src',
+  'srclang',
+  'track'
+]);
+html$.TrackElement = class TrackElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
+  }
+  created() {
+    this[dartx.defaultValue] = null;
+    this[dartx.kind] = null;
+    this[dartx.label] = null;
+    this[dartx.readyState] = null;
+    this[dartx.src] = null;
+    this[dartx.srclang] = null;
+    this[dartx.track] = null;
+    super.created();
+  }
+  static get supported() {
+    return html$.Element.isTagSupported('track');
+  }
+  get [dartx.defaultValue]() {
+    return this.default;
+  }
+  set [dartx.defaultValue](value) {
+    this.default = value;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  set [dartx.kind](value) {
+    this.kind = value;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  set [dartx.label](value) {
+    this.label = value;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.src]() {
+    return this.src;
+  }
+  set [dartx.src](value) {
+    this.src = value;
+  }
+  get [dartx.srclang]() {
+    return this.srclang;
+  }
+  set [dartx.srclang](value) {
+    this.srclang = value;
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+};
+dart.defineNamedConstructor(html$.TrackElement, 'created');
+dart.setSignature(html$.TrackElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TrackElement, []),
+    new: dart.definiteFunctionType(html$.TrackElement, []),
+    created: dart.definiteFunctionType(html$.TrackElement, [])
+  }),
+  fields: () => ({
+    [dartx.defaultValue]: core.bool,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String,
+    [dartx.readyState]: core.int,
+    [dartx.src]: core.String,
+    [dartx.srclang]: core.String,
+    [dartx.track]: html$.TextTrack
+  }),
+  sfields: () => ({
+    ERROR: core.int,
+    LOADED: core.int,
+    LOADING: core.int,
+    NONE: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+html$.TrackElement.ERROR = 3;
+html$.TrackElement.LOADED = 2;
+html$.TrackElement.LOADING = 1;
+html$.TrackElement.NONE = 0;
+dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
+dart.defineExtensionNames([
+  'track'
+]);
+html$.TrackEvent = class TrackEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.TrackEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.TrackEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.TrackEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.TrackEvent(type);
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+};
+dart.setSignature(html$.TrackEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TrackEvent, []),
+    new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({[dartx.track]: core.Object}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
+dart.defineExtensionNames([
+  'elapsedTime',
+  'propertyName',
+  'pseudoElement'
+]);
+html$.TransitionEvent = class TransitionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.TransitionEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.TransitionEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.TransitionEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.TransitionEvent(type);
+  }
+  get [dartx.elapsedTime]() {
+    return this.elapsedTime;
+  }
+  get [dartx.propertyName]() {
+    return this.propertyName;
+  }
+  get [dartx.pseudoElement]() {
+    return this.pseudoElement;
+  }
+};
+dart.setSignature(html$.TransitionEvent, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.TransitionEvent, []),
+    new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.elapsedTime]: core.double,
+    [dartx.propertyName]: core.String,
+    [dartx.pseudoElement]: core.String
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
+dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
+dart.defineExtensionNames([
+  'firstChild',
+  'lastChild',
+  'nextNode',
+  'nextSibling',
+  'parentNode',
+  'previousNode',
+  'previousSibling',
+  'currentNode',
+  'filter',
+  'root',
+  'whatToShow'
+]);
+html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
+  static new(root, whatToShow) {
+    return html$.document[_createTreeWalker](root, whatToShow, null);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.currentNode]() {
+    return this.currentNode;
+  }
+  set [dartx.currentNode](value) {
+    this.currentNode = value;
+  }
+  get [dartx.filter]() {
+    return this.filter;
+  }
+  get [dartx.root]() {
+    return this.root;
+  }
+  get [dartx.whatToShow]() {
+    return this.whatToShow;
+  }
+  [dartx.firstChild](...args) {
+    return this.firstChild.apply(this, args);
+  }
+  [dartx.lastChild](...args) {
+    return this.lastChild.apply(this, args);
+  }
+  [dartx.nextNode](...args) {
+    return this.nextNode.apply(this, args);
+  }
+  [dartx.nextSibling](...args) {
+    return this.nextSibling.apply(this, args);
+  }
+  [dartx.parentNode](...args) {
+    return this.parentNode.apply(this, args);
+  }
+  [dartx.previousNode](...args) {
+    return this.previousNode.apply(this, args);
+  }
+  [dartx.previousSibling](...args) {
+    return this.previousSibling.apply(this, args);
+  }
+};
+dart.setSignature(html$.TreeWalker, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
+    _: dart.definiteFunctionType(html$.TreeWalker, [])
+  }),
+  fields: () => ({
+    [dartx.currentNode]: html$.Node,
+    [dartx.filter]: html$.NodeFilter,
+    [dartx.root]: html$.Node,
+    [dartx.whatToShow]: core.int
+  }),
+  methods: () => ({
+    [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
+  })
+});
+dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
+html$.UListElement = class UListElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.UListElement, 'created');
+dart.setSignature(html$.UListElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.UListElement, []),
+    new: dart.definiteFunctionType(html$.UListElement, []),
+    created: dart.definiteFunctionType(html$.UListElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
+html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$.UnknownElement, 'created');
+dart.setSignature(html$.UnknownElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.UnknownElement, []),
+    created: dart.definiteFunctionType(html$.UnknownElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
+dart.defineExtensionNames([
+  'toString',
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'password',
+  'pathname',
+  'port',
+  'protocol',
+  'search',
+  'username'
+]);
+html$.Url = class Url extends _interceptors.Interceptor {
+  static createObjectUrl(blob_OR_source_OR_stream) {
+    return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
+  }
+  static createObjectUrlFromSource(source) {
+    return (self.URL || self.webkitURL).createObjectURL(source);
+  }
+  static createObjectUrlFromStream(stream) {
+    return (self.URL || self.webkitURL).createObjectURL(stream);
+  }
+  static createObjectUrlFromBlob(blob) {
+    return (self.URL || self.webkitURL).createObjectURL(blob);
+  }
+  static revokeObjectUrl(url) {
+    return (self.URL || self.webkitURL).revokeObjectURL(url);
+  }
+  [dartx.toString]() {
+    return String(this);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.hash]() {
+    return this.hash;
+  }
+  set [dartx.hash](value) {
+    this.hash = value;
+  }
+  get [dartx.host]() {
+    return this.host;
+  }
+  set [dartx.host](value) {
+    this.host = value;
+  }
+  get [dartx.hostname]() {
+    return this.hostname;
+  }
+  set [dartx.hostname](value) {
+    this.hostname = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+  set [dartx.href](value) {
+    this.href = value;
+  }
+  get [dartx.origin]() {
+    return this.origin;
+  }
+  get [dartx.password]() {
+    return this.password;
+  }
+  set [dartx.password](value) {
+    this.password = value;
+  }
+  get [dartx.pathname]() {
+    return this.pathname;
+  }
+  set [dartx.pathname](value) {
+    this.pathname = value;
+  }
+  get [dartx.port]() {
+    return this.port;
+  }
+  set [dartx.port](value) {
+    this.port = value;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  set [dartx.protocol](value) {
+    this.protocol = value;
+  }
+  get [dartx.search]() {
+    return this.search;
+  }
+  set [dartx.search](value) {
+    this.search = value;
+  }
+  get [dartx.username]() {
+    return this.username;
+  }
+  set [dartx.username](value) {
+    this.username = value;
+  }
+};
+html$.Url[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.Url, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
+  fields: () => ({
+    [dartx.hash]: core.String,
+    [dartx.host]: core.String,
+    [dartx.hostname]: core.String,
+    [dartx.href]: core.String,
+    [dartx.origin]: core.String,
+    [dartx.password]: core.String,
+    [dartx.pathname]: core.String,
+    [dartx.port]: core.String,
+    [dartx.protocol]: core.String,
+    [dartx.search]: core.String,
+    [dartx.username]: core.String
+  }),
+  statics: () => ({
+    createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
+    createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
+    createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
+    revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
+  }),
+  names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
+});
+dart.registerExtension(dart.global.URL, html$.Url);
+dart.defineExtensionNames([
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'password',
+  'pathname',
+  'port',
+  'protocol',
+  'search',
+  'username'
+]);
+html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get hash() {
+    return this[hash];
+  }
+  set hash(value) {
+    this[hash] = value;
+  }
+  get host() {
+    return this[host];
+  }
+  set host(value) {
+    this[host] = value;
+  }
+  get hostname() {
+    return this[hostname];
+  }
+  set hostname(value) {
+    this[hostname] = value;
+  }
+  get href() {
+    return this[href];
+  }
+  set href(value) {
+    this[href] = value;
+  }
+  get origin() {
+    return this[origin];
+  }
+  set origin(value) {
+    super.origin = value;
+  }
+  get password() {
+    return this[password];
+  }
+  set password(value) {
+    this[password] = value;
+  }
+  get pathname() {
+    return this[pathname];
+  }
+  set pathname(value) {
+    this[pathname] = value;
+  }
+  get port() {
+    return this[port];
+  }
+  set port(value) {
+    this[port] = value;
+  }
+  get protocol() {
+    return this[protocol];
+  }
+  set protocol(value) {
+    this[protocol] = value;
+  }
+  get search() {
+    return this[search];
+  }
+  set search(value) {
+    this[search] = value;
+  }
+  get username() {
+    return this[username];
+  }
+  set username(value) {
+    this[username] = value;
+  }
+};
+const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
+const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
+const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
+const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
+const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
+const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
+const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
+const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
+const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
+const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
+const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
+dart.setSignature(html$.UrlUtils, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
+  fields: () => ({
+    hash: core.String,
+    host: core.String,
+    hostname: core.String,
+    href: core.String,
+    origin: core.String,
+    password: core.String,
+    pathname: core.String,
+    port: core.String,
+    protocol: core.String,
+    search: core.String,
+    username: core.String
+  })
+});
+dart.defineExtensionMembers(html$.UrlUtils, [
+  'hash',
+  'hash',
+  'host',
+  'host',
+  'hostname',
+  'hostname',
+  'href',
+  'href',
+  'origin',
+  'password',
+  'password',
+  'pathname',
+  'pathname',
+  'port',
+  'port',
+  'protocol',
+  'protocol',
+  'search',
+  'search',
+  'username',
+  'username'
+]);
+dart.defineExtensionNames([
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'pathname',
+  'port',
+  'protocol',
+  'search'
+]);
+html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get hash() {
+    return this[hash$];
+  }
+  set hash(value) {
+    super.hash = value;
+  }
+  get host() {
+    return this[host$];
+  }
+  set host(value) {
+    super.host = value;
+  }
+  get hostname() {
+    return this[hostname$];
+  }
+  set hostname(value) {
+    super.hostname = value;
+  }
+  get href() {
+    return this[href$];
+  }
+  set href(value) {
+    super.href = value;
+  }
+  get origin() {
+    return this[origin$];
+  }
+  set origin(value) {
+    super.origin = value;
+  }
+  get pathname() {
+    return this[pathname$];
+  }
+  set pathname(value) {
+    super.pathname = value;
+  }
+  get port() {
+    return this[port$];
+  }
+  set port(value) {
+    super.port = value;
+  }
+  get protocol() {
+    return this[protocol$];
+  }
+  set protocol(value) {
+    super.protocol = value;
+  }
+  get search() {
+    return this[search$];
+  }
+  set search(value) {
+    super.search = value;
+  }
+};
+const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
+const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
+const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
+const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
+const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
+const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
+const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
+const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
+const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
+dart.setSignature(html$.UrlUtilsReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
+  fields: () => ({
+    hash: core.String,
+    host: core.String,
+    hostname: core.String,
+    href: core.String,
+    origin: core.String,
+    pathname: core.String,
+    port: core.String,
+    protocol: core.String,
+    search: core.String
+  })
+});
+dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
+  'hash',
+  'host',
+  'hostname',
+  'href',
+  'origin',
+  'pathname',
+  'port',
+  'protocol',
+  'search'
+]);
+dart.defineExtensionNames([
+  'currentFieldOfView',
+  'eyeTranslation',
+  'maximumFieldOfView',
+  'minimumFieldOfView',
+  'recommendedFieldOfView',
+  'renderRect'
+]);
+html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.currentFieldOfView]() {
+    return this.currentFieldOfView;
+  }
+  get [dartx.eyeTranslation]() {
+    return this.eyeTranslation;
+  }
+  get [dartx.maximumFieldOfView]() {
+    return this.maximumFieldOfView;
+  }
+  get [dartx.minimumFieldOfView]() {
+    return this.minimumFieldOfView;
+  }
+  get [dartx.recommendedFieldOfView]() {
+    return this.recommendedFieldOfView;
+  }
+  get [dartx.renderRect]() {
+    return this.renderRect;
+  }
+};
+dart.setSignature(html$.VREyeParameters, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
+  fields: () => ({
+    [dartx.currentFieldOfView]: html$.VRFieldOfView,
+    [dartx.eyeTranslation]: html$.DomPoint,
+    [dartx.maximumFieldOfView]: html$.VRFieldOfView,
+    [dartx.minimumFieldOfView]: html$.VRFieldOfView,
+    [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
+    [dartx.renderRect]: html$._DomRect
+  })
+});
+dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
+dart.defineExtensionNames([
+  'downDegrees',
+  'leftDegrees',
+  'rightDegrees',
+  'upDegrees'
+]);
+html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(fov) {
+    if (fov === void 0) fov = null;
+    if (fov != null) {
+      let fov_1 = html_common.convertDartToNative_Dictionary(fov);
+      return html$.VRFieldOfView._create_1(fov_1);
+    }
+    return html$.VRFieldOfView._create_2();
+  }
+  static _create_1(fov) {
+    return new self.VRFieldOfView(fov);
+  }
+  static _create_2() {
+    return new self.VRFieldOfView();
+  }
+  get [dartx.downDegrees]() {
+    return this.downDegrees;
+  }
+  set [dartx.downDegrees](value) {
+    this.downDegrees = value;
+  }
+  get [dartx.leftDegrees]() {
+    return this.leftDegrees;
+  }
+  set [dartx.leftDegrees](value) {
+    this.leftDegrees = value;
+  }
+  get [dartx.rightDegrees]() {
+    return this.rightDegrees;
+  }
+  set [dartx.rightDegrees](value) {
+    this.rightDegrees = value;
+  }
+  get [dartx.upDegrees]() {
+    return this.upDegrees;
+  }
+  set [dartx.upDegrees](value) {
+    this.upDegrees = value;
+  }
+};
+dart.setSignature(html$.VRFieldOfView, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.VRFieldOfView, []),
+    new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.downDegrees]: core.num,
+    [dartx.leftDegrees]: core.num,
+    [dartx.rightDegrees]: core.num,
+    [dartx.upDegrees]: core.num
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
+dart.defineExtensionNames([
+  'angularAcceleration',
+  'angularVelocity',
+  'linearAcceleration',
+  'linearVelocity',
+  'orientation',
+  'position',
+  'timeStamp'
+]);
+html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.angularAcceleration]() {
+    return this.angularAcceleration;
+  }
+  get [dartx.angularVelocity]() {
+    return this.angularVelocity;
+  }
+  get [dartx.linearAcceleration]() {
+    return this.linearAcceleration;
+  }
+  get [dartx.linearVelocity]() {
+    return this.linearVelocity;
+  }
+  get [dartx.orientation]() {
+    return this.orientation;
+  }
+  get [dartx.position]() {
+    return this.position;
+  }
+  get [dartx.timeStamp]() {
+    return this.timeStamp;
+  }
+};
+dart.setSignature(html$.VRPositionState, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
+  fields: () => ({
+    [dartx.angularAcceleration]: html$.DomPoint,
+    [dartx.angularVelocity]: html$.DomPoint,
+    [dartx.linearAcceleration]: html$.DomPoint,
+    [dartx.linearVelocity]: html$.DomPoint,
+    [dartx.orientation]: html$.DomPoint,
+    [dartx.position]: html$.DomPoint,
+    [dartx.timeStamp]: core.double
+  })
+});
+dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
+dart.defineExtensionNames([
+  'badInput',
+  'customError',
+  'patternMismatch',
+  'rangeOverflow',
+  'rangeUnderflow',
+  'stepMismatch',
+  'tooLong',
+  'tooShort',
+  'typeMismatch',
+  'valid',
+  'valueMissing'
+]);
+html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.badInput]() {
+    return this.badInput;
+  }
+  get [dartx.customError]() {
+    return this.customError;
+  }
+  get [dartx.patternMismatch]() {
+    return this.patternMismatch;
+  }
+  get [dartx.rangeOverflow]() {
+    return this.rangeOverflow;
+  }
+  get [dartx.rangeUnderflow]() {
+    return this.rangeUnderflow;
+  }
+  get [dartx.stepMismatch]() {
+    return this.stepMismatch;
+  }
+  get [dartx.tooLong]() {
+    return this.tooLong;
+  }
+  get [dartx.tooShort]() {
+    return this.tooShort;
+  }
+  get [dartx.typeMismatch]() {
+    return this.typeMismatch;
+  }
+  get [dartx.valid]() {
+    return this.valid;
+  }
+  get [dartx.valueMissing]() {
+    return this.valueMissing;
+  }
+};
+dart.setSignature(html$.ValidityState, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
+  fields: () => ({
+    [dartx.badInput]: core.bool,
+    [dartx.customError]: core.bool,
+    [dartx.patternMismatch]: core.bool,
+    [dartx.rangeOverflow]: core.bool,
+    [dartx.rangeUnderflow]: core.bool,
+    [dartx.stepMismatch]: core.bool,
+    [dartx.tooLong]: core.bool,
+    [dartx.tooShort]: core.bool,
+    [dartx.typeMismatch]: core.bool,
+    [dartx.valid]: core.bool,
+    [dartx.valueMissing]: core.bool
+  })
+});
+dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
+dart.defineExtensionNames([
+  'getVideoPlaybackQuality',
+  'enterFullscreen',
+  'exitFullscreen',
+  'height',
+  'poster',
+  'videoHeight',
+  'videoWidth',
+  'decodedFrameCount',
+  'droppedFrameCount',
+  'width'
+]);
+html$.VideoElement = class VideoElement extends html$.MediaElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.poster] = null;
+    this[dartx.videoHeight] = null;
+    this[dartx.videoWidth] = null;
+    this[dartx.decodedFrameCount] = null;
+    this[dartx.droppedFrameCount] = null;
+    this[dartx.width] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.poster]() {
+    return this.poster;
+  }
+  set [dartx.poster](value) {
+    this.poster = value;
+  }
+  get [dartx.videoHeight]() {
+    return this.videoHeight;
+  }
+  get [dartx.videoWidth]() {
+    return this.videoWidth;
+  }
+  get [dartx.decodedFrameCount]() {
+    return this.webkitDecodedFrameCount;
+  }
+  get [dartx.droppedFrameCount]() {
+    return this.webkitDroppedFrameCount;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  [dartx.getVideoPlaybackQuality](...args) {
+    return this.getVideoPlaybackQuality.apply(this, args);
+  }
+  [dartx.enterFullscreen](...args) {
+    return this.webkitEnterFullscreen.apply(this, args);
+  }
+  [dartx.exitFullscreen](...args) {
+    return this.webkitExitFullscreen.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(html$.VideoElement, 'created');
+html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.VideoElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.VideoElement, []),
+    new: dart.definiteFunctionType(html$.VideoElement, []),
+    created: dart.definiteFunctionType(html$.VideoElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: core.int,
+    [dartx.poster]: core.String,
+    [dartx.videoHeight]: core.int,
+    [dartx.videoWidth]: core.int,
+    [dartx.decodedFrameCount]: core.int,
+    [dartx.droppedFrameCount]: core.int,
+    [dartx.width]: core.int
+  }),
+  methods: () => ({
+    [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
+    [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
+    [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
+dart.defineExtensionNames([
+  'corruptedVideoFrames',
+  'creationTime',
+  'droppedVideoFrames',
+  'totalVideoFrames'
+]);
+html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.corruptedVideoFrames]() {
+    return this.corruptedVideoFrames;
+  }
+  get [dartx.creationTime]() {
+    return this.creationTime;
+  }
+  get [dartx.droppedVideoFrames]() {
+    return this.droppedVideoFrames;
+  }
+  get [dartx.totalVideoFrames]() {
+    return this.totalVideoFrames;
+  }
+};
+dart.setSignature(html$.VideoPlaybackQuality, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
+  fields: () => ({
+    [dartx.corruptedVideoFrames]: core.int,
+    [dartx.creationTime]: core.double,
+    [dartx.droppedVideoFrames]: core.int,
+    [dartx.totalVideoFrames]: core.int
+  })
+});
+dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
+dart.defineExtensionNames([
+  'id',
+  'kind',
+  'label',
+  'language',
+  'selected'
+]);
+html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  get [dartx.kind]() {
+    return this.kind;
+  }
+  get [dartx.label]() {
+    return this.label;
+  }
+  get [dartx.language]() {
+    return this.language;
+  }
+  get [dartx.selected]() {
+    return this.selected;
+  }
+  set [dartx.selected](value) {
+    this.selected = value;
+  }
+};
+dart.setSignature(html$.VideoTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
+  fields: () => ({
+    [dartx.id]: core.String,
+    [dartx.kind]: core.String,
+    [dartx.label]: core.String,
+    [dartx.language]: core.String,
+    [dartx.selected]: core.bool
+  })
+});
+dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
+dart.defineExtensionNames([
+  'getTrackById',
+  'onChange',
+  'length',
+  'selectedIndex'
+]);
+html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.selectedIndex]() {
+    return this.selectedIndex;
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.getTrackById](...args) {
+    return this.getTrackById.apply(this, args);
+  }
+  get [dartx.onChange]() {
+    return html$.VideoTrackList.changeEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.VideoTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
+  fields: () => ({
+    [dartx.length]: core.int,
+    [dartx.selectedIndex]: core.int
+  }),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
+  }),
+  sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
+});
+dart.defineLazy(html$.VideoTrackList, {
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  }
+});
+dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
+html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
+dart.defineExtensionNames([
+  'getCueAsHtml',
+  'align',
+  'line',
+  'position',
+  'regionId',
+  'size',
+  'snapToLines',
+  'text',
+  'vertical'
+]);
+html$.VttCue = class VttCue extends html$.TextTrackCue {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(startTime, endTime, text) {
+    return html$.VttCue._create_1(startTime, endTime, text);
+  }
+  static _create_1(startTime, endTime, text) {
+    return new VTTCue(startTime, endTime, text);
+  }
+  get [dartx.align]() {
+    return this.align;
+  }
+  set [dartx.align](value) {
+    this.align = value;
+  }
+  get [dartx.line]() {
+    return this.line;
+  }
+  set [dartx.line](value) {
+    this.line = value;
+  }
+  get [dartx.position]() {
+    return this.position;
+  }
+  set [dartx.position](value) {
+    this.position = value;
+  }
+  get [dartx.regionId]() {
+    return this.regionId;
+  }
+  set [dartx.regionId](value) {
+    this.regionId = value;
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  set [dartx.size](value) {
+    this.size = value;
+  }
+  get [dartx.snapToLines]() {
+    return this.snapToLines;
+  }
+  set [dartx.snapToLines](value) {
+    this.snapToLines = value;
+  }
+  get [dartx.text]() {
+    return this.text;
+  }
+  set [dartx.text](value) {
+    this.text = value;
+  }
+  get [dartx.vertical]() {
+    return this.vertical;
+  }
+  set [dartx.vertical](value) {
+    this.vertical = value;
+  }
+  [dartx.getCueAsHtml](...args) {
+    return this.getCueAsHTML.apply(this, args);
+  }
+};
+dart.setSignature(html$.VttCue, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.VttCue, []),
+    new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
+  }),
+  fields: () => ({
+    [dartx.align]: core.String,
+    [dartx.line]: core.Object,
+    [dartx.position]: core.Object,
+    [dartx.regionId]: core.String,
+    [dartx.size]: core.num,
+    [dartx.snapToLines]: core.bool,
+    [dartx.text]: core.String,
+    [dartx.vertical]: core.String
+  }),
+  methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.VTTCue, html$.VttCue);
+dart.defineExtensionNames([
+  'height',
+  'id',
+  'regionAnchorX',
+  'regionAnchorY',
+  'scroll',
+  'track',
+  'viewportAnchorX',
+  'viewportAnchorY',
+  'width'
+]);
+html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.VttRegion._create_1();
+  }
+  static _create_1() {
+    return new VTTRegion();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.id]() {
+    return this.id;
+  }
+  set [dartx.id](value) {
+    this.id = value;
+  }
+  get [dartx.regionAnchorX]() {
+    return this.regionAnchorX;
+  }
+  set [dartx.regionAnchorX](value) {
+    this.regionAnchorX = value;
+  }
+  get [dartx.regionAnchorY]() {
+    return this.regionAnchorY;
+  }
+  set [dartx.regionAnchorY](value) {
+    this.regionAnchorY = value;
+  }
+  get [dartx.scroll]() {
+    return this.scroll;
+  }
+  set [dartx.scroll](value) {
+    this.scroll = value;
+  }
+  get [dartx.track]() {
+    return this.track;
+  }
+  get [dartx.viewportAnchorX]() {
+    return this.viewportAnchorX;
+  }
+  set [dartx.viewportAnchorX](value) {
+    this.viewportAnchorX = value;
+  }
+  get [dartx.viewportAnchorY]() {
+    return this.viewportAnchorY;
+  }
+  set [dartx.viewportAnchorY](value) {
+    this.viewportAnchorY = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+};
+dart.setSignature(html$.VttRegion, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.VttRegion, []),
+    new: dart.definiteFunctionType(html$.VttRegion, [])
+  }),
+  fields: () => ({
+    [dartx.height]: core.int,
+    [dartx.id]: core.String,
+    [dartx.regionAnchorX]: core.num,
+    [dartx.regionAnchorY]: core.num,
+    [dartx.scroll]: core.String,
+    [dartx.track]: html$.TextTrack,
+    [dartx.viewportAnchorX]: core.num,
+    [dartx.viewportAnchorY]: core.num,
+    [dartx.width]: core.num
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
+dart.defineExtensionNames([
+  'getRegionById',
+  'item',
+  'length'
+]);
+html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx.getRegionById](...args) {
+    return this.getRegionById.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$.VttRegionList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
+  fields: () => ({[dartx.length]: core.int}),
+  methods: () => ({
+    [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
+  })
+});
+dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
+dart.defineExtensionNames([
+  'close',
+  'send',
+  'sendBlob',
+  'sendByteBuffer',
+  'sendString',
+  'sendTypedData',
+  'onClose',
+  'onError',
+  'onMessage',
+  'onOpen',
+  'binaryType',
+  'bufferedAmount',
+  'extensions',
+  'protocol',
+  'readyState',
+  'url'
+]);
+html$.WebSocket = class WebSocket extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(url, protocols) {
+    if (protocols === void 0) protocols = null;
+    if (protocols != null) {
+      return html$.WebSocket._create_1(url, protocols);
+    }
+    return html$.WebSocket._create_2(url);
+  }
+  static _create_1(url, protocols) {
+    return new self.WebSocket(url, protocols);
+  }
+  static _create_2(url) {
+    return new self.WebSocket(url);
+  }
+  static get supported() {
+    return typeof window.WebSocket != "undefined";
+  }
+  get [dartx.binaryType]() {
+    return this.binaryType;
+  }
+  set [dartx.binaryType](value) {
+    this.binaryType = value;
+  }
+  get [dartx.bufferedAmount]() {
+    return this.bufferedAmount;
+  }
+  get [dartx.extensions]() {
+    return this.extensions;
+  }
+  get [dartx.protocol]() {
+    return this.protocol;
+  }
+  get [dartx.readyState]() {
+    return this.readyState;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.send](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendBlob](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendByteBuffer](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendString](...args) {
+    return this.send.apply(this, args);
+  }
+  [dartx.sendTypedData](...args) {
+    return this.send.apply(this, args);
+  }
+  get [dartx.onClose]() {
+    return html$.WebSocket.closeEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.WebSocket.errorEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.WebSocket.messageEvent.forTarget(this);
+  }
+  get [dartx.onOpen]() {
+    return html$.WebSocket.openEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.WebSocket, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.WebSocket, []),
+    new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
+  }),
+  fields: () => ({
+    [dartx.binaryType]: core.String,
+    [dartx.bufferedAmount]: core.int,
+    [dartx.extensions]: core.String,
+    [dartx.protocol]: core.String,
+    [dartx.readyState]: core.int,
+    [dartx.url]: core.String
+  }),
+  getters: () => ({
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  methods: () => ({
+    [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
+    [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
+    [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
+  }),
+  sfields: () => ({
+    closeEvent: EventStreamProviderOfCloseEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    openEvent: EventStreamProviderOfEvent(),
+    CLOSED: core.int,
+    CLOSING: core.int,
+    CONNECTING: core.int,
+    OPEN: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+html$.WebSocket.CLOSED = 3;
+html$.WebSocket.CLOSING = 2;
+html$.WebSocket.CONNECTING = 0;
+html$.WebSocket.OPEN = 1;
+dart.defineLazy(html$.WebSocket, {
+  get closeEvent() {
+    return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get openEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('open'));
+  }
+});
+dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
+const _deltaX = Symbol('_deltaX');
+const _deltaY = Symbol('_deltaY');
+const _wheelDelta = Symbol('_wheelDelta');
+const _wheelDeltaX = Symbol('_wheelDeltaX');
+const _hasInitMouseScrollEvent = Symbol('_hasInitMouseScrollEvent');
+const _initMouseScrollEvent = Symbol('_initMouseScrollEvent');
+const _hasInitWheelEvent = Symbol('_hasInitWheelEvent');
+const _initWheelEvent = Symbol('_initWheelEvent');
+dart.defineExtensionNames([
+  'deltaY',
+  'deltaX',
+  'deltaMode',
+  'deltaZ'
+]);
+html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
+  static new(type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
+    let deltaY = opts && 'deltaY' in opts ? opts.deltaY : 0;
+    let deltaZ = opts && 'deltaZ' in opts ? opts.deltaZ : 0;
+    let deltaMode = opts && 'deltaMode' in opts ? opts.deltaMode : 0;
+    let detail = opts && 'detail' in opts ? opts.detail : 0;
+    let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
+    let screenY = opts && 'screenY' in opts ? opts.screenY : 0;
+    let clientX = opts && 'clientX' in opts ? opts.clientX : 0;
+    let clientY = opts && 'clientY' in opts ? opts.clientY : 0;
+    let button = opts && 'button' in opts ? opts.button : 0;
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
+    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
+    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
+    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
+    let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
+    let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
+    if (view == null) {
+      view = html$.window;
+    }
+    return new self.WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
+  }
+  static _(type, eventInitDict) {
+    if (eventInitDict === void 0) eventInitDict = null;
+    if (eventInitDict != null) {
+      let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
+      return html$.WheelEvent._create_1(type, eventInitDict_1);
+    }
+    return html$.WheelEvent._create_2(type);
+  }
+  static _create_1(type, eventInitDict) {
+    return new self.WheelEvent(type, eventInitDict);
+  }
+  static _create_2(type) {
+    return new self.WheelEvent(type);
+  }
+  get [_deltaX]() {
+    return this.deltaX;
+  }
+  get [_deltaY]() {
+    return this.deltaY;
+  }
+  get [dartx.deltaZ]() {
+    return this.deltaZ;
+  }
+  get [dartx.deltaY]() {
+    if (this.deltaY !== undefined) {
+      return this[_deltaY];
+    }
+    dart.throw(new core.UnsupportedError('deltaY is not supported'));
+  }
+  get [dartx.deltaX]() {
+    if (this.deltaX !== undefined) {
+      return this[_deltaX];
+    }
+    dart.throw(new core.UnsupportedError('deltaX is not supported'));
+  }
+  get [dartx.deltaMode]() {
+    if (!!this.deltaMode) {
+      return this.deltaMode;
+    }
+    return 0;
+  }
+  get [_wheelDelta]() {
+    return this.wheelDelta;
+  }
+  get [_wheelDeltaX]() {
+    return this.wheelDeltaX;
+  }
+  get [_detail]() {
+    return this.detail;
+  }
+  get [_hasInitMouseScrollEvent]() {
+    return !!this.initMouseScrollEvent;
+  }
+  [_initMouseScrollEvent](...args) {
+    return this.initMouseScrollEvent.apply(this, args);
+  }
+  get [_hasInitWheelEvent]() {
+    return !!this.initWheelEvent;
+  }
+  [_initWheelEvent](...args) {
+    return this.initWheelEvent.apply(this, args);
+  }
+};
+dart.setSignature(html$.WheelEvent, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
+    _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
+  }),
+  fields: () => ({
+    [_deltaX]: core.double,
+    [_deltaY]: core.double,
+    [dartx.deltaZ]: core.double
+  }),
+  getters: () => ({
+    [dartx.deltaY]: dart.definiteFunctionType(core.num, []),
+    [dartx.deltaX]: dart.definiteFunctionType(core.num, []),
+    [dartx.deltaMode]: dart.definiteFunctionType(core.int, []),
+    [_wheelDelta]: dart.definiteFunctionType(core.num, []),
+    [_wheelDeltaX]: dart.definiteFunctionType(core.num, []),
+    [_detail]: dart.definiteFunctionType(core.num, []),
+    [_hasInitMouseScrollEvent]: dart.definiteFunctionType(core.bool, []),
+    [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
+    [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
+  }),
+  sfields: () => ({
+    DOM_DELTA_LINE: core.int,
+    DOM_DELTA_PAGE: core.int,
+    DOM_DELTA_PIXEL: core.int
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+html$.WheelEvent.DOM_DELTA_LINE = 1;
+html$.WheelEvent.DOM_DELTA_PAGE = 2;
+html$.WheelEvent.DOM_DELTA_PIXEL = 0;
+dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
+const _open2 = Symbol('_open2');
+const _open3 = Symbol('_open3');
+const _location = Symbol('_location');
+const _ensureRequestAnimationFrame = Symbol('_ensureRequestAnimationFrame');
+const _requestAnimationFrame = Symbol('_requestAnimationFrame');
+const _cancelAnimationFrame = Symbol('_cancelAnimationFrame');
+const _requestFileSystem = Symbol('_requestFileSystem');
+const _get_opener = Symbol('_get_opener');
+const _pageXOffset = Symbol('_pageXOffset');
+const _pageYOffset = Symbol('_pageYOffset');
+const _get_parent = Symbol('_get_parent');
+const _get_self = Symbol('_get_self');
+const _get_top = Symbol('_get_top');
+const __getter___1 = Symbol('__getter___1');
+const __getter___2 = Symbol('__getter___2');
+const _scroll_4 = Symbol('_scroll_4');
+const _scroll_5 = Symbol('_scroll_5');
+const _scrollBy_4 = Symbol('_scrollBy_4');
+const _scrollBy_5 = Symbol('_scrollBy_5');
+const _scrollTo_4 = Symbol('_scrollTo_4');
+const _scrollTo_5 = Symbol('_scrollTo_5');
+const __requestFileSystem = Symbol('__requestFileSystem');
+const _resolveLocalFileSystemUrl = Symbol('_resolveLocalFileSystemUrl');
+dart.defineExtensionNames([
+  'animationFrame',
+  'document',
+  'open',
+  'location',
+  'location',
+  'requestAnimationFrame',
+  'cancelAnimationFrame',
+  'indexedDB',
+  'console',
+  'requestFileSystem',
+  'opener',
+  'opener',
+  'parent',
+  'self',
+  'top',
+  'window',
+  'alert',
+  'close',
+  'confirm',
+  'fetch',
+  'find',
+  'getMatchedCssRules',
+  'getSelection',
+  'matchMedia',
+  'moveBy',
+  'openDatabase',
+  'postMessage',
+  'print',
+  'resizeBy',
+  'resizeTo',
+  'scroll',
+  'scrollBy',
+  'scrollTo',
+  'stop',
+  'resolveLocalFileSystemUrl',
+  'atob',
+  'btoa',
+  'onContentLoaded',
+  'onAbort',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onDoubleClick',
+  'onDeviceMotion',
+  'onDeviceOrientation',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onHashChange',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onLoadStart',
+  'onMessage',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onOffline',
+  'onOnline',
+  'onPageHide',
+  'onPageShow',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onPopState',
+  'onProgress',
+  'onRateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSearch',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onStalled',
+  'onStorage',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onTouchCancel',
+  'onTouchEnd',
+  'onTouchMove',
+  'onTouchStart',
+  'onTransitionEnd',
+  'onUnload',
+  'onVolumeChange',
+  'onWaiting',
+  'onAnimationEnd',
+  'onAnimationIteration',
+  'onAnimationStart',
+  'onBeforeUnload',
+  'moveTo',
+  'pageXOffset',
+  'pageYOffset',
+  'scrollX',
+  'scrollY',
+  'applicationCache',
+  'caches',
+  'closed',
+  'crypto',
+  'defaultStatus',
+  'defaultstatus',
+  'devicePixelRatio',
+  'history',
+  'innerHeight',
+  'innerWidth',
+  'localStorage',
+  'locationbar',
+  'menubar',
+  'name',
+  'navigator',
+  'offscreenBuffering',
+  'orientation',
+  'outerHeight',
+  'outerWidth',
+  'performance',
+  'screen',
+  'screenLeft',
+  'screenTop',
+  'screenX',
+  'screenY',
+  'scrollbars',
+  'sessionStorage',
+  'speechSynthesis',
+  'status',
+  'statusbar',
+  'styleMedia',
+  'toolbar'
+]);
+html$.Window = class Window extends html$.EventTarget {
+  get [dartx.animationFrame]() {
+    let completer = CompleterOfnum().sync();
+    this[dartx.requestAnimationFrame](dart.fn(time => {
+      completer.complete(time);
+    }, numToNull()));
+    return completer.future;
+  }
+  get [dartx.document]() {
+    return this.document;
+  }
+  [_open2](url, name) {
+    return this.open(url, name);
+  }
+  [_open3](url, name, options) {
+    return this.open(url, name, options);
+  }
+  [dartx.open](url, name, options) {
+    if (options === void 0) options = null;
+    if (options == null) {
+      return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
+    } else {
+      return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
+    }
+  }
+  get [dartx.location]() {
+    return html$.Location._check(this[_location]);
+  }
+  set [dartx.location](value) {
+    this[_location] = value;
+  }
+  get [_location]() {
+    return this.location;
+  }
+  set [_location](value) {
+    this.location = value;
+  }
+  [dartx.requestAnimationFrame](callback) {
+    this[_ensureRequestAnimationFrame]();
+    return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
+  }
+  [dartx.cancelAnimationFrame](id) {
+    this[_ensureRequestAnimationFrame]();
+    this[_cancelAnimationFrame](id);
+  }
+  [_requestAnimationFrame](...args) {
+    return this.requestAnimationFrame.apply(this, args);
+  }
+  [_cancelAnimationFrame](...args) {
+    return this.cancelAnimationFrame.apply(this, args);
+  }
+  [_ensureRequestAnimationFrame]() {
+    if (!!(this.requestAnimationFrame && this.cancelAnimationFrame)) return;
+    (function($this) {
+      var vendors = ['ms', 'moz', 'webkit', 'o'];
+      for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+        $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+        $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+      }
+      if ($this.requestAnimationFrame && $this.cancelAnimationFrame) return;
+      $this.requestAnimationFrame = function(callback) {
+        return window.setTimeout(function() {
+          callback(Date.now());
+        }, 16);
+      };
+      $this.cancelAnimationFrame = function(id) {
+        clearTimeout(id);
+      };
+    })(this);
+  }
+  get [dartx.indexedDB]() {
+    return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
+  }
+  get [dartx.console]() {
+    return html$.Console._safeConsole;
+  }
+  [dartx.requestFileSystem](size, opts) {
+    let persistent = opts && 'persistent' in opts ? opts.persistent : false;
+    return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
+  }
+  static get supportsPointConversions() {
+    return html$.DomPoint.supported;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.applicationCache]() {
+    return this.applicationCache;
+  }
+  get [dartx.caches]() {
+    return this.caches;
+  }
+  get [dartx.closed]() {
+    return this.closed;
+  }
+  get [dartx.crypto]() {
+    return this.crypto;
+  }
+  get [dartx.defaultStatus]() {
+    return this.defaultStatus;
+  }
+  set [dartx.defaultStatus](value) {
+    this.defaultStatus = value;
+  }
+  get [dartx.defaultstatus]() {
+    return this.defaultstatus;
+  }
+  set [dartx.defaultstatus](value) {
+    this.defaultstatus = value;
+  }
+  get [dartx.devicePixelRatio]() {
+    return this.devicePixelRatio;
+  }
+  get [dartx.history]() {
+    return this.history;
+  }
+  get [dartx.innerHeight]() {
+    return this.innerHeight;
+  }
+  get [dartx.innerWidth]() {
+    return this.innerWidth;
+  }
+  get [dartx.localStorage]() {
+    return this.localStorage;
+  }
+  get [dartx.locationbar]() {
+    return this.locationbar;
+  }
+  get [dartx.menubar]() {
+    return this.menubar;
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  set [dartx.name](value) {
+    this.name = value;
+  }
+  get [dartx.navigator]() {
+    return this.navigator;
+  }
+  get [dartx.offscreenBuffering]() {
+    return this.offscreenBuffering;
+  }
+  get [dartx.opener]() {
+    return html$._convertNativeToDart_Window(this[_get_opener]);
+  }
+  get [_get_opener]() {
+    return this.opener;
+  }
+  set [dartx.opener](value) {
+    this.opener = value;
+  }
+  get [dartx.orientation]() {
+    return this.orientation;
+  }
+  get [dartx.outerHeight]() {
+    return this.outerHeight;
+  }
+  get [dartx.outerWidth]() {
+    return this.outerWidth;
+  }
+  get [_pageXOffset]() {
+    return this.pageXOffset;
+  }
+  get [_pageYOffset]() {
+    return this.pageYOffset;
+  }
+  get [dartx.parent]() {
+    return html$._convertNativeToDart_Window(this[_get_parent]);
+  }
+  get [_get_parent]() {
+    return this.parent;
+  }
+  get [dartx.performance]() {
+    return this.performance;
+  }
+  get [dartx.screen]() {
+    return this.screen;
+  }
+  get [dartx.screenLeft]() {
+    return this.screenLeft;
+  }
+  get [dartx.screenTop]() {
+    return this.screenTop;
+  }
+  get [dartx.screenX]() {
+    return this.screenX;
+  }
+  get [dartx.screenY]() {
+    return this.screenY;
+  }
+  get [dartx.scrollbars]() {
+    return this.scrollbars;
+  }
+  get [dartx.self]() {
+    return html$._convertNativeToDart_Window(this[_get_self]);
+  }
+  get [_get_self]() {
+    return this.self;
+  }
+  get [dartx.sessionStorage]() {
+    return this.sessionStorage;
+  }
+  get [dartx.speechSynthesis]() {
+    return this.speechSynthesis;
+  }
+  get [dartx.status]() {
+    return this.status;
+  }
+  set [dartx.status](value) {
+    this.status = value;
+  }
+  get [dartx.statusbar]() {
+    return this.statusbar;
+  }
+  get [dartx.styleMedia]() {
+    return this.styleMedia;
+  }
+  get [dartx.toolbar]() {
+    return this.toolbar;
+  }
+  get [dartx.top]() {
+    return html$._convertNativeToDart_Window(this[_get_top]);
+  }
+  get [_get_top]() {
+    return this.top;
+  }
+  get [dartx.window]() {
+    return html$._convertNativeToDart_Window(this[_get_window]);
+  }
+  get [_get_window]() {
+    return this.window;
+  }
+  [__getter__](index_OR_name) {
+    if (typeof index_OR_name == 'number') {
+      return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
+    }
+    if (typeof index_OR_name == 'string') {
+      return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [__getter___1](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [__getter___2](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.alert](...args) {
+    return this.alert.apply(this, args);
+  }
+  [dartx.close](...args) {
+    return this.close.apply(this, args);
+  }
+  [dartx.confirm](...args) {
+    return this.confirm.apply(this, args);
+  }
+  [dartx.fetch](input, init) {
+    if (init === void 0) init = null;
+    if (init != null) {
+      let init_1 = html_common.convertDartToNative_Dictionary(init);
+      return this[_fetch_1](input, init_1);
+    }
+    return this[_fetch_2](input);
+  }
+  [_fetch_1](...args) {
+    return this.fetch.apply(this, args);
+  }
+  [_fetch_2](...args) {
+    return this.fetch.apply(this, args);
+  }
+  [dartx.find](...args) {
+    return this.find.apply(this, args);
+  }
+  [_getComputedStyle](...args) {
+    return this.getComputedStyle.apply(this, args);
+  }
+  [dartx.getMatchedCssRules](...args) {
+    return this.getMatchedCSSRules.apply(this, args);
+  }
+  [dartx.getSelection](...args) {
+    return this.getSelection.apply(this, args);
+  }
+  [dartx.matchMedia](...args) {
+    return this.matchMedia.apply(this, args);
+  }
+  [dartx.moveBy](...args) {
+    return this.moveBy.apply(this, args);
+  }
+  [_moveTo](...args) {
+    return this.moveTo.apply(this, args);
+  }
+  [dartx.openDatabase](...args) {
+    return this.openDatabase.apply(this, args);
+  }
+  [dartx.postMessage](message, targetOrigin, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, targetOrigin, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1, targetOrigin);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [dartx.print](...args) {
+    return this.print.apply(this, args);
+  }
+  [dartx.resizeBy](...args) {
+    return this.resizeBy.apply(this, args);
+  }
+  [dartx.resizeTo](...args) {
+    return this.resizeTo.apply(this, args);
+  }
+  [dartx.scroll](options_OR_x, y, scrollOptions) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (scrollOptions === void 0) scrollOptions = null;
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      this[_scroll_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scroll_2](options_1);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scroll_3](options_OR_x, y);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scroll_4](options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
+      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
+      this[_scroll_5](options_OR_x, y, scrollOptions_1);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scroll_1](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_2](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_3](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_4](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [_scroll_5](...args) {
+    return this.scroll.apply(this, args);
+  }
+  [dartx.scrollBy](options_OR_x, y, scrollOptions) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (scrollOptions === void 0) scrollOptions = null;
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      this[_scrollBy_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scrollBy_2](options_1);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scrollBy_3](options_OR_x, y);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scrollBy_4](options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
+      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
+      this[_scrollBy_5](options_OR_x, y, scrollOptions_1);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scrollBy_1](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_2](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_3](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_4](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [_scrollBy_5](...args) {
+    return this.scrollBy.apply(this, args);
+  }
+  [dartx.scrollTo](options_OR_x, y, scrollOptions) {
+    if (options_OR_x === void 0) options_OR_x = null;
+    if (y === void 0) y = null;
+    if (scrollOptions === void 0) scrollOptions = null;
+    if (options_OR_x == null && y == null && scrollOptions == null) {
+      this[_scrollTo_1]();
+      return;
+    }
+    if (core.Map.is(options_OR_x) && y == null && scrollOptions == null) {
+      let options_1 = html_common.convertDartToNative_Dictionary(options_OR_x);
+      this[_scrollTo_2](options_1);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scrollTo_3](options_OR_x, y);
+      return;
+    }
+    if (typeof y == 'number' && typeof options_OR_x == 'number' && scrollOptions == null) {
+      this[_scrollTo_4](options_OR_x, y);
+      return;
+    }
+    if (scrollOptions != null && typeof y == 'number' && typeof options_OR_x == 'number') {
+      let scrollOptions_1 = html_common.convertDartToNative_Dictionary(scrollOptions);
+      this[_scrollTo_5](options_OR_x, y, scrollOptions_1);
+      return;
+    }
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_scrollTo_1](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_2](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_3](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_4](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [_scrollTo_5](...args) {
+    return this.scrollTo.apply(this, args);
+  }
+  [dartx.stop](...args) {
+    return this.stop.apply(this, args);
+  }
+  [__requestFileSystem](...args) {
+    return this.webkitRequestFileSystem.apply(this, args);
+  }
+  [_requestFileSystem](type, size) {
+    let completer = CompleterOfFileSystem().new();
+    this[__requestFileSystem](type, size, dart.fn(value => {
+      completer.complete(value);
+    }, FileSystemToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [_resolveLocalFileSystemUrl](...args) {
+    return this.webkitResolveLocalFileSystemURL.apply(this, args);
+  }
+  [dartx.resolveLocalFileSystemUrl](url) {
+    let completer = CompleterOfEntry().new();
+    this[_resolveLocalFileSystemUrl](url, dart.fn(value => {
+      completer.complete(value);
+    }, EntryToNull()), dart.fn(error => {
+      completer.completeError(error);
+    }, FileErrorToNull()));
+    return completer.future;
+  }
+  [dartx.atob](...args) {
+    return this.atob.apply(this, args);
+  }
+  [dartx.btoa](...args) {
+    return this.btoa.apply(this, args);
+  }
+  [_setInterval_String](...args) {
+    return this.setInterval.apply(this, args);
+  }
+  [_setTimeout_String](...args) {
+    return this.setTimeout.apply(this, args);
+  }
+  [_clearInterval](...args) {
+    return this.clearInterval.apply(this, args);
+  }
+  [_clearTimeout](...args) {
+    return this.clearTimeout.apply(this, args);
+  }
+  [_setInterval](...args) {
+    return this.setInterval.apply(this, args);
+  }
+  [_setTimeout](...args) {
+    return this.setTimeout.apply(this, args);
+  }
+  get [dartx.onContentLoaded]() {
+    return html$.Window.contentLoadedEvent.forTarget(this);
+  }
+  get [dartx.onAbort]() {
+    return html$.Element.abortEvent.forTarget(this);
+  }
+  get [dartx.onBlur]() {
+    return html$.Element.blurEvent.forTarget(this);
+  }
+  get [dartx.onCanPlay]() {
+    return html$.Element.canPlayEvent.forTarget(this);
+  }
+  get [dartx.onCanPlayThrough]() {
+    return html$.Element.canPlayThroughEvent.forTarget(this);
+  }
+  get [dartx.onChange]() {
+    return html$.Element.changeEvent.forTarget(this);
+  }
+  get [dartx.onClick]() {
+    return html$.Element.clickEvent.forTarget(this);
+  }
+  get [dartx.onContextMenu]() {
+    return html$.Element.contextMenuEvent.forTarget(this);
+  }
+  get [dartx.onDoubleClick]() {
+    return html$.Element.doubleClickEvent.forTarget(this);
+  }
+  get [dartx.onDeviceMotion]() {
+    return html$.Window.deviceMotionEvent.forTarget(this);
+  }
+  get [dartx.onDeviceOrientation]() {
+    return html$.Window.deviceOrientationEvent.forTarget(this);
+  }
+  get [dartx.onDrag]() {
+    return html$.Element.dragEvent.forTarget(this);
+  }
+  get [dartx.onDragEnd]() {
+    return html$.Element.dragEndEvent.forTarget(this);
+  }
+  get [dartx.onDragEnter]() {
+    return html$.Element.dragEnterEvent.forTarget(this);
+  }
+  get [dartx.onDragLeave]() {
+    return html$.Element.dragLeaveEvent.forTarget(this);
+  }
+  get [dartx.onDragOver]() {
+    return html$.Element.dragOverEvent.forTarget(this);
+  }
+  get [dartx.onDragStart]() {
+    return html$.Element.dragStartEvent.forTarget(this);
+  }
+  get [dartx.onDrop]() {
+    return html$.Element.dropEvent.forTarget(this);
+  }
+  get [dartx.onDurationChange]() {
+    return html$.Element.durationChangeEvent.forTarget(this);
+  }
+  get [dartx.onEmptied]() {
+    return html$.Element.emptiedEvent.forTarget(this);
+  }
+  get [dartx.onEnded]() {
+    return html$.Element.endedEvent.forTarget(this);
+  }
+  get [dartx.onError]() {
+    return html$.Element.errorEvent.forTarget(this);
+  }
+  get [dartx.onFocus]() {
+    return html$.Element.focusEvent.forTarget(this);
+  }
+  get [dartx.onHashChange]() {
+    return html$.Window.hashChangeEvent.forTarget(this);
+  }
+  get [dartx.onInput]() {
+    return html$.Element.inputEvent.forTarget(this);
+  }
+  get [dartx.onInvalid]() {
+    return html$.Element.invalidEvent.forTarget(this);
+  }
+  get [dartx.onKeyDown]() {
+    return html$.Element.keyDownEvent.forTarget(this);
+  }
+  get [dartx.onKeyPress]() {
+    return html$.Element.keyPressEvent.forTarget(this);
+  }
+  get [dartx.onKeyUp]() {
+    return html$.Element.keyUpEvent.forTarget(this);
+  }
+  get [dartx.onLoad]() {
+    return html$.Element.loadEvent.forTarget(this);
+  }
+  get [dartx.onLoadedData]() {
+    return html$.Element.loadedDataEvent.forTarget(this);
+  }
+  get [dartx.onLoadedMetadata]() {
+    return html$.Element.loadedMetadataEvent.forTarget(this);
+  }
+  get [dartx.onLoadStart]() {
+    return html$.Window.loadStartEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.Window.messageEvent.forTarget(this);
+  }
+  get [dartx.onMouseDown]() {
+    return html$.Element.mouseDownEvent.forTarget(this);
+  }
+  get [dartx.onMouseEnter]() {
+    return html$.Element.mouseEnterEvent.forTarget(this);
+  }
+  get [dartx.onMouseLeave]() {
+    return html$.Element.mouseLeaveEvent.forTarget(this);
+  }
+  get [dartx.onMouseMove]() {
+    return html$.Element.mouseMoveEvent.forTarget(this);
+  }
+  get [dartx.onMouseOut]() {
+    return html$.Element.mouseOutEvent.forTarget(this);
+  }
+  get [dartx.onMouseOver]() {
+    return html$.Element.mouseOverEvent.forTarget(this);
+  }
+  get [dartx.onMouseUp]() {
+    return html$.Element.mouseUpEvent.forTarget(this);
+  }
+  get [dartx.onMouseWheel]() {
+    return html$.Element.mouseWheelEvent.forTarget(this);
+  }
+  get [dartx.onOffline]() {
+    return html$.Window.offlineEvent.forTarget(this);
+  }
+  get [dartx.onOnline]() {
+    return html$.Window.onlineEvent.forTarget(this);
+  }
+  get [dartx.onPageHide]() {
+    return html$.Window.pageHideEvent.forTarget(this);
+  }
+  get [dartx.onPageShow]() {
+    return html$.Window.pageShowEvent.forTarget(this);
+  }
+  get [dartx.onPause]() {
+    return html$.Element.pauseEvent.forTarget(this);
+  }
+  get [dartx.onPlay]() {
+    return html$.Element.playEvent.forTarget(this);
+  }
+  get [dartx.onPlaying]() {
+    return html$.Element.playingEvent.forTarget(this);
+  }
+  get [dartx.onPopState]() {
+    return html$.Window.popStateEvent.forTarget(this);
+  }
+  get [dartx.onProgress]() {
+    return html$.Window.progressEvent.forTarget(this);
+  }
+  get [dartx.onRateChange]() {
+    return html$.Element.rateChangeEvent.forTarget(this);
+  }
+  get [dartx.onReset]() {
+    return html$.Element.resetEvent.forTarget(this);
+  }
+  get [dartx.onResize]() {
+    return html$.Element.resizeEvent.forTarget(this);
+  }
+  get [dartx.onScroll]() {
+    return html$.Element.scrollEvent.forTarget(this);
+  }
+  get [dartx.onSearch]() {
+    return html$.Element.searchEvent.forTarget(this);
+  }
+  get [dartx.onSeeked]() {
+    return html$.Element.seekedEvent.forTarget(this);
+  }
+  get [dartx.onSeeking]() {
+    return html$.Element.seekingEvent.forTarget(this);
+  }
+  get [dartx.onSelect]() {
+    return html$.Element.selectEvent.forTarget(this);
+  }
+  get [dartx.onStalled]() {
+    return html$.Element.stalledEvent.forTarget(this);
+  }
+  get [dartx.onStorage]() {
+    return html$.Window.storageEvent.forTarget(this);
+  }
+  get [dartx.onSubmit]() {
+    return html$.Element.submitEvent.forTarget(this);
+  }
+  get [dartx.onSuspend]() {
+    return html$.Element.suspendEvent.forTarget(this);
+  }
+  get [dartx.onTimeUpdate]() {
+    return html$.Element.timeUpdateEvent.forTarget(this);
+  }
+  get [dartx.onTouchCancel]() {
+    return html$.Element.touchCancelEvent.forTarget(this);
+  }
+  get [dartx.onTouchEnd]() {
+    return html$.Element.touchEndEvent.forTarget(this);
+  }
+  get [dartx.onTouchMove]() {
+    return html$.Element.touchMoveEvent.forTarget(this);
+  }
+  get [dartx.onTouchStart]() {
+    return html$.Element.touchStartEvent.forTarget(this);
+  }
+  get [dartx.onTransitionEnd]() {
+    return html$.Element.transitionEndEvent.forTarget(this);
+  }
+  get [dartx.onUnload]() {
+    return html$.Window.unloadEvent.forTarget(this);
+  }
+  get [dartx.onVolumeChange]() {
+    return html$.Element.volumeChangeEvent.forTarget(this);
+  }
+  get [dartx.onWaiting]() {
+    return html$.Element.waitingEvent.forTarget(this);
+  }
+  get [dartx.onAnimationEnd]() {
+    return html$.Window.animationEndEvent.forTarget(this);
+  }
+  get [dartx.onAnimationIteration]() {
+    return html$.Window.animationIterationEvent.forTarget(this);
+  }
+  get [dartx.onAnimationStart]() {
+    return html$.Window.animationStartEvent.forTarget(this);
+  }
+  get [dartx.onBeforeUnload]() {
+    return html$.Window.beforeUnloadEvent.forTarget(this);
+  }
+  [dartx.moveTo](p) {
+    this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
+  }
+  get [dartx.pageXOffset]() {
+    return this.pageXOffset[dartx.round]();
+  }
+  get [dartx.pageYOffset]() {
+    return this.pageYOffset[dartx.round]();
+  }
+  get [dartx.scrollX]() {
+    return "scrollX" in this ? this.scrollX[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollLeft];
+  }
+  get [dartx.scrollY]() {
+    return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
+  }
+};
+html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
+dart.setSignature(html$.Window, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
+  fields: () => ({
+    [dartx.applicationCache]: html$.ApplicationCache,
+    [dartx.caches]: html$.CacheStorage,
+    [dartx.closed]: core.bool,
+    [dartx.crypto]: html$.Crypto,
+    [dartx.defaultStatus]: core.String,
+    [dartx.defaultstatus]: core.String,
+    [dartx.devicePixelRatio]: core.double,
+    [dartx.history]: html$.History,
+    [dartx.innerHeight]: core.int,
+    [dartx.innerWidth]: core.int,
+    [dartx.localStorage]: html$.Storage,
+    [dartx.locationbar]: html$.BarProp,
+    [dartx.menubar]: html$.BarProp,
+    [dartx.name]: core.String,
+    [dartx.navigator]: html$.Navigator,
+    [dartx.offscreenBuffering]: core.bool,
+    [_get_opener]: dart.dynamic,
+    [dartx.orientation]: core.int,
+    [dartx.outerHeight]: core.int,
+    [dartx.outerWidth]: core.int,
+    [_pageXOffset]: core.double,
+    [_pageYOffset]: core.double,
+    [_get_parent]: dart.dynamic,
+    [dartx.performance]: html$.Performance,
+    [dartx.screen]: html$.Screen,
+    [dartx.screenLeft]: core.int,
+    [dartx.screenTop]: core.int,
+    [dartx.screenX]: core.int,
+    [dartx.screenY]: core.int,
+    [dartx.scrollbars]: html$.BarProp,
+    [_get_self]: dart.dynamic,
+    [dartx.sessionStorage]: html$.Storage,
+    [dartx.speechSynthesis]: html$.SpeechSynthesis,
+    [dartx.status]: core.String,
+    [dartx.statusbar]: html$.BarProp,
+    [dartx.styleMedia]: html$.StyleMedia,
+    [dartx.toolbar]: html$.BarProp,
+    [_get_top]: dart.dynamic,
+    [_get_window]: dart.dynamic
+  }),
+  getters: () => ({
+    [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
+    [dartx.document]: dart.definiteFunctionType(html$.Document, []),
+    [dartx.location]: dart.definiteFunctionType(html$.Location, []),
+    [_location]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
+    [dartx.console]: dart.definiteFunctionType(html$.Console, []),
+    [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
+    [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
+    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
+    [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
+    [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
+    [dartx.scrollY]: dart.definiteFunctionType(core.int, [])
+  }),
+  setters: () => ({
+    [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
+  }),
+  methods: () => ({
+    [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
+    [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
+    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
+    [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
+    [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
+    [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
+    [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
+    [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
+    [dartx.close]: dart.definiteFunctionType(dart.void, []),
+    [dartx.confirm]: dart.definiteFunctionType(core.bool, [], [core.String]),
+    [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
+    [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
+    [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
+    [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
+    [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
+    [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
+    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
+    [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
+    [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    [dartx.print]: dart.definiteFunctionType(dart.void, []),
+    [dartx.resizeBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.resizeTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.scroll]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
+    [_scroll_1]: dart.definiteFunctionType(dart.void, []),
+    [_scroll_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scroll_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [_scroll_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [_scroll_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
+    [dartx.scrollBy]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
+    [_scrollBy_1]: dart.definiteFunctionType(dart.void, []),
+    [_scrollBy_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scrollBy_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [_scrollBy_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [_scrollBy_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
+    [dartx.scrollTo]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, dart.dynamic, core.Map]),
+    [_scrollTo_1]: dart.definiteFunctionType(dart.void, []),
+    [_scrollTo_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [_scrollTo_3]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, []),
+    [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
+    [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
+    [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
+    [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
+    [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
+    [_setTimeout_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
+    [_clearInterval]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [_clearTimeout]: dart.definiteFunctionType(dart.void, [], [core.int]),
+    [_setInterval]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+    [_setTimeout]: dart.definiteFunctionType(core.int, [core.Object], [core.int]),
+    [dartx.moveTo]: dart.definiteFunctionType(dart.void, [PointOfnum()])
+  }),
+  sfields: () => ({
+    contentLoadedEvent: EventStreamProviderOfEvent(),
+    deviceMotionEvent: EventStreamProviderOfDeviceMotionEvent(),
+    deviceOrientationEvent: EventStreamProviderOfDeviceOrientationEvent(),
+    hashChangeEvent: EventStreamProviderOfEvent(),
+    loadStartEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    offlineEvent: EventStreamProviderOfEvent(),
+    onlineEvent: EventStreamProviderOfEvent(),
+    pageHideEvent: EventStreamProviderOfEvent(),
+    pageShowEvent: EventStreamProviderOfEvent(),
+    popStateEvent: EventStreamProviderOfPopStateEvent(),
+    progressEvent: EventStreamProviderOfEvent(),
+    storageEvent: EventStreamProviderOfStorageEvent(),
+    unloadEvent: EventStreamProviderOfEvent(),
+    animationEndEvent: EventStreamProviderOfAnimationEvent(),
+    animationIterationEvent: EventStreamProviderOfAnimationEvent(),
+    animationStartEvent: EventStreamProviderOfAnimationEvent(),
+    PERSISTENT: core.int,
+    TEMPORARY: core.int,
+    beforeUnloadEvent: EventStreamProviderOfBeforeUnloadEvent()
+  }),
+  sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
+});
+html$.Window.PERSISTENT = 1;
+html$.Window.TEMPORARY = 0;
+dart.defineLazy(html$.Window, {
+  get contentLoadedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
+  },
+  get deviceMotionEvent() {
+    return dart.const(new (EventStreamProviderOfDeviceMotionEvent())('devicemotion'));
+  },
+  get deviceOrientationEvent() {
+    return dart.const(new (EventStreamProviderOfDeviceOrientationEvent())('deviceorientation'));
+  },
+  get hashChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
+  },
+  get loadStartEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadstart'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get offlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('offline'));
+  },
+  get onlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('online'));
+  },
+  get pageHideEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pagehide'));
+  },
+  get pageShowEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pageshow'));
+  },
+  get popStateEvent() {
+    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
+  },
+  get progressEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('progress'));
+  },
+  get storageEvent() {
+    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
+  },
+  get unloadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('unload'));
+  },
+  get animationEndEvent() {
+    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationEnd'));
+  },
+  get animationIterationEvent() {
+    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationIteration'));
+  },
+  get animationStartEvent() {
+    return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
+  },
+  get beforeUnloadEvent() {
+    return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
+  }
+});
+dart.registerExtension(dart.global.Window, html$.Window);
+dart.registerExtension(dart.global.DOMWindow, html$.Window);
+const _returnValue = Symbol('_returnValue');
+html$._WrappedEvent = class _WrappedEvent extends core.Object {
+  new(wrapped) {
+    this.wrapped = wrapped;
+    this[_selector] = null;
+  }
+  get bubbles() {
+    return this.wrapped[dartx.bubbles];
+  }
+  get cancelable() {
+    return this.wrapped[dartx.cancelable];
+  }
+  get currentTarget() {
+    return this.wrapped[dartx.currentTarget];
+  }
+  get defaultPrevented() {
+    return this.wrapped[dartx.defaultPrevented];
+  }
+  get eventPhase() {
+    return this.wrapped[dartx.eventPhase];
+  }
+  get target() {
+    return this.wrapped[dartx.target];
+  }
+  get timeStamp() {
+    return this.wrapped[dartx.timeStamp];
+  }
+  get type() {
+    return this.wrapped[dartx.type];
+  }
+  [_initEvent](eventTypeArg, canBubbleArg, cancelableArg) {
+    dart.throw(new core.UnsupportedError('Cannot initialize this Event.'));
+  }
+  preventDefault() {
+    this.wrapped[dartx.preventDefault]();
+  }
+  stopImmediatePropagation() {
+    this.wrapped[dartx.stopImmediatePropagation]();
+  }
+  stopPropagation() {
+    this.wrapped[dartx.stopPropagation]();
+  }
+  get matchingTarget() {
+    if (this[_selector] == null) {
+      dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
+    }
+    let currentTarget = html$.Element._check(this.currentTarget);
+    let target = html$.Element._check(this.target);
+    let matchedTarget = null;
+    do {
+      if (dart.test(target[dartx.matches](this[_selector]))) return target;
+      target = target[dartx.parent];
+    } while (target != null && !dart.equals(target, currentTarget[dartx.parent]));
+    dart.throw(new core.StateError('No selector matched for populating matchedTarget.'));
+  }
+  get path() {
+    return ListOfNode()._check(this.wrapped[dartx.path]);
+  }
+  get [_get_currentTarget]() {
+    return this.wrapped[_get_currentTarget];
+  }
+  get [_get_target]() {
+    return this.wrapped[_get_target];
+  }
+};
+html$._WrappedEvent[dart.implements] = () => [html$.Event];
+dart.setSignature(html$._WrappedEvent, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
+  fields: () => ({
+    wrapped: html$.Event,
+    [_selector]: core.String
+  }),
+  getters: () => ({
+    bubbles: dart.definiteFunctionType(core.bool, []),
+    cancelable: dart.definiteFunctionType(core.bool, []),
+    currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
+    defaultPrevented: dart.definiteFunctionType(core.bool, []),
+    eventPhase: dart.definiteFunctionType(core.int, []),
+    target: dart.definiteFunctionType(html$.EventTarget, []),
+    timeStamp: dart.definiteFunctionType(core.int, []),
+    type: dart.definiteFunctionType(core.String, []),
+    matchingTarget: dart.definiteFunctionType(html$.Element, []),
+    path: dart.definiteFunctionType(core.List$(html$.Node), []),
+    [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
+    [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
+  }),
+  methods: () => ({
+    [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
+    preventDefault: dart.definiteFunctionType(dart.void, []),
+    stopImmediatePropagation: dart.definiteFunctionType(dart.void, []),
+    stopPropagation: dart.definiteFunctionType(dart.void, [])
+  })
+});
+html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
+  new(base) {
+    this[_returnValue] = null;
+    super.new(base);
+  }
+  get returnValue() {
+    return this[_returnValue];
+  }
+  set returnValue(value) {
+    this[_returnValue] = value;
+    if ("returnValue" in this.wrapped) {
+      this.wrapped.returnValue = value;
+    }
+  }
+};
+html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
+dart.setSignature(html$._BeforeUnloadEvent, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
+  fields: () => ({[_returnValue]: core.String}),
+  getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
+  setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
+});
+const _eventType = Symbol('_eventType');
+html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
+  new(eventType) {
+    this[_eventType] = eventType;
+  }
+  forTarget(e, opts) {
+    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+    let stream = new (_EventStreamOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
+    let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
+    stream.listen(dart.fn(event => {
+      let wrapped = new html$._BeforeUnloadEvent(event);
+      controller.add(wrapped);
+    }, BeforeUnloadEventToNull()));
+    return controller.stream;
+  }
+  getEventType(target) {
+    return this[_eventType];
+  }
+  forElement(e, opts) {
+    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+    return new (_ElementEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
+  }
+  [_forElementList](e, opts) {
+    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+    return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
+  }
+};
+html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
+dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
+  fields: () => ({[_eventType]: core.String}),
+  methods: () => ({
+    forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
+    getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
+    [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
+  })
+});
+html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.WindowBase64, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
+});
+dart.defineExtensionNames([
+  'focus',
+  'focused',
+  'visibilityState'
+]);
+html$.WindowClient = class WindowClient extends html$.Client {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.focused]() {
+    return this.focused;
+  }
+  get [dartx.visibilityState]() {
+    return this.visibilityState;
+  }
+  [dartx.focus](...args) {
+    return this.focus.apply(this, args);
+  }
+};
+dart.setSignature(html$.WindowClient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
+  fields: () => ({
+    [dartx.focused]: core.bool,
+    [dartx.visibilityState]: core.String
+  }),
+  methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
+});
+dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
+dart.defineExtensionNames([
+  'onHashChange',
+  'onMessage',
+  'onOffline',
+  'onOnline',
+  'onPopState',
+  'onStorage',
+  'onUnload'
+]);
+html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get onHashChange() {
+    return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
+  }
+  get onMessage() {
+    return html$.WindowEventHandlers.messageEvent.forTarget(this);
+  }
+  get onOffline() {
+    return html$.WindowEventHandlers.offlineEvent.forTarget(this);
+  }
+  get onOnline() {
+    return html$.WindowEventHandlers.onlineEvent.forTarget(this);
+  }
+  get onPopState() {
+    return html$.WindowEventHandlers.popStateEvent.forTarget(this);
+  }
+  get onStorage() {
+    return html$.WindowEventHandlers.storageEvent.forTarget(this);
+  }
+  get onUnload() {
+    return html$.WindowEventHandlers.unloadEvent.forTarget(this);
+  }
+};
+dart.setSignature(html$.WindowEventHandlers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
+  getters: () => ({
+    onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
+    onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
+    onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
+  }),
+  sfields: () => ({
+    hashChangeEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent(),
+    offlineEvent: EventStreamProviderOfEvent(),
+    onlineEvent: EventStreamProviderOfEvent(),
+    popStateEvent: EventStreamProviderOfPopStateEvent(),
+    storageEvent: EventStreamProviderOfStorageEvent(),
+    unloadEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineExtensionMembers(html$.WindowEventHandlers, [
+  'onHashChange',
+  'onMessage',
+  'onOffline',
+  'onOnline',
+  'onPopState',
+  'onStorage',
+  'onUnload'
+]);
+dart.defineLazy(html$.WindowEventHandlers, {
+  get hashChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  },
+  get offlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('offline'));
+  },
+  get onlineEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('online'));
+  },
+  get popStateEvent() {
+    return dart.const(new (EventStreamProviderOfPopStateEvent())('popstate'));
+  },
+  get storageEvent() {
+    return dart.const(new (EventStreamProviderOfStorageEvent())('storage'));
+  },
+  get unloadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('unload'));
+  }
+});
+dart.defineExtensionNames([
+  'postMessage',
+  'terminate',
+  'onError',
+  'onMessage'
+]);
+html$.Worker = class Worker extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(scriptUrl) {
+    return html$.Worker._create_1(scriptUrl);
+  }
+  static _create_1(scriptUrl) {
+    return new self.Worker(scriptUrl);
+  }
+  static get supported() {
+    return typeof window.Worker != "undefined";
+  }
+  [dartx.postMessage](message, transfer) {
+    if (transfer === void 0) transfer = null;
+    if (transfer != null) {
+      let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+      this[_postMessage_1](message_1, transfer);
+      return;
+    }
+    let message_1 = html_common.convertDartToNative_SerializedScriptValue(message);
+    this[_postMessage_2](message_1);
+    return;
+  }
+  [_postMessage_1](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [_postMessage_2](...args) {
+    return this.postMessage.apply(this, args);
+  }
+  [dartx.terminate](...args) {
+    return this.terminate.apply(this, args);
+  }
+  get [dartx.onError]() {
+    return html$.Worker.errorEvent.forTarget(this);
+  }
+  get [dartx.onMessage]() {
+    return html$.Worker.messageEvent.forTarget(this);
+  }
+};
+html$.Worker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.Worker, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.Worker, []),
+    new: dart.definiteFunctionType(html$.Worker, [core.String])
+  }),
+  getters: () => ({
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
+  }),
+  methods: () => ({
+    [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
+    [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
+    [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    [dartx.terminate]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    errorEvent: EventStreamProviderOfEvent(),
+    messageEvent: EventStreamProviderOfMessageEvent()
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.defineLazy(html$.Worker, {
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get messageEvent() {
+    return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
+  }
+});
+dart.registerExtension(dart.global.Worker, html$.Worker);
+html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.WorkerConsole, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
+});
+dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
+dart.defineExtensionNames([
+  'clearMarks',
+  'clearMeasures',
+  'getEntries',
+  'getEntriesByName',
+  'getEntriesByType',
+  'mark',
+  'measure',
+  'now',
+  'clearResourceTimings',
+  'setResourceTimingBufferSize',
+  'memory'
+]);
+html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.memory]() {
+    return this.memory;
+  }
+  [dartx.clearMarks](...args) {
+    return this.clearMarks.apply(this, args);
+  }
+  [dartx.clearMeasures](...args) {
+    return this.clearMeasures.apply(this, args);
+  }
+  [dartx.getEntries](...args) {
+    return this.getEntries.apply(this, args);
+  }
+  [dartx.getEntriesByName](...args) {
+    return this.getEntriesByName.apply(this, args);
+  }
+  [dartx.getEntriesByType](...args) {
+    return this.getEntriesByType.apply(this, args);
+  }
+  [dartx.mark](...args) {
+    return this.mark.apply(this, args);
+  }
+  [dartx.measure](...args) {
+    return this.measure.apply(this, args);
+  }
+  [dartx.now](...args) {
+    return this.now.apply(this, args);
+  }
+  [dartx.clearResourceTimings](...args) {
+    return this.webkitClearResourceTimings.apply(this, args);
+  }
+  [dartx.setResourceTimingBufferSize](...args) {
+    return this.webkitSetResourceTimingBufferSize.apply(this, args);
+  }
+};
+dart.setSignature(html$.WorkerPerformance, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
+  fields: () => ({[dartx.memory]: html$.MemoryInfo}),
+  methods: () => ({
+    [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
+    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
+    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
+    [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
+    [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.now]: dart.definiteFunctionType(core.double, []),
+    [dartx.clearResourceTimings]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
+  })
+});
+dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
+dart.defineExtensionNames([
+  'createExpression',
+  'createNSResolver',
+  'evaluate'
+]);
+html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.XPathEvaluator._create_1();
+  }
+  static _create_1() {
+    return new self.XPathEvaluator();
+  }
+  [dartx.createExpression](...args) {
+    return this.createExpression.apply(this, args);
+  }
+  [dartx.createNSResolver](...args) {
+    return this.createNSResolver.apply(this, args);
+  }
+  [dartx.evaluate](...args) {
+    return this.evaluate.apply(this, args);
+  }
+};
+dart.setSignature(html$.XPathEvaluator, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.XPathEvaluator, []),
+    new: dart.definiteFunctionType(html$.XPathEvaluator, [])
+  }),
+  methods: () => ({
+    [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
+    [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
+    [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
+dart.defineExtensionNames([
+  'evaluate'
+]);
+html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.evaluate](...args) {
+    return this.evaluate.apply(this, args);
+  }
+};
+dart.setSignature(html$.XPathExpression, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
+  methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
+});
+dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
+dart.defineExtensionNames([
+  'lookupNamespaceUri'
+]);
+html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.lookupNamespaceUri](...args) {
+    return this.lookupNamespaceURI.apply(this, args);
+  }
+};
+dart.setSignature(html$.XPathNSResolver, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
+  methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
+});
+dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
+dart.defineExtensionNames([
+  'iterateNext',
+  'snapshotItem',
+  'booleanValue',
+  'invalidIteratorState',
+  'numberValue',
+  'resultType',
+  'singleNodeValue',
+  'snapshotLength',
+  'stringValue'
+]);
+html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.booleanValue]() {
+    return this.booleanValue;
+  }
+  get [dartx.invalidIteratorState]() {
+    return this.invalidIteratorState;
+  }
+  get [dartx.numberValue]() {
+    return this.numberValue;
+  }
+  get [dartx.resultType]() {
+    return this.resultType;
+  }
+  get [dartx.singleNodeValue]() {
+    return this.singleNodeValue;
+  }
+  get [dartx.snapshotLength]() {
+    return this.snapshotLength;
+  }
+  get [dartx.stringValue]() {
+    return this.stringValue;
+  }
+  [dartx.iterateNext](...args) {
+    return this.iterateNext.apply(this, args);
+  }
+  [dartx.snapshotItem](...args) {
+    return this.snapshotItem.apply(this, args);
+  }
+};
+dart.setSignature(html$.XPathResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
+  fields: () => ({
+    [dartx.booleanValue]: core.bool,
+    [dartx.invalidIteratorState]: core.bool,
+    [dartx.numberValue]: core.double,
+    [dartx.resultType]: core.int,
+    [dartx.singleNodeValue]: html$.Node,
+    [dartx.snapshotLength]: core.int,
+    [dartx.stringValue]: core.String
+  }),
+  methods: () => ({
+    [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
+  }),
+  sfields: () => ({
+    ANY_TYPE: core.int,
+    ANY_UNORDERED_NODE_TYPE: core.int,
+    BOOLEAN_TYPE: core.int,
+    FIRST_ORDERED_NODE_TYPE: core.int,
+    NUMBER_TYPE: core.int,
+    ORDERED_NODE_ITERATOR_TYPE: core.int,
+    ORDERED_NODE_SNAPSHOT_TYPE: core.int,
+    STRING_TYPE: core.int,
+    UNORDERED_NODE_ITERATOR_TYPE: core.int,
+    UNORDERED_NODE_SNAPSHOT_TYPE: core.int
+  })
+});
+html$.XPathResult.ANY_TYPE = 0;
+html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
+html$.XPathResult.BOOLEAN_TYPE = 3;
+html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
+html$.XPathResult.NUMBER_TYPE = 1;
+html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
+html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
+html$.XPathResult.STRING_TYPE = 2;
+html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
+html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
+html$.XmlDocument = class XmlDocument extends html$.Document {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$.XmlDocument, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
+});
+dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
+dart.defineExtensionNames([
+  'serializeToString'
+]);
+html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.XmlSerializer._create_1();
+  }
+  static _create_1() {
+    return new XMLSerializer();
+  }
+  [dartx.serializeToString](...args) {
+    return this.serializeToString.apply(this, args);
+  }
+};
+dart.setSignature(html$.XmlSerializer, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.XmlSerializer, []),
+    new: dart.definiteFunctionType(html$.XmlSerializer, [])
+  }),
+  methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
+dart.defineExtensionNames([
+  'clearParameters',
+  'getParameter',
+  'importStylesheet',
+  'removeParameter',
+  'reset',
+  'setParameter',
+  'transformToDocument',
+  'transformToFragment'
+]);
+html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$.XsltProcessor._create_1();
+  }
+  static _create_1() {
+    return new XSLTProcessor();
+  }
+  static get supported() {
+    return !!window.XSLTProcessor;
+  }
+  [dartx.clearParameters](...args) {
+    return this.clearParameters.apply(this, args);
+  }
+  [dartx.getParameter](...args) {
+    return this.getParameter.apply(this, args);
+  }
+  [dartx.importStylesheet](...args) {
+    return this.importStylesheet.apply(this, args);
+  }
+  [dartx.removeParameter](...args) {
+    return this.removeParameter.apply(this, args);
+  }
+  [dartx.reset](...args) {
+    return this.reset.apply(this, args);
+  }
+  [dartx.setParameter](...args) {
+    return this.setParameter.apply(this, args);
+  }
+  [dartx.transformToDocument](...args) {
+    return this.transformToDocument.apply(this, args);
+  }
+  [dartx.transformToFragment](...args) {
+    return this.transformToFragment.apply(this, args);
+  }
+};
+dart.setSignature(html$.XsltProcessor, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$.XsltProcessor, []),
+    new: dart.definiteFunctionType(html$.XsltProcessor, [])
+  }),
+  methods: () => ({
+    [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
+    [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [dartx.reset]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
+    [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
+    [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
+dart.defineExtensionNames([
+  'name',
+  'value'
+]);
+html$._Attr = class _Attr extends html$.Node {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.setSignature(html$._Attr, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
+  fields: () => ({
+    [dartx.name]: core.String,
+    [dartx.value]: core.String
+  })
+});
+dart.registerExtension(dart.global.Attr, html$._Attr);
+html$._Cache = class _Cache extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._Cache, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
+});
+dart.registerExtension(dart.global.Cache, html$._Cache);
+html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._CanvasPathMethods, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
+});
+dart.defineExtensionNames([
+  'toString',
+  '==',
+  'hashCode',
+  'intersection',
+  'intersects',
+  'boundingBox',
+  'containsRectangle',
+  'containsPoint',
+  'topLeft',
+  'topRight',
+  'bottomRight',
+  'bottomLeft',
+  'bottom',
+  'height',
+  'left',
+  'right',
+  'top',
+  'width'
+]);
+html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
+  [dartx.toString]() {
+    return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
+  }
+  [dartx['==']](other) {
+    if (!RectangleOfnum().is(other)) return false;
+    return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
+  }
+  get [dartx.hashCode]() {
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
+  }
+  [dartx.intersection](other) {
+    let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
+    let x1 = math.min(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    if (dart.notNull(x0) <= dart.notNull(x1)) {
+      let y0 = math.max(core.num)(this[dartx.top], other[dartx.top]);
+      let y1 = math.min(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+      if (dart.notNull(y0) <= dart.notNull(y1)) {
+        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
+      }
+    }
+    return null;
+  }
+  [dartx.intersects](other) {
+    return dart.notNull(this[dartx.left]) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
+  }
+  [dartx.boundingBox](other) {
+    let right = math.max(core.num)(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    let bottom = math.max(core.num)(dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+    let left = math.min(core.num)(this[dartx.left], other[dartx.left]);
+    let top = math.min(core.num)(this[dartx.top], other[dartx.top]);
+    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
+  }
+  [dartx.containsRectangle](another) {
+    return dart.notNull(this[dartx.left]) <= dart.notNull(another[dartx.left]) && dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this[dartx.top]) <= dart.notNull(another[dartx.top]) && dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
+  }
+  [dartx.containsPoint](another) {
+    return dart.notNull(another.x) >= dart.notNull(this[dartx.left]) && dart.notNull(another.x) <= dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]) && dart.notNull(another.y) >= dart.notNull(this[dartx.top]) && dart.notNull(another.y) <= dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]);
+  }
+  get [dartx.topLeft]() {
+    return new (PointOfnum())(this[dartx.left], this[dartx.top]);
+  }
+  get [dartx.topRight]() {
+    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), this[dartx.top]);
+  }
+  get [dartx.bottomRight]() {
+    return new (PointOfnum())(dart.notNull(this[dartx.left]) + dart.notNull(this[dartx.width]), dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
+  }
+  get [dartx.bottomLeft]() {
+    return new (PointOfnum())(this[dartx.left], dart.notNull(this[dartx.top]) + dart.notNull(this[dartx.height]));
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.bottom]() {
+    return this.bottom;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.left]() {
+    return this.left;
+  }
+  get [dartx.right]() {
+    return this.right;
+  }
+  get [dartx.top]() {
+    return this.top;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+};
+html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$._ClientRect, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
+  fields: () => ({
+    [dartx.bottom]: core.double,
+    [dartx.height]: core.double,
+    [dartx.left]: core.double,
+    [dartx.right]: core.double,
+    [dartx.top]: core.double,
+    [dartx.width]: core.double
+  }),
+  getters: () => ({
+    [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.topRight]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.bottomRight]: dart.definiteFunctionType(math.Point$(core.num), []),
+    [dartx.bottomLeft]: dart.definiteFunctionType(math.Point$(core.num), [])
+  }),
+  methods: () => ({
+    [dartx.intersection]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    [dartx.intersects]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    [dartx.boundingBox]: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
+  })
+});
+dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
+html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
+  static combine(hash, value) {
+    hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
+    hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
+    return (dart.notNull(hash) ^ hash[dartx['>>']](6)) >>> 0;
+  }
+  static finish(hash) {
+    hash = 536870911 & dart.notNull(hash) + ((67108863 & dart.notNull(hash)) << 3);
+    hash = (dart.notNull(hash) ^ hash[dartx['>>']](11)) >>> 0;
+    return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
+  }
+  static hash2(a, b) {
+    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
+  }
+  static hash4(a, b, c, d) {
+    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
+  }
+};
+dart.setSignature(html$._JenkinsSmiHash, {
+  statics: () => ({
+    combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    finish: dart.definiteFunctionType(core.int, [core.int]),
+    hash2: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic]),
+    hash4: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+  }),
+  names: ['combine', 'finish', 'hash2', 'hash4']
+});
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.item](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
+dart.setSignature(html$._ClientRectList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, RectangleOfnum()]),
+    [__getter__]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int]),
+    [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
+  })
+});
+dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
+dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
+dart.setSignature(html$._CssRuleList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
+    [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
+  })
+});
+dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
+html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._DOMFileSystemSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
+});
+dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
+html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._EntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
+});
+dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
+html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._DirectoryEntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
+});
+dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
+html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._DirectoryReaderSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
+});
+dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
+html$._DocumentType = class _DocumentType extends html$.Node {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+html$._DocumentType[dart.implements] = () => [html$.ChildNode];
+dart.setSignature(html$._DocumentType, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
+});
+dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
+dart.defineExtensionNames([
+  'height',
+  'height',
+  'width',
+  'width',
+  'x',
+  'x',
+  'y',
+  'y'
+]);
+html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(x, y, width, height) {
+    if (x === void 0) x = null;
+    if (y === void 0) y = null;
+    if (width === void 0) width = null;
+    if (height === void 0) height = null;
+    if (height != null) {
+      return html$._DomRect._create_1(x, y, width, height);
+    }
+    if (width != null) {
+      return html$._DomRect._create_2(x, y, width);
+    }
+    if (y != null) {
+      return html$._DomRect._create_3(x, y);
+    }
+    if (x != null) {
+      return html$._DomRect._create_4(x);
+    }
+    return html$._DomRect._create_5();
+  }
+  static _create_1(x, y, width, height) {
+    return new DOMRect(x, y, width, height);
+  }
+  static _create_2(x, y, width) {
+    return new DOMRect(x, y, width);
+  }
+  static _create_3(x, y) {
+    return new DOMRect(x, y);
+  }
+  static _create_4(x) {
+    return new DOMRect(x);
+  }
+  static _create_5() {
+    return new DOMRect();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(html$._DomRect, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._DomRect, []),
+    new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
+  }),
+  setters: () => ({
+    [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.width]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.x]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$._DomRect, [])
+  }),
+  names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
+});
+dart.registerExtension(dart.global.DOMRect, html$._DomRect);
+html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._FileEntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
+});
+dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
+html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return html$._FileReaderSync._create_1();
+  }
+  static _create_1() {
+    return new FileReaderSync();
+  }
+};
+dart.setSignature(html$._FileReaderSync, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._FileReaderSync, []),
+    new: dart.definiteFunctionType(html$._FileReaderSync, [])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
+html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._FileWriterSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
+});
+dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
+dart.setSignature(html$._GamepadList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
+    [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
+  })
+});
+dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
+html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [_item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+dart.setSignature(html$._HTMLAllCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
+  methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
+});
+dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
+html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
+dart.setSignature(html$._HTMLAppletElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
+    created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
+html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
+dart.setSignature(html$._HTMLDirectoryElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
+    created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
+html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
+dart.setSignature(html$._HTMLFontElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLFontElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFontElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
+html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
+dart.setSignature(html$._HTMLFrameElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
+html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
+html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
+dart.setSignature(html$._HTMLFrameSetElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
+html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
+dart.setSignature(html$._HTMLMarqueeElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
+    created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
+  })
+});
+dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'getNamedItem',
+  'getNamedItemNS',
+  'item',
+  'removeNamedItem',
+  'removeNamedItemNS',
+  'setNamedItem',
+  'setNamedItemNS'
+]);
+html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.getNamedItem](...args) {
+    return this.getNamedItem.apply(this, args);
+  }
+  [dartx.getNamedItemNS](...args) {
+    return this.getNamedItemNS.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+  [dartx.removeNamedItem](...args) {
+    return this.removeNamedItem.apply(this, args);
+  }
+  [dartx.removeNamedItemNS](...args) {
+    return this.removeNamedItemNS.apply(this, args);
+  }
+  [dartx.setNamedItem](...args) {
+    return this.setNamedItem.apply(this, args);
+  }
+  [dartx.setNamedItemNS](...args) {
+    return this.setNamedItemNS.apply(this, args);
+  }
+};
+html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$._NamedNodeMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
+    [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
+    [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
+    [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
+    [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
+    [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
+  })
+});
+dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
+dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
+html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._PagePopupController, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
+});
+dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
+dart.defineExtensionNames([
+  'clone',
+  'context',
+  'credentials',
+  'headers',
+  'mode',
+  'referrer',
+  'url'
+]);
+html$._Request = class _Request extends html$.Body {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(input, requestInitDict) {
+    if (requestInitDict === void 0) requestInitDict = null;
+    if (requestInitDict != null) {
+      let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
+      return html$._Request._create_1(input, requestInitDict_1);
+    }
+    return html$._Request._create_2(input);
+  }
+  static _create_1(input, requestInitDict) {
+    return new Request(input, requestInitDict);
+  }
+  static _create_2(input) {
+    return new Request(input);
+  }
+  get [dartx.context]() {
+    return this.context;
+  }
+  get [dartx.credentials]() {
+    return this.credentials;
+  }
+  get [dartx.headers]() {
+    return this.headers;
+  }
+  get [dartx.mode]() {
+    return this.mode;
+  }
+  get [dartx.referrer]() {
+    return this.referrer;
+  }
+  get [dartx.url]() {
+    return this.url;
+  }
+  [dartx.clone](...args) {
+    return this.clone.apply(this, args);
+  }
+};
+dart.setSignature(html$._Request, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._Request, []),
+    new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
+  }),
+  fields: () => ({
+    [dartx.context]: core.String,
+    [dartx.credentials]: core.String,
+    [dartx.headers]: html$.Headers,
+    [dartx.mode]: core.String,
+    [dartx.referrer]: core.String,
+    [dartx.url]: core.String
+  }),
+  methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.Request, html$._Request);
+html$._Response = class _Response extends html$.Body {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(body, responseInitDict) {
+    if (body === void 0) body = null;
+    if (responseInitDict === void 0) responseInitDict = null;
+    if (responseInitDict != null) {
+      let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
+      return html$._Response._create_1(body, responseInitDict_1);
+    }
+    if (body != null) {
+      return html$._Response._create_2(body);
+    }
+    return html$._Response._create_3();
+  }
+  static _create_1(body, responseInitDict) {
+    return new Response(body, responseInitDict);
+  }
+  static _create_2(body) {
+    return new Response(body);
+  }
+  static _create_3() {
+    return new Response();
+  }
+};
+dart.setSignature(html$._Response, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._Response, []),
+    new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$._Response, [])
+  }),
+  names: ['_create_1', '_create_2', '_create_3']
+});
+dart.registerExtension(dart.global.Response, html$._Response);
+html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$._ServiceWorker, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
+});
+dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
+dart.setSignature(html$._SpeechRecognitionResultList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
+    [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
+  })
+});
+dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[index];
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__getter__](...args) {
+    return this.__getter__.apply(this, args);
+  }
+  [dartx.item](...args) {
+    return this.item.apply(this, args);
+  }
+};
+html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
+dart.setSignature(html$._StyleSheetList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
+    [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
+  })
+});
+dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
+html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._SubtleCrypto, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
+});
+dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
+html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(cssValue) {
+    if (cssValue === void 0) cssValue = null;
+    if (cssValue != null) {
+      return html$._WebKitCSSMatrix._create_1(cssValue);
+    }
+    return html$._WebKitCSSMatrix._create_2();
+  }
+  static _create_1(cssValue) {
+    return new WebKitCSSMatrix(cssValue);
+  }
+  static _create_2() {
+    return new WebKitCSSMatrix();
+  }
+};
+dart.setSignature(html$._WebKitCSSMatrix, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
+    new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
+  }),
+  statics: () => ({
+    _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
+  }),
+  names: ['_create_1', '_create_2']
+});
+dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
+html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._WindowTimers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
+});
+html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
+dart.setSignature(html$._WorkerLocation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
+});
+dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
+html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
+dart.setSignature(html$._WorkerNavigator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
+});
+dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
+html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(html$._XMLHttpRequestProgressEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
+});
+dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
+const _matches = Symbol('_matches');
+html$._AttributeMap = class _AttributeMap extends core.Object {
+  new(element) {
+    this[_element$] = element;
+  }
+  addAll(other) {
+    other[dartx.forEach](dart.fn((k, v) => {
+      this._set(k, v);
+    }, StringAndStringToNull()));
+  }
+  containsValue(value) {
+    for (let v of this.values) {
+      if (dart.equals(value, v)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  putIfAbsent(key, ifAbsent) {
+    if (!dart.test(this[dartx.containsKey](key))) {
+      this._set(key, ifAbsent());
+    }
+    return this._get(key);
+  }
+  clear() {
+    for (let key of this.keys) {
+      this[dartx.remove](key);
+    }
+  }
+  forEach(f) {
+    for (let key of this.keys) {
+      let value = this._get(key);
+      f(key, value);
+    }
+  }
+  get keys() {
+    let attributes = this[_element$][_attributes$];
+    let keys = JSArrayOfString().of([]);
+    for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
+      let attr = html$._Attr._check(attributes[dartx._get](i));
+      if (dart.test(this[_matches](attr))) {
+        keys[dartx.add](attr[dartx.name]);
+      }
+    }
+    return keys;
+  }
+  get values() {
+    let attributes = this[_element$][_attributes$];
+    let values = JSArrayOfString().of([]);
+    for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
+      let attr = html$._Attr._check(attributes[dartx._get](i));
+      if (dart.test(this[_matches](attr))) {
+        values[dartx.add](attr[dartx.value]);
+      }
+    }
+    return values;
+  }
+  get isEmpty() {
+    return this[dartx.length] == 0;
+  }
+  get isNotEmpty() {
+    return !dart.test(this.isEmpty);
+  }
+};
+html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$._AttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
+  getters: () => ({
+    keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    values: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
+    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+    putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
+  })
+});
+dart.defineExtensionMembers(html$._AttributeMap, [
+  'addAll',
+  'containsValue',
+  'putIfAbsent',
+  'clear',
+  'forEach',
+  'keys',
+  'values',
+  'isEmpty',
+  'isNotEmpty'
+]);
+html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
+  new(element) {
+    super.new(element);
+  }
+  containsKey(key) {
+    return this[_element$][_hasAttribute](core.String._check(key));
+  }
+  _get(key) {
+    return this[_element$][dartx.getAttribute](core.String._check(key));
+  }
+  _set(key, value) {
+    this[_element$][dartx.setAttribute](key, value);
+    return value;
+  }
+  remove(key) {
+    let value = this[_element$][dartx.getAttribute](core.String._check(key));
+    this[_element$][_removeAttribute](core.String._check(key));
+    return value;
+  }
+  get length() {
+    return this.keys[dartx.length];
+  }
+  [_matches](node) {
+    return node[_namespaceUri] == null;
+  }
+};
+dart.setSignature(html$._ElementAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
+  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+    _get: dart.definiteFunctionType(core.String, [core.Object]),
+    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    remove: dart.definiteFunctionType(core.String, [core.Object]),
+    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
+  })
+});
+dart.defineExtensionMembers(html$._ElementAttributeMap, [
+  'containsKey',
+  '_get',
+  '_set',
+  'remove',
+  'length'
+]);
+const _namespace = Symbol('_namespace');
+html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
+  new(element, namespace) {
+    this[_namespace] = namespace;
+    super.new(element);
+  }
+  containsKey(key) {
+    return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
+  }
+  _get(key) {
+    return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
+  }
+  _set(key, value) {
+    this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
+    return value;
+  }
+  remove(key) {
+    let value = this._get(key);
+    this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
+    return value;
+  }
+  get length() {
+    return this.keys[dartx.length];
+  }
+  [_matches](node) {
+    return node[_namespaceUri] == this[_namespace];
+  }
+};
+dart.setSignature(html$._NamespacedAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
+  fields: () => ({[_namespace]: core.String}),
+  getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
+  methods: () => ({
+    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+    _get: dart.definiteFunctionType(core.String, [core.Object]),
+    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    remove: dart.definiteFunctionType(core.String, [core.Object]),
+    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
+  })
+});
+dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
+  'containsKey',
+  '_get',
+  '_set',
+  'remove',
+  'length'
+]);
+const _attr = Symbol('_attr');
+const _strip = Symbol('_strip');
+const _toHyphenedName = Symbol('_toHyphenedName');
+const _toCamelCase = Symbol('_toCamelCase');
+html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
+  new(attributes) {
+    this[_attributes$] = attributes;
+  }
+  addAll(other) {
+    other[dartx.forEach](dart.fn((k, v) => {
+      this._set(k, v);
+    }, StringAndStringToNull()));
+  }
+  containsValue(value) {
+    return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
+  }
+  containsKey(key) {
+    return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
+  }
+  _get(key) {
+    return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
+  }
+  _set(key, value) {
+    this[_attributes$][dartx._set](this[_attr](key), value);
+    return value;
+  }
+  putIfAbsent(key, ifAbsent) {
+    return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
+  }
+  remove(key) {
+    return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
+  }
+  clear() {
+    for (let key of this.keys) {
+      this.remove(key);
+    }
+  }
+  forEach(f) {
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
+      if (dart.test(this[_matches](key))) {
+        f(this[_strip](key), value);
+      }
+    }, StringAndStringToNull()));
+  }
+  get keys() {
+    let keys = JSArrayOfString().of([]);
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
+      if (dart.test(this[_matches](key))) {
+        keys[dartx.add](this[_strip](key));
+      }
+    }, StringAndStringToNull()));
+    return keys;
+  }
+  get values() {
+    let values = JSArrayOfString().of([]);
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
+      if (dart.test(this[_matches](key))) {
+        values[dartx.add](value);
+      }
+    }, StringAndStringToNull()));
+    return values;
+  }
+  get length() {
+    return this.keys[dartx.length];
+  }
+  get isEmpty() {
+    return this.length == 0;
+  }
+  get isNotEmpty() {
+    return !dart.test(this.isEmpty);
+  }
+  [_attr](key) {
+    return dart.str`data-${this[_toHyphenedName](key)}`;
+  }
+  [_matches](key) {
+    return key[dartx.startsWith]('data-');
+  }
+  [_strip](key) {
+    return this[_toCamelCase](key[dartx.substring](5));
+  }
+  [_toCamelCase](hyphenedName, opts) {
+    let startUppercase = opts && 'startUppercase' in opts ? opts.startUppercase : false;
+    let segments = hyphenedName[dartx.split]('-');
+    let start = dart.test(startUppercase) ? 0 : 1;
+    for (let i = start; i < dart.notNull(segments[dartx.length]); i++) {
+      let segment = segments[dartx._get](i);
+      if (dart.notNull(segment[dartx.length]) > 0) {
+        segments[dartx._set](i, dart.str`${segment[dartx._get](0)[dartx.toUpperCase]()}${segment[dartx.substring](1)}`);
+      }
+    }
+    return segments[dartx.join]('');
+  }
+  [_toHyphenedName](word) {
+    let sb = new core.StringBuffer();
+    for (let i = 0; i < dart.notNull(word[dartx.length]); i++) {
+      let lower = word[dartx._get](i)[dartx.toLowerCase]();
+      if (word[dartx._get](i) != lower && i > 0) sb.write('-');
+      sb.write(lower);
+    }
+    return sb.toString();
+  }
+};
+html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$._DataAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
+  fields: () => ({[_attributes$]: MapOfString$String()}),
+  getters: () => ({
+    keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    values: dart.definiteFunctionType(core.Iterable$(core.String), []),
+    length: dart.definiteFunctionType(core.int, []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, [])
+  }),
+  methods: () => ({
+    addAll: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
+    containsValue: dart.definiteFunctionType(core.bool, [core.Object]),
+    containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
+    _get: dart.definiteFunctionType(core.String, [core.Object]),
+    _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    putIfAbsent: dart.definiteFunctionType(core.String, [core.String, VoidToString()]),
+    remove: dart.definiteFunctionType(core.String, [core.Object]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()]),
+    [_attr]: dart.definiteFunctionType(core.String, [core.String]),
+    [_matches]: dart.definiteFunctionType(core.bool, [core.String]),
+    [_strip]: dart.definiteFunctionType(core.String, [core.String]),
+    [_toCamelCase]: dart.definiteFunctionType(core.String, [core.String], {startUppercase: core.bool}),
+    [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
+  })
+});
+dart.defineExtensionMembers(html$._DataAttributeMap, [
+  'addAll',
+  'containsValue',
+  'containsKey',
+  '_get',
+  '_set',
+  'putIfAbsent',
+  'remove',
+  'clear',
+  'forEach',
+  'keys',
+  'values',
+  'length',
+  'isEmpty',
+  'isNotEmpty'
+]);
+html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
+html$.WindowBase = class WindowBase extends core.Object {};
+html$.WindowBase[dart.implements] = () => [html$.EventTarget];
+html$.LocationBase = class LocationBase extends core.Object {};
+html$.HistoryBase = class HistoryBase extends core.Object {};
+html$.CssClassSet = class CssClassSet extends core.Object {};
+html$.CssClassSet[dart.implements] = () => [SetOfString()];
+const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
+html$.CssRect = class CssRect extends core.Object {
+  new(element) {
+    this[_element$] = element;
+  }
+  set height(newHeight) {
+    dart.throw(new core.UnsupportedError("Can only set height for content rect."));
+  }
+  set width(newWidth) {
+    dart.throw(new core.UnsupportedError("Can only set width for content rect."));
+  }
+  [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
+    let styles = this[_element$][dartx.getComputedStyle]();
+    let val = 0;
+    for (let measurement of dimensions) {
+      if (augmentingMeasurement == html$._MARGIN) {
+        val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
+      }
+      if (augmentingMeasurement == html$._CONTENT) {
+        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
+      }
+      if (augmentingMeasurement != html$._MARGIN) {
+        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
+      }
+    }
+    return val;
+  }
+  get right() {
+    return dart.notNull(this.left) + dart.notNull(this.width);
+  }
+  get bottom() {
+    return dart.notNull(this.top) + dart.notNull(this.height);
+  }
+  toString() {
+    return dart.str`Rectangle (${this.left}, ${this.top}) ${this.width} x ${this.height}`;
+  }
+  ['=='](other) {
+    if (!RectangleOfnum().is(other)) return false;
+    return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
+  }
+  get hashCode() {
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
+  }
+  intersection(other) {
+    let x0 = math.max(core.num)(this.left, other[dartx.left]);
+    let x1 = math.min(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    if (dart.notNull(x0) <= dart.notNull(x1)) {
+      let y0 = math.max(core.num)(this.top, other[dartx.top]);
+      let y1 = math.min(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+      if (dart.notNull(y0) <= dart.notNull(y1)) {
+        return new (RectangleOfnum())(x0, y0, dart.notNull(x1) - dart.notNull(x0), dart.notNull(y1) - dart.notNull(y0));
+      }
+    }
+    return null;
+  }
+  intersects(other) {
+    return dart.notNull(this.left) <= dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]) && dart.notNull(other[dartx.left]) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(this.top) <= dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]) && dart.notNull(other[dartx.top]) <= dart.notNull(this.top) + dart.notNull(this.height);
+  }
+  boundingBox(other) {
+    let right = math.max(core.num)(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(other[dartx.left]) + dart.notNull(other[dartx.width]));
+    let bottom = math.max(core.num)(dart.notNull(this.top) + dart.notNull(this.height), dart.notNull(other[dartx.top]) + dart.notNull(other[dartx.height]));
+    let left = math.min(core.num)(this.left, other[dartx.left]);
+    let top = math.min(core.num)(this.top, other[dartx.top]);
+    return new (RectangleOfnum())(left, top, dart.notNull(right) - dart.notNull(left), dart.notNull(bottom) - dart.notNull(top));
+  }
+  containsRectangle(another) {
+    return dart.notNull(this.left) <= dart.notNull(another[dartx.left]) && dart.notNull(this.left) + dart.notNull(this.width) >= dart.notNull(another[dartx.left]) + dart.notNull(another[dartx.width]) && dart.notNull(this.top) <= dart.notNull(another[dartx.top]) && dart.notNull(this.top) + dart.notNull(this.height) >= dart.notNull(another[dartx.top]) + dart.notNull(another[dartx.height]);
+  }
+  containsPoint(another) {
+    return dart.notNull(another.x) >= dart.notNull(this.left) && dart.notNull(another.x) <= dart.notNull(this.left) + dart.notNull(this.width) && dart.notNull(another.y) >= dart.notNull(this.top) && dart.notNull(another.y) <= dart.notNull(this.top) + dart.notNull(this.height);
+  }
+  get topLeft() {
+    return new (PointOfnum())(this.left, this.top);
+  }
+  get topRight() {
+    return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), this.top);
+  }
+  get bottomRight() {
+    return new (PointOfnum())(dart.notNull(this.left) + dart.notNull(this.width), dart.notNull(this.top) + dart.notNull(this.height));
+  }
+  get bottomLeft() {
+    return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
+  }
+};
+html$.CssRect[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$.CssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
+  getters: () => ({
+    right: dart.definiteFunctionType(core.num, []),
+    bottom: dart.definiteFunctionType(core.num, []),
+    topLeft: dart.definiteFunctionType(math.Point$(core.num), []),
+    topRight: dart.definiteFunctionType(math.Point$(core.num), []),
+    bottomRight: dart.definiteFunctionType(math.Point$(core.num), []),
+    bottomLeft: dart.definiteFunctionType(math.Point$(core.num), [])
+  }),
+  setters: () => ({
+    height: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    width: dart.definiteFunctionType(dart.void, [dart.dynamic])
+  }),
+  methods: () => ({
+    [_addOrSubtractToBoxModel]: dart.definiteFunctionType(core.num, [ListOfString(), core.String]),
+    intersection: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    intersects: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    boundingBox: dart.definiteFunctionType(math.Rectangle$(core.num), [RectangleOfnum()]),
+    containsRectangle: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
+    containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
+  })
+});
+dart.defineExtensionMembers(html$.CssRect, [
+  'toString',
+  '==',
+  'intersection',
+  'intersects',
+  'boundingBox',
+  'containsRectangle',
+  'containsPoint',
+  'right',
+  'bottom',
+  'hashCode',
+  'topLeft',
+  'topRight',
+  'bottomRight',
+  'bottomLeft'
+]);
+html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
+  new(element) {
+    super.new(element);
+  }
+  get height() {
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
+  }
+  get width() {
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
+  }
+  set height(newHeight) {
+    if (html$.Dimension.is(newHeight)) {
+      if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
+      this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
+    } else if (typeof newHeight == 'number') {
+      if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
+      this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
+    } else {
+      dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
+    }
+  }
+  set width(newWidth) {
+    if (html$.Dimension.is(newWidth)) {
+      if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
+      this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
+    } else if (typeof newWidth == 'number') {
+      if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
+      this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
+    } else {
+      dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
+    }
+  }
+  get left() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
+  }
+  get top() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
+  }
+};
+dart.setSignature(html$._ContentCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
+  getters: () => ({
+    height: dart.definiteFunctionType(core.num, []),
+    width: dart.definiteFunctionType(core.num, []),
+    left: dart.definiteFunctionType(core.num, []),
+    top: dart.definiteFunctionType(core.num, [])
+  })
+});
+dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
+const _elementList = Symbol('_elementList');
+html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
+  new(elementList) {
+    this[_elementList] = null;
+    super.new(elementList[dartx.first]);
+    this[_elementList] = elementList;
+  }
+  set height(newHeight) {
+    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
+  }
+  get height() {
+    return super.height;
+  }
+  set width(newWidth) {
+    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
+  }
+  get width() {
+    return super.width;
+  }
+};
+dart.setSignature(html$._ContentCssListRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
+  fields: () => ({[_elementList]: ListOfElement()})
+});
+html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
+  new(element) {
+    super.new(html$.Element._check(element));
+  }
+  get height() {
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
+  }
+  set height(value) {
+    super.height = value;
+  }
+  get width() {
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
+  }
+  set width(value) {
+    super.width = value;
+  }
+  get left() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
+  }
+  get top() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
+  }
+};
+dart.setSignature(html$._PaddingCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
+  getters: () => ({
+    height: dart.definiteFunctionType(core.num, []),
+    width: dart.definiteFunctionType(core.num, []),
+    left: dart.definiteFunctionType(core.num, []),
+    top: dart.definiteFunctionType(core.num, [])
+  })
+});
+dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
+html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
+  new(element) {
+    super.new(html$.Element._check(element));
+  }
+  get height() {
+    return this[_element$][dartx.offsetHeight];
+  }
+  set height(value) {
+    super.height = value;
+  }
+  get width() {
+    return this[_element$][dartx.offsetWidth];
+  }
+  set width(value) {
+    super.width = value;
+  }
+  get left() {
+    return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
+  }
+  get top() {
+    return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
+  }
+};
+dart.setSignature(html$._BorderCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
+  getters: () => ({
+    height: dart.definiteFunctionType(core.num, []),
+    width: dart.definiteFunctionType(core.num, []),
+    left: dart.definiteFunctionType(core.num, []),
+    top: dart.definiteFunctionType(core.num, [])
+  })
+});
+dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
+html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
+  new(element) {
+    super.new(html$.Element._check(element));
+  }
+  get height() {
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
+  }
+  set height(value) {
+    super.height = value;
+  }
+  get width() {
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
+  }
+  set width(value) {
+    super.width = value;
+  }
+  get left() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
+  }
+  get top() {
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
+  }
+};
+dart.setSignature(html$._MarginCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
+  getters: () => ({
+    height: dart.definiteFunctionType(core.num, []),
+    width: dart.definiteFunctionType(core.num, []),
+    left: dart.definiteFunctionType(core.num, []),
+    top: dart.definiteFunctionType(core.num, [])
+  })
+});
+dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
+dart.defineLazy(html$, {
+  get _HEIGHT() {
+    return JSArrayOfString().of(['top', 'bottom']);
+  }
+});
+dart.defineLazy(html$, {
+  get _WIDTH() {
+    return JSArrayOfString().of(['right', 'left']);
+  }
+});
+html$._CONTENT = 'content';
+html$._PADDING = 'padding';
+html$._MARGIN = 'margin';
+const _sets = Symbol('_sets');
+const _validateToken = Symbol('_validateToken');
+html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
+  [_validateToken](value) {
+    if (dart.test(html_common.CssClassSetImpl._validTokenRE.hasMatch(value))) return value;
+    dart.throw(new core.ArgumentError.value(value, 'value', 'Not a valid class token'));
+  }
+  toString() {
+    return this.readClasses().join(' ');
+  }
+  toggle(value, shouldAdd) {
+    if (shouldAdd === void 0) shouldAdd = null;
+    this[_validateToken](value);
+    let s = this.readClasses();
+    let result = false;
+    if (shouldAdd == null) shouldAdd = !dart.test(s.contains(value));
+    if (dart.test(shouldAdd)) {
+      s.add(value);
+      result = true;
+    } else {
+      s.remove(value);
+    }
+    this.writeClasses(s);
+    return result;
+  }
+  get frozen() {
+    return false;
+  }
+  get iterator() {
+    return this.readClasses().iterator;
+  }
+  [Symbol.iterator]() {
+    return new dart.JsIterator(this.iterator);
+  }
+  forEach(f) {
+    this.readClasses().forEach(f);
+  }
+  join(separator) {
+    if (separator === void 0) separator = "";
+    return this.readClasses().join(separator);
+  }
+  map(T) {
+    return f => {
+      return this.readClasses().map(T)(f);
+    };
+  }
+  where(f) {
+    return this.readClasses().where(f);
+  }
+  expand(T) {
+    return f => {
+      return this.readClasses().expand(T)(f);
+    };
+  }
+  every(f) {
+    return this.readClasses().every(f);
+  }
+  any(f) {
+    return this.readClasses().any(f);
+  }
+  get isEmpty() {
+    return this.readClasses().isEmpty;
+  }
+  get isNotEmpty() {
+    return this.readClasses().isNotEmpty;
+  }
+  get length() {
+    return this.readClasses().length;
+  }
+  reduce(combine) {
+    return this.readClasses().reduce(combine);
+  }
+  fold(T) {
+    return (initialValue, combine) => {
+      return this.readClasses().fold(T)(initialValue, combine);
+    };
+  }
+  contains(value) {
+    if (!(typeof value == 'string')) return false;
+    this[_validateToken](core.String._check(value));
+    return this.readClasses().contains(value);
+  }
+  lookup(value) {
+    return core.String._check(dart.test(this.contains(value)) ? value : null);
+  }
+  add(value) {
+    this[_validateToken](value);
+    return core.bool._check(this.modify(dart.fn(s => s.add(value), SetOfStringTobool())));
+  }
+  remove(value) {
+    this[_validateToken](core.String._check(value));
+    if (!(typeof value == 'string')) return false;
+    let s = this.readClasses();
+    let result = s.remove(value);
+    this.writeClasses(s);
+    return result;
+  }
+  addAll(iterable) {
+    this.modify(dart.fn(s => s.addAll(iterable[dartx.map](core.String)(dart.bind(this, _validateToken))), SetOfStringTovoid()));
+  }
+  removeAll(iterable) {
+    this.modify(dart.fn(s => s.removeAll(iterable), SetOfStringTovoid()));
+  }
+  toggleAll(iterable, shouldAdd) {
+    if (shouldAdd === void 0) shouldAdd = null;
+    iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
+  }
+  retainAll(iterable) {
+    this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
+  }
+  removeWhere(test) {
+    this.modify(dart.fn(s => s.removeWhere(test), SetOfStringTovoid()));
+  }
+  retainWhere(test) {
+    this.modify(dart.fn(s => s.retainWhere(test), SetOfStringTovoid()));
+  }
+  containsAll(collection) {
+    return this.readClasses().containsAll(collection);
+  }
+  intersection(other) {
+    return this.readClasses().intersection(other);
+  }
+  union(other) {
+    return this.readClasses().union(other);
+  }
+  difference(other) {
+    return this.readClasses().difference(other);
+  }
+  get first() {
+    return this.readClasses().first;
+  }
+  get last() {
+    return this.readClasses().last;
+  }
+  get single() {
+    return this.readClasses().single;
+  }
+  toList(opts) {
+    let growable = opts && 'growable' in opts ? opts.growable : true;
+    return this.readClasses().toList({growable: growable});
+  }
+  toSet() {
+    return this.readClasses().toSet();
+  }
+  take(n) {
+    return this.readClasses().take(n);
+  }
+  takeWhile(test) {
+    return this.readClasses().takeWhile(test);
+  }
+  skip(n) {
+    return this.readClasses().skip(n);
+  }
+  skipWhile(test) {
+    return this.readClasses().skipWhile(test);
+  }
+  firstWhere(test, opts) {
+    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+    return this.readClasses().firstWhere(test, {orElse: orElse});
+  }
+  lastWhere(test, opts) {
+    let orElse = opts && 'orElse' in opts ? opts.orElse : null;
+    return this.readClasses().lastWhere(test, {orElse: orElse});
+  }
+  singleWhere(test) {
+    return this.readClasses().singleWhere(test);
+  }
+  elementAt(index) {
+    return this.readClasses().elementAt(index);
+  }
+  clear() {
+    this.modify(dart.fn(s => s.clear(), SetOfStringTovoid()));
+  }
+  modify(f) {
+    let s = this.readClasses();
+    let ret = f(s);
+    this.writeClasses(s);
+    return ret;
+  }
+};
+html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
+dart.setSignature(html_common.CssClassSetImpl, {
+  getters: () => ({
+    frozen: dart.definiteFunctionType(core.bool, []),
+    iterator: dart.definiteFunctionType(core.Iterator$(core.String), []),
+    isEmpty: dart.definiteFunctionType(core.bool, []),
+    isNotEmpty: dart.definiteFunctionType(core.bool, []),
+    length: dart.definiteFunctionType(core.int, []),
+    first: dart.definiteFunctionType(core.String, []),
+    last: dart.definiteFunctionType(core.String, []),
+    single: dart.definiteFunctionType(core.String, [])
+  }),
+  methods: () => ({
+    [_validateToken]: dart.definiteFunctionType(core.String, [core.String]),
+    toggle: dart.definiteFunctionType(core.bool, [core.String], [core.bool]),
+    forEach: dart.definiteFunctionType(dart.void, [StringTovoid()]),
+    join: dart.definiteFunctionType(core.String, [], [core.String]),
+    map: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(T, [core.String])]]),
+    where: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
+    expand: dart.definiteFunctionType(T => [core.Iterable$(T), [dart.functionType(core.Iterable$(T), [core.String])]]),
+    every: dart.definiteFunctionType(core.bool, [StringTobool()]),
+    any: dart.definiteFunctionType(core.bool, [StringTobool()]),
+    reduce: dart.definiteFunctionType(core.String, [StringAndStringToString()]),
+    fold: dart.definiteFunctionType(T => [T, [T, dart.functionType(T, [T, core.String])]]),
+    contains: dart.definiteFunctionType(core.bool, [core.Object]),
+    lookup: dart.definiteFunctionType(core.String, [core.Object]),
+    add: dart.definiteFunctionType(core.bool, [core.String]),
+    remove: dart.definiteFunctionType(core.bool, [core.Object]),
+    addAll: dart.definiteFunctionType(dart.void, [IterableOfString()]),
+    removeAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
+    toggleAll: dart.definiteFunctionType(dart.void, [IterableOfString()], [core.bool]),
+    retainAll: dart.definiteFunctionType(dart.void, [IterableOfObject()]),
+    removeWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
+    retainWhere: dart.definiteFunctionType(dart.void, [StringTobool()]),
+    containsAll: dart.definiteFunctionType(core.bool, [IterableOfObject()]),
+    intersection: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
+    union: dart.definiteFunctionType(core.Set$(core.String), [SetOfString()]),
+    difference: dart.definiteFunctionType(core.Set$(core.String), [SetOfObject()]),
+    toList: dart.definiteFunctionType(core.List$(core.String), [], {growable: core.bool}),
+    toSet: dart.definiteFunctionType(core.Set$(core.String), []),
+    take: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
+    takeWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
+    skip: dart.definiteFunctionType(core.Iterable$(core.String), [core.int]),
+    skipWhile: dart.definiteFunctionType(core.Iterable$(core.String), [StringTobool()]),
+    firstWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
+    lastWhere: dart.definiteFunctionType(core.String, [StringTobool()], {orElse: VoidToString()}),
+    singleWhere: dart.definiteFunctionType(core.String, [StringTobool()]),
+    elementAt: dart.definiteFunctionType(core.String, [core.int]),
+    clear: dart.definiteFunctionType(dart.void, []),
+    modify: dart.definiteFunctionType(dart.dynamic, [SetOfStringTodynamic()])
+  }),
+  sfields: () => ({_validTokenRE: core.RegExp})
+});
+dart.defineExtensionMembers(html_common.CssClassSetImpl, [
+  'toString',
+  'forEach',
+  'join',
+  'map',
+  'where',
+  'expand',
+  'every',
+  'any',
+  'reduce',
+  'fold',
+  'contains',
+  'toList',
+  'toSet',
+  'take',
+  'takeWhile',
+  'skip',
+  'skipWhile',
+  'firstWhere',
+  'lastWhere',
+  'singleWhere',
+  'elementAt',
+  'iterator',
+  'isEmpty',
+  'isNotEmpty',
+  'length',
+  'first',
+  'last',
+  'single'
+]);
+dart.defineLazy(html_common.CssClassSetImpl, {
+  get _validTokenRE() {
+    return core.RegExp.new('^\\S+$');
+  }
+});
+html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
+  static new(elements) {
+    return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
+  }
+  _(elementIterable, sets) {
+    this[_elementIterable] = elementIterable;
+    this[_sets] = sets;
+  }
+  readClasses() {
+    let s = LinkedHashSetOfString().new();
+    this[_sets][dartx.forEach](dart.fn(e => s.addAll(e.readClasses()), CssClassSetImplTovoid()));
+    return s;
+  }
+  writeClasses(s) {
+    let classes = s.join(' ');
+    for (let e of this[_elementIterable]) {
+      e[dartx.className] = classes;
+    }
+  }
+  modify(f) {
+    this[_sets][dartx.forEach](dart.fn(e => e.modify(f), CssClassSetImplTovoid()));
+  }
+  toggle(value, shouldAdd) {
+    if (shouldAdd === void 0) shouldAdd = null;
+    return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.toggle(value, shouldAdd)) || dart.test(changed), boolAndCssClassSetImplTobool()));
+  }
+  remove(value) {
+    return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
+  }
+};
+dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
+dart.setSignature(html$._MultiElementCssClassSet, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
+    _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
+  }),
+  fields: () => ({
+    [_elementIterable]: IterableOfElement(),
+    [_sets]: ListOfCssClassSetImpl()
+  }),
+  methods: () => ({
+    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
+    writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
+  })
+});
+html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
+  new(element) {
+    this[_element$] = element;
+  }
+  readClasses() {
+    let s = LinkedHashSetOfString().new();
+    let classname = this[_element$][dartx.className];
+    for (let name of classname[dartx.split](' ')) {
+      let trimmed = name[dartx.trim]();
+      if (!dart.test(trimmed[dartx.isEmpty])) {
+        s.add(trimmed);
+      }
+    }
+    return s;
+  }
+  writeClasses(s) {
+    this[_element$][dartx.className] = s.join(' ');
+  }
+  get length() {
+    return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
+  }
+  get isEmpty() {
+    return this.length == 0;
+  }
+  get isNotEmpty() {
+    return this.length != 0;
+  }
+  clear() {
+    this[_element$][dartx.className] = '';
+  }
+  contains(value) {
+    return html$._ElementCssClassSet._contains(this[_element$], value);
+  }
+  add(value) {
+    return html$._ElementCssClassSet._add(this[_element$], value);
+  }
+  remove(value) {
+    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
+  }
+  toggle(value, shouldAdd) {
+    if (shouldAdd === void 0) shouldAdd = null;
+    return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
+  }
+  addAll(iterable) {
+    html$._ElementCssClassSet._addAll(this[_element$], iterable);
+  }
+  removeAll(iterable) {
+    html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
+  }
+  retainAll(iterable) {
+    html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
+  }
+  removeWhere(test) {
+    html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
+  }
+  retainWhere(test) {
+    html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
+  }
+  static _contains(_element, value) {
+    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
+  }
+  static _add(_element, value) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
+    html$._ElementCssClassSet._classListAdd(list, value);
+    return added;
+  }
+  static _remove(_element, value) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
+    html$._ElementCssClassSet._classListRemove(list, value);
+    return removed;
+  }
+  static _toggle(_element, value, shouldAdd) {
+    return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
+  }
+  static _toggleDefault(_element, value) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    return html$._ElementCssClassSet._classListToggle1(list, value);
+  }
+  static _toggleOnOff(_element, value, shouldAdd) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    if (dart.test(shouldAdd)) {
+      html$._ElementCssClassSet._classListAdd(list, value);
+      return true;
+    } else {
+      html$._ElementCssClassSet._classListRemove(list, value);
+      return false;
+    }
+  }
+  static _addAll(_element, iterable) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    for (let value of iterable) {
+      html$._ElementCssClassSet._classListAdd(list, value);
+    }
+  }
+  static _removeAll(_element, iterable) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    for (let value of iterable) {
+      html$._ElementCssClassSet._classListRemove(list, value);
+    }
+  }
+  static _removeWhere(_element, test, doRemove) {
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    let i = 0;
+    while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
+      let item = list[dartx.item](i);
+      if (doRemove == test(item)) {
+        html$._ElementCssClassSet._classListRemove(list, item);
+      } else {
+        ++i;
+      }
+    }
+  }
+  static _classListOf(e) {
+    return e.classList;
+  }
+  static _classListLength(list) {
+    return list.length;
+  }
+  static _classListContains(list, value) {
+    return list.contains(value);
+  }
+  static _classListContainsBeforeAddOrRemove(list, value) {
+    return list.contains(value);
+  }
+  static _classListAdd(list, value) {
+    list.add(value);
+  }
+  static _classListRemove(list, value) {
+    list.remove(value);
+  }
+  static _classListToggle1(list, value) {
+    return list.toggle(value);
+  }
+  static _classListToggle2(list, value, shouldAdd) {
+    return list.toggle(value, shouldAdd);
+  }
+};
+dart.setSignature(html$._ElementCssClassSet, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
+  methods: () => ({
+    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
+    writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
+  }),
+  statics: () => ({
+    _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
+    _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
+    _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
+    _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
+    _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
+    _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
+    _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
+    _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
+    _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
+    _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
+    _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
+  }),
+  names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
+});
+dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
+const _unit = Symbol('_unit');
+html$.Dimension = class Dimension extends core.Object {
+  percent(value) {
+    this[_value$2] = value;
+    this[_unit] = '%';
+  }
+  px(value) {
+    this[_value$2] = value;
+    this[_unit] = 'px';
+  }
+  pc(value) {
+    this[_value$2] = value;
+    this[_unit] = 'pc';
+  }
+  pt(value) {
+    this[_value$2] = value;
+    this[_unit] = 'pt';
+  }
+  inch(value) {
+    this[_value$2] = value;
+    this[_unit] = 'in';
+  }
+  cm(value) {
+    this[_value$2] = value;
+    this[_unit] = 'cm';
+  }
+  mm(value) {
+    this[_value$2] = value;
+    this[_unit] = 'mm';
+  }
+  em(value) {
+    this[_value$2] = value;
+    this[_unit] = 'em';
+  }
+  ex(value) {
+    this[_value$2] = value;
+    this[_unit] = 'ex';
+  }
+  css(cssValue) {
+    this[_value$2] = null;
+    this[_unit] = null;
+    if (cssValue == '') cssValue = '0px';
+    if (dart.test(cssValue[dartx.endsWith]('%'))) {
+      this[_unit] = '%';
+    } else {
+      this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
+    }
+    if (dart.test(cssValue[dartx.contains]('.'))) {
+      this[_value$2] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+    } else {
+      this[_value$2] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+    }
+  }
+  toString() {
+    return dart.str`${this[_value$2]}${this[_unit]}`;
+  }
+  get value() {
+    return this[_value$2];
+  }
+};
+dart.defineNamedConstructor(html$.Dimension, 'percent');
+dart.defineNamedConstructor(html$.Dimension, 'px');
+dart.defineNamedConstructor(html$.Dimension, 'pc');
+dart.defineNamedConstructor(html$.Dimension, 'pt');
+dart.defineNamedConstructor(html$.Dimension, 'inch');
+dart.defineNamedConstructor(html$.Dimension, 'cm');
+dart.defineNamedConstructor(html$.Dimension, 'mm');
+dart.defineNamedConstructor(html$.Dimension, 'em');
+dart.defineNamedConstructor(html$.Dimension, 'ex');
+dart.defineNamedConstructor(html$.Dimension, 'css');
+dart.setSignature(html$.Dimension, {
+  constructors: () => ({
+    percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    px: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    em: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    css: dart.definiteFunctionType(html$.Dimension, [core.String])
+  }),
+  fields: () => ({
+    [_value$2]: core.num,
+    [_unit]: core.String
+  }),
+  getters: () => ({value: dart.definiteFunctionType(core.num, [])})
+});
+html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
+html$.EventStreamProvider$ = dart.generic(T => {
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
+  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
+  class EventStreamProvider extends core.Object {
+    new(eventType) {
+      this[_eventType] = eventType;
+    }
+    forTarget(e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_EventStreamOfT())(e, this[_eventType], useCapture);
+    }
+    forElement(e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_ElementEventStreamImplOfT())(e, this[_eventType], useCapture);
+    }
+    [_forElementList](e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_ElementListEventStreamImplOfT())(e, this[_eventType], useCapture);
+    }
+    getEventType(target) {
+      return this[_eventType];
+    }
+  }
+  dart.addTypeTests(EventStreamProvider);
+  dart.setSignature(EventStreamProvider, {
+    constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
+    fields: () => ({[_eventType]: core.String}),
+    methods: () => ({
+      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
+      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
+      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
+      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
+    })
+  });
+  return EventStreamProvider;
+});
+html$.EventStreamProvider = EventStreamProvider();
+html$.ElementStream$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class ElementStream extends core.Object {}
+  dart.addTypeTests(ElementStream);
+  ElementStream[dart.implements] = () => [StreamOfT()];
+  return ElementStream;
+});
+html$.ElementStream = ElementStream();
+const _target$0 = Symbol('_target');
+const _useCapture = Symbol('_useCapture');
+html$._EventStream$ = dart.generic(T => {
+  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _EventStream extends async.Stream$(T) {
+    new(target, eventType, useCapture) {
+      this[_target$0] = target;
+      this[_eventType] = eventType;
+      this[_useCapture] = useCapture;
+      super.new();
+    }
+    asBroadcastStream(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      return this;
+    }
+    get isBroadcast() {
+      return true;
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, this[_useCapture]);
+    }
+  }
+  dart.setSignature(_EventStream, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
+    fields: () => ({
+      [_target$0]: html$.EventTarget,
+      [_eventType]: core.String,
+      [_useCapture]: core.bool
+    }),
+    methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
+  });
+  return _EventStream;
+});
+html$._EventStream = _EventStream();
+html$._matchesWithAncestors = function(event, selector) {
+  let target = event[dartx.target];
+  return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
+};
+dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
+html$._ElementEventStreamImpl$ = dart.generic(T => {
+  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
+  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
+  let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
+  class _ElementEventStreamImpl extends html$._EventStream$(T) {
+    new(target, eventType, useCapture) {
+      super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
+    }
+    matches(selector) {
+      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
+        e[_selector] = selector;
+        return e;
+      }, TToT()));
+    }
+    capture(onData) {
+      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, true);
+    }
+  }
+  _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
+  dart.setSignature(_ElementEventStreamImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
+    methods: () => ({
+      matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
+      capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
+    })
+  });
+  return _ElementEventStreamImpl;
+});
+html$._ElementEventStreamImpl = _ElementEventStreamImpl();
+const _targetList = Symbol('_targetList');
+html$._ElementListEventStreamImpl$ = dart.generic(T => {
+  let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
+  let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
+  let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
+  class _ElementListEventStreamImpl extends async.Stream$(T) {
+    new(targetList, eventType, useCapture) {
+      this[_targetList] = targetList;
+      this[_eventType] = eventType;
+      this[_useCapture] = useCapture;
+      super.new();
+    }
+    matches(selector) {
+      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
+        e[_selector] = selector;
+        return e;
+      }, TToT()));
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      let pool = new (_StreamPoolOfT()).broadcast();
+      for (let target of this[_targetList]) {
+        pool.add(new (_EventStreamOfT())(target, this[_eventType], this[_useCapture]));
+      }
+      return pool.stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }
+    capture(onData) {
+      let pool = new (_StreamPoolOfT()).broadcast();
+      for (let target of this[_targetList]) {
+        pool.add(new (_EventStreamOfT())(target, this[_eventType], true));
+      }
+      return pool.stream.listen(onData);
+    }
+    asBroadcastStream(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      return this;
+    }
+    get isBroadcast() {
+      return true;
+    }
+  }
+  _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
+  dart.setSignature(_ElementListEventStreamImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
+    fields: () => ({
+      [_targetList]: IterableOfElement(),
+      [_useCapture]: core.bool,
+      [_eventType]: core.String
+    }),
+    methods: () => ({
+      matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
+      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+      capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
+    })
+  });
+  return _ElementListEventStreamImpl;
+});
+html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
+html$._EventListener$ = dart.generic(T => {
+  const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
+  return _EventListener;
+});
+html$._EventListener = _EventListener();
+const _onData$0 = Symbol('_onData');
+const _pauseCount$0 = Symbol('_pauseCount');
+const _tryResume = Symbol('_tryResume');
+const _canceled = Symbol('_canceled');
+const _unlisten = Symbol('_unlisten');
+html$._EventStreamSubscription$ = dart.generic(T => {
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  class _EventStreamSubscription extends async.StreamSubscription$(T) {
+    new(target, eventType, onData, useCapture) {
+      this[_target$0] = target;
+      this[_eventType] = eventType;
+      this[_useCapture] = useCapture;
+      this[_onData$0] = onData == null ? null : html$._wrapZone(html$.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
+      this[_pauseCount$0] = 0;
+      this[_tryResume]();
+    }
+    cancel() {
+      if (dart.test(this[_canceled])) return null;
+      this[_unlisten]();
+      this[_target$0] = null;
+      this[_onData$0] = null;
+      return null;
+    }
+    get [_canceled]() {
+      return this[_target$0] == null;
+    }
+    onData(handleData) {
+      if (dart.test(this[_canceled])) {
+        dart.throw(new core.StateError("Subscription has been canceled."));
+      }
+      this[_unlisten]();
+      this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
+      this[_tryResume]();
+    }
+    onError(handleError) {}
+    onDone(handleDone) {}
+    pause(resumeSignal) {
+      if (resumeSignal === void 0) resumeSignal = null;
+      if (dart.test(this[_canceled])) return;
+      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
+      this[_unlisten]();
+      if (resumeSignal != null) {
+        resumeSignal.whenComplete(dart.bind(this, 'resume'));
+      }
+    }
+    get isPaused() {
+      return dart.notNull(this[_pauseCount$0]) > 0;
+    }
+    resume() {
+      if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
+      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
+      this[_tryResume]();
+    }
+    [_tryResume]() {
+      if (this[_onData$0] != null && !dart.test(this.isPaused)) {
+        this[_target$0][dartx.addEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
+      }
+    }
+    [_unlisten]() {
+      if (this[_onData$0] != null) {
+        this[_target$0][dartx.removeEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
+      }
+    }
+    asFuture(E) {
+      return futureValue => {
+        if (futureValue === void 0) futureValue = null;
+        let completer = async.Completer$(E).new();
+        return completer.future;
+      };
+    }
+  }
+  dart.setSignature(_EventStreamSubscription, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
+    fields: () => ({
+      [_pauseCount$0]: core.int,
+      [_target$0]: html$.EventTarget,
+      [_eventType]: core.String,
+      [_onData$0]: html$.EventListener,
+      [_useCapture]: core.bool
+    }),
+    getters: () => ({
+      [_canceled]: dart.definiteFunctionType(core.bool, []),
+      isPaused: dart.definiteFunctionType(core.bool, [])
+    }),
+    methods: () => ({
+      cancel: dart.definiteFunctionType(async.Future, []),
+      onData: dart.definiteFunctionType(dart.void, [TTovoid()]),
+      onError: dart.definiteFunctionType(dart.void, [core.Function]),
+      onDone: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      pause: dart.definiteFunctionType(dart.void, [], [async.Future]),
+      resume: dart.definiteFunctionType(dart.void, []),
+      [_tryResume]: dart.definiteFunctionType(dart.void, []),
+      [_unlisten]: dart.definiteFunctionType(dart.void, []),
+      asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]])
+    })
+  });
+  return _EventStreamSubscription;
+});
+html$._EventStreamSubscription = _EventStreamSubscription();
+html$.CustomStream$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  class CustomStream extends core.Object {}
+  dart.addTypeTests(CustomStream);
+  CustomStream[dart.implements] = () => [StreamOfT()];
+  return CustomStream;
+});
+html$.CustomStream = CustomStream();
+const _streamController = Symbol('_streamController');
+const _type$ = Symbol('_type');
+html$._CustomEventStreamImpl$ = dart.generic(T => {
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
+  let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
+  class _CustomEventStreamImpl extends async.Stream$(T) {
+    new(type) {
+      this[_streamController] = null;
+      this[_type$] = null;
+      super.new();
+      this[_type$] = type;
+      this[_streamController] = StreamControllerOfT().broadcast({sync: true});
+    }
+    listen(onData, opts) {
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let onDone = opts && 'onDone' in opts ? opts.onDone : null;
+      let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
+      return this[_streamController].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }
+    asBroadcastStream(opts) {
+      let onListen = opts && 'onListen' in opts ? opts.onListen : null;
+      let onCancel = opts && 'onCancel' in opts ? opts.onCancel : null;
+      return this[_streamController].stream;
+    }
+    get isBroadcast() {
+      return true;
+    }
+    add(event) {
+      T._check(event);
+      if (event[dartx.type] == this[_type$]) this[_streamController].add(event);
+    }
+  }
+  _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
+  dart.setSignature(_CustomEventStreamImpl, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
+    fields: () => ({
+      [_streamController]: StreamControllerOfT(),
+      [_type$]: core.String
+    }),
+    methods: () => ({
+      listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
+      add: dart.definiteFunctionType(dart.void, [T])
+    })
+  });
+  return _CustomEventStreamImpl;
+});
+html$._CustomEventStreamImpl = _CustomEventStreamImpl();
+const _parent$ = Symbol('_parent');
+const _shadowKeyCode = Symbol('_shadowKeyCode');
+const _shadowCharCode = Symbol('_shadowCharCode');
+const _shadowAltKey = Symbol('_shadowAltKey');
+const _realKeyCode = Symbol('_realKeyCode');
+const _realCharCode = Symbol('_realCharCode');
+const _realAltKey = Symbol('_realAltKey');
+const _currentTarget = Symbol('_currentTarget');
+const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
+html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
+  get keyCode() {
+    return this[_shadowKeyCode];
+  }
+  get charCode() {
+    return this.type == 'keypress' ? this[_shadowCharCode] : 0;
+  }
+  get altKey() {
+    return this[_shadowAltKey];
+  }
+  get which() {
+    return this.keyCode;
+  }
+  get [_realKeyCode]() {
+    return this[_parent$].keyCode;
+  }
+  get [_realCharCode]() {
+    return this[_parent$].charCode;
+  }
+  get [_realAltKey]() {
+    return this[_parent$].altKey;
+  }
+  static _makeRecord() {
+    let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
+    return _js_helper.makeLeafDispatchRecord(interceptor);
+  }
+  wrap(parent) {
+    this[_parent$] = null;
+    this[_shadowAltKey] = null;
+    this[_shadowCharCode] = null;
+    this[_shadowKeyCode] = null;
+    this[_currentTarget] = null;
+    super.new(parent);
+    this[_parent$] = parent;
+    this[_shadowAltKey] = this[_realAltKey];
+    this[_shadowCharCode] = this[_realCharCode];
+    this[_shadowKeyCode] = this[_realKeyCode];
+    this[_currentTarget] = this[_parent$][dartx.currentTarget];
+  }
+  static new(type, opts) {
+    let view = opts && 'view' in opts ? opts.view : null;
+    let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
+    let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
+    let keyCode = opts && 'keyCode' in opts ? opts.keyCode : 0;
+    let charCode = opts && 'charCode' in opts ? opts.charCode : 0;
+    let keyLocation = opts && 'keyLocation' in opts ? opts.keyLocation : 1;
+    let ctrlKey = opts && 'ctrlKey' in opts ? opts.ctrlKey : false;
+    let altKey = opts && 'altKey' in opts ? opts.altKey : false;
+    let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
+    let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
+    let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
+    if (view == null) {
+      view = html$.window;
+    }
+    let eventObj = null;
+    if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
+      eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
+      eventObj.keyCode = keyCode;
+      eventObj.which = keyCode;
+      eventObj.charCode = charCode;
+      eventObj.keyLocation = keyLocation;
+      eventObj.ctrlKey = ctrlKey;
+      eventObj.altKey = altKey;
+      eventObj.shiftKey = shiftKey;
+      eventObj.metaKey = metaKey;
+    } else {
+      eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
+      Object.defineProperty(eventObj, 'keyCode', {
+        get: function() {
+          return this.keyCodeVal;
+        }
+      });
+      Object.defineProperty(eventObj, 'which', {
+        get: function() {
+          return this.keyCodeVal;
+        }
+      });
+      Object.defineProperty(eventObj, 'charCode', {
+        get: function() {
+          return this.charCodeVal;
+        }
+      });
+      let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
+      dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
+      eventObj.keyCodeVal = keyCode;
+      eventObj.charCodeVal = charCode;
+    }
+    _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
+    let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
+    if (keyEvent[_currentTarget] == null) {
+      keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
+    }
+    return keyEvent;
+  }
+  static get canUseDispatchEvent() {
+    return typeof document.body.dispatchEvent == "function" && document.body.dispatchEvent.length > 0;
+  }
+  get currentTarget() {
+    return this[_currentTarget];
+  }
+  static _convertToHexString(charCode, keyCode) {
+    if (charCode != -1) {
+      let hex = charCode[dartx.toRadixString](16);
+      let sb = new core.StringBuffer('U+');
+      for (let i = 0; i < 4 - dart.notNull(hex[dartx.length]); i++)
+        sb.write('0');
+      sb.write(hex);
+      return sb.toString();
+    } else {
+      return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
+    }
+  }
+  get code() {
+    return this[_parent$][dartx.code];
+  }
+  get ctrlKey() {
+    return this[_parent$][dartx.ctrlKey];
+  }
+  get detail() {
+    return this[_parent$][dartx.detail];
+  }
+  get key() {
+    return this[_parent$][dartx.key];
+  }
+  get keyLocation() {
+    return this[_parent$][dartx.keyLocation];
+  }
+  get metaKey() {
+    return this[_parent$][dartx.metaKey];
+  }
+  get shiftKey() {
+    return this[_parent$][dartx.shiftKey];
+  }
+  get sourceDevice() {
+    return this[_parent$][dartx.sourceDevice];
+  }
+  get view() {
+    return html$.Window._check(this[_parent$][dartx.view]);
+  }
+  [_initUIEvent](type, canBubble, cancelable, view, detail) {
+    dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
+  }
+  get [_shadowKeyIdentifier]() {
+    return this[_parent$].keyIdentifier;
+  }
+  get [_charCode]() {
+    return this.charCode;
+  }
+  get [_keyCode]() {
+    return this.keyCode;
+  }
+  get [_which]() {
+    return this.which;
+  }
+  get [_keyIdentifier]() {
+    dart.throw(new core.UnsupportedError("keyIdentifier is unsupported."));
+  }
+  [_initKeyboardEvent](type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey) {
+    dart.throw(new core.UnsupportedError("Cannot initialize a KeyboardEvent from a KeyEvent."));
+  }
+  getModifierState(keyArgument) {
+    return dart.throw(new core.UnimplementedError());
+  }
+  get location() {
+    return dart.throw(new core.UnimplementedError());
+  }
+  get repeat() {
+    return dart.throw(new core.UnimplementedError());
+  }
+  get [_get_view]() {
+    return dart.throw(new core.UnimplementedError());
+  }
+};
+dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
+html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
+dart.setSignature(html$.KeyEvent, {
+  constructors: () => ({
+    wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
+    new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
+  }),
+  fields: () => ({
+    [_parent$]: html$.KeyboardEvent,
+    [_shadowAltKey]: core.bool,
+    [_shadowCharCode]: core.int,
+    [_shadowKeyCode]: core.int,
+    [_currentTarget]: html$.EventTarget
+  }),
+  getters: () => ({
+    keyCode: dart.definiteFunctionType(core.int, []),
+    charCode: dart.definiteFunctionType(core.int, []),
+    altKey: dart.definiteFunctionType(core.bool, []),
+    which: dart.definiteFunctionType(core.int, []),
+    [_realKeyCode]: dart.definiteFunctionType(core.int, []),
+    [_realCharCode]: dart.definiteFunctionType(core.int, []),
+    [_realAltKey]: dart.definiteFunctionType(core.bool, []),
+    code: dart.definiteFunctionType(core.String, []),
+    ctrlKey: dart.definiteFunctionType(core.bool, []),
+    detail: dart.definiteFunctionType(core.int, []),
+    key: dart.definiteFunctionType(core.String, []),
+    keyLocation: dart.definiteFunctionType(core.int, []),
+    metaKey: dart.definiteFunctionType(core.bool, []),
+    shiftKey: dart.definiteFunctionType(core.bool, []),
+    sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
+    view: dart.definiteFunctionType(html$.Window, []),
+    [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
+    [_charCode]: dart.definiteFunctionType(core.int, []),
+    [_keyCode]: dart.definiteFunctionType(core.int, []),
+    [_which]: dart.definiteFunctionType(core.int, []),
+    [_keyIdentifier]: dart.definiteFunctionType(core.String, []),
+    location: dart.definiteFunctionType(core.int, []),
+    repeat: dart.definiteFunctionType(core.bool, []),
+    [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
+  }),
+  methods: () => ({
+    [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
+    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
+    getModifierState: dart.definiteFunctionType(core.bool, [core.String])
+  }),
+  sfields: () => ({
+    _keyboardEventDispatchRecord: dart.dynamic,
+    keyDownEvent: EventStreamProviderOfKeyEvent(),
+    keyUpEvent: EventStreamProviderOfKeyEvent(),
+    keyPressEvent: EventStreamProviderOfKeyEvent()
+  }),
+  sgetters: () => ({canUseDispatchEvent: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    _makeRecord: dart.definiteFunctionType(dart.dynamic, []),
+    _convertToHexString: dart.definiteFunctionType(core.String, [core.int, core.int])
+  }),
+  names: ['_makeRecord', '_convertToHexString']
+});
+dart.defineLazy(html$.KeyEvent, {
+  get _keyboardEventDispatchRecord() {
+    return html$.KeyEvent._makeRecord();
+  },
+  get keyDownEvent() {
+    return new html$._KeyboardEventHandler('keydown');
+  },
+  set keyDownEvent(_) {},
+  get keyUpEvent() {
+    return new html$._KeyboardEventHandler('keyup');
+  },
+  set keyUpEvent(_) {},
+  get keyPressEvent() {
+    return new html$._KeyboardEventHandler('keypress');
+  },
+  set keyPressEvent(_) {}
+});
+html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
+  new(type) {
+    super.new(type);
+  }
+  add(event) {
+    if (event.type == this[_type$]) {
+      event.currentTarget[dartx.dispatchEvent](event[_parent$]);
+      this[_streamController].add(event);
+    }
+  }
+};
+dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
+html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
+dart.setSignature(html$._CustomKeyEventStreamImpl, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])})
+});
+const _subscriptions = Symbol('_subscriptions');
+const _controller$1 = Symbol('_controller');
+html$._StreamPool$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
+  let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
+  let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
+  class _StreamPool extends core.Object {
+    broadcast() {
+      this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
+      this[_controller$1] = null;
+      this[_controller$1] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
+    }
+    get stream() {
+      return this[_controller$1].stream;
+    }
+    add(stream) {
+      StreamOfT()._check(stream);
+      if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
+      this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$1], 'add'), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
+    }
+    remove(stream) {
+      StreamOfT()._check(stream);
+      let subscription = this[_subscriptions][dartx.remove](stream);
+      if (subscription != null) subscription.cancel();
+    }
+    close() {
+      for (let subscription of this[_subscriptions][dartx.values]) {
+        subscription.cancel();
+      }
+      this[_subscriptions][dartx.clear]();
+      this[_controller$1].close();
+    }
+  }
+  dart.addTypeTests(_StreamPool);
+  dart.defineNamedConstructor(_StreamPool, 'broadcast');
+  dart.setSignature(_StreamPool, {
+    constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
+    fields: () => ({
+      [_controller$1]: StreamControllerOfT(),
+      [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
+    }),
+    getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
+    methods: () => ({
+      add: dart.definiteFunctionType(dart.void, [StreamOfT()]),
+      remove: dart.definiteFunctionType(dart.void, [StreamOfT()]),
+      close: dart.definiteFunctionType(dart.void, [])
+    })
+  });
+  return _StreamPool;
+});
+html$._StreamPool = _StreamPool();
+const _eventTypeGetter = Symbol('_eventTypeGetter');
+html$._CustomEventStreamProvider$ = dart.generic(T => {
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
+  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
+  let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
+  class _CustomEventStreamProvider extends core.Object {
+    new(eventTypeGetter) {
+      this[_eventTypeGetter] = eventTypeGetter;
+    }
+    forTarget(e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_EventStreamOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
+    }
+    forElement(e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_ElementEventStreamImplOfT())(e, dart.dcall(this[_eventTypeGetter], e), useCapture);
+    }
+    [_forElementList](e, opts) {
+      let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+      return new (_ElementListEventStreamImplOfT())(e, core.String._check(dart.dcall(this[_eventTypeGetter], e)), useCapture);
+    }
+    getEventType(target) {
+      return core.String._check(dart.dcall(this[_eventTypeGetter], target));
+    }
+    get [_eventType]() {
+      return dart.throw(new core.UnsupportedError('Access type through getEventType method.'));
+    }
+  }
+  dart.addTypeTests(_CustomEventStreamProvider);
+  _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
+  dart.setSignature(_CustomEventStreamProvider, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
+    fields: () => ({[_eventTypeGetter]: dart.dynamic}),
+    getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
+    methods: () => ({
+      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
+      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
+      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
+      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
+    })
+  });
+  return _CustomEventStreamProvider;
+});
+html$._CustomEventStreamProvider = _CustomEventStreamProvider();
+html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
+  new(opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
+    if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
+      for (let attr of html$._Html5NodeValidator._standardAttributes) {
+        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
+      }
+      for (let attr of html$._Html5NodeValidator._uriAttributes) {
+        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
+      }
+    }
+  }
+  allowsElement(element) {
+    return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
+  }
+  allowsAttribute(element, attributeName, value) {
+    let tagName = html$.Element._safeTagName(element);
+    let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
+    if (validator == null) {
+      validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
+    }
+    if (validator == null) {
+      return false;
+    }
+    return core.bool._check(dart.dcall(validator, element, attributeName, value, this));
+  }
+  static _standardAttributeValidator(element, attributeName, value, context) {
+    return true;
+  }
+  static _uriAttributeValidator(element, attributeName, value, context) {
+    return context.uriPolicy.allowsUri(value);
+  }
+};
+html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._Html5NodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
+  fields: () => ({uriPolicy: html$.UriPolicy}),
+  methods: () => ({
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
+  }),
+  sfields: () => ({
+    _allowedElements: SetOfString(),
+    _standardAttributes: ListOfString(),
+    _uriAttributes: ListOfString(),
+    _attributeValidators: MapOfString$Function()
+  }),
+  statics: () => ({
+    _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
+    _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
+  }),
+  names: ['_standardAttributeValidator', '_uriAttributeValidator']
+});
+html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
+html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
+dart.defineLazy(html$._Html5NodeValidator, {
+  get _allowedElements() {
+    return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
+  },
+  get _attributeValidators() {
+    return dart.map({}, core.String, core.Function);
+  }
+});
+html$.KeyCode = class KeyCode extends core.Object {
+  static isCharacterKey(keyCode) {
+    if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
+      return true;
+    }
+    if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
+      return true;
+    }
+    return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
+  }
+  static _convertKeyCodeToKeyName(keyCode) {
+    switch (keyCode) {
+      case html$.KeyCode.ALT:
+      {
+        return html$._KeyName.ALT;
+      }
+      case html$.KeyCode.BACKSPACE:
+      {
+        return html$._KeyName.BACKSPACE;
+      }
+      case html$.KeyCode.CAPS_LOCK:
+      {
+        return html$._KeyName.CAPS_LOCK;
+      }
+      case html$.KeyCode.CTRL:
+      {
+        return html$._KeyName.CONTROL;
+      }
+      case html$.KeyCode.DELETE:
+      {
+        return html$._KeyName.DEL;
+      }
+      case html$.KeyCode.DOWN:
+      {
+        return html$._KeyName.DOWN;
+      }
+      case html$.KeyCode.END:
+      {
+        return html$._KeyName.END;
+      }
+      case html$.KeyCode.ENTER:
+      {
+        return html$._KeyName.ENTER;
+      }
+      case html$.KeyCode.ESC:
+      {
+        return html$._KeyName.ESC;
+      }
+      case html$.KeyCode.F1:
+      {
+        return html$._KeyName.F1;
+      }
+      case html$.KeyCode.F2:
+      {
+        return html$._KeyName.F2;
+      }
+      case html$.KeyCode.F3:
+      {
+        return html$._KeyName.F3;
+      }
+      case html$.KeyCode.F4:
+      {
+        return html$._KeyName.F4;
+      }
+      case html$.KeyCode.F5:
+      {
+        return html$._KeyName.F5;
+      }
+      case html$.KeyCode.F6:
+      {
+        return html$._KeyName.F6;
+      }
+      case html$.KeyCode.F7:
+      {
+        return html$._KeyName.F7;
+      }
+      case html$.KeyCode.F8:
+      {
+        return html$._KeyName.F8;
+      }
+      case html$.KeyCode.F9:
+      {
+        return html$._KeyName.F9;
+      }
+      case html$.KeyCode.F10:
+      {
+        return html$._KeyName.F10;
+      }
+      case html$.KeyCode.F11:
+      {
+        return html$._KeyName.F11;
+      }
+      case html$.KeyCode.F12:
+      {
+        return html$._KeyName.F12;
+      }
+      case html$.KeyCode.HOME:
+      {
+        return html$._KeyName.HOME;
+      }
+      case html$.KeyCode.INSERT:
+      {
+        return html$._KeyName.INSERT;
+      }
+      case html$.KeyCode.LEFT:
+      {
+        return html$._KeyName.LEFT;
+      }
+      case html$.KeyCode.META:
+      {
+        return html$._KeyName.META;
+      }
+      case html$.KeyCode.NUMLOCK:
+      {
+        return html$._KeyName.NUM_LOCK;
+      }
+      case html$.KeyCode.PAGE_DOWN:
+      {
+        return html$._KeyName.PAGE_DOWN;
+      }
+      case html$.KeyCode.PAGE_UP:
+      {
+        return html$._KeyName.PAGE_UP;
+      }
+      case html$.KeyCode.PAUSE:
+      {
+        return html$._KeyName.PAUSE;
+      }
+      case html$.KeyCode.PRINT_SCREEN:
+      {
+        return html$._KeyName.PRINT_SCREEN;
+      }
+      case html$.KeyCode.RIGHT:
+      {
+        return html$._KeyName.RIGHT;
+      }
+      case html$.KeyCode.SCROLL_LOCK:
+      {
+        return html$._KeyName.SCROLL;
+      }
+      case html$.KeyCode.SHIFT:
+      {
+        return html$._KeyName.SHIFT;
+      }
+      case html$.KeyCode.SPACE:
+      {
+        return html$._KeyName.SPACEBAR;
+      }
+      case html$.KeyCode.TAB:
+      {
+        return html$._KeyName.TAB;
+      }
+      case html$.KeyCode.UP:
+      {
+        return html$._KeyName.UP;
+      }
+      case html$.KeyCode.WIN_IME:
+      case html$.KeyCode.WIN_KEY:
+      case html$.KeyCode.WIN_KEY_LEFT:
+      case html$.KeyCode.WIN_KEY_RIGHT:
+      {
+        return html$._KeyName.WIN;
+      }
+      default:
+      {
+        return html$._KeyName.UNIDENTIFIED;
+      }
+    }
+    return html$._KeyName.UNIDENTIFIED;
+  }
+};
+dart.setSignature(html$.KeyCode, {
+  sfields: () => ({
+    WIN_KEY_FF_LINUX: core.int,
+    MAC_ENTER: core.int,
+    BACKSPACE: core.int,
+    TAB: core.int,
+    NUM_CENTER: core.int,
+    ENTER: core.int,
+    SHIFT: core.int,
+    CTRL: core.int,
+    ALT: core.int,
+    PAUSE: core.int,
+    CAPS_LOCK: core.int,
+    ESC: core.int,
+    SPACE: core.int,
+    PAGE_UP: core.int,
+    PAGE_DOWN: core.int,
+    END: core.int,
+    HOME: core.int,
+    LEFT: core.int,
+    UP: core.int,
+    RIGHT: core.int,
+    DOWN: core.int,
+    NUM_NORTH_EAST: core.int,
+    NUM_SOUTH_EAST: core.int,
+    NUM_SOUTH_WEST: core.int,
+    NUM_NORTH_WEST: core.int,
+    NUM_WEST: core.int,
+    NUM_NORTH: core.int,
+    NUM_EAST: core.int,
+    NUM_SOUTH: core.int,
+    PRINT_SCREEN: core.int,
+    INSERT: core.int,
+    NUM_INSERT: core.int,
+    DELETE: core.int,
+    NUM_DELETE: core.int,
+    ZERO: core.int,
+    ONE: core.int,
+    TWO: core.int,
+    THREE: core.int,
+    FOUR: core.int,
+    FIVE: core.int,
+    SIX: core.int,
+    SEVEN: core.int,
+    EIGHT: core.int,
+    NINE: core.int,
+    FF_SEMICOLON: core.int,
+    FF_EQUALS: core.int,
+    QUESTION_MARK: core.int,
+    A: core.int,
+    B: core.int,
+    C: core.int,
+    D: core.int,
+    E: core.int,
+    F: core.int,
+    G: core.int,
+    H: core.int,
+    I: core.int,
+    J: core.int,
+    K: core.int,
+    L: core.int,
+    M: core.int,
+    N: core.int,
+    O: core.int,
+    P: core.int,
+    Q: core.int,
+    R: core.int,
+    S: core.int,
+    T: core.int,
+    U: core.int,
+    V: core.int,
+    W: core.int,
+    X: core.int,
+    Y: core.int,
+    Z: core.int,
+    META: core.int,
+    WIN_KEY_LEFT: core.int,
+    WIN_KEY_RIGHT: core.int,
+    CONTEXT_MENU: core.int,
+    NUM_ZERO: core.int,
+    NUM_ONE: core.int,
+    NUM_TWO: core.int,
+    NUM_THREE: core.int,
+    NUM_FOUR: core.int,
+    NUM_FIVE: core.int,
+    NUM_SIX: core.int,
+    NUM_SEVEN: core.int,
+    NUM_EIGHT: core.int,
+    NUM_NINE: core.int,
+    NUM_MULTIPLY: core.int,
+    NUM_PLUS: core.int,
+    NUM_MINUS: core.int,
+    NUM_PERIOD: core.int,
+    NUM_DIVISION: core.int,
+    F1: core.int,
+    F2: core.int,
+    F3: core.int,
+    F4: core.int,
+    F5: core.int,
+    F6: core.int,
+    F7: core.int,
+    F8: core.int,
+    F9: core.int,
+    F10: core.int,
+    F11: core.int,
+    F12: core.int,
+    NUMLOCK: core.int,
+    SCROLL_LOCK: core.int,
+    FIRST_MEDIA_KEY: core.int,
+    LAST_MEDIA_KEY: core.int,
+    SEMICOLON: core.int,
+    DASH: core.int,
+    EQUALS: core.int,
+    COMMA: core.int,
+    PERIOD: core.int,
+    SLASH: core.int,
+    APOSTROPHE: core.int,
+    TILDE: core.int,
+    SINGLE_QUOTE: core.int,
+    OPEN_SQUARE_BRACKET: core.int,
+    BACKSLASH: core.int,
+    CLOSE_SQUARE_BRACKET: core.int,
+    WIN_KEY: core.int,
+    MAC_FF_META: core.int,
+    WIN_IME: core.int,
+    UNKNOWN: core.int
+  }),
+  statics: () => ({
+    isCharacterKey: dart.definiteFunctionType(core.bool, [core.int]),
+    _convertKeyCodeToKeyName: dart.definiteFunctionType(core.String, [core.int])
+  }),
+  names: ['isCharacterKey', '_convertKeyCodeToKeyName']
+});
+html$.KeyCode.WIN_KEY_FF_LINUX = 0;
+html$.KeyCode.MAC_ENTER = 3;
+html$.KeyCode.BACKSPACE = 8;
+html$.KeyCode.TAB = 9;
+html$.KeyCode.NUM_CENTER = 12;
+html$.KeyCode.ENTER = 13;
+html$.KeyCode.SHIFT = 16;
+html$.KeyCode.CTRL = 17;
+html$.KeyCode.ALT = 18;
+html$.KeyCode.PAUSE = 19;
+html$.KeyCode.CAPS_LOCK = 20;
+html$.KeyCode.ESC = 27;
+html$.KeyCode.SPACE = 32;
+html$.KeyCode.PAGE_UP = 33;
+html$.KeyCode.PAGE_DOWN = 34;
+html$.KeyCode.END = 35;
+html$.KeyCode.HOME = 36;
+html$.KeyCode.LEFT = 37;
+html$.KeyCode.UP = 38;
+html$.KeyCode.RIGHT = 39;
+html$.KeyCode.DOWN = 40;
+html$.KeyCode.NUM_NORTH_EAST = 33;
+html$.KeyCode.NUM_SOUTH_EAST = 34;
+html$.KeyCode.NUM_SOUTH_WEST = 35;
+html$.KeyCode.NUM_NORTH_WEST = 36;
+html$.KeyCode.NUM_WEST = 37;
+html$.KeyCode.NUM_NORTH = 38;
+html$.KeyCode.NUM_EAST = 39;
+html$.KeyCode.NUM_SOUTH = 40;
+html$.KeyCode.PRINT_SCREEN = 44;
+html$.KeyCode.INSERT = 45;
+html$.KeyCode.NUM_INSERT = 45;
+html$.KeyCode.DELETE = 46;
+html$.KeyCode.NUM_DELETE = 46;
+html$.KeyCode.ZERO = 48;
+html$.KeyCode.ONE = 49;
+html$.KeyCode.TWO = 50;
+html$.KeyCode.THREE = 51;
+html$.KeyCode.FOUR = 52;
+html$.KeyCode.FIVE = 53;
+html$.KeyCode.SIX = 54;
+html$.KeyCode.SEVEN = 55;
+html$.KeyCode.EIGHT = 56;
+html$.KeyCode.NINE = 57;
+html$.KeyCode.FF_SEMICOLON = 59;
+html$.KeyCode.FF_EQUALS = 61;
+html$.KeyCode.QUESTION_MARK = 63;
+html$.KeyCode.A = 65;
+html$.KeyCode.B = 66;
+html$.KeyCode.C = 67;
+html$.KeyCode.D = 68;
+html$.KeyCode.E = 69;
+html$.KeyCode.F = 70;
+html$.KeyCode.G = 71;
+html$.KeyCode.H = 72;
+html$.KeyCode.I = 73;
+html$.KeyCode.J = 74;
+html$.KeyCode.K = 75;
+html$.KeyCode.L = 76;
+html$.KeyCode.M = 77;
+html$.KeyCode.N = 78;
+html$.KeyCode.O = 79;
+html$.KeyCode.P = 80;
+html$.KeyCode.Q = 81;
+html$.KeyCode.R = 82;
+html$.KeyCode.S = 83;
+html$.KeyCode.T = 84;
+html$.KeyCode.U = 85;
+html$.KeyCode.V = 86;
+html$.KeyCode.W = 87;
+html$.KeyCode.X = 88;
+html$.KeyCode.Y = 89;
+html$.KeyCode.Z = 90;
+html$.KeyCode.META = 91;
+html$.KeyCode.WIN_KEY_LEFT = 91;
+html$.KeyCode.WIN_KEY_RIGHT = 92;
+html$.KeyCode.CONTEXT_MENU = 93;
+html$.KeyCode.NUM_ZERO = 96;
+html$.KeyCode.NUM_ONE = 97;
+html$.KeyCode.NUM_TWO = 98;
+html$.KeyCode.NUM_THREE = 99;
+html$.KeyCode.NUM_FOUR = 100;
+html$.KeyCode.NUM_FIVE = 101;
+html$.KeyCode.NUM_SIX = 102;
+html$.KeyCode.NUM_SEVEN = 103;
+html$.KeyCode.NUM_EIGHT = 104;
+html$.KeyCode.NUM_NINE = 105;
+html$.KeyCode.NUM_MULTIPLY = 106;
+html$.KeyCode.NUM_PLUS = 107;
+html$.KeyCode.NUM_MINUS = 109;
+html$.KeyCode.NUM_PERIOD = 110;
+html$.KeyCode.NUM_DIVISION = 111;
+html$.KeyCode.F1 = 112;
+html$.KeyCode.F2 = 113;
+html$.KeyCode.F3 = 114;
+html$.KeyCode.F4 = 115;
+html$.KeyCode.F5 = 116;
+html$.KeyCode.F6 = 117;
+html$.KeyCode.F7 = 118;
+html$.KeyCode.F8 = 119;
+html$.KeyCode.F9 = 120;
+html$.KeyCode.F10 = 121;
+html$.KeyCode.F11 = 122;
+html$.KeyCode.F12 = 123;
+html$.KeyCode.NUMLOCK = 144;
+html$.KeyCode.SCROLL_LOCK = 145;
+html$.KeyCode.FIRST_MEDIA_KEY = 166;
+html$.KeyCode.LAST_MEDIA_KEY = 183;
+html$.KeyCode.SEMICOLON = 186;
+html$.KeyCode.DASH = 189;
+html$.KeyCode.EQUALS = 187;
+html$.KeyCode.COMMA = 188;
+html$.KeyCode.PERIOD = 190;
+html$.KeyCode.SLASH = 191;
+html$.KeyCode.APOSTROPHE = 192;
+html$.KeyCode.TILDE = 192;
+html$.KeyCode.SINGLE_QUOTE = 222;
+html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
+html$.KeyCode.BACKSLASH = 220;
+html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
+html$.KeyCode.WIN_KEY = 224;
+html$.KeyCode.MAC_FF_META = 224;
+html$.KeyCode.WIN_IME = 229;
+html$.KeyCode.UNKNOWN = -1;
+html$.KeyLocation = class KeyLocation extends core.Object {};
+dart.setSignature(html$.KeyLocation, {
+  sfields: () => ({
+    STANDARD: core.int,
+    LEFT: core.int,
+    RIGHT: core.int,
+    NUMPAD: core.int,
+    MOBILE: core.int,
+    JOYSTICK: core.int
+  })
+});
+html$.KeyLocation.STANDARD = 0;
+html$.KeyLocation.LEFT = 1;
+html$.KeyLocation.RIGHT = 2;
+html$.KeyLocation.NUMPAD = 3;
+html$.KeyLocation.MOBILE = 4;
+html$.KeyLocation.JOYSTICK = 5;
+html$._KeyName = class _KeyName extends core.Object {};
+dart.setSignature(html$._KeyName, {
+  sfields: () => ({
+    ACCEPT: core.String,
+    ADD: core.String,
+    AGAIN: core.String,
+    ALL_CANDIDATES: core.String,
+    ALPHANUMERIC: core.String,
+    ALT: core.String,
+    ALT_GRAPH: core.String,
+    APPS: core.String,
+    ATTN: core.String,
+    BROWSER_BACK: core.String,
+    BROWSER_FAVORTIES: core.String,
+    BROWSER_FORWARD: core.String,
+    BROWSER_NAME: core.String,
+    BROWSER_REFRESH: core.String,
+    BROWSER_SEARCH: core.String,
+    BROWSER_STOP: core.String,
+    CAMERA: core.String,
+    CAPS_LOCK: core.String,
+    CLEAR: core.String,
+    CODE_INPUT: core.String,
+    COMPOSE: core.String,
+    CONTROL: core.String,
+    CRSEL: core.String,
+    CONVERT: core.String,
+    COPY: core.String,
+    CUT: core.String,
+    DECIMAL: core.String,
+    DIVIDE: core.String,
+    DOWN: core.String,
+    DOWN_LEFT: core.String,
+    DOWN_RIGHT: core.String,
+    EJECT: core.String,
+    END: core.String,
+    ENTER: core.String,
+    ERASE_EOF: core.String,
+    EXECUTE: core.String,
+    EXSEL: core.String,
+    FN: core.String,
+    F1: core.String,
+    F2: core.String,
+    F3: core.String,
+    F4: core.String,
+    F5: core.String,
+    F6: core.String,
+    F7: core.String,
+    F8: core.String,
+    F9: core.String,
+    F10: core.String,
+    F11: core.String,
+    F12: core.String,
+    F13: core.String,
+    F14: core.String,
+    F15: core.String,
+    F16: core.String,
+    F17: core.String,
+    F18: core.String,
+    F19: core.String,
+    F20: core.String,
+    F21: core.String,
+    F22: core.String,
+    F23: core.String,
+    F24: core.String,
+    FINAL_MODE: core.String,
+    FIND: core.String,
+    FULL_WIDTH: core.String,
+    HALF_WIDTH: core.String,
+    HANGUL_MODE: core.String,
+    HANJA_MODE: core.String,
+    HELP: core.String,
+    HIRAGANA: core.String,
+    HOME: core.String,
+    INSERT: core.String,
+    JAPANESE_HIRAGANA: core.String,
+    JAPANESE_KATAKANA: core.String,
+    JAPANESE_ROMAJI: core.String,
+    JUNJA_MODE: core.String,
+    KANA_MODE: core.String,
+    KANJI_MODE: core.String,
+    KATAKANA: core.String,
+    LAUNCH_APPLICATION_1: core.String,
+    LAUNCH_APPLICATION_2: core.String,
+    LAUNCH_MAIL: core.String,
+    LEFT: core.String,
+    MENU: core.String,
+    META: core.String,
+    MEDIA_NEXT_TRACK: core.String,
+    MEDIA_PAUSE_PLAY: core.String,
+    MEDIA_PREVIOUS_TRACK: core.String,
+    MEDIA_STOP: core.String,
+    MODE_CHANGE: core.String,
+    NEXT_CANDIDATE: core.String,
+    NON_CONVERT: core.String,
+    NUM_LOCK: core.String,
+    PAGE_DOWN: core.String,
+    PAGE_UP: core.String,
+    PASTE: core.String,
+    PAUSE: core.String,
+    PLAY: core.String,
+    POWER: core.String,
+    PREVIOUS_CANDIDATE: core.String,
+    PRINT_SCREEN: core.String,
+    PROCESS: core.String,
+    PROPS: core.String,
+    RIGHT: core.String,
+    ROMAN_CHARACTERS: core.String,
+    SCROLL: core.String,
+    SELECT: core.String,
+    SELECT_MEDIA: core.String,
+    SEPARATOR: core.String,
+    SHIFT: core.String,
+    SOFT_1: core.String,
+    SOFT_2: core.String,
+    SOFT_3: core.String,
+    SOFT_4: core.String,
+    STOP: core.String,
+    SUBTRACT: core.String,
+    SYMBOL_LOCK: core.String,
+    UP: core.String,
+    UP_LEFT: core.String,
+    UP_RIGHT: core.String,
+    UNDO: core.String,
+    VOLUME_DOWN: core.String,
+    VOLUMN_MUTE: core.String,
+    VOLUMN_UP: core.String,
+    WIN: core.String,
+    ZOOM: core.String,
+    BACKSPACE: core.String,
+    TAB: core.String,
+    CANCEL: core.String,
+    ESC: core.String,
+    SPACEBAR: core.String,
+    DEL: core.String,
+    DEAD_GRAVE: core.String,
+    DEAD_EACUTE: core.String,
+    DEAD_CIRCUMFLEX: core.String,
+    DEAD_TILDE: core.String,
+    DEAD_MACRON: core.String,
+    DEAD_BREVE: core.String,
+    DEAD_ABOVE_DOT: core.String,
+    DEAD_UMLAUT: core.String,
+    DEAD_ABOVE_RING: core.String,
+    DEAD_DOUBLEACUTE: core.String,
+    DEAD_CARON: core.String,
+    DEAD_CEDILLA: core.String,
+    DEAD_OGONEK: core.String,
+    DEAD_IOTA: core.String,
+    DEAD_VOICED_SOUND: core.String,
+    DEC_SEMIVOICED_SOUND: core.String,
+    UNIDENTIFIED: core.String
+  })
+});
+html$._KeyName.ACCEPT = "Accept";
+html$._KeyName.ADD = "Add";
+html$._KeyName.AGAIN = "Again";
+html$._KeyName.ALL_CANDIDATES = "AllCandidates";
+html$._KeyName.ALPHANUMERIC = "Alphanumeric";
+html$._KeyName.ALT = "Alt";
+html$._KeyName.ALT_GRAPH = "AltGraph";
+html$._KeyName.APPS = "Apps";
+html$._KeyName.ATTN = "Attn";
+html$._KeyName.BROWSER_BACK = "BrowserBack";
+html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
+html$._KeyName.BROWSER_FORWARD = "BrowserForward";
+html$._KeyName.BROWSER_NAME = "BrowserHome";
+html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
+html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
+html$._KeyName.BROWSER_STOP = "BrowserStop";
+html$._KeyName.CAMERA = "Camera";
+html$._KeyName.CAPS_LOCK = "CapsLock";
+html$._KeyName.CLEAR = "Clear";
+html$._KeyName.CODE_INPUT = "CodeInput";
+html$._KeyName.COMPOSE = "Compose";
+html$._KeyName.CONTROL = "Control";
+html$._KeyName.CRSEL = "Crsel";
+html$._KeyName.CONVERT = "Convert";
+html$._KeyName.COPY = "Copy";
+html$._KeyName.CUT = "Cut";
+html$._KeyName.DECIMAL = "Decimal";
+html$._KeyName.DIVIDE = "Divide";
+html$._KeyName.DOWN = "Down";
+html$._KeyName.DOWN_LEFT = "DownLeft";
+html$._KeyName.DOWN_RIGHT = "DownRight";
+html$._KeyName.EJECT = "Eject";
+html$._KeyName.END = "End";
+html$._KeyName.ENTER = "Enter";
+html$._KeyName.ERASE_EOF = "EraseEof";
+html$._KeyName.EXECUTE = "Execute";
+html$._KeyName.EXSEL = "Exsel";
+html$._KeyName.FN = "Fn";
+html$._KeyName.F1 = "F1";
+html$._KeyName.F2 = "F2";
+html$._KeyName.F3 = "F3";
+html$._KeyName.F4 = "F4";
+html$._KeyName.F5 = "F5";
+html$._KeyName.F6 = "F6";
+html$._KeyName.F7 = "F7";
+html$._KeyName.F8 = "F8";
+html$._KeyName.F9 = "F9";
+html$._KeyName.F10 = "F10";
+html$._KeyName.F11 = "F11";
+html$._KeyName.F12 = "F12";
+html$._KeyName.F13 = "F13";
+html$._KeyName.F14 = "F14";
+html$._KeyName.F15 = "F15";
+html$._KeyName.F16 = "F16";
+html$._KeyName.F17 = "F17";
+html$._KeyName.F18 = "F18";
+html$._KeyName.F19 = "F19";
+html$._KeyName.F20 = "F20";
+html$._KeyName.F21 = "F21";
+html$._KeyName.F22 = "F22";
+html$._KeyName.F23 = "F23";
+html$._KeyName.F24 = "F24";
+html$._KeyName.FINAL_MODE = "FinalMode";
+html$._KeyName.FIND = "Find";
+html$._KeyName.FULL_WIDTH = "FullWidth";
+html$._KeyName.HALF_WIDTH = "HalfWidth";
+html$._KeyName.HANGUL_MODE = "HangulMode";
+html$._KeyName.HANJA_MODE = "HanjaMode";
+html$._KeyName.HELP = "Help";
+html$._KeyName.HIRAGANA = "Hiragana";
+html$._KeyName.HOME = "Home";
+html$._KeyName.INSERT = "Insert";
+html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
+html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
+html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
+html$._KeyName.JUNJA_MODE = "JunjaMode";
+html$._KeyName.KANA_MODE = "KanaMode";
+html$._KeyName.KANJI_MODE = "KanjiMode";
+html$._KeyName.KATAKANA = "Katakana";
+html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
+html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
+html$._KeyName.LAUNCH_MAIL = "LaunchMail";
+html$._KeyName.LEFT = "Left";
+html$._KeyName.MENU = "Menu";
+html$._KeyName.META = "Meta";
+html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
+html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
+html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+html$._KeyName.MEDIA_STOP = "MediaStop";
+html$._KeyName.MODE_CHANGE = "ModeChange";
+html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
+html$._KeyName.NON_CONVERT = "Nonconvert";
+html$._KeyName.NUM_LOCK = "NumLock";
+html$._KeyName.PAGE_DOWN = "PageDown";
+html$._KeyName.PAGE_UP = "PageUp";
+html$._KeyName.PASTE = "Paste";
+html$._KeyName.PAUSE = "Pause";
+html$._KeyName.PLAY = "Play";
+html$._KeyName.POWER = "Power";
+html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
+html$._KeyName.PRINT_SCREEN = "PrintScreen";
+html$._KeyName.PROCESS = "Process";
+html$._KeyName.PROPS = "Props";
+html$._KeyName.RIGHT = "Right";
+html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
+html$._KeyName.SCROLL = "Scroll";
+html$._KeyName.SELECT = "Select";
+html$._KeyName.SELECT_MEDIA = "SelectMedia";
+html$._KeyName.SEPARATOR = "Separator";
+html$._KeyName.SHIFT = "Shift";
+html$._KeyName.SOFT_1 = "Soft1";
+html$._KeyName.SOFT_2 = "Soft2";
+html$._KeyName.SOFT_3 = "Soft3";
+html$._KeyName.SOFT_4 = "Soft4";
+html$._KeyName.STOP = "Stop";
+html$._KeyName.SUBTRACT = "Subtract";
+html$._KeyName.SYMBOL_LOCK = "SymbolLock";
+html$._KeyName.UP = "Up";
+html$._KeyName.UP_LEFT = "UpLeft";
+html$._KeyName.UP_RIGHT = "UpRight";
+html$._KeyName.UNDO = "Undo";
+html$._KeyName.VOLUME_DOWN = "VolumeDown";
+html$._KeyName.VOLUMN_MUTE = "VolumeMute";
+html$._KeyName.VOLUMN_UP = "VolumeUp";
+html$._KeyName.WIN = "Win";
+html$._KeyName.ZOOM = "Zoom";
+html$._KeyName.BACKSPACE = "Backspace";
+html$._KeyName.TAB = "Tab";
+html$._KeyName.CANCEL = "Cancel";
+html$._KeyName.ESC = "Esc";
+html$._KeyName.SPACEBAR = "Spacebar";
+html$._KeyName.DEL = "Del";
+html$._KeyName.DEAD_GRAVE = "DeadGrave";
+html$._KeyName.DEAD_EACUTE = "DeadEacute";
+html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
+html$._KeyName.DEAD_TILDE = "DeadTilde";
+html$._KeyName.DEAD_MACRON = "DeadMacron";
+html$._KeyName.DEAD_BREVE = "DeadBreve";
+html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
+html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
+html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
+html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
+html$._KeyName.DEAD_CARON = "DeadCaron";
+html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
+html$._KeyName.DEAD_OGONEK = "DeadOgonek";
+html$._KeyName.DEAD_IOTA = "DeadIota";
+html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
+html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
+html$._KeyName.UNIDENTIFIED = "Unidentified";
+const _stream$0 = Symbol('_stream');
+const _keyDownList = Symbol('_keyDownList');
+const _capsLockOn = Symbol('_capsLockOn');
+const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
+const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
+const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
+const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
+html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
+  forTarget(e, opts) {
+    let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
+    let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$], e);
+    return handler[_stream$0];
+  }
+  new(type) {
+    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
+    this[_type$] = type;
+    this[_stream$0] = new html$._CustomKeyEventStreamImpl('event');
+    this[_target$0] = null;
+    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
+  }
+  initializeAllEventListeners(type, target) {
+    this[_keyDownList] = JSArrayOfKeyEvent().of([]);
+    this[_type$] = type;
+    this[_target$0] = target;
+    this[_stream$0] = null;
+    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
+    html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
+    html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
+    html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
+    this[_stream$0] = new html$._CustomKeyEventStreamImpl(this[_type$]);
+  }
+  get [_capsLockOn]() {
+    return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
+  }
+  [_determineKeyCodeForKeypress](event) {
+    for (let prevEvent of this[_keyDownList]) {
+      if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
+        return prevEvent.keyCode;
+      }
+      if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
+        return prevEvent.keyCode;
+      }
+    }
+    return html$.KeyCode.UNKNOWN;
+  }
+  [_findCharCodeKeyDown](event) {
+    if (event[dartx.keyLocation] == 3) {
+      switch (event[dartx.keyCode]) {
+        case html$.KeyCode.NUM_ZERO:
+        {
+          return html$.KeyCode.ZERO;
+        }
+        case html$.KeyCode.NUM_ONE:
+        {
+          return html$.KeyCode.ONE;
+        }
+        case html$.KeyCode.NUM_TWO:
+        {
+          return html$.KeyCode.TWO;
+        }
+        case html$.KeyCode.NUM_THREE:
+        {
+          return html$.KeyCode.THREE;
+        }
+        case html$.KeyCode.NUM_FOUR:
+        {
+          return html$.KeyCode.FOUR;
+        }
+        case html$.KeyCode.NUM_FIVE:
+        {
+          return html$.KeyCode.FIVE;
+        }
+        case html$.KeyCode.NUM_SIX:
+        {
+          return html$.KeyCode.SIX;
+        }
+        case html$.KeyCode.NUM_SEVEN:
+        {
+          return html$.KeyCode.SEVEN;
+        }
+        case html$.KeyCode.NUM_EIGHT:
+        {
+          return html$.KeyCode.EIGHT;
+        }
+        case html$.KeyCode.NUM_NINE:
+        {
+          return html$.KeyCode.NINE;
+        }
+        case html$.KeyCode.NUM_MULTIPLY:
+        {
+          return 42;
+        }
+        case html$.KeyCode.NUM_PLUS:
+        {
+          return 43;
+        }
+        case html$.KeyCode.NUM_MINUS:
+        {
+          return 45;
+        }
+        case html$.KeyCode.NUM_PERIOD:
+        {
+          return 46;
+        }
+        case html$.KeyCode.NUM_DIVISION:
+        {
+          return 47;
+        }
+      }
+    } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
+      return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
+    }
+    switch (event[dartx.keyCode]) {
+      case html$.KeyCode.SEMICOLON:
+      {
+        return html$.KeyCode.FF_SEMICOLON;
+      }
+      case html$.KeyCode.EQUALS:
+      {
+        return html$.KeyCode.FF_EQUALS;
+      }
+      case html$.KeyCode.COMMA:
+      {
+        return 44;
+      }
+      case html$.KeyCode.DASH:
+      {
+        return 45;
+      }
+      case html$.KeyCode.PERIOD:
+      {
+        return 46;
+      }
+      case html$.KeyCode.SLASH:
+      {
+        return 47;
+      }
+      case html$.KeyCode.APOSTROPHE:
+      {
+        return 96;
+      }
+      case html$.KeyCode.OPEN_SQUARE_BRACKET:
+      {
+        return 91;
+      }
+      case html$.KeyCode.BACKSLASH:
+      {
+        return 92;
+      }
+      case html$.KeyCode.CLOSE_SQUARE_BRACKET:
+      {
+        return 93;
+      }
+      case html$.KeyCode.SINGLE_QUOTE:
+      {
+        return 39;
+      }
+    }
+    return event[dartx.keyCode];
+  }
+  [_firesKeyPressEvent](event) {
+    if (!dart.test(html_common.Device.isIE) && !dart.test(html_common.Device.isWebKit)) {
+      return true;
+    }
+    if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
+      return html$.KeyCode.isCharacterKey(event.keyCode);
+    }
+    if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
+      return false;
+    }
+    if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
+      return false;
+    }
+    if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
+      return false;
+    }
+    switch (event.keyCode) {
+      case html$.KeyCode.ENTER:
+      {
+        return !dart.test(html_common.Device.isIE);
+      }
+      case html$.KeyCode.ESC:
+      {
+        return !dart.test(html_common.Device.isWebKit);
+      }
+    }
+    return html$.KeyCode.isCharacterKey(event.keyCode);
+  }
+  [_normalizeKeyCodes](event) {
+    if (dart.test(html_common.Device.isFirefox)) {
+      switch (event[dartx.keyCode]) {
+        case html$.KeyCode.FF_EQUALS:
+        {
+          return html$.KeyCode.EQUALS;
+        }
+        case html$.KeyCode.FF_SEMICOLON:
+        {
+          return html$.KeyCode.SEMICOLON;
+        }
+        case html$.KeyCode.MAC_FF_META:
+        {
+          return html$.KeyCode.META;
+        }
+        case html$.KeyCode.WIN_KEY_FF_LINUX:
+        {
+          return html$.KeyCode.WIN_KEY;
+        }
+      }
+    }
+    return event[dartx.keyCode];
+  }
+  processKeyDown(e) {
+    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
+      this[_keyDownList][dartx.clear]();
+    }
+    let event = new html$.KeyEvent.wrap(e);
+    event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
+    event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
+    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
+      this.processKeyPress(e);
+    }
+    this[_keyDownList][dartx.add](event);
+    this[_stream$0].add(event);
+  }
+  processKeyPress(event) {
+    let e = new html$.KeyEvent.wrap(event);
+    if (dart.test(html_common.Device.isIE)) {
+      if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
+        e[_shadowCharCode] = 0;
+      } else {
+        e[_shadowCharCode] = e.keyCode;
+      }
+    } else if (dart.test(html_common.Device.isOpera)) {
+      e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
+    }
+    e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
+    if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
+      e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
+    }
+    e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
+    this[_stream$0].add(e);
+  }
+  processKeyUp(event) {
+    let e = new html$.KeyEvent.wrap(event);
+    let toRemove = null;
+    for (let key of this[_keyDownList]) {
+      if (key.keyCode == e.keyCode) {
+        toRemove = key;
+      }
+    }
+    if (toRemove != null) {
+      this[_keyDownList][dartx.removeWhere](dart.fn(element => dart.equals(element, toRemove), KeyEventTobool()));
+    } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
+      this[_keyDownList][dartx.removeLast]();
+    }
+    this[_stream$0].add(e);
+  }
+};
+dart.addSimpleTypeTests(html$._KeyboardEventHandler);
+dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
+dart.setSignature(html$._KeyboardEventHandler, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
+    initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
+  }),
+  fields: () => ({
+    [_keyDownList]: ListOfKeyEvent(),
+    [_type$]: core.String,
+    [_target$0]: html$.EventTarget,
+    [_stream$0]: html$._CustomKeyEventStreamImpl
+  }),
+  getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
+  methods: () => ({
+    forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
+    [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
+    [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
+    processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
+    processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
+  }),
+  sfields: () => ({
+    _ROMAN_ALPHABET_OFFSET: core.int,
+    _EVENT_TYPE: core.String,
+    _keyIdentifier: MapOfString$int()
+  })
+});
+html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
+html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
+dart.defineLazy(html$._KeyboardEventHandler, {
+  get _ROMAN_ALPHABET_OFFSET() {
+    return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
+  }
+});
+html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
+  static onKeyPress(target) {
+    return new html$._KeyboardEventHandler('keypress').forTarget(target);
+  }
+  static onKeyUp(target) {
+    return new html$._KeyboardEventHandler('keyup').forTarget(target);
+  }
+  static onKeyDown(target) {
+    return new html$._KeyboardEventHandler('keydown').forTarget(target);
+  }
+};
+dart.setSignature(html$.KeyboardEventStream, {
+  statics: () => ({
+    onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
+    onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
+    onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
+  }),
+  names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
+});
+const _validators = Symbol('_validators');
+html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
+  new() {
+    this[_validators] = JSArrayOfNodeValidator().of([]);
+  }
+  common() {
+    this[_validators] = JSArrayOfNodeValidator().of([]);
+    this.allowHtml5();
+    this.allowTemplating();
+  }
+  allowNavigation(uriPolicy) {
+    if (uriPolicy === void 0) uriPolicy = null;
+    if (uriPolicy == null) {
+      uriPolicy = html$.UriPolicy.new();
+    }
+    this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
+  }
+  allowImages(uriPolicy) {
+    if (uriPolicy === void 0) uriPolicy = null;
+    if (uriPolicy == null) {
+      uriPolicy = html$.UriPolicy.new();
+    }
+    this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
+  }
+  allowTextElements() {
+    this.add(html$._SimpleNodeValidator.allowTextElements());
+  }
+  allowInlineStyles(opts) {
+    let tagName = opts && 'tagName' in opts ? opts.tagName : null;
+    if (tagName == null) {
+      tagName = '*';
+    } else {
+      tagName = tagName[dartx.toUpperCase]();
+    }
+    this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
+  }
+  allowHtml5(opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
+  }
+  allowSvg() {
+    this.add(new html$._SvgNodeValidator());
+  }
+  allowCustomElement(tagName, opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
+    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
+    let tagNameUpper = tagName[dartx.toUpperCase]();
+    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    if (uriPolicy == null) {
+      uriPolicy = html$.UriPolicy.new();
+    }
+    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
+  }
+  allowTagExtension(tagName, baseName, opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
+    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
+    let baseNameUpper = baseName[dartx.toUpperCase]();
+    let tagNameUpper = tagName[dartx.toUpperCase]();
+    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    if (uriPolicy == null) {
+      uriPolicy = html$.UriPolicy.new();
+    }
+    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
+  }
+  allowElement(tagName, opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    let attributes = opts && 'attributes' in opts ? opts.attributes : null;
+    let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
+    this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
+  }
+  allowTemplating() {
+    this.add(new html$._TemplatingNodeValidator());
+  }
+  add(validator) {
+    this[_validators][dartx.add](validator);
+  }
+  allowsElement(element) {
+    return this[_validators][dartx.any](dart.fn(v => v.allowsElement(element), NodeValidatorTobool()));
+  }
+  allowsAttribute(element, attributeName, value) {
+    return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
+  }
+};
+dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
+html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$.NodeValidatorBuilder, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
+    common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
+  }),
+  fields: () => ({[_validators]: ListOfNodeValidator()}),
+  methods: () => ({
+    allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
+    allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
+    allowTextElements: dart.definiteFunctionType(dart.void, []),
+    allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
+    allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
+    allowSvg: dart.definiteFunctionType(dart.void, []),
+    allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowTemplating: dart.definiteFunctionType(dart.void, []),
+    add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
+  })
+});
+let const$83;
+let const$84;
+let const$85;
+let const$86;
+let const$87;
+let const$88;
+let const$89;
+let const$90;
+let const$91;
+let const$92;
+html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
+  static allowNavigation(uriPolicy) {
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
+  }
+  static allowImages(uriPolicy) {
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
+  }
+  static allowTextElements() {
+    return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+  }
+  new(uriPolicy, opts) {
+    let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
+    let allowedAttributes = opts && 'allowedAttributes' in opts ? opts.allowedAttributes : null;
+    let allowedUriAttributes = opts && 'allowedUriAttributes' in opts ? opts.allowedUriAttributes : null;
+    this.allowedElements = SetOfString().new();
+    this.allowedAttributes = SetOfString().new();
+    this.allowedUriAttributes = SetOfString().new();
+    this.uriPolicy = uriPolicy;
+    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
+    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
+    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+    let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
+    let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
+    this.allowedAttributes.addAll(legalAttributes);
+    this.allowedUriAttributes.addAll(allowedUriAttributes);
+    this.allowedUriAttributes.addAll(extraUriAttributes);
+  }
+  allowsElement(element) {
+    return this.allowedElements.contains(html$.Element._safeTagName(element));
+  }
+  allowsAttribute(element, attributeName, value) {
+    let tagName = html$.Element._safeTagName(element);
+    if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
+      return this.uriPolicy.allowsUri(value);
+    } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
+      return this.uriPolicy.allowsUri(value);
+    } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
+      return true;
+    } else if (dart.test(this.allowedAttributes.contains(dart.str`*::${attributeName}`))) {
+      return true;
+    } else if (dart.test(this.allowedAttributes.contains(dart.str`${tagName}::*`))) {
+      return true;
+    } else if (dart.test(this.allowedAttributes.contains('*::*'))) {
+      return true;
+    }
+    return false;
+  }
+};
+html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._SimpleNodeValidator, {
+  constructors: () => ({
+    allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
+    allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
+    allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
+    new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
+  }),
+  fields: () => ({
+    allowedElements: SetOfString(),
+    allowedAttributes: SetOfString(),
+    allowedUriAttributes: SetOfString(),
+    uriPolicy: html$.UriPolicy
+  }),
+  methods: () => ({
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
+  })
+});
+html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
+  new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
+    this.allowTypeExtension = allowTypeExtension == true;
+    this.allowCustomTag = allowCustomTag == true;
+    super.new(uriPolicy, {allowedElements: allowedElements, allowedAttributes: allowedAttributes, allowedUriAttributes: allowedUriAttributes});
+  }
+  allowsElement(element) {
+    if (dart.test(this.allowTypeExtension)) {
+      let isAttr = element[dartx.attributes][dartx._get]('is');
+      if (isAttr != null) {
+        return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
+      }
+    }
+    return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
+  }
+  allowsAttribute(element, attributeName, value) {
+    if (dart.test(this.allowsElement(element))) {
+      if (dart.test(this.allowTypeExtension) && attributeName == 'is' && dart.test(this.allowedElements.contains(value[dartx.toUpperCase]()))) {
+        return true;
+      }
+      return super.allowsAttribute(element, attributeName, value);
+    }
+    return false;
+  }
+};
+dart.setSignature(html$._CustomElementNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
+  fields: () => ({
+    allowTypeExtension: core.bool,
+    allowCustomTag: core.bool
+  })
+});
+const _templateAttrs = Symbol('_templateAttrs');
+html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
+  new() {
+    this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
+    super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
+  }
+  allowsAttribute(element, attributeName, value) {
+    if (dart.test(super.allowsAttribute(element, attributeName, value))) {
+      return true;
+    }
+    if (attributeName == 'template' && value == "") {
+      return true;
+    }
+    if (element[dartx.attributes][dartx._get]('template') == "") {
+      return this[_templateAttrs].contains(attributeName);
+    }
+    return false;
+  }
+};
+dart.setSignature(html$._TemplatingNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
+  fields: () => ({[_templateAttrs]: SetOfString()}),
+  sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
+});
+html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
+html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
+  allowsElement(element) {
+    if (svg$.ScriptElement.is(element)) {
+      return false;
+    }
+    if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
+      return false;
+    }
+    if (svg$.SvgElement.is(element)) {
+      return true;
+    }
+    return false;
+  }
+  allowsAttribute(element, attributeName, value) {
+    if (attributeName == 'is' || dart.test(attributeName[dartx.startsWith]('on'))) {
+      return false;
+    }
+    return this.allowsElement(element);
+  }
+};
+html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._SvgNodeValidator, {
+  methods: () => ({
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
+  })
+});
+html$.ReadyState = class ReadyState extends core.Object {};
+dart.setSignature(html$.ReadyState, {
+  sfields: () => ({
+    LOADING: core.String,
+    INTERACTIVE: core.String,
+    COMPLETE: core.String
+  })
+});
+html$.ReadyState.LOADING = "loading";
+html$.ReadyState.INTERACTIVE = "interactive";
+html$.ReadyState.COMPLETE = "complete";
+const _list$ = Symbol('_list');
+html$._WrappedList$ = dart.generic(E => {
+  let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
+  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
+  class _WrappedList extends collection.ListBase$(E) {
+    new(list) {
+      this[_list$] = list;
+    }
+    get iterator() {
+      return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
+    }
+    get length() {
+      return this[_list$][dartx.length];
+    }
+    add(element) {
+      E._check(element);
+      this[_list$][dartx.add](element);
+    }
+    remove(element) {
+      return this[_list$][dartx.remove](element);
+    }
+    clear() {
+      this[_list$][dartx.clear]();
+    }
+    _get(index) {
+      return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
+    }
+    _set(index, value) {
+      E._check(value);
+      this[_list$][dartx._set](index, value);
+      return value;
+    }
+    set length(newLength) {
+      this[_list$][dartx.length] = newLength;
+    }
+    sort(compare) {
+      if (compare === void 0) compare = null;
+      this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
+    }
+    indexOf(element, start) {
+      if (start === void 0) start = 0;
+      return this[_list$][dartx.indexOf](html$.Node._check(element), start);
+    }
+    lastIndexOf(element, start) {
+      if (start === void 0) start = null;
+      return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
+    }
+    insert(index, element) {
+      E._check(element);
+      return this[_list$][dartx.insert](index, element);
+    }
+    removeAt(index) {
+      return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
+    }
+    setRange(start, end, iterable, skipCount) {
+      IterableOfE()._check(iterable);
+      if (skipCount === void 0) skipCount = 0;
+      this[_list$][dartx.setRange](start, end, iterable, skipCount);
+    }
+    removeRange(start, end) {
+      this[_list$][dartx.removeRange](start, end);
+    }
+    replaceRange(start, end, iterable) {
+      IterableOfE()._check(iterable);
+      this[_list$][dartx.replaceRange](start, end, iterable);
+    }
+    fillRange(start, end, fillValue) {
+      if (fillValue === void 0) fillValue = null;
+      E._check(fillValue);
+      this[_list$][dartx.fillRange](start, end, fillValue);
+    }
+    get rawList() {
+      return this[_list$];
+    }
+  }
+  _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
+  dart.setSignature(_WrappedList, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
+    fields: () => ({[_list$]: ListOfNode()}),
+    getters: () => ({
+      length: dart.definiteFunctionType(core.int, []),
+      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
+    }),
+    setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+    methods: () => ({
+      _get: dart.definiteFunctionType(E, [core.int]),
+      _set: dart.definiteFunctionType(dart.void, [core.int, E])
+    })
+  });
+  dart.defineExtensionMembers(_WrappedList, [
+    'add',
+    'remove',
+    'clear',
+    '_get',
+    '_set',
+    'sort',
+    'indexOf',
+    'lastIndexOf',
+    'insert',
+    'removeAt',
+    'setRange',
+    'removeRange',
+    'replaceRange',
+    'fillRange',
+    'iterator',
+    'length',
+    'length'
+  ]);
+  return _WrappedList;
+});
+html$._WrappedList = _WrappedList();
+const _iterator$1 = Symbol('_iterator');
+html$._WrappedIterator$ = dart.generic(E => {
+  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
+  class _WrappedIterator extends core.Object {
+    new(iterator) {
+      this[_iterator$1] = iterator;
+    }
+    moveNext() {
+      return this[_iterator$1].moveNext();
+    }
+    get current() {
+      return html$._downcast(html$.Node, E)(this[_iterator$1].current);
+    }
+  }
+  dart.addTypeTests(_WrappedIterator);
+  _WrappedIterator[dart.implements] = () => [IteratorOfE()];
+  dart.setSignature(_WrappedIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
+    fields: () => ({[_iterator$1]: IteratorOfNode()}),
+    getters: () => ({current: dart.definiteFunctionType(E, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _WrappedIterator;
+});
+html$._WrappedIterator = _WrappedIterator();
+html$._downcast = function(From, To) {
+  return x => {
+    return To._check(x);
+  };
+};
+dart.fn(html$._downcast, FromToTo());
+html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
+  static get(url, onComplete, withCredentials) {
+    let request = html$.HttpRequest.new();
+    request[dartx.open]('GET', url, {async: true});
+    request[dartx.withCredentials] = withCredentials;
+    request[dartx.onReadyStateChange].listen(dart.fn(e => {
+      if (request[dartx.readyState] == html$.HttpRequest.DONE) {
+        onComplete(request);
+      }
+    }, ProgressEventToNull()));
+    request[dartx.send]();
+    return request;
+  }
+};
+dart.setSignature(html$._HttpRequestUtils, {
+  statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
+  names: ['get']
+});
+const _array = Symbol('_array');
+const _current$4 = Symbol('_current');
+html$.FixedSizeListIterator$ = dart.generic(T => {
+  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
+  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
+  class FixedSizeListIterator extends core.Object {
+    new(array) {
+      this[_array] = array;
+      this[_position$1] = -1;
+      this[_length$3] = array[dartx.length];
+      this[_current$4] = null;
+    }
+    moveNext() {
+      let nextPosition = dart.notNull(this[_position$1]) + 1;
+      if (nextPosition < dart.notNull(this[_length$3])) {
+        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_position$1] = nextPosition;
+        return true;
+      }
+      this[_current$4] = null;
+      this[_position$1] = this[_length$3];
+      return false;
+    }
+    get current() {
+      return this[_current$4];
+    }
+  }
+  dart.addTypeTests(FixedSizeListIterator);
+  FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
+  dart.setSignature(FixedSizeListIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
+    fields: () => ({
+      [_array]: ListOfT(),
+      [_length$3]: core.int,
+      [_position$1]: core.int,
+      [_current$4]: T
+    }),
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return FixedSizeListIterator;
+});
+html$.FixedSizeListIterator = FixedSizeListIterator();
+html$._VariableSizeListIterator$ = dart.generic(T => {
+  let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
+  let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
+  class _VariableSizeListIterator extends core.Object {
+    new(array) {
+      this[_array] = array;
+      this[_position$1] = -1;
+      this[_current$4] = null;
+    }
+    moveNext() {
+      let nextPosition = dart.notNull(this[_position$1]) + 1;
+      if (nextPosition < dart.notNull(this[_array][dartx.length])) {
+        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_position$1] = nextPosition;
+        return true;
+      }
+      this[_current$4] = null;
+      this[_position$1] = this[_array][dartx.length];
+      return false;
+    }
+    get current() {
+      return this[_current$4];
+    }
+  }
+  dart.addTypeTests(_VariableSizeListIterator);
+  _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
+  dart.setSignature(_VariableSizeListIterator, {
+    constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
+    fields: () => ({
+      [_array]: ListOfT(),
+      [_position$1]: core.int,
+      [_current$4]: T
+    }),
+    getters: () => ({current: dart.definiteFunctionType(T, [])}),
+    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
+  });
+  return _VariableSizeListIterator;
+});
+html$._VariableSizeListIterator = _VariableSizeListIterator();
+html$._convertNativeToDart_Window = function(win) {
+  if (win == null) return null;
+  return html$._DOMWindowCrossFrame._createSafe(win);
+};
+dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
+html$._convertNativeToDart_EventTarget = function(e) {
+  if (e == null) {
+    return null;
+  }
+  if ("postMessage" in e) {
+    let window = html$._DOMWindowCrossFrame._createSafe(e);
+    if (html$.EventTarget.is(window)) {
+      return window;
+    }
+    return null;
+  } else
+    return html$.EventTarget._check(e);
+};
+dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
+const _window = Symbol('_window');
+html$._convertDartToNative_EventTarget = function(e) {
+  if (html$._DOMWindowCrossFrame.is(e)) {
+    return html$.EventTarget._check(e[_window]);
+  } else {
+    return html$.EventTarget._check(e);
+  }
+};
+dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
+html$._convertNativeToDart_XHR_Response = function(o) {
+  if (html$.Document.is(o)) {
+    return o;
+  }
+  return html_common.convertNativeToDart_SerializedScriptValue(o);
+};
+dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
+html$._callConstructor = function(constructor, interceptor) {
+  return dart.fn(receiver => {
+    _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
+    receiver.constructor = receiver.__proto__.constructor;
+    return constructor(receiver);
+  }, dynamicTodynamic$());
+};
+dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
+html$._callAttached = function(receiver) {
+  return dart.dsend(receiver, 'attached');
+};
+dart.fn(html$._callAttached, dynamicTodynamic$());
+html$._callDetached = function(receiver) {
+  return dart.dsend(receiver, 'detached');
+};
+dart.fn(html$._callDetached, dynamicTodynamic$());
+html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
+  return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
+};
+dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
+html$._makeCallbackMethod = function(callback) {
+  return (function(invokeCallback) {
+    return function() {
+      return invokeCallback(this);
+    };
+  })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
+};
+dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
+html$._makeCallbackMethod3 = function(callback) {
+  return (function(invokeCallback) {
+    return function(arg1, arg2, arg3) {
+      return invokeCallback(this, arg1, arg2, arg3);
+    };
+  })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
+};
+dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
+html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
+  let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
+  if (interceptorClass == null) {
+    dart.throw(new core.ArgumentError(type));
+  }
+  let interceptor = interceptorClass.prototype;
+  let constructor = _interceptors.findConstructorForNativeSubclassType(type, 'created');
+  if (constructor == null) {
+    dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
+  }
+  _interceptors.getNativeInterceptor(html$.Element.tag('article'));
+  let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
+  if (baseClassName == null) {
+    dart.throw(new core.ArgumentError(type));
+  }
+  if (extendsTagName == null) {
+    if (baseClassName != 'HTMLElement') {
+      dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
+    }
+  } else {
+    if (!(document.createElement(extendsTagName) instanceof window[baseClassName])) {
+      dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
+    }
+  }
+  let baseConstructor = context[baseClassName];
+  let properties = {};
+  properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
+  properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
+  properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
+  properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
+  let baseProto = baseConstructor.prototype;
+  let proto = Object.create(baseProto, properties);
+  _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
+  let options = {prototype: proto};
+  if (extendsTagName != null) {
+    options.extends = extendsTagName;
+  }
+  document.registerElement(tag, options);
+};
+dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
+html$._initializeCustomElement = function(e) {
+};
+dart.fn(html$._initializeCustomElement, ElementTovoid$());
+const _interceptor = Symbol('_interceptor');
+const _constructor = Symbol('_constructor');
+const _nativeType = Symbol('_nativeType');
+html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
+  new(document, type, extendsTag) {
+    this[_interceptor] = null;
+    this[_constructor] = null;
+    this[_nativeType] = null;
+    let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
+    if (interceptorClass == null) {
+      dart.throw(new core.ArgumentError(type));
+    }
+    this[_constructor] = _interceptors.findConstructorForNativeSubclassType(type, 'created');
+    if (this[_constructor] == null) {
+      dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
+    }
+    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
+    let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
+    if (baseClassName == null) {
+      dart.throw(new core.ArgumentError(type));
+    }
+    if (extendsTag == null) {
+      if (!dart.equals(baseClassName, 'HTMLElement')) {
+        dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
+      }
+      this[_nativeType] = dart.wrapType(html$.HtmlElement);
+    } else {
+      let element = document[dartx.createElement](extendsTag);
+      if (!(element instanceof window[baseClassName])) {
+        dart.throw(new core.UnsupportedError('extendsTag does not match base native class'));
+      }
+      this[_nativeType] = dart.runtimeType(element);
+    }
+    this[_interceptor] = interceptorClass.prototype;
+  }
+  upgrade(element) {
+    if (!dart.equals(dart.runtimeType(element), this[_nativeType])) {
+      dart.throw(new core.ArgumentError(dart.str`element is not subclass of ${this[_nativeType]}`));
+    }
+    _js_helper.setNativeSubclassDispatchRecord(element, this[_interceptor]);
+    this[_constructor](element);
+    return element;
+  }
+};
+html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
+dart.setSignature(html$._JSElementUpgrader, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
+  fields: () => ({
+    [_interceptor]: dart.dynamic,
+    [_constructor]: dart.dynamic,
+    [_nativeType]: dart.dynamic
+  }),
+  methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
+});
+html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
+  get history() {
+    return html$._HistoryCrossFrame._createSafe(this[_window].history);
+  }
+  get location() {
+    return html$._LocationCrossFrame._createSafe(this[_window].location);
+  }
+  get closed() {
+    return this[_window].closed;
+  }
+  get opener() {
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
+  }
+  get parent() {
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
+  }
+  get top() {
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
+  }
+  close() {
+    return this[_window].close();
+  }
+  postMessage(message, targetOrigin, messagePorts) {
+    if (messagePorts === void 0) messagePorts = null;
+    if (messagePorts == null) {
+      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin);
+    } else {
+      this[_window].postMessage(html_common.convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
+    }
+  }
+  new(window) {
+    this[_window] = window;
+  }
+  static _createSafe(w) {
+    if (core.identical(w, html$.window)) {
+      return html$.WindowBase._check(w);
+    } else {
+      return new html$._DOMWindowCrossFrame(w);
+    }
+  }
+  get on() {
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+  [_addEventListener](type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+  addEventListener(type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+  dispatchEvent(event) {
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+  [_removeEventListener](type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+  removeEventListener(type, listener, useCapture) {
+    if (useCapture === void 0) useCapture = null;
+    return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
+  }
+};
+html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
+dart.setSignature(html$._DOMWindowCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
+  fields: () => ({[_window]: dart.dynamic}),
+  getters: () => ({
+    history: dart.definiteFunctionType(html$.HistoryBase, []),
+    location: dart.definiteFunctionType(html$.LocationBase, []),
+    closed: dart.definiteFunctionType(core.bool, []),
+    opener: dart.definiteFunctionType(html$.WindowBase, []),
+    parent: dart.definiteFunctionType(html$.WindowBase, []),
+    top: dart.definiteFunctionType(html$.WindowBase, []),
+    on: dart.definiteFunctionType(html$.Events, [])
+  }),
+  methods: () => ({
+    close: dart.definiteFunctionType(dart.void, []),
+    postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
+    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
+    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
+  }),
+  statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
+  names: ['_createSafe']
+});
+dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
+  'close',
+  'postMessage',
+  'history',
+  'location',
+  'closed',
+  'opener',
+  'parent',
+  'top'
+]);
+html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
+  set href(val) {
+    return html$._LocationCrossFrame._setHref(this[_location], val);
+  }
+  static _setHref(location, val) {
+    location.href = val;
+  }
+  new(location) {
+    this[_location] = location;
+  }
+  static _createSafe(location) {
+    if (core.identical(location, html$.window[dartx.location])) {
+      return html$.LocationBase._check(location);
+    } else {
+      return new html$._LocationCrossFrame(location);
+    }
+  }
+};
+html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
+dart.setSignature(html$._LocationCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
+  fields: () => ({[_location]: dart.dynamic}),
+  setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
+  statics: () => ({
+    _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
+    _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
+  }),
+  names: ['_setHref', '_createSafe']
+});
+dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
+const _history = Symbol('_history');
+html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
+  back() {
+    return this[_history].back();
+  }
+  forward() {
+    return this[_history].forward();
+  }
+  go(distance) {
+    return this[_history].go(distance);
+  }
+  new(history) {
+    this[_history] = history;
+  }
+  static _createSafe(h) {
+    if (core.identical(h, html$.window[dartx.history])) {
+      return html$.HistoryBase._check(h);
+    } else {
+      return new html$._HistoryCrossFrame(h);
+    }
+  }
+};
+html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
+dart.setSignature(html$._HistoryCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
+  fields: () => ({[_history]: dart.dynamic}),
+  methods: () => ({
+    back: dart.definiteFunctionType(dart.void, []),
+    forward: dart.definiteFunctionType(dart.void, []),
+    go: dart.definiteFunctionType(dart.void, [core.int])
+  }),
+  statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
+  names: ['_createSafe']
+});
+dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
+html$.Platform = class Platform extends core.Object {};
+dart.setSignature(html$.Platform, {
+  sfields: () => ({
+    supportsTypedData: core.bool,
+    supportsSimd: core.bool
+  })
+});
+html$.Platform.supportsSimd = false;
+dart.defineLazy(html$.Platform, {
+  get supportsTypedData() {
+    return !!window.ArrayBuffer;
+  }
+});
+html$._wrapZoneCallback$ = dart.generic((A, R) => {
+  const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
+  return _wrapZoneCallback;
+});
+html$._wrapZoneCallback = _wrapZoneCallback();
+html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
+  const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
+  return _wrapZoneBinaryCallback;
+});
+html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
+html$._wrapZone = function(A, R) {
+  return callback => {
+    if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
+    if (callback == null) return null;
+    return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
+  };
+};
+dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
+html$._wrapBinaryZone = function(A, B, R) {
+  return callback => {
+    if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
+    if (callback == null) return null;
+    return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
+  };
+};
+dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
+html$.query = function(relativeSelectors) {
+  return html$.document[dartx.query](relativeSelectors);
+};
+dart.fn(html$.query, StringToElement());
+html$.queryAll = function(relativeSelectors) {
+  return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
+};
+dart.fn(html$.queryAll, StringToElementListOfElement());
+html$.querySelector = function(selectors) {
+  return html$.document[dartx.querySelector](selectors);
+};
+dart.fn(html$.querySelector, StringToElement());
+html$.querySelectorAll = function(selectors) {
+  return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
+};
+dart.fn(html$.querySelectorAll, StringToElementListOfElement());
+html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
+html$.NodeValidator = class NodeValidator extends core.Object {
+  static new(opts) {
+    let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
+    return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
+  }
+  static throws(base) {
+    return new html$._ThrowsNodeValidator(base);
+  }
+};
+dart.setSignature(html$.NodeValidator, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
+    throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
+  })
+});
+html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
+  static new(validator) {
+    return new html$._ValidatingTreeSanitizer(validator);
+  }
+};
+dart.setSignature(html$.NodeTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
+  sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
+});
+dart.defineLazy(html$.NodeTreeSanitizer, {
+  get trusted() {
+    return dart.const(new html$._TrustedHtmlTreeSanitizer());
+  }
+});
+html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
+  new() {
+  }
+  sanitizeTree(node) {}
+};
+html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
+dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
+  methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
+});
+html$.UriPolicy = class UriPolicy extends core.Object {
+  static new() {
+    return new html$._SameOriginUriPolicy();
+  }
+};
+dart.setSignature(html$.UriPolicy, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
+});
+const _hiddenAnchor = Symbol('_hiddenAnchor');
+const _loc = Symbol('_loc');
+html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
+  new() {
+    this[_hiddenAnchor] = html$.AnchorElement.new();
+    this[_loc] = html$.window[dartx.location];
+  }
+  allowsUri(uri) {
+    this[_hiddenAnchor][dartx.href] = uri;
+    return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
+  }
+};
+html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
+dart.setSignature(html$._SameOriginUriPolicy, {
+  fields: () => ({
+    [_hiddenAnchor]: html$.AnchorElement,
+    [_loc]: html$.Location
+  }),
+  methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
+});
+html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
+  new(validator) {
+    this.validator = validator;
+  }
+  allowsElement(element) {
+    if (!dart.test(this.validator.allowsElement(element))) {
+      dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
+    }
+    return true;
+  }
+  allowsAttribute(element, attributeName, value) {
+    if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
+      dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
+    }
+  }
+};
+html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._ThrowsNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
+  fields: () => ({validator: html$.NodeValidator}),
+  methods: () => ({
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
+  })
+});
+const _removeNode = Symbol('_removeNode');
+const _sanitizeElement = Symbol('_sanitizeElement');
+const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
+html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
+  new(validator) {
+    this.validator = validator;
+  }
+  sanitizeTree(node) {
+    const walk = (function(node, parent) {
+      this.sanitizeNode(node, parent);
+      let child = node[dartx.lastChild];
+      while (child != null) {
+        let nextChild = child[dartx.previousNode];
+        walk(child, node);
+        child = nextChild;
+      }
+    }).bind(this);
+    dart.fn(walk, NodeAndNodeTovoid());
+    walk(node, null);
+  }
+  [_removeNode](node, parent) {
+    if (parent == null) {
+      node[dartx.remove]();
+    } else {
+      parent[_removeChild](node);
+    }
+  }
+  [_sanitizeUntrustedElement](element, parent) {
+    let corrupted = true;
+    let attrs = null;
+    let isAttr = null;
+    try {
+      attrs = dart.dload(element, 'attributes');
+      isAttr = dart.dindex(attrs, 'is');
+      let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
+      corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
+    } catch (e) {
+    }
+
+    let elementText = 'element unprintable';
+    try {
+      elementText = dart.toString(element);
+    } catch (e) {
+    }
+
+    try {
+      let elementTagName = html$.Element._safeTagName(element);
+      this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
+    } catch (e$) {
+      if (core.ArgumentError.is(e$)) {
+        throw e$;
+      } else {
+        let e = e$;
+        this[_removeNode](html$.Node._check(element), parent);
+        html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
+      }
+    }
+
+  }
+  [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
+    if (false != corrupted) {
+      this[_removeNode](element, parent);
+      html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
+      return;
+    }
+    if (!dart.test(this.validator.allowsElement(element))) {
+      this[_removeNode](element, parent);
+      html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
+      return;
+    }
+    if (isAttr != null) {
+      if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
+        this[_removeNode](element, parent);
+        html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
+        return;
+      }
+    }
+    let keys = attrs[dartx.keys][dartx.toList]();
+    for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
+      let name = keys[dartx._get](i);
+      if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
+        html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
+        attrs[dartx.remove](name);
+      }
+    }
+    if (html$.TemplateElement.is(element)) {
+      let template = element;
+      this.sanitizeTree(template[dartx.content]);
+    }
+  }
+  sanitizeNode(node, parent) {
+    switch (node[dartx.nodeType]) {
+      case html$.Node.ELEMENT_NODE:
+      {
+        this[_sanitizeUntrustedElement](node, parent);
+        break;
+      }
+      case html$.Node.COMMENT_NODE:
+      case html$.Node.DOCUMENT_FRAGMENT_NODE:
+      case html$.Node.TEXT_NODE:
+      case html$.Node.CDATA_SECTION_NODE:
+      {
+        break;
+      }
+      default:
+      {
+        this[_removeNode](node, parent);
+      }
+    }
+  }
+};
+html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
+dart.setSignature(html$._ValidatingTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
+  fields: () => ({validator: html$.NodeValidator}),
+  methods: () => ({
+    sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
+    [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
+    [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
+    sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
+  })
+});
+html_common.convertDartToNative_SerializedScriptValue = function(value) {
+  return html_common.convertDartToNative_PrepareForStructuredClone(value);
+};
+dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
+html_common.convertNativeToDart_SerializedScriptValue = function(object) {
+  return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
+};
+dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
+html_common._StructuredClone = class _StructuredClone extends core.Object {
+  new() {
+    this.values = [];
+    this.copies = [];
+  }
+  findSlot(value) {
+    let length = this.values[dartx.length];
+    for (let i = 0; i < dart.notNull(length); i++) {
+      if (core.identical(this.values[dartx._get](i), value)) return i;
+    }
+    this.values[dartx.add](value);
+    this.copies[dartx.add](null);
+    return length;
+  }
+  readSlot(i) {
+    return this.copies[dartx._get](i);
+  }
+  writeSlot(i, x) {
+    this.copies[dartx._set](i, x);
+  }
+  cleanupSlots() {}
+  walk(e) {
+    if (e == null) return e;
+    if (typeof e == 'boolean') return e;
+    if (typeof e == 'number') return e;
+    if (typeof e == 'string') return e;
+    if (core.DateTime.is(e)) {
+      return html_common.convertDartToNative_DateTime(e);
+    }
+    if (core.RegExp.is(e)) {
+      dart.throw(new core.UnimplementedError('structured clone of RegExp'));
+    }
+    if (html$.File.is(e)) return e;
+    if (html$.Blob.is(e)) return e;
+    if (html$.FileList.is(e)) return e;
+    if (html$.ImageData.is(e)) return e;
+    if (dart.test(this.cloneNotRequired(e))) return e;
+    if (core.Map.is(e)) {
+      let slot = this.findSlot(e);
+      let copy = this.readSlot(slot);
+      if (copy != null) return copy;
+      copy = this.newJsMap();
+      this.writeSlot(slot, copy);
+      e[dartx.forEach](dart.fn((key, value) => {
+        this.putIntoMap(copy, key, this.walk(value));
+      }, dynamicAnddynamicToNull()));
+      return copy;
+    }
+    if (core.List.is(e)) {
+      let slot = this.findSlot(e);
+      let copy = this.readSlot(slot);
+      if (copy != null) return copy;
+      copy = this.copyList(e, slot);
+      return copy;
+    }
+    dart.throw(new core.UnimplementedError('structured clone of other type'));
+  }
+  copyList(e, slot) {
+    let i = 0;
+    let length = e[dartx.length];
+    let copy = this.newJsList(length);
+    this.writeSlot(slot, copy);
+    for (; i < dart.notNull(length); i++) {
+      copy[dartx._set](i, this.walk(e[dartx._get](i)));
+    }
+    return copy;
+  }
+  convertDartToNative_PrepareForStructuredClone(value) {
+    let copy = this.walk(value);
+    this.cleanupSlots();
+    return copy;
+  }
+};
+dart.setSignature(html_common._StructuredClone, {
+  fields: () => ({
+    values: core.List,
+    copies: core.List
+  }),
+  methods: () => ({
+    findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
+    readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
+    cleanupSlots: dart.definiteFunctionType(dart.dynamic, []),
+    walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    copyList: dart.definiteFunctionType(core.List, [core.List, core.int]),
+    convertDartToNative_PrepareForStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  })
+});
+html_common._AcceptStructuredClone = class _AcceptStructuredClone extends core.Object {
+  new() {
+    this.values = [];
+    this.copies = [];
+    this.mustCopy = false;
+  }
+  findSlot(value) {
+    let length = this.values[dartx.length];
+    for (let i = 0; i < dart.notNull(length); i++) {
+      if (dart.test(this.identicalInJs(this.values[dartx._get](i), value))) return i;
+    }
+    this.values[dartx.add](value);
+    this.copies[dartx.add](null);
+    return length;
+  }
+  readSlot(i) {
+    return this.copies[dartx._get](i);
+  }
+  writeSlot(i, x) {
+    this.copies[dartx._set](i, x);
+  }
+  walk(e) {
+    if (e == null) return e;
+    if (typeof e == 'boolean') return e;
+    if (typeof e == 'number') return e;
+    if (typeof e == 'string') return e;
+    if (dart.test(html_common.isJavaScriptDate(e))) {
+      return html_common.convertNativeToDart_DateTime(e);
+    }
+    if (dart.test(html_common.isJavaScriptRegExp(e))) {
+      dart.throw(new core.UnimplementedError('structured clone of RegExp'));
+    }
+    if (dart.test(html_common.isJavaScriptPromise(e))) {
+      return html_common.convertNativePromiseToDartFuture(e);
+    }
+    if (dart.test(html_common.isJavaScriptSimpleObject(e))) {
+      let slot = this.findSlot(e);
+      let copy = this.readSlot(slot);
+      if (copy != null) return copy;
+      copy = dart.map();
+      this.writeSlot(slot, copy);
+      this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
+      return copy;
+    }
+    if (dart.test(html_common.isJavaScriptArray(e))) {
+      let l = e;
+      let slot = this.findSlot(l);
+      let copy = this.readSlot(slot);
+      if (copy != null) return copy;
+      let length = l[dartx.length];
+      copy = dart.test(this.mustCopy) ? this.newDartList(length) : l;
+      this.writeSlot(slot, copy);
+      for (let i = 0; i < dart.notNull(length); i++) {
+        copy[dartx._set](i, this.walk(l[dartx._get](i)));
+      }
+      return copy;
+    }
+    return e;
+  }
+  convertNativeToDart_AcceptStructuredClone(object, opts) {
+    let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
+    this.mustCopy = core.bool._check(mustCopy);
+    let copy = this.walk(object);
+    return copy;
+  }
+};
+dart.setSignature(html_common._AcceptStructuredClone, {
+  fields: () => ({
+    values: core.List,
+    copies: core.List,
+    mustCopy: core.bool
+  }),
+  methods: () => ({
+    findSlot: dart.definiteFunctionType(core.int, [dart.dynamic]),
+    readSlot: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    writeSlot: dart.definiteFunctionType(dart.dynamic, [core.int, dart.dynamic]),
+    walk: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
+    convertNativeToDart_AcceptStructuredClone: dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})
+  })
+});
+html_common.ContextAttributes = class ContextAttributes extends core.Object {
+  new(alpha, antialias, depth, failIfMajorPerformanceCaveat, premultipliedAlpha, preserveDrawingBuffer, stencil) {
+    this.alpha = alpha;
+    this.antialias = antialias;
+    this.depth = depth;
+    this.failIfMajorPerformanceCaveat = failIfMajorPerformanceCaveat;
+    this.premultipliedAlpha = premultipliedAlpha;
+    this.preserveDrawingBuffer = preserveDrawingBuffer;
+    this.stencil = stencil;
+  }
+};
+dart.setSignature(html_common.ContextAttributes, {
+  constructors: () => ({new: dart.definiteFunctionType(html_common.ContextAttributes, [core.bool, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool])}),
+  fields: () => ({
+    alpha: core.bool,
+    antialias: core.bool,
+    depth: core.bool,
+    premultipliedAlpha: core.bool,
+    preserveDrawingBuffer: core.bool,
+    stencil: core.bool,
+    failIfMajorPerformanceCaveat: core.bool
+  })
+});
+html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
+  return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
+};
+dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
+html_common._TypedImageData = class _TypedImageData extends core.Object {
+  new(data, height, width) {
+    this.data = data;
+    this.height = height;
+    this.width = width;
+  }
+};
+html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
+dart.setSignature(html_common._TypedImageData, {
+  constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
+  fields: () => ({
+    data: typed_data.Uint8ClampedList,
+    height: core.int,
+    width: core.int
+  })
+});
+html_common.convertNativeToDart_ImageData = function(nativeImageData) {
+  0;
+  if (html$.ImageData.is(nativeImageData)) {
+    let data = nativeImageData[dartx.data];
+    if (data.constructor === Array) {
+      if (typeof CanvasPixelArray !== "undefined") {
+        data.constructor = CanvasPixelArray;
+        data.BYTES_PER_ELEMENT = 1;
+      }
+    }
+    return nativeImageData;
+  }
+  return new html_common._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
+};
+dart.fn(html_common.convertNativeToDart_ImageData, dynamicToImageData());
+html_common.convertDartToNative_ImageData = function(imageData) {
+  if (html_common._TypedImageData.is(imageData)) {
+    return {data: imageData.data, height: imageData.height, width: imageData.width};
+  }
+  return imageData;
+};
+dart.fn(html_common.convertDartToNative_ImageData, ImageDataTodynamic());
+html_common._serializedScriptValue = 'num|String|bool|' + 'JSExtendableArray|=Object|' + 'Blob|File|NativeByteBuffer|NativeTypedData';
+html_common.annotation_Creates_SerializedScriptValue = dart.const(new _js_helper.Creates(html_common._serializedScriptValue));
+html_common.annotation_Returns_SerializedScriptValue = dart.const(new _js_helper.Returns(html_common._serializedScriptValue));
+html_common.convertNativeToDart_Dictionary = function(object) {
+  if (object == null) return null;
+  let dict = dart.map();
+  let keys = Object.getOwnPropertyNames(object);
+  for (let key of core.Iterable._check(keys)) {
+    dict[dartx._set](key, object[key]);
+  }
+  return dict;
+};
+dart.fn(html_common.convertNativeToDart_Dictionary, dynamicToMap());
+html_common.convertDartToNative_Dictionary = function(dict, postCreate) {
+  if (postCreate === void 0) postCreate = null;
+  if (dict == null) return null;
+  let object = {};
+  if (postCreate != null) {
+    dart.dcall(postCreate, object);
+  }
+  dict[dartx.forEach](dart.fn((key, value) => {
+    object[key] = value;
+  }, StringAnddynamicToNull()));
+  return object;
+};
+dart.fn(html_common.convertDartToNative_Dictionary, Map__Todynamic());
+html_common.convertDartToNative_StringArray = function(input) {
+  return input;
+};
+dart.fn(html_common.convertDartToNative_StringArray, ListOfStringToList());
+html_common.convertNativeToDart_DateTime = function(date) {
+  let millisSinceEpoch = date.getTime();
+  return new core.DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, {isUtc: true});
+};
+dart.fn(html_common.convertNativeToDart_DateTime, dynamicToDateTime());
+html_common.convertDartToNative_DateTime = function(date) {
+  return new Date(date.millisecondsSinceEpoch);
+};
+dart.fn(html_common.convertDartToNative_DateTime, DateTimeTodynamic());
+html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
+  return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
+};
+dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
+html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
+  let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
+  return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
+};
+dart.fn(html_common.convertNativeToDart_AcceptStructuredClone, dynamic__Todynamic());
+html_common._StructuredCloneDart2Js = class _StructuredCloneDart2Js extends html_common._StructuredClone {
+  new() {
+    super.new();
+  }
+  newJsMap() {
+    return {};
+  }
+  putIntoMap(map, key, value) {
+    return map[key] = value;
+  }
+  newJsList(length) {
+    return new Array(length);
+  }
+  cloneNotRequired(e) {
+    return _native_typed_data.NativeByteBuffer.is(e) || _native_typed_data.NativeTypedData.is(e);
+  }
+};
+dart.setSignature(html_common._StructuredCloneDart2Js, {
+  methods: () => ({
+    newJsMap: dart.definiteFunctionType(dart.dynamic, []),
+    putIntoMap: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    cloneNotRequired: dart.definiteFunctionType(core.bool, [dart.dynamic])
+  })
+});
+html_common._AcceptStructuredCloneDart2Js = class _AcceptStructuredCloneDart2Js extends html_common._AcceptStructuredClone {
+  new() {
+    super.new();
+  }
+  newJsList(length) {
+    return new Array(length);
+  }
+  newDartList(length) {
+    return this.newJsList(length);
+  }
+  identicalInJs(a, b) {
+    return core.identical(a, b);
+  }
+  forEachJsField(object, action) {
+    for (let key of Object.keys(object)) {
+      dart.dcall(action, key, object[key]);
+    }
+  }
+};
+dart.setSignature(html_common._AcceptStructuredCloneDart2Js, {
+  methods: () => ({
+    newJsList: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    newDartList: dart.definiteFunctionType(core.List, [dart.dynamic]),
+    identicalInJs: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    forEachJsField: dart.definiteFunctionType(dart.void, [dart.dynamic, dynamicAnddynamicTodynamic()])
+  })
+});
+html_common.isJavaScriptDate = function(value) {
+  return value instanceof Date;
+};
+dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
+html_common.isJavaScriptRegExp = function(value) {
+  return value instanceof RegExp;
+};
+dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
+html_common.isJavaScriptArray = function(value) {
+  return value instanceof Array;
+};
+dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
+html_common.isJavaScriptSimpleObject = function(value) {
+  let proto = Object.getPrototypeOf(value);
+  return proto === Object.prototype || proto === null;
+};
+dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
+html_common.isImmutableJavaScriptArray = function(value) {
+  return !!value.immutable$list;
+};
+dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
+html_common.isJavaScriptPromise = function(value) {
+  return typeof Promise != "undefined" && value instanceof Promise;
+};
+dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
+html_common.convertNativePromiseToDartFuture = function(promise) {
+  let completer = async.Completer.new();
+  let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
+  let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
+  let newPromise = promise.then(then).catch(error);
+  return completer.future;
+};
+dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
+html_common.Device = class Device extends core.Object {
+  static get userAgent() {
+    return html$.window[dartx.navigator][dartx.userAgent];
+  }
+  static get isOpera() {
+    if (html_common.Device._isOpera == null) {
+      html_common.Device._isOpera = html_common.Device.userAgent[dartx.contains]("Opera", 0);
+    }
+    return html_common.Device._isOpera;
+  }
+  static get isIE() {
+    if (html_common.Device._isIE == null) {
+      html_common.Device._isIE = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("Trident/", 0));
+    }
+    return html_common.Device._isIE;
+  }
+  static get isFirefox() {
+    if (html_common.Device._isFirefox == null) {
+      html_common.Device._isFirefox = html_common.Device.userAgent[dartx.contains]("Firefox", 0);
+    }
+    return html_common.Device._isFirefox;
+  }
+  static get isWebKit() {
+    if (html_common.Device._isWebKit == null) {
+      html_common.Device._isWebKit = !dart.test(html_common.Device.isOpera) && dart.test(html_common.Device.userAgent[dartx.contains]("WebKit", 0));
+    }
+    return html_common.Device._isWebKit;
+  }
+  static get cssPrefix() {
+    let prefix = html_common.Device._cachedCssPrefix;
+    if (prefix != null) return prefix;
+    if (dart.test(html_common.Device.isFirefox)) {
+      prefix = '-moz-';
+    } else if (dart.test(html_common.Device.isIE)) {
+      prefix = '-ms-';
+    } else if (dart.test(html_common.Device.isOpera)) {
+      prefix = '-o-';
+    } else {
+      prefix = '-webkit-';
+    }
+    return html_common.Device._cachedCssPrefix = prefix;
+  }
+  static get propertyPrefix() {
+    let prefix = html_common.Device._cachedPropertyPrefix;
+    if (prefix != null) return prefix;
+    if (dart.test(html_common.Device.isFirefox)) {
+      prefix = 'moz';
+    } else if (dart.test(html_common.Device.isIE)) {
+      prefix = 'ms';
+    } else if (dart.test(html_common.Device.isOpera)) {
+      prefix = 'o';
+    } else {
+      prefix = 'webkit';
+    }
+    return html_common.Device._cachedPropertyPrefix = prefix;
+  }
+  static isEventTypeSupported(eventType) {
+    try {
+      let e = html$.Event.eventType(eventType, '');
+      return html$.Event.is(e);
+    } catch (_) {
+    }
+
+    return false;
+  }
+};
+dart.setSignature(html_common.Device, {
+  sfields: () => ({
+    _isOpera: core.bool,
+    _isIE: core.bool,
+    _isFirefox: core.bool,
+    _isWebKit: core.bool,
+    _cachedCssPrefix: core.String,
+    _cachedPropertyPrefix: core.String
+  }),
+  sgetters: () => ({
+    userAgent: dart.definiteFunctionType(core.String, []),
+    isOpera: dart.definiteFunctionType(core.bool, []),
+    isIE: dart.definiteFunctionType(core.bool, []),
+    isFirefox: dart.definiteFunctionType(core.bool, []),
+    isWebKit: dart.definiteFunctionType(core.bool, []),
+    cssPrefix: dart.definiteFunctionType(core.String, []),
+    propertyPrefix: dart.definiteFunctionType(core.String, [])
+  }),
+  statics: () => ({isEventTypeSupported: dart.definiteFunctionType(core.bool, [core.String])}),
+  names: ['isEventTypeSupported']
+});
+html_common.Device._isOpera = null;
+html_common.Device._isIE = null;
+html_common.Device._isFirefox = null;
+html_common.Device._isWebKit = null;
+html_common.Device._cachedCssPrefix = null;
+html_common.Device._cachedPropertyPrefix = null;
+const _childNodes = Symbol('_childNodes');
+const _node = Symbol('_node');
+const _iterable$0 = Symbol('_iterable');
+const _filtered = Symbol('_filtered');
+html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
+  new(node) {
+    this[_childNodes] = node[dartx.nodes];
+    this[_node] = node;
+  }
+  get [_iterable$0]() {
+    return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
+  }
+  get [_filtered]() {
+    return ListOfElement().from(this[_iterable$0], {growable: false});
+  }
+  forEach(f) {
+    this[_filtered][dartx.forEach](f);
+  }
+  _set(index, value) {
+    this._get(index)[dartx.replaceWith](value);
+    return value;
+  }
+  set length(newLength) {
+    let len = this.length;
+    if (dart.notNull(newLength) >= dart.notNull(len)) {
+      return;
+    } else if (dart.notNull(newLength) < 0) {
+      dart.throw(new core.ArgumentError("Invalid list length"));
+    }
+    this.removeRange(newLength, len);
+  }
+  add(value) {
+    this[_childNodes][dartx.add](value);
+  }
+  addAll(iterable) {
+    for (let element of iterable) {
+      this.add(element);
+    }
+  }
+  contains(needle) {
+    if (!html$.Element.is(needle)) return false;
+    let element = html$.Element._check(needle);
+    return dart.equals(element[dartx.parentNode], this[_node]);
+  }
+  get reversed() {
+    return this[_filtered][dartx.reversed];
+  }
+  sort(compare) {
+    if (compare === void 0) compare = null;
+    dart.throw(new core.UnsupportedError('Cannot sort filtered list'));
+  }
+  setRange(start, end, iterable, skipCount) {
+    if (skipCount === void 0) skipCount = 0;
+    dart.throw(new core.UnsupportedError('Cannot setRange on filtered list'));
+  }
+  fillRange(start, end, fillValue) {
+    if (fillValue === void 0) fillValue = null;
+    dart.throw(new core.UnsupportedError('Cannot fillRange on filtered list'));
+  }
+  replaceRange(start, end, iterable) {
+    dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
+  }
+  removeRange(start, end) {
+    core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
+  }
+  clear() {
+    this[_childNodes][dartx.clear]();
+  }
+  removeLast() {
+    let result = this[_iterable$0][dartx.last];
+    if (result != null) {
+      result[dartx.remove]();
+    }
+    return result;
+  }
+  insert(index, value) {
+    if (index == this.length) {
+      this.add(value);
+    } else {
+      let element = this[_iterable$0][dartx.elementAt](index);
+      element[dartx.parentNode][dartx.insertBefore](value, element);
+    }
+  }
+  insertAll(index, iterable) {
+    if (index == this.length) {
+      this.addAll(iterable);
+    } else {
+      let element = this[_iterable$0][dartx.elementAt](index);
+      element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
+    }
+  }
+  removeAt(index) {
+    let result = this._get(index);
+    result[dartx.remove]();
+    return result;
+  }
+  remove(element) {
+    if (!html$.Element.is(element)) return false;
+    if (dart.test(this.contains(element))) {
+      html$.Element.as(element)[dartx.remove]();
+      return true;
+    } else {
+      return false;
+    }
+  }
+  get length() {
+    return this[_iterable$0][dartx.length];
+  }
+  _get(index) {
+    return this[_iterable$0][dartx.elementAt](index);
+  }
+  get iterator() {
+    return this[_filtered][dartx.iterator];
+  }
+  get rawList() {
+    return this[_node][dartx.childNodes];
+  }
+};
+dart.addSimpleTypeTests(html_common.FilteredElementList);
+html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
+dart.setSignature(html_common.FilteredElementList, {
+  constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
+  fields: () => ({
+    [_node]: html$.Node,
+    [_childNodes]: ListOfNode()
+  }),
+  getters: () => ({
+    [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
+    [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
+    length: dart.definiteFunctionType(core.int, []),
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
+  }),
+  setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
+    _get: dart.definiteFunctionType(html$.Element, [core.int])
+  })
+});
+dart.defineExtensionMembers(html_common.FilteredElementList, [
+  'forEach',
+  '_set',
+  'add',
+  'addAll',
+  'contains',
+  'sort',
+  'setRange',
+  'fillRange',
+  'replaceRange',
+  'removeRange',
+  'clear',
+  'removeLast',
+  'insert',
+  'insertAll',
+  'removeAt',
+  'remove',
+  '_get',
+  'length',
+  'reversed',
+  'length',
+  'iterator'
+]);
+html_common.Lists = class Lists extends core.Object {
+  static indexOf(a, element, startIndex, endIndex) {
+    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
+      return -1;
+    }
+    if (dart.notNull(startIndex) < 0) {
+      startIndex = 0;
+    }
+    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
+      if (dart.equals(a[dartx._get](i), element)) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  static lastIndexOf(a, element, startIndex) {
+    if (dart.notNull(startIndex) < 0) {
+      return -1;
+    }
+    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
+      startIndex = dart.notNull(a[dartx.length]) - 1;
+    }
+    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
+      if (dart.equals(a[dartx._get](i), element)) {
+        return i;
+      }
+    }
+    return -1;
+  }
+  static getRange(a, start, end, accumulator) {
+    if (dart.notNull(start) < 0) dart.throw(new core.RangeError.value(start));
+    if (dart.notNull(end) < dart.notNull(start)) dart.throw(new core.RangeError.value(end));
+    if (dart.notNull(end) > dart.notNull(a[dartx.length])) dart.throw(new core.RangeError.value(end));
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      accumulator[dartx.add](a[dartx._get](i));
+    }
+    return accumulator;
+  }
+};
+dart.setSignature(html_common.Lists, {
+  statics: () => ({
+    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
+    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
+    getRange: dart.definiteFunctionType(core.List, [core.List, core.int, core.int, core.List])
+  }),
+  names: ['indexOf', 'lastIndexOf', 'getRange']
+});
+html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
+svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
+  static createSvgElement_tag(tag) {
+    let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
+    return svg$.SvgElement._check(temp);
+  }
+};
+dart.setSignature(svg$._SvgElementFactoryProvider, {
+  statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
+  names: ['createSvgElement_tag']
+});
+const _children$ = Symbol('_children');
+const _svgClassName = Symbol('_svgClassName');
+dart.defineExtensionNames([
+  'classes',
+  'children',
+  'children',
+  'outerHtml',
+  'innerHtml',
+  'innerHtml',
+  'createFragment',
+  'insertAdjacentText',
+  'insertAdjacentHtml',
+  'insertAdjacentElement',
+  'isContentEditable',
+  'click',
+  'blur',
+  'focus',
+  'onAbort',
+  'onBlur',
+  'onCanPlay',
+  'onCanPlayThrough',
+  'onChange',
+  'onClick',
+  'onContextMenu',
+  'onDoubleClick',
+  'onDrag',
+  'onDragEnd',
+  'onDragEnter',
+  'onDragLeave',
+  'onDragOver',
+  'onDragStart',
+  'onDrop',
+  'onDurationChange',
+  'onEmptied',
+  'onEnded',
+  'onError',
+  'onFocus',
+  'onInput',
+  'onInvalid',
+  'onKeyDown',
+  'onKeyPress',
+  'onKeyUp',
+  'onLoad',
+  'onLoadedData',
+  'onLoadedMetadata',
+  'onMouseDown',
+  'onMouseEnter',
+  'onMouseLeave',
+  'onMouseMove',
+  'onMouseOut',
+  'onMouseOver',
+  'onMouseUp',
+  'onMouseWheel',
+  'onPause',
+  'onPlay',
+  'onPlaying',
+  'onRateChange',
+  'onReset',
+  'onResize',
+  'onScroll',
+  'onSeeked',
+  'onSeeking',
+  'onSelect',
+  'onStalled',
+  'onSubmit',
+  'onSuspend',
+  'onTimeUpdate',
+  'onVolumeChange',
+  'onWaiting',
+  'ownerSvgElement',
+  'viewportElement'
+]);
+svg$.SvgElement = class SvgElement extends html$.Element {
+  static tag(tag) {
+    return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
+  }
+  static svg(svg, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (validator == null && treeSanitizer == null) {
+      validator = new html$.NodeValidatorBuilder.common();
+      validator.allowSvg();
+    }
+    let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
+    let parentElement = null;
+    if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
+      parentElement = html$.document[dartx.body];
+    } else {
+      parentElement = svg$.SvgSvgElement.new();
+    }
+    let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
+    return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
+  }
+  get [dartx.classes]() {
+    return new svg$._AttributeClassSet(this);
+  }
+  set [dartx.classes](value) {
+    super[dartx.classes] = value;
+  }
+  get [dartx.children]() {
+    return new html_common.FilteredElementList(this);
+  }
+  set [dartx.children](value) {
+    let children = this[dartx.children];
+    children[dartx.clear]();
+    children[dartx.addAll](value);
+  }
+  get [dartx.outerHtml]() {
+    let container = html$.Element.tag("div");
+    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
+    container[dartx.children][dartx.add](cloned);
+    return container[dartx.innerHtml];
+  }
+  get [dartx.innerHtml]() {
+    let container = html$.Element.tag("div");
+    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
+    container[dartx.children][dartx.addAll](cloned[dartx.children]);
+    return container[dartx.innerHtml];
+  }
+  set [dartx.innerHtml](value) {
+    this[dartx.setInnerHtml](value);
+  }
+  [dartx.createFragment](svg, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    if (treeSanitizer == null) {
+      if (validator == null) {
+        validator = new html$.NodeValidatorBuilder.common();
+        validator.allowSvg();
+      }
+      treeSanitizer = html$.NodeTreeSanitizer.new(validator);
+    }
+    let html = dart.str`<svg version="1.1">${svg}</svg>`;
+    let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
+    let svgFragment = html$.DocumentFragment.new();
+    let root = fragment[dartx.nodes][dartx.single];
+    while (root[dartx.firstChild] != null) {
+      svgFragment[dartx.append](root[dartx.firstChild]);
+    }
+    return svgFragment;
+  }
+  [dartx.insertAdjacentText](where, text) {
+    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentText on SVG."));
+  }
+  [dartx.insertAdjacentHtml](where, text, opts) {
+    let validator = opts && 'validator' in opts ? opts.validator : null;
+    let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
+    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentHtml on SVG."));
+  }
+  [dartx.insertAdjacentElement](where, element) {
+    dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
+  }
+  get [_children$]() {
+    dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
+  }
+  get [dartx.isContentEditable]() {
+    return false;
+  }
+  [dartx.click]() {
+    dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
+  }
+  static isTagSupported(tag) {
+    let e = svg$.SvgElement.tag(tag);
+    return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.ownerSvgElement] = null;
+    this[dartx.viewportElement] = null;
+    super.created();
+  }
+  get [_svgClassName]() {
+    return this.className;
+  }
+  get [dartx.ownerSvgElement]() {
+    return this.ownerSVGElement;
+  }
+  get [dartx.viewportElement]() {
+    return this.viewportElement;
+  }
+  [dartx.blur](...args) {
+    return this.blur.apply(this, args);
+  }
+  [dartx.focus](...args) {
+    return this.focus.apply(this, args);
+  }
+  get [dartx.onAbort]() {
+    return svg$.SvgElement.abortEvent.forElement(this);
+  }
+  get [dartx.onBlur]() {
+    return svg$.SvgElement.blurEvent.forElement(this);
+  }
+  get [dartx.onCanPlay]() {
+    return svg$.SvgElement.canPlayEvent.forElement(this);
+  }
+  get [dartx.onCanPlayThrough]() {
+    return svg$.SvgElement.canPlayThroughEvent.forElement(this);
+  }
+  get [dartx.onChange]() {
+    return svg$.SvgElement.changeEvent.forElement(this);
+  }
+  get [dartx.onClick]() {
+    return svg$.SvgElement.clickEvent.forElement(this);
+  }
+  get [dartx.onContextMenu]() {
+    return svg$.SvgElement.contextMenuEvent.forElement(this);
+  }
+  get [dartx.onDoubleClick]() {
+    return svg$.SvgElement.doubleClickEvent.forElement(this);
+  }
+  get [dartx.onDrag]() {
+    return svg$.SvgElement.dragEvent.forElement(this);
+  }
+  get [dartx.onDragEnd]() {
+    return svg$.SvgElement.dragEndEvent.forElement(this);
+  }
+  get [dartx.onDragEnter]() {
+    return svg$.SvgElement.dragEnterEvent.forElement(this);
+  }
+  get [dartx.onDragLeave]() {
+    return svg$.SvgElement.dragLeaveEvent.forElement(this);
+  }
+  get [dartx.onDragOver]() {
+    return svg$.SvgElement.dragOverEvent.forElement(this);
+  }
+  get [dartx.onDragStart]() {
+    return svg$.SvgElement.dragStartEvent.forElement(this);
+  }
+  get [dartx.onDrop]() {
+    return svg$.SvgElement.dropEvent.forElement(this);
+  }
+  get [dartx.onDurationChange]() {
+    return svg$.SvgElement.durationChangeEvent.forElement(this);
+  }
+  get [dartx.onEmptied]() {
+    return svg$.SvgElement.emptiedEvent.forElement(this);
+  }
+  get [dartx.onEnded]() {
+    return svg$.SvgElement.endedEvent.forElement(this);
+  }
+  get [dartx.onError]() {
+    return svg$.SvgElement.errorEvent.forElement(this);
+  }
+  get [dartx.onFocus]() {
+    return svg$.SvgElement.focusEvent.forElement(this);
+  }
+  get [dartx.onInput]() {
+    return svg$.SvgElement.inputEvent.forElement(this);
+  }
+  get [dartx.onInvalid]() {
+    return svg$.SvgElement.invalidEvent.forElement(this);
+  }
+  get [dartx.onKeyDown]() {
+    return svg$.SvgElement.keyDownEvent.forElement(this);
+  }
+  get [dartx.onKeyPress]() {
+    return svg$.SvgElement.keyPressEvent.forElement(this);
+  }
+  get [dartx.onKeyUp]() {
+    return svg$.SvgElement.keyUpEvent.forElement(this);
+  }
+  get [dartx.onLoad]() {
+    return svg$.SvgElement.loadEvent.forElement(this);
+  }
+  get [dartx.onLoadedData]() {
+    return svg$.SvgElement.loadedDataEvent.forElement(this);
+  }
+  get [dartx.onLoadedMetadata]() {
+    return svg$.SvgElement.loadedMetadataEvent.forElement(this);
+  }
+  get [dartx.onMouseDown]() {
+    return svg$.SvgElement.mouseDownEvent.forElement(this);
+  }
+  get [dartx.onMouseEnter]() {
+    return svg$.SvgElement.mouseEnterEvent.forElement(this);
+  }
+  get [dartx.onMouseLeave]() {
+    return svg$.SvgElement.mouseLeaveEvent.forElement(this);
+  }
+  get [dartx.onMouseMove]() {
+    return svg$.SvgElement.mouseMoveEvent.forElement(this);
+  }
+  get [dartx.onMouseOut]() {
+    return svg$.SvgElement.mouseOutEvent.forElement(this);
+  }
+  get [dartx.onMouseOver]() {
+    return svg$.SvgElement.mouseOverEvent.forElement(this);
+  }
+  get [dartx.onMouseUp]() {
+    return svg$.SvgElement.mouseUpEvent.forElement(this);
+  }
+  get [dartx.onMouseWheel]() {
+    return svg$.SvgElement.mouseWheelEvent.forElement(this);
+  }
+  get [dartx.onPause]() {
+    return svg$.SvgElement.pauseEvent.forElement(this);
+  }
+  get [dartx.onPlay]() {
+    return svg$.SvgElement.playEvent.forElement(this);
+  }
+  get [dartx.onPlaying]() {
+    return svg$.SvgElement.playingEvent.forElement(this);
+  }
+  get [dartx.onRateChange]() {
+    return svg$.SvgElement.rateChangeEvent.forElement(this);
+  }
+  get [dartx.onReset]() {
+    return svg$.SvgElement.resetEvent.forElement(this);
+  }
+  get [dartx.onResize]() {
+    return svg$.SvgElement.resizeEvent.forElement(this);
+  }
+  get [dartx.onScroll]() {
+    return svg$.SvgElement.scrollEvent.forElement(this);
+  }
+  get [dartx.onSeeked]() {
+    return svg$.SvgElement.seekedEvent.forElement(this);
+  }
+  get [dartx.onSeeking]() {
+    return svg$.SvgElement.seekingEvent.forElement(this);
+  }
+  get [dartx.onSelect]() {
+    return svg$.SvgElement.selectEvent.forElement(this);
+  }
+  get [dartx.onStalled]() {
+    return svg$.SvgElement.stalledEvent.forElement(this);
+  }
+  get [dartx.onSubmit]() {
+    return svg$.SvgElement.submitEvent.forElement(this);
+  }
+  get [dartx.onSuspend]() {
+    return svg$.SvgElement.suspendEvent.forElement(this);
+  }
+  get [dartx.onTimeUpdate]() {
+    return svg$.SvgElement.timeUpdateEvent.forElement(this);
+  }
+  get [dartx.onVolumeChange]() {
+    return svg$.SvgElement.volumeChangeEvent.forElement(this);
+  }
+  get [dartx.onWaiting]() {
+    return svg$.SvgElement.waitingEvent.forElement(this);
+  }
+};
+dart.defineNamedConstructor(svg$.SvgElement, 'created');
+svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
+dart.setSignature(svg$.SvgElement, {
+  constructors: () => ({
+    tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
+    svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    _: dart.definiteFunctionType(svg$.SvgElement, []),
+    created: dart.definiteFunctionType(svg$.SvgElement, [])
+  }),
+  fields: () => ({
+    [dartx.ownerSvgElement]: svg$.SvgSvgElement,
+    [dartx.viewportElement]: svg$.SvgElement
+  }),
+  getters: () => ({
+    [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
+    [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
+  }),
+  sfields: () => ({
+    _START_TAG_REGEXP: core.RegExp,
+    abortEvent: EventStreamProviderOfEvent(),
+    blurEvent: EventStreamProviderOfEvent(),
+    canPlayEvent: EventStreamProviderOfEvent(),
+    canPlayThroughEvent: EventStreamProviderOfEvent(),
+    changeEvent: EventStreamProviderOfEvent(),
+    clickEvent: EventStreamProviderOfMouseEvent(),
+    contextMenuEvent: EventStreamProviderOfMouseEvent(),
+    doubleClickEvent: EventStreamProviderOfEvent(),
+    dragEvent: EventStreamProviderOfMouseEvent(),
+    dragEndEvent: EventStreamProviderOfMouseEvent(),
+    dragEnterEvent: EventStreamProviderOfMouseEvent(),
+    dragLeaveEvent: EventStreamProviderOfMouseEvent(),
+    dragOverEvent: EventStreamProviderOfMouseEvent(),
+    dragStartEvent: EventStreamProviderOfMouseEvent(),
+    dropEvent: EventStreamProviderOfMouseEvent(),
+    durationChangeEvent: EventStreamProviderOfEvent(),
+    emptiedEvent: EventStreamProviderOfEvent(),
+    endedEvent: EventStreamProviderOfEvent(),
+    errorEvent: EventStreamProviderOfEvent(),
+    focusEvent: EventStreamProviderOfEvent(),
+    inputEvent: EventStreamProviderOfEvent(),
+    invalidEvent: EventStreamProviderOfEvent(),
+    keyDownEvent: EventStreamProviderOfKeyboardEvent(),
+    keyPressEvent: EventStreamProviderOfKeyboardEvent(),
+    keyUpEvent: EventStreamProviderOfKeyboardEvent(),
+    loadEvent: EventStreamProviderOfEvent(),
+    loadedDataEvent: EventStreamProviderOfEvent(),
+    loadedMetadataEvent: EventStreamProviderOfEvent(),
+    mouseDownEvent: EventStreamProviderOfMouseEvent(),
+    mouseEnterEvent: EventStreamProviderOfMouseEvent(),
+    mouseLeaveEvent: EventStreamProviderOfMouseEvent(),
+    mouseMoveEvent: EventStreamProviderOfMouseEvent(),
+    mouseOutEvent: EventStreamProviderOfMouseEvent(),
+    mouseOverEvent: EventStreamProviderOfMouseEvent(),
+    mouseUpEvent: EventStreamProviderOfMouseEvent(),
+    mouseWheelEvent: EventStreamProviderOfWheelEvent(),
+    pauseEvent: EventStreamProviderOfEvent(),
+    playEvent: EventStreamProviderOfEvent(),
+    playingEvent: EventStreamProviderOfEvent(),
+    rateChangeEvent: EventStreamProviderOfEvent(),
+    resetEvent: EventStreamProviderOfEvent(),
+    resizeEvent: EventStreamProviderOfEvent(),
+    scrollEvent: EventStreamProviderOfEvent(),
+    seekedEvent: EventStreamProviderOfEvent(),
+    seekingEvent: EventStreamProviderOfEvent(),
+    selectEvent: EventStreamProviderOfEvent(),
+    stalledEvent: EventStreamProviderOfEvent(),
+    submitEvent: EventStreamProviderOfEvent(),
+    suspendEvent: EventStreamProviderOfEvent(),
+    timeUpdateEvent: EventStreamProviderOfEvent(),
+    volumeChangeEvent: EventStreamProviderOfEvent(),
+    waitingEvent: EventStreamProviderOfEvent()
+  })
+});
+dart.defineLazy(svg$.SvgElement, {
+  get _START_TAG_REGEXP() {
+    return core.RegExp.new('<(\\w+)');
+  },
+  get abortEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('abort'));
+  },
+  get blurEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('blur'));
+  },
+  get canPlayEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplay'));
+  },
+  get canPlayThroughEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('canplaythrough'));
+  },
+  get changeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('change'));
+  },
+  get clickEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('click'));
+  },
+  get contextMenuEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('contextmenu'));
+  },
+  get doubleClickEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('dblclick'));
+  },
+  get dragEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drag'));
+  },
+  get dragEndEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragend'));
+  },
+  get dragEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragenter'));
+  },
+  get dragLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragleave'));
+  },
+  get dragOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragover'));
+  },
+  get dragStartEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('dragstart'));
+  },
+  get dropEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('drop'));
+  },
+  get durationChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('durationchange'));
+  },
+  get emptiedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('emptied'));
+  },
+  get endedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ended'));
+  },
+  get errorEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('error'));
+  },
+  get focusEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('focus'));
+  },
+  get inputEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('input'));
+  },
+  get invalidEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('invalid'));
+  },
+  get keyDownEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keydown'));
+  },
+  get keyPressEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keypress'));
+  },
+  get keyUpEvent() {
+    return dart.const(new (EventStreamProviderOfKeyboardEvent())('keyup'));
+  },
+  get loadEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('load'));
+  },
+  get loadedDataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadeddata'));
+  },
+  get loadedMetadataEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('loadedmetadata'));
+  },
+  get mouseDownEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousedown'));
+  },
+  get mouseEnterEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseenter'));
+  },
+  get mouseLeaveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseleave'));
+  },
+  get mouseMoveEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mousemove'));
+  },
+  get mouseOutEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseout'));
+  },
+  get mouseOverEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseover'));
+  },
+  get mouseUpEvent() {
+    return dart.const(new (EventStreamProviderOfMouseEvent())('mouseup'));
+  },
+  get mouseWheelEvent() {
+    return dart.const(new (EventStreamProviderOfWheelEvent())('mousewheel'));
+  },
+  get pauseEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('pause'));
+  },
+  get playEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('play'));
+  },
+  get playingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('playing'));
+  },
+  get rateChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('ratechange'));
+  },
+  get resetEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('reset'));
+  },
+  get resizeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('resize'));
+  },
+  get scrollEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('scroll'));
+  },
+  get seekedEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeked'));
+  },
+  get seekingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('seeking'));
+  },
+  get selectEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('select'));
+  },
+  get stalledEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('stalled'));
+  },
+  get submitEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('submit'));
+  },
+  get suspendEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('suspend'));
+  },
+  get timeUpdateEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('timeupdate'));
+  },
+  get volumeChangeEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('volumechange'));
+  },
+  get waitingEvent() {
+    return dart.const(new (EventStreamProviderOfEvent())('waiting'));
+  }
+});
+dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
+dart.defineExtensionNames([
+  'getBBox',
+  'getCtm',
+  'getScreenCtm',
+  'getTransformToElement',
+  'hasExtension',
+  'farthestViewportElement',
+  'nearestViewportElement',
+  'transform',
+  'requiredExtensions',
+  'requiredFeatures',
+  'systemLanguage'
+]);
+svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.farthestViewportElement] = null;
+    this[dartx.nearestViewportElement] = null;
+    this[dartx.transform] = null;
+    this[dartx.requiredExtensions] = null;
+    this[dartx.requiredFeatures] = null;
+    this[dartx.systemLanguage] = null;
+    super.created();
+  }
+  get [dartx.farthestViewportElement]() {
+    return this.farthestViewportElement;
+  }
+  get [dartx.nearestViewportElement]() {
+    return this.nearestViewportElement;
+  }
+  get [dartx.transform]() {
+    return this.transform;
+  }
+  [dartx.getBBox](...args) {
+    return this.getBBox.apply(this, args);
+  }
+  [dartx.getCtm](...args) {
+    return this.getCTM.apply(this, args);
+  }
+  [dartx.getScreenCtm](...args) {
+    return this.getScreenCTM.apply(this, args);
+  }
+  [dartx.getTransformToElement](...args) {
+    return this.getTransformToElement.apply(this, args);
+  }
+  get [dartx.requiredExtensions]() {
+    return this.requiredExtensions;
+  }
+  get [dartx.requiredFeatures]() {
+    return this.requiredFeatures;
+  }
+  get [dartx.systemLanguage]() {
+    return this.systemLanguage;
+  }
+  [dartx.hasExtension](...args) {
+    return this.hasExtension.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
+svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.GraphicsElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.GraphicsElement, []),
+    created: dart.definiteFunctionType(svg$.GraphicsElement, [])
+  }),
+  fields: () => ({
+    [dartx.farthestViewportElement]: svg$.SvgElement,
+    [dartx.nearestViewportElement]: svg$.SvgElement,
+    [dartx.transform]: svg$.AnimatedTransformList,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
+  }),
+  methods: () => ({
+    [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
+    [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
+    [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
+  })
+});
+dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
+dart.defineExtensionNames([
+  'target',
+  'href'
+]);
+svg$.AElement = class AElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
+  }
+  created() {
+    this[dartx.target] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.target]() {
+    return this.target;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.AElement, 'created');
+svg$.AElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.AElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.AElement, []),
+    new: dart.definiteFunctionType(svg$.AElement, []),
+    created: dart.definiteFunctionType(svg$.AElement, [])
+  }),
+  fields: () => ({
+    [dartx.target]: svg$.AnimatedString,
+    [dartx.href]: svg$.AnimatedString
+  })
+});
+dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
+dart.defineExtensionNames([
+  'convertToSpecifiedUnits',
+  'newValueSpecifiedUnits',
+  'unitType',
+  'value',
+  'valueAsString',
+  'valueInSpecifiedUnits'
+]);
+svg$.Angle = class Angle extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.unitType]() {
+    return this.unitType;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.valueAsString]() {
+    return this.valueAsString;
+  }
+  set [dartx.valueAsString](value) {
+    this.valueAsString = value;
+  }
+  get [dartx.valueInSpecifiedUnits]() {
+    return this.valueInSpecifiedUnits;
+  }
+  set [dartx.valueInSpecifiedUnits](value) {
+    this.valueInSpecifiedUnits = value;
+  }
+  [dartx.convertToSpecifiedUnits](...args) {
+    return this.convertToSpecifiedUnits.apply(this, args);
+  }
+  [dartx.newValueSpecifiedUnits](...args) {
+    return this.newValueSpecifiedUnits.apply(this, args);
+  }
+};
+dart.setSignature(svg$.Angle, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
+  fields: () => ({
+    [dartx.unitType]: core.int,
+    [dartx.value]: core.num,
+    [dartx.valueAsString]: core.String,
+    [dartx.valueInSpecifiedUnits]: core.num
+  }),
+  methods: () => ({
+    [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
+  }),
+  sfields: () => ({
+    SVG_ANGLETYPE_DEG: core.int,
+    SVG_ANGLETYPE_GRAD: core.int,
+    SVG_ANGLETYPE_RAD: core.int,
+    SVG_ANGLETYPE_UNKNOWN: core.int,
+    SVG_ANGLETYPE_UNSPECIFIED: core.int
+  })
+});
+svg$.Angle.SVG_ANGLETYPE_DEG = 2;
+svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
+svg$.Angle.SVG_ANGLETYPE_RAD = 3;
+svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
+svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
+dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
+dart.defineExtensionNames([
+  'beginElement',
+  'beginElementAt',
+  'endElement',
+  'endElementAt',
+  'getCurrentTime',
+  'getSimpleDuration',
+  'getStartTime',
+  'hasExtension',
+  'targetElement',
+  'requiredExtensions',
+  'requiredFeatures',
+  'systemLanguage'
+]);
+svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
+  }
+  created() {
+    this[dartx.targetElement] = null;
+    this[dartx.requiredExtensions] = null;
+    this[dartx.requiredFeatures] = null;
+    this[dartx.systemLanguage] = null;
+    super.created();
+  }
+  get [dartx.targetElement]() {
+    return this.targetElement;
+  }
+  [dartx.beginElement](...args) {
+    return this.beginElement.apply(this, args);
+  }
+  [dartx.beginElementAt](...args) {
+    return this.beginElementAt.apply(this, args);
+  }
+  [dartx.endElement](...args) {
+    return this.endElement.apply(this, args);
+  }
+  [dartx.endElementAt](...args) {
+    return this.endElementAt.apply(this, args);
+  }
+  [dartx.getCurrentTime](...args) {
+    return this.getCurrentTime.apply(this, args);
+  }
+  [dartx.getSimpleDuration](...args) {
+    return this.getSimpleDuration.apply(this, args);
+  }
+  [dartx.getStartTime](...args) {
+    return this.getStartTime.apply(this, args);
+  }
+  get [dartx.requiredExtensions]() {
+    return this.requiredExtensions;
+  }
+  get [dartx.requiredFeatures]() {
+    return this.requiredFeatures;
+  }
+  get [dartx.systemLanguage]() {
+    return this.systemLanguage;
+  }
+  [dartx.hasExtension](...args) {
+    return this.hasExtension.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.AnimationElement, 'created');
+svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.AnimationElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.AnimationElement, []),
+    new: dart.definiteFunctionType(svg$.AnimationElement, []),
+    created: dart.definiteFunctionType(svg$.AnimationElement, [])
+  }),
+  fields: () => ({
+    [dartx.targetElement]: svg$.SvgElement,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
+  }),
+  methods: () => ({
+    [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
+    [dartx.beginElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.endElement]: dart.definiteFunctionType(dart.void, []),
+    [dartx.endElementAt]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
+    [dartx.getSimpleDuration]: dart.definiteFunctionType(core.double, []),
+    [dartx.getStartTime]: dart.definiteFunctionType(core.double, []),
+    [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
+  })
+});
+dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
+svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
+  }
+};
+dart.defineNamedConstructor(svg$.AnimateElement, 'created');
+dart.setSignature(svg$.AnimateElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.AnimateElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
+svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
+  }
+};
+dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
+dart.setSignature(svg$.AnimateMotionElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
+svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
+  }
+};
+dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
+dart.setSignature(svg$.AnimateTransformElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedAngle, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.Angle,
+    [dartx.baseVal]: svg$.Angle
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+  set [dartx.baseVal](value) {
+    this.baseVal = value;
+  }
+};
+dart.setSignature(svg$.AnimatedBoolean, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
+  fields: () => ({
+    [dartx.animVal]: core.bool,
+    [dartx.baseVal]: core.bool
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+  set [dartx.baseVal](value) {
+    this.baseVal = value;
+  }
+};
+dart.setSignature(svg$.AnimatedEnumeration, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
+  fields: () => ({
+    [dartx.animVal]: core.int,
+    [dartx.baseVal]: core.int
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+  set [dartx.baseVal](value) {
+    this.baseVal = value;
+  }
+};
+dart.setSignature(svg$.AnimatedInteger, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
+  fields: () => ({
+    [dartx.animVal]: core.int,
+    [dartx.baseVal]: core.int
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedLength, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.Length,
+    [dartx.baseVal]: svg$.Length
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedLengthList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.LengthList,
+    [dartx.baseVal]: svg$.LengthList
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+  set [dartx.baseVal](value) {
+    this.baseVal = value;
+  }
+};
+dart.setSignature(svg$.AnimatedNumber, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
+  fields: () => ({
+    [dartx.animVal]: core.double,
+    [dartx.baseVal]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedNumberList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.NumberList,
+    [dartx.baseVal]: svg$.NumberList
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.PreserveAspectRatio,
+    [dartx.baseVal]: svg$.PreserveAspectRatio
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedRect, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.Rect,
+    [dartx.baseVal]: svg$.Rect
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+  set [dartx.baseVal](value) {
+    this.baseVal = value;
+  }
+};
+dart.setSignature(svg$.AnimatedString, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
+  fields: () => ({
+    [dartx.animVal]: core.String,
+    [dartx.baseVal]: core.String
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
+dart.defineExtensionNames([
+  'animVal',
+  'baseVal'
+]);
+svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.animVal]() {
+    return this.animVal;
+  }
+  get [dartx.baseVal]() {
+    return this.baseVal;
+  }
+};
+dart.setSignature(svg$.AnimatedTransformList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
+  fields: () => ({
+    [dartx.animVal]: svg$.TransformList,
+    [dartx.baseVal]: svg$.TransformList
+  })
+});
+dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
+dart.defineExtensionNames([
+  'isPointInFill',
+  'isPointInStroke'
+]);
+svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+  [dartx.isPointInFill](...args) {
+    return this.isPointInFill.apply(this, args);
+  }
+  [dartx.isPointInStroke](...args) {
+    return this.isPointInStroke.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.GeometryElement, 'created');
+dart.setSignature(svg$.GeometryElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.GeometryElement, []),
+    created: dart.definiteFunctionType(svg$.GeometryElement, [])
+  }),
+  methods: () => ({
+    [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
+    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
+  })
+});
+dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
+dart.defineExtensionNames([
+  'cx',
+  'cy',
+  'r'
+]);
+svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
+  }
+  created() {
+    this[dartx.cx] = null;
+    this[dartx.cy] = null;
+    this[dartx.r] = null;
+    super.created();
+  }
+  get [dartx.cx]() {
+    return this.cx;
+  }
+  get [dartx.cy]() {
+    return this.cy;
+  }
+  get [dartx.r]() {
+    return this.r;
+  }
+};
+dart.defineNamedConstructor(svg$.CircleElement, 'created');
+dart.setSignature(svg$.CircleElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.CircleElement, []),
+    new: dart.definiteFunctionType(svg$.CircleElement, []),
+    created: dart.definiteFunctionType(svg$.CircleElement, [])
+  }),
+  fields: () => ({
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.r]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
+dart.defineExtensionNames([
+  'clipPathUnits'
+]);
+svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
+  }
+  created() {
+    this[dartx.clipPathUnits] = null;
+    super.created();
+  }
+  get [dartx.clipPathUnits]() {
+    return this.clipPathUnits;
+  }
+};
+dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
+dart.setSignature(svg$.ClipPathElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.ClipPathElement, []),
+    new: dart.definiteFunctionType(svg$.ClipPathElement, []),
+    created: dart.definiteFunctionType(svg$.ClipPathElement, [])
+  }),
+  fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
+});
+dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
+svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.DefsElement, 'created');
+dart.setSignature(svg$.DefsElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.DefsElement, []),
+    new: dart.definiteFunctionType(svg$.DefsElement, []),
+    created: dart.definiteFunctionType(svg$.DefsElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
+svg$.DescElement = class DescElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.DescElement, 'created');
+dart.setSignature(svg$.DescElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.DescElement, []),
+    new: dart.definiteFunctionType(svg$.DescElement, []),
+    created: dart.definiteFunctionType(svg$.DescElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
+svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.DiscardElement, 'created');
+dart.setSignature(svg$.DiscardElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.DiscardElement, []),
+    created: dart.definiteFunctionType(svg$.DiscardElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
+dart.defineExtensionNames([
+  'cx',
+  'cy',
+  'rx',
+  'ry'
+]);
+svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
+  }
+  created() {
+    this[dartx.cx] = null;
+    this[dartx.cy] = null;
+    this[dartx.rx] = null;
+    this[dartx.ry] = null;
+    super.created();
+  }
+  get [dartx.cx]() {
+    return this.cx;
+  }
+  get [dartx.cy]() {
+    return this.cy;
+  }
+  get [dartx.rx]() {
+    return this.rx;
+  }
+  get [dartx.ry]() {
+    return this.ry;
+  }
+};
+dart.defineNamedConstructor(svg$.EllipseElement, 'created');
+dart.setSignature(svg$.EllipseElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.EllipseElement, []),
+    new: dart.definiteFunctionType(svg$.EllipseElement, []),
+    created: dart.definiteFunctionType(svg$.EllipseElement, [])
+  }),
+  fields: () => ({
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.rx]: svg$.AnimatedLength,
+    [dartx.ry]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
+dart.defineExtensionNames([
+  'in1',
+  'in2',
+  'mode',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.in2] = null;
+    this[dartx.mode] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.in2]() {
+    return this.in2;
+  }
+  get [dartx.mode]() {
+    return this.mode;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
+svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEBlendElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEBlendElement, []),
+    new: dart.definiteFunctionType(svg$.FEBlendElement, []),
+    created: dart.definiteFunctionType(svg$.FEBlendElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.mode]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_FEBLEND_MODE_DARKEN: core.int,
+    SVG_FEBLEND_MODE_LIGHTEN: core.int,
+    SVG_FEBLEND_MODE_MULTIPLY: core.int,
+    SVG_FEBLEND_MODE_NORMAL: core.int,
+    SVG_FEBLEND_MODE_SCREEN: core.int,
+    SVG_FEBLEND_MODE_UNKNOWN: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
+dart.defineExtensionNames([
+  'in1',
+  'type',
+  'values',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.type] = null;
+    this[dartx.values] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.values]() {
+    return this.values;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
+svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEColorMatrixElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
+    new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
+    created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.type]: svg$.AnimatedEnumeration,
+    [dartx.values]: svg$.AnimatedNumberList,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
+    SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA: core.int,
+    SVG_FECOLORMATRIX_TYPE_MATRIX: core.int,
+    SVG_FECOLORMATRIX_TYPE_SATURATE: core.int,
+    SVG_FECOLORMATRIX_TYPE_UNKNOWN: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
+dart.defineExtensionNames([
+  'in1',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
+svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEComponentTransferElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
+    new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
+    created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
+dart.defineExtensionNames([
+  'in1',
+  'in2',
+  'k1',
+  'k2',
+  'k3',
+  'k4',
+  'operator',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.in2] = null;
+    this[dartx.k1] = null;
+    this[dartx.k2] = null;
+    this[dartx.k3] = null;
+    this[dartx.k4] = null;
+    this[dartx.operator] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.in2]() {
+    return this.in2;
+  }
+  get [dartx.k1]() {
+    return this.k1;
+  }
+  get [dartx.k2]() {
+    return this.k2;
+  }
+  get [dartx.k3]() {
+    return this.k3;
+  }
+  get [dartx.k4]() {
+    return this.k4;
+  }
+  get [dartx.operator]() {
+    return this.operator;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
+svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FECompositeElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FECompositeElement, []),
+    created: dart.definiteFunctionType(svg$.FECompositeElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.k1]: svg$.AnimatedNumber,
+    [dartx.k2]: svg$.AnimatedNumber,
+    [dartx.k3]: svg$.AnimatedNumber,
+    [dartx.k4]: svg$.AnimatedNumber,
+    [dartx.operator]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
+    SVG_FECOMPOSITE_OPERATOR_ATOP: core.int,
+    SVG_FECOMPOSITE_OPERATOR_IN: core.int,
+    SVG_FECOMPOSITE_OPERATOR_OUT: core.int,
+    SVG_FECOMPOSITE_OPERATOR_OVER: core.int,
+    SVG_FECOMPOSITE_OPERATOR_UNKNOWN: core.int,
+    SVG_FECOMPOSITE_OPERATOR_XOR: core.int
+  })
+});
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
+dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
+dart.defineExtensionNames([
+  'bias',
+  'divisor',
+  'edgeMode',
+  'in1',
+  'kernelMatrix',
+  'kernelUnitLengthX',
+  'kernelUnitLengthY',
+  'orderX',
+  'orderY',
+  'preserveAlpha',
+  'targetX',
+  'targetY',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
+  }
+  created() {
+    this[dartx.bias] = null;
+    this[dartx.divisor] = null;
+    this[dartx.edgeMode] = null;
+    this[dartx.in1] = null;
+    this[dartx.kernelMatrix] = null;
+    this[dartx.kernelUnitLengthX] = null;
+    this[dartx.kernelUnitLengthY] = null;
+    this[dartx.orderX] = null;
+    this[dartx.orderY] = null;
+    this[dartx.preserveAlpha] = null;
+    this[dartx.targetX] = null;
+    this[dartx.targetY] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
+  }
+  get [dartx.bias]() {
+    return this.bias;
+  }
+  get [dartx.divisor]() {
+    return this.divisor;
+  }
+  get [dartx.edgeMode]() {
+    return this.edgeMode;
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.kernelMatrix]() {
+    return this.kernelMatrix;
+  }
+  get [dartx.kernelUnitLengthX]() {
+    return this.kernelUnitLengthX;
+  }
+  get [dartx.kernelUnitLengthY]() {
+    return this.kernelUnitLengthY;
+  }
+  get [dartx.orderX]() {
+    return this.orderX;
+  }
+  get [dartx.orderY]() {
+    return this.orderY;
+  }
+  get [dartx.preserveAlpha]() {
+    return this.preserveAlpha;
+  }
+  get [dartx.targetX]() {
+    return this.targetX;
+  }
+  get [dartx.targetY]() {
+    return this.targetY;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
+svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEConvolveMatrixElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
+    new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
+    created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
+  }),
+  fields: () => ({
+    [dartx.bias]: svg$.AnimatedNumber,
+    [dartx.divisor]: svg$.AnimatedNumber,
+    [dartx.edgeMode]: svg$.AnimatedEnumeration,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelMatrix]: svg$.AnimatedNumberList,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.orderX]: svg$.AnimatedInteger,
+    [dartx.orderY]: svg$.AnimatedInteger,
+    [dartx.preserveAlpha]: svg$.AnimatedBoolean,
+    [dartx.targetX]: svg$.AnimatedInteger,
+    [dartx.targetY]: svg$.AnimatedInteger,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_EDGEMODE_DUPLICATE: core.int,
+    SVG_EDGEMODE_NONE: core.int,
+    SVG_EDGEMODE_UNKNOWN: core.int,
+    SVG_EDGEMODE_WRAP: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
+dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
+dart.defineExtensionNames([
+  'diffuseConstant',
+  'in1',
+  'kernelUnitLengthX',
+  'kernelUnitLengthY',
+  'surfaceScale',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
+  }
+  created() {
+    this[dartx.diffuseConstant] = null;
+    this[dartx.in1] = null;
+    this[dartx.kernelUnitLengthX] = null;
+    this[dartx.kernelUnitLengthY] = null;
+    this[dartx.surfaceScale] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
+  }
+  get [dartx.diffuseConstant]() {
+    return this.diffuseConstant;
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.kernelUnitLengthX]() {
+    return this.kernelUnitLengthX;
+  }
+  get [dartx.kernelUnitLengthY]() {
+    return this.kernelUnitLengthY;
+  }
+  get [dartx.surfaceScale]() {
+    return this.surfaceScale;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
+svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEDiffuseLightingElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
+    new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
+    created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
+  }),
+  fields: () => ({
+    [dartx.diffuseConstant]: svg$.AnimatedNumber,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.surfaceScale]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
+dart.defineExtensionNames([
+  'in1',
+  'in2',
+  'scale',
+  'xChannelSelector',
+  'yChannelSelector',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.in2] = null;
+    this[dartx.scale] = null;
+    this[dartx.xChannelSelector] = null;
+    this[dartx.yChannelSelector] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.in2]() {
+    return this.in2;
+  }
+  get [dartx.scale]() {
+    return this.scale;
+  }
+  get [dartx.xChannelSelector]() {
+    return this.xChannelSelector;
+  }
+  get [dartx.yChannelSelector]() {
+    return this.yChannelSelector;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
+svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEDisplacementMapElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
+    new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
+    created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.scale]: svg$.AnimatedNumber,
+    [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
+    [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_CHANNEL_A: core.int,
+    SVG_CHANNEL_B: core.int,
+    SVG_CHANNEL_G: core.int,
+    SVG_CHANNEL_R: core.int,
+    SVG_CHANNEL_UNKNOWN: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
+dart.defineExtensionNames([
+  'azimuth',
+  'elevation'
+]);
+svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
+  }
+  created() {
+    this[dartx.azimuth] = null;
+    this[dartx.elevation] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
+  }
+  get [dartx.azimuth]() {
+    return this.azimuth;
+  }
+  get [dartx.elevation]() {
+    return this.elevation;
+  }
+};
+dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
+dart.setSignature(svg$.FEDistantLightElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
+    new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
+    created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
+  }),
+  fields: () => ({
+    [dartx.azimuth]: svg$.AnimatedNumber,
+    [dartx.elevation]: svg$.AnimatedNumber
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
+dart.defineExtensionNames([
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
+svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEFloodElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEFloodElement, []),
+    new: dart.definiteFunctionType(svg$.FEFloodElement, []),
+    created: dart.definiteFunctionType(svg$.FEFloodElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
+svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
+dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
+    created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
+svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
+  }
+};
+dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
+dart.setSignature(svg$.FEFuncAElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
+svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
+  }
+};
+dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
+dart.setSignature(svg$.FEFuncBElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
+svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
+  }
+};
+dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
+dart.setSignature(svg$.FEFuncGElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
+svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
+  }
+};
+dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
+dart.setSignature(svg$.FEFuncRElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
+dart.defineExtensionNames([
+  'setStdDeviation',
+  'in1',
+  'stdDeviationX',
+  'stdDeviationY',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.stdDeviationX] = null;
+    this[dartx.stdDeviationY] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.stdDeviationX]() {
+    return this.stdDeviationX;
+  }
+  get [dartx.stdDeviationY]() {
+    return this.stdDeviationY;
+  }
+  [dartx.setStdDeviation](...args) {
+    return this.setStdDeviation.apply(this, args);
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
+svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEGaussianBlurElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
+    new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
+    created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.stdDeviationX]: svg$.AnimatedNumber,
+    [dartx.stdDeviationY]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
+dart.defineExtensionNames([
+  'preserveAspectRatio',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y',
+  'href'
+]);
+svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
+  }
+  created() {
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.FEImageElement, 'created');
+svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
+dart.setSignature(svg$.FEImageElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEImageElement, []),
+    new: dart.definiteFunctionType(svg$.FEImageElement, []),
+    created: dart.definiteFunctionType(svg$.FEImageElement, [])
+  }),
+  fields: () => ({
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
+dart.defineExtensionNames([
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
+svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEMergeElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEMergeElement, []),
+    new: dart.definiteFunctionType(svg$.FEMergeElement, []),
+    created: dart.definiteFunctionType(svg$.FEMergeElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
+dart.defineExtensionNames([
+  'in1'
+]);
+svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+};
+dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
+dart.setSignature(svg$.FEMergeNodeElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
+    new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
+    created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
+  }),
+  fields: () => ({[dartx.in1]: svg$.AnimatedString}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
+dart.defineExtensionNames([
+  'in1',
+  'operator',
+  'radiusX',
+  'radiusY',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.operator] = null;
+    this[dartx.radiusX] = null;
+    this[dartx.radiusY] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.operator]() {
+    return this.operator;
+  }
+  get [dartx.radiusX]() {
+    return this.radiusX;
+  }
+  get [dartx.radiusY]() {
+    return this.radiusY;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
+svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEMorphologyElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
+    created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.operator]: svg$.AnimatedEnumeration,
+    [dartx.radiusX]: svg$.AnimatedNumber,
+    [dartx.radiusY]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
+    SVG_MORPHOLOGY_OPERATOR_ERODE: core.int,
+    SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
+  })
+});
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
+dart.defineExtensionNames([
+  'dx',
+  'dy',
+  'in1',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
+  }
+  created() {
+    this[dartx.dx] = null;
+    this[dartx.dy] = null;
+    this[dartx.in1] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
+  }
+  get [dartx.dx]() {
+    return this.dx;
+  }
+  get [dartx.dy]() {
+    return this.dy;
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
+svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEOffsetElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
+    new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
+    created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
+  }),
+  fields: () => ({
+    [dartx.dx]: svg$.AnimatedNumber,
+    [dartx.dy]: svg$.AnimatedNumber,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
+dart.defineExtensionNames([
+  'x',
+  'y',
+  'z'
+]);
+svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
+  }
+  created() {
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.z] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.z]() {
+    return this.z;
+  }
+};
+dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
+dart.setSignature(svg$.FEPointLightElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
+    new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
+    created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
+  }),
+  fields: () => ({
+    [dartx.x]: svg$.AnimatedNumber,
+    [dartx.y]: svg$.AnimatedNumber,
+    [dartx.z]: svg$.AnimatedNumber
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
+dart.defineExtensionNames([
+  'in1',
+  'kernelUnitLengthX',
+  'kernelUnitLengthY',
+  'specularConstant',
+  'specularExponent',
+  'surfaceScale',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.kernelUnitLengthX] = null;
+    this[dartx.kernelUnitLengthY] = null;
+    this[dartx.specularConstant] = null;
+    this[dartx.specularExponent] = null;
+    this[dartx.surfaceScale] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.kernelUnitLengthX]() {
+    return this.kernelUnitLengthX;
+  }
+  get [dartx.kernelUnitLengthY]() {
+    return this.kernelUnitLengthY;
+  }
+  get [dartx.specularConstant]() {
+    return this.specularConstant;
+  }
+  get [dartx.specularExponent]() {
+    return this.specularExponent;
+  }
+  get [dartx.surfaceScale]() {
+    return this.surfaceScale;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
+svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FESpecularLightingElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
+    new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
+    created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.specularConstant]: svg$.AnimatedNumber,
+    [dartx.specularExponent]: svg$.AnimatedNumber,
+    [dartx.surfaceScale]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
+dart.defineExtensionNames([
+  'limitingConeAngle',
+  'pointsAtX',
+  'pointsAtY',
+  'pointsAtZ',
+  'specularExponent',
+  'x',
+  'y',
+  'z'
+]);
+svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
+  }
+  created() {
+    this[dartx.limitingConeAngle] = null;
+    this[dartx.pointsAtX] = null;
+    this[dartx.pointsAtY] = null;
+    this[dartx.pointsAtZ] = null;
+    this[dartx.specularExponent] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.z] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
+  }
+  get [dartx.limitingConeAngle]() {
+    return this.limitingConeAngle;
+  }
+  get [dartx.pointsAtX]() {
+    return this.pointsAtX;
+  }
+  get [dartx.pointsAtY]() {
+    return this.pointsAtY;
+  }
+  get [dartx.pointsAtZ]() {
+    return this.pointsAtZ;
+  }
+  get [dartx.specularExponent]() {
+    return this.specularExponent;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.z]() {
+    return this.z;
+  }
+};
+dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
+dart.setSignature(svg$.FESpotLightElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
+    new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
+    created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
+  }),
+  fields: () => ({
+    [dartx.limitingConeAngle]: svg$.AnimatedNumber,
+    [dartx.pointsAtX]: svg$.AnimatedNumber,
+    [dartx.pointsAtY]: svg$.AnimatedNumber,
+    [dartx.pointsAtZ]: svg$.AnimatedNumber,
+    [dartx.specularExponent]: svg$.AnimatedNumber,
+    [dartx.x]: svg$.AnimatedNumber,
+    [dartx.y]: svg$.AnimatedNumber,
+    [dartx.z]: svg$.AnimatedNumber
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
+dart.defineExtensionNames([
+  'in1',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FETileElement = class FETileElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
+  }
+  created() {
+    this[dartx.in1] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
+  }
+  get [dartx.in1]() {
+    return this.in1;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FETileElement, 'created');
+svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FETileElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FETileElement, []),
+    new: dart.definiteFunctionType(svg$.FETileElement, []),
+    created: dart.definiteFunctionType(svg$.FETileElement, [])
+  }),
+  fields: () => ({
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
+dart.defineExtensionNames([
+  'baseFrequencyX',
+  'baseFrequencyY',
+  'numOctaves',
+  'seed',
+  'stitchTiles',
+  'type',
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
+  }
+  created() {
+    this[dartx.baseFrequencyX] = null;
+    this[dartx.baseFrequencyY] = null;
+    this[dartx.numOctaves] = null;
+    this[dartx.seed] = null;
+    this[dartx.stitchTiles] = null;
+    this[dartx.type] = null;
+    this[dartx.height] = null;
+    this[dartx.result] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
+  }
+  get [dartx.baseFrequencyX]() {
+    return this.baseFrequencyX;
+  }
+  get [dartx.baseFrequencyY]() {
+    return this.baseFrequencyY;
+  }
+  get [dartx.numOctaves]() {
+    return this.numOctaves;
+  }
+  get [dartx.seed]() {
+    return this.seed;
+  }
+  get [dartx.stitchTiles]() {
+    return this.stitchTiles;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.result]() {
+    return this.result;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
+svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FETurbulenceElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
+    new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
+    created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
+  }),
+  fields: () => ({
+    [dartx.baseFrequencyX]: svg$.AnimatedNumber,
+    [dartx.baseFrequencyY]: svg$.AnimatedNumber,
+    [dartx.numOctaves]: svg$.AnimatedInteger,
+    [dartx.seed]: svg$.AnimatedNumber,
+    [dartx.stitchTiles]: svg$.AnimatedEnumeration,
+    [dartx.type]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sfields: () => ({
+    SVG_STITCHTYPE_NOSTITCH: core.int,
+    SVG_STITCHTYPE_STITCH: core.int,
+    SVG_STITCHTYPE_UNKNOWN: core.int,
+    SVG_TURBULENCE_TYPE_FRACTALNOISE: core.int,
+    SVG_TURBULENCE_TYPE_TURBULENCE: core.int,
+    SVG_TURBULENCE_TYPE_UNKNOWN: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
+svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
+svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
+dart.defineExtensionNames([
+  'filterUnits',
+  'height',
+  'primitiveUnits',
+  'width',
+  'x',
+  'y',
+  'href'
+]);
+svg$.FilterElement = class FilterElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
+  }
+  created() {
+    this[dartx.filterUnits] = null;
+    this[dartx.height] = null;
+    this[dartx.primitiveUnits] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
+  }
+  get [dartx.filterUnits]() {
+    return this.filterUnits;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.primitiveUnits]() {
+    return this.primitiveUnits;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.FilterElement, 'created');
+svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.FilterElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.FilterElement, []),
+    new: dart.definiteFunctionType(svg$.FilterElement, []),
+    created: dart.definiteFunctionType(svg$.FilterElement, [])
+  }),
+  fields: () => ({
+    [dartx.filterUnits]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
+dart.defineExtensionNames([
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get height() {
+    return this[height$];
+  }
+  set height(value) {
+    super.height = value;
+  }
+  get result() {
+    return this[result];
+  }
+  set result(value) {
+    super.result = value;
+  }
+  get width() {
+    return this[width$];
+  }
+  set width(value) {
+    super.width = value;
+  }
+  get x() {
+    return this[x];
+  }
+  set x(value) {
+    super.x = value;
+  }
+  get y() {
+    return this[y];
+  }
+  set y(value) {
+    super.y = value;
+  }
+};
+const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
+const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
+const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
+const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
+const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
+dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
+  fields: () => ({
+    height: svg$.AnimatedLength,
+    result: svg$.AnimatedString,
+    width: svg$.AnimatedLength,
+    x: svg$.AnimatedLength,
+    y: svg$.AnimatedLength
+  })
+});
+dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
+  'height',
+  'result',
+  'width',
+  'x',
+  'y'
+]);
+dart.defineExtensionNames([
+  'preserveAspectRatio',
+  'viewBox'
+]);
+svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get preserveAspectRatio() {
+    return this[preserveAspectRatio];
+  }
+  set preserveAspectRatio(value) {
+    super.preserveAspectRatio = value;
+  }
+  get viewBox() {
+    return this[viewBox];
+  }
+  set viewBox(value) {
+    super.viewBox = value;
+  }
+};
+const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
+const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
+dart.setSignature(svg$.FitToViewBox, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
+  fields: () => ({
+    preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
+    viewBox: svg$.AnimatedRect
+  })
+});
+dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
+dart.defineExtensionNames([
+  'height',
+  'width',
+  'x',
+  'y'
+]);
+svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
+dart.setSignature(svg$.ForeignObjectElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
+    new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
+    created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
+svg$.GElement = class GElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.GElement, 'created');
+dart.setSignature(svg$.GElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.GElement, []),
+    new: dart.definiteFunctionType(svg$.GElement, []),
+    created: dart.definiteFunctionType(svg$.GElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
+dart.defineExtensionNames([
+  'height',
+  'preserveAspectRatio',
+  'width',
+  'x',
+  'y',
+  'href'
+]);
+svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.ImageElement, 'created');
+svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.ImageElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.ImageElement, []),
+    new: dart.definiteFunctionType(svg$.ImageElement, []),
+    created: dart.definiteFunctionType(svg$.ImageElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
+  })
+});
+dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
+dart.defineExtensionNames([
+  'convertToSpecifiedUnits',
+  'newValueSpecifiedUnits',
+  'unitType',
+  'value',
+  'valueAsString',
+  'valueInSpecifiedUnits'
+]);
+svg$.Length = class Length extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.unitType]() {
+    return this.unitType;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  get [dartx.valueAsString]() {
+    return this.valueAsString;
+  }
+  set [dartx.valueAsString](value) {
+    this.valueAsString = value;
+  }
+  get [dartx.valueInSpecifiedUnits]() {
+    return this.valueInSpecifiedUnits;
+  }
+  set [dartx.valueInSpecifiedUnits](value) {
+    this.valueInSpecifiedUnits = value;
+  }
+  [dartx.convertToSpecifiedUnits](...args) {
+    return this.convertToSpecifiedUnits.apply(this, args);
+  }
+  [dartx.newValueSpecifiedUnits](...args) {
+    return this.newValueSpecifiedUnits.apply(this, args);
+  }
+};
+dart.setSignature(svg$.Length, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
+  fields: () => ({
+    [dartx.unitType]: core.int,
+    [dartx.value]: core.num,
+    [dartx.valueAsString]: core.String,
+    [dartx.valueInSpecifiedUnits]: core.num
+  }),
+  methods: () => ({
+    [dartx.convertToSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.newValueSpecifiedUnits]: dart.definiteFunctionType(dart.void, [core.int, core.num])
+  }),
+  sfields: () => ({
+    SVG_LENGTHTYPE_CM: core.int,
+    SVG_LENGTHTYPE_EMS: core.int,
+    SVG_LENGTHTYPE_EXS: core.int,
+    SVG_LENGTHTYPE_IN: core.int,
+    SVG_LENGTHTYPE_MM: core.int,
+    SVG_LENGTHTYPE_NUMBER: core.int,
+    SVG_LENGTHTYPE_PC: core.int,
+    SVG_LENGTHTYPE_PERCENTAGE: core.int,
+    SVG_LENGTHTYPE_PT: core.int,
+    SVG_LENGTHTYPE_PX: core.int,
+    SVG_LENGTHTYPE_UNKNOWN: core.int
+  })
+});
+svg$.Length.SVG_LENGTHTYPE_CM = 6;
+svg$.Length.SVG_LENGTHTYPE_EMS = 3;
+svg$.Length.SVG_LENGTHTYPE_EXS = 4;
+svg$.Length.SVG_LENGTHTYPE_IN = 8;
+svg$.Length.SVG_LENGTHTYPE_MM = 7;
+svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
+svg$.Length.SVG_LENGTHTYPE_PC = 10;
+svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
+svg$.Length.SVG_LENGTHTYPE_PT = 9;
+svg$.Length.SVG_LENGTHTYPE_PX = 5;
+svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGLength, svg$.Length);
+const __setter__$ = Symbol('__setter__');
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'appendItem',
+  'clear',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'numberOfItems'
+]);
+svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.getItem](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+svg$.LengthList[dart.implements] = () => [ListOfLength()];
+dart.setSignature(svg$.LengthList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
+  fields: () => ({[dartx.numberOfItems]: core.int}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
+dart.defineExtensionNames([
+  'x1',
+  'x2',
+  'y1',
+  'y2'
+]);
+svg$.LineElement = class LineElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
+  }
+  created() {
+    this[dartx.x1] = null;
+    this[dartx.x2] = null;
+    this[dartx.y1] = null;
+    this[dartx.y2] = null;
+    super.created();
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+};
+dart.defineNamedConstructor(svg$.LineElement, 'created');
+dart.setSignature(svg$.LineElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.LineElement, []),
+    new: dart.definiteFunctionType(svg$.LineElement, []),
+    created: dart.definiteFunctionType(svg$.LineElement, [])
+  }),
+  fields: () => ({
+    [dartx.x1]: svg$.AnimatedLength,
+    [dartx.x2]: svg$.AnimatedLength,
+    [dartx.y1]: svg$.AnimatedLength,
+    [dartx.y2]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
+dart.defineExtensionNames([
+  'gradientTransform',
+  'gradientUnits',
+  'spreadMethod',
+  'href'
+]);
+svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.gradientTransform] = null;
+    this[dartx.gradientUnits] = null;
+    this[dartx.spreadMethod] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.gradientTransform]() {
+    return this.gradientTransform;
+  }
+  get [dartx.gradientUnits]() {
+    return this.gradientUnits;
+  }
+  get [dartx.spreadMethod]() {
+    return this.spreadMethod;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$._GradientElement, 'created');
+svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$._GradientElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$._GradientElement, []),
+    created: dart.definiteFunctionType(svg$._GradientElement, [])
+  }),
+  fields: () => ({
+    [dartx.gradientTransform]: svg$.AnimatedTransformList,
+    [dartx.gradientUnits]: svg$.AnimatedEnumeration,
+    [dartx.spreadMethod]: svg$.AnimatedEnumeration,
+    [dartx.href]: svg$.AnimatedString
+  }),
+  sfields: () => ({
+    SVG_SPREADMETHOD_PAD: core.int,
+    SVG_SPREADMETHOD_REFLECT: core.int,
+    SVG_SPREADMETHOD_REPEAT: core.int,
+    SVG_SPREADMETHOD_UNKNOWN: core.int
+  })
+});
+svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
+svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
+svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
+svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
+dart.defineExtensionNames([
+  'x1',
+  'x2',
+  'y1',
+  'y2'
+]);
+svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
+  }
+  created() {
+    this[dartx.x1] = null;
+    this[dartx.x2] = null;
+    this[dartx.y1] = null;
+    this[dartx.y2] = null;
+    super.created();
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+};
+dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
+dart.setSignature(svg$.LinearGradientElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
+    new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
+    created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
+  }),
+  fields: () => ({
+    [dartx.x1]: svg$.AnimatedLength,
+    [dartx.x2]: svg$.AnimatedLength,
+    [dartx.y1]: svg$.AnimatedLength,
+    [dartx.y2]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
+dart.defineExtensionNames([
+  'setOrientToAngle',
+  'setOrientToAuto',
+  'markerHeight',
+  'markerUnits',
+  'markerWidth',
+  'orientAngle',
+  'orientType',
+  'refX',
+  'refY',
+  'preserveAspectRatio',
+  'viewBox'
+]);
+svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
+  }
+  created() {
+    this[dartx.markerHeight] = null;
+    this[dartx.markerUnits] = null;
+    this[dartx.markerWidth] = null;
+    this[dartx.orientAngle] = null;
+    this[dartx.orientType] = null;
+    this[dartx.refX] = null;
+    this[dartx.refY] = null;
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.viewBox] = null;
+    super.created();
+  }
+  get [dartx.markerHeight]() {
+    return this.markerHeight;
+  }
+  get [dartx.markerUnits]() {
+    return this.markerUnits;
+  }
+  get [dartx.markerWidth]() {
+    return this.markerWidth;
+  }
+  get [dartx.orientAngle]() {
+    return this.orientAngle;
+  }
+  get [dartx.orientType]() {
+    return this.orientType;
+  }
+  get [dartx.refX]() {
+    return this.refX;
+  }
+  get [dartx.refY]() {
+    return this.refY;
+  }
+  [dartx.setOrientToAngle](...args) {
+    return this.setOrientToAngle.apply(this, args);
+  }
+  [dartx.setOrientToAuto](...args) {
+    return this.setOrientToAuto.apply(this, args);
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+};
+dart.defineNamedConstructor(svg$.MarkerElement, 'created');
+svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
+dart.setSignature(svg$.MarkerElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.MarkerElement, []),
+    new: dart.definiteFunctionType(svg$.MarkerElement, []),
+    created: dart.definiteFunctionType(svg$.MarkerElement, [])
+  }),
+  fields: () => ({
+    [dartx.markerHeight]: svg$.AnimatedLength,
+    [dartx.markerUnits]: svg$.AnimatedEnumeration,
+    [dartx.markerWidth]: svg$.AnimatedLength,
+    [dartx.orientAngle]: svg$.AnimatedAngle,
+    [dartx.orientType]: svg$.AnimatedEnumeration,
+    [dartx.refX]: svg$.AnimatedLength,
+    [dartx.refY]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect
+  }),
+  methods: () => ({
+    [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
+    [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
+  }),
+  sfields: () => ({
+    SVG_MARKERUNITS_STROKEWIDTH: core.int,
+    SVG_MARKERUNITS_UNKNOWN: core.int,
+    SVG_MARKERUNITS_USERSPACEONUSE: core.int,
+    SVG_MARKER_ORIENT_ANGLE: core.int,
+    SVG_MARKER_ORIENT_AUTO: core.int,
+    SVG_MARKER_ORIENT_UNKNOWN: core.int
+  })
+});
+svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
+svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
+svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
+svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
+svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
+svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
+dart.defineExtensionNames([
+  'hasExtension',
+  'height',
+  'maskContentUnits',
+  'maskUnits',
+  'width',
+  'x',
+  'y',
+  'requiredExtensions',
+  'requiredFeatures',
+  'systemLanguage'
+]);
+svg$.MaskElement = class MaskElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.maskContentUnits] = null;
+    this[dartx.maskUnits] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.requiredExtensions] = null;
+    this[dartx.requiredFeatures] = null;
+    this[dartx.systemLanguage] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.maskContentUnits]() {
+    return this.maskContentUnits;
+  }
+  get [dartx.maskUnits]() {
+    return this.maskUnits;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.requiredExtensions]() {
+    return this.requiredExtensions;
+  }
+  get [dartx.requiredFeatures]() {
+    return this.requiredFeatures;
+  }
+  get [dartx.systemLanguage]() {
+    return this.systemLanguage;
+  }
+  [dartx.hasExtension](...args) {
+    return this.hasExtension.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.MaskElement, 'created');
+svg$.MaskElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.MaskElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.MaskElement, []),
+    new: dart.definiteFunctionType(svg$.MaskElement, []),
+    created: dart.definiteFunctionType(svg$.MaskElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
+    [dartx.maskUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
+  }),
+  methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
+});
+dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
+dart.defineExtensionNames([
+  'flipX',
+  'flipY',
+  'inverse',
+  'multiply',
+  'rotate',
+  'rotateFromVector',
+  'scale',
+  'scaleNonUniform',
+  'skewX',
+  'skewY',
+  'translate',
+  'a',
+  'b',
+  'c',
+  'd',
+  'e',
+  'f'
+]);
+svg$.Matrix = class Matrix extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.a]() {
+    return this.a;
+  }
+  set [dartx.a](value) {
+    this.a = value;
+  }
+  get [dartx.b]() {
+    return this.b;
+  }
+  set [dartx.b](value) {
+    this.b = value;
+  }
+  get [dartx.c]() {
+    return this.c;
+  }
+  set [dartx.c](value) {
+    this.c = value;
+  }
+  get [dartx.d]() {
+    return this.d;
+  }
+  set [dartx.d](value) {
+    this.d = value;
+  }
+  get [dartx.e]() {
+    return this.e;
+  }
+  set [dartx.e](value) {
+    this.e = value;
+  }
+  get [dartx.f]() {
+    return this.f;
+  }
+  set [dartx.f](value) {
+    this.f = value;
+  }
+  [dartx.flipX](...args) {
+    return this.flipX.apply(this, args);
+  }
+  [dartx.flipY](...args) {
+    return this.flipY.apply(this, args);
+  }
+  [dartx.inverse](...args) {
+    return this.inverse.apply(this, args);
+  }
+  [dartx.multiply](...args) {
+    return this.multiply.apply(this, args);
+  }
+  [dartx.rotate](...args) {
+    return this.rotate.apply(this, args);
+  }
+  [dartx.rotateFromVector](...args) {
+    return this.rotateFromVector.apply(this, args);
+  }
+  [dartx.scale](...args) {
+    return this.scale.apply(this, args);
+  }
+  [dartx.scaleNonUniform](...args) {
+    return this.scaleNonUniform.apply(this, args);
+  }
+  [dartx.skewX](...args) {
+    return this.skewX.apply(this, args);
+  }
+  [dartx.skewY](...args) {
+    return this.skewY.apply(this, args);
+  }
+  [dartx.translate](...args) {
+    return this.translate.apply(this, args);
+  }
+};
+dart.setSignature(svg$.Matrix, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
+  fields: () => ({
+    [dartx.a]: core.num,
+    [dartx.b]: core.num,
+    [dartx.c]: core.num,
+    [dartx.d]: core.num,
+    [dartx.e]: core.num,
+    [dartx.f]: core.num
+  }),
+  methods: () => ({
+    [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
+    [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
+    [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
+    [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
+  })
+});
+dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
+svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.MetadataElement, 'created');
+dart.setSignature(svg$.MetadataElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.MetadataElement, []),
+    created: dart.definiteFunctionType(svg$.MetadataElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
+dart.defineExtensionNames([
+  'value'
+]);
+svg$.Number = class Number extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+};
+dart.setSignature(svg$.Number, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
+  fields: () => ({[dartx.value]: core.num})
+});
+dart.registerExtension(dart.global.SVGNumber, svg$.Number);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'appendItem',
+  'clear',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'numberOfItems'
+]);
+svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.getItem](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+svg$.NumberList[dart.implements] = () => [ListOfNumber()];
+dart.setSignature(svg$.NumberList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
+  fields: () => ({[dartx.numberOfItems]: core.int}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
+dart.defineExtensionNames([
+  'createSvgPathSegArcAbs',
+  'createSvgPathSegArcRel',
+  'createSvgPathSegClosePath',
+  'createSvgPathSegCurvetoCubicAbs',
+  'createSvgPathSegCurvetoCubicRel',
+  'createSvgPathSegCurvetoCubicSmoothAbs',
+  'createSvgPathSegCurvetoCubicSmoothRel',
+  'createSvgPathSegCurvetoQuadraticAbs',
+  'createSvgPathSegCurvetoQuadraticRel',
+  'createSvgPathSegCurvetoQuadraticSmoothAbs',
+  'createSvgPathSegCurvetoQuadraticSmoothRel',
+  'createSvgPathSegLinetoAbs',
+  'createSvgPathSegLinetoHorizontalAbs',
+  'createSvgPathSegLinetoHorizontalRel',
+  'createSvgPathSegLinetoRel',
+  'createSvgPathSegLinetoVerticalAbs',
+  'createSvgPathSegLinetoVerticalRel',
+  'createSvgPathSegMovetoAbs',
+  'createSvgPathSegMovetoRel',
+  'getPathSegAtLength',
+  'getPointAtLength',
+  'getTotalLength',
+  'animatedNormalizedPathSegList',
+  'animatedPathSegList',
+  'normalizedPathSegList',
+  'pathLength',
+  'pathSegList'
+]);
+svg$.PathElement = class PathElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
+  }
+  created() {
+    this[dartx.animatedNormalizedPathSegList] = null;
+    this[dartx.animatedPathSegList] = null;
+    this[dartx.normalizedPathSegList] = null;
+    this[dartx.pathLength] = null;
+    this[dartx.pathSegList] = null;
+    super.created();
+  }
+  get [dartx.animatedNormalizedPathSegList]() {
+    return this.animatedNormalizedPathSegList;
+  }
+  get [dartx.animatedPathSegList]() {
+    return this.animatedPathSegList;
+  }
+  get [dartx.normalizedPathSegList]() {
+    return this.normalizedPathSegList;
+  }
+  get [dartx.pathLength]() {
+    return this.pathLength;
+  }
+  get [dartx.pathSegList]() {
+    return this.pathSegList;
+  }
+  [dartx.createSvgPathSegArcAbs](...args) {
+    return this.createSVGPathSegArcAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegArcRel](...args) {
+    return this.createSVGPathSegArcRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegClosePath](...args) {
+    return this.createSVGPathSegClosePath.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoCubicAbs](...args) {
+    return this.createSVGPathSegCurvetoCubicAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoCubicRel](...args) {
+    return this.createSVGPathSegCurvetoCubicRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoCubicSmoothAbs](...args) {
+    return this.createSVGPathSegCurvetoCubicSmoothAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoCubicSmoothRel](...args) {
+    return this.createSVGPathSegCurvetoCubicSmoothRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoQuadraticAbs](...args) {
+    return this.createSVGPathSegCurvetoQuadraticAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoQuadraticRel](...args) {
+    return this.createSVGPathSegCurvetoQuadraticRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs](...args) {
+    return this.createSVGPathSegCurvetoQuadraticSmoothAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegCurvetoQuadraticSmoothRel](...args) {
+    return this.createSVGPathSegCurvetoQuadraticSmoothRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoAbs](...args) {
+    return this.createSVGPathSegLinetoAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoHorizontalAbs](...args) {
+    return this.createSVGPathSegLinetoHorizontalAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoHorizontalRel](...args) {
+    return this.createSVGPathSegLinetoHorizontalRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoRel](...args) {
+    return this.createSVGPathSegLinetoRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoVerticalAbs](...args) {
+    return this.createSVGPathSegLinetoVerticalAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegLinetoVerticalRel](...args) {
+    return this.createSVGPathSegLinetoVerticalRel.apply(this, args);
+  }
+  [dartx.createSvgPathSegMovetoAbs](...args) {
+    return this.createSVGPathSegMovetoAbs.apply(this, args);
+  }
+  [dartx.createSvgPathSegMovetoRel](...args) {
+    return this.createSVGPathSegMovetoRel.apply(this, args);
+  }
+  [dartx.getPathSegAtLength](...args) {
+    return this.getPathSegAtLength.apply(this, args);
+  }
+  [dartx.getPointAtLength](...args) {
+    return this.getPointAtLength.apply(this, args);
+  }
+  [dartx.getTotalLength](...args) {
+    return this.getTotalLength.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.PathElement, 'created');
+dart.setSignature(svg$.PathElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.PathElement, []),
+    new: dart.definiteFunctionType(svg$.PathElement, []),
+    created: dart.definiteFunctionType(svg$.PathElement, [])
+  }),
+  fields: () => ({
+    [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
+    [dartx.animatedPathSegList]: svg$.PathSegList,
+    [dartx.normalizedPathSegList]: svg$.PathSegList,
+    [dartx.pathLength]: svg$.AnimatedNumber,
+    [dartx.pathSegList]: svg$.PathSegList
+  }),
+  methods: () => ({
+    [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
+    [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
+    [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
+    [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
+    [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
+    [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
+    [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
+    [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
+    [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
+    [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
+    [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
+  })
+});
+dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
+dart.defineExtensionNames([
+  'pathSegType',
+  'pathSegTypeAsLetter'
+]);
+svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.pathSegType]() {
+    return this.pathSegType;
+  }
+  get [dartx.pathSegTypeAsLetter]() {
+    return this.pathSegTypeAsLetter;
+  }
+};
+dart.setSignature(svg$.PathSeg, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
+  fields: () => ({
+    [dartx.pathSegType]: core.int,
+    [dartx.pathSegTypeAsLetter]: core.String
+  }),
+  sfields: () => ({
+    PATHSEG_ARC_ABS: core.int,
+    PATHSEG_ARC_REL: core.int,
+    PATHSEG_CLOSEPATH: core.int,
+    PATHSEG_CURVETO_CUBIC_ABS: core.int,
+    PATHSEG_CURVETO_CUBIC_REL: core.int,
+    PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: core.int,
+    PATHSEG_CURVETO_CUBIC_SMOOTH_REL: core.int,
+    PATHSEG_CURVETO_QUADRATIC_ABS: core.int,
+    PATHSEG_CURVETO_QUADRATIC_REL: core.int,
+    PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: core.int,
+    PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: core.int,
+    PATHSEG_LINETO_ABS: core.int,
+    PATHSEG_LINETO_HORIZONTAL_ABS: core.int,
+    PATHSEG_LINETO_HORIZONTAL_REL: core.int,
+    PATHSEG_LINETO_REL: core.int,
+    PATHSEG_LINETO_VERTICAL_ABS: core.int,
+    PATHSEG_LINETO_VERTICAL_REL: core.int,
+    PATHSEG_MOVETO_ABS: core.int,
+    PATHSEG_MOVETO_REL: core.int,
+    PATHSEG_UNKNOWN: core.int
+  })
+});
+svg$.PathSeg.PATHSEG_ARC_ABS = 10;
+svg$.PathSeg.PATHSEG_ARC_REL = 11;
+svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
+svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
+svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
+svg$.PathSeg.PATHSEG_LINETO_REL = 5;
+svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
+svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
+svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
+svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
+svg$.PathSeg.PATHSEG_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
+dart.defineExtensionNames([
+  'angle',
+  'largeArcFlag',
+  'r1',
+  'r2',
+  'sweepFlag',
+  'x',
+  'y'
+]);
+svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.angle]() {
+    return this.angle;
+  }
+  set [dartx.angle](value) {
+    this.angle = value;
+  }
+  get [dartx.largeArcFlag]() {
+    return this.largeArcFlag;
+  }
+  set [dartx.largeArcFlag](value) {
+    this.largeArcFlag = value;
+  }
+  get [dartx.r1]() {
+    return this.r1;
+  }
+  set [dartx.r1](value) {
+    this.r1 = value;
+  }
+  get [dartx.r2]() {
+    return this.r2;
+  }
+  set [dartx.r2](value) {
+    this.r2 = value;
+  }
+  get [dartx.sweepFlag]() {
+    return this.sweepFlag;
+  }
+  set [dartx.sweepFlag](value) {
+    this.sweepFlag = value;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegArcAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
+  fields: () => ({
+    [dartx.angle]: core.num,
+    [dartx.largeArcFlag]: core.bool,
+    [dartx.r1]: core.num,
+    [dartx.r2]: core.num,
+    [dartx.sweepFlag]: core.bool,
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
+dart.defineExtensionNames([
+  'angle',
+  'largeArcFlag',
+  'r1',
+  'r2',
+  'sweepFlag',
+  'x',
+  'y'
+]);
+svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.angle]() {
+    return this.angle;
+  }
+  set [dartx.angle](value) {
+    this.angle = value;
+  }
+  get [dartx.largeArcFlag]() {
+    return this.largeArcFlag;
+  }
+  set [dartx.largeArcFlag](value) {
+    this.largeArcFlag = value;
+  }
+  get [dartx.r1]() {
+    return this.r1;
+  }
+  set [dartx.r1](value) {
+    this.r1 = value;
+  }
+  get [dartx.r2]() {
+    return this.r2;
+  }
+  set [dartx.r2](value) {
+    this.r2 = value;
+  }
+  get [dartx.sweepFlag]() {
+    return this.sweepFlag;
+  }
+  set [dartx.sweepFlag](value) {
+    this.sweepFlag = value;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegArcRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
+  fields: () => ({
+    [dartx.angle]: core.num,
+    [dartx.largeArcFlag]: core.bool,
+    [dartx.r1]: core.num,
+    [dartx.r2]: core.num,
+    [dartx.sweepFlag]: core.bool,
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
+svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(svg$.PathSegClosePath, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
+});
+dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
+dart.defineExtensionNames([
+  'x',
+  'x1',
+  'x2',
+  'y',
+  'y1',
+  'y2'
+]);
+svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  set [dartx.x1](value) {
+    this.x1 = value;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  set [dartx.x2](value) {
+    this.x2 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  set [dartx.y1](value) {
+    this.y1 = value;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+  set [dartx.y2](value) {
+    this.y2 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x1]: core.num,
+    [dartx.x2]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y1]: core.num,
+    [dartx.y2]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
+dart.defineExtensionNames([
+  'x',
+  'x1',
+  'x2',
+  'y',
+  'y1',
+  'y2'
+]);
+svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  set [dartx.x1](value) {
+    this.x1 = value;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  set [dartx.x2](value) {
+    this.x2 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  set [dartx.y1](value) {
+    this.y1 = value;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+  set [dartx.y2](value) {
+    this.y2 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoCubicRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x1]: core.num,
+    [dartx.x2]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y1]: core.num,
+    [dartx.y2]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
+dart.defineExtensionNames([
+  'x',
+  'x2',
+  'y',
+  'y2'
+]);
+svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  set [dartx.x2](value) {
+    this.x2 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+  set [dartx.y2](value) {
+    this.y2 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x2]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y2]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
+dart.defineExtensionNames([
+  'x',
+  'x2',
+  'y',
+  'y2'
+]);
+svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x2]() {
+    return this.x2;
+  }
+  set [dartx.x2](value) {
+    this.x2 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y2]() {
+    return this.y2;
+  }
+  set [dartx.y2](value) {
+    this.y2 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x2]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y2]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
+dart.defineExtensionNames([
+  'x',
+  'x1',
+  'y',
+  'y1'
+]);
+svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  set [dartx.x1](value) {
+    this.x1 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  set [dartx.y1](value) {
+    this.y1 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x1]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y1]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
+dart.defineExtensionNames([
+  'x',
+  'x1',
+  'y',
+  'y1'
+]);
+svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.x1]() {
+    return this.x1;
+  }
+  set [dartx.x1](value) {
+    this.x1 = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  get [dartx.y1]() {
+    return this.y1;
+  }
+  set [dartx.y1](value) {
+    this.y1 = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.x1]: core.num,
+    [dartx.y]: core.num,
+    [dartx.y1]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
+dart.defineExtensionNames([
+  'x'
+]);
+svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
+  fields: () => ({[dartx.x]: core.num})
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
+dart.defineExtensionNames([
+  'x'
+]);
+svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
+  fields: () => ({[dartx.x]: core.num})
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
+dart.defineExtensionNames([
+  'y'
+]);
+svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
+  fields: () => ({[dartx.y]: core.num})
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
+dart.defineExtensionNames([
+  'y'
+]);
+svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegLinetoVerticalRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
+  fields: () => ({[dartx.y]: core.num})
+});
+dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'appendItem',
+  'clear',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'numberOfItems'
+]);
+svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.getItem](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
+dart.setSignature(svg$.PathSegList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
+  fields: () => ({[dartx.numberOfItems]: core.int}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegMovetoAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
+dart.defineExtensionNames([
+  'x',
+  'y'
+]);
+svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.PathSegMovetoRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
+dart.defineExtensionNames([
+  'hasExtension',
+  'height',
+  'patternContentUnits',
+  'patternTransform',
+  'patternUnits',
+  'width',
+  'x',
+  'y',
+  'preserveAspectRatio',
+  'viewBox',
+  'requiredExtensions',
+  'requiredFeatures',
+  'systemLanguage',
+  'href'
+]);
+svg$.PatternElement = class PatternElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.patternContentUnits] = null;
+    this[dartx.patternTransform] = null;
+    this[dartx.patternUnits] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.viewBox] = null;
+    this[dartx.requiredExtensions] = null;
+    this[dartx.requiredFeatures] = null;
+    this[dartx.systemLanguage] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.patternContentUnits]() {
+    return this.patternContentUnits;
+  }
+  get [dartx.patternTransform]() {
+    return this.patternTransform;
+  }
+  get [dartx.patternUnits]() {
+    return this.patternUnits;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+  get [dartx.requiredExtensions]() {
+    return this.requiredExtensions;
+  }
+  get [dartx.requiredFeatures]() {
+    return this.requiredFeatures;
+  }
+  get [dartx.systemLanguage]() {
+    return this.systemLanguage;
+  }
+  [dartx.hasExtension](...args) {
+    return this.hasExtension.apply(this, args);
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.PatternElement, 'created');
+svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
+dart.setSignature(svg$.PatternElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.PatternElement, []),
+    new: dart.definiteFunctionType(svg$.PatternElement, []),
+    created: dart.definiteFunctionType(svg$.PatternElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
+    [dartx.patternTransform]: svg$.AnimatedTransformList,
+    [dartx.patternUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList,
+    [dartx.href]: svg$.AnimatedString
+  }),
+  methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
+});
+dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
+dart.defineExtensionNames([
+  'matrixTransform',
+  'x',
+  'y'
+]);
+svg$.Point = class Point extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+  [dartx.matrixTransform](...args) {
+    return this.matrixTransform.apply(this, args);
+  }
+};
+dart.setSignature(svg$.Point, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
+  fields: () => ({
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  }),
+  methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
+});
+dart.registerExtension(dart.global.SVGPoint, svg$.Point);
+dart.defineExtensionNames([
+  'appendItem',
+  'clear',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'length',
+  'numberOfItems'
+]);
+svg$.PointList = class PointList extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+dart.setSignature(svg$.PointList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
+  fields: () => ({
+    [dartx.length]: core.int,
+    [dartx.numberOfItems]: core.int
+  }),
+  methods: () => ({
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
+    [dartx.clear]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
+dart.defineExtensionNames([
+  'animatedPoints',
+  'points'
+]);
+svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
+  }
+  created() {
+    this[dartx.animatedPoints] = null;
+    this[dartx.points] = null;
+    super.created();
+  }
+  get [dartx.animatedPoints]() {
+    return this.animatedPoints;
+  }
+  get [dartx.points]() {
+    return this.points;
+  }
+};
+dart.defineNamedConstructor(svg$.PolygonElement, 'created');
+dart.setSignature(svg$.PolygonElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.PolygonElement, []),
+    new: dart.definiteFunctionType(svg$.PolygonElement, []),
+    created: dart.definiteFunctionType(svg$.PolygonElement, [])
+  }),
+  fields: () => ({
+    [dartx.animatedPoints]: svg$.PointList,
+    [dartx.points]: svg$.PointList
+  })
+});
+dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
+dart.defineExtensionNames([
+  'animatedPoints',
+  'points'
+]);
+svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
+  }
+  created() {
+    this[dartx.animatedPoints] = null;
+    this[dartx.points] = null;
+    super.created();
+  }
+  get [dartx.animatedPoints]() {
+    return this.animatedPoints;
+  }
+  get [dartx.points]() {
+    return this.points;
+  }
+};
+dart.defineNamedConstructor(svg$.PolylineElement, 'created');
+dart.setSignature(svg$.PolylineElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.PolylineElement, []),
+    new: dart.definiteFunctionType(svg$.PolylineElement, []),
+    created: dart.definiteFunctionType(svg$.PolylineElement, [])
+  }),
+  fields: () => ({
+    [dartx.animatedPoints]: svg$.PointList,
+    [dartx.points]: svg$.PointList
+  })
+});
+dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
+dart.defineExtensionNames([
+  'align',
+  'meetOrSlice'
+]);
+svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.align]() {
+    return this.align;
+  }
+  set [dartx.align](value) {
+    this.align = value;
+  }
+  get [dartx.meetOrSlice]() {
+    return this.meetOrSlice;
+  }
+  set [dartx.meetOrSlice](value) {
+    this.meetOrSlice = value;
+  }
+};
+dart.setSignature(svg$.PreserveAspectRatio, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
+  fields: () => ({
+    [dartx.align]: core.int,
+    [dartx.meetOrSlice]: core.int
+  }),
+  sfields: () => ({
+    SVG_MEETORSLICE_MEET: core.int,
+    SVG_MEETORSLICE_SLICE: core.int,
+    SVG_MEETORSLICE_UNKNOWN: core.int,
+    SVG_PRESERVEASPECTRATIO_NONE: core.int,
+    SVG_PRESERVEASPECTRATIO_UNKNOWN: core.int,
+    SVG_PRESERVEASPECTRATIO_XMAXYMAX: core.int,
+    SVG_PRESERVEASPECTRATIO_XMAXYMID: core.int,
+    SVG_PRESERVEASPECTRATIO_XMAXYMIN: core.int,
+    SVG_PRESERVEASPECTRATIO_XMIDYMAX: core.int,
+    SVG_PRESERVEASPECTRATIO_XMIDYMID: core.int,
+    SVG_PRESERVEASPECTRATIO_XMIDYMIN: core.int,
+    SVG_PRESERVEASPECTRATIO_XMINYMAX: core.int,
+    SVG_PRESERVEASPECTRATIO_XMINYMID: core.int,
+    SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
+  })
+});
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
+dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
+dart.defineExtensionNames([
+  'cx',
+  'cy',
+  'fr',
+  'fx',
+  'fy',
+  'r'
+]);
+svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
+  }
+  created() {
+    this[dartx.cx] = null;
+    this[dartx.cy] = null;
+    this[dartx.fr] = null;
+    this[dartx.fx] = null;
+    this[dartx.fy] = null;
+    this[dartx.r] = null;
+    super.created();
+  }
+  get [dartx.cx]() {
+    return this.cx;
+  }
+  get [dartx.cy]() {
+    return this.cy;
+  }
+  get [dartx.fr]() {
+    return this.fr;
+  }
+  get [dartx.fx]() {
+    return this.fx;
+  }
+  get [dartx.fy]() {
+    return this.fy;
+  }
+  get [dartx.r]() {
+    return this.r;
+  }
+};
+dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
+dart.setSignature(svg$.RadialGradientElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
+    new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
+    created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
+  }),
+  fields: () => ({
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.fr]: svg$.AnimatedLength,
+    [dartx.fx]: svg$.AnimatedLength,
+    [dartx.fy]: svg$.AnimatedLength,
+    [dartx.r]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
+dart.defineExtensionNames([
+  'height',
+  'width',
+  'x',
+  'y'
+]);
+svg$.Rect = class Rect extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  set [dartx.height](value) {
+    this.height = value;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  set [dartx.width](value) {
+    this.width = value;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  set [dartx.x](value) {
+    this.x = value;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  set [dartx.y](value) {
+    this.y = value;
+  }
+};
+dart.setSignature(svg$.Rect, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
+  fields: () => ({
+    [dartx.height]: core.num,
+    [dartx.width]: core.num,
+    [dartx.x]: core.num,
+    [dartx.y]: core.num
+  })
+});
+dart.registerExtension(dart.global.SVGRect, svg$.Rect);
+dart.defineExtensionNames([
+  'height',
+  'rx',
+  'ry',
+  'width',
+  'x',
+  'y'
+]);
+svg$.RectElement = class RectElement extends svg$.GeometryElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.rx] = null;
+    this[dartx.ry] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.rx]() {
+    return this.rx;
+  }
+  get [dartx.ry]() {
+    return this.ry;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.RectElement, 'created');
+dart.setSignature(svg$.RectElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.RectElement, []),
+    new: dart.definiteFunctionType(svg$.RectElement, []),
+    created: dart.definiteFunctionType(svg$.RectElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.rx]: svg$.AnimatedLength,
+    [dartx.ry]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
+  })
+});
+dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
+dart.defineExtensionNames([
+  'type',
+  'href'
+]);
+svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
+  }
+  created() {
+    this[dartx.type] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.ScriptElement, 'created');
+svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.ScriptElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.ScriptElement, []),
+    new: dart.definiteFunctionType(svg$.ScriptElement, []),
+    created: dart.definiteFunctionType(svg$.ScriptElement, [])
+  }),
+  fields: () => ({
+    [dartx.type]: core.String,
+    [dartx.href]: svg$.AnimatedString
+  })
+});
+dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
+svg$.SetElement = class SetElement extends svg$.AnimationElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
+  }
+};
+dart.defineNamedConstructor(svg$.SetElement, 'created');
+dart.setSignature(svg$.SetElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.SetElement, []),
+    new: dart.definiteFunctionType(svg$.SetElement, []),
+    created: dart.definiteFunctionType(svg$.SetElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
+dart.defineExtensionNames([
+  'gradientOffset'
+]);
+svg$.StopElement = class StopElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
+  }
+  created() {
+    this[dartx.gradientOffset] = null;
+    super.created();
+  }
+  get [dartx.gradientOffset]() {
+    return this.offset;
+  }
+};
+dart.defineNamedConstructor(svg$.StopElement, 'created');
+dart.setSignature(svg$.StopElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.StopElement, []),
+    new: dart.definiteFunctionType(svg$.StopElement, []),
+    created: dart.definiteFunctionType(svg$.StopElement, [])
+  }),
+  fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
+});
+dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'appendItem',
+  'clear',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'numberOfItems'
+]);
+svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.getItem](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
+    }
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
+    }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+svg$.StringList[dart.implements] = () => [ListOfString()];
+dart.setSignature(svg$.StringList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
+  fields: () => ({[dartx.numberOfItems]: core.int}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
+    [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(core.String, [core.String, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(core.String, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
+dart.defineExtensionNames([
+  'disabled',
+  'media',
+  'sheet',
+  'type'
+]);
+svg$.StyleElement = class StyleElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
+  }
+  created() {
+    this[dartx.disabled] = null;
+    this[dartx.media] = null;
+    this[dartx.sheet] = null;
+    this[dartx.type] = null;
+    super.created();
+  }
+  get [dartx.disabled]() {
+    return this.disabled;
+  }
+  set [dartx.disabled](value) {
+    this.disabled = value;
+  }
+  get [dartx.media]() {
+    return this.media;
+  }
+  set [dartx.media](value) {
+    this.media = value;
+  }
+  get [dartx.sheet]() {
+    return this.sheet;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+};
+dart.defineNamedConstructor(svg$.StyleElement, 'created');
+dart.setSignature(svg$.StyleElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.StyleElement, []),
+    new: dart.definiteFunctionType(svg$.StyleElement, []),
+    created: dart.definiteFunctionType(svg$.StyleElement, [])
+  }),
+  fields: () => ({
+    [dartx.disabled]: core.bool,
+    [dartx.media]: core.String,
+    [dartx.sheet]: html$.StyleSheet,
+    [dartx.type]: core.String
+  })
+});
+dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
+const _element$0 = Symbol('_element');
+svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
+  new(element) {
+    this[_element$0] = element;
+  }
+  readClasses() {
+    let classname = this[_element$0][dartx.attributes][dartx._get]('class');
+    let s = LinkedHashSetOfString().new();
+    if (classname == null) {
       return s;
     }
-    writeClasses(s) {
-      this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
-    }
-  };
-  dart.setSignature(svg$._AttributeClassSet, {
-    constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
-    fields: () => ({[_element$0]: html$.Element}),
-    methods: () => ({
-      readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
-      writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
-    })
-  });
-  dart.defineExtensionNames([
-    'animationsPaused',
-    'checkEnclosure',
-    'checkIntersection',
-    'createSvgAngle',
-    'createSvgLength',
-    'createSvgMatrix',
-    'createSvgNumber',
-    'createSvgPoint',
-    'createSvgRect',
-    'createSvgTransform',
-    'createSvgTransformFromMatrix',
-    'deselectAll',
-    'forceRedraw',
-    'getCurrentTime',
-    'getElementById',
-    'getEnclosureList',
-    'getIntersectionList',
-    'pauseAnimations',
-    'setCurrentTime',
-    'suspendRedraw',
-    'unpauseAnimations',
-    'unsuspendRedraw',
-    'unsuspendRedrawAll',
-    'currentScale',
-    'currentTranslate',
-    'currentView',
-    'height',
-    'pixelUnitToMillimeterX',
-    'pixelUnitToMillimeterY',
-    'screenPixelToMillimeterX',
-    'screenPixelToMillimeterY',
-    'useCurrentView',
-    'viewport',
-    'width',
-    'x',
-    'y',
-    'preserveAspectRatio',
-    'viewBox',
-    'zoomAndPan'
-  ]);
-  svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
-    static new() {
-      let el = svg$.SvgElement.tag("svg");
-      el[dartx.attributes][dartx._set]('version', "1.1");
-      return svg$.SvgSvgElement._check(el);
-    }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.currentScale] = null;
-      this[dartx.currentTranslate] = null;
-      this[dartx.currentView] = null;
-      this[dartx.height] = null;
-      this[dartx.pixelUnitToMillimeterX] = null;
-      this[dartx.pixelUnitToMillimeterY] = null;
-      this[dartx.screenPixelToMillimeterX] = null;
-      this[dartx.screenPixelToMillimeterY] = null;
-      this[dartx.useCurrentView] = null;
-      this[dartx.viewport] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.viewBox] = null;
-      this[dartx.zoomAndPan] = null;
-      super.created();
-    }
-    get [dartx.currentScale]() {
-      return this.currentScale;
-    }
-    set [dartx.currentScale](value) {
-      this.currentScale = value;
-    }
-    get [dartx.currentTranslate]() {
-      return this.currentTranslate;
-    }
-    get [dartx.currentView]() {
-      return this.currentView;
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.pixelUnitToMillimeterX]() {
-      return this.pixelUnitToMillimeterX;
-    }
-    get [dartx.pixelUnitToMillimeterY]() {
-      return this.pixelUnitToMillimeterY;
-    }
-    get [dartx.screenPixelToMillimeterX]() {
-      return this.screenPixelToMillimeterX;
-    }
-    get [dartx.screenPixelToMillimeterY]() {
-      return this.screenPixelToMillimeterY;
-    }
-    get [dartx.useCurrentView]() {
-      return this.useCurrentView;
-    }
-    get [dartx.viewport]() {
-      return this.viewport;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    [dartx.animationsPaused](...args) {
-      return this.animationsPaused.apply(this, args);
-    }
-    [dartx.checkEnclosure](...args) {
-      return this.checkEnclosure.apply(this, args);
-    }
-    [dartx.checkIntersection](...args) {
-      return this.checkIntersection.apply(this, args);
-    }
-    [dartx.createSvgAngle](...args) {
-      return this.createSVGAngle.apply(this, args);
-    }
-    [dartx.createSvgLength](...args) {
-      return this.createSVGLength.apply(this, args);
-    }
-    [dartx.createSvgMatrix](...args) {
-      return this.createSVGMatrix.apply(this, args);
-    }
-    [dartx.createSvgNumber](...args) {
-      return this.createSVGNumber.apply(this, args);
-    }
-    [dartx.createSvgPoint](...args) {
-      return this.createSVGPoint.apply(this, args);
-    }
-    [dartx.createSvgRect](...args) {
-      return this.createSVGRect.apply(this, args);
-    }
-    [dartx.createSvgTransform](...args) {
-      return this.createSVGTransform.apply(this, args);
-    }
-    [dartx.createSvgTransformFromMatrix](...args) {
-      return this.createSVGTransformFromMatrix.apply(this, args);
-    }
-    [dartx.deselectAll](...args) {
-      return this.deselectAll.apply(this, args);
-    }
-    [dartx.forceRedraw](...args) {
-      return this.forceRedraw.apply(this, args);
-    }
-    [dartx.getCurrentTime](...args) {
-      return this.getCurrentTime.apply(this, args);
-    }
-    [dartx.getElementById](...args) {
-      return this.getElementById.apply(this, args);
-    }
-    [dartx.getEnclosureList](...args) {
-      return this.getEnclosureList.apply(this, args);
-    }
-    [dartx.getIntersectionList](...args) {
-      return this.getIntersectionList.apply(this, args);
-    }
-    [dartx.pauseAnimations](...args) {
-      return this.pauseAnimations.apply(this, args);
-    }
-    [dartx.setCurrentTime](...args) {
-      return this.setCurrentTime.apply(this, args);
-    }
-    [dartx.suspendRedraw](...args) {
-      return this.suspendRedraw.apply(this, args);
-    }
-    [dartx.unpauseAnimations](...args) {
-      return this.unpauseAnimations.apply(this, args);
-    }
-    [dartx.unsuspendRedraw](...args) {
-      return this.unsuspendRedraw.apply(this, args);
-    }
-    [dartx.unsuspendRedrawAll](...args) {
-      return this.unsuspendRedrawAll.apply(this, args);
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-    get [dartx.zoomAndPan]() {
-      return this.zoomAndPan;
-    }
-    set [dartx.zoomAndPan](value) {
-      this.zoomAndPan = value;
-    }
-  };
-  dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
-  svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
-  dart.setSignature(svg$.SvgSvgElement, {
-    constructors: () => ({
-      new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
-      _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
-      created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
-    }),
-    fields: () => ({
-      [dartx.currentScale]: core.num,
-      [dartx.currentTranslate]: svg$.Point,
-      [dartx.currentView]: svg$.ViewSpec,
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.pixelUnitToMillimeterX]: core.double,
-      [dartx.pixelUnitToMillimeterY]: core.double,
-      [dartx.screenPixelToMillimeterX]: core.double,
-      [dartx.screenPixelToMillimeterY]: core.double,
-      [dartx.useCurrentView]: core.bool,
-      [dartx.viewport]: svg$.Rect,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect,
-      [dartx.zoomAndPan]: core.int
-    }),
-    methods: () => ({
-      [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
-      [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
-      [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
-      [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
-      [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
-      [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
-      [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
-      [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
-      [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
-      [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
-      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
-      [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
-      [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
-      [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
-      [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
-      [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
-      [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
-      [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
-      [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.unpauseAnimations]: dart.definiteFunctionType(dart.void, []),
-      [dartx.unsuspendRedraw]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
-  svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.SwitchElement, 'created');
-  dart.setSignature(svg$.SwitchElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.SwitchElement, []),
-      new: dart.definiteFunctionType(svg$.SwitchElement, []),
-      created: dart.definiteFunctionType(svg$.SwitchElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
-  dart.defineExtensionNames([
-    'preserveAspectRatio',
-    'viewBox'
-  ]);
-  svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
-    }
-    created() {
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.viewBox] = null;
-      super.created();
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-  };
-  dart.defineNamedConstructor(svg$.SymbolElement, 'created');
-  svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
-  dart.setSignature(svg$.SymbolElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.SymbolElement, []),
-      new: dart.definiteFunctionType(svg$.SymbolElement, []),
-      created: dart.definiteFunctionType(svg$.SymbolElement, [])
-    }),
-    fields: () => ({
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect
-    })
-  });
-  dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
-  dart.defineExtensionNames([
-    'getCharNumAtPosition',
-    'getComputedTextLength',
-    'getEndPositionOfChar',
-    'getExtentOfChar',
-    'getNumberOfChars',
-    'getRotationOfChar',
-    'getStartPositionOfChar',
-    'getSubStringLength',
-    'selectSubString',
-    'lengthAdjust',
-    'textLength'
-  ]);
-  svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.lengthAdjust] = null;
-      this[dartx.textLength] = null;
-      super.created();
-    }
-    get [dartx.lengthAdjust]() {
-      return this.lengthAdjust;
-    }
-    get [dartx.textLength]() {
-      return this.textLength;
-    }
-    [dartx.getCharNumAtPosition](...args) {
-      return this.getCharNumAtPosition.apply(this, args);
-    }
-    [dartx.getComputedTextLength](...args) {
-      return this.getComputedTextLength.apply(this, args);
-    }
-    [dartx.getEndPositionOfChar](...args) {
-      return this.getEndPositionOfChar.apply(this, args);
-    }
-    [dartx.getExtentOfChar](...args) {
-      return this.getExtentOfChar.apply(this, args);
-    }
-    [dartx.getNumberOfChars](...args) {
-      return this.getNumberOfChars.apply(this, args);
-    }
-    [dartx.getRotationOfChar](...args) {
-      return this.getRotationOfChar.apply(this, args);
-    }
-    [dartx.getStartPositionOfChar](...args) {
-      return this.getStartPositionOfChar.apply(this, args);
-    }
-    [dartx.getSubStringLength](...args) {
-      return this.getSubStringLength.apply(this, args);
-    }
-    [dartx.selectSubString](...args) {
-      return this.selectSubString.apply(this, args);
-    }
-  };
-  dart.defineNamedConstructor(svg$.TextContentElement, 'created');
-  dart.setSignature(svg$.TextContentElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TextContentElement, []),
-      created: dart.definiteFunctionType(svg$.TextContentElement, [])
-    }),
-    fields: () => ({
-      [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
-      [dartx.textLength]: svg$.AnimatedLength
-    }),
-    methods: () => ({
-      [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
-      [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
-      [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
-      [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
-      [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
-      [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
-      [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
-      [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
-      [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
-    }),
-    sfields: () => ({
-      LENGTHADJUST_SPACING: core.int,
-      LENGTHADJUST_SPACINGANDGLYPHS: core.int,
-      LENGTHADJUST_UNKNOWN: core.int
-    })
-  });
-  svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
-  svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
-  svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
-  dart.defineExtensionNames([
-    'dx',
-    'dy',
-    'rotate',
-    'x',
-    'y'
-  ]);
-  svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.dx] = null;
-      this[dartx.dy] = null;
-      this[dartx.rotate] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      super.created();
-    }
-    get [dartx.dx]() {
-      return this.dx;
-    }
-    get [dartx.dy]() {
-      return this.dy;
-    }
-    get [dartx.rotate]() {
-      return this.rotate;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-  };
-  dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
-  dart.setSignature(svg$.TextPositioningElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
-      created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
-    }),
-    fields: () => ({
-      [dartx.dx]: svg$.AnimatedLengthList,
-      [dartx.dy]: svg$.AnimatedLengthList,
-      [dartx.rotate]: svg$.AnimatedNumberList,
-      [dartx.x]: svg$.AnimatedLengthList,
-      [dartx.y]: svg$.AnimatedLengthList
-    })
-  });
-  dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
-  svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.TSpanElement, 'created');
-  dart.setSignature(svg$.TSpanElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TSpanElement, []),
-      new: dart.definiteFunctionType(svg$.TSpanElement, []),
-      created: dart.definiteFunctionType(svg$.TSpanElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
-  dart.defineExtensionNames([
-    'requiredExtensions',
-    'requiredFeatures',
-    'systemLanguage'
-  ]);
-  svg$.Tests = class Tests extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get requiredExtensions() {
-      return this[requiredExtensions];
-    }
-    set requiredExtensions(value) {
-      super.requiredExtensions = value;
-    }
-    get requiredFeatures() {
-      return this[requiredFeatures];
-    }
-    set requiredFeatures(value) {
-      super.requiredFeatures = value;
-    }
-    get systemLanguage() {
-      return this[systemLanguage];
-    }
-    set systemLanguage(value) {
-      super.systemLanguage = value;
-    }
-  };
-  const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
-  const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
-  const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
-  dart.setSignature(svg$.Tests, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
-    fields: () => ({
-      requiredExtensions: svg$.StringList,
-      requiredFeatures: svg$.StringList,
-      systemLanguage: svg$.StringList
-    })
-  });
-  dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
-  svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.TextElement, 'created');
-  dart.setSignature(svg$.TextElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TextElement, []),
-      new: dart.definiteFunctionType(svg$.TextElement, []),
-      created: dart.definiteFunctionType(svg$.TextElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
-  dart.defineExtensionNames([
-    'method',
-    'spacing',
-    'startOffset',
-    'href'
-  ]);
-  svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      this[dartx.method] = null;
-      this[dartx.spacing] = null;
-      this[dartx.startOffset] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.method]() {
-      return this.method;
-    }
-    get [dartx.spacing]() {
-      return this.spacing;
-    }
-    get [dartx.startOffset]() {
-      return this.startOffset;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.TextPathElement, 'created');
-  svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.TextPathElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TextPathElement, []),
-      created: dart.definiteFunctionType(svg$.TextPathElement, [])
-    }),
-    fields: () => ({
-      [dartx.method]: svg$.AnimatedEnumeration,
-      [dartx.spacing]: svg$.AnimatedEnumeration,
-      [dartx.startOffset]: svg$.AnimatedLength,
-      [dartx.href]: svg$.AnimatedString
-    }),
-    sfields: () => ({
-      TEXTPATH_METHODTYPE_ALIGN: core.int,
-      TEXTPATH_METHODTYPE_STRETCH: core.int,
-      TEXTPATH_METHODTYPE_UNKNOWN: core.int,
-      TEXTPATH_SPACINGTYPE_AUTO: core.int,
-      TEXTPATH_SPACINGTYPE_EXACT: core.int,
-      TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
-    })
-  });
-  svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
-  svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
-  svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
-  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
-  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
-  svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
-  svg$.TitleElement = class TitleElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$.TitleElement, 'created');
-  dart.setSignature(svg$.TitleElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.TitleElement, []),
-      new: dart.definiteFunctionType(svg$.TitleElement, []),
-      created: dart.definiteFunctionType(svg$.TitleElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
-  dart.defineExtensionNames([
-    'setMatrix',
-    'setRotate',
-    'setScale',
-    'setSkewX',
-    'setSkewY',
-    'setTranslate',
-    'angle',
-    'matrix',
-    'type'
-  ]);
-  svg$.Transform = class Transform extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.angle]() {
-      return this.angle;
-    }
-    get [dartx.matrix]() {
-      return this.matrix;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    [dartx.setMatrix](...args) {
-      return this.setMatrix.apply(this, args);
-    }
-    [dartx.setRotate](...args) {
-      return this.setRotate.apply(this, args);
-    }
-    [dartx.setScale](...args) {
-      return this.setScale.apply(this, args);
-    }
-    [dartx.setSkewX](...args) {
-      return this.setSkewX.apply(this, args);
-    }
-    [dartx.setSkewY](...args) {
-      return this.setSkewY.apply(this, args);
-    }
-    [dartx.setTranslate](...args) {
-      return this.setTranslate.apply(this, args);
-    }
-  };
-  dart.setSignature(svg$.Transform, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
-    fields: () => ({
-      [dartx.angle]: core.double,
-      [dartx.matrix]: svg$.Matrix,
-      [dartx.type]: core.int
-    }),
-    methods: () => ({
-      [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
-      [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
-      [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.setSkewY]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.setTranslate]: dart.definiteFunctionType(dart.void, [core.num, core.num])
-    }),
-    sfields: () => ({
-      SVG_TRANSFORM_MATRIX: core.int,
-      SVG_TRANSFORM_ROTATE: core.int,
-      SVG_TRANSFORM_SCALE: core.int,
-      SVG_TRANSFORM_SKEWX: core.int,
-      SVG_TRANSFORM_SKEWY: core.int,
-      SVG_TRANSFORM_TRANSLATE: core.int,
-      SVG_TRANSFORM_UNKNOWN: core.int
-    })
-  });
-  svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
-  svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
-  svg$.Transform.SVG_TRANSFORM_SCALE = 3;
-  svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
-  svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
-  svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
-  svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
-  dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'appendItem',
-    'clear',
-    'consolidate',
-    'createSvgTransformFromMatrix',
-    'getItem',
-    'initialize',
-    'insertItemBefore',
-    'removeItem',
-    'replaceItem',
-    'numberOfItems'
-  ]);
-  svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfItems]() {
-      return this.numberOfItems;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.getItem](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
+    for (let name of classname[dartx.split](' ')) {
+      let trimmed = name[dartx.trim]();
+      if (!dart.test(trimmed[dartx.isEmpty])) {
+        s.add(trimmed);
       }
-      dart.throw(new core.StateError("No elements"));
     }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
+    return s;
+  }
+  writeClasses(s) {
+    this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
+  }
+};
+dart.setSignature(svg$._AttributeClassSet, {
+  constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
+  fields: () => ({[_element$0]: html$.Element}),
+  methods: () => ({
+    readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
+    writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
+  })
+});
+dart.defineExtensionNames([
+  'animationsPaused',
+  'checkEnclosure',
+  'checkIntersection',
+  'createSvgAngle',
+  'createSvgLength',
+  'createSvgMatrix',
+  'createSvgNumber',
+  'createSvgPoint',
+  'createSvgRect',
+  'createSvgTransform',
+  'createSvgTransformFromMatrix',
+  'deselectAll',
+  'forceRedraw',
+  'getCurrentTime',
+  'getElementById',
+  'getEnclosureList',
+  'getIntersectionList',
+  'pauseAnimations',
+  'setCurrentTime',
+  'suspendRedraw',
+  'unpauseAnimations',
+  'unsuspendRedraw',
+  'unsuspendRedrawAll',
+  'currentScale',
+  'currentTranslate',
+  'currentView',
+  'height',
+  'pixelUnitToMillimeterX',
+  'pixelUnitToMillimeterY',
+  'screenPixelToMillimeterX',
+  'screenPixelToMillimeterY',
+  'useCurrentView',
+  'viewport',
+  'width',
+  'x',
+  'y',
+  'preserveAspectRatio',
+  'viewBox',
+  'zoomAndPan'
+]);
+svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
+  static new() {
+    let el = svg$.SvgElement.tag("svg");
+    el[dartx.attributes][dartx._set]('version', "1.1");
+    return svg$.SvgSvgElement._check(el);
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.currentScale] = null;
+    this[dartx.currentTranslate] = null;
+    this[dartx.currentView] = null;
+    this[dartx.height] = null;
+    this[dartx.pixelUnitToMillimeterX] = null;
+    this[dartx.pixelUnitToMillimeterY] = null;
+    this[dartx.screenPixelToMillimeterX] = null;
+    this[dartx.screenPixelToMillimeterY] = null;
+    this[dartx.useCurrentView] = null;
+    this[dartx.viewport] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.viewBox] = null;
+    this[dartx.zoomAndPan] = null;
+    super.created();
+  }
+  get [dartx.currentScale]() {
+    return this.currentScale;
+  }
+  set [dartx.currentScale](value) {
+    this.currentScale = value;
+  }
+  get [dartx.currentTranslate]() {
+    return this.currentTranslate;
+  }
+  get [dartx.currentView]() {
+    return this.currentView;
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.pixelUnitToMillimeterX]() {
+    return this.pixelUnitToMillimeterX;
+  }
+  get [dartx.pixelUnitToMillimeterY]() {
+    return this.pixelUnitToMillimeterY;
+  }
+  get [dartx.screenPixelToMillimeterX]() {
+    return this.screenPixelToMillimeterX;
+  }
+  get [dartx.screenPixelToMillimeterY]() {
+    return this.screenPixelToMillimeterY;
+  }
+  get [dartx.useCurrentView]() {
+    return this.useCurrentView;
+  }
+  get [dartx.viewport]() {
+    return this.viewport;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  [dartx.animationsPaused](...args) {
+    return this.animationsPaused.apply(this, args);
+  }
+  [dartx.checkEnclosure](...args) {
+    return this.checkEnclosure.apply(this, args);
+  }
+  [dartx.checkIntersection](...args) {
+    return this.checkIntersection.apply(this, args);
+  }
+  [dartx.createSvgAngle](...args) {
+    return this.createSVGAngle.apply(this, args);
+  }
+  [dartx.createSvgLength](...args) {
+    return this.createSVGLength.apply(this, args);
+  }
+  [dartx.createSvgMatrix](...args) {
+    return this.createSVGMatrix.apply(this, args);
+  }
+  [dartx.createSvgNumber](...args) {
+    return this.createSVGNumber.apply(this, args);
+  }
+  [dartx.createSvgPoint](...args) {
+    return this.createSVGPoint.apply(this, args);
+  }
+  [dartx.createSvgRect](...args) {
+    return this.createSVGRect.apply(this, args);
+  }
+  [dartx.createSvgTransform](...args) {
+    return this.createSVGTransform.apply(this, args);
+  }
+  [dartx.createSvgTransformFromMatrix](...args) {
+    return this.createSVGTransformFromMatrix.apply(this, args);
+  }
+  [dartx.deselectAll](...args) {
+    return this.deselectAll.apply(this, args);
+  }
+  [dartx.forceRedraw](...args) {
+    return this.forceRedraw.apply(this, args);
+  }
+  [dartx.getCurrentTime](...args) {
+    return this.getCurrentTime.apply(this, args);
+  }
+  [dartx.getElementById](...args) {
+    return this.getElementById.apply(this, args);
+  }
+  [dartx.getEnclosureList](...args) {
+    return this.getEnclosureList.apply(this, args);
+  }
+  [dartx.getIntersectionList](...args) {
+    return this.getIntersectionList.apply(this, args);
+  }
+  [dartx.pauseAnimations](...args) {
+    return this.pauseAnimations.apply(this, args);
+  }
+  [dartx.setCurrentTime](...args) {
+    return this.setCurrentTime.apply(this, args);
+  }
+  [dartx.suspendRedraw](...args) {
+    return this.suspendRedraw.apply(this, args);
+  }
+  [dartx.unpauseAnimations](...args) {
+    return this.unpauseAnimations.apply(this, args);
+  }
+  [dartx.unsuspendRedraw](...args) {
+    return this.unsuspendRedraw.apply(this, args);
+  }
+  [dartx.unsuspendRedrawAll](...args) {
+    return this.unsuspendRedrawAll.apply(this, args);
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+  get [dartx.zoomAndPan]() {
+    return this.zoomAndPan;
+  }
+  set [dartx.zoomAndPan](value) {
+    this.zoomAndPan = value;
+  }
+};
+dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
+svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.SvgSvgElement, {
+  constructors: () => ({
+    new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
+    _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
+    created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
+  }),
+  fields: () => ({
+    [dartx.currentScale]: core.num,
+    [dartx.currentTranslate]: svg$.Point,
+    [dartx.currentView]: svg$.ViewSpec,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.pixelUnitToMillimeterX]: core.double,
+    [dartx.pixelUnitToMillimeterY]: core.double,
+    [dartx.screenPixelToMillimeterX]: core.double,
+    [dartx.screenPixelToMillimeterY]: core.double,
+    [dartx.useCurrentView]: core.bool,
+    [dartx.viewport]: svg$.Rect,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
+    [dartx.zoomAndPan]: core.int
+  }),
+  methods: () => ({
+    [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
+    [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
+    [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
+    [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
+    [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
+    [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
+    [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
+    [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
+    [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
+    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
+    [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
+    [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
+    [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
+    [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
+    [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
+    [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.unpauseAnimations]: dart.definiteFunctionType(dart.void, []),
+    [dartx.unsuspendRedraw]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
+svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.SwitchElement, 'created');
+dart.setSignature(svg$.SwitchElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.SwitchElement, []),
+    new: dart.definiteFunctionType(svg$.SwitchElement, []),
+    created: dart.definiteFunctionType(svg$.SwitchElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
+dart.defineExtensionNames([
+  'preserveAspectRatio',
+  'viewBox'
+]);
+svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
+  }
+  created() {
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.viewBox] = null;
+    super.created();
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+};
+dart.defineNamedConstructor(svg$.SymbolElement, 'created');
+svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
+dart.setSignature(svg$.SymbolElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.SymbolElement, []),
+    new: dart.definiteFunctionType(svg$.SymbolElement, []),
+    created: dart.definiteFunctionType(svg$.SymbolElement, [])
+  }),
+  fields: () => ({
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect
+  })
+});
+dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
+dart.defineExtensionNames([
+  'getCharNumAtPosition',
+  'getComputedTextLength',
+  'getEndPositionOfChar',
+  'getExtentOfChar',
+  'getNumberOfChars',
+  'getRotationOfChar',
+  'getStartPositionOfChar',
+  'getSubStringLength',
+  'selectSubString',
+  'lengthAdjust',
+  'textLength'
+]);
+svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.lengthAdjust] = null;
+    this[dartx.textLength] = null;
+    super.created();
+  }
+  get [dartx.lengthAdjust]() {
+    return this.lengthAdjust;
+  }
+  get [dartx.textLength]() {
+    return this.textLength;
+  }
+  [dartx.getCharNumAtPosition](...args) {
+    return this.getCharNumAtPosition.apply(this, args);
+  }
+  [dartx.getComputedTextLength](...args) {
+    return this.getComputedTextLength.apply(this, args);
+  }
+  [dartx.getEndPositionOfChar](...args) {
+    return this.getEndPositionOfChar.apply(this, args);
+  }
+  [dartx.getExtentOfChar](...args) {
+    return this.getExtentOfChar.apply(this, args);
+  }
+  [dartx.getNumberOfChars](...args) {
+    return this.getNumberOfChars.apply(this, args);
+  }
+  [dartx.getRotationOfChar](...args) {
+    return this.getRotationOfChar.apply(this, args);
+  }
+  [dartx.getStartPositionOfChar](...args) {
+    return this.getStartPositionOfChar.apply(this, args);
+  }
+  [dartx.getSubStringLength](...args) {
+    return this.getSubStringLength.apply(this, args);
+  }
+  [dartx.selectSubString](...args) {
+    return this.selectSubString.apply(this, args);
+  }
+};
+dart.defineNamedConstructor(svg$.TextContentElement, 'created');
+dart.setSignature(svg$.TextContentElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TextContentElement, []),
+    created: dart.definiteFunctionType(svg$.TextContentElement, [])
+  }),
+  fields: () => ({
+    [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
+    [dartx.textLength]: svg$.AnimatedLength
+  }),
+  methods: () => ({
+    [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
+    [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
+    [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
+    [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
+    [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
+    [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
+    [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
+  }),
+  sfields: () => ({
+    LENGTHADJUST_SPACING: core.int,
+    LENGTHADJUST_SPACINGANDGLYPHS: core.int,
+    LENGTHADJUST_UNKNOWN: core.int
+  })
+});
+svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
+svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
+svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
+dart.defineExtensionNames([
+  'dx',
+  'dy',
+  'rotate',
+  'x',
+  'y'
+]);
+svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.dx] = null;
+    this[dartx.dy] = null;
+    this[dartx.rotate] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    super.created();
+  }
+  get [dartx.dx]() {
+    return this.dx;
+  }
+  get [dartx.dy]() {
+    return this.dy;
+  }
+  get [dartx.rotate]() {
+    return this.rotate;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+};
+dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
+dart.setSignature(svg$.TextPositioningElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
+    created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
+  }),
+  fields: () => ({
+    [dartx.dx]: svg$.AnimatedLengthList,
+    [dartx.dy]: svg$.AnimatedLengthList,
+    [dartx.rotate]: svg$.AnimatedNumberList,
+    [dartx.x]: svg$.AnimatedLengthList,
+    [dartx.y]: svg$.AnimatedLengthList
+  })
+});
+dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
+svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.TSpanElement, 'created');
+dart.setSignature(svg$.TSpanElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TSpanElement, []),
+    new: dart.definiteFunctionType(svg$.TSpanElement, []),
+    created: dart.definiteFunctionType(svg$.TSpanElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
+dart.defineExtensionNames([
+  'requiredExtensions',
+  'requiredFeatures',
+  'systemLanguage'
+]);
+svg$.Tests = class Tests extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get requiredExtensions() {
+    return this[requiredExtensions];
+  }
+  set requiredExtensions(value) {
+    super.requiredExtensions = value;
+  }
+  get requiredFeatures() {
+    return this[requiredFeatures];
+  }
+  set requiredFeatures(value) {
+    super.requiredFeatures = value;
+  }
+  get systemLanguage() {
+    return this[systemLanguage];
+  }
+  set systemLanguage(value) {
+    super.systemLanguage = value;
+  }
+};
+const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
+const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
+const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
+dart.setSignature(svg$.Tests, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
+  fields: () => ({
+    requiredExtensions: svg$.StringList,
+    requiredFeatures: svg$.StringList,
+    systemLanguage: svg$.StringList
+  })
+});
+dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
+svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.TextElement, 'created');
+dart.setSignature(svg$.TextElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TextElement, []),
+    new: dart.definiteFunctionType(svg$.TextElement, []),
+    created: dart.definiteFunctionType(svg$.TextElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
+dart.defineExtensionNames([
+  'method',
+  'spacing',
+  'startOffset',
+  'href'
+]);
+svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    this[dartx.method] = null;
+    this[dartx.spacing] = null;
+    this[dartx.startOffset] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.method]() {
+    return this.method;
+  }
+  get [dartx.spacing]() {
+    return this.spacing;
+  }
+  get [dartx.startOffset]() {
+    return this.startOffset;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.TextPathElement, 'created');
+svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.TextPathElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TextPathElement, []),
+    created: dart.definiteFunctionType(svg$.TextPathElement, [])
+  }),
+  fields: () => ({
+    [dartx.method]: svg$.AnimatedEnumeration,
+    [dartx.spacing]: svg$.AnimatedEnumeration,
+    [dartx.startOffset]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
+  }),
+  sfields: () => ({
+    TEXTPATH_METHODTYPE_ALIGN: core.int,
+    TEXTPATH_METHODTYPE_STRETCH: core.int,
+    TEXTPATH_METHODTYPE_UNKNOWN: core.int,
+    TEXTPATH_SPACINGTYPE_AUTO: core.int,
+    TEXTPATH_SPACINGTYPE_EXACT: core.int,
+    TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
+  })
+});
+svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
+svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
+svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
+svg$.TitleElement = class TitleElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$.TitleElement, 'created');
+dart.setSignature(svg$.TitleElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.TitleElement, []),
+    new: dart.definiteFunctionType(svg$.TitleElement, []),
+    created: dart.definiteFunctionType(svg$.TitleElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
+dart.defineExtensionNames([
+  'setMatrix',
+  'setRotate',
+  'setScale',
+  'setSkewX',
+  'setSkewY',
+  'setTranslate',
+  'angle',
+  'matrix',
+  'type'
+]);
+svg$.Transform = class Transform extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.angle]() {
+    return this.angle;
+  }
+  get [dartx.matrix]() {
+    return this.matrix;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  [dartx.setMatrix](...args) {
+    return this.setMatrix.apply(this, args);
+  }
+  [dartx.setRotate](...args) {
+    return this.setRotate.apply(this, args);
+  }
+  [dartx.setScale](...args) {
+    return this.setScale.apply(this, args);
+  }
+  [dartx.setSkewX](...args) {
+    return this.setSkewX.apply(this, args);
+  }
+  [dartx.setSkewY](...args) {
+    return this.setSkewY.apply(this, args);
+  }
+  [dartx.setTranslate](...args) {
+    return this.setTranslate.apply(this, args);
+  }
+};
+dart.setSignature(svg$.Transform, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
+  fields: () => ({
+    [dartx.angle]: core.double,
+    [dartx.matrix]: svg$.Matrix,
+    [dartx.type]: core.int
+  }),
+  methods: () => ({
+    [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
+    [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
+    [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.setSkewY]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.setTranslate]: dart.definiteFunctionType(dart.void, [core.num, core.num])
+  }),
+  sfields: () => ({
+    SVG_TRANSFORM_MATRIX: core.int,
+    SVG_TRANSFORM_ROTATE: core.int,
+    SVG_TRANSFORM_SCALE: core.int,
+    SVG_TRANSFORM_SKEWX: core.int,
+    SVG_TRANSFORM_SKEWY: core.int,
+    SVG_TRANSFORM_TRANSLATE: core.int,
+    SVG_TRANSFORM_UNKNOWN: core.int
+  })
+});
+svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
+svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
+svg$.Transform.SVG_TRANSFORM_SCALE = 3;
+svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
+svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
+svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
+svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'appendItem',
+  'clear',
+  'consolidate',
+  'createSvgTransformFromMatrix',
+  'getItem',
+  'initialize',
+  'insertItemBefore',
+  'removeItem',
+  'replaceItem',
+  'numberOfItems'
+]);
+svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfItems]() {
+    return this.numberOfItems;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.getItem](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
     }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
     }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
     }
-    [__setter__$](...args) {
-      return this.__setter__.apply(this, args);
-    }
-    [dartx.appendItem](...args) {
-      return this.appendItem.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.consolidate](...args) {
-      return this.consolidate.apply(this, args);
-    }
-    [dartx.createSvgTransformFromMatrix](...args) {
-      return this.createSVGTransformFromMatrix.apply(this, args);
-    }
-    [dartx.getItem](...args) {
-      return this.getItem.apply(this, args);
-    }
-    [dartx.initialize](...args) {
-      return this.initialize.apply(this, args);
-    }
-    [dartx.insertItemBefore](...args) {
-      return this.insertItemBefore.apply(this, args);
-    }
-    [dartx.removeItem](...args) {
-      return this.removeItem.apply(this, args);
-    }
-    [dartx.replaceItem](...args) {
-      return this.replaceItem.apply(this, args);
-    }
-  };
-  svg$.TransformList[dart.implements] = () => [ListOfTransform()];
-  dart.setSignature(svg$.TransformList, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
-    fields: () => ({[dartx.numberOfItems]: core.int}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
-      [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
-      [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
-      [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
-      [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
-      [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
-      [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
-      [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
-      [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
-      [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
-    })
-  });
-  dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
-  svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(svg$.UnitTypes, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
-    sfields: () => ({
-      SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
-      SVG_UNIT_TYPE_UNKNOWN: core.int,
-      SVG_UNIT_TYPE_USERSPACEONUSE: core.int
-    })
-  });
-  svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
-  svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
-  svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
-  dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
-  dart.defineExtensionNames([
-    'href'
-  ]);
-  svg$.UriReference = class UriReference extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get href() {
-      return this[href$0];
-    }
-    set href(value) {
-      super.href = value;
-    }
-  };
-  const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
-  dart.setSignature(svg$.UriReference, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
-    fields: () => ({href: svg$.AnimatedString})
-  });
-  dart.defineExtensionMembers(svg$.UriReference, ['href']);
-  dart.defineExtensionNames([
-    'height',
-    'width',
-    'x',
-    'y',
-    'href'
-  ]);
-  svg$.UseElement = class UseElement extends svg$.GraphicsElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
-    }
-    created() {
-      this[dartx.height] = null;
-      this[dartx.width] = null;
-      this[dartx.x] = null;
-      this[dartx.y] = null;
-      this[dartx.href] = null;
-      super.created();
-    }
-    get [dartx.height]() {
-      return this.height;
-    }
-    get [dartx.width]() {
-      return this.width;
-    }
-    get [dartx.x]() {
-      return this.x;
-    }
-    get [dartx.y]() {
-      return this.y;
-    }
-    get [dartx.href]() {
-      return this.href;
-    }
-  };
-  dart.defineNamedConstructor(svg$.UseElement, 'created');
-  svg$.UseElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$.UseElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.UseElement, []),
-      new: dart.definiteFunctionType(svg$.UseElement, []),
-      created: dart.definiteFunctionType(svg$.UseElement, [])
-    }),
-    fields: () => ({
-      [dartx.height]: svg$.AnimatedLength,
-      [dartx.width]: svg$.AnimatedLength,
-      [dartx.x]: svg$.AnimatedLength,
-      [dartx.y]: svg$.AnimatedLength,
-      [dartx.href]: svg$.AnimatedString
-    })
-  });
-  dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
-  dart.defineExtensionNames([
-    'viewTarget',
-    'preserveAspectRatio',
-    'viewBox',
-    'zoomAndPan'
-  ]);
-  svg$.ViewElement = class ViewElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
-    }
-    created() {
-      this[dartx.viewTarget] = null;
-      this[dartx.preserveAspectRatio] = null;
-      this[dartx.viewBox] = null;
-      this[dartx.zoomAndPan] = null;
-      super.created();
-    }
-    get [dartx.viewTarget]() {
-      return this.viewTarget;
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-    get [dartx.zoomAndPan]() {
-      return this.zoomAndPan;
-    }
-    set [dartx.zoomAndPan](value) {
-      this.zoomAndPan = value;
-    }
-  };
-  dart.defineNamedConstructor(svg$.ViewElement, 'created');
-  svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
-  dart.setSignature(svg$.ViewElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$.ViewElement, []),
-      new: dart.definiteFunctionType(svg$.ViewElement, []),
-      created: dart.definiteFunctionType(svg$.ViewElement, [])
-    }),
-    fields: () => ({
-      [dartx.viewTarget]: svg$.StringList,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect,
-      [dartx.zoomAndPan]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
-  dart.defineExtensionNames([
-    'preserveAspectRatioString',
-    'transform',
-    'transformString',
-    'viewBoxString',
-    'viewTarget',
-    'viewTargetString',
-    'preserveAspectRatio',
-    'viewBox',
-    'zoomAndPan'
-  ]);
-  svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.preserveAspectRatioString]() {
-      return this.preserveAspectRatioString;
-    }
-    get [dartx.transform]() {
-      return this.transform;
-    }
-    get [dartx.transformString]() {
-      return this.transformString;
-    }
-    get [dartx.viewBoxString]() {
-      return this.viewBoxString;
-    }
-    get [dartx.viewTarget]() {
-      return this.viewTarget;
-    }
-    get [dartx.viewTargetString]() {
-      return this.viewTargetString;
-    }
-    get [dartx.preserveAspectRatio]() {
-      return this.preserveAspectRatio;
-    }
-    get [dartx.viewBox]() {
-      return this.viewBox;
-    }
-    get [dartx.zoomAndPan]() {
-      return this.zoomAndPan;
-    }
-    set [dartx.zoomAndPan](value) {
-      this.zoomAndPan = value;
-    }
-  };
-  svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
-  dart.setSignature(svg$.ViewSpec, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
-    fields: () => ({
-      [dartx.preserveAspectRatioString]: core.String,
-      [dartx.transform]: svg$.TransformList,
-      [dartx.transformString]: core.String,
-      [dartx.viewBoxString]: core.String,
-      [dartx.viewTarget]: svg$.SvgElement,
-      [dartx.viewTargetString]: core.String,
-      [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
-      [dartx.viewBox]: svg$.AnimatedRect,
-      [dartx.zoomAndPan]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
-  dart.defineExtensionNames([
-    'zoomAndPan'
-  ]);
-  svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get zoomAndPan() {
-      return this[zoomAndPan];
-    }
-    set zoomAndPan(value) {
-      this[zoomAndPan] = value;
-    }
-  };
-  const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
-  dart.setSignature(svg$.ZoomAndPan, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
-    fields: () => ({zoomAndPan: core.int}),
-    sfields: () => ({
-      SVG_ZOOMANDPAN_DISABLE: core.int,
-      SVG_ZOOMANDPAN_MAGNIFY: core.int,
-      SVG_ZOOMANDPAN_UNKNOWN: core.int
-    })
-  });
-  dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
-  svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
-  svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
-  svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
-  dart.defineExtensionNames([
-    'newScale',
-    'newTranslate',
-    'previousScale',
-    'previousTranslate',
-    'zoomRectScreen'
-  ]);
-  svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.newScale]() {
-      return this.newScale;
-    }
-    get [dartx.newTranslate]() {
-      return this.newTranslate;
-    }
-    get [dartx.previousScale]() {
-      return this.previousScale;
-    }
-    get [dartx.previousTranslate]() {
-      return this.previousTranslate;
-    }
-    get [dartx.zoomRectScreen]() {
-      return this.zoomRectScreen;
-    }
-  };
-  dart.setSignature(svg$.ZoomEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
-    fields: () => ({
-      [dartx.newScale]: core.double,
-      [dartx.newTranslate]: svg$.Point,
-      [dartx.previousScale]: core.double,
-      [dartx.previousTranslate]: svg$.Point,
-      [dartx.zoomRectScreen]: svg$.Rect
-    })
-  });
-  dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
-  svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
-    }
-    created() {
-      super.created();
-    }
-    static get supported() {
-      return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
-    }
-  };
-  dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
-  svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
-  dart.setSignature(svg$._SVGCursorElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
-      new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
-      created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
-  svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
-  svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
-  dart.setSignature(svg$._SVGFEDropShadowElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
-      created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
-  svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new() {
-      return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
-    }
-    created() {
-      super.created();
-    }
-  };
-  dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
-  svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
-  dart.setSignature(svg$._SVGMPathElement, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
-      new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
-      created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
-    })
-  });
-  dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
-  const _connect = Symbol('_connect');
-  dart.defineExtensionNames([
-    'disconnect',
-    'connectNode',
-    'connectParam',
-    'channelCount',
-    'channelCountMode',
-    'channelInterpretation',
-    'context',
-    'numberOfInputs',
-    'numberOfOutputs'
-  ]);
-  web_audio.AudioNode = class AudioNode extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.channelCount]() {
-      return this.channelCount;
-    }
-    set [dartx.channelCount](value) {
-      this.channelCount = value;
-    }
-    get [dartx.channelCountMode]() {
-      return this.channelCountMode;
-    }
-    set [dartx.channelCountMode](value) {
-      this.channelCountMode = value;
-    }
-    get [dartx.channelInterpretation]() {
-      return this.channelInterpretation;
-    }
-    set [dartx.channelInterpretation](value) {
-      this.channelInterpretation = value;
-    }
-    get [dartx.context]() {
-      return this.context;
-    }
-    get [dartx.numberOfInputs]() {
-      return this.numberOfInputs;
-    }
-    get [dartx.numberOfOutputs]() {
-      return this.numberOfOutputs;
-    }
-    [_connect](...args) {
-      return this.connect.apply(this, args);
-    }
-    [dartx.disconnect](...args) {
-      return this.disconnect.apply(this, args);
-    }
-    [dartx.connectNode](destination, output, input) {
-      if (output === void 0) output = 0;
-      if (input === void 0) input = 0;
-      return this[_connect](destination, output, input);
-    }
-    [dartx.connectParam](destination, output) {
-      if (output === void 0) output = 0;
-      return this[_connect](destination, output);
-    }
-  };
-  dart.setSignature(web_audio.AudioNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioNode, [])}),
-    fields: () => ({
-      [dartx.channelCount]: core.int,
-      [dartx.channelCountMode]: core.String,
-      [dartx.channelInterpretation]: core.String,
-      [dartx.context]: web_audio.AudioContext,
-      [dartx.numberOfInputs]: core.int,
-      [dartx.numberOfOutputs]: core.int
-    }),
-    methods: () => ({
-      [_connect]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int], [core.int]),
-      [dartx.disconnect]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.connectNode]: dart.definiteFunctionType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
-      [dartx.connectParam]: dart.definiteFunctionType(dart.void, [web_audio.AudioParam], [core.int])
-    })
-  });
-  dart.registerExtension(dart.global.AudioNode, web_audio.AudioNode);
-  dart.defineExtensionNames([
-    'getByteFrequencyData',
-    'getByteTimeDomainData',
-    'getFloatFrequencyData',
-    'getFloatTimeDomainData',
-    'fftSize',
-    'frequencyBinCount',
-    'maxDecibels',
-    'minDecibels',
-    'smoothingTimeConstant'
-  ]);
-  web_audio.AnalyserNode = class AnalyserNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.fftSize]() {
-      return this.fftSize;
-    }
-    set [dartx.fftSize](value) {
-      this.fftSize = value;
-    }
-    get [dartx.frequencyBinCount]() {
-      return this.frequencyBinCount;
-    }
-    get [dartx.maxDecibels]() {
-      return this.maxDecibels;
-    }
-    set [dartx.maxDecibels](value) {
-      this.maxDecibels = value;
-    }
-    get [dartx.minDecibels]() {
-      return this.minDecibels;
-    }
-    set [dartx.minDecibels](value) {
-      this.minDecibels = value;
-    }
-    get [dartx.smoothingTimeConstant]() {
-      return this.smoothingTimeConstant;
-    }
-    set [dartx.smoothingTimeConstant](value) {
-      this.smoothingTimeConstant = value;
-    }
-    [dartx.getByteFrequencyData](...args) {
-      return this.getByteFrequencyData.apply(this, args);
-    }
-    [dartx.getByteTimeDomainData](...args) {
-      return this.getByteTimeDomainData.apply(this, args);
-    }
-    [dartx.getFloatFrequencyData](...args) {
-      return this.getFloatFrequencyData.apply(this, args);
-    }
-    [dartx.getFloatTimeDomainData](...args) {
-      return this.getFloatTimeDomainData.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.AnalyserNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AnalyserNode, [])}),
-    fields: () => ({
-      [dartx.fftSize]: core.int,
-      [dartx.frequencyBinCount]: core.int,
-      [dartx.maxDecibels]: core.num,
-      [dartx.minDecibels]: core.num,
-      [dartx.smoothingTimeConstant]: core.num
-    }),
-    methods: () => ({
-      [dartx.getByteFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
-      [dartx.getByteTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
-      [dartx.getFloatFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List]),
-      [dartx.getFloatTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List])
-    })
-  });
-  dart.registerExtension(dart.global.AnalyserNode, web_audio.AnalyserNode);
-  dart.registerExtension(dart.global.RealtimeAnalyserNode, web_audio.AnalyserNode);
-  dart.defineExtensionNames([
-    'getChannelData',
-    'duration',
-    'length',
-    'numberOfChannels',
-    'sampleRate'
-  ]);
-  web_audio.AudioBuffer = class AudioBuffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.duration]() {
-      return this.duration;
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    get [dartx.numberOfChannels]() {
-      return this.numberOfChannels;
-    }
-    get [dartx.sampleRate]() {
-      return this.sampleRate;
-    }
-    [dartx.getChannelData](...args) {
-      return this.getChannelData.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.AudioBuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBuffer, [])}),
-    fields: () => ({
-      [dartx.duration]: core.double,
-      [dartx.length]: core.int,
-      [dartx.numberOfChannels]: core.int,
-      [dartx.sampleRate]: core.double
-    }),
-    methods: () => ({[dartx.getChannelData]: dart.definiteFunctionType(typed_data.Float32List, [core.int])})
-  });
-  dart.registerExtension(dart.global.AudioBuffer, web_audio.AudioBuffer);
-  web_audio.AudioBufferCallback = dart.typedef('AudioBufferCallback', () => dart.functionType(dart.void, [web_audio.AudioBuffer]));
-  web_audio.AudioSourceNode = class AudioSourceNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_audio.AudioSourceNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioSourceNode, [])})
-  });
-  dart.registerExtension(dart.global.AudioSourceNode, web_audio.AudioSourceNode);
-  dart.defineExtensionNames([
-    'start',
-    'stop',
-    'onEnded',
-    'buffer',
-    'loop',
-    'loopEnd',
-    'loopStart',
-    'playbackRate'
-  ]);
-  web_audio.AudioBufferSourceNode = class AudioBufferSourceNode extends web_audio.AudioSourceNode {
-    [dartx.start](when, grainOffset, grainDuration) {
-      if (grainOffset === void 0) grainOffset = null;
-      if (grainDuration === void 0) grainDuration = null;
-      if (!!this.start) {
-        if (grainDuration != null) {
-          this.start(when, grainOffset, grainDuration);
-        } else if (grainOffset != null) {
-          this.start(when, grainOffset);
-        } else {
-          this.start(when);
-        }
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [__setter__$](...args) {
+    return this.__setter__.apply(this, args);
+  }
+  [dartx.appendItem](...args) {
+    return this.appendItem.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.consolidate](...args) {
+    return this.consolidate.apply(this, args);
+  }
+  [dartx.createSvgTransformFromMatrix](...args) {
+    return this.createSVGTransformFromMatrix.apply(this, args);
+  }
+  [dartx.getItem](...args) {
+    return this.getItem.apply(this, args);
+  }
+  [dartx.initialize](...args) {
+    return this.initialize.apply(this, args);
+  }
+  [dartx.insertItemBefore](...args) {
+    return this.insertItemBefore.apply(this, args);
+  }
+  [dartx.removeItem](...args) {
+    return this.removeItem.apply(this, args);
+  }
+  [dartx.replaceItem](...args) {
+    return this.replaceItem.apply(this, args);
+  }
+};
+svg$.TransformList[dart.implements] = () => [ListOfTransform()];
+dart.setSignature(svg$.TransformList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
+  fields: () => ({[dartx.numberOfItems]: core.int}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
+    [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
+    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
+  })
+});
+dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
+svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(svg$.UnitTypes, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
+  sfields: () => ({
+    SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
+    SVG_UNIT_TYPE_UNKNOWN: core.int,
+    SVG_UNIT_TYPE_USERSPACEONUSE: core.int
+  })
+});
+svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
+svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
+svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
+dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
+dart.defineExtensionNames([
+  'href'
+]);
+svg$.UriReference = class UriReference extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get href() {
+    return this[href$0];
+  }
+  set href(value) {
+    super.href = value;
+  }
+};
+const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
+dart.setSignature(svg$.UriReference, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
+  fields: () => ({href: svg$.AnimatedString})
+});
+dart.defineExtensionMembers(svg$.UriReference, ['href']);
+dart.defineExtensionNames([
+  'height',
+  'width',
+  'x',
+  'y',
+  'href'
+]);
+svg$.UseElement = class UseElement extends svg$.GraphicsElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
+  }
+  created() {
+    this[dartx.height] = null;
+    this[dartx.width] = null;
+    this[dartx.x] = null;
+    this[dartx.y] = null;
+    this[dartx.href] = null;
+    super.created();
+  }
+  get [dartx.height]() {
+    return this.height;
+  }
+  get [dartx.width]() {
+    return this.width;
+  }
+  get [dartx.x]() {
+    return this.x;
+  }
+  get [dartx.y]() {
+    return this.y;
+  }
+  get [dartx.href]() {
+    return this.href;
+  }
+};
+dart.defineNamedConstructor(svg$.UseElement, 'created');
+svg$.UseElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.UseElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.UseElement, []),
+    new: dart.definiteFunctionType(svg$.UseElement, []),
+    created: dart.definiteFunctionType(svg$.UseElement, [])
+  }),
+  fields: () => ({
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
+  })
+});
+dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
+dart.defineExtensionNames([
+  'viewTarget',
+  'preserveAspectRatio',
+  'viewBox',
+  'zoomAndPan'
+]);
+svg$.ViewElement = class ViewElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
+  }
+  created() {
+    this[dartx.viewTarget] = null;
+    this[dartx.preserveAspectRatio] = null;
+    this[dartx.viewBox] = null;
+    this[dartx.zoomAndPan] = null;
+    super.created();
+  }
+  get [dartx.viewTarget]() {
+    return this.viewTarget;
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+  get [dartx.zoomAndPan]() {
+    return this.zoomAndPan;
+  }
+  set [dartx.zoomAndPan](value) {
+    this.zoomAndPan = value;
+  }
+};
+dart.defineNamedConstructor(svg$.ViewElement, 'created');
+svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.ViewElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$.ViewElement, []),
+    new: dart.definiteFunctionType(svg$.ViewElement, []),
+    created: dart.definiteFunctionType(svg$.ViewElement, [])
+  }),
+  fields: () => ({
+    [dartx.viewTarget]: svg$.StringList,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
+    [dartx.zoomAndPan]: core.int
+  })
+});
+dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
+dart.defineExtensionNames([
+  'preserveAspectRatioString',
+  'transform',
+  'transformString',
+  'viewBoxString',
+  'viewTarget',
+  'viewTargetString',
+  'preserveAspectRatio',
+  'viewBox',
+  'zoomAndPan'
+]);
+svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.preserveAspectRatioString]() {
+    return this.preserveAspectRatioString;
+  }
+  get [dartx.transform]() {
+    return this.transform;
+  }
+  get [dartx.transformString]() {
+    return this.transformString;
+  }
+  get [dartx.viewBoxString]() {
+    return this.viewBoxString;
+  }
+  get [dartx.viewTarget]() {
+    return this.viewTarget;
+  }
+  get [dartx.viewTargetString]() {
+    return this.viewTargetString;
+  }
+  get [dartx.preserveAspectRatio]() {
+    return this.preserveAspectRatio;
+  }
+  get [dartx.viewBox]() {
+    return this.viewBox;
+  }
+  get [dartx.zoomAndPan]() {
+    return this.zoomAndPan;
+  }
+  set [dartx.zoomAndPan](value) {
+    this.zoomAndPan = value;
+  }
+};
+svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.ViewSpec, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
+  fields: () => ({
+    [dartx.preserveAspectRatioString]: core.String,
+    [dartx.transform]: svg$.TransformList,
+    [dartx.transformString]: core.String,
+    [dartx.viewBoxString]: core.String,
+    [dartx.viewTarget]: svg$.SvgElement,
+    [dartx.viewTargetString]: core.String,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
+    [dartx.zoomAndPan]: core.int
+  })
+});
+dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
+dart.defineExtensionNames([
+  'zoomAndPan'
+]);
+svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get zoomAndPan() {
+    return this[zoomAndPan];
+  }
+  set zoomAndPan(value) {
+    this[zoomAndPan] = value;
+  }
+};
+const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
+dart.setSignature(svg$.ZoomAndPan, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
+  fields: () => ({zoomAndPan: core.int}),
+  sfields: () => ({
+    SVG_ZOOMANDPAN_DISABLE: core.int,
+    SVG_ZOOMANDPAN_MAGNIFY: core.int,
+    SVG_ZOOMANDPAN_UNKNOWN: core.int
+  })
+});
+dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
+dart.defineExtensionNames([
+  'newScale',
+  'newTranslate',
+  'previousScale',
+  'previousTranslate',
+  'zoomRectScreen'
+]);
+svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.newScale]() {
+    return this.newScale;
+  }
+  get [dartx.newTranslate]() {
+    return this.newTranslate;
+  }
+  get [dartx.previousScale]() {
+    return this.previousScale;
+  }
+  get [dartx.previousTranslate]() {
+    return this.previousTranslate;
+  }
+  get [dartx.zoomRectScreen]() {
+    return this.zoomRectScreen;
+  }
+};
+dart.setSignature(svg$.ZoomEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
+  fields: () => ({
+    [dartx.newScale]: core.double,
+    [dartx.newTranslate]: svg$.Point,
+    [dartx.previousScale]: core.double,
+    [dartx.previousTranslate]: svg$.Point,
+    [dartx.zoomRectScreen]: svg$.Rect
+  })
+});
+dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
+svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
+  }
+  created() {
+    super.created();
+  }
+  static get supported() {
+    return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
+  }
+};
+dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
+svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
+dart.setSignature(svg$._SVGCursorElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
+    new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
+    created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
+svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
+svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$._SVGFEDropShadowElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
+    created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
+svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new() {
+    return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
+  }
+  created() {
+    super.created();
+  }
+};
+dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
+svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$._SVGMPathElement, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
+    new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
+    created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
+  })
+});
+dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
+const _connect = Symbol('_connect');
+dart.defineExtensionNames([
+  'disconnect',
+  'connectNode',
+  'connectParam',
+  'channelCount',
+  'channelCountMode',
+  'channelInterpretation',
+  'context',
+  'numberOfInputs',
+  'numberOfOutputs'
+]);
+web_audio.AudioNode = class AudioNode extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.channelCount]() {
+    return this.channelCount;
+  }
+  set [dartx.channelCount](value) {
+    this.channelCount = value;
+  }
+  get [dartx.channelCountMode]() {
+    return this.channelCountMode;
+  }
+  set [dartx.channelCountMode](value) {
+    this.channelCountMode = value;
+  }
+  get [dartx.channelInterpretation]() {
+    return this.channelInterpretation;
+  }
+  set [dartx.channelInterpretation](value) {
+    this.channelInterpretation = value;
+  }
+  get [dartx.context]() {
+    return this.context;
+  }
+  get [dartx.numberOfInputs]() {
+    return this.numberOfInputs;
+  }
+  get [dartx.numberOfOutputs]() {
+    return this.numberOfOutputs;
+  }
+  [_connect](...args) {
+    return this.connect.apply(this, args);
+  }
+  [dartx.disconnect](...args) {
+    return this.disconnect.apply(this, args);
+  }
+  [dartx.connectNode](destination, output, input) {
+    if (output === void 0) output = 0;
+    if (input === void 0) input = 0;
+    return this[_connect](destination, output, input);
+  }
+  [dartx.connectParam](destination, output) {
+    if (output === void 0) output = 0;
+    return this[_connect](destination, output);
+  }
+};
+dart.setSignature(web_audio.AudioNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioNode, [])}),
+  fields: () => ({
+    [dartx.channelCount]: core.int,
+    [dartx.channelCountMode]: core.String,
+    [dartx.channelInterpretation]: core.String,
+    [dartx.context]: web_audio.AudioContext,
+    [dartx.numberOfInputs]: core.int,
+    [dartx.numberOfOutputs]: core.int
+  }),
+  methods: () => ({
+    [_connect]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int], [core.int]),
+    [dartx.disconnect]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.connectNode]: dart.definiteFunctionType(dart.void, [web_audio.AudioNode], [core.int, core.int]),
+    [dartx.connectParam]: dart.definiteFunctionType(dart.void, [web_audio.AudioParam], [core.int])
+  })
+});
+dart.registerExtension(dart.global.AudioNode, web_audio.AudioNode);
+dart.defineExtensionNames([
+  'getByteFrequencyData',
+  'getByteTimeDomainData',
+  'getFloatFrequencyData',
+  'getFloatTimeDomainData',
+  'fftSize',
+  'frequencyBinCount',
+  'maxDecibels',
+  'minDecibels',
+  'smoothingTimeConstant'
+]);
+web_audio.AnalyserNode = class AnalyserNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.fftSize]() {
+    return this.fftSize;
+  }
+  set [dartx.fftSize](value) {
+    this.fftSize = value;
+  }
+  get [dartx.frequencyBinCount]() {
+    return this.frequencyBinCount;
+  }
+  get [dartx.maxDecibels]() {
+    return this.maxDecibels;
+  }
+  set [dartx.maxDecibels](value) {
+    this.maxDecibels = value;
+  }
+  get [dartx.minDecibels]() {
+    return this.minDecibels;
+  }
+  set [dartx.minDecibels](value) {
+    this.minDecibels = value;
+  }
+  get [dartx.smoothingTimeConstant]() {
+    return this.smoothingTimeConstant;
+  }
+  set [dartx.smoothingTimeConstant](value) {
+    this.smoothingTimeConstant = value;
+  }
+  [dartx.getByteFrequencyData](...args) {
+    return this.getByteFrequencyData.apply(this, args);
+  }
+  [dartx.getByteTimeDomainData](...args) {
+    return this.getByteTimeDomainData.apply(this, args);
+  }
+  [dartx.getFloatFrequencyData](...args) {
+    return this.getFloatFrequencyData.apply(this, args);
+  }
+  [dartx.getFloatTimeDomainData](...args) {
+    return this.getFloatTimeDomainData.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.AnalyserNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AnalyserNode, [])}),
+  fields: () => ({
+    [dartx.fftSize]: core.int,
+    [dartx.frequencyBinCount]: core.int,
+    [dartx.maxDecibels]: core.num,
+    [dartx.minDecibels]: core.num,
+    [dartx.smoothingTimeConstant]: core.num
+  }),
+  methods: () => ({
+    [dartx.getByteFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
+    [dartx.getByteTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List]),
+    [dartx.getFloatFrequencyData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List]),
+    [dartx.getFloatTimeDomainData]: dart.definiteFunctionType(dart.void, [typed_data.Float32List])
+  })
+});
+dart.registerExtension(dart.global.AnalyserNode, web_audio.AnalyserNode);
+dart.registerExtension(dart.global.RealtimeAnalyserNode, web_audio.AnalyserNode);
+dart.defineExtensionNames([
+  'getChannelData',
+  'duration',
+  'length',
+  'numberOfChannels',
+  'sampleRate'
+]);
+web_audio.AudioBuffer = class AudioBuffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.duration]() {
+    return this.duration;
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  get [dartx.numberOfChannels]() {
+    return this.numberOfChannels;
+  }
+  get [dartx.sampleRate]() {
+    return this.sampleRate;
+  }
+  [dartx.getChannelData](...args) {
+    return this.getChannelData.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.AudioBuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBuffer, [])}),
+  fields: () => ({
+    [dartx.duration]: core.double,
+    [dartx.length]: core.int,
+    [dartx.numberOfChannels]: core.int,
+    [dartx.sampleRate]: core.double
+  }),
+  methods: () => ({[dartx.getChannelData]: dart.definiteFunctionType(typed_data.Float32List, [core.int])})
+});
+dart.registerExtension(dart.global.AudioBuffer, web_audio.AudioBuffer);
+web_audio.AudioBufferCallback = dart.typedef('AudioBufferCallback', () => dart.functionType(dart.void, [web_audio.AudioBuffer]));
+web_audio.AudioSourceNode = class AudioSourceNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_audio.AudioSourceNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioSourceNode, [])})
+});
+dart.registerExtension(dart.global.AudioSourceNode, web_audio.AudioSourceNode);
+dart.defineExtensionNames([
+  'start',
+  'stop',
+  'onEnded',
+  'buffer',
+  'loop',
+  'loopEnd',
+  'loopStart',
+  'playbackRate'
+]);
+web_audio.AudioBufferSourceNode = class AudioBufferSourceNode extends web_audio.AudioSourceNode {
+  [dartx.start](when, grainOffset, grainDuration) {
+    if (grainOffset === void 0) grainOffset = null;
+    if (grainDuration === void 0) grainDuration = null;
+    if (!!this.start) {
+      if (grainDuration != null) {
+        this.start(when, grainOffset, grainDuration);
+      } else if (grainOffset != null) {
+        this.start(when, grainOffset);
       } else {
-        if (grainDuration != null) {
-          this.noteOn(when, grainOffset, grainDuration);
-        } else if (grainOffset != null) {
-          this.noteOn(when, grainOffset);
-        } else {
-          this.noteOn(when);
-        }
+        this.start(when);
       }
-    }
-    [dartx.stop](when) {
-      if (!!this.stop) {
-        this.stop(when);
+    } else {
+      if (grainDuration != null) {
+        this.noteOn(when, grainOffset, grainDuration);
+      } else if (grainOffset != null) {
+        this.noteOn(when, grainOffset);
       } else {
-        this.noteOff(when);
+        this.noteOn(when);
       }
     }
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.stop](when) {
+    if (!!this.stop) {
+      this.stop(when);
+    } else {
+      this.noteOff(when);
     }
-    get [dartx.buffer]() {
-      return this.buffer;
+  }
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.buffer]() {
+    return this.buffer;
+  }
+  set [dartx.buffer](value) {
+    this.buffer = value;
+  }
+  get [dartx.loop]() {
+    return this.loop;
+  }
+  set [dartx.loop](value) {
+    this.loop = value;
+  }
+  get [dartx.loopEnd]() {
+    return this.loopEnd;
+  }
+  set [dartx.loopEnd](value) {
+    this.loopEnd = value;
+  }
+  get [dartx.loopStart]() {
+    return this.loopStart;
+  }
+  set [dartx.loopStart](value) {
+    this.loopStart = value;
+  }
+  get [dartx.playbackRate]() {
+    return this.playbackRate;
+  }
+  get [dartx.onEnded]() {
+    return web_audio.AudioBufferSourceNode.endedEvent.forTarget(this);
+  }
+};
+dart.setSignature(web_audio.AudioBufferSourceNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, [])}),
+  fields: () => ({
+    [dartx.buffer]: web_audio.AudioBuffer,
+    [dartx.loop]: core.bool,
+    [dartx.loopEnd]: core.num,
+    [dartx.loopStart]: core.num,
+    [dartx.playbackRate]: web_audio.AudioParam
+  }),
+  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
+  }),
+  sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
+});
+web_audio.AudioBufferSourceNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
+dart.registerExtension(dart.global.AudioBufferSourceNode, web_audio.AudioBufferSourceNode);
+const _decodeAudioData = Symbol('_decodeAudioData');
+dart.defineExtensionNames([
+  'createAnalyser',
+  'createBiquadFilter',
+  'createBuffer',
+  'createBufferSource',
+  'createChannelMerger',
+  'createChannelSplitter',
+  'createConvolver',
+  'createDelay',
+  'createDynamicsCompressor',
+  'createMediaElementSource',
+  'createMediaStreamDestination',
+  'createMediaStreamSource',
+  'createOscillator',
+  'createPanner',
+  'createPeriodicWave',
+  'createWaveShaper',
+  'startRendering',
+  'onComplete',
+  'createGain',
+  'createScriptProcessor',
+  'decodeAudioData',
+  'currentTime',
+  'destination',
+  'listener',
+  'sampleRate'
+]);
+web_audio.AudioContext = class AudioContext extends html$.EventTarget {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!(window.AudioContext || window.webkitAudioContext);
+  }
+  get [dartx.currentTime]() {
+    return this.currentTime;
+  }
+  get [dartx.destination]() {
+    return this.destination;
+  }
+  get [dartx.listener]() {
+    return this.listener;
+  }
+  get [dartx.sampleRate]() {
+    return this.sampleRate;
+  }
+  [dartx.createAnalyser](...args) {
+    return this.createAnalyser.apply(this, args);
+  }
+  [dartx.createBiquadFilter](...args) {
+    return this.createBiquadFilter.apply(this, args);
+  }
+  [dartx.createBuffer](...args) {
+    return this.createBuffer.apply(this, args);
+  }
+  [dartx.createBufferSource](...args) {
+    return this.createBufferSource.apply(this, args);
+  }
+  [dartx.createChannelMerger](...args) {
+    return this.createChannelMerger.apply(this, args);
+  }
+  [dartx.createChannelSplitter](...args) {
+    return this.createChannelSplitter.apply(this, args);
+  }
+  [dartx.createConvolver](...args) {
+    return this.createConvolver.apply(this, args);
+  }
+  [dartx.createDelay](...args) {
+    return this.createDelay.apply(this, args);
+  }
+  [dartx.createDynamicsCompressor](...args) {
+    return this.createDynamicsCompressor.apply(this, args);
+  }
+  [dartx.createMediaElementSource](...args) {
+    return this.createMediaElementSource.apply(this, args);
+  }
+  [dartx.createMediaStreamDestination](...args) {
+    return this.createMediaStreamDestination.apply(this, args);
+  }
+  [dartx.createMediaStreamSource](...args) {
+    return this.createMediaStreamSource.apply(this, args);
+  }
+  [dartx.createOscillator](...args) {
+    return this.createOscillator.apply(this, args);
+  }
+  [dartx.createPanner](...args) {
+    return this.createPanner.apply(this, args);
+  }
+  [dartx.createPeriodicWave](...args) {
+    return this.createPeriodicWave.apply(this, args);
+  }
+  [dartx.createWaveShaper](...args) {
+    return this.createWaveShaper.apply(this, args);
+  }
+  [_decodeAudioData](...args) {
+    return this.decodeAudioData.apply(this, args);
+  }
+  [dartx.startRendering](...args) {
+    return this.startRendering.apply(this, args);
+  }
+  get [dartx.onComplete]() {
+    return web_audio.AudioContext.completeEvent.forTarget(this);
+  }
+  static new() {
+    return new (window.AudioContext || window.webkitAudioContext)();
+  }
+  [dartx.createGain]() {
+    if (this.createGain !== undefined) {
+      return this.createGain();
+    } else {
+      return this.createGainNode();
     }
-    set [dartx.buffer](value) {
-      this.buffer = value;
+  }
+  [dartx.createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+    if (numberOfInputChannels === void 0) numberOfInputChannels = null;
+    if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
+    let func = this.createScriptProcessor || this.createJavaScriptNode;
+    if (numberOfOutputChannels != null) {
+      return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+    } else if (numberOfInputChannels != null) {
+      return func.call(this, bufferSize, numberOfInputChannels);
+    } else {
+      return func.call(this, bufferSize);
     }
-    get [dartx.loop]() {
-      return this.loop;
-    }
-    set [dartx.loop](value) {
-      this.loop = value;
-    }
-    get [dartx.loopEnd]() {
-      return this.loopEnd;
-    }
-    set [dartx.loopEnd](value) {
-      this.loopEnd = value;
-    }
-    get [dartx.loopStart]() {
-      return this.loopStart;
-    }
-    set [dartx.loopStart](value) {
-      this.loopStart = value;
-    }
-    get [dartx.playbackRate]() {
-      return this.playbackRate;
-    }
-    get [dartx.onEnded]() {
-      return web_audio.AudioBufferSourceNode.endedEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(web_audio.AudioBufferSourceNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, [])}),
-    fields: () => ({
-      [dartx.buffer]: web_audio.AudioBuffer,
-      [dartx.loop]: core.bool,
-      [dartx.loopEnd]: core.num,
-      [dartx.loopStart]: core.num,
-      [dartx.playbackRate]: web_audio.AudioParam
-    }),
-    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
-    }),
-    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
-  });
-  web_audio.AudioBufferSourceNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
-  dart.registerExtension(dart.global.AudioBufferSourceNode, web_audio.AudioBufferSourceNode);
-  const _decodeAudioData = Symbol('_decodeAudioData');
-  dart.defineExtensionNames([
-    'createAnalyser',
-    'createBiquadFilter',
-    'createBuffer',
-    'createBufferSource',
-    'createChannelMerger',
-    'createChannelSplitter',
-    'createConvolver',
-    'createDelay',
-    'createDynamicsCompressor',
-    'createMediaElementSource',
-    'createMediaStreamDestination',
-    'createMediaStreamSource',
-    'createOscillator',
-    'createPanner',
-    'createPeriodicWave',
-    'createWaveShaper',
-    'startRendering',
-    'onComplete',
-    'createGain',
-    'createScriptProcessor',
-    'decodeAudioData',
-    'currentTime',
-    'destination',
-    'listener',
-    'sampleRate'
-  ]);
-  web_audio.AudioContext = class AudioContext extends html$.EventTarget {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!(window.AudioContext || window.webkitAudioContext);
-    }
-    get [dartx.currentTime]() {
-      return this.currentTime;
-    }
-    get [dartx.destination]() {
-      return this.destination;
-    }
-    get [dartx.listener]() {
-      return this.listener;
-    }
-    get [dartx.sampleRate]() {
-      return this.sampleRate;
-    }
-    [dartx.createAnalyser](...args) {
-      return this.createAnalyser.apply(this, args);
-    }
-    [dartx.createBiquadFilter](...args) {
-      return this.createBiquadFilter.apply(this, args);
-    }
-    [dartx.createBuffer](...args) {
-      return this.createBuffer.apply(this, args);
-    }
-    [dartx.createBufferSource](...args) {
-      return this.createBufferSource.apply(this, args);
-    }
-    [dartx.createChannelMerger](...args) {
-      return this.createChannelMerger.apply(this, args);
-    }
-    [dartx.createChannelSplitter](...args) {
-      return this.createChannelSplitter.apply(this, args);
-    }
-    [dartx.createConvolver](...args) {
-      return this.createConvolver.apply(this, args);
-    }
-    [dartx.createDelay](...args) {
-      return this.createDelay.apply(this, args);
-    }
-    [dartx.createDynamicsCompressor](...args) {
-      return this.createDynamicsCompressor.apply(this, args);
-    }
-    [dartx.createMediaElementSource](...args) {
-      return this.createMediaElementSource.apply(this, args);
-    }
-    [dartx.createMediaStreamDestination](...args) {
-      return this.createMediaStreamDestination.apply(this, args);
-    }
-    [dartx.createMediaStreamSource](...args) {
-      return this.createMediaStreamSource.apply(this, args);
-    }
-    [dartx.createOscillator](...args) {
-      return this.createOscillator.apply(this, args);
-    }
-    [dartx.createPanner](...args) {
-      return this.createPanner.apply(this, args);
-    }
-    [dartx.createPeriodicWave](...args) {
-      return this.createPeriodicWave.apply(this, args);
-    }
-    [dartx.createWaveShaper](...args) {
-      return this.createWaveShaper.apply(this, args);
-    }
-    [_decodeAudioData](...args) {
-      return this.decodeAudioData.apply(this, args);
-    }
-    [dartx.startRendering](...args) {
-      return this.startRendering.apply(this, args);
-    }
-    get [dartx.onComplete]() {
-      return web_audio.AudioContext.completeEvent.forTarget(this);
-    }
-    static new() {
-      return new (window.AudioContext || window.webkitAudioContext)();
-    }
-    [dartx.createGain]() {
-      if (this.createGain !== undefined) {
-        return this.createGain();
+  }
+  [dartx.decodeAudioData](audioData) {
+    let completer = CompleterOfAudioBuffer().new();
+    this[_decodeAudioData](audioData, dart.fn(value => {
+      completer.complete(value);
+    }, AudioBufferToNull()), dart.fn(error => {
+      if (error == null) {
+        completer.completeError('');
       } else {
-        return this.createGainNode();
+        completer.completeError(error);
       }
-    }
-    [dartx.createScriptProcessor](bufferSize, numberOfInputChannels, numberOfOutputChannels) {
-      if (numberOfInputChannels === void 0) numberOfInputChannels = null;
-      if (numberOfOutputChannels === void 0) numberOfOutputChannels = null;
-      let func = this.createScriptProcessor || this.createJavaScriptNode;
-      if (numberOfOutputChannels != null) {
-        return func.call(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
-      } else if (numberOfInputChannels != null) {
-        return func.call(this, bufferSize, numberOfInputChannels);
-      } else {
-        return func.call(this, bufferSize);
-      }
-    }
-    [dartx.decodeAudioData](audioData) {
-      let completer = CompleterOfAudioBuffer().new();
-      this[_decodeAudioData](audioData, dart.fn(value => {
-        completer.complete(value);
-      }, AudioBufferToNull()), dart.fn(error => {
-        if (error == null) {
-          completer.completeError('');
-        } else {
-          completer.completeError(error);
-        }
-      }, AudioBufferToNull()));
-      return completer.future;
-    }
-  };
-  dart.setSignature(web_audio.AudioContext, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(web_audio.AudioContext, []),
-      new: dart.definiteFunctionType(web_audio.AudioContext, [])
-    }),
-    fields: () => ({
-      [dartx.currentTime]: core.double,
-      [dartx.destination]: web_audio.AudioDestinationNode,
-      [dartx.listener]: web_audio.AudioListener,
-      [dartx.sampleRate]: core.double
-    }),
-    getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
-      [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
-      [dartx.createBuffer]: dart.definiteFunctionType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
-      [dartx.createBufferSource]: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, []),
-      [dartx.createChannelMerger]: dart.definiteFunctionType(web_audio.ChannelMergerNode, [], [core.int]),
-      [dartx.createChannelSplitter]: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [], [core.int]),
-      [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
-      [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
-      [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
-      [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
-      [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
-      [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
-      [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
-      [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
-      [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
-      [dartx.createWaveShaper]: dart.definiteFunctionType(web_audio.WaveShaperNode, []),
-      [_decodeAudioData]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer, web_audio.AudioBufferCallback], [web_audio.AudioBufferCallback]),
-      [dartx.startRendering]: dart.definiteFunctionType(dart.void, []),
-      [dartx.createGain]: dart.definiteFunctionType(web_audio.GainNode, []),
-      [dartx.createScriptProcessor]: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [core.int], [core.int, core.int]),
-      [dartx.decodeAudioData]: dart.definiteFunctionType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer])
-    }),
-    sfields: () => ({completeEvent: EventStreamProviderOfEvent()}),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  web_audio.AudioContext.completeEvent = dart.const(new (EventStreamProviderOfEvent())('complete'));
-  dart.registerExtension(dart.global.AudioContext, web_audio.AudioContext);
-  dart.registerExtension(dart.global.webkitAudioContext, web_audio.AudioContext);
-  dart.defineExtensionNames([
-    'maxChannelCount'
-  ]);
-  web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.maxChannelCount]() {
-      return this.maxChannelCount;
-    }
-  };
-  dart.setSignature(web_audio.AudioDestinationNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioDestinationNode, [])}),
-    fields: () => ({[dartx.maxChannelCount]: core.int})
-  });
-  dart.registerExtension(dart.global.AudioDestinationNode, web_audio.AudioDestinationNode);
-  dart.defineExtensionNames([
-    'setOrientation',
-    'setPosition',
-    'setVelocity',
-    'dopplerFactor',
-    'speedOfSound'
-  ]);
-  web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.dopplerFactor]() {
-      return this.dopplerFactor;
-    }
-    set [dartx.dopplerFactor](value) {
-      this.dopplerFactor = value;
-    }
-    get [dartx.speedOfSound]() {
-      return this.speedOfSound;
-    }
-    set [dartx.speedOfSound](value) {
-      this.speedOfSound = value;
-    }
-    [dartx.setOrientation](...args) {
-      return this.setOrientation.apply(this, args);
-    }
-    [dartx.setPosition](...args) {
-      return this.setPosition.apply(this, args);
-    }
-    [dartx.setVelocity](...args) {
-      return this.setVelocity.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.AudioListener, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioListener, [])}),
-    fields: () => ({
-      [dartx.dopplerFactor]: core.num,
-      [dartx.speedOfSound]: core.num
-    }),
-    methods: () => ({
-      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
-      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
-    })
-  });
-  dart.registerExtension(dart.global.AudioListener, web_audio.AudioListener);
-  dart.defineExtensionNames([
-    'cancelScheduledValues',
-    'exponentialRampToValueAtTime',
-    'linearRampToValueAtTime',
-    'setTargetAtTime',
-    'setValueAtTime',
-    'setValueCurveAtTime',
-    'defaultValue',
-    'value'
-  ]);
-  web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.defaultValue]() {
-      return this.defaultValue;
-    }
-    get [dartx.value]() {
-      return this.value;
-    }
-    set [dartx.value](value) {
-      this.value = value;
-    }
-    [dartx.cancelScheduledValues](...args) {
-      return this.cancelScheduledValues.apply(this, args);
-    }
-    [dartx.exponentialRampToValueAtTime](...args) {
-      return this.exponentialRampToValueAtTime.apply(this, args);
-    }
-    [dartx.linearRampToValueAtTime](...args) {
-      return this.linearRampToValueAtTime.apply(this, args);
-    }
-    [dartx.setTargetAtTime](...args) {
-      return this.setTargetAtTime.apply(this, args);
-    }
-    [dartx.setValueAtTime](...args) {
-      return this.setValueAtTime.apply(this, args);
-    }
-    [dartx.setValueCurveAtTime](...args) {
-      return this.setValueCurveAtTime.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.AudioParam, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioParam, [])}),
-    fields: () => ({
-      [dartx.defaultValue]: core.double,
-      [dartx.value]: core.num
-    }),
-    methods: () => ({
-      [dartx.cancelScheduledValues]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.exponentialRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.linearRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.setTargetAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
-      [dartx.setValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.setValueCurveAtTime]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, core.num, core.num])
-    })
-  });
-  dart.registerExtension(dart.global.AudioParam, web_audio.AudioParam);
-  dart.defineExtensionNames([
-    'inputBuffer',
-    'outputBuffer',
-    'playbackTime'
-  ]);
-  web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.inputBuffer]() {
-      return this.inputBuffer;
-    }
-    get [dartx.outputBuffer]() {
-      return this.outputBuffer;
-    }
-    get [dartx.playbackTime]() {
-      return this.playbackTime;
-    }
-  };
-  dart.setSignature(web_audio.AudioProcessingEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioProcessingEvent, [])}),
-    fields: () => ({
-      [dartx.inputBuffer]: web_audio.AudioBuffer,
-      [dartx.outputBuffer]: web_audio.AudioBuffer,
-      [dartx.playbackTime]: core.double
-    })
-  });
-  dart.registerExtension(dart.global.AudioProcessingEvent, web_audio.AudioProcessingEvent);
-  dart.defineExtensionNames([
-    'getFrequencyResponse',
-    'Q',
-    'detune',
-    'frequency',
-    'gain',
-    'type'
-  ]);
-  web_audio.BiquadFilterNode = class BiquadFilterNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.Q]() {
-      return this.Q;
-    }
-    get [dartx.detune]() {
-      return this.detune;
-    }
-    get [dartx.frequency]() {
-      return this.frequency;
-    }
-    get [dartx.gain]() {
-      return this.gain;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    [dartx.getFrequencyResponse](...args) {
-      return this.getFrequencyResponse.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.BiquadFilterNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.BiquadFilterNode, [])}),
-    fields: () => ({
-      [dartx.Q]: web_audio.AudioParam,
-      [dartx.detune]: web_audio.AudioParam,
-      [dartx.frequency]: web_audio.AudioParam,
-      [dartx.gain]: web_audio.AudioParam,
-      [dartx.type]: core.String
-    }),
-    methods: () => ({[dartx.getFrequencyResponse]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])})
-  });
-  dart.registerExtension(dart.global.BiquadFilterNode, web_audio.BiquadFilterNode);
-  web_audio.ChannelMergerNode = class ChannelMergerNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_audio.ChannelMergerNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelMergerNode, [])})
-  });
-  dart.registerExtension(dart.global.ChannelMergerNode, web_audio.ChannelMergerNode);
-  dart.registerExtension(dart.global.AudioChannelMerger, web_audio.ChannelMergerNode);
-  web_audio.ChannelSplitterNode = class ChannelSplitterNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_audio.ChannelSplitterNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [])})
-  });
-  dart.registerExtension(dart.global.ChannelSplitterNode, web_audio.ChannelSplitterNode);
-  dart.registerExtension(dart.global.AudioChannelSplitter, web_audio.ChannelSplitterNode);
-  dart.defineExtensionNames([
-    'buffer',
-    'normalize'
-  ]);
-  web_audio.ConvolverNode = class ConvolverNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.buffer]() {
-      return this.buffer;
-    }
-    set [dartx.buffer](value) {
-      this.buffer = value;
-    }
-    get [dartx.normalize]() {
-      return this.normalize;
-    }
-    set [dartx.normalize](value) {
-      this.normalize = value;
-    }
-  };
-  dart.setSignature(web_audio.ConvolverNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.ConvolverNode, [])}),
-    fields: () => ({
-      [dartx.buffer]: web_audio.AudioBuffer,
-      [dartx.normalize]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.ConvolverNode, web_audio.ConvolverNode);
-  dart.defineExtensionNames([
-    'delayTime'
-  ]);
-  web_audio.DelayNode = class DelayNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.delayTime]() {
-      return this.delayTime;
-    }
-  };
-  dart.setSignature(web_audio.DelayNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.DelayNode, [])}),
-    fields: () => ({[dartx.delayTime]: web_audio.AudioParam})
-  });
-  dart.registerExtension(dart.global.DelayNode, web_audio.DelayNode);
-  dart.defineExtensionNames([
-    'attack',
-    'knee',
-    'ratio',
-    'reduction',
-    'release',
-    'threshold'
-  ]);
-  web_audio.DynamicsCompressorNode = class DynamicsCompressorNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.attack]() {
-      return this.attack;
-    }
-    get [dartx.knee]() {
-      return this.knee;
-    }
-    get [dartx.ratio]() {
-      return this.ratio;
-    }
-    get [dartx.reduction]() {
-      return this.reduction;
-    }
-    get [dartx.release]() {
-      return this.release;
-    }
-    get [dartx.threshold]() {
-      return this.threshold;
-    }
-  };
-  dart.setSignature(web_audio.DynamicsCompressorNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, [])}),
-    fields: () => ({
-      [dartx.attack]: web_audio.AudioParam,
-      [dartx.knee]: web_audio.AudioParam,
-      [dartx.ratio]: web_audio.AudioParam,
-      [dartx.reduction]: web_audio.AudioParam,
-      [dartx.release]: web_audio.AudioParam,
-      [dartx.threshold]: web_audio.AudioParam
-    })
-  });
-  dart.registerExtension(dart.global.DynamicsCompressorNode, web_audio.DynamicsCompressorNode);
-  dart.defineExtensionNames([
-    'gain'
-  ]);
-  web_audio.GainNode = class GainNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.gain]() {
-      return this.gain;
-    }
-  };
-  dart.setSignature(web_audio.GainNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.GainNode, [])}),
-    fields: () => ({[dartx.gain]: web_audio.AudioParam})
-  });
-  dart.registerExtension(dart.global.GainNode, web_audio.GainNode);
-  dart.registerExtension(dart.global.AudioGainNode, web_audio.GainNode);
-  dart.defineExtensionNames([
-    'mediaElement'
-  ]);
-  web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode extends web_audio.AudioSourceNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.mediaElement]() {
-      return this.mediaElement;
-    }
-  };
-  dart.setSignature(web_audio.MediaElementAudioSourceNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
-    fields: () => ({[dartx.mediaElement]: html$.MediaElement})
-  });
-  dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
-  dart.defineExtensionNames([
-    'stream'
-  ]);
-  web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.stream]() {
-      return this.stream;
-    }
-  };
-  dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
-    fields: () => ({[dartx.stream]: html$.MediaStream})
-  });
-  dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
-  dart.defineExtensionNames([
-    'mediaStream'
-  ]);
-  web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode extends web_audio.AudioSourceNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.mediaStream]() {
-      return this.mediaStream;
-    }
-  };
-  dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
-    fields: () => ({[dartx.mediaStream]: html$.MediaStream})
-  });
-  dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
-  dart.defineExtensionNames([
-    'renderedBuffer'
-  ]);
-  web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.renderedBuffer]() {
-      return this.renderedBuffer;
-    }
-  };
-  dart.setSignature(web_audio.OfflineAudioCompletionEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.OfflineAudioCompletionEvent, [])}),
-    fields: () => ({[dartx.renderedBuffer]: web_audio.AudioBuffer})
-  });
-  dart.registerExtension(dart.global.OfflineAudioCompletionEvent, web_audio.OfflineAudioCompletionEvent);
-  web_audio.OfflineAudioContext = class OfflineAudioContext extends web_audio.AudioContext {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static new(numberOfChannels, numberOfFrames, sampleRate) {
-      return web_audio.OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
-    }
-    static _create_1(numberOfChannels, numberOfFrames, sampleRate) {
-      return new self.OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
-    }
-  };
-  dart.setSignature(web_audio.OfflineAudioContext, {
-    constructors: () => ({
-      _: dart.definiteFunctionType(web_audio.OfflineAudioContext, []),
-      new: dart.definiteFunctionType(web_audio.OfflineAudioContext, [core.int, core.int, core.num])
-    }),
-    statics: () => ({_create_1: dart.definiteFunctionType(web_audio.OfflineAudioContext, [dart.dynamic, dart.dynamic, dart.dynamic])}),
-    names: ['_create_1']
-  });
-  dart.registerExtension(dart.global.OfflineAudioContext, web_audio.OfflineAudioContext);
-  dart.defineExtensionNames([
-    'noteOff',
-    'noteOn',
-    'setPeriodicWave',
-    'start',
-    'stop',
-    'onEnded',
-    'detune',
-    'frequency',
-    'type'
-  ]);
-  web_audio.OscillatorNode = class OscillatorNode extends web_audio.AudioSourceNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.detune]() {
-      return this.detune;
-    }
-    get [dartx.frequency]() {
-      return this.frequency;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-    set [dartx.type](value) {
-      this.type = value;
-    }
-    [dartx.noteOff](...args) {
-      return this.noteOff.apply(this, args);
-    }
-    [dartx.noteOn](...args) {
-      return this.noteOn.apply(this, args);
-    }
-    [dartx.setPeriodicWave](...args) {
-      return this.setPeriodicWave.apply(this, args);
-    }
-    [dartx.start](...args) {
-      return this.start.apply(this, args);
-    }
-    [dartx.stop](...args) {
-      return this.stop.apply(this, args);
-    }
-    get [dartx.onEnded]() {
-      return web_audio.OscillatorNode.endedEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(web_audio.OscillatorNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.OscillatorNode, [])}),
-    fields: () => ({
-      [dartx.detune]: web_audio.AudioParam,
-      [dartx.frequency]: web_audio.AudioParam,
-      [dartx.type]: core.String
-    }),
-    getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
-    methods: () => ({
-      [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.setPeriodicWave]: dart.definiteFunctionType(dart.void, [web_audio.PeriodicWave]),
-      [dartx.start]: dart.definiteFunctionType(dart.void, [], [core.num]),
-      [dartx.stop]: dart.definiteFunctionType(dart.void, [], [core.num])
-    }),
-    sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
-  });
-  web_audio.OscillatorNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
-  dart.registerExtension(dart.global.OscillatorNode, web_audio.OscillatorNode);
-  dart.registerExtension(dart.global.Oscillator, web_audio.OscillatorNode);
-  dart.defineExtensionNames([
-    'setOrientation',
-    'setPosition',
-    'setVelocity',
-    'coneInnerAngle',
-    'coneOuterAngle',
-    'coneOuterGain',
-    'distanceModel',
-    'maxDistance',
-    'panningModel',
-    'refDistance',
-    'rolloffFactor'
-  ]);
-  web_audio.PannerNode = class PannerNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.coneInnerAngle]() {
-      return this.coneInnerAngle;
-    }
-    set [dartx.coneInnerAngle](value) {
-      this.coneInnerAngle = value;
-    }
-    get [dartx.coneOuterAngle]() {
-      return this.coneOuterAngle;
-    }
-    set [dartx.coneOuterAngle](value) {
-      this.coneOuterAngle = value;
-    }
-    get [dartx.coneOuterGain]() {
-      return this.coneOuterGain;
-    }
-    set [dartx.coneOuterGain](value) {
-      this.coneOuterGain = value;
-    }
-    get [dartx.distanceModel]() {
-      return this.distanceModel;
-    }
-    set [dartx.distanceModel](value) {
-      this.distanceModel = value;
-    }
-    get [dartx.maxDistance]() {
-      return this.maxDistance;
-    }
-    set [dartx.maxDistance](value) {
-      this.maxDistance = value;
-    }
-    get [dartx.panningModel]() {
-      return this.panningModel;
-    }
-    set [dartx.panningModel](value) {
-      this.panningModel = value;
-    }
-    get [dartx.refDistance]() {
-      return this.refDistance;
-    }
-    set [dartx.refDistance](value) {
-      this.refDistance = value;
-    }
-    get [dartx.rolloffFactor]() {
-      return this.rolloffFactor;
-    }
-    set [dartx.rolloffFactor](value) {
-      this.rolloffFactor = value;
-    }
-    [dartx.setOrientation](...args) {
-      return this.setOrientation.apply(this, args);
-    }
-    [dartx.setPosition](...args) {
-      return this.setPosition.apply(this, args);
-    }
-    [dartx.setVelocity](...args) {
-      return this.setVelocity.apply(this, args);
-    }
-  };
-  dart.setSignature(web_audio.PannerNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.PannerNode, [])}),
-    fields: () => ({
-      [dartx.coneInnerAngle]: core.num,
-      [dartx.coneOuterAngle]: core.num,
-      [dartx.coneOuterGain]: core.num,
-      [dartx.distanceModel]: core.String,
-      [dartx.maxDistance]: core.num,
-      [dartx.panningModel]: core.String,
-      [dartx.refDistance]: core.num,
-      [dartx.rolloffFactor]: core.num
-    }),
-    methods: () => ({
-      [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
-      [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
-      [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
-    })
-  });
-  dart.registerExtension(dart.global.PannerNode, web_audio.PannerNode);
-  dart.registerExtension(dart.global.AudioPannerNode, web_audio.PannerNode);
-  dart.registerExtension(dart.global.webkitAudioPannerNode, web_audio.PannerNode);
-  web_audio.PeriodicWave = class PeriodicWave extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_audio.PeriodicWave, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.PeriodicWave, [])})
-  });
-  dart.registerExtension(dart.global.PeriodicWave, web_audio.PeriodicWave);
-  dart.defineExtensionNames([
-    'setEventListener',
-    'onAudioProcess',
-    'bufferSize'
-  ]);
-  web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.bufferSize]() {
-      return this.bufferSize;
-    }
-    [dartx.setEventListener](...args) {
-      return this.setEventListener.apply(this, args);
-    }
-    get [dartx.onAudioProcess]() {
-      return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
-    }
-  };
-  dart.setSignature(web_audio.ScriptProcessorNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
-    fields: () => ({[dartx.bufferSize]: core.int}),
-    getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
-    methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
-    sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
-  });
-  web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
-  dart.registerExtension(dart.global.ScriptProcessorNode, web_audio.ScriptProcessorNode);
-  dart.registerExtension(dart.global.JavaScriptAudioNode, web_audio.ScriptProcessorNode);
-  dart.defineExtensionNames([
-    'curve',
-    'oversample'
-  ]);
-  web_audio.WaveShaperNode = class WaveShaperNode extends web_audio.AudioNode {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.curve]() {
-      return this.curve;
-    }
-    set [dartx.curve](value) {
-      this.curve = value;
-    }
-    get [dartx.oversample]() {
-      return this.oversample;
-    }
-    set [dartx.oversample](value) {
-      this.oversample = value;
-    }
-  };
-  dart.setSignature(web_audio.WaveShaperNode, {
-    constructors: () => ({_: dart.definiteFunctionType(web_audio.WaveShaperNode, [])}),
-    fields: () => ({
-      [dartx.curve]: typed_data.Float32List,
-      [dartx.oversample]: core.String
-    })
-  });
-  dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
-  const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
-  const _texImage2D_1 = Symbol('_texImage2D_1');
-  const _texImage2D_2 = Symbol('_texImage2D_2');
-  const _texImage2D_3 = Symbol('_texImage2D_3');
-  const _texImage2D_4 = Symbol('_texImage2D_4');
-  const _texImage2D_5 = Symbol('_texImage2D_5');
-  const _texImage2DImageData_1 = Symbol('_texImage2DImageData_1');
-  const _texSubImage2D_1 = Symbol('_texSubImage2D_1');
-  const _texSubImage2D_2 = Symbol('_texSubImage2D_2');
-  const _texSubImage2D_3 = Symbol('_texSubImage2D_3');
-  const _texSubImage2D_4 = Symbol('_texSubImage2D_4');
-  const _texSubImage2D_5 = Symbol('_texSubImage2D_5');
-  const _texSubImage2DImageData_1 = Symbol('_texSubImage2DImageData_1');
-  dart.defineExtensionNames([
-    'activeTexture',
-    'attachShader',
-    'bindAttribLocation',
-    'bindBuffer',
-    'bindFramebuffer',
-    'bindRenderbuffer',
-    'bindTexture',
-    'blendColor',
-    'blendEquation',
-    'blendEquationSeparate',
-    'blendFunc',
-    'blendFuncSeparate',
-    'bufferByteData',
-    'bufferData',
-    'bufferDataTyped',
-    'bufferSubByteData',
-    'bufferSubData',
-    'bufferSubDataTyped',
-    'checkFramebufferStatus',
-    'clear',
-    'clearColor',
-    'clearDepth',
-    'clearStencil',
-    'colorMask',
-    'compileShader',
-    'compressedTexImage2D',
-    'compressedTexSubImage2D',
-    'copyTexImage2D',
-    'copyTexSubImage2D',
-    'createBuffer',
-    'createFramebuffer',
-    'createProgram',
-    'createRenderbuffer',
-    'createShader',
-    'createTexture',
-    'cullFace',
-    'deleteBuffer',
-    'deleteFramebuffer',
-    'deleteProgram',
-    'deleteRenderbuffer',
-    'deleteShader',
-    'deleteTexture',
-    'depthFunc',
-    'depthMask',
-    'depthRange',
-    'detachShader',
-    'disable',
-    'disableVertexAttribArray',
-    'drawArrays',
-    'drawElements',
-    'enable',
-    'enableVertexAttribArray',
-    'finish',
-    'flush',
-    'framebufferRenderbuffer',
-    'framebufferTexture2D',
-    'frontFace',
-    'generateMipmap',
-    'getActiveAttrib',
-    'getActiveUniform',
-    'getAttachedShaders',
-    'getAttribLocation',
-    'getBufferParameter',
-    'getContextAttributes',
-    'getError',
-    'getExtension',
-    'getFramebufferAttachmentParameter',
-    'getParameter',
-    'getProgramInfoLog',
-    'getProgramParameter',
-    'getRenderbufferParameter',
-    'getShaderInfoLog',
-    'getShaderParameter',
-    'getShaderPrecisionFormat',
-    'getShaderSource',
-    'getSupportedExtensions',
-    'getTexParameter',
-    'getUniform',
-    'getUniformLocation',
-    'getVertexAttrib',
-    'getVertexAttribOffset',
-    'hint',
-    'isBuffer',
-    'isContextLost',
-    'isEnabled',
-    'isFramebuffer',
-    'isProgram',
-    'isRenderbuffer',
-    'isShader',
-    'isTexture',
-    'lineWidth',
-    'linkProgram',
-    'pixelStorei',
-    'polygonOffset',
-    'readPixels',
-    'renderbufferStorage',
-    'sampleCoverage',
-    'scissor',
-    'shaderSource',
-    'stencilFunc',
-    'stencilFuncSeparate',
-    'stencilMask',
-    'stencilMaskSeparate',
-    'stencilOp',
-    'stencilOpSeparate',
-    'texImage2D',
-    'texImage2DCanvas',
-    'texImage2DImage',
-    'texImage2DImageData',
-    'texImage2DVideo',
-    'texParameterf',
-    'texParameteri',
-    'texSubImage2D',
-    'texSubImage2DCanvas',
-    'texSubImage2DImage',
-    'texSubImage2DImageData',
-    'texSubImage2DVideo',
-    'uniform1f',
-    'uniform1fv',
-    'uniform1i',
-    'uniform1iv',
-    'uniform2f',
-    'uniform2fv',
-    'uniform2i',
-    'uniform2iv',
-    'uniform3f',
-    'uniform3fv',
-    'uniform3i',
-    'uniform3iv',
-    'uniform4f',
-    'uniform4fv',
-    'uniform4i',
-    'uniform4iv',
-    'uniformMatrix2fv',
-    'uniformMatrix3fv',
-    'uniformMatrix4fv',
-    'useProgram',
-    'validateProgram',
-    'vertexAttrib1f',
-    'vertexAttrib1fv',
-    'vertexAttrib2f',
-    'vertexAttrib2fv',
-    'vertexAttrib3f',
-    'vertexAttrib3fv',
-    'vertexAttrib4f',
-    'vertexAttrib4fv',
-    'vertexAttribPointer',
-    'viewport',
-    'texImage2DUntyped',
-    'texImage2DTyped',
-    'texSubImage2DUntyped',
-    'texSubImage2DTyped',
-    'canvas',
-    'drawingBufferHeight',
-    'drawingBufferWidth'
-  ]);
-  web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!window.WebGLRenderingContext;
-    }
-    get [dartx.canvas]() {
-      return this.canvas;
-    }
-    get [dartx.drawingBufferHeight]() {
-      return this.drawingBufferHeight;
-    }
-    get [dartx.drawingBufferWidth]() {
-      return this.drawingBufferWidth;
-    }
-    [dartx.activeTexture](...args) {
-      return this.activeTexture.apply(this, args);
-    }
-    [dartx.attachShader](...args) {
-      return this.attachShader.apply(this, args);
-    }
-    [dartx.bindAttribLocation](...args) {
-      return this.bindAttribLocation.apply(this, args);
-    }
-    [dartx.bindBuffer](...args) {
-      return this.bindBuffer.apply(this, args);
-    }
-    [dartx.bindFramebuffer](...args) {
-      return this.bindFramebuffer.apply(this, args);
-    }
-    [dartx.bindRenderbuffer](...args) {
-      return this.bindRenderbuffer.apply(this, args);
-    }
-    [dartx.bindTexture](...args) {
-      return this.bindTexture.apply(this, args);
-    }
-    [dartx.blendColor](...args) {
-      return this.blendColor.apply(this, args);
-    }
-    [dartx.blendEquation](...args) {
-      return this.blendEquation.apply(this, args);
-    }
-    [dartx.blendEquationSeparate](...args) {
-      return this.blendEquationSeparate.apply(this, args);
-    }
-    [dartx.blendFunc](...args) {
-      return this.blendFunc.apply(this, args);
-    }
-    [dartx.blendFuncSeparate](...args) {
-      return this.blendFuncSeparate.apply(this, args);
-    }
-    [dartx.bufferByteData](...args) {
-      return this.bufferData.apply(this, args);
-    }
-    [dartx.bufferData](...args) {
-      return this.bufferData.apply(this, args);
-    }
-    [dartx.bufferDataTyped](...args) {
-      return this.bufferData.apply(this, args);
-    }
-    [dartx.bufferSubByteData](...args) {
-      return this.bufferSubData.apply(this, args);
-    }
-    [dartx.bufferSubData](...args) {
-      return this.bufferSubData.apply(this, args);
-    }
-    [dartx.bufferSubDataTyped](...args) {
-      return this.bufferSubData.apply(this, args);
-    }
-    [dartx.checkFramebufferStatus](...args) {
-      return this.checkFramebufferStatus.apply(this, args);
-    }
-    [dartx.clear](...args) {
-      return this.clear.apply(this, args);
-    }
-    [dartx.clearColor](...args) {
-      return this.clearColor.apply(this, args);
-    }
-    [dartx.clearDepth](...args) {
-      return this.clearDepth.apply(this, args);
-    }
-    [dartx.clearStencil](...args) {
-      return this.clearStencil.apply(this, args);
-    }
-    [dartx.colorMask](...args) {
-      return this.colorMask.apply(this, args);
-    }
-    [dartx.compileShader](...args) {
-      return this.compileShader.apply(this, args);
-    }
-    [dartx.compressedTexImage2D](...args) {
-      return this.compressedTexImage2D.apply(this, args);
-    }
-    [dartx.compressedTexSubImage2D](...args) {
-      return this.compressedTexSubImage2D.apply(this, args);
-    }
-    [dartx.copyTexImage2D](...args) {
-      return this.copyTexImage2D.apply(this, args);
-    }
-    [dartx.copyTexSubImage2D](...args) {
-      return this.copyTexSubImage2D.apply(this, args);
-    }
-    [dartx.createBuffer](...args) {
-      return this.createBuffer.apply(this, args);
-    }
-    [dartx.createFramebuffer](...args) {
-      return this.createFramebuffer.apply(this, args);
-    }
-    [dartx.createProgram](...args) {
-      return this.createProgram.apply(this, args);
-    }
-    [dartx.createRenderbuffer](...args) {
-      return this.createRenderbuffer.apply(this, args);
-    }
-    [dartx.createShader](...args) {
-      return this.createShader.apply(this, args);
-    }
-    [dartx.createTexture](...args) {
-      return this.createTexture.apply(this, args);
-    }
-    [dartx.cullFace](...args) {
-      return this.cullFace.apply(this, args);
-    }
-    [dartx.deleteBuffer](...args) {
-      return this.deleteBuffer.apply(this, args);
-    }
-    [dartx.deleteFramebuffer](...args) {
-      return this.deleteFramebuffer.apply(this, args);
-    }
-    [dartx.deleteProgram](...args) {
-      return this.deleteProgram.apply(this, args);
-    }
-    [dartx.deleteRenderbuffer](...args) {
-      return this.deleteRenderbuffer.apply(this, args);
-    }
-    [dartx.deleteShader](...args) {
-      return this.deleteShader.apply(this, args);
-    }
-    [dartx.deleteTexture](...args) {
-      return this.deleteTexture.apply(this, args);
-    }
-    [dartx.depthFunc](...args) {
-      return this.depthFunc.apply(this, args);
-    }
-    [dartx.depthMask](...args) {
-      return this.depthMask.apply(this, args);
-    }
-    [dartx.depthRange](...args) {
-      return this.depthRange.apply(this, args);
-    }
-    [dartx.detachShader](...args) {
-      return this.detachShader.apply(this, args);
-    }
-    [dartx.disable](...args) {
-      return this.disable.apply(this, args);
-    }
-    [dartx.disableVertexAttribArray](...args) {
-      return this.disableVertexAttribArray.apply(this, args);
-    }
-    [dartx.drawArrays](...args) {
-      return this.drawArrays.apply(this, args);
-    }
-    [dartx.drawElements](...args) {
-      return this.drawElements.apply(this, args);
-    }
-    [dartx.enable](...args) {
-      return this.enable.apply(this, args);
-    }
-    [dartx.enableVertexAttribArray](...args) {
-      return this.enableVertexAttribArray.apply(this, args);
-    }
-    [dartx.finish](...args) {
-      return this.finish.apply(this, args);
-    }
-    [dartx.flush](...args) {
-      return this.flush.apply(this, args);
-    }
-    [dartx.framebufferRenderbuffer](...args) {
-      return this.framebufferRenderbuffer.apply(this, args);
-    }
-    [dartx.framebufferTexture2D](...args) {
-      return this.framebufferTexture2D.apply(this, args);
-    }
-    [dartx.frontFace](...args) {
-      return this.frontFace.apply(this, args);
-    }
-    [dartx.generateMipmap](...args) {
-      return this.generateMipmap.apply(this, args);
-    }
-    [dartx.getActiveAttrib](...args) {
-      return this.getActiveAttrib.apply(this, args);
-    }
-    [dartx.getActiveUniform](...args) {
-      return this.getActiveUniform.apply(this, args);
-    }
-    [dartx.getAttachedShaders](...args) {
-      return this.getAttachedShaders.apply(this, args);
-    }
-    [dartx.getAttribLocation](...args) {
-      return this.getAttribLocation.apply(this, args);
-    }
-    [dartx.getBufferParameter](...args) {
-      return this.getBufferParameter.apply(this, args);
-    }
-    [dartx.getContextAttributes]() {
-      return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
-    }
-    [_getContextAttributes_1$](...args) {
-      return this.getContextAttributes.apply(this, args);
-    }
-    [dartx.getError](...args) {
-      return this.getError.apply(this, args);
-    }
-    [dartx.getExtension](...args) {
-      return this.getExtension.apply(this, args);
-    }
-    [dartx.getFramebufferAttachmentParameter](...args) {
-      return this.getFramebufferAttachmentParameter.apply(this, args);
-    }
-    [dartx.getParameter](...args) {
-      return this.getParameter.apply(this, args);
-    }
-    [dartx.getProgramInfoLog](...args) {
-      return this.getProgramInfoLog.apply(this, args);
-    }
-    [dartx.getProgramParameter](...args) {
-      return this.getProgramParameter.apply(this, args);
-    }
-    [dartx.getRenderbufferParameter](...args) {
-      return this.getRenderbufferParameter.apply(this, args);
-    }
-    [dartx.getShaderInfoLog](...args) {
-      return this.getShaderInfoLog.apply(this, args);
-    }
-    [dartx.getShaderParameter](...args) {
-      return this.getShaderParameter.apply(this, args);
-    }
-    [dartx.getShaderPrecisionFormat](...args) {
-      return this.getShaderPrecisionFormat.apply(this, args);
-    }
-    [dartx.getShaderSource](...args) {
-      return this.getShaderSource.apply(this, args);
-    }
-    [dartx.getSupportedExtensions](...args) {
-      return this.getSupportedExtensions.apply(this, args);
-    }
-    [dartx.getTexParameter](...args) {
-      return this.getTexParameter.apply(this, args);
-    }
-    [dartx.getUniform](...args) {
-      return this.getUniform.apply(this, args);
-    }
-    [dartx.getUniformLocation](...args) {
-      return this.getUniformLocation.apply(this, args);
-    }
-    [dartx.getVertexAttrib](...args) {
-      return this.getVertexAttrib.apply(this, args);
-    }
-    [dartx.getVertexAttribOffset](...args) {
-      return this.getVertexAttribOffset.apply(this, args);
-    }
-    [dartx.hint](...args) {
-      return this.hint.apply(this, args);
-    }
-    [dartx.isBuffer](...args) {
-      return this.isBuffer.apply(this, args);
-    }
-    [dartx.isContextLost](...args) {
-      return this.isContextLost.apply(this, args);
-    }
-    [dartx.isEnabled](...args) {
-      return this.isEnabled.apply(this, args);
-    }
-    [dartx.isFramebuffer](...args) {
-      return this.isFramebuffer.apply(this, args);
-    }
-    [dartx.isProgram](...args) {
-      return this.isProgram.apply(this, args);
-    }
-    [dartx.isRenderbuffer](...args) {
-      return this.isRenderbuffer.apply(this, args);
-    }
-    [dartx.isShader](...args) {
-      return this.isShader.apply(this, args);
-    }
-    [dartx.isTexture](...args) {
-      return this.isTexture.apply(this, args);
-    }
-    [dartx.lineWidth](...args) {
-      return this.lineWidth.apply(this, args);
-    }
-    [dartx.linkProgram](...args) {
-      return this.linkProgram.apply(this, args);
-    }
-    [dartx.pixelStorei](...args) {
-      return this.pixelStorei.apply(this, args);
-    }
-    [dartx.polygonOffset](...args) {
-      return this.polygonOffset.apply(this, args);
-    }
-    [dartx.readPixels](...args) {
-      return this.readPixels.apply(this, args);
-    }
-    [dartx.renderbufferStorage](...args) {
-      return this.renderbufferStorage.apply(this, args);
-    }
-    [dartx.sampleCoverage](...args) {
-      return this.sampleCoverage.apply(this, args);
-    }
-    [dartx.scissor](...args) {
-      return this.scissor.apply(this, args);
-    }
-    [dartx.shaderSource](...args) {
-      return this.shaderSource.apply(this, args);
-    }
-    [dartx.stencilFunc](...args) {
-      return this.stencilFunc.apply(this, args);
-    }
-    [dartx.stencilFuncSeparate](...args) {
-      return this.stencilFuncSeparate.apply(this, args);
-    }
-    [dartx.stencilMask](...args) {
-      return this.stencilMask.apply(this, args);
-    }
-    [dartx.stencilMaskSeparate](...args) {
-      return this.stencilMaskSeparate.apply(this, args);
-    }
-    [dartx.stencilOp](...args) {
-      return this.stencilOp.apply(this, args);
-    }
-    [dartx.stencilOpSeparate](...args) {
-      return this.stencilOpSeparate.apply(this, args);
-    }
-    [dartx.texImage2D](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
-      if (format === void 0) format = null;
-      if (type === void 0) type = null;
-      if (pixels === void 0) pixels = null;
-      if (pixels != null && type != null && format != null && typeof border_OR_canvas_OR_image_OR_pixels_OR_video == 'number') {
-        this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
-        return;
-      }
-      if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
-        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
-        this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
-        return;
-      }
-      if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
-        this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
-        this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
-        this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_texImage2D_1](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [_texImage2D_2](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [_texImage2D_3](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [_texImage2D_4](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [_texImage2D_5](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texImage2DCanvas](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texImage2DImage](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texImage2DImageData](target, level, internalformat, format, type, pixels) {
-      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
-      this[_texImage2DImageData_1](target, level, internalformat, format, type, pixels_1);
+    }, AudioBufferToNull()));
+    return completer.future;
+  }
+};
+dart.setSignature(web_audio.AudioContext, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(web_audio.AudioContext, []),
+    new: dart.definiteFunctionType(web_audio.AudioContext, [])
+  }),
+  fields: () => ({
+    [dartx.currentTime]: core.double,
+    [dartx.destination]: web_audio.AudioDestinationNode,
+    [dartx.listener]: web_audio.AudioListener,
+    [dartx.sampleRate]: core.double
+  }),
+  getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
+    [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
+    [dartx.createBuffer]: dart.definiteFunctionType(web_audio.AudioBuffer, [core.int, core.int, core.num]),
+    [dartx.createBufferSource]: dart.definiteFunctionType(web_audio.AudioBufferSourceNode, []),
+    [dartx.createChannelMerger]: dart.definiteFunctionType(web_audio.ChannelMergerNode, [], [core.int]),
+    [dartx.createChannelSplitter]: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [], [core.int]),
+    [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
+    [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
+    [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
+    [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
+    [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
+    [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
+    [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
+    [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
+    [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
+    [dartx.createWaveShaper]: dart.definiteFunctionType(web_audio.WaveShaperNode, []),
+    [_decodeAudioData]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer, web_audio.AudioBufferCallback], [web_audio.AudioBufferCallback]),
+    [dartx.startRendering]: dart.definiteFunctionType(dart.void, []),
+    [dartx.createGain]: dart.definiteFunctionType(web_audio.GainNode, []),
+    [dartx.createScriptProcessor]: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [core.int], [core.int, core.int]),
+    [dartx.decodeAudioData]: dart.definiteFunctionType(async.Future$(web_audio.AudioBuffer), [typed_data.ByteBuffer])
+  }),
+  sfields: () => ({completeEvent: EventStreamProviderOfEvent()}),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+web_audio.AudioContext.completeEvent = dart.const(new (EventStreamProviderOfEvent())('complete'));
+dart.registerExtension(dart.global.AudioContext, web_audio.AudioContext);
+dart.registerExtension(dart.global.webkitAudioContext, web_audio.AudioContext);
+dart.defineExtensionNames([
+  'maxChannelCount'
+]);
+web_audio.AudioDestinationNode = class AudioDestinationNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.maxChannelCount]() {
+    return this.maxChannelCount;
+  }
+};
+dart.setSignature(web_audio.AudioDestinationNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioDestinationNode, [])}),
+  fields: () => ({[dartx.maxChannelCount]: core.int})
+});
+dart.registerExtension(dart.global.AudioDestinationNode, web_audio.AudioDestinationNode);
+dart.defineExtensionNames([
+  'setOrientation',
+  'setPosition',
+  'setVelocity',
+  'dopplerFactor',
+  'speedOfSound'
+]);
+web_audio.AudioListener = class AudioListener extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.dopplerFactor]() {
+    return this.dopplerFactor;
+  }
+  set [dartx.dopplerFactor](value) {
+    this.dopplerFactor = value;
+  }
+  get [dartx.speedOfSound]() {
+    return this.speedOfSound;
+  }
+  set [dartx.speedOfSound](value) {
+    this.speedOfSound = value;
+  }
+  [dartx.setOrientation](...args) {
+    return this.setOrientation.apply(this, args);
+  }
+  [dartx.setPosition](...args) {
+    return this.setPosition.apply(this, args);
+  }
+  [dartx.setVelocity](...args) {
+    return this.setVelocity.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.AudioListener, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioListener, [])}),
+  fields: () => ({
+    [dartx.dopplerFactor]: core.num,
+    [dartx.speedOfSound]: core.num
+  }),
+  methods: () => ({
+    [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
+    [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
+  })
+});
+dart.registerExtension(dart.global.AudioListener, web_audio.AudioListener);
+dart.defineExtensionNames([
+  'cancelScheduledValues',
+  'exponentialRampToValueAtTime',
+  'linearRampToValueAtTime',
+  'setTargetAtTime',
+  'setValueAtTime',
+  'setValueCurveAtTime',
+  'defaultValue',
+  'value'
+]);
+web_audio.AudioParam = class AudioParam extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.defaultValue]() {
+    return this.defaultValue;
+  }
+  get [dartx.value]() {
+    return this.value;
+  }
+  set [dartx.value](value) {
+    this.value = value;
+  }
+  [dartx.cancelScheduledValues](...args) {
+    return this.cancelScheduledValues.apply(this, args);
+  }
+  [dartx.exponentialRampToValueAtTime](...args) {
+    return this.exponentialRampToValueAtTime.apply(this, args);
+  }
+  [dartx.linearRampToValueAtTime](...args) {
+    return this.linearRampToValueAtTime.apply(this, args);
+  }
+  [dartx.setTargetAtTime](...args) {
+    return this.setTargetAtTime.apply(this, args);
+  }
+  [dartx.setValueAtTime](...args) {
+    return this.setValueAtTime.apply(this, args);
+  }
+  [dartx.setValueCurveAtTime](...args) {
+    return this.setValueCurveAtTime.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.AudioParam, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioParam, [])}),
+  fields: () => ({
+    [dartx.defaultValue]: core.double,
+    [dartx.value]: core.num
+  }),
+  methods: () => ({
+    [dartx.cancelScheduledValues]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.exponentialRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.linearRampToValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.setTargetAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
+    [dartx.setValueAtTime]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.setValueCurveAtTime]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, core.num, core.num])
+  })
+});
+dart.registerExtension(dart.global.AudioParam, web_audio.AudioParam);
+dart.defineExtensionNames([
+  'inputBuffer',
+  'outputBuffer',
+  'playbackTime'
+]);
+web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.inputBuffer]() {
+    return this.inputBuffer;
+  }
+  get [dartx.outputBuffer]() {
+    return this.outputBuffer;
+  }
+  get [dartx.playbackTime]() {
+    return this.playbackTime;
+  }
+};
+dart.setSignature(web_audio.AudioProcessingEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.AudioProcessingEvent, [])}),
+  fields: () => ({
+    [dartx.inputBuffer]: web_audio.AudioBuffer,
+    [dartx.outputBuffer]: web_audio.AudioBuffer,
+    [dartx.playbackTime]: core.double
+  })
+});
+dart.registerExtension(dart.global.AudioProcessingEvent, web_audio.AudioProcessingEvent);
+dart.defineExtensionNames([
+  'getFrequencyResponse',
+  'Q',
+  'detune',
+  'frequency',
+  'gain',
+  'type'
+]);
+web_audio.BiquadFilterNode = class BiquadFilterNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.Q]() {
+    return this.Q;
+  }
+  get [dartx.detune]() {
+    return this.detune;
+  }
+  get [dartx.frequency]() {
+    return this.frequency;
+  }
+  get [dartx.gain]() {
+    return this.gain;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  [dartx.getFrequencyResponse](...args) {
+    return this.getFrequencyResponse.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.BiquadFilterNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.BiquadFilterNode, [])}),
+  fields: () => ({
+    [dartx.Q]: web_audio.AudioParam,
+    [dartx.detune]: web_audio.AudioParam,
+    [dartx.frequency]: web_audio.AudioParam,
+    [dartx.gain]: web_audio.AudioParam,
+    [dartx.type]: core.String
+  }),
+  methods: () => ({[dartx.getFrequencyResponse]: dart.definiteFunctionType(dart.void, [typed_data.Float32List, typed_data.Float32List, typed_data.Float32List])})
+});
+dart.registerExtension(dart.global.BiquadFilterNode, web_audio.BiquadFilterNode);
+web_audio.ChannelMergerNode = class ChannelMergerNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_audio.ChannelMergerNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelMergerNode, [])})
+});
+dart.registerExtension(dart.global.ChannelMergerNode, web_audio.ChannelMergerNode);
+dart.registerExtension(dart.global.AudioChannelMerger, web_audio.ChannelMergerNode);
+web_audio.ChannelSplitterNode = class ChannelSplitterNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_audio.ChannelSplitterNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.ChannelSplitterNode, [])})
+});
+dart.registerExtension(dart.global.ChannelSplitterNode, web_audio.ChannelSplitterNode);
+dart.registerExtension(dart.global.AudioChannelSplitter, web_audio.ChannelSplitterNode);
+dart.defineExtensionNames([
+  'buffer',
+  'normalize'
+]);
+web_audio.ConvolverNode = class ConvolverNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.buffer]() {
+    return this.buffer;
+  }
+  set [dartx.buffer](value) {
+    this.buffer = value;
+  }
+  get [dartx.normalize]() {
+    return this.normalize;
+  }
+  set [dartx.normalize](value) {
+    this.normalize = value;
+  }
+};
+dart.setSignature(web_audio.ConvolverNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.ConvolverNode, [])}),
+  fields: () => ({
+    [dartx.buffer]: web_audio.AudioBuffer,
+    [dartx.normalize]: core.bool
+  })
+});
+dart.registerExtension(dart.global.ConvolverNode, web_audio.ConvolverNode);
+dart.defineExtensionNames([
+  'delayTime'
+]);
+web_audio.DelayNode = class DelayNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.delayTime]() {
+    return this.delayTime;
+  }
+};
+dart.setSignature(web_audio.DelayNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.DelayNode, [])}),
+  fields: () => ({[dartx.delayTime]: web_audio.AudioParam})
+});
+dart.registerExtension(dart.global.DelayNode, web_audio.DelayNode);
+dart.defineExtensionNames([
+  'attack',
+  'knee',
+  'ratio',
+  'reduction',
+  'release',
+  'threshold'
+]);
+web_audio.DynamicsCompressorNode = class DynamicsCompressorNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.attack]() {
+    return this.attack;
+  }
+  get [dartx.knee]() {
+    return this.knee;
+  }
+  get [dartx.ratio]() {
+    return this.ratio;
+  }
+  get [dartx.reduction]() {
+    return this.reduction;
+  }
+  get [dartx.release]() {
+    return this.release;
+  }
+  get [dartx.threshold]() {
+    return this.threshold;
+  }
+};
+dart.setSignature(web_audio.DynamicsCompressorNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, [])}),
+  fields: () => ({
+    [dartx.attack]: web_audio.AudioParam,
+    [dartx.knee]: web_audio.AudioParam,
+    [dartx.ratio]: web_audio.AudioParam,
+    [dartx.reduction]: web_audio.AudioParam,
+    [dartx.release]: web_audio.AudioParam,
+    [dartx.threshold]: web_audio.AudioParam
+  })
+});
+dart.registerExtension(dart.global.DynamicsCompressorNode, web_audio.DynamicsCompressorNode);
+dart.defineExtensionNames([
+  'gain'
+]);
+web_audio.GainNode = class GainNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.gain]() {
+    return this.gain;
+  }
+};
+dart.setSignature(web_audio.GainNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.GainNode, [])}),
+  fields: () => ({[dartx.gain]: web_audio.AudioParam})
+});
+dart.registerExtension(dart.global.GainNode, web_audio.GainNode);
+dart.registerExtension(dart.global.AudioGainNode, web_audio.GainNode);
+dart.defineExtensionNames([
+  'mediaElement'
+]);
+web_audio.MediaElementAudioSourceNode = class MediaElementAudioSourceNode extends web_audio.AudioSourceNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.mediaElement]() {
+    return this.mediaElement;
+  }
+};
+dart.setSignature(web_audio.MediaElementAudioSourceNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
+  fields: () => ({[dartx.mediaElement]: html$.MediaElement})
+});
+dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
+dart.defineExtensionNames([
+  'stream'
+]);
+web_audio.MediaStreamAudioDestinationNode = class MediaStreamAudioDestinationNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.stream]() {
+    return this.stream;
+  }
+};
+dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
+  fields: () => ({[dartx.stream]: html$.MediaStream})
+});
+dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
+dart.defineExtensionNames([
+  'mediaStream'
+]);
+web_audio.MediaStreamAudioSourceNode = class MediaStreamAudioSourceNode extends web_audio.AudioSourceNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.mediaStream]() {
+    return this.mediaStream;
+  }
+};
+dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
+  fields: () => ({[dartx.mediaStream]: html$.MediaStream})
+});
+dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
+dart.defineExtensionNames([
+  'renderedBuffer'
+]);
+web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.renderedBuffer]() {
+    return this.renderedBuffer;
+  }
+};
+dart.setSignature(web_audio.OfflineAudioCompletionEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.OfflineAudioCompletionEvent, [])}),
+  fields: () => ({[dartx.renderedBuffer]: web_audio.AudioBuffer})
+});
+dart.registerExtension(dart.global.OfflineAudioCompletionEvent, web_audio.OfflineAudioCompletionEvent);
+web_audio.OfflineAudioContext = class OfflineAudioContext extends web_audio.AudioContext {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static new(numberOfChannels, numberOfFrames, sampleRate) {
+    return web_audio.OfflineAudioContext._create_1(numberOfChannels, numberOfFrames, sampleRate);
+  }
+  static _create_1(numberOfChannels, numberOfFrames, sampleRate) {
+    return new self.OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
+  }
+};
+dart.setSignature(web_audio.OfflineAudioContext, {
+  constructors: () => ({
+    _: dart.definiteFunctionType(web_audio.OfflineAudioContext, []),
+    new: dart.definiteFunctionType(web_audio.OfflineAudioContext, [core.int, core.int, core.num])
+  }),
+  statics: () => ({_create_1: dart.definiteFunctionType(web_audio.OfflineAudioContext, [dart.dynamic, dart.dynamic, dart.dynamic])}),
+  names: ['_create_1']
+});
+dart.registerExtension(dart.global.OfflineAudioContext, web_audio.OfflineAudioContext);
+dart.defineExtensionNames([
+  'noteOff',
+  'noteOn',
+  'setPeriodicWave',
+  'start',
+  'stop',
+  'onEnded',
+  'detune',
+  'frequency',
+  'type'
+]);
+web_audio.OscillatorNode = class OscillatorNode extends web_audio.AudioSourceNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.detune]() {
+    return this.detune;
+  }
+  get [dartx.frequency]() {
+    return this.frequency;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+  set [dartx.type](value) {
+    this.type = value;
+  }
+  [dartx.noteOff](...args) {
+    return this.noteOff.apply(this, args);
+  }
+  [dartx.noteOn](...args) {
+    return this.noteOn.apply(this, args);
+  }
+  [dartx.setPeriodicWave](...args) {
+    return this.setPeriodicWave.apply(this, args);
+  }
+  [dartx.start](...args) {
+    return this.start.apply(this, args);
+  }
+  [dartx.stop](...args) {
+    return this.stop.apply(this, args);
+  }
+  get [dartx.onEnded]() {
+    return web_audio.OscillatorNode.endedEvent.forTarget(this);
+  }
+};
+dart.setSignature(web_audio.OscillatorNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.OscillatorNode, [])}),
+  fields: () => ({
+    [dartx.detune]: web_audio.AudioParam,
+    [dartx.frequency]: web_audio.AudioParam,
+    [dartx.type]: core.String
+  }),
+  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
+  methods: () => ({
+    [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.setPeriodicWave]: dart.definiteFunctionType(dart.void, [web_audio.PeriodicWave]),
+    [dartx.start]: dart.definiteFunctionType(dart.void, [], [core.num]),
+    [dartx.stop]: dart.definiteFunctionType(dart.void, [], [core.num])
+  }),
+  sfields: () => ({endedEvent: EventStreamProviderOfEvent()})
+});
+web_audio.OscillatorNode.endedEvent = dart.const(new (EventStreamProviderOfEvent())('ended'));
+dart.registerExtension(dart.global.OscillatorNode, web_audio.OscillatorNode);
+dart.registerExtension(dart.global.Oscillator, web_audio.OscillatorNode);
+dart.defineExtensionNames([
+  'setOrientation',
+  'setPosition',
+  'setVelocity',
+  'coneInnerAngle',
+  'coneOuterAngle',
+  'coneOuterGain',
+  'distanceModel',
+  'maxDistance',
+  'panningModel',
+  'refDistance',
+  'rolloffFactor'
+]);
+web_audio.PannerNode = class PannerNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.coneInnerAngle]() {
+    return this.coneInnerAngle;
+  }
+  set [dartx.coneInnerAngle](value) {
+    this.coneInnerAngle = value;
+  }
+  get [dartx.coneOuterAngle]() {
+    return this.coneOuterAngle;
+  }
+  set [dartx.coneOuterAngle](value) {
+    this.coneOuterAngle = value;
+  }
+  get [dartx.coneOuterGain]() {
+    return this.coneOuterGain;
+  }
+  set [dartx.coneOuterGain](value) {
+    this.coneOuterGain = value;
+  }
+  get [dartx.distanceModel]() {
+    return this.distanceModel;
+  }
+  set [dartx.distanceModel](value) {
+    this.distanceModel = value;
+  }
+  get [dartx.maxDistance]() {
+    return this.maxDistance;
+  }
+  set [dartx.maxDistance](value) {
+    this.maxDistance = value;
+  }
+  get [dartx.panningModel]() {
+    return this.panningModel;
+  }
+  set [dartx.panningModel](value) {
+    this.panningModel = value;
+  }
+  get [dartx.refDistance]() {
+    return this.refDistance;
+  }
+  set [dartx.refDistance](value) {
+    this.refDistance = value;
+  }
+  get [dartx.rolloffFactor]() {
+    return this.rolloffFactor;
+  }
+  set [dartx.rolloffFactor](value) {
+    this.rolloffFactor = value;
+  }
+  [dartx.setOrientation](...args) {
+    return this.setOrientation.apply(this, args);
+  }
+  [dartx.setPosition](...args) {
+    return this.setPosition.apply(this, args);
+  }
+  [dartx.setVelocity](...args) {
+    return this.setVelocity.apply(this, args);
+  }
+};
+dart.setSignature(web_audio.PannerNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.PannerNode, [])}),
+  fields: () => ({
+    [dartx.coneInnerAngle]: core.num,
+    [dartx.coneOuterAngle]: core.num,
+    [dartx.coneOuterGain]: core.num,
+    [dartx.distanceModel]: core.String,
+    [dartx.maxDistance]: core.num,
+    [dartx.panningModel]: core.String,
+    [dartx.refDistance]: core.num,
+    [dartx.rolloffFactor]: core.num
+  }),
+  methods: () => ({
+    [dartx.setOrientation]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
+    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
+    [dartx.setVelocity]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num])
+  })
+});
+dart.registerExtension(dart.global.PannerNode, web_audio.PannerNode);
+dart.registerExtension(dart.global.AudioPannerNode, web_audio.PannerNode);
+dart.registerExtension(dart.global.webkitAudioPannerNode, web_audio.PannerNode);
+web_audio.PeriodicWave = class PeriodicWave extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_audio.PeriodicWave, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.PeriodicWave, [])})
+});
+dart.registerExtension(dart.global.PeriodicWave, web_audio.PeriodicWave);
+dart.defineExtensionNames([
+  'setEventListener',
+  'onAudioProcess',
+  'bufferSize'
+]);
+web_audio.ScriptProcessorNode = class ScriptProcessorNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.bufferSize]() {
+    return this.bufferSize;
+  }
+  [dartx.setEventListener](...args) {
+    return this.setEventListener.apply(this, args);
+  }
+  get [dartx.onAudioProcess]() {
+    return web_audio.ScriptProcessorNode.audioProcessEvent.forTarget(this);
+  }
+};
+dart.setSignature(web_audio.ScriptProcessorNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
+  fields: () => ({[dartx.bufferSize]: core.int}),
+  getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
+  methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
+  sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
+});
+web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
+dart.registerExtension(dart.global.ScriptProcessorNode, web_audio.ScriptProcessorNode);
+dart.registerExtension(dart.global.JavaScriptAudioNode, web_audio.ScriptProcessorNode);
+dart.defineExtensionNames([
+  'curve',
+  'oversample'
+]);
+web_audio.WaveShaperNode = class WaveShaperNode extends web_audio.AudioNode {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.curve]() {
+    return this.curve;
+  }
+  set [dartx.curve](value) {
+    this.curve = value;
+  }
+  get [dartx.oversample]() {
+    return this.oversample;
+  }
+  set [dartx.oversample](value) {
+    this.oversample = value;
+  }
+};
+dart.setSignature(web_audio.WaveShaperNode, {
+  constructors: () => ({_: dart.definiteFunctionType(web_audio.WaveShaperNode, [])}),
+  fields: () => ({
+    [dartx.curve]: typed_data.Float32List,
+    [dartx.oversample]: core.String
+  })
+});
+dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
+const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
+const _texImage2D_1 = Symbol('_texImage2D_1');
+const _texImage2D_2 = Symbol('_texImage2D_2');
+const _texImage2D_3 = Symbol('_texImage2D_3');
+const _texImage2D_4 = Symbol('_texImage2D_4');
+const _texImage2D_5 = Symbol('_texImage2D_5');
+const _texImage2DImageData_1 = Symbol('_texImage2DImageData_1');
+const _texSubImage2D_1 = Symbol('_texSubImage2D_1');
+const _texSubImage2D_2 = Symbol('_texSubImage2D_2');
+const _texSubImage2D_3 = Symbol('_texSubImage2D_3');
+const _texSubImage2D_4 = Symbol('_texSubImage2D_4');
+const _texSubImage2D_5 = Symbol('_texSubImage2D_5');
+const _texSubImage2DImageData_1 = Symbol('_texSubImage2DImageData_1');
+dart.defineExtensionNames([
+  'activeTexture',
+  'attachShader',
+  'bindAttribLocation',
+  'bindBuffer',
+  'bindFramebuffer',
+  'bindRenderbuffer',
+  'bindTexture',
+  'blendColor',
+  'blendEquation',
+  'blendEquationSeparate',
+  'blendFunc',
+  'blendFuncSeparate',
+  'bufferByteData',
+  'bufferData',
+  'bufferDataTyped',
+  'bufferSubByteData',
+  'bufferSubData',
+  'bufferSubDataTyped',
+  'checkFramebufferStatus',
+  'clear',
+  'clearColor',
+  'clearDepth',
+  'clearStencil',
+  'colorMask',
+  'compileShader',
+  'compressedTexImage2D',
+  'compressedTexSubImage2D',
+  'copyTexImage2D',
+  'copyTexSubImage2D',
+  'createBuffer',
+  'createFramebuffer',
+  'createProgram',
+  'createRenderbuffer',
+  'createShader',
+  'createTexture',
+  'cullFace',
+  'deleteBuffer',
+  'deleteFramebuffer',
+  'deleteProgram',
+  'deleteRenderbuffer',
+  'deleteShader',
+  'deleteTexture',
+  'depthFunc',
+  'depthMask',
+  'depthRange',
+  'detachShader',
+  'disable',
+  'disableVertexAttribArray',
+  'drawArrays',
+  'drawElements',
+  'enable',
+  'enableVertexAttribArray',
+  'finish',
+  'flush',
+  'framebufferRenderbuffer',
+  'framebufferTexture2D',
+  'frontFace',
+  'generateMipmap',
+  'getActiveAttrib',
+  'getActiveUniform',
+  'getAttachedShaders',
+  'getAttribLocation',
+  'getBufferParameter',
+  'getContextAttributes',
+  'getError',
+  'getExtension',
+  'getFramebufferAttachmentParameter',
+  'getParameter',
+  'getProgramInfoLog',
+  'getProgramParameter',
+  'getRenderbufferParameter',
+  'getShaderInfoLog',
+  'getShaderParameter',
+  'getShaderPrecisionFormat',
+  'getShaderSource',
+  'getSupportedExtensions',
+  'getTexParameter',
+  'getUniform',
+  'getUniformLocation',
+  'getVertexAttrib',
+  'getVertexAttribOffset',
+  'hint',
+  'isBuffer',
+  'isContextLost',
+  'isEnabled',
+  'isFramebuffer',
+  'isProgram',
+  'isRenderbuffer',
+  'isShader',
+  'isTexture',
+  'lineWidth',
+  'linkProgram',
+  'pixelStorei',
+  'polygonOffset',
+  'readPixels',
+  'renderbufferStorage',
+  'sampleCoverage',
+  'scissor',
+  'shaderSource',
+  'stencilFunc',
+  'stencilFuncSeparate',
+  'stencilMask',
+  'stencilMaskSeparate',
+  'stencilOp',
+  'stencilOpSeparate',
+  'texImage2D',
+  'texImage2DCanvas',
+  'texImage2DImage',
+  'texImage2DImageData',
+  'texImage2DVideo',
+  'texParameterf',
+  'texParameteri',
+  'texSubImage2D',
+  'texSubImage2DCanvas',
+  'texSubImage2DImage',
+  'texSubImage2DImageData',
+  'texSubImage2DVideo',
+  'uniform1f',
+  'uniform1fv',
+  'uniform1i',
+  'uniform1iv',
+  'uniform2f',
+  'uniform2fv',
+  'uniform2i',
+  'uniform2iv',
+  'uniform3f',
+  'uniform3fv',
+  'uniform3i',
+  'uniform3iv',
+  'uniform4f',
+  'uniform4fv',
+  'uniform4i',
+  'uniform4iv',
+  'uniformMatrix2fv',
+  'uniformMatrix3fv',
+  'uniformMatrix4fv',
+  'useProgram',
+  'validateProgram',
+  'vertexAttrib1f',
+  'vertexAttrib1fv',
+  'vertexAttrib2f',
+  'vertexAttrib2fv',
+  'vertexAttrib3f',
+  'vertexAttrib3fv',
+  'vertexAttrib4f',
+  'vertexAttrib4fv',
+  'vertexAttribPointer',
+  'viewport',
+  'texImage2DUntyped',
+  'texImage2DTyped',
+  'texSubImage2DUntyped',
+  'texSubImage2DTyped',
+  'canvas',
+  'drawingBufferHeight',
+  'drawingBufferWidth'
+]);
+web_gl.RenderingContext = class RenderingContext extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!window.WebGLRenderingContext;
+  }
+  get [dartx.canvas]() {
+    return this.canvas;
+  }
+  get [dartx.drawingBufferHeight]() {
+    return this.drawingBufferHeight;
+  }
+  get [dartx.drawingBufferWidth]() {
+    return this.drawingBufferWidth;
+  }
+  [dartx.activeTexture](...args) {
+    return this.activeTexture.apply(this, args);
+  }
+  [dartx.attachShader](...args) {
+    return this.attachShader.apply(this, args);
+  }
+  [dartx.bindAttribLocation](...args) {
+    return this.bindAttribLocation.apply(this, args);
+  }
+  [dartx.bindBuffer](...args) {
+    return this.bindBuffer.apply(this, args);
+  }
+  [dartx.bindFramebuffer](...args) {
+    return this.bindFramebuffer.apply(this, args);
+  }
+  [dartx.bindRenderbuffer](...args) {
+    return this.bindRenderbuffer.apply(this, args);
+  }
+  [dartx.bindTexture](...args) {
+    return this.bindTexture.apply(this, args);
+  }
+  [dartx.blendColor](...args) {
+    return this.blendColor.apply(this, args);
+  }
+  [dartx.blendEquation](...args) {
+    return this.blendEquation.apply(this, args);
+  }
+  [dartx.blendEquationSeparate](...args) {
+    return this.blendEquationSeparate.apply(this, args);
+  }
+  [dartx.blendFunc](...args) {
+    return this.blendFunc.apply(this, args);
+  }
+  [dartx.blendFuncSeparate](...args) {
+    return this.blendFuncSeparate.apply(this, args);
+  }
+  [dartx.bufferByteData](...args) {
+    return this.bufferData.apply(this, args);
+  }
+  [dartx.bufferData](...args) {
+    return this.bufferData.apply(this, args);
+  }
+  [dartx.bufferDataTyped](...args) {
+    return this.bufferData.apply(this, args);
+  }
+  [dartx.bufferSubByteData](...args) {
+    return this.bufferSubData.apply(this, args);
+  }
+  [dartx.bufferSubData](...args) {
+    return this.bufferSubData.apply(this, args);
+  }
+  [dartx.bufferSubDataTyped](...args) {
+    return this.bufferSubData.apply(this, args);
+  }
+  [dartx.checkFramebufferStatus](...args) {
+    return this.checkFramebufferStatus.apply(this, args);
+  }
+  [dartx.clear](...args) {
+    return this.clear.apply(this, args);
+  }
+  [dartx.clearColor](...args) {
+    return this.clearColor.apply(this, args);
+  }
+  [dartx.clearDepth](...args) {
+    return this.clearDepth.apply(this, args);
+  }
+  [dartx.clearStencil](...args) {
+    return this.clearStencil.apply(this, args);
+  }
+  [dartx.colorMask](...args) {
+    return this.colorMask.apply(this, args);
+  }
+  [dartx.compileShader](...args) {
+    return this.compileShader.apply(this, args);
+  }
+  [dartx.compressedTexImage2D](...args) {
+    return this.compressedTexImage2D.apply(this, args);
+  }
+  [dartx.compressedTexSubImage2D](...args) {
+    return this.compressedTexSubImage2D.apply(this, args);
+  }
+  [dartx.copyTexImage2D](...args) {
+    return this.copyTexImage2D.apply(this, args);
+  }
+  [dartx.copyTexSubImage2D](...args) {
+    return this.copyTexSubImage2D.apply(this, args);
+  }
+  [dartx.createBuffer](...args) {
+    return this.createBuffer.apply(this, args);
+  }
+  [dartx.createFramebuffer](...args) {
+    return this.createFramebuffer.apply(this, args);
+  }
+  [dartx.createProgram](...args) {
+    return this.createProgram.apply(this, args);
+  }
+  [dartx.createRenderbuffer](...args) {
+    return this.createRenderbuffer.apply(this, args);
+  }
+  [dartx.createShader](...args) {
+    return this.createShader.apply(this, args);
+  }
+  [dartx.createTexture](...args) {
+    return this.createTexture.apply(this, args);
+  }
+  [dartx.cullFace](...args) {
+    return this.cullFace.apply(this, args);
+  }
+  [dartx.deleteBuffer](...args) {
+    return this.deleteBuffer.apply(this, args);
+  }
+  [dartx.deleteFramebuffer](...args) {
+    return this.deleteFramebuffer.apply(this, args);
+  }
+  [dartx.deleteProgram](...args) {
+    return this.deleteProgram.apply(this, args);
+  }
+  [dartx.deleteRenderbuffer](...args) {
+    return this.deleteRenderbuffer.apply(this, args);
+  }
+  [dartx.deleteShader](...args) {
+    return this.deleteShader.apply(this, args);
+  }
+  [dartx.deleteTexture](...args) {
+    return this.deleteTexture.apply(this, args);
+  }
+  [dartx.depthFunc](...args) {
+    return this.depthFunc.apply(this, args);
+  }
+  [dartx.depthMask](...args) {
+    return this.depthMask.apply(this, args);
+  }
+  [dartx.depthRange](...args) {
+    return this.depthRange.apply(this, args);
+  }
+  [dartx.detachShader](...args) {
+    return this.detachShader.apply(this, args);
+  }
+  [dartx.disable](...args) {
+    return this.disable.apply(this, args);
+  }
+  [dartx.disableVertexAttribArray](...args) {
+    return this.disableVertexAttribArray.apply(this, args);
+  }
+  [dartx.drawArrays](...args) {
+    return this.drawArrays.apply(this, args);
+  }
+  [dartx.drawElements](...args) {
+    return this.drawElements.apply(this, args);
+  }
+  [dartx.enable](...args) {
+    return this.enable.apply(this, args);
+  }
+  [dartx.enableVertexAttribArray](...args) {
+    return this.enableVertexAttribArray.apply(this, args);
+  }
+  [dartx.finish](...args) {
+    return this.finish.apply(this, args);
+  }
+  [dartx.flush](...args) {
+    return this.flush.apply(this, args);
+  }
+  [dartx.framebufferRenderbuffer](...args) {
+    return this.framebufferRenderbuffer.apply(this, args);
+  }
+  [dartx.framebufferTexture2D](...args) {
+    return this.framebufferTexture2D.apply(this, args);
+  }
+  [dartx.frontFace](...args) {
+    return this.frontFace.apply(this, args);
+  }
+  [dartx.generateMipmap](...args) {
+    return this.generateMipmap.apply(this, args);
+  }
+  [dartx.getActiveAttrib](...args) {
+    return this.getActiveAttrib.apply(this, args);
+  }
+  [dartx.getActiveUniform](...args) {
+    return this.getActiveUniform.apply(this, args);
+  }
+  [dartx.getAttachedShaders](...args) {
+    return this.getAttachedShaders.apply(this, args);
+  }
+  [dartx.getAttribLocation](...args) {
+    return this.getAttribLocation.apply(this, args);
+  }
+  [dartx.getBufferParameter](...args) {
+    return this.getBufferParameter.apply(this, args);
+  }
+  [dartx.getContextAttributes]() {
+    return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
+  }
+  [_getContextAttributes_1$](...args) {
+    return this.getContextAttributes.apply(this, args);
+  }
+  [dartx.getError](...args) {
+    return this.getError.apply(this, args);
+  }
+  [dartx.getExtension](...args) {
+    return this.getExtension.apply(this, args);
+  }
+  [dartx.getFramebufferAttachmentParameter](...args) {
+    return this.getFramebufferAttachmentParameter.apply(this, args);
+  }
+  [dartx.getParameter](...args) {
+    return this.getParameter.apply(this, args);
+  }
+  [dartx.getProgramInfoLog](...args) {
+    return this.getProgramInfoLog.apply(this, args);
+  }
+  [dartx.getProgramParameter](...args) {
+    return this.getProgramParameter.apply(this, args);
+  }
+  [dartx.getRenderbufferParameter](...args) {
+    return this.getRenderbufferParameter.apply(this, args);
+  }
+  [dartx.getShaderInfoLog](...args) {
+    return this.getShaderInfoLog.apply(this, args);
+  }
+  [dartx.getShaderParameter](...args) {
+    return this.getShaderParameter.apply(this, args);
+  }
+  [dartx.getShaderPrecisionFormat](...args) {
+    return this.getShaderPrecisionFormat.apply(this, args);
+  }
+  [dartx.getShaderSource](...args) {
+    return this.getShaderSource.apply(this, args);
+  }
+  [dartx.getSupportedExtensions](...args) {
+    return this.getSupportedExtensions.apply(this, args);
+  }
+  [dartx.getTexParameter](...args) {
+    return this.getTexParameter.apply(this, args);
+  }
+  [dartx.getUniform](...args) {
+    return this.getUniform.apply(this, args);
+  }
+  [dartx.getUniformLocation](...args) {
+    return this.getUniformLocation.apply(this, args);
+  }
+  [dartx.getVertexAttrib](...args) {
+    return this.getVertexAttrib.apply(this, args);
+  }
+  [dartx.getVertexAttribOffset](...args) {
+    return this.getVertexAttribOffset.apply(this, args);
+  }
+  [dartx.hint](...args) {
+    return this.hint.apply(this, args);
+  }
+  [dartx.isBuffer](...args) {
+    return this.isBuffer.apply(this, args);
+  }
+  [dartx.isContextLost](...args) {
+    return this.isContextLost.apply(this, args);
+  }
+  [dartx.isEnabled](...args) {
+    return this.isEnabled.apply(this, args);
+  }
+  [dartx.isFramebuffer](...args) {
+    return this.isFramebuffer.apply(this, args);
+  }
+  [dartx.isProgram](...args) {
+    return this.isProgram.apply(this, args);
+  }
+  [dartx.isRenderbuffer](...args) {
+    return this.isRenderbuffer.apply(this, args);
+  }
+  [dartx.isShader](...args) {
+    return this.isShader.apply(this, args);
+  }
+  [dartx.isTexture](...args) {
+    return this.isTexture.apply(this, args);
+  }
+  [dartx.lineWidth](...args) {
+    return this.lineWidth.apply(this, args);
+  }
+  [dartx.linkProgram](...args) {
+    return this.linkProgram.apply(this, args);
+  }
+  [dartx.pixelStorei](...args) {
+    return this.pixelStorei.apply(this, args);
+  }
+  [dartx.polygonOffset](...args) {
+    return this.polygonOffset.apply(this, args);
+  }
+  [dartx.readPixels](...args) {
+    return this.readPixels.apply(this, args);
+  }
+  [dartx.renderbufferStorage](...args) {
+    return this.renderbufferStorage.apply(this, args);
+  }
+  [dartx.sampleCoverage](...args) {
+    return this.sampleCoverage.apply(this, args);
+  }
+  [dartx.scissor](...args) {
+    return this.scissor.apply(this, args);
+  }
+  [dartx.shaderSource](...args) {
+    return this.shaderSource.apply(this, args);
+  }
+  [dartx.stencilFunc](...args) {
+    return this.stencilFunc.apply(this, args);
+  }
+  [dartx.stencilFuncSeparate](...args) {
+    return this.stencilFuncSeparate.apply(this, args);
+  }
+  [dartx.stencilMask](...args) {
+    return this.stencilMask.apply(this, args);
+  }
+  [dartx.stencilMaskSeparate](...args) {
+    return this.stencilMaskSeparate.apply(this, args);
+  }
+  [dartx.stencilOp](...args) {
+    return this.stencilOp.apply(this, args);
+  }
+  [dartx.stencilOpSeparate](...args) {
+    return this.stencilOpSeparate.apply(this, args);
+  }
+  [dartx.texImage2D](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
+    if (format === void 0) format = null;
+    if (type === void 0) type = null;
+    if (pixels === void 0) pixels = null;
+    if (pixels != null && type != null && format != null && typeof border_OR_canvas_OR_image_OR_pixels_OR_video == 'number') {
+      this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
-    [_texImage2DImageData_1](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texImage2DVideo](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texParameterf](...args) {
-      return this.texParameterf.apply(this, args);
-    }
-    [dartx.texParameteri](...args) {
-      return this.texParameteri.apply(this, args);
-    }
-    [dartx.texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
-      if (type === void 0) type = null;
-      if (pixels === void 0) pixels = null;
-      if (pixels != null && type != null && typeof canvas_OR_format_OR_image_OR_pixels_OR_video == 'number') {
-        this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
-        return;
-      }
-      if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
-        let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
-        this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
-        return;
-      }
-      if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
-        this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
-        this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
-        this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
-        return;
-      }
-      dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
-    }
-    [_texSubImage2D_1](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [_texSubImage2D_2](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [_texSubImage2D_3](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [_texSubImage2D_4](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [_texSubImage2D_5](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [dartx.texSubImage2DCanvas](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [dartx.texSubImage2DImage](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [dartx.texSubImage2DImageData](target, level, xoffset, yoffset, format, type, pixels) {
-      let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
-      this[_texSubImage2DImageData_1](target, level, xoffset, yoffset, format, type, pixels_1);
+    if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
+      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
+      this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    [_texSubImage2DImageData_1](...args) {
-      return this.texSubImage2D.apply(this, args);
+    if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+      this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.texSubImage2DVideo](...args) {
-      return this.texSubImage2D.apply(this, args);
+    if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+      this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.uniform1f](...args) {
-      return this.uniform1f.apply(this, args);
+    if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+      this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.uniform1fv](...args) {
-      return this.uniform1fv.apply(this, args);
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_texImage2D_1](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [_texImage2D_2](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [_texImage2D_3](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [_texImage2D_4](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [_texImage2D_5](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texImage2DCanvas](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texImage2DImage](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texImage2DImageData](target, level, internalformat, format, type, pixels) {
+    let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
+    this[_texImage2DImageData_1](target, level, internalformat, format, type, pixels_1);
+    return;
+  }
+  [_texImage2DImageData_1](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texImage2DVideo](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texParameterf](...args) {
+    return this.texParameterf.apply(this, args);
+  }
+  [dartx.texParameteri](...args) {
+    return this.texParameteri.apply(this, args);
+  }
+  [dartx.texSubImage2D](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
+    if (type === void 0) type = null;
+    if (pixels === void 0) pixels = null;
+    if (pixels != null && type != null && typeof canvas_OR_format_OR_image_OR_pixels_OR_video == 'number') {
+      this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      return;
     }
-    [dartx.uniform1i](...args) {
-      return this.uniform1i.apply(this, args);
+    if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
+      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
+      this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
+      return;
     }
-    [dartx.uniform1iv](...args) {
-      return this.uniform1iv.apply(this, args);
+    if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+      this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.uniform2f](...args) {
-      return this.uniform2f.apply(this, args);
+    if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+      this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.uniform2fv](...args) {
-      return this.uniform2fv.apply(this, args);
+    if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+      this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      return;
     }
-    [dartx.uniform2i](...args) {
-      return this.uniform2i.apply(this, args);
+    dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
+  }
+  [_texSubImage2D_1](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [_texSubImage2D_2](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [_texSubImage2D_3](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [_texSubImage2D_4](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [_texSubImage2D_5](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DCanvas](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DImage](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DImageData](target, level, xoffset, yoffset, format, type, pixels) {
+    let pixels_1 = html_common.convertDartToNative_ImageData(pixels);
+    this[_texSubImage2DImageData_1](target, level, xoffset, yoffset, format, type, pixels_1);
+    return;
+  }
+  [_texSubImage2DImageData_1](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DVideo](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.uniform1f](...args) {
+    return this.uniform1f.apply(this, args);
+  }
+  [dartx.uniform1fv](...args) {
+    return this.uniform1fv.apply(this, args);
+  }
+  [dartx.uniform1i](...args) {
+    return this.uniform1i.apply(this, args);
+  }
+  [dartx.uniform1iv](...args) {
+    return this.uniform1iv.apply(this, args);
+  }
+  [dartx.uniform2f](...args) {
+    return this.uniform2f.apply(this, args);
+  }
+  [dartx.uniform2fv](...args) {
+    return this.uniform2fv.apply(this, args);
+  }
+  [dartx.uniform2i](...args) {
+    return this.uniform2i.apply(this, args);
+  }
+  [dartx.uniform2iv](...args) {
+    return this.uniform2iv.apply(this, args);
+  }
+  [dartx.uniform3f](...args) {
+    return this.uniform3f.apply(this, args);
+  }
+  [dartx.uniform3fv](...args) {
+    return this.uniform3fv.apply(this, args);
+  }
+  [dartx.uniform3i](...args) {
+    return this.uniform3i.apply(this, args);
+  }
+  [dartx.uniform3iv](...args) {
+    return this.uniform3iv.apply(this, args);
+  }
+  [dartx.uniform4f](...args) {
+    return this.uniform4f.apply(this, args);
+  }
+  [dartx.uniform4fv](...args) {
+    return this.uniform4fv.apply(this, args);
+  }
+  [dartx.uniform4i](...args) {
+    return this.uniform4i.apply(this, args);
+  }
+  [dartx.uniform4iv](...args) {
+    return this.uniform4iv.apply(this, args);
+  }
+  [dartx.uniformMatrix2fv](...args) {
+    return this.uniformMatrix2fv.apply(this, args);
+  }
+  [dartx.uniformMatrix3fv](...args) {
+    return this.uniformMatrix3fv.apply(this, args);
+  }
+  [dartx.uniformMatrix4fv](...args) {
+    return this.uniformMatrix4fv.apply(this, args);
+  }
+  [dartx.useProgram](...args) {
+    return this.useProgram.apply(this, args);
+  }
+  [dartx.validateProgram](...args) {
+    return this.validateProgram.apply(this, args);
+  }
+  [dartx.vertexAttrib1f](...args) {
+    return this.vertexAttrib1f.apply(this, args);
+  }
+  [dartx.vertexAttrib1fv](...args) {
+    return this.vertexAttrib1fv.apply(this, args);
+  }
+  [dartx.vertexAttrib2f](...args) {
+    return this.vertexAttrib2f.apply(this, args);
+  }
+  [dartx.vertexAttrib2fv](...args) {
+    return this.vertexAttrib2fv.apply(this, args);
+  }
+  [dartx.vertexAttrib3f](...args) {
+    return this.vertexAttrib3f.apply(this, args);
+  }
+  [dartx.vertexAttrib3fv](...args) {
+    return this.vertexAttrib3fv.apply(this, args);
+  }
+  [dartx.vertexAttrib4f](...args) {
+    return this.vertexAttrib4f.apply(this, args);
+  }
+  [dartx.vertexAttrib4fv](...args) {
+    return this.vertexAttrib4fv.apply(this, args);
+  }
+  [dartx.vertexAttribPointer](...args) {
+    return this.vertexAttribPointer.apply(this, args);
+  }
+  [dartx.viewport](...args) {
+    return this.viewport.apply(this, args);
+  }
+  [dartx.texImage2DUntyped](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texImage2DTyped](...args) {
+    return this.texImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DUntyped](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+  [dartx.texSubImage2DTyped](...args) {
+    return this.texSubImage2D.apply(this, args);
+  }
+};
+web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
+dart.setSignature(web_gl.RenderingContext, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
+  fields: () => ({
+    [dartx.canvas]: html$.CanvasElement,
+    [dartx.drawingBufferHeight]: core.int,
+    [dartx.drawingBufferWidth]: core.int
+  }),
+  methods: () => ({
+    [dartx.activeTexture]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.attachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
+    [dartx.bindAttribLocation]: dart.definiteFunctionType(dart.void, [web_gl.Program, core.int, core.String]),
+    [dartx.bindBuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Buffer]),
+    [dartx.bindFramebuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Framebuffer]),
+    [dartx.bindRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Renderbuffer]),
+    [dartx.bindTexture]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Texture]),
+    [dartx.blendColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.blendEquation]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.blendEquationSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.blendFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.blendFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.bufferByteData]: dart.definiteFunctionType(dart.void, [core.int, typed_data.ByteBuffer, core.int]),
+    [dartx.bufferData]: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic, core.int]),
+    [dartx.bufferDataTyped]: dart.definiteFunctionType(dart.void, [core.int, typed_data.TypedData, core.int]),
+    [dartx.bufferSubByteData]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.ByteBuffer]),
+    [dartx.bufferSubData]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
+    [dartx.bufferSubDataTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.TypedData]),
+    [dartx.checkFramebufferStatus]: dart.definiteFunctionType(core.int, [core.int]),
+    [dartx.clear]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.clearColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
+    [dartx.clearDepth]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.clearStencil]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.colorMask]: dart.definiteFunctionType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
+    [dartx.compileShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
+    [dartx.compressedTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
+    [dartx.compressedTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
+    [dartx.copyTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
+    [dartx.copyTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
+    [dartx.createBuffer]: dart.definiteFunctionType(web_gl.Buffer, []),
+    [dartx.createFramebuffer]: dart.definiteFunctionType(web_gl.Framebuffer, []),
+    [dartx.createProgram]: dart.definiteFunctionType(web_gl.Program, []),
+    [dartx.createRenderbuffer]: dart.definiteFunctionType(web_gl.Renderbuffer, []),
+    [dartx.createShader]: dart.definiteFunctionType(web_gl.Shader, [core.int]),
+    [dartx.createTexture]: dart.definiteFunctionType(web_gl.Texture, []),
+    [dartx.cullFace]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.deleteBuffer]: dart.definiteFunctionType(dart.void, [web_gl.Buffer]),
+    [dartx.deleteFramebuffer]: dart.definiteFunctionType(dart.void, [web_gl.Framebuffer]),
+    [dartx.deleteProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
+    [dartx.deleteRenderbuffer]: dart.definiteFunctionType(dart.void, [web_gl.Renderbuffer]),
+    [dartx.deleteShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
+    [dartx.deleteTexture]: dart.definiteFunctionType(dart.void, [web_gl.Texture]),
+    [dartx.depthFunc]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.depthMask]: dart.definiteFunctionType(dart.void, [core.bool]),
+    [dartx.depthRange]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.detachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
+    [dartx.disable]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.disableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.drawArrays]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
+    [dartx.drawElements]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.enable]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.enableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.finish]: dart.definiteFunctionType(dart.void, []),
+    [dartx.flush]: dart.definiteFunctionType(dart.void, []),
+    [dartx.framebufferRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
+    [dartx.framebufferTexture2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
+    [dartx.frontFace]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.generateMipmap]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.getActiveAttrib]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
+    [dartx.getActiveUniform]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
+    [dartx.getAttachedShaders]: dart.definiteFunctionType(core.List$(web_gl.Shader), [web_gl.Program]),
+    [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
+    [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
+    [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
+    [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
+    [dartx.getError]: dart.definiteFunctionType(core.int, []),
+    [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
+    [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
+    [dartx.getParameter]: dart.definiteFunctionType(core.Object, [core.int]),
+    [dartx.getProgramInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Program]),
+    [dartx.getProgramParameter]: dart.definiteFunctionType(core.Object, [web_gl.Program, core.int]),
+    [dartx.getRenderbufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
+    [dartx.getShaderInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
+    [dartx.getShaderParameter]: dart.definiteFunctionType(core.Object, [web_gl.Shader, core.int]),
+    [dartx.getShaderPrecisionFormat]: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
+    [dartx.getShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
+    [dartx.getSupportedExtensions]: dart.definiteFunctionType(core.List$(core.String), []),
+    [dartx.getTexParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
+    [dartx.getUniform]: dart.definiteFunctionType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
+    [dartx.getUniformLocation]: dart.definiteFunctionType(web_gl.UniformLocation, [web_gl.Program, core.String]),
+    [dartx.getVertexAttrib]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
+    [dartx.getVertexAttribOffset]: dart.definiteFunctionType(core.int, [core.int, core.int]),
+    [dartx.hint]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.isBuffer]: dart.definiteFunctionType(core.bool, [web_gl.Buffer]),
+    [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
+    [dartx.isEnabled]: dart.definiteFunctionType(core.bool, [core.int]),
+    [dartx.isFramebuffer]: dart.definiteFunctionType(core.bool, [web_gl.Framebuffer]),
+    [dartx.isProgram]: dart.definiteFunctionType(core.bool, [web_gl.Program]),
+    [dartx.isRenderbuffer]: dart.definiteFunctionType(core.bool, [web_gl.Renderbuffer]),
+    [dartx.isShader]: dart.definiteFunctionType(core.bool, [web_gl.Shader]),
+    [dartx.isTexture]: dart.definiteFunctionType(core.bool, [web_gl.Texture]),
+    [dartx.lineWidth]: dart.definiteFunctionType(dart.void, [core.num]),
+    [dartx.linkProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
+    [dartx.pixelStorei]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.polygonOffset]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
+    [dartx.readPixels]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
+    [dartx.renderbufferStorage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.sampleCoverage]: dart.definiteFunctionType(dart.void, [core.num, core.bool]),
+    [dartx.scissor]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.shaderSource]: dart.definiteFunctionType(dart.void, [web_gl.Shader, core.String]),
+    [dartx.stencilFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
+    [dartx.stencilFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.stencilMask]: dart.definiteFunctionType(dart.void, [core.int]),
+    [dartx.stencilMaskSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
+    [dartx.stencilOp]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
+    [dartx.stencilOpSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
+    [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
+    [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
+    [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
+    [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
+    [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
+    [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
+    [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
+    [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
+    [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
+    [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
+    [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
+    [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
+    [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
+    [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
+    [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
+    [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
+    [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
+    [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
+    [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
+    [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
+    [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
+    [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
+    [dartx.uniform1iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
+    [dartx.uniform2f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
+    [dartx.uniform2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
+    [dartx.uniform2i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
+    [dartx.uniform2iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
+    [dartx.uniform3f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
+    [dartx.uniform3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
+    [dartx.uniform3i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
+    [dartx.uniform3iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
+    [dartx.uniform4f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
+    [dartx.uniform4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
+    [dartx.uniform4i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
+    [dartx.uniform4iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
+    [dartx.uniformMatrix2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
+    [dartx.uniformMatrix3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
+    [dartx.uniformMatrix4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
+    [dartx.useProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
+    [dartx.validateProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
+    [dartx.vertexAttrib1f]: dart.definiteFunctionType(dart.void, [core.int, core.num]),
+    [dartx.vertexAttrib1fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
+    [dartx.vertexAttrib2f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num]),
+    [dartx.vertexAttrib2fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
+    [dartx.vertexAttrib3f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num]),
+    [dartx.vertexAttrib3fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
+    [dartx.vertexAttrib4f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
+    [dartx.vertexAttrib4fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
+    [dartx.vertexAttribPointer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
+    [dartx.viewport]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.texImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
+    [dartx.texImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
+    [dartx.texSubImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
+    [dartx.texSubImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
+  }),
+  sfields: () => ({
+    ACTIVE_ATTRIBUTES: core.int,
+    ACTIVE_TEXTURE: core.int,
+    ACTIVE_UNIFORMS: core.int,
+    ALIASED_LINE_WIDTH_RANGE: core.int,
+    ALIASED_POINT_SIZE_RANGE: core.int,
+    ALPHA: core.int,
+    ALPHA_BITS: core.int,
+    ALWAYS: core.int,
+    ARRAY_BUFFER: core.int,
+    ARRAY_BUFFER_BINDING: core.int,
+    ATTACHED_SHADERS: core.int,
+    BACK: core.int,
+    BLEND: core.int,
+    BLEND_COLOR: core.int,
+    BLEND_DST_ALPHA: core.int,
+    BLEND_DST_RGB: core.int,
+    BLEND_EQUATION: core.int,
+    BLEND_EQUATION_ALPHA: core.int,
+    BLEND_EQUATION_RGB: core.int,
+    BLEND_SRC_ALPHA: core.int,
+    BLEND_SRC_RGB: core.int,
+    BLUE_BITS: core.int,
+    BOOL: core.int,
+    BOOL_VEC2: core.int,
+    BOOL_VEC3: core.int,
+    BOOL_VEC4: core.int,
+    BROWSER_DEFAULT_WEBGL: core.int,
+    BUFFER_SIZE: core.int,
+    BUFFER_USAGE: core.int,
+    BYTE: core.int,
+    CCW: core.int,
+    CLAMP_TO_EDGE: core.int,
+    COLOR_ATTACHMENT0: core.int,
+    COLOR_BUFFER_BIT: core.int,
+    COLOR_CLEAR_VALUE: core.int,
+    COLOR_WRITEMASK: core.int,
+    COMPILE_STATUS: core.int,
+    COMPRESSED_TEXTURE_FORMATS: core.int,
+    CONSTANT_ALPHA: core.int,
+    CONSTANT_COLOR: core.int,
+    CONTEXT_LOST_WEBGL: core.int,
+    CULL_FACE: core.int,
+    CULL_FACE_MODE: core.int,
+    CURRENT_PROGRAM: core.int,
+    CURRENT_VERTEX_ATTRIB: core.int,
+    CW: core.int,
+    DECR: core.int,
+    DECR_WRAP: core.int,
+    DELETE_STATUS: core.int,
+    DEPTH_ATTACHMENT: core.int,
+    DEPTH_BITS: core.int,
+    DEPTH_BUFFER_BIT: core.int,
+    DEPTH_CLEAR_VALUE: core.int,
+    DEPTH_COMPONENT: core.int,
+    DEPTH_COMPONENT16: core.int,
+    DEPTH_FUNC: core.int,
+    DEPTH_RANGE: core.int,
+    DEPTH_STENCIL: core.int,
+    DEPTH_STENCIL_ATTACHMENT: core.int,
+    DEPTH_TEST: core.int,
+    DEPTH_WRITEMASK: core.int,
+    DITHER: core.int,
+    DONT_CARE: core.int,
+    DST_ALPHA: core.int,
+    DST_COLOR: core.int,
+    DYNAMIC_DRAW: core.int,
+    ELEMENT_ARRAY_BUFFER: core.int,
+    ELEMENT_ARRAY_BUFFER_BINDING: core.int,
+    EQUAL: core.int,
+    FASTEST: core.int,
+    FLOAT: core.int,
+    FLOAT_MAT2: core.int,
+    FLOAT_MAT3: core.int,
+    FLOAT_MAT4: core.int,
+    FLOAT_VEC2: core.int,
+    FLOAT_VEC3: core.int,
+    FLOAT_VEC4: core.int,
+    FRAGMENT_SHADER: core.int,
+    FRAMEBUFFER: core.int,
+    FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: core.int,
+    FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: core.int,
+    FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: core.int,
+    FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: core.int,
+    FRAMEBUFFER_BINDING: core.int,
+    FRAMEBUFFER_COMPLETE: core.int,
+    FRAMEBUFFER_INCOMPLETE_ATTACHMENT: core.int,
+    FRAMEBUFFER_INCOMPLETE_DIMENSIONS: core.int,
+    FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: core.int,
+    FRAMEBUFFER_UNSUPPORTED: core.int,
+    FRONT: core.int,
+    FRONT_AND_BACK: core.int,
+    FRONT_FACE: core.int,
+    FUNC_ADD: core.int,
+    FUNC_REVERSE_SUBTRACT: core.int,
+    FUNC_SUBTRACT: core.int,
+    GENERATE_MIPMAP_HINT: core.int,
+    GEQUAL: core.int,
+    GREATER: core.int,
+    GREEN_BITS: core.int,
+    HIGH_FLOAT: core.int,
+    HIGH_INT: core.int,
+    IMPLEMENTATION_COLOR_READ_FORMAT: core.int,
+    IMPLEMENTATION_COLOR_READ_TYPE: core.int,
+    INCR: core.int,
+    INCR_WRAP: core.int,
+    INT: core.int,
+    INT_VEC2: core.int,
+    INT_VEC3: core.int,
+    INT_VEC4: core.int,
+    INVALID_ENUM: core.int,
+    INVALID_FRAMEBUFFER_OPERATION: core.int,
+    INVALID_OPERATION: core.int,
+    INVALID_VALUE: core.int,
+    INVERT: core.int,
+    KEEP: core.int,
+    LEQUAL: core.int,
+    LESS: core.int,
+    LINEAR: core.int,
+    LINEAR_MIPMAP_LINEAR: core.int,
+    LINEAR_MIPMAP_NEAREST: core.int,
+    LINES: core.int,
+    LINE_LOOP: core.int,
+    LINE_STRIP: core.int,
+    LINE_WIDTH: core.int,
+    LINK_STATUS: core.int,
+    LOW_FLOAT: core.int,
+    LOW_INT: core.int,
+    LUMINANCE: core.int,
+    LUMINANCE_ALPHA: core.int,
+    MAX_COMBINED_TEXTURE_IMAGE_UNITS: core.int,
+    MAX_CUBE_MAP_TEXTURE_SIZE: core.int,
+    MAX_FRAGMENT_UNIFORM_VECTORS: core.int,
+    MAX_RENDERBUFFER_SIZE: core.int,
+    MAX_TEXTURE_IMAGE_UNITS: core.int,
+    MAX_TEXTURE_SIZE: core.int,
+    MAX_VARYING_VECTORS: core.int,
+    MAX_VERTEX_ATTRIBS: core.int,
+    MAX_VERTEX_TEXTURE_IMAGE_UNITS: core.int,
+    MAX_VERTEX_UNIFORM_VECTORS: core.int,
+    MAX_VIEWPORT_DIMS: core.int,
+    MEDIUM_FLOAT: core.int,
+    MEDIUM_INT: core.int,
+    MIRRORED_REPEAT: core.int,
+    NEAREST: core.int,
+    NEAREST_MIPMAP_LINEAR: core.int,
+    NEAREST_MIPMAP_NEAREST: core.int,
+    NEVER: core.int,
+    NICEST: core.int,
+    NONE: core.int,
+    NOTEQUAL: core.int,
+    NO_ERROR: core.int,
+    ONE: core.int,
+    ONE_MINUS_CONSTANT_ALPHA: core.int,
+    ONE_MINUS_CONSTANT_COLOR: core.int,
+    ONE_MINUS_DST_ALPHA: core.int,
+    ONE_MINUS_DST_COLOR: core.int,
+    ONE_MINUS_SRC_ALPHA: core.int,
+    ONE_MINUS_SRC_COLOR: core.int,
+    OUT_OF_MEMORY: core.int,
+    PACK_ALIGNMENT: core.int,
+    POINTS: core.int,
+    POLYGON_OFFSET_FACTOR: core.int,
+    POLYGON_OFFSET_FILL: core.int,
+    POLYGON_OFFSET_UNITS: core.int,
+    RED_BITS: core.int,
+    RENDERBUFFER: core.int,
+    RENDERBUFFER_ALPHA_SIZE: core.int,
+    RENDERBUFFER_BINDING: core.int,
+    RENDERBUFFER_BLUE_SIZE: core.int,
+    RENDERBUFFER_DEPTH_SIZE: core.int,
+    RENDERBUFFER_GREEN_SIZE: core.int,
+    RENDERBUFFER_HEIGHT: core.int,
+    RENDERBUFFER_INTERNAL_FORMAT: core.int,
+    RENDERBUFFER_RED_SIZE: core.int,
+    RENDERBUFFER_STENCIL_SIZE: core.int,
+    RENDERBUFFER_WIDTH: core.int,
+    RENDERER: core.int,
+    REPEAT: core.int,
+    REPLACE: core.int,
+    RGB: core.int,
+    RGB565: core.int,
+    RGB5_A1: core.int,
+    RGBA: core.int,
+    RGBA4: core.int,
+    SAMPLER_2D: core.int,
+    SAMPLER_CUBE: core.int,
+    SAMPLES: core.int,
+    SAMPLE_ALPHA_TO_COVERAGE: core.int,
+    SAMPLE_BUFFERS: core.int,
+    SAMPLE_COVERAGE: core.int,
+    SAMPLE_COVERAGE_INVERT: core.int,
+    SAMPLE_COVERAGE_VALUE: core.int,
+    SCISSOR_BOX: core.int,
+    SCISSOR_TEST: core.int,
+    SHADER_TYPE: core.int,
+    SHADING_LANGUAGE_VERSION: core.int,
+    SHORT: core.int,
+    SRC_ALPHA: core.int,
+    SRC_ALPHA_SATURATE: core.int,
+    SRC_COLOR: core.int,
+    STATIC_DRAW: core.int,
+    STENCIL_ATTACHMENT: core.int,
+    STENCIL_BACK_FAIL: core.int,
+    STENCIL_BACK_FUNC: core.int,
+    STENCIL_BACK_PASS_DEPTH_FAIL: core.int,
+    STENCIL_BACK_PASS_DEPTH_PASS: core.int,
+    STENCIL_BACK_REF: core.int,
+    STENCIL_BACK_VALUE_MASK: core.int,
+    STENCIL_BACK_WRITEMASK: core.int,
+    STENCIL_BITS: core.int,
+    STENCIL_BUFFER_BIT: core.int,
+    STENCIL_CLEAR_VALUE: core.int,
+    STENCIL_FAIL: core.int,
+    STENCIL_FUNC: core.int,
+    STENCIL_INDEX: core.int,
+    STENCIL_INDEX8: core.int,
+    STENCIL_PASS_DEPTH_FAIL: core.int,
+    STENCIL_PASS_DEPTH_PASS: core.int,
+    STENCIL_REF: core.int,
+    STENCIL_TEST: core.int,
+    STENCIL_VALUE_MASK: core.int,
+    STENCIL_WRITEMASK: core.int,
+    STREAM_DRAW: core.int,
+    SUBPIXEL_BITS: core.int,
+    TEXTURE: core.int,
+    TEXTURE0: core.int,
+    TEXTURE1: core.int,
+    TEXTURE10: core.int,
+    TEXTURE11: core.int,
+    TEXTURE12: core.int,
+    TEXTURE13: core.int,
+    TEXTURE14: core.int,
+    TEXTURE15: core.int,
+    TEXTURE16: core.int,
+    TEXTURE17: core.int,
+    TEXTURE18: core.int,
+    TEXTURE19: core.int,
+    TEXTURE2: core.int,
+    TEXTURE20: core.int,
+    TEXTURE21: core.int,
+    TEXTURE22: core.int,
+    TEXTURE23: core.int,
+    TEXTURE24: core.int,
+    TEXTURE25: core.int,
+    TEXTURE26: core.int,
+    TEXTURE27: core.int,
+    TEXTURE28: core.int,
+    TEXTURE29: core.int,
+    TEXTURE3: core.int,
+    TEXTURE30: core.int,
+    TEXTURE31: core.int,
+    TEXTURE4: core.int,
+    TEXTURE5: core.int,
+    TEXTURE6: core.int,
+    TEXTURE7: core.int,
+    TEXTURE8: core.int,
+    TEXTURE9: core.int,
+    TEXTURE_2D: core.int,
+    TEXTURE_BINDING_2D: core.int,
+    TEXTURE_BINDING_CUBE_MAP: core.int,
+    TEXTURE_CUBE_MAP: core.int,
+    TEXTURE_CUBE_MAP_NEGATIVE_X: core.int,
+    TEXTURE_CUBE_MAP_NEGATIVE_Y: core.int,
+    TEXTURE_CUBE_MAP_NEGATIVE_Z: core.int,
+    TEXTURE_CUBE_MAP_POSITIVE_X: core.int,
+    TEXTURE_CUBE_MAP_POSITIVE_Y: core.int,
+    TEXTURE_CUBE_MAP_POSITIVE_Z: core.int,
+    TEXTURE_MAG_FILTER: core.int,
+    TEXTURE_MIN_FILTER: core.int,
+    TEXTURE_WRAP_S: core.int,
+    TEXTURE_WRAP_T: core.int,
+    TRIANGLES: core.int,
+    TRIANGLE_FAN: core.int,
+    TRIANGLE_STRIP: core.int,
+    UNPACK_ALIGNMENT: core.int,
+    UNPACK_COLORSPACE_CONVERSION_WEBGL: core.int,
+    UNPACK_FLIP_Y_WEBGL: core.int,
+    UNPACK_PREMULTIPLY_ALPHA_WEBGL: core.int,
+    UNSIGNED_BYTE: core.int,
+    UNSIGNED_INT: core.int,
+    UNSIGNED_SHORT: core.int,
+    UNSIGNED_SHORT_4_4_4_4: core.int,
+    UNSIGNED_SHORT_5_5_5_1: core.int,
+    UNSIGNED_SHORT_5_6_5: core.int,
+    VALIDATE_STATUS: core.int,
+    VENDOR: core.int,
+    VERSION: core.int,
+    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: core.int,
+    VERTEX_ATTRIB_ARRAY_ENABLED: core.int,
+    VERTEX_ATTRIB_ARRAY_NORMALIZED: core.int,
+    VERTEX_ATTRIB_ARRAY_POINTER: core.int,
+    VERTEX_ATTRIB_ARRAY_SIZE: core.int,
+    VERTEX_ATTRIB_ARRAY_STRIDE: core.int,
+    VERTEX_ATTRIB_ARRAY_TYPE: core.int,
+    VERTEX_SHADER: core.int,
+    VIEWPORT: core.int,
+    ZERO: core.int
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+web_gl.RenderingContext.ACTIVE_ATTRIBUTES = 35721;
+web_gl.RenderingContext.ACTIVE_TEXTURE = 34016;
+web_gl.RenderingContext.ACTIVE_UNIFORMS = 35718;
+web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE = 33902;
+web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE = 33901;
+web_gl.RenderingContext.ALPHA = 6406;
+web_gl.RenderingContext.ALPHA_BITS = 3413;
+web_gl.RenderingContext.ALWAYS = 519;
+web_gl.RenderingContext.ARRAY_BUFFER = 34962;
+web_gl.RenderingContext.ARRAY_BUFFER_BINDING = 34964;
+web_gl.RenderingContext.ATTACHED_SHADERS = 35717;
+web_gl.RenderingContext.BACK = 1029;
+web_gl.RenderingContext.BLEND = 3042;
+web_gl.RenderingContext.BLEND_COLOR = 32773;
+web_gl.RenderingContext.BLEND_DST_ALPHA = 32970;
+web_gl.RenderingContext.BLEND_DST_RGB = 32968;
+web_gl.RenderingContext.BLEND_EQUATION = 32777;
+web_gl.RenderingContext.BLEND_EQUATION_ALPHA = 34877;
+web_gl.RenderingContext.BLEND_EQUATION_RGB = 32777;
+web_gl.RenderingContext.BLEND_SRC_ALPHA = 32971;
+web_gl.RenderingContext.BLEND_SRC_RGB = 32969;
+web_gl.RenderingContext.BLUE_BITS = 3412;
+web_gl.RenderingContext.BOOL = 35670;
+web_gl.RenderingContext.BOOL_VEC2 = 35671;
+web_gl.RenderingContext.BOOL_VEC3 = 35672;
+web_gl.RenderingContext.BOOL_VEC4 = 35673;
+web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL = 37444;
+web_gl.RenderingContext.BUFFER_SIZE = 34660;
+web_gl.RenderingContext.BUFFER_USAGE = 34661;
+web_gl.RenderingContext.BYTE = 5120;
+web_gl.RenderingContext.CCW = 2305;
+web_gl.RenderingContext.CLAMP_TO_EDGE = 33071;
+web_gl.RenderingContext.COLOR_ATTACHMENT0 = 36064;
+web_gl.RenderingContext.COLOR_BUFFER_BIT = 16384;
+web_gl.RenderingContext.COLOR_CLEAR_VALUE = 3106;
+web_gl.RenderingContext.COLOR_WRITEMASK = 3107;
+web_gl.RenderingContext.COMPILE_STATUS = 35713;
+web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS = 34467;
+web_gl.RenderingContext.CONSTANT_ALPHA = 32771;
+web_gl.RenderingContext.CONSTANT_COLOR = 32769;
+web_gl.RenderingContext.CONTEXT_LOST_WEBGL = 37442;
+web_gl.RenderingContext.CULL_FACE = 2884;
+web_gl.RenderingContext.CULL_FACE_MODE = 2885;
+web_gl.RenderingContext.CURRENT_PROGRAM = 35725;
+web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB = 34342;
+web_gl.RenderingContext.CW = 2304;
+web_gl.RenderingContext.DECR = 7683;
+web_gl.RenderingContext.DECR_WRAP = 34056;
+web_gl.RenderingContext.DELETE_STATUS = 35712;
+web_gl.RenderingContext.DEPTH_ATTACHMENT = 36096;
+web_gl.RenderingContext.DEPTH_BITS = 3414;
+web_gl.RenderingContext.DEPTH_BUFFER_BIT = 256;
+web_gl.RenderingContext.DEPTH_CLEAR_VALUE = 2931;
+web_gl.RenderingContext.DEPTH_COMPONENT = 6402;
+web_gl.RenderingContext.DEPTH_COMPONENT16 = 33189;
+web_gl.RenderingContext.DEPTH_FUNC = 2932;
+web_gl.RenderingContext.DEPTH_RANGE = 2928;
+web_gl.RenderingContext.DEPTH_STENCIL = 34041;
+web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT = 33306;
+web_gl.RenderingContext.DEPTH_TEST = 2929;
+web_gl.RenderingContext.DEPTH_WRITEMASK = 2930;
+web_gl.RenderingContext.DITHER = 3024;
+web_gl.RenderingContext.DONT_CARE = 4352;
+web_gl.RenderingContext.DST_ALPHA = 772;
+web_gl.RenderingContext.DST_COLOR = 774;
+web_gl.RenderingContext.DYNAMIC_DRAW = 35048;
+web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER = 34963;
+web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING = 34965;
+web_gl.RenderingContext.EQUAL = 514;
+web_gl.RenderingContext.FASTEST = 4353;
+web_gl.RenderingContext.FLOAT = 5126;
+web_gl.RenderingContext.FLOAT_MAT2 = 35674;
+web_gl.RenderingContext.FLOAT_MAT3 = 35675;
+web_gl.RenderingContext.FLOAT_MAT4 = 35676;
+web_gl.RenderingContext.FLOAT_VEC2 = 35664;
+web_gl.RenderingContext.FLOAT_VEC3 = 35665;
+web_gl.RenderingContext.FLOAT_VEC4 = 35666;
+web_gl.RenderingContext.FRAGMENT_SHADER = 35632;
+web_gl.RenderingContext.FRAMEBUFFER = 36160;
+web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049;
+web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048;
+web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051;
+web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050;
+web_gl.RenderingContext.FRAMEBUFFER_BINDING = 36006;
+web_gl.RenderingContext.FRAMEBUFFER_COMPLETE = 36053;
+web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054;
+web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057;
+web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055;
+web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED = 36061;
+web_gl.RenderingContext.FRONT = 1028;
+web_gl.RenderingContext.FRONT_AND_BACK = 1032;
+web_gl.RenderingContext.FRONT_FACE = 2886;
+web_gl.RenderingContext.FUNC_ADD = 32774;
+web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT = 32779;
+web_gl.RenderingContext.FUNC_SUBTRACT = 32778;
+web_gl.RenderingContext.GENERATE_MIPMAP_HINT = 33170;
+web_gl.RenderingContext.GEQUAL = 518;
+web_gl.RenderingContext.GREATER = 516;
+web_gl.RenderingContext.GREEN_BITS = 3411;
+web_gl.RenderingContext.HIGH_FLOAT = 36338;
+web_gl.RenderingContext.HIGH_INT = 36341;
+web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT = 35739;
+web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE = 35738;
+web_gl.RenderingContext.INCR = 7682;
+web_gl.RenderingContext.INCR_WRAP = 34055;
+web_gl.RenderingContext.INT = 5124;
+web_gl.RenderingContext.INT_VEC2 = 35667;
+web_gl.RenderingContext.INT_VEC3 = 35668;
+web_gl.RenderingContext.INT_VEC4 = 35669;
+web_gl.RenderingContext.INVALID_ENUM = 1280;
+web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION = 1286;
+web_gl.RenderingContext.INVALID_OPERATION = 1282;
+web_gl.RenderingContext.INVALID_VALUE = 1281;
+web_gl.RenderingContext.INVERT = 5386;
+web_gl.RenderingContext.KEEP = 7680;
+web_gl.RenderingContext.LEQUAL = 515;
+web_gl.RenderingContext.LESS = 513;
+web_gl.RenderingContext.LINEAR = 9729;
+web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR = 9987;
+web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST = 9985;
+web_gl.RenderingContext.LINES = 1;
+web_gl.RenderingContext.LINE_LOOP = 2;
+web_gl.RenderingContext.LINE_STRIP = 3;
+web_gl.RenderingContext.LINE_WIDTH = 2849;
+web_gl.RenderingContext.LINK_STATUS = 35714;
+web_gl.RenderingContext.LOW_FLOAT = 36336;
+web_gl.RenderingContext.LOW_INT = 36339;
+web_gl.RenderingContext.LUMINANCE = 6409;
+web_gl.RenderingContext.LUMINANCE_ALPHA = 6410;
+web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
+web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
+web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS = 36349;
+web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE = 34024;
+web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS = 34930;
+web_gl.RenderingContext.MAX_TEXTURE_SIZE = 3379;
+web_gl.RenderingContext.MAX_VARYING_VECTORS = 36348;
+web_gl.RenderingContext.MAX_VERTEX_ATTRIBS = 34921;
+web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
+web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS = 36347;
+web_gl.RenderingContext.MAX_VIEWPORT_DIMS = 3386;
+web_gl.RenderingContext.MEDIUM_FLOAT = 36337;
+web_gl.RenderingContext.MEDIUM_INT = 36340;
+web_gl.RenderingContext.MIRRORED_REPEAT = 33648;
+web_gl.RenderingContext.NEAREST = 9728;
+web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR = 9986;
+web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST = 9984;
+web_gl.RenderingContext.NEVER = 512;
+web_gl.RenderingContext.NICEST = 4354;
+web_gl.RenderingContext.NONE = 0;
+web_gl.RenderingContext.NOTEQUAL = 517;
+web_gl.RenderingContext.NO_ERROR = 0;
+web_gl.RenderingContext.ONE = 1;
+web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA = 32772;
+web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR = 32770;
+web_gl.RenderingContext.ONE_MINUS_DST_ALPHA = 773;
+web_gl.RenderingContext.ONE_MINUS_DST_COLOR = 775;
+web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA = 771;
+web_gl.RenderingContext.ONE_MINUS_SRC_COLOR = 769;
+web_gl.RenderingContext.OUT_OF_MEMORY = 1285;
+web_gl.RenderingContext.PACK_ALIGNMENT = 3333;
+web_gl.RenderingContext.POINTS = 0;
+web_gl.RenderingContext.POLYGON_OFFSET_FACTOR = 32824;
+web_gl.RenderingContext.POLYGON_OFFSET_FILL = 32823;
+web_gl.RenderingContext.POLYGON_OFFSET_UNITS = 10752;
+web_gl.RenderingContext.RED_BITS = 3410;
+web_gl.RenderingContext.RENDERBUFFER = 36161;
+web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE = 36179;
+web_gl.RenderingContext.RENDERBUFFER_BINDING = 36007;
+web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE = 36178;
+web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE = 36180;
+web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE = 36177;
+web_gl.RenderingContext.RENDERBUFFER_HEIGHT = 36163;
+web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT = 36164;
+web_gl.RenderingContext.RENDERBUFFER_RED_SIZE = 36176;
+web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE = 36181;
+web_gl.RenderingContext.RENDERBUFFER_WIDTH = 36162;
+web_gl.RenderingContext.RENDERER = 7937;
+web_gl.RenderingContext.REPEAT = 10497;
+web_gl.RenderingContext.REPLACE = 7681;
+web_gl.RenderingContext.RGB = 6407;
+web_gl.RenderingContext.RGB565 = 36194;
+web_gl.RenderingContext.RGB5_A1 = 32855;
+web_gl.RenderingContext.RGBA = 6408;
+web_gl.RenderingContext.RGBA4 = 32854;
+web_gl.RenderingContext.SAMPLER_2D = 35678;
+web_gl.RenderingContext.SAMPLER_CUBE = 35680;
+web_gl.RenderingContext.SAMPLES = 32937;
+web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE = 32926;
+web_gl.RenderingContext.SAMPLE_BUFFERS = 32936;
+web_gl.RenderingContext.SAMPLE_COVERAGE = 32928;
+web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT = 32939;
+web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE = 32938;
+web_gl.RenderingContext.SCISSOR_BOX = 3088;
+web_gl.RenderingContext.SCISSOR_TEST = 3089;
+web_gl.RenderingContext.SHADER_TYPE = 35663;
+web_gl.RenderingContext.SHADING_LANGUAGE_VERSION = 35724;
+web_gl.RenderingContext.SHORT = 5122;
+web_gl.RenderingContext.SRC_ALPHA = 770;
+web_gl.RenderingContext.SRC_ALPHA_SATURATE = 776;
+web_gl.RenderingContext.SRC_COLOR = 768;
+web_gl.RenderingContext.STATIC_DRAW = 35044;
+web_gl.RenderingContext.STENCIL_ATTACHMENT = 36128;
+web_gl.RenderingContext.STENCIL_BACK_FAIL = 34817;
+web_gl.RenderingContext.STENCIL_BACK_FUNC = 34816;
+web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
+web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS = 34819;
+web_gl.RenderingContext.STENCIL_BACK_REF = 36003;
+web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK = 36004;
+web_gl.RenderingContext.STENCIL_BACK_WRITEMASK = 36005;
+web_gl.RenderingContext.STENCIL_BITS = 3415;
+web_gl.RenderingContext.STENCIL_BUFFER_BIT = 1024;
+web_gl.RenderingContext.STENCIL_CLEAR_VALUE = 2961;
+web_gl.RenderingContext.STENCIL_FAIL = 2964;
+web_gl.RenderingContext.STENCIL_FUNC = 2962;
+web_gl.RenderingContext.STENCIL_INDEX = 6401;
+web_gl.RenderingContext.STENCIL_INDEX8 = 36168;
+web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL = 2965;
+web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS = 2966;
+web_gl.RenderingContext.STENCIL_REF = 2967;
+web_gl.RenderingContext.STENCIL_TEST = 2960;
+web_gl.RenderingContext.STENCIL_VALUE_MASK = 2963;
+web_gl.RenderingContext.STENCIL_WRITEMASK = 2968;
+web_gl.RenderingContext.STREAM_DRAW = 35040;
+web_gl.RenderingContext.SUBPIXEL_BITS = 3408;
+web_gl.RenderingContext.TEXTURE = 5890;
+web_gl.RenderingContext.TEXTURE0 = 33984;
+web_gl.RenderingContext.TEXTURE1 = 33985;
+web_gl.RenderingContext.TEXTURE10 = 33994;
+web_gl.RenderingContext.TEXTURE11 = 33995;
+web_gl.RenderingContext.TEXTURE12 = 33996;
+web_gl.RenderingContext.TEXTURE13 = 33997;
+web_gl.RenderingContext.TEXTURE14 = 33998;
+web_gl.RenderingContext.TEXTURE15 = 33999;
+web_gl.RenderingContext.TEXTURE16 = 34000;
+web_gl.RenderingContext.TEXTURE17 = 34001;
+web_gl.RenderingContext.TEXTURE18 = 34002;
+web_gl.RenderingContext.TEXTURE19 = 34003;
+web_gl.RenderingContext.TEXTURE2 = 33986;
+web_gl.RenderingContext.TEXTURE20 = 34004;
+web_gl.RenderingContext.TEXTURE21 = 34005;
+web_gl.RenderingContext.TEXTURE22 = 34006;
+web_gl.RenderingContext.TEXTURE23 = 34007;
+web_gl.RenderingContext.TEXTURE24 = 34008;
+web_gl.RenderingContext.TEXTURE25 = 34009;
+web_gl.RenderingContext.TEXTURE26 = 34010;
+web_gl.RenderingContext.TEXTURE27 = 34011;
+web_gl.RenderingContext.TEXTURE28 = 34012;
+web_gl.RenderingContext.TEXTURE29 = 34013;
+web_gl.RenderingContext.TEXTURE3 = 33987;
+web_gl.RenderingContext.TEXTURE30 = 34014;
+web_gl.RenderingContext.TEXTURE31 = 34015;
+web_gl.RenderingContext.TEXTURE4 = 33988;
+web_gl.RenderingContext.TEXTURE5 = 33989;
+web_gl.RenderingContext.TEXTURE6 = 33990;
+web_gl.RenderingContext.TEXTURE7 = 33991;
+web_gl.RenderingContext.TEXTURE8 = 33992;
+web_gl.RenderingContext.TEXTURE9 = 33993;
+web_gl.RenderingContext.TEXTURE_2D = 3553;
+web_gl.RenderingContext.TEXTURE_BINDING_2D = 32873;
+web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP = 34068;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP = 34067;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
+web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
+web_gl.RenderingContext.TEXTURE_MAG_FILTER = 10240;
+web_gl.RenderingContext.TEXTURE_MIN_FILTER = 10241;
+web_gl.RenderingContext.TEXTURE_WRAP_S = 10242;
+web_gl.RenderingContext.TEXTURE_WRAP_T = 10243;
+web_gl.RenderingContext.TRIANGLES = 4;
+web_gl.RenderingContext.TRIANGLE_FAN = 6;
+web_gl.RenderingContext.TRIANGLE_STRIP = 5;
+web_gl.RenderingContext.UNPACK_ALIGNMENT = 3317;
+web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443;
+web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL = 37440;
+web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441;
+web_gl.RenderingContext.UNSIGNED_BYTE = 5121;
+web_gl.RenderingContext.UNSIGNED_INT = 5125;
+web_gl.RenderingContext.UNSIGNED_SHORT = 5123;
+web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4 = 32819;
+web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1 = 32820;
+web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5 = 33635;
+web_gl.RenderingContext.VALIDATE_STATUS = 35715;
+web_gl.RenderingContext.VENDOR = 7936;
+web_gl.RenderingContext.VERSION = 7938;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER = 34373;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE = 34339;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
+web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE = 34341;
+web_gl.RenderingContext.VERTEX_SHADER = 35633;
+web_gl.RenderingContext.VIEWPORT = 2978;
+web_gl.RenderingContext.ZERO = 0;
+dart.registerExtension(dart.global.WebGLRenderingContext, web_gl.RenderingContext);
+web_gl.ACTIVE_ATTRIBUTES = web_gl.RenderingContext.ACTIVE_ATTRIBUTES;
+web_gl.ACTIVE_TEXTURE = web_gl.RenderingContext.ACTIVE_TEXTURE;
+web_gl.ACTIVE_UNIFORMS = web_gl.RenderingContext.ACTIVE_UNIFORMS;
+web_gl.ALIASED_LINE_WIDTH_RANGE = web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE;
+web_gl.ALIASED_POINT_SIZE_RANGE = web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE;
+web_gl.ALPHA = web_gl.RenderingContext.ALPHA;
+web_gl.ALPHA_BITS = web_gl.RenderingContext.ALPHA_BITS;
+web_gl.ALWAYS = web_gl.RenderingContext.ALWAYS;
+web_gl.ARRAY_BUFFER = web_gl.RenderingContext.ARRAY_BUFFER;
+web_gl.ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ARRAY_BUFFER_BINDING;
+web_gl.ATTACHED_SHADERS = web_gl.RenderingContext.ATTACHED_SHADERS;
+web_gl.BACK = web_gl.RenderingContext.BACK;
+web_gl.BLEND = web_gl.RenderingContext.BLEND;
+web_gl.BLEND_COLOR = web_gl.RenderingContext.BLEND_COLOR;
+web_gl.BLEND_DST_ALPHA = web_gl.RenderingContext.BLEND_DST_ALPHA;
+web_gl.BLEND_DST_RGB = web_gl.RenderingContext.BLEND_DST_RGB;
+web_gl.BLEND_EQUATION = web_gl.RenderingContext.BLEND_EQUATION;
+web_gl.BLEND_EQUATION_ALPHA = web_gl.RenderingContext.BLEND_EQUATION_ALPHA;
+web_gl.BLEND_EQUATION_RGB = web_gl.RenderingContext.BLEND_EQUATION_RGB;
+web_gl.BLEND_SRC_ALPHA = web_gl.RenderingContext.BLEND_SRC_ALPHA;
+web_gl.BLEND_SRC_RGB = web_gl.RenderingContext.BLEND_SRC_RGB;
+web_gl.BLUE_BITS = web_gl.RenderingContext.BLUE_BITS;
+web_gl.BOOL = web_gl.RenderingContext.BOOL;
+web_gl.BOOL_VEC2 = web_gl.RenderingContext.BOOL_VEC2;
+web_gl.BOOL_VEC3 = web_gl.RenderingContext.BOOL_VEC3;
+web_gl.BOOL_VEC4 = web_gl.RenderingContext.BOOL_VEC4;
+web_gl.BROWSER_DEFAULT_WEBGL = web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL;
+web_gl.BUFFER_SIZE = web_gl.RenderingContext.BUFFER_SIZE;
+web_gl.BUFFER_USAGE = web_gl.RenderingContext.BUFFER_USAGE;
+web_gl.BYTE = web_gl.RenderingContext.BYTE;
+web_gl.CCW = web_gl.RenderingContext.CCW;
+web_gl.CLAMP_TO_EDGE = web_gl.RenderingContext.CLAMP_TO_EDGE;
+web_gl.COLOR_ATTACHMENT0 = web_gl.RenderingContext.COLOR_ATTACHMENT0;
+web_gl.COLOR_BUFFER_BIT = web_gl.RenderingContext.COLOR_BUFFER_BIT;
+web_gl.COLOR_CLEAR_VALUE = web_gl.RenderingContext.COLOR_CLEAR_VALUE;
+web_gl.COLOR_WRITEMASK = web_gl.RenderingContext.COLOR_WRITEMASK;
+web_gl.COMPILE_STATUS = web_gl.RenderingContext.COMPILE_STATUS;
+web_gl.COMPRESSED_TEXTURE_FORMATS = web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS;
+web_gl.CONSTANT_ALPHA = web_gl.RenderingContext.CONSTANT_ALPHA;
+web_gl.CONSTANT_COLOR = web_gl.RenderingContext.CONSTANT_COLOR;
+web_gl.CONTEXT_LOST_WEBGL = web_gl.RenderingContext.CONTEXT_LOST_WEBGL;
+web_gl.CULL_FACE = web_gl.RenderingContext.CULL_FACE;
+web_gl.CULL_FACE_MODE = web_gl.RenderingContext.CULL_FACE_MODE;
+web_gl.CURRENT_PROGRAM = web_gl.RenderingContext.CURRENT_PROGRAM;
+web_gl.CURRENT_VERTEX_ATTRIB = web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB;
+web_gl.CW = web_gl.RenderingContext.CW;
+web_gl.DECR = web_gl.RenderingContext.DECR;
+web_gl.DECR_WRAP = web_gl.RenderingContext.DECR_WRAP;
+web_gl.DELETE_STATUS = web_gl.RenderingContext.DELETE_STATUS;
+web_gl.DEPTH_ATTACHMENT = web_gl.RenderingContext.DEPTH_ATTACHMENT;
+web_gl.DEPTH_BITS = web_gl.RenderingContext.DEPTH_BITS;
+web_gl.DEPTH_BUFFER_BIT = web_gl.RenderingContext.DEPTH_BUFFER_BIT;
+web_gl.DEPTH_CLEAR_VALUE = web_gl.RenderingContext.DEPTH_CLEAR_VALUE;
+web_gl.DEPTH_COMPONENT = web_gl.RenderingContext.DEPTH_COMPONENT;
+web_gl.DEPTH_COMPONENT16 = web_gl.RenderingContext.DEPTH_COMPONENT16;
+web_gl.DEPTH_FUNC = web_gl.RenderingContext.DEPTH_FUNC;
+web_gl.DEPTH_RANGE = web_gl.RenderingContext.DEPTH_RANGE;
+web_gl.DEPTH_STENCIL = web_gl.RenderingContext.DEPTH_STENCIL;
+web_gl.DEPTH_STENCIL_ATTACHMENT = web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT;
+web_gl.DEPTH_TEST = web_gl.RenderingContext.DEPTH_TEST;
+web_gl.DEPTH_WRITEMASK = web_gl.RenderingContext.DEPTH_WRITEMASK;
+web_gl.DITHER = web_gl.RenderingContext.DITHER;
+web_gl.DONT_CARE = web_gl.RenderingContext.DONT_CARE;
+web_gl.DST_ALPHA = web_gl.RenderingContext.DST_ALPHA;
+web_gl.DST_COLOR = web_gl.RenderingContext.DST_COLOR;
+web_gl.DYNAMIC_DRAW = web_gl.RenderingContext.DYNAMIC_DRAW;
+web_gl.ELEMENT_ARRAY_BUFFER = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER;
+web_gl.ELEMENT_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
+web_gl.EQUAL = web_gl.RenderingContext.EQUAL;
+web_gl.FASTEST = web_gl.RenderingContext.FASTEST;
+web_gl.FLOAT = web_gl.RenderingContext.FLOAT;
+web_gl.FLOAT_MAT2 = web_gl.RenderingContext.FLOAT_MAT2;
+web_gl.FLOAT_MAT3 = web_gl.RenderingContext.FLOAT_MAT3;
+web_gl.FLOAT_MAT4 = web_gl.RenderingContext.FLOAT_MAT4;
+web_gl.FLOAT_VEC2 = web_gl.RenderingContext.FLOAT_VEC2;
+web_gl.FLOAT_VEC3 = web_gl.RenderingContext.FLOAT_VEC3;
+web_gl.FLOAT_VEC4 = web_gl.RenderingContext.FLOAT_VEC4;
+web_gl.FRAGMENT_SHADER = web_gl.RenderingContext.FRAGMENT_SHADER;
+web_gl.FRAMEBUFFER = web_gl.RenderingContext.FRAMEBUFFER;
+web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
+web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
+web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
+web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
+web_gl.FRAMEBUFFER_BINDING = web_gl.RenderingContext.FRAMEBUFFER_BINDING;
+web_gl.FRAMEBUFFER_COMPLETE = web_gl.RenderingContext.FRAMEBUFFER_COMPLETE;
+web_gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
+web_gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
+web_gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
+web_gl.FRAMEBUFFER_UNSUPPORTED = web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED;
+web_gl.FRONT = web_gl.RenderingContext.FRONT;
+web_gl.FRONT_AND_BACK = web_gl.RenderingContext.FRONT_AND_BACK;
+web_gl.FRONT_FACE = web_gl.RenderingContext.FRONT_FACE;
+web_gl.FUNC_ADD = web_gl.RenderingContext.FUNC_ADD;
+web_gl.FUNC_REVERSE_SUBTRACT = web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT;
+web_gl.FUNC_SUBTRACT = web_gl.RenderingContext.FUNC_SUBTRACT;
+web_gl.GENERATE_MIPMAP_HINT = web_gl.RenderingContext.GENERATE_MIPMAP_HINT;
+web_gl.GEQUAL = web_gl.RenderingContext.GEQUAL;
+web_gl.GREATER = web_gl.RenderingContext.GREATER;
+web_gl.GREEN_BITS = web_gl.RenderingContext.GREEN_BITS;
+web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesTextureHalfFloat, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloat, [])}),
+  sfields: () => ({HALF_FLOAT_OES: core.int})
+});
+web_gl.OesTextureHalfFloat.HALF_FLOAT_OES = 36193;
+dart.registerExtension(dart.global.OESTextureHalfFloat, web_gl.OesTextureHalfFloat);
+web_gl.HALF_FLOAT_OES = web_gl.OesTextureHalfFloat.HALF_FLOAT_OES;
+web_gl.HIGH_FLOAT = web_gl.RenderingContext.HIGH_FLOAT;
+web_gl.HIGH_INT = web_gl.RenderingContext.HIGH_INT;
+web_gl.INCR = web_gl.RenderingContext.INCR;
+web_gl.INCR_WRAP = web_gl.RenderingContext.INCR_WRAP;
+web_gl.INT = web_gl.RenderingContext.INT;
+web_gl.INT_VEC2 = web_gl.RenderingContext.INT_VEC2;
+web_gl.INT_VEC3 = web_gl.RenderingContext.INT_VEC3;
+web_gl.INT_VEC4 = web_gl.RenderingContext.INT_VEC4;
+web_gl.INVALID_ENUM = web_gl.RenderingContext.INVALID_ENUM;
+web_gl.INVALID_FRAMEBUFFER_OPERATION = web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
+web_gl.INVALID_OPERATION = web_gl.RenderingContext.INVALID_OPERATION;
+web_gl.INVALID_VALUE = web_gl.RenderingContext.INVALID_VALUE;
+web_gl.INVERT = web_gl.RenderingContext.INVERT;
+web_gl.KEEP = web_gl.RenderingContext.KEEP;
+web_gl.LEQUAL = web_gl.RenderingContext.LEQUAL;
+web_gl.LESS = web_gl.RenderingContext.LESS;
+web_gl.LINEAR = web_gl.RenderingContext.LINEAR;
+web_gl.LINEAR_MIPMAP_LINEAR = web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR;
+web_gl.LINEAR_MIPMAP_NEAREST = web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST;
+web_gl.LINES = web_gl.RenderingContext.LINES;
+web_gl.LINE_LOOP = web_gl.RenderingContext.LINE_LOOP;
+web_gl.LINE_STRIP = web_gl.RenderingContext.LINE_STRIP;
+web_gl.LINE_WIDTH = web_gl.RenderingContext.LINE_WIDTH;
+web_gl.LINK_STATUS = web_gl.RenderingContext.LINK_STATUS;
+web_gl.LOW_FLOAT = web_gl.RenderingContext.LOW_FLOAT;
+web_gl.LOW_INT = web_gl.RenderingContext.LOW_INT;
+web_gl.LUMINANCE = web_gl.RenderingContext.LUMINANCE;
+web_gl.LUMINANCE_ALPHA = web_gl.RenderingContext.LUMINANCE_ALPHA;
+web_gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
+web_gl.MAX_CUBE_MAP_TEXTURE_SIZE = web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
+web_gl.MAX_FRAGMENT_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
+web_gl.MAX_RENDERBUFFER_SIZE = web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE;
+web_gl.MAX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
+web_gl.MAX_TEXTURE_SIZE = web_gl.RenderingContext.MAX_TEXTURE_SIZE;
+web_gl.MAX_VARYING_VECTORS = web_gl.RenderingContext.MAX_VARYING_VECTORS;
+web_gl.MAX_VERTEX_ATTRIBS = web_gl.RenderingContext.MAX_VERTEX_ATTRIBS;
+web_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
+web_gl.MAX_VERTEX_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
+web_gl.MAX_VIEWPORT_DIMS = web_gl.RenderingContext.MAX_VIEWPORT_DIMS;
+web_gl.MEDIUM_FLOAT = web_gl.RenderingContext.MEDIUM_FLOAT;
+web_gl.MEDIUM_INT = web_gl.RenderingContext.MEDIUM_INT;
+web_gl.MIRRORED_REPEAT = web_gl.RenderingContext.MIRRORED_REPEAT;
+web_gl.NEAREST = web_gl.RenderingContext.NEAREST;
+web_gl.NEAREST_MIPMAP_LINEAR = web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR;
+web_gl.NEAREST_MIPMAP_NEAREST = web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST;
+web_gl.NEVER = web_gl.RenderingContext.NEVER;
+web_gl.NICEST = web_gl.RenderingContext.NICEST;
+web_gl.NONE = web_gl.RenderingContext.NONE;
+web_gl.NOTEQUAL = web_gl.RenderingContext.NOTEQUAL;
+web_gl.NO_ERROR = web_gl.RenderingContext.NO_ERROR;
+web_gl.ONE = web_gl.RenderingContext.ONE;
+web_gl.ONE_MINUS_CONSTANT_ALPHA = web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
+web_gl.ONE_MINUS_CONSTANT_COLOR = web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR;
+web_gl.ONE_MINUS_DST_ALPHA = web_gl.RenderingContext.ONE_MINUS_DST_ALPHA;
+web_gl.ONE_MINUS_DST_COLOR = web_gl.RenderingContext.ONE_MINUS_DST_COLOR;
+web_gl.ONE_MINUS_SRC_ALPHA = web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA;
+web_gl.ONE_MINUS_SRC_COLOR = web_gl.RenderingContext.ONE_MINUS_SRC_COLOR;
+web_gl.OUT_OF_MEMORY = web_gl.RenderingContext.OUT_OF_MEMORY;
+web_gl.PACK_ALIGNMENT = web_gl.RenderingContext.PACK_ALIGNMENT;
+web_gl.POINTS = web_gl.RenderingContext.POINTS;
+web_gl.POLYGON_OFFSET_FACTOR = web_gl.RenderingContext.POLYGON_OFFSET_FACTOR;
+web_gl.POLYGON_OFFSET_FILL = web_gl.RenderingContext.POLYGON_OFFSET_FILL;
+web_gl.POLYGON_OFFSET_UNITS = web_gl.RenderingContext.POLYGON_OFFSET_UNITS;
+web_gl.RED_BITS = web_gl.RenderingContext.RED_BITS;
+web_gl.RENDERBUFFER = web_gl.RenderingContext.RENDERBUFFER;
+web_gl.RENDERBUFFER_ALPHA_SIZE = web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE;
+web_gl.RENDERBUFFER_BINDING = web_gl.RenderingContext.RENDERBUFFER_BINDING;
+web_gl.RENDERBUFFER_BLUE_SIZE = web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE;
+web_gl.RENDERBUFFER_DEPTH_SIZE = web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE;
+web_gl.RENDERBUFFER_GREEN_SIZE = web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE;
+web_gl.RENDERBUFFER_HEIGHT = web_gl.RenderingContext.RENDERBUFFER_HEIGHT;
+web_gl.RENDERBUFFER_INTERNAL_FORMAT = web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
+web_gl.RENDERBUFFER_RED_SIZE = web_gl.RenderingContext.RENDERBUFFER_RED_SIZE;
+web_gl.RENDERBUFFER_STENCIL_SIZE = web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE;
+web_gl.RENDERBUFFER_WIDTH = web_gl.RenderingContext.RENDERBUFFER_WIDTH;
+web_gl.RENDERER = web_gl.RenderingContext.RENDERER;
+web_gl.REPEAT = web_gl.RenderingContext.REPEAT;
+web_gl.REPLACE = web_gl.RenderingContext.REPLACE;
+web_gl.RGB = web_gl.RenderingContext.RGB;
+web_gl.RGB565 = web_gl.RenderingContext.RGB565;
+web_gl.RGB5_A1 = web_gl.RenderingContext.RGB5_A1;
+web_gl.RGBA = web_gl.RenderingContext.RGBA;
+web_gl.RGBA4 = web_gl.RenderingContext.RGBA4;
+web_gl.SAMPLER_2D = web_gl.RenderingContext.SAMPLER_2D;
+web_gl.SAMPLER_CUBE = web_gl.RenderingContext.SAMPLER_CUBE;
+web_gl.SAMPLES = web_gl.RenderingContext.SAMPLES;
+web_gl.SAMPLE_ALPHA_TO_COVERAGE = web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
+web_gl.SAMPLE_BUFFERS = web_gl.RenderingContext.SAMPLE_BUFFERS;
+web_gl.SAMPLE_COVERAGE = web_gl.RenderingContext.SAMPLE_COVERAGE;
+web_gl.SAMPLE_COVERAGE_INVERT = web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT;
+web_gl.SAMPLE_COVERAGE_VALUE = web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE;
+web_gl.SCISSOR_BOX = web_gl.RenderingContext.SCISSOR_BOX;
+web_gl.SCISSOR_TEST = web_gl.RenderingContext.SCISSOR_TEST;
+web_gl.SHADER_TYPE = web_gl.RenderingContext.SHADER_TYPE;
+web_gl.SHADING_LANGUAGE_VERSION = web_gl.RenderingContext.SHADING_LANGUAGE_VERSION;
+web_gl.SHORT = web_gl.RenderingContext.SHORT;
+web_gl.SRC_ALPHA = web_gl.RenderingContext.SRC_ALPHA;
+web_gl.SRC_ALPHA_SATURATE = web_gl.RenderingContext.SRC_ALPHA_SATURATE;
+web_gl.SRC_COLOR = web_gl.RenderingContext.SRC_COLOR;
+web_gl.STATIC_DRAW = web_gl.RenderingContext.STATIC_DRAW;
+web_gl.STENCIL_ATTACHMENT = web_gl.RenderingContext.STENCIL_ATTACHMENT;
+web_gl.STENCIL_BACK_FAIL = web_gl.RenderingContext.STENCIL_BACK_FAIL;
+web_gl.STENCIL_BACK_FUNC = web_gl.RenderingContext.STENCIL_BACK_FUNC;
+web_gl.STENCIL_BACK_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
+web_gl.STENCIL_BACK_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
+web_gl.STENCIL_BACK_REF = web_gl.RenderingContext.STENCIL_BACK_REF;
+web_gl.STENCIL_BACK_VALUE_MASK = web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK;
+web_gl.STENCIL_BACK_WRITEMASK = web_gl.RenderingContext.STENCIL_BACK_WRITEMASK;
+web_gl.STENCIL_BITS = web_gl.RenderingContext.STENCIL_BITS;
+web_gl.STENCIL_BUFFER_BIT = web_gl.RenderingContext.STENCIL_BUFFER_BIT;
+web_gl.STENCIL_CLEAR_VALUE = web_gl.RenderingContext.STENCIL_CLEAR_VALUE;
+web_gl.STENCIL_FAIL = web_gl.RenderingContext.STENCIL_FAIL;
+web_gl.STENCIL_FUNC = web_gl.RenderingContext.STENCIL_FUNC;
+web_gl.STENCIL_INDEX = web_gl.RenderingContext.STENCIL_INDEX;
+web_gl.STENCIL_INDEX8 = web_gl.RenderingContext.STENCIL_INDEX8;
+web_gl.STENCIL_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL;
+web_gl.STENCIL_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS;
+web_gl.STENCIL_REF = web_gl.RenderingContext.STENCIL_REF;
+web_gl.STENCIL_TEST = web_gl.RenderingContext.STENCIL_TEST;
+web_gl.STENCIL_VALUE_MASK = web_gl.RenderingContext.STENCIL_VALUE_MASK;
+web_gl.STENCIL_WRITEMASK = web_gl.RenderingContext.STENCIL_WRITEMASK;
+web_gl.STREAM_DRAW = web_gl.RenderingContext.STREAM_DRAW;
+web_gl.SUBPIXEL_BITS = web_gl.RenderingContext.SUBPIXEL_BITS;
+web_gl.TEXTURE = web_gl.RenderingContext.TEXTURE;
+web_gl.TEXTURE0 = web_gl.RenderingContext.TEXTURE0;
+web_gl.TEXTURE1 = web_gl.RenderingContext.TEXTURE1;
+web_gl.TEXTURE10 = web_gl.RenderingContext.TEXTURE10;
+web_gl.TEXTURE11 = web_gl.RenderingContext.TEXTURE11;
+web_gl.TEXTURE12 = web_gl.RenderingContext.TEXTURE12;
+web_gl.TEXTURE13 = web_gl.RenderingContext.TEXTURE13;
+web_gl.TEXTURE14 = web_gl.RenderingContext.TEXTURE14;
+web_gl.TEXTURE15 = web_gl.RenderingContext.TEXTURE15;
+web_gl.TEXTURE16 = web_gl.RenderingContext.TEXTURE16;
+web_gl.TEXTURE17 = web_gl.RenderingContext.TEXTURE17;
+web_gl.TEXTURE18 = web_gl.RenderingContext.TEXTURE18;
+web_gl.TEXTURE19 = web_gl.RenderingContext.TEXTURE19;
+web_gl.TEXTURE2 = web_gl.RenderingContext.TEXTURE2;
+web_gl.TEXTURE20 = web_gl.RenderingContext.TEXTURE20;
+web_gl.TEXTURE21 = web_gl.RenderingContext.TEXTURE21;
+web_gl.TEXTURE22 = web_gl.RenderingContext.TEXTURE22;
+web_gl.TEXTURE23 = web_gl.RenderingContext.TEXTURE23;
+web_gl.TEXTURE24 = web_gl.RenderingContext.TEXTURE24;
+web_gl.TEXTURE25 = web_gl.RenderingContext.TEXTURE25;
+web_gl.TEXTURE26 = web_gl.RenderingContext.TEXTURE26;
+web_gl.TEXTURE27 = web_gl.RenderingContext.TEXTURE27;
+web_gl.TEXTURE28 = web_gl.RenderingContext.TEXTURE28;
+web_gl.TEXTURE29 = web_gl.RenderingContext.TEXTURE29;
+web_gl.TEXTURE3 = web_gl.RenderingContext.TEXTURE3;
+web_gl.TEXTURE30 = web_gl.RenderingContext.TEXTURE30;
+web_gl.TEXTURE31 = web_gl.RenderingContext.TEXTURE31;
+web_gl.TEXTURE4 = web_gl.RenderingContext.TEXTURE4;
+web_gl.TEXTURE5 = web_gl.RenderingContext.TEXTURE5;
+web_gl.TEXTURE6 = web_gl.RenderingContext.TEXTURE6;
+web_gl.TEXTURE7 = web_gl.RenderingContext.TEXTURE7;
+web_gl.TEXTURE8 = web_gl.RenderingContext.TEXTURE8;
+web_gl.TEXTURE9 = web_gl.RenderingContext.TEXTURE9;
+web_gl.TEXTURE_2D = web_gl.RenderingContext.TEXTURE_2D;
+web_gl.TEXTURE_BINDING_2D = web_gl.RenderingContext.TEXTURE_BINDING_2D;
+web_gl.TEXTURE_BINDING_CUBE_MAP = web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP;
+web_gl.TEXTURE_CUBE_MAP = web_gl.RenderingContext.TEXTURE_CUBE_MAP;
+web_gl.TEXTURE_CUBE_MAP_NEGATIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
+web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
+web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
+web_gl.TEXTURE_CUBE_MAP_POSITIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
+web_gl.TEXTURE_CUBE_MAP_POSITIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
+web_gl.TEXTURE_CUBE_MAP_POSITIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
+web_gl.TEXTURE_MAG_FILTER = web_gl.RenderingContext.TEXTURE_MAG_FILTER;
+web_gl.TEXTURE_MIN_FILTER = web_gl.RenderingContext.TEXTURE_MIN_FILTER;
+web_gl.TEXTURE_WRAP_S = web_gl.RenderingContext.TEXTURE_WRAP_S;
+web_gl.TEXTURE_WRAP_T = web_gl.RenderingContext.TEXTURE_WRAP_T;
+web_gl.TRIANGLES = web_gl.RenderingContext.TRIANGLES;
+web_gl.TRIANGLE_FAN = web_gl.RenderingContext.TRIANGLE_FAN;
+web_gl.TRIANGLE_STRIP = web_gl.RenderingContext.TRIANGLE_STRIP;
+web_gl.UNPACK_ALIGNMENT = web_gl.RenderingContext.UNPACK_ALIGNMENT;
+web_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL = web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
+web_gl.UNPACK_FLIP_Y_WEBGL = web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL;
+web_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
+web_gl.UNSIGNED_BYTE = web_gl.RenderingContext.UNSIGNED_BYTE;
+web_gl.UNSIGNED_INT = web_gl.RenderingContext.UNSIGNED_INT;
+web_gl.UNSIGNED_SHORT = web_gl.RenderingContext.UNSIGNED_SHORT;
+web_gl.UNSIGNED_SHORT_4_4_4_4 = web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4;
+web_gl.UNSIGNED_SHORT_5_5_5_1 = web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1;
+web_gl.UNSIGNED_SHORT_5_6_5 = web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5;
+web_gl.VALIDATE_STATUS = web_gl.RenderingContext.VALIDATE_STATUS;
+web_gl.VENDOR = web_gl.RenderingContext.VENDOR;
+web_gl.VERSION = web_gl.RenderingContext.VERSION;
+web_gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
+web_gl.VERTEX_ATTRIB_ARRAY_ENABLED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
+web_gl.VERTEX_ATTRIB_ARRAY_NORMALIZED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
+web_gl.VERTEX_ATTRIB_ARRAY_POINTER = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
+web_gl.VERTEX_ATTRIB_ARRAY_SIZE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
+web_gl.VERTEX_ATTRIB_ARRAY_STRIDE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
+web_gl.VERTEX_ATTRIB_ARRAY_TYPE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
+web_gl.VERTEX_SHADER = web_gl.RenderingContext.VERTEX_SHADER;
+web_gl.VIEWPORT = web_gl.RenderingContext.VIEWPORT;
+web_gl.ZERO = web_gl.RenderingContext.ZERO;
+dart.defineExtensionNames([
+  'name',
+  'size',
+  'type'
+]);
+web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.name]() {
+    return this.name;
+  }
+  get [dartx.size]() {
+    return this.size;
+  }
+  get [dartx.type]() {
+    return this.type;
+  }
+};
+dart.setSignature(web_gl.ActiveInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ActiveInfo, [])}),
+  fields: () => ({
+    [dartx.name]: core.String,
+    [dartx.size]: core.int,
+    [dartx.type]: core.int
+  })
+});
+dart.registerExtension(dart.global.WebGLActiveInfo, web_gl.ActiveInfo);
+dart.defineExtensionNames([
+  'drawArraysInstancedAngle',
+  'drawElementsInstancedAngle',
+  'vertexAttribDivisorAngle'
+]);
+web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.drawArraysInstancedAngle](...args) {
+    return this.drawArraysInstancedANGLE.apply(this, args);
+  }
+  [dartx.drawElementsInstancedAngle](...args) {
+    return this.drawElementsInstancedANGLE.apply(this, args);
+  }
+  [dartx.vertexAttribDivisorAngle](...args) {
+    return this.vertexAttribDivisorANGLE.apply(this, args);
+  }
+};
+dart.setSignature(web_gl.AngleInstancedArrays, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.AngleInstancedArrays, [])}),
+  methods: () => ({
+    [dartx.drawArraysInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
+    [dartx.drawElementsInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
+    [dartx.vertexAttribDivisorAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int])
+  }),
+  sfields: () => ({VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: core.int})
+});
+web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;
+dart.registerExtension(dart.global.ANGLEInstancedArrays, web_gl.AngleInstancedArrays);
+web_gl.Buffer = class Buffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Buffer, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Buffer, [])})
+});
+dart.registerExtension(dart.global.WebGLBuffer, web_gl.Buffer);
+web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.CompressedTextureAtc, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureAtc, [])}),
+  sfields: () => ({
+    COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: core.int,
+    COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: core.int,
+    COMPRESSED_RGB_ATC_WEBGL: core.int
+  })
+});
+web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 35987;
+web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 34798;
+web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL = 35986;
+dart.registerExtension(dart.global.WebGLCompressedTextureATC, web_gl.CompressedTextureAtc);
+web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.CompressedTextureETC1, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureETC1, [])}),
+  sfields: () => ({COMPRESSED_RGB_ETC1_WEBGL: core.int})
+});
+web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL = 36196;
+dart.registerExtension(dart.global.WebGLCompressedTextureETC1, web_gl.CompressedTextureETC1);
+web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.CompressedTexturePvrtc, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTexturePvrtc, [])}),
+  sfields: () => ({
+    COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: core.int,
+    COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: core.int,
+    COMPRESSED_RGB_PVRTC_2BPPV1_IMG: core.int,
+    COMPRESSED_RGB_PVRTC_4BPPV1_IMG: core.int
+  })
+});
+web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843;
+web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842;
+web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841;
+web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840;
+dart.registerExtension(dart.global.WebGLCompressedTexturePVRTC, web_gl.CompressedTexturePvrtc);
+web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.CompressedTextureS3TC, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureS3TC, [])}),
+  sfields: () => ({
+    COMPRESSED_RGBA_S3TC_DXT1_EXT: core.int,
+    COMPRESSED_RGBA_S3TC_DXT3_EXT: core.int,
+    COMPRESSED_RGBA_S3TC_DXT5_EXT: core.int,
+    COMPRESSED_RGB_S3TC_DXT1_EXT: core.int
+  })
+});
+web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777;
+web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
+web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;
+web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
+dart.registerExtension(dart.global.WebGLCompressedTextureS3TC, web_gl.CompressedTextureS3TC);
+dart.defineExtensionNames([
+  'alpha',
+  'antialias',
+  'depth',
+  'failIfMajorPerformanceCaveat',
+  'premultipliedAlpha',
+  'preserveDrawingBuffer',
+  'stencil'
+]);
+web_gl.ContextAttributes = class ContextAttributes extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.alpha]() {
+    return this.alpha;
+  }
+  set [dartx.alpha](value) {
+    this.alpha = value;
+  }
+  get [dartx.antialias]() {
+    return this.antialias;
+  }
+  set [dartx.antialias](value) {
+    this.antialias = value;
+  }
+  get [dartx.depth]() {
+    return this.depth;
+  }
+  set [dartx.depth](value) {
+    this.depth = value;
+  }
+  get [dartx.failIfMajorPerformanceCaveat]() {
+    return this.failIfMajorPerformanceCaveat;
+  }
+  set [dartx.failIfMajorPerformanceCaveat](value) {
+    this.failIfMajorPerformanceCaveat = value;
+  }
+  get [dartx.premultipliedAlpha]() {
+    return this.premultipliedAlpha;
+  }
+  set [dartx.premultipliedAlpha](value) {
+    this.premultipliedAlpha = value;
+  }
+  get [dartx.preserveDrawingBuffer]() {
+    return this.preserveDrawingBuffer;
+  }
+  set [dartx.preserveDrawingBuffer](value) {
+    this.preserveDrawingBuffer = value;
+  }
+  get [dartx.stencil]() {
+    return this.stencil;
+  }
+  set [dartx.stencil](value) {
+    this.stencil = value;
+  }
+};
+dart.setSignature(web_gl.ContextAttributes, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextAttributes, [])}),
+  fields: () => ({
+    [dartx.alpha]: core.bool,
+    [dartx.antialias]: core.bool,
+    [dartx.depth]: core.bool,
+    [dartx.failIfMajorPerformanceCaveat]: core.bool,
+    [dartx.premultipliedAlpha]: core.bool,
+    [dartx.preserveDrawingBuffer]: core.bool,
+    [dartx.stencil]: core.bool
+  })
+});
+dart.registerExtension(dart.global.WebGLContextAttributes, web_gl.ContextAttributes);
+dart.defineExtensionNames([
+  'statusMessage'
+]);
+web_gl.ContextEvent = class ContextEvent extends html$.Event {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.statusMessage]() {
+    return this.statusMessage;
+  }
+};
+dart.setSignature(web_gl.ContextEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextEvent, [])}),
+  fields: () => ({[dartx.statusMessage]: core.String})
+});
+dart.registerExtension(dart.global.WebGLContextEvent, web_gl.ContextEvent);
+web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.DebugRendererInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugRendererInfo, [])}),
+  sfields: () => ({
+    UNMASKED_RENDERER_WEBGL: core.int,
+    UNMASKED_VENDOR_WEBGL: core.int
+  })
+});
+web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL = 37446;
+web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL = 37445;
+dart.registerExtension(dart.global.WebGLDebugRendererInfo, web_gl.DebugRendererInfo);
+dart.defineExtensionNames([
+  'getTranslatedShaderSource'
+]);
+web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.getTranslatedShaderSource](...args) {
+    return this.getTranslatedShaderSource.apply(this, args);
+  }
+};
+dart.setSignature(web_gl.DebugShaders, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugShaders, [])}),
+  methods: () => ({[dartx.getTranslatedShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader])})
+});
+dart.registerExtension(dart.global.WebGLDebugShaders, web_gl.DebugShaders);
+web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.DepthTexture, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.DepthTexture, [])}),
+  sfields: () => ({UNSIGNED_INT_24_8_WEBGL: core.int})
+});
+web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL = 34042;
+dart.registerExtension(dart.global.WebGLDepthTexture, web_gl.DepthTexture);
+dart.defineExtensionNames([
+  'drawBuffersWebgl'
+]);
+web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.drawBuffersWebgl](...args) {
+    return this.drawBuffersWEBGL.apply(this, args);
+  }
+};
+dart.setSignature(web_gl.DrawBuffers, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.DrawBuffers, [])}),
+  methods: () => ({[dartx.drawBuffersWebgl]: dart.definiteFunctionType(dart.void, [ListOfint()])}),
+  sfields: () => ({
+    COLOR_ATTACHMENT0_WEBGL: core.int,
+    COLOR_ATTACHMENT10_WEBGL: core.int,
+    COLOR_ATTACHMENT11_WEBGL: core.int,
+    COLOR_ATTACHMENT12_WEBGL: core.int,
+    COLOR_ATTACHMENT13_WEBGL: core.int,
+    COLOR_ATTACHMENT14_WEBGL: core.int,
+    COLOR_ATTACHMENT15_WEBGL: core.int,
+    COLOR_ATTACHMENT1_WEBGL: core.int,
+    COLOR_ATTACHMENT2_WEBGL: core.int,
+    COLOR_ATTACHMENT3_WEBGL: core.int,
+    COLOR_ATTACHMENT4_WEBGL: core.int,
+    COLOR_ATTACHMENT5_WEBGL: core.int,
+    COLOR_ATTACHMENT6_WEBGL: core.int,
+    COLOR_ATTACHMENT7_WEBGL: core.int,
+    COLOR_ATTACHMENT8_WEBGL: core.int,
+    COLOR_ATTACHMENT9_WEBGL: core.int,
+    DRAW_BUFFER0_WEBGL: core.int,
+    DRAW_BUFFER10_WEBGL: core.int,
+    DRAW_BUFFER11_WEBGL: core.int,
+    DRAW_BUFFER12_WEBGL: core.int,
+    DRAW_BUFFER13_WEBGL: core.int,
+    DRAW_BUFFER14_WEBGL: core.int,
+    DRAW_BUFFER15_WEBGL: core.int,
+    DRAW_BUFFER1_WEBGL: core.int,
+    DRAW_BUFFER2_WEBGL: core.int,
+    DRAW_BUFFER3_WEBGL: core.int,
+    DRAW_BUFFER4_WEBGL: core.int,
+    DRAW_BUFFER5_WEBGL: core.int,
+    DRAW_BUFFER6_WEBGL: core.int,
+    DRAW_BUFFER7_WEBGL: core.int,
+    DRAW_BUFFER8_WEBGL: core.int,
+    DRAW_BUFFER9_WEBGL: core.int,
+    MAX_COLOR_ATTACHMENTS_WEBGL: core.int,
+    MAX_DRAW_BUFFERS_WEBGL: core.int
+  })
+});
+web_gl.DrawBuffers.COLOR_ATTACHMENT0_WEBGL = 36064;
+web_gl.DrawBuffers.COLOR_ATTACHMENT10_WEBGL = 36074;
+web_gl.DrawBuffers.COLOR_ATTACHMENT11_WEBGL = 36075;
+web_gl.DrawBuffers.COLOR_ATTACHMENT12_WEBGL = 36076;
+web_gl.DrawBuffers.COLOR_ATTACHMENT13_WEBGL = 36077;
+web_gl.DrawBuffers.COLOR_ATTACHMENT14_WEBGL = 36078;
+web_gl.DrawBuffers.COLOR_ATTACHMENT15_WEBGL = 36079;
+web_gl.DrawBuffers.COLOR_ATTACHMENT1_WEBGL = 36065;
+web_gl.DrawBuffers.COLOR_ATTACHMENT2_WEBGL = 36066;
+web_gl.DrawBuffers.COLOR_ATTACHMENT3_WEBGL = 36067;
+web_gl.DrawBuffers.COLOR_ATTACHMENT4_WEBGL = 36068;
+web_gl.DrawBuffers.COLOR_ATTACHMENT5_WEBGL = 36069;
+web_gl.DrawBuffers.COLOR_ATTACHMENT6_WEBGL = 36070;
+web_gl.DrawBuffers.COLOR_ATTACHMENT7_WEBGL = 36071;
+web_gl.DrawBuffers.COLOR_ATTACHMENT8_WEBGL = 36072;
+web_gl.DrawBuffers.COLOR_ATTACHMENT9_WEBGL = 36073;
+web_gl.DrawBuffers.DRAW_BUFFER0_WEBGL = 34853;
+web_gl.DrawBuffers.DRAW_BUFFER10_WEBGL = 34863;
+web_gl.DrawBuffers.DRAW_BUFFER11_WEBGL = 34864;
+web_gl.DrawBuffers.DRAW_BUFFER12_WEBGL = 34865;
+web_gl.DrawBuffers.DRAW_BUFFER13_WEBGL = 34866;
+web_gl.DrawBuffers.DRAW_BUFFER14_WEBGL = 34867;
+web_gl.DrawBuffers.DRAW_BUFFER15_WEBGL = 34868;
+web_gl.DrawBuffers.DRAW_BUFFER1_WEBGL = 34854;
+web_gl.DrawBuffers.DRAW_BUFFER2_WEBGL = 34855;
+web_gl.DrawBuffers.DRAW_BUFFER3_WEBGL = 34856;
+web_gl.DrawBuffers.DRAW_BUFFER4_WEBGL = 34857;
+web_gl.DrawBuffers.DRAW_BUFFER5_WEBGL = 34858;
+web_gl.DrawBuffers.DRAW_BUFFER6_WEBGL = 34859;
+web_gl.DrawBuffers.DRAW_BUFFER7_WEBGL = 34860;
+web_gl.DrawBuffers.DRAW_BUFFER8_WEBGL = 34861;
+web_gl.DrawBuffers.DRAW_BUFFER9_WEBGL = 34862;
+web_gl.DrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL = 36063;
+web_gl.DrawBuffers.MAX_DRAW_BUFFERS_WEBGL = 34852;
+dart.registerExtension(dart.global.WebGLDrawBuffers, web_gl.DrawBuffers);
+web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.ExtBlendMinMax, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtBlendMinMax, [])}),
+  sfields: () => ({
+    MAX_EXT: core.int,
+    MIN_EXT: core.int
+  })
+});
+web_gl.ExtBlendMinMax.MAX_EXT = 32776;
+web_gl.ExtBlendMinMax.MIN_EXT = 32775;
+dart.registerExtension(dart.global.EXTBlendMinMax, web_gl.ExtBlendMinMax);
+web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.ExtFragDepth, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtFragDepth, [])})
+});
+dart.registerExtension(dart.global.EXTFragDepth, web_gl.ExtFragDepth);
+web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.ExtShaderTextureLod, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtShaderTextureLod, [])})
+});
+dart.registerExtension(dart.global.EXTShaderTextureLOD, web_gl.ExtShaderTextureLod);
+web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.ExtTextureFilterAnisotropic, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtTextureFilterAnisotropic, [])}),
+  sfields: () => ({
+    MAX_TEXTURE_MAX_ANISOTROPY_EXT: core.int,
+    TEXTURE_MAX_ANISOTROPY_EXT: core.int
+  })
+});
+web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
+web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
+dart.registerExtension(dart.global.EXTTextureFilterAnisotropic, web_gl.ExtTextureFilterAnisotropic);
+web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Framebuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Framebuffer, [])})
+});
+dart.registerExtension(dart.global.WebGLFramebuffer, web_gl.Framebuffer);
+dart.defineExtensionNames([
+  'loseContext',
+  'restoreContext'
+]);
+web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.loseContext](...args) {
+    return this.loseContext.apply(this, args);
+  }
+  [dartx.restoreContext](...args) {
+    return this.restoreContext.apply(this, args);
+  }
+};
+dart.setSignature(web_gl.LoseContext, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.LoseContext, [])}),
+  methods: () => ({
+    [dartx.loseContext]: dart.definiteFunctionType(dart.void, []),
+    [dartx.restoreContext]: dart.definiteFunctionType(dart.void, [])
+  })
+});
+dart.registerExtension(dart.global.WebGLLoseContext, web_gl.LoseContext);
+dart.registerExtension(dart.global.WebGLExtensionLoseContext, web_gl.LoseContext);
+web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesElementIndexUint, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesElementIndexUint, [])})
+});
+dart.registerExtension(dart.global.OESElementIndexUint, web_gl.OesElementIndexUint);
+web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesStandardDerivatives, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesStandardDerivatives, [])}),
+  sfields: () => ({FRAGMENT_SHADER_DERIVATIVE_HINT_OES: core.int})
+});
+web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
+dart.registerExtension(dart.global.OESStandardDerivatives, web_gl.OesStandardDerivatives);
+web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesTextureFloat, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloat, [])})
+});
+dart.registerExtension(dart.global.OESTextureFloat, web_gl.OesTextureFloat);
+web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesTextureFloatLinear, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloatLinear, [])})
+});
+dart.registerExtension(dart.global.OESTextureFloatLinear, web_gl.OesTextureFloatLinear);
+web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.OesTextureHalfFloatLinear, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloatLinear, [])})
+});
+dart.registerExtension(dart.global.OESTextureHalfFloatLinear, web_gl.OesTextureHalfFloatLinear);
+dart.defineExtensionNames([
+  'bindVertexArray',
+  'createVertexArray',
+  'deleteVertexArray',
+  'isVertexArray'
+]);
+web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.bindVertexArray](...args) {
+    return this.bindVertexArrayOES.apply(this, args);
+  }
+  [dartx.createVertexArray](...args) {
+    return this.createVertexArrayOES.apply(this, args);
+  }
+  [dartx.deleteVertexArray](...args) {
+    return this.deleteVertexArrayOES.apply(this, args);
+  }
+  [dartx.isVertexArray](...args) {
+    return this.isVertexArrayOES.apply(this, args);
+  }
+};
+dart.setSignature(web_gl.OesVertexArrayObject, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.OesVertexArrayObject, [])}),
+  methods: () => ({
+    [dartx.bindVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
+    [dartx.createVertexArray]: dart.definiteFunctionType(web_gl.VertexArrayObject, []),
+    [dartx.deleteVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
+    [dartx.isVertexArray]: dart.definiteFunctionType(core.bool, [web_gl.VertexArrayObject])
+  }),
+  sfields: () => ({VERTEX_ARRAY_BINDING_OES: core.int})
+});
+web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES = 34229;
+dart.registerExtension(dart.global.OESVertexArrayObject, web_gl.OesVertexArrayObject);
+web_gl.Program = class Program extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Program, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Program, [])})
+});
+dart.registerExtension(dart.global.WebGLProgram, web_gl.Program);
+web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Renderbuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Renderbuffer, [])})
+});
+dart.registerExtension(dart.global.WebGLRenderbuffer, web_gl.Renderbuffer);
+web_gl.Shader = class Shader extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Shader, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Shader, [])})
+});
+dart.registerExtension(dart.global.WebGLShader, web_gl.Shader);
+dart.defineExtensionNames([
+  'precision',
+  'rangeMax',
+  'rangeMin'
+]);
+web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.precision]() {
+    return this.precision;
+  }
+  get [dartx.rangeMax]() {
+    return this.rangeMax;
+  }
+  get [dartx.rangeMin]() {
+    return this.rangeMin;
+  }
+};
+dart.setSignature(web_gl.ShaderPrecisionFormat, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [])}),
+  fields: () => ({
+    [dartx.precision]: core.int,
+    [dartx.rangeMax]: core.int,
+    [dartx.rangeMin]: core.int
+  })
+});
+dart.registerExtension(dart.global.WebGLShaderPrecisionFormat, web_gl.ShaderPrecisionFormat);
+web_gl.Texture = class Texture extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.Texture, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.Texture, [])})
+});
+dart.registerExtension(dart.global.WebGLTexture, web_gl.Texture);
+web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.UniformLocation, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.UniformLocation, [])})
+});
+dart.registerExtension(dart.global.WebGLUniformLocation, web_gl.UniformLocation);
+web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl.VertexArrayObject, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl.VertexArrayObject, [])})
+});
+dart.registerExtension(dart.global.WebGLVertexArrayObjectOES, web_gl.VertexArrayObject);
+web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+};
+dart.setSignature(web_gl._WebGLRenderingContextBase, {
+  constructors: () => ({_: dart.definiteFunctionType(web_gl._WebGLRenderingContextBase, [])})
+});
+web_sql.SqlStatementCallback = dart.typedef('SqlStatementCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]));
+web_sql.SqlStatementErrorCallback = dart.typedef('SqlStatementErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError]));
+web_sql.SqlTransactionCallback = dart.typedef('SqlTransactionCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction]));
+web_sql.SqlTransactionErrorCallback = dart.typedef('SqlTransactionErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlError]));
+dart.defineExtensionNames([
+  'changeVersion',
+  'readTransaction',
+  'transaction',
+  'version'
+]);
+web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  static get supported() {
+    return !!window.openDatabase;
+  }
+  get [dartx.version]() {
+    return this.version;
+  }
+  [dartx.changeVersion](...args) {
+    return this.changeVersion.apply(this, args);
+  }
+  [dartx.readTransaction](...args) {
+    return this.readTransaction.apply(this, args);
+  }
+  [dartx.transaction](...args) {
+    return this.transaction.apply(this, args);
+  }
+};
+dart.setSignature(web_sql.SqlDatabase, {
+  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
+  fields: () => ({[dartx.version]: core.String}),
+  methods: () => ({
+    [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
+    [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
+    [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
+  }),
+  sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
+});
+dart.registerExtension(dart.global.Database, web_sql.SqlDatabase);
+dart.defineExtensionNames([
+  'code',
+  'message'
+]);
+web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.code]() {
+    return this.code;
+  }
+  get [dartx.message]() {
+    return this.message;
+  }
+};
+dart.setSignature(web_sql.SqlError, {
+  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlError, [])}),
+  fields: () => ({
+    [dartx.code]: core.int,
+    [dartx.message]: core.String
+  }),
+  sfields: () => ({
+    CONSTRAINT_ERR: core.int,
+    DATABASE_ERR: core.int,
+    QUOTA_ERR: core.int,
+    SYNTAX_ERR: core.int,
+    TIMEOUT_ERR: core.int,
+    TOO_LARGE_ERR: core.int,
+    UNKNOWN_ERR: core.int,
+    VERSION_ERR: core.int
+  })
+});
+web_sql.SqlError.CONSTRAINT_ERR = 6;
+web_sql.SqlError.DATABASE_ERR = 1;
+web_sql.SqlError.QUOTA_ERR = 4;
+web_sql.SqlError.SYNTAX_ERR = 5;
+web_sql.SqlError.TIMEOUT_ERR = 7;
+web_sql.SqlError.TOO_LARGE_ERR = 3;
+web_sql.SqlError.UNKNOWN_ERR = 0;
+web_sql.SqlError.VERSION_ERR = 2;
+dart.registerExtension(dart.global.SQLError, web_sql.SqlError);
+dart.defineExtensionNames([
+  'insertId',
+  'rows',
+  'rowsAffected'
+]);
+web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.insertId]() {
+    return this.insertId;
+  }
+  get [dartx.rows]() {
+    return this.rows;
+  }
+  get [dartx.rowsAffected]() {
+    return this.rowsAffected;
+  }
+};
+dart.setSignature(web_sql.SqlResultSet, {
+  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSet, [])}),
+  fields: () => ({
+    [dartx.insertId]: core.int,
+    [dartx.rows]: web_sql.SqlResultSetRowList,
+    [dartx.rowsAffected]: core.int
+  })
+});
+dart.registerExtension(dart.global.SQLResultSet, web_sql.SqlResultSet);
+const _item_1 = Symbol('_item_1');
+dart.defineExtensionNames([
+  'length',
+  '_get',
+  '_set',
+  'length',
+  'first',
+  'last',
+  'single',
+  'elementAt',
+  'item'
+]);
+web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  get [dartx.length]() {
+    return this.length;
+  }
+  [dartx._get](index) {
+    if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
+    return this[dartx.item](index);
+  }
+  [dartx._set](index, value) {
+    dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
+    return value;
+  }
+  set [dartx.length](value) {
+    dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
+  }
+  get [dartx.first]() {
+    if (dart.notNull(this[dartx.length]) > 0) {
+      return this[0];
     }
-    [dartx.uniform2iv](...args) {
-      return this.uniform2iv.apply(this, args);
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.last]() {
+    let len = this[dartx.length];
+    if (dart.notNull(len) > 0) {
+      return this[dart.notNull(len) - 1];
     }
-    [dartx.uniform3f](...args) {
-      return this.uniform3f.apply(this, args);
+    dart.throw(new core.StateError("No elements"));
+  }
+  get [dartx.single]() {
+    let len = this[dartx.length];
+    if (len == 1) {
+      return this[0];
     }
-    [dartx.uniform3fv](...args) {
-      return this.uniform3fv.apply(this, args);
-    }
-    [dartx.uniform3i](...args) {
-      return this.uniform3i.apply(this, args);
-    }
-    [dartx.uniform3iv](...args) {
-      return this.uniform3iv.apply(this, args);
-    }
-    [dartx.uniform4f](...args) {
-      return this.uniform4f.apply(this, args);
-    }
-    [dartx.uniform4fv](...args) {
-      return this.uniform4fv.apply(this, args);
-    }
-    [dartx.uniform4i](...args) {
-      return this.uniform4i.apply(this, args);
-    }
-    [dartx.uniform4iv](...args) {
-      return this.uniform4iv.apply(this, args);
-    }
-    [dartx.uniformMatrix2fv](...args) {
-      return this.uniformMatrix2fv.apply(this, args);
-    }
-    [dartx.uniformMatrix3fv](...args) {
-      return this.uniformMatrix3fv.apply(this, args);
-    }
-    [dartx.uniformMatrix4fv](...args) {
-      return this.uniformMatrix4fv.apply(this, args);
-    }
-    [dartx.useProgram](...args) {
-      return this.useProgram.apply(this, args);
-    }
-    [dartx.validateProgram](...args) {
-      return this.validateProgram.apply(this, args);
-    }
-    [dartx.vertexAttrib1f](...args) {
-      return this.vertexAttrib1f.apply(this, args);
-    }
-    [dartx.vertexAttrib1fv](...args) {
-      return this.vertexAttrib1fv.apply(this, args);
-    }
-    [dartx.vertexAttrib2f](...args) {
-      return this.vertexAttrib2f.apply(this, args);
-    }
-    [dartx.vertexAttrib2fv](...args) {
-      return this.vertexAttrib2fv.apply(this, args);
-    }
-    [dartx.vertexAttrib3f](...args) {
-      return this.vertexAttrib3f.apply(this, args);
-    }
-    [dartx.vertexAttrib3fv](...args) {
-      return this.vertexAttrib3fv.apply(this, args);
-    }
-    [dartx.vertexAttrib4f](...args) {
-      return this.vertexAttrib4f.apply(this, args);
-    }
-    [dartx.vertexAttrib4fv](...args) {
-      return this.vertexAttrib4fv.apply(this, args);
-    }
-    [dartx.vertexAttribPointer](...args) {
-      return this.vertexAttribPointer.apply(this, args);
-    }
-    [dartx.viewport](...args) {
-      return this.viewport.apply(this, args);
-    }
-    [dartx.texImage2DUntyped](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texImage2DTyped](...args) {
-      return this.texImage2D.apply(this, args);
-    }
-    [dartx.texSubImage2DUntyped](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-    [dartx.texSubImage2DTyped](...args) {
-      return this.texSubImage2D.apply(this, args);
-    }
-  };
-  web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
-  dart.setSignature(web_gl.RenderingContext, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
-    fields: () => ({
-      [dartx.canvas]: html$.CanvasElement,
-      [dartx.drawingBufferHeight]: core.int,
-      [dartx.drawingBufferWidth]: core.int
-    }),
-    methods: () => ({
-      [dartx.activeTexture]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.attachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
-      [dartx.bindAttribLocation]: dart.definiteFunctionType(dart.void, [web_gl.Program, core.int, core.String]),
-      [dartx.bindBuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Buffer]),
-      [dartx.bindFramebuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Framebuffer]),
-      [dartx.bindRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Renderbuffer]),
-      [dartx.bindTexture]: dart.definiteFunctionType(dart.void, [core.int, web_gl.Texture]),
-      [dartx.blendColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.blendEquation]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.blendEquationSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.blendFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.blendFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.bufferByteData]: dart.definiteFunctionType(dart.void, [core.int, typed_data.ByteBuffer, core.int]),
-      [dartx.bufferData]: dart.definiteFunctionType(dart.void, [core.int, dart.dynamic, core.int]),
-      [dartx.bufferDataTyped]: dart.definiteFunctionType(dart.void, [core.int, typed_data.TypedData, core.int]),
-      [dartx.bufferSubByteData]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.ByteBuffer]),
-      [dartx.bufferSubData]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
-      [dartx.bufferSubDataTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, typed_data.TypedData]),
-      [dartx.checkFramebufferStatus]: dart.definiteFunctionType(core.int, [core.int]),
-      [dartx.clear]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.clearColor]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-      [dartx.clearDepth]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.clearStencil]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.colorMask]: dart.definiteFunctionType(dart.void, [core.bool, core.bool, core.bool, core.bool]),
-      [dartx.compileShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
-      [dartx.compressedTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
-      [dartx.compressedTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
-      [dartx.copyTexImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
-      [dartx.copyTexSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int]),
-      [dartx.createBuffer]: dart.definiteFunctionType(web_gl.Buffer, []),
-      [dartx.createFramebuffer]: dart.definiteFunctionType(web_gl.Framebuffer, []),
-      [dartx.createProgram]: dart.definiteFunctionType(web_gl.Program, []),
-      [dartx.createRenderbuffer]: dart.definiteFunctionType(web_gl.Renderbuffer, []),
-      [dartx.createShader]: dart.definiteFunctionType(web_gl.Shader, [core.int]),
-      [dartx.createTexture]: dart.definiteFunctionType(web_gl.Texture, []),
-      [dartx.cullFace]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.deleteBuffer]: dart.definiteFunctionType(dart.void, [web_gl.Buffer]),
-      [dartx.deleteFramebuffer]: dart.definiteFunctionType(dart.void, [web_gl.Framebuffer]),
-      [dartx.deleteProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
-      [dartx.deleteRenderbuffer]: dart.definiteFunctionType(dart.void, [web_gl.Renderbuffer]),
-      [dartx.deleteShader]: dart.definiteFunctionType(dart.void, [web_gl.Shader]),
-      [dartx.deleteTexture]: dart.definiteFunctionType(dart.void, [web_gl.Texture]),
-      [dartx.depthFunc]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.depthMask]: dart.definiteFunctionType(dart.void, [core.bool]),
-      [dartx.depthRange]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.detachShader]: dart.definiteFunctionType(dart.void, [web_gl.Program, web_gl.Shader]),
-      [dartx.disable]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.disableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.drawArrays]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
-      [dartx.drawElements]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.enable]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.enableVertexAttribArray]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.finish]: dart.definiteFunctionType(dart.void, []),
-      [dartx.flush]: dart.definiteFunctionType(dart.void, []),
-      [dartx.framebufferRenderbuffer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Renderbuffer]),
-      [dartx.framebufferTexture2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, web_gl.Texture, core.int]),
-      [dartx.frontFace]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.generateMipmap]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.getActiveAttrib]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
-      [dartx.getActiveUniform]: dart.definiteFunctionType(web_gl.ActiveInfo, [web_gl.Program, core.int]),
-      [dartx.getAttachedShaders]: dart.definiteFunctionType(core.List$(web_gl.Shader), [web_gl.Program]),
-      [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
-      [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
-      [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
-      [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
-      [dartx.getError]: dart.definiteFunctionType(core.int, []),
-      [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
-      [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
-      [dartx.getParameter]: dart.definiteFunctionType(core.Object, [core.int]),
-      [dartx.getProgramInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Program]),
-      [dartx.getProgramParameter]: dart.definiteFunctionType(core.Object, [web_gl.Program, core.int]),
-      [dartx.getRenderbufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
-      [dartx.getShaderInfoLog]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
-      [dartx.getShaderParameter]: dart.definiteFunctionType(core.Object, [web_gl.Shader, core.int]),
-      [dartx.getShaderPrecisionFormat]: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [core.int, core.int]),
-      [dartx.getShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader]),
-      [dartx.getSupportedExtensions]: dart.definiteFunctionType(core.List$(core.String), []),
-      [dartx.getTexParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
-      [dartx.getUniform]: dart.definiteFunctionType(core.Object, [web_gl.Program, web_gl.UniformLocation]),
-      [dartx.getUniformLocation]: dart.definiteFunctionType(web_gl.UniformLocation, [web_gl.Program, core.String]),
-      [dartx.getVertexAttrib]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
-      [dartx.getVertexAttribOffset]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [dartx.hint]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.isBuffer]: dart.definiteFunctionType(core.bool, [web_gl.Buffer]),
-      [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
-      [dartx.isEnabled]: dart.definiteFunctionType(core.bool, [core.int]),
-      [dartx.isFramebuffer]: dart.definiteFunctionType(core.bool, [web_gl.Framebuffer]),
-      [dartx.isProgram]: dart.definiteFunctionType(core.bool, [web_gl.Program]),
-      [dartx.isRenderbuffer]: dart.definiteFunctionType(core.bool, [web_gl.Renderbuffer]),
-      [dartx.isShader]: dart.definiteFunctionType(core.bool, [web_gl.Shader]),
-      [dartx.isTexture]: dart.definiteFunctionType(core.bool, [web_gl.Texture]),
-      [dartx.lineWidth]: dart.definiteFunctionType(dart.void, [core.num]),
-      [dartx.linkProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
-      [dartx.pixelStorei]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.polygonOffset]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-      [dartx.readPixels]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
-      [dartx.renderbufferStorage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.sampleCoverage]: dart.definiteFunctionType(dart.void, [core.num, core.bool]),
-      [dartx.scissor]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.shaderSource]: dart.definiteFunctionType(dart.void, [web_gl.Shader, core.String]),
-      [dartx.stencilFunc]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
-      [dartx.stencilFuncSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.stencilMask]: dart.definiteFunctionType(dart.void, [core.int]),
-      [dartx.stencilMaskSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-      [dartx.stencilOp]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
-      [dartx.stencilOpSeparate]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
-      [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
-      [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
-      [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
-      [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
-      [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
-      [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
-      [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
-      [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
-      [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
-      [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
-      [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
-      [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
-      [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
-      [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
-      [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
-      [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
-      [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
-      [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
-      [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-      [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
-      [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
-      [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
-      [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
-      [dartx.uniform1iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
-      [dartx.uniform2f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num]),
-      [dartx.uniform2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
-      [dartx.uniform2i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int]),
-      [dartx.uniform2iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
-      [dartx.uniform3f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num]),
-      [dartx.uniform3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
-      [dartx.uniform3i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int]),
-      [dartx.uniform3iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
-      [dartx.uniform4f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num, core.num, core.num, core.num]),
-      [dartx.uniform4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
-      [dartx.uniform4i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int, core.int, core.int, core.int]),
-      [dartx.uniform4iv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Int32List]),
-      [dartx.uniformMatrix2fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
-      [dartx.uniformMatrix3fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
-      [dartx.uniformMatrix4fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.bool, typed_data.Float32List]),
-      [dartx.useProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
-      [dartx.validateProgram]: dart.definiteFunctionType(dart.void, [web_gl.Program]),
-      [dartx.vertexAttrib1f]: dart.definiteFunctionType(dart.void, [core.int, core.num]),
-      [dartx.vertexAttrib1fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
-      [dartx.vertexAttrib2f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num]),
-      [dartx.vertexAttrib2fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
-      [dartx.vertexAttrib3f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num]),
-      [dartx.vertexAttrib3fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
-      [dartx.vertexAttrib4f]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num, core.num, core.num]),
-      [dartx.vertexAttrib4fv]: dart.definiteFunctionType(dart.void, [core.int, typed_data.Float32List]),
-      [dartx.vertexAttribPointer]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.bool, core.int, core.int]),
-      [dartx.viewport]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.texImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
-      [dartx.texImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData]),
-      [dartx.texSubImage2DUntyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic]),
-      [dartx.texSubImage2DTyped]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, core.int, typed_data.TypedData])
-    }),
-    sfields: () => ({
-      ACTIVE_ATTRIBUTES: core.int,
-      ACTIVE_TEXTURE: core.int,
-      ACTIVE_UNIFORMS: core.int,
-      ALIASED_LINE_WIDTH_RANGE: core.int,
-      ALIASED_POINT_SIZE_RANGE: core.int,
-      ALPHA: core.int,
-      ALPHA_BITS: core.int,
-      ALWAYS: core.int,
-      ARRAY_BUFFER: core.int,
-      ARRAY_BUFFER_BINDING: core.int,
-      ATTACHED_SHADERS: core.int,
-      BACK: core.int,
-      BLEND: core.int,
-      BLEND_COLOR: core.int,
-      BLEND_DST_ALPHA: core.int,
-      BLEND_DST_RGB: core.int,
-      BLEND_EQUATION: core.int,
-      BLEND_EQUATION_ALPHA: core.int,
-      BLEND_EQUATION_RGB: core.int,
-      BLEND_SRC_ALPHA: core.int,
-      BLEND_SRC_RGB: core.int,
-      BLUE_BITS: core.int,
-      BOOL: core.int,
-      BOOL_VEC2: core.int,
-      BOOL_VEC3: core.int,
-      BOOL_VEC4: core.int,
-      BROWSER_DEFAULT_WEBGL: core.int,
-      BUFFER_SIZE: core.int,
-      BUFFER_USAGE: core.int,
-      BYTE: core.int,
-      CCW: core.int,
-      CLAMP_TO_EDGE: core.int,
-      COLOR_ATTACHMENT0: core.int,
-      COLOR_BUFFER_BIT: core.int,
-      COLOR_CLEAR_VALUE: core.int,
-      COLOR_WRITEMASK: core.int,
-      COMPILE_STATUS: core.int,
-      COMPRESSED_TEXTURE_FORMATS: core.int,
-      CONSTANT_ALPHA: core.int,
-      CONSTANT_COLOR: core.int,
-      CONTEXT_LOST_WEBGL: core.int,
-      CULL_FACE: core.int,
-      CULL_FACE_MODE: core.int,
-      CURRENT_PROGRAM: core.int,
-      CURRENT_VERTEX_ATTRIB: core.int,
-      CW: core.int,
-      DECR: core.int,
-      DECR_WRAP: core.int,
-      DELETE_STATUS: core.int,
-      DEPTH_ATTACHMENT: core.int,
-      DEPTH_BITS: core.int,
-      DEPTH_BUFFER_BIT: core.int,
-      DEPTH_CLEAR_VALUE: core.int,
-      DEPTH_COMPONENT: core.int,
-      DEPTH_COMPONENT16: core.int,
-      DEPTH_FUNC: core.int,
-      DEPTH_RANGE: core.int,
-      DEPTH_STENCIL: core.int,
-      DEPTH_STENCIL_ATTACHMENT: core.int,
-      DEPTH_TEST: core.int,
-      DEPTH_WRITEMASK: core.int,
-      DITHER: core.int,
-      DONT_CARE: core.int,
-      DST_ALPHA: core.int,
-      DST_COLOR: core.int,
-      DYNAMIC_DRAW: core.int,
-      ELEMENT_ARRAY_BUFFER: core.int,
-      ELEMENT_ARRAY_BUFFER_BINDING: core.int,
-      EQUAL: core.int,
-      FASTEST: core.int,
-      FLOAT: core.int,
-      FLOAT_MAT2: core.int,
-      FLOAT_MAT3: core.int,
-      FLOAT_MAT4: core.int,
-      FLOAT_VEC2: core.int,
-      FLOAT_VEC3: core.int,
-      FLOAT_VEC4: core.int,
-      FRAGMENT_SHADER: core.int,
-      FRAMEBUFFER: core.int,
-      FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: core.int,
-      FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE: core.int,
-      FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE: core.int,
-      FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL: core.int,
-      FRAMEBUFFER_BINDING: core.int,
-      FRAMEBUFFER_COMPLETE: core.int,
-      FRAMEBUFFER_INCOMPLETE_ATTACHMENT: core.int,
-      FRAMEBUFFER_INCOMPLETE_DIMENSIONS: core.int,
-      FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: core.int,
-      FRAMEBUFFER_UNSUPPORTED: core.int,
-      FRONT: core.int,
-      FRONT_AND_BACK: core.int,
-      FRONT_FACE: core.int,
-      FUNC_ADD: core.int,
-      FUNC_REVERSE_SUBTRACT: core.int,
-      FUNC_SUBTRACT: core.int,
-      GENERATE_MIPMAP_HINT: core.int,
-      GEQUAL: core.int,
-      GREATER: core.int,
-      GREEN_BITS: core.int,
-      HIGH_FLOAT: core.int,
-      HIGH_INT: core.int,
-      IMPLEMENTATION_COLOR_READ_FORMAT: core.int,
-      IMPLEMENTATION_COLOR_READ_TYPE: core.int,
-      INCR: core.int,
-      INCR_WRAP: core.int,
-      INT: core.int,
-      INT_VEC2: core.int,
-      INT_VEC3: core.int,
-      INT_VEC4: core.int,
-      INVALID_ENUM: core.int,
-      INVALID_FRAMEBUFFER_OPERATION: core.int,
-      INVALID_OPERATION: core.int,
-      INVALID_VALUE: core.int,
-      INVERT: core.int,
-      KEEP: core.int,
-      LEQUAL: core.int,
-      LESS: core.int,
-      LINEAR: core.int,
-      LINEAR_MIPMAP_LINEAR: core.int,
-      LINEAR_MIPMAP_NEAREST: core.int,
-      LINES: core.int,
-      LINE_LOOP: core.int,
-      LINE_STRIP: core.int,
-      LINE_WIDTH: core.int,
-      LINK_STATUS: core.int,
-      LOW_FLOAT: core.int,
-      LOW_INT: core.int,
-      LUMINANCE: core.int,
-      LUMINANCE_ALPHA: core.int,
-      MAX_COMBINED_TEXTURE_IMAGE_UNITS: core.int,
-      MAX_CUBE_MAP_TEXTURE_SIZE: core.int,
-      MAX_FRAGMENT_UNIFORM_VECTORS: core.int,
-      MAX_RENDERBUFFER_SIZE: core.int,
-      MAX_TEXTURE_IMAGE_UNITS: core.int,
-      MAX_TEXTURE_SIZE: core.int,
-      MAX_VARYING_VECTORS: core.int,
-      MAX_VERTEX_ATTRIBS: core.int,
-      MAX_VERTEX_TEXTURE_IMAGE_UNITS: core.int,
-      MAX_VERTEX_UNIFORM_VECTORS: core.int,
-      MAX_VIEWPORT_DIMS: core.int,
-      MEDIUM_FLOAT: core.int,
-      MEDIUM_INT: core.int,
-      MIRRORED_REPEAT: core.int,
-      NEAREST: core.int,
-      NEAREST_MIPMAP_LINEAR: core.int,
-      NEAREST_MIPMAP_NEAREST: core.int,
-      NEVER: core.int,
-      NICEST: core.int,
-      NONE: core.int,
-      NOTEQUAL: core.int,
-      NO_ERROR: core.int,
-      ONE: core.int,
-      ONE_MINUS_CONSTANT_ALPHA: core.int,
-      ONE_MINUS_CONSTANT_COLOR: core.int,
-      ONE_MINUS_DST_ALPHA: core.int,
-      ONE_MINUS_DST_COLOR: core.int,
-      ONE_MINUS_SRC_ALPHA: core.int,
-      ONE_MINUS_SRC_COLOR: core.int,
-      OUT_OF_MEMORY: core.int,
-      PACK_ALIGNMENT: core.int,
-      POINTS: core.int,
-      POLYGON_OFFSET_FACTOR: core.int,
-      POLYGON_OFFSET_FILL: core.int,
-      POLYGON_OFFSET_UNITS: core.int,
-      RED_BITS: core.int,
-      RENDERBUFFER: core.int,
-      RENDERBUFFER_ALPHA_SIZE: core.int,
-      RENDERBUFFER_BINDING: core.int,
-      RENDERBUFFER_BLUE_SIZE: core.int,
-      RENDERBUFFER_DEPTH_SIZE: core.int,
-      RENDERBUFFER_GREEN_SIZE: core.int,
-      RENDERBUFFER_HEIGHT: core.int,
-      RENDERBUFFER_INTERNAL_FORMAT: core.int,
-      RENDERBUFFER_RED_SIZE: core.int,
-      RENDERBUFFER_STENCIL_SIZE: core.int,
-      RENDERBUFFER_WIDTH: core.int,
-      RENDERER: core.int,
-      REPEAT: core.int,
-      REPLACE: core.int,
-      RGB: core.int,
-      RGB565: core.int,
-      RGB5_A1: core.int,
-      RGBA: core.int,
-      RGBA4: core.int,
-      SAMPLER_2D: core.int,
-      SAMPLER_CUBE: core.int,
-      SAMPLES: core.int,
-      SAMPLE_ALPHA_TO_COVERAGE: core.int,
-      SAMPLE_BUFFERS: core.int,
-      SAMPLE_COVERAGE: core.int,
-      SAMPLE_COVERAGE_INVERT: core.int,
-      SAMPLE_COVERAGE_VALUE: core.int,
-      SCISSOR_BOX: core.int,
-      SCISSOR_TEST: core.int,
-      SHADER_TYPE: core.int,
-      SHADING_LANGUAGE_VERSION: core.int,
-      SHORT: core.int,
-      SRC_ALPHA: core.int,
-      SRC_ALPHA_SATURATE: core.int,
-      SRC_COLOR: core.int,
-      STATIC_DRAW: core.int,
-      STENCIL_ATTACHMENT: core.int,
-      STENCIL_BACK_FAIL: core.int,
-      STENCIL_BACK_FUNC: core.int,
-      STENCIL_BACK_PASS_DEPTH_FAIL: core.int,
-      STENCIL_BACK_PASS_DEPTH_PASS: core.int,
-      STENCIL_BACK_REF: core.int,
-      STENCIL_BACK_VALUE_MASK: core.int,
-      STENCIL_BACK_WRITEMASK: core.int,
-      STENCIL_BITS: core.int,
-      STENCIL_BUFFER_BIT: core.int,
-      STENCIL_CLEAR_VALUE: core.int,
-      STENCIL_FAIL: core.int,
-      STENCIL_FUNC: core.int,
-      STENCIL_INDEX: core.int,
-      STENCIL_INDEX8: core.int,
-      STENCIL_PASS_DEPTH_FAIL: core.int,
-      STENCIL_PASS_DEPTH_PASS: core.int,
-      STENCIL_REF: core.int,
-      STENCIL_TEST: core.int,
-      STENCIL_VALUE_MASK: core.int,
-      STENCIL_WRITEMASK: core.int,
-      STREAM_DRAW: core.int,
-      SUBPIXEL_BITS: core.int,
-      TEXTURE: core.int,
-      TEXTURE0: core.int,
-      TEXTURE1: core.int,
-      TEXTURE10: core.int,
-      TEXTURE11: core.int,
-      TEXTURE12: core.int,
-      TEXTURE13: core.int,
-      TEXTURE14: core.int,
-      TEXTURE15: core.int,
-      TEXTURE16: core.int,
-      TEXTURE17: core.int,
-      TEXTURE18: core.int,
-      TEXTURE19: core.int,
-      TEXTURE2: core.int,
-      TEXTURE20: core.int,
-      TEXTURE21: core.int,
-      TEXTURE22: core.int,
-      TEXTURE23: core.int,
-      TEXTURE24: core.int,
-      TEXTURE25: core.int,
-      TEXTURE26: core.int,
-      TEXTURE27: core.int,
-      TEXTURE28: core.int,
-      TEXTURE29: core.int,
-      TEXTURE3: core.int,
-      TEXTURE30: core.int,
-      TEXTURE31: core.int,
-      TEXTURE4: core.int,
-      TEXTURE5: core.int,
-      TEXTURE6: core.int,
-      TEXTURE7: core.int,
-      TEXTURE8: core.int,
-      TEXTURE9: core.int,
-      TEXTURE_2D: core.int,
-      TEXTURE_BINDING_2D: core.int,
-      TEXTURE_BINDING_CUBE_MAP: core.int,
-      TEXTURE_CUBE_MAP: core.int,
-      TEXTURE_CUBE_MAP_NEGATIVE_X: core.int,
-      TEXTURE_CUBE_MAP_NEGATIVE_Y: core.int,
-      TEXTURE_CUBE_MAP_NEGATIVE_Z: core.int,
-      TEXTURE_CUBE_MAP_POSITIVE_X: core.int,
-      TEXTURE_CUBE_MAP_POSITIVE_Y: core.int,
-      TEXTURE_CUBE_MAP_POSITIVE_Z: core.int,
-      TEXTURE_MAG_FILTER: core.int,
-      TEXTURE_MIN_FILTER: core.int,
-      TEXTURE_WRAP_S: core.int,
-      TEXTURE_WRAP_T: core.int,
-      TRIANGLES: core.int,
-      TRIANGLE_FAN: core.int,
-      TRIANGLE_STRIP: core.int,
-      UNPACK_ALIGNMENT: core.int,
-      UNPACK_COLORSPACE_CONVERSION_WEBGL: core.int,
-      UNPACK_FLIP_Y_WEBGL: core.int,
-      UNPACK_PREMULTIPLY_ALPHA_WEBGL: core.int,
-      UNSIGNED_BYTE: core.int,
-      UNSIGNED_INT: core.int,
-      UNSIGNED_SHORT: core.int,
-      UNSIGNED_SHORT_4_4_4_4: core.int,
-      UNSIGNED_SHORT_5_5_5_1: core.int,
-      UNSIGNED_SHORT_5_6_5: core.int,
-      VALIDATE_STATUS: core.int,
-      VENDOR: core.int,
-      VERSION: core.int,
-      VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: core.int,
-      VERTEX_ATTRIB_ARRAY_ENABLED: core.int,
-      VERTEX_ATTRIB_ARRAY_NORMALIZED: core.int,
-      VERTEX_ATTRIB_ARRAY_POINTER: core.int,
-      VERTEX_ATTRIB_ARRAY_SIZE: core.int,
-      VERTEX_ATTRIB_ARRAY_STRIDE: core.int,
-      VERTEX_ATTRIB_ARRAY_TYPE: core.int,
-      VERTEX_SHADER: core.int,
-      VIEWPORT: core.int,
-      ZERO: core.int
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  web_gl.RenderingContext.ACTIVE_ATTRIBUTES = 35721;
-  web_gl.RenderingContext.ACTIVE_TEXTURE = 34016;
-  web_gl.RenderingContext.ACTIVE_UNIFORMS = 35718;
-  web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE = 33902;
-  web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE = 33901;
-  web_gl.RenderingContext.ALPHA = 6406;
-  web_gl.RenderingContext.ALPHA_BITS = 3413;
-  web_gl.RenderingContext.ALWAYS = 519;
-  web_gl.RenderingContext.ARRAY_BUFFER = 34962;
-  web_gl.RenderingContext.ARRAY_BUFFER_BINDING = 34964;
-  web_gl.RenderingContext.ATTACHED_SHADERS = 35717;
-  web_gl.RenderingContext.BACK = 1029;
-  web_gl.RenderingContext.BLEND = 3042;
-  web_gl.RenderingContext.BLEND_COLOR = 32773;
-  web_gl.RenderingContext.BLEND_DST_ALPHA = 32970;
-  web_gl.RenderingContext.BLEND_DST_RGB = 32968;
-  web_gl.RenderingContext.BLEND_EQUATION = 32777;
-  web_gl.RenderingContext.BLEND_EQUATION_ALPHA = 34877;
-  web_gl.RenderingContext.BLEND_EQUATION_RGB = 32777;
-  web_gl.RenderingContext.BLEND_SRC_ALPHA = 32971;
-  web_gl.RenderingContext.BLEND_SRC_RGB = 32969;
-  web_gl.RenderingContext.BLUE_BITS = 3412;
-  web_gl.RenderingContext.BOOL = 35670;
-  web_gl.RenderingContext.BOOL_VEC2 = 35671;
-  web_gl.RenderingContext.BOOL_VEC3 = 35672;
-  web_gl.RenderingContext.BOOL_VEC4 = 35673;
-  web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL = 37444;
-  web_gl.RenderingContext.BUFFER_SIZE = 34660;
-  web_gl.RenderingContext.BUFFER_USAGE = 34661;
-  web_gl.RenderingContext.BYTE = 5120;
-  web_gl.RenderingContext.CCW = 2305;
-  web_gl.RenderingContext.CLAMP_TO_EDGE = 33071;
-  web_gl.RenderingContext.COLOR_ATTACHMENT0 = 36064;
-  web_gl.RenderingContext.COLOR_BUFFER_BIT = 16384;
-  web_gl.RenderingContext.COLOR_CLEAR_VALUE = 3106;
-  web_gl.RenderingContext.COLOR_WRITEMASK = 3107;
-  web_gl.RenderingContext.COMPILE_STATUS = 35713;
-  web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS = 34467;
-  web_gl.RenderingContext.CONSTANT_ALPHA = 32771;
-  web_gl.RenderingContext.CONSTANT_COLOR = 32769;
-  web_gl.RenderingContext.CONTEXT_LOST_WEBGL = 37442;
-  web_gl.RenderingContext.CULL_FACE = 2884;
-  web_gl.RenderingContext.CULL_FACE_MODE = 2885;
-  web_gl.RenderingContext.CURRENT_PROGRAM = 35725;
-  web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB = 34342;
-  web_gl.RenderingContext.CW = 2304;
-  web_gl.RenderingContext.DECR = 7683;
-  web_gl.RenderingContext.DECR_WRAP = 34056;
-  web_gl.RenderingContext.DELETE_STATUS = 35712;
-  web_gl.RenderingContext.DEPTH_ATTACHMENT = 36096;
-  web_gl.RenderingContext.DEPTH_BITS = 3414;
-  web_gl.RenderingContext.DEPTH_BUFFER_BIT = 256;
-  web_gl.RenderingContext.DEPTH_CLEAR_VALUE = 2931;
-  web_gl.RenderingContext.DEPTH_COMPONENT = 6402;
-  web_gl.RenderingContext.DEPTH_COMPONENT16 = 33189;
-  web_gl.RenderingContext.DEPTH_FUNC = 2932;
-  web_gl.RenderingContext.DEPTH_RANGE = 2928;
-  web_gl.RenderingContext.DEPTH_STENCIL = 34041;
-  web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT = 33306;
-  web_gl.RenderingContext.DEPTH_TEST = 2929;
-  web_gl.RenderingContext.DEPTH_WRITEMASK = 2930;
-  web_gl.RenderingContext.DITHER = 3024;
-  web_gl.RenderingContext.DONT_CARE = 4352;
-  web_gl.RenderingContext.DST_ALPHA = 772;
-  web_gl.RenderingContext.DST_COLOR = 774;
-  web_gl.RenderingContext.DYNAMIC_DRAW = 35048;
-  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER = 34963;
-  web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING = 34965;
-  web_gl.RenderingContext.EQUAL = 514;
-  web_gl.RenderingContext.FASTEST = 4353;
-  web_gl.RenderingContext.FLOAT = 5126;
-  web_gl.RenderingContext.FLOAT_MAT2 = 35674;
-  web_gl.RenderingContext.FLOAT_MAT3 = 35675;
-  web_gl.RenderingContext.FLOAT_MAT4 = 35676;
-  web_gl.RenderingContext.FLOAT_VEC2 = 35664;
-  web_gl.RenderingContext.FLOAT_VEC3 = 35665;
-  web_gl.RenderingContext.FLOAT_VEC4 = 35666;
-  web_gl.RenderingContext.FRAGMENT_SHADER = 35632;
-  web_gl.RenderingContext.FRAMEBUFFER = 36160;
-  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 36049;
-  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 36048;
-  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 36051;
-  web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 36050;
-  web_gl.RenderingContext.FRAMEBUFFER_BINDING = 36006;
-  web_gl.RenderingContext.FRAMEBUFFER_COMPLETE = 36053;
-  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 36054;
-  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 36057;
-  web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 36055;
-  web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED = 36061;
-  web_gl.RenderingContext.FRONT = 1028;
-  web_gl.RenderingContext.FRONT_AND_BACK = 1032;
-  web_gl.RenderingContext.FRONT_FACE = 2886;
-  web_gl.RenderingContext.FUNC_ADD = 32774;
-  web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT = 32779;
-  web_gl.RenderingContext.FUNC_SUBTRACT = 32778;
-  web_gl.RenderingContext.GENERATE_MIPMAP_HINT = 33170;
-  web_gl.RenderingContext.GEQUAL = 518;
-  web_gl.RenderingContext.GREATER = 516;
-  web_gl.RenderingContext.GREEN_BITS = 3411;
-  web_gl.RenderingContext.HIGH_FLOAT = 36338;
-  web_gl.RenderingContext.HIGH_INT = 36341;
-  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_FORMAT = 35739;
-  web_gl.RenderingContext.IMPLEMENTATION_COLOR_READ_TYPE = 35738;
-  web_gl.RenderingContext.INCR = 7682;
-  web_gl.RenderingContext.INCR_WRAP = 34055;
-  web_gl.RenderingContext.INT = 5124;
-  web_gl.RenderingContext.INT_VEC2 = 35667;
-  web_gl.RenderingContext.INT_VEC3 = 35668;
-  web_gl.RenderingContext.INT_VEC4 = 35669;
-  web_gl.RenderingContext.INVALID_ENUM = 1280;
-  web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION = 1286;
-  web_gl.RenderingContext.INVALID_OPERATION = 1282;
-  web_gl.RenderingContext.INVALID_VALUE = 1281;
-  web_gl.RenderingContext.INVERT = 5386;
-  web_gl.RenderingContext.KEEP = 7680;
-  web_gl.RenderingContext.LEQUAL = 515;
-  web_gl.RenderingContext.LESS = 513;
-  web_gl.RenderingContext.LINEAR = 9729;
-  web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR = 9987;
-  web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST = 9985;
-  web_gl.RenderingContext.LINES = 1;
-  web_gl.RenderingContext.LINE_LOOP = 2;
-  web_gl.RenderingContext.LINE_STRIP = 3;
-  web_gl.RenderingContext.LINE_WIDTH = 2849;
-  web_gl.RenderingContext.LINK_STATUS = 35714;
-  web_gl.RenderingContext.LOW_FLOAT = 36336;
-  web_gl.RenderingContext.LOW_INT = 36339;
-  web_gl.RenderingContext.LUMINANCE = 6409;
-  web_gl.RenderingContext.LUMINANCE_ALPHA = 6410;
-  web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 35661;
-  web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE = 34076;
-  web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS = 36349;
-  web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE = 34024;
-  web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS = 34930;
-  web_gl.RenderingContext.MAX_TEXTURE_SIZE = 3379;
-  web_gl.RenderingContext.MAX_VARYING_VECTORS = 36348;
-  web_gl.RenderingContext.MAX_VERTEX_ATTRIBS = 34921;
-  web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 35660;
-  web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS = 36347;
-  web_gl.RenderingContext.MAX_VIEWPORT_DIMS = 3386;
-  web_gl.RenderingContext.MEDIUM_FLOAT = 36337;
-  web_gl.RenderingContext.MEDIUM_INT = 36340;
-  web_gl.RenderingContext.MIRRORED_REPEAT = 33648;
-  web_gl.RenderingContext.NEAREST = 9728;
-  web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR = 9986;
-  web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST = 9984;
-  web_gl.RenderingContext.NEVER = 512;
-  web_gl.RenderingContext.NICEST = 4354;
-  web_gl.RenderingContext.NONE = 0;
-  web_gl.RenderingContext.NOTEQUAL = 517;
-  web_gl.RenderingContext.NO_ERROR = 0;
-  web_gl.RenderingContext.ONE = 1;
-  web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA = 32772;
-  web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR = 32770;
-  web_gl.RenderingContext.ONE_MINUS_DST_ALPHA = 773;
-  web_gl.RenderingContext.ONE_MINUS_DST_COLOR = 775;
-  web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA = 771;
-  web_gl.RenderingContext.ONE_MINUS_SRC_COLOR = 769;
-  web_gl.RenderingContext.OUT_OF_MEMORY = 1285;
-  web_gl.RenderingContext.PACK_ALIGNMENT = 3333;
-  web_gl.RenderingContext.POINTS = 0;
-  web_gl.RenderingContext.POLYGON_OFFSET_FACTOR = 32824;
-  web_gl.RenderingContext.POLYGON_OFFSET_FILL = 32823;
-  web_gl.RenderingContext.POLYGON_OFFSET_UNITS = 10752;
-  web_gl.RenderingContext.RED_BITS = 3410;
-  web_gl.RenderingContext.RENDERBUFFER = 36161;
-  web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE = 36179;
-  web_gl.RenderingContext.RENDERBUFFER_BINDING = 36007;
-  web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE = 36178;
-  web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE = 36180;
-  web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE = 36177;
-  web_gl.RenderingContext.RENDERBUFFER_HEIGHT = 36163;
-  web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT = 36164;
-  web_gl.RenderingContext.RENDERBUFFER_RED_SIZE = 36176;
-  web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE = 36181;
-  web_gl.RenderingContext.RENDERBUFFER_WIDTH = 36162;
-  web_gl.RenderingContext.RENDERER = 7937;
-  web_gl.RenderingContext.REPEAT = 10497;
-  web_gl.RenderingContext.REPLACE = 7681;
-  web_gl.RenderingContext.RGB = 6407;
-  web_gl.RenderingContext.RGB565 = 36194;
-  web_gl.RenderingContext.RGB5_A1 = 32855;
-  web_gl.RenderingContext.RGBA = 6408;
-  web_gl.RenderingContext.RGBA4 = 32854;
-  web_gl.RenderingContext.SAMPLER_2D = 35678;
-  web_gl.RenderingContext.SAMPLER_CUBE = 35680;
-  web_gl.RenderingContext.SAMPLES = 32937;
-  web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE = 32926;
-  web_gl.RenderingContext.SAMPLE_BUFFERS = 32936;
-  web_gl.RenderingContext.SAMPLE_COVERAGE = 32928;
-  web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT = 32939;
-  web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE = 32938;
-  web_gl.RenderingContext.SCISSOR_BOX = 3088;
-  web_gl.RenderingContext.SCISSOR_TEST = 3089;
-  web_gl.RenderingContext.SHADER_TYPE = 35663;
-  web_gl.RenderingContext.SHADING_LANGUAGE_VERSION = 35724;
-  web_gl.RenderingContext.SHORT = 5122;
-  web_gl.RenderingContext.SRC_ALPHA = 770;
-  web_gl.RenderingContext.SRC_ALPHA_SATURATE = 776;
-  web_gl.RenderingContext.SRC_COLOR = 768;
-  web_gl.RenderingContext.STATIC_DRAW = 35044;
-  web_gl.RenderingContext.STENCIL_ATTACHMENT = 36128;
-  web_gl.RenderingContext.STENCIL_BACK_FAIL = 34817;
-  web_gl.RenderingContext.STENCIL_BACK_FUNC = 34816;
-  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL = 34818;
-  web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS = 34819;
-  web_gl.RenderingContext.STENCIL_BACK_REF = 36003;
-  web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK = 36004;
-  web_gl.RenderingContext.STENCIL_BACK_WRITEMASK = 36005;
-  web_gl.RenderingContext.STENCIL_BITS = 3415;
-  web_gl.RenderingContext.STENCIL_BUFFER_BIT = 1024;
-  web_gl.RenderingContext.STENCIL_CLEAR_VALUE = 2961;
-  web_gl.RenderingContext.STENCIL_FAIL = 2964;
-  web_gl.RenderingContext.STENCIL_FUNC = 2962;
-  web_gl.RenderingContext.STENCIL_INDEX = 6401;
-  web_gl.RenderingContext.STENCIL_INDEX8 = 36168;
-  web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL = 2965;
-  web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS = 2966;
-  web_gl.RenderingContext.STENCIL_REF = 2967;
-  web_gl.RenderingContext.STENCIL_TEST = 2960;
-  web_gl.RenderingContext.STENCIL_VALUE_MASK = 2963;
-  web_gl.RenderingContext.STENCIL_WRITEMASK = 2968;
-  web_gl.RenderingContext.STREAM_DRAW = 35040;
-  web_gl.RenderingContext.SUBPIXEL_BITS = 3408;
-  web_gl.RenderingContext.TEXTURE = 5890;
-  web_gl.RenderingContext.TEXTURE0 = 33984;
-  web_gl.RenderingContext.TEXTURE1 = 33985;
-  web_gl.RenderingContext.TEXTURE10 = 33994;
-  web_gl.RenderingContext.TEXTURE11 = 33995;
-  web_gl.RenderingContext.TEXTURE12 = 33996;
-  web_gl.RenderingContext.TEXTURE13 = 33997;
-  web_gl.RenderingContext.TEXTURE14 = 33998;
-  web_gl.RenderingContext.TEXTURE15 = 33999;
-  web_gl.RenderingContext.TEXTURE16 = 34000;
-  web_gl.RenderingContext.TEXTURE17 = 34001;
-  web_gl.RenderingContext.TEXTURE18 = 34002;
-  web_gl.RenderingContext.TEXTURE19 = 34003;
-  web_gl.RenderingContext.TEXTURE2 = 33986;
-  web_gl.RenderingContext.TEXTURE20 = 34004;
-  web_gl.RenderingContext.TEXTURE21 = 34005;
-  web_gl.RenderingContext.TEXTURE22 = 34006;
-  web_gl.RenderingContext.TEXTURE23 = 34007;
-  web_gl.RenderingContext.TEXTURE24 = 34008;
-  web_gl.RenderingContext.TEXTURE25 = 34009;
-  web_gl.RenderingContext.TEXTURE26 = 34010;
-  web_gl.RenderingContext.TEXTURE27 = 34011;
-  web_gl.RenderingContext.TEXTURE28 = 34012;
-  web_gl.RenderingContext.TEXTURE29 = 34013;
-  web_gl.RenderingContext.TEXTURE3 = 33987;
-  web_gl.RenderingContext.TEXTURE30 = 34014;
-  web_gl.RenderingContext.TEXTURE31 = 34015;
-  web_gl.RenderingContext.TEXTURE4 = 33988;
-  web_gl.RenderingContext.TEXTURE5 = 33989;
-  web_gl.RenderingContext.TEXTURE6 = 33990;
-  web_gl.RenderingContext.TEXTURE7 = 33991;
-  web_gl.RenderingContext.TEXTURE8 = 33992;
-  web_gl.RenderingContext.TEXTURE9 = 33993;
-  web_gl.RenderingContext.TEXTURE_2D = 3553;
-  web_gl.RenderingContext.TEXTURE_BINDING_2D = 32873;
-  web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP = 34068;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP = 34067;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X = 34069;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071;
-  web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073;
-  web_gl.RenderingContext.TEXTURE_MAG_FILTER = 10240;
-  web_gl.RenderingContext.TEXTURE_MIN_FILTER = 10241;
-  web_gl.RenderingContext.TEXTURE_WRAP_S = 10242;
-  web_gl.RenderingContext.TEXTURE_WRAP_T = 10243;
-  web_gl.RenderingContext.TRIANGLES = 4;
-  web_gl.RenderingContext.TRIANGLE_FAN = 6;
-  web_gl.RenderingContext.TRIANGLE_STRIP = 5;
-  web_gl.RenderingContext.UNPACK_ALIGNMENT = 3317;
-  web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL = 37443;
-  web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL = 37440;
-  web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 37441;
-  web_gl.RenderingContext.UNSIGNED_BYTE = 5121;
-  web_gl.RenderingContext.UNSIGNED_INT = 5125;
-  web_gl.RenderingContext.UNSIGNED_SHORT = 5123;
-  web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4 = 32819;
-  web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1 = 32820;
-  web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5 = 33635;
-  web_gl.RenderingContext.VALIDATE_STATUS = 35715;
-  web_gl.RenderingContext.VENDOR = 7936;
-  web_gl.RenderingContext.VERSION = 7938;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 34975;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED = 34338;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED = 34922;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER = 34373;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE = 34339;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE = 34340;
-  web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE = 34341;
-  web_gl.RenderingContext.VERTEX_SHADER = 35633;
-  web_gl.RenderingContext.VIEWPORT = 2978;
-  web_gl.RenderingContext.ZERO = 0;
-  dart.registerExtension(dart.global.WebGLRenderingContext, web_gl.RenderingContext);
-  web_gl.ACTIVE_ATTRIBUTES = web_gl.RenderingContext.ACTIVE_ATTRIBUTES;
-  web_gl.ACTIVE_TEXTURE = web_gl.RenderingContext.ACTIVE_TEXTURE;
-  web_gl.ACTIVE_UNIFORMS = web_gl.RenderingContext.ACTIVE_UNIFORMS;
-  web_gl.ALIASED_LINE_WIDTH_RANGE = web_gl.RenderingContext.ALIASED_LINE_WIDTH_RANGE;
-  web_gl.ALIASED_POINT_SIZE_RANGE = web_gl.RenderingContext.ALIASED_POINT_SIZE_RANGE;
-  web_gl.ALPHA = web_gl.RenderingContext.ALPHA;
-  web_gl.ALPHA_BITS = web_gl.RenderingContext.ALPHA_BITS;
-  web_gl.ALWAYS = web_gl.RenderingContext.ALWAYS;
-  web_gl.ARRAY_BUFFER = web_gl.RenderingContext.ARRAY_BUFFER;
-  web_gl.ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ARRAY_BUFFER_BINDING;
-  web_gl.ATTACHED_SHADERS = web_gl.RenderingContext.ATTACHED_SHADERS;
-  web_gl.BACK = web_gl.RenderingContext.BACK;
-  web_gl.BLEND = web_gl.RenderingContext.BLEND;
-  web_gl.BLEND_COLOR = web_gl.RenderingContext.BLEND_COLOR;
-  web_gl.BLEND_DST_ALPHA = web_gl.RenderingContext.BLEND_DST_ALPHA;
-  web_gl.BLEND_DST_RGB = web_gl.RenderingContext.BLEND_DST_RGB;
-  web_gl.BLEND_EQUATION = web_gl.RenderingContext.BLEND_EQUATION;
-  web_gl.BLEND_EQUATION_ALPHA = web_gl.RenderingContext.BLEND_EQUATION_ALPHA;
-  web_gl.BLEND_EQUATION_RGB = web_gl.RenderingContext.BLEND_EQUATION_RGB;
-  web_gl.BLEND_SRC_ALPHA = web_gl.RenderingContext.BLEND_SRC_ALPHA;
-  web_gl.BLEND_SRC_RGB = web_gl.RenderingContext.BLEND_SRC_RGB;
-  web_gl.BLUE_BITS = web_gl.RenderingContext.BLUE_BITS;
-  web_gl.BOOL = web_gl.RenderingContext.BOOL;
-  web_gl.BOOL_VEC2 = web_gl.RenderingContext.BOOL_VEC2;
-  web_gl.BOOL_VEC3 = web_gl.RenderingContext.BOOL_VEC3;
-  web_gl.BOOL_VEC4 = web_gl.RenderingContext.BOOL_VEC4;
-  web_gl.BROWSER_DEFAULT_WEBGL = web_gl.RenderingContext.BROWSER_DEFAULT_WEBGL;
-  web_gl.BUFFER_SIZE = web_gl.RenderingContext.BUFFER_SIZE;
-  web_gl.BUFFER_USAGE = web_gl.RenderingContext.BUFFER_USAGE;
-  web_gl.BYTE = web_gl.RenderingContext.BYTE;
-  web_gl.CCW = web_gl.RenderingContext.CCW;
-  web_gl.CLAMP_TO_EDGE = web_gl.RenderingContext.CLAMP_TO_EDGE;
-  web_gl.COLOR_ATTACHMENT0 = web_gl.RenderingContext.COLOR_ATTACHMENT0;
-  web_gl.COLOR_BUFFER_BIT = web_gl.RenderingContext.COLOR_BUFFER_BIT;
-  web_gl.COLOR_CLEAR_VALUE = web_gl.RenderingContext.COLOR_CLEAR_VALUE;
-  web_gl.COLOR_WRITEMASK = web_gl.RenderingContext.COLOR_WRITEMASK;
-  web_gl.COMPILE_STATUS = web_gl.RenderingContext.COMPILE_STATUS;
-  web_gl.COMPRESSED_TEXTURE_FORMATS = web_gl.RenderingContext.COMPRESSED_TEXTURE_FORMATS;
-  web_gl.CONSTANT_ALPHA = web_gl.RenderingContext.CONSTANT_ALPHA;
-  web_gl.CONSTANT_COLOR = web_gl.RenderingContext.CONSTANT_COLOR;
-  web_gl.CONTEXT_LOST_WEBGL = web_gl.RenderingContext.CONTEXT_LOST_WEBGL;
-  web_gl.CULL_FACE = web_gl.RenderingContext.CULL_FACE;
-  web_gl.CULL_FACE_MODE = web_gl.RenderingContext.CULL_FACE_MODE;
-  web_gl.CURRENT_PROGRAM = web_gl.RenderingContext.CURRENT_PROGRAM;
-  web_gl.CURRENT_VERTEX_ATTRIB = web_gl.RenderingContext.CURRENT_VERTEX_ATTRIB;
-  web_gl.CW = web_gl.RenderingContext.CW;
-  web_gl.DECR = web_gl.RenderingContext.DECR;
-  web_gl.DECR_WRAP = web_gl.RenderingContext.DECR_WRAP;
-  web_gl.DELETE_STATUS = web_gl.RenderingContext.DELETE_STATUS;
-  web_gl.DEPTH_ATTACHMENT = web_gl.RenderingContext.DEPTH_ATTACHMENT;
-  web_gl.DEPTH_BITS = web_gl.RenderingContext.DEPTH_BITS;
-  web_gl.DEPTH_BUFFER_BIT = web_gl.RenderingContext.DEPTH_BUFFER_BIT;
-  web_gl.DEPTH_CLEAR_VALUE = web_gl.RenderingContext.DEPTH_CLEAR_VALUE;
-  web_gl.DEPTH_COMPONENT = web_gl.RenderingContext.DEPTH_COMPONENT;
-  web_gl.DEPTH_COMPONENT16 = web_gl.RenderingContext.DEPTH_COMPONENT16;
-  web_gl.DEPTH_FUNC = web_gl.RenderingContext.DEPTH_FUNC;
-  web_gl.DEPTH_RANGE = web_gl.RenderingContext.DEPTH_RANGE;
-  web_gl.DEPTH_STENCIL = web_gl.RenderingContext.DEPTH_STENCIL;
-  web_gl.DEPTH_STENCIL_ATTACHMENT = web_gl.RenderingContext.DEPTH_STENCIL_ATTACHMENT;
-  web_gl.DEPTH_TEST = web_gl.RenderingContext.DEPTH_TEST;
-  web_gl.DEPTH_WRITEMASK = web_gl.RenderingContext.DEPTH_WRITEMASK;
-  web_gl.DITHER = web_gl.RenderingContext.DITHER;
-  web_gl.DONT_CARE = web_gl.RenderingContext.DONT_CARE;
-  web_gl.DST_ALPHA = web_gl.RenderingContext.DST_ALPHA;
-  web_gl.DST_COLOR = web_gl.RenderingContext.DST_COLOR;
-  web_gl.DYNAMIC_DRAW = web_gl.RenderingContext.DYNAMIC_DRAW;
-  web_gl.ELEMENT_ARRAY_BUFFER = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER;
-  web_gl.ELEMENT_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.ELEMENT_ARRAY_BUFFER_BINDING;
-  web_gl.EQUAL = web_gl.RenderingContext.EQUAL;
-  web_gl.FASTEST = web_gl.RenderingContext.FASTEST;
-  web_gl.FLOAT = web_gl.RenderingContext.FLOAT;
-  web_gl.FLOAT_MAT2 = web_gl.RenderingContext.FLOAT_MAT2;
-  web_gl.FLOAT_MAT3 = web_gl.RenderingContext.FLOAT_MAT3;
-  web_gl.FLOAT_MAT4 = web_gl.RenderingContext.FLOAT_MAT4;
-  web_gl.FLOAT_VEC2 = web_gl.RenderingContext.FLOAT_VEC2;
-  web_gl.FLOAT_VEC3 = web_gl.RenderingContext.FLOAT_VEC3;
-  web_gl.FLOAT_VEC4 = web_gl.RenderingContext.FLOAT_VEC4;
-  web_gl.FRAGMENT_SHADER = web_gl.RenderingContext.FRAGMENT_SHADER;
-  web_gl.FRAMEBUFFER = web_gl.RenderingContext.FRAMEBUFFER;
-  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME;
-  web_gl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE;
-  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE;
-  web_gl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = web_gl.RenderingContext.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL;
-  web_gl.FRAMEBUFFER_BINDING = web_gl.RenderingContext.FRAMEBUFFER_BINDING;
-  web_gl.FRAMEBUFFER_COMPLETE = web_gl.RenderingContext.FRAMEBUFFER_COMPLETE;
-  web_gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_ATTACHMENT;
-  web_gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_DIMENSIONS;
-  web_gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = web_gl.RenderingContext.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT;
-  web_gl.FRAMEBUFFER_UNSUPPORTED = web_gl.RenderingContext.FRAMEBUFFER_UNSUPPORTED;
-  web_gl.FRONT = web_gl.RenderingContext.FRONT;
-  web_gl.FRONT_AND_BACK = web_gl.RenderingContext.FRONT_AND_BACK;
-  web_gl.FRONT_FACE = web_gl.RenderingContext.FRONT_FACE;
-  web_gl.FUNC_ADD = web_gl.RenderingContext.FUNC_ADD;
-  web_gl.FUNC_REVERSE_SUBTRACT = web_gl.RenderingContext.FUNC_REVERSE_SUBTRACT;
-  web_gl.FUNC_SUBTRACT = web_gl.RenderingContext.FUNC_SUBTRACT;
-  web_gl.GENERATE_MIPMAP_HINT = web_gl.RenderingContext.GENERATE_MIPMAP_HINT;
-  web_gl.GEQUAL = web_gl.RenderingContext.GEQUAL;
-  web_gl.GREATER = web_gl.RenderingContext.GREATER;
-  web_gl.GREEN_BITS = web_gl.RenderingContext.GREEN_BITS;
-  web_gl.OesTextureHalfFloat = class OesTextureHalfFloat extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesTextureHalfFloat, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloat, [])}),
-    sfields: () => ({HALF_FLOAT_OES: core.int})
-  });
-  web_gl.OesTextureHalfFloat.HALF_FLOAT_OES = 36193;
-  dart.registerExtension(dart.global.OESTextureHalfFloat, web_gl.OesTextureHalfFloat);
-  web_gl.HALF_FLOAT_OES = web_gl.OesTextureHalfFloat.HALF_FLOAT_OES;
-  web_gl.HIGH_FLOAT = web_gl.RenderingContext.HIGH_FLOAT;
-  web_gl.HIGH_INT = web_gl.RenderingContext.HIGH_INT;
-  web_gl.INCR = web_gl.RenderingContext.INCR;
-  web_gl.INCR_WRAP = web_gl.RenderingContext.INCR_WRAP;
-  web_gl.INT = web_gl.RenderingContext.INT;
-  web_gl.INT_VEC2 = web_gl.RenderingContext.INT_VEC2;
-  web_gl.INT_VEC3 = web_gl.RenderingContext.INT_VEC3;
-  web_gl.INT_VEC4 = web_gl.RenderingContext.INT_VEC4;
-  web_gl.INVALID_ENUM = web_gl.RenderingContext.INVALID_ENUM;
-  web_gl.INVALID_FRAMEBUFFER_OPERATION = web_gl.RenderingContext.INVALID_FRAMEBUFFER_OPERATION;
-  web_gl.INVALID_OPERATION = web_gl.RenderingContext.INVALID_OPERATION;
-  web_gl.INVALID_VALUE = web_gl.RenderingContext.INVALID_VALUE;
-  web_gl.INVERT = web_gl.RenderingContext.INVERT;
-  web_gl.KEEP = web_gl.RenderingContext.KEEP;
-  web_gl.LEQUAL = web_gl.RenderingContext.LEQUAL;
-  web_gl.LESS = web_gl.RenderingContext.LESS;
-  web_gl.LINEAR = web_gl.RenderingContext.LINEAR;
-  web_gl.LINEAR_MIPMAP_LINEAR = web_gl.RenderingContext.LINEAR_MIPMAP_LINEAR;
-  web_gl.LINEAR_MIPMAP_NEAREST = web_gl.RenderingContext.LINEAR_MIPMAP_NEAREST;
-  web_gl.LINES = web_gl.RenderingContext.LINES;
-  web_gl.LINE_LOOP = web_gl.RenderingContext.LINE_LOOP;
-  web_gl.LINE_STRIP = web_gl.RenderingContext.LINE_STRIP;
-  web_gl.LINE_WIDTH = web_gl.RenderingContext.LINE_WIDTH;
-  web_gl.LINK_STATUS = web_gl.RenderingContext.LINK_STATUS;
-  web_gl.LOW_FLOAT = web_gl.RenderingContext.LOW_FLOAT;
-  web_gl.LOW_INT = web_gl.RenderingContext.LOW_INT;
-  web_gl.LUMINANCE = web_gl.RenderingContext.LUMINANCE;
-  web_gl.LUMINANCE_ALPHA = web_gl.RenderingContext.LUMINANCE_ALPHA;
-  web_gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_COMBINED_TEXTURE_IMAGE_UNITS;
-  web_gl.MAX_CUBE_MAP_TEXTURE_SIZE = web_gl.RenderingContext.MAX_CUBE_MAP_TEXTURE_SIZE;
-  web_gl.MAX_FRAGMENT_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_FRAGMENT_UNIFORM_VECTORS;
-  web_gl.MAX_RENDERBUFFER_SIZE = web_gl.RenderingContext.MAX_RENDERBUFFER_SIZE;
-  web_gl.MAX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_TEXTURE_IMAGE_UNITS;
-  web_gl.MAX_TEXTURE_SIZE = web_gl.RenderingContext.MAX_TEXTURE_SIZE;
-  web_gl.MAX_VARYING_VECTORS = web_gl.RenderingContext.MAX_VARYING_VECTORS;
-  web_gl.MAX_VERTEX_ATTRIBS = web_gl.RenderingContext.MAX_VERTEX_ATTRIBS;
-  web_gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = web_gl.RenderingContext.MAX_VERTEX_TEXTURE_IMAGE_UNITS;
-  web_gl.MAX_VERTEX_UNIFORM_VECTORS = web_gl.RenderingContext.MAX_VERTEX_UNIFORM_VECTORS;
-  web_gl.MAX_VIEWPORT_DIMS = web_gl.RenderingContext.MAX_VIEWPORT_DIMS;
-  web_gl.MEDIUM_FLOAT = web_gl.RenderingContext.MEDIUM_FLOAT;
-  web_gl.MEDIUM_INT = web_gl.RenderingContext.MEDIUM_INT;
-  web_gl.MIRRORED_REPEAT = web_gl.RenderingContext.MIRRORED_REPEAT;
-  web_gl.NEAREST = web_gl.RenderingContext.NEAREST;
-  web_gl.NEAREST_MIPMAP_LINEAR = web_gl.RenderingContext.NEAREST_MIPMAP_LINEAR;
-  web_gl.NEAREST_MIPMAP_NEAREST = web_gl.RenderingContext.NEAREST_MIPMAP_NEAREST;
-  web_gl.NEVER = web_gl.RenderingContext.NEVER;
-  web_gl.NICEST = web_gl.RenderingContext.NICEST;
-  web_gl.NONE = web_gl.RenderingContext.NONE;
-  web_gl.NOTEQUAL = web_gl.RenderingContext.NOTEQUAL;
-  web_gl.NO_ERROR = web_gl.RenderingContext.NO_ERROR;
-  web_gl.ONE = web_gl.RenderingContext.ONE;
-  web_gl.ONE_MINUS_CONSTANT_ALPHA = web_gl.RenderingContext.ONE_MINUS_CONSTANT_ALPHA;
-  web_gl.ONE_MINUS_CONSTANT_COLOR = web_gl.RenderingContext.ONE_MINUS_CONSTANT_COLOR;
-  web_gl.ONE_MINUS_DST_ALPHA = web_gl.RenderingContext.ONE_MINUS_DST_ALPHA;
-  web_gl.ONE_MINUS_DST_COLOR = web_gl.RenderingContext.ONE_MINUS_DST_COLOR;
-  web_gl.ONE_MINUS_SRC_ALPHA = web_gl.RenderingContext.ONE_MINUS_SRC_ALPHA;
-  web_gl.ONE_MINUS_SRC_COLOR = web_gl.RenderingContext.ONE_MINUS_SRC_COLOR;
-  web_gl.OUT_OF_MEMORY = web_gl.RenderingContext.OUT_OF_MEMORY;
-  web_gl.PACK_ALIGNMENT = web_gl.RenderingContext.PACK_ALIGNMENT;
-  web_gl.POINTS = web_gl.RenderingContext.POINTS;
-  web_gl.POLYGON_OFFSET_FACTOR = web_gl.RenderingContext.POLYGON_OFFSET_FACTOR;
-  web_gl.POLYGON_OFFSET_FILL = web_gl.RenderingContext.POLYGON_OFFSET_FILL;
-  web_gl.POLYGON_OFFSET_UNITS = web_gl.RenderingContext.POLYGON_OFFSET_UNITS;
-  web_gl.RED_BITS = web_gl.RenderingContext.RED_BITS;
-  web_gl.RENDERBUFFER = web_gl.RenderingContext.RENDERBUFFER;
-  web_gl.RENDERBUFFER_ALPHA_SIZE = web_gl.RenderingContext.RENDERBUFFER_ALPHA_SIZE;
-  web_gl.RENDERBUFFER_BINDING = web_gl.RenderingContext.RENDERBUFFER_BINDING;
-  web_gl.RENDERBUFFER_BLUE_SIZE = web_gl.RenderingContext.RENDERBUFFER_BLUE_SIZE;
-  web_gl.RENDERBUFFER_DEPTH_SIZE = web_gl.RenderingContext.RENDERBUFFER_DEPTH_SIZE;
-  web_gl.RENDERBUFFER_GREEN_SIZE = web_gl.RenderingContext.RENDERBUFFER_GREEN_SIZE;
-  web_gl.RENDERBUFFER_HEIGHT = web_gl.RenderingContext.RENDERBUFFER_HEIGHT;
-  web_gl.RENDERBUFFER_INTERNAL_FORMAT = web_gl.RenderingContext.RENDERBUFFER_INTERNAL_FORMAT;
-  web_gl.RENDERBUFFER_RED_SIZE = web_gl.RenderingContext.RENDERBUFFER_RED_SIZE;
-  web_gl.RENDERBUFFER_STENCIL_SIZE = web_gl.RenderingContext.RENDERBUFFER_STENCIL_SIZE;
-  web_gl.RENDERBUFFER_WIDTH = web_gl.RenderingContext.RENDERBUFFER_WIDTH;
-  web_gl.RENDERER = web_gl.RenderingContext.RENDERER;
-  web_gl.REPEAT = web_gl.RenderingContext.REPEAT;
-  web_gl.REPLACE = web_gl.RenderingContext.REPLACE;
-  web_gl.RGB = web_gl.RenderingContext.RGB;
-  web_gl.RGB565 = web_gl.RenderingContext.RGB565;
-  web_gl.RGB5_A1 = web_gl.RenderingContext.RGB5_A1;
-  web_gl.RGBA = web_gl.RenderingContext.RGBA;
-  web_gl.RGBA4 = web_gl.RenderingContext.RGBA4;
-  web_gl.SAMPLER_2D = web_gl.RenderingContext.SAMPLER_2D;
-  web_gl.SAMPLER_CUBE = web_gl.RenderingContext.SAMPLER_CUBE;
-  web_gl.SAMPLES = web_gl.RenderingContext.SAMPLES;
-  web_gl.SAMPLE_ALPHA_TO_COVERAGE = web_gl.RenderingContext.SAMPLE_ALPHA_TO_COVERAGE;
-  web_gl.SAMPLE_BUFFERS = web_gl.RenderingContext.SAMPLE_BUFFERS;
-  web_gl.SAMPLE_COVERAGE = web_gl.RenderingContext.SAMPLE_COVERAGE;
-  web_gl.SAMPLE_COVERAGE_INVERT = web_gl.RenderingContext.SAMPLE_COVERAGE_INVERT;
-  web_gl.SAMPLE_COVERAGE_VALUE = web_gl.RenderingContext.SAMPLE_COVERAGE_VALUE;
-  web_gl.SCISSOR_BOX = web_gl.RenderingContext.SCISSOR_BOX;
-  web_gl.SCISSOR_TEST = web_gl.RenderingContext.SCISSOR_TEST;
-  web_gl.SHADER_TYPE = web_gl.RenderingContext.SHADER_TYPE;
-  web_gl.SHADING_LANGUAGE_VERSION = web_gl.RenderingContext.SHADING_LANGUAGE_VERSION;
-  web_gl.SHORT = web_gl.RenderingContext.SHORT;
-  web_gl.SRC_ALPHA = web_gl.RenderingContext.SRC_ALPHA;
-  web_gl.SRC_ALPHA_SATURATE = web_gl.RenderingContext.SRC_ALPHA_SATURATE;
-  web_gl.SRC_COLOR = web_gl.RenderingContext.SRC_COLOR;
-  web_gl.STATIC_DRAW = web_gl.RenderingContext.STATIC_DRAW;
-  web_gl.STENCIL_ATTACHMENT = web_gl.RenderingContext.STENCIL_ATTACHMENT;
-  web_gl.STENCIL_BACK_FAIL = web_gl.RenderingContext.STENCIL_BACK_FAIL;
-  web_gl.STENCIL_BACK_FUNC = web_gl.RenderingContext.STENCIL_BACK_FUNC;
-  web_gl.STENCIL_BACK_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_FAIL;
-  web_gl.STENCIL_BACK_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_BACK_PASS_DEPTH_PASS;
-  web_gl.STENCIL_BACK_REF = web_gl.RenderingContext.STENCIL_BACK_REF;
-  web_gl.STENCIL_BACK_VALUE_MASK = web_gl.RenderingContext.STENCIL_BACK_VALUE_MASK;
-  web_gl.STENCIL_BACK_WRITEMASK = web_gl.RenderingContext.STENCIL_BACK_WRITEMASK;
-  web_gl.STENCIL_BITS = web_gl.RenderingContext.STENCIL_BITS;
-  web_gl.STENCIL_BUFFER_BIT = web_gl.RenderingContext.STENCIL_BUFFER_BIT;
-  web_gl.STENCIL_CLEAR_VALUE = web_gl.RenderingContext.STENCIL_CLEAR_VALUE;
-  web_gl.STENCIL_FAIL = web_gl.RenderingContext.STENCIL_FAIL;
-  web_gl.STENCIL_FUNC = web_gl.RenderingContext.STENCIL_FUNC;
-  web_gl.STENCIL_INDEX = web_gl.RenderingContext.STENCIL_INDEX;
-  web_gl.STENCIL_INDEX8 = web_gl.RenderingContext.STENCIL_INDEX8;
-  web_gl.STENCIL_PASS_DEPTH_FAIL = web_gl.RenderingContext.STENCIL_PASS_DEPTH_FAIL;
-  web_gl.STENCIL_PASS_DEPTH_PASS = web_gl.RenderingContext.STENCIL_PASS_DEPTH_PASS;
-  web_gl.STENCIL_REF = web_gl.RenderingContext.STENCIL_REF;
-  web_gl.STENCIL_TEST = web_gl.RenderingContext.STENCIL_TEST;
-  web_gl.STENCIL_VALUE_MASK = web_gl.RenderingContext.STENCIL_VALUE_MASK;
-  web_gl.STENCIL_WRITEMASK = web_gl.RenderingContext.STENCIL_WRITEMASK;
-  web_gl.STREAM_DRAW = web_gl.RenderingContext.STREAM_DRAW;
-  web_gl.SUBPIXEL_BITS = web_gl.RenderingContext.SUBPIXEL_BITS;
-  web_gl.TEXTURE = web_gl.RenderingContext.TEXTURE;
-  web_gl.TEXTURE0 = web_gl.RenderingContext.TEXTURE0;
-  web_gl.TEXTURE1 = web_gl.RenderingContext.TEXTURE1;
-  web_gl.TEXTURE10 = web_gl.RenderingContext.TEXTURE10;
-  web_gl.TEXTURE11 = web_gl.RenderingContext.TEXTURE11;
-  web_gl.TEXTURE12 = web_gl.RenderingContext.TEXTURE12;
-  web_gl.TEXTURE13 = web_gl.RenderingContext.TEXTURE13;
-  web_gl.TEXTURE14 = web_gl.RenderingContext.TEXTURE14;
-  web_gl.TEXTURE15 = web_gl.RenderingContext.TEXTURE15;
-  web_gl.TEXTURE16 = web_gl.RenderingContext.TEXTURE16;
-  web_gl.TEXTURE17 = web_gl.RenderingContext.TEXTURE17;
-  web_gl.TEXTURE18 = web_gl.RenderingContext.TEXTURE18;
-  web_gl.TEXTURE19 = web_gl.RenderingContext.TEXTURE19;
-  web_gl.TEXTURE2 = web_gl.RenderingContext.TEXTURE2;
-  web_gl.TEXTURE20 = web_gl.RenderingContext.TEXTURE20;
-  web_gl.TEXTURE21 = web_gl.RenderingContext.TEXTURE21;
-  web_gl.TEXTURE22 = web_gl.RenderingContext.TEXTURE22;
-  web_gl.TEXTURE23 = web_gl.RenderingContext.TEXTURE23;
-  web_gl.TEXTURE24 = web_gl.RenderingContext.TEXTURE24;
-  web_gl.TEXTURE25 = web_gl.RenderingContext.TEXTURE25;
-  web_gl.TEXTURE26 = web_gl.RenderingContext.TEXTURE26;
-  web_gl.TEXTURE27 = web_gl.RenderingContext.TEXTURE27;
-  web_gl.TEXTURE28 = web_gl.RenderingContext.TEXTURE28;
-  web_gl.TEXTURE29 = web_gl.RenderingContext.TEXTURE29;
-  web_gl.TEXTURE3 = web_gl.RenderingContext.TEXTURE3;
-  web_gl.TEXTURE30 = web_gl.RenderingContext.TEXTURE30;
-  web_gl.TEXTURE31 = web_gl.RenderingContext.TEXTURE31;
-  web_gl.TEXTURE4 = web_gl.RenderingContext.TEXTURE4;
-  web_gl.TEXTURE5 = web_gl.RenderingContext.TEXTURE5;
-  web_gl.TEXTURE6 = web_gl.RenderingContext.TEXTURE6;
-  web_gl.TEXTURE7 = web_gl.RenderingContext.TEXTURE7;
-  web_gl.TEXTURE8 = web_gl.RenderingContext.TEXTURE8;
-  web_gl.TEXTURE9 = web_gl.RenderingContext.TEXTURE9;
-  web_gl.TEXTURE_2D = web_gl.RenderingContext.TEXTURE_2D;
-  web_gl.TEXTURE_BINDING_2D = web_gl.RenderingContext.TEXTURE_BINDING_2D;
-  web_gl.TEXTURE_BINDING_CUBE_MAP = web_gl.RenderingContext.TEXTURE_BINDING_CUBE_MAP;
-  web_gl.TEXTURE_CUBE_MAP = web_gl.RenderingContext.TEXTURE_CUBE_MAP;
-  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_X;
-  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Y;
-  web_gl.TEXTURE_CUBE_MAP_NEGATIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_NEGATIVE_Z;
-  web_gl.TEXTURE_CUBE_MAP_POSITIVE_X = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_X;
-  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Y = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Y;
-  web_gl.TEXTURE_CUBE_MAP_POSITIVE_Z = web_gl.RenderingContext.TEXTURE_CUBE_MAP_POSITIVE_Z;
-  web_gl.TEXTURE_MAG_FILTER = web_gl.RenderingContext.TEXTURE_MAG_FILTER;
-  web_gl.TEXTURE_MIN_FILTER = web_gl.RenderingContext.TEXTURE_MIN_FILTER;
-  web_gl.TEXTURE_WRAP_S = web_gl.RenderingContext.TEXTURE_WRAP_S;
-  web_gl.TEXTURE_WRAP_T = web_gl.RenderingContext.TEXTURE_WRAP_T;
-  web_gl.TRIANGLES = web_gl.RenderingContext.TRIANGLES;
-  web_gl.TRIANGLE_FAN = web_gl.RenderingContext.TRIANGLE_FAN;
-  web_gl.TRIANGLE_STRIP = web_gl.RenderingContext.TRIANGLE_STRIP;
-  web_gl.UNPACK_ALIGNMENT = web_gl.RenderingContext.UNPACK_ALIGNMENT;
-  web_gl.UNPACK_COLORSPACE_CONVERSION_WEBGL = web_gl.RenderingContext.UNPACK_COLORSPACE_CONVERSION_WEBGL;
-  web_gl.UNPACK_FLIP_Y_WEBGL = web_gl.RenderingContext.UNPACK_FLIP_Y_WEBGL;
-  web_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = web_gl.RenderingContext.UNPACK_PREMULTIPLY_ALPHA_WEBGL;
-  web_gl.UNSIGNED_BYTE = web_gl.RenderingContext.UNSIGNED_BYTE;
-  web_gl.UNSIGNED_INT = web_gl.RenderingContext.UNSIGNED_INT;
-  web_gl.UNSIGNED_SHORT = web_gl.RenderingContext.UNSIGNED_SHORT;
-  web_gl.UNSIGNED_SHORT_4_4_4_4 = web_gl.RenderingContext.UNSIGNED_SHORT_4_4_4_4;
-  web_gl.UNSIGNED_SHORT_5_5_5_1 = web_gl.RenderingContext.UNSIGNED_SHORT_5_5_5_1;
-  web_gl.UNSIGNED_SHORT_5_6_5 = web_gl.RenderingContext.UNSIGNED_SHORT_5_6_5;
-  web_gl.VALIDATE_STATUS = web_gl.RenderingContext.VALIDATE_STATUS;
-  web_gl.VENDOR = web_gl.RenderingContext.VENDOR;
-  web_gl.VERSION = web_gl.RenderingContext.VERSION;
-  web_gl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING;
-  web_gl.VERTEX_ATTRIB_ARRAY_ENABLED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_ENABLED;
-  web_gl.VERTEX_ATTRIB_ARRAY_NORMALIZED = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_NORMALIZED;
-  web_gl.VERTEX_ATTRIB_ARRAY_POINTER = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_POINTER;
-  web_gl.VERTEX_ATTRIB_ARRAY_SIZE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_SIZE;
-  web_gl.VERTEX_ATTRIB_ARRAY_STRIDE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_STRIDE;
-  web_gl.VERTEX_ATTRIB_ARRAY_TYPE = web_gl.RenderingContext.VERTEX_ATTRIB_ARRAY_TYPE;
-  web_gl.VERTEX_SHADER = web_gl.RenderingContext.VERTEX_SHADER;
-  web_gl.VIEWPORT = web_gl.RenderingContext.VIEWPORT;
-  web_gl.ZERO = web_gl.RenderingContext.ZERO;
-  dart.defineExtensionNames([
-    'name',
-    'size',
-    'type'
-  ]);
-  web_gl.ActiveInfo = class ActiveInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.name]() {
-      return this.name;
-    }
-    get [dartx.size]() {
-      return this.size;
-    }
-    get [dartx.type]() {
-      return this.type;
-    }
-  };
-  dart.setSignature(web_gl.ActiveInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ActiveInfo, [])}),
-    fields: () => ({
-      [dartx.name]: core.String,
-      [dartx.size]: core.int,
-      [dartx.type]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.WebGLActiveInfo, web_gl.ActiveInfo);
-  dart.defineExtensionNames([
-    'drawArraysInstancedAngle',
-    'drawElementsInstancedAngle',
-    'vertexAttribDivisorAngle'
-  ]);
-  web_gl.AngleInstancedArrays = class AngleInstancedArrays extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.drawArraysInstancedAngle](...args) {
-      return this.drawArraysInstancedANGLE.apply(this, args);
-    }
-    [dartx.drawElementsInstancedAngle](...args) {
-      return this.drawElementsInstancedANGLE.apply(this, args);
-    }
-    [dartx.vertexAttribDivisorAngle](...args) {
-      return this.vertexAttribDivisorANGLE.apply(this, args);
-    }
-  };
-  dart.setSignature(web_gl.AngleInstancedArrays, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.AngleInstancedArrays, [])}),
-    methods: () => ({
-      [dartx.drawArraysInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int]),
-      [dartx.drawElementsInstancedAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int]),
-      [dartx.vertexAttribDivisorAngle]: dart.definiteFunctionType(dart.void, [core.int, core.int])
-    }),
-    sfields: () => ({VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE: core.int})
-  });
-  web_gl.AngleInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;
-  dart.registerExtension(dart.global.ANGLEInstancedArrays, web_gl.AngleInstancedArrays);
-  web_gl.Buffer = class Buffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Buffer, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Buffer, [])})
-  });
-  dart.registerExtension(dart.global.WebGLBuffer, web_gl.Buffer);
-  web_gl.CompressedTextureAtc = class CompressedTextureAtc extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.CompressedTextureAtc, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureAtc, [])}),
-    sfields: () => ({
-      COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL: core.int,
-      COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL: core.int,
-      COMPRESSED_RGB_ATC_WEBGL: core.int
-    })
-  });
-  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 35987;
-  web_gl.CompressedTextureAtc.COMPRESSED_RGBA_ATC_INTERPOLATED_ALPHA_WEBGL = 34798;
-  web_gl.CompressedTextureAtc.COMPRESSED_RGB_ATC_WEBGL = 35986;
-  dart.registerExtension(dart.global.WebGLCompressedTextureATC, web_gl.CompressedTextureAtc);
-  web_gl.CompressedTextureETC1 = class CompressedTextureETC1 extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.CompressedTextureETC1, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureETC1, [])}),
-    sfields: () => ({COMPRESSED_RGB_ETC1_WEBGL: core.int})
-  });
-  web_gl.CompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL = 36196;
-  dart.registerExtension(dart.global.WebGLCompressedTextureETC1, web_gl.CompressedTextureETC1);
-  web_gl.CompressedTexturePvrtc = class CompressedTexturePvrtc extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.CompressedTexturePvrtc, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTexturePvrtc, [])}),
-    sfields: () => ({
-      COMPRESSED_RGBA_PVRTC_2BPPV1_IMG: core.int,
-      COMPRESSED_RGBA_PVRTC_4BPPV1_IMG: core.int,
-      COMPRESSED_RGB_PVRTC_2BPPV1_IMG: core.int,
-      COMPRESSED_RGB_PVRTC_4BPPV1_IMG: core.int
-    })
-  });
-  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 35843;
-  web_gl.CompressedTexturePvrtc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG = 35842;
-  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG = 35841;
-  web_gl.CompressedTexturePvrtc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG = 35840;
-  dart.registerExtension(dart.global.WebGLCompressedTexturePVRTC, web_gl.CompressedTexturePvrtc);
-  web_gl.CompressedTextureS3TC = class CompressedTextureS3TC extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.CompressedTextureS3TC, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.CompressedTextureS3TC, [])}),
-    sfields: () => ({
-      COMPRESSED_RGBA_S3TC_DXT1_EXT: core.int,
-      COMPRESSED_RGBA_S3TC_DXT3_EXT: core.int,
-      COMPRESSED_RGBA_S3TC_DXT5_EXT: core.int,
-      COMPRESSED_RGB_S3TC_DXT1_EXT: core.int
-    })
-  });
-  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT = 33777;
-  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT3_EXT = 33778;
-  web_gl.CompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT5_EXT = 33779;
-  web_gl.CompressedTextureS3TC.COMPRESSED_RGB_S3TC_DXT1_EXT = 33776;
-  dart.registerExtension(dart.global.WebGLCompressedTextureS3TC, web_gl.CompressedTextureS3TC);
-  dart.defineExtensionNames([
-    'alpha',
-    'antialias',
-    'depth',
-    'failIfMajorPerformanceCaveat',
-    'premultipliedAlpha',
-    'preserveDrawingBuffer',
-    'stencil'
-  ]);
-  web_gl.ContextAttributes = class ContextAttributes extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.alpha]() {
-      return this.alpha;
-    }
-    set [dartx.alpha](value) {
-      this.alpha = value;
-    }
-    get [dartx.antialias]() {
-      return this.antialias;
-    }
-    set [dartx.antialias](value) {
-      this.antialias = value;
-    }
-    get [dartx.depth]() {
-      return this.depth;
-    }
-    set [dartx.depth](value) {
-      this.depth = value;
-    }
-    get [dartx.failIfMajorPerformanceCaveat]() {
-      return this.failIfMajorPerformanceCaveat;
-    }
-    set [dartx.failIfMajorPerformanceCaveat](value) {
-      this.failIfMajorPerformanceCaveat = value;
-    }
-    get [dartx.premultipliedAlpha]() {
-      return this.premultipliedAlpha;
-    }
-    set [dartx.premultipliedAlpha](value) {
-      this.premultipliedAlpha = value;
-    }
-    get [dartx.preserveDrawingBuffer]() {
-      return this.preserveDrawingBuffer;
-    }
-    set [dartx.preserveDrawingBuffer](value) {
-      this.preserveDrawingBuffer = value;
-    }
-    get [dartx.stencil]() {
-      return this.stencil;
-    }
-    set [dartx.stencil](value) {
-      this.stencil = value;
-    }
-  };
-  dart.setSignature(web_gl.ContextAttributes, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextAttributes, [])}),
-    fields: () => ({
-      [dartx.alpha]: core.bool,
-      [dartx.antialias]: core.bool,
-      [dartx.depth]: core.bool,
-      [dartx.failIfMajorPerformanceCaveat]: core.bool,
-      [dartx.premultipliedAlpha]: core.bool,
-      [dartx.preserveDrawingBuffer]: core.bool,
-      [dartx.stencil]: core.bool
-    })
-  });
-  dart.registerExtension(dart.global.WebGLContextAttributes, web_gl.ContextAttributes);
-  dart.defineExtensionNames([
-    'statusMessage'
-  ]);
-  web_gl.ContextEvent = class ContextEvent extends html$.Event {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.statusMessage]() {
-      return this.statusMessage;
-    }
-  };
-  dart.setSignature(web_gl.ContextEvent, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ContextEvent, [])}),
-    fields: () => ({[dartx.statusMessage]: core.String})
-  });
-  dart.registerExtension(dart.global.WebGLContextEvent, web_gl.ContextEvent);
-  web_gl.DebugRendererInfo = class DebugRendererInfo extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.DebugRendererInfo, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugRendererInfo, [])}),
-    sfields: () => ({
-      UNMASKED_RENDERER_WEBGL: core.int,
-      UNMASKED_VENDOR_WEBGL: core.int
-    })
-  });
-  web_gl.DebugRendererInfo.UNMASKED_RENDERER_WEBGL = 37446;
-  web_gl.DebugRendererInfo.UNMASKED_VENDOR_WEBGL = 37445;
-  dart.registerExtension(dart.global.WebGLDebugRendererInfo, web_gl.DebugRendererInfo);
-  dart.defineExtensionNames([
-    'getTranslatedShaderSource'
-  ]);
-  web_gl.DebugShaders = class DebugShaders extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.getTranslatedShaderSource](...args) {
-      return this.getTranslatedShaderSource.apply(this, args);
-    }
-  };
-  dart.setSignature(web_gl.DebugShaders, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.DebugShaders, [])}),
-    methods: () => ({[dartx.getTranslatedShaderSource]: dart.definiteFunctionType(core.String, [web_gl.Shader])})
-  });
-  dart.registerExtension(dart.global.WebGLDebugShaders, web_gl.DebugShaders);
-  web_gl.DepthTexture = class DepthTexture extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.DepthTexture, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.DepthTexture, [])}),
-    sfields: () => ({UNSIGNED_INT_24_8_WEBGL: core.int})
-  });
-  web_gl.DepthTexture.UNSIGNED_INT_24_8_WEBGL = 34042;
-  dart.registerExtension(dart.global.WebGLDepthTexture, web_gl.DepthTexture);
-  dart.defineExtensionNames([
-    'drawBuffersWebgl'
-  ]);
-  web_gl.DrawBuffers = class DrawBuffers extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.drawBuffersWebgl](...args) {
-      return this.drawBuffersWEBGL.apply(this, args);
-    }
-  };
-  dart.setSignature(web_gl.DrawBuffers, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.DrawBuffers, [])}),
-    methods: () => ({[dartx.drawBuffersWebgl]: dart.definiteFunctionType(dart.void, [ListOfint()])}),
-    sfields: () => ({
-      COLOR_ATTACHMENT0_WEBGL: core.int,
-      COLOR_ATTACHMENT10_WEBGL: core.int,
-      COLOR_ATTACHMENT11_WEBGL: core.int,
-      COLOR_ATTACHMENT12_WEBGL: core.int,
-      COLOR_ATTACHMENT13_WEBGL: core.int,
-      COLOR_ATTACHMENT14_WEBGL: core.int,
-      COLOR_ATTACHMENT15_WEBGL: core.int,
-      COLOR_ATTACHMENT1_WEBGL: core.int,
-      COLOR_ATTACHMENT2_WEBGL: core.int,
-      COLOR_ATTACHMENT3_WEBGL: core.int,
-      COLOR_ATTACHMENT4_WEBGL: core.int,
-      COLOR_ATTACHMENT5_WEBGL: core.int,
-      COLOR_ATTACHMENT6_WEBGL: core.int,
-      COLOR_ATTACHMENT7_WEBGL: core.int,
-      COLOR_ATTACHMENT8_WEBGL: core.int,
-      COLOR_ATTACHMENT9_WEBGL: core.int,
-      DRAW_BUFFER0_WEBGL: core.int,
-      DRAW_BUFFER10_WEBGL: core.int,
-      DRAW_BUFFER11_WEBGL: core.int,
-      DRAW_BUFFER12_WEBGL: core.int,
-      DRAW_BUFFER13_WEBGL: core.int,
-      DRAW_BUFFER14_WEBGL: core.int,
-      DRAW_BUFFER15_WEBGL: core.int,
-      DRAW_BUFFER1_WEBGL: core.int,
-      DRAW_BUFFER2_WEBGL: core.int,
-      DRAW_BUFFER3_WEBGL: core.int,
-      DRAW_BUFFER4_WEBGL: core.int,
-      DRAW_BUFFER5_WEBGL: core.int,
-      DRAW_BUFFER6_WEBGL: core.int,
-      DRAW_BUFFER7_WEBGL: core.int,
-      DRAW_BUFFER8_WEBGL: core.int,
-      DRAW_BUFFER9_WEBGL: core.int,
-      MAX_COLOR_ATTACHMENTS_WEBGL: core.int,
-      MAX_DRAW_BUFFERS_WEBGL: core.int
-    })
-  });
-  web_gl.DrawBuffers.COLOR_ATTACHMENT0_WEBGL = 36064;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT10_WEBGL = 36074;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT11_WEBGL = 36075;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT12_WEBGL = 36076;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT13_WEBGL = 36077;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT14_WEBGL = 36078;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT15_WEBGL = 36079;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT1_WEBGL = 36065;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT2_WEBGL = 36066;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT3_WEBGL = 36067;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT4_WEBGL = 36068;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT5_WEBGL = 36069;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT6_WEBGL = 36070;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT7_WEBGL = 36071;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT8_WEBGL = 36072;
-  web_gl.DrawBuffers.COLOR_ATTACHMENT9_WEBGL = 36073;
-  web_gl.DrawBuffers.DRAW_BUFFER0_WEBGL = 34853;
-  web_gl.DrawBuffers.DRAW_BUFFER10_WEBGL = 34863;
-  web_gl.DrawBuffers.DRAW_BUFFER11_WEBGL = 34864;
-  web_gl.DrawBuffers.DRAW_BUFFER12_WEBGL = 34865;
-  web_gl.DrawBuffers.DRAW_BUFFER13_WEBGL = 34866;
-  web_gl.DrawBuffers.DRAW_BUFFER14_WEBGL = 34867;
-  web_gl.DrawBuffers.DRAW_BUFFER15_WEBGL = 34868;
-  web_gl.DrawBuffers.DRAW_BUFFER1_WEBGL = 34854;
-  web_gl.DrawBuffers.DRAW_BUFFER2_WEBGL = 34855;
-  web_gl.DrawBuffers.DRAW_BUFFER3_WEBGL = 34856;
-  web_gl.DrawBuffers.DRAW_BUFFER4_WEBGL = 34857;
-  web_gl.DrawBuffers.DRAW_BUFFER5_WEBGL = 34858;
-  web_gl.DrawBuffers.DRAW_BUFFER6_WEBGL = 34859;
-  web_gl.DrawBuffers.DRAW_BUFFER7_WEBGL = 34860;
-  web_gl.DrawBuffers.DRAW_BUFFER8_WEBGL = 34861;
-  web_gl.DrawBuffers.DRAW_BUFFER9_WEBGL = 34862;
-  web_gl.DrawBuffers.MAX_COLOR_ATTACHMENTS_WEBGL = 36063;
-  web_gl.DrawBuffers.MAX_DRAW_BUFFERS_WEBGL = 34852;
-  dart.registerExtension(dart.global.WebGLDrawBuffers, web_gl.DrawBuffers);
-  web_gl.ExtBlendMinMax = class ExtBlendMinMax extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.ExtBlendMinMax, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtBlendMinMax, [])}),
-    sfields: () => ({
-      MAX_EXT: core.int,
-      MIN_EXT: core.int
-    })
-  });
-  web_gl.ExtBlendMinMax.MAX_EXT = 32776;
-  web_gl.ExtBlendMinMax.MIN_EXT = 32775;
-  dart.registerExtension(dart.global.EXTBlendMinMax, web_gl.ExtBlendMinMax);
-  web_gl.ExtFragDepth = class ExtFragDepth extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.ExtFragDepth, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtFragDepth, [])})
-  });
-  dart.registerExtension(dart.global.EXTFragDepth, web_gl.ExtFragDepth);
-  web_gl.ExtShaderTextureLod = class ExtShaderTextureLod extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.ExtShaderTextureLod, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtShaderTextureLod, [])})
-  });
-  dart.registerExtension(dart.global.EXTShaderTextureLOD, web_gl.ExtShaderTextureLod);
-  web_gl.ExtTextureFilterAnisotropic = class ExtTextureFilterAnisotropic extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.ExtTextureFilterAnisotropic, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ExtTextureFilterAnisotropic, [])}),
-    sfields: () => ({
-      MAX_TEXTURE_MAX_ANISOTROPY_EXT: core.int,
-      TEXTURE_MAX_ANISOTROPY_EXT: core.int
-    })
-  });
-  web_gl.ExtTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 34047;
-  web_gl.ExtTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT = 34046;
-  dart.registerExtension(dart.global.EXTTextureFilterAnisotropic, web_gl.ExtTextureFilterAnisotropic);
-  web_gl.Framebuffer = class Framebuffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Framebuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Framebuffer, [])})
-  });
-  dart.registerExtension(dart.global.WebGLFramebuffer, web_gl.Framebuffer);
-  dart.defineExtensionNames([
-    'loseContext',
-    'restoreContext'
-  ]);
-  web_gl.LoseContext = class LoseContext extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.loseContext](...args) {
-      return this.loseContext.apply(this, args);
-    }
-    [dartx.restoreContext](...args) {
-      return this.restoreContext.apply(this, args);
-    }
-  };
-  dart.setSignature(web_gl.LoseContext, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.LoseContext, [])}),
-    methods: () => ({
-      [dartx.loseContext]: dart.definiteFunctionType(dart.void, []),
-      [dartx.restoreContext]: dart.definiteFunctionType(dart.void, [])
-    })
-  });
-  dart.registerExtension(dart.global.WebGLLoseContext, web_gl.LoseContext);
-  dart.registerExtension(dart.global.WebGLExtensionLoseContext, web_gl.LoseContext);
-  web_gl.OesElementIndexUint = class OesElementIndexUint extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesElementIndexUint, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesElementIndexUint, [])})
-  });
-  dart.registerExtension(dart.global.OESElementIndexUint, web_gl.OesElementIndexUint);
-  web_gl.OesStandardDerivatives = class OesStandardDerivatives extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesStandardDerivatives, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesStandardDerivatives, [])}),
-    sfields: () => ({FRAGMENT_SHADER_DERIVATIVE_HINT_OES: core.int})
-  });
-  web_gl.OesStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 35723;
-  dart.registerExtension(dart.global.OESStandardDerivatives, web_gl.OesStandardDerivatives);
-  web_gl.OesTextureFloat = class OesTextureFloat extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesTextureFloat, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloat, [])})
-  });
-  dart.registerExtension(dart.global.OESTextureFloat, web_gl.OesTextureFloat);
-  web_gl.OesTextureFloatLinear = class OesTextureFloatLinear extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesTextureFloatLinear, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureFloatLinear, [])})
-  });
-  dart.registerExtension(dart.global.OESTextureFloatLinear, web_gl.OesTextureFloatLinear);
-  web_gl.OesTextureHalfFloatLinear = class OesTextureHalfFloatLinear extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.OesTextureHalfFloatLinear, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesTextureHalfFloatLinear, [])})
-  });
-  dart.registerExtension(dart.global.OESTextureHalfFloatLinear, web_gl.OesTextureHalfFloatLinear);
-  dart.defineExtensionNames([
-    'bindVertexArray',
-    'createVertexArray',
-    'deleteVertexArray',
-    'isVertexArray'
-  ]);
-  web_gl.OesVertexArrayObject = class OesVertexArrayObject extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.bindVertexArray](...args) {
-      return this.bindVertexArrayOES.apply(this, args);
-    }
-    [dartx.createVertexArray](...args) {
-      return this.createVertexArrayOES.apply(this, args);
-    }
-    [dartx.deleteVertexArray](...args) {
-      return this.deleteVertexArrayOES.apply(this, args);
-    }
-    [dartx.isVertexArray](...args) {
-      return this.isVertexArrayOES.apply(this, args);
-    }
-  };
-  dart.setSignature(web_gl.OesVertexArrayObject, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.OesVertexArrayObject, [])}),
-    methods: () => ({
-      [dartx.bindVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
-      [dartx.createVertexArray]: dart.definiteFunctionType(web_gl.VertexArrayObject, []),
-      [dartx.deleteVertexArray]: dart.definiteFunctionType(dart.void, [web_gl.VertexArrayObject]),
-      [dartx.isVertexArray]: dart.definiteFunctionType(core.bool, [web_gl.VertexArrayObject])
-    }),
-    sfields: () => ({VERTEX_ARRAY_BINDING_OES: core.int})
-  });
-  web_gl.OesVertexArrayObject.VERTEX_ARRAY_BINDING_OES = 34229;
-  dart.registerExtension(dart.global.OESVertexArrayObject, web_gl.OesVertexArrayObject);
-  web_gl.Program = class Program extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Program, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Program, [])})
-  });
-  dart.registerExtension(dart.global.WebGLProgram, web_gl.Program);
-  web_gl.Renderbuffer = class Renderbuffer extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Renderbuffer, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Renderbuffer, [])})
-  });
-  dart.registerExtension(dart.global.WebGLRenderbuffer, web_gl.Renderbuffer);
-  web_gl.Shader = class Shader extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Shader, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Shader, [])})
-  });
-  dart.registerExtension(dart.global.WebGLShader, web_gl.Shader);
-  dart.defineExtensionNames([
-    'precision',
-    'rangeMax',
-    'rangeMin'
-  ]);
-  web_gl.ShaderPrecisionFormat = class ShaderPrecisionFormat extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.precision]() {
-      return this.precision;
-    }
-    get [dartx.rangeMax]() {
-      return this.rangeMax;
-    }
-    get [dartx.rangeMin]() {
-      return this.rangeMin;
-    }
-  };
-  dart.setSignature(web_gl.ShaderPrecisionFormat, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.ShaderPrecisionFormat, [])}),
-    fields: () => ({
-      [dartx.precision]: core.int,
-      [dartx.rangeMax]: core.int,
-      [dartx.rangeMin]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.WebGLShaderPrecisionFormat, web_gl.ShaderPrecisionFormat);
-  web_gl.Texture = class Texture extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.Texture, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.Texture, [])})
-  });
-  dart.registerExtension(dart.global.WebGLTexture, web_gl.Texture);
-  web_gl.UniformLocation = class UniformLocation extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.UniformLocation, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.UniformLocation, [])})
-  });
-  dart.registerExtension(dart.global.WebGLUniformLocation, web_gl.UniformLocation);
-  web_gl.VertexArrayObject = class VertexArrayObject extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl.VertexArrayObject, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl.VertexArrayObject, [])})
-  });
-  dart.registerExtension(dart.global.WebGLVertexArrayObjectOES, web_gl.VertexArrayObject);
-  web_gl._WebGLRenderingContextBase = class _WebGLRenderingContextBase extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-  };
-  dart.setSignature(web_gl._WebGLRenderingContextBase, {
-    constructors: () => ({_: dart.definiteFunctionType(web_gl._WebGLRenderingContextBase, [])})
-  });
-  web_sql.SqlStatementCallback = dart.typedef('SqlStatementCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlResultSet]));
-  web_sql.SqlStatementErrorCallback = dart.typedef('SqlStatementErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction, web_sql.SqlError]));
-  web_sql.SqlTransactionCallback = dart.typedef('SqlTransactionCallback', () => dart.functionType(dart.void, [web_sql.SqlTransaction]));
-  web_sql.SqlTransactionErrorCallback = dart.typedef('SqlTransactionErrorCallback', () => dart.functionType(dart.void, [web_sql.SqlError]));
-  dart.defineExtensionNames([
-    'changeVersion',
-    'readTransaction',
-    'transaction',
-    'version'
-  ]);
-  web_sql.SqlDatabase = class SqlDatabase extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    static get supported() {
-      return !!window.openDatabase;
-    }
-    get [dartx.version]() {
-      return this.version;
-    }
-    [dartx.changeVersion](...args) {
-      return this.changeVersion.apply(this, args);
-    }
-    [dartx.readTransaction](...args) {
-      return this.readTransaction.apply(this, args);
-    }
-    [dartx.transaction](...args) {
-      return this.transaction.apply(this, args);
-    }
-  };
-  dart.setSignature(web_sql.SqlDatabase, {
-    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
-    fields: () => ({[dartx.version]: core.String}),
-    methods: () => ({
-      [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
-      [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
-      [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
-    }),
-    sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
-  });
-  dart.registerExtension(dart.global.Database, web_sql.SqlDatabase);
-  dart.defineExtensionNames([
-    'code',
-    'message'
-  ]);
-  web_sql.SqlError = class SqlError extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.code]() {
-      return this.code;
-    }
-    get [dartx.message]() {
-      return this.message;
-    }
-  };
-  dart.setSignature(web_sql.SqlError, {
-    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlError, [])}),
-    fields: () => ({
-      [dartx.code]: core.int,
-      [dartx.message]: core.String
-    }),
-    sfields: () => ({
-      CONSTRAINT_ERR: core.int,
-      DATABASE_ERR: core.int,
-      QUOTA_ERR: core.int,
-      SYNTAX_ERR: core.int,
-      TIMEOUT_ERR: core.int,
-      TOO_LARGE_ERR: core.int,
-      UNKNOWN_ERR: core.int,
-      VERSION_ERR: core.int
-    })
-  });
-  web_sql.SqlError.CONSTRAINT_ERR = 6;
-  web_sql.SqlError.DATABASE_ERR = 1;
-  web_sql.SqlError.QUOTA_ERR = 4;
-  web_sql.SqlError.SYNTAX_ERR = 5;
-  web_sql.SqlError.TIMEOUT_ERR = 7;
-  web_sql.SqlError.TOO_LARGE_ERR = 3;
-  web_sql.SqlError.UNKNOWN_ERR = 0;
-  web_sql.SqlError.VERSION_ERR = 2;
-  dart.registerExtension(dart.global.SQLError, web_sql.SqlError);
-  dart.defineExtensionNames([
-    'insertId',
-    'rows',
-    'rowsAffected'
-  ]);
-  web_sql.SqlResultSet = class SqlResultSet extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.insertId]() {
-      return this.insertId;
-    }
-    get [dartx.rows]() {
-      return this.rows;
-    }
-    get [dartx.rowsAffected]() {
-      return this.rowsAffected;
-    }
-  };
-  dart.setSignature(web_sql.SqlResultSet, {
-    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSet, [])}),
-    fields: () => ({
-      [dartx.insertId]: core.int,
-      [dartx.rows]: web_sql.SqlResultSetRowList,
-      [dartx.rowsAffected]: core.int
-    })
-  });
-  dart.registerExtension(dart.global.SQLResultSet, web_sql.SqlResultSet);
-  const _item_1 = Symbol('_item_1');
-  dart.defineExtensionNames([
-    'length',
-    '_get',
-    '_set',
-    'length',
-    'first',
-    'last',
-    'single',
-    'elementAt',
-    'item'
-  ]);
-  web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    get [dartx.length]() {
-      return this.length;
-    }
-    [dartx._get](index) {
-      if (index >>> 0 !== index || index >= this[dartx.length]) dart.throw(core.RangeError.index(index, this));
-      return this[dartx.item](index);
-    }
-    [dartx._set](index, value) {
-      dart.throw(new core.UnsupportedError("Cannot assign element of immutable List."));
-      return value;
-    }
-    set [dartx.length](value) {
-      dart.throw(new core.UnsupportedError("Cannot resize immutable List."));
-    }
-    get [dartx.first]() {
-      if (dart.notNull(this[dartx.length]) > 0) {
-        return this[0];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.last]() {
-      let len = this[dartx.length];
-      if (dart.notNull(len) > 0) {
-        return this[dart.notNull(len) - 1];
-      }
-      dart.throw(new core.StateError("No elements"));
-    }
-    get [dartx.single]() {
-      let len = this[dartx.length];
-      if (len == 1) {
-        return this[0];
-      }
-      if (len == 0) dart.throw(new core.StateError("No elements"));
-      dart.throw(new core.StateError("More than one element"));
-    }
-    [dartx.elementAt](index) {
-      return this[dartx._get](index);
-    }
-    [dartx.item](index) {
-      return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
-    }
-    [_item_1](...args) {
-      return this.item.apply(this, args);
-    }
-  };
-  web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
-  dart.setSignature(web_sql.SqlResultSetRowList, {
-    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSetRowList, [])}),
-    getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
-    setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
-    methods: () => ({
-      [dartx._get]: dart.definiteFunctionType(core.Map, [core.int]),
-      [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.Map]),
-      [dartx.item]: dart.definiteFunctionType(core.Map, [core.int]),
-      [_item_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
-    })
-  });
-  dart.registerExtension(dart.global.SQLResultSetRowList, web_sql.SqlResultSetRowList);
-  dart.defineExtensionNames([
-    'executeSql'
-  ]);
-  web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
-    static _() {
-      dart.throw(new core.UnsupportedError("Not supported"));
-    }
-    [dartx.executeSql](...args) {
-      return this.executeSql.apply(this, args);
-    }
-  };
-  dart.setSignature(web_sql.SqlTransaction, {
-    constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlTransaction, [])}),
-    methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
-  });
-  dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
-  // Exports:
-  exports.dart = dart;
-  exports.dartx = dartx;
-  exports._debugger = _debugger;
-  exports._foreign_helper = _foreign_helper;
-  exports._interceptors = _interceptors;
-  exports._internal = _internal;
-  exports._isolate_helper = _isolate_helper;
-  exports._js_embedded_names = _js_embedded_names;
-  exports._js_helper = _js_helper;
-  exports._js_mirrors = _js_mirrors;
-  exports._js_primitives = _js_primitives;
-  exports._metadata = _metadata;
-  exports._native_typed_data = _native_typed_data;
-  exports.async = async;
-  exports.collection = collection;
-  exports.convert = convert;
-  exports.core = core;
-  exports.developer = developer;
-  exports.io = io;
-  exports.isolate = isolate;
-  exports.js = js;
-  exports.js_util = js_util;
-  exports.math = math;
-  exports.mirrors = mirrors;
-  exports.typed_data = typed_data;
-  exports.indexed_db = indexed_db;
-  exports.html = html$;
-  exports.html_common = html_common;
-  exports.svg = svg$;
-  exports.web_audio = web_audio;
-  exports.web_gl = web_gl;
-  exports.web_sql = web_sql;
-})();
+    if (len == 0) dart.throw(new core.StateError("No elements"));
+    dart.throw(new core.StateError("More than one element"));
+  }
+  [dartx.elementAt](index) {
+    return this[dartx._get](index);
+  }
+  [dartx.item](index) {
+    return html_common.convertNativeToDart_Dictionary(this[_item_1](index));
+  }
+  [_item_1](...args) {
+    return this.item.apply(this, args);
+  }
+};
+web_sql.SqlResultSetRowList[dart.implements] = () => [ListOfMap()];
+dart.setSignature(web_sql.SqlResultSetRowList, {
+  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlResultSetRowList, [])}),
+  getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
+  setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
+  methods: () => ({
+    [dartx._get]: dart.definiteFunctionType(core.Map, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.Map]),
+    [dartx.item]: dart.definiteFunctionType(core.Map, [core.int]),
+    [_item_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
+  })
+});
+dart.registerExtension(dart.global.SQLResultSetRowList, web_sql.SqlResultSetRowList);
+dart.defineExtensionNames([
+  'executeSql'
+]);
+web_sql.SqlTransaction = class SqlTransaction extends _interceptors.Interceptor {
+  static _() {
+    dart.throw(new core.UnsupportedError("Not supported"));
+  }
+  [dartx.executeSql](...args) {
+    return this.executeSql.apply(this, args);
+  }
+};
+dart.setSignature(web_sql.SqlTransaction, {
+  constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlTransaction, [])}),
+  methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
+});
+dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
+// Exports:
+exports.dart = dart;
+exports.dartx = dartx;
+exports._debugger = _debugger;
+exports._foreign_helper = _foreign_helper;
+exports._interceptors = _interceptors;
+exports._internal = _internal;
+exports._isolate_helper = _isolate_helper;
+exports._js_embedded_names = _js_embedded_names;
+exports._js_helper = _js_helper;
+exports._js_mirrors = _js_mirrors;
+exports._js_primitives = _js_primitives;
+exports._metadata = _metadata;
+exports._native_typed_data = _native_typed_data;
+exports.async = async;
+exports.collection = collection;
+exports.convert = convert;
+exports.core = core;
+exports.developer = developer;
+exports.io = io;
+exports.isolate = isolate;
+exports.js = js;
+exports.js_util = js_util;
+exports.math = math;
+exports.mirrors = mirrors;
+exports.typed_data = typed_data;
+exports.indexed_db = indexed_db;
+exports.html = html$;
+exports.html_common = html_common;
+exports.svg = svg$;
+exports.web_audio = web_audio;
+exports.web_gl = web_gl;
+exports.web_sql = web_sql;
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 8e04bfc..870bbeb 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -24,9 +24,9 @@
 export const mirrors = Object.create(null);
 export const typed_data = Object.create(null);
 export const indexed_db = Object.create(null);
-export const html = Object.create(null);
+export const html$ = Object.create(null);
 export const html_common = Object.create(null);
-export const svg = Object.create(null);
+export const svg$ = Object.create(null);
 export const web_audio = Object.create(null);
 export const web_gl = Object.create(null);
 export const web_sql = Object.create(null);
@@ -216,7 +216,7 @@
 let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
 let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
 let _WhereStream = () => (_WhereStream = dart.constFn(async._WhereStream$()))();
-let _Transformation = () => (_Transformation = dart.constFn(async._Transformation$()))();
+let _Transformation$ = () => (_Transformation$ = dart.constFn(async._Transformation$()))();
 let _MapStream = () => (_MapStream = dart.constFn(async._MapStream$()))();
 let _ExpandStream = () => (_ExpandStream = dart.constFn(async._ExpandStream$()))();
 let _HandleErrorStream = () => (_HandleErrorStream = dart.constFn(async._HandleErrorStream$()))();
@@ -290,7 +290,7 @@
 let _LinkedHashSetCell = () => (_LinkedHashSetCell = dart.constFn(collection._LinkedHashSetCell$()))();
 let _LinkedHashSetIterator = () => (_LinkedHashSetIterator = dart.constFn(collection._LinkedHashSetIterator$()))();
 let UnmodifiableListView = () => (UnmodifiableListView = dart.constFn(collection.UnmodifiableListView$()))();
-let _Equality = () => (_Equality = dart.constFn(collection._Equality$()))();
+let _Equality$ = () => (_Equality$ = dart.constFn(collection._Equality$()))();
 let _Hasher = () => (_Hasher = dart.constFn(collection._Hasher$()))();
 let HashMap = () => (HashMap = dart.constFn(collection.HashMap$()))();
 let HashSet = () => (HashSet = dart.constFn(collection.HashSet$()))();
@@ -321,7 +321,7 @@
 let _DoubleLinkedQueueIterator = () => (_DoubleLinkedQueueIterator = dart.constFn(collection._DoubleLinkedQueueIterator$()))();
 let ListQueue = () => (ListQueue = dart.constFn(collection.ListQueue$()))();
 let _ListQueueIterator = () => (_ListQueueIterator = dart.constFn(collection._ListQueueIterator$()))();
-let _Predicate = () => (_Predicate = dart.constFn(collection._Predicate$()))();
+let _Predicate$ = () => (_Predicate$ = dart.constFn(collection._Predicate$()))();
 let _SplayTreeNode = () => (_SplayTreeNode = dart.constFn(collection._SplayTreeNode$()))();
 let _SplayTreeMapNode = () => (_SplayTreeMapNode = dart.constFn(collection._SplayTreeMapNode$()))();
 let _SplayTree = () => (_SplayTree = dart.constFn(collection._SplayTree$()))();
@@ -369,7 +369,7 @@
 let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
 let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
 let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
-let Map = () => (Map = dart.constFn(core.Map$()))();
+let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
 let Set = () => (Set = dart.constFn(core.Set$()))();
 let Sink = () => (Sink = dart.constFn(core.Sink$()))();
 let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
@@ -485,163 +485,163 @@
 let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
 let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
 let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
-let Point = () => (Point = dart.constFn(math.Point$()))();
+let Point$ = () => (Point$ = dart.constFn(math.Point$()))();
 let RectangleOfnum = () => (RectangleOfnum = dart.constFn(math.Rectangle$(core.num)))();
 let _RectangleBase = () => (_RectangleBase = dart.constFn(math._RectangleBase$()))();
 let Rectangle = () => (Rectangle = dart.constFn(math.Rectangle$()))();
 let MutableRectangle = () => (MutableRectangle = dart.constFn(math.MutableRectangle$()))();
-let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html.EventStreamProvider$(html.Event)))();
-let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
+let EventStreamProviderOfEvent = () => (EventStreamProviderOfEvent = dart.constFn(html$.EventStreamProvider$(html$.Event)))();
+let EventStreamProviderOfVersionChangeEvent = () => (EventStreamProviderOfVersionChangeEvent = dart.constFn(html$.EventStreamProvider$(indexed_db.VersionChangeEvent)))();
 let FutureOfDatabase = () => (FutureOfDatabase = dart.constFn(async.Future$(indexed_db.Database)))();
 let CompleterOfIdbFactory = () => (CompleterOfIdbFactory = dart.constFn(async.Completer$(indexed_db.IdbFactory)))();
 let FutureOfIdbFactory = () => (FutureOfIdbFactory = dart.constFn(async.Future$(indexed_db.IdbFactory)))();
 let FutureOfListOfString = () => (FutureOfListOfString = dart.constFn(async.Future$(ListOfString())))();
-let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html.Event])))();
+let EventTovoid = () => (EventTovoid = dart.constFn(dart.functionType(dart.void, [html$.Event])))();
 let CompleterOfDatabase = () => (CompleterOfDatabase = dart.constFn(async.Completer$(indexed_db.Database)))();
-let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html.EventTarget)))();
+let ListOfEventTarget = () => (ListOfEventTarget = dart.constFn(core.List$(html$.EventTarget)))();
 let RectangleOfint = () => (RectangleOfint = dart.constFn(math.Rectangle$(core.int)))();
-let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html.Node)))();
-let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html.Node)))();
-let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html.Element)))();
+let IterableOfNode = () => (IterableOfNode = dart.constFn(core.Iterable$(html$.Node)))();
+let ListOfNode = () => (ListOfNode = dart.constFn(core.List$(html$.Node)))();
+let ListOfElement = () => (ListOfElement = dart.constFn(core.List$(html$.Element)))();
 let IterableOfMapOfString$dynamic = () => (IterableOfMapOfString$dynamic = dart.constFn(core.Iterable$(MapOfString$dynamic())))();
-let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html.EventStreamProvider$(html.WheelEvent)))();
-let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html.EventStreamProvider$(html.TransitionEvent)))();
-let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html.EventStreamProvider$(html.MouseEvent)))();
-let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html.EventStreamProvider$(html.ClipboardEvent)))();
-let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html.EventStreamProvider$(html.KeyboardEvent)))();
-let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html.EventStreamProvider$(html.TouchEvent)))();
-let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html._CustomEventStreamProvider$(html.WheelEvent)))();
-let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html._CustomEventStreamProvider$(html.TransitionEvent)))();
-let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html.Entry)))();
-let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html.EventStreamProvider$(html.ProgressEvent)))();
-let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html.EventStreamProvider$(html.MediaKeyEvent)))();
-let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html.EventStreamProvider$(html.MessageEvent)))();
-let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html.EventStreamProvider$(html.PopStateEvent)))();
-let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html.EventStreamProvider$(html.StorageEvent)))();
-let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html.EventStreamProvider$(web_gl.ContextEvent)))();
+let EventStreamProviderOfWheelEvent = () => (EventStreamProviderOfWheelEvent = dart.constFn(html$.EventStreamProvider$(html$.WheelEvent)))();
+let EventStreamProviderOfTransitionEvent = () => (EventStreamProviderOfTransitionEvent = dart.constFn(html$.EventStreamProvider$(html$.TransitionEvent)))();
+let EventStreamProviderOfMouseEvent = () => (EventStreamProviderOfMouseEvent = dart.constFn(html$.EventStreamProvider$(html$.MouseEvent)))();
+let EventStreamProviderOfClipboardEvent = () => (EventStreamProviderOfClipboardEvent = dart.constFn(html$.EventStreamProvider$(html$.ClipboardEvent)))();
+let EventStreamProviderOfKeyboardEvent = () => (EventStreamProviderOfKeyboardEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyboardEvent)))();
+let EventStreamProviderOfTouchEvent = () => (EventStreamProviderOfTouchEvent = dart.constFn(html$.EventStreamProvider$(html$.TouchEvent)))();
+let _CustomEventStreamProviderOfWheelEvent = () => (_CustomEventStreamProviderOfWheelEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.WheelEvent)))();
+let _CustomEventStreamProviderOfTransitionEvent = () => (_CustomEventStreamProviderOfTransitionEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.TransitionEvent)))();
+let ListOfEntry = () => (ListOfEntry = dart.constFn(core.List$(html$.Entry)))();
+let EventStreamProviderOfProgressEvent = () => (EventStreamProviderOfProgressEvent = dart.constFn(html$.EventStreamProvider$(html$.ProgressEvent)))();
+let EventStreamProviderOfMediaKeyEvent = () => (EventStreamProviderOfMediaKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaKeyEvent)))();
+let EventStreamProviderOfMessageEvent = () => (EventStreamProviderOfMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MessageEvent)))();
+let EventStreamProviderOfPopStateEvent = () => (EventStreamProviderOfPopStateEvent = dart.constFn(html$.EventStreamProvider$(html$.PopStateEvent)))();
+let EventStreamProviderOfStorageEvent = () => (EventStreamProviderOfStorageEvent = dart.constFn(html$.EventStreamProvider$(html$.StorageEvent)))();
+let EventStreamProviderOfContextEvent = () => (EventStreamProviderOfContextEvent = dart.constFn(html$.EventStreamProvider$(web_gl.ContextEvent)))();
 let ListOfnum = () => (ListOfnum = dart.constFn(core.List$(core.num)))();
-let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html.MessagePort)))();
-let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html.FileSystem)))();
-let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html.Entry)))();
-let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html.CssRule)))();
-let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html.Element)))();
-let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html.CssStyleDeclaration)))();
-let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html.File)))();
+let ListOfMessagePort = () => (ListOfMessagePort = dart.constFn(core.List$(html$.MessagePort)))();
+let CompleterOfFileSystem = () => (CompleterOfFileSystem = dart.constFn(async.Completer$(html$.FileSystem)))();
+let CompleterOfEntry = () => (CompleterOfEntry = dart.constFn(async.Completer$(html$.Entry)))();
+let ListOfCssRule = () => (ListOfCssRule = dart.constFn(core.List$(html$.CssRule)))();
+let IterableOfElement = () => (IterableOfElement = dart.constFn(core.Iterable$(html$.Element)))();
+let IterableOfCssStyleDeclaration = () => (IterableOfCssStyleDeclaration = dart.constFn(core.Iterable$(html$.CssStyleDeclaration)))();
+let ListOfFile = () => (ListOfFile = dart.constFn(core.List$(html$.File)))();
 let CompleterOfString = () => (CompleterOfString = dart.constFn(async.Completer$(core.String)))();
-let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html.Metadata)))();
+let CompleterOfMetadata = () => (CompleterOfMetadata = dart.constFn(async.Completer$(html$.Metadata)))();
 let CompleterOfListOfEntry = () => (CompleterOfListOfEntry = dart.constFn(async.Completer$(ListOfEntry())))();
-let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html.EventStreamProvider$(html.SecurityPolicyViolationEvent)))();
-let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html.StyleSheet)))();
-let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html.ImmutableListMixin$()))();
-let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html.Element, html.Element])))();
-let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html.Element])))();
-let ElementList = () => (ElementList = dart.constFn(html.ElementList$()))();
-let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html._FrozenElementList$()))();
-let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html._EventStream$(html.Event)))();
-let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html._ElementEventStreamImpl$(html.Event)))();
-let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html.FileWriter)))();
-let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(html.File)))();
-let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html.FontFace)))();
-let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html.GamepadButton)))();
-let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html.Geoposition)))();
-let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html.Geoposition)))();
-let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html._CustomEventStreamProvider$(html.Event)))();
-let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html.HttpRequest)))();
+let EventStreamProviderOfSecurityPolicyViolationEvent = () => (EventStreamProviderOfSecurityPolicyViolationEvent = dart.constFn(html$.EventStreamProvider$(html$.SecurityPolicyViolationEvent)))();
+let ListOfStyleSheet = () => (ListOfStyleSheet = dart.constFn(core.List$(html$.StyleSheet)))();
+let ImmutableListMixin = () => (ImmutableListMixin = dart.constFn(html$.ImmutableListMixin$()))();
+let ElementAndElementToint = () => (ElementAndElementToint = dart.constFn(dart.functionType(core.int, [html$.Element, html$.Element])))();
+let ElementTobool = () => (ElementTobool = dart.constFn(dart.functionType(core.bool, [html$.Element])))();
+let ElementList = () => (ElementList = dart.constFn(html$.ElementList$()))();
+let _FrozenElementList = () => (_FrozenElementList = dart.constFn(html$._FrozenElementList$()))();
+let _EventStreamOfEvent = () => (_EventStreamOfEvent = dart.constFn(html$._EventStream$(html$.Event)))();
+let _ElementEventStreamImplOfEvent = () => (_ElementEventStreamImplOfEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.Event)))();
+let CompleterOfFileWriter = () => (CompleterOfFileWriter = dart.constFn(async.Completer$(html$.FileWriter)))();
+let CompleterOfFile$ = () => (CompleterOfFile$ = dart.constFn(async.Completer$(html$.File)))();
+let ListOfFontFace = () => (ListOfFontFace = dart.constFn(core.List$(html$.FontFace)))();
+let ListOfGamepadButton = () => (ListOfGamepadButton = dart.constFn(core.List$(html$.GamepadButton)))();
+let CompleterOfGeoposition = () => (CompleterOfGeoposition = dart.constFn(async.Completer$(html$.Geoposition)))();
+let StreamControllerOfGeoposition = () => (StreamControllerOfGeoposition = dart.constFn(async.StreamController$(html$.Geoposition)))();
+let _CustomEventStreamProviderOfEvent = () => (_CustomEventStreamProviderOfEvent = dart.constFn(html$._CustomEventStreamProvider$(html$.Event)))();
+let CompleterOfHttpRequest = () => (CompleterOfHttpRequest = dart.constFn(async.Completer$(html$.HttpRequest)))();
 let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.functionType(core.Null, [dart.dynamic])))();
-let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html.ProgressEvent])))();
+let ProgressEventTovoid = () => (ProgressEventTovoid = dart.constFn(dart.functionType(dart.void, [html$.ProgressEvent])))();
 let ListOfMap = () => (ListOfMap = dart.constFn(core.List$(core.Map)))();
-let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html.MediaStreamTrack)))();
-let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html.SourceInfo)))();
+let ListOfMediaStreamTrack = () => (ListOfMediaStreamTrack = dart.constFn(core.List$(html$.MediaStreamTrack)))();
+let ListOfSourceInfo = () => (ListOfSourceInfo = dart.constFn(core.List$(html$.SourceInfo)))();
 let CompleterOfListOfSourceInfo = () => (CompleterOfListOfSourceInfo = dart.constFn(async.Completer$(ListOfSourceInfo())))();
-let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html.EventStreamProvider$(html.MidiMessageEvent)))();
-let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html.MimeType)))();
-let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html.MutationRecord)))();
-let _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html._wrapZoneBinaryCallback$(ListOfMutationRecord(), html.MutationObserver, dart.void)))();
+let EventStreamProviderOfMidiMessageEvent = () => (EventStreamProviderOfMidiMessageEvent = dart.constFn(html$.EventStreamProvider$(html$.MidiMessageEvent)))();
+let ListOfMimeType = () => (ListOfMimeType = dart.constFn(core.List$(html$.MimeType)))();
+let ListOfMutationRecord = () => (ListOfMutationRecord = dart.constFn(core.List$(html$.MutationRecord)))();
+let _wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = () => (_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void = dart.constFn(html$._wrapZoneBinaryCallback$(ListOfMutationRecord(), html$.MutationObserver, dart.void)))();
 let MapOfString$bool = () => (MapOfString$bool = dart.constFn(core.Map$(core.String, core.bool)))();
-let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html.MediaStream)))();
-let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html.Node])))();
-let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html.Node)))();
-let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html.Plugin)))();
-let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html.EventStreamProvider$(html.RtcDtmfToneChangeEvent)))();
+let CompleterOfMediaStream = () => (CompleterOfMediaStream = dart.constFn(async.Completer$(html$.MediaStream)))();
+let NodeTobool = () => (NodeTobool = dart.constFn(dart.functionType(core.bool, [html$.Node])))();
+let ComparatorOfNode = () => (ComparatorOfNode = dart.constFn(core.Comparator$(html$.Node)))();
+let ListOfPlugin = () => (ListOfPlugin = dart.constFn(core.List$(html$.Plugin)))();
+let EventStreamProviderOfRtcDtmfToneChangeEvent = () => (EventStreamProviderOfRtcDtmfToneChangeEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDtmfToneChangeEvent)))();
 let JSArrayOfMapOfString$String = () => (JSArrayOfMapOfString$String = dart.constFn(_interceptors.JSArray$(MapOfString$String())))();
-let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html.RtcSessionDescription)))();
-let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html.RtcStatsResponse)))();
-let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html.EventStreamProvider$(html.MediaStreamEvent)))();
-let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html.EventStreamProvider$(html.RtcDataChannelEvent)))();
-let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html.EventStreamProvider$(html.RtcIceCandidateEvent)))();
-let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html.OptionElement)))();
-let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html.OptionElement)))();
-let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html.OptionElement)))();
-let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html.SourceBuffer)))();
-let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html.SpeechGrammar)))();
-let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html.EventStreamProvider$(html.SpeechRecognitionError)))();
-let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html.EventStreamProvider$(html.SpeechRecognitionEvent)))();
-let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html.SpeechRecognitionResult)))();
-let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html.EventStreamProvider$(html.SpeechSynthesisEvent)))();
+let CompleterOfRtcSessionDescription = () => (CompleterOfRtcSessionDescription = dart.constFn(async.Completer$(html$.RtcSessionDescription)))();
+let CompleterOfRtcStatsResponse = () => (CompleterOfRtcStatsResponse = dart.constFn(async.Completer$(html$.RtcStatsResponse)))();
+let EventStreamProviderOfMediaStreamEvent = () => (EventStreamProviderOfMediaStreamEvent = dart.constFn(html$.EventStreamProvider$(html$.MediaStreamEvent)))();
+let EventStreamProviderOfRtcDataChannelEvent = () => (EventStreamProviderOfRtcDataChannelEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcDataChannelEvent)))();
+let EventStreamProviderOfRtcIceCandidateEvent = () => (EventStreamProviderOfRtcIceCandidateEvent = dart.constFn(html$.EventStreamProvider$(html$.RtcIceCandidateEvent)))();
+let ListOfOptionElement = () => (ListOfOptionElement = dart.constFn(core.List$(html$.OptionElement)))();
+let UnmodifiableListViewOfOptionElement = () => (UnmodifiableListViewOfOptionElement = dart.constFn(collection.UnmodifiableListView$(html$.OptionElement)))();
+let JSArrayOfOptionElement = () => (JSArrayOfOptionElement = dart.constFn(_interceptors.JSArray$(html$.OptionElement)))();
+let ListOfSourceBuffer = () => (ListOfSourceBuffer = dart.constFn(core.List$(html$.SourceBuffer)))();
+let ListOfSpeechGrammar = () => (ListOfSpeechGrammar = dart.constFn(core.List$(html$.SpeechGrammar)))();
+let EventStreamProviderOfSpeechRecognitionError = () => (EventStreamProviderOfSpeechRecognitionError = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionError)))();
+let EventStreamProviderOfSpeechRecognitionEvent = () => (EventStreamProviderOfSpeechRecognitionEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechRecognitionEvent)))();
+let ListOfSpeechRecognitionResult = () => (ListOfSpeechRecognitionResult = dart.constFn(core.List$(html$.SpeechRecognitionResult)))();
+let EventStreamProviderOfSpeechSynthesisEvent = () => (EventStreamProviderOfSpeechSynthesisEvent = dart.constFn(html$.EventStreamProvider$(html$.SpeechSynthesisEvent)))();
 let VoidToString = () => (VoidToString = dart.constFn(dart.functionType(core.String, [])))();
 let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, core.String])))();
-let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html._WrappedList$(html.TableSectionElement)))();
-let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html._WrappedList$(html.TableRowElement)))();
-let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html._WrappedList$(html.TableCellElement)))();
-let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html.TextTrackCue)))();
-let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html.TextTrack)))();
-let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html.EventStreamProvider$(html.TrackEvent)))();
-let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html.Touch)))();
-let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html.TrackDefault)))();
-let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html.EventStreamProvider$(html.CloseEvent)))();
+let _WrappedListOfTableSectionElement = () => (_WrappedListOfTableSectionElement = dart.constFn(html$._WrappedList$(html$.TableSectionElement)))();
+let _WrappedListOfTableRowElement = () => (_WrappedListOfTableRowElement = dart.constFn(html$._WrappedList$(html$.TableRowElement)))();
+let _WrappedListOfTableCellElement = () => (_WrappedListOfTableCellElement = dart.constFn(html$._WrappedList$(html$.TableCellElement)))();
+let ListOfTextTrackCue = () => (ListOfTextTrackCue = dart.constFn(core.List$(html$.TextTrackCue)))();
+let ListOfTextTrack = () => (ListOfTextTrack = dart.constFn(core.List$(html$.TextTrack)))();
+let EventStreamProviderOfTrackEvent = () => (EventStreamProviderOfTrackEvent = dart.constFn(html$.EventStreamProvider$(html$.TrackEvent)))();
+let ListOfTouch = () => (ListOfTouch = dart.constFn(core.List$(html$.Touch)))();
+let ListOfTrackDefault = () => (ListOfTrackDefault = dart.constFn(core.List$(html$.TrackDefault)))();
+let EventStreamProviderOfCloseEvent = () => (EventStreamProviderOfCloseEvent = dart.constFn(html$.EventStreamProvider$(html$.CloseEvent)))();
 let CompleterOfnum = () => (CompleterOfnum = dart.constFn(async.Completer$(core.num)))();
-let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html.EventStreamProvider$(html.DeviceMotionEvent)))();
-let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html.EventStreamProvider$(html.DeviceOrientationEvent)))();
-let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html.EventStreamProvider$(html.AnimationEvent)))();
-let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html.EventStreamProvider$(html.BeforeUnloadEvent)))();
-let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html._EventStream$(html.BeforeUnloadEvent)))();
-let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html.BeforeUnloadEvent)))();
-let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html._ElementEventStreamImpl$(html.BeforeUnloadEvent)))();
-let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html._ElementListEventStreamImpl$(html.BeforeUnloadEvent)))();
-let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html.ElementList$(html.Element)))();
+let EventStreamProviderOfDeviceMotionEvent = () => (EventStreamProviderOfDeviceMotionEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceMotionEvent)))();
+let EventStreamProviderOfDeviceOrientationEvent = () => (EventStreamProviderOfDeviceOrientationEvent = dart.constFn(html$.EventStreamProvider$(html$.DeviceOrientationEvent)))();
+let EventStreamProviderOfAnimationEvent = () => (EventStreamProviderOfAnimationEvent = dart.constFn(html$.EventStreamProvider$(html$.AnimationEvent)))();
+let EventStreamProviderOfBeforeUnloadEvent = () => (EventStreamProviderOfBeforeUnloadEvent = dart.constFn(html$.EventStreamProvider$(html$.BeforeUnloadEvent)))();
+let _EventStreamOfBeforeUnloadEvent = () => (_EventStreamOfBeforeUnloadEvent = dart.constFn(html$._EventStream$(html$.BeforeUnloadEvent)))();
+let StreamControllerOfBeforeUnloadEvent = () => (StreamControllerOfBeforeUnloadEvent = dart.constFn(async.StreamController$(html$.BeforeUnloadEvent)))();
+let _ElementEventStreamImplOfBeforeUnloadEvent = () => (_ElementEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementEventStreamImpl$(html$.BeforeUnloadEvent)))();
+let _ElementListEventStreamImplOfBeforeUnloadEvent = () => (_ElementListEventStreamImplOfBeforeUnloadEvent = dart.constFn(html$._ElementListEventStreamImpl$(html$.BeforeUnloadEvent)))();
+let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
 let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
-let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html.Gamepad)))();
+let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
 let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
 let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
 let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
 let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.functionType(core.String, [core.String, core.String])))();
 let SetOfStringTodynamic = () => (SetOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [SetOfString()])))();
-let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html.EventStreamProvider$()))();
-let ElementStream = () => (ElementStream = dart.constFn(html.ElementStream$()))();
-let _EventStream = () => (_EventStream = dart.constFn(html._EventStream$()))();
-let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html._ElementEventStreamImpl$()))();
-let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html._ElementListEventStreamImpl$()))();
-let _EventListener = () => (_EventListener = dart.constFn(html._EventListener$()))();
-let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html._wrapZoneCallback$(html.Event, dart.dynamic)))();
-let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html._EventStreamSubscription$()))();
-let CustomStream = () => (CustomStream = dart.constFn(html.CustomStream$()))();
-let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html._CustomEventStreamImpl$()))();
-let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html.EventStreamProvider$(html.KeyEvent)))();
-let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html.CustomStream$(html.KeyEvent)))();
-let _StreamPool = () => (_StreamPool = dart.constFn(html._StreamPool$()))();
-let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html._CustomEventStreamProvider$()))();
+let EventStreamProvider = () => (EventStreamProvider = dart.constFn(html$.EventStreamProvider$()))();
+let ElementStream = () => (ElementStream = dart.constFn(html$.ElementStream$()))();
+let _EventStream = () => (_EventStream = dart.constFn(html$._EventStream$()))();
+let _ElementEventStreamImpl = () => (_ElementEventStreamImpl = dart.constFn(html$._ElementEventStreamImpl$()))();
+let _ElementListEventStreamImpl = () => (_ElementListEventStreamImpl = dart.constFn(html$._ElementListEventStreamImpl$()))();
+let _EventListener = () => (_EventListener = dart.constFn(html$._EventListener$()))();
+let _wrapZoneCallbackOfEvent$dynamic = () => (_wrapZoneCallbackOfEvent$dynamic = dart.constFn(html$._wrapZoneCallback$(html$.Event, dart.dynamic)))();
+let _EventStreamSubscription = () => (_EventStreamSubscription = dart.constFn(html$._EventStreamSubscription$()))();
+let CustomStream = () => (CustomStream = dart.constFn(html$.CustomStream$()))();
+let _CustomEventStreamImpl = () => (_CustomEventStreamImpl = dart.constFn(html$._CustomEventStreamImpl$()))();
+let EventStreamProviderOfKeyEvent = () => (EventStreamProviderOfKeyEvent = dart.constFn(html$.EventStreamProvider$(html$.KeyEvent)))();
+let CustomStreamOfKeyEvent = () => (CustomStreamOfKeyEvent = dart.constFn(html$.CustomStream$(html$.KeyEvent)))();
+let _StreamPool = () => (_StreamPool = dart.constFn(html$._StreamPool$()))();
+let _CustomEventStreamProvider = () => (_CustomEventStreamProvider = dart.constFn(html$._CustomEventStreamProvider$()))();
 let MapOfString$Function = () => (MapOfString$Function = dart.constFn(core.Map$(core.String, core.Function)))();
-let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html.KeyEvent)))();
-let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html.KeyEvent)))();
+let JSArrayOfKeyEvent = () => (JSArrayOfKeyEvent = dart.constFn(_interceptors.JSArray$(html$.KeyEvent)))();
+let ListOfKeyEvent = () => (ListOfKeyEvent = dart.constFn(core.List$(html$.KeyEvent)))();
 let MapOfString$int = () => (MapOfString$int = dart.constFn(core.Map$(core.String, core.int)))();
-let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html.NodeValidator)))();
-let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html.NodeValidator)))();
-let _WrappedList = () => (_WrappedList = dart.constFn(html._WrappedList$()))();
-let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html.Node)))();
-let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html._WrappedIterator$()))();
-let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html.HttpRequest])))();
-let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html.FixedSizeListIterator$()))();
-let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html._VariableSizeListIterator$()))();
-let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html._wrapZoneCallback$()))();
-let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html._wrapZoneBinaryCallback$()))();
-let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html.Element])))();
-let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg.Length)))();
-let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg.Number)))();
-let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg.PathSeg)))();
-let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg.Transform)))();
+let JSArrayOfNodeValidator = () => (JSArrayOfNodeValidator = dart.constFn(_interceptors.JSArray$(html$.NodeValidator)))();
+let ListOfNodeValidator = () => (ListOfNodeValidator = dart.constFn(core.List$(html$.NodeValidator)))();
+let _WrappedList = () => (_WrappedList = dart.constFn(html$._WrappedList$()))();
+let IteratorOfNode = () => (IteratorOfNode = dart.constFn(core.Iterator$(html$.Node)))();
+let _WrappedIterator = () => (_WrappedIterator = dart.constFn(html$._WrappedIterator$()))();
+let HttpRequestTodynamic = () => (HttpRequestTodynamic = dart.constFn(dart.functionType(dart.dynamic, [html$.HttpRequest])))();
+let FixedSizeListIterator = () => (FixedSizeListIterator = dart.constFn(html$.FixedSizeListIterator$()))();
+let _VariableSizeListIterator = () => (_VariableSizeListIterator = dart.constFn(html$._VariableSizeListIterator$()))();
+let _wrapZoneCallback = () => (_wrapZoneCallback = dart.constFn(html$._wrapZoneCallback$()))();
+let _wrapZoneBinaryCallback = () => (_wrapZoneBinaryCallback = dart.constFn(html$._wrapZoneBinaryCallback$()))();
+let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.functionType(dart.void, [html$.Element])))();
+let ListOfLength = () => (ListOfLength = dart.constFn(core.List$(svg$.Length)))();
+let ListOfNumber = () => (ListOfNumber = dart.constFn(core.List$(svg$.Number)))();
+let ListOfPathSeg = () => (ListOfPathSeg = dart.constFn(core.List$(svg$.PathSeg)))();
+let ListOfTransform = () => (ListOfTransform = dart.constFn(core.List$(svg$.Transform)))();
 let CompleterOfAudioBuffer = () => (CompleterOfAudioBuffer = dart.constFn(async.Completer$(web_audio.AudioBuffer)))();
-let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
-let dynamicTodynamic = () => (dynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
+let EventStreamProviderOfAudioProcessingEvent = () => (EventStreamProviderOfAudioProcessingEvent = dart.constFn(html$.EventStreamProvider$(web_audio.AudioProcessingEvent)))();
+let dynamicTodynamic$ = () => (dynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic])))();
 let StringAndStringToint = () => (StringAndStringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.String])))();
 let VoidTo_MethodStats = () => (VoidTo_MethodStats = dart.constFn(dart.definiteFunctionType(dart._MethodStats, [])))();
 let VoidToFunctionType = () => (VoidToFunctionType = dart.constFn(dart.definiteFunctionType(dart.FunctionType, [])))();
@@ -655,36 +655,36 @@
 let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
 let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
 let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
-let StringTobool = () => (StringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
-let dynamicTobool = () => (dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
+let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
 let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
 let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
 let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
-let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
 let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
 let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
 let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
-let dynamicTovoid = () => (dynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
+let dynamicTovoid$ = () => (dynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic])))();
 let TypeTodynamic = () => (TypeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type])))();
-let VoidToString = () => (VoidToString = dart.constFn(dart.definiteFunctionType(core.String, [])))();
-let StringToString = () => (StringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
+let VoidToString$ = () => (VoidToString$ = dart.constFn(dart.definiteFunctionType(core.String, [])))();
+let StringToString$ = () => (StringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String])))();
 let StringAndStringTodynamic = () => (StringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String])))();
 let FunctionTovoid = () => (FunctionTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Function])))();
-let StringAndStringToString = () => (StringAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
+let StringAndStringToString$ = () => (StringAndStringToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String])))();
 let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
-let dynamicAnddynamicTodynamic = () => (dynamicAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
+let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
 let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
-let StringTovoid = () => (StringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
+let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
 let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
 let VoidTobool = () => (VoidTobool = dart.constFn(dart.definiteFunctionType(core.bool, [])))();
 let VoidTo_IsolateContext = () => (VoidTo_IsolateContext = dart.constFn(dart.definiteFunctionType(_isolate_helper._IsolateContext, [])))();
 let VoidToNull = () => (VoidToNull = dart.constFn(dart.definiteFunctionType(core.Null, [])))();
-let dynamicAnddynamicTovoid = () => (dynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
-let VoidTovoid = () => (VoidTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
+let dynamicAnddynamicTovoid$ = () => (dynamicAnddynamicTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])))();
+let VoidTovoid$ = () => (VoidTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [])))();
 let ListToNull = () => (ListToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.List])))();
 let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
-let dynamicToNull = () => (dynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
+let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
 let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
 let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
 let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
@@ -711,12 +711,12 @@
 let StringAnddynamicAndintTobool = () => (StringAnddynamicAndintTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.String, dart.dynamic, core.int])))();
 let StringAndJSSyntaxRegExpAndString__ToString = () => (StringAndJSSyntaxRegExpAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, _js_helper.JSSyntaxRegExp, core.String, core.int])))();
 let StringAndPatternAndStringToString = () => (StringAndPatternAndStringToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String])))();
-let MatchToString = () => (MatchToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
+let MatchToString$ = () => (MatchToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.Match])))();
 let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), StringToString()])))();
 let StringAndFnAndFnToString = () => (StringAndFnAndFnToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, MatchToString(), StringToString()])))();
 let StringAndStringAndFn__ToString = () => (StringAndStringAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.String, MatchToString(), StringToString()])))();
 let StringAndPatternAndString__ToString = () => (StringAndPatternAndString__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, core.String, core.int])))();
-let StringAndPatternAndFn__ToString = () => (StringAndPatternAndFn__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
+let StringAndPatternAndFn__ToString$ = () => (StringAndPatternAndFn__ToString$ = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.Pattern, MatchToString(), core.int])))();
 let StringAndintAndint__ToString = () => (StringAndintAndint__ToString = dart.constFn(dart.definiteFunctionType(core.String, [core.String, core.int, core.int, core.String])))();
 let dynamicToType = () => (dynamicToType = dart.constFn(dart.definiteFunctionType(core.Type, [dart.dynamic])))();
 let dynamicAndintTodynamic = () => (dynamicAndintTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.int])))();
@@ -740,7 +740,7 @@
 let intAndintAndintToint = () => (intAndintAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int, core.int])))();
 let FunctionAndObjectAndStackTraceTodynamic = () => (FunctionAndObjectAndStackTraceTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.Object, core.StackTrace])))();
 let FunctionAndZoneToFunction = () => (FunctionAndZoneToFunction = dart.constFn(dart.definiteFunctionType(R => [core.Function, [core.Function, async.Zone]])))();
-let VoidToObject = () => (VoidToObject = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
+let VoidToObject$ = () => (VoidToObject$ = dart.constFn(dart.definiteFunctionType(core.Object, [])))();
 let _FutureAnddynamicAnddynamicTovoid = () => (_FutureAnddynamicAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async._Future, dart.dynamic, dart.dynamic])))();
 let ObjectToObject = () => (ObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object])))();
 let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [dart.dynamic])))();
@@ -758,17 +758,17 @@
 let _ZoneToZoneDelegate = () => (_ZoneToZoneDelegate = dart.constFn(dart.definiteFunctionType(async.ZoneDelegate, [async._Zone])))();
 let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace]])))();
 let ObjectAndStackTraceTovoid = () => (ObjectAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace])))();
-let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
-let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
-let ZoneAndZoneDelegateAndZone__ToR = () => (ZoneAndZoneDelegateAndZone__ToR = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
+let ZoneAndZoneDelegateAndZone__ToR$ = () => (ZoneAndZoneDelegateAndZone__ToR$ = dart.constFn(dart.definiteFunctionType(R => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
+let ZoneAndZoneDelegateAndZone__ToR$0 = () => (ZoneAndZoneDelegateAndZone__ToR$0 = dart.constFn(dart.definiteFunctionType((R, T) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T]), T]])))();
+let ZoneAndZoneDelegateAndZone__ToR$1 = () => (ZoneAndZoneDelegateAndZone__ToR$1 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [R, [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2]), T1, T2]])))();
 let ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = () => (ZoneAndZoneDelegateAndZone__ToZoneCallbackOfR = dart.constFn(dart.definiteFunctionType(R => [async.ZoneCallback$(R), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [])]])))();
 let ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = () => (ZoneAndZoneDelegateAndZone__ToZoneUnaryCallbackOfR$T = dart.constFn(dart.definiteFunctionType((R, T) => [async.ZoneUnaryCallback$(R, T), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T])]])))();
 let ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = () => (ZoneAndZoneDelegateAndZone__ToZoneBinaryCallbackOfR$T1$T2 = dart.constFn(dart.definiteFunctionType((R, T1, T2) => [async.ZoneBinaryCallback$(R, T1, T2), [async.Zone, async.ZoneDelegate, async.Zone, dart.functionType(R, [T1, T2])]])))();
 let ZoneAndZoneDelegateAndZone__ToAsyncError = () => (ZoneAndZoneDelegateAndZone__ToAsyncError = dart.constFn(dart.definiteFunctionType(async.AsyncError, [async.Zone, async.ZoneDelegate, async.Zone, core.Object, core.StackTrace])))();
 let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, VoidTodynamic()])))();
 let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, VoidTovoid()])))();
-let ZoneAndZoneDelegateAndZone__ToTimer = () => (ZoneAndZoneDelegateAndZone__ToTimer = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
-let ZoneAndZoneDelegateAndZone__Tovoid = () => (ZoneAndZoneDelegateAndZone__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
+let ZoneAndZoneDelegateAndZone__ToTimer$ = () => (ZoneAndZoneDelegateAndZone__ToTimer$ = dart.constFn(dart.definiteFunctionType(async.Timer, [async.Zone, async.ZoneDelegate, async.Zone, core.Duration, TimerTovoid()])))();
+let ZoneAndZoneDelegateAndZone__Tovoid$ = () => (ZoneAndZoneDelegateAndZone__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [async.Zone, async.ZoneDelegate, async.Zone, core.String])))();
 let ZoneAndZoneDelegateAndZone__ToZone = () => (ZoneAndZoneDelegateAndZone__ToZone = dart.constFn(dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneDelegate, async.Zone, async.ZoneSpecification, core.Map])))();
 let ZoneAndZoneDelegateAndZone__Todynamic = () => (ZoneAndZoneDelegateAndZone__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [async.Zone, async.ZoneDelegate, async.Zone, dart.dynamic, core.StackTrace])))();
 let Fn__ToR = () => (Fn__ToR = dart.constFn(dart.definiteFunctionType(R => [R, [dart.functionType(R, [])], {zoneValues: core.Map, zoneSpecification: async.ZoneSpecification, onError: core.Function}])))();
@@ -777,25 +777,25 @@
 let IterableAndListTovoid = () => (IterableAndListTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Iterable, core.List])))();
 let _SplayTreeMapNodeTobool = () => (_SplayTreeMapNodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [collection._SplayTreeMapNode])))();
 let dynamicAndFnTodynamic = () => (dynamicAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dynamicAnddynamicTodynamic()])))();
-let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
+let Uint8ListAndintAndintTovoid$ = () => (Uint8ListAndintAndintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
 let StringAndFnTodynamic = () => (StringAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, dynamicAnddynamicTodynamic()])))();
 let EventSinkOfStringTo_LineSplitterEventSink = () => (EventSinkOfStringTo_LineSplitterEventSink = dart.constFn(dart.definiteFunctionType(convert._LineSplitterEventSink, [EventSinkOfString()])))();
 let intAndintToint = () => (intAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int, core.int])))();
 let dynamicAndintToint = () => (dynamicAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, core.int])))();
 let intAndintTovoid = () => (intAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int])))();
-let StringToint = () => (StringToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
+let StringToint$ = () => (StringToint$ = dart.constFn(dart.definiteFunctionType(core.int, [core.String])))();
 let intToString = () => (intToString = dart.constFn(dart.definiteFunctionType(core.String, [core.int])))();
 let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
 let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
 let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
-let StringAndStringTovoid = () => (StringAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
+let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
 let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
 let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
 let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
 let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
 let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
 let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
-let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
+let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
 let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
 let StringAndMapTovoid = () => (StringAndMapTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.Map])))();
 let StringToServiceExtensionHandler = () => (StringToServiceExtensionHandler = dart.constFn(dart.definiteFunctionType(developer.ServiceExtensionHandler, [core.String])))();
@@ -803,7 +803,7 @@
 let VoidToUserTag = () => (VoidToUserTag = dart.constFn(dart.definiteFunctionType(developer.UserTag, [])))();
 let MapToString = () => (MapToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Map])))();
 let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String, core.String])))();
-let intAndintAndString__Tovoid = () => (intAndintAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
+let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
 let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
 let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
 let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
@@ -838,7 +838,7 @@
 let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
 let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
 let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
+let ListOfintTovoid$ = () => (ListOfintTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
 let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
 let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
 let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
@@ -856,12 +856,12 @@
 let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
 let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
 let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
-let dynamic__ToNull = () => (dynamic__ToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
+let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
 let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
 let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
 let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
 let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
-let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
+let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
 let _HttpClientConnectionTo_ConnectionInfo = () => (_HttpClientConnectionTo_ConnectionInfo = dart.constFn(dart.definiteFunctionType(io._ConnectionInfo, [io._HttpClientConnection])))();
 let dynamicToFutureOrOf_ConnectionInfo = () => (dynamicToFutureOrOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOrOf_ConnectionInfo(), [dart.dynamic])))();
 let _ConnectionTargetTobool = () => (_ConnectionTargetTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io._ConnectionTarget])))();
@@ -914,7 +914,7 @@
 let FunctionToFunction = () => (FunctionToFunction = dart.constFn(dart.definiteFunctionType(core.Function, [core.Function])))();
 let FunctionAndListTodynamic = () => (FunctionAndListTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Function, core.List])))();
 let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
-let TAndTToT = () => (TAndTToT = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
+let TAndTToT$ = () => (TAndTToT$ = dart.constFn(dart.definiteFunctionType(T => [T, [T, T]])))();
 let numAndnumTodouble = () => (numAndnumTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num, core.num])))();
 let numAndnumTonum = () => (numAndnumTonum = dart.constFn(dart.definiteFunctionType(core.num, [core.num, core.num])))();
 let numTodouble = () => (numTodouble = dart.constFn(dart.definiteFunctionType(core.double, [core.num])))();
@@ -923,63 +923,63 @@
 let VoidToMirrorSystem = () => (VoidToMirrorSystem = dart.constFn(dart.definiteFunctionType(mirrors.MirrorSystem, [])))();
 let ObjectToInstanceMirror = () => (ObjectToInstanceMirror = dart.constFn(dart.definiteFunctionType(mirrors.InstanceMirror, [core.Object])))();
 let TypeToClassMirror = () => (TypeToClassMirror = dart.constFn(dart.definiteFunctionType(mirrors.ClassMirror, [core.Type])))();
-let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Event])))();
+let EventToNull = () => (EventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Event])))();
 let RequestToFutureOfT = () => (RequestToFutureOfT = dart.constFn(dart.definiteFunctionType(T => [async.Future$(T), [indexed_db.Request]])))();
 let dynamicToTo = () => (dynamicToTo = dart.constFn(dart.definiteFunctionType(To => [To, [dart.dynamic]])))();
-let NodeTobool = () => (NodeTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Node])))();
+let NodeTobool$ = () => (NodeTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Node])))();
 let MapOfString$dynamicTobool = () => (MapOfString$dynamicTobool = dart.constFn(dart.definiteFunctionType(core.bool, [MapOfString$dynamic()])))();
 let UriAndListOfStringAnddynamicToFutureOfIsolate = () => (UriAndListOfStringAnddynamicToFutureOfIsolate = dart.constFn(dart.definiteFunctionType(FutureOfIsolate(), [core.Uri, ListOfString(), dart.dynamic])))();
 let TypeAnddynamicTodynamic = () => (TypeAnddynamicTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, dart.dynamic])))();
-let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileSystem])))();
-let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileError])))();
-let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Entry])))();
-let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html.CssStyleDeclaration, [dart.dynamic])))();
-let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.CssStyleDeclaration])))();
-let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Metadata])))();
+let FileSystemToNull = () => (FileSystemToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileSystem])))();
+let FileErrorToNull = () => (FileErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileError])))();
+let EntryToNull = () => (EntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Entry])))();
+let dynamicToCssStyleDeclaration = () => (dynamicToCssStyleDeclaration = dart.constFn(dart.definiteFunctionType(html$.CssStyleDeclaration, [dart.dynamic])))();
+let CssStyleDeclarationTovoid = () => (CssStyleDeclarationTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.CssStyleDeclaration])))();
+let MetadataToNull = () => (MetadataToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Metadata])))();
 let ListOfEntryToNull = () => (ListOfEntryToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfEntry()])))();
-let ElementTobool = () => (ElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Element])))();
-let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.FileWriter])))();
-let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.File])))();
-let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.Geoposition])))();
-let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.PositionError])))();
-let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html.HttpRequest])))();
-let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.ProgressEvent])))();
+let ElementTobool$ = () => (ElementTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Element])))();
+let FileWriterToNull = () => (FileWriterToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.FileWriter])))();
+let FileToNull = () => (FileToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.File])))();
+let GeopositionToNull = () => (GeopositionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.Geoposition])))();
+let PositionErrorToNull = () => (PositionErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.PositionError])))();
+let HttpRequestToString = () => (HttpRequestToString = dart.constFn(dart.definiteFunctionType(core.String, [html$.HttpRequest])))();
+let ProgressEventToNull = () => (ProgressEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.ProgressEvent])))();
 let ListOfSourceInfoToNull = () => (ListOfSourceInfoToNull = dart.constFn(dart.definiteFunctionType(core.Null, [ListOfSourceInfo()])))();
-let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.MediaStream])))();
-let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.NavigatorUserMediaError])))();
-let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcSessionDescription])))();
-let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.RtcStatsResponse])))();
-let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.OptionElement])))();
+let MediaStreamToNull = () => (MediaStreamToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.MediaStream])))();
+let NavigatorUserMediaErrorToNull = () => (NavigatorUserMediaErrorToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.NavigatorUserMediaError])))();
+let RtcSessionDescriptionToNull = () => (RtcSessionDescriptionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcSessionDescription])))();
+let RtcStatsResponseToNull = () => (RtcStatsResponseToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.RtcStatsResponse])))();
+let OptionElementTobool = () => (OptionElementTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.OptionElement])))();
 let numToNull = () => (numToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.num])))();
-let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html.BeforeUnloadEvent])))();
-let ElementTovoid = () => (ElementTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Element])))();
-let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html.CssClassSet, [html.Element])))();
+let BeforeUnloadEventToNull = () => (BeforeUnloadEventToNull = dart.constFn(dart.definiteFunctionType(core.Null, [html$.BeforeUnloadEvent])))();
+let ElementTovoid$ = () => (ElementTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Element])))();
+let ElementToCssClassSet = () => (ElementToCssClassSet = dart.constFn(dart.definiteFunctionType(html$.CssClassSet, [html$.Element])))();
 let CssClassSetImplTovoid = () => (CssClassSetImplTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html_common.CssClassSetImpl])))();
 let boolAndCssClassSetImplTobool = () => (boolAndCssClassSetImplTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.bool, html_common.CssClassSetImpl])))();
 let SetOfStringTobool = () => (SetOfStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [SetOfString()])))();
 let SetOfStringTovoid = () => (SetOfStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [SetOfString()])))();
-let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.Event, core.String])))();
-let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html.Event])))();
-let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.KeyEvent])))();
-let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html.NodeValidator])))();
-let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html.Node, html.Node])))();
+let EventAndStringTobool = () => (EventAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.Event, core.String])))();
+let EventTodynamic = () => (EventTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.Event])))();
+let KeyEventTobool = () => (KeyEventTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.KeyEvent])))();
+let NodeValidatorTobool = () => (NodeValidatorTobool = dart.constFn(dart.definiteFunctionType(core.bool, [html$.NodeValidator])))();
+let NodeAndNodeToint = () => (NodeAndNodeToint = dart.constFn(dart.definiteFunctionType(core.int, [html$.Node, html$.Node])))();
 let FromToTo = () => (FromToTo = dart.constFn(dart.definiteFunctionType((From, To) => [To, [From]])))();
-let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html.WindowBase, [dart.dynamic])))();
-let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html.EventTarget, [dart.dynamic])))();
+let dynamicToWindowBase = () => (dynamicToWindowBase = dart.constFn(dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])))();
+let dynamicToEventTarget = () => (dynamicToEventTarget = dart.constFn(dart.definiteFunctionType(html$.EventTarget, [dart.dynamic])))();
 let dynamicAnddynamicAnddynamic__Todynamic = () => (dynamicAnddynamicAnddynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicAndString__Tovoid = () => (dynamicAnddynamicAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, core.String, core.Type, core.String])))();
-let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html._wrapZoneCallback$(A, R), [html._wrapZoneCallback$(A, R)]])))();
-let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html._wrapZoneBinaryCallback$(A, B, R), [html._wrapZoneBinaryCallback$(A, B, R)]])))();
-let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html.Element, [core.String])))();
+let _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = () => (_wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R = dart.constFn(dart.definiteFunctionType((A, R) => [html$._wrapZoneCallback$(A, R), [html$._wrapZoneCallback$(A, R)]])))();
+let _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = () => (_wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R = dart.constFn(dart.definiteFunctionType((A, B, R) => [html$._wrapZoneBinaryCallback$(A, B, R), [html$._wrapZoneBinaryCallback$(A, B, R)]])))();
+let StringToElement = () => (StringToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [core.String])))();
 let StringToElementListOfElement = () => (StringToElementListOfElement = dart.constFn(dart.definiteFunctionType(ElementListOfElement(), [core.String])))();
-let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html.Node, html.Node])))();
-let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html.ImageData, [dart.dynamic])))();
-let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html.ImageData])))();
+let NodeAndNodeTovoid = () => (NodeAndNodeTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])))();
+let dynamicToImageData = () => (dynamicToImageData = dart.constFn(dart.definiteFunctionType(html$.ImageData, [dart.dynamic])))();
+let ImageDataTodynamic = () => (ImageDataTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [html$.ImageData])))();
 let Map__Todynamic = () => (Map__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Map], [dynamicTovoid()])))();
 let ListOfStringToList = () => (ListOfStringToList = dart.constFn(dart.definiteFunctionType(core.List, [ListOfString()])))();
 let DateTimeTodynamic = () => (DateTimeTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.DateTime])))();
 let dynamic__Todynamic = () => (dynamic__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic], {mustCopy: dart.dynamic})))();
-let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html.Element, [html.Node])))();
+let NodeToElement = () => (NodeToElement = dart.constFn(dart.definiteFunctionType(html$.Element, [html$.Node])))();
 let AudioBufferToNull = () => (AudioBufferToNull = dart.constFn(dart.definiteFunctionType(core.Null, [web_audio.AudioBuffer])))();
 dart.mixin = function(base, ...mixins) {
   class Mixin extends base {}
@@ -2129,13 +2129,13 @@
   return callback(rawField);
 };
 dart.dloadRepl = function(obj, field) {
-  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic()));
+  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dload(obj, resolvedField), dynamicTodynamic$()));
 };
 dart.dputRepl = function(obj, field, value) {
-  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic()));
+  return dart._dhelperRepl(obj, field, dart.fn(resolvedField => dart.dput(obj, resolvedField, value), dynamicTodynamic$()));
 };
 dart._callMethodRepl = function(obj, method, typeArgs, args) {
-  return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic()));
+  return dart._dhelperRepl(obj, method, dart.fn(resolvedField => dart._callMethod(obj, resolvedField, typeArgs, args, method), dynamicTodynamic$()));
 };
 dart.dsendRepl = function(obj, method, ...args) {
   return dart._callMethodRepl(obj, method, null, args);
@@ -2622,7 +2622,8 @@
       window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
     }
   }
-  return typeof window == "undefined" ? global : window;
+  var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {};
+  return globalState;
 })();
 dart.JsSymbol = Symbol;
 dart._mixins = Symbol("mixins");
@@ -3086,7 +3087,7 @@
   }
   static _namedArgsToSymbols(namedArgs) {
     if (namedArgs == null) return dart.map({}, core.Symbol, dart.dynamic);
-    return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic())});
+    return MapOfSymbol$dynamic().fromIterable(dart.getOwnPropertyNames(namedArgs), {key: dart._dartSymbol, value: dart.fn(k => namedArgs[k], dynamicTodynamic$())});
   }
 };
 dart.setSignature(dart.InvocationImpl, {
@@ -3414,9 +3415,9 @@
 };
 dart.fn(_debugger.safeGetProperty, ObjectAndObjectToObject());
 _debugger.safeProperties = function(object) {
-  return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool())), {key: dart.fn(name => name, dynamicTodynamic()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
+  return MapOfdynamic$Object().fromIterable(_debugger.getOwnPropertyNames(object)[dartx.where](dart.fn(each => _debugger.safeGetProperty(object, each) != null, StringTobool$())), {key: dart.fn(name => name, dynamicTodynamic$()), value: dart.fn(name => _debugger.safeGetProperty(object, name), dynamicToObject())});
 };
-dart.fn(_debugger.safeProperties, dynamicTodynamic());
+dart.fn(_debugger.safeProperties, dynamicTodynamic$());
 const _attributes = Symbol('_attributes');
 const _jsonML = Symbol('_jsonML');
 _debugger.JsonMLElement = class JsonMLElement extends core.Object {
@@ -3481,9 +3482,9 @@
 });
 _debugger.isNativeJavaScriptObject = function(object) {
   let type = _debugger._typeof(object);
-  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html.Node.is(object);
+  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
 };
-dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool());
+dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
 _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
   new(simpleFormatter) {
     this[_simpleFormatter] = simpleFormatter;
@@ -3570,7 +3571,7 @@
       }
     } catch (e) {
       let trace = dart.stackTrace(e);
-      html.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
+      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
     }
 
     return null;
@@ -3583,7 +3584,7 @@
       }
     } catch (e) {
       let trace = dart.stackTrace(e);
-      html.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
+      html$.window[dartx.console].error(dart.str`[hasChildren] Caught exception ${e}\n trace:\n${trace}`);
     }
 
     return false;
@@ -3597,7 +3598,7 @@
       }
     } catch (e) {
       let trace = dart.stackTrace(e);
-      html.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
+      html$.window[dartx.console].error(dart.str`Caught exception ${e}\n trace:\n${trace}`);
     }
 
     return JSArrayOfNameValuePair().of([]);
@@ -4056,7 +4057,7 @@
   let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
   dart.global.devtoolsFormatters = formatters;
 };
-dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic());
+dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
 _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
   if (arg0 === void 0) arg0 = null;
   if (arg1 === void 0) arg1 = null;
@@ -4090,70 +4091,70 @@
 dart.lazyFn(_foreign_helper.JS_CALL_IN_ISOLATE, () => dynamicAndFunctionTodynamic());
 _foreign_helper.JS_SET_CURRENT_ISOLATE = function(isolate) {
 };
-dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid());
+dart.fn(_foreign_helper.JS_SET_CURRENT_ISOLATE, dynamicTovoid$());
 _foreign_helper.JS_CREATE_ISOLATE = function() {
 };
-dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic());
+dart.fn(_foreign_helper.JS_CREATE_ISOLATE, VoidTodynamic$());
 _foreign_helper.JS_DART_OBJECT_CONSTRUCTOR = function() {
 };
-dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic());
+dart.fn(_foreign_helper.JS_DART_OBJECT_CONSTRUCTOR, VoidTodynamic$());
 _foreign_helper.JS_INTERCEPTOR_CONSTANT = function(type) {
 };
 dart.fn(_foreign_helper.JS_INTERCEPTOR_CONSTANT, TypeTodynamic());
 _foreign_helper.JS_OPERATOR_IS_PREFIX = function() {
 };
-dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_OPERATOR_IS_PREFIX, () => VoidToString$());
 _foreign_helper.JS_OPERATOR_AS_PREFIX = function() {
 };
-dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_OPERATOR_AS_PREFIX, () => VoidToString$());
 _foreign_helper.JS_OBJECT_CLASS_NAME = function() {
 };
-dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_OBJECT_CLASS_NAME, () => VoidToString$());
 _foreign_helper.JS_NULL_CLASS_NAME = function() {
 };
-dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_NULL_CLASS_NAME, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_CLASS_NAME = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_CLASS_NAME, () => VoidToString$());
 _foreign_helper.JS_IS_INDEXABLE_FIELD_NAME = function() {
 };
-dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_IS_INDEXABLE_FIELD_NAME, () => VoidToString$());
 _foreign_helper.JS_CURRENT_ISOLATE = function() {
 };
-dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic());
+dart.fn(_foreign_helper.JS_CURRENT_ISOLATE, VoidTodynamic$());
 _foreign_helper.JS_SIGNATURE_NAME = function() {
 };
-dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_SIGNATURE_NAME, () => VoidToString$());
 _foreign_helper.JS_TYPEDEF_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_TYPEDEF_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_VOID_RETURN_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_RETURN_TYPE_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG, () => VoidToString$());
 _foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG = function() {
 };
-dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString());
+dart.lazyFn(_foreign_helper.JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG, () => VoidToString$());
 _foreign_helper.JS_GET_NAME = function(name) {
 };
-dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString());
+dart.lazyFn(_foreign_helper.JS_GET_NAME, () => StringToString$());
 _foreign_helper.JS_EMBEDDED_GLOBAL = function(typeDescription, name) {
 };
 dart.lazyFn(_foreign_helper.JS_EMBEDDED_GLOBAL, () => StringAndStringTodynamic());
 _foreign_helper.JS_GET_FLAG = function(name) {
 };
-dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool());
+dart.lazyFn(_foreign_helper.JS_GET_FLAG, () => StringTobool$());
 _foreign_helper.JS_EFFECT = function(code) {
   dart.dcall(code, null);
 };
@@ -4170,7 +4171,7 @@
 _foreign_helper.JS_STRING_CONCAT = function(a, b) {
   return a + b;
 };
-dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString());
+dart.lazyFn(_foreign_helper.JS_STRING_CONCAT, () => StringAndStringToString$());
 _foreign_helper._Rest = class _Rest extends core.Object {
   new() {
   }
@@ -4182,7 +4183,7 @@
 _foreign_helper.spread = function(args) {
   dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
 };
-dart.fn(_foreign_helper.spread, dynamicTodynamic());
+dart.fn(_foreign_helper.spread, dynamicTodynamic$());
 _interceptors.Interceptor = class Interceptor extends core.Object {
   new() {
   }
@@ -4194,7 +4195,7 @@
 _interceptors.getInterceptor = function(obj) {
   return obj;
 };
-dart.fn(_interceptors.getInterceptor, dynamicTodynamic());
+dart.fn(_interceptors.getInterceptor, dynamicTodynamic$());
 dart.defineExtensionNames([
   'toString',
   'hashCode',
@@ -4268,10 +4269,10 @@
 dart.lazyFn(_interceptors.findConstructorForNativeSubclassType, () => TypeAndStringTodynamic());
 _interceptors.getNativeInterceptor = function(object) {
 };
-dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic());
+dart.fn(_interceptors.getNativeInterceptor, dynamicTodynamic$());
 _interceptors.setDispatchProperty = function(object, value) {
 };
-dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic());
+dart.fn(_interceptors.setDispatchProperty, dynamicAnddynamicTodynamic$());
 const _removeWhere = Symbol('_removeWhere');
 _interceptors.JSArray$ = dart.generic(E => {
   let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
@@ -5580,7 +5581,7 @@
 _interceptors.JSNumber._MAX_INT32 = 2147483647;
 dart.registerExtension(dart.global.Number, _interceptors.JSNumber);
 const _defaultSplit = Symbol('_defaultSplit');
-let const;
+let const$;
 dart.defineExtensionNames([
   'codeUnitAt',
   'allMatches',
@@ -5889,7 +5890,7 @@
     if (0 >= dart.notNull(times)) return '';
     if (times == 1 || this[dartx.length] == 0) return this;
     if (times != times >>> 0) {
-      dart.throw(const || (const = dart.const(new core.OutOfMemoryError())));
+      dart.throw(const$ || (const$ = dart.const(new core.OutOfMemoryError())));
     }
     let result = '';
     let s = this;
@@ -7525,7 +7526,7 @@
   return ListIterable;
 });
 _internal.ListIterable = ListIterable();
-const _iterable = Symbol('_iterable');
+const _iterable$ = Symbol('_iterable');
 const _start = Symbol('_start');
 const _endOrLength = Symbol('_endOrLength');
 const _endIndex = Symbol('_endIndex');
@@ -7537,7 +7538,7 @@
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   class SubListIterable extends _internal.ListIterable$(E) {
     new(iterable, start, endOrLength) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_start] = start;
       this[_endOrLength] = endOrLength;
       super.new();
@@ -7550,17 +7551,17 @@
       }
     }
     get [_endIndex]() {
-      let length = this[_iterable][dartx.length];
+      let length = this[_iterable$][dartx.length];
       if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) > dart.notNull(length)) return length;
       return this[_endOrLength];
     }
     get [_startIndex]() {
-      let length = this[_iterable][dartx.length];
+      let length = this[_iterable$][dartx.length];
       if (dart.notNull(this[_start]) > dart.notNull(length)) return length;
       return this[_start];
     }
     get length() {
-      let length = this[_iterable][dartx.length];
+      let length = this[_iterable$][dartx.length];
       if (dart.notNull(this[_start]) >= dart.notNull(length)) return 0;
       if (this[_endOrLength] == null || dart.notNull(this[_endOrLength]) >= dart.notNull(length)) {
         return dart.notNull(length) - dart.notNull(this[_start]);
@@ -7572,7 +7573,7 @@
       if (dart.notNull(index) < 0 || realIndex >= dart.notNull(this[_endIndex])) {
         dart.throw(core.RangeError.index(index, this, "index"));
       }
-      return this[_iterable][dartx.elementAt](realIndex);
+      return this[_iterable$][dartx.elementAt](realIndex);
     }
     skip(count) {
       core.RangeError.checkNotNegative(count, "count");
@@ -7580,22 +7581,22 @@
       if (this[_endOrLength] != null && newStart >= dart.notNull(this[_endOrLength])) {
         return new (EmptyIterableOfE())();
       }
-      return new (SubListIterableOfE())(this[_iterable], newStart, this[_endOrLength]);
+      return new (SubListIterableOfE())(this[_iterable$], newStart, this[_endOrLength]);
     }
     take(count) {
       core.RangeError.checkNotNegative(count, "count");
       if (this[_endOrLength] == null) {
-        return new (SubListIterableOfE())(this[_iterable], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
+        return new (SubListIterableOfE())(this[_iterable$], this[_start], dart.notNull(this[_start]) + dart.notNull(count));
       } else {
         let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
         if (dart.notNull(this[_endOrLength]) < newEnd) return this;
-        return new (SubListIterableOfE())(this[_iterable], this[_start], newEnd);
+        return new (SubListIterableOfE())(this[_iterable$], this[_start], newEnd);
       }
     }
     toList(opts) {
       let growable = opts && 'growable' in opts ? opts.growable : true;
       let start = this[_start];
-      let end = this[_iterable][dartx.length];
+      let end = this[_iterable$][dartx.length];
       if (this[_endOrLength] != null && dart.notNull(this[_endOrLength]) < dart.notNull(end)) end = this[_endOrLength];
       let length = dart.notNull(end) - dart.notNull(start);
       if (length < 0) length = 0;
@@ -7605,8 +7606,8 @@
         return _;
       })() : ListOfE().new(length);
       for (let i = 0; i < length; i++) {
-        result[dartx._set](i, this[_iterable][dartx.elementAt](dart.notNull(start) + i));
-        if (dart.notNull(this[_iterable][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
+        result[dartx._set](i, this[_iterable$][dartx.elementAt](dart.notNull(start) + i));
+        if (dart.notNull(this[_iterable$][dartx.length]) < dart.notNull(end)) dart.throw(new core.ConcurrentModificationError(this));
       }
       return result;
     }
@@ -7614,7 +7615,7 @@
   dart.setSignature(SubListIterable, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.SubListIterable$(E), [IterableOfE(), core.int, core.int])}),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_start]: core.int,
       [_endOrLength]: core.int
     }),
@@ -7633,33 +7634,33 @@
   return SubListIterable;
 });
 _internal.SubListIterable = SubListIterable();
-const _length = Symbol('_length');
-const _index = Symbol('_index');
-const _current = Symbol('_current');
+const _length$ = Symbol('_length');
+const _index$ = Symbol('_index');
+const _current$ = Symbol('_current');
 _internal.ListIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   class ListIterator extends core.Object {
     new(iterable) {
-      this[_iterable] = iterable;
-      this[_length] = iterable[dartx.length];
-      this[_index] = 0;
-      this[_current] = null;
+      this[_iterable$] = iterable;
+      this[_length$] = iterable[dartx.length];
+      this[_index$] = 0;
+      this[_current$] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$];
     }
     moveNext() {
-      let length = this[_iterable][dartx.length];
-      if (this[_length] != length) {
-        dart.throw(new core.ConcurrentModificationError(this[_iterable]));
+      let length = this[_iterable$][dartx.length];
+      if (this[_length$] != length) {
+        dart.throw(new core.ConcurrentModificationError(this[_iterable$]));
       }
-      if (dart.notNull(this[_index]) >= dart.notNull(length)) {
-        this[_current] = null;
+      if (dart.notNull(this[_index$]) >= dart.notNull(length)) {
+        this[_current$] = null;
         return false;
       }
-      this[_current] = this[_iterable][dartx.elementAt](this[_index]);
-      this[_index] = dart.notNull(this[_index]) + 1;
+      this[_current$] = this[_iterable$][dartx.elementAt](this[_index$]);
+      this[_index$] = dart.notNull(this[_index$]) + 1;
       return true;
     }
   }
@@ -7668,10 +7669,10 @@
   dart.setSignature(ListIterator, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.ListIterator$(E), [IterableOfE()])}),
     fields: () => ({
-      [_iterable]: IterableOfE(),
-      [_length]: core.int,
-      [_index]: core.int,
-      [_current]: E
+      [_iterable$]: IterableOfE(),
+      [_length$]: core.int,
+      [_index$]: core.int,
+      [_current$]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7699,30 +7700,30 @@
       return new (MappedIterableOfS$T())._(iterable, func);
     }
     _(iterable, f) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_f] = f;
       super.new();
     }
     get iterator() {
-      return new (MappedIteratorOfS$T())(this[_iterable][dartx.iterator], this[_f]);
+      return new (MappedIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
     }
     get length() {
-      return this[_iterable][dartx.length];
+      return this[_iterable$][dartx.length];
     }
     get isEmpty() {
-      return this[_iterable][dartx.isEmpty];
+      return this[_iterable$][dartx.isEmpty];
     }
     get first() {
-      return this[_f](this[_iterable][dartx.first]);
+      return this[_f](this[_iterable$][dartx.first]);
     }
     get last() {
-      return this[_f](this[_iterable][dartx.last]);
+      return this[_f](this[_iterable$][dartx.last]);
     }
     get single() {
-      return this[_f](this[_iterable][dartx.single]);
+      return this[_f](this[_iterable$][dartx.single]);
     }
     elementAt(index) {
-      return this[_f](this[_iterable][dartx.elementAt](index));
+      return this[_f](this[_iterable$][dartx.elementAt](index));
     }
   }
   dart.defineNamedConstructor(MappedIterable, '_');
@@ -7732,7 +7733,7 @@
       _: dart.definiteFunctionType(_internal.MappedIterable$(S, T), [IterableOfS(), _TransformationOfS$T()])
     }),
     fields: () => ({
-      [_iterable]: IterableOfS(),
+      [_iterable$]: IterableOfS(),
       [_f]: _TransformationOfS$T()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
@@ -7778,24 +7779,24 @@
     new(iterator, f) {
       this[_iterator] = iterator;
       this[_f] = f;
-      this[_current] = null;
+      this[_current$] = null;
     }
     moveNext() {
       if (dart.test(this[_iterator].moveNext())) {
-        this[_current] = this[_f](this[_iterator].current);
+        this[_current$] = this[_f](this[_iterator].current);
         return true;
       }
-      this[_current] = null;
+      this[_current$] = null;
       return false;
     }
     get current() {
-      return this[_current];
+      return this[_current$];
     }
   }
   dart.setSignature(MappedIterator, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.MappedIterator$(S, T), [IteratorOfS(), _TransformationOfS$T()])}),
     fields: () => ({
-      [_current]: T,
+      [_current$]: T,
       [_iterator]: IteratorOfS(),
       [_f]: _TransformationOfS$T()
     }),
@@ -7845,18 +7846,18 @@
   let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
   class WhereIterable extends core.Iterable$(E) {
     new(iterable, f) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_f] = f;
       super.new();
     }
     get iterator() {
-      return new (WhereIteratorOfE())(this[_iterable][dartx.iterator], this[_f]);
+      return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
   }
   dart.setSignature(WhereIterable, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.WhereIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_f]: _ElementPredicateOfE()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -7909,18 +7910,18 @@
   let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
   class ExpandIterable extends core.Iterable$(T) {
     new(iterable, f) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_f] = f;
       super.new();
     }
     get iterator() {
-      return new (ExpandIteratorOfS$T())(this[_iterable][dartx.iterator], this[_f]);
+      return new (ExpandIteratorOfS$T())(this[_iterable$][dartx.iterator], this[_f]);
     }
   }
   dart.setSignature(ExpandIterable, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.ExpandIterable$(S, T), [IterableOfS(), _ExpandFunctionOfS$T()])}),
     fields: () => ({
-      [_iterable]: IterableOfS(),
+      [_iterable$]: IterableOfS(),
       [_f]: _ExpandFunctionOfS$T()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(T), [])})
@@ -7941,15 +7942,15 @@
       this[_iterator] = iterator;
       this[_f] = f;
       this[_currentExpansion] = dart.const(new (EmptyIteratorOfT())());
-      this[_current] = null;
+      this[_current$] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$];
     }
     moveNext() {
       if (this[_currentExpansion] == null) return false;
       while (!dart.test(this[_currentExpansion].moveNext())) {
-        this[_current] = null;
+        this[_current$] = null;
         if (dart.test(this[_iterator].moveNext())) {
           this[_currentExpansion] = null;
           this[_currentExpansion] = this[_f](this[_iterator].current)[dartx.iterator];
@@ -7957,7 +7958,7 @@
           return false;
         }
       }
-      this[_current] = this[_currentExpansion].current;
+      this[_current$] = this[_currentExpansion].current;
       return true;
     }
   }
@@ -7969,7 +7970,7 @@
       [_iterator]: IteratorOfS(),
       [_f]: _ExpandFunctionOfS$T(),
       [_currentExpansion]: IteratorOfT(),
-      [_current]: T
+      [_current$]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7994,12 +7995,12 @@
       return new (TakeIterableOfE())._(iterable, takeCount);
     }
     _(iterable, takeCount) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_takeCount] = takeCount;
       super.new();
     }
     get iterator() {
-      return new (TakeIteratorOfE())(this[_iterable][dartx.iterator], this[_takeCount]);
+      return new (TakeIteratorOfE())(this[_iterable$][dartx.iterator], this[_takeCount]);
     }
   }
   dart.defineNamedConstructor(TakeIterable, '_');
@@ -8009,7 +8010,7 @@
       _: dart.definiteFunctionType(_internal.TakeIterable$(E), [IterableOfE(), core.int])
     }),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_takeCount]: core.int
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -8025,7 +8026,7 @@
       super._(iterable, takeCount);
     }
     get length() {
-      let iterableLength = this[_iterable][dartx.length];
+      let iterableLength = this[_iterable$][dartx.length];
       if (dart.notNull(iterableLength) > dart.notNull(this[_takeCount])) return this[_takeCount];
       return iterableLength;
     }
@@ -8078,18 +8079,18 @@
   let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
   class TakeWhileIterable extends core.Iterable$(E) {
     new(iterable, f) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_f] = f;
       super.new();
     }
     get iterator() {
-      return new (TakeWhileIteratorOfE())(this[_iterable][dartx.iterator], this[_f]);
+      return new (TakeWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
   }
   dart.setSignature(TakeWhileIterable, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.TakeWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_f]: _ElementPredicateOfE()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -8148,7 +8149,7 @@
       return new (SkipIterableOfE())._(iterable, count);
     }
     _(iterable, skipCount) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_skipCount] = skipCount;
       super.new();
       if (!(typeof this[_skipCount] == 'number')) {
@@ -8161,10 +8162,10 @@
         dart.throw(new core.ArgumentError.value(this[_skipCount], "count is not an integer"));
       }
       core.RangeError.checkNotNegative(this[_skipCount], "count");
-      return new (SkipIterableOfE())._(this[_iterable], dart.notNull(this[_skipCount]) + dart.notNull(count));
+      return new (SkipIterableOfE())._(this[_iterable$], dart.notNull(this[_skipCount]) + dart.notNull(count));
     }
     get iterator() {
-      return new (SkipIteratorOfE())(this[_iterable][dartx.iterator], this[_skipCount]);
+      return new (SkipIteratorOfE())(this[_iterable$][dartx.iterator], this[_skipCount]);
     }
   }
   dart.defineNamedConstructor(SkipIterable, '_');
@@ -8174,7 +8175,7 @@
       _: dart.definiteFunctionType(_internal.SkipIterable$(E), [IterableOfE(), core.int])
     }),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_skipCount]: core.int
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -8190,7 +8191,7 @@
       super._(iterable, skipCount);
     }
     get length() {
-      let length = dart.notNull(this[_iterable][dartx.length]) - dart.notNull(this[_skipCount]);
+      let length = dart.notNull(this[_iterable$][dartx.length]) - dart.notNull(this[_skipCount]);
       if (length >= 0) return length;
       return 0;
     }
@@ -8239,18 +8240,18 @@
   let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
   class SkipWhileIterable extends core.Iterable$(E) {
     new(iterable, f) {
-      this[_iterable] = iterable;
+      this[_iterable$] = iterable;
       this[_f] = f;
       super.new();
     }
     get iterator() {
-      return new (SkipWhileIteratorOfE())(this[_iterable][dartx.iterator], this[_f]);
+      return new (SkipWhileIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
   }
   dart.setSignature(SkipWhileIterable, {
     constructors: () => ({new: dart.definiteFunctionType(_internal.SkipWhileIterable$(E), [IterableOfE(), _ElementPredicateOfE()])}),
     fields: () => ({
-      [_iterable]: IterableOfE(),
+      [_iterable$]: IterableOfE(),
       [_f]: _ElementPredicateOfE()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -8871,7 +8872,7 @@
 _internal.printToConsole = function(line) {
   _js_primitives.printString(dart.str`${line}`);
 };
-dart.lazyFn(_internal.printToConsole, () => StringTovoid());
+dart.lazyFn(_internal.printToConsole, () => StringTovoid$());
 _internal.Sort = class Sort extends core.Object {
   static sort(E) {
     return (a, compare) => {
@@ -9113,41 +9114,41 @@
   names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
 });
 _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-const _name = Symbol('_name');
+const _name$ = Symbol('_name');
 const _nativeSymbol = Symbol('_nativeSymbol');
 _internal.Symbol = class Symbol extends core.Object {
   new(name) {
-    this[_name] = name;
+    this[_name$] = name;
     this[_nativeSymbol] = null;
   }
   es6(name, nativeSymbol) {
-    this[_name] = name;
+    this[_name$] = name;
     this[_nativeSymbol] = nativeSymbol;
   }
   unvalidated(name) {
-    this[_name] = name;
+    this[_name$] = name;
     this[_nativeSymbol] = null;
   }
   validated(name) {
-    this[_name] = _internal.Symbol.validatePublicSymbol(name);
+    this[_name$] = _internal.Symbol.validatePublicSymbol(name);
     this[_nativeSymbol] = null;
   }
   ['=='](other) {
-    return _internal.Symbol.is(other) && this[_name] == other[_name] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+    return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
   }
   get hashCode() {
     let hash = this._hashCode;
     if (hash != null) return hash;
     let arbitraryPrime = 664597;
-    hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name]));
+    hash = 536870911 & arbitraryPrime * dart.notNull(dart.hashCode(this[_name$]));
     this._hashCode = hash;
     return hash;
   }
   toString() {
-    return dart.str`Symbol("${this[_name]}")`;
+    return dart.str`Symbol("${this[_name$]}")`;
   }
   static getName(symbol) {
-    return symbol[_name];
+    return symbol[_name$];
   }
   static getNativeSymbol(symbol) {
     return symbol[_nativeSymbol];
@@ -9175,7 +9176,7 @@
     validated: dart.definiteFunctionType(_internal.Symbol, [core.String])
   }),
   fields: () => ({
-    [_name]: core.String,
+    [_name$]: core.String,
     [_nativeSymbol]: dart.dynamic
   }),
   methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
@@ -9222,13 +9223,13 @@
   let o = _isolate_helper._globalState.topEventLoop;
   o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) + 1;
 };
-dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic());
+dart.fn(_isolate_helper.enterJsAsync, VoidTodynamic$());
 _isolate_helper.leaveJsAsync = function() {
   let o = _isolate_helper._globalState.topEventLoop;
   o[_activeJsAsyncCount] = dart.notNull(o[_activeJsAsyncCount]) - 1;
   dart.assert(dart.notNull(_isolate_helper._globalState.topEventLoop[_activeJsAsyncCount]) >= 0);
 };
-dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic());
+dart.fn(_isolate_helper.leaveJsAsync, VoidTodynamic$());
 _isolate_helper.isWorker = function() {
   return _isolate_helper._globalState.isWorker;
 };
@@ -9261,7 +9262,7 @@
   }
   _isolate_helper._globalState.topEventLoop.run();
 };
-dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid());
+dart.fn(_isolate_helper.startRootIsolate, dynamicAnddynamicTovoid$());
 dart.copyProperties(_isolate_helper, {
   get _globalState() {
     return dart.globalState;
@@ -9432,7 +9433,7 @@
     function respond() {
       responsePort.send(null);
     }
-    dart.fn(respond, VoidTovoid());
+    dart.fn(respond, VoidTovoid$());
     if (pingType == isolate.Isolate.AS_EVENT) {
       _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
       return;
@@ -9959,10 +9960,10 @@
         dart.assert(dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWN_FAILED_SIGNAL));
         completer.completeError(dart.dindex(msg, 1));
       }
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
     let signalReply = port.sendPort;
     if (dart.test(_isolate_helper._globalState.useWorkers) && !dart.test(isLight)) {
-      _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid()));
+      _isolate_helper.IsolateNatives._startWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply, dart.fn(message => completer.completeError(message), StringTovoid$()));
     } else {
       _isolate_helper.IsolateNatives._startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
     }
@@ -10007,7 +10008,7 @@
         dart.dcall(topLevel);
       }
     }
-    dart.fn(runStartFunction, VoidTovoid());
+    dart.fn(runStartFunction, VoidTovoid$());
     if (dart.test(startPaused)) {
       context.addPause(context.pauseCapability, context.pauseCapability);
       _isolate_helper._globalState.topEventLoop.enqueue(context, runStartFunction, 'start isolate');
@@ -10254,7 +10255,7 @@
 _isolate_helper.RawReceivePortImpl._nextFreeId = 1;
 const _rawPort = Symbol('_rawPort');
 const _controller = Symbol('_controller');
-const _add = Symbol('_add');
+const _add$ = Symbol('_add');
 const _closeUnchecked = Symbol('_closeUnchecked');
 const _addError = Symbol('_addError');
 const _completeError = Symbol('_completeError');
@@ -10313,7 +10314,7 @@
     static fromFuture(future) {
       let controller = _StreamControllerOfT()._check(StreamControllerOfT().new({sync: true}));
       future.then(dart.dynamic)(dart.fn(value => {
-        controller[_add](value);
+        controller[_add$](value);
         controller[_closeUnchecked]();
       }, TToNull()), {onError: dart.fn((error, stackTrace) => {
           controller[_addError](error, core.StackTrace._check(stackTrace));
@@ -10326,7 +10327,7 @@
       let count = 0;
       let onValue = dart.fn(value => {
         if (!dart.test(controller.isClosed)) {
-          controller[_add](value);
+          controller[_add$](value);
           if (--count == 0) controller[_closeUnchecked]();
         }
       }, TToNull());
@@ -10367,14 +10368,14 @@
         }
         controller.add(data);
       }
-      dart.fn(sendEvent, VoidTovoid());
+      dart.fn(sendEvent, VoidTovoid$());
       function startPeriodicTimer() {
         dart.assert(timer == null);
         timer = async.Timer.periodic(period, dart.fn(timer => {
           sendEvent();
         }, TimerToNull()));
       }
-      dart.fn(startPeriodicTimer, VoidTovoid());
+      dart.fn(startPeriodicTimer, VoidTovoid$());
       controller = StreamControllerOfT().new({sync: true, onListen: dart.fn(() => {
           watch.start();
           startPeriodicTimer();
@@ -10443,7 +10444,7 @@
             }
           }, TToNull()), {onError: addError, onDone: dart.bind(controller, 'close')});
         }).bind(this);
-        dart.fn(onListen, VoidTovoid());
+        dart.fn(onListen, VoidTovoid$());
         if (dart.test(this.isBroadcast)) {
           controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
               subscription.cancel();
@@ -10483,7 +10484,7 @@
             }
           }, TToNull()), {onError: dart.bind(eventSink, _addError), onDone: dart.bind(controller, 'close')});
         }).bind(this);
-        dart.fn(onListen, VoidTovoid());
+        dart.fn(onListen, VoidTovoid$());
         if (dart.test(this.isBroadcast)) {
           controller = async.StreamController$(E).broadcast({onListen: onListen, onCancel: dart.fn(() => {
               subscription.cancel();
@@ -10586,7 +10587,7 @@
 
       }, TToNull()), {onError: dart.fn(e => {
           result[_completeError](e);
-        }, dynamicToNull()), onDone: dart.fn(() => {
+        }, dynamicToNull$()), onDone: dart.fn(() => {
           result[_complete](buffer.toString());
         }, VoidToNull()), cancelOnError: true});
       return result;
@@ -10609,8 +10610,8 @@
       let future = new async._Future();
       let subscription = null;
       subscription = this.listen(dart.fn(element => {
-        async._runUserCode(dart.fn(() => action(element), VoidTovoid()), dart.fn(_ => {
-        }, dynamicToNull()), async._cancelAndErrorClosure(subscription, future));
+        async._runUserCode(dart.fn(() => action(element), VoidTovoid$()), dart.fn(_ => {
+        }, dynamicToNull$()), async._cancelAndErrorClosure(subscription, future));
       }, TToNull()), {onError: dart.bind(future, _completeError), onDone: dart.fn(() => {
           future[_complete](null);
         }, VoidToNull()), cancelOnError: true});
@@ -10912,7 +10913,7 @@
         timer.cancel();
         controller.close();
       }
-      dart.fn(onDone, VoidTovoid());
+      dart.fn(onDone, VoidTovoid$());
       const onListen = (function() {
         zone = async.Zone.current;
         if (onTimeout == null) {
@@ -10931,7 +10932,7 @@
         subscription = this.listen(onData, {onError: onError, onDone: onDone});
         timer = zone.createTimer(timeLimit, timeout);
       }).bind(this);
-      dart.fn(onListen, VoidTovoid());
+      dart.fn(onListen, VoidTovoid$());
       function onCancel() {
         timer.cancel();
         let result = subscription.cancel();
@@ -11066,7 +11067,7 @@
         this[_handle] = null;
         callback();
       }).bind(this);
-      dart.fn(internalCallback, VoidTovoid());
+      dart.fn(internalCallback, VoidTovoid$());
       this[_handle] = 1;
       _isolate_helper._globalState.topEventLoop.enqueue(_isolate_helper._globalState.currentContext, internalCallback, 'timer');
       this[_inEventLoop] = true;
@@ -11076,7 +11077,7 @@
         _isolate_helper.leaveJsAsync();
         callback();
       }).bind(this);
-      dart.fn(internalCallback, VoidTovoid());
+      dart.fn(internalCallback, VoidTovoid$());
       _isolate_helper.enterJsAsync();
       this[_handle] = _isolate_helper.global.setTimeout(internalCallback, milliseconds);
     } else {
@@ -11176,17 +11177,17 @@
 _isolate_helper._serializeMessage = function(message) {
   return new _isolate_helper._Serializer().serialize(message);
 };
-dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic());
+dart.fn(_isolate_helper._serializeMessage, dynamicTodynamic$());
 _isolate_helper._deserializeMessage = function(message) {
   return new _isolate_helper._Deserializer().deserialize(message);
 };
-dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic());
+dart.fn(_isolate_helper._deserializeMessage, dynamicTodynamic$());
 _isolate_helper._clone = function(message) {
   let serializer = new _isolate_helper._Serializer({serializeSendPorts: false});
   let deserializer = new _isolate_helper._Deserializer();
   return deserializer.deserialize(serializer.serialize(message));
 };
-dart.fn(_isolate_helper._clone, dynamicTodynamic());
+dart.fn(_isolate_helper._clone, dynamicTodynamic$());
 const _serializeSendPorts = Symbol('_serializeSendPorts');
 _isolate_helper._Serializer = class _Serializer extends core.Object {
   new(opts) {
@@ -11974,39 +11975,39 @@
   if (object == null) dart.throw(_js_helper.argumentErrorValue(object));
   return object;
 };
-dart.fn(_js_helper.checkNull, dynamicTodynamic());
+dart.fn(_js_helper.checkNull, dynamicTodynamic$());
 _js_helper.checkNum = function(value) {
   if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
   return value;
 };
-dart.fn(_js_helper.checkNum, dynamicTodynamic());
+dart.fn(_js_helper.checkNum, dynamicTodynamic$());
 _js_helper.checkInt = function(value) {
   if (!(typeof value == 'number')) dart.throw(_js_helper.argumentErrorValue(value));
   return value;
 };
-dart.fn(_js_helper.checkInt, dynamicTodynamic());
+dart.fn(_js_helper.checkInt, dynamicTodynamic$());
 _js_helper.checkBool = function(value) {
   if (!(typeof value == 'boolean')) dart.throw(_js_helper.argumentErrorValue(value));
   return value;
 };
-dart.fn(_js_helper.checkBool, dynamicTodynamic());
+dart.fn(_js_helper.checkBool, dynamicTodynamic$());
 _js_helper.checkString = function(value) {
   if (!(typeof value == 'string')) dart.throw(_js_helper.argumentErrorValue(value));
   return value;
 };
-dart.fn(_js_helper.checkString, dynamicTodynamic());
+dart.fn(_js_helper.checkString, dynamicTodynamic$());
 _js_helper.throwRuntimeError = function(message) {
   dart.throw(new _js_helper.RuntimeError(message));
 };
-dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic());
+dart.fn(_js_helper.throwRuntimeError, dynamicTodynamic$());
 _js_helper.throwAbstractClassInstantiationError = function(className) {
   dart.throw(new core.AbstractClassInstantiationError(core.String._check(className)));
 };
-dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic());
+dart.fn(_js_helper.throwAbstractClassInstantiationError, dynamicTodynamic$());
 _js_helper.throwConcurrentModificationError = function(collection) {
   dart.throw(new core.ConcurrentModificationError(collection));
 };
-dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic());
+dart.fn(_js_helper.throwConcurrentModificationError, dynamicTodynamic$());
 const _message = Symbol('_message');
 const _method = Symbol('_method');
 core.Error = class Error extends core.Object {
@@ -12156,7 +12157,7 @@
 _js_helper.getFallThroughError = function() {
   return new _js_helper.FallThroughErrorImplementation();
 };
-dart.fn(_js_helper.getFallThroughError, VoidTodynamic());
+dart.fn(_js_helper.getFallThroughError, VoidTodynamic$());
 _js_helper.Creates = class Creates extends core.Object {
   new(types) {
     this.types = types;
@@ -12328,22 +12329,22 @@
 _js_helper.jsonEncodeNative = function(string) {
   return JSON.stringify(string);
 };
-dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString());
+dart.lazyFn(_js_helper.jsonEncodeNative, () => StringToString$());
 const _jsIterator = Symbol('_jsIterator');
-const _current = Symbol('_current');
+const _current$0 = Symbol('_current');
 _js_helper.SyncIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class SyncIterator extends core.Object {
     new(jsIterator) {
       this[_jsIterator] = jsIterator;
-      this[_current] = null;
+      this[_current$0] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$0];
     }
     moveNext() {
       let ret = this[_jsIterator].next();
-      this[_current] = ret.value;
+      this[_current$0] = ret.value;
       return !ret.done;
     }
   }
@@ -12353,7 +12354,7 @@
     constructors: () => ({new: dart.definiteFunctionType(_js_helper.SyncIterator$(E), [dart.dynamic])}),
     fields: () => ({
       [_jsIterator]: dart.dynamic,
-      [_current]: E
+      [_current$0]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -12497,7 +12498,7 @@
 dart.setSignature(_js_helper.SupportJsExtensionMethods, {
   constructors: () => ({new: dart.definiteFunctionType(_js_helper.SupportJsExtensionMethods, [])})
 });
-const _length = Symbol('_length');
+const _length$0 = Symbol('_length');
 const _strings = Symbol('_strings');
 const _nums = Symbol('_nums');
 const _rest = Symbol('_rest');
@@ -12533,7 +12534,7 @@
   let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   class JsLinkedHashMap extends core.Object {
     new() {
-      this[_length] = 0;
+      this[_length$0] = 0;
       this[_strings] = null;
       this[_nums] = null;
       this[_rest] = null;
@@ -12545,10 +12546,10 @@
       return new (JsLinkedHashMapOfK$V())();
     }
     get length() {
-      return this[_length];
+      return this[_length$0];
     }
     get isEmpty() {
-      return this[_length] == 0;
+      return this[_length$0] == 0;
     }
     get isNotEmpty() {
       return !dart.test(this.isEmpty);
@@ -12676,9 +12677,9 @@
       return cell.hashMapCellValue;
     }
     clear() {
-      if (dart.notNull(this[_length]) > 0) {
+      if (dart.notNull(this[_length$0]) > 0) {
         this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
-        this[_length] = 0;
+        this[_length$0] = 0;
         this[_modified]();
       }
     }
@@ -12725,7 +12726,7 @@
         cell[_previous] = last;
         this[_last] = last[_next] = cell;
       }
-      this[_length] = dart.notNull(this[_length]) + 1;
+      this[_length$0] = dart.notNull(this[_length$0]) + 1;
       this[_modified]();
       return cell;
     }
@@ -12745,7 +12746,7 @@
       } else {
         next[_previous] = previous;
       }
-      this[_length] = dart.notNull(this[_length]) - 1;
+      this[_length$0] = dart.notNull(this[_length$0]) - 1;
       this[_modified]();
     }
     static _isStringKey(key) {
@@ -12806,7 +12807,7 @@
       es6: dart.definiteFunctionType(_js_helper.JsLinkedHashMap$(K, V), [])
     }),
     fields: () => ({
-      [_length]: core.int,
+      [_length$0]: core.int,
       [_strings]: dart.dynamic,
       [_nums]: dart.dynamic,
       [_rest]: dart.dynamic,
@@ -12936,10 +12937,10 @@
       super.new();
     }
     get length() {
-      return this[_map][_length];
+      return this[_map][_length$0];
     }
     get isEmpty() {
-      return this[_map][_length] == 0;
+      return this[_map][_length$0] == 0;
     }
     get iterator() {
       return new (LinkedHashMapKeyIteratorOfE())(this[_map], this[_map][_modifications]);
@@ -12985,20 +12986,20 @@
       this[_map] = map;
       this[_modifications] = modifications;
       this[_cell] = null;
-      this[_current] = null;
+      this[_current$0] = null;
       this[_cell] = this[_map][_first];
     }
     get current() {
-      return this[_current];
+      return this[_current$0];
     }
     moveNext() {
       if (this[_modifications] != this[_map][_modifications]) {
         dart.throw(new core.ConcurrentModificationError(this[_map]));
       } else if (this[_cell] == null) {
-        this[_current] = null;
+        this[_current$0] = null;
         return false;
       } else {
-        this[_current] = this[_cell].hashMapCellKey;
+        this[_current$0] = this[_cell].hashMapCellKey;
         this[_cell] = this[_cell][_next];
         return true;
       }
@@ -13012,7 +13013,7 @@
       [_map]: JsLinkedHashMapOfE$dynamic(),
       [_modifications]: core.int,
       [_cell]: LinkedHashMapCellOfE$dynamic(),
-      [_current]: E
+      [_current$0]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -13032,13 +13033,13 @@
 dart.fn(_js_helper.convertDartClosureToJS, FAndintToF());
 _js_helper.setNativeSubclassDispatchRecord = function(proto, interceptor) {
 };
-dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic());
+dart.fn(_js_helper.setNativeSubclassDispatchRecord, dynamicAnddynamicTodynamic$());
 _js_helper.findDispatchTagForInterceptorClass = function(interceptorClassConstructor) {
 };
-dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic());
+dart.fn(_js_helper.findDispatchTagForInterceptorClass, dynamicTodynamic$());
 _js_helper.makeLeafDispatchRecord = function(interceptor) {
 };
-dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic());
+dart.fn(_js_helper.makeLeafDispatchRecord, dynamicTodynamic$());
 const _nativeRegExp = Symbol('_nativeRegExp');
 _js_helper.regExpGetNative = function(regexp) {
   return regexp[_nativeRegExp];
@@ -13243,18 +13244,18 @@
   })
 });
 const _re = Symbol('_re');
-const _string = Symbol('_string');
-const _start = Symbol('_start');
+const _string$ = Symbol('_string');
+const _start$ = Symbol('_start');
 core.Match = class Match extends core.Object {};
 _js_helper._AllMatchesIterable = class _AllMatchesIterable extends collection.IterableBase$(core.Match) {
   new(re, string, start) {
     this[_re] = re;
-    this[_string] = string;
-    this[_start] = start;
+    this[_string$] = string;
+    this[_start$] = start;
     super.new();
   }
   get iterator() {
-    return new _js_helper._AllMatchesIterator(this[_re], this[_string], this[_start]);
+    return new _js_helper._AllMatchesIterator(this[_re], this[_string$], this[_start$]);
   }
 };
 dart.addSimpleTypeTests(_js_helper._AllMatchesIterable);
@@ -13262,8 +13263,8 @@
   constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterable, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
   fields: () => ({
     [_re]: _js_helper.JSSyntaxRegExp,
-    [_string]: core.String,
-    [_start]: core.int
+    [_string$]: core.String,
+    [_start$]: core.int
   }),
   getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
 });
@@ -13273,19 +13274,19 @@
 _js_helper._AllMatchesIterator = class _AllMatchesIterator extends core.Object {
   new(regExp, string, nextIndex) {
     this[_regExp] = regExp;
-    this[_string] = string;
+    this[_string$] = string;
     this[_nextIndex] = nextIndex;
-    this[_current] = null;
+    this[_current$0] = null;
   }
   get current() {
-    return this[_current];
+    return this[_current$0];
   }
   moveNext() {
-    if (this[_string] == null) return false;
-    if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string][dartx.length])) {
-      let match = this[_regExp][_execGlobal](this[_string], this[_nextIndex]);
+    if (this[_string$] == null) return false;
+    if (dart.notNull(this[_nextIndex]) <= dart.notNull(this[_string$][dartx.length])) {
+      let match = this[_regExp][_execGlobal](this[_string$], this[_nextIndex]);
       if (match != null) {
-        this[_current] = match;
+        this[_current$0] = match;
         let nextIndex = match.end;
         if (match.start == nextIndex) {
           nextIndex = dart.notNull(nextIndex) + 1;
@@ -13294,8 +13295,8 @@
         return true;
       }
     }
-    this[_current] = null;
-    this[_string] = null;
+    this[_current$0] = null;
+    this[_string$] = null;
     return false;
   }
 };
@@ -13304,9 +13305,9 @@
   constructors: () => ({new: dart.definiteFunctionType(_js_helper._AllMatchesIterator, [_js_helper.JSSyntaxRegExp, core.String, core.int])}),
   fields: () => ({
     [_regExp]: _js_helper.JSSyntaxRegExp,
-    [_string]: core.String,
+    [_string$]: core.String,
     [_nextIndex]: core.int,
-    [_current]: core.Match
+    [_current$0]: core.Match
   }),
   getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
   methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -13384,19 +13385,19 @@
 dart.lazyFn(_js_helper.allMatchesInStringUnchecked, () => StringAndStringAndintToIterableOfMatch());
 const _input = Symbol('_input');
 const _pattern = Symbol('_pattern');
-const _index = Symbol('_index');
+const _index$0 = Symbol('_index');
 _js_helper._StringAllMatchesIterable = class _StringAllMatchesIterable extends core.Iterable$(core.Match) {
   new(input, pattern, index) {
     this[_input] = input;
     this[_pattern] = pattern;
-    this[_index] = index;
+    this[_index$0] = index;
     super.new();
   }
   get iterator() {
-    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index]);
+    return new _js_helper._StringAllMatchesIterator(this[_input], this[_pattern], this[_index$0]);
   }
   get first() {
-    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
+    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
     if (dart.notNull(index) >= 0) {
       return new _js_helper.StringMatch(index, this[_input], this[_pattern]);
     }
@@ -13409,7 +13410,7 @@
   fields: () => ({
     [_input]: core.String,
     [_pattern]: core.String,
-    [_index]: core.int
+    [_index$0]: core.int
   }),
   getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(core.Match), [])})
 });
@@ -13418,28 +13419,28 @@
   new(input, pattern, index) {
     this[_input] = input;
     this[_pattern] = pattern;
-    this[_index] = index;
-    this[_current] = null;
+    this[_index$0] = index;
+    this[_current$0] = null;
   }
   moveNext() {
-    if (dart.notNull(this[_index]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
-      this[_current] = null;
+    if (dart.notNull(this[_index$0]) + dart.notNull(this[_pattern][dartx.length]) > dart.notNull(this[_input][dartx.length])) {
+      this[_current$0] = null;
       return false;
     }
-    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index]);
+    let index = _js_helper.stringIndexOfStringUnchecked(this[_input], this[_pattern], this[_index$0]);
     if (dart.notNull(index) < 0) {
-      this[_index] = dart.notNull(this[_input][dartx.length]) + 1;
-      this[_current] = null;
+      this[_index$0] = dart.notNull(this[_input][dartx.length]) + 1;
+      this[_current$0] = null;
       return false;
     }
     let end = dart.notNull(index) + dart.notNull(this[_pattern][dartx.length]);
-    this[_current] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
-    if (end == this[_index]) end++;
-    this[_index] = end;
+    this[_current$0] = new _js_helper.StringMatch(index, this[_input], this[_pattern]);
+    if (end == this[_index$0]) end++;
+    this[_index$0] = end;
     return true;
   }
   get current() {
-    return this[_current];
+    return this[_current$0];
   }
 };
 _js_helper._StringAllMatchesIterator[dart.implements] = () => [IteratorOfMatch()];
@@ -13448,8 +13449,8 @@
   fields: () => ({
     [_input]: core.String,
     [_pattern]: core.String,
-    [_index]: core.int,
-    [_current]: core.Match
+    [_index$0]: core.int,
+    [_current$0]: core.Match
   }),
   getters: () => ({current: dart.definiteFunctionType(core.Match, [])}),
   methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -13515,11 +13516,11 @@
 _js_helper._matchString = function(match) {
   return match._get(0);
 };
-dart.lazyFn(_js_helper._matchString, () => MatchToString());
+dart.lazyFn(_js_helper._matchString, () => MatchToString$());
 _js_helper._stringIdentity = function(string) {
   return string;
 };
-dart.lazyFn(_js_helper._stringIdentity, () => StringToString());
+dart.lazyFn(_js_helper._stringIdentity, () => StringToString$());
 _js_helper.stringReplaceAllFuncUnchecked = function(receiver, pattern, onMatch, onNonMatch) {
   if (onMatch == null) onMatch = _js_helper._matchString;
   if (onNonMatch == null) onNonMatch = _js_helper._stringIdentity;
@@ -13609,7 +13610,7 @@
   let replacement = dart.str`${replace(match)}`;
   return receiver[dartx.replaceRange](match.start, match.end, replacement);
 };
-dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString());
+dart.lazyFn(_js_helper.stringReplaceFirstMappedUnchecked, () => StringAndPatternAndFn__ToString$());
 _js_helper.stringJoinUnchecked = function(array, separator) {
   return array.join(separator);
 };
@@ -13637,7 +13638,7 @@
 _js_helper.isJsArray = function(value) {
   return _interceptors.JSArray.is(value);
 };
-dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool());
+dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
 _js_mirrors.getName = function(symbol) {
   return _internal.Symbol.getName(_internal.Symbol.as(symbol));
 };
@@ -13699,19 +13700,19 @@
 _js_mirrors._getGenericClass = function(obj) {
   return _js_mirrors._dart.getGenericClass(obj);
 };
-dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic());
+dart.fn(_js_mirrors._getGenericClass, dynamicTodynamic$());
 _js_mirrors._getGenericArgs = function(obj) {
   return _js_mirrors._dart.getGenericArgs(obj);
 };
-dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic());
+dart.fn(_js_mirrors._getGenericArgs, dynamicTodynamic$());
 _js_mirrors._defaultConstructorType = function(type) {
   return _js_mirrors._dart.definiteFunctionType(type, []);
 };
-dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic());
+dart.fn(_js_mirrors._defaultConstructorType, dynamicTodynamic$());
 _js_mirrors._getMixins = function(type) {
   return _js_mirrors._dart.getMixins(type, []);
 };
-dart.fn(_js_mirrors._getMixins, dynamicTodynamic());
+dart.fn(_js_mirrors._getMixins, dynamicTodynamic$());
 _js_mirrors._Lazy$ = dart.generic(T => {
   const _Lazy = dart.typedef('_Lazy', () => dart.functionType(T, []));
   return _Lazy;
@@ -13838,15 +13839,15 @@
 _js_mirrors._unwrap = function(obj) {
   return _js_mirrors._dart.unwrapType(obj);
 };
-dart.fn(_js_mirrors._unwrap, dynamicTodynamic());
+dart.fn(_js_mirrors._unwrap, dynamicTodynamic$());
 _js_mirrors._wrap = function(obj) {
   return _js_mirrors._dart.wrapType(obj);
 };
-dart.fn(_js_mirrors._wrap, dynamicTodynamic());
+dart.fn(_js_mirrors._wrap, dynamicTodynamic$());
 _js_mirrors._runtimeType = function(obj) {
   return _js_mirrors._wrap(_js_mirrors._dart.getReifiedType(obj));
 };
-dart.fn(_js_mirrors._runtimeType, dynamicTodynamic());
+dart.fn(_js_mirrors._runtimeType, dynamicTodynamic$());
 _js_mirrors._unimplemented = function(t, i) {
   dart.throw(new core.UnimplementedError(dart.str`${t}.${_js_mirrors.getName(i.memberName)} unimplemented`));
 };
@@ -14045,22 +14046,22 @@
   constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsClosureMirror, [dart.dynamic])}),
   methods: () => ({apply: dart.definiteFunctionType(mirrors.InstanceMirror, [core.List], [MapOfSymbol$dynamic()])})
 });
-const _metadata = Symbol('_metadata');
+const _metadata$ = Symbol('_metadata');
 const _cls = Symbol('_cls');
-let const;
+let const$0;
 const _declarations = Symbol('_declarations');
 const _raw = Symbol('_raw');
 const _mixin = Symbol('_mixin');
 const _typeArguments = Symbol('_typeArguments');
-let const;
+let const$1;
 _js_mirrors.JsClassMirror = class JsClassMirror extends _js_mirrors.JsMirror {
   get metadata() {
-    if (this[_metadata] == null) {
+    if (this[_metadata$] == null) {
       let unwrapped = _js_mirrors._unwrap(this[_cls]);
       let fn = Object.hasOwnProperty.call(unwrapped, dart.metadata) ? unwrapped[dart.metadata] : null;
-      this[_metadata] = fn == null ? const || (const = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
+      this[_metadata$] = fn == null ? const$0 || (const$0 = dart.constList([], mirrors.InstanceMirror)) : ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dcall(fn), 'map', dart.fn(i => _js_mirrors.reflect(i), dynamicToInstanceMirror()))));
     }
-    return this[_metadata];
+    return this[_metadata$];
   }
   get declarations() {
     if (this[_declarations] == null) {
@@ -14137,11 +14138,11 @@
     this.simpleName = core.Symbol.new(_js_mirrors._unwrap(cls).name);
     this[_mixin] = null;
     this[_typeArguments] = null;
-    this[_metadata] = null;
+    this[_metadata$] = null;
     this[_declarations] = null;
     let typeArgs = _js_mirrors._getGenericArgs(_js_mirrors._unwrap(cls));
     if (typeArgs == null) {
-      this[_typeArguments] = const || (const = dart.constList([], mirrors.TypeMirror));
+      this[_typeArguments] = const$1 || (const$1 = dart.constList([], mirrors.TypeMirror));
     } else {
       this[_typeArguments] = ListOfTypeMirror().unmodifiable(core.Iterable._check(dart.dsend(typeArgs, 'map', dart.fn(t => _js_mirrors.reflectType(core.Type._check(_js_mirrors._wrap(t))), dynamicToTypeMirror()))));
     }
@@ -14271,7 +14272,7 @@
     [_raw]: dart.dynamic,
     [_mixin]: mirrors.ClassMirror,
     [_typeArguments]: ListOfTypeMirror(),
-    [_metadata]: ListOfInstanceMirror(),
+    [_metadata$]: ListOfInstanceMirror(),
     [_declarations]: MapOfSymbol$DeclarationMirror()
   }),
   getters: () => ({
@@ -14294,21 +14295,21 @@
   })
 });
 const _symbol = Symbol('_symbol');
-const _name = Symbol('_name');
+const _name$0 = Symbol('_name');
 _js_mirrors.JsVariableMirror = class JsVariableMirror extends _js_mirrors.JsMirror {
   get simpleName() {
     return this[_symbol];
   }
   _(symbol, t, annotations) {
     this[_symbol] = symbol;
-    this[_name] = _js_mirrors.getName(symbol);
+    this[_name$0] = _js_mirrors.getName(symbol);
     this.type = _js_mirrors.reflectType(t);
     this.metadata = ListOfInstanceMirror().unmodifiable(annotations[dartx.map](mirrors.InstanceMirror)(dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror())));
     this.isStatic = false;
     this.isFinal = false;
   }
   toString() {
-    return dart.str`VariableMirror on '${this[_name]}'`;
+    return dart.str`VariableMirror on '${this[_name$0]}'`;
   }
   get qualifiedName() {
     return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
@@ -14335,7 +14336,7 @@
   constructors: () => ({_: dart.definiteFunctionType(_js_mirrors.JsVariableMirror, [core.Symbol, core.Type, core.List])}),
   fields: () => ({
     [_symbol]: core.Symbol,
-    [_name]: core.String,
+    [_name$0]: core.String,
     type: mirrors.TypeMirror,
     metadata: ListOfInstanceMirror(),
     isStatic: core.bool,
@@ -14348,7 +14349,7 @@
     super._(member, t, annotations);
   }
   toString() {
-    return dart.str`ParameterMirror on '${this[_name]}'`;
+    return dart.str`ParameterMirror on '${this[_name$0]}'`;
   }
   get qualifiedName() {
     return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
@@ -14388,46 +14389,46 @@
 });
 const _params = Symbol('_params');
 const _createParameterMirrorList = Symbol('_createParameterMirrorList');
-let const;
-let const;
-let const;
+let const$2;
+let const$3;
+let const$4;
 _js_mirrors.JsMethodMirror = class JsMethodMirror extends _js_mirrors.JsMirror {
   get isSetter() {
-    return this[_name][dartx.endsWith]('=');
+    return this[_name$0][dartx.endsWith]('=');
   }
   get isPrivate() {
-    return this[_name][dartx.startsWith]('_');
+    return this[_name$0][dartx.startsWith]('_');
   }
   get simpleName() {
     return this[_symbol];
   }
   _constructor(cls, symbol, ftype) {
     this[_symbol] = symbol;
-    this[_name] = _js_mirrors.getName(symbol);
+    this[_name$0] = _js_mirrors.getName(symbol);
     this.isConstructor = true;
     this.isStatic = false;
     this[_params] = null;
-    this[_metadata] = null;
+    this[_metadata$] = null;
     this.isFinal = false;
     this[_createParameterMirrorList](ftype);
   }
   _instanceMethod(cls, symbol, ftype) {
     this[_symbol] = symbol;
-    this[_name] = _js_mirrors.getName(symbol);
+    this[_name$0] = _js_mirrors.getName(symbol);
     this.isConstructor = false;
     this.isStatic = false;
     this[_params] = null;
-    this[_metadata] = null;
+    this[_metadata$] = null;
     this.isFinal = false;
     this[_createParameterMirrorList](ftype);
   }
   _staticMethod(cls, symbol, ftype) {
     this[_symbol] = symbol;
-    this[_name] = _js_mirrors.getName(symbol);
+    this[_name$0] = _js_mirrors.getName(symbol);
     this.isConstructor = false;
     this.isStatic = true;
     this[_params] = null;
-    this[_metadata] = null;
+    this[_metadata$] = null;
     this.isFinal = false;
     this[_createParameterMirrorList](ftype);
   }
@@ -14438,19 +14439,19 @@
     return this[_params];
   }
   get metadata() {
-    return this[_metadata];
+    return this[_metadata$];
   }
   [_createParameterMirrorList](ftype) {
     if (ftype == null) {
-      this[_params] = const || (const = dart.constList([], mirrors.ParameterMirror));
-      this[_metadata] = const || (const = dart.constList([], mirrors.InstanceMirror));
+      this[_params] = const$2 || (const$2 = dart.constList([], mirrors.ParameterMirror));
+      this[_metadata$] = const$3 || (const$3 = dart.constList([], mirrors.InstanceMirror));
       return;
     }
     if (!core.Function.is(ftype) && core.List.is(ftype)) {
-      this[_metadata] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
+      this[_metadata$] = ListOfInstanceMirror().unmodifiable(core.Iterable._check(dart.dsend(dart.dsend(ftype, 'skip', 1), 'map', dart.fn(a => _js_mirrors.reflect(a), dynamicToInstanceMirror()))));
       ftype = dart.dindex(ftype, 0);
     } else {
-      this[_metadata] = const || (const = dart.constList([], mirrors.InstanceMirror));
+      this[_metadata$] = const$4 || (const$4 = dart.constList([], mirrors.InstanceMirror));
     }
     if (typeof ftype == "function") {
       ftype = ftype.apply(null, JSArrayOfType().of([dart.dynamic, dart.dynamic, dart.dynamic]));
@@ -14473,7 +14474,7 @@
     this[_params] = ListOfParameterMirror().unmodifiable(params);
   }
   toString() {
-    return dart.str`MethodMirror on '${this[_name]}'`;
+    return dart.str`MethodMirror on '${this[_name$0]}'`;
   }
   get qualifiedName() {
     return core.Symbol._check(this.noSuchMethod(new dart.InvocationImpl('qualifiedName', [], {isGetter: true})));
@@ -14533,9 +14534,9 @@
   }),
   fields: () => ({
     [_symbol]: core.Symbol,
-    [_name]: core.String,
+    [_name$0]: core.String,
     [_params]: ListOfParameterMirror(),
-    [_metadata]: ListOfInstanceMirror(),
+    [_metadata$]: ListOfInstanceMirror(),
     isConstructor: core.bool,
     isStatic: core.bool,
     isFinal: core.bool
@@ -14568,7 +14569,7 @@
   }
   throw "Unable to print message: " + String(string);
 };
-dart.lazyFn(_js_primitives.printString, () => StringTovoid());
+dart.lazyFn(_js_primitives.printString, () => StringTovoid$());
 _metadata.SupportedBrowser = class SupportedBrowser extends core.Object {
   new(browserName, minimumVersion) {
     if (minimumVersion === void 0) minimumVersion = null;
@@ -17773,7 +17774,7 @@
   statics: () => ({_getBestStackTrace: dart.definiteFunctionType(core.StackTrace, [dart.dynamic, core.StackTrace])}),
   names: ['_getBestStackTrace']
 });
-const _controller = Symbol('_controller');
+const _controller$ = Symbol('_controller');
 const _subscribe = Symbol('_subscribe');
 const _createSubscription = Symbol('_createSubscription');
 const _onListen = Symbol('_onListen');
@@ -17813,25 +17814,25 @@
   let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
   class _ControllerStream extends async._StreamImpl$(T) {
     new(controller) {
-      this[_controller] = controller;
+      this[_controller$] = controller;
       super.new();
     }
     [_createSubscription](onData, onError, onDone, cancelOnError) {
-      return this[_controller][_subscribe](onData, onError, onDone, cancelOnError);
+      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
     }
     get hashCode() {
-      return (dart.notNull(dart.hashCode(this[_controller])) ^ 892482866) >>> 0;
+      return (dart.notNull(dart.hashCode(this[_controller$])) ^ 892482866) >>> 0;
     }
     ['=='](other) {
       if (core.identical(this, other)) return true;
       if (!async._ControllerStream.is(other)) return false;
       let otherStream = async._ControllerStream._check(other);
-      return core.identical(otherStream[_controller], this[_controller]);
+      return core.identical(otherStream[_controller$], this[_controller$]);
     }
   }
   dart.setSignature(_ControllerStream, {
     constructors: () => ({new: dart.definiteFunctionType(async._ControllerStream$(T), [_StreamControllerLifecycleOfT()])}),
-    fields: () => ({[_controller]: _StreamControllerLifecycleOfT()}),
+    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()}),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
   });
   return _ControllerStream;
@@ -17854,8 +17855,8 @@
 });
 async._BroadcastStream = _BroadcastStream();
 const _eventState = Symbol('_eventState');
-const _next = Symbol('_next');
-const _previous = Symbol('_previous');
+const _next$ = Symbol('_next');
+const _previous$ = Symbol('_previous');
 const _expectsEvent = Symbol('_expectsEvent');
 const _toggleEventId = Symbol('_toggleEventId');
 const _isFiring = Symbol('_isFiring');
@@ -17884,7 +17885,7 @@
 const _hasPending = Symbol('_hasPending');
 const _mayResumeInput = Symbol('_mayResumeInput');
 const _cancel = Symbol('_cancel');
-const _isClosed = Symbol('_isClosed');
+const _isClosed$ = Symbol('_isClosed');
 const _waitsForCancel = Symbol('_waitsForCancel');
 const _canFire = Symbol('_canFire');
 const _cancelOnError = Symbol('_cancelOnError');
@@ -17893,8 +17894,8 @@
 const _addPending = Symbol('_addPending');
 const _sendError = Symbol('_sendError');
 const _sendDone = Symbol('_sendDone');
-let const;
-const _close = Symbol('_close');
+let const$5;
+const _close$ = Symbol('_close');
 const _checkState = Symbol('_checkState');
 async._BufferingStreamSubscription$ = dart.generic(T => {
   let _PendingEventsOfT = () => (_PendingEventsOfT = dart.constFn(async._PendingEvents$(T)))();
@@ -17987,7 +17988,7 @@
     get [_isInputPaused]() {
       return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_INPUT_PAUSED) != 0;
     }
-    get [_isClosed]() {
+    get [_isClosed$]() {
       return (dart.notNull(this[_state]) & async._BufferingStreamSubscription._STATE_CLOSED) != 0;
     }
     get [_isCanceled]() {
@@ -18032,9 +18033,9 @@
       dart.assert(this[_isPaused]);
       this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
     }
-    [_add](data) {
+    [_add$](data) {
       T._check(data);
-      dart.assert(!dart.test(this[_isClosed]));
+      dart.assert(!dart.test(this[_isClosed$]));
       if (dart.test(this[_isCanceled])) return;
       if (dart.test(this[_canFire])) {
         this[_sendData](data);
@@ -18050,14 +18051,14 @@
         this[_addPending](new async._DelayedError(error, stackTrace));
       }
     }
-    [_close]() {
-      dart.assert(!dart.test(this[_isClosed]));
+    [_close$]() {
+      dart.assert(!dart.test(this[_isClosed$]));
       if (dart.test(this[_isCanceled])) return;
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_CLOSED) >>> 0;
       if (dart.test(this[_canFire])) {
         this[_sendDone]();
       } else {
-        this[_addPending](const || (const = dart.const(new async._DelayedDone())));
+        this[_addPending](const$5 || (const$5 = dart.const(new async._DelayedDone())));
       }
     }
     [_onPause]() {
@@ -18110,7 +18111,7 @@
         }
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
       }).bind(this);
-      dart.fn(sendError, VoidTovoid());
+      dart.fn(sendError, VoidTovoid$());
       if (dart.test(this[_cancelOnError])) {
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
         this[_cancel]();
@@ -18134,7 +18135,7 @@
         this[_zone].runGuarded(dart.void)(this[_onDone]);
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
       }).bind(this);
-      dart.fn(sendDone, VoidTovoid());
+      dart.fn(sendDone, VoidTovoid$());
       this[_cancel]();
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
       if (async.Future.is(this[_cancelFuture])) {
@@ -18195,7 +18196,7 @@
     }),
     getters: () => ({
       [_isInputPaused]: dart.definiteFunctionType(core.bool, []),
-      [_isClosed]: dart.definiteFunctionType(core.bool, []),
+      [_isClosed$]: dart.definiteFunctionType(core.bool, []),
       [_isCanceled]: dart.definiteFunctionType(core.bool, []),
       [_waitsForCancel]: dart.definiteFunctionType(core.bool, []),
       [_inCallback]: dart.definiteFunctionType(core.bool, []),
@@ -18218,9 +18219,9 @@
       [_cancel]: dart.definiteFunctionType(dart.void, []),
       [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
       [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
-      [_add]: dart.definiteFunctionType(dart.void, [T]),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
       [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-      [_close]: dart.definiteFunctionType(dart.void, []),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
       [_onPause]: dart.definiteFunctionType(dart.void, []),
       [_onResume]: dart.definiteFunctionType(dart.void, []),
       [_onCancel]: dart.definiteFunctionType(async.Future, []),
@@ -18260,22 +18261,22 @@
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
     new(controller, onData, onError, onDone, cancelOnError) {
-      this[_controller] = controller;
+      this[_controller$] = controller;
       super.new(onData, onError, onDone, cancelOnError);
     }
     [_onCancel]() {
-      return this[_controller][_recordCancel](this);
+      return this[_controller$][_recordCancel](this);
     }
     [_onPause]() {
-      this[_controller][_recordPause](this);
+      this[_controller$][_recordPause](this);
     }
     [_onResume]() {
-      this[_controller][_recordResume](this);
+      this[_controller$][_recordResume](this);
     }
   }
   dart.setSignature(_ControllerSubscription, {
     constructors: () => ({new: dart.definiteFunctionType(async._ControllerSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
-    fields: () => ({[_controller]: _StreamControllerLifecycleOfT()})
+    fields: () => ({[_controller$]: _StreamControllerLifecycleOfT()})
   });
   return _ControllerSubscription;
 });
@@ -18287,10 +18288,10 @@
   class _BroadcastSubscription extends async._ControllerSubscription$(T) {
     new(controller, onData, onError, onDone, cancelOnError) {
       this[_eventState] = 0;
-      this[_next] = null;
-      this[_previous] = null;
+      this[_next$] = null;
+      this[_previous$] = null;
       super.new(controller, onData, onError, onDone, cancelOnError);
-      this[_next] = this[_previous] = this;
+      this[_next$] = this[_previous$] = this;
     }
     [_expectsEvent](eventId) {
       return (dart.notNull(this[_eventState]) & async._BroadcastSubscription._STATE_EVENT_ID) == eventId;
@@ -18315,8 +18316,8 @@
     constructors: () => ({new: dart.definiteFunctionType(async._BroadcastSubscription$(T), [_StreamControllerLifecycleOfT(), TTovoid(), core.Function, VoidTovoid(), core.bool])}),
     fields: () => ({
       [_eventState]: core.int,
-      [_next]: _BroadcastSubscriptionOfT(),
-      [_previous]: _BroadcastSubscriptionOfT()
+      [_next$]: _BroadcastSubscriptionOfT(),
+      [_previous$]: _BroadcastSubscriptionOfT()
     }),
     getters: () => ({
       [_isFiring]: dart.definiteFunctionType(core.bool, []),
@@ -18429,35 +18430,35 @@
     }
     [_addListener](subscription) {
       _BroadcastSubscriptionOfT()._check(subscription);
-      dart.assert(core.identical(subscription[_next], subscription));
+      dart.assert(core.identical(subscription[_next$], subscription));
       subscription[_eventState] = dart.notNull(this[_state]) & async._BroadcastStreamController._STATE_EVENT_ID;
       let oldLast = this[_lastSubscription];
       this[_lastSubscription] = subscription;
-      subscription[_next] = null;
-      subscription[_previous] = oldLast;
+      subscription[_next$] = null;
+      subscription[_previous$] = oldLast;
       if (oldLast == null) {
         this[_firstSubscription] = subscription;
       } else {
-        oldLast[_next] = subscription;
+        oldLast[_next$] = subscription;
       }
     }
     [_removeListener](subscription) {
       _BroadcastSubscriptionOfT()._check(subscription);
-      dart.assert(core.identical(subscription[_controller], this));
-      dart.assert(!core.identical(subscription[_next], subscription));
-      let previous = subscription[_previous];
-      let next = subscription[_next];
+      dart.assert(core.identical(subscription[_controller$], this));
+      dart.assert(!core.identical(subscription[_next$], subscription));
+      let previous = subscription[_previous$];
+      let next = subscription[_next$];
       if (previous == null) {
         this[_firstSubscription] = next;
       } else {
-        previous[_next] = next;
+        previous[_next$] = next;
       }
       if (next == null) {
         this[_lastSubscription] = previous;
       } else {
-        next[_previous] = previous;
+        next[_previous$] = previous;
       }
-      subscription[_next] = subscription[_previous] = subscription;
+      subscription[_next$] = subscription[_previous$] = subscription;
     }
     [_subscribe](onData, onError, onDone, cancelOnError) {
       if (dart.test(this.isClosed)) {
@@ -18474,7 +18475,7 @@
     [_recordCancel](sub) {
       StreamSubscriptionOfT()._check(sub);
       let subscription = _BroadcastSubscriptionOfT()._check(sub);
-      if (core.identical(subscription[_next], subscription)) return null;
+      if (core.identical(subscription[_next$], subscription)) return null;
       if (dart.test(subscription[_isFiring])) {
         subscription[_setRemoveAfterFiring]();
       } else {
@@ -18536,14 +18537,14 @@
       this[_addStreamState] = new (_AddStreamStateOfT())(this, stream, cancelOnError);
       return this[_addStreamState].addStreamFuture;
     }
-    [_add](data) {
+    [_add$](data) {
       T._check(data);
       this[_sendData](data);
     }
     [_addError](error, stackTrace) {
       this[_sendError](error, stackTrace);
     }
-    [_close]() {
+    [_close$]() {
       dart.assert(this[_isAddingStream]);
       let addState = this[_addStreamState];
       this[_addStreamState] = null;
@@ -18563,14 +18564,14 @@
           subscription[_eventState] = (dart.notNull(subscription[_eventState]) | async._BroadcastSubscription._STATE_FIRING) >>> 0;
           action(subscription);
           subscription[_toggleEventId]();
-          let next = subscription[_next];
+          let next = subscription[_next$];
           if (dart.test(subscription[_removeAfterFiring])) {
             this[_removeListener](subscription);
           }
           subscription[_eventState] = (dart.notNull(subscription[_eventState]) & ~async._BroadcastSubscription._STATE_FIRING) >>> 0;
           subscription = next;
         } else {
-          subscription = subscription[_next];
+          subscription = subscription[_next$];
         }
       }
       this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
@@ -18631,9 +18632,9 @@
       addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       close: dart.definiteFunctionType(async.Future, []),
       addStream: dart.definiteFunctionType(async.Future, [StreamOfT()], {cancelOnError: core.bool}),
-      [_add]: dart.definiteFunctionType(dart.void, [T]),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
       [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-      [_close]: dart.definiteFunctionType(dart.void, []),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
       [_forEachListener]: dart.definiteFunctionType(dart.void, [_BufferingStreamSubscriptionOfTTovoid()]),
       [_callOnCancel]: dart.definiteFunctionType(dart.void, [])
     }),
@@ -18676,7 +18677,7 @@
       if (dart.test(this[_hasOneListener])) {
         this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_FIRING) >>> 0;
         let subscription = this[_firstSubscription];
-        subscription[_add](data);
+        subscription[_add$](data);
         this[_state] = (dart.notNull(this[_state]) & ~async._BroadcastStreamController._STATE_FIRING) >>> 0;
         if (dart.test(this[_isEmpty])) {
           this[_callOnCancel]();
@@ -18684,7 +18685,7 @@
         return;
       }
       this[_forEachListener](dart.fn(subscription => {
-        subscription[_add](data);
+        subscription[_add$](data);
       }, _BufferingStreamSubscriptionOfTToNull()));
     }
     [_sendError](error, stackTrace) {
@@ -18696,7 +18697,7 @@
     [_sendDone]() {
       if (!dart.test(this[_isEmpty])) {
         this[_forEachListener](dart.fn(subscription => {
-          subscription[_close]();
+          subscription[_close$]();
         }, _BufferingStreamSubscriptionOfTToNull()));
       } else {
         dart.assert(this[_doneFuture] != null);
@@ -18717,7 +18718,7 @@
   return _SyncBroadcastStreamController;
 });
 async._SyncBroadcastStreamController = _SyncBroadcastStreamController();
-let const;
+let const$6;
 async._AsyncBroadcastStreamController$ = dart.generic(T => {
   let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
   class _AsyncBroadcastStreamController extends async._BroadcastStreamController$(T) {
@@ -18726,19 +18727,19 @@
     }
     [_sendData](data) {
       T._check(data);
-      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next]) {
+      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
         subscription[_addPending](new (_DelayedDataOfT())(data));
       }
     }
     [_sendError](error, stackTrace) {
-      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next]) {
+      for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
         subscription[_addPending](new async._DelayedError(error, stackTrace));
       }
     }
     [_sendDone]() {
       if (!dart.test(this[_isEmpty])) {
-        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next]) {
-          subscription[_addPending](const || (const = dart.const(new async._DelayedDone())));
+        for (let subscription = this[_firstSubscription]; subscription != null; subscription = subscription[_next$]) {
+          subscription[_addPending](const$6 || (const$6 = dart.const(new async._DelayedDone())));
         }
       } else {
         dart.assert(this[_doneFuture] != null);
@@ -18759,7 +18760,7 @@
 });
 async._AsyncBroadcastStreamController = _AsyncBroadcastStreamController();
 const _addPendingEvent = Symbol('_addPendingEvent');
-let const;
+let const$7;
 async._AsBroadcastStreamController$ = dart.generic(T => {
   let _StreamImplEventsOfT = () => (_StreamImplEventsOfT = dart.constFn(async._StreamImplEvents$(T)))();
   let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
@@ -18803,7 +18804,7 @@
     }
     close() {
       if (!dart.test(this.isClosed) && dart.test(this[_isFiring])) {
-        this[_addPendingEvent](const || (const = dart.const(new async._DelayedDone())));
+        this[_addPendingEvent](const$7 || (const$7 = dart.const(new async._DelayedDone())));
         this[_state] = (dart.notNull(this[_state]) | async._BroadcastStreamController._STATE_CLOSED) >>> 0;
         return super.done;
       }
@@ -18933,7 +18934,7 @@
 });
 async.FutureOr = FutureOr();
 const _completeWithValue = Symbol('_completeWithValue');
-let const;
+let const$8;
 async.Future$ = dart.flattenFutures(dart.generic(T => {
   let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
   let FutureOfT = () => (FutureOfT = dart.constFn(async.Future$(T)))();
@@ -19036,7 +19037,7 @@
             result[_completeError](error, stackTrace);
           }
         }
-        dart.fn(handleError, dynamicAnddynamicTovoid());
+        dart.fn(handleError, dynamicAnddynamicTovoid$());
         try {
           for (let future of futures) {
             let pos = remaining;
@@ -19061,7 +19062,7 @@
             remaining++;
           }
           if (remaining == 0) {
-            return async.Future$(core.List$(T)).value(const || (const = dart.constList([], dart.dynamic)));
+            return async.Future$(core.List$(T)).value(const$8 || (const$8 = dart.constList([], dart.dynamic)));
           }
           values = core.List$(T).new(remaining);
         } catch (e) {
@@ -19092,12 +19093,14 @@
         return completer.future;
       };
     }
-    static forEach(input, f) {
-      let iterator = input[dartx.iterator];
-      return async.Future.doWhile(dart.fn(() => {
-        if (!dart.test(iterator.moveNext())) return false;
-        return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic())).then(core.bool)(dart.fn(_ => true, dynamicTobool()));
-      }, VoidToObject()));
+    static forEach(T) {
+      return (input, f) => {
+        let iterator = input[dartx.iterator];
+        return async.Future.doWhile(dart.fn(() => {
+          if (!dart.test(iterator.moveNext())) return false;
+          return async.Future.sync(dart.fn(() => f(iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
+        }, VoidToObject$()));
+      };
     }
     static doWhile(f) {
       let doneSignal = new async._Future();
@@ -19127,7 +19130,7 @@
     statics: () => ({
       wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
       any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
-      forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
+      forEach: dart.definiteFunctionType(T => [async.Future, [core.Iterable$(T), dart.functionType(dart.dynamic, [T])]]),
       doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
     }),
     names: ['wait', 'any', 'forEach', 'doWhile']
@@ -19656,7 +19659,7 @@
           dart.assert(target[_isPendingComplete]);
           target[_clearPendingComplete]();
           target[_complete](value);
-        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
+        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
             if (stackTrace === void 0) stackTrace = null;
             dart.assert(target[_isPendingComplete]);
             target[_completeError](error, core.StackTrace._check(stackTrace));
@@ -19807,7 +19810,7 @@
               listenerHasError = false;
             }
           }
-          dart.fn(handleWhenCompleteCallback, VoidTovoid());
+          dart.fn(handleWhenCompleteCallback, VoidTovoid$());
           function handleValueCallback() {
             try {
               listenerValueOrError = listener.handleValue(sourceResult);
@@ -19818,7 +19821,7 @@
             }
 
           }
-          dart.fn(handleValueCallback, VoidTovoid());
+          dart.fn(handleValueCallback, VoidTovoid$());
           function handleError() {
             try {
               let asyncError = source[_error];
@@ -19837,7 +19840,7 @@
             }
 
           }
-          dart.fn(handleError, VoidTovoid());
+          dart.fn(handleError, VoidTovoid$());
           if (dart.test(listener.handlesComplete)) {
             handleWhenCompleteCallback();
           } else if (!dart.test(hasError)) {
@@ -20013,7 +20016,7 @@
     entry.callback();
   }
 };
-dart.fn(async._microtaskLoop, VoidTovoid());
+dart.fn(async._microtaskLoop, VoidTovoid$());
 async._startMicrotaskLoop = function() {
   async._isInCallbackLoop = true;
   try {
@@ -20026,7 +20029,7 @@
     }
   }
 };
-dart.fn(async._startMicrotaskLoop, VoidTovoid());
+dart.fn(async._startMicrotaskLoop, VoidTovoid$());
 async._scheduleAsyncCallback = function(callback) {
   let newEntry = new async._AsyncCallbackEntry(callback);
   if (async._nextCallback == null) {
@@ -20093,7 +20096,7 @@
         storedCallback = null;
         f();
       }
-      dart.fn(internalCallback, dynamicToNull());
+      dart.fn(internalCallback, dynamicToNull$());
       ;
       let observer = new _isolate_helper.global.MutationObserver(internalCallback);
       observer.observe(div, {childList: true});
@@ -20361,7 +20364,7 @@
 const _pendingEvents = Symbol('_pendingEvents');
 const _ensurePendingEvents = Symbol('_ensurePendingEvents');
 const _badEventState = Symbol('_badEventState');
-let const;
+let const$9;
 async._StreamController$ = dart.generic(T => {
   let _ControllerStreamOfT = () => (_ControllerStreamOfT = dart.constFn(async._ControllerStream$(T)))();
   let _StreamSinkWrapperOfT = () => (_StreamSinkWrapperOfT = dart.constFn(async._StreamSinkWrapper$(T)))();
@@ -20469,7 +20472,7 @@
     add(value) {
       T._check(value);
       if (!dart.test(this[_mayAddEvent])) dart.throw(this[_badEventState]());
-      this[_add](value);
+      this[_add$](value);
     }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
@@ -20495,10 +20498,10 @@
       if (dart.test(this.hasListener)) {
         this[_sendDone]();
       } else if (dart.test(this[_isInitialState])) {
-        this[_ensurePendingEvents]().add(const || (const = dart.const(new async._DelayedDone())));
+        this[_ensurePendingEvents]().add(const$9 || (const$9 = dart.const(new async._DelayedDone())));
       }
     }
-    [_add](value) {
+    [_add$](value) {
       T._check(value);
       if (dart.test(this.hasListener)) {
         this[_sendData](value);
@@ -20513,7 +20516,7 @@
         this[_ensurePendingEvents]().add(new async._DelayedError(error, stackTrace));
       }
     }
-    [_close]() {
+    [_close$]() {
       dart.assert(this[_isAddingStream]);
       let addState = _StreamControllerAddStreamStateOfT().as(this[_varData]);
       this[_varData] = addState.varData;
@@ -20568,7 +20571,7 @@
           this[_doneFuture][_asyncComplete](null);
         }
       }).bind(this);
-      dart.fn(complete, VoidTovoid());
+      dart.fn(complete, VoidTovoid$());
       if (result != null) {
         result = result.whenComplete(complete);
       } else {
@@ -20629,9 +20632,9 @@
       addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       close: dart.definiteFunctionType(async.Future, []),
       [_closeUnchecked]: dart.definiteFunctionType(dart.void, []),
-      [_add]: dart.definiteFunctionType(dart.void, [T]),
+      [_add$]: dart.definiteFunctionType(dart.void, [T]),
       [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
-      [_close]: dart.definiteFunctionType(dart.void, []),
+      [_close$]: dart.definiteFunctionType(dart.void, []),
       [_subscribe]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
       [_recordCancel]: dart.definiteFunctionType(async.Future, [StreamSubscriptionOfT()]),
       [_recordPause]: dart.definiteFunctionType(dart.void, [StreamSubscriptionOfT()]),
@@ -20661,13 +20664,13 @@
   class _SyncStreamControllerDispatch extends core.Object {
     [_sendData](data) {
       T._check(data);
-      this[_subscription][_add](data);
+      this[_subscription][_add$](data);
     }
     [_sendError](error, stackTrace) {
       this[_subscription][_addError](error, stackTrace);
     }
     [_sendDone]() {
-      this[_subscription][_close]();
+      this[_subscription][_close$]();
     }
   }
   dart.addTypeTests(_SyncStreamControllerDispatch);
@@ -20682,7 +20685,7 @@
   return _SyncStreamControllerDispatch;
 });
 async._SyncStreamControllerDispatch = _SyncStreamControllerDispatch();
-let const;
+let const$10;
 async._AsyncStreamControllerDispatch$ = dart.generic(T => {
   let _DelayedDataOfT = () => (_DelayedDataOfT = dart.constFn(async._DelayedData$(T)))();
   let _StreamControllerOfT = () => (_StreamControllerOfT = dart.constFn(async._StreamController$(T)))();
@@ -20695,7 +20698,7 @@
       this[_subscription][_addPending](new async._DelayedError(error, stackTrace));
     }
     [_sendDone]() {
-      this[_subscription][_addPending](const || (const = dart.const(new async._DelayedDone())));
+      this[_subscription][_addPending](const$10 || (const$10 = dart.const(new async._DelayedDone())));
     }
   }
   dart.addTypeTests(_AsyncStreamControllerDispatch);
@@ -20791,12 +20794,12 @@
   class _AddStreamState extends core.Object {
     new(controller, source, cancelOnError) {
       this.addStreamFuture = new async._Future();
-      this.addSubscription = source.listen(dart.bind(controller, _add), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close), cancelOnError: cancelOnError});
+      this.addSubscription = source.listen(dart.bind(controller, _add$), {onError: core.Function._check(dart.test(cancelOnError) ? async._AddStreamState.makeErrorHandler(controller) : dart.bind(controller, _addError)), onDone: dart.bind(controller, _close$), cancelOnError: cancelOnError});
     }
     static makeErrorHandler(controller) {
       return dart.fn((e, s) => {
         controller[_addError](e, s);
-        controller[_close]();
+        controller[_close$]();
       }, dynamicAndStackTraceToNull());
     }
     pause() {
@@ -20902,7 +20905,7 @@
   return _GeneratedStreamImpl;
 });
 async._GeneratedStreamImpl = _GeneratedStreamImpl();
-const _iterator = Symbol('_iterator');
+const _iterator$ = Symbol('_iterator');
 const _eventScheduled = Symbol('_eventScheduled');
 async._PendingEvents$ = dart.generic(T => {
   let _EventDispatchOfT = () => (_EventDispatchOfT = dart.constFn(async._EventDispatch$(T)))();
@@ -20966,42 +20969,42 @@
   let IterableOfT = () => (IterableOfT = dart.constFn(core.Iterable$(T)))();
   class _IterablePendingEvents extends async._PendingEvents$(T) {
     new(data) {
-      this[_iterator] = data[dartx.iterator];
+      this[_iterator$] = data[dartx.iterator];
       super.new();
     }
     get isEmpty() {
-      return this[_iterator] == null;
+      return this[_iterator$] == null;
     }
     handleNext(dispatch) {
       _EventDispatchOfT()._check(dispatch);
-      if (this[_iterator] == null) {
+      if (this[_iterator$] == null) {
         dart.throw(new core.StateError("No events pending."));
       }
       let isDone = null;
       try {
-        isDone = !dart.test(this[_iterator].moveNext());
+        isDone = !dart.test(this[_iterator$].moveNext());
       } catch (e) {
         let s = dart.stackTrace(e);
-        this[_iterator] = null;
+        this[_iterator$] = null;
         dispatch[_sendError](e, s);
         return;
       }
 
       if (!dart.test(isDone)) {
-        dispatch[_sendData](this[_iterator].current);
+        dispatch[_sendData](this[_iterator$].current);
       } else {
-        this[_iterator] = null;
+        this[_iterator$] = null;
         dispatch[_sendDone]();
       }
     }
     clear() {
       if (dart.test(this.isScheduled)) this.cancelSchedule();
-      this[_iterator] = null;
+      this[_iterator$] = null;
     }
   }
   dart.setSignature(_IterablePendingEvents, {
     constructors: () => ({new: dart.definiteFunctionType(async._IterablePendingEvents$(T), [IterableOfT()])}),
-    fields: () => ({[_iterator]: IteratorOfT()}),
+    fields: () => ({[_iterator$]: IteratorOfT()}),
     getters: () => ({isEmpty: dart.definiteFunctionType(core.bool, [])}),
     methods: () => ({
       handleNext: dart.definiteFunctionType(dart.void, [_EventDispatchOfT()]),
@@ -21019,7 +21022,7 @@
 async._DoneHandler = dart.typedef('_DoneHandler', () => dart.functionType(dart.void, []));
 async._nullDataHandler = function(value) {
 };
-dart.fn(async._nullDataHandler, dynamicTovoid());
+dart.fn(async._nullDataHandler, dynamicTovoid$());
 async._nullErrorHandler = function(error, stackTrace) {
   if (stackTrace === void 0) stackTrace = null;
   async.Zone.current.handleUncaughtError(dart.dynamic)(error, stackTrace);
@@ -21027,7 +21030,7 @@
 dart.lazyFn(async._nullErrorHandler, () => dynamic__Tovoid());
 async._nullDoneHandler = function() {
 };
-dart.fn(async._nullDoneHandler, VoidTovoid());
+dart.fn(async._nullDoneHandler, VoidTovoid$());
 async._DelayedEvent$ = dart.generic(T => {
   class _DelayedEvent extends core.Object {
     new() {
@@ -21152,26 +21155,26 @@
 const _insertBefore = Symbol('_insertBefore');
 async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
   new() {
-    this[_next] = null;
-    this[_previous] = null;
+    this[_next$] = null;
+    this[_previous$] = null;
   }
   [_unlink]() {
-    this[_previous][_next] = this[_next];
-    this[_next][_previous] = this[_previous];
-    this[_next] = this[_previous] = this;
+    this[_previous$][_next$] = this[_next$];
+    this[_next$][_previous$] = this[_previous$];
+    this[_next$] = this[_previous$] = this;
   }
   [_insertBefore](newNext) {
-    let newPrevious = newNext[_previous];
-    newPrevious[_next] = this;
-    newNext[_previous] = this[_previous];
-    this[_previous][_next] = newNext;
-    this[_previous] = newPrevious;
+    let newPrevious = newNext[_previous$];
+    newPrevious[_next$] = this;
+    newNext[_previous$] = this[_previous$];
+    this[_previous$][_next$] = newNext;
+    this[_previous$] = newPrevious;
   }
 };
 dart.setSignature(async._BroadcastLinkedList, {
   fields: () => ({
-    [_next]: async._BroadcastLinkedList,
-    [_previous]: async._BroadcastLinkedList
+    [_next$]: async._BroadcastLinkedList,
+    [_previous$]: async._BroadcastLinkedList
   }),
   methods: () => ({
     [_unlink]: dart.definiteFunctionType(dart.void, []),
@@ -21285,7 +21288,7 @@
 async._DoneStreamSubscription._DONE_SENT = 1;
 async._DoneStreamSubscription._SCHEDULED = 2;
 async._DoneStreamSubscription._PAUSED = 4;
-const _source = Symbol('_source');
+const _source$ = Symbol('_source');
 const _onListenHandler = Symbol('_onListenHandler');
 const _onCancelHandler = Symbol('_onCancelHandler');
 const _cancelSubscription = Symbol('_cancelSubscription');
@@ -21302,14 +21305,14 @@
   let _BroadcastCallbackOfT = () => (_BroadcastCallbackOfT = dart.constFn(async._BroadcastCallback$(T)))();
   class _AsBroadcastStream extends async.Stream$(T) {
     new(source, onListenHandler, onCancelHandler) {
-      this[_source] = source;
+      this[_source$] = source;
       this[_onListenHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onListenHandler);
       this[_onCancelHandler] = async.Zone.current.registerUnaryCallback(dart.dynamic, StreamSubscriptionOfT())(onCancelHandler);
       this[_zone] = async.Zone.current;
-      this[_controller] = null;
+      this[_controller$] = null;
       this[_subscription] = null;
       super.new();
-      this[_controller] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
+      this[_controller$] = new (_AsBroadcastStreamControllerOfT())(dart.bind(this, _onListen), dart.bind(this, _onCancel));
     }
     get isBroadcast() {
       return true;
@@ -21318,17 +21321,17 @@
       let onError = opts && 'onError' in opts ? opts.onError : null;
       let onDone = opts && 'onDone' in opts ? opts.onDone : null;
       let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      if (this[_controller] == null || dart.test(this[_controller].isClosed)) {
+      if (this[_controller$] == null || dart.test(this[_controller$].isClosed)) {
         return new (_DoneStreamSubscriptionOfT())(onDone);
       }
       if (this[_subscription] == null) {
-        this[_subscription] = this[_source].listen(dart.bind(this[_controller], 'add'), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this[_controller], 'close')});
+        this[_subscription] = this[_source$].listen(dart.bind(this[_controller$], 'add'), {onError: dart.bind(this[_controller$], 'addError'), onDone: dart.bind(this[_controller$], 'close')});
       }
       cancelOnError = core.identical(true, cancelOnError);
-      return this[_controller][_subscribe](onData, onError, onDone, cancelOnError);
+      return this[_controller$][_subscribe](onData, onError, onDone, cancelOnError);
     }
     [_onCancel]() {
-      let shutdown = this[_controller] == null || dart.test(this[_controller].isClosed);
+      let shutdown = this[_controller$] == null || dart.test(this[_controller$].isClosed);
       if (this[_onCancelHandler] != null) {
         this[_zone].runUnary(dart.void, _BroadcastSubscriptionWrapperOfT())(this[_onCancelHandler], new (_BroadcastSubscriptionWrapperOfT())(this));
       }
@@ -21348,7 +21351,7 @@
       if (this[_subscription] == null) return;
       let subscription = this[_subscription];
       this[_subscription] = null;
-      this[_controller] = null;
+      this[_controller$] = null;
       subscription.cancel();
     }
     [_pauseSubscription](resumeSignal) {
@@ -21367,11 +21370,11 @@
   dart.setSignature(_AsBroadcastStream, {
     constructors: () => ({new: dart.definiteFunctionType(async._AsBroadcastStream$(T), [StreamOfT(), _BroadcastCallbackOfT(), _BroadcastCallbackOfT()])}),
     fields: () => ({
-      [_source]: StreamOfT(),
+      [_source$]: StreamOfT(),
       [_onListenHandler]: _BroadcastCallbackOfT(),
       [_onCancelHandler]: _BroadcastCallbackOfT(),
       [_zone]: async.Zone,
-      [_controller]: _AsBroadcastStreamControllerOfT(),
+      [_controller$]: _AsBroadcastStreamControllerOfT(),
       [_subscription]: StreamSubscriptionOfT()
     }),
     getters: () => ({[_isSubscriptionPaused]: dart.definiteFunctionType(core.bool, [])}),
@@ -21443,7 +21446,7 @@
   return _BroadcastSubscriptionWrapper;
 });
 async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-const _current = Symbol('_current');
+const _current$1 = Symbol('_current');
 const _futureOrPrefetch = Symbol('_futureOrPrefetch');
 const _clear = Symbol('_clear');
 async._StreamIteratorImpl$ = dart.generic(T => {
@@ -21452,13 +21455,13 @@
   class _StreamIteratorImpl extends core.Object {
     new(stream) {
       this[_subscription] = null;
-      this[_current] = null;
+      this[_current$1] = null;
       this[_futureOrPrefetch] = null;
       this[_state] = async._StreamIteratorImpl._STATE_FOUND;
       this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
     }
     get current() {
-      return this[_current];
+      return this[_current$1];
     }
     moveNext() {
       if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
@@ -21469,7 +21472,7 @@
       }
       if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
         this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-        this[_current] = null;
+        this[_current$1] = null;
         let result = new (_FutureOfbool())();
         this[_futureOrPrefetch] = result;
         return result;
@@ -21479,7 +21482,7 @@
           case async._StreamIteratorImpl._STATE_EXTRA_DATA:
           {
             this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-            this[_current] = T.as(this[_futureOrPrefetch]);
+            this[_current$1] = T.as(this[_futureOrPrefetch]);
             this[_futureOrPrefetch] = null;
             this[_subscription].resume();
             return new (_FutureOfbool()).immediate(true);
@@ -21501,7 +21504,7 @@
     [_clear]() {
       this[_subscription] = null;
       this[_futureOrPrefetch] = null;
-      this[_current] = null;
+      this[_current$1] = null;
       this[_state] = async._StreamIteratorImpl._STATE_DONE;
     }
     cancel() {
@@ -21519,7 +21522,7 @@
     [_onData](data) {
       T._check(data);
       if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        this[_current] = data;
+        this[_current$1] = data;
         let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
         this[_futureOrPrefetch] = null;
         this[_state] = async._StreamIteratorImpl._STATE_FOUND;
@@ -21562,7 +21565,7 @@
     constructors: () => ({new: dart.definiteFunctionType(async._StreamIteratorImpl$(T), [StreamOfT()])}),
     fields: () => ({
       [_subscription]: async.StreamSubscription,
-      [_current]: T,
+      [_current$1]: T,
       [_futureOrPrefetch]: dart.dynamic,
       [_state]: core.int
     }),
@@ -21637,7 +21640,7 @@
 async._cancelAndError = function(subscription, future, error, stackTrace) {
   let cancelFuture = subscription.cancel();
   if (async.Future.is(cancelFuture)) {
-    cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid()));
+    cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
   } else {
     future[_completeError](error, stackTrace);
   }
@@ -21662,7 +21665,7 @@
 async._cancelAndValue = function(subscription, future, value) {
   let cancelFuture = subscription.cancel();
   if (async.Future.is(cancelFuture)) {
-    cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid()));
+    cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
   } else {
     future[_complete](value);
   }
@@ -21678,11 +21681,11 @@
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   class _ForwardingStream extends async.Stream$(T) {
     new(source) {
-      this[_source] = source;
+      this[_source$] = source;
       super.new();
     }
     get isBroadcast() {
-      return this[_source].isBroadcast;
+      return this[_source$].isBroadcast;
     }
     listen(onData, opts) {
       let onError = opts && 'onError' in opts ? opts.onError : null;
@@ -21697,7 +21700,7 @@
     [_handleData](data, sink) {
       S._check(data);
       _EventSinkOfT()._check(sink);
-      sink[_add](T.as(data));
+      sink[_add$](T.as(data));
     }
     [_handleError](error, stackTrace, sink) {
       _EventSinkOfT()._check(sink);
@@ -21705,12 +21708,12 @@
     }
     [_handleDone](sink) {
       _EventSinkOfT()._check(sink);
-      sink[_close]();
+      sink[_close$]();
     }
   }
   dart.setSignature(_ForwardingStream, {
     constructors: () => ({new: dart.definiteFunctionType(async._ForwardingStream$(S, T), [StreamOfS()])}),
-    fields: () => ({[_source]: StreamOfS()}),
+    fields: () => ({[_source$]: StreamOfS()}),
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       [_createSubscription]: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid(), core.Function, VoidTovoid(), core.bool]),
@@ -21731,15 +21734,15 @@
       this[_stream] = stream;
       this[_subscription] = null;
       super.new(onData, onError, onDone, cancelOnError);
-      this[_subscription] = this[_stream][_source].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
+      this[_subscription] = this[_stream][_source$].listen(dart.bind(this, _handleData), {onError: dart.bind(this, _handleError), onDone: dart.bind(this, _handleDone)});
     }
-    [_add](data) {
+    [_add$](data) {
       T._check(data);
-      if (dart.test(this[_isClosed])) return;
-      super[_add](data);
+      if (dart.test(this[_isClosed$])) return;
+      super[_add$](data);
     }
     [_addError](error, stackTrace) {
-      if (dart.test(this[_isClosed])) return;
+      if (dart.test(this[_isClosed$])) return;
       super[_addError](error, stackTrace);
     }
     [_onPause]() {
@@ -21821,7 +21824,7 @@
       }
 
       if (dart.test(satisfies)) {
-        sink[_add](inputEvent);
+        sink[_add$](inputEvent);
       }
     }
   }
@@ -21836,7 +21839,7 @@
   const _Transformation = dart.typedef('_Transformation', () => dart.functionType(T, [S]));
   return _Transformation;
 });
-async._Transformation = _Transformation();
+async._Transformation = _Transformation$();
 const _transform = Symbol('_transform');
 async._MapStream$ = dart.generic((S, T) => {
   let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(async._Transformation$(S, T)))();
@@ -21859,7 +21862,7 @@
         return;
       }
 
-      sink[_add](outputEvent);
+      sink[_add$](outputEvent);
     }
   }
   dart.setSignature(_MapStream, {
@@ -21885,7 +21888,7 @@
       _EventSinkOfT()._check(sink);
       try {
         for (let value of this[_expand](inputEvent)) {
-          sink[_add](value);
+          sink[_add$](value);
         }
       } catch (e) {
         let s = dart.stackTrace(e);
@@ -21974,11 +21977,11 @@
       let subscription = _StateStreamSubscriptionOfT()._check(sink);
       let count = subscription[_count];
       if (dart.notNull(count) > 0) {
-        sink[_add](inputEvent);
+        sink[_add$](inputEvent);
         count = dart.notNull(count) - 1;
         subscription[_count] = count;
         if (count == 0) {
-          sink[_close]();
+          sink[_close$]();
         }
       }
     }
@@ -22046,14 +22049,14 @@
       } catch (e) {
         let s = dart.stackTrace(e);
         async._addErrorWithReplacement(sink, e, s);
-        sink[_close]();
+        sink[_close$]();
         return;
       }
 
       if (dart.test(satisfies)) {
-        sink[_add](inputEvent);
+        sink[_add$](inputEvent);
       } else {
-        sink[_close]();
+        sink[_close$]();
       }
     }
   }
@@ -22087,7 +22090,7 @@
         subscription[_count] = dart.notNull(count) - 1;
         return;
       }
-      sink[_add](inputEvent);
+      sink[_add$](inputEvent);
     }
   }
   dart.setSignature(_SkipStream, {
@@ -22117,7 +22120,7 @@
       let subscription = _StateStreamSubscriptionOfT()._check(sink);
       let hasFailed = subscription[_flag];
       if (dart.test(hasFailed)) {
-        sink[_add](inputEvent);
+        sink[_add$](inputEvent);
         return;
       }
       let satisfies = null;
@@ -22132,7 +22135,7 @@
 
       if (!dart.test(satisfies)) {
         subscription[_flag] = true;
-        sink[_add](inputEvent);
+        sink[_add$](inputEvent);
       }
     }
   }
@@ -22155,23 +22158,23 @@
   let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
   class _DistinctStream extends async._ForwardingStream$(T, T) {
     new(source, equals) {
-      this[_previous] = async._DistinctStream._SENTINEL;
+      this[_previous$] = async._DistinctStream._SENTINEL;
       this[_equals] = equals;
       super.new(source);
     }
     [_handleData](inputEvent, sink) {
       T._check(inputEvent);
       _EventSinkOfT()._check(sink);
-      if (core.identical(this[_previous], async._DistinctStream._SENTINEL)) {
-        this[_previous] = inputEvent;
-        return sink[_add](inputEvent);
+      if (core.identical(this[_previous$], async._DistinctStream._SENTINEL)) {
+        this[_previous$] = inputEvent;
+        return sink[_add$](inputEvent);
       } else {
         let isEqual = null;
         try {
           if (this[_equals] == null) {
-            isEqual = dart.equals(this[_previous], inputEvent);
+            isEqual = dart.equals(this[_previous$], inputEvent);
           } else {
-            isEqual = this[_equals](T.as(this[_previous]), inputEvent);
+            isEqual = this[_equals](T.as(this[_previous$]), inputEvent);
           }
         } catch (e) {
           let s = dart.stackTrace(e);
@@ -22180,8 +22183,8 @@
         }
 
         if (!dart.test(isEqual)) {
-          sink[_add](inputEvent);
-          this[_previous] = inputEvent;
+          sink[_add$](inputEvent);
+          this[_previous$] = inputEvent;
         }
       }
     }
@@ -22190,7 +22193,7 @@
     constructors: () => ({new: dart.definiteFunctionType(async._DistinctStream$(T), [StreamOfT(), _EqualityOfT()])}),
     fields: () => ({
       [_equals]: _EqualityOfT(),
-      [_previous]: core.Object
+      [_previous$]: core.Object
     }),
     sfields: () => ({_SENTINEL: core.Object})
   });
@@ -22211,14 +22214,14 @@
     }
     add(data) {
       T._check(data);
-      this[_sink][_add](data);
+      this[_sink][_add$](data);
     }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
       this[_sink][_addError](error, stackTrace);
     }
     close() {
-      this[_sink][_close]();
+      this[_sink][_close$]();
     }
   }
   dart.addTypeTests(_EventSinkWrapper);
@@ -22256,24 +22259,24 @@
     get [_isSubscribed]() {
       return this[_subscription] != null;
     }
-    [_add](data) {
+    [_add$](data) {
       T._check(data);
-      if (dart.test(this[_isClosed])) {
+      if (dart.test(this[_isClosed$])) {
         dart.throw(new core.StateError("Stream is already closed"));
       }
-      super[_add](data);
+      super[_add$](data);
     }
     [_addError](error, stackTrace) {
-      if (dart.test(this[_isClosed])) {
+      if (dart.test(this[_isClosed$])) {
         dart.throw(new core.StateError("Stream is already closed"));
       }
       super[_addError](error, stackTrace);
     }
-    [_close]() {
-      if (dart.test(this[_isClosed])) {
+    [_close$]() {
+      if (dart.test(this[_isClosed$])) {
         dart.throw(new core.StateError("Stream is already closed"));
       }
-      super[_close]();
+      super[_close$]();
     }
     [_onPause]() {
       if (dart.test(this[_isSubscribed])) this[_subscription].pause();
@@ -22941,7 +22944,7 @@
     fork: dart.definiteFunctionType(async.Zone, [async.Zone, async.ZoneSpecification, core.Map])
   })
 });
-const _map = Symbol('_map');
+const _map$ = Symbol('_map');
 async._Zone = class _Zone extends core.Object {
   new() {
   }
@@ -22963,7 +22966,7 @@
   }
   new(parent, specification, map) {
     this.parent = parent;
-    this[_map] = map;
+    this[_map$] = map;
     this[_run] = null;
     this[_runUnary] = null;
     this[_runBinary] = null;
@@ -23063,12 +23066,12 @@
     };
   }
   _get(key) {
-    let result = this[_map][dartx._get](key);
-    if (result != null || dart.test(this[_map][dartx.containsKey](key))) return result;
+    let result = this[_map$][dartx._get](key);
+    if (result != null || dart.test(this[_map$][dartx.containsKey](key))) return result;
     if (this.parent != null) {
       let value = this.parent._get(key);
       if (value != null) {
-        this[_map][dartx._set](key, value);
+        this[_map$][dartx._set](key, value);
       }
       return value;
     }
@@ -23203,7 +23206,7 @@
     [_handleUncaughtError]: _ZoneFunctionOfHandleUncaughtErrorHandler(),
     [_delegateCache]: async.ZoneDelegate,
     parent: async._Zone,
-    [_map]: core.Map
+    [_map$]: core.Map
   }),
   getters: () => ({
     [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
@@ -23258,7 +23261,7 @@
     }
   };
 };
-dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR());
+dart.fn(async._rootRun, ZoneAndZoneDelegateAndZone__ToR$());
 async._rootRunUnary = function(R, T) {
   return (self, parent, zone, f, arg) => {
     if (dart.equals(async.Zone._current, zone)) return f(arg);
@@ -23270,7 +23273,7 @@
     }
   };
 };
-dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR());
+dart.fn(async._rootRunUnary, ZoneAndZoneDelegateAndZone__ToR$0());
 async._rootRunBinary = function(R, T1, T2) {
   return (self, parent, zone, f, arg1, arg2) => {
     if (dart.equals(async.Zone._current, zone)) return f(arg1, arg2);
@@ -23282,7 +23285,7 @@
     }
   };
 };
-dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR());
+dart.fn(async._rootRunBinary, ZoneAndZoneDelegateAndZone__ToR$1());
 async._rootRegisterCallback = function(R) {
   return (self, parent, zone, f) => {
     return f;
@@ -23327,27 +23330,27 @@
   }
   return async.Timer._createPeriodicTimer(duration, callback);
 };
-dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer());
+dart.lazyFn(async._rootCreatePeriodicTimer, () => ZoneAndZoneDelegateAndZone__ToTimer$());
 async._rootPrint = function(self, parent, zone, line) {
   _internal.printToConsole(line);
 };
-dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid());
+dart.lazyFn(async._rootPrint, () => ZoneAndZoneDelegateAndZone__Tovoid$());
 async._printToZone = function(line) {
   async.Zone.current.print(line);
 };
-dart.lazyFn(async._printToZone, () => StringTovoid());
-let const;
+dart.lazyFn(async._printToZone, () => StringTovoid$());
+let const$11;
 async._rootFork = function(self, parent, zone, specification, zoneValues) {
   _internal.printToZone = async._printToZone;
   if (specification == null) {
-    specification = const || (const = dart.const(async.ZoneSpecification.new()));
+    specification = const$11 || (const$11 = dart.const(async.ZoneSpecification.new()));
   } else if (!async._ZoneSpecification.is(specification)) {
     dart.throw(new core.ArgumentError("ZoneSpecifications must be instantiated" + " with the provided constructor."));
   }
   let valueMap = null;
   if (zoneValues == null) {
     if (async._Zone.is(zone)) {
-      valueMap = zone[_map];
+      valueMap = zone[_map$];
     } else {
       valueMap = collection.HashMap.new();
     }
@@ -23357,66 +23360,66 @@
   return new async._CustomZone(async._Zone._check(zone), specification, valueMap);
 };
 dart.lazyFn(async._rootFork, () => ZoneAndZoneDelegateAndZone__ToZone());
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
+let const$12;
+let const$13;
+let const$14;
+let const$15;
+let const$16;
+let const$17;
+let const$18;
+let const$19;
+let const$20;
+let const$21;
+let const$22;
+let const$23;
+let const$24;
 async._RootZone = class _RootZone extends async._Zone {
   new() {
     super.new();
   }
   get [_run]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
+    return const$12 || (const$12 = dart.const(new (_ZoneFunctionOfRunHandler())(async._ROOT_ZONE, dart.gbind(async._rootRun, dart.dynamic))));
   }
   get [_runUnary]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
+    return const$13 || (const$13 = dart.const(new (_ZoneFunctionOfRunUnaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunUnary, dart.dynamic, dart.dynamic))));
   }
   get [_runBinary]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
+    return const$14 || (const$14 = dart.const(new (_ZoneFunctionOfRunBinaryHandler())(async._ROOT_ZONE, dart.gbind(async._rootRunBinary, dart.dynamic, dart.dynamic, dart.dynamic))));
   }
   get [_registerCallback]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
+    return const$15 || (const$15 = dart.const(new (_ZoneFunctionOfRegisterCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterCallback, dart.dynamic))));
   }
   get [_registerUnaryCallback]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
+    return const$16 || (const$16 = dart.const(new (_ZoneFunctionOfRegisterUnaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterUnaryCallback, dart.dynamic, dart.dynamic))));
   }
   get [_registerBinaryCallback]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
+    return const$17 || (const$17 = dart.const(new (_ZoneFunctionOfRegisterBinaryCallbackHandler())(async._ROOT_ZONE, dart.gbind(async._rootRegisterBinaryCallback, dart.dynamic, dart.dynamic, dart.dynamic))));
   }
   get [_errorCallback]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
+    return const$18 || (const$18 = dart.const(new (_ZoneFunctionOfErrorCallbackHandler())(async._ROOT_ZONE, async._rootErrorCallback)));
   }
   get [_scheduleMicrotask]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
+    return const$19 || (const$19 = dart.const(new (_ZoneFunctionOfScheduleMicrotaskHandler())(async._ROOT_ZONE, async._rootScheduleMicrotask)));
   }
   get [_createTimer]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
+    return const$20 || (const$20 = dart.const(new (_ZoneFunctionOfCreateTimerHandler())(async._ROOT_ZONE, async._rootCreateTimer)));
   }
   get [_createPeriodicTimer]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
+    return const$21 || (const$21 = dart.const(new (_ZoneFunctionOfCreatePeriodicTimerHandler())(async._ROOT_ZONE, async._rootCreatePeriodicTimer)));
   }
   get [_print]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
+    return const$22 || (const$22 = dart.const(new (_ZoneFunctionOfPrintHandler())(async._ROOT_ZONE, async._rootPrint)));
   }
   get [_fork]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
+    return const$23 || (const$23 = dart.const(new (_ZoneFunctionOfForkHandler())(async._ROOT_ZONE, async._rootFork)));
   }
   get [_handleUncaughtError]() {
-    return const || (const = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
+    return const$24 || (const$24 = dart.const(new (_ZoneFunctionOfHandleUncaughtErrorHandler())(async._ROOT_ZONE, dart.gbind(async._rootHandleUncaughtError, dart.dynamic))));
   }
   get parent() {
     return null;
   }
-  get [_map]() {
+  get [_map$]() {
     return async._RootZone._rootMap;
   }
   get [_delegate]() {
@@ -23577,7 +23580,7 @@
     [_fork]: dart.definiteFunctionType(async._ZoneFunction$(async.ForkHandler), []),
     [_handleUncaughtError]: dart.definiteFunctionType(async._ZoneFunction$(async.HandleUncaughtErrorHandler), []),
     parent: dart.definiteFunctionType(async._Zone, []),
-    [_map]: dart.definiteFunctionType(core.Map, []),
+    [_map$]: dart.definiteFunctionType(core.Map, []),
     [_delegate]: dart.definiteFunctionType(async.ZoneDelegate, []),
     errorZone: dart.definiteFunctionType(async.Zone, [])
   }),
@@ -23655,20 +23658,20 @@
 };
 dart.lazyFn(async.runZoned, () => Fn__ToR());
 collection._USE_ES6_MAPS = true;
-const _length = Symbol('_length');
-const _strings = Symbol('_strings');
-const _nums = Symbol('_nums');
-const _rest = Symbol('_rest');
+const _length$1 = Symbol('_length');
+const _strings$ = Symbol('_strings');
+const _nums$ = Symbol('_nums');
+const _rest$ = Symbol('_rest');
 const _keys = Symbol('_keys');
 const _containsKey = Symbol('_containsKey');
-const _getBucket = Symbol('_getBucket');
+const _getBucket$ = Symbol('_getBucket');
 const _findBucketIndex = Symbol('_findBucketIndex');
 const _computeKeys = Symbol('_computeKeys');
 const _get = Symbol('_get');
-const _addHashTableEntry = Symbol('_addHashTableEntry');
+const _addHashTableEntry$ = Symbol('_addHashTableEntry');
 const _set = Symbol('_set');
 const _computeHashCode = Symbol('_computeHashCode');
-const _removeHashTableEntry = Symbol('_removeHashTableEntry');
+const _removeHashTableEntry$ = Symbol('_removeHashTableEntry');
 const _remove = Symbol('_remove');
 collection._HashMap$ = dart.generic((K, V) => {
   let _HashMapKeyIterableOfK = () => (_HashMapKeyIterableOfK = dart.constFn(collection._HashMapKeyIterable$(K)))();
@@ -23683,17 +23686,17 @@
   let KAndVToNull = () => (KAndVToNull = dart.constFn(dart.definiteFunctionType(core.Null, [K, V])))();
   class _HashMap extends core.Object {
     new() {
-      this[_length] = 0;
-      this[_strings] = null;
-      this[_nums] = null;
-      this[_rest] = null;
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
       this[_keys] = null;
     }
     get length() {
-      return this[_length];
+      return this[_length$1];
     }
     get isEmpty() {
-      return this[_length] == 0;
+      return this[_length$1] == 0;
     }
     get isNotEmpty() {
       return !dart.test(this.isEmpty);
@@ -23706,19 +23709,19 @@
     }
     containsKey(key) {
       if (dart.test(collection._HashMap._isStringKey(key))) {
-        let strings = this[_strings];
+        let strings = this[_strings$];
         return strings == null ? false : collection._HashMap._hasTableEntry(strings, key);
       } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-        let nums = this[_nums];
+        let nums = this[_nums$];
         return nums == null ? false : collection._HashMap._hasTableEntry(nums, key);
       } else {
         return this[_containsKey](key);
       }
     }
     [_containsKey](key) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return false;
-      let bucket = this[_getBucket](rest, key);
+      let bucket = this[_getBucket$](rest, key);
       return dart.notNull(this[_findBucketIndex](bucket, key)) >= 0;
     }
     containsValue(value) {
@@ -23732,19 +23735,19 @@
     }
     _get(key) {
       if (dart.test(collection._HashMap._isStringKey(key))) {
-        let strings = this[_strings];
+        let strings = this[_strings$];
         return V._check(strings == null ? null : collection._HashMap._getTableEntry(strings, key));
       } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-        let nums = this[_nums];
+        let nums = this[_nums$];
         return V._check(nums == null ? null : collection._HashMap._getTableEntry(nums, key));
       } else {
         return this[_get](key);
       }
     }
     [_get](key) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return null;
-      let bucket = this[_getBucket](rest, key);
+      let bucket = this[_getBucket$](rest, key);
       let index = this[_findBucketIndex](bucket, key);
       return V._check(dart.notNull(index) < 0 ? null : bucket[dart.notNull(index) + 1]);
     }
@@ -23752,13 +23755,13 @@
       K._check(key);
       V._check(value);
       if (dart.test(collection._HashMap._isStringKey(key))) {
-        let strings = this[_strings];
-        if (strings == null) this[_strings] = strings = collection._HashMap._newHashTable();
-        this[_addHashTableEntry](strings, key, value);
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._HashMap._newHashTable();
+        this[_addHashTableEntry$](strings, key, value);
       } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-        let nums = this[_nums];
-        if (nums == null) this[_nums] = nums = collection._HashMap._newHashTable();
-        this[_addHashTableEntry](nums, key, value);
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._HashMap._newHashTable();
+        this[_addHashTableEntry$](nums, key, value);
       } else {
         this[_set](key, value);
       }
@@ -23767,13 +23770,13 @@
     [_set](key, value) {
       K._check(key);
       V._check(value);
-      let rest = this[_rest];
-      if (rest == null) this[_rest] = rest = collection._HashMap._newHashTable();
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._HashMap._newHashTable();
       let hash = this[_computeHashCode](key);
       let bucket = rest[hash];
       if (bucket == null) {
         collection._HashMap._setTableEntry(rest, hash, [key, value]);
-        this[_length] = dart.notNull(this[_length]) + 1;
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
         this[_keys] = null;
       } else {
         let index = this[_findBucketIndex](bucket, key);
@@ -23781,7 +23784,7 @@
           bucket[dart.notNull(index) + 1] = value;
         } else {
           bucket.push(key, value);
-          this[_length] = dart.notNull(this[_length]) + 1;
+          this[_length$1] = dart.notNull(this[_length$1]) + 1;
           this[_keys] = null;
         }
       }
@@ -23796,27 +23799,27 @@
     }
     remove(key) {
       if (dart.test(collection._HashMap._isStringKey(key))) {
-        return this[_removeHashTableEntry](this[_strings], key);
+        return this[_removeHashTableEntry$](this[_strings$], key);
       } else if (dart.test(collection._HashMap._isNumericKey(key))) {
-        return this[_removeHashTableEntry](this[_nums], key);
+        return this[_removeHashTableEntry$](this[_nums$], key);
       } else {
         return this[_remove](key);
       }
     }
     [_remove](key) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return null;
-      let bucket = this[_getBucket](rest, key);
+      let bucket = this[_getBucket$](rest, key);
       let index = this[_findBucketIndex](bucket, key);
       if (dart.notNull(index) < 0) return null;
-      this[_length] = dart.notNull(this[_length]) - 1;
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
       this[_keys] = null;
       return bucket.splice(index, 2)[1];
     }
     clear() {
-      if (dart.notNull(this[_length]) > 0) {
-        this[_strings] = this[_nums] = this[_rest] = this[_keys] = null;
-        this[_length] = 0;
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_keys] = null;
+        this[_length$1] = 0;
       }
     }
     forEach(action) {
@@ -23831,9 +23834,9 @@
     }
     [_computeKeys]() {
       if (this[_keys] != null) return this[_keys];
-      let result = ListOfK().new(this[_length]);
+      let result = ListOfK().new(this[_length$1]);
       let index = 0;
-      let strings = this[_strings];
+      let strings = this[_strings$];
       if (strings != null) {
         let names = Object.getOwnPropertyNames(strings);
         let entries = names.length;
@@ -23843,7 +23846,7 @@
           index++;
         }
       }
-      let nums = this[_nums];
+      let nums = this[_nums$];
       if (nums != null) {
         let names = Object.getOwnPropertyNames(nums);
         let entries = names.length;
@@ -23853,7 +23856,7 @@
           index++;
         }
       }
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest != null) {
         let names = Object.getOwnPropertyNames(rest);
         let entries = names.length;
@@ -23868,23 +23871,23 @@
           }
         }
       }
-      dart.assert(index == this[_length]);
+      dart.assert(index == this[_length$1]);
       return this[_keys] = result;
     }
-    [_addHashTableEntry](table, key, value) {
+    [_addHashTableEntry$](table, key, value) {
       K._check(key);
       V._check(value);
       if (!dart.test(collection._HashMap._hasTableEntry(table, key))) {
-        this[_length] = dart.notNull(this[_length]) + 1;
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
         this[_keys] = null;
       }
       collection._HashMap._setTableEntry(table, key, value);
     }
-    [_removeHashTableEntry](table, key) {
+    [_removeHashTableEntry$](table, key) {
       if (table != null && dart.test(collection._HashMap._hasTableEntry(table, key))) {
         let value = V._check(collection._HashMap._getTableEntry(table, key));
         collection._HashMap._deleteTableEntry(table, key);
-        this[_length] = dart.notNull(this[_length]) - 1;
+        this[_length$1] = dart.notNull(this[_length$1]) - 1;
         this[_keys] = null;
         return value;
       } else {
@@ -23918,7 +23921,7 @@
     static _deleteTableEntry(table, key) {
       delete table[key];
     }
-    [_getBucket](table, key) {
+    [_getBucket$](table, key) {
       let hash = this[_computeHashCode](key);
       return table[hash];
     }
@@ -23943,10 +23946,10 @@
   dart.setSignature(_HashMap, {
     constructors: () => ({new: dart.definiteFunctionType(collection._HashMap$(K, V), [])}),
     fields: () => ({
-      [_length]: core.int,
-      [_strings]: dart.dynamic,
-      [_nums]: dart.dynamic,
-      [_rest]: dart.dynamic,
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
       [_keys]: ListOfK()
     }),
     getters: () => ({
@@ -23971,10 +23974,10 @@
       clear: dart.definiteFunctionType(dart.void, []),
       forEach: dart.definiteFunctionType(dart.void, [KAndVTovoid()]),
       [_computeKeys]: dart.definiteFunctionType(core.List$(K), []),
-      [_addHashTableEntry]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
-      [_removeHashTableEntry]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
+      [_addHashTableEntry$]: dart.definiteFunctionType(dart.void, [dart.dynamic, K, V]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(V, [dart.dynamic, core.Object]),
       [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
-      [_getBucket]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List, [dart.dynamic, dart.dynamic]),
       [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, core.Object])
     }),
     statics: () => ({
@@ -24027,7 +24030,7 @@
   return _IdentityHashMap;
 });
 collection._IdentityHashMap = _IdentityHashMap();
-const _equals = Symbol('_equals');
+const _equals$ = Symbol('_equals');
 const _hashCode = Symbol('_hashCode');
 const _validKey = Symbol('_validKey');
 collection._CustomHashMap$ = dart.generic((K, V) => {
@@ -24035,7 +24038,7 @@
   let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
   class _CustomHashMap extends collection._HashMap$(K, V) {
     new(equals, hashCode, validKey) {
-      this[_equals] = equals;
+      this[_equals$] = equals;
       this[_hashCode] = hashCode;
       this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
       super.new();
@@ -24065,7 +24068,7 @@
       if (bucket == null) return -1;
       let length = bucket.length;
       for (let i = 0; i < length; i = i + 2) {
-        if (dart.test(this[_equals](bucket[i], K._check(key)))) return i;
+        if (dart.test(this[_equals$](bucket[i], K._check(key)))) return i;
       }
       return -1;
     }
@@ -24076,7 +24079,7 @@
   dart.setSignature(_CustomHashMap, {
     constructors: () => ({new: dart.definiteFunctionType(collection._CustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
     fields: () => ({
-      [_equals]: _EqualityOfK(),
+      [_equals$]: _EqualityOfK(),
       [_hashCode]: _HasherOfK(),
       [_validKey]: _PredicateOfObject()
     })
@@ -24085,34 +24088,34 @@
   return _CustomHashMap;
 });
 collection._CustomHashMap = _CustomHashMap();
-const _map = Symbol('_map');
+const _map$0 = Symbol('_map');
 collection._HashMapKeyIterable$ = dart.generic(E => {
   let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
   class _HashMapKeyIterable extends core.Iterable$(E) {
     new(map) {
-      this[_map] = map;
+      this[_map$0] = map;
       super.new();
     }
     get length() {
-      return this[_map][_length];
+      return this[_map$0][_length$1];
     }
     get isEmpty() {
-      return this[_map][_length] == 0;
+      return this[_map$0][_length$1] == 0;
     }
     get iterator() {
-      return new (_HashMapKeyIteratorOfE())(this[_map], this[_map][_computeKeys]());
+      return new (_HashMapKeyIteratorOfE())(this[_map$0], this[_map$0][_computeKeys]());
     }
     contains(element) {
-      return this[_map].containsKey(element);
+      return this[_map$0].containsKey(element);
     }
     forEach(f) {
-      let keys = this[_map][_computeKeys]();
+      let keys = this[_map$0][_computeKeys]();
       for (let i = 0, length = keys.length; i < length; i++) {
         f(keys[i]);
-        if (keys !== this[_map][_keys]) {
-          dart.throw(new core.ConcurrentModificationError(this[_map]));
+        if (keys !== this[_map$0][_keys]) {
+          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
         }
       }
     }
@@ -24120,7 +24123,7 @@
   _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_HashMapKeyIterable, {
     constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterable$(E), [_HashMapOfE$dynamic()])}),
-    fields: () => ({[_map]: _HashMapOfE$dynamic()}),
+    fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
   dart.defineExtensionMembers(_HashMapKeyIterable, [
@@ -24134,31 +24137,31 @@
 });
 collection._HashMapKeyIterable = _HashMapKeyIterable();
 const _offset = Symbol('_offset');
-const _current = Symbol('_current');
+const _current$2 = Symbol('_current');
 collection._HashMapKeyIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
   let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
   class _HashMapKeyIterator extends core.Object {
     new(map, keys) {
-      this[_map] = map;
+      this[_map$0] = map;
       this[_keys] = keys;
       this[_offset] = 0;
-      this[_current] = null;
+      this[_current$2] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
       let keys = this[_keys];
       let offset = this[_offset];
-      if (keys !== this[_map][_keys]) {
-        dart.throw(new core.ConcurrentModificationError(this[_map]));
+      if (keys !== this[_map$0][_keys]) {
+        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
       } else if (dart.notNull(offset) >= keys.length) {
-        this[_current] = null;
+        this[_current$2] = null;
         return false;
       } else {
-        this[_current] = keys[offset];
+        this[_current$2] = keys[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -24169,10 +24172,10 @@
   dart.setSignature(_HashMapKeyIterator, {
     constructors: () => ({new: dart.definiteFunctionType(collection._HashMapKeyIterator$(E), [_HashMapOfE$dynamic(), ListOfE()])}),
     fields: () => ({
-      [_map]: _HashMapOfE$dynamic(),
+      [_map$0]: _HashMapOfE$dynamic(),
       [_keys]: ListOfE(),
       [_offset]: core.int,
-      [_current]: E
+      [_current$2]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24216,8 +24219,8 @@
   return _LinkedIdentityHashMap;
 });
 collection._LinkedIdentityHashMap = _LinkedIdentityHashMap();
-const _modifications = Symbol('_modifications');
-const _modified = Symbol('_modified');
+const _modifications$ = Symbol('_modifications');
+const _modified$ = Symbol('_modified');
 collection._Es6LinkedIdentityHashMap$ = dart.generic((K, V) => {
   let _Es6MapIterableOfK = () => (_Es6MapIterableOfK = dart.constFn(collection._Es6MapIterable$(K)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
@@ -24229,12 +24232,12 @@
   let VTobool = () => (VTobool = dart.constFn(dart.definiteFunctionType(core.bool, [V])))();
   class _Es6LinkedIdentityHashMap extends collection._LinkedIdentityHashMap$(K, V) {
     new() {
-      this[_map] = new Map();
-      this[_modifications] = 0;
+      this[_map$0] = new Map();
+      this[_modifications$] = 0;
       super.new();
     }
     get length() {
-      return this[_map].size;
+      return this[_map$0].size;
     }
     get isEmpty() {
       return this.length == 0;
@@ -24249,7 +24252,7 @@
       return new (_Es6MapIterableOfV())(this, false);
     }
     containsKey(key) {
-      return this[_map].has(key);
+      return this[_map$0].has(key);
     }
     containsValue(value) {
       return this.values[dartx.any](dart.fn(each => dart.equals(each, value), VTobool()));
@@ -24261,13 +24264,13 @@
       }, KAndVToNull()));
     }
     _get(key) {
-      return this[_map].get(key);
+      return this[_map$0].get(key);
     }
     _set(key, value) {
       K._check(key);
       V._check(value);
-      this[_map].set(key, value);
-      this[_modified]();
+      this[_map$0].set(key, value);
+      this[_modified$]();
       return value;
     }
     putIfAbsent(key, ifAbsent) {
@@ -24280,17 +24283,17 @@
     }
     remove(key) {
       let value = this._get(key);
-      this[_map].delete(key);
-      this[_modified]();
+      this[_map$0].delete(key);
+      this[_modified$]();
       return value;
     }
     clear() {
-      this[_map].clear();
-      this[_modified]();
+      this[_map$0].clear();
+      this[_modified$]();
     }
     forEach(action) {
-      let jsEntries = this[_map].entries();
-      let modifications = this[_modifications];
+      let jsEntries = this[_map$0].entries();
+      let modifications = this[_modifications$];
       while (true) {
         let next = jsEntries.next();
         let done = next.done;
@@ -24299,13 +24302,13 @@
         let key = entry[0];
         let value = entry[1];
         action(K._check(key), V._check(value));
-        if (modifications != this[_modifications]) {
+        if (modifications != this[_modifications$]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
       }
     }
-    [_modified]() {
-      this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
+    [_modified$]() {
+      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
     }
     toString() {
       return collection.Maps.mapToString(this);
@@ -24315,10 +24318,10 @@
   dart.setSignature(_Es6LinkedIdentityHashMap, {
     constructors: () => ({new: dart.definiteFunctionType(collection._Es6LinkedIdentityHashMap$(K, V), [])}),
     fields: () => ({
-      [_map]: dart.dynamic,
-      [_modifications]: core.int
+      [_map$0]: dart.dynamic,
+      [_modifications$]: core.int
     }),
-    methods: () => ({[_modified]: dart.definiteFunctionType(dart.void, [])})
+    methods: () => ({[_modified$]: dart.definiteFunctionType(dart.void, [])})
   });
   dart.defineExtensionMembers(_Es6LinkedIdentityHashMap, [
     'containsKey',
@@ -24345,38 +24348,38 @@
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   class _Es6MapIterable extends core.Iterable$(E) {
     new(map, isKeys) {
-      this[_map] = map;
+      this[_map$0] = map;
       this[_isKeys] = isKeys;
       super.new();
     }
     get length() {
-      return core.int._check(dart.dload(this[_map], 'length'));
+      return core.int._check(dart.dload(this[_map$0], 'length'));
     }
     get isEmpty() {
-      return core.bool._check(dart.dload(this[_map], 'isEmpty'));
+      return core.bool._check(dart.dload(this[_map$0], 'isEmpty'));
     }
     get iterator() {
-      return new (_Es6MapIteratorOfE())(this[_map], core.int._check(dart.dload(this[_map], _modifications)), this[_isKeys]);
+      return new (_Es6MapIteratorOfE())(this[_map$0], core.int._check(dart.dload(this[_map$0], _modifications$)), this[_isKeys]);
     }
     contains(element) {
-      return core.bool._check(dart.dsend(this[_map], 'containsKey', element));
+      return core.bool._check(dart.dsend(this[_map$0], 'containsKey', element));
     }
     forEach(f) {
       let jsIterator = null;
       if (dart.test(this[_isKeys])) {
-        jsIterator = dart.dload(this[_map], _map).keys();
+        jsIterator = dart.dload(this[_map$0], _map$0).keys();
       } else {
-        jsIterator = dart.dload(this[_map], _map).values();
+        jsIterator = dart.dload(this[_map$0], _map$0).values();
       }
-      let modifications = core.int._check(dart.dload(this[_map], _modifications));
+      let modifications = core.int._check(dart.dload(this[_map$0], _modifications$));
       while (true) {
         let next = jsIterator.next();
         let done = next.done;
         if (done) break;
         let value = next.value;
         f(E._check(value));
-        if (!dart.equals(modifications, dart.dload(this[_map], _modifications))) {
-          dart.throw(new core.ConcurrentModificationError(this[_map]));
+        if (!dart.equals(modifications, dart.dload(this[_map$0], _modifications$))) {
+          dart.throw(new core.ConcurrentModificationError(this[_map$0]));
         }
       }
     }
@@ -24385,7 +24388,7 @@
   dart.setSignature(_Es6MapIterable, {
     constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterable$(E), [dart.dynamic, core.bool])}),
     fields: () => ({
-      [_map]: dart.dynamic,
+      [_map$0]: dart.dynamic,
       [_isKeys]: core.bool
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -24400,43 +24403,43 @@
   return _Es6MapIterable;
 });
 collection._Es6MapIterable = _Es6MapIterable();
-const _jsIterator = Symbol('_jsIterator');
-const _next = Symbol('_next');
+const _jsIterator$ = Symbol('_jsIterator');
+const _next$0 = Symbol('_next');
 const _done = Symbol('_done');
 collection._Es6MapIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class _Es6MapIterator extends core.Object {
     new(map, modifications, isKeys) {
-      this[_map] = map;
-      this[_modifications] = modifications;
+      this[_map$0] = map;
+      this[_modifications$] = modifications;
       this[_isKeys] = isKeys;
-      this[_jsIterator] = null;
-      this[_next] = null;
-      this[_current] = null;
+      this[_jsIterator$] = null;
+      this[_next$0] = null;
+      this[_current$2] = null;
       this[_done] = null;
       if (dart.test(this[_isKeys])) {
-        this[_jsIterator] = dart.dload(this[_map], _map).keys();
+        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
       } else {
-        this[_jsIterator] = dart.dload(this[_map], _map).values();
+        this[_jsIterator$] = dart.dload(this[_map$0], _map$0).values();
       }
       this[_done] = false;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
-      if (!dart.equals(this[_modifications], dart.dload(this[_map], _modifications))) {
-        dart.throw(new core.ConcurrentModificationError(this[_map]));
+      if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
+        dart.throw(new core.ConcurrentModificationError(this[_map$0]));
       }
       if (dart.test(this[_done])) return false;
-      this[_next] = this[_jsIterator].next();
-      let done = this[_next].done;
+      this[_next$0] = this[_jsIterator$].next();
+      let done = this[_next$0].done;
       if (done) {
-        this[_current] = null;
+        this[_current$2] = null;
         this[_done] = true;
         return false;
       } else {
-        this[_current] = this[_next].value;
+        this[_current$2] = this[_next$0].value;
         return true;
       }
     }
@@ -24446,12 +24449,12 @@
   dart.setSignature(_Es6MapIterator, {
     constructors: () => ({new: dart.definiteFunctionType(collection._Es6MapIterator$(E), [dart.dynamic, core.int, core.bool])}),
     fields: () => ({
-      [_map]: dart.dynamic,
-      [_modifications]: core.int,
+      [_map$0]: dart.dynamic,
+      [_modifications$]: core.int,
       [_isKeys]: core.bool,
-      [_jsIterator]: dart.dynamic,
-      [_next]: dart.dynamic,
-      [_current]: E,
+      [_jsIterator$]: dart.dynamic,
+      [_next$0]: dart.dynamic,
+      [_current$2]: E,
       [_done]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -24465,7 +24468,7 @@
   let _HasherOfK = () => (_HasherOfK = dart.constFn(collection._Hasher$(K)))();
   class _LinkedCustomHashMap extends _js_helper.JsLinkedHashMap$(K, V) {
     new(equals, hashCode, validKey) {
-      this[_equals] = equals;
+      this[_equals$] = equals;
       this[_hashCode] = hashCode;
       this[_validKey] = validKey != null ? validKey : dart.fn(v => K.is(v), ObjectTobool());
       super.new();
@@ -24496,7 +24499,7 @@
       let length = bucket.length;
       for (let i = 0; i < length; i++) {
         let cell = bucket[i];
-        if (dart.test(this[_equals](cell.hashMapCellKey, K._check(key)))) return i;
+        if (dart.test(this[_equals$](cell.hashMapCellKey, K._check(key)))) return i;
       }
       return -1;
     }
@@ -24504,7 +24507,7 @@
   dart.setSignature(_LinkedCustomHashMap, {
     constructors: () => ({new: dart.definiteFunctionType(collection._LinkedCustomHashMap$(K, V), [_EqualityOfK(), _HasherOfK(), _PredicateOfObject()])}),
     fields: () => ({
-      [_equals]: _EqualityOfK(),
+      [_equals$]: _EqualityOfK(),
       [_hashCode]: _HasherOfK(),
       [_validKey]: _PredicateOfObject()
     })
@@ -24518,7 +24521,7 @@
 const _computeElements = Symbol('_computeElements');
 const _contains = Symbol('_contains');
 const _lookup = Symbol('_lookup');
-const _add = Symbol('_add');
+const _add$0 = Symbol('_add');
 collection.SetMixin$ = dart.generic(E => {
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
@@ -24892,10 +24895,10 @@
   let HashSetOfE = () => (HashSetOfE = dart.constFn(collection.HashSet$(E)))();
   class _HashSet extends collection._HashSetBase$(E) {
     new() {
-      this[_length] = 0;
-      this[_strings] = null;
-      this[_nums] = null;
-      this[_rest] = null;
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
       this[_elements] = null;
     }
     [_newSet]() {
@@ -24905,29 +24908,29 @@
       return new (_HashSetIteratorOfE())(this, this[_computeElements]());
     }
     get length() {
-      return this[_length];
+      return this[_length$1];
     }
     get isEmpty() {
-      return this[_length] == 0;
+      return this[_length$1] == 0;
     }
     get isNotEmpty() {
       return !dart.test(this.isEmpty);
     }
     contains(object) {
       if (dart.test(collection._HashSet._isStringElement(object))) {
-        let strings = this[_strings];
+        let strings = this[_strings$];
         return strings == null ? false : collection._HashSet._hasTableEntry(strings, object);
       } else if (dart.test(collection._HashSet._isNumericElement(object))) {
-        let nums = this[_nums];
+        let nums = this[_nums$];
         return nums == null ? false : collection._HashSet._hasTableEntry(nums, object);
       } else {
         return this[_contains](object);
       }
     }
     [_contains](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return false;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
     }
     lookup(object) {
@@ -24937,9 +24940,9 @@
       return this[_lookup](object);
     }
     [_lookup](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return null;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       let index = this[_findBucketIndex](bucket, object);
       if (dart.notNull(index) < 0) return null;
       return bucket[dartx._get](index);
@@ -24947,21 +24950,21 @@
     add(element) {
       E._check(element);
       if (dart.test(collection._HashSet._isStringElement(element))) {
-        let strings = this[_strings];
-        if (strings == null) this[_strings] = strings = collection._HashSet._newHashTable();
-        return this[_addHashTableEntry](strings, element);
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._HashSet._newHashTable();
+        return this[_addHashTableEntry$](strings, element);
       } else if (dart.test(collection._HashSet._isNumericElement(element))) {
-        let nums = this[_nums];
-        if (nums == null) this[_nums] = nums = collection._HashSet._newHashTable();
-        return this[_addHashTableEntry](nums, element);
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._HashSet._newHashTable();
+        return this[_addHashTableEntry$](nums, element);
       } else {
-        return this[_add](element);
+        return this[_add$0](element);
       }
     }
-    [_add](element) {
+    [_add$0](element) {
       E._check(element);
-      let rest = this[_rest];
-      if (rest == null) this[_rest] = rest = collection._HashSet._newHashTable();
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._HashSet._newHashTable();
       let hash = this[_computeHashCode](element);
       let bucket = rest[hash];
       if (bucket == null) {
@@ -24971,7 +24974,7 @@
         if (dart.notNull(index) >= 0) return false;
         bucket.push(element);
       }
-      this[_length] = dart.notNull(this[_length]) + 1;
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
       this[_elements] = null;
       return true;
     }
@@ -24983,35 +24986,35 @@
     }
     remove(object) {
       if (dart.test(collection._HashSet._isStringElement(object))) {
-        return this[_removeHashTableEntry](this[_strings], object);
+        return this[_removeHashTableEntry$](this[_strings$], object);
       } else if (dart.test(collection._HashSet._isNumericElement(object))) {
-        return this[_removeHashTableEntry](this[_nums], object);
+        return this[_removeHashTableEntry$](this[_nums$], object);
       } else {
         return this[_remove](object);
       }
     }
     [_remove](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return false;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       let index = this[_findBucketIndex](bucket, object);
       if (dart.notNull(index) < 0) return false;
-      this[_length] = dart.notNull(this[_length]) - 1;
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
       this[_elements] = null;
       bucket.splice(index, 1);
       return true;
     }
     clear() {
-      if (dart.notNull(this[_length]) > 0) {
-        this[_strings] = this[_nums] = this[_rest] = this[_elements] = null;
-        this[_length] = 0;
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_elements] = null;
+        this[_length$1] = 0;
       }
     }
     [_computeElements]() {
       if (this[_elements] != null) return this[_elements];
-      let result = ListOfE().new(this[_length]);
+      let result = ListOfE().new(this[_length$1]);
       let index = 0;
-      let strings = this[_strings];
+      let strings = this[_strings$];
       if (strings != null) {
         let names = Object.getOwnPropertyNames(strings);
         let entries = names.length;
@@ -25021,7 +25024,7 @@
           index++;
         }
       }
-      let nums = this[_nums];
+      let nums = this[_nums$];
       if (nums != null) {
         let names = Object.getOwnPropertyNames(nums);
         let entries = names.length;
@@ -25031,7 +25034,7 @@
           index++;
         }
       }
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest != null) {
         let names = Object.getOwnPropertyNames(rest);
         let entries = names.length;
@@ -25045,21 +25048,21 @@
           }
         }
       }
-      dart.assert(index == this[_length]);
+      dart.assert(index == this[_length$1]);
       return this[_elements] = result;
     }
-    [_addHashTableEntry](table, element) {
+    [_addHashTableEntry$](table, element) {
       E._check(element);
       if (dart.test(collection._HashSet._hasTableEntry(table, element))) return false;
       collection._HashSet._setTableEntry(table, element, 0);
-      this[_length] = dart.notNull(this[_length]) + 1;
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
       this[_elements] = null;
       return true;
     }
-    [_removeHashTableEntry](table, element) {
+    [_removeHashTableEntry$](table, element) {
       if (table != null && dart.test(collection._HashSet._hasTableEntry(table, element))) {
         collection._HashSet._deleteTableEntry(table, element);
-        this[_length] = dart.notNull(this[_length]) - 1;
+        this[_length$1] = dart.notNull(this[_length$1]) - 1;
         this[_elements] = null;
         return true;
       } else {
@@ -25086,7 +25089,7 @@
     static _deleteTableEntry(table, key) {
       delete table[key];
     }
-    [_getBucket](table, element) {
+    [_getBucket$](table, element) {
       let hash = this[_computeHashCode](element);
       return table[hash];
     }
@@ -25110,10 +25113,10 @@
   dart.setSignature(_HashSet, {
     constructors: () => ({new: dart.definiteFunctionType(collection._HashSet$(E), [])}),
     fields: () => ({
-      [_length]: core.int,
-      [_strings]: dart.dynamic,
-      [_nums]: dart.dynamic,
-      [_rest]: dart.dynamic,
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
       [_elements]: ListOfE()
     }),
     getters: () => ({
@@ -25127,14 +25130,14 @@
       lookup: dart.definiteFunctionType(E, [core.Object]),
       [_lookup]: dart.definiteFunctionType(E, [core.Object]),
       add: dart.definiteFunctionType(core.bool, [E]),
-      [_add]: dart.definiteFunctionType(core.bool, [E]),
+      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
       remove: dart.definiteFunctionType(core.bool, [core.Object]),
       [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
       [_computeElements]: dart.definiteFunctionType(core.List$(E), []),
-      [_addHashTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
-      [_removeHashTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
+      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
       [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
-      [_getBucket]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List$(E), [dart.dynamic, dart.dynamic]),
       [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
     }),
     statics: () => ({
@@ -25210,7 +25213,7 @@
     }
     add(object) {
       E._check(object);
-      return super[_add](object);
+      return super[_add$0](object);
     }
     contains(object) {
       if (!dart.test(this[_validKey](object))) return false;
@@ -25245,10 +25248,10 @@
       this[_set] = set;
       this[_elements] = elements;
       this[_offset] = 0;
-      this[_current] = null;
+      this[_current$2] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
       let elements = this[_elements];
@@ -25256,10 +25259,10 @@
       if (elements !== dart.dload(this[_set], _elements)) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
       } else if (dart.notNull(offset) >= elements.length) {
-        this[_current] = null;
+        this[_current$2] = null;
         return false;
       } else {
-        this[_current] = elements[offset];
+        this[_current$2] = elements[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -25273,7 +25276,7 @@
       [_set]: dart.dynamic,
       [_elements]: ListOfE(),
       [_offset]: core.int,
-      [_current]: E
+      [_current$2]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25281,15 +25284,15 @@
   return _HashSetIterator;
 });
 collection._HashSetIterator = _HashSetIterator();
-const _first = Symbol('_first');
-const _last = Symbol('_last');
+const _first$ = Symbol('_first');
+const _last$ = Symbol('_last');
 const _unsupported = Symbol('_unsupported');
 const _getTableEntry = Symbol('_getTableEntry');
 const _element = Symbol('_element');
-const _newLinkedCell = Symbol('_newLinkedCell');
-const _unlinkCell = Symbol('_unlinkCell');
+const _newLinkedCell$ = Symbol('_newLinkedCell');
+const _unlinkCell$ = Symbol('_unlinkCell');
 const _filterWhere = Symbol('_filterWhere');
-const _previous = Symbol('_previous');
+const _previous$0 = Symbol('_previous');
 collection._LinkedHashSet$ = dart.generic(E => {
   let _LinkedHashSetOfE = () => (_LinkedHashSetOfE = dart.constFn(collection._LinkedHashSet$(E)))();
   let _LinkedHashSetIteratorOfE = () => (_LinkedHashSetIteratorOfE = dart.constFn(collection._LinkedHashSetIterator$(E)))();
@@ -25299,13 +25302,13 @@
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
   class _LinkedHashSet extends collection._HashSetBase$(E) {
     new() {
-      this[_length] = 0;
-      this[_strings] = null;
-      this[_nums] = null;
-      this[_rest] = null;
-      this[_first] = null;
-      this[_last] = null;
-      this[_modifications] = 0;
+      this[_length$1] = 0;
+      this[_strings$] = null;
+      this[_nums$] = null;
+      this[_rest$] = null;
+      this[_first$] = null;
+      this[_last$] = null;
+      this[_modifications$] = 0;
     }
     [_newSet]() {
       return new (_LinkedHashSetOfE())();
@@ -25314,25 +25317,25 @@
       dart.throw(dart.str`LinkedHashSet: unsupported ${operation}`);
     }
     get iterator() {
-      return new (_LinkedHashSetIteratorOfE())(this, this[_modifications]);
+      return new (_LinkedHashSetIteratorOfE())(this, this[_modifications$]);
     }
     get length() {
-      return this[_length];
+      return this[_length$1];
     }
     get isEmpty() {
-      return this[_length] == 0;
+      return this[_length$1] == 0;
     }
     get isNotEmpty() {
       return !dart.test(this.isEmpty);
     }
     contains(object) {
       if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
-        let strings = this[_strings];
+        let strings = this[_strings$];
         if (strings == null) return false;
         let cell = this[_getTableEntry](strings, object);
         return cell != null;
       } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
-        let nums = this[_nums];
+        let nums = this[_nums$];
         if (nums == null) return false;
         let cell = this[_getTableEntry](nums, object);
         return cell != null;
@@ -25341,9 +25344,9 @@
       }
     }
     [_contains](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return false;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       return dart.notNull(this[_findBucketIndex](bucket, object)) >= 0;
     }
     lookup(object) {
@@ -25354,80 +25357,80 @@
       }
     }
     [_lookup](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return null;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       let index = this[_findBucketIndex](bucket, object);
       if (dart.notNull(index) < 0) return null;
       return bucket[dartx._get](index)[_element];
     }
     forEach(action) {
-      let cell = this[_first];
-      let modifications = this[_modifications];
+      let cell = this[_first$];
+      let modifications = this[_modifications$];
       while (cell != null) {
         action(cell[_element]);
-        if (modifications != this[_modifications]) {
+        if (modifications != this[_modifications$]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
-        cell = cell[_next];
+        cell = cell[_next$0];
       }
     }
     get first() {
-      if (this[_first] == null) dart.throw(new core.StateError("No elements"));
-      return this[_first][_element];
+      if (this[_first$] == null) dart.throw(new core.StateError("No elements"));
+      return this[_first$][_element];
     }
     get last() {
-      if (this[_last] == null) dart.throw(new core.StateError("No elements"));
-      return this[_last][_element];
+      if (this[_last$] == null) dart.throw(new core.StateError("No elements"));
+      return this[_last$][_element];
     }
     add(element) {
       E._check(element);
       if (dart.test(collection._LinkedHashSet._isStringElement(element))) {
-        let strings = this[_strings];
-        if (strings == null) this[_strings] = strings = collection._LinkedHashSet._newHashTable();
-        return this[_addHashTableEntry](strings, element);
+        let strings = this[_strings$];
+        if (strings == null) this[_strings$] = strings = collection._LinkedHashSet._newHashTable();
+        return this[_addHashTableEntry$](strings, element);
       } else if (dart.test(collection._LinkedHashSet._isNumericElement(element))) {
-        let nums = this[_nums];
-        if (nums == null) this[_nums] = nums = collection._LinkedHashSet._newHashTable();
-        return this[_addHashTableEntry](nums, element);
+        let nums = this[_nums$];
+        if (nums == null) this[_nums$] = nums = collection._LinkedHashSet._newHashTable();
+        return this[_addHashTableEntry$](nums, element);
       } else {
-        return this[_add](element);
+        return this[_add$0](element);
       }
     }
-    [_add](element) {
+    [_add$0](element) {
       E._check(element);
-      let rest = this[_rest];
-      if (rest == null) this[_rest] = rest = collection._LinkedHashSet._newHashTable();
+      let rest = this[_rest$];
+      if (rest == null) this[_rest$] = rest = collection._LinkedHashSet._newHashTable();
       let hash = this[_computeHashCode](element);
       let bucket = rest[hash];
       if (bucket == null) {
-        let cell = this[_newLinkedCell](element);
+        let cell = this[_newLinkedCell$](element);
         collection._LinkedHashSet._setTableEntry(rest, hash, [cell]);
       } else {
         let index = this[_findBucketIndex](bucket, element);
         if (dart.notNull(index) >= 0) return false;
-        let cell = this[_newLinkedCell](element);
+        let cell = this[_newLinkedCell$](element);
         bucket.push(cell);
       }
       return true;
     }
     remove(object) {
       if (dart.test(collection._LinkedHashSet._isStringElement(object))) {
-        return this[_removeHashTableEntry](this[_strings], object);
+        return this[_removeHashTableEntry$](this[_strings$], object);
       } else if (dart.test(collection._LinkedHashSet._isNumericElement(object))) {
-        return this[_removeHashTableEntry](this[_nums], object);
+        return this[_removeHashTableEntry$](this[_nums$], object);
       } else {
         return this[_remove](object);
       }
     }
     [_remove](object) {
-      let rest = this[_rest];
+      let rest = this[_rest$];
       if (rest == null) return false;
-      let bucket = this[_getBucket](rest, object);
+      let bucket = this[_getBucket$](rest, object);
       let index = this[_findBucketIndex](bucket, object);
       if (dart.notNull(index) < 0) return false;
       let cell = bucket.splice(index, 1)[0];
-      this[_unlinkCell](cell);
+      this[_unlinkCell$](cell);
       return true;
     }
     removeWhere(test) {
@@ -25437,13 +25440,13 @@
       this[_filterWhere](test, false);
     }
     [_filterWhere](test, removeMatching) {
-      let cell = this[_first];
+      let cell = this[_first$];
       while (cell != null) {
         let element = cell[_element];
-        let next = cell[_next];
-        let modifications = this[_modifications];
+        let next = cell[_next$0];
+        let modifications = this[_modifications$];
         let shouldRemove = removeMatching == test(element);
-        if (modifications != this[_modifications]) {
+        if (modifications != this[_modifications$]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
         if (shouldRemove) this.remove(element);
@@ -25451,62 +25454,62 @@
       }
     }
     clear() {
-      if (dart.notNull(this[_length]) > 0) {
-        this[_strings] = this[_nums] = this[_rest] = this[_first] = this[_last] = null;
-        this[_length] = 0;
-        this[_modified]();
+      if (dart.notNull(this[_length$1]) > 0) {
+        this[_strings$] = this[_nums$] = this[_rest$] = this[_first$] = this[_last$] = null;
+        this[_length$1] = 0;
+        this[_modified$]();
       }
     }
-    [_addHashTableEntry](table, element) {
+    [_addHashTableEntry$](table, element) {
       E._check(element);
       let cell = this[_getTableEntry](table, element);
       if (cell != null) return false;
-      collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell](element));
+      collection._LinkedHashSet._setTableEntry(table, element, this[_newLinkedCell$](element));
       return true;
     }
-    [_removeHashTableEntry](table, element) {
+    [_removeHashTableEntry$](table, element) {
       if (table == null) return false;
       let cell = this[_getTableEntry](table, element);
       if (cell == null) return false;
-      this[_unlinkCell](cell);
+      this[_unlinkCell$](cell);
       collection._LinkedHashSet._deleteTableEntry(table, element);
       return true;
     }
-    [_modified]() {
-      this[_modifications] = dart.notNull(this[_modifications]) + 1 & 67108863;
+    [_modified$]() {
+      this[_modifications$] = dart.notNull(this[_modifications$]) + 1 & 67108863;
     }
-    [_newLinkedCell](element) {
+    [_newLinkedCell$](element) {
       E._check(element);
       let cell = new (_LinkedHashSetCellOfE())(element);
-      if (this[_first] == null) {
-        this[_first] = this[_last] = cell;
+      if (this[_first$] == null) {
+        this[_first$] = this[_last$] = cell;
       } else {
-        let last = this[_last];
-        cell[_previous] = last;
-        this[_last] = last[_next] = cell;
+        let last = this[_last$];
+        cell[_previous$0] = last;
+        this[_last$] = last[_next$0] = cell;
       }
-      this[_length] = dart.notNull(this[_length]) + 1;
-      this[_modified]();
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
+      this[_modified$]();
       return cell;
     }
-    [_unlinkCell](cell) {
+    [_unlinkCell$](cell) {
       _LinkedHashSetCellOfE()._check(cell);
-      let previous = cell[_previous];
-      let next = cell[_next];
+      let previous = cell[_previous$0];
+      let next = cell[_next$0];
       if (previous == null) {
-        dart.assert(dart.equals(cell, this[_first]));
-        this[_first] = next;
+        dart.assert(dart.equals(cell, this[_first$]));
+        this[_first$] = next;
       } else {
-        previous[_next] = next;
+        previous[_next$0] = next;
       }
       if (next == null) {
-        dart.assert(dart.equals(cell, this[_last]));
-        this[_last] = previous;
+        dart.assert(dart.equals(cell, this[_last$]));
+        this[_last$] = previous;
       } else {
-        next[_previous] = previous;
+        next[_previous$0] = previous;
       }
-      this[_length] = dart.notNull(this[_length]) - 1;
-      this[_modified]();
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      this[_modified$]();
     }
     static _isStringElement(element) {
       return typeof element == 'string' && element != '__proto__';
@@ -25527,7 +25530,7 @@
     static _deleteTableEntry(table, key) {
       delete table[key];
     }
-    [_getBucket](table, element) {
+    [_getBucket$](table, element) {
       let hash = this[_computeHashCode](element);
       return table[hash];
     }
@@ -25552,13 +25555,13 @@
   dart.setSignature(_LinkedHashSet, {
     constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSet$(E), [])}),
     fields: () => ({
-      [_length]: core.int,
-      [_strings]: dart.dynamic,
-      [_nums]: dart.dynamic,
-      [_rest]: dart.dynamic,
-      [_first]: _LinkedHashSetCellOfE(),
-      [_last]: _LinkedHashSetCellOfE(),
-      [_modifications]: core.int
+      [_length$1]: core.int,
+      [_strings$]: dart.dynamic,
+      [_nums$]: dart.dynamic,
+      [_rest$]: dart.dynamic,
+      [_first$]: _LinkedHashSetCellOfE(),
+      [_last$]: _LinkedHashSetCellOfE(),
+      [_modifications$]: core.int
     }),
     getters: () => ({
       iterator: dart.definiteFunctionType(core.Iterator$(E), []),
@@ -25572,18 +25575,18 @@
       lookup: dart.definiteFunctionType(E, [core.Object]),
       [_lookup]: dart.definiteFunctionType(E, [core.Object]),
       add: dart.definiteFunctionType(core.bool, [E]),
-      [_add]: dart.definiteFunctionType(core.bool, [E]),
+      [_add$0]: dart.definiteFunctionType(core.bool, [E]),
       remove: dart.definiteFunctionType(core.bool, [core.Object]),
       [_remove]: dart.definiteFunctionType(core.bool, [core.Object]),
       [_filterWhere]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
-      [_addHashTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
-      [_removeHashTableEntry]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
-      [_modified]: dart.definiteFunctionType(dart.void, []),
-      [_newLinkedCell]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
-      [_unlinkCell]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
+      [_addHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, E]),
+      [_removeHashTableEntry$]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.Object]),
+      [_modified$]: dart.definiteFunctionType(dart.void, []),
+      [_newLinkedCell$]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E]),
+      [_unlinkCell$]: dart.definiteFunctionType(dart.void, [_LinkedHashSetCellOfE()]),
       [_computeHashCode]: dart.definiteFunctionType(core.int, [dart.dynamic]),
       [_getTableEntry]: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [dart.dynamic, dart.dynamic]),
-      [_getBucket]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
+      [_getBucket$]: dart.definiteFunctionType(core.List$(collection._LinkedHashSetCell$(E)), [dart.dynamic, dart.dynamic]),
       [_findBucketIndex]: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])
     }),
     statics: () => ({
@@ -25661,7 +25664,7 @@
     }
     add(element) {
       E._check(element);
-      return super[_add](element);
+      return super[_add$0](element);
     }
     contains(object) {
       if (!dart.test(this[_validKey](object))) return false;
@@ -25706,8 +25709,8 @@
   class _LinkedHashSetCell extends core.Object {
     new(element) {
       this[_element] = element;
-      this[_next] = null;
-      this[_previous] = null;
+      this[_next$0] = null;
+      this[_previous$0] = null;
     }
   }
   dart.addTypeTests(_LinkedHashSetCell);
@@ -25715,36 +25718,36 @@
     constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetCell$(E), [E])}),
     fields: () => ({
       [_element]: E,
-      [_next]: _LinkedHashSetCellOfE(),
-      [_previous]: _LinkedHashSetCellOfE()
+      [_next$0]: _LinkedHashSetCellOfE(),
+      [_previous$0]: _LinkedHashSetCellOfE()
     })
   });
   return _LinkedHashSetCell;
 });
 collection._LinkedHashSetCell = _LinkedHashSetCell();
-const _cell = Symbol('_cell');
+const _cell$ = Symbol('_cell');
 collection._LinkedHashSetIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class _LinkedHashSetIterator extends core.Object {
     new(set, modifications) {
       this[_set] = set;
-      this[_modifications] = modifications;
-      this[_cell] = null;
-      this[_current] = null;
-      this[_cell] = this[_set][_first];
+      this[_modifications$] = modifications;
+      this[_cell$] = null;
+      this[_current$2] = null;
+      this[_cell$] = this[_set][_first$];
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
-      if (this[_modifications] != this[_set][_modifications]) {
+      if (this[_modifications$] != this[_set][_modifications$]) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
-      } else if (this[_cell] == null) {
-        this[_current] = null;
+      } else if (this[_cell$] == null) {
+        this[_current$2] = null;
         return false;
       } else {
-        this[_current] = E._check(this[_cell][_element]);
-        this[_cell] = this[_cell][_next];
+        this[_current$2] = E._check(this[_cell$][_element]);
+        this[_cell$] = this[_cell$][_next$0];
         return true;
       }
     }
@@ -25755,9 +25758,9 @@
     constructors: () => ({new: dart.definiteFunctionType(collection._LinkedHashSetIterator$(E), [collection._LinkedHashSet, core.int])}),
     fields: () => ({
       [_set]: collection._LinkedHashSet,
-      [_modifications]: core.int,
-      [_cell]: collection._LinkedHashSetCell,
-      [_current]: E
+      [_modifications$]: core.int,
+      [_cell$]: collection._LinkedHashSetCell,
+      [_current$2]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25765,26 +25768,26 @@
   return _LinkedHashSetIterator;
 });
 collection._LinkedHashSetIterator = _LinkedHashSetIterator();
-const _source = Symbol('_source');
+const _source$0 = Symbol('_source');
 collection.UnmodifiableListView$ = dart.generic(E => {
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   class UnmodifiableListView extends _internal.UnmodifiableListBase$(E) {
     new(source) {
-      this[_source] = source;
+      this[_source$0] = source;
     }
     get length() {
-      return this[_source][dartx.length];
+      return this[_source$0][dartx.length];
     }
     set length(value) {
       super.length = value;
     }
     _get(index) {
-      return this[_source][dartx.elementAt](index);
+      return this[_source$0][dartx.elementAt](index);
     }
   }
   dart.setSignature(UnmodifiableListView, {
     constructors: () => ({new: dart.definiteFunctionType(collection.UnmodifiableListView$(E), [IterableOfE()])}),
-    fields: () => ({[_source]: IterableOfE()}),
+    fields: () => ({[_source$0]: IterableOfE()}),
     getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
     methods: () => ({_get: dart.definiteFunctionType(E, [core.int])})
   });
@@ -25804,7 +25807,7 @@
   const _Equality = dart.typedef('_Equality', () => dart.functionType(core.bool, [K, K]));
   return _Equality;
 });
-collection._Equality = _Equality();
+collection._Equality = _Equality$();
 collection._Hasher$ = dart.generic(K => {
   const _Hasher = dart.typedef('_Hasher', () => dart.functionType(core.int, [K]));
   return _Hasher;
@@ -26309,32 +26312,32 @@
   parts[dartx.add](ultimateString);
 };
 dart.lazyFn(collection._iterablePartsToStrings, () => IterableAndListTovoid());
-const _iterator = Symbol('_iterator');
-const _state = Symbol('_state');
+const _iterator$0 = Symbol('_iterator');
+const _state$ = Symbol('_state');
 const _move = Symbol('_move');
 collection.HasNextIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class HasNextIterator extends core.Object {
     new(iterator) {
-      this[_iterator] = iterator;
-      this[_state] = collection.HasNextIterator._NOT_MOVED_YET;
+      this[_iterator$0] = iterator;
+      this[_state$] = collection.HasNextIterator._NOT_MOVED_YET;
     }
     get hasNext() {
-      if (this[_state] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
-      return this[_state] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
+      if (this[_state$] == collection.HasNextIterator._NOT_MOVED_YET) this[_move]();
+      return this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
     }
     next() {
       if (!dart.test(this.hasNext)) dart.throw(new core.StateError("No more elements"));
-      dart.assert(this[_state] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
-      let result = this[_iterator].current;
+      dart.assert(this[_state$] == collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT);
+      let result = this[_iterator$0].current;
       this[_move]();
       return result;
     }
     [_move]() {
-      if (dart.test(this[_iterator].moveNext())) {
-        this[_state] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
+      if (dart.test(this[_iterator$0].moveNext())) {
+        this[_state$] = collection.HasNextIterator._HAS_NEXT_AND_NEXT_IN_CURRENT;
       } else {
-        this[_state] = collection.HasNextIterator._NO_NEXT;
+        this[_state$] = collection.HasNextIterator._NO_NEXT;
       }
     }
   }
@@ -26342,8 +26345,8 @@
   dart.setSignature(HasNextIterator, {
     constructors: () => ({new: dart.definiteFunctionType(collection.HasNextIterator$(E), [IteratorOfE()])}),
     fields: () => ({
-      [_iterator]: IteratorOfE(),
-      [_state]: core.int
+      [_iterator$0]: IteratorOfE(),
+      [_state$]: core.int
     }),
     getters: () => ({hasNext: dart.definiteFunctionType(core.bool, [])}),
     methods: () => ({
@@ -26505,9 +26508,9 @@
 });
 collection.LinkedHashSet = LinkedHashSet();
 const _modificationCount = Symbol('_modificationCount');
-const _insertBefore = Symbol('_insertBefore');
+const _insertBefore$ = Symbol('_insertBefore');
 const _list = Symbol('_list');
-const _unlink = Symbol('_unlink');
+const _unlink$ = Symbol('_unlink');
 collection.LinkedList$ = dart.generic(E => {
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
@@ -26515,18 +26518,18 @@
   class LinkedList extends core.Iterable$(E) {
     new() {
       this[_modificationCount] = 0;
-      this[_length] = 0;
-      this[_first] = null;
+      this[_length$1] = 0;
+      this[_first$] = null;
       super.new();
     }
     addFirst(entry) {
       E._check(entry);
-      this[_insertBefore](this[_first], entry, {updateFirst: true});
-      this[_first] = entry;
+      this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+      this[_first$] = entry;
     }
     add(entry) {
       E._check(entry);
-      this[_insertBefore](this[_first], entry, {updateFirst: false});
+      this[_insertBefore$](this[_first$], entry, {updateFirst: false});
     }
     addAll(entries) {
       IterableOfE()._check(entries);
@@ -26535,64 +26538,64 @@
     remove(entry) {
       E._check(entry);
       if (!dart.equals(entry[_list], this)) return false;
-      this[_unlink](entry);
+      this[_unlink$](entry);
       return true;
     }
     get iterator() {
       return new (_LinkedListIteratorOfE())(this);
     }
     get length() {
-      return this[_length];
+      return this[_length$1];
     }
     clear() {
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       if (dart.test(this.isEmpty)) return;
-      let next = this[_first];
+      let next = this[_first$];
       do {
         let entry = next;
-        next = entry[_next];
-        entry[_next] = entry[_previous] = entry[_list] = null;
-      } while (!core.identical(next, this[_first]));
-      this[_first] = null;
-      this[_length] = 0;
+        next = entry[_next$0];
+        entry[_next$0] = entry[_previous$0] = entry[_list] = null;
+      } while (!core.identical(next, this[_first$]));
+      this[_first$] = null;
+      this[_length$1] = 0;
     }
     get first() {
       if (dart.test(this.isEmpty)) {
         dart.throw(new core.StateError('No such element'));
       }
-      return this[_first];
+      return this[_first$];
     }
     get last() {
       if (dart.test(this.isEmpty)) {
         dart.throw(new core.StateError('No such element'));
       }
-      return this[_first][_previous];
+      return this[_first$][_previous$0];
     }
     get single() {
       if (dart.test(this.isEmpty)) {
         dart.throw(new core.StateError('No such element'));
       }
-      if (dart.notNull(this[_length]) > 1) {
+      if (dart.notNull(this[_length$1]) > 1) {
         dart.throw(new core.StateError('Too many elements'));
       }
-      return this[_first];
+      return this[_first$];
     }
     forEach(action) {
       let modificationCount = this[_modificationCount];
       if (dart.test(this.isEmpty)) return;
-      let current = this[_first];
+      let current = this[_first$];
       do {
         action(current);
         if (modificationCount != this[_modificationCount]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
-        current = current[_next];
-      } while (!core.identical(current, this[_first]));
+        current = current[_next$0];
+      } while (!core.identical(current, this[_first$]));
     }
     get isEmpty() {
-      return this[_length] == 0;
+      return this[_length$1] == 0;
     }
-    [_insertBefore](entry, newEntry, opts) {
+    [_insertBefore$](entry, newEntry, opts) {
       E._check(entry);
       E._check(newEntry);
       let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
@@ -26603,33 +26606,33 @@
       newEntry[_list] = this;
       if (dart.test(this.isEmpty)) {
         dart.assert(entry == null);
-        newEntry[_previous] = newEntry[_next] = newEntry;
-        this[_first] = newEntry;
-        this[_length] = dart.notNull(this[_length]) + 1;
+        newEntry[_previous$0] = newEntry[_next$0] = newEntry;
+        this[_first$] = newEntry;
+        this[_length$1] = dart.notNull(this[_length$1]) + 1;
         return;
       }
-      let predecessor = entry[_previous];
+      let predecessor = entry[_previous$0];
       let successor = entry;
-      newEntry[_previous] = predecessor;
-      newEntry[_next] = successor;
-      predecessor[_next] = newEntry;
-      successor[_previous] = newEntry;
-      if (dart.test(updateFirst) && core.identical(entry, this[_first])) {
-        this[_first] = newEntry;
+      newEntry[_previous$0] = predecessor;
+      newEntry[_next$0] = successor;
+      predecessor[_next$0] = newEntry;
+      successor[_previous$0] = newEntry;
+      if (dart.test(updateFirst) && core.identical(entry, this[_first$])) {
+        this[_first$] = newEntry;
       }
-      this[_length] = dart.notNull(this[_length]) + 1;
+      this[_length$1] = dart.notNull(this[_length$1]) + 1;
     }
-    [_unlink](entry) {
+    [_unlink$](entry) {
       E._check(entry);
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
-      entry[_next][_previous] = entry[_previous];
-      let next = entry[_previous][_next] = entry[_next];
-      this[_length] = dart.notNull(this[_length]) - 1;
-      entry[_list] = entry[_next] = entry[_previous] = null;
+      entry[_next$0][_previous$0] = entry[_previous$0];
+      let next = entry[_previous$0][_next$0] = entry[_next$0];
+      this[_length$1] = dart.notNull(this[_length$1]) - 1;
+      entry[_list] = entry[_next$0] = entry[_previous$0] = null;
       if (dart.test(this.isEmpty)) {
-        this[_first] = null;
-      } else if (core.identical(entry, this[_first])) {
-        this[_first] = next;
+        this[_first$] = null;
+      } else if (core.identical(entry, this[_first$])) {
+        this[_first$] = next;
       }
     }
   }
@@ -26637,8 +26640,8 @@
     constructors: () => ({new: dart.definiteFunctionType(collection.LinkedList$(E), [])}),
     fields: () => ({
       [_modificationCount]: core.int,
-      [_length]: core.int,
-      [_first]: E
+      [_length$1]: core.int,
+      [_first$]: E
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({
@@ -26647,8 +26650,8 @@
       addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
       remove: dart.definiteFunctionType(core.bool, [E]),
       clear: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-      [_unlink]: dart.definiteFunctionType(dart.void, [E])
+      [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+      [_unlink$]: dart.definiteFunctionType(dart.void, [E])
     })
   });
   dart.defineExtensionMembers(LinkedList, [
@@ -26672,24 +26675,24 @@
     new(list) {
       this[_list] = list;
       this[_modificationCount] = list[_modificationCount];
-      this[_next] = list[_first];
+      this[_next$0] = list[_first$];
       this[_visitedFirst] = false;
-      this[_current] = null;
+      this[_current$2] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
       if (this[_modificationCount] != this[_list][_modificationCount]) {
         dart.throw(new core.ConcurrentModificationError(this));
       }
-      if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next], this[_list].first)) {
-        this[_current] = null;
+      if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
+        this[_current$2] = null;
         return false;
       }
       this[_visitedFirst] = true;
-      this[_current] = E._check(this[_next]);
-      this[_next] = this[_next][_next];
+      this[_current$2] = E._check(this[_next$0]);
+      this[_next$0] = this[_next$0][_next$0];
       return true;
     }
   }
@@ -26700,8 +26703,8 @@
     fields: () => ({
       [_list]: LinkedListOfE(),
       [_modificationCount]: core.int,
-      [_current]: E,
-      [_next]: LinkedListEntryOfE(),
+      [_current$2]: E,
+      [_next$0]: LinkedListEntryOfE(),
       [_visitedFirst]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -26715,38 +26718,38 @@
   class LinkedListEntry extends core.Object {
     new() {
       this[_list] = null;
-      this[_next] = null;
-      this[_previous] = null;
+      this[_next$0] = null;
+      this[_previous$0] = null;
     }
     get list() {
       return this[_list];
     }
     unlink() {
-      this[_list][_unlink](E._check(this));
+      this[_list][_unlink$](E._check(this));
     }
     get next() {
-      if (core.identical(this, this[_next])) return null;
-      return this[_next];
+      if (core.identical(this, this[_next$0])) return null;
+      return this[_next$0];
     }
     get previous() {
-      if (core.identical(this, this[_previous])) return null;
-      return this[_previous];
+      if (core.identical(this, this[_previous$0])) return null;
+      return this[_previous$0];
     }
     insertAfter(entry) {
       E._check(entry);
-      this[_list][_insertBefore](this[_next], entry, {updateFirst: false});
+      this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
     }
     insertBefore(entry) {
       E._check(entry);
-      this[_list][_insertBefore](E.as(this), entry, {updateFirst: true});
+      this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
     }
   }
   dart.addTypeTests(LinkedListEntry);
   dart.setSignature(LinkedListEntry, {
     fields: () => ({
       [_list]: LinkedListOfE(),
-      [_next]: E,
-      [_previous]: E
+      [_next$0]: E,
+      [_previous$0]: E
     }),
     getters: () => ({
       list: dart.definiteFunctionType(collection.LinkedList$(E), []),
@@ -26909,35 +26912,35 @@
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
   class _MapBaseValueIterable extends core.Iterable$(V) {
     new(map) {
-      this[_map] = map;
+      this[_map$0] = map;
       super.new();
     }
     get length() {
-      return this[_map][dartx.length];
+      return this[_map$0][dartx.length];
     }
     get isEmpty() {
-      return this[_map][dartx.isEmpty];
+      return this[_map$0][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_map][dartx.isNotEmpty];
+      return this[_map$0][dartx.isNotEmpty];
     }
     get first() {
-      return this[_map][dartx._get](this[_map][dartx.keys][dartx.first]);
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.first]);
     }
     get single() {
-      return this[_map][dartx._get](this[_map][dartx.keys][dartx.single]);
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.single]);
     }
     get last() {
-      return this[_map][dartx._get](this[_map][dartx.keys][dartx.last]);
+      return this[_map$0][dartx._get](this[_map$0][dartx.keys][dartx.last]);
     }
     get iterator() {
-      return new (_MapBaseValueIteratorOfK$V())(this[_map]);
+      return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
     }
   }
   _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_MapBaseValueIterable, {
     constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterable$(K, V), [MapOfK$V()])}),
-    fields: () => ({[_map]: MapOfK$V()}),
+    fields: () => ({[_map$0]: MapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
   });
   dart.defineExtensionMembers(_MapBaseValueIterable, [
@@ -26958,20 +26961,20 @@
   let IteratorOfV = () => (IteratorOfV = dart.constFn(core.Iterator$(V)))();
   class _MapBaseValueIterator extends core.Object {
     new(map) {
-      this[_map] = map;
+      this[_map$0] = map;
       this[_keys] = map[dartx.keys][dartx.iterator];
-      this[_current] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       if (dart.test(this[_keys].moveNext())) {
-        this[_current] = this[_map][dartx._get](this[_keys].current);
+        this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
         return true;
       }
-      this[_current] = null;
+      this[_current$2] = null;
       return false;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(_MapBaseValueIterator);
@@ -26980,8 +26983,8 @@
     constructors: () => ({new: dart.definiteFunctionType(collection._MapBaseValueIterator$(K, V), [MapOfK$V()])}),
     fields: () => ({
       [_keys]: IteratorOfK(),
-      [_map]: MapOfK$V(),
-      [_current]: V
+      [_map$0]: MapOfK$V(),
+      [_current$2]: V
     }),
     getters: () => ({current: dart.definiteFunctionType(V, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26995,65 +26998,65 @@
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   class MapView extends core.Object {
     new(map) {
-      this[_map] = map;
+      this[_map$0] = map;
     }
     _get(key) {
-      return this[_map][dartx._get](key);
+      return this[_map$0][dartx._get](key);
     }
     _set(key, value) {
       K._check(key);
       V._check(value);
-      this[_map][dartx._set](key, value);
+      this[_map$0][dartx._set](key, value);
       return value;
     }
     addAll(other) {
       MapOfK$V()._check(other);
-      this[_map][dartx.addAll](other);
+      this[_map$0][dartx.addAll](other);
     }
     clear() {
-      this[_map][dartx.clear]();
+      this[_map$0][dartx.clear]();
     }
     putIfAbsent(key, ifAbsent) {
       K._check(key);
       VoidToV()._check(ifAbsent);
-      return this[_map][dartx.putIfAbsent](key, ifAbsent);
+      return this[_map$0][dartx.putIfAbsent](key, ifAbsent);
     }
     containsKey(key) {
-      return this[_map][dartx.containsKey](key);
+      return this[_map$0][dartx.containsKey](key);
     }
     containsValue(value) {
-      return this[_map][dartx.containsValue](value);
+      return this[_map$0][dartx.containsValue](value);
     }
     forEach(action) {
-      this[_map][dartx.forEach](action);
+      this[_map$0][dartx.forEach](action);
     }
     get isEmpty() {
-      return this[_map][dartx.isEmpty];
+      return this[_map$0][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_map][dartx.isNotEmpty];
+      return this[_map$0][dartx.isNotEmpty];
     }
     get length() {
-      return this[_map][dartx.length];
+      return this[_map$0][dartx.length];
     }
     get keys() {
-      return this[_map][dartx.keys];
+      return this[_map$0][dartx.keys];
     }
     remove(key) {
-      return this[_map][dartx.remove](key);
+      return this[_map$0][dartx.remove](key);
     }
     toString() {
-      return dart.toString(this[_map]);
+      return dart.toString(this[_map$0]);
     }
     get values() {
-      return this[_map][dartx.values];
+      return this[_map$0][dartx.values];
     }
   }
   dart.addTypeTests(MapView);
   MapView[dart.implements] = () => [MapOfK$V()];
   dart.setSignature(MapView, {
     constructors: () => ({new: dart.definiteFunctionType(collection.MapView$(K, V), [MapOfK$V()])}),
-    fields: () => ({[_map]: MapOfK$V()}),
+    fields: () => ({[_map$0]: MapOfK$V()}),
     getters: () => ({
       isEmpty: dart.definiteFunctionType(core.bool, []),
       isNotEmpty: dart.definiteFunctionType(core.bool, []),
@@ -27137,7 +27140,7 @@
     }
   }
   static getValues(map) {
-    return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic()));
+    return map[dartx.keys][dartx.map](dart.dynamic)(dart.fn(key => map[dartx._get](key), dynamicTodynamic$()));
   }
   static length(map) {
     return map[dartx.keys][dartx.length];
@@ -27258,7 +27261,7 @@
       if (previous != null) previous[_nextLink] = this;
       if (next != null) next[_previousLink] = this;
     }
-    [_unlink]() {
+    [_unlink$]() {
       if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
       if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
       this[_nextLink] = null;
@@ -27273,7 +27276,7 @@
     }),
     methods: () => ({
       [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-      [_unlink]: dart.definiteFunctionType(dart.void, [])
+      [_unlink$]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _DoubleLink;
@@ -27310,7 +27313,7 @@
       new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
     }
     remove() {
-      this[_unlink]();
+      this[_unlink$]();
       return this.element;
     }
     previousEntry() {
@@ -27406,7 +27409,7 @@
     }
     [_remove]() {
       this[_queue] = null;
-      this[_unlink]();
+      this[_unlink$]();
       return this.element;
     }
     remove() {
@@ -27651,11 +27654,11 @@
     new(sentinel) {
       this[_sentinel] = sentinel;
       this[_nextEntry] = sentinel[_nextLink];
-      this[_current] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       if (core.identical(this[_nextEntry], this[_sentinel])) {
-        this[_current] = null;
+        this[_current$2] = null;
         this[_nextEntry] = null;
         this[_sentinel] = null;
         return false;
@@ -27664,12 +27667,12 @@
       if (elementEntry[_queue] == null) {
         dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
       }
-      this[_current] = elementEntry.element;
+      this[_current$2] = elementEntry.element;
       this[_nextEntry] = elementEntry[_nextLink];
       return true;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(_DoubleLinkedQueueIterator);
@@ -27679,7 +27682,7 @@
     fields: () => ({
       [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
       [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-      [_current]: E
+      [_current$2]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -27787,7 +27790,7 @@
     }
     add(value) {
       E._check(value);
-      this[_add](value);
+      this[_add$0](value);
     }
     addAll(elements) {
       IterableOfE()._check(elements);
@@ -27814,7 +27817,7 @@
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       } else {
         for (let element of elements)
-          this[_add](element);
+          this[_add$0](element);
       }
     }
     remove(value) {
@@ -27863,7 +27866,7 @@
     }
     addLast(value) {
       E._check(value);
-      this[_add](value);
+      this[_add$0](value);
     }
     addFirst(value) {
       E._check(value);
@@ -27905,7 +27908,7 @@
         dart.throw(new core.ConcurrentModificationError(this));
       }
     }
-    [_add](element) {
+    [_add$0](element) {
       E._check(element);
       this[_table][dartx._set](this[_tail], element);
       this[_tail] = (dart.notNull(this[_tail]) + 1 & dart.notNull(this[_table][dartx.length]) - 1) >>> 0;
@@ -27997,7 +28000,7 @@
       removeFirst: dart.definiteFunctionType(E, []),
       removeLast: dart.definiteFunctionType(E, []),
       [_checkModification]: dart.definiteFunctionType(dart.void, [core.int]),
-      [_add]: dart.definiteFunctionType(dart.void, [E]),
+      [_add$0]: dart.definiteFunctionType(dart.void, [E]),
       [_remove]: dart.definiteFunctionType(core.int, [core.int]),
       [_grow]: dart.definiteFunctionType(dart.void, []),
       [_writeToList]: dart.definiteFunctionType(core.int, [ListOfE()]),
@@ -28037,18 +28040,18 @@
       this[_end] = queue[_tail];
       this[_modificationCount] = queue[_modificationCount];
       this[_position] = queue[_head];
-      this[_current] = null;
+      this[_current$2] = null;
     }
     get current() {
-      return this[_current];
+      return this[_current$2];
     }
     moveNext() {
       this[_queue][_checkModification](this[_modificationCount]);
       if (this[_position] == this[_end]) {
-        this[_current] = null;
+        this[_current$2] = null;
         return false;
       }
-      this[_current] = this[_queue][_table][dartx._get](this[_position]);
+      this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
       this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
       return true;
     }
@@ -28062,7 +28065,7 @@
       [_end]: core.int,
       [_modificationCount]: core.int,
       [_position]: core.int,
-      [_current]: E
+      [_current$2]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -28074,7 +28077,7 @@
   const _Predicate = dart.typedef('_Predicate', () => dart.functionType(core.bool, [T]));
   return _Predicate;
 });
-collection._Predicate = _Predicate();
+collection._Predicate = _Predicate$();
 collection._SplayTreeNode$ = dart.generic(K => {
   let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
   class _SplayTreeNode extends core.Object {
@@ -28110,7 +28113,7 @@
   return _SplayTreeMapNode;
 });
 collection._SplayTreeMapNode = _SplayTreeMapNode();
-const _count = Symbol('_count');
+const _count$ = Symbol('_count');
 const _splayCount = Symbol('_splayCount');
 const _root = Symbol('_root');
 const _dummy = Symbol('_dummy');
@@ -28120,11 +28123,11 @@
 const _splayMin = Symbol('_splayMin');
 const _splayMax = Symbol('_splayMax');
 const _addNewRoot = Symbol('_addNewRoot');
-const _clear = Symbol('_clear');
+const _clear$ = Symbol('_clear');
 collection._SplayTree$ = dart.generic((K, Node) => {
   class _SplayTree extends core.Object {
     new() {
-      this[_count] = 0;
+      this[_count$] = 0;
       this[_modificationCount] = 0;
       this[_splayCount] = 0;
     }
@@ -28205,7 +28208,7 @@
       let comp = this[_splay](key);
       if (comp != 0) return null;
       let result = this[_root];
-      this[_count] = dart.notNull(this[_count]) - 1;
+      this[_count$] = dart.notNull(this[_count$]) - 1;
       if (this[_root].left == null) {
         this[_root] = Node._check(this[_root].right);
       } else {
@@ -28218,7 +28221,7 @@
     }
     [_addNewRoot](node, comp) {
       Node._check(node);
-      this[_count] = dart.notNull(this[_count]) + 1;
+      this[_count$] = dart.notNull(this[_count$]) + 1;
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       if (this[_root] == null) {
         this[_root] = node;
@@ -28235,32 +28238,32 @@
       }
       this[_root] = node;
     }
-    get [_first]() {
+    get [_first$]() {
       if (this[_root] == null) return null;
       this[_root] = this[_splayMin](this[_root]);
       return this[_root];
     }
-    get [_last]() {
+    get [_last$]() {
       if (this[_root] == null) return null;
       this[_root] = this[_splayMax](this[_root]);
       return this[_root];
     }
-    [_clear]() {
+    [_clear$]() {
       this[_root] = null;
-      this[_count] = 0;
+      this[_count$] = 0;
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
     }
   }
   dart.addTypeTests(_SplayTree);
   dart.setSignature(_SplayTree, {
     fields: () => ({
-      [_count]: core.int,
+      [_count$]: core.int,
       [_modificationCount]: core.int,
       [_splayCount]: core.int
     }),
     getters: () => ({
-      [_first]: dart.definiteFunctionType(Node, []),
-      [_last]: dart.definiteFunctionType(Node, [])
+      [_first$]: dart.definiteFunctionType(Node, []),
+      [_last$]: dart.definiteFunctionType(Node, [])
     }),
     methods: () => ({
       [_splay]: dart.definiteFunctionType(core.int, [K]),
@@ -28268,7 +28271,7 @@
       [_splayMax]: dart.definiteFunctionType(Node, [Node]),
       [_remove]: dart.definiteFunctionType(Node, [K]),
       [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-      [_clear]: dart.definiteFunctionType(dart.void, [])
+      [_clear$]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _SplayTree;
@@ -28313,7 +28316,7 @@
       })();
       this[_validKey] = (() => {
         let l = isValidKey;
-        return l != null ? l : dart.fn(v => K.is(v), dynamicTobool());
+        return l != null ? l : dart.fn(v => K.is(v), dynamicTobool$());
       })();
       this[_root] = null;
       super.new();
@@ -28426,10 +28429,10 @@
       }
     }
     get length() {
-      return this[_count];
+      return this[_count$];
     }
     clear() {
-      this[_clear]();
+      this[_clear$]();
     }
     containsKey(key) {
       return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
@@ -28462,11 +28465,11 @@
     }
     firstKey() {
       if (this[_root] == null) return null;
-      return this[_first].key;
+      return this[_first$].key;
     }
     lastKey() {
       if (this[_root] == null) return null;
-      return this[_last].key;
+      return this[_last$].key;
     }
     lastKeyBefore(key) {
       K._check(key);
@@ -28666,17 +28669,17 @@
       super.new();
     }
     get length() {
-      return this[_tree][_count];
+      return this[_tree][_count$];
     }
     get isEmpty() {
-      return this[_tree][_count] == 0;
+      return this[_tree][_count$] == 0;
     }
     get iterator() {
       return new (_SplayTreeKeyIteratorOfK())(this[_tree]);
     }
     toSet() {
       let set = new (SplayTreeSetOfK())(this[_tree][_comparator], this[_tree][_validKey]);
-      set[_count] = this[_tree][_count];
+      set[_count$] = this[_tree][_count$];
       set[_root] = set[_copyNode](this[_tree][_root]);
       return set;
     }
@@ -28696,23 +28699,23 @@
   let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
   class _SplayTreeValueIterable extends core.Iterable$(V) {
     new(map) {
-      this[_map] = map;
+      this[_map$0] = map;
       super.new();
     }
     get length() {
-      return this[_map][_count];
+      return this[_map$0][_count$];
     }
     get isEmpty() {
-      return this[_map][_count] == 0;
+      return this[_map$0][_count$] == 0;
     }
     get iterator() {
-      return new (_SplayTreeValueIteratorOfK$V())(this[_map]);
+      return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
     }
   }
   _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_SplayTreeValueIterable, {
     constructors: () => ({new: dart.definiteFunctionType(collection._SplayTreeValueIterable$(K, V), [SplayTreeMapOfK$V()])}),
-    fields: () => ({[_map]: SplayTreeMapOfK$V()}),
+    fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
   });
   dart.defineExtensionMembers(_SplayTreeValueIterable, ['length', 'isEmpty', 'iterator']);
@@ -28804,7 +28807,7 @@
       })();
       this[_validKey] = (() => {
         let l = isValidKey;
-        return l != null ? l : dart.fn(v => E.is(v), dynamicTobool());
+        return l != null ? l : dart.fn(v => E.is(v), dynamicTobool$());
       })();
       this[_root] = null;
       super.new();
@@ -28828,7 +28831,7 @@
       return new (_SplayTreeKeyIteratorOfE())(this);
     }
     get length() {
-      return this[_count];
+      return this[_count$];
     }
     get isEmpty() {
       return this[_root] == null;
@@ -28837,16 +28840,16 @@
       return this[_root] != null;
     }
     get first() {
-      if (this[_count] == 0) dart.throw(_internal.IterableElementError.noElement());
-      return this[_first].key;
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[_first$].key;
     }
     get last() {
-      if (this[_count] == 0) dart.throw(_internal.IterableElementError.noElement());
-      return this[_last].key;
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      return this[_last$].key;
     }
     get single() {
-      if (this[_count] == 0) dart.throw(_internal.IterableElementError.noElement());
-      if (dart.notNull(this[_count]) > 1) dart.throw(_internal.IterableElementError.tooMany());
+      if (this[_count$] == 0) dart.throw(_internal.IterableElementError.noElement());
+      if (dart.notNull(this[_count$]) > 1) dart.throw(_internal.IterableElementError.tooMany());
       return this[_root].key;
     }
     contains(object) {
@@ -28888,9 +28891,9 @@
           retainSet.add(this[_root].key);
         }
       }
-      if (retainSet[_count] != this[_count]) {
+      if (retainSet[_count$] != this[_count$]) {
         this[_root] = retainSet[_root];
-        this[_count] = retainSet[_count];
+        this[_count$] = retainSet[_count$];
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       }
     }
@@ -28922,7 +28925,7 @@
     }
     [_clone]() {
       let set = new (SplayTreeSetOfE())(this[_comparator], this[_validKey]);
-      set[_count] = this[_count];
+      set[_count$] = this[_count$];
       set[_root] = this[_copyNode](this[_root]);
       return set;
     }
@@ -28935,7 +28938,7 @@
       return _;
     }
     clear() {
-      this[_clear]();
+      this[_clear$]();
     }
     toSet() {
       return this[_clone]();
@@ -28981,7 +28984,7 @@
 });
 collection.SplayTreeSet = SplayTreeSet();
 const _processed = Symbol('_processed');
-const _computeKeys = Symbol('_computeKeys');
+const _computeKeys$ = Symbol('_computeKeys');
 const _original = Symbol('_original');
 convert._convertJsonToDart = function(json, reviver) {
   dart.assert(reviver != null);
@@ -28998,7 +29001,7 @@
     }
     let map = new convert._JsonMap(e);
     let processed = map[_processed];
-    let keys = map[_computeKeys]();
+    let keys = map[_computeKeys$]();
     for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
       let key = keys[dartx._get](i);
       let revived = dart.dcall(reviver, key, walk(e[key]));
@@ -29007,7 +29010,7 @@
     map[_original] = processed;
     return map;
   }
-  dart.fn(walk, dynamicTodynamic());
+  dart.fn(walk, dynamicTodynamic$());
   return dart.dcall(reviver, null, walk(json));
 };
 dart.fn(convert._convertJsonToDart, dynamicAndFnTodynamic());
@@ -29025,11 +29028,11 @@
   }
   return object;
 };
-dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic());
+dart.fn(convert._convertJsonToDartLazy, dynamicTodynamic$());
 const _data = Symbol('_data');
 const _isUpgraded = Symbol('_isUpgraded');
 const _upgradedMap = Symbol('_upgradedMap');
-const _process = Symbol('_process');
+const _process$ = Symbol('_process');
 const _upgrade = Symbol('_upgrade');
 convert._JsonMap = class _JsonMap extends core.Object {
   new(original) {
@@ -29044,12 +29047,12 @@
       return null;
     } else {
       let result = convert._JsonMap._getProperty(this[_processed], core.String._check(key));
-      if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process](core.String._check(key));
+      if (dart.test(convert._JsonMap._isUnprocessed(result))) result = this[_process$](core.String._check(key));
       return result;
     }
   }
   get length() {
-    return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys]()[dartx.length];
+    return dart.test(this[_isUpgraded]) ? this[_upgradedMap][dartx.length] : this[_computeKeys$]()[dartx.length];
   }
   get isEmpty() {
     return this.length == 0;
@@ -29063,7 +29066,7 @@
   }
   get values() {
     if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.values];
-    return MappedIterableOfString$dynamic().new(this[_computeKeys](), dart.fn(each => this._get(each), dynamicTodynamic()));
+    return MappedIterableOfString$dynamic().new(this[_computeKeys$](), dart.fn(each => this._get(each), dynamicTodynamic$()));
   }
   _set(key, value) {
     if (dart.test(this[_isUpgraded])) {
@@ -29087,7 +29090,7 @@
   }
   containsValue(value) {
     if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.containsValue](value);
-    let keys = this[_computeKeys]();
+    let keys = this[_computeKeys$]();
     for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
       let key = keys[dartx._get](i);
       if (dart.equals(this._get(key), value)) return true;
@@ -29122,7 +29125,7 @@
   }
   forEach(f) {
     if (dart.test(this[_isUpgraded])) return this[_upgradedMap][dartx.forEach](f);
-    let keys = this[_computeKeys]();
+    let keys = this[_computeKeys$]();
     for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
       let key = keys[dartx._get](i);
       let value = convert._JsonMap._getProperty(this[_processed], key);
@@ -29146,7 +29149,7 @@
     dart.assert(this[_isUpgraded]);
     return this[_data];
   }
-  [_computeKeys]() {
+  [_computeKeys$]() {
     dart.assert(!dart.test(this[_isUpgraded]));
     let keys = core.List._check(this[_data]);
     if (keys == null) {
@@ -29157,7 +29160,7 @@
   [_upgrade]() {
     if (dart.test(this[_isUpgraded])) return this[_upgradedMap];
     let result = dart.map();
-    let keys = this[_computeKeys]();
+    let keys = this[_computeKeys$]();
     for (let i = 0; i < dart.notNull(keys[dartx.length]); i++) {
       let key = keys[dartx._get](i);
       result[dartx._set](key, this._get(key));
@@ -29172,7 +29175,7 @@
     dart.assert(this[_isUpgraded]);
     return result;
   }
-  [_process](key) {
+  [_process$](key) {
     if (!dart.test(convert._JsonMap._hasProperty(this[_original], key))) return null;
     let result = convert._convertJsonToDartLazy(convert._JsonMap._getProperty(this[_original], key));
     return convert._JsonMap._setProperty(this[_processed], key, result);
@@ -29223,9 +29226,9 @@
     remove: dart.definiteFunctionType(dart.dynamic, [core.Object]),
     clear: dart.definiteFunctionType(dart.void, []),
     forEach: dart.definiteFunctionType(dart.void, [dynamicAnddynamicTovoid()]),
-    [_computeKeys]: dart.definiteFunctionType(core.List$(core.String), []),
+    [_computeKeys$]: dart.definiteFunctionType(core.List$(core.String), []),
     [_upgrade]: dart.definiteFunctionType(core.Map, []),
-    [_process]: dart.definiteFunctionType(dart.dynamic, [core.String])
+    [_process$]: dart.definiteFunctionType(dart.dynamic, [core.String])
   }),
   statics: () => ({
     _hasProperty: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String]),
@@ -29263,10 +29266,10 @@
     return this[_parent].length;
   }
   elementAt(index) {
-    return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys]()[dartx._get](index));
+    return core.String._check(dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.elementAt](index) : this[_parent][_computeKeys$]()[dartx._get](index));
   }
   get iterator() {
-    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys]()[dartx.iterator];
+    return dart.test(this[_parent][_isUpgraded]) ? this[_parent].keys[dartx.iterator] : this[_parent][_computeKeys$]()[dartx.iterator];
   }
   contains(key) {
     return this[_parent].containsKey(key);
@@ -29280,7 +29283,7 @@
 });
 dart.defineExtensionMembers(convert._JsonMapKeyIterable, ['elementAt', 'contains', 'length', 'iterator']);
 const _reviver = Symbol('_reviver');
-const _sink = Symbol('_sink');
+const _sink$ = Symbol('_sink');
 const _stringSink = Symbol('_stringSink');
 convert.StringConversionSinkMixin = class StringConversionSinkMixin extends core.Object {
   add(str) {
@@ -29338,7 +29341,7 @@
 convert._JsonDecoderSink = class _JsonDecoderSink extends convert._StringSinkConversionSink {
   new(reviver, sink) {
     this[_reviver] = reviver;
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new(new core.StringBuffer());
   }
   close() {
@@ -29347,23 +29350,23 @@
     let accumulated = dart.toString(buffer);
     buffer.clear();
     let decoded = convert._parseJson(accumulated, this[_reviver]);
-    this[_sink].add(decoded);
-    this[_sink].close();
+    this[_sink$].add(decoded);
+    this[_sink$].close();
   }
 };
 dart.setSignature(convert._JsonDecoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._JsonDecoderSink, [convert._Reviver, SinkOfObject()])}),
   fields: () => ({
     [_reviver]: convert._Reviver,
-    [_sink]: SinkOfObject()
+    [_sink$]: SinkOfObject()
   })
 });
 const _allowInvalid = Symbol('_allowInvalid');
-let const;
-let const;
-let const;
-let const;
-let const;
+let const$25;
+let const$26;
+let const$27;
+let const$28;
+let const$29;
 convert.Codec$ = dart.generic((S, T) => {
   let _InvertedCodecOfT$S = () => (_InvertedCodecOfT$S = dart.constFn(convert._InvertedCodec$(T, S)))();
   class Codec extends core.Object {
@@ -29599,16 +29602,16 @@
     let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
     if (allowInvalid == null) allowInvalid = this[_allowInvalid];
     if (dart.test(allowInvalid)) {
-      return (const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
+      return (const$25 || (const$25 = dart.const(new convert.AsciiDecoder({allowInvalid: true})))).convert(bytes);
     } else {
-      return (const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
+      return (const$26 || (const$26 = dart.const(new convert.AsciiDecoder({allowInvalid: false})))).convert(bytes);
     }
   }
   get encoder() {
-    return const || (const = dart.const(new convert.AsciiEncoder()));
+    return const$27 || (const$27 = dart.const(new convert.AsciiEncoder()));
   }
   get decoder() {
-    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const || (const = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
+    return dart.test(this[_allowInvalid]) ? const$28 || (const$28 = dart.const(new convert.AsciiDecoder({allowInvalid: true}))) : const$29 || (const$29 = dart.const(new convert.AsciiDecoder({allowInvalid: false})));
   }
 };
 dart.setSignature(convert.AsciiCodec, {
@@ -29714,10 +29717,10 @@
 convert._UnicodeSubsetEncoderSink = class _UnicodeSubsetEncoderSink extends convert.StringConversionSinkBase {
   new(subsetMask, sink) {
     this[_subsetMask] = subsetMask;
-    this[_sink] = sink;
+    this[_sink$] = sink;
   }
   close() {
-    this[_sink].close();
+    this[_sink$].close();
   }
   addSlice(source, start, end, isLast) {
     core.RangeError.checkValidRange(start, end, source[dartx.length]);
@@ -29727,7 +29730,7 @@
         dart.throw(new core.ArgumentError(dart.str`Source contains invalid character with code point: ${codeUnit}.`));
       }
     }
-    this[_sink].add(source[dartx.codeUnits][dartx.sublist](start, end));
+    this[_sink$].add(source[dartx.codeUnits][dartx.sublist](start, end));
     if (dart.test(isLast)) {
       this.close();
     }
@@ -29736,7 +29739,7 @@
 dart.setSignature(convert._UnicodeSubsetEncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._UnicodeSubsetEncoderSink, [core.int, convert.ByteConversionSink])}),
   fields: () => ({
-    [_sink]: convert.ByteConversionSink,
+    [_sink$]: convert.ByteConversionSink,
     [_subsetMask]: core.int
   }),
   methods: () => ({
@@ -29816,7 +29819,7 @@
   constructors: () => ({new: dart.definiteFunctionType(convert.AsciiDecoder, [], {allowInvalid: core.bool})})
 });
 const _utf8Sink = Symbol('_utf8Sink');
-let const;
+let const$30;
 convert.ChunkedConversionSink$ = dart.generic(T => {
   let _SimpleCallbackSinkOfT = () => (_SimpleCallbackSinkOfT = dart.constFn(convert._SimpleCallbackSink$(T)))();
   let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
@@ -29887,7 +29890,7 @@
     for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
       if ((dart.notNull(source[dartx._get](i)) & ~convert._ASCII_MASK) != 0) {
         if (dart.notNull(i) > dart.notNull(start)) this[_utf8Sink].addSlice(source, start, i, false);
-        this[_utf8Sink].add(const || (const = dart.constList([239, 191, 189], core.int)));
+        this[_utf8Sink].add(const$30 || (const$30 = dart.constList([239, 191, 189], core.int)));
         start = dart.notNull(i) + 1;
       }
     }
@@ -29908,11 +29911,11 @@
 });
 convert._SimpleAsciiDecoderSink = class _SimpleAsciiDecoderSink extends convert.ByteConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new();
   }
   close() {
-    this[_sink].close();
+    this[_sink$].close();
   }
   add(source) {
     for (let i = 0; i < dart.notNull(source[dartx.length]); i++) {
@@ -29920,7 +29923,7 @@
         dart.throw(new core.FormatException("Source contains non-ASCII bytes."));
       }
     }
-    this[_sink].add(core.String.fromCharCodes(source));
+    this[_sink$].add(core.String.fromCharCodes(source));
   }
   addSlice(source, start, end, isLast) {
     let length = source[dartx.length];
@@ -29936,7 +29939,7 @@
 };
 dart.setSignature(convert._SimpleAsciiDecoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._SimpleAsciiDecoderSink, [core.Sink])}),
-  fields: () => ({[_sink]: core.Sink}),
+  fields: () => ({[_sink$]: core.Sink}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     add: dart.definiteFunctionType(dart.void, [ListOfint()])
@@ -29978,24 +29981,24 @@
     startChunkedConversion: dart.definiteFunctionType(convert.ByteConversionSink, [SinkOfString()])
   })
 });
-let const;
+let const$31;
 const _encoder = Symbol('_encoder');
-let const;
-let const;
+let const$32;
+let const$33;
 convert.Base64Codec = class Base64Codec extends convert.Codec$(core.List$(core.int), core.String) {
   new() {
-    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder()));
+    this[_encoder] = const$31 || (const$31 = dart.const(new convert.Base64Encoder()));
     super.new();
   }
   urlSafe() {
-    this[_encoder] = const || (const = dart.const(new convert.Base64Encoder.urlSafe()));
+    this[_encoder] = const$32 || (const$32 = dart.const(new convert.Base64Encoder.urlSafe()));
     super.new();
   }
   get encoder() {
     return this[_encoder];
   }
   get decoder() {
-    return const || (const = dart.const(new convert.Base64Decoder()));
+    return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
   }
 };
 dart.addSimpleTypeTests(convert.Base64Codec);
@@ -30015,11 +30018,11 @@
 convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
 convert._paddingChar = 61;
 const _alphabet = Symbol('_alphabet');
-const _state = Symbol('_state');
+const _state$0 = Symbol('_state');
 convert._Base64Encoder = class _Base64Encoder extends core.Object {
   new(urlSafe) {
     this[_alphabet] = dart.test(urlSafe) ? convert._Base64Encoder._base64urlAlphabet : convert._Base64Encoder._base64Alphabet;
-    this[_state] = 0;
+    this[_state$0] = 0;
   }
   static _encodeState(count, bits) {
     dart.assert(dart.notNull(count) <= convert._Base64Encoder._countMask);
@@ -30039,7 +30042,7 @@
     dart.assert(dart.notNull(start) <= dart.notNull(end));
     dart.assert(bytes == null || dart.notNull(end) <= dart.notNull(bytes[dartx.length]));
     let length = dart.notNull(end) - dart.notNull(start);
-    let count = convert._Base64Encoder._stateCount(this[_state]);
+    let count = convert._Base64Encoder._stateCount(this[_state$0]);
     let byteCount = dart.notNull(count) + length;
     let fullChunks = (byteCount / 3)[dartx.truncate]();
     let partialChunkLength = byteCount - fullChunks * 3;
@@ -30048,7 +30051,7 @@
       bufferLength = bufferLength + 4;
     }
     let output = this.createBuffer(bufferLength);
-    this[_state] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state]);
+    this[_state$0] = convert._Base64Encoder.encodeChunk(this[_alphabet], bytes, start, end, isLast, output, 0, this[_state$0]);
     if (bufferLength > 0) return output;
     return null;
   }
@@ -30152,7 +30155,7 @@
 dart.setSignature(convert._Base64Encoder, {
   constructors: () => ({new: dart.definiteFunctionType(convert._Base64Encoder, [core.bool])}),
   fields: () => ({
-    [_state]: core.int,
+    [_state$0]: core.int,
     [_alphabet]: core.String
   }),
   methods: () => ({
@@ -30196,21 +30199,21 @@
   constructors: () => ({new: dart.definiteFunctionType(convert._BufferCachingBase64Encoder, [core.bool])}),
   fields: () => ({bufferCache: typed_data.Uint8List})
 });
-const _add = Symbol('_add');
+const _add$1 = Symbol('_add');
 convert._Base64EncoderSink = class _Base64EncoderSink extends convert.ByteConversionSinkBase {
   new() {
     super.new();
   }
   add(source) {
-    this[_add](source, 0, source[dartx.length], false);
+    this[_add$1](source, 0, source[dartx.length], false);
   }
   close() {
-    this[_add](null, 0, 0, true);
+    this[_add$1](null, 0, 0, true);
   }
   addSlice(source, start, end, isLast) {
     if (end == null) dart.throw(new core.ArgumentError.notNull("end"));
     core.RangeError.checkValidRange(start, end, source[dartx.length]);
-    this[_add](source, start, end, isLast);
+    this[_add$1](source, start, end, isLast);
   }
 };
 dart.setSignature(convert._Base64EncoderSink, {
@@ -30221,49 +30224,49 @@
 });
 convert._AsciiBase64EncoderSink = class _AsciiBase64EncoderSink extends convert._Base64EncoderSink {
   new(sink, urlSafe) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_encoder] = new convert._BufferCachingBase64Encoder(urlSafe);
     super.new();
   }
-  [_add](source, start, end, isLast) {
+  [_add$1](source, start, end, isLast) {
     let buffer = this[_encoder].encode(source, start, end, isLast);
     if (buffer != null) {
       let string = core.String.fromCharCodes(buffer);
-      this[_sink].add(string);
+      this[_sink$].add(string);
     }
     if (dart.test(isLast)) {
-      this[_sink].close();
+      this[_sink$].close();
     }
   }
 };
 dart.setSignature(convert._AsciiBase64EncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._AsciiBase64EncoderSink, [SinkOfString(), core.bool])}),
   fields: () => ({
-    [_sink]: SinkOfString(),
+    [_sink$]: SinkOfString(),
     [_encoder]: convert._Base64Encoder
   }),
-  methods: () => ({[_add]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
+  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
 });
 convert._Utf8Base64EncoderSink = class _Utf8Base64EncoderSink extends convert._Base64EncoderSink {
   new(sink, urlSafe) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_encoder] = new convert._Base64Encoder(urlSafe);
     super.new();
   }
-  [_add](source, start, end, isLast) {
+  [_add$1](source, start, end, isLast) {
     let buffer = this[_encoder].encode(source, start, end, isLast);
     if (buffer != null) {
-      this[_sink].addSlice(buffer, 0, buffer[dartx.length], isLast);
+      this[_sink$].addSlice(buffer, 0, buffer[dartx.length], isLast);
     }
   }
 };
 dart.setSignature(convert._Utf8Base64EncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._Utf8Base64EncoderSink, [convert.ByteConversionSink, core.bool])}),
   fields: () => ({
-    [_sink]: convert.ByteConversionSink,
+    [_sink$]: convert.ByteConversionSink,
     [_encoder]: convert._Base64Encoder
   }),
-  methods: () => ({[_add]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
+  methods: () => ({[_add$1]: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool])})
 });
 convert.Base64Decoder = class Base64Decoder extends convert.Converter$(core.String, core.List$(core.int)) {
   new() {
@@ -30293,7 +30296,7 @@
 });
 convert._Base64Decoder = class _Base64Decoder extends core.Object {
   new() {
-    this[_state] = 0;
+    this[_state$0] = 0;
   }
   static _encodeCharacterState(count, bits) {
     dart.assert(count == (dart.notNull(count) & convert._Base64Decoder._countMask));
@@ -30323,23 +30326,23 @@
     dart.assert(0 <= dart.notNull(start));
     dart.assert(dart.notNull(start) <= dart.notNull(end));
     dart.assert(dart.notNull(end) <= dart.notNull(input[dartx.length]));
-    if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state]))) {
-      this[_state] = convert._Base64Decoder._checkPadding(input, start, end, this[_state]);
+    if (dart.test(convert._Base64Decoder._hasSeenPadding(this[_state$0]))) {
+      this[_state$0] = convert._Base64Decoder._checkPadding(input, start, end, this[_state$0]);
       return null;
     }
     if (start == end) return typed_data.Uint8List.new(0);
-    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state]);
-    this[_state] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state]);
+    let buffer = convert._Base64Decoder._allocateBuffer(input, start, end, this[_state$0]);
+    this[_state$0] = convert._Base64Decoder.decodeChunk(input, start, end, buffer, 0, this[_state$0]);
     return buffer;
   }
   close(input, end) {
-    if (dart.notNull(this[_state]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
+    if (dart.notNull(this[_state$0]) < dart.notNull(convert._Base64Decoder._encodePaddingState(0))) {
       dart.throw(new core.FormatException("Missing padding character", input, end));
     }
-    if (dart.notNull(this[_state]) > 0) {
+    if (dart.notNull(this[_state$0]) > 0) {
       dart.throw(new core.FormatException("Invalid length, must be multiple of four", input, end));
     }
-    this[_state] = convert._Base64Decoder._encodePaddingState(0);
+    this[_state$0] = convert._Base64Decoder._encodePaddingState(0);
   }
   static decodeChunk(input, start, end, output, outIndex, state) {
     dart.assert(!dart.test(convert._Base64Decoder._hasSeenPadding(state)));
@@ -30511,7 +30514,7 @@
   }
 };
 dart.setSignature(convert._Base64Decoder, {
-  fields: () => ({[_state]: core.int}),
+  fields: () => ({[_state$0]: core.int}),
   methods: () => ({
     decode: dart.definiteFunctionType(typed_data.Uint8List, [core.String, core.int, core.int]),
     close: dart.definiteFunctionType(dart.void, [core.String, core.int])
@@ -30564,32 +30567,32 @@
 convert._Base64DecoderSink = class _Base64DecoderSink extends convert.StringConversionSinkBase {
   new(sink) {
     this[_decoder] = new convert._Base64Decoder();
-    this[_sink] = sink;
+    this[_sink$] = sink;
   }
   add(string) {
     if (dart.test(string[dartx.isEmpty])) return;
     let buffer = this[_decoder].decode(string, 0, string[dartx.length]);
-    if (buffer != null) this[_sink].add(buffer);
+    if (buffer != null) this[_sink$].add(buffer);
   }
   close() {
     this[_decoder].close(null, null);
-    this[_sink].close();
+    this[_sink$].close();
   }
   addSlice(string, start, end, isLast) {
     end = core.RangeError.checkValidRange(start, end, string[dartx.length]);
     if (start == end) return;
     let buffer = this[_decoder].decode(string, start, end);
-    if (buffer != null) this[_sink].add(buffer);
+    if (buffer != null) this[_sink$].add(buffer);
     if (dart.test(isLast)) {
       this[_decoder].close(string, end);
-      this[_sink].close();
+      this[_sink$].close();
     }
   }
 };
 dart.setSignature(convert._Base64DecoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._Base64DecoderSink, [SinkOfListOfint()])}),
   fields: () => ({
-    [_sink]: SinkOfListOfint(),
+    [_sink$]: SinkOfListOfint(),
     [_decoder]: convert._Base64Decoder
   }),
   methods: () => ({
@@ -30599,19 +30602,19 @@
 });
 convert._ByteAdapterSink = class _ByteAdapterSink extends convert.ByteConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new();
   }
   add(chunk) {
-    this[_sink].add(chunk);
+    this[_sink$].add(chunk);
   }
   close() {
-    this[_sink].close();
+    this[_sink$].close();
   }
 };
 dart.setSignature(convert._ByteAdapterSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._ByteAdapterSink, [SinkOfListOfint()])}),
-  fields: () => ({[_sink]: SinkOfListOfint()}),
+  fields: () => ({[_sink$]: SinkOfListOfint()}),
   methods: () => ({
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     close: dart.definiteFunctionType(dart.void, [])
@@ -30774,19 +30777,19 @@
 });
 convert._ConverterStreamEventSink = _ConverterStreamEventSink();
 const _second = Symbol('_second');
-const _first = Symbol('_first');
+const _first$0 = Symbol('_first');
 convert._FusedCodec$ = dart.generic((S, M, T) => {
   let CodecOfS$M = () => (CodecOfS$M = dart.constFn(convert.Codec$(S, M)))();
   let CodecOfM$T = () => (CodecOfM$T = dart.constFn(convert.Codec$(M, T)))();
   class _FusedCodec extends convert.Codec$(S, T) {
     get encoder() {
-      return this[_first].encoder.fuse(T)(this[_second].encoder);
+      return this[_first$0].encoder.fuse(T)(this[_second].encoder);
     }
     get decoder() {
-      return this[_second].decoder.fuse(S)(this[_first].decoder);
+      return this[_second].decoder.fuse(S)(this[_first$0].decoder);
     }
     new(first, second) {
-      this[_first] = first;
+      this[_first$0] = first;
       this[_second] = second;
       super.new();
     }
@@ -30794,7 +30797,7 @@
   dart.setSignature(_FusedCodec, {
     constructors: () => ({new: dart.definiteFunctionType(convert._FusedCodec$(S, M, T), [CodecOfS$M(), CodecOfM$T()])}),
     fields: () => ({
-      [_first]: CodecOfS$M(),
+      [_first$0]: CodecOfS$M(),
       [_second]: CodecOfM$T()
     }),
     getters: () => ({
@@ -30840,23 +30843,23 @@
   let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
   class _FusedConverter extends convert.Converter$(S, T) {
     new(first, second) {
-      this[_first] = first;
+      this[_first$0] = first;
       this[_second] = second;
       super.new();
     }
     convert(input) {
       S._check(input);
-      return this[_second].convert(this[_first].convert(input));
+      return this[_second].convert(this[_first$0].convert(input));
     }
     startChunkedConversion(sink) {
       SinkOfT()._check(sink);
-      return this[_first].startChunkedConversion(this[_second].startChunkedConversion(sink));
+      return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
     }
   }
   dart.setSignature(_FusedConverter, {
     constructors: () => ({new: dart.definiteFunctionType(convert._FusedConverter$(S, M, T), [ConverterOfS$M(), ConverterOfM$T()])}),
     fields: () => ({
-      [_first]: ConverterOfS$M(),
+      [_first$0]: ConverterOfS$M(),
       [_second]: ConverterOfM$T()
     }),
     methods: () => ({convert: dart.definiteFunctionType(T, [S])})
@@ -30864,18 +30867,18 @@
   return _FusedConverter;
 });
 convert._FusedConverter = _FusedConverter();
-const _name = Symbol('_name');
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
+const _name$1 = Symbol('_name');
+let const$34;
+let const$35;
+let const$36;
+let const$37;
+let const$38;
+let const$39;
+let const$40;
+let const$41;
 convert.HtmlEscapeMode = class HtmlEscapeMode extends core.Object {
   _(name, escapeLtGt, escapeQuot, escapeApos, escapeSlash) {
-    this[_name] = name;
+    this[_name$1] = name;
     this.escapeLtGt = escapeLtGt;
     this.escapeQuot = escapeQuot;
     this.escapeApos = escapeApos;
@@ -30891,10 +30894,10 @@
     this.escapeQuot = escapeQuot;
     this.escapeApos = escapeApos;
     this.escapeSlash = escapeSlash;
-    this[_name] = name;
+    this[_name$1] = name;
   }
   toString() {
-    return this[_name];
+    return this[_name$1];
   }
 };
 dart.defineNamedConstructor(convert.HtmlEscapeMode, '_');
@@ -30904,7 +30907,7 @@
     new: dart.definiteFunctionType(convert.HtmlEscapeMode, [], {name: core.String, escapeLtGt: core.bool, escapeQuot: core.bool, escapeApos: core.bool, escapeSlash: core.bool})
   }),
   fields: () => ({
-    [_name]: core.String,
+    [_name$1]: core.String,
     escapeLtGt: core.bool,
     escapeQuot: core.bool,
     escapeApos: core.bool,
@@ -30919,16 +30922,16 @@
 });
 dart.defineLazy(convert.HtmlEscapeMode, {
   get UNKNOWN() {
-    return const || (const = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
+    return const$38 || (const$38 = dart.const(new convert.HtmlEscapeMode._('unknown', true, true, true, true)));
   },
   get ATTRIBUTE() {
-    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
+    return const$39 || (const$39 = dart.const(new convert.HtmlEscapeMode._('attribute', true, true, false, false)));
   },
   get SQ_ATTRIBUTE() {
-    return const || (const = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
+    return const$40 || (const$40 = dart.const(new convert.HtmlEscapeMode._('attribute', true, false, true, false)));
   },
   get ELEMENT() {
-    return const || (const = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
+    return const$41 || (const$41 = dart.const(new convert.HtmlEscapeMode._('element', true, false, false, false)));
   }
 });
 const _convert = Symbol('_convert');
@@ -31012,26 +31015,26 @@
 convert._HtmlEscapeSink = class _HtmlEscapeSink extends convert.StringConversionSinkBase {
   new(escape, sink) {
     this[_escape] = escape;
-    this[_sink] = sink;
+    this[_sink$] = sink;
   }
   addSlice(chunk, start, end, isLast) {
     let val = this[_escape][_convert](chunk, start, end);
     if (val == null) {
-      this[_sink].addSlice(chunk, start, end, isLast);
+      this[_sink$].addSlice(chunk, start, end, isLast);
     } else {
-      this[_sink].add(val);
-      if (dart.test(isLast)) this[_sink].close();
+      this[_sink$].add(val);
+      if (dart.test(isLast)) this[_sink$].close();
     }
   }
   close() {
-    this[_sink].close();
+    this[_sink$].close();
   }
 };
 dart.setSignature(convert._HtmlEscapeSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._HtmlEscapeSink, [convert.HtmlEscape, convert.StringConversionSink])}),
   fields: () => ({
     [_escape]: convert.HtmlEscape,
-    [_sink]: convert.StringConversionSink
+    [_sink$]: convert.StringConversionSink
   }),
   methods: () => ({
     addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
@@ -31072,8 +31075,8 @@
   constructors: () => ({new: dart.definiteFunctionType(convert.JsonCyclicError, [core.Object])})
 });
 const _toEncodable = Symbol('_toEncodable');
-let const;
-let const;
+let const$42;
+let const$43;
 convert.JsonCodec = class JsonCodec extends convert.Codec$(core.Object, core.String) {
   new(opts) {
     let reviver = opts && 'reviver' in opts ? opts.reviver : null;
@@ -31098,11 +31101,11 @@
     return new convert.JsonEncoder(toEncodable).convert(value);
   }
   get encoder() {
-    if (this[_toEncodable] == null) return const || (const = dart.const(new convert.JsonEncoder()));
+    if (this[_toEncodable] == null) return const$42 || (const$42 = dart.const(new convert.JsonEncoder()));
     return new convert.JsonEncoder(this[_toEncodable]);
   }
   get decoder() {
-    if (this[_reviver] == null) return const || (const = dart.const(new convert.JsonDecoder()));
+    if (this[_reviver] == null) return const$43 || (const$43 = dart.const(new convert.JsonDecoder()));
     return new convert.JsonDecoder(this[_reviver]);
   }
 };
@@ -31149,7 +31152,7 @@
     if (!convert.StringConversionSink.is(sink)) {
       sink = convert.StringConversionSink.from(sink);
     } else if (convert._Utf8EncoderSink.is(sink)) {
-      return new convert._JsonUtf8EncoderSink(sink[_sink], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
+      return new convert._JsonUtf8EncoderSink(sink[_sink$], this[_toEncodable], convert.JsonUtf8Encoder._utf8Encode(this.indent), convert.JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
     }
     return new convert._JsonEncoderSink(convert.StringConversionSink._check(sink), this[_toEncodable], this.indent);
   }
@@ -31213,7 +31216,7 @@
       }
       bytes[dartx.add](chunk);
     }
-    dart.fn(addChunk, Uint8ListAndintAndintTovoid());
+    dart.fn(addChunk, Uint8ListAndintAndintTovoid$());
     convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], addChunk);
     if (bytes[dartx.length] == 1) return bytes[dartx._get](0);
     let length = 0;
@@ -31262,7 +31265,7 @@
 const _isDone = Symbol('_isDone');
 convert._JsonEncoderSink = class _JsonEncoderSink extends convert.ChunkedConversionSink$(core.Object) {
   new(sink, toEncodable, indent) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_toEncodable] = toEncodable;
     this[_indent] = indent;
     this[_isDone] = false;
@@ -31273,7 +31276,7 @@
       dart.throw(new core.StateError("Only one call to add allowed"));
     }
     this[_isDone] = true;
-    let stringSink = this[_sink].asStringSink();
+    let stringSink = this[_sink$].asStringSink();
     convert._JsonStringStringifier.printOn(o, stringSink, this[_toEncodable], this[_indent]);
     stringSink.close();
   }
@@ -31285,7 +31288,7 @@
   fields: () => ({
     [_indent]: core.String,
     [_toEncodable]: convert._ToEncodable,
-    [_sink]: convert.StringConversionSink,
+    [_sink$]: convert.StringConversionSink,
     [_isDone]: core.bool
   }),
   methods: () => ({
@@ -31296,7 +31299,7 @@
 const _addChunk = Symbol('_addChunk');
 convert._JsonUtf8EncoderSink = class _JsonUtf8EncoderSink extends convert.ChunkedConversionSink$(core.Object) {
   new(sink, toEncodable, indent, bufferSize) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_toEncodable] = toEncodable;
     this[_indent] = indent;
     this[_bufferSize] = bufferSize;
@@ -31304,7 +31307,7 @@
     super.new();
   }
   [_addChunk](chunk, start, end) {
-    this[_sink].addSlice(chunk, start, end, false);
+    this[_sink$].addSlice(chunk, start, end, false);
   }
   add(object) {
     if (dart.test(this[_isDone])) {
@@ -31312,12 +31315,12 @@
     }
     this[_isDone] = true;
     convert._JsonUtf8Stringifier.stringify(object, this[_indent], this[_toEncodable], this[_bufferSize], dart.bind(this, _addChunk));
-    this[_sink].close();
+    this[_sink$].close();
   }
   close() {
     if (!dart.test(this[_isDone])) {
       this[_isDone] = true;
-      this[_sink].close();
+      this[_sink$].close();
     }
   }
 };
@@ -31325,7 +31328,7 @@
 dart.setSignature(convert._JsonUtf8EncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._JsonUtf8EncoderSink, [convert.ByteConversionSink, convert._ToEncodable, ListOfint(), core.int])}),
   fields: () => ({
-    [_sink]: convert.ByteConversionSink,
+    [_sink$]: convert.ByteConversionSink,
     [_indent]: ListOfint(),
     [_toEncodable]: convert._ToEncodable,
     [_bufferSize]: core.int,
@@ -31381,7 +31384,7 @@
 convert._defaultToEncodable = function(object) {
   return dart.dsend(object, 'toJson');
 };
-dart.fn(convert._defaultToEncodable, dynamicTodynamic());
+dart.fn(convert._defaultToEncodable, dynamicTodynamic$());
 const _seen = Symbol('_seen');
 const _checkCycle = Symbol('_checkCycle');
 const _removeSeen = Symbol('_removeSeen');
@@ -31672,7 +31675,7 @@
 });
 convert._JsonStringStringifier = class _JsonStringStringifier extends convert._JsonStringifier {
   new(sink, _toEncodable) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new(dynamicTodynamic()._check(_toEncodable));
   }
   static stringify(object, toEncodable, indent) {
@@ -31690,21 +31693,21 @@
     dart.dsend(stringifier, 'writeObject', object);
   }
   writeNumber(number) {
-    this[_sink].write(dart.toString(number));
+    this[_sink$].write(dart.toString(number));
   }
   writeString(string) {
-    this[_sink].write(string);
+    this[_sink$].write(string);
   }
   writeStringSlice(string, start, end) {
-    this[_sink].write(string[dartx.substring](start, end));
+    this[_sink$].write(string[dartx.substring](start, end));
   }
   writeCharCode(charCode) {
-    this[_sink].writeCharCode(charCode);
+    this[_sink$].writeCharCode(charCode);
   }
 };
 dart.setSignature(convert._JsonStringStringifier, {
   constructors: () => ({new: dart.definiteFunctionType(convert._JsonStringStringifier, [core.StringSink, dart.dynamic])}),
-  fields: () => ({[_sink]: core.StringSink}),
+  fields: () => ({[_sink$]: core.StringSink}),
   methods: () => ({
     writeNumber: dart.definiteFunctionType(dart.void, [core.num]),
     writeString: dart.definiteFunctionType(dart.void, [core.String]),
@@ -31889,11 +31892,11 @@
   fields: () => ({indent: ListOfint()}),
   methods: () => ({writeIndentation: dart.definiteFunctionType(dart.void, [core.int])})
 });
-let const;
-let const;
-let const;
-let const;
-let const;
+let const$44;
+let const$45;
+let const$46;
+let const$47;
+let const$48;
 convert.Latin1Codec = class Latin1Codec extends convert.Encoding {
   new(opts) {
     let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : false;
@@ -31907,16 +31910,16 @@
     let allowInvalid = opts && 'allowInvalid' in opts ? opts.allowInvalid : null;
     if (allowInvalid == null) allowInvalid = this[_allowInvalid];
     if (dart.test(allowInvalid)) {
-      return (const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
+      return (const$44 || (const$44 = dart.const(new convert.Latin1Decoder({allowInvalid: true})))).convert(bytes);
     } else {
-      return (const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
+      return (const$45 || (const$45 = dart.const(new convert.Latin1Decoder({allowInvalid: false})))).convert(bytes);
     }
   }
   get encoder() {
-    return const || (const = dart.const(new convert.Latin1Encoder()));
+    return const$46 || (const$46 = dart.const(new convert.Latin1Encoder()));
   }
   get decoder() {
-    return dart.test(this[_allowInvalid]) ? const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const || (const = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
+    return dart.test(this[_allowInvalid]) ? const$47 || (const$47 = dart.const(new convert.Latin1Decoder({allowInvalid: true}))) : const$48 || (const$48 = dart.const(new convert.Latin1Decoder({allowInvalid: false})));
   }
 };
 dart.setSignature(convert.Latin1Codec, {
@@ -31961,18 +31964,18 @@
 const _addSliceToSink = Symbol('_addSliceToSink');
 convert._Latin1DecoderSink = class _Latin1DecoderSink extends convert.ByteConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new();
   }
   close() {
-    this[_sink].close();
-    this[_sink] = null;
+    this[_sink$].close();
+    this[_sink$] = null;
   }
   add(source) {
     this.addSlice(source, 0, source[dartx.length], false);
   }
   [_addSliceToSink](source, start, end, isLast) {
-    this[_sink].add(core.String.fromCharCodes(source, start, end));
+    this[_sink$].add(core.String.fromCharCodes(source, start, end));
     if (dart.test(isLast)) this.close();
   }
   addSlice(source, start, end, isLast) {
@@ -32005,7 +32008,7 @@
 };
 dart.setSignature(convert._Latin1DecoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._Latin1DecoderSink, [convert.StringConversionSink])}),
-  fields: () => ({[_sink]: convert.StringConversionSink}),
+  fields: () => ({[_sink$]: convert.StringConversionSink}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
@@ -32017,7 +32020,7 @@
   }),
   names: ['_checkValidLatin1', '_reportInvalidLatin1']
 });
-let const;
+let const$49;
 convert._Latin1AllowInvalidDecoderSink = class _Latin1AllowInvalidDecoderSink extends convert._Latin1DecoderSink {
   new(sink) {
     super.new(sink);
@@ -32028,7 +32031,7 @@
       let char = source[dartx._get](i);
       if (dart.notNull(char) > convert._LATIN1_MASK || dart.notNull(char) < 0) {
         if (dart.notNull(i) > dart.notNull(start)) this[_addSliceToSink](source, start, i, false);
-        this[_addSliceToSink](const || (const = dart.constList([65533], core.int)), 0, 1, false);
+        this[_addSliceToSink](const$49 || (const$49 = dart.constList([65533], core.int)), 0, 1, false);
         start = dart.notNull(i) + 1;
       }
     }
@@ -32122,7 +32125,7 @@
 const _addLines = Symbol('_addLines');
 convert._LineSplitterSink = class _LineSplitterSink extends convert.StringConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_carry] = null;
     this[_skipLeadingLF] = false;
   }
@@ -32149,10 +32152,10 @@
   }
   close() {
     if (this[_carry] != null) {
-      this[_sink].add(this[_carry]);
+      this[_sink$].add(this[_carry]);
       this[_carry] = null;
     }
-    this[_sink].close();
+    this[_sink$].close();
   }
   [_addLines](lines, start, end) {
     let sliceStart = start;
@@ -32167,7 +32170,7 @@
           continue;
         }
       }
-      this[_sink].add(lines[dartx.substring](sliceStart, i));
+      this[_sink$].add(lines[dartx.substring](sliceStart, i));
       sliceStart = dart.notNull(i) + 1;
     }
     if (dart.notNull(sliceStart) < dart.notNull(end)) {
@@ -32180,7 +32183,7 @@
 dart.setSignature(convert._LineSplitterSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._LineSplitterSink, [convert.StringConversionSink])}),
   fields: () => ({
-    [_sink]: convert.StringConversionSink,
+    [_sink$]: convert.StringConversionSink,
     [_carry]: core.String,
     [_skipLeadingLF]: core.bool
   }),
@@ -32241,25 +32244,25 @@
 convert._StringSinkCloseCallback = dart.typedef('_StringSinkCloseCallback', () => dart.functionType(dart.void, []));
 convert._ClosableStringSink = class _ClosableStringSink extends core.Object {
   new(sink, callback) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_callback] = callback;
   }
   close() {
     this[_callback]();
   }
   writeCharCode(charCode) {
-    this[_sink].writeCharCode(charCode);
+    this[_sink$].writeCharCode(charCode);
   }
   write(o) {
-    this[_sink].write(o);
+    this[_sink$].write(o);
   }
   writeln(o) {
     if (o === void 0) o = "";
-    this[_sink].writeln(o);
+    this[_sink$].writeln(o);
   }
   writeAll(objects, separator) {
     if (separator === void 0) separator = "";
-    this[_sink].writeAll(objects, separator);
+    this[_sink$].writeAll(objects, separator);
   }
 };
 convert._ClosableStringSink[dart.implements] = () => [convert.ClosableStringSink];
@@ -32267,7 +32270,7 @@
   constructors: () => ({new: dart.definiteFunctionType(convert._ClosableStringSink, [core.StringSink, convert._StringSinkCloseCallback])}),
   fields: () => ({
     [_callback]: convert._StringSinkCloseCallback,
-    [_sink]: core.StringSink
+    [_sink$]: core.StringSink
   }),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
@@ -32362,10 +32365,10 @@
 });
 convert._StringAdapterSink = class _StringAdapterSink extends convert.StringConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
   }
   add(str) {
-    this[_sink].add(str);
+    this[_sink$].add(str);
   }
   addSlice(str, start, end, isLast) {
     if (start == 0 && end == str[dartx.length]) {
@@ -32376,12 +32379,12 @@
     if (dart.test(isLast)) this.close();
   }
   close() {
-    this[_sink].close();
+    this[_sink$].close();
   }
 };
 dart.setSignature(convert._StringAdapterSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._StringAdapterSink, [SinkOfString()])}),
-  fields: () => ({[_sink]: SinkOfString()}),
+  fields: () => ({[_sink$]: SinkOfString()}),
   methods: () => ({
     addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool]),
     close: dart.definiteFunctionType(dart.void, [])
@@ -32389,13 +32392,13 @@
 });
 convert._Utf8StringSinkAdapter = class _Utf8StringSinkAdapter extends convert.ByteConversionSink {
   new(sink, stringSink, allowMalformed) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     this[_decoder] = new convert._Utf8Decoder(stringSink, allowMalformed);
     super.new();
   }
   close() {
     this[_decoder].close();
-    if (this[_sink] != null) this[_sink].close();
+    if (this[_sink$] != null) this[_sink$].close();
   }
   add(chunk) {
     this.addSlice(chunk, 0, chunk[dartx.length], false);
@@ -32409,7 +32412,7 @@
   constructors: () => ({new: dart.definiteFunctionType(convert._Utf8StringSinkAdapter, [core.Sink, core.StringSink, core.bool])}),
   fields: () => ({
     [_decoder]: convert._Utf8Decoder,
-    [_sink]: core.Sink
+    [_sink$]: core.Sink
   }),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
@@ -32471,7 +32474,7 @@
 convert.UNICODE_REPLACEMENT_CHARACTER_RUNE = 65533;
 convert.UNICODE_BOM_CHARACTER_RUNE = 65279;
 const _allowMalformed = Symbol('_allowMalformed');
-let const;
+let const$50;
 convert.Utf8Codec = class Utf8Codec extends convert.Encoding {
   new(opts) {
     let allowMalformed = opts && 'allowMalformed' in opts ? opts.allowMalformed : false;
@@ -32487,7 +32490,7 @@
     return new convert.Utf8Decoder({allowMalformed: allowMalformed}).convert(codeUnits);
   }
   get encoder() {
-    return const || (const = dart.const(new convert.Utf8Encoder()));
+    return const$50 || (const$50 = dart.const(new convert.Utf8Encoder()));
   }
   get decoder() {
     return new convert.Utf8Decoder({allowMalformed: this[_allowMalformed]});
@@ -32685,7 +32688,7 @@
 convert._Utf8Encoder._DEFAULT_BYTE_BUFFER_SIZE = 1024;
 convert._Utf8EncoderSink = class _Utf8EncoderSink extends dart.mixin(convert._Utf8Encoder, convert.StringConversionSinkMixin) {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$] = sink;
     super.new();
   }
   close() {
@@ -32693,7 +32696,7 @@
       this.addSlice("", 0, 0, true);
       return;
     }
-    this[_sink].close();
+    this[_sink$].close();
   }
   addSlice(str, start, end, isLast) {
     this[_bufferIndex] = 0;
@@ -32726,7 +32729,7 @@
         }
         start = dart.notNull(start) + 1;
       }
-      this[_sink].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
+      this[_sink$].addSlice(this[_buffer], 0, this[_bufferIndex], isLastSlice);
       this[_bufferIndex] = 0;
     } while (dart.notNull(start) < dart.notNull(end));
     if (dart.test(isLast)) this.close();
@@ -32734,7 +32737,7 @@
 };
 dart.setSignature(convert._Utf8EncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(convert._Utf8EncoderSink, [convert.ByteConversionSink])}),
-  fields: () => ({[_sink]: convert.ByteConversionSink}),
+  fields: () => ({[_sink$]: convert.ByteConversionSink}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
@@ -33065,7 +33068,7 @@
   return Comparable;
 });
 core.Comparable = Comparable();
-const _value = Symbol('_value');
+const _value$ = Symbol('_value');
 core.DateTime = class DateTime extends core.Object {
   new(year, month, day, hour, minute, second, millisecond, microsecond) {
     if (month === void 0) month = 1;
@@ -33098,7 +33101,7 @@
         if (matched == null) return 0;
         return core.int.parse(matched);
       }
-      dart.fn(parseIntOrZero, StringToint());
+      dart.fn(parseIntOrZero, StringToint$());
       function parseMilliAndMicroseconds(matched) {
         if (matched == null) return 0;
         let length = matched[dartx.length];
@@ -33113,7 +33116,7 @@
         }
         return result;
       }
-      dart.fn(parseMilliAndMicroseconds, StringToint());
+      dart.fn(parseMilliAndMicroseconds, StringToint$());
       let years = core.int.parse(match._get(1));
       let month = core.int.parse(match._get(2));
       let day = core.int.parse(match._get(3));
@@ -33154,7 +33157,7 @@
   }
   _withValue(value, opts) {
     let isUtc = opts && 'isUtc' in opts ? opts.isUtc : null;
-    this[_value] = value;
+    this[_value$] = value;
     this.isUtc = isUtc;
     if (dart.notNull(this.millisecondsSinceEpoch[dartx.abs]()) > core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH || this.millisecondsSinceEpoch[dartx.abs]() == core.DateTime._MAX_MILLISECONDS_SINCE_EPOCH && this.microsecond != 0) {
       dart.throw(new core.ArgumentError(this.millisecondsSinceEpoch));
@@ -33163,32 +33166,32 @@
   }
   ['=='](other) {
     if (!core.DateTime.is(other)) return false;
-    return dart.equals(this[_value], dart.dload(other, _value)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
+    return dart.equals(this[_value$], dart.dload(other, _value$)) && dart.equals(this.isUtc, dart.dload(other, 'isUtc'));
   }
   isBefore(other) {
-    return dart.notNull(this[_value]) < dart.notNull(other[_value]);
+    return dart.notNull(this[_value$]) < dart.notNull(other[_value$]);
   }
   isAfter(other) {
-    return dart.notNull(this[_value]) > dart.notNull(other[_value]);
+    return dart.notNull(this[_value$]) > dart.notNull(other[_value$]);
   }
   isAtSameMomentAs(other) {
-    return this[_value] == other[_value];
+    return this[_value$] == other[_value$];
   }
   compareTo(other) {
-    return this[_value][dartx.compareTo](other[_value]);
+    return this[_value$][dartx.compareTo](other[_value$]);
   }
   get hashCode() {
-    return (dart.notNull(this[_value]) ^ this[_value][dartx['>>']](30)) & 1073741823;
+    return (dart.notNull(this[_value$]) ^ this[_value$][dartx['>>']](30)) & 1073741823;
   }
   toLocal() {
     if (dart.test(this.isUtc)) {
-      return new core.DateTime._withValue(this[_value], {isUtc: false});
+      return new core.DateTime._withValue(this[_value$], {isUtc: false});
     }
     return this;
   }
   toUtc() {
     if (dart.test(this.isUtc)) return this;
-    return new core.DateTime._withValue(this[_value], {isUtc: true});
+    return new core.DateTime._withValue(this[_value$], {isUtc: true});
   }
   static _fourDigits(n) {
     let absN = n[dartx.abs]();
@@ -33245,30 +33248,30 @@
     }
   }
   add(duration) {
-    return new core.DateTime._withValue(dart.notNull(this[_value]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
+    return new core.DateTime._withValue(dart.notNull(this[_value$]) + dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
   }
   subtract(duration) {
-    return new core.DateTime._withValue(dart.notNull(this[_value]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
+    return new core.DateTime._withValue(dart.notNull(this[_value$]) - dart.notNull(duration.inMilliseconds), {isUtc: this.isUtc});
   }
   difference(other) {
-    return new core.Duration({milliseconds: dart.notNull(this[_value]) - dart.notNull(other[_value])});
+    return new core.Duration({milliseconds: dart.notNull(this[_value$]) - dart.notNull(other[_value$])});
   }
   _internal(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
     this.isUtc = typeof isUtc == 'boolean' ? isUtc : dart.throw(new core.ArgumentError.value(isUtc, 'isUtc'));
-    this[_value] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
+    this[_value$] = core.int._check(_js_helper.checkInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc)));
   }
   _now() {
     this.isUtc = false;
-    this[_value] = _js_helper.Primitives.dateNow();
+    this[_value$] = _js_helper.Primitives.dateNow();
   }
   static _brokenDownDateToValue(year, month, day, hour, minute, second, millisecond, microsecond, isUtc) {
     return dart.asInt(_js_helper.Primitives.valueFromDecomposedDate(year, month, day, hour, minute, second, dart.notNull(millisecond) + dart.notNull(core.DateTime._microsecondInRoundedMilliseconds(microsecond)), isUtc));
   }
   get millisecondsSinceEpoch() {
-    return this[_value];
+    return this[_value$];
   }
   get microsecondsSinceEpoch() {
-    return dart.notNull(this[_value]) * 1000;
+    return dart.notNull(this[_value$]) * 1000;
   }
   get timeZoneName() {
     if (dart.test(this.isUtc)) return "UTC";
@@ -33329,7 +33332,7 @@
     _now: dart.definiteFunctionType(core.DateTime, [])
   }),
   fields: () => ({
-    [_value]: core.int,
+    [_value$]: core.int,
     isUtc: core.bool
   }),
   getters: () => ({
@@ -33852,7 +33855,7 @@
   constructors: () => ({new: dart.definiteFunctionType(core.AbstractClassInstantiationError, [core.String])}),
   fields: () => ({[_className]: core.String})
 });
-const _receiver = Symbol('_receiver');
+const _receiver$ = Symbol('_receiver');
 const _memberName = Symbol('_memberName');
 const _arguments = Symbol('_arguments');
 const _namedArguments = Symbol('_namedArguments');
@@ -33860,7 +33863,7 @@
 core.NoSuchMethodError = class NoSuchMethodError extends core.Error {
   new(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
     if (existingArgumentNames === void 0) existingArgumentNames = null;
-    this[_receiver] = receiver;
+    this[_receiver$] = receiver;
     this[_memberName] = memberName;
     this[_arguments] = positionalArguments;
     this[_namedArguments] = namedArguments;
@@ -33890,7 +33893,7 @@
       }, SymbolAnddynamicToNull()));
     }
     if (this[_existingArgumentNames] == null) {
-      return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver])}\n` + dart.str`Arguments: [${sb}]`;
+      return dart.str`NoSuchMethodError : method not found: '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Arguments: [${sb}]`;
     } else {
       let actualParameters = sb.toString();
       sb = new core.StringBuffer();
@@ -33901,14 +33904,14 @@
         sb.write(this[_existingArgumentNames][dartx._get](i));
       }
       let formalParameters = sb.toString();
-      return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
+      return "NoSuchMethodError: incorrect number of arguments passed to " + dart.str`method named '${this[_memberName]}'\n` + dart.str`Receiver: ${core.Error.safeToString(this[_receiver$])}\n` + dart.str`Tried calling: ${this[_memberName]}(${actualParameters})\n` + dart.str`Found: ${this[_memberName]}(${formalParameters})`;
     }
   }
 };
 dart.setSignature(core.NoSuchMethodError, {
   constructors: () => ({new: dart.definiteFunctionType(core.NoSuchMethodError, [core.Object, core.Symbol, core.List, MapOfSymbol$dynamic()], [core.List])}),
   fields: () => ({
-    [_receiver]: core.Object,
+    [_receiver$]: core.Object,
     [_memberName]: core.Symbol,
     [_arguments]: core.List,
     [_namedArguments]: MapOfSymbol$dynamic(),
@@ -34248,9 +34251,9 @@
   return _Generator;
 });
 core._Generator = _Generator();
-const _end = Symbol('_end');
-const _start = Symbol('_start');
-const _generator = Symbol('_generator');
+const _end$ = Symbol('_end');
+const _start$0 = Symbol('_start');
+const _generator$ = Symbol('_generator');
 core._GeneratorIterable$ = dart.generic(E => {
   let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
   let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
@@ -34258,36 +34261,36 @@
   let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
   class _GeneratorIterable extends core.Iterable$(E) {
     new(end, generator) {
-      this[_end] = end;
-      this[_start] = 0;
-      this[_generator] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
+      this[_end$] = end;
+      this[_start$0] = 0;
+      this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
       super.new();
     }
     slice(start, end, generator) {
-      this[_start] = start;
-      this[_end] = end;
-      this[_generator] = generator;
+      this[_start$0] = start;
+      this[_end$] = end;
+      this[_generator$] = generator;
       super.new();
     }
     get iterator() {
-      return new (_GeneratorIteratorOfE())(this[_start], this[_end], this[_generator]);
+      return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
     }
     get length() {
-      return dart.notNull(this[_end]) - dart.notNull(this[_start]);
+      return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
     }
     skip(count) {
       core.RangeError.checkNotNegative(count, "count");
       if (count == 0) return this;
-      let newStart = dart.notNull(this[_start]) + dart.notNull(count);
-      if (newStart >= dart.notNull(this[_end])) return new (EmptyIterableOfE())();
-      return new (_GeneratorIterableOfE()).slice(newStart, this[_end], this[_generator]);
+      let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
+      if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
+      return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
     }
     take(count) {
       core.RangeError.checkNotNegative(count, "count");
       if (count == 0) return new (EmptyIterableOfE())();
-      let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
-      if (newEnd >= dart.notNull(this[_end])) return this;
-      return new (_GeneratorIterableOfE()).slice(this[_start], newEnd, this[_generator]);
+      let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
+      if (newEnd >= dart.notNull(this[_end$])) return this;
+      return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
     }
     static _id(n) {
       return n;
@@ -34301,9 +34304,9 @@
       slice: dart.definiteFunctionType(core._GeneratorIterable$(E), [core.int, core.int, _GeneratorOfE()])
     }),
     fields: () => ({
-      [_start]: core.int,
-      [_end]: core.int,
-      [_generator]: _GeneratorOfE()
+      [_start$0]: core.int,
+      [_end$]: core.int,
+      [_generator$]: _GeneratorOfE()
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
@@ -34313,30 +34316,30 @@
   return _GeneratorIterable;
 });
 core._GeneratorIterable = _GeneratorIterable();
-const _index = Symbol('_index');
-const _current = Symbol('_current');
+const _index$1 = Symbol('_index');
+const _current$3 = Symbol('_current');
 core._GeneratorIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
   class _GeneratorIterator extends core.Object {
     new(index, end, generator) {
-      this[_index] = index;
-      this[_end] = end;
-      this[_generator] = generator;
-      this[_current] = null;
+      this[_index$1] = index;
+      this[_end$] = end;
+      this[_generator$] = generator;
+      this[_current$3] = null;
     }
     moveNext() {
-      if (dart.notNull(this[_index]) < dart.notNull(this[_end])) {
-        this[_current] = this[_generator](this[_index]);
-        this[_index] = dart.notNull(this[_index]) + 1;
+      if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
+        this[_current$3] = this[_generator$](this[_index$1]);
+        this[_index$1] = dart.notNull(this[_index$1]) + 1;
         return true;
       } else {
-        this[_current] = null;
+        this[_current$3] = null;
         return false;
       }
     }
     get current() {
-      return this[_current];
+      return this[_current$3];
     }
   }
   dart.addTypeTests(_GeneratorIterator);
@@ -34344,10 +34347,10 @@
   dart.setSignature(_GeneratorIterator, {
     constructors: () => ({new: dart.definiteFunctionType(core._GeneratorIterator$(E), [core.int, core.int, _GeneratorOfE()])}),
     fields: () => ({
-      [_end]: core.int,
-      [_generator]: _GeneratorOfE(),
-      [_index]: core.int,
-      [_current]: E
+      [_end$]: core.int,
+      [_generator$]: _GeneratorOfE(),
+      [_index$1]: core.int,
+      [_current$3]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -34405,7 +34408,7 @@
   });
   return Map;
 });
-core.Map = Map();
+core.Map = Map$();
 core.Null = class Null extends core.Object {
   static _uninstantiable() {
     dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
@@ -34517,16 +34520,16 @@
     return core.Stopwatch._frequency;
   }
   new() {
-    this[_start] = null;
+    this[_start$0] = null;
     this[_stop] = null;
     core.Stopwatch._initTicker();
   }
   start() {
     if (dart.test(this.isRunning)) return;
-    if (this[_start] == null) {
-      this[_start] = core.Stopwatch._now();
+    if (this[_start$0] == null) {
+      this[_start$0] = core.Stopwatch._now();
     } else {
-      this[_start] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start]));
+      this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
       this[_stop] = null;
     }
   }
@@ -34535,17 +34538,17 @@
     this[_stop] = core.Stopwatch._now();
   }
   reset() {
-    if (this[_start] == null) return;
-    this[_start] = core.Stopwatch._now();
+    if (this[_start$0] == null) return;
+    this[_start$0] = core.Stopwatch._now();
     if (this[_stop] != null) {
-      this[_stop] = this[_start];
+      this[_stop] = this[_start$0];
     }
   }
   get elapsedTicks() {
-    if (this[_start] == null) {
+    if (this[_start$0] == null) {
       return 0;
     }
-    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start]) : dart.notNull(this[_stop]) - dart.notNull(this[_start]);
+    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
   }
   get elapsed() {
     return new core.Duration({microseconds: this.elapsedMicroseconds});
@@ -34557,7 +34560,7 @@
     return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
   }
   get isRunning() {
-    return this[_start] != null && this[_stop] == null;
+    return this[_start$0] != null && this[_stop] == null;
   }
   static _initTicker() {
     _js_helper.Primitives.initTicker();
@@ -34570,7 +34573,7 @@
 dart.setSignature(core.Stopwatch, {
   constructors: () => ({new: dart.definiteFunctionType(core.Stopwatch, [])}),
   fields: () => ({
-    [_start]: core.int,
+    [_start$0]: core.int,
     [_stop]: core.int
   }),
   getters: () => ({
@@ -34636,20 +34639,20 @@
   return 65536 + ((dart.notNull(start) & 1023) << 10) + (dart.notNull(end) & 1023);
 };
 dart.fn(core._combineSurrogatePair, intAndintToint());
-const _position = Symbol('_position');
+const _position$ = Symbol('_position');
 const _nextPosition = Symbol('_nextPosition');
 const _currentCodePoint = Symbol('_currentCodePoint');
 const _checkSplitSurrogate = Symbol('_checkSplitSurrogate');
 core.RuneIterator = class RuneIterator extends core.Object {
   new(string) {
     this.string = string;
-    this[_position] = 0;
+    this[_position$] = 0;
     this[_nextPosition] = 0;
     this[_currentCodePoint] = null;
   }
   at(string, index) {
     this.string = string;
-    this[_position] = index;
+    this[_position$] = index;
     this[_nextPosition] = index;
     this[_currentCodePoint] = null;
     core.RangeError.checkValueInInterval(index, 0, string[dartx.length]);
@@ -34661,7 +34664,7 @@
     }
   }
   get rawIndex() {
-    return this[_position] != this[_nextPosition] ? this[_position] : null;
+    return this[_position$] != this[_nextPosition] ? this[_position$] : null;
   }
   set rawIndex(rawIndex) {
     core.RangeError.checkValidIndex(rawIndex, this.string, "rawIndex");
@@ -34672,28 +34675,28 @@
     if (rawIndex === void 0) rawIndex = 0;
     core.RangeError.checkValueInInterval(rawIndex, 0, this.string[dartx.length], "rawIndex");
     this[_checkSplitSurrogate](rawIndex);
-    this[_position] = this[_nextPosition] = rawIndex;
+    this[_position$] = this[_nextPosition] = rawIndex;
     this[_currentCodePoint] = null;
   }
   get current() {
     return this[_currentCodePoint];
   }
   get currentSize() {
-    return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position]);
+    return dart.notNull(this[_nextPosition]) - dart.notNull(this[_position$]);
   }
   get currentAsString() {
-    if (this[_position] == this[_nextPosition]) return null;
-    if (dart.notNull(this[_position]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position]);
-    return this.string[dartx.substring](this[_position], this[_nextPosition]);
+    if (this[_position$] == this[_nextPosition]) return null;
+    if (dart.notNull(this[_position$]) + 1 == this[_nextPosition]) return this.string[dartx._get](this[_position$]);
+    return this.string[dartx.substring](this[_position$], this[_nextPosition]);
   }
   moveNext() {
-    this[_position] = this[_nextPosition];
-    if (this[_position] == this.string[dartx.length]) {
+    this[_position$] = this[_nextPosition];
+    if (this[_position$] == this.string[dartx.length]) {
       this[_currentCodePoint] = null;
       return false;
     }
-    let codeUnit = this.string[dartx.codeUnitAt](this[_position]);
-    let nextPosition = dart.notNull(this[_position]) + 1;
+    let codeUnit = this.string[dartx.codeUnitAt](this[_position$]);
+    let nextPosition = dart.notNull(this[_position$]) + 1;
     if (dart.test(core._isLeadSurrogate(codeUnit)) && nextPosition < dart.notNull(this.string[dartx.length])) {
       let nextCodeUnit = this.string[dartx.codeUnitAt](nextPosition);
       if (dart.test(core._isTrailSurrogate(nextCodeUnit))) {
@@ -34707,22 +34710,22 @@
     return true;
   }
   movePrevious() {
-    this[_nextPosition] = this[_position];
-    if (this[_position] == 0) {
+    this[_nextPosition] = this[_position$];
+    if (this[_position$] == 0) {
       this[_currentCodePoint] = null;
       return false;
     }
-    let position = dart.notNull(this[_position]) - 1;
+    let position = dart.notNull(this[_position$]) - 1;
     let codeUnit = this.string[dartx.codeUnitAt](position);
     if (dart.test(core._isTrailSurrogate(codeUnit)) && position > 0) {
       let prevCodeUnit = this.string[dartx.codeUnitAt](position - 1);
       if (dart.test(core._isLeadSurrogate(prevCodeUnit))) {
-        this[_position] = position - 1;
+        this[_position$] = position - 1;
         this[_currentCodePoint] = core._combineSurrogatePair(prevCodeUnit, codeUnit);
         return true;
       }
     }
-    this[_position] = position;
+    this[_position$] = position;
     this[_currentCodePoint] = codeUnit;
     return true;
   }
@@ -34736,7 +34739,7 @@
   }),
   fields: () => ({
     string: core.String,
-    [_position]: core.int,
+    [_position$]: core.int,
     [_nextPosition]: core.int,
     [_currentCodePoint]: core.int
   }),
@@ -34854,7 +34857,7 @@
 const _queryParameters = Symbol('_queryParameters');
 const _queryParameterLists = Symbol('_queryParameterLists');
 const _writeAuthority = Symbol('_writeAuthority');
-let const;
+let const$51;
 const _mergePaths = Symbol('_mergePaths');
 const _toWindowsFilePath = Symbol('_toWindowsFilePath');
 const _toFilePath = Symbol('_toFilePath');
@@ -35018,7 +35021,7 @@
         char = uri[dartx.codeUnitAt](index);
       }
     }
-    dart.fn(parseAuth, VoidTovoid());
+    dart.fn(parseAuth, VoidTovoid$());
     let NOT_IN_PATH = 0;
     let IN_PATH = 1;
     let ALLOW_AUTH = 2;
@@ -35357,7 +35360,7 @@
     if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
       pathToSplit = pathToSplit[dartx.substring](1);
     }
-    result = pathToSplit == "" ? const || (const = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
+    result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
     this[_pathSegments] = result;
     return result;
   }
@@ -35510,7 +35513,7 @@
     if (path != null) {
       result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
     } else {
-      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString()))[dartx.join]("/");
+      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
     }
     if (dart.test(dart.dload(result, 'isEmpty'))) {
       if (isFile) return "/";
@@ -35543,7 +35546,7 @@
         result.write(core.Uri.encodeQueryComponent(value));
       }
     }
-    dart.fn(writeParameter, StringAndStringTovoid());
+    dart.fn(writeParameter, StringAndStringTovoid$());
     queryParameters[dartx.forEach](dart.fn((key, value) => {
       if (value == null || typeof value == 'string') {
         writeParameter(key, core.String._check(value));
@@ -36044,7 +36047,7 @@
     function error(msg) {
       dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
     }
-    dart.fn(error, StringTovoid());
+    dart.fn(error, StringTovoid$());
     let bytes = host[dartx.split]('.');
     if (bytes[dartx.length] != 4) {
       error('IPv4 address should contain exactly 4 parts');
@@ -36055,7 +36058,7 @@
         error('each part must be in the range of `0..255`');
       }
       return byte;
-    }, StringToint()))[dartx.toList]();
+    }, StringToint$()))[dartx.toList]();
   }
   static parseIPv6Address(host, start, end) {
     if (start === void 0) start = 0;
@@ -36816,7 +36819,7 @@
   let error = opts && 'error' in opts ? opts.error : null;
   let stackTrace = opts && 'stackTrace' in opts ? opts.stackTrace : null;
 };
-dart.fn(developer.log, String__Tovoid());
+dart.fn(developer.log, String__Tovoid$());
 dart.defineLazy(developer, {
   get _extensions() {
     return MapOfString$ServiceExtensionHandler().new();
@@ -37052,11 +37055,11 @@
     description: core.String
   })
 });
-const _value = Symbol('_value');
+const _value$0 = Symbol('_value');
 const _toJSON = Symbol('_toJSON');
 developer.Gauge = class Gauge extends developer.Metric {
   get value() {
-    return this[_value];
+    return this[_value$0];
   }
   set value(v) {
     if (dart.notNull(v) < dart.notNull(this.min)) {
@@ -37064,12 +37067,12 @@
     } else if (dart.notNull(v) > dart.notNull(this.max)) {
       v = this.max;
     }
-    this[_value] = v;
+    this[_value$0] = v;
   }
   new(name, description, min, max) {
     this.min = min;
     this.max = max;
-    this[_value] = null;
+    this[_value$0] = null;
     super.new(name, description);
     if (!(typeof this.min == 'number')) {
       dart.throw(new core.ArgumentError('min must be a double'));
@@ -37080,7 +37083,7 @@
     if (!(dart.notNull(this.min) < dart.notNull(this.max))) {
       dart.throw(new core.ArgumentError('min must be less than max'));
     }
-    this[_value] = this.min;
+    this[_value$0] = this.min;
   }
   [_toJSON]() {
     let map = dart.map({type: 'Gauge', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value, min: this.min, max: this.max}, core.String, core.Object);
@@ -37092,7 +37095,7 @@
   fields: () => ({
     min: core.double,
     max: core.double,
-    [_value]: core.double
+    [_value$0]: core.double
   }),
   getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
   setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
@@ -37100,14 +37103,14 @@
 });
 developer.Counter = class Counter extends developer.Metric {
   new(name, description) {
-    this[_value] = 0.0;
+    this[_value$0] = 0.0;
     super.new(name, description);
   }
   get value() {
-    return this[_value];
+    return this[_value$0];
   }
   set value(v) {
-    this[_value] = v;
+    this[_value$0] = v;
   }
   [_toJSON]() {
     let map = dart.map({type: 'Counter', id: dart.str`metrics/${this.name}`, name: this.name, description: this.description, value: this.value}, core.String, core.Object);
@@ -37116,7 +37119,7 @@
 };
 dart.setSignature(developer.Counter, {
   constructors: () => ({new: dart.definiteFunctionType(developer.Counter, [core.String, core.String])}),
-  fields: () => ({[_value]: core.double}),
+  fields: () => ({[_value$0]: core.double}),
   getters: () => ({value: dart.definiteFunctionType(core.double, [])}),
   setters: () => ({value: dart.definiteFunctionType(dart.void, [core.double])}),
   methods: () => ({[_toJSON]: dart.definiteFunctionType(core.Map, [])})
@@ -37262,7 +37265,7 @@
 });
 const _stack = Symbol('_stack');
 const _taskId = Symbol('_taskId');
-const _start = Symbol('_start');
+const _start$1 = Symbol('_start');
 const _finish = Symbol('_finish');
 developer.TimelineTask = class TimelineTask extends core.Object {
   new() {
@@ -37289,7 +37292,7 @@
       block[_appendArguments](arguments$);
     }
     this[_stack][dartx.add](block);
-    block[_start]();
+    block[_start$1]();
   }
   instant(name, opts) {
     let arguments$ = opts && 'arguments' in opts ? opts.arguments : null;
@@ -37340,25 +37343,25 @@
     pass: dart.definiteFunctionType(core.int, [])
   })
 });
-const _arguments = Symbol('_arguments');
+const _arguments$ = Symbol('_arguments');
 developer._AsyncBlock = class _AsyncBlock extends core.Object {
   _(name, taskId) {
     this.name = name;
     this[_taskId] = taskId;
     this.category = 'Dart';
-    this[_arguments] = null;
+    this[_arguments$] = null;
   }
-  [_start]() {
-    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments]));
+  [_start$1]() {
+    developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'b', this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
   }
   [_finish]() {
     developer._reportTaskEvent(developer._getTraceClock(), this[_taskId], 'e', this.category, this.name, developer._argumentsAsJson(null));
   }
   [_appendArguments](arguments$) {
-    if (this[_arguments] == null) {
-      this[_arguments] = dart.map();
+    if (this[_arguments$] == null) {
+      this[_arguments$] = dart.map();
     }
-    this[_arguments][dartx.addAll](arguments$);
+    this[_arguments$][dartx.addAll](arguments$);
   }
 };
 dart.defineNamedConstructor(developer._AsyncBlock, '_');
@@ -37368,10 +37371,10 @@
     category: core.String,
     name: core.String,
     [_taskId]: core.int,
-    [_arguments]: core.Map
+    [_arguments$]: core.Map
   }),
   methods: () => ({
-    [_start]: dart.definiteFunctionType(dart.void, []),
+    [_start$1]: dart.definiteFunctionType(dart.void, []),
     [_finish]: dart.definiteFunctionType(dart.void, []),
     [_appendArguments]: dart.definiteFunctionType(dart.void, [core.Map])
   })
@@ -37380,22 +37383,22 @@
 developer._SyncBlock = class _SyncBlock extends core.Object {
   _(name, start, startCpu) {
     this.name = name;
-    this[_start] = start;
+    this[_start$1] = start;
     this[_startCpu] = startCpu;
     this.category = 'Dart';
-    this[_arguments] = null;
+    this[_arguments$] = null;
   }
   finish() {
-    developer._reportCompleteEvent(this[_start], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments]));
+    developer._reportCompleteEvent(this[_start$1], this[_startCpu], this.category, this.name, developer._argumentsAsJson(this[_arguments$]));
   }
   [_appendArguments](arguments$) {
     if (arguments$ == null) {
       return;
     }
-    if (this[_arguments] == null) {
-      this[_arguments] = dart.map();
+    if (this[_arguments$] == null) {
+      this[_arguments$] = dart.map();
     }
-    this[_arguments][dartx.addAll](arguments$);
+    this[_arguments$][dartx.addAll](arguments$);
   }
 };
 dart.defineNamedConstructor(developer._SyncBlock, '_');
@@ -37404,8 +37407,8 @@
   fields: () => ({
     category: core.String,
     name: core.String,
-    [_arguments]: core.Map,
-    [_start]: core.int,
+    [_arguments$]: core.Map,
+    [_start$1]: core.int,
     [_startCpu]: core.int
   }),
   methods: () => ({
@@ -37452,7 +37455,7 @@
 dart.fn(developer._reportTaskEvent, intAndintAndString__Tovoid());
 developer._reportCompleteEvent = function(start, startCpu, category, name, argumentsAsJson) {
 };
-dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid());
+dart.fn(developer._reportCompleteEvent, intAndintAndString__Tovoid$());
 developer._reportInstantEvent = function(start, category, name, argumentsAsJson) {
 };
 dart.fn(developer._reportInstantEvent, intAndStringAndString__Tovoid());
@@ -37542,63 +37545,63 @@
 dart.setSignature(io.BytesBuilder, {
   constructors: () => ({new: dart.definiteFunctionType(io.BytesBuilder, [], {copy: core.bool})})
 });
-const _length = Symbol('_length');
-const _buffer = Symbol('_buffer');
+const _length$2 = Symbol('_length');
+const _buffer$ = Symbol('_buffer');
 const _pow2roundup = Symbol('_pow2roundup');
 io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
   new() {
-    this[_length] = 0;
-    this[_buffer] = null;
+    this[_length$2] = 0;
+    this[_buffer$] = null;
   }
   add(bytes) {
     let bytesLength = bytes[dartx.length];
     if (bytesLength == 0) return;
-    let required = dart.notNull(this[_length]) + dart.notNull(bytesLength);
-    if (this[_buffer] == null) {
+    let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
+    if (this[_buffer$] == null) {
       let size = this[_pow2roundup](required);
       size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-      this[_buffer] = typed_data.Uint8List.new(size);
-    } else if (dart.notNull(this[_buffer][dartx.length]) < required) {
+      this[_buffer$] = typed_data.Uint8List.new(size);
+    } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
       let size = dart.notNull(this[_pow2roundup](required)) * 2;
       let newBuffer = typed_data.Uint8List.new(size);
-      newBuffer[dartx.setRange](0, this[_buffer][dartx.length], this[_buffer]);
-      this[_buffer] = newBuffer;
+      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+      this[_buffer$] = newBuffer;
     }
-    dart.assert(dart.notNull(this[_buffer][dartx.length]) >= required);
+    dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
     if (typed_data.Uint8List.is(bytes)) {
-      this[_buffer][dartx.setRange](this[_length], required, bytes);
+      this[_buffer$][dartx.setRange](this[_length$2], required, bytes);
     } else {
       for (let i = 0; i < dart.notNull(bytesLength); i++) {
-        this[_buffer][dartx._set](dart.notNull(this[_length]) + i, bytes[dartx._get](i));
+        this[_buffer$][dartx._set](dart.notNull(this[_length$2]) + i, bytes[dartx._get](i));
       }
     }
-    this[_length] = required;
+    this[_length$2] = required;
   }
   addByte(byte) {
     this.add(JSArrayOfint().of([byte]));
   }
   takeBytes() {
-    if (this[_buffer] == null) return typed_data.Uint8List.new(0);
-    let buffer = typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]);
+    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
     this.clear();
     return buffer;
   }
   toBytes() {
-    if (this[_buffer] == null) return typed_data.Uint8List.new(0);
-    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
+    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
   }
   get length() {
-    return this[_length];
+    return this[_length$2];
   }
   get isEmpty() {
-    return this[_length] == 0;
+    return this[_length$2] == 0;
   }
   get isNotEmpty() {
-    return this[_length] != 0;
+    return this[_length$2] != 0;
   }
   clear() {
-    this[_length] = 0;
-    this[_buffer] = null;
+    this[_length$2] = 0;
+    this[_buffer$] = null;
   }
   [_pow2roundup](x) {
     x = dart.notNull(x) - 1;
@@ -37613,8 +37616,8 @@
 io._CopyingBytesBuilder[dart.implements] = () => [io.BytesBuilder];
 dart.setSignature(io._CopyingBytesBuilder, {
   fields: () => ({
-    [_length]: core.int,
-    [_buffer]: typed_data.Uint8List
+    [_length$2]: core.int,
+    [_buffer$]: typed_data.Uint8List
   }),
   getters: () => ({
     length: dart.definiteFunctionType(core.int, []),
@@ -37636,14 +37639,14 @@
 io._BytesBuilder = class _BytesBuilder extends core.Object {
   new() {
     this[_chunks] = JSArrayOfListOfint().of([]);
-    this[_length] = 0;
+    this[_length$2] = 0;
   }
   add(bytes) {
     if (!typed_data.Uint8List.is(bytes)) {
       bytes = typed_data.Uint8List.fromList(bytes);
     }
     this[_chunks][dartx.add](bytes);
-    this[_length] = dart.notNull(this[_length]) + dart.notNull(bytes[dartx.length]);
+    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
   }
   addByte(byte) {
     this.add(JSArrayOfint().of([byte]));
@@ -37655,7 +37658,7 @@
       this.clear();
       return buffer;
     }
-    let buffer = typed_data.Uint8List.new(this[_length]);
+    let buffer = typed_data.Uint8List.new(this[_length$2]);
     let offset = 0;
     for (let chunk of this[_chunks]) {
       buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
@@ -37666,7 +37669,7 @@
   }
   toBytes() {
     if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
-    let buffer = typed_data.Uint8List.new(this[_length]);
+    let buffer = typed_data.Uint8List.new(this[_length$2]);
     let offset = 0;
     for (let chunk of this[_chunks]) {
       buffer[dartx.setRange](offset, dart.notNull(offset) + dart.notNull(chunk[dartx.length]), chunk);
@@ -37675,23 +37678,23 @@
     return buffer;
   }
   get length() {
-    return this[_length];
+    return this[_length$2];
   }
   get isEmpty() {
-    return this[_length] == 0;
+    return this[_length$2] == 0;
   }
   get isNotEmpty() {
-    return this[_length] != 0;
+    return this[_length$2] != 0;
   }
   clear() {
-    this[_length] = 0;
+    this[_length$2] = 0;
     this[_chunks][dartx.clear]();
   }
 };
 io._BytesBuilder[dart.implements] = () => [io.BytesBuilder];
 dart.setSignature(io._BytesBuilder, {
   fields: () => ({
-    [_length]: core.int,
+    [_length$2]: core.int,
     [_chunks]: ListOfListOfint()
   }),
   getters: () => ({
@@ -37717,7 +37720,7 @@
 io._isErrorResponse = function(response) {
   return core.List.is(response) && !dart.equals(response[dartx._get](0), io._SUCCESS_RESPONSE);
 };
-dart.fn(io._isErrorResponse, dynamicTobool());
+dart.fn(io._isErrorResponse, dynamicTobool$());
 io._exceptionFromResponse = function(response, message, path) {
   dart.assert(io._isErrorResponse(response));
   switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
@@ -38483,15 +38486,15 @@
     close: dart.definiteFunctionType(dart.void, [])
   })
 });
-const _sink = Symbol('_sink');
-const _filter = Symbol('_filter');
+const _sink$0 = Symbol('_sink');
+const _filter$ = Symbol('_filter');
 const _closed = Symbol('_closed');
 const _empty = Symbol('_empty');
-let const;
+let const$52;
 io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
   new(sink, filter) {
-    this[_sink] = sink;
-    this[_filter] = filter;
+    this[_sink$0] = sink;
+    this[_filter$] = filter;
     this[_closed] = false;
     this[_empty] = true;
     super.new();
@@ -38506,10 +38509,10 @@
     try {
       this[_empty] = false;
       let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-      this[_filter].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
       let out = null;
-      while ((out = this[_filter].processed({flush: false})) != null) {
-        this[_sink].add(ListOfint()._check(out));
+      while ((out = this[_filter$].processed({flush: false})) != null) {
+        this[_sink$0].add(ListOfint()._check(out));
       }
     } catch (e) {
       this[_closed] = true;
@@ -38520,11 +38523,11 @@
   }
   close() {
     if (dart.test(this[_closed])) return;
-    if (dart.test(this[_empty])) this[_filter].process(const || (const = dart.constList([], core.int)), 0, 0);
+    if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
     try {
       let out = null;
-      while ((out = this[_filter].processed({end: true})) != null) {
-        this[_sink].add(ListOfint()._check(out));
+      while ((out = this[_filter$].processed({end: true})) != null) {
+        this[_sink$0].add(ListOfint()._check(out));
       }
     } catch (e) {
       this[_closed] = true;
@@ -38532,14 +38535,14 @@
     }
 
     this[_closed] = true;
-    this[_sink].close();
+    this[_sink$0].close();
   }
 };
 dart.setSignature(io._FilterSink, {
   constructors: () => ({new: dart.definiteFunctionType(io._FilterSink, [convert.ByteConversionSink, io._Filter])}),
   fields: () => ({
-    [_filter]: io._Filter,
-    [_sink]: convert.ByteConversionSink,
+    [_filter$]: io._Filter,
+    [_sink$0]: convert.ByteConversionSink,
     [_closed]: core.bool,
     [_empty]: core.bool
   }),
@@ -38598,9 +38601,9 @@
   }
 };
 dart.fn(io._validateZLibMemLevel, intTovoid());
-let const;
+let const$53;
 io._validateZLibStrategy = function(strategy) {
-  let strategies = const || (const = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+  let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
   if (strategies[dartx.indexOf](strategy) == -1) {
     dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
   }
@@ -38921,7 +38924,7 @@
         dart.throw(this[_exceptionOrErrorFromResponse](response, "Exists failed"));
       }
       return dart.equals(response, 1);
-    }, dynamicTobool()));
+    }, dynamicTobool$()));
   }
   existsSync() {
     let result = io._Directory._exists(this.path);
@@ -38951,7 +38954,7 @@
             return async.Future.value(index);
           }
           return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        }, dynamicTodynamic()));
+        }, dynamicTodynamic$()));
       }
     }
     if (future == null) {
@@ -39191,7 +39194,7 @@
         this.error(response);
         this.close();
       }
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
   }
   onResume() {
     if (!dart.test(this.nextRunning)) {
@@ -39256,7 +39259,7 @@
       } else {
         this.controller.addError(new io.FileSystemException("Internal error"));
       }
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
   }
   [_cleanup]() {
     this.controller.close();
@@ -39463,40 +39466,40 @@
 });
 io._BLOCK_SIZE = 64 * 1024;
 const _closeCompleter = Symbol('_closeCompleter');
-const _path = Symbol('_path');
-const _position = Symbol('_position');
-const _end = Symbol('_end');
-const _controller = Symbol('_controller');
+const _path$ = Symbol('_path');
+const _position$0 = Symbol('_position');
+const _end$0 = Symbol('_end');
+const _controller$0 = Symbol('_controller');
 const _openedFile = Symbol('_openedFile');
 const _unsubscribed = Symbol('_unsubscribed');
 const _readInProgress = Symbol('_readInProgress');
 const _atEnd = Symbol('_atEnd');
 const _setupController = Symbol('_setupController');
-const _start = Symbol('_start');
+const _start$2 = Symbol('_start');
 const _readBlock = Symbol('_readBlock');
 const _closeFile = Symbol('_closeFile');
 io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
   new(path, position, end) {
     this[_closeCompleter] = async.Completer.new();
-    this[_path] = path;
-    this[_position] = position;
-    this[_end] = end;
-    this[_controller] = null;
+    this[_path$] = path;
+    this[_position$0] = position;
+    this[_end$0] = end;
+    this[_controller$0] = null;
     this[_openedFile] = null;
     this[_unsubscribed] = false;
     this[_readInProgress] = true;
     this[_closed] = false;
     this[_atEnd] = false;
     super.new();
-    if (this[_position] == null) this[_position] = 0;
+    if (this[_position$0] == null) this[_position$0] = 0;
   }
   forStdin() {
     this[_closeCompleter] = async.Completer.new();
-    this[_position] = 0;
-    this[_controller] = null;
-    this[_path] = null;
+    this[_position$0] = 0;
+    this[_controller$0] = null;
+    this[_path$] = null;
     this[_openedFile] = null;
-    this[_end] = null;
+    this[_end$0] = null;
     this[_unsubscribed] = false;
     this[_readInProgress] = true;
     this[_closed] = false;
@@ -39508,10 +39511,10 @@
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
     this[_setupController]();
-    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   [_setupController]() {
-    this[_controller] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
+    this[_controller$0] = StreamControllerOfListOfint().new({sync: true, onListen: dart.bind(this, _start$2), onResume: dart.bind(this, _readBlock), onCancel: dart.fn(() => {
         this[_unsubscribed] = true;
         return this[_closeFile]();
       }, VoidToFuture())});
@@ -39523,10 +39526,10 @@
     this[_closed] = true;
     const done = (function() {
       this[_closeCompleter].complete();
-      this[_controller].close();
+      this[_controller$0].close();
     }).bind(this);
-    dart.fn(done, VoidTovoid());
-    this[_openedFile].close().catchError(dart.bind(this[_controller], 'addError')).whenComplete(done);
+    dart.fn(done, VoidTovoid$());
+    this[_openedFile].close().catchError(dart.bind(this[_controller$0], 'addError')).whenComplete(done);
     return this[_closeCompleter].future;
   }
   [_readBlock]() {
@@ -39537,12 +39540,12 @@
     }
     this[_readInProgress] = true;
     let readBytes = io._BLOCK_SIZE;
-    if (this[_end] != null) {
-      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end]) - dart.notNull(this[_position]));
+    if (this[_end$0] != null) {
+      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
       if (dart.notNull(readBytes) < 0) {
         this[_readInProgress] = false;
         if (!dart.test(this[_unsubscribed])) {
-          this[_controller].addError(new core.RangeError(dart.str`Bad end position: ${this[_end]}`));
+          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
@@ -39555,29 +39558,29 @@
         this[_closeFile]();
         return;
       }
-      this[_position] = dart.notNull(this[_position]) + dart.notNull(block[dartx.length]);
-      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end] != null && this[_position] == this[_end]) {
+      this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
+      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
         this[_atEnd] = true;
       }
-      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller].isPaused)) {
+      if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
         this[_readBlock]();
       }
-      this[_controller].add(block);
+      this[_controller$0].add(block);
       if (dart.test(this[_atEnd])) {
         this[_closeFile]();
       }
     }, ListOfintToNull())).catchError(dart.fn((e, s) => {
       if (!dart.test(this[_unsubscribed])) {
-        this[_controller].addError(e, core.StackTrace._check(s));
+        this[_controller$0].addError(e, core.StackTrace._check(s));
         this[_closeFile]();
         this[_unsubscribed] = true;
       }
     }, dynamicAnddynamicToNull()));
   }
-  [_start]() {
-    if (dart.notNull(this[_position]) < 0) {
-      this[_controller].addError(new core.RangeError(dart.str`Bad start position: ${this[_position]}`));
-      this[_controller].close();
+  [_start$2]() {
+    if (dart.notNull(this[_position$0]) < 0) {
+      this[_controller$0].addError(new core.RangeError(dart.str`Bad start position: ${this[_position$0]}`));
+      this[_controller$0].close();
       this[_closeCompleter].complete();
       return;
     }
@@ -39588,9 +39591,9 @@
     }).bind(this);
     dart.fn(onReady, RandomAccessFileTovoid());
     const onOpenFile = (function(file) {
-      if (dart.notNull(this[_position]) > 0) {
-        file.setPosition(this[_position]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
-            this[_controller].addError(e, core.StackTrace._check(s));
+      if (dart.notNull(this[_position$0]) > 0) {
+        file.setPosition(this[_position$0]).then(dart.void)(onReady, {onError: dart.fn((e, s) => {
+            this[_controller$0].addError(e, core.StackTrace._check(s));
             this[_readInProgress] = false;
             this[_closeFile]();
           }, dynamicAnddynamicToNull())});
@@ -39600,13 +39603,13 @@
     }).bind(this);
     dart.fn(onOpenFile, RandomAccessFileTovoid());
     const openFailed = (function(error, stackTrace) {
-      this[_controller].addError(error, core.StackTrace._check(stackTrace));
-      this[_controller].close();
+      this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
+      this[_controller$0].close();
       this[_closeCompleter].complete();
     }).bind(this);
-    dart.fn(openFailed, dynamicAnddynamicTovoid());
-    if (this[_path] != null) {
-      io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+    dart.fn(openFailed, dynamicAnddynamicTovoid$());
+    if (this[_path$] != null) {
+      io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
     } else {
       try {
         onOpenFile(io._File._openStdioSync(0));
@@ -39626,11 +39629,11 @@
     forStdin: dart.definiteFunctionType(io._FileStream, [])
   }),
   fields: () => ({
-    [_controller]: StreamControllerOfListOfint(),
-    [_path]: core.String,
+    [_controller$0]: StreamControllerOfListOfint(),
+    [_path$]: core.String,
     [_openedFile]: io.RandomAccessFile,
-    [_position]: core.int,
-    [_end]: core.int,
+    [_position$0]: core.int,
+    [_end$0]: core.int,
     [_closeCompleter]: async.Completer,
     [_unsubscribed]: core.bool,
     [_readInProgress]: core.bool,
@@ -39642,7 +39645,7 @@
     [_setupController]: dart.definiteFunctionType(dart.void, []),
     [_closeFile]: dart.definiteFunctionType(async.Future, []),
     [_readBlock]: dart.definiteFunctionType(dart.void, []),
-    [_start]: dart.definiteFunctionType(dart.void, [])
+    [_start$2]: dart.definiteFunctionType(dart.void, [])
   })
 });
 const _file = Symbol('_file');
@@ -39706,8 +39709,8 @@
   })
 });
 const _tryDecode = Symbol('_tryDecode');
-let const;
-let const;
+let const$54;
+let const$55;
 io._File = class _File extends io.FileSystemEntity {
   new(path) {
     this.path = path;
@@ -39920,9 +39923,9 @@
           } else {
             completer.complete(builder.takeBytes());
           }
-        }, dynamicToNull()), {onError: dart.bind(completer, 'completeError')});
+        }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
       }
-      dart.fn(read, VoidTovoid());
+      dart.fn(read, VoidTovoid$());
       read();
       return FutureOfListOfint()._check(completer.future);
     }
@@ -39972,11 +39975,11 @@
   }
   readAsLines(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const || (const = dart.const(new convert.LineSplitter())), 'convert'));
+    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
   }
   readAsLinesSync(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return (const || (const = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+    return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
   }
   writeAsBytes(bytes, opts) {
     let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
@@ -40539,7 +40542,7 @@
 io._RandomAccessFile.LOCK_UNLOCK = 0;
 io._RandomAccessFile.LOCK_SHARED = 1;
 io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-let const;
+let const$56;
 io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
   _internal(type) {
     this[_type] = type;
@@ -40548,7 +40551,7 @@
     return io.FileSystemEntityType._typeList[dartx._get](type);
   }
   toString() {
-    return (const || (const = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+    return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
   }
 };
 dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
@@ -40582,7 +40585,7 @@
     return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
   }
 });
-let const;
+let const$57;
 io.FileStat = class FileStat extends core.Object {
   _internal(changed, modified, accessed, type, mode, size) {
     this.changed = changed;
@@ -40628,7 +40631,7 @@
   }
   modeString() {
     let permissions = dart.notNull(this.mode) & 4095;
-    let codes = const || (const = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+    let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
     let result = [];
     if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
     if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
@@ -41288,19 +41291,19 @@
   }),
   getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
 });
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
+let const$58;
+let const$59;
+let const$60;
+let const$61;
+let const$62;
+let const$63;
+let const$64;
+let const$65;
+let const$66;
 io.HttpDate = class HttpDate extends core.Object {
   static format(date) {
-    let wkday = const || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let month = const || (const = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
     let d = date.toUtc();
     let sb = new core.StringBuffer();
     sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
@@ -41322,12 +41325,12 @@
   }
   static parse(date) {
     let SP = 32;
-    let wkdays = const || (const = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let weekdays = const || (const = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-    let months = const || (const = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-    let wkdaysLowerCase = const || (const = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-    let weekdaysLowerCase = const || (const = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-    let monthsLowerCase = const || (const = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+    let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+    let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+    let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let formatRfc1123 = 0;
     let formatRfc850 = 1;
     let formatAsctime = 2;
@@ -41344,7 +41347,7 @@
       }
       index = dart.notNull(index) + dart.notNull(s[dartx.length]);
     }
-    dart.fn(expect, StringTovoid());
+    dart.fn(expect, StringTovoid$());
     function expectWeekday() {
       let weekday = null;
       let pos = date[dartx.indexOf](",", index);
@@ -41384,7 +41387,7 @@
       if (month != -1) return month;
       dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
     }
-    dart.fn(expectMonth, StringToint());
+    dart.fn(expectMonth, StringToint$());
     function expectNum(separator) {
       let pos = null;
       if (dart.notNull(separator[dartx.length]) > 0) {
@@ -41405,13 +41408,13 @@
       }
 
     }
-    dart.fn(expectNum, StringToint());
+    dart.fn(expectNum, StringToint$());
     function expectEnd() {
       if (index != date[dartx.length]) {
         dart.throw(new io.HttpException(dart.str`Invalid HTTP date ${date}`));
       }
     }
-    dart.fn(expectEnd, VoidTovoid());
+    dart.fn(expectEnd, VoidTovoid$());
     let weekday = expectWeekday();
     let day = null;
     let month = null;
@@ -41443,12 +41446,12 @@
     return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
   }
   static _parseCookieDate(date) {
-    let monthsLowerCase = const || (const = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let position = 0;
     function error() {
       dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
     }
-    dart.fn(error, VoidTovoid());
+    dart.fn(error, VoidTovoid$());
     function isEnd() {
       return position == date[dartx.length];
     }
@@ -41462,7 +41465,7 @@
       if (dart.notNull(char) >= 123 && dart.notNull(char) <= 126) return true;
       return false;
     }
-    dart.fn(isDelimiter, StringTobool());
+    dart.fn(isDelimiter, StringTobool$());
     function isNonDelimiter(s) {
       let char = s[dartx.codeUnitAt](0);
       if (dart.notNull(char) >= 0 && dart.notNull(char) <= 8) return true;
@@ -41474,25 +41477,25 @@
       if (dart.notNull(char) >= 127 && dart.notNull(char) <= 255) return true;
       return false;
     }
-    dart.fn(isNonDelimiter, StringTobool());
+    dart.fn(isNonDelimiter, StringTobool$());
     function isDigit(s) {
       let char = s[dartx.codeUnitAt](0);
       if (dart.notNull(char) > 47 && dart.notNull(char) < 58) return true;
       return false;
     }
-    dart.fn(isDigit, StringTobool());
+    dart.fn(isDigit, StringTobool$());
     function getMonth(month) {
       if (dart.notNull(month[dartx.length]) < 3) return -1;
       return monthsLowerCase[dartx.indexOf](month[dartx.substring](0, 3));
     }
-    dart.fn(getMonth, StringToint());
+    dart.fn(getMonth, StringToint$());
     function toInt(s) {
       let index = 0;
       for (; index < dart.notNull(s[dartx.length]) && dart.test(isDigit(s[dartx._get](index))); index++)
         ;
       return core.int.parse(s[dartx.substring](0, index));
     }
-    dart.fn(toInt, StringToint());
+    dart.fn(toInt, StringToint$());
     let tokens = [];
     while (!dart.test(isEnd())) {
       while (!dart.test(isEnd()) && dart.test(isDelimiter(date[dartx._get](position))))
@@ -41559,12 +41562,12 @@
 const _contentLength = Symbol('_contentLength');
 const _persistentConnection = Symbol('_persistentConnection');
 const _chunkedTransferEncoding = Symbol('_chunkedTransferEncoding');
-const _host = Symbol('_host');
-const _port = Symbol('_port');
+const _host$ = Symbol('_host');
+const _port$ = Symbol('_port');
 const _checkMutable = Symbol('_checkMutable');
 const _addAll = Symbol('_addAll');
-const _add = Symbol('_add');
-const _set = Symbol('_set');
+const _add$2 = Symbol('_add');
+const _set$ = Symbol('_set');
 const _addValue = Symbol('_addValue');
 const _updateHostHeader = Symbol('_updateHostHeader');
 const _addDate = Symbol('_addDate');
@@ -41591,15 +41594,15 @@
     this[_contentLength] = -1;
     this[_persistentConnection] = true;
     this[_chunkedTransferEncoding] = false;
-    this[_host] = null;
-    this[_port] = null;
+    this[_host$] = null;
+    this[_port$] = null;
     if (initialHeaders != null) {
       initialHeaders[_headers][dartx.forEach](dart.fn((name, value) => this[_headers][dartx._set](name, value), StringAndListOfStringToListOfString()));
       this[_contentLength] = initialHeaders[_contentLength];
       this[_persistentConnection] = initialHeaders[_persistentConnection];
       this[_chunkedTransferEncoding] = initialHeaders[_chunkedTransferEncoding];
-      this[_host] = initialHeaders[_host];
-      this[_port] = initialHeaders[_port];
+      this[_host$] = initialHeaders[_host$];
+      this[_port$] = initialHeaders[_port$];
     }
     if (this.protocolVersion == "1.0") {
       this[_persistentConnection] = false;
@@ -41626,10 +41629,10 @@
     dart.assert(name == io._HttpHeaders._validateField(name));
     if (core.Iterable.is(value)) {
       for (let v of value) {
-        this[_add](name, io._HttpHeaders._validateValue(v));
+        this[_add$2](name, io._HttpHeaders._validateValue(v));
       }
     } else {
-      this[_add](name, io._HttpHeaders._validateValue(value));
+      this[_add$2](name, io._HttpHeaders._validateValue(value));
     }
   }
   set(name, value) {
@@ -41705,7 +41708,7 @@
     this[_contentLength] = contentLength;
     if (dart.notNull(this[_contentLength]) >= 0) {
       if (dart.test(this.chunkedTransferEncoding)) this.chunkedTransferEncoding = false;
-      this[_set](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
+      this[_set$](io.HttpHeaders.CONTENT_LENGTH, dart.toString(contentLength));
     } else {
       this.removeAll(io.HttpHeaders.CONTENT_LENGTH);
       if (this.protocolVersion == "1.1") {
@@ -41734,19 +41737,19 @@
     this[_chunkedTransferEncoding] = chunkedTransferEncoding;
   }
   get host() {
-    return this[_host];
+    return this[_host$];
   }
   set host(host) {
     this[_checkMutable]();
-    this[_host] = host;
+    this[_host$] = host;
     this[_updateHostHeader]();
   }
   get port() {
-    return this[_port];
+    return this[_port$];
   }
   set port(port) {
     this[_checkMutable]();
-    this[_port] = port;
+    this[_port$] = port;
     this[_updateHostHeader]();
   }
   get ifModifiedSince() {
@@ -41767,7 +41770,7 @@
   set ifModifiedSince(ifModifiedSince) {
     this[_checkMutable]();
     let formatted = io.HttpDate.format(ifModifiedSince.toUtc());
-    this[_set](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
+    this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, formatted);
   }
   get date() {
     let values = this[_headers][dartx._get](io.HttpHeaders.DATE);
@@ -41787,7 +41790,7 @@
   set date(date) {
     this[_checkMutable]();
     let formatted = io.HttpDate.format(date.toUtc());
-    this[_set]("date", formatted);
+    this[_set$]("date", formatted);
   }
   get expires() {
     let values = this[_headers][dartx._get](io.HttpHeaders.EXPIRES);
@@ -41807,7 +41810,7 @@
   set expires(expires) {
     this[_checkMutable]();
     let formatted = io.HttpDate.format(expires.toUtc());
-    this[_set](io.HttpHeaders.EXPIRES, formatted);
+    this[_set$](io.HttpHeaders.EXPIRES, formatted);
   }
   get contentType() {
     let values = this[_headers][dartx._get]("content-type");
@@ -41819,7 +41822,7 @@
   }
   set contentType(contentType) {
     this[_checkMutable]();
-    this[_set](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
+    this[_set$](io.HttpHeaders.CONTENT_TYPE, dart.toString(contentType));
   }
   clear() {
     this[_checkMutable]();
@@ -41827,10 +41830,10 @@
     this[_contentLength] = -1;
     this[_persistentConnection] = true;
     this[_chunkedTransferEncoding] = false;
-    this[_host] = null;
-    this[_port] = null;
+    this[_host$] = null;
+    this[_port$] = null;
   }
-  [_add](name, value) {
+  [_add$2](name, value) {
     dart.assert(name == io._HttpHeaders._validateField(name));
     switch (name[dartx.length]) {
       case 4:
@@ -41911,7 +41914,7 @@
     if (core.DateTime.is(value)) {
       this.date = value;
     } else if (typeof value == 'string') {
-      this[_set](io.HttpHeaders.DATE, value);
+      this[_set$](io.HttpHeaders.DATE, value);
     } else {
       dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
     }
@@ -41920,7 +41923,7 @@
     if (core.DateTime.is(value)) {
       this.expires = value;
     } else if (typeof value == 'string') {
-      this[_set](io.HttpHeaders.EXPIRES, value);
+      this[_set$](io.HttpHeaders.EXPIRES, value);
     } else {
       dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
     }
@@ -41929,7 +41932,7 @@
     if (core.DateTime.is(value)) {
       this.ifModifiedSince = value;
     } else if (typeof value == 'string') {
-      this[_set](io.HttpHeaders.IF_MODIFIED_SINCE, value);
+      this[_set$](io.HttpHeaders.IF_MODIFIED_SINCE, value);
     } else {
       dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
     }
@@ -41938,29 +41941,29 @@
     if (typeof value == 'string') {
       let pos = value[dartx.indexOf](":");
       if (pos == -1) {
-        this[_host] = value;
-        this[_port] = io.HttpClient.DEFAULT_HTTP_PORT;
+        this[_host$] = value;
+        this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
       } else {
         if (dart.notNull(pos) > 0) {
-          this[_host] = value[dartx.substring](0, pos);
+          this[_host$] = value[dartx.substring](0, pos);
         } else {
-          this[_host] = null;
+          this[_host$] = null;
         }
         if (dart.notNull(pos) + 1 == value[dartx.length]) {
-          this[_port] = io.HttpClient.DEFAULT_HTTP_PORT;
+          this[_port$] = io.HttpClient.DEFAULT_HTTP_PORT;
         } else {
           try {
-            this[_port] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
+            this[_port$] = core.int.parse(value[dartx.substring](dart.notNull(pos) + 1));
           } catch (e) {
             if (core.FormatException.is(e)) {
-              this[_port] = null;
+              this[_port$] = null;
             } else
               throw e;
           }
 
         }
       }
-      this[_set](io.HttpHeaders.HOST, value);
+      this[_set$](io.HttpHeaders.HOST, value);
     } else {
       dart.throw(new io.HttpException(dart.str`Unexpected type for header named ${name}`));
     }
@@ -41975,7 +41978,7 @@
     this[_addValue](name, value);
   }
   [_addContentType](name, value) {
-    this[_set](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
+    this[_set$](io.HttpHeaders.CONTENT_TYPE, core.String._check(value));
   }
   [_addValue](name, value) {
     let values = this[_headers][dartx._get](name);
@@ -41991,7 +41994,7 @@
       values[dartx.add](core.String._check(io._HttpHeaders._validateValue(dart.toString(value))));
     }
   }
-  [_set](name, value) {
+  [_set$](name, value) {
     dart.assert(name == io._HttpHeaders._validateField(name));
     let values = ListOfString().new();
     this[_headers][dartx._set](name, values);
@@ -42001,8 +42004,8 @@
     if (!dart.test(this[_mutable])) dart.throw(new io.HttpException("HTTP headers are not mutable"));
   }
   [_updateHostHeader]() {
-    let defaultPort = this[_port] == null || this[_port] == this[_defaultPortForScheme];
-    this[_set]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port]}`);
+    let defaultPort = this[_port$] == null || this[_port$] == this[_defaultPortForScheme];
+    this[_set$]("host", defaultPort ? this.host : dart.str`${this.host}:${this[_port$]}`);
   }
   [_foldHeader](name) {
     if (name == io.HttpHeaders.SET_COOKIE || this[_noFoldingHeaders] != null && this[_noFoldingHeaders][dartx.indexOf](name) != -1) {
@@ -42021,7 +42024,7 @@
       }
       offset = dart.notNull(offset) + dart.notNull(len);
     }
-    dart.fn(write, ListOfintTovoid());
+    dart.fn(write, ListOfintTovoid$());
     for (let name of this[_headers][dartx.keys]) {
       let values = this[_headers][dartx._get](name);
       let fold = core.bool._check(this[_foldHeader](name));
@@ -42125,7 +42128,7 @@
           index = dart.notNull(index) + 1;
         }
       }
-      dart.fn(skipWS, VoidTovoid());
+      dart.fn(skipWS, VoidTovoid$());
       function parseName() {
         let start = index;
         while (!dart.test(done())) {
@@ -42134,7 +42137,7 @@
         }
         return s[dartx.substring](start, index);
       }
-      dart.fn(parseName, VoidToString());
+      dart.fn(parseName, VoidToString$());
       function parseValue() {
         let start = index;
         while (!dart.test(done())) {
@@ -42143,14 +42146,14 @@
         }
         return s[dartx.substring](start, index);
       }
-      dart.fn(parseValue, VoidToString());
+      dart.fn(parseValue, VoidToString$());
       function expect(expected) {
         if (dart.test(done())) return false;
         if (s[dartx._get](index) != expected) return false;
         index = dart.notNull(index) + 1;
         return true;
       }
-      dart.fn(expect, StringTobool());
+      dart.fn(expect, StringTobool$());
       while (!dart.test(done())) {
         skipWS();
         if (dart.test(done())) return;
@@ -42175,10 +42178,10 @@
         }
       }
     }
-    dart.fn(parseCookieString, StringTovoid());
+    dart.fn(parseCookieString, StringTovoid$());
     let values = this[_headers][dartx._get](io.HttpHeaders.COOKIE);
     if (values != null) {
-      values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid()));
+      values[dartx.forEach](dart.fn(headerValue => parseCookieString(headerValue), StringTovoid$()));
     }
     return cookies;
   }
@@ -42211,8 +42214,8 @@
     [_contentLength]: core.int,
     [_persistentConnection]: core.bool,
     [_chunkedTransferEncoding]: core.bool,
-    [_host]: core.String,
-    [_port]: core.int,
+    [_host$]: core.String,
+    [_port$]: core.int,
     [_defaultPortForScheme]: core.int
   }),
   getters: () => ({
@@ -42248,7 +42251,7 @@
     forEach: dart.definiteFunctionType(dart.void, [StringAndListOfStringTovoid()]),
     noFolding: dart.definiteFunctionType(dart.void, [core.String]),
     clear: dart.definiteFunctionType(dart.void, []),
-    [_add]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
+    [_add$2]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
     [_addContentLength]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
     [_addTransferEncoding]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
     [_addDate]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
@@ -42258,7 +42261,7 @@
     [_addConnection]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
     [_addContentType]: dart.definiteFunctionType(dart.void, [core.String, dart.dynamic]),
     [_addValue]: dart.definiteFunctionType(dart.void, [core.String, core.Object]),
-    [_set]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
+    [_set$]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
     [_checkMutable]: dart.definiteFunctionType(dart.dynamic, []),
     [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
     [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
@@ -42272,7 +42275,7 @@
   }),
   names: ['_validateField', '_validateValue']
 });
-const _value = Symbol('_value');
+const _value$1 = Symbol('_value');
 const _parameters = Symbol('_parameters');
 const _unmodifiableParameters = Symbol('_unmodifiableParameters');
 const _parse = Symbol('_parse');
@@ -42281,7 +42284,7 @@
   new(value, parameters) {
     if (value === void 0) value = "";
     if (parameters === void 0) parameters = null;
-    this[_value] = value;
+    this[_value$1] = value;
     this[_parameters] = null;
     this[_unmodifiableParameters] = null;
     if (parameters != null) {
@@ -42297,7 +42300,7 @@
     return result;
   }
   get value() {
-    return this[_value];
+    return this[_value$1];
   }
   [_ensureParameters]() {
     if (this[_parameters] == null) {
@@ -42313,7 +42316,7 @@
   }
   toString() {
     let sb = new core.StringBuffer();
-    sb.write(this[_value]);
+    sb.write(this[_value$1]);
     if (this.parameters != null && dart.notNull(this.parameters[dartx.length]) > 0) {
       this[_parameters][dartx.forEach](dart.fn((name, value) => {
         sb.write("; ");
@@ -42336,7 +42339,7 @@
         index++;
       }
     }
-    dart.fn(skipWS, VoidTovoid());
+    dart.fn(skipWS, VoidTovoid$());
     function parseValue() {
       let start = index;
       while (!dart.test(done())) {
@@ -42345,18 +42348,18 @@
       }
       return s[dartx.substring](start, index);
     }
-    dart.fn(parseValue, VoidToString());
+    dart.fn(parseValue, VoidToString$());
     function expect(expected) {
       if (dart.test(done()) || s[dartx._get](index) != expected) {
         dart.throw(new io.HttpException("Failed to parse header value"));
       }
       index++;
     }
-    dart.fn(expect, StringTovoid());
+    dart.fn(expect, StringTovoid$());
     function maybeExpect(expected) {
       if (s[dartx._get](index) == expected) index++;
     }
-    dart.fn(maybeExpect, StringTovoid());
+    dart.fn(maybeExpect, StringTovoid$());
     const parseParameters = (function() {
       let parameters = HashMapOfString$String().new();
       this[_parameters] = new (UnmodifiableMapViewOfString$String())(parameters);
@@ -42368,7 +42371,7 @@
         }
         return s[dartx.substring](start, index)[dartx.toLowerCase]();
       }
-      dart.fn(parseParameterName, VoidToString());
+      dart.fn(parseParameterName, VoidToString$());
       function parseParameterValue() {
         if (!dart.test(done()) && s[dartx._get](index) == "\"") {
           let sb = new core.StringBuffer();
@@ -42395,7 +42398,7 @@
           return val == "" ? null : val;
         }
       }
-      dart.fn(parseParameterValue, VoidToString());
+      dart.fn(parseParameterValue, VoidToString$());
       while (!dart.test(done())) {
         skipWS();
         if (dart.test(done())) return;
@@ -42422,9 +42425,9 @@
         expect(parameterSeparator);
       }
     }).bind(this);
-    dart.fn(parseParameters, VoidTovoid());
+    dart.fn(parseParameters, VoidTovoid$());
     skipWS();
-    this[_value] = parseValue();
+    this[_value$1] = parseValue();
     skipWS();
     if (dart.test(done())) return;
     maybeExpect(parameterSeparator);
@@ -42435,7 +42438,7 @@
 dart.setSignature(io._HeaderValue, {
   constructors: () => ({new: dart.definiteFunctionType(io._HeaderValue, [], [core.String, MapOfString$String()])}),
   fields: () => ({
-    [_value]: core.String,
+    [_value$1]: core.String,
     [_parameters]: MapOfString$String(),
     [_unmodifiableParameters]: MapOfString$String()
   }),
@@ -42459,7 +42462,7 @@
     super.new("");
     if (this[_primaryType] == null) this[_primaryType] = "";
     if (this[_subType] == null) this[_subType] = "";
-    this[_value] = dart.str`${this[_primaryType]}/${this[_subType]}`;
+    this[_value$1] = dart.str`${this[_primaryType]}/${this[_subType]}`;
     if (parameters != null) {
       this[_ensureParameters]();
       parameters[dartx.forEach](dart.fn((key, value) => {
@@ -42483,13 +42486,13 @@
   static parse(value) {
     let result = new io._ContentType._();
     result[_parse](value, ";", null, false);
-    let index = result[_value][dartx.indexOf]("/");
-    if (index == -1 || index == dart.notNull(result[_value][dartx.length]) - 1) {
-      result[_primaryType] = result[_value][dartx.trim]()[dartx.toLowerCase]();
+    let index = result[_value$1][dartx.indexOf]("/");
+    if (index == -1 || index == dart.notNull(result[_value$1][dartx.length]) - 1) {
+      result[_primaryType] = result[_value$1][dartx.trim]()[dartx.toLowerCase]();
       result[_subType] = "";
     } else {
-      result[_primaryType] = result[_value][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
-      result[_subType] = result[_value][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
+      result[_primaryType] = result[_value$1][dartx.substring](0, index)[dartx.trim]()[dartx.toLowerCase]();
+      result[_subType] = result[_value$1][dartx.substring](dart.notNull(index) + 1)[dartx.trim]()[dartx.toLowerCase]();
     }
     return result;
   }
@@ -42528,7 +42531,7 @@
 });
 const _validate = Symbol('_validate');
 const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-let const;
+let const$67;
 io._Cookie = class _Cookie extends core.Object {
   new(name, value) {
     if (name === void 0) name = null;
@@ -42569,7 +42572,7 @@
       }
       return s[dartx.substring](start, index)[dartx.trim]();
     }
-    dart.fn(parseName, VoidToString());
+    dart.fn(parseName, VoidToString$());
     function parseValue() {
       let start = index;
       while (!dart.test(done())) {
@@ -42578,7 +42581,7 @@
       }
       return s[dartx.substring](start, index)[dartx.trim]();
     }
-    dart.fn(parseValue, VoidToString());
+    dart.fn(parseValue, VoidToString$());
     function expect(expected) {
       if (dart.test(done())) dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
       if (s[dartx._get](index) != expected) {
@@ -42586,7 +42589,7 @@
       }
       index++;
     }
-    dart.fn(expect, StringTovoid());
+    dart.fn(expect, StringTovoid$());
     const parseAttributes = (function() {
       function parseAttributeName() {
         let start = index;
@@ -42596,7 +42599,7 @@
         }
         return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
       }
-      dart.fn(parseAttributeName, VoidToString());
+      dart.fn(parseAttributeName, VoidToString$());
       function parseAttributeValue() {
         let start = index;
         while (!dart.test(done())) {
@@ -42605,7 +42608,7 @@
         }
         return s[dartx.substring](start, index)[dartx.trim]()[dartx.toLowerCase]();
       }
-      dart.fn(parseAttributeValue, VoidToString());
+      dart.fn(parseAttributeValue, VoidToString$());
       while (!dart.test(done())) {
         let name = parseAttributeName();
         let value = "";
@@ -42629,7 +42632,7 @@
         if (!dart.test(done())) index++;
       }
     }).bind(this);
-    dart.fn(parseAttributes, VoidTovoid());
+    dart.fn(parseAttributes, VoidTovoid$());
     this.name = parseName();
     if (dart.test(done()) || this.name[dartx.length] == 0) {
       dart.throw(new io.HttpException(dart.str`Failed to parse header value [${s}]`));
@@ -42667,7 +42670,7 @@
     return sb.toString();
   }
   [_validate]() {
-    let SEPERATORS = const || (const = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+    let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
     for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
       let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
       if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
@@ -42707,7 +42710,7 @@
 io._OUTGOING_BUFFER_SIZE = 8 * 1024;
 const _transferLength = Symbol('_transferLength');
 const _dataCompleter = Symbol('_dataCompleter');
-const _stream = Symbol('_stream');
+const _stream$ = Symbol('_stream');
 io._HttpIncoming = class _HttpIncoming extends async.Stream$(core.List$(core.int)) {
   get transferLength() {
     return this[_transferLength];
@@ -42716,7 +42719,7 @@
     this[_dataCompleter] = async.Completer.new();
     this.headers = headers;
     this[_transferLength] = transferLength;
-    this[_stream] = stream;
+    this[_stream$] = stream;
     this.fullBodyRead = false;
     this.upgraded = false;
     this.statusCode = null;
@@ -42731,9 +42734,9 @@
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
     this.hasSubscriber = true;
-    return this[_stream].handleError(dart.fn(error => {
+    return this[_stream$].handleError(dart.fn(error => {
       dart.throw(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this.uri}));
-    }, dynamicToNull())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    }, dynamicToNull$())).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get dataDone() {
     return this[_dataCompleter].future;
@@ -42750,7 +42753,7 @@
   fields: () => ({
     [_transferLength]: core.int,
     [_dataCompleter]: async.Completer,
-    [_stream]: StreamOfListOfint(),
+    [_stream$]: StreamOfListOfint(),
     fullBodyRead: core.bool,
     headers: io._HttpHeaders,
     upgraded: core.bool,
@@ -43137,12 +43140,12 @@
 const _encoding = Symbol('_encoding');
 const _isConnectionClosed = Symbol('_isConnectionClosed');
 const _doneCompleter = Symbol('_doneCompleter');
-const _target = Symbol('_target');
+const _target$ = Symbol('_target');
 const _controllerInstance = Symbol('_controllerInstance');
 const _controllerCompleter = Symbol('_controllerCompleter');
-const _isClosed = Symbol('_isClosed');
+const _isClosed$0 = Symbol('_isClosed');
 const _isBound = Symbol('_isBound');
-const _hasError = Symbol('_hasError');
+const _hasError$ = Symbol('_hasError');
 const _closeTarget = Symbol('_closeTarget');
 const _completeDoneValue = Symbol('_completeDoneValue');
 const _completeDoneError = Symbol('_completeDoneError');
@@ -43154,21 +43157,21 @@
   class _StreamSinkImpl extends core.Object {
     new(target) {
       this[_doneCompleter] = async.Completer.new();
-      this[_target] = target;
+      this[_target$] = target;
       this[_controllerInstance] = null;
       this[_controllerCompleter] = null;
-      this[_isClosed] = false;
+      this[_isClosed$0] = false;
       this[_isBound] = false;
-      this[_hasError] = false;
+      this[_hasError$] = false;
     }
     add(data) {
       T._check(data);
-      if (dart.test(this[_isClosed])) return;
-      this[_controller].add(data);
+      if (dart.test(this[_isClosed$0])) return;
+      this[_controller$0].add(data);
     }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
-      this[_controller].addError(error, stackTrace);
+      this[_controller$0].addError(error, stackTrace);
     }
     addStream(stream) {
       StreamOfT()._check(stream);
@@ -43176,9 +43179,9 @@
         dart.throw(new core.StateError("StreamSink is already bound to a stream"));
       }
       this[_isBound] = true;
-      if (dart.test(this[_hasError])) return this.done;
+      if (dart.test(this[_hasError$])) return this.done;
       const targetAddStream = (function() {
-        return this[_target].addStream(stream).whenComplete(dart.fn(() => {
+        return this[_target$].addStream(stream).whenComplete(dart.fn(() => {
           this[_isBound] = false;
         }, VoidToNull()));
       }).bind(this);
@@ -43204,8 +43207,8 @@
       if (dart.test(this[_isBound])) {
         dart.throw(new core.StateError("StreamSink is bound to a stream"));
       }
-      if (!dart.test(this[_isClosed])) {
-        this[_isClosed] = true;
+      if (!dart.test(this[_isClosed$0])) {
+        this[_isClosed$0] = true;
         if (this[_controllerInstance] != null) {
           this[_controllerInstance].close();
         } else {
@@ -43215,7 +43218,7 @@
       return this.done;
     }
     [_closeTarget]() {
-      this[_target].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
+      this[_target$].close().then(dart.void)(dart.bind(this, _completeDoneValue), {onError: dart.bind(this, _completeDoneError)});
     }
     get done() {
       return this[_doneCompleter].future;
@@ -43227,21 +43230,21 @@
     }
     [_completeDoneError](error, stackTrace) {
       if (!dart.test(this[_doneCompleter].isCompleted)) {
-        this[_hasError] = true;
+        this[_hasError$] = true;
         this[_doneCompleter].completeError(error, stackTrace);
       }
     }
-    get [_controller]() {
+    get [_controller$0]() {
       if (dart.test(this[_isBound])) {
         dart.throw(new core.StateError("StreamSink is bound to a stream"));
       }
-      if (dart.test(this[_isClosed])) {
+      if (dart.test(this[_isClosed$0])) {
         dart.throw(new core.StateError("StreamSink is closed"));
       }
       if (this[_controllerInstance] == null) {
         this[_controllerInstance] = StreamControllerOfT().new({sync: true});
         this[_controllerCompleter] = async.Completer.new();
-        this[_target].addStream(this[_controller].stream).then(dart.dynamic)(dart.fn(_ => {
+        this[_target$].addStream(this[_controller$0].stream).then(dart.dynamic)(dart.fn(_ => {
           if (dart.test(this[_isBound])) {
             this[_controllerCompleter].complete(this);
             this[_controllerCompleter] = null;
@@ -43249,7 +43252,7 @@
           } else {
             this[_closeTarget]();
           }
-        }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
+        }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
             if (dart.test(this[_isBound])) {
               this[_controllerCompleter].completeError(error, core.StackTrace._check(stackTrace));
               this[_controllerCompleter] = null;
@@ -43267,17 +43270,17 @@
   dart.setSignature(_StreamSinkImpl, {
     constructors: () => ({new: dart.definiteFunctionType(io._StreamSinkImpl$(T), [StreamConsumerOfT()])}),
     fields: () => ({
-      [_target]: StreamConsumerOfT(),
+      [_target$]: StreamConsumerOfT(),
       [_doneCompleter]: async.Completer,
       [_controllerInstance]: StreamControllerOfT(),
       [_controllerCompleter]: async.Completer,
-      [_isClosed]: core.bool,
+      [_isClosed$0]: core.bool,
       [_isBound]: core.bool,
-      [_hasError]: core.bool
+      [_hasError$]: core.bool
     }),
     getters: () => ({
       done: dart.definiteFunctionType(async.Future, []),
-      [_controller]: dart.definiteFunctionType(async.StreamController$(T), [])
+      [_controller$0]: dart.definiteFunctionType(async.StreamController$(T), [])
     }),
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [T]),
@@ -43502,7 +43505,7 @@
     }
     this.close();
     this.done.catchError(dart.fn(_ => {
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
     return future;
   }
   get connectionInfo() {
@@ -43529,7 +43532,7 @@
       }
       offset = dart.notNull(offset) + dart.notNull(len);
     }
-    dart.fn(write, ListOfintTovoid());
+    dart.fn(write, ListOfintTovoid$());
     if (this.headers.protocolVersion == "1.1") {
       write(io._Const.HTTP11);
     } else {
@@ -43806,7 +43809,7 @@
 const _followRedirects = Symbol('_followRedirects');
 const _maxRedirects = Symbol('_maxRedirects');
 const _onIncoming = Symbol('_onIncoming');
-const _onError = Symbol('_onError');
+const _onError$ = Symbol('_onError');
 const _proxyTunnel = Symbol('_proxyTunnel');
 const _requestUri = Symbol('_requestUri');
 io._HttpClientRequest = class _HttpClientRequest extends io._HttpOutboundMessage$(io.HttpClientResponse) {
@@ -43874,7 +43877,7 @@
     }
     future.then(dart.void)(dart.fn(v => this[_responseCompleter].complete(v), HttpClientResponseTovoid()), {onError: dart.bind(this[_responseCompleter], 'completeError')});
   }
-  [_onError](error, stackTrace) {
+  [_onError$](error, stackTrace) {
     this[_responseCompleter].completeError(error, stackTrace);
   }
   [_requestUri]() {
@@ -43886,7 +43889,7 @@
       }
       return result;
     }).bind(this);
-    dart.fn(uriStartingFromPath, VoidToString());
+    dart.fn(uriStartingFromPath, VoidToString$());
     if (dart.test(this[_proxy].isDirect)) {
       return uriStartingFromPath();
     } else {
@@ -43911,7 +43914,7 @@
       }
       offset = dart.notNull(offset) + dart.notNull(len);
     }
-    dart.fn(write, ListOfintTovoid());
+    dart.fn(write, ListOfintTovoid$());
     write(this.method[dartx.codeUnits]);
     buffer[dartx._set]((() => {
       let x = offset;
@@ -43990,7 +43993,7 @@
   methods: () => ({
     close: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), []),
     [_onIncoming]: dart.definiteFunctionType(dart.void, [io._HttpIncoming]),
-    [_onError]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
+    [_onError$]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
     [_requestUri]: dart.definiteFunctionType(core.String, []),
     [_writeHeader]: dart.definiteFunctionType(dart.void, [])
   })
@@ -44032,18 +44035,18 @@
 const _gzipBufferLength = Symbol('_gzipBufferLength');
 const _socketError = Symbol('_socketError');
 const _addGZipChunk = Symbol('_addGZipChunk');
-const _addChunk = Symbol('_addChunk');
+const _addChunk$ = Symbol('_addChunk');
 const _chunkHeader = Symbol('_chunkHeader');
 const _ignoreError = Symbol('_ignoreError');
-let const;
+let const$68;
 io._HttpOutgoing = class _HttpOutgoing extends core.Object {
   new(socket) {
     this[_doneCompleter] = async.Completer.new();
     this.socket = socket;
     this.ignoreBody = false;
     this.headersWritten = false;
-    this[_buffer] = null;
-    this[_length] = 0;
+    this[_buffer$] = null;
+    this[_length$2] = 0;
     this[_closeFuture] = null;
     this.chunked = false;
     this[_pendingChunkedFooter] = 0;
@@ -44079,14 +44082,14 @@
       if (dart.test(response[_httpRequest][_httpServer].autoCompress) && dart.test(this.outbound.bufferOutput) && dart.test(this.outbound.headers.chunkedTransferEncoding)) {
         let acceptEncodings = response[_httpRequest].headers._get(io.HttpHeaders.ACCEPT_ENCODING);
         let contentEncoding = this.outbound.headers._get(io.HttpHeaders.CONTENT_ENCODING);
-        if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool()))) && contentEncoding == null) {
+        if (acceptEncodings != null && dart.test(acceptEncodings[dartx.expand](dart.dynamic)(dart.fn(list => core.Iterable._check(dart.dsend(list, 'split', ",")), dynamicToIterable()))[dartx.any](dart.fn(encoding => dart.equals(dart.dsend(dart.dsend(encoding, 'trim'), 'toLowerCase'), "gzip"), dynamicTobool$()))) && contentEncoding == null) {
           this.outbound.headers.set(io.HttpHeaders.CONTENT_ENCODING, "gzip");
           gzip = true;
         }
       }
       if (dart.test(drainRequest) && !dart.test(response[_httpRequest][_incoming].hasSubscriber)) {
         drainFuture = response[_httpRequest].drain(dart.dynamic)().catchError(dart.fn(_ => {
-        }, dynamicToNull()));
+        }, dynamicToNull$()));
       }
     } else {
       drainRequest = false;
@@ -44115,7 +44118,7 @@
     }
     if (dart.test(this.ignoreBody)) {
       stream.drain(dart.dynamic)().catchError(dart.fn(_ => {
-      }, dynamicToNull()));
+      }, dynamicToNull$()));
       let future = this.writeHeaders();
       if (future != null) {
         return future.then(dart.dynamic)(dart.fn(_ => this.close(), dynamicToFuture()));
@@ -44123,7 +44126,7 @@
       return this.close();
     }
     let sub = null;
-    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid()), sync: true});
+    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
     const onData = (function(data) {
       if (dart.test(this[_socketError])) return;
       if (dart.equals(dart.dload(data, 'length'), 0)) return;
@@ -44134,7 +44137,7 @@
           this[_gzipAdd] = null;
           return;
         }
-        this[_addChunk](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
         this[_pendingChunkedFooter] = 2;
       } else {
         if (this.contentLength != null) {
@@ -44145,9 +44148,9 @@
           }
         }
       }
-      this[_addChunk](data, dart.bind(controller, 'add'));
+      this[_addChunk$](data, dart.bind(controller, 'add'));
     }).bind(this);
-    dart.fn(onData, dynamicTovoid());
+    dart.fn(onData, dynamicTovoid$());
     sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
     if (!dart.test(this.headersWritten)) {
       let future = this.writeHeaders();
@@ -44198,12 +44201,12 @@
           this[_gzipSink].close();
           this[_gzipAdd] = null;
         }
-        this[_addChunk](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
+        this[_addChunk$](this[_chunkHeader](0), dart.bind(this.socket, 'add'));
       }
-      if (dart.notNull(this[_length]) > 0) {
-        this.socket.add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
+      if (dart.notNull(this[_length$2]) > 0) {
+        this.socket.add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
       }
-      this[_buffer] = null;
+      this[_buffer$] = null;
       return this.socket.flush().then(io._HttpOutboundMessage)(dart.fn(_ => {
         this[_doneCompleter].complete(this.socket);
         return this.outbound;
@@ -44227,10 +44230,10 @@
     return this[_doneCompleter].future;
   }
   setHeader(data, length) {
-    dart.assert(this[_length] == 0);
+    dart.assert(this[_length$2] == 0);
     dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
-    this[_buffer] = typed_data.Uint8List._check(data);
-    this[_length] = length;
+    this[_buffer$] = typed_data.Uint8List._check(data);
+    this[_length$2] = length;
   }
   set gzip(value) {
     this[_gzip] = value;
@@ -44239,10 +44242,10 @@
       dart.assert(this[_gzipSink] == null);
       this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
         if (this[_gzipAdd] == null) return;
-        this[_addChunk](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
+        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), ListOfintTovoid()._check(this[_gzipAdd]));
         this[_pendingChunkedFooter] = 2;
-        this[_addChunk](data, ListOfintTovoid()._check(this[_gzipAdd]));
-      }, dynamicToNull())));
+        this[_addChunk$](data, ListOfintTovoid()._check(this[_gzipAdd]));
+      }, dynamicToNull$())));
     }
   }
   [_ignoreError](error) {
@@ -44265,30 +44268,30 @@
       this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
     }
   }
-  [_addChunk](chunk, add) {
+  [_addChunk$](chunk, add) {
     if (!dart.test(this.outbound.bufferOutput)) {
-      if (this[_buffer] != null) {
-        add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
-        this[_buffer] = null;
-        this[_length] = 0;
+      if (this[_buffer$] != null) {
+        add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
+        this[_buffer$] = null;
+        this[_length$2] = 0;
       }
       add(ListOfint()._check(chunk));
       return;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_length])))) {
-      add(typed_data.Uint8List.view(this[_buffer][dartx.buffer], 0, this[_length]));
-      this[_buffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      this[_length] = 0;
+    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+      add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
+      this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
+      this[_length$2] = 0;
     }
     if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
       add(ListOfint()._check(chunk));
     } else {
-      this[_buffer][dartx.setRange](this[_length], dart.asInt(dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-      this[_length] = dart.notNull(this[_length]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+      this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
     }
   }
   [_chunkHeader](length) {
-    let hexDigits = const || (const = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+    let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
     if (length == 0) {
       if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
       return io._HttpOutgoing._chunk0Length;
@@ -44322,8 +44325,8 @@
     socket: io.Socket,
     ignoreBody: core.bool,
     headersWritten: core.bool,
-    [_buffer]: typed_data.Uint8List,
-    [_length]: core.int,
+    [_buffer$]: typed_data.Uint8List,
+    [_length$2]: core.int,
     [_closeFuture]: async.Future,
     chunked: core.bool,
     [_pendingChunkedFooter]: core.int,
@@ -44346,7 +44349,7 @@
     setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
     [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
-    [_addChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
+    [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfintTovoid()]),
     [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
   }),
   sfields: () => ({
@@ -44364,7 +44367,7 @@
 });
 const _context = Symbol('_context');
 const _httpParser = Symbol('_httpParser');
-const _subscription = Symbol('_subscription');
+const _subscription$ = Symbol('_subscription');
 const _dispose = Symbol('_dispose');
 const _idleTimer = Symbol('_idleTimer');
 const _currentUri = Symbol('_currentUri');
@@ -44382,7 +44385,7 @@
     this[_proxyTunnel] = proxyTunnel;
     this[_context] = context;
     this[_httpParser] = io._HttpParser.responseParser();
-    this[_subscription] = null;
+    this[_subscription$] = null;
     this[_dispose] = false;
     this[_idleTimer] = null;
     this.closed = false;
@@ -44390,19 +44393,19 @@
     this[_nextResponseCompleter] = null;
     this[_streamFuture] = null;
     this[_httpParser].listenToStream(this[_socket]);
-    this[_subscription] = this[_httpParser].listen(dart.fn(incoming => {
-      this[_subscription].pause();
+    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
+      this[_subscription$].pause();
       if (this[_nextResponseCompleter] == null) {
         dart.throw(new io.HttpException("Unexpected response (unsolicited response without request).", {uri: this[_currentUri]}));
       }
       if (incoming.statusCode == 100) {
         incoming.drain(dart.dynamic)().then(dart.dynamic)(dart.fn(_ => {
-          this[_subscription].resume();
-        }, dynamicToNull())).catchError(dart.fn((error, stackTrace) => {
+          this[_subscription$].resume();
+        }, dynamicToNull$())).catchError(dart.fn((error, stackTrace) => {
           if (stackTrace === void 0) stackTrace = null;
           this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
           this[_nextResponseCompleter] = null;
-        }, dynamic__ToNull()));
+        }, dynamic__ToNull$()));
       } else {
         this[_nextResponseCompleter].complete(incoming);
         this[_nextResponseCompleter] = null;
@@ -44413,7 +44416,7 @@
           this[_nextResponseCompleter].completeError(new io.HttpException(core.String._check(dart.dload(error, 'message')), {uri: this[_currentUri]}), stackTrace);
           this[_nextResponseCompleter] = null;
         }
-      }, dynamic__ToNull()), onDone: dart.fn(() => {
+      }, dynamic__ToNull$()), onDone: dart.fn(() => {
         if (this[_nextResponseCompleter] != null) {
           this[_nextResponseCompleter].completeError(new io.HttpException("Connection closed before response was received", {uri: this[_currentUri]}));
           this[_nextResponseCompleter] = null;
@@ -44426,7 +44429,7 @@
       dart.throw(new io.HttpException("Socket closed before request was sent", {uri: uri}));
     }
     this[_currentUri] = uri;
-    this[_subscription].pause();
+    this[_subscription$].pause();
     let proxyCreds = null;
     let creds = null;
     let outgoing = new io._HttpOutgoing(this[_socket]);
@@ -44435,9 +44438,9 @@
     if (dart.test(host[dartx.contains](':'))) host = dart.str`[${host}]`;
     request.headers.host = host;
     request.headers.port = port;
-    request.headers[_add](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
+    request.headers[_add$2](io.HttpHeaders.ACCEPT_ENCODING, "gzip");
     if (this[_httpClient].userAgent != null) {
-      request.headers[_add]('user-agent', this[_httpClient].userAgent);
+      request.headers[_add$2]('user-agent', this[_httpClient].userAgent);
     }
     if (dart.test(proxy.isAuthenticated)) {
       let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
@@ -44471,11 +44474,11 @@
           if (dart.test(this.closed)) return;
           if (!dart.test(closing) && !dart.test(this[_dispose]) && dart.test(incoming.headers.persistentConnection) && dart.test(request.persistentConnection)) {
             this[_httpClient][_returnConnection](this);
-            this[_subscription].resume();
+            this[_subscription$].resume();
           } else {
             this.destroy();
           }
-        }, dynamicToNull()));
+        }, dynamicToNull$()));
         if (proxyCreds != null && dart.equals(proxyCreds.scheme, io._AuthenticationScheme.DIGEST)) {
           let authInfo = incoming.headers._get("proxy-authentication-info");
           if (authInfo != null && authInfo[dartx.length] == 1) {
@@ -44495,15 +44498,15 @@
         request[_onIncoming](incoming);
       }, _HttpIncomingToNull())).catchError(dart.fn(error => {
         dart.throw(new io.HttpException("Connection closed before data was received", {uri: uri}));
-      }, dynamicToNull()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
+      }, dynamicToNull$()), {test: dart.fn(error => core.StateError.is(error), ObjectTobool())}).catchError(dart.fn((error, stackTrace) => {
         this.destroy();
-        request[_onError](error, core.StackTrace._check(stackTrace));
+        request[_onError$](error, core.StackTrace._check(stackTrace));
       }, dynamicAnddynamicToNull()));
-      this[_subscription].resume();
+      this[_subscription$].resume();
       return s;
-    }, dynamicTodynamic()), {onError: dart.fn(e => {
+    }, dynamicTodynamic$()), {onError: dart.fn(e => {
         this.destroy();
-      }, dynamicToNull())});
+      }, dynamicToNull$())});
     return request;
   }
   detachSocket() {
@@ -44517,7 +44520,7 @@
   close() {
     this.closed = true;
     this[_httpClient][_connectionClosed](this);
-    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid()));
+    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
   }
   createProxyTunnel(host, port, proxy, callback) {
     let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
@@ -44564,7 +44567,7 @@
     [_proxyTunnel]: core.bool,
     [_context]: io.SecurityContext,
     [_httpParser]: io._HttpParser,
-    [_subscription]: async.StreamSubscription,
+    [_subscription$]: async.StreamSubscription,
     [_httpClient]: io._HttpClient,
     [_dispose]: core.bool,
     [_idleTimer]: async.Timer,
@@ -44601,7 +44604,7 @@
 });
 const _idle = Symbol('_idle');
 const _active = Symbol('_active');
-const _pending = Symbol('_pending');
+const _pending$ = Symbol('_pending');
 const _connecting = Symbol('_connecting');
 const _checkPending = Symbol('_checkPending');
 const _connectionsChanged = Symbol('_connectionsChanged');
@@ -44611,7 +44614,7 @@
   new(key, host, port, isSecure, context) {
     this[_idle] = HashSetOf_HttpClientConnection().new();
     this[_active] = HashSetOf_HttpClientConnection().new();
-    this[_pending] = new collection.ListQueue();
+    this[_pending$] = new collection.ListQueue();
     this.key = key;
     this.host = host;
     this.port = port;
@@ -44637,8 +44640,8 @@
     return connection;
   }
   [_checkPending]() {
-    if (dart.test(this[_pending].isNotEmpty)) {
-      dart.dcall(this[_pending].removeFirst());
+    if (dart.test(this[_pending$].isNotEmpty)) {
+      dart.dcall(this[_pending$].removeFirst());
     }
   }
   addNewActive(connection) {
@@ -44675,7 +44678,7 @@
     }
     if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
       let completer = async.Completer.new();
-      this[_pending].add(dart.fn(() => {
+      this[_pending$].add(dart.fn(() => {
         this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
       }, VoidToNull()));
       return FutureOf_ConnectionInfo()._check(completer.future);
@@ -44685,7 +44688,7 @@
       if (currentBadCertificateCallback == null) return false;
       return currentBadCertificateCallback(certificate, uriHost, uriPort);
     }
-    dart.fn(callback, X509CertificateTobool());
+    dart.fn(callback, X509CertificateTobool$());
     let socketFuture = dart.test(this.isSecure) && dart.test(proxy.isDirect) ? io.SecureSocket.connect(this.host, this.port, {context: this.context, onBadCertificate: callback}) : io.Socket.connect(this.host, this.port);
     this[_connecting] = dart.notNull(this[_connecting]) + 1;
     return socketFuture.then(io._ConnectionInfo)(dart.fn(socket => {
@@ -44706,7 +44709,7 @@
         this[_connecting] = dart.notNull(this[_connecting]) - 1;
         this[_checkPending]();
         dart.throw(error);
-      }, dynamicToNull())});
+      }, dynamicToNull$())});
   }
 };
 dart.setSignature(io._ConnectionTarget, {
@@ -44719,7 +44722,7 @@
     context: io.SecurityContext,
     [_idle]: SetOf_HttpClientConnection(),
     [_active]: SetOf_HttpClientConnection(),
-    [_pending]: collection.Queue,
+    [_pending$]: collection.Queue,
     [_connecting]: core.int
   }),
   getters: () => ({
@@ -44739,7 +44742,7 @@
 });
 io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
 const _idleTimeout = Symbol('_idleTimeout');
-let const;
+let const$69;
 const _connectionTargets = Symbol('_connectionTargets');
 const _credentials = Symbol('_credentials');
 const _closing = Symbol('_closing');
@@ -44747,7 +44750,7 @@
 const _findProxy = Symbol('_findProxy');
 const _openUrl = Symbol('_openUrl');
 const _closeConnections = Symbol('_closeConnections');
-let const;
+let const$70;
 const _getConnection = Symbol('_getConnection');
 io._HttpClient = class _HttpClient extends core.Object {
   get idleTimeout() {
@@ -44764,7 +44767,7 @@
     this[_authenticate] = null;
     this[_authenticateProxy] = null;
     this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-    this[_idleTimeout] = const || (const = dart.const(new core.Duration({seconds: 15})));
+    this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
     this[_badCertificateCallback] = null;
     this.maxConnectionsPerHost = null;
     this.autoUncompress = true;
@@ -44882,7 +44885,7 @@
     if (port == 0) {
       port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
     }
-    let proxyConf = const || (const = dart.const(new io._ProxyConfiguration.direct()));
+    let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
     if (this[_findProxy] != null) {
       try {
         proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
@@ -44997,7 +45000,7 @@
   static _findProxyFromEnvironment(url, environment) {
     function checkNoProxy(option) {
       if (option == null) return null;
-      let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString()))[dartx.iterator];
+      let names = option[dartx.split](",")[dartx.map](core.String)(dart.fn(s => s[dartx.trim](), StringToString$()))[dartx.iterator];
       while (dart.test(names.moveNext())) {
         let name = names.current;
         if (dart.test(name[dartx.startsWith]("[")) && dart.test(name[dartx.endsWith]("]")) && dart.str`[${url.host}]` == name || dart.test(name[dartx.isNotEmpty]) && dart.test(url.host[dartx.endsWith](name))) {
@@ -45006,7 +45009,7 @@
       }
       return null;
     }
-    dart.fn(checkNoProxy, StringToString());
+    dart.fn(checkNoProxy, StringToString$());
     function checkProxy(option) {
       if (option == null) return null;
       option = option[dartx.trim]();
@@ -45027,7 +45030,7 @@
       }
       return dart.str`PROXY ${option}`;
     }
-    dart.fn(checkProxy, StringToString());
+    dart.fn(checkProxy, StringToString$());
     if (environment == null) environment = io._HttpClient._platformEnvironmentCache;
     let proxyCfg = null;
     let noProxy = environment[dartx._get]("no_proxy");
@@ -45119,7 +45122,7 @@
   },
   set _platformEnvironmentCache(_) {}
 });
-const _state = Symbol('_state');
+const _state$1 = Symbol('_state');
 const _idleMark = Symbol('_idleMark');
 const _owner = Symbol('_owner');
 const _serviceId = Symbol('_serviceId');
@@ -45133,7 +45136,7 @@
 const _serviceTypeName = Symbol('_serviceTypeName');
 const _servicePath = Symbol('_servicePath');
 const _serviceType = Symbol('_serviceType');
-const _toJSON = Symbol('_toJSON');
+const _toJSON$ = Symbol('_toJSON');
 const __serviceId = Symbol('__serviceId');
 io._ServiceObject = class _ServiceObject extends core.Object {
   new() {
@@ -45168,8 +45171,8 @@
     this[_socket] = socket;
     this[_httpServer] = httpServer;
     this[_httpParser] = io._HttpParser.requestParser();
-    this[_state] = io._HttpConnection._IDLE;
-    this[_subscription] = null;
+    this[_state$1] = io._HttpConnection._IDLE;
+    this[_subscription$] = null;
     this[_idleMark] = false;
     this[_streamFuture] = null;
     super.new();
@@ -45181,30 +45184,30 @@
 
     io._HttpConnection._connections[dartx._set](this[_serviceId], this);
     this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
-    this[_subscription] = this[_httpParser].listen(dart.fn(incoming => {
+    this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
       this[_httpServer][_markActive](this);
       incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
         if (dart.test(closing)) this.destroy();
-      }, dynamicToNull()));
-      this[_subscription].pause();
-      this[_state] = io._HttpConnection._ACTIVE;
+      }, dynamicToNull$()));
+      this[_subscription$].pause();
+      this[_state$1] = io._HttpConnection._ACTIVE;
       let outgoing = new io._HttpOutgoing(io.Socket._check(this[_socket]));
       let response = new io._HttpResponse(incoming.uri, incoming.headers.protocolVersion, outgoing, this[_httpServer].defaultResponseHeaders, this[_httpServer].serverHeader);
       let request = new io._HttpRequest(response, incoming, this[_httpServer], this);
       this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(_ => {
         response.deadline = null;
-        if (this[_state] == io._HttpConnection._DETACHED) return;
+        if (this[_state$1] == io._HttpConnection._DETACHED) return;
         if (dart.test(response.persistentConnection) && dart.test(request.persistentConnection) && dart.test(incoming.fullBodyRead) && !dart.test(this[_httpParser].upgrade) && !dart.test(this[_httpServer].closed)) {
-          this[_state] = io._HttpConnection._IDLE;
+          this[_state$1] = io._HttpConnection._IDLE;
           this[_idleMark] = false;
           this[_httpServer][_markIdle](this);
-          this[_subscription].resume();
+          this[_subscription$].resume();
         } else {
           this.destroy();
         }
-      }, dynamicToNull()), {onError: dart.fn(_ => {
+      }, dynamicToNull$()), {onError: dart.fn(_ => {
           this.destroy();
-        }, dynamicToNull())});
+        }, dynamicToNull$())});
       outgoing.ignoreBody = request.method == "HEAD";
       response[_httpRequest] = request;
       this[_httpServer][_handleRequest](request);
@@ -45212,7 +45215,7 @@
         this.destroy();
       }, VoidToNull()), onError: dart.fn(error => {
         this.destroy();
-      }, dynamicToNull())});
+      }, dynamicToNull$())});
   }
   markIdle() {
     this[_idleMark] = true;
@@ -45221,14 +45224,14 @@
     return this[_idleMark];
   }
   destroy() {
-    if (this[_state] == io._HttpConnection._CLOSING || this[_state] == io._HttpConnection._DETACHED) return;
-    this[_state] = io._HttpConnection._CLOSING;
+    if (this[_state$1] == io._HttpConnection._CLOSING || this[_state$1] == io._HttpConnection._DETACHED) return;
+    this[_state$1] = io._HttpConnection._CLOSING;
     dart.dsend(this[_socket], 'destroy');
     this[_httpServer][_connectionClosed](this);
     io._HttpConnection._connections[dartx.remove](this[_serviceId]);
   }
   detachSocket() {
-    this[_state] = io._HttpConnection._DETACHED;
+    this[_state$1] = io._HttpConnection._DETACHED;
     this[_httpServer][_connectionClosed](this);
     let detachedIncoming = this[_httpParser].detachIncoming();
     return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
@@ -45240,16 +45243,16 @@
     return io._HttpConnectionInfo.create(io.Socket._check(this[_socket]));
   }
   get [_isActive]() {
-    return this[_state] == io._HttpConnection._ACTIVE;
+    return this[_state$1] == io._HttpConnection._ACTIVE;
   }
   get [_isIdle]() {
-    return this[_state] == io._HttpConnection._IDLE;
+    return this[_state$1] == io._HttpConnection._IDLE;
   }
   get [_isClosing]() {
-    return this[_state] == io._HttpConnection._CLOSING;
+    return this[_state$1] == io._HttpConnection._CLOSING;
   }
   get [_isDetached]() {
-    return this[_state] == io._HttpConnection._DETACHED;
+    return this[_state$1] == io._HttpConnection._DETACHED;
   }
   get [_serviceTypePath]() {
     return 'io/http/serverconnections';
@@ -45257,20 +45260,20 @@
   get [_serviceTypeName]() {
     return 'HttpServerConnection';
   }
-  [_toJSON](ref) {
+  [_toJSON$](ref) {
     let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')} <-> ` + dart.str`${dart.dload(dart.dload(this[_socket], 'remoteAddress'), 'host')}:${dart.dload(this[_socket], 'remotePort')}`;
     let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
     if (dart.test(ref)) {
       return r;
     }
-    r[dartx._set]('server', this[_httpServer][_toJSON](true));
+    r[dartx._set]('server', this[_httpServer][_toJSON$](true));
     try {
-      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON, true));
+      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
     } catch (_) {
       r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
     }
 
-    switch (this[_state]) {
+    switch (this[_state$1]) {
       case io._HttpConnection._ACTIVE:
       {
         r[dartx._set]('state', "Active");
@@ -45308,8 +45311,8 @@
     [_socket]: dart.dynamic,
     [_httpServer]: io._HttpServer,
     [_httpParser]: io._HttpParser,
-    [_state]: core.int,
-    [_subscription]: async.StreamSubscription,
+    [_state$1]: core.int,
+    [_subscription$]: async.StreamSubscription,
     [_idleMark]: core.bool,
     [_streamFuture]: async.Future
   }),
@@ -45327,7 +45330,7 @@
     markIdle: dart.definiteFunctionType(dart.void, []),
     destroy: dart.definiteFunctionType(dart.void, []),
     detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
-    [_toJSON]: dart.definiteFunctionType(core.Map, [core.bool])
+    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
   }),
   sfields: () => ({
     _ACTIVE: core.int,
@@ -45351,8 +45354,8 @@
 const _idleConnections = Symbol('_idleConnections');
 const _serverSocket = Symbol('_serverSocket');
 const _closeServer = Symbol('_closeServer');
-let const;
-let const;
+let const$71;
+let const$72;
 io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
   static bind(address, port, backlog, v6Only, shared) {
     return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
@@ -45372,10 +45375,10 @@
     this[_idleTimer] = null;
     this[_sessionManagerInstance] = null;
     this.closed = false;
-    this[_controller] = null;
+    this[_controller$0] = null;
     super.new();
-    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const || (const = dart.const(new core.Duration({seconds: 120})));
+    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
+    this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     dart.dput(this[_serverSocket], _owner, this);
   }
@@ -45391,10 +45394,10 @@
     this[_idleTimer] = null;
     this[_sessionManagerInstance] = null;
     this.closed = false;
-    this[_controller] = null;
+    this[_controller$0] = null;
     super.new();
-    this[_controller] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const || (const = dart.const(new core.Duration({seconds: 120})));
+    this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
+    this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     try {
       dart.dput(this[_serverSocket], _owner, this);
@@ -45441,10 +45444,10 @@
       this[_idleConnections].add(connection);
     }, SocketToNull()), {onError: dart.fn((error, stackTrace) => {
         if (!io.HandshakeException.is(error)) {
-          this[_controller].addError(error, core.StackTrace._check(stackTrace));
+          this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
         }
-      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller], 'close')});
-    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      }, dynamicAnddynamicToNull()), onDone: dart.bind(this[_controller$0], 'close')});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   close(opts) {
     let force = opts && 'force' in opts ? opts.force : false;
@@ -45488,7 +45491,7 @@
   }
   [_handleRequest](request) {
     if (!dart.test(this.closed)) {
-      this[_controller].add(request);
+      this[_controller$0].add(request);
     } else {
       request[_httpConnection].destroy();
     }
@@ -45534,21 +45537,21 @@
   get [_serviceTypeName]() {
     return 'HttpServer';
   }
-  [_toJSON](ref) {
+  [_toJSON$](ref) {
     let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: dart.str`${this.address.host}:${this.port}`, user_name: dart.str`${this.address.host}:${this.port}`}, core.String, dart.dynamic);
     if (dart.test(ref)) {
       return r;
     }
     try {
-      r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON, true));
+      r[dartx._set]('socket', dart.dsend(this[_serverSocket], _toJSON$, true));
     } catch (_) {
       r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
     }
 
     r[dartx._set]('port', this.port);
     r[dartx._set]('address', this.address.host);
-    r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON](true), _HttpConnectionToMap()))[dartx.toList]());
-    r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON](true), _HttpConnectionToMap()))[dartx.toList]());
+    r[dartx._set]('active', this[_activeConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
+    r[dartx._set]('idle', this[_idleConnections].map(core.Map)(dart.fn(c => c[_toJSON$](true), _HttpConnectionToMap()))[dartx.toList]());
     r[dartx._set]('closed', this.closed);
     return r;
   }
@@ -45574,7 +45577,7 @@
     [_closeServer]: core.bool,
     [_activeConnections]: LinkedListOf_HttpConnection(),
     [_idleConnections]: LinkedListOf_HttpConnection(),
-    [_controller]: StreamControllerOfHttpRequest()
+    [_controller$0]: StreamControllerOfHttpRequest()
   }),
   getters: () => ({
     idleTimeout: dart.definiteFunctionType(core.Duration, []),
@@ -45597,7 +45600,7 @@
     [_markIdle]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
     [_markActive]: dart.definiteFunctionType(dart.void, [io._HttpConnection]),
     connectionsInfo: dart.definiteFunctionType(io.HttpConnectionsInfo, []),
-    [_toJSON]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
+    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
   }),
   sfields: () => ({_servers: MapOfint$_HttpServer()}),
   statics: () => ({
@@ -45647,8 +45650,8 @@
   }),
   getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
 });
-let const;
-let const;
+let const$73;
+let const$74;
 io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
   new(configuration) {
     this.proxies = ListOf_Proxy().new();
@@ -45703,7 +45706,7 @@
     }, StringToNull()));
   }
   direct() {
-    this.proxies = const || (const = dart.constList([const || (const = dart.const(new io._Proxy.direct()))], io._Proxy));
+    this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
   }
 };
 dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
@@ -45819,8 +45822,8 @@
   setOption(option, enabled) {
     return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
   }
-  [_toJSON](ref) {
-    return core.Map._check(dart.dsend(this[_socket], _toJSON, ref));
+  [_toJSON$](ref) {
+    return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
   }
   set [_owner](owner) {
     dart.dput(this[_socket], _owner, owner);
@@ -45859,7 +45862,7 @@
     flush: dart.definiteFunctionType(async.Future, []),
     close: dart.definiteFunctionType(async.Future, []),
     setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
-    [_toJSON]: dart.definiteFunctionType(core.Map, [core.bool])
+    [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
   })
 });
 const _scheme = Symbol('_scheme');
@@ -46133,7 +46136,7 @@
   version = version[dartx.substring](0, index);
   return dart.str`Dart/${version} (dart:io)`;
 };
-dart.fn(io._getHttpVersion, VoidToString());
+dart.fn(io._getHttpVersion, VoidToString$());
 io._Const = class _Const extends core.Object {};
 dart.setSignature(io._Const, {
   sfields: () => ({
@@ -46279,49 +46282,49 @@
 io._MessageType.RESPONSE = 0;
 const _injectData = Symbol('_injectData');
 const _userOnData = Symbol('_userOnData');
-const _isCanceled = Symbol('_isCanceled');
-const _pauseCount = Symbol('_pauseCount');
+const _isCanceled$ = Symbol('_isCanceled');
+const _pauseCount$ = Symbol('_pauseCount');
 const _scheduled = Symbol('_scheduled');
 const _maybeScheduleData = Symbol('_maybeScheduleData');
 io._HttpDetachedStreamSubscription = class _HttpDetachedStreamSubscription extends core.Object {
   new(subscription, injectData, userOnData) {
-    this[_subscription] = subscription;
+    this[_subscription$] = subscription;
     this[_injectData] = injectData;
     this[_userOnData] = userOnData;
-    this[_isCanceled] = false;
-    this[_pauseCount] = 1;
+    this[_isCanceled$] = false;
+    this[_pauseCount$] = 1;
     this[_scheduled] = false;
   }
   get isPaused() {
-    return this[_subscription].isPaused;
+    return this[_subscription$].isPaused;
   }
   asFuture(T) {
     return futureValue => {
       if (futureValue === void 0) futureValue = null;
-      return this[_subscription].asFuture(T)(futureValue);
+      return this[_subscription$].asFuture(T)(futureValue);
     };
   }
   cancel() {
-    this[_isCanceled] = true;
+    this[_isCanceled$] = true;
     this[_injectData] = null;
-    return this[_subscription].cancel();
+    return this[_subscription$].cancel();
   }
   onData(handleData) {
     this[_userOnData] = handleData;
-    this[_subscription].onData(handleData);
+    this[_subscription$].onData(handleData);
   }
   onDone(handleDone) {
-    this[_subscription].onDone(handleDone);
+    this[_subscription$].onDone(handleDone);
   }
   onError(handleError) {
-    this[_subscription].onError(handleError);
+    this[_subscription$].onError(handleError);
   }
   pause(resumeSignal) {
     if (resumeSignal === void 0) resumeSignal = null;
     if (this[_injectData] == null) {
-      this[_subscription].pause(resumeSignal);
+      this[_subscription$].pause(resumeSignal);
     } else {
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
       if (resumeSignal != null) {
         resumeSignal.whenComplete(dart.bind(this, 'resume'));
       }
@@ -46329,22 +46332,22 @@
   }
   resume() {
     if (this[_injectData] == null) {
-      this[_subscription].resume();
+      this[_subscription$].resume();
     } else {
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
       this[_maybeScheduleData]();
     }
   }
   [_maybeScheduleData]() {
     if (dart.test(this[_scheduled])) return;
-    if (this[_pauseCount] != 0) return;
+    if (this[_pauseCount$] != 0) return;
     this[_scheduled] = true;
     async.scheduleMicrotask(dart.fn(() => {
       this[_scheduled] = false;
-      if (dart.notNull(this[_pauseCount]) > 0 || dart.test(this[_isCanceled])) return;
+      if (dart.notNull(this[_pauseCount$]) > 0 || dart.test(this[_isCanceled$])) return;
       let data = this[_injectData];
       this[_injectData] = null;
-      this[_subscription].resume();
+      this[_subscription$].resume();
       if (this[_userOnData] != null) {
         dart.dcall(this[_userOnData], data);
       }
@@ -46355,10 +46358,10 @@
 dart.setSignature(io._HttpDetachedStreamSubscription, {
   constructors: () => ({new: dart.definiteFunctionType(io._HttpDetachedStreamSubscription, [StreamSubscriptionOfListOfint(), ListOfint(), core.Function])}),
   fields: () => ({
-    [_subscription]: StreamSubscriptionOfListOfint(),
+    [_subscription$]: StreamSubscriptionOfListOfint(),
     [_injectData]: ListOfint(),
-    [_isCanceled]: core.bool,
-    [_pauseCount]: core.int,
+    [_isCanceled$]: core.bool,
+    [_pauseCount$]: core.int,
     [_userOnData]: core.Function,
     [_scheduled]: core.bool
   }),
@@ -46411,13 +46414,13 @@
   }),
   methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
 });
-const _method = Symbol('_method');
+const _method$ = Symbol('_method');
 const _uri_or_reason_phrase = Symbol('_uri_or_reason_phrase');
 const _headerField = Symbol('_headerField');
 const _headerValue = Symbol('_headerValue');
 const _requestParser = Symbol('_requestParser');
 const _parserCalled = Symbol('_parserCalled');
-const _index = Symbol('_index');
+const _index$2 = Symbol('_index');
 const _httpVersionIndex = Symbol('_httpVersionIndex');
 const _messageType = Symbol('_messageType');
 const _statusCodeLength = Symbol('_statusCodeLength');
@@ -46432,8 +46435,8 @@
 const _bodyController = Symbol('_bodyController');
 const _pauseStateChanged = Symbol('_pauseStateChanged');
 const _reset = Symbol('_reset');
-const _onData = Symbol('_onData');
-const _onDone = Symbol('_onDone');
+const _onData$ = Symbol('_onData');
+const _onDone$ = Symbol('_onDone');
 const _doParse = Symbol('_doParse');
 const _reportError = Symbol('_reportError');
 const _createIncoming = Symbol('_createIncoming');
@@ -46451,15 +46454,15 @@
     return new io._HttpParser._(false);
   }
   _(requestParser) {
-    this[_method] = JSArrayOfint().of([]);
+    this[_method$] = JSArrayOfint().of([]);
     this[_uri_or_reason_phrase] = JSArrayOfint().of([]);
     this[_headerField] = JSArrayOfint().of([]);
     this[_headerValue] = JSArrayOfint().of([]);
     this[_requestParser] = requestParser;
     this[_parserCalled] = false;
-    this[_buffer] = null;
-    this[_index] = null;
-    this[_state] = null;
+    this[_buffer$] = null;
+    this[_index$2] = null;
+    this[_state$1] = null;
     this[_httpVersionIndex] = null;
     this[_messageType] = null;
     this[_statusCode] = 0;
@@ -46476,10 +46479,10 @@
     this[_socketSubscription] = null;
     this[_paused] = true;
     this[_bodyPaused] = false;
-    this[_controller] = null;
+    this[_controller$0] = null;
     this[_bodyController] = null;
     super.new();
-    this[_controller] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
+    this[_controller$0] = StreamControllerOf_HttpIncoming().new({sync: true, onListen: dart.fn(() => {
         this[_paused] = false;
       }, VoidToNull()), onPause: dart.fn(() => {
         this[_paused] = true;
@@ -46498,17 +46501,17 @@
     let onError = opts && 'onError' in opts ? opts.onError : null;
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   listenToStream(stream) {
-    this[_socketSubscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this, _onDone)});
+    this[_socketSubscription] = stream.listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this, _onDone$)});
   }
   [_parse]() {
     try {
       this[_doParse]();
     } catch (e) {
       let s = dart.stackTrace(e);
-      this[_state] = io._State.FAILURE;
+      this[_state$1] = io._State.FAILURE;
       this[_reportError](e, s);
     }
 
@@ -46521,80 +46524,80 @@
       this[_transferLength] = 0;
     }
     if (dart.test(this[_connectionUpgrade])) {
-      this[_state] = io._State.UPGRADED;
+      this[_state$1] = io._State.UPGRADED;
       this[_transferLength] = 0;
     }
     this[_createIncoming](this[_transferLength]);
     if (dart.test(this[_requestParser])) {
-      this[_incoming].method = core.String.fromCharCodes(this[_method]);
+      this[_incoming].method = core.String.fromCharCodes(this[_method$]);
       this[_incoming].uri = core.Uri.parse(core.String.fromCharCodes(this[_uri_or_reason_phrase]));
     } else {
       this[_incoming].statusCode = this[_statusCode];
       this[_incoming].reasonPhrase = core.String.fromCharCodes(this[_uri_or_reason_phrase]);
     }
-    this[_method][dartx.clear]();
+    this[_method$][dartx.clear]();
     this[_uri_or_reason_phrase][dartx.clear]();
     if (dart.test(this[_connectionUpgrade])) {
       this[_incoming].upgraded = true;
       this[_parserCalled] = false;
       let tmp = this[_incoming];
       this[_closeIncoming]();
-      this[_controller].add(tmp);
+      this[_controller$0].add(tmp);
       return true;
     }
     if (this[_transferLength] == 0 || this[_messageType] == io._MessageType.RESPONSE && dart.test(this[_noMessageBody])) {
       this[_reset]();
       let tmp = this[_incoming];
       this[_closeIncoming]();
-      this[_controller].add(tmp);
+      this[_controller$0].add(tmp);
       return false;
     } else if (dart.test(this[_chunked])) {
-      this[_state] = io._State.CHUNK_SIZE;
+      this[_state$1] = io._State.CHUNK_SIZE;
       this[_remainingContent] = 0;
     } else if (dart.notNull(this[_transferLength]) > 0) {
       this[_remainingContent] = this[_transferLength];
-      this[_state] = io._State.BODY;
+      this[_state$1] = io._State.BODY;
     } else {
-      this[_state] = io._State.BODY;
+      this[_state$1] = io._State.BODY;
     }
     this[_parserCalled] = false;
-    this[_controller].add(this[_incoming]);
+    this[_controller$0].add(this[_incoming]);
     return true;
   }
   [_doParse]() {
     dart.assert(!dart.test(this[_parserCalled]));
     this[_parserCalled] = true;
-    if (this[_state] == io._State.CLOSED) {
+    if (this[_state$1] == io._State.CLOSED) {
       dart.throw(new io.HttpException("Data on closed connection"));
     }
-    if (this[_state] == io._State.FAILURE) {
+    if (this[_state$1] == io._State.FAILURE) {
       dart.throw(new io.HttpException("Data on failed connection"));
     }
-    while (this[_buffer] != null && dart.notNull(this[_index]) < dart.notNull(this[_buffer][dartx.length]) && this[_state] != io._State.FAILURE && this[_state] != io._State.UPGRADED) {
+    while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
       if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
         this[_parserCalled] = false;
         return;
       }
-      let byte = this[_buffer][dartx._get]((() => {
-        let x = this[_index];
-        this[_index] = dart.notNull(x) + 1;
+      let byte = this[_buffer$][dartx._get]((() => {
+        let x = this[_index$2];
+        this[_index$2] = dart.notNull(x) + 1;
         return x;
       })());
-      switch (this[_state]) {
+      switch (this[_state$1]) {
         case io._State.START:
         {
           if (byte == io._Const.HTTP[dartx._get](0)) {
             this[_httpVersionIndex] = 1;
-            this[_state] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
+            this[_state$1] = io._State.METHOD_OR_RESPONSE_HTTP_VERSION;
           } else {
             if (!dart.test(io._HttpParser._isTokenChar(byte))) {
               dart.throw(new io.HttpException("Invalid request method"));
             }
-            this[_method][dartx.add](byte);
+            this[_method$][dartx.add](byte);
             if (!dart.test(this[_requestParser])) {
               dart.throw(new io.HttpException("Invalid response line"));
             }
-            this[_state] = io._State.REQUEST_LINE_METHOD;
+            this[_state$1] = io._State.REQUEST_LINE_METHOD;
           }
           break;
         }
@@ -46607,20 +46610,20 @@
             if (dart.test(this[_requestParser])) {
               dart.throw(new io.HttpException("Invalid request line"));
             }
-            this[_state] = io._State.RESPONSE_HTTP_VERSION;
+            this[_state$1] = io._State.RESPONSE_HTTP_VERSION;
           } else {
             for (let i = 0; i < dart.notNull(this[_httpVersionIndex]); i++) {
-              this[_method][dartx.add](io._Const.HTTP[dartx._get](i));
+              this[_method$][dartx.add](io._Const.HTTP[dartx._get](i));
             }
             if (byte == io._CharCode.SP) {
-              this[_state] = io._State.REQUEST_LINE_URI;
+              this[_state$1] = io._State.REQUEST_LINE_URI;
             } else {
-              this[_method][dartx.add](byte);
+              this[_method$][dartx.add](byte);
               this[_httpVersion] = io._HttpVersion.UNDETERMINED;
               if (!dart.test(this[_requestParser])) {
                 dart.throw(new io.HttpException("Invalid response line"));
               }
-              this[_state] = io._State.REQUEST_LINE_METHOD;
+              this[_state$1] = io._State.REQUEST_LINE_METHOD;
             }
           }
           break;
@@ -46640,7 +46643,7 @@
             this[_httpVersionIndex] = dart.notNull(this[_httpVersionIndex]) + 1;
           } else if (this[_httpVersionIndex] == dart.notNull(io._Const.HTTP1DOT[dartx.length]) + 1) {
             this[_expect](byte, io._CharCode.SP);
-            this[_state] = io._State.RESPONSE_LINE_STATUS_CODE;
+            this[_state$1] = io._State.RESPONSE_LINE_STATUS_CODE;
           } else {
             dart.throw(new io.HttpException("Invalid response line"));
           }
@@ -46649,12 +46652,12 @@
         case io._State.REQUEST_LINE_METHOD:
         {
           if (byte == io._CharCode.SP) {
-            this[_state] = io._State.REQUEST_LINE_URI;
+            this[_state$1] = io._State.REQUEST_LINE_URI;
           } else {
             if (dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte)) || byte == io._CharCode.CR || byte == io._CharCode.LF) {
               dart.throw(new io.HttpException("Invalid request method"));
             }
-            this[_method][dartx.add](byte);
+            this[_method$][dartx.add](byte);
           }
           break;
         }
@@ -46664,7 +46667,7 @@
             if (this[_uri_or_reason_phrase][dartx.length] == 0) {
               dart.throw(new io.HttpException("Invalid request URI"));
             }
-            this[_state] = io._State.REQUEST_LINE_HTTP_VERSION;
+            this[_state$1] = io._State.REQUEST_LINE_HTTP_VERSION;
             this[_httpVersionIndex] = 0;
           } else {
             if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
@@ -46693,11 +46696,11 @@
             }
           } else {
             if (byte == io._CharCode.CR) {
-              this[_state] = io._State.REQUEST_LINE_ENDING;
+              this[_state$1] = io._State.REQUEST_LINE_ENDING;
             } else {
               this[_expect](byte, io._CharCode.LF);
               this[_messageType] = io._MessageType.REQUEST;
-              this[_state] = io._State.HEADER_START;
+              this[_state$1] = io._State.HEADER_START;
             }
           }
           break;
@@ -46706,15 +46709,15 @@
         {
           this[_expect](byte, io._CharCode.LF);
           this[_messageType] = io._MessageType.REQUEST;
-          this[_state] = io._State.HEADER_START;
+          this[_state$1] = io._State.HEADER_START;
           break;
         }
         case io._State.RESPONSE_LINE_STATUS_CODE:
         {
           if (byte == io._CharCode.SP) {
-            this[_state] = io._State.RESPONSE_LINE_REASON_PHRASE;
+            this[_state$1] = io._State.RESPONSE_LINE_REASON_PHRASE;
           } else if (byte == io._CharCode.CR) {
-            this[_state] = io._State.RESPONSE_LINE_ENDING;
+            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
           } else {
             this[_statusCodeLength] = dart.notNull(this[_statusCodeLength]) + 1;
             if (dart.notNull(byte) < 48 && 57 < dart.notNull(byte) || dart.notNull(this[_statusCodeLength]) > 3) {
@@ -46728,7 +46731,7 @@
         case io._State.RESPONSE_LINE_REASON_PHRASE:
         {
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.RESPONSE_LINE_ENDING;
+            this[_state$1] = io._State.RESPONSE_LINE_ENDING;
           } else {
             if (byte == io._CharCode.CR || byte == io._CharCode.LF) {
               dart.throw(new io.HttpException("Invalid response reason phrase"));
@@ -46748,27 +46751,27 @@
               this[_noMessageBody] = true;
             }
           }
-          this[_state] = io._State.HEADER_START;
+          this[_state$1] = io._State.HEADER_START;
           break;
         }
         case io._State.HEADER_START:
         {
           this[_headers] = new io._HttpHeaders(this.version);
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.HEADER_ENDING;
+            this[_state$1] = io._State.HEADER_ENDING;
           } else if (byte == io._CharCode.LF) {
-            this[_state] = io._State.HEADER_ENDING;
-            this[_index] = dart.notNull(this[_index]) - 1;
+            this[_state$1] = io._State.HEADER_ENDING;
+            this[_index$2] = dart.notNull(this[_index$2]) - 1;
           } else {
             this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
-            this[_state] = io._State.HEADER_FIELD;
+            this[_state$1] = io._State.HEADER_FIELD;
           }
           break;
         }
         case io._State.HEADER_FIELD:
         {
           if (byte == io._CharCode.COLON) {
-            this[_state] = io._State.HEADER_VALUE_START;
+            this[_state$1] = io._State.HEADER_VALUE_START;
           } else {
             if (!dart.test(io._HttpParser._isTokenChar(byte))) {
               dart.throw(new io.HttpException("Invalid header field name"));
@@ -46780,21 +46783,21 @@
         case io._State.HEADER_VALUE_START:
         {
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
+            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
           } else if (byte == io._CharCode.LF) {
-            this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
+            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
           } else if (byte != io._CharCode.SP && byte != io._CharCode.HT) {
             this[_headerValue][dartx.add](byte);
-            this[_state] = io._State.HEADER_VALUE;
+            this[_state$1] = io._State.HEADER_VALUE;
           }
           break;
         }
         case io._State.HEADER_VALUE:
         {
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
+            this[_state$1] = io._State.HEADER_VALUE_FOLDING_OR_ENDING;
           } else if (byte == io._CharCode.LF) {
-            this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
+            this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
           } else {
             this[_headerValue][dartx.add](byte);
           }
@@ -46803,13 +46806,13 @@
         case io._State.HEADER_VALUE_FOLDING_OR_ENDING:
         {
           this[_expect](byte, io._CharCode.LF);
-          this[_state] = io._State.HEADER_VALUE_FOLD_OR_END;
+          this[_state$1] = io._State.HEADER_VALUE_FOLD_OR_END;
           break;
         }
         case io._State.HEADER_VALUE_FOLD_OR_END:
         {
           if (byte == io._CharCode.SP || byte == io._CharCode.HT) {
-            this[_state] = io._State.HEADER_VALUE_START;
+            this[_state$1] = io._State.HEADER_VALUE_START;
           } else {
             let headerField = core.String.fromCharCodes(this[_headerField]);
             let headerValue = core.String.fromCharCodes(this[_headerValue]);
@@ -46822,21 +46825,21 @@
                 if (dart.test(this[_caseInsensitiveCompare]("upgrade"[dartx.codeUnits], tokens[dartx._get](i)[dartx.codeUnits]))) {
                   this[_connectionUpgrade] = true;
                 }
-                this[_headers][_add](headerField, tokens[dartx._get](i));
+                this[_headers][_add$2](headerField, tokens[dartx._get](i));
               }
             } else {
-              this[_headers][_add](headerField, headerValue);
+              this[_headers][_add$2](headerField, headerValue);
             }
             this[_headerField][dartx.clear]();
             this[_headerValue][dartx.clear]();
             if (byte == io._CharCode.CR) {
-              this[_state] = io._State.HEADER_ENDING;
+              this[_state$1] = io._State.HEADER_ENDING;
             } else if (byte == io._CharCode.LF) {
-              this[_state] = io._State.HEADER_ENDING;
-              this[_index] = dart.notNull(this[_index]) - 1;
+              this[_state$1] = io._State.HEADER_ENDING;
+              this[_index$2] = dart.notNull(this[_index$2]) - 1;
             } else {
               this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
-              this[_state] = io._State.HEADER_FIELD;
+              this[_state$1] = io._State.HEADER_FIELD;
             }
           }
           break;
@@ -46854,21 +46857,21 @@
         case io._State.CHUNK_SIZE_STARTING_CR:
         {
           this[_expect](byte, io._CharCode.CR);
-          this[_state] = io._State.CHUNK_SIZE_STARTING_LF;
+          this[_state$1] = io._State.CHUNK_SIZE_STARTING_LF;
           break;
         }
         case io._State.CHUNK_SIZE_STARTING_LF:
         {
           this[_expect](byte, io._CharCode.LF);
-          this[_state] = io._State.CHUNK_SIZE;
+          this[_state$1] = io._State.CHUNK_SIZE;
           break;
         }
         case io._State.CHUNK_SIZE:
         {
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.CHUNK_SIZE_ENDING;
+            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
           } else if (byte == io._CharCode.SEMI_COLON) {
-            this[_state] = io._State.CHUNK_SIZE_EXTENSION;
+            this[_state$1] = io._State.CHUNK_SIZE_EXTENSION;
           } else {
             let value = this[_expectHexDigit](byte);
             this[_remainingContent] = dart.notNull(this[_remainingContent]) * 16 + dart.notNull(value);
@@ -46878,7 +46881,7 @@
         case io._State.CHUNK_SIZE_EXTENSION:
         {
           if (byte == io._CharCode.CR) {
-            this[_state] = io._State.CHUNK_SIZE_ENDING;
+            this[_state$1] = io._State.CHUNK_SIZE_ENDING;
           }
           break;
         }
@@ -46886,16 +46889,16 @@
         {
           this[_expect](byte, io._CharCode.LF);
           if (dart.notNull(this[_remainingContent]) > 0) {
-            this[_state] = io._State.BODY;
+            this[_state$1] = io._State.BODY;
           } else {
-            this[_state] = io._State.CHUNKED_BODY_DONE_CR;
+            this[_state$1] = io._State.CHUNKED_BODY_DONE_CR;
           }
           break;
         }
         case io._State.CHUNKED_BODY_DONE_CR:
         {
           this[_expect](byte, io._CharCode.CR);
-          this[_state] = io._State.CHUNKED_BODY_DONE_LF;
+          this[_state$1] = io._State.CHUNKED_BODY_DONE_LF;
           break;
         }
         case io._State.CHUNKED_BODY_DONE_LF:
@@ -46907,23 +46910,23 @@
         }
         case io._State.BODY:
         {
-          this[_index] = dart.notNull(this[_index]) - 1;
-          let dataAvailable = dart.notNull(this[_buffer][dartx.length]) - dart.notNull(this[_index]);
+          this[_index$2] = dart.notNull(this[_index$2]) - 1;
+          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
           if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
             dataAvailable = this[_remainingContent];
           }
-          let data = typed_data.Uint8List.view(this[_buffer][dartx.buffer], dart.notNull(this[_buffer][dartx.offsetInBytes]) + dart.notNull(this[_index]), dataAvailable);
+          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
           this[_bodyController].add(data);
           if (this[_remainingContent] != -1) {
             this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
           }
-          this[_index] = dart.notNull(this[_index]) + dart.notNull(data[dartx.length]);
+          this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
           if (this[_remainingContent] == 0) {
             if (!dart.test(this[_chunked])) {
               this[_reset]();
               this[_closeIncoming]();
             } else {
-              this[_state] = io._State.CHUNK_SIZE_STARTING_CR;
+              this[_state$1] = io._State.CHUNK_SIZE_STARTING_CR;
             }
           }
           break;
@@ -46941,55 +46944,55 @@
       }
     }
     this[_parserCalled] = false;
-    if (this[_buffer] != null && this[_index] == this[_buffer][dartx.length]) {
+    if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
       this[_releaseBuffer]();
-      if (this[_state] != io._State.UPGRADED && this[_state] != io._State.FAILURE) {
+      if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
         this[_socketSubscription].resume();
       }
     }
   }
-  [_onData](buffer) {
+  [_onData$](buffer) {
     this[_socketSubscription].pause();
-    dart.assert(this[_buffer] == null);
-    this[_buffer] = typed_data.Uint8List._check(buffer);
-    this[_index] = 0;
+    dart.assert(this[_buffer$] == null);
+    this[_buffer$] = typed_data.Uint8List._check(buffer);
+    this[_index$2] = 0;
     this[_parse]();
   }
-  [_onDone]() {
+  [_onDone$]() {
     this[_socketSubscription] = null;
-    if (this[_state] == io._State.CLOSED || this[_state] == io._State.FAILURE) return;
+    if (this[_state$1] == io._State.CLOSED || this[_state$1] == io._State.FAILURE) return;
     if (this[_incoming] != null) {
-      if (this[_state] != io._State.UPGRADED && !(this[_state] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
+      if (this[_state$1] != io._State.UPGRADED && !(this[_state$1] == io._State.START && !dart.test(this[_requestParser])) && !(this[_state$1] == io._State.BODY && !dart.test(this[_chunked]) && this[_transferLength] == -1)) {
         this[_bodyController].addError(new io.HttpException("Connection closed while receiving data"));
       }
       this[_closeIncoming](true);
-      this[_controller].close();
+      this[_controller$0].close();
       return;
     }
-    if (this[_state] == io._State.START) {
+    if (this[_state$1] == io._State.START) {
       if (!dart.test(this[_requestParser])) {
         this[_reportError](new io.HttpException("Connection closed before full header was received"));
       }
-      this[_controller].close();
+      this[_controller$0].close();
       return;
     }
-    if (this[_state] == io._State.UPGRADED) {
-      this[_controller].close();
+    if (this[_state$1] == io._State.UPGRADED) {
+      this[_controller$0].close();
       return;
     }
-    if (dart.notNull(this[_state]) < io._State.FIRST_BODY_STATE) {
-      this[_state] = io._State.FAILURE;
+    if (dart.notNull(this[_state$1]) < io._State.FIRST_BODY_STATE) {
+      this[_state$1] = io._State.FAILURE;
       this[_reportError](new io.HttpException("Connection closed before full header was received"));
-      this[_controller].close();
+      this[_controller$0].close();
       return;
     }
     if (!dart.test(this[_chunked]) && this[_transferLength] == -1) {
-      this[_state] = io._State.CLOSED;
+      this[_state$1] = io._State.CLOSED;
     } else {
-      this[_state] = io._State.FAILURE;
+      this[_state$1] = io._State.FAILURE;
       this[_reportError](new io.HttpException("Connection closed before full body was received"));
     }
-    this[_controller].close();
+    this[_controller$0].close();
   }
   get version() {
     switch (this[_httpVersion]) {
@@ -47011,7 +47014,7 @@
     return this[_transferLength];
   }
   get upgrade() {
-    return dart.test(this[_connectionUpgrade]) && this[_state] == io._State.UPGRADED;
+    return dart.test(this[_connectionUpgrade]) && this[_state$1] == io._State.UPGRADED;
   }
   get persistentConnection() {
     return this[_persistentConnection];
@@ -47020,23 +47023,23 @@
     if (dart.test(value)) this[_noMessageBody] = true;
   }
   detachIncoming() {
-    this[_state] = io._State.UPGRADED;
+    this[_state$1] = io._State.UPGRADED;
     return new io._HttpDetachedIncoming(this[_socketSubscription], this.readUnparsedData());
   }
   readUnparsedData() {
-    if (this[_buffer] == null) return null;
-    if (this[_index] == this[_buffer][dartx.length]) return null;
-    let result = this[_buffer][dartx.sublist](this[_index]);
+    if (this[_buffer$] == null) return null;
+    if (this[_index$2] == this[_buffer$][dartx.length]) return null;
+    let result = this[_buffer$][dartx.sublist](this[_index$2]);
     this[_releaseBuffer]();
     return result;
   }
   [_reset]() {
-    if (this[_state] == io._State.UPGRADED) return;
-    this[_state] = io._State.START;
+    if (this[_state$1] == io._State.UPGRADED) return;
+    this[_state$1] = io._State.START;
     this[_messageType] = io._MessageType.UNDETERMINED;
     this[_headerField][dartx.clear]();
     this[_headerValue][dartx.clear]();
-    this[_method][dartx.clear]();
+    this[_method$][dartx.clear]();
     this[_uri_or_reason_phrase][dartx.clear]();
     this[_statusCode] = 0;
     this[_statusCodeLength] = 0;
@@ -47050,8 +47053,8 @@
     this[_headers] = null;
   }
   [_releaseBuffer]() {
-    this[_buffer] = null;
-    this[_index] = null;
+    this[_buffer$] = null;
+    this[_index$2] = null;
   }
   static _isTokenChar(byte) {
     return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
@@ -47127,7 +47130,7 @@
           this[_socketSubscription].cancel();
         }
         this[_closeIncoming](true);
-        this[_controller].close();
+        this[_controller$0].close();
       }, VoidToNull())});
     incoming = this[_incoming] = new io._HttpIncoming(this[_headers], transferLength, this[_bodyController].stream);
     this[_bodyPaused] = true;
@@ -47160,9 +47163,9 @@
   [_reportError](error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
     if (this[_socketSubscription] != null) this[_socketSubscription].cancel();
-    this[_state] = io._State.FAILURE;
-    this[_controller].addError(error, core.StackTrace._check(stackTrace));
-    this[_controller].close();
+    this[_state$1] = io._State.FAILURE;
+    this[_controller$0].addError(error, core.StackTrace._check(stackTrace));
+    this[_controller$0].close();
   }
 };
 dart.addSimpleTypeTests(io._HttpParser);
@@ -47175,15 +47178,15 @@
   }),
   fields: () => ({
     [_parserCalled]: core.bool,
-    [_buffer]: typed_data.Uint8List,
-    [_index]: core.int,
+    [_buffer$]: typed_data.Uint8List,
+    [_index$2]: core.int,
     [_requestParser]: core.bool,
-    [_state]: core.int,
+    [_state$1]: core.int,
     [_httpVersionIndex]: core.int,
     [_messageType]: core.int,
     [_statusCode]: core.int,
     [_statusCodeLength]: core.int,
-    [_method]: ListOfint(),
+    [_method$]: ListOfint(),
     [_uri_or_reason_phrase]: ListOfint(),
     [_headerField]: ListOfint(),
     [_headerValue]: ListOfint(),
@@ -47199,7 +47202,7 @@
     [_socketSubscription]: async.StreamSubscription,
     [_paused]: core.bool,
     [_bodyPaused]: core.bool,
-    [_controller]: StreamControllerOf_HttpIncoming(),
+    [_controller$0]: StreamControllerOf_HttpIncoming(),
     [_bodyController]: StreamControllerOfListOfint()
   }),
   getters: () => ({
@@ -47216,8 +47219,8 @@
     [_parse]: dart.definiteFunctionType(dart.void, []),
     [_headersEnd]: dart.definiteFunctionType(core.bool, []),
     [_doParse]: dart.definiteFunctionType(dart.void, []),
-    [_onData]: dart.definiteFunctionType(dart.void, [ListOfint()]),
-    [_onDone]: dart.definiteFunctionType(dart.void, []),
+    [_onData$]: dart.definiteFunctionType(dart.void, [ListOfint()]),
+    [_onDone$]: dart.definiteFunctionType(dart.void, []),
     detachIncoming: dart.definiteFunctionType(io._HttpDetachedIncoming, []),
     readUnparsedData: dart.definiteFunctionType(core.List$(core.int), []),
     [_reset]: dart.definiteFunctionType(dart.void, []),
@@ -47239,17 +47242,17 @@
   names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
 });
 io._DART_SESSION_ID = "DARTSESSID";
-const _data = Symbol('_data');
+const _data$ = Symbol('_data');
 const _lastSeen = Symbol('_lastSeen');
 const _timeoutCallback = Symbol('_timeoutCallback');
 const _prev = Symbol('_prev');
-const _next = Symbol('_next');
+const _next$1 = Symbol('_next');
 const _removeFromTimeoutQueue = Symbol('_removeFromTimeoutQueue');
 const _sessions = Symbol('_sessions');
 const _bumpToEnd = Symbol('_bumpToEnd');
 io._HttpSession = class _HttpSession extends core.Object {
   new(sessionManager, id) {
-    this[_data] = collection.HashMap.new();
+    this[_data$] = collection.HashMap.new();
     this[_sessionManager] = sessionManager;
     this.id = id;
     this[_lastSeen] = new core.DateTime.now();
@@ -47257,7 +47260,7 @@
     this[_isNew] = true;
     this[_timeoutCallback] = null;
     this[_prev] = null;
-    this[_next] = null;
+    this[_next$1] = null;
   }
   destroy() {
     this[_destroyed] = true;
@@ -47278,50 +47281,50 @@
     this[_timeoutCallback] = callback;
   }
   containsValue(value) {
-    return this[_data][dartx.containsValue](value);
+    return this[_data$][dartx.containsValue](value);
   }
   containsKey(key) {
-    return this[_data][dartx.containsKey](key);
+    return this[_data$][dartx.containsKey](key);
   }
   _get(key) {
-    return this[_data][dartx._get](key);
+    return this[_data$][dartx._get](key);
   }
   _set(key, value) {
-    this[_data][dartx._set](key, value);
+    this[_data$][dartx._set](key, value);
     return value;
   }
   putIfAbsent(key, ifAbsent) {
-    return this[_data][dartx.putIfAbsent](key, ifAbsent);
+    return this[_data$][dartx.putIfAbsent](key, ifAbsent);
   }
   addAll(other) {
-    return this[_data][dartx.addAll](other);
+    return this[_data$][dartx.addAll](other);
   }
   remove(key) {
-    return this[_data][dartx.remove](key);
+    return this[_data$][dartx.remove](key);
   }
   clear() {
-    this[_data][dartx.clear]();
+    this[_data$][dartx.clear]();
   }
   forEach(f) {
-    this[_data][dartx.forEach](f);
+    this[_data$][dartx.forEach](f);
   }
   get keys() {
-    return this[_data][dartx.keys];
+    return this[_data$][dartx.keys];
   }
   get values() {
-    return this[_data][dartx.values];
+    return this[_data$][dartx.values];
   }
   get length() {
-    return this[_data][dartx.length];
+    return this[_data$][dartx.length];
   }
   get isEmpty() {
-    return this[_data][dartx.isEmpty];
+    return this[_data$][dartx.isEmpty];
   }
   get isNotEmpty() {
-    return this[_data][dartx.isNotEmpty];
+    return this[_data$][dartx.isNotEmpty];
   }
   toString() {
-    return dart.str`HttpSession id:${this.id} ${this[_data]}`;
+    return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
   }
 };
 io._HttpSession[dart.implements] = () => [io.HttpSession];
@@ -47334,9 +47337,9 @@
     [_timeoutCallback]: core.Function,
     [_sessionManager]: io._HttpSessionManager,
     [_prev]: io._HttpSession,
-    [_next]: io._HttpSession,
+    [_next$1]: io._HttpSession,
     id: core.String,
-    [_data]: core.Map
+    [_data$]: core.Map
   }),
   getters: () => ({
     lastSeen: dart.definiteFunctionType(core.DateTime, []),
@@ -47379,8 +47382,8 @@
   'isNotEmpty'
 ]);
 const _sessionTimeout = Symbol('_sessionTimeout');
-const _head = Symbol('_head');
-const _tail = Symbol('_tail');
+const _head$ = Symbol('_head');
+const _tail$ = Symbol('_tail');
 const _timer = Symbol('_timer');
 const _addToTimeoutQueue = Symbol('_addToTimeoutQueue');
 const _stopTimer = Symbol('_stopTimer');
@@ -47390,8 +47393,8 @@
   new() {
     this[_sessions] = dart.map({}, core.String, io._HttpSession);
     this[_sessionTimeout] = 20 * 60;
-    this[_head] = null;
-    this[_tail] = null;
+    this[_head$] = null;
+    this[_tail$] = null;
     this[_timer] = null;
   }
   createSessionId() {
@@ -47424,39 +47427,39 @@
     this[_addToTimeoutQueue](session);
   }
   [_addToTimeoutQueue](session) {
-    if (this[_head] == null) {
-      dart.assert(this[_tail] == null);
-      this[_tail] = this[_head] = session;
+    if (this[_head$] == null) {
+      dart.assert(this[_tail$] == null);
+      this[_tail$] = this[_head$] = session;
       this[_startTimer]();
     } else {
       dart.assert(this[_timer] != null);
-      dart.assert(this[_tail] != null);
-      this[_tail][_next] = session;
-      session[_prev] = this[_tail];
-      this[_tail] = session;
+      dart.assert(this[_tail$] != null);
+      this[_tail$][_next$1] = session;
+      session[_prev] = this[_tail$];
+      this[_tail$] = session;
     }
   }
   [_removeFromTimeoutQueue](session) {
-    if (session[_next] != null) {
-      session[_next][_prev] = session[_prev];
+    if (session[_next$1] != null) {
+      session[_next$1][_prev] = session[_prev];
     }
     if (session[_prev] != null) {
-      session[_prev][_next] = session[_next];
+      session[_prev][_next$1] = session[_next$1];
     }
-    if (dart.equals(this[_head], session)) {
-      this[_head] = session[_next];
+    if (dart.equals(this[_head$], session)) {
+      this[_head$] = session[_next$1];
       this[_stopTimer]();
       this[_startTimer]();
     }
-    if (dart.equals(this[_tail], session)) {
-      this[_tail] = session[_prev];
+    if (dart.equals(this[_tail$], session)) {
+      this[_tail$] = session[_prev];
     }
-    session[_next] = session[_prev] = null;
+    session[_next$1] = session[_prev] = null;
   }
   [_timerTimeout]() {
     this[_stopTimer]();
-    dart.assert(this[_head] != null);
-    let session = this[_head];
+    dart.assert(this[_head$] != null);
+    let session = this[_head$];
     session.destroy();
     if (session[_timeoutCallback] != null) {
       dart.dsend(session, _timeoutCallback);
@@ -47464,8 +47467,8 @@
   }
   [_startTimer]() {
     dart.assert(this[_timer] == null);
-    if (this[_head] != null) {
-      let seconds = new core.DateTime.now().difference(this[_head].lastSeen).inSeconds;
+    if (this[_head$] != null) {
+      let seconds = new core.DateTime.now().difference(this[_head$].lastSeen).inSeconds;
       this[_timer] = async.Timer.new(new core.Duration({seconds: dart.notNull(this[_sessionTimeout]) - dart.notNull(seconds)}), dart.bind(this, _timerTimeout));
     }
   }
@@ -47481,8 +47484,8 @@
   fields: () => ({
     [_sessions]: MapOfString$_HttpSession(),
     [_sessionTimeout]: core.int,
-    [_head]: io._HttpSession,
-    [_tail]: io._HttpSession,
+    [_head$]: io._HttpSession,
+    [_tail$]: io._HttpSession,
     [_timer]: async.Timer
   }),
   setters: () => ({sessionTimeout: dart.definiteFunctionType(dart.void, [core.int])}),
@@ -47654,7 +47657,7 @@
   },
   set openFiles(_) {}
 });
-const _arguments = Symbol('_arguments');
+const _arguments$0 = Symbol('_arguments');
 const _workingDirectory = Symbol('_workingDirectory');
 io._ProcessResourceInfo = class _ProcessResourceInfo extends io._IOResourceInfo {
   new(process) {
@@ -47664,13 +47667,13 @@
     io._ProcessResourceInfo.ProcessStarted(this);
   }
   get name() {
-    return core.String._check(dart.dload(this.process, _path));
+    return core.String._check(dart.dload(this.process, _path$));
   }
   stopped() {
     io._ProcessResourceInfo.ProcessStopped(this);
   }
   get fullValueMap() {
-    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
   }
   static ProcessStarted(info) {
     dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
@@ -48300,68 +48303,68 @@
   },
   set packageConfig(_) {}
 });
-const _map = Symbol('_map');
+const _map$1 = Symbol('_map');
 io._CaseInsensitiveStringMap$ = dart.generic(V => {
   let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
   class _CaseInsensitiveStringMap extends core.Object {
     new() {
-      this[_map] = MapOfString$V().new();
+      this[_map$1] = MapOfString$V().new();
     }
     containsKey(key) {
-      return typeof key == 'string' && dart.test(this[_map][dartx.containsKey](key[dartx.toUpperCase]()));
+      return typeof key == 'string' && dart.test(this[_map$1][dartx.containsKey](key[dartx.toUpperCase]()));
     }
     containsValue(value) {
-      return this[_map][dartx.containsValue](value);
+      return this[_map$1][dartx.containsValue](value);
     }
     _get(key) {
-      return typeof key == 'string' ? this[_map][dartx._get](key[dartx.toUpperCase]()) : null;
+      return typeof key == 'string' ? this[_map$1][dartx._get](key[dartx.toUpperCase]()) : null;
     }
     _set(key, value) {
       V._check(value);
-      this[_map][dartx._set](key[dartx.toUpperCase](), value);
+      this[_map$1][dartx._set](key[dartx.toUpperCase](), value);
       return value;
     }
     putIfAbsent(key, ifAbsent) {
       VoidToV()._check(ifAbsent);
-      return this[_map][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
+      return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
     }
     addAll(other) {
-      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid()));
+      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
     }
     remove(key) {
-      return typeof key == 'string' ? this[_map][dartx.remove](key[dartx.toUpperCase]()) : null;
+      return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
     }
     clear() {
-      this[_map][dartx.clear]();
+      this[_map$1][dartx.clear]();
     }
     forEach(f) {
-      this[_map][dartx.forEach](f);
+      this[_map$1][dartx.forEach](f);
     }
     get keys() {
-      return this[_map][dartx.keys];
+      return this[_map$1][dartx.keys];
     }
     get values() {
-      return this[_map][dartx.values];
+      return this[_map$1][dartx.values];
     }
     get length() {
-      return this[_map][dartx.length];
+      return this[_map$1][dartx.length];
     }
     get isEmpty() {
-      return this[_map][dartx.isEmpty];
+      return this[_map$1][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_map][dartx.isNotEmpty];
+      return this[_map$1][dartx.isNotEmpty];
     }
     toString() {
-      return dart.toString(this[_map]);
+      return dart.toString(this[_map$1]);
     }
   }
   dart.addTypeTests(_CaseInsensitiveStringMap);
   _CaseInsensitiveStringMap[dart.implements] = () => [MapOfString$V()];
   dart.setSignature(_CaseInsensitiveStringMap, {
-    fields: () => ({[_map]: MapOfString$V()}),
+    fields: () => ({[_map$1]: MapOfString$V()}),
     getters: () => ({
       keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
       values: dart.definiteFunctionType(core.Iterable$(V), []),
@@ -48545,14 +48548,14 @@
   })
 });
 const _signalNumber = Symbol('_signalNumber');
-const _name = Symbol('_name');
+const _name$2 = Symbol('_name');
 io.ProcessSignal = class ProcessSignal extends core.Object {
   _(signalNumber, name) {
     this[_signalNumber] = signalNumber;
-    this[_name] = name;
+    this[_name$2] = name;
   }
   toString() {
-    return this[_name];
+    return this[_name$2];
   }
   watch() {
     return io._ProcessUtils._watchSignal(this);
@@ -48563,7 +48566,7 @@
   constructors: () => ({_: dart.definiteFunctionType(io.ProcessSignal, [core.int, core.String])}),
   fields: () => ({
     [_signalNumber]: core.int,
-    [_name]: core.String
+    [_name$2]: core.String
   }),
   methods: () => ({watch: dart.definiteFunctionType(async.Stream$(io.ProcessSignal), [])}),
   sfields: () => ({
@@ -48752,7 +48755,7 @@
     let completer = async.Completer.new();
     dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
       completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
     return FutureOfSecureSocket()._check(completer.future);
   }
   static secureServer(socket, context, opts) {
@@ -48763,7 +48766,7 @@
     let completer = async.Completer.new();
     dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
       completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull()));
+    }, dynamicToNull$()));
     return FutureOfSecureSocket()._check(completer.future);
   }
 };
@@ -48874,11 +48877,11 @@
     this.requestClientCertificate = requestClientCertificate;
     this.requireClientCertificate = requireClientCertificate;
     this.supportedProtocols = supportedProtocols;
-    this[_controller] = null;
-    this[_subscription] = null;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
     this[_closed] = false;
     super.new();
-    this[_controller] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
+    this[_controller$0] = StreamControllerOfRawSecureSocket().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
   }
   static bind(address, port, context, opts) {
     let backlog = opts && 'backlog' in opts ? opts.backlog : 0;
@@ -48893,7 +48896,7 @@
     let onError = opts && 'onError' in opts ? opts.onError : null;
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get port() {
     return this[_socket].port;
@@ -48905,7 +48908,7 @@
     this[_closed] = true;
     return this[_socket].close().then(io.RawSecureServerSocket)(dart.fn(_ => this, RawServerSocketToRawSecureServerSocket()));
   }
-  [_onData](connection) {
+  [_onData$](connection) {
     let remotePort = null;
     try {
       remotePort = connection.remotePort;
@@ -48917,24 +48920,24 @@
       if (dart.test(this[_closed])) {
         secureConnection.close();
       } else {
-        this[_controller].add(secureConnection);
+        this[_controller$0].add(secureConnection);
       }
     }, RawSecureSocketToNull())).catchError(dart.fn((e, s) => {
       if (!dart.test(this[_closed])) {
-        this[_controller].addError(e, core.StackTrace._check(s));
+        this[_controller$0].addError(e, core.StackTrace._check(s));
       }
     }, dynamicAnddynamicToNull()));
   }
   [_onPauseStateChange]() {
-    if (dart.test(this[_controller].isPaused)) {
-      this[_subscription].pause();
+    if (dart.test(this[_controller$0].isPaused)) {
+      this[_subscription$].pause();
     } else {
-      this[_subscription].resume();
+      this[_subscription$].resume();
     }
   }
   [_onSubscriptionStateChange]() {
-    if (dart.test(this[_controller].hasListener)) {
-      this[_subscription] = this[_socket].listen(dart.bind(this, _onData), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.bind(this[_controller], 'close')});
+    if (dart.test(this[_controller$0].hasListener)) {
+      this[_subscription$] = this[_socket].listen(dart.bind(this, _onData$), {onError: dart.bind(this[_controller$0], 'addError'), onDone: dart.bind(this[_controller$0], 'close')});
     } else {
       this.close();
     }
@@ -48949,8 +48952,8 @@
   constructors: () => ({_: dart.definiteFunctionType(io.RawSecureServerSocket, [io.RawServerSocket, io.SecurityContext, core.bool, core.bool, ListOfString()])}),
   fields: () => ({
     [_socket]: io.RawServerSocket,
-    [_controller]: StreamControllerOfRawSecureSocket(),
-    [_subscription]: StreamSubscriptionOfRawSocket(),
+    [_controller$0]: StreamControllerOfRawSecureSocket(),
+    [_subscription$]: StreamSubscriptionOfRawSocket(),
     [_context]: io.SecurityContext,
     requestClientCertificate: core.bool,
     requireClientCertificate: core.bool,
@@ -48965,7 +48968,7 @@
   methods: () => ({
     listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSecureSocket), [RawSecureSocketTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     close: dart.definiteFunctionType(async.Future$(io.RawSecureServerSocket), []),
-    [_onData]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
+    [_onData$]: dart.definiteFunctionType(dart.void, [io.RawSocket]),
     [_onPauseStateChange]: dart.definiteFunctionType(dart.void, []),
     [_onSubscriptionStateChange]: dart.definiteFunctionType(dart.void, [])
   }),
@@ -49027,7 +49030,7 @@
 const _secureHandshake = Symbol('_secureHandshake');
 const _sendWriteEvent = Symbol('_sendWriteEvent');
 const _completeCloseCompleter = Symbol('_completeCloseCompleter');
-const _close = Symbol('_close');
+const _close$0 = Symbol('_close');
 const _scheduleReadEvent = Symbol('_scheduleReadEvent');
 const _scheduleFilter = Symbol('_scheduleFilter');
 const _readHandler = Symbol('_readHandler');
@@ -49039,19 +49042,19 @@
 const _pushAllFilterStages = Symbol('_pushAllFilterStages');
 const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
 const _sendReadEvent = Symbol('_sendReadEvent');
-let const;
+let const$75;
 io.RawSocketEvent = class RawSocketEvent extends core.Object {
   _(value) {
-    this[_value] = value;
+    this[_value$1] = value;
   }
   toString() {
-    return (const || (const = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value]);
+    return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
   }
 };
 dart.defineNamedConstructor(io.RawSocketEvent, '_');
 dart.setSignature(io.RawSocketEvent, {
   constructors: () => ({_: dart.definiteFunctionType(io.RawSocketEvent, [core.int])}),
-  fields: () => ({[_value]: core.int}),
+  fields: () => ({[_value$1]: core.int}),
   sfields: () => ({
     READ: io.RawSocketEvent,
     WRITE: io.RawSocketEvent,
@@ -49110,12 +49113,12 @@
     this.requestClientCertificate = requestClientCertificate;
     this.requireClientCertificate = requireClientCertificate;
     this.onBadCertificate = onBadCertificate;
-    this[_controller] = null;
-    this[_stream] = null;
+    this[_controller$0] = null;
+    this[_stream$] = null;
     this[_bufferedDataIndex] = 0;
     this[_writeEventsEnabled] = true;
     this[_readEventsEnabled] = true;
-    this[_pauseCount] = 0;
+    this[_pauseCount$] = 0;
     this[_pendingReadEvent] = false;
     this[_socketClosedRead] = false;
     this[_socketClosedWrite] = false;
@@ -49129,8 +49132,8 @@
     if (this.context == null) {
       this.context = io.SecurityContext.defaultContext;
     }
-    this[_controller] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
-    this[_stream] = this[_controller].stream;
+    this[_controller$0] = StreamControllerOfRawSocketEvent().new({sync: true, onListen: dart.bind(this, _onSubscriptionStateChange), onPause: dart.bind(this, _onPauseStateChange), onResume: dart.bind(this, _onPauseStateChange), onCancel: dart.bind(this, _onSubscriptionStateChange)});
+    this[_stream$] = this[_controller$0].stream;
     this[_secureFilter].init();
     this[_secureFilter].registerHandshakeCompleteCallback(dart.bind(this, _secureHandshakeCompleteHandler));
     if (this.onBadCertificate != null) {
@@ -49169,7 +49172,7 @@
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
     this[_sendWriteEvent]();
-    return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   static _verifyFields(host, requestedPort, is_server, requestClientCertificate, requireClientCertificate, onBadCertificate) {
     if (!(typeof host == 'string') && !io.InternetAddress.is(host)) {
@@ -49214,7 +49217,7 @@
     if (dummy === void 0) dummy = null;
     if (!dart.test(this[_closeCompleter].isCompleted)) this[_closeCompleter].complete(this);
   }
-  [_close]() {
+  [_close$0]() {
     this[_closedWrite] = true;
     this[_closedRead] = true;
     if (this[_socket] != null) {
@@ -49231,7 +49234,7 @@
     if (this[_socketSubscription] != null) {
       this[_socketSubscription].cancel();
     }
-    this[_controller].close();
+    this[_controller$0].close();
     this[_status] = io._RawSecureSocket.CLOSED;
   }
   shutdown(direction) {
@@ -49241,7 +49244,7 @@
         this[_socket].shutdown(io.SocketDirection.SEND);
         this[_socketClosedWrite] = true;
         if (dart.test(this[_closedRead])) {
-          this[_close]();
+          this[_close$0]();
         }
       }
     }
@@ -49250,7 +49253,7 @@
       this[_socketClosedRead] = true;
       this[_socket].shutdown(io.SocketDirection.RECEIVE);
       if (dart.test(this[_socketClosedWrite])) {
-        this[_close]();
+        this[_close$0]();
       }
     }
   }
@@ -49260,7 +49263,7 @@
   set writeEventsEnabled(value) {
     this[_writeEventsEnabled] = value;
     if (dart.test(value)) {
-      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid()));
+      async.Timer.run(dart.fn(() => this[_sendWriteEvent](), VoidTovoid$()));
     }
   }
   get readEventsEnabled() {
@@ -49295,7 +49298,7 @@
       dart.throw(new core.ArgumentError(dart.str`Invalid offset parameter in SecureSocket.read (offset: ${offset})`));
     }
     if (dart.test(this[_closedWrite])) {
-      this[_controller].addError(new io.SocketException("Writing to a closed socket"));
+      this[_controller$0].addError(new io.SocketException("Writing to a closed socket"));
       return 0;
     }
     if (this[_status] != io._RawSecureSocket.CONNECTED) return 0;
@@ -49349,7 +49352,7 @@
   }
   [_doneHandler]() {
     if (dart.test(this[_filterStatus].readEmpty)) {
-      this[_close]();
+      this[_close$0]();
     }
   }
   [_reportError](e, stackTrace) {
@@ -49359,9 +49362,9 @@
     } else if (dart.test(this[_connectPending])) {
       this[_handshakeComplete].completeError(e, stackTrace);
     } else {
-      this[_controller].addError(e, stackTrace);
+      this[_controller$0].addError(e, stackTrace);
     }
-    this[_close]();
+    this[_close$0]();
   }
   [_closeHandler]() {
     if (this[_status] == io._RawSecureSocket.CONNECTED) {
@@ -49369,9 +49372,9 @@
       this[_socketClosedRead] = true;
       if (dart.test(this[_filterStatus].readEmpty)) {
         this[_closedRead] = true;
-        this[_controller].add(io.RawSocketEvent.READ_CLOSED);
+        this[_controller$0].add(io.RawSocketEvent.READ_CLOSED);
         if (dart.test(this[_socketClosedWrite])) {
-          this[_close]();
+          this[_close$0]();
         }
       } else {
         this[_scheduleFilter]();
@@ -49416,7 +49419,7 @@
       this[_connectPending] = false;
       try {
         this[_selectedProtocol] = this[_secureFilter].selectedProtocol();
-        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid()));
+        async.Timer.run(dart.fn(() => this[_handshakeComplete].complete(this), VoidTovoid$()));
       } catch (error) {
         let stack = dart.stackTrace(error);
         this[_handshakeComplete].completeError(error, stack);
@@ -49425,17 +49428,17 @@
     }
   }
   [_onPauseStateChange]() {
-    if (dart.test(this[_controller].isPaused)) {
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
+    if (dart.test(this[_controller$0].isPaused)) {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) + 1;
     } else {
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
-      if (this[_pauseCount] == 0) {
+      this[_pauseCount$] = dart.notNull(this[_pauseCount$]) - 1;
+      if (this[_pauseCount$] == 0) {
         this[_scheduleReadEvent]();
         this[_sendWriteEvent]();
       }
     }
     if (!dart.test(this[_socketClosedRead]) || !dart.test(this[_socketClosedWrite])) {
-      if (dart.test(this[_controller].isPaused)) {
+      if (dart.test(this[_controller$0].isPaused)) {
         this[_socketSubscription].pause();
       } else {
         this[_socketSubscription].resume();
@@ -49443,7 +49446,7 @@
     }
   }
   [_onSubscriptionStateChange]() {
-    if (dart.test(this[_controller].hasListener)) {
+    if (dart.test(this[_controller$0].hasListener)) {
     }
   }
   [_scheduleFilter]() {
@@ -49540,22 +49543,22 @@
     }
   }
   [_scheduleReadEvent]() {
-    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
+    if (!dart.test(this[_pendingReadEvent]) && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
       this[_pendingReadEvent] = true;
       async.Timer.run(dart.bind(this, _sendReadEvent));
     }
   }
   [_sendReadEvent]() {
     this[_pendingReadEvent] = false;
-    if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
-      this[_controller].add(io.RawSocketEvent.READ);
+    if (this[_status] != io._RawSecureSocket.CLOSED && dart.test(this[_readEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && !dart.test(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.READ_PLAINTEXT).isEmpty)) {
+      this[_controller$0].add(io.RawSocketEvent.READ);
       this[_scheduleReadEvent]();
     }
   }
   [_sendWriteEvent]() {
-    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
+    if (!dart.test(this[_closedWrite]) && dart.test(this[_writeEventsEnabled]) && this[_pauseCount$] == 0 && this[_secureFilter] != null && dart.notNull(this[_secureFilter].buffers[dartx._get](io._RawSecureSocket.WRITE_PLAINTEXT).free) > 0) {
       this[_writeEventsEnabled] = false;
-      this[_controller].add(io.RawSocketEvent.WRITE);
+      this[_controller$0].add(io.RawSocketEvent.WRITE);
     }
   }
   [_pushAllFilterStages]() {
@@ -49635,8 +49638,8 @@
   fields: () => ({
     [_socket]: io.RawSocket,
     [_handshakeComplete]: CompleterOf_RawSecureSocket(),
-    [_controller]: StreamControllerOfRawSocketEvent(),
-    [_stream]: StreamOfRawSocketEvent(),
+    [_controller$0]: StreamControllerOfRawSocketEvent(),
+    [_stream$]: StreamOfRawSocketEvent(),
     [_socketSubscription]: StreamSubscriptionOfRawSocketEvent(),
     [_bufferedData]: ListOfint(),
     [_bufferedDataIndex]: core.int,
@@ -49649,7 +49652,7 @@
     [_status]: core.int,
     [_writeEventsEnabled]: core.bool,
     [_readEventsEnabled]: core.bool,
-    [_pauseCount]: core.int,
+    [_pauseCount$]: core.int,
     [_pendingReadEvent]: core.bool,
     [_socketClosedRead]: core.bool,
     [_socketClosedWrite]: core.bool,
@@ -49682,7 +49685,7 @@
     available: dart.definiteFunctionType(core.int, []),
     close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
     [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
-    [_close]: dart.definiteFunctionType(dart.void, []),
+    [_close$0]: dart.definiteFunctionType(dart.void, []),
     shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
     read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
     write: dart.definiteFunctionType(core.int, [ListOfint()], [core.int, core.int]),
@@ -50005,7 +50008,7 @@
 io._nextServiceId = 1;
 io.InternetAddressType = class InternetAddressType extends core.Object {
   _(value) {
-    this[_value] = value;
+    this[_value$1] = value;
   }
   static _from(value) {
     if (value == 0) return io.InternetAddressType.IP_V4;
@@ -50013,7 +50016,7 @@
     dart.throw(new core.ArgumentError(dart.str`Invalid type: ${value}`));
   }
   get name() {
-    switch (this[_value]) {
+    switch (this[_value$1]) {
       case -1:
       {
         return "ANY";
@@ -50042,7 +50045,7 @@
     _: dart.definiteFunctionType(io.InternetAddressType, [core.int]),
     _from: dart.definiteFunctionType(io.InternetAddressType, [core.int])
   }),
-  fields: () => ({[_value]: core.int}),
+  fields: () => ({[_value$1]: core.int}),
   getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
   sfields: () => ({
     IP_V4: io.InternetAddressType,
@@ -50144,13 +50147,13 @@
 });
 io.SocketDirection = class SocketDirection extends core.Object {
   _(value) {
-    this[_value] = value;
+    this[_value$1] = value;
   }
 };
 dart.defineNamedConstructor(io.SocketDirection, '_');
 dart.setSignature(io.SocketDirection, {
   constructors: () => ({_: dart.definiteFunctionType(io.SocketDirection, [dart.dynamic])}),
-  fields: () => ({[_value]: dart.dynamic}),
+  fields: () => ({[_value$1]: dart.dynamic}),
   sfields: () => ({
     RECEIVE: io.SocketDirection,
     SEND: io.SocketDirection,
@@ -50170,13 +50173,13 @@
 });
 io.SocketOption = class SocketOption extends core.Object {
   _(value) {
-    this[_value] = value;
+    this[_value$1] = value;
   }
 };
 dart.defineNamedConstructor(io.SocketOption, '_');
 dart.setSignature(io.SocketOption, {
   constructors: () => ({_: dart.definiteFunctionType(io.SocketOption, [dart.dynamic])}),
-  fields: () => ({[_value]: dart.dynamic}),
+  fields: () => ({[_value$1]: dart.dynamic}),
   sfields: () => ({
     TCP_NODELAY: io.SocketOption,
     _IP_MULTICAST_LOOP: io.SocketOption,
@@ -50332,20 +50335,20 @@
 io._STDIO_HANDLE_TYPE_OTHER = 4;
 io._StdStream = class _StdStream extends async.Stream$(core.List$(core.int)) {
   new(stream) {
-    this[_stream] = stream;
+    this[_stream$] = stream;
     super.new();
   }
   listen(onData, opts) {
     let onError = opts && 'onError' in opts ? opts.onError : null;
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-    return this[_stream].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_stream$].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
 };
 dart.addSimpleTypeTests(io._StdStream);
 dart.setSignature(io._StdStream, {
   constructors: () => ({new: dart.definiteFunctionType(io._StdStream, [StreamOfListOfint()])}),
-  fields: () => ({[_stream]: StreamOfListOfint()}),
+  fields: () => ({[_stream$]: StreamOfListOfint()}),
   methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [ListOfintTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
 });
 io.Stdin = class Stdin extends io._StdStream {
@@ -50440,52 +50443,52 @@
 const _terminalLines = Symbol('_terminalLines');
 io._StdSink = class _StdSink extends core.Object {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$0] = sink;
   }
   get encoding() {
-    return this[_sink].encoding;
+    return this[_sink$0].encoding;
   }
   set encoding(encoding) {
-    this[_sink].encoding = encoding;
+    this[_sink$0].encoding = encoding;
   }
   write(object) {
-    this[_sink].write(object);
+    this[_sink$0].write(object);
   }
   writeln(object) {
     if (object === void 0) object = "";
-    this[_sink].writeln(object);
+    this[_sink$0].writeln(object);
   }
   writeAll(objects, sep) {
     if (sep === void 0) sep = "";
-    this[_sink].writeAll(objects, sep);
+    this[_sink$0].writeAll(objects, sep);
   }
   add(data) {
-    this[_sink].add(data);
+    this[_sink$0].add(data);
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    this[_sink].addError(error, stackTrace);
+    this[_sink$0].addError(error, stackTrace);
   }
   writeCharCode(charCode) {
-    this[_sink].writeCharCode(charCode);
+    this[_sink$0].writeCharCode(charCode);
   }
   addStream(stream) {
-    return this[_sink].addStream(stream);
+    return this[_sink$0].addStream(stream);
   }
   flush() {
-    return this[_sink].flush();
+    return this[_sink$0].flush();
   }
   close() {
-    return this[_sink].close();
+    return this[_sink$0].close();
   }
   get done() {
-    return this[_sink].done;
+    return this[_sink$0].done;
   }
 };
 io._StdSink[dart.implements] = () => [io.IOSink];
 dart.setSignature(io._StdSink, {
   constructors: () => ({new: dart.definiteFunctionType(io._StdSink, [io.IOSink])}),
-  fields: () => ({[_sink]: io.IOSink}),
+  fields: () => ({[_sink$0]: io.IOSink}),
   getters: () => ({
     encoding: dart.definiteFunctionType(convert.Encoding, []),
     done: dart.definiteFunctionType(async.Future, [])
@@ -50667,7 +50670,7 @@
 });
 io.stdioType = function(object) {
   if (io._StdStream.is(object)) {
-    object = dart.dload(object, _stream);
+    object = dart.dload(object, _stream$);
   } else if (dart.equals(object, io.stdout) || dart.equals(object, io.stderr)) {
     switch (io._StdIOUtils._getStdioHandleType(dart.equals(object, io.stdout) ? 1 : 2)) {
       case io._STDIO_HANDLE_TYPE_TERMINAL:
@@ -50707,7 +50710,7 @@
   }
   if (io._IOSinkImpl.is(object)) {
     try {
-      if (io._FileStreamConsumer.is(object[_target])) {
+      if (io._FileStreamConsumer.is(object[_target$])) {
         return io.StdioType.FILE;
       }
     } catch (e) {
@@ -50740,10 +50743,10 @@
   }),
   names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
 });
-let const;
-let const;
-let const;
-let const;
+let const$76;
+let const$77;
+let const$78;
+let const$79;
 io.SystemEncoding = class SystemEncoding extends convert.Encoding {
   new() {
     super.new();
@@ -50759,16 +50762,16 @@
   }
   get encoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const || (const = dart.const(new io._WindowsCodePageEncoder()));
+      return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
     } else {
-      return const || (const = dart.const(new convert.Utf8Encoder()));
+      return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
     }
   }
   get decoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const || (const = dart.const(new io._WindowsCodePageDecoder()));
+      return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
     } else {
-      return const || (const = dart.const(new convert.Utf8Decoder()));
+      return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
     }
   }
 };
@@ -50811,17 +50814,17 @@
 });
 io._WindowsCodePageEncoderSink = class _WindowsCodePageEncoderSink extends convert.StringConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$0] = sink;
   }
   close() {
-    this[_sink].close();
+    this[_sink$0].close();
   }
   add(string) {
     let encoded = io._WindowsCodePageEncoder._encodeString(string);
     if (encoded == null) {
       dart.throw(new core.FormatException("Invalid character for encoding"));
     }
-    this[_sink].add(encoded);
+    this[_sink$0].add(encoded);
   }
   addSlice(source, start, end, isLast) {
     if (start != 0 || end != source[dartx.length]) {
@@ -50833,7 +50836,7 @@
 };
 dart.setSignature(io._WindowsCodePageEncoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageEncoderSink, [SinkOfListOfint()])}),
-  fields: () => ({[_sink]: SinkOfListOfint()}),
+  fields: () => ({[_sink$0]: SinkOfListOfint()}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     addSlice: dart.definiteFunctionType(dart.void, [core.String, core.int, core.int, core.bool])
@@ -50865,19 +50868,19 @@
 });
 io._WindowsCodePageDecoderSink = class _WindowsCodePageDecoderSink extends convert.ByteConversionSinkBase {
   new(sink) {
-    this[_sink] = sink;
+    this[_sink$0] = sink;
     super.new();
   }
   close() {
-    this[_sink].close();
+    this[_sink$0].close();
   }
   add(bytes) {
-    this[_sink].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
+    this[_sink$0].add(io._WindowsCodePageDecoder._decodeBytes(bytes));
   }
 };
 dart.setSignature(io._WindowsCodePageDecoderSink, {
   constructors: () => ({new: dart.definiteFunctionType(io._WindowsCodePageDecoderSink, [SinkOfString()])}),
-  fields: () => ({[_sink]: SinkOfString()}),
+  fields: () => ({[_sink$0]: SinkOfString()}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     add: dart.definiteFunctionType(dart.void, [ListOfint()])
@@ -50941,7 +50944,7 @@
       if (dart.notNull(part[dartx.length]) >= 2 && dart.test(part[dartx.startsWith]('0'))) {
         dart.throw(new core.ArgumentError("Illegal 0 padding on value."));
       } else {
-        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint())}) : this.serverMaxWindowBits;
+        mwb = this.serverMaxWindowBits == null ? core.int.parse(part, {onError: dart.fn(source => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())}) : this.serverMaxWindowBits;
         info.headerValue = dart.str`; server_max_window_bits=${mwb}`;
         info.maxWindowBits = mwb;
       }
@@ -51177,7 +51180,7 @@
 const _remainingPayloadBytes = Symbol('_remainingPayloadBytes');
 const _unmaskingIndex = Symbol('_unmaskingIndex');
 const _currentMessageType = Symbol('_currentMessageType');
-const _eventSink = Symbol('_eventSink');
+const _eventSink$ = Symbol('_eventSink');
 const _isControlFrame = Symbol('_isControlFrame');
 const _lengthDone = Symbol('_lengthDone');
 const _maskDone = Symbol('_maskDone');
@@ -51194,7 +51197,7 @@
     this[_payload] = io.BytesBuilder.new({copy: false});
     this[_serverSide] = serverSide;
     this[_deflate] = deflate;
-    this[_state] = io._WebSocketProtocolTransformer.START;
+    this[_state$1] = io._WebSocketProtocolTransformer.START;
     this[_fin] = false;
     this[_compressed] = false;
     this[_opcode] = -1;
@@ -51207,38 +51210,38 @@
     this[_currentMessageType] = io._WebSocketMessageType.NONE;
     this.closeCode = io.WebSocketStatus.NO_STATUS_RECEIVED;
     this.closeReason = "";
-    this[_eventSink] = null;
+    this[_eventSink$] = null;
   }
   bind(stream) {
     return async.Stream.eventTransformed(stream, dart.fn(eventSink => {
-      if (this[_eventSink] != null) {
+      if (this[_eventSink$] != null) {
         dart.throw(new core.StateError("WebSocket transformer already used."));
       }
-      this[_eventSink] = eventSink;
+      this[_eventSink$] = eventSink;
       return this;
     }, EventSinkTo_WebSocketProtocolTransformer()));
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    this[_eventSink].addError(error, stackTrace);
+    this[_eventSink$].addError(error, stackTrace);
   }
   close() {
-    this[_eventSink].close();
+    this[_eventSink$].close();
   }
   add(bytes) {
     let buffer = typed_data.Uint8List.is(bytes) ? bytes : typed_data.Uint8List.fromList(bytes);
     let index = 0;
     let lastIndex = buffer[dartx.length];
-    if (this[_state] == io._WebSocketProtocolTransformer.CLOSED) {
+    if (this[_state$1] == io._WebSocketProtocolTransformer.CLOSED) {
       dart.throw(new io.WebSocketException("Data on closed connection"));
     }
-    if (this[_state] == io._WebSocketProtocolTransformer.FAILURE) {
+    if (this[_state$1] == io._WebSocketProtocolTransformer.FAILURE) {
       dart.throw(new io.WebSocketException("Data on failed connection"));
     }
-    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) {
+    while (dart.notNull(index) < dart.notNull(lastIndex) && this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) {
       let byte = buffer[dartx._get](index);
-      if (dart.notNull(this[_state]) <= io._WebSocketProtocolTransformer.LEN_REST) {
-        if (this[_state] == io._WebSocketProtocolTransformer.START) {
+      if (dart.notNull(this[_state$1]) <= io._WebSocketProtocolTransformer.LEN_REST) {
+        if (this[_state$1] == io._WebSocketProtocolTransformer.START) {
           this[_fin] = (dart.notNull(byte) & io._WebSocketProtocolTransformer.FIN) != 0;
           if ((dart.notNull(byte) & (io._WebSocketProtocolTransformer.RSV2 | io._WebSocketProtocolTransformer.RSV3)) != 0) {
             dart.throw(new io.WebSocketException("Protocol error"));
@@ -51268,8 +51271,8 @@
           } else {
             dart.throw(new io.WebSocketException("Protocol error"));
           }
-          this[_state] = io._WebSocketProtocolTransformer.LEN_FIRST;
-        } else if (this[_state] == io._WebSocketProtocolTransformer.LEN_FIRST) {
+          this[_state$1] = io._WebSocketProtocolTransformer.LEN_FIRST;
+        } else if (this[_state$1] == io._WebSocketProtocolTransformer.LEN_FIRST) {
           this[_masked] = (dart.notNull(byte) & 128) != 0;
           this[_len] = dart.notNull(byte) & 127;
           if (dart.test(this[_isControlFrame]()) && dart.notNull(this[_len]) > 125) {
@@ -51278,17 +51281,17 @@
           if (this[_len] == 126) {
             this[_len] = 0;
             this[_remainingLenBytes] = 2;
-            this[_state] = io._WebSocketProtocolTransformer.LEN_REST;
+            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
           } else if (this[_len] == 127) {
             this[_len] = 0;
             this[_remainingLenBytes] = 8;
-            this[_state] = io._WebSocketProtocolTransformer.LEN_REST;
+            this[_state$1] = io._WebSocketProtocolTransformer.LEN_REST;
           } else {
             dart.assert(dart.notNull(this[_len]) < 126);
             this[_lengthDone]();
           }
         } else {
-          dart.assert(this[_state] == io._WebSocketProtocolTransformer.LEN_REST);
+          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.LEN_REST);
           this[_len] = (dart.notNull(this[_len]) << 8 | dart.notNull(byte)) >>> 0;
           this[_remainingLenBytes] = dart.notNull(this[_remainingLenBytes]) - 1;
           if (this[_remainingLenBytes] == 0) {
@@ -51296,7 +51299,7 @@
           }
         }
       } else {
-        if (this[_state] == io._WebSocketProtocolTransformer.MASK) {
+        if (this[_state$1] == io._WebSocketProtocolTransformer.MASK) {
           this[_maskingBytes][dartx._set](4 - (() => {
             let x = this[_remainingMaskingKeyBytes];
             this[_remainingMaskingKeyBytes] = dart.notNull(x) - 1;
@@ -51306,7 +51309,7 @@
             this[_maskDone]();
           }
         } else {
-          dart.assert(this[_state] == io._WebSocketProtocolTransformer.PAYLOAD);
+          dart.assert(this[_state$1] == io._WebSocketProtocolTransformer.PAYLOAD);
           let payloadLength = math.min(core.int)(dart.notNull(lastIndex) - dart.notNull(index), this[_remainingPayloadBytes]);
           this[_remainingPayloadBytes] = dart.notNull(this[_remainingPayloadBytes]) - dart.notNull(payloadLength);
           if (dart.test(this[_masked])) {
@@ -51372,7 +51375,7 @@
       if (!dart.test(this[_serverSide])) {
         dart.throw(new io.WebSocketException("Received masked frame from server"));
       }
-      this[_state] = io._WebSocketProtocolTransformer.MASK;
+      this[_state$1] = io._WebSocketProtocolTransformer.MASK;
     } else {
       if (dart.test(this[_serverSide])) {
         dart.throw(new io.WebSocketException("Received unmasked frame from client"));
@@ -51391,18 +51394,18 @@
         switch (this[_opcode]) {
           case io._WebSocketOpcode.CLOSE:
           {
-            this[_state] = io._WebSocketProtocolTransformer.CLOSED;
-            this[_eventSink].close();
+            this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
+            this[_eventSink$].close();
             break;
           }
           case io._WebSocketOpcode.PING:
           {
-            this[_eventSink].add(new io._WebSocketPing());
+            this[_eventSink$].add(new io._WebSocketPing());
             break;
           }
           case io._WebSocketOpcode.PONG:
           {
-            this[_eventSink].add(new io._WebSocketPong());
+            this[_eventSink$].add(new io._WebSocketPong());
             break;
           }
         }
@@ -51411,7 +51414,7 @@
         this[_messageFrameEnd]();
       }
     } else {
-      this[_state] = io._WebSocketProtocolTransformer.PAYLOAD;
+      this[_state$1] = io._WebSocketProtocolTransformer.PAYLOAD;
     }
   }
   [_messageFrameEnd]() {
@@ -51423,12 +51426,12 @@
       switch (this[_currentMessageType]) {
         case io._WebSocketMessageType.TEXT:
         {
-          this[_eventSink].add(convert.UTF8.decode(bytes));
+          this[_eventSink$].add(convert.UTF8.decode(bytes));
           break;
         }
         case io._WebSocketMessageType.BINARY:
         {
-          this[_eventSink].add(bytes);
+          this[_eventSink$].add(bytes);
           break;
         }
       }
@@ -51454,18 +51457,18 @@
             this.closeReason = convert.UTF8.decode(payload[dartx.sublist](2));
           }
         }
-        this[_state] = io._WebSocketProtocolTransformer.CLOSED;
-        this[_eventSink].close();
+        this[_state$1] = io._WebSocketProtocolTransformer.CLOSED;
+        this[_eventSink$].close();
         break;
       }
       case io._WebSocketOpcode.PING:
       {
-        this[_eventSink].add(new io._WebSocketPing(this[_payload].takeBytes()));
+        this[_eventSink$].add(new io._WebSocketPing(this[_payload].takeBytes()));
         break;
       }
       case io._WebSocketOpcode.PONG:
       {
-        this[_eventSink].add(new io._WebSocketPong(this[_payload].takeBytes()));
+        this[_eventSink$].add(new io._WebSocketPong(this[_payload].takeBytes()));
         break;
       }
     }
@@ -51475,7 +51478,7 @@
     return this[_opcode] == io._WebSocketOpcode.CLOSE || this[_opcode] == io._WebSocketOpcode.PING || this[_opcode] == io._WebSocketOpcode.PONG;
   }
   [_prepareForNextFrame]() {
-    if (this[_state] != io._WebSocketProtocolTransformer.CLOSED && this[_state] != io._WebSocketProtocolTransformer.FAILURE) this[_state] = io._WebSocketProtocolTransformer.START;
+    if (this[_state$1] != io._WebSocketProtocolTransformer.CLOSED && this[_state$1] != io._WebSocketProtocolTransformer.FAILURE) this[_state$1] = io._WebSocketProtocolTransformer.START;
     this[_fin] = false;
     this[_opcode] = -1;
     this[_len] = -1;
@@ -51489,7 +51492,7 @@
 dart.setSignature(io._WebSocketProtocolTransformer, {
   constructors: () => ({new: dart.definiteFunctionType(io._WebSocketProtocolTransformer, [], [core.bool, io._WebSocketPerMessageDeflate])}),
   fields: () => ({
-    [_state]: core.int,
+    [_state$1]: core.int,
     [_fin]: core.bool,
     [_compressed]: core.bool,
     [_opcode]: core.int,
@@ -51502,7 +51505,7 @@
     [_currentMessageType]: core.int,
     closeCode: core.int,
     closeReason: core.String,
-    [_eventSink]: async.EventSink,
+    [_eventSink$]: async.EventSink,
     [_serverSide]: core.bool,
     [_maskingBytes]: core.List,
     [_payload]: io.BytesBuilder,
@@ -51573,17 +51576,17 @@
 const _compression = Symbol('_compression');
 io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
   new(protocolSelector, compression) {
-    this[_controller] = StreamControllerOfWebSocket().new({sync: true});
+    this[_controller$0] = StreamControllerOfWebSocket().new({sync: true});
     this[_protocolSelector] = protocolSelector;
     this[_compression] = compression;
   }
   bind(stream) {
     stream.listen(dart.fn(request => {
-      io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller], 'addError'));
+      io._WebSocketTransformerImpl._upgrade(request, this[_protocolSelector], this[_compression]).then(dart.void)(dart.fn(webSocket => this[_controller$0].add(webSocket), WebSocketTovoid())).catchError(dart.bind(this[_controller$0], 'addError'));
     }, HttpRequestToNull()), {onDone: dart.fn(() => {
-        this[_controller].close();
+        this[_controller$0].close();
       }, VoidToNull())});
-    return this[_controller].stream;
+    return this[_controller$0].stream;
   }
   static _upgrade(request, _protocolSelector, compression) {
     let response = request.response;
@@ -51612,16 +51615,16 @@
     let protocols = request.headers._get('Sec-WebSocket-Protocol');
     if (protocols != null && _protocolSelector != null) {
       protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic())).then(dart.dynamic)(dart.fn(protocol => {
+      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
         if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
           dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
         }
         return protocol;
-      }, dynamicTodynamic())).catchError(dart.fn(error => {
+      }, dynamicTodynamic$())).catchError(dart.fn(error => {
         response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
         response.close();
         dart.throw(error);
-      }, dynamicToNull())).then(io.WebSocket)(upgrade);
+      }, dynamicToNull$())).then(io.WebSocket)(upgrade);
     } else {
       return FutureOfWebSocket()._check(upgrade(null));
     }
@@ -51672,7 +51675,7 @@
 dart.setSignature(io._WebSocketTransformerImpl, {
   constructors: () => ({new: dart.definiteFunctionType(io._WebSocketTransformerImpl, [core.Function, io.CompressionOptions])}),
   fields: () => ({
-    [_controller]: StreamControllerOfWebSocket(),
+    [_controller$0]: StreamControllerOfWebSocket(),
     [_protocolSelector]: core.Function,
     [_compression]: io.CompressionOptions
   }),
@@ -51686,7 +51689,7 @@
 });
 const _ensureDecoder = Symbol('_ensureDecoder');
 const _ensureEncoder = Symbol('_ensureEncoder');
-let const;
+let const$80;
 io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
   new(opts) {
     let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
@@ -51716,7 +51719,7 @@
     this[_ensureDecoder]();
     let data = [];
     data[dartx.addAll](msg);
-    data[dartx.addAll](const || (const = dart.constList([0, 0, 255, 255], core.int)));
+    data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
     this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
     let result = [];
     let out = null;
@@ -51780,16 +51783,16 @@
 io._WebSocketOutgoingTransformer = class _WebSocketOutgoingTransformer extends core.Object {
   new(webSocket) {
     this.webSocket = webSocket;
-    this[_eventSink] = null;
+    this[_eventSink$] = null;
     this[_deflateHelper] = null;
     this[_deflateHelper] = this.webSocket[_deflate];
   }
   bind(stream) {
     return StreamOfListOfint().eventTransformed(stream, dart.fn(eventSink => {
-      if (this[_eventSink] != null) {
+      if (this[_eventSink$] != null) {
         dart.throw(new core.StateError("WebSocket transformer already used"));
       }
-      this[_eventSink] = eventSink;
+      this[_eventSink$] = eventSink;
       return this;
     }, EventSinkOfListOfintTo_WebSocketOutgoingTransformer()));
   }
@@ -51826,7 +51829,7 @@
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    this[_eventSink].addError(error, stackTrace);
+    this[_eventSink$].addError(error, stackTrace);
   }
   close() {
     let code = this.webSocket[_outCloseCode];
@@ -51841,11 +51844,11 @@
       }
     }
     this.addFrame(io._WebSocketOpcode.CLOSE, data);
-    this[_eventSink].close();
+    this[_eventSink$].close();
   }
   addFrame(opcode, data) {
     return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
-      this[_eventSink].add(e);
+      this[_eventSink$].add(e);
     }, ListOfintToNull()));
   }
   static createFrame(opcode, data, serverSide, compressed) {
@@ -51927,7 +51930,7 @@
   constructors: () => ({new: dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [io._WebSocketImpl])}),
   fields: () => ({
     webSocket: io._WebSocketImpl,
-    [_eventSink]: EventSinkOfListOfint(),
+    [_eventSink$]: EventSinkOfListOfint(),
     [_deflateHelper]: io._WebSocketPerMessageDeflate
   }),
   methods: () => ({
@@ -51942,70 +51945,70 @@
 });
 const _issuedPause = Symbol('_issuedPause');
 const _completer = Symbol('_completer');
-const _onListen = Symbol('_onListen');
-const _onPause = Symbol('_onPause');
-const _onResume = Symbol('_onResume');
-const _cancel = Symbol('_cancel');
-const _done = Symbol('_done');
+const _onListen$ = Symbol('_onListen');
+const _onPause$ = Symbol('_onPause');
+const _onResume$ = Symbol('_onResume');
+const _cancel$ = Symbol('_cancel');
+const _done$ = Symbol('_done');
 const _ensureController = Symbol('_ensureController');
 io._WebSocketConsumer = class _WebSocketConsumer extends core.Object {
   new(webSocket, socket) {
     this[_closeCompleter] = async.Completer.new();
     this.webSocket = webSocket;
     this.socket = socket;
-    this[_controller] = null;
-    this[_subscription] = null;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
     this[_issuedPause] = false;
     this[_closed] = false;
     this[_completer] = null;
   }
-  [_onListen]() {
-    if (this[_subscription] != null) {
-      this[_subscription].cancel();
+  [_onListen$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].cancel();
     }
   }
-  [_onPause]() {
-    if (this[_subscription] != null) {
-      this[_subscription].pause();
+  [_onPause$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].pause();
     } else {
       this[_issuedPause] = true;
     }
   }
-  [_onResume]() {
-    if (this[_subscription] != null) {
-      this[_subscription].resume();
+  [_onResume$]() {
+    if (this[_subscription$] != null) {
+      this[_subscription$].resume();
     } else {
       this[_issuedPause] = false;
     }
   }
-  [_cancel]() {
-    if (this[_subscription] != null) {
-      let subscription = this[_subscription];
-      this[_subscription] = null;
+  [_cancel$]() {
+    if (this[_subscription$] != null) {
+      let subscription = this[_subscription$];
+      this[_subscription$] = null;
       subscription.cancel();
     }
   }
   [_ensureController]() {
-    if (this[_controller] != null) return;
-    this[_controller] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause), onResume: dart.bind(this, _onResume), onCancel: dart.bind(this, _onListen)});
-    let stream = this[_controller].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
+    if (this[_controller$0] != null) return;
+    this[_controller$0] = async.StreamController.new({sync: true, onPause: dart.bind(this, _onPause$), onResume: dart.bind(this, _onResume$), onCancel: dart.bind(this, _onListen$)});
+    let stream = this[_controller$0].stream.transform(ListOfint())(new io._WebSocketOutgoingTransformer(this.webSocket));
     this.socket.addStream(stream).then(dart.dynamic)(dart.fn(_ => {
-      this[_done]();
+      this[_done$]();
       this[_closeCompleter].complete(this.webSocket);
-    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
+    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
         this[_closed] = true;
-        this[_cancel]();
+        this[_cancel$]();
         if (core.ArgumentError.is(error)) {
-          if (!dart.test(this[_done](error, stackTrace))) {
+          if (!dart.test(this[_done$](error, stackTrace))) {
             this[_closeCompleter].completeError(error, stackTrace);
           }
         } else {
-          this[_done]();
+          this[_done$]();
           this[_closeCompleter].complete(this.webSocket);
         }
       }, dynamicAndStackTraceToNull())});
   }
-  [_done](error, stackTrace) {
+  [_done$](error, stackTrace) {
     if (error === void 0) error = null;
     if (stackTrace === void 0) stackTrace = null;
     if (this[_completer] == null) return false;
@@ -52024,11 +52027,11 @@
     }
     this[_ensureController]();
     this[_completer] = async.Completer.new();
-    this[_subscription] = stream.listen(dart.fn(data => {
-      this[_controller].add(data);
-    }, dynamicToNull()), {onDone: dart.bind(this, _done), onError: dart.bind(this, _done), cancelOnError: true});
+    this[_subscription$] = stream.listen(dart.fn(data => {
+      this[_controller$0].add(data);
+    }, dynamicToNull$()), {onDone: dart.bind(this, _done$), onError: dart.bind(this, _done$), cancelOnError: true});
     if (dart.test(this[_issuedPause])) {
-      this[_subscription].pause();
+      this[_subscription$].pause();
       this[_issuedPause] = false;
     }
     return this[_completer].future;
@@ -52037,20 +52040,20 @@
     this[_ensureController]();
     const closeSocket = (function() {
       return this.socket.close().catchError(dart.fn(_ => {
-      }, dynamicToNull())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
     }).bind(this);
     dart.fn(closeSocket, VoidToFuture());
-    this[_controller].close();
+    this[_controller$0].close();
     return this[_closeCompleter].future.then(dart.dynamic)(dart.fn(_ => closeSocket(), dynamicToFuture()));
   }
   add(data) {
     if (dart.test(this[_closed])) return;
     this[_ensureController]();
-    this[_controller].add(data);
+    this[_controller$0].add(data);
   }
   closeSocket() {
     this[_closed] = true;
-    this[_cancel]();
+    this[_cancel$]();
     this.close();
   }
 };
@@ -52060,20 +52063,20 @@
   fields: () => ({
     webSocket: io._WebSocketImpl,
     socket: io.Socket,
-    [_controller]: async.StreamController,
-    [_subscription]: async.StreamSubscription,
+    [_controller$0]: async.StreamController,
+    [_subscription$]: async.StreamSubscription,
     [_issuedPause]: core.bool,
     [_closed]: core.bool,
     [_closeCompleter]: async.Completer,
     [_completer]: async.Completer
   }),
   methods: () => ({
-    [_onListen]: dart.definiteFunctionType(dart.void, []),
-    [_onPause]: dart.definiteFunctionType(dart.void, []),
-    [_onResume]: dart.definiteFunctionType(dart.void, []),
-    [_cancel]: dart.definiteFunctionType(dart.void, []),
+    [_onListen$]: dart.definiteFunctionType(dart.void, []),
+    [_onPause$]: dart.definiteFunctionType(dart.void, []),
+    [_onResume$]: dart.definiteFunctionType(dart.void, []),
+    [_cancel$]: dart.definiteFunctionType(dart.void, []),
     [_ensureController]: dart.definiteFunctionType(dart.dynamic, []),
-    [_done]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
+    [_done$]: dart.definiteFunctionType(core.bool, [], [dart.dynamic, core.StackTrace]),
     addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
     close: dart.definiteFunctionType(async.Future, []),
     add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
@@ -52088,7 +52091,7 @@
 const _pingTimer = Symbol('_pingTimer');
 const _consumer = Symbol('_consumer');
 const _closeTimer = Symbol('_closeTimer');
-let const;
+let const$81;
 io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
   static connect(url, protocols, headers, opts) {
     let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
@@ -52131,8 +52134,8 @@
         }, SocketToNull()));
         dart.throw(new io.WebSocketException(message));
       }
-      dart.fn(error, StringTovoid());
-      if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
+      dart.fn(error, StringTovoid$());
+      if (response.statusCode != io.HttpStatus.SWITCHING_PROTOCOLS || response.headers._get(io.HttpHeaders.CONNECTION) == null || !dart.test(response.headers._get(io.HttpHeaders.CONNECTION)[dartx.any](dart.fn(value => value[dartx.toLowerCase]() == "upgrade", StringTobool$()))) || response.headers.value(io.HttpHeaders.UPGRADE)[dartx.toLowerCase]() != "websocket") {
         error(dart.str`Connection to '${uri}' was not upgraded to websocket`);
       }
       let accept = response.headers.value("Sec-WebSocket-Accept");
@@ -52170,9 +52173,9 @@
         if (o == null) {
           return io._WebSocketImpl.DEFAULT_WINDOW_BITS;
         }
-        return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint())});
+        return core.int.parse(o, {onError: dart.fn(s => io._WebSocketImpl.DEFAULT_WINDOW_BITS, StringToint$())});
       }
-      dart.fn(getWindowBits, StringToint());
+      dart.fn(getWindowBits, StringToint$());
       return new io._WebSocketPerMessageDeflate({clientMaxWindowBits: getWindowBits(io._clientMaxWindowBits), serverMaxWindowBits: getWindowBits(io._serverMaxWindowBits), clientNoContextTakeover: clientNoContextTakeover, serverNoContextTakeover: serverNoContextTakeover});
     }
     return null;
@@ -52183,9 +52186,9 @@
     this[_socket] = socket;
     this.protocol = protocol;
     this[_serverSide] = serverSide;
-    this[_controller] = null;
-    this[_subscription] = null;
-    this[_sink] = null;
+    this[_controller$0] = null;
+    this[_subscription$] = null;
+    this[_sink$0] = null;
     this[_readyState] = io.WebSocket.CONNECTING;
     this[_writeClosed] = false;
     this[_closeCode] = null;
@@ -52199,48 +52202,48 @@
     this[_deflate] = null;
     super.new();
     this[_consumer] = new io._WebSocketConsumer(this, io.Socket._check(this[_socket]));
-    this[_sink] = new io._StreamSinkImpl(this[_consumer]);
+    this[_sink$0] = new io._StreamSinkImpl(this[_consumer]);
     this[_readyState] = io.WebSocket.OPEN;
     this[_deflate] = deflate;
     let transformer = new io._WebSocketProtocolTransformer(this[_serverSide], this[_deflate]);
-    this[_subscription] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
+    this[_subscription$] = async.StreamSubscription._check(dart.dsend(dart.dsend(this[_socket], 'transform', transformer), 'listen', dart.fn(data => {
       if (io._WebSocketPing.is(data)) {
         if (!dart.test(this[_writeClosed])) this[_consumer].add(new io._WebSocketPong(data.payload));
       } else if (io._WebSocketPong.is(data)) {
         this.pingInterval = this[_pingInterval];
       } else {
-        this[_controller].add(data);
+        this[_controller$0].add(data);
       }
-    }, dynamicToNull()), {onError: dart.fn((error, stackTrace) => {
+    }, dynamicToNull$()), {onError: dart.fn((error, stackTrace) => {
         if (this[_closeTimer] != null) this[_closeTimer].cancel();
         if (core.FormatException.is(error)) {
-          this[_close](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
+          this[_close$0](io.WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
         } else {
-          this[_close](io.WebSocketStatus.PROTOCOL_ERROR);
+          this[_close$0](io.WebSocketStatus.PROTOCOL_ERROR);
         }
         this[_closeCode] = this[_outCloseCode];
         this[_closeReason] = this[_outCloseReason];
-        this[_controller].close();
+        this[_controller$0].close();
       }, dynamicAnddynamicToNull()), onDone: dart.fn(() => {
         if (this[_closeTimer] != null) this[_closeTimer].cancel();
         if (this[_readyState] == io.WebSocket.OPEN) {
           this[_readyState] = io.WebSocket.CLOSING;
           if (!dart.test(io._WebSocketImpl._isReservedStatusCode(transformer.closeCode))) {
-            this[_close](transformer.closeCode, transformer.closeReason);
+            this[_close$0](transformer.closeCode, transformer.closeReason);
           } else {
-            this[_close]();
+            this[_close$0]();
           }
           this[_readyState] = io.WebSocket.CLOSED;
         }
         this[_closeCode] = transformer.closeCode;
         this[_closeReason] = transformer.closeReason;
-        this[_controller].close();
+        this[_controller$0].close();
       }, VoidToNull()), cancelOnError: true}));
-    this[_subscription].pause();
-    this[_controller] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription], 'resume'), onCancel: dart.fn(() => {
-        this[_subscription].cancel();
-        this[_subscription] = null;
-      }, VoidToNull()), onPause: dart.bind(this[_subscription], 'pause'), onResume: dart.bind(this[_subscription], 'resume')});
+    this[_subscription$].pause();
+    this[_controller$0] = async.StreamController.new({sync: true, onListen: dart.bind(this[_subscription$], 'resume'), onCancel: dart.fn(() => {
+        this[_subscription$].cancel();
+        this[_subscription$] = null;
+      }, VoidToNull()), onPause: dart.bind(this[_subscription$], 'pause'), onResume: dart.bind(this[_subscription$], 'resume')});
     io._WebSocketImpl._webSockets[dartx._set](this[_serviceId], this);
     try {
       dart.dput(this[_socket], _owner, this);
@@ -52252,7 +52255,7 @@
     let onError = opts && 'onError' in opts ? opts.onError : null;
     let onDone = opts && 'onDone' in opts ? opts.onDone : null;
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-    return this[_controller].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+    return this[_controller$0].stream.listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get pingInterval() {
     return this[_pingInterval];
@@ -52266,7 +52269,7 @@
       if (dart.test(this[_writeClosed])) return;
       this[_consumer].add(new io._WebSocketPing());
       this[_pingTimer] = async.Timer.new(this[_pingInterval], dart.fn(() => {
-        this[_close](io.WebSocketStatus.GOING_AWAY);
+        this[_close$0](io.WebSocketStatus.GOING_AWAY);
       }, VoidToNull()));
     }, VoidToNull()));
   }
@@ -52283,17 +52286,17 @@
     return this[_closeReason];
   }
   add(data) {
-    this[_sink].add(data);
+    this[_sink$0].add(data);
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    this[_sink].addError(error, stackTrace);
+    this[_sink$0].addError(error, stackTrace);
   }
   addStream(stream) {
-    return this[_sink].addStream(stream);
+    return this[_sink$0].addStream(stream);
   }
   get done() {
-    return this[_sink].done;
+    return this[_sink$0].done;
   }
   close(code, reason) {
     if (code === void 0) code = null;
@@ -52305,23 +52308,23 @@
       this[_outCloseCode] = code;
       this[_outCloseReason] = reason;
     }
-    if (!dart.test(this[_controller].isClosed)) {
-      if (!dart.test(this[_controller].hasListener) && this[_subscription] != null) {
-        this[_controller].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
+    if (!dart.test(this[_controller$0].isClosed)) {
+      if (!dart.test(this[_controller$0].hasListener) && this[_subscription$] != null) {
+        this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
       }
       if (this[_closeTimer] == null) {
-        this[_closeTimer] = async.Timer.new(const || (const = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
+        this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
-          if (this[_subscription] != null) this[_subscription].cancel();
-          this[_controller].close();
+          if (this[_subscription$] != null) this[_subscription$].cancel();
+          this[_controller$0].close();
           io._WebSocketImpl._webSockets[dartx.remove](this[_serviceId]);
         }, VoidToNull()));
       }
     }
-    return this[_sink].close();
+    return this[_sink$0].close();
   }
-  [_close](code, reason) {
+  [_close$0](code, reason) {
     if (code === void 0) code = null;
     if (reason === void 0) reason = null;
     if (dart.test(this[_writeClosed])) return;
@@ -52339,14 +52342,14 @@
   get [_serviceTypeName]() {
     return 'WebSocket';
   }
-  [_toJSON](ref) {
+  [_toJSON$](ref) {
     let name = dart.str`${dart.dload(dart.dload(this[_socket], 'address'), 'host')}:${dart.dload(this[_socket], 'port')}`;
     let r = dart.map({id: this[_servicePath], type: this[_serviceType](ref), name: name, user_name: name}, core.String, dart.dynamic);
     if (dart.test(ref)) {
       return r;
     }
     try {
-      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON, true));
+      r[dartx._set]('socket', dart.dsend(this[_socket], _toJSON$, true));
     } catch (_) {
       r[dartx._set]('socket', dart.map({id: this[_servicePath], type: '@Socket', name: 'UserSocket', user_name: 'UserSocket'}, core.String, core.String));
     }
@@ -52364,9 +52367,9 @@
   constructors: () => ({_fromSocket: dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic, core.String, io.CompressionOptions], [core.bool, io._WebSocketPerMessageDeflate])}),
   fields: () => ({
     protocol: core.String,
-    [_controller]: async.StreamController,
-    [_subscription]: async.StreamSubscription,
-    [_sink]: async.StreamSink,
+    [_controller$0]: async.StreamController,
+    [_subscription$]: async.StreamSubscription,
+    [_sink$0]: async.StreamSink,
     [_socket]: dart.dynamic,
     [_serverSide]: core.bool,
     [_readyState]: core.int,
@@ -52398,8 +52401,8 @@
     addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
     addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
     close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
-    [_close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
-    [_toJSON]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
+    [_close$0]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
+    [_toJSON$]: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [core.bool])
   }),
   sfields: () => ({
     _webSockets: MapOfint$_WebSocketImpl(),
@@ -52552,7 +52555,7 @@
       let error = new isolate.RemoteError(errorDescription, stackDescription);
       controller.addError(error, error.stackTrace);
     }
-    dart.fn(handleError, dynamicTovoid());
+    dart.fn(handleError, dynamicTovoid$());
     controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
         port = isolate.RawReceivePort.new(handleError);
         this.addErrorListener(port.sendPort);
@@ -52668,19 +52671,19 @@
     stackTrace: core.StackTrace
   })
 });
-const _trace = Symbol('_trace');
+const _trace$ = Symbol('_trace');
 isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
   new(trace) {
-    this[_trace] = trace;
+    this[_trace$] = trace;
   }
   toString() {
-    return this[_trace];
+    return this[_trace$];
   }
 };
 isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
 dart.setSignature(isolate._RemoteStackTrace, {
   constructors: () => ({new: dart.definiteFunctionType(isolate._RemoteStackTrace, [core.String])}),
-  fields: () => ({[_trace]: core.String})
+  fields: () => ({[_trace$]: core.String})
 });
 isolate.Capability = class Capability extends core.Object {
   static new() {
@@ -52749,7 +52752,7 @@
         return js._convertToJS(o);
       }
     }
-    dart.fn(_convert, dynamicTodynamic());
+    dart.fn(_convert, dynamicTodynamic$());
     return _convert(data);
   }
   _get(property) {
@@ -52998,7 +53001,7 @@
 js._isBrowserType = function(o) {
   return o instanceof Object && (o instanceof Blob || o instanceof Event || window.KeyRange && o instanceof KeyRange || window.IDBKeyRange && o instanceof IDBKeyRange || o instanceof ImageData || o instanceof Node || window.Int8Array && o instanceof Int8Array.__proto__ || o instanceof Window);
 };
-dart.fn(js._isBrowserType, dynamicTobool());
+dart.fn(js._isBrowserType, dynamicTobool$());
 const _dartObj = Symbol('_dartObj');
 js._DartObject = class _DartObject extends core.Object {
   new(dartObj) {
@@ -53022,7 +53025,7 @@
     return js._putIfAbsent(js._jsProxies, o, dart.fn(o => new js._DartObject(o), dynamicTo_DartObject()));
   }
 };
-dart.fn(js._convertToJS, dynamicTodynamic());
+dart.fn(js._convertToJS, dynamicTodynamic$());
 js._wrapDartFunction = function(f) {
   let wrapper = function() {
     let args = Array.prototype.map.call(arguments, js._convertToDart);
@@ -53031,7 +53034,7 @@
   js._dartProxies.set(wrapper, f);
   return wrapper;
 };
-dart.fn(js._wrapDartFunction, dynamicTodynamic());
+dart.fn(js._wrapDartFunction, dynamicTodynamic$());
 js._convertToDart = function(o) {
   if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean" || dart.test(js._isBrowserType(o))) {
     return o;
@@ -53111,7 +53114,7 @@
   }
   return js_util._convertDataTree(object);
 };
-dart.fn(js_util.jsify, dynamicTodynamic());
+dart.fn(js_util.jsify, dynamicTodynamic$());
 js_util._convertDataTree = function(data) {
   let _convertedObjects = collection.HashMap.identity();
   function _convert(o) {
@@ -53134,22 +53137,22 @@
       return o;
     }
   }
-  dart.fn(_convert, dynamicTodynamic());
+  dart.fn(_convert, dynamicTodynamic$());
   return _convert(data);
 };
-dart.fn(js_util._convertDataTree, dynamicTodynamic());
+dart.fn(js_util._convertDataTree, dynamicTodynamic$());
 js_util.newObject = function() {
   return {};
 };
-dart.fn(js_util.newObject, VoidTodynamic());
+dart.fn(js_util.newObject, VoidTodynamic$());
 js_util.hasProperty = function(o, name) {
   return name in o;
 };
-dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic());
+dart.fn(js_util.hasProperty, dynamicAnddynamicTodynamic$());
 js_util.getProperty = function(o, name) {
   return o[name];
 };
-dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic());
+dart.fn(js_util.getProperty, dynamicAnddynamicTodynamic$());
 js_util.setProperty = function(o, name, value) {
   return o[name] = value;
 };
@@ -53227,7 +53230,7 @@
     return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
   };
 };
-dart.fn(math.max, TAndTToT());
+dart.fn(math.max, TAndTToT$());
 math.atan2 = function(a, b) {
   return Math.atan2(_js_helper.checkNum(a), _js_helper.checkNum(b));
 };
@@ -53423,11 +53426,11 @@
 math._Random._POW2_53_D = 1.0 * 9007199254740992;
 math._Random._POW2_27_D = 1.0 * (1 << 27);
 math._Random._MASK32 = 4294967295;
-const _buffer = Symbol('_buffer');
+const _buffer$0 = Symbol('_buffer');
 const _getRandomBytes = Symbol('_getRandomBytes');
 math._JSSecureRandom = class _JSSecureRandom extends core.Object {
   new() {
-    this[_buffer] = typed_data.ByteData.new(8);
+    this[_buffer$0] = typed_data.ByteData.new(8);
     let crypto = self.crypto;
     if (crypto != null) {
       let getRandomValues = crypto.getRandomValues;
@@ -53438,18 +53441,18 @@
     dart.throw(new core.UnsupportedError("No source of cryptographically secure random numbers available."));
   }
   [_getRandomBytes](start, length) {
-    crypto.getRandomValues(this[_buffer][dartx.buffer][dartx.asUint8List](start, length));
+    crypto.getRandomValues(this[_buffer$0][dartx.buffer][dartx.asUint8List](start, length));
   }
   nextBool() {
     this[_getRandomBytes](0, 1);
-    return this[_buffer][dartx.getUint8](0)[dartx.isOdd];
+    return this[_buffer$0][dartx.getUint8](0)[dartx.isOdd];
   }
   nextDouble() {
     this[_getRandomBytes](1, 7);
-    this[_buffer][dartx.setUint8](0, 63);
-    let highByte = this[_buffer][dartx.getUint8](1);
-    this[_buffer][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
-    let result = dart.notNull(this[_buffer][dartx.getFloat64](0)) - 1.0;
+    this[_buffer$0][dartx.setUint8](0, 63);
+    let highByte = this[_buffer$0][dartx.getUint8](1);
+    this[_buffer$0][dartx.setUint8](1, (dart.notNull(highByte) | 240) >>> 0);
+    let result = dart.notNull(this[_buffer$0][dartx.getFloat64](0)) - 1.0;
     if ((dart.notNull(highByte) & 16) != 0) {
       result = result + 1.1102230246251565e-16;
     }
@@ -53469,12 +53472,12 @@
         }
       }
     }
-    this[_buffer][dartx.setUint32](0, 0);
+    this[_buffer$0][dartx.setUint32](0, 0);
     let start = 4 - byteCount;
     let randomLimit = dart.asInt(math.pow(256, byteCount));
     while (true) {
       this[_getRandomBytes](start, byteCount);
-      let random = this[_buffer][dartx.getUint32](0);
+      let random = this[_buffer$0][dartx.getUint32](0);
       if ((dart.notNull(max) & dart.notNull(max) - 1) == 0) {
         return (dart.notNull(random) & dart.notNull(max) - 1) >>> 0;
       }
@@ -53488,7 +53491,7 @@
 math._JSSecureRandom[dart.implements] = () => [math.Random];
 dart.setSignature(math._JSSecureRandom, {
   constructors: () => ({new: dart.definiteFunctionType(math._JSSecureRandom, [])}),
-  fields: () => ({[_buffer]: typed_data.ByteData}),
+  fields: () => ({[_buffer$0]: typed_data.ByteData}),
   methods: () => ({
     [_getRandomBytes]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
     nextBool: dart.definiteFunctionType(core.bool, []),
@@ -53585,12 +53588,12 @@
   });
   return Point;
 });
-math.Point = Point();
-let const;
+math.Point = Point$();
+let const$82;
 math.Random = class Random extends core.Object {
   static new(seed) {
     if (seed === void 0) seed = null;
-    return seed == null ? const || (const = dart.const(new math._JSRandom())) : new math._Random(seed);
+    return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
   }
   static secure() {
     return math.Random._secureRandom;
@@ -54432,25 +54435,25 @@
     }
     return false;
   }
-  dart.fn(containsDate, dynamicTobool());
+  dart.fn(containsDate, dynamicTobool$());
   if (dart.test(containsDate(nativeKey))) {
     dart.throw(new core.UnimplementedError('Key containing DateTime'));
   }
   return nativeKey;
 };
-dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic());
+dart.fn(indexed_db._convertNativeToDart_IDBKey, dynamicTodynamic$());
 indexed_db._convertDartToNative_IDBKey = function(dartKey) {
   return dartKey;
 };
-dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic());
+dart.fn(indexed_db._convertDartToNative_IDBKey, dynamicTodynamic$());
 indexed_db._convertNativeToDart_IDBAny = function(object) {
   return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false});
 };
-dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic());
+dart.fn(indexed_db._convertNativeToDart_IDBAny, dynamicTodynamic$());
 indexed_db._idbKey = 'JSExtendableArray|=Object|num|String';
 indexed_db._annotation_Creates_IDBKey = dart.const(new _js_helper.Creates(indexed_db._idbKey));
 indexed_db._annotation_Returns_IDBKey = dart.const(new _js_helper.Returns(indexed_db._idbKey));
-const _delete = Symbol('_delete');
+const _delete$ = Symbol('_delete');
 const _update = Symbol('_update');
 const _update_1 = Symbol('_update_1');
 dart.defineExtensionNames([
@@ -54467,7 +54470,7 @@
 indexed_db.Cursor = class Cursor extends _interceptors.Interceptor {
   [dartx.delete]() {
     try {
-      return indexed_db._completeRequest(dart.dynamic)(this[_delete]());
+      return indexed_db._completeRequest(dart.dynamic)(this[_delete$]());
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       return async.Future.error(e, stacktrace);
@@ -54512,7 +54515,7 @@
   [dartx.continuePrimaryKey](...args) {
     return this.continuePrimaryKey.apply(this, args);
   }
-  [_delete](...args) {
+  [_delete$](...args) {
     return this.delete.apply(this, args);
   }
   [_update](value) {
@@ -54537,7 +54540,7 @@
     [dartx.next]: dart.definiteFunctionType(dart.void, [], [core.Object]),
     [dartx.advance]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.continuePrimaryKey]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
-    [_delete]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_delete$]: dart.definiteFunctionType(indexed_db.Request, []),
     [_update]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
     [_update_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic])
   })
@@ -54576,12 +54579,12 @@
   'removeEventListener',
   'dispatchEvent'
 ]);
-html.EventTarget = class EventTarget extends _interceptors.Interceptor {
+html$.EventTarget = class EventTarget extends _interceptors.Interceptor {
   _created() {
     super.new();
   }
   get [dartx.on]() {
-    return new html.Events(this);
+    return new html$.Events(this);
   }
   [dartx.addEventListener](type, listener, useCapture) {
     if (useCapture === void 0) useCapture = null;
@@ -54608,22 +54611,22 @@
     return this.removeEventListener.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.EventTarget, '_created');
-dart.setSignature(html.EventTarget, {
+dart.defineNamedConstructor(html$.EventTarget, '_created');
+dart.setSignature(html$.EventTarget, {
   constructors: () => ({
-    _created: dart.definiteFunctionType(html.EventTarget, []),
-    _: dart.definiteFunctionType(html.EventTarget, [])
+    _created: dart.definiteFunctionType(html$.EventTarget, []),
+    _: dart.definiteFunctionType(html$.EventTarget, [])
   }),
-  getters: () => ({[dartx.on]: dart.definiteFunctionType(html.Events, [])}),
+  getters: () => ({[dartx.on]: dart.definiteFunctionType(html$.Events, [])}),
   methods: () => ({
-    [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html.Event]),
-    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool])
+    [dartx.addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [dartx.removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    [dartx.dispatchEvent]: dart.definiteFunctionType(core.bool, [html$.Event]),
+    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
   })
 });
-dart.registerExtension(dart.global.EventTarget, html.EventTarget);
+dart.registerExtension(dart.global.EventTarget, html$.EventTarget);
 dart.defineExtensionNames([
   'createObjectStore',
   'transaction',
@@ -54640,7 +54643,7 @@
   'objectStoreNames',
   'version'
 ]);
-indexed_db.Database = class Database extends html.EventTarget {
+indexed_db.Database = class Database extends html$.EventTarget {
   [dartx.createObjectStore](name, opts) {
     let keyPath = opts && 'keyPath' in opts ? opts.keyPath : null;
     let autoIncrement = opts && 'autoIncrement' in opts ? opts.autoIncrement : null;
@@ -54734,9 +54737,9 @@
     [dartx.version]: core.Object
   }),
   getters: () => ({
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
     [dartx.onVersionChange]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
   }),
   methods: () => ({
@@ -54744,7 +54747,7 @@
     [dartx.transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, core.String]),
     [dartx.transactionStore]: dart.definiteFunctionType(indexed_db.Transaction, [core.String, core.String]),
     [dartx.transactionList]: dart.definiteFunctionType(indexed_db.Transaction, [ListOfString(), core.String]),
-    [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html.DomStringList, core.String]),
+    [dartx.transactionStores]: dart.definiteFunctionType(indexed_db.Transaction, [html$.DomStringList, core.String]),
     [_transaction]: dart.definiteFunctionType(indexed_db.Transaction, [dart.dynamic, dart.dynamic]),
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
     [_createObjectStore]: dart.definiteFunctionType(indexed_db.ObjectStore, [core.String], [core.Map]),
@@ -54890,9 +54893,9 @@
   };
 };
 dart.lazyFn(indexed_db._completeRequest, () => RequestToFutureOfT());
-const _count = Symbol('_count');
-const _get = Symbol('_get');
-const _getKey = Symbol('_getKey');
+const _count$0 = Symbol('_count');
+const _get$ = Symbol('_get');
+const _getKey$ = Symbol('_getKey');
 const _openCursor = Symbol('_openCursor');
 const _openKeyCursor = Symbol('_openKeyCursor');
 dart.defineExtensionNames([
@@ -54913,7 +54916,7 @@
   [dartx.count](key_OR_range) {
     if (key_OR_range === void 0) key_OR_range = null;
     try {
-      let request = this[_count](key_OR_range);
+      let request = this[_count$0](key_OR_range);
       return indexed_db._completeRequest(core.int)(request);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
@@ -54923,7 +54926,7 @@
   }
   [dartx.get](key) {
     try {
-      let request = this[_get](key);
+      let request = this[_get$](key);
       return indexed_db._completeRequest(dart.dynamic)(request);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
@@ -54933,7 +54936,7 @@
   }
   [dartx.getKey](key) {
     try {
-      let request = this[_getKey](key);
+      let request = this[_getKey$](key);
       return indexed_db._completeRequest(dart.dynamic)(request);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
@@ -55003,10 +55006,10 @@
   get [dartx.unique]() {
     return this.unique;
   }
-  [_count](...args) {
+  [_count$0](...args) {
     return this.count.apply(this, args);
   }
-  [_get](...args) {
+  [_get$](...args) {
     return this.get.apply(this, args);
   }
   [dartx.getAll](...args) {
@@ -55015,7 +55018,7 @@
   [dartx.getAllKeys](...args) {
     return this.getAllKeys.apply(this, args);
   }
-  [_getKey](...args) {
+  [_getKey$](...args) {
     return this.getKey.apply(this, args);
   }
   [_openCursor](...args) {
@@ -55040,11 +55043,11 @@
     [dartx.getKey]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
     [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
     [dartx.openKeyCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.Cursor), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
-    [_count]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
-    [_get]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
     [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
-    [_getKey]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_getKey$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [_openCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String]),
     [_openKeyCursor]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.String])
   })
@@ -55112,8 +55115,8 @@
   names: ['bound_', 'lowerBound_', 'only_', 'upperBound_']
 });
 dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
-const _add = Symbol('_add');
-const _clear = Symbol('_clear');
+const _add$3 = Symbol('_add');
+const _clear$0 = Symbol('_clear');
 const _put = Symbol('_put');
 const _createIndex = Symbol('_createIndex');
 const _add_1 = Symbol('_add_1');
@@ -55148,9 +55151,9 @@
     try {
       let request = null;
       if (key != null) {
-        request = this[_add](value, key);
+        request = this[_add$3](value, key);
       } else {
-        request = this[_add](value);
+        request = this[_add$3](value);
       }
       return indexed_db._completeRequest(dart.dynamic)(indexed_db.Request._check(request));
     } catch (e) {
@@ -55161,7 +55164,7 @@
   }
   [dartx.clear]() {
     try {
-      return indexed_db._completeRequest(dart.dynamic)(this[_clear]());
+      return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       return async.Future.error(e, stacktrace);
@@ -55170,7 +55173,7 @@
   }
   [dartx.delete](key_OR_keyRange) {
     try {
-      return indexed_db._completeRequest(dart.dynamic)(this[_delete](key_OR_keyRange));
+      return indexed_db._completeRequest(dart.dynamic)(this[_delete$](key_OR_keyRange));
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       return async.Future.error(e, stacktrace);
@@ -55180,7 +55183,7 @@
   [dartx.count](key_OR_range) {
     if (key_OR_range === void 0) key_OR_range = null;
     try {
-      let request = this[_count](key_OR_range);
+      let request = this[_count$0](key_OR_range);
       return indexed_db._completeRequest(core.int)(request);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
@@ -55206,7 +55209,7 @@
   }
   [dartx.getObject](key) {
     try {
-      let request = this[_get](key);
+      let request = this[_get$](key);
       return indexed_db._completeRequest(dart.dynamic)(request);
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
@@ -55266,7 +55269,7 @@
   get [dartx.transaction]() {
     return this.transaction;
   }
-  [_add](value, key) {
+  [_add$3](value, key) {
     if (key === void 0) key = null;
     if (key != null) {
       let value_1 = html_common.convertDartToNative_SerializedScriptValue(value);
@@ -55282,10 +55285,10 @@
   [_add_2](...args) {
     return this.add.apply(this, args);
   }
-  [_clear](...args) {
+  [_clear$0](...args) {
     return this.clear.apply(this, args);
   }
-  [_count](...args) {
+  [_count$0](...args) {
     return this.count.apply(this, args);
   }
   [_createIndex](name, keyPath, options) {
@@ -55302,13 +55305,13 @@
   [_createIndex_2](...args) {
     return this.createIndex.apply(this, args);
   }
-  [_delete](...args) {
+  [_delete$](...args) {
     return this.delete.apply(this, args);
   }
   [dartx.deleteIndex](...args) {
     return this.deleteIndex.apply(this, args);
   }
-  [_get](...args) {
+  [_get$](...args) {
     return this.get.apply(this, args);
   }
   [dartx.getAll](...args) {
@@ -55379,17 +55382,17 @@
     [dartx.getObject]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
     [dartx.openCursor]: dart.definiteFunctionType(async.Stream$(indexed_db.CursorWithValue), [], {key: dart.dynamic, range: indexed_db.KeyRange, direction: core.String, autoAdvance: core.bool}),
     [dartx.createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, dart.dynamic], {unique: core.bool, multiEntry: core.bool}),
-    [_add]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
+    [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
     [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
     [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-    [_clear]: dart.definiteFunctionType(indexed_db.Request, []),
-    [_count]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
     [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
     [_createIndex_2]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic]),
-    [_delete]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_delete$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [dartx.deleteIndex]: dart.definiteFunctionType(dart.void, [core.String]),
-    [_get]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
+    [_get$]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [dartx.getAll]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
     [dartx.getAllKeys]: dart.definiteFunctionType(indexed_db.Request, [core.Object], [core.int]),
     [dartx.index]: dart.definiteFunctionType(indexed_db.Index, [core.String]),
@@ -55419,7 +55422,7 @@
   'source',
   'transaction'
 ]);
-indexed_db.Request = class Request extends html.EventTarget {
+indexed_db.Request = class Request extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -55451,7 +55454,7 @@
 dart.setSignature(indexed_db.Request, {
   constructors: () => ({_: dart.definiteFunctionType(indexed_db.Request, [])}),
   fields: () => ({
-    [dartx.error]: html.DomError,
+    [dartx.error]: html$.DomError,
     [dartx.readyState]: core.String,
     [_get_result]: dart.dynamic,
     [dartx.source]: core.Object,
@@ -55459,8 +55462,8 @@
   }),
   getters: () => ({
     [dartx.result]: dart.definiteFunctionType(dart.dynamic, []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuccess]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   sfields: () => ({
     errorEvent: EventStreamProviderOfEvent(),
@@ -55494,7 +55497,7 @@
 dart.setSignature(indexed_db.OpenDBRequest, {
   constructors: () => ({_: dart.definiteFunctionType(indexed_db.OpenDBRequest, [])}),
   getters: () => ({
-    [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html.Event), []),
+    [dartx.onBlocked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
     [dartx.onUpgradeNeeded]: dart.definiteFunctionType(async.Stream$(indexed_db.VersionChangeEvent), [])
   }),
   sfields: () => ({
@@ -55524,7 +55527,7 @@
   'mode',
   'objectStoreNames'
 ]);
-indexed_db.Transaction = class Transaction extends html.EventTarget {
+indexed_db.Transaction = class Transaction extends html$.EventTarget {
   get [dartx.completed]() {
     let completer = CompleterOfDatabase().new();
     this[dartx.onComplete].first.then(dart.dynamic)(dart.fn(_ => {
@@ -55575,15 +55578,15 @@
   constructors: () => ({_: dart.definiteFunctionType(indexed_db.Transaction, [])}),
   fields: () => ({
     [dartx.db]: indexed_db.Database,
-    [dartx.error]: html.DomError,
+    [dartx.error]: html$.DomError,
     [dartx.mode]: core.String,
     [dartx.objectStoreNames]: ListOfString()
   }),
   getters: () => ({
     [dartx.completed]: dart.definiteFunctionType(async.Future$(indexed_db.Database), []),
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
@@ -55627,16 +55630,16 @@
   'timeStamp',
   'type'
 ]);
-html.Event = class Event extends _interceptors.Interceptor {
+html$.Event = class Event extends _interceptors.Interceptor {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-    return html.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
+    return html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
   }
   static eventType(type, name, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
-    let e = html.document[_createEvent](type);
+    let e = html$.document[_createEvent](type);
     e[_initEvent](name, canBubble, cancelable);
     return e;
   }
@@ -55650,8 +55653,8 @@
     if (this[_selector] == null) {
       dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
     }
-    let currentTarget = html.Element._check(this[dartx.currentTarget]);
-    let target = html.Element._check(this[dartx.target]);
+    let currentTarget = html$.Element._check(this[dartx.currentTarget]);
+    let target = html$.Element._check(this[dartx.target]);
     let matchedTarget = null;
     do {
       if (dart.test(target[dartx.matches](this[_selector]))) return target;
@@ -55663,9 +55666,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.Event._create_1(type, eventInitDict_1);
+      return html$.Event._create_1(type, eventInitDict_1);
     }
-    return html.Event._create_2(type);
+    return html$.Event._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.Event(type, eventInitDict);
@@ -55680,7 +55683,7 @@
     return this.cancelable;
   }
   get [dartx.currentTarget]() {
-    return html._convertNativeToDart_EventTarget(this[_get_currentTarget]);
+    return html$._convertNativeToDart_EventTarget(this[_get_currentTarget]);
   }
   get [_get_currentTarget]() {
     return this.currentTarget;
@@ -55695,7 +55698,7 @@
     return this.path;
   }
   get [dartx.target]() {
-    return html._convertNativeToDart_EventTarget(this[_get_target]);
+    return html$._convertNativeToDart_EventTarget(this[_get_target]);
   }
   get [_get_target]() {
     return this.target;
@@ -55719,11 +55722,11 @@
     return this.stopPropagation.apply(this, args);
   }
 };
-dart.setSignature(html.Event, {
+dart.setSignature(html$.Event, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
-    eventType: dart.definiteFunctionType(html.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
-    _: dart.definiteFunctionType(html.Event, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.Event, [core.String], {canBubble: core.bool, cancelable: core.bool}),
+    eventType: dart.definiteFunctionType(html$.Event, [core.String, core.String], {canBubble: core.bool, cancelable: core.bool}),
+    _: dart.definiteFunctionType(html$.Event, [core.String], [core.Map])
   }),
   fields: () => ({
     [_selector]: core.String,
@@ -55738,9 +55741,9 @@
     [dartx.type]: core.String
   }),
   getters: () => ({
-    [dartx.matchingTarget]: dart.definiteFunctionType(html.Element, []),
-    [dartx.currentTarget]: dart.definiteFunctionType(html.EventTarget, []),
-    [dartx.target]: dart.definiteFunctionType(html.EventTarget, [])
+    [dartx.matchingTarget]: dart.definiteFunctionType(html$.Element, []),
+    [dartx.currentTarget]: dart.definiteFunctionType(html$.EventTarget, []),
+    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, [])
   }),
   methods: () => ({
     [_initEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool]),
@@ -55754,23 +55757,23 @@
     CAPTURING_PHASE: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.Event, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.Event, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.Event, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.Event, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-html.Event.AT_TARGET = 2;
-html.Event.BUBBLING_PHASE = 3;
-html.Event.CAPTURING_PHASE = 1;
-dart.registerExtension(dart.global.Event, html.Event);
-dart.registerExtension(dart.global.InputEvent, html.Event);
+html$.Event.AT_TARGET = 2;
+html$.Event.BUBBLING_PHASE = 3;
+html$.Event.CAPTURING_PHASE = 1;
+dart.registerExtension(dart.global.Event, html$.Event);
+dart.registerExtension(dart.global.InputEvent, html$.Event);
 dart.defineExtensionNames([
   'dataLoss',
   'dataLossMessage',
   'newVersion',
   'oldVersion'
 ]);
-indexed_db.VersionChangeEvent = class VersionChangeEvent extends html.Event {
+indexed_db.VersionChangeEvent = class VersionChangeEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -55819,18 +55822,18 @@
   names: ['_create_1', '_create_2']
 });
 dart.registerExtension(dart.global.IDBVersionChangeEvent, indexed_db.VersionChangeEvent);
-dart.copyProperties(html, {
+dart.copyProperties(html$, {
   get window() {
     return window;
   }
 });
-dart.copyProperties(html, {
+dart.copyProperties(html$, {
   get document() {
     return document;
   }
 });
 const _xtag = Symbol('_xtag');
-const _attributes = Symbol('_attributes');
+const _attributes$ = Symbol('_attributes');
 const _innerHtml = Symbol('_innerHtml');
 const _scrollHeight = Symbol('_scrollHeight');
 const _scrollLeft = Symbol('_scrollLeft');
@@ -55897,7 +55900,7 @@
   'previousNode',
   'text'
 ]);
-html.Node = class Node extends html.EventTarget {
+html$.Node = class Node extends html$.EventTarget {
   _created() {
     this[dartx.childNodes] = null;
     this[dartx.baseUri] = null;
@@ -55917,7 +55920,7 @@
     super._created();
   }
   get [dartx.nodes]() {
-    return new html._ChildNodeListLazy(this);
+    return new html$._ChildNodeListLazy(this);
   }
   set [dartx.nodes](value) {
     let copy = value[dartx.toList]();
@@ -55943,7 +55946,7 @@
     return this;
   }
   [dartx.insertAllBefore](newNodes, refChild) {
-    if (html._ChildNodeListLazy.is(newNodes)) {
+    if (html$._ChildNodeListLazy.is(newNodes)) {
       let otherList = newNodes;
       if (core.identical(otherList[_this], this)) {
         dart.throw(new core.ArgumentError(newNodes));
@@ -56039,43 +56042,43 @@
     return this.replaceChild.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.Node, '_created');
-dart.setSignature(html.Node, {
+dart.defineNamedConstructor(html$.Node, '_created');
+dart.setSignature(html$.Node, {
   constructors: () => ({
-    _created: dart.definiteFunctionType(html.Node, []),
-    _: dart.definiteFunctionType(html.Node, [])
+    _created: dart.definiteFunctionType(html$.Node, []),
+    _: dart.definiteFunctionType(html$.Node, [])
   }),
   fields: () => ({
     [dartx.childNodes]: ListOfNode(),
     [dartx.baseUri]: core.String,
-    [dartx.firstChild]: html.Node,
-    [dartx.lastChild]: html.Node,
+    [dartx.firstChild]: html$.Node,
+    [dartx.lastChild]: html$.Node,
     [_localName]: core.String,
     [_namespaceUri]: core.String,
-    [dartx.nextNode]: html.Node,
+    [dartx.nextNode]: html$.Node,
     [dartx.nodeName]: core.String,
     [dartx.nodeType]: core.int,
     [dartx.nodeValue]: core.String,
-    [dartx.ownerDocument]: html.Document,
-    [dartx.parent]: html.Element,
-    [dartx.parentNode]: html.Node,
-    [dartx.previousNode]: html.Node,
+    [dartx.ownerDocument]: html$.Document,
+    [dartx.parent]: html$.Element,
+    [dartx.parentNode]: html$.Node,
+    [dartx.previousNode]: html$.Node,
     [dartx.text]: core.String
   }),
-  getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html.Node), [])}),
+  getters: () => ({[dartx.nodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
   setters: () => ({[dartx.nodes]: dart.definiteFunctionType(dart.void, [IterableOfNode()])}),
   methods: () => ({
     [dartx.remove]: dart.definiteFunctionType(dart.void, []),
-    [dartx.replaceWith]: dart.definiteFunctionType(html.Node, [html.Node]),
-    [dartx.insertAllBefore]: dart.definiteFunctionType(html.Node, [IterableOfNode(), html.Node]),
+    [dartx.replaceWith]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [dartx.insertAllBefore]: dart.definiteFunctionType(html$.Node, [IterableOfNode(), html$.Node]),
     [_clearChildren]: dart.definiteFunctionType(dart.void, []),
-    [dartx.append]: dart.definiteFunctionType(html.Node, [html.Node]),
-    [dartx.clone]: dart.definiteFunctionType(html.Node, [core.bool]),
-    [dartx.contains]: dart.definiteFunctionType(core.bool, [html.Node]),
+    [dartx.append]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [dartx.clone]: dart.definiteFunctionType(html$.Node, [core.bool]),
+    [dartx.contains]: dart.definiteFunctionType(core.bool, [html$.Node]),
     [dartx.hasChildNodes]: dart.definiteFunctionType(core.bool, []),
-    [dartx.insertBefore]: dart.definiteFunctionType(html.Node, [html.Node, html.Node]),
-    [_removeChild]: dart.definiteFunctionType(html.Node, [html.Node]),
-    [_replaceChild]: dart.definiteFunctionType(html.Node, [html.Node, html.Node])
+    [dartx.insertBefore]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node]),
+    [_removeChild]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [_replaceChild]: dart.definiteFunctionType(html$.Node, [html$.Node, html$.Node])
   }),
   sfields: () => ({
     ATTRIBUTE_NODE: core.int,
@@ -56092,19 +56095,19 @@
     TEXT_NODE: core.int
   })
 });
-html.Node.ATTRIBUTE_NODE = 2;
-html.Node.CDATA_SECTION_NODE = 4;
-html.Node.COMMENT_NODE = 8;
-html.Node.DOCUMENT_FRAGMENT_NODE = 11;
-html.Node.DOCUMENT_NODE = 9;
-html.Node.DOCUMENT_TYPE_NODE = 10;
-html.Node.ELEMENT_NODE = 1;
-html.Node.ENTITY_NODE = 6;
-html.Node.ENTITY_REFERENCE_NODE = 5;
-html.Node.NOTATION_NODE = 12;
-html.Node.PROCESSING_INSTRUCTION_NODE = 7;
-html.Node.TEXT_NODE = 3;
-dart.registerExtension(dart.global.Node, html.Node);
+html$.Node.ATTRIBUTE_NODE = 2;
+html$.Node.CDATA_SECTION_NODE = 4;
+html$.Node.COMMENT_NODE = 8;
+html$.Node.DOCUMENT_FRAGMENT_NODE = 11;
+html$.Node.DOCUMENT_NODE = 9;
+html$.Node.DOCUMENT_TYPE_NODE = 10;
+html$.Node.ELEMENT_NODE = 1;
+html$.Node.ENTITY_NODE = 6;
+html$.Node.ENTITY_REFERENCE_NODE = 5;
+html$.Node.NOTATION_NODE = 12;
+html$.Node.PROCESSING_INSTRUCTION_NODE = 7;
+html$.Node.TEXT_NODE = 3;
+dart.registerExtension(dart.global.Node, html$.Node);
 dart.defineExtensionNames([
   'attributes',
   'attributes',
@@ -56280,12 +56283,12 @@
   'nextElementSibling',
   'previousElementSibling'
 ]);
-html.Element = class Element extends html.Node {
+html$.Element = class Element extends html$.Node {
   static html(html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    let fragment = html.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
-    return html.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html.Element.is(e), NodeTobool()))[dartx.single]);
+    let fragment = html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    return html$.Element._check(fragment[dartx.nodes][dartx.where](dart.fn(e => html$.Element.is(e), NodeTobool$()))[dartx.single]);
   }
   created() {
     this[_xtag] = null;
@@ -56302,7 +56305,7 @@
     this[dartx.title] = null;
     this[dartx.translate] = null;
     this[dartx.dropzone] = null;
-    this[_attributes] = null;
+    this[_attributes$] = null;
     this[dartx.className] = null;
     this[dartx.clientHeight] = null;
     this[dartx.clientLeft] = null;
@@ -56327,97 +56330,97 @@
   }
   static tag(tag, typeExtention) {
     if (typeExtention === void 0) typeExtention = null;
-    return html.Element._check(html._ElementFactoryProvider.createElement_tag(tag, typeExtention));
+    return html$.Element._check(html$._ElementFactoryProvider.createElement_tag(tag, typeExtention));
   }
   static a() {
-    return html.Element.tag('a');
+    return html$.Element.tag('a');
   }
   static article() {
-    return html.Element.tag('article');
+    return html$.Element.tag('article');
   }
   static aside() {
-    return html.Element.tag('aside');
+    return html$.Element.tag('aside');
   }
   static audio() {
-    return html.Element.tag('audio');
+    return html$.Element.tag('audio');
   }
   static br() {
-    return html.Element.tag('br');
+    return html$.Element.tag('br');
   }
   static canvas() {
-    return html.Element.tag('canvas');
+    return html$.Element.tag('canvas');
   }
   static div() {
-    return html.Element.tag('div');
+    return html$.Element.tag('div');
   }
   static footer() {
-    return html.Element.tag('footer');
+    return html$.Element.tag('footer');
   }
   static header() {
-    return html.Element.tag('header');
+    return html$.Element.tag('header');
   }
   static hr() {
-    return html.Element.tag('hr');
+    return html$.Element.tag('hr');
   }
   static iframe() {
-    return html.Element.tag('iframe');
+    return html$.Element.tag('iframe');
   }
   static img() {
-    return html.Element.tag('img');
+    return html$.Element.tag('img');
   }
   static li() {
-    return html.Element.tag('li');
+    return html$.Element.tag('li');
   }
   static nav() {
-    return html.Element.tag('nav');
+    return html$.Element.tag('nav');
   }
   static ol() {
-    return html.Element.tag('ol');
+    return html$.Element.tag('ol');
   }
   static option() {
-    return html.Element.tag('option');
+    return html$.Element.tag('option');
   }
   static p() {
-    return html.Element.tag('p');
+    return html$.Element.tag('p');
   }
   static pre() {
-    return html.Element.tag('pre');
+    return html$.Element.tag('pre');
   }
   static section() {
-    return html.Element.tag('section');
+    return html$.Element.tag('section');
   }
   static select() {
-    return html.Element.tag('select');
+    return html$.Element.tag('select');
   }
   static span() {
-    return html.Element.tag('span');
+    return html$.Element.tag('span');
   }
   static svg() {
-    return html.Element.tag('svg');
+    return html$.Element.tag('svg');
   }
   static table() {
-    return html.Element.tag('table');
+    return html$.Element.tag('table');
   }
   static td() {
-    return html.Element.tag('td');
+    return html$.Element.tag('td');
   }
   static textarea() {
-    return html.Element.tag('textarea');
+    return html$.Element.tag('textarea');
   }
   static th() {
-    return html.Element.tag('th');
+    return html$.Element.tag('th');
   }
   static tr() {
-    return html.Element.tag('tr');
+    return html$.Element.tag('tr');
   }
   static ul() {
-    return html.Element.tag('ul');
+    return html$.Element.tag('ul');
   }
   static video() {
-    return html.Element.tag('video');
+    return html$.Element.tag('video');
   }
   get [dartx.attributes]() {
-    return new html._ElementAttributeMap(this);
+    return new html$._ElementAttributeMap(this);
   }
   set [dartx.attributes](value) {
     let attributes = this[dartx.attributes];
@@ -56427,7 +56430,7 @@
     }
   }
   get [dartx.children]() {
-    return new html._ChildrenElementList._wrap(this);
+    return new html$._ChildrenElementList._wrap(this);
   }
   set [dartx.children](value) {
     let copy = value[dartx.toList]();
@@ -56437,7 +56440,7 @@
   }
   [dartx.querySelectorAll](T) {
     return selectors => {
-      return new (html._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
     };
   }
   [dartx.query](relativeSelectors) {
@@ -56449,7 +56452,7 @@
     };
   }
   get [dartx.classes]() {
-    return new html._ElementCssClassSet(this);
+    return new html$._ElementCssClassSet(this);
   }
   set [dartx.classes](value) {
     let classSet = this[dartx.classes];
@@ -56457,7 +56460,7 @@
     classSet.addAll(value);
   }
   get [dartx.dataset]() {
-    return new html._DataAttributeMap(this[dartx.attributes]);
+    return new html$._DataAttributeMap(this[dartx.attributes]);
   }
   set [dartx.dataset](value) {
     let data = this[dartx.dataset];
@@ -56467,14 +56470,14 @@
     }
   }
   [dartx.getNamespacedAttributes](namespace) {
-    return new html._NamespacedAttributeMap(this, namespace);
+    return new html$._NamespacedAttributeMap(this, namespace);
   }
   [dartx.getComputedStyle](pseudoElement) {
     if (pseudoElement === void 0) pseudoElement = null;
     if (pseudoElement == null) {
       pseudoElement = '';
     }
-    return html.window[_getComputedStyle](this, pseudoElement);
+    return html$.window[_getComputedStyle](this, pseudoElement);
   }
   get [dartx.client]() {
     return new (RectangleOfint())(this[dartx.clientLeft], this[dartx.clientTop], this[dartx.clientWidth], this[dartx.clientHeight]);
@@ -56483,7 +56486,7 @@
     return new (RectangleOfint())(this[dartx.offsetLeft], this[dartx.offsetTop], this[dartx.offsetWidth], this[dartx.offsetHeight]);
   }
   [dartx.appendText](text) {
-    this[dartx.append](html.Text.new(text));
+    this[dartx.append](html$.Text.new(text));
   }
   [dartx.appendHtml](text, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
@@ -56491,8 +56494,8 @@
     this[dartx.insertAdjacentHtml]('beforeend', text, {validator: validator, treeSanitizer: treeSanitizer});
   }
   static isTagSupported(tag) {
-    let e = html._ElementFactoryProvider.createElement_tag(tag, null);
-    return html.Element.is(e) && !html.UnknownElement.is(e);
+    let e = html$._ElementFactoryProvider.createElement_tag(tag, null);
+    return html$.Element.is(e) && !html$.UnknownElement.is(e);
   }
   [dartx.attached]() {
     this[dartx.enteredView]();
@@ -56545,12 +56548,12 @@
     if (alignment === void 0) alignment = null;
     let hasScrollIntoViewIfNeeded = true;
     hasScrollIntoViewIfNeeded = !!this.scrollIntoViewIfNeeded;
-    if (dart.equals(alignment, html.ScrollAlignment.TOP)) {
+    if (dart.equals(alignment, html$.ScrollAlignment.TOP)) {
       this[_scrollIntoView](true);
-    } else if (dart.equals(alignment, html.ScrollAlignment.BOTTOM)) {
+    } else if (dart.equals(alignment, html$.ScrollAlignment.BOTTOM)) {
       this[_scrollIntoView](false);
     } else if (hasScrollIntoViewIfNeeded) {
-      if (dart.equals(alignment, html.ScrollAlignment.CENTER)) {
+      if (dart.equals(alignment, html$.ScrollAlignment.CENTER)) {
         this[_scrollIntoViewIfNeeded](true);
       } else {
         this[_scrollIntoViewIfNeeded]();
@@ -56574,7 +56577,7 @@
     if (!!this.insertAdjacentText) {
       this[_insertAdjacentText](where, text);
     } else {
-      this[_insertAdjacentNode](where, html.Text.new(text));
+      this[_insertAdjacentNode](where, html$.Text.new(text));
     }
   }
   [_insertAdjacentText](...args) {
@@ -56583,7 +56586,7 @@
   [dartx.insertAdjacentHtml](where, html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    if (html._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
+    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
       this[_insertAdjacentHtml](where, html);
     } else {
       this[_insertAdjacentNode](where, this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
@@ -56662,22 +56665,22 @@
     return this.shadowRoot || this.webkitShadowRoot;
   }
   get [dartx.contentEdge]() {
-    return new html._ContentCssRect(this);
+    return new html$._ContentCssRect(this);
   }
   get [dartx.paddingEdge]() {
-    return new html._PaddingCssRect(this);
+    return new html$._PaddingCssRect(this);
   }
   get [dartx.borderEdge]() {
-    return new html._BorderCssRect(this);
+    return new html$._BorderCssRect(this);
   }
   get [dartx.marginEdge]() {
-    return new html._MarginCssRect(this);
+    return new html$._MarginCssRect(this);
   }
   get [dartx.documentOffset]() {
-    return this[dartx.offsetTo](html.document[dartx.documentElement]);
+    return this[dartx.offsetTo](html$.document[dartx.documentElement]);
   }
   [dartx.offsetTo](parent) {
-    return html.Element._offsetToHelper(this, parent);
+    return html$.Element._offsetToHelper(this, parent);
   }
   static _offsetToHelper(current, parent) {
     let sameAsParent = core.identical(current, parent);
@@ -56687,7 +56690,7 @@
       dart.throw(new core.ArgumentError("Specified element is not a transitive offset " + "parent of this element."));
     }
     let parentOffset = current[dartx.offsetParent];
-    let p = html.Element._offsetToHelper(parentOffset, parent);
+    let p = html$.Element._offsetToHelper(parentOffset, parent);
     return new (PointOfnum())(dart.notNull(p.x) + dart.notNull(current[dartx.offsetLeft]), dart.notNull(p.y) + dart.notNull(current[dartx.offsetTop]));
   }
   [dartx.createFragment](html, opts) {
@@ -56695,57 +56698,57 @@
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
     if (treeSanitizer == null) {
       if (validator == null) {
-        if (html.Element._defaultValidator == null) {
-          html.Element._defaultValidator = new html.NodeValidatorBuilder.common();
+        if (html$.Element._defaultValidator == null) {
+          html$.Element._defaultValidator = new html$.NodeValidatorBuilder.common();
         }
-        validator = html.Element._defaultValidator;
+        validator = html$.Element._defaultValidator;
       }
-      if (html.Element._defaultSanitizer == null) {
-        html.Element._defaultSanitizer = new html._ValidatingTreeSanitizer(validator);
+      if (html$.Element._defaultSanitizer == null) {
+        html$.Element._defaultSanitizer = new html$._ValidatingTreeSanitizer(validator);
       } else {
-        html.Element._defaultSanitizer.validator = validator;
+        html$.Element._defaultSanitizer.validator = validator;
       }
-      treeSanitizer = html.Element._defaultSanitizer;
+      treeSanitizer = html$.Element._defaultSanitizer;
     } else if (validator != null) {
       dart.throw(new core.ArgumentError('validator can only be passed if treeSanitizer is null'));
     }
-    if (html.Element._parseDocument == null) {
-      html.Element._parseDocument = html.document[dartx.implementation][dartx.createHtmlDocument]('');
-      html.Element._parseRange = html.Element._parseDocument[dartx.createRange]();
-      let base = html.BaseElement._check(html.Element._parseDocument[dartx.createElement]('base'));
-      base[dartx.href] = html.document[dartx.baseUri];
-      html.Element._parseDocument[dartx.head][dartx.append](base);
+    if (html$.Element._parseDocument == null) {
+      html$.Element._parseDocument = html$.document[dartx.implementation][dartx.createHtmlDocument]('');
+      html$.Element._parseRange = html$.Element._parseDocument[dartx.createRange]();
+      let base = html$.BaseElement._check(html$.Element._parseDocument[dartx.createElement]('base'));
+      base[dartx.href] = html$.document[dartx.baseUri];
+      html$.Element._parseDocument[dartx.head][dartx.append](base);
     }
     let contextElement = null;
-    if (html.BodyElement.is(this)) {
-      contextElement = html.Element._parseDocument[dartx.body];
+    if (html$.BodyElement.is(this)) {
+      contextElement = html$.Element._parseDocument[dartx.body];
     } else {
-      contextElement = html.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
-      html.Element._parseDocument[dartx.body][dartx.append](html.Node._check(contextElement));
+      contextElement = html$.Element._parseDocument[dartx.createElement](this[dartx.tagName]);
+      html$.Element._parseDocument[dartx.body][dartx.append](html$.Node._check(contextElement));
     }
     let fragment = null;
-    if (dart.test(html.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
-      html.Element._parseRange[dartx.selectNodeContents](html.Node._check(contextElement));
-      fragment = html.Element._parseRange[dartx.createContextualFragment](html);
+    if (dart.test(html$.Range.supportsCreateContextualFragment) && dart.test(this[_canBeUsedToCreateContextualFragment])) {
+      html$.Element._parseRange[dartx.selectNodeContents](html$.Node._check(contextElement));
+      fragment = html$.Element._parseRange[dartx.createContextualFragment](html);
     } else {
       dart.dput(contextElement, _innerHtml, html);
-      fragment = html.Element._parseDocument[dartx.createDocumentFragment]();
+      fragment = html$.Element._parseDocument[dartx.createDocumentFragment]();
       while (dart.dload(contextElement, 'firstChild') != null) {
         dart.dsend(fragment, 'append', dart.dload(contextElement, 'firstChild'));
       }
     }
-    if (!dart.equals(contextElement, html.Element._parseDocument[dartx.body])) {
+    if (!dart.equals(contextElement, html$.Element._parseDocument[dartx.body])) {
       dart.dsend(contextElement, 'remove');
     }
-    treeSanitizer.sanitizeTree(html.Node._check(fragment));
-    html.document[dartx.adoptNode](html.Node._check(fragment));
-    return html.DocumentFragment._check(fragment);
+    treeSanitizer.sanitizeTree(html$.Node._check(fragment));
+    html$.document[dartx.adoptNode](html$.Node._check(fragment));
+    return html$.DocumentFragment._check(fragment);
   }
   get [_canBeUsedToCreateContextualFragment]() {
     return !dart.test(this[_cannotBeUsedToCreateContextualFragment]);
   }
   get [_cannotBeUsedToCreateContextualFragment]() {
-    return html.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
+    return html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported[dartx.contains](this[dartx.tagName]);
   }
   set [dartx.innerHtml](html) {
     this[dartx.setInnerHtml](html);
@@ -56754,7 +56757,7 @@
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
     this[dartx.text] = null;
-    if (html._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
+    if (html$._TrustedHtmlTreeSanitizer.is(treeSanitizer)) {
       this[_innerHtml] = html;
     } else {
       this[dartx.append](this[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
@@ -56764,7 +56767,7 @@
     return this[_innerHtml];
   }
   get [dartx.on]() {
-    return new html.ElementEvents(this);
+    return new html$.ElementEvents(this);
   }
   static _hasCorruptedAttributes(element) {
     return (function(element) {
@@ -56924,7 +56927,7 @@
   [dartx.focus](...args) {
     return this.focus.apply(this, args);
   }
-  get [_attributes]() {
+  get [_attributes$]() {
     return this.attributes;
   }
   get [dartx.className]() {
@@ -57156,267 +57159,267 @@
     return this.querySelectorAll.apply(this, args);
   }
   get [dartx.onAbort]() {
-    return html.Element.abortEvent.forElement(this);
+    return html$.Element.abortEvent.forElement(this);
   }
   get [dartx.onBeforeCopy]() {
-    return html.Element.beforeCopyEvent.forElement(this);
+    return html$.Element.beforeCopyEvent.forElement(this);
   }
   get [dartx.onBeforeCut]() {
-    return html.Element.beforeCutEvent.forElement(this);
+    return html$.Element.beforeCutEvent.forElement(this);
   }
   get [dartx.onBeforePaste]() {
-    return html.Element.beforePasteEvent.forElement(this);
+    return html$.Element.beforePasteEvent.forElement(this);
   }
   get [dartx.onBlur]() {
-    return html.Element.blurEvent.forElement(this);
+    return html$.Element.blurEvent.forElement(this);
   }
   get [dartx.onCanPlay]() {
-    return html.Element.canPlayEvent.forElement(this);
+    return html$.Element.canPlayEvent.forElement(this);
   }
   get [dartx.onCanPlayThrough]() {
-    return html.Element.canPlayThroughEvent.forElement(this);
+    return html$.Element.canPlayThroughEvent.forElement(this);
   }
   get [dartx.onChange]() {
-    return html.Element.changeEvent.forElement(this);
+    return html$.Element.changeEvent.forElement(this);
   }
   get [dartx.onClick]() {
-    return html.Element.clickEvent.forElement(this);
+    return html$.Element.clickEvent.forElement(this);
   }
   get [dartx.onContextMenu]() {
-    return html.Element.contextMenuEvent.forElement(this);
+    return html$.Element.contextMenuEvent.forElement(this);
   }
   get [dartx.onCopy]() {
-    return html.Element.copyEvent.forElement(this);
+    return html$.Element.copyEvent.forElement(this);
   }
   get [dartx.onCut]() {
-    return html.Element.cutEvent.forElement(this);
+    return html$.Element.cutEvent.forElement(this);
   }
   get [dartx.onDoubleClick]() {
-    return html.Element.doubleClickEvent.forElement(this);
+    return html$.Element.doubleClickEvent.forElement(this);
   }
   get [dartx.onDrag]() {
-    return html.Element.dragEvent.forElement(this);
+    return html$.Element.dragEvent.forElement(this);
   }
   get [dartx.onDragEnd]() {
-    return html.Element.dragEndEvent.forElement(this);
+    return html$.Element.dragEndEvent.forElement(this);
   }
   get [dartx.onDragEnter]() {
-    return html.Element.dragEnterEvent.forElement(this);
+    return html$.Element.dragEnterEvent.forElement(this);
   }
   get [dartx.onDragLeave]() {
-    return html.Element.dragLeaveEvent.forElement(this);
+    return html$.Element.dragLeaveEvent.forElement(this);
   }
   get [dartx.onDragOver]() {
-    return html.Element.dragOverEvent.forElement(this);
+    return html$.Element.dragOverEvent.forElement(this);
   }
   get [dartx.onDragStart]() {
-    return html.Element.dragStartEvent.forElement(this);
+    return html$.Element.dragStartEvent.forElement(this);
   }
   get [dartx.onDrop]() {
-    return html.Element.dropEvent.forElement(this);
+    return html$.Element.dropEvent.forElement(this);
   }
   get [dartx.onDurationChange]() {
-    return html.Element.durationChangeEvent.forElement(this);
+    return html$.Element.durationChangeEvent.forElement(this);
   }
   get [dartx.onEmptied]() {
-    return html.Element.emptiedEvent.forElement(this);
+    return html$.Element.emptiedEvent.forElement(this);
   }
   get [dartx.onEnded]() {
-    return html.Element.endedEvent.forElement(this);
+    return html$.Element.endedEvent.forElement(this);
   }
   get [dartx.onError]() {
-    return html.Element.errorEvent.forElement(this);
+    return html$.Element.errorEvent.forElement(this);
   }
   get [dartx.onFocus]() {
-    return html.Element.focusEvent.forElement(this);
+    return html$.Element.focusEvent.forElement(this);
   }
   get [dartx.onInput]() {
-    return html.Element.inputEvent.forElement(this);
+    return html$.Element.inputEvent.forElement(this);
   }
   get [dartx.onInvalid]() {
-    return html.Element.invalidEvent.forElement(this);
+    return html$.Element.invalidEvent.forElement(this);
   }
   get [dartx.onKeyDown]() {
-    return html.Element.keyDownEvent.forElement(this);
+    return html$.Element.keyDownEvent.forElement(this);
   }
   get [dartx.onKeyPress]() {
-    return html.Element.keyPressEvent.forElement(this);
+    return html$.Element.keyPressEvent.forElement(this);
   }
   get [dartx.onKeyUp]() {
-    return html.Element.keyUpEvent.forElement(this);
+    return html$.Element.keyUpEvent.forElement(this);
   }
   get [dartx.onLoad]() {
-    return html.Element.loadEvent.forElement(this);
+    return html$.Element.loadEvent.forElement(this);
   }
   get [dartx.onLoadedData]() {
-    return html.Element.loadedDataEvent.forElement(this);
+    return html$.Element.loadedDataEvent.forElement(this);
   }
   get [dartx.onLoadedMetadata]() {
-    return html.Element.loadedMetadataEvent.forElement(this);
+    return html$.Element.loadedMetadataEvent.forElement(this);
   }
   get [dartx.onMouseDown]() {
-    return html.Element.mouseDownEvent.forElement(this);
+    return html$.Element.mouseDownEvent.forElement(this);
   }
   get [dartx.onMouseEnter]() {
-    return html.Element.mouseEnterEvent.forElement(this);
+    return html$.Element.mouseEnterEvent.forElement(this);
   }
   get [dartx.onMouseLeave]() {
-    return html.Element.mouseLeaveEvent.forElement(this);
+    return html$.Element.mouseLeaveEvent.forElement(this);
   }
   get [dartx.onMouseMove]() {
-    return html.Element.mouseMoveEvent.forElement(this);
+    return html$.Element.mouseMoveEvent.forElement(this);
   }
   get [dartx.onMouseOut]() {
-    return html.Element.mouseOutEvent.forElement(this);
+    return html$.Element.mouseOutEvent.forElement(this);
   }
   get [dartx.onMouseOver]() {
-    return html.Element.mouseOverEvent.forElement(this);
+    return html$.Element.mouseOverEvent.forElement(this);
   }
   get [dartx.onMouseUp]() {
-    return html.Element.mouseUpEvent.forElement(this);
+    return html$.Element.mouseUpEvent.forElement(this);
   }
   get [dartx.onMouseWheel]() {
-    return html.Element.mouseWheelEvent.forElement(this);
+    return html$.Element.mouseWheelEvent.forElement(this);
   }
   get [dartx.onPaste]() {
-    return html.Element.pasteEvent.forElement(this);
+    return html$.Element.pasteEvent.forElement(this);
   }
   get [dartx.onPause]() {
-    return html.Element.pauseEvent.forElement(this);
+    return html$.Element.pauseEvent.forElement(this);
   }
   get [dartx.onPlay]() {
-    return html.Element.playEvent.forElement(this);
+    return html$.Element.playEvent.forElement(this);
   }
   get [dartx.onPlaying]() {
-    return html.Element.playingEvent.forElement(this);
+    return html$.Element.playingEvent.forElement(this);
   }
   get [dartx.onRateChange]() {
-    return html.Element.rateChangeEvent.forElement(this);
+    return html$.Element.rateChangeEvent.forElement(this);
   }
   get [dartx.onReset]() {
-    return html.Element.resetEvent.forElement(this);
+    return html$.Element.resetEvent.forElement(this);
   }
   get [dartx.onResize]() {
-    return html.Element.resizeEvent.forElement(this);
+    return html$.Element.resizeEvent.forElement(this);
   }
   get [dartx.onScroll]() {
-    return html.Element.scrollEvent.forElement(this);
+    return html$.Element.scrollEvent.forElement(this);
   }
   get [dartx.onSearch]() {
-    return html.Element.searchEvent.forElement(this);
+    return html$.Element.searchEvent.forElement(this);
   }
   get [dartx.onSeeked]() {
-    return html.Element.seekedEvent.forElement(this);
+    return html$.Element.seekedEvent.forElement(this);
   }
   get [dartx.onSeeking]() {
-    return html.Element.seekingEvent.forElement(this);
+    return html$.Element.seekingEvent.forElement(this);
   }
   get [dartx.onSelect]() {
-    return html.Element.selectEvent.forElement(this);
+    return html$.Element.selectEvent.forElement(this);
   }
   get [dartx.onSelectStart]() {
-    return html.Element.selectStartEvent.forElement(this);
+    return html$.Element.selectStartEvent.forElement(this);
   }
   get [dartx.onStalled]() {
-    return html.Element.stalledEvent.forElement(this);
+    return html$.Element.stalledEvent.forElement(this);
   }
   get [dartx.onSubmit]() {
-    return html.Element.submitEvent.forElement(this);
+    return html$.Element.submitEvent.forElement(this);
   }
   get [dartx.onSuspend]() {
-    return html.Element.suspendEvent.forElement(this);
+    return html$.Element.suspendEvent.forElement(this);
   }
   get [dartx.onTimeUpdate]() {
-    return html.Element.timeUpdateEvent.forElement(this);
+    return html$.Element.timeUpdateEvent.forElement(this);
   }
   get [dartx.onTouchCancel]() {
-    return html.Element.touchCancelEvent.forElement(this);
+    return html$.Element.touchCancelEvent.forElement(this);
   }
   get [dartx.onTouchEnd]() {
-    return html.Element.touchEndEvent.forElement(this);
+    return html$.Element.touchEndEvent.forElement(this);
   }
   get [dartx.onTouchEnter]() {
-    return html.Element.touchEnterEvent.forElement(this);
+    return html$.Element.touchEnterEvent.forElement(this);
   }
   get [dartx.onTouchLeave]() {
-    return html.Element.touchLeaveEvent.forElement(this);
+    return html$.Element.touchLeaveEvent.forElement(this);
   }
   get [dartx.onTouchMove]() {
-    return html.Element.touchMoveEvent.forElement(this);
+    return html$.Element.touchMoveEvent.forElement(this);
   }
   get [dartx.onTouchStart]() {
-    return html.Element.touchStartEvent.forElement(this);
+    return html$.Element.touchStartEvent.forElement(this);
   }
   get [dartx.onTransitionEnd]() {
-    return html.Element.transitionEndEvent.forElement(this);
+    return html$.Element.transitionEndEvent.forElement(this);
   }
   get [dartx.onVolumeChange]() {
-    return html.Element.volumeChangeEvent.forElement(this);
+    return html$.Element.volumeChangeEvent.forElement(this);
   }
   get [dartx.onWaiting]() {
-    return html.Element.waitingEvent.forElement(this);
+    return html$.Element.waitingEvent.forElement(this);
   }
   get [dartx.onFullscreenChange]() {
-    return html.Element.fullscreenChangeEvent.forElement(this);
+    return html$.Element.fullscreenChangeEvent.forElement(this);
   }
   get [dartx.onFullscreenError]() {
-    return html.Element.fullscreenErrorEvent.forElement(this);
+    return html$.Element.fullscreenErrorEvent.forElement(this);
   }
 };
-dart.defineNamedConstructor(html.Element, 'created');
-html.Element[dart.implements] = () => [html.NonDocumentTypeChildNode, html.GlobalEventHandlers, html.ParentNode, html.ChildNode];
-dart.setSignature(html.Element, {
+dart.defineNamedConstructor(html$.Element, 'created');
+html$.Element[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.GlobalEventHandlers, html$.ParentNode, html$.ChildNode];
+dart.setSignature(html$.Element, {
   constructors: () => ({
-    html: dart.definiteFunctionType(html.Element, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
-    created: dart.definiteFunctionType(html.Element, []),
-    tag: dart.definiteFunctionType(html.Element, [core.String], [core.String]),
-    a: dart.definiteFunctionType(html.Element, []),
-    article: dart.definiteFunctionType(html.Element, []),
-    aside: dart.definiteFunctionType(html.Element, []),
-    audio: dart.definiteFunctionType(html.Element, []),
-    br: dart.definiteFunctionType(html.Element, []),
-    canvas: dart.definiteFunctionType(html.Element, []),
-    div: dart.definiteFunctionType(html.Element, []),
-    footer: dart.definiteFunctionType(html.Element, []),
-    header: dart.definiteFunctionType(html.Element, []),
-    hr: dart.definiteFunctionType(html.Element, []),
-    iframe: dart.definiteFunctionType(html.Element, []),
-    img: dart.definiteFunctionType(html.Element, []),
-    li: dart.definiteFunctionType(html.Element, []),
-    nav: dart.definiteFunctionType(html.Element, []),
-    ol: dart.definiteFunctionType(html.Element, []),
-    option: dart.definiteFunctionType(html.Element, []),
-    p: dart.definiteFunctionType(html.Element, []),
-    pre: dart.definiteFunctionType(html.Element, []),
-    section: dart.definiteFunctionType(html.Element, []),
-    select: dart.definiteFunctionType(html.Element, []),
-    span: dart.definiteFunctionType(html.Element, []),
-    svg: dart.definiteFunctionType(html.Element, []),
-    table: dart.definiteFunctionType(html.Element, []),
-    td: dart.definiteFunctionType(html.Element, []),
-    textarea: dart.definiteFunctionType(html.Element, []),
-    th: dart.definiteFunctionType(html.Element, []),
-    tr: dart.definiteFunctionType(html.Element, []),
-    ul: dart.definiteFunctionType(html.Element, []),
-    video: dart.definiteFunctionType(html.Element, []),
-    _: dart.definiteFunctionType(html.Element, [])
+    html: dart.definiteFunctionType(html$.Element, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    created: dart.definiteFunctionType(html$.Element, []),
+    tag: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
+    a: dart.definiteFunctionType(html$.Element, []),
+    article: dart.definiteFunctionType(html$.Element, []),
+    aside: dart.definiteFunctionType(html$.Element, []),
+    audio: dart.definiteFunctionType(html$.Element, []),
+    br: dart.definiteFunctionType(html$.Element, []),
+    canvas: dart.definiteFunctionType(html$.Element, []),
+    div: dart.definiteFunctionType(html$.Element, []),
+    footer: dart.definiteFunctionType(html$.Element, []),
+    header: dart.definiteFunctionType(html$.Element, []),
+    hr: dart.definiteFunctionType(html$.Element, []),
+    iframe: dart.definiteFunctionType(html$.Element, []),
+    img: dart.definiteFunctionType(html$.Element, []),
+    li: dart.definiteFunctionType(html$.Element, []),
+    nav: dart.definiteFunctionType(html$.Element, []),
+    ol: dart.definiteFunctionType(html$.Element, []),
+    option: dart.definiteFunctionType(html$.Element, []),
+    p: dart.definiteFunctionType(html$.Element, []),
+    pre: dart.definiteFunctionType(html$.Element, []),
+    section: dart.definiteFunctionType(html$.Element, []),
+    select: dart.definiteFunctionType(html$.Element, []),
+    span: dart.definiteFunctionType(html$.Element, []),
+    svg: dart.definiteFunctionType(html$.Element, []),
+    table: dart.definiteFunctionType(html$.Element, []),
+    td: dart.definiteFunctionType(html$.Element, []),
+    textarea: dart.definiteFunctionType(html$.Element, []),
+    th: dart.definiteFunctionType(html$.Element, []),
+    tr: dart.definiteFunctionType(html$.Element, []),
+    ul: dart.definiteFunctionType(html$.Element, []),
+    video: dart.definiteFunctionType(html$.Element, []),
+    _: dart.definiteFunctionType(html$.Element, [])
   }),
   fields: () => ({
-    [_xtag]: html.Element,
-    [dartx.offsetParent]: html.Element,
+    [_xtag]: html$.Element,
+    [dartx.offsetParent]: html$.Element,
     [dartx.contentEditable]: core.String,
-    [dartx.contextMenu]: html.MenuElement,
+    [dartx.contextMenu]: html$.MenuElement,
     [dartx.dir]: core.String,
     [dartx.draggable]: core.bool,
     [dartx.hidden]: core.bool,
     [dartx.lang]: core.String,
     [dartx.spellcheck]: core.bool,
-    [dartx.style]: html.CssStyleDeclaration,
+    [dartx.style]: html$.CssStyleDeclaration,
     [dartx.tabIndex]: core.int,
     [dartx.title]: core.String,
     [dartx.translate]: core.bool,
     [dartx.dropzone]: core.String,
-    [_attributes]: html._NamedNodeMap,
+    [_attributes$]: html$._NamedNodeMap,
     [dartx.className]: core.String,
     [dartx.clientHeight]: core.int,
     [dartx.clientLeft]: core.int,
@@ -57431,33 +57434,33 @@
     [_scrollTop]: core.num,
     [_scrollWidth]: core.int,
     [dartx.tagName]: core.String,
-    [dartx.nextElementSibling]: html.Element,
-    [dartx.previousElementSibling]: html.Element,
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element,
     [_childElementCount]: core.int,
     [_children]: ListOfNode(),
-    [_firstElementChild]: html.Element,
-    [_lastElementChild]: html.Element
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
   }),
   getters: () => ({
     [dartx.attributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
-    [dartx.children]: dart.definiteFunctionType(core.List$(html.Element), []),
-    [dartx.classes]: dart.definiteFunctionType(html.CssClassSet, []),
+    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
+    [dartx.classes]: dart.definiteFunctionType(html$.CssClassSet, []),
     [dartx.dataset]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
     [dartx.client]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
     [dartx.offset]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
     [dartx.xtag]: dart.definiteFunctionType(dart.dynamic, []),
     [dartx.localName]: dart.definiteFunctionType(core.String, []),
     [dartx.namespaceUri]: dart.definiteFunctionType(core.String, []),
-    [dartx.shadowRoot]: dart.definiteFunctionType(html.ShadowRoot, []),
-    [dartx.contentEdge]: dart.definiteFunctionType(html.CssRect, []),
-    [dartx.paddingEdge]: dart.definiteFunctionType(html.CssRect, []),
-    [dartx.borderEdge]: dart.definiteFunctionType(html.CssRect, []),
-    [dartx.marginEdge]: dart.definiteFunctionType(html.CssRect, []),
+    [dartx.shadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
+    [dartx.contentEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.paddingEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.borderEdge]: dart.definiteFunctionType(html$.CssRect, []),
+    [dartx.marginEdge]: dart.definiteFunctionType(html$.CssRect, []),
     [dartx.documentOffset]: dart.definiteFunctionType(math.Point$(core.num), []),
     [_canBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
     [_cannotBeUsedToCreateContextualFragment]: dart.definiteFunctionType(core.bool, []),
     [dartx.innerHtml]: dart.definiteFunctionType(core.String, []),
-    [dartx.on]: dart.definiteFunctionType(html.ElementEvents, []),
+    [dartx.on]: dart.definiteFunctionType(html$.ElementEvents, []),
     [dartx.offsetHeight]: dart.definiteFunctionType(core.int, []),
     [dartx.offsetLeft]: dart.definiteFunctionType(core.int, []),
     [dartx.offsetTop]: dart.definiteFunctionType(core.int, []),
@@ -57468,127 +57471,127 @@
     [dartx.scrollWidth]: dart.definiteFunctionType(core.int, []),
     [dartx.isContentEditable]: dart.definiteFunctionType(core.bool, []),
     [dartx.outerHtml]: dart.definiteFunctionType(core.String, []),
-    [dartx.onAbort]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onBeforeCopy]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onBeforeCut]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onBeforePaste]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onBlur]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onCanPlay]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onCanPlayThrough]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onClick]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onContextMenu]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onCopy]: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-    [dartx.onCut]: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-    [dartx.onDoubleClick]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onDrag]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDragEnd]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDragEnter]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDragLeave]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDragOver]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDragStart]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDrop]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onDurationChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onEmptied]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onEnded]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onFocus]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onInput]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onInvalid]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onKeyDown]: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-    [dartx.onKeyPress]: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-    [dartx.onKeyUp]: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-    [dartx.onLoad]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onLoadedData]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onLoadedMetadata]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onMouseDown]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseEnter]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseLeave]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseMove]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseOut]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseOver]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseUp]: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-    [dartx.onMouseWheel]: dart.definiteFunctionType(html.ElementStream$(html.WheelEvent), []),
-    [dartx.onPaste]: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-    [dartx.onPause]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onPlay]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onPlaying]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onRateChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onReset]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onResize]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onScroll]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSearch]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSeeked]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSeeking]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSelect]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSelectStart]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onStalled]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSubmit]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onSuspend]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onTimeUpdate]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onTouchCancel]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTouchEnd]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTouchEnter]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTouchLeave]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTouchMove]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTouchStart]: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-    [dartx.onTransitionEnd]: dart.definiteFunctionType(html.ElementStream$(html.TransitionEvent), []),
-    [dartx.onVolumeChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onWaiting]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onFullscreenChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onFullscreenError]: dart.definiteFunctionType(html.ElementStream$(html.Event), [])
+    [dartx.onAbort]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforeCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforeCut]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBeforePaste]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onCopy]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onCut]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onDrag]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
+    [dartx.onPaste]: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSelectStart]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchEnter]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchLeave]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+    [dartx.onTransitionEnd]: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFullscreenChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onFullscreenError]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
   }),
   setters: () => ({
     [dartx.attributes]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
     [dartx.children]: dart.definiteFunctionType(dart.void, [ListOfElement()]),
     [dartx.classes]: dart.definiteFunctionType(dart.void, [IterableOfString()]),
     [dartx.dataset]: dart.definiteFunctionType(dart.void, [MapOfString$String()]),
-    [dartx.xtag]: dart.definiteFunctionType(dart.void, [html.Element]),
+    [dartx.xtag]: dart.definiteFunctionType(dart.void, [html$.Element]),
     [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.scrollLeft]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.scrollTop]: dart.definiteFunctionType(dart.void, [core.int])
   }),
   methods: () => ({
-    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
-    [dartx.query]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.queryAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
     [dartx.getNamespacedAttributes]: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String]),
-    [dartx.getComputedStyle]: dart.definiteFunctionType(html.CssStyleDeclaration, [], [core.String]),
+    [dartx.getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [], [core.String]),
     [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
+    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
     [dartx.attached]: dart.definiteFunctionType(dart.void, []),
     [dartx.detached]: dart.definiteFunctionType(dart.void, []),
     [dartx.enteredView]: dart.definiteFunctionType(dart.void, []),
     [dartx.leftView]: dart.definiteFunctionType(dart.void, []),
-    [dartx.animate]: dart.definiteFunctionType(html.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
-    [_animate]: dart.definiteFunctionType(html.Animation, [core.Object], [dart.dynamic]),
+    [dartx.animate]: dart.definiteFunctionType(html$.Animation, [IterableOfMapOfString$dynamic()], [dart.dynamic]),
+    [_animate]: dart.definiteFunctionType(html$.Animation, [core.Object], [dart.dynamic]),
     [dartx.attributeChanged]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-    [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html.ScrollAlignment]),
+    [dartx.scrollIntoView]: dart.definiteFunctionType(dart.void, [], [html$.ScrollAlignment]),
     [dartx.insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
     [_insertAdjacentText]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-    [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
+    [dartx.insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
     [_insertAdjacentHtml]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-    [dartx.insertAdjacentElement]: dart.definiteFunctionType(html.Element, [core.String, html.Element]),
-    [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html.Element]),
-    [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html.Node]),
+    [dartx.insertAdjacentElement]: dart.definiteFunctionType(html$.Element, [core.String, html$.Element]),
+    [_insertAdjacentElement]: dart.definiteFunctionType(dart.void, [core.String, html$.Element]),
+    [_insertAdjacentNode]: dart.definiteFunctionType(dart.void, [core.String, html$.Node]),
     [dartx.matches]: dart.definiteFunctionType(core.bool, [core.String]),
     [dartx.matchesWithAncestors]: dart.definiteFunctionType(core.bool, [core.String]),
-    [dartx.createShadowRoot]: dart.definiteFunctionType(html.ShadowRoot, []),
-    [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html.Element]),
-    [dartx.createFragment]: dart.definiteFunctionType(html.DocumentFragment, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
-    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
+    [dartx.createShadowRoot]: dart.definiteFunctionType(html$.ShadowRoot, []),
+    [dartx.offsetTo]: dart.definiteFunctionType(math.Point$(core.num), [html$.Element]),
+    [dartx.createFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
     [dartx.blur]: dart.definiteFunctionType(dart.void, []),
     [dartx.click]: dart.definiteFunctionType(dart.void, []),
     [dartx.focus]: dart.definiteFunctionType(dart.void, []),
-    [dartx.closest]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html.Animation), []),
+    [dartx.closest]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
     [dartx.getAttribute]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.getAttributeNS]: dart.definiteFunctionType(core.String, [core.String, core.String]),
     [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
     [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
-    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html.Node), []),
-    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
-    [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
+    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
+    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [_getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
     [_hasAttribute]: dart.definiteFunctionType(core.bool, [core.String]),
     [_hasAttributeNS]: dart.definiteFunctionType(core.bool, [core.String, core.String]),
     [_removeAttribute]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -57613,16 +57616,16 @@
     [dartx.setAttributeNS]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
     [dartx.after]: dart.definiteFunctionType(dart.void, [core.Object]),
     [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object]),
-    [dartx.querySelector]: dart.definiteFunctionType(html.Element, [core.String]),
-    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html.Node), [core.String])
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
   }),
   sfields: () => ({
     mouseWheelEvent: EventStreamProviderOfWheelEvent(),
     transitionEndEvent: EventStreamProviderOfTransitionEvent(),
-    _parseDocument: html.HtmlDocument,
-    _parseRange: html.Range,
-    _defaultValidator: html.NodeValidatorBuilder,
-    _defaultSanitizer: html._ValidatingTreeSanitizer,
+    _parseDocument: html$.HtmlDocument,
+    _parseRange: html$.Range,
+    _defaultValidator: html$.NodeValidatorBuilder,
+    _defaultSanitizer: html$._ValidatingTreeSanitizer,
     _tagsForWhichCreateContextualFragmentIsNotSupported: ListOfString(),
     abortEvent: EventStreamProviderOfEvent(),
     beforeCopyEvent: EventStreamProviderOfEvent(),
@@ -57694,26 +57697,26 @@
   }),
   statics: () => ({
     isTagSupported: dart.definiteFunctionType(core.bool, [core.String]),
-    _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html.EventTarget]),
-    _determineTransitionEventType: dart.definiteFunctionType(core.String, [html.EventTarget]),
-    _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html.Element, html.Element]),
-    _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html.Element]),
-    _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html.Element]),
+    _determineMouseWheelEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    _determineTransitionEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    _offsetToHelper: dart.definiteFunctionType(math.Point$(core.num), [html$.Element, html$.Element]),
+    _hasCorruptedAttributes: dart.definiteFunctionType(core.bool, [html$.Element]),
+    _hasCorruptedAttributesAdditionalCheck: dart.definiteFunctionType(core.bool, [html$.Element]),
     _safeTagName: dart.definiteFunctionType(core.String, [dart.dynamic])
   }),
   names: ['isTagSupported', '_determineMouseWheelEventType', '_determineTransitionEventType', '_offsetToHelper', '_hasCorruptedAttributes', '_hasCorruptedAttributesAdditionalCheck', '_safeTagName']
 });
-html.Element._parseDocument = null;
-html.Element._parseRange = null;
-html.Element._defaultValidator = null;
-html.Element._defaultSanitizer = null;
-html.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
-dart.defineLazy(html.Element, {
+html$.Element._parseDocument = null;
+html$.Element._parseRange = null;
+html$.Element._defaultValidator = null;
+html$.Element._defaultSanitizer = null;
+html$.Element._tagsForWhichCreateContextualFragmentIsNotSupported = dart.constList(['HEAD', 'AREA', 'BASE', 'BASEFONT', 'BR', 'COL', 'COLGROUP', 'EMBED', 'FRAME', 'FRAMESET', 'HR', 'IMAGE', 'IMG', 'INPUT', 'ISINDEX', 'LINK', 'META', 'PARAM', 'SOURCE', 'STYLE', 'TITLE', 'WBR'], core.String);
+dart.defineLazy(html$.Element, {
   get mouseWheelEvent() {
-    return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html.Element._determineMouseWheelEventType));
+    return dart.const(new (_CustomEventStreamProviderOfWheelEvent())(html$.Element._determineMouseWheelEventType));
   },
   get transitionEndEvent() {
-    return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html.Element._determineTransitionEventType));
+    return dart.const(new (_CustomEventStreamProviderOfTransitionEvent())(html$.Element._determineTransitionEventType));
   },
   get abortEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('abort'));
@@ -57917,8 +57920,8 @@
     return dart.const(new (EventStreamProviderOfEvent())('webkitfullscreenerror'));
   }
 });
-dart.registerExtension(dart.global.Element, html.Element);
-html.HtmlElement = class HtmlElement extends html.Element {
+dart.registerExtension(dart.global.Element, html$.Element);
+html$.HtmlElement = class HtmlElement extends html$.Element {
   static new() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -57926,44 +57929,44 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html.HtmlElement, 'created');
-dart.setSignature(html.HtmlElement, {
+dart.defineNamedConstructor(html$.HtmlElement, 'created');
+dart.setSignature(html$.HtmlElement, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.HtmlElement, []),
-    created: dart.definiteFunctionType(html.HtmlElement, [])
+    new: dart.definiteFunctionType(html$.HtmlElement, []),
+    created: dart.definiteFunctionType(html$.HtmlElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLElement, html.HtmlElement);
-html._EntryArray = class _EntryArray extends core.Object {};
-html._EntryArray[dart.implements] = () => [ListOfEntry()];
-dart.registerExtension(dart.global.EntryArray, html._EntryArray);
-html.spawnDomUri = function(uri, args, message) {
+dart.registerExtension(dart.global.HTMLElement, html$.HtmlElement);
+html$._EntryArray = class _EntryArray extends core.Object {};
+html$._EntryArray[dart.implements] = () => [ListOfEntry()];
+dart.registerExtension(dart.global.EntryArray, html$._EntryArray);
+html$.spawnDomUri = function(uri, args, message) {
   dart.throw(new core.UnimplementedError());
 };
-dart.fn(html.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
-html.createCustomUpgrader = function(customElementClass, $this) {
+dart.fn(html$.spawnDomUri, UriAndListOfStringAnddynamicToFutureOfIsolate());
+html$.createCustomUpgrader = function(customElementClass, $this) {
   return $this;
 };
-dart.fn(html.createCustomUpgrader, TypeAnddynamicTodynamic());
+dart.fn(html$.createCustomUpgrader, TypeAnddynamicTodynamic());
 dart.defineExtensionNames([
   'onError'
 ]);
-html.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
+html$.AbstractWorker = class AbstractWorker extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get onError() {
-    return html.AbstractWorker.errorEvent.forTarget(this);
+    return html$.AbstractWorker.errorEvent.forTarget(this);
   }
 };
-html.AbstractWorker[dart.implements] = () => [html.EventTarget];
-dart.setSignature(html.AbstractWorker, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AbstractWorker, [])}),
-  getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+html$.AbstractWorker[dart.implements] = () => [html$.EventTarget];
+dart.setSignature(html$.AbstractWorker, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AbstractWorker, [])}),
+  getters: () => ({onError: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   sfields: () => ({errorEvent: EventStreamProviderOfEvent()})
 });
-dart.defineExtensionMembers(html.AbstractWorker, ['onError']);
-dart.defineLazy(html.AbstractWorker, {
+dart.defineExtensionMembers(html$.AbstractWorker, ['onError']);
+dart.defineLazy(html$.AbstractWorker, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   }
@@ -57987,13 +57990,13 @@
   'search',
   'username'
 ]);
-html.AnchorElement = class AnchorElement extends html.HtmlElement {
+html$.AnchorElement = class AnchorElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(opts) {
     let href = opts && 'href' in opts ? opts.href : null;
-    let e = html.AnchorElement._check(html.document[dartx.createElement]("a"));
+    let e = html$.AnchorElement._check(html$.document[dartx.createElement]("a"));
     if (href != null) e[dartx.href] = href;
     return e;
   }
@@ -58113,13 +58116,13 @@
     return String(this);
   }
 };
-dart.defineNamedConstructor(html.AnchorElement, 'created');
-html.AnchorElement[dart.implements] = () => [html.UrlUtils];
-dart.setSignature(html.AnchorElement, {
+dart.defineNamedConstructor(html$.AnchorElement, 'created');
+html$.AnchorElement[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.AnchorElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AnchorElement, []),
-    new: dart.definiteFunctionType(html.AnchorElement, [], {href: core.String}),
-    created: dart.definiteFunctionType(html.AnchorElement, [])
+    _: dart.definiteFunctionType(html$.AnchorElement, []),
+    new: dart.definiteFunctionType(html$.AnchorElement, [], {href: core.String}),
+    created: dart.definiteFunctionType(html$.AnchorElement, [])
   }),
   fields: () => ({
     [dartx.download]: core.String,
@@ -58140,7 +58143,7 @@
     [dartx.username]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLAnchorElement, html.AnchorElement);
+dart.registerExtension(dart.global.HTMLAnchorElement, html$.AnchorElement);
 dart.defineExtensionNames([
   'cancel',
   'finish',
@@ -58157,7 +58160,7 @@
   'startClip',
   'startTime'
 ]);
-html.Animation = class Animation extends html.EventTarget {
+html$.Animation = class Animation extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58225,11 +58228,11 @@
     return this.reverse.apply(this, args);
   }
 };
-dart.setSignature(html.Animation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Animation, [])}),
+dart.setSignature(html$.Animation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Animation, [])}),
   fields: () => ({
     [dartx.currentTime]: core.num,
-    [dartx.effect]: html.AnimationEffectReadOnly,
+    [dartx.effect]: html$.AnimationEffectReadOnly,
     [dartx.endClip]: core.num,
     [dartx.finished]: async.Future,
     [dartx.playState]: core.String,
@@ -58247,13 +58250,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.Animation, html.Animation);
+dart.registerExtension(dart.global.Animation, html$.Animation);
 const _get_computedTiming = Symbol('_get_computedTiming');
 dart.defineExtensionNames([
   'computedTiming',
   'timing'
 ]);
-html.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
+html$.AnimationEffectReadOnly = class AnimationEffectReadOnly extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58267,15 +58270,15 @@
     return this.timing;
   }
 };
-dart.setSignature(html.AnimationEffectReadOnly, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AnimationEffectReadOnly, [])}),
+dart.setSignature(html$.AnimationEffectReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectReadOnly, [])}),
   fields: () => ({
     [_get_computedTiming]: dart.dynamic,
-    [dartx.timing]: html.AnimationEffectTiming
+    [dartx.timing]: html$.AnimationEffectTiming
   }),
   getters: () => ({[dartx.computedTiming]: dart.definiteFunctionType(core.Map, [])})
 });
-dart.registerExtension(dart.global.AnimationEffectReadOnly, html.AnimationEffectReadOnly);
+dart.registerExtension(dart.global.AnimationEffectReadOnly, html$.AnimationEffectReadOnly);
 dart.defineExtensionNames([
   'delay',
   'direction',
@@ -58287,7 +58290,7 @@
   'iterations',
   'playbackRate'
 ]);
-html.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
+html$.AnimationEffectTiming = class AnimationEffectTiming extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58346,8 +58349,8 @@
     this.playbackRate = value;
   }
 };
-dart.setSignature(html.AnimationEffectTiming, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AnimationEffectTiming, [])}),
+dart.setSignature(html$.AnimationEffectTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationEffectTiming, [])}),
   fields: () => ({
     [dartx.delay]: core.num,
     [dartx.direction]: core.String,
@@ -58360,12 +58363,12 @@
     [dartx.playbackRate]: core.num
   })
 });
-dart.registerExtension(dart.global.AnimationEffectTiming, html.AnimationEffectTiming);
+dart.registerExtension(dart.global.AnimationEffectTiming, html$.AnimationEffectTiming);
 dart.defineExtensionNames([
   'animationName',
   'elapsedTime'
 ]);
-html.AnimationEvent = class AnimationEvent extends html.Event {
+html$.AnimationEvent = class AnimationEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58373,9 +58376,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.AnimationEvent._create_1(type, eventInitDict_1);
+      return html$.AnimationEvent._create_1(type, eventInitDict_1);
     }
-    return html.AnimationEvent._create_2(type);
+    return html$.AnimationEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.AnimationEvent(type, eventInitDict);
@@ -58390,27 +58393,27 @@
     return this.elapsedTime;
   }
 };
-dart.setSignature(html.AnimationEvent, {
+dart.setSignature(html$.AnimationEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AnimationEvent, []),
-    new: dart.definiteFunctionType(html.AnimationEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.AnimationEvent, []),
+    new: dart.definiteFunctionType(html$.AnimationEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.animationName]: core.String,
     [dartx.elapsedTime]: core.double
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.AnimationEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.AnimationEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AnimationEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.AnimationEvent, html.AnimationEvent);
+dart.registerExtension(dart.global.AnimationEvent, html$.AnimationEvent);
 dart.defineExtensionNames([
   'currentTime',
   'timelineTime'
 ]);
-html.AnimationPlayerEvent = class AnimationPlayerEvent extends html.Event {
+html$.AnimationPlayerEvent = class AnimationPlayerEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58418,9 +58421,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.AnimationPlayerEvent._create_1(type, eventInitDict_1);
+      return html$.AnimationPlayerEvent._create_1(type, eventInitDict_1);
     }
-    return html.AnimationPlayerEvent._create_2(type);
+    return html$.AnimationPlayerEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.AnimationPlayerEvent(type, eventInitDict);
@@ -58435,29 +58438,29 @@
     return this.timelineTime;
   }
 };
-dart.setSignature(html.AnimationPlayerEvent, {
+dart.setSignature(html$.AnimationPlayerEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AnimationPlayerEvent, []),
-    new: dart.definiteFunctionType(html.AnimationPlayerEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.AnimationPlayerEvent, []),
+    new: dart.definiteFunctionType(html$.AnimationPlayerEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.currentTime]: core.double,
     [dartx.timelineTime]: core.double
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.AnimationPlayerEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AnimationPlayerEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.AnimationPlayerEvent, html.AnimationPlayerEvent);
+dart.registerExtension(dart.global.AnimationPlayerEvent, html$.AnimationPlayerEvent);
 dart.defineExtensionNames([
   'getAnimations',
   'play',
   'currentTime',
   'playbackRate'
 ]);
-html.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
+html$.AnimationTimeline = class AnimationTimeline extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58480,23 +58483,23 @@
     return this.play.apply(this, args);
   }
 };
-dart.setSignature(html.AnimationTimeline, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AnimationTimeline, [])}),
+dart.setSignature(html$.AnimationTimeline, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AnimationTimeline, [])}),
   fields: () => ({
     [dartx.currentTime]: core.num,
     [dartx.playbackRate]: core.num
   }),
   methods: () => ({
-    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html.Animation), []),
-    [dartx.play]: dart.definiteFunctionType(html.Animation, [html.AnimationEffectReadOnly])
+    [dartx.getAnimations]: dart.definiteFunctionType(core.List$(html$.Animation), []),
+    [dartx.play]: dart.definiteFunctionType(html$.Animation, [html$.AnimationEffectReadOnly])
   })
 });
-dart.registerExtension(dart.global.AnimationTimeline, html.AnimationTimeline);
+dart.registerExtension(dart.global.AnimationTimeline, html$.AnimationTimeline);
 dart.defineExtensionNames([
   'outcome',
   'platform'
 ]);
-html.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
+html$.AppBannerPromptResult = class AppBannerPromptResult extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58507,14 +58510,14 @@
     return this.platform;
   }
 };
-dart.setSignature(html.AppBannerPromptResult, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AppBannerPromptResult, [])}),
+dart.setSignature(html$.AppBannerPromptResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AppBannerPromptResult, [])}),
   fields: () => ({
     [dartx.outcome]: core.String,
     [dartx.platform]: core.String
   })
 });
-dart.registerExtension(dart.global.AppBannerPromptResult, html.AppBannerPromptResult);
+dart.registerExtension(dart.global.AppBannerPromptResult, html$.AppBannerPromptResult);
 dart.defineExtensionNames([
   'abort',
   'swapCache',
@@ -58529,7 +58532,7 @@
   'onUpdateReady',
   'status'
 ]);
-html.ApplicationCache = class ApplicationCache extends html.EventTarget {
+html$.ApplicationCache = class ApplicationCache extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58549,42 +58552,42 @@
     return this.update.apply(this, args);
   }
   get [dartx.onCached]() {
-    return html.ApplicationCache.cachedEvent.forTarget(this);
+    return html$.ApplicationCache.cachedEvent.forTarget(this);
   }
   get [dartx.onChecking]() {
-    return html.ApplicationCache.checkingEvent.forTarget(this);
+    return html$.ApplicationCache.checkingEvent.forTarget(this);
   }
   get [dartx.onDownloading]() {
-    return html.ApplicationCache.downloadingEvent.forTarget(this);
+    return html$.ApplicationCache.downloadingEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.ApplicationCache.errorEvent.forTarget(this);
+    return html$.ApplicationCache.errorEvent.forTarget(this);
   }
   get [dartx.onNoUpdate]() {
-    return html.ApplicationCache.noUpdateEvent.forTarget(this);
+    return html$.ApplicationCache.noUpdateEvent.forTarget(this);
   }
   get [dartx.onObsolete]() {
-    return html.ApplicationCache.obsoleteEvent.forTarget(this);
+    return html$.ApplicationCache.obsoleteEvent.forTarget(this);
   }
   get [dartx.onProgress]() {
-    return html.ApplicationCache.progressEvent.forTarget(this);
+    return html$.ApplicationCache.progressEvent.forTarget(this);
   }
   get [dartx.onUpdateReady]() {
-    return html.ApplicationCache.updateReadyEvent.forTarget(this);
+    return html$.ApplicationCache.updateReadyEvent.forTarget(this);
   }
 };
-dart.setSignature(html.ApplicationCache, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ApplicationCache, [])}),
+dart.setSignature(html$.ApplicationCache, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ApplicationCache, [])}),
   fields: () => ({[dartx.status]: core.int}),
   getters: () => ({
-    [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onCached]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChecking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDownloading]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onNoUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onObsolete]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onUpdateReady]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
@@ -58609,13 +58612,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-html.ApplicationCache.CHECKING = 2;
-html.ApplicationCache.DOWNLOADING = 3;
-html.ApplicationCache.IDLE = 1;
-html.ApplicationCache.OBSOLETE = 5;
-html.ApplicationCache.UNCACHED = 0;
-html.ApplicationCache.UPDATEREADY = 4;
-dart.defineLazy(html.ApplicationCache, {
+html$.ApplicationCache.CHECKING = 2;
+html$.ApplicationCache.DOWNLOADING = 3;
+html$.ApplicationCache.IDLE = 1;
+html$.ApplicationCache.OBSOLETE = 5;
+html$.ApplicationCache.UNCACHED = 0;
+html$.ApplicationCache.UPDATEREADY = 4;
+dart.defineLazy(html$.ApplicationCache, {
   get cachedEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('cached'));
   },
@@ -58641,16 +58644,16 @@
     return dart.const(new (EventStreamProviderOfEvent())('updateready'));
   }
 });
-dart.registerExtension(dart.global.ApplicationCache, html.ApplicationCache);
-dart.registerExtension(dart.global.DOMApplicationCache, html.ApplicationCache);
-dart.registerExtension(dart.global.OfflineResourceList, html.ApplicationCache);
+dart.registerExtension(dart.global.ApplicationCache, html$.ApplicationCache);
+dart.registerExtension(dart.global.DOMApplicationCache, html$.ApplicationCache);
+dart.registerExtension(dart.global.OfflineResourceList, html$.ApplicationCache);
 dart.defineExtensionNames([
   'message',
   'reason',
   'status',
   'url'
 ]);
-html.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html.Event {
+html$.ApplicationCacheErrorEvent = class ApplicationCacheErrorEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -58658,9 +58661,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
+      return html$.ApplicationCacheErrorEvent._create_1(type, eventInitDict_1);
     }
-    return html.ApplicationCacheErrorEvent._create_2(type);
+    return html$.ApplicationCacheErrorEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ApplicationCacheErrorEvent(type, eventInitDict);
@@ -58681,10 +58684,10 @@
     return this.url;
   }
 };
-dart.setSignature(html.ApplicationCacheErrorEvent, {
+dart.setSignature(html$.ApplicationCacheErrorEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ApplicationCacheErrorEvent, []),
-    new: dart.definiteFunctionType(html.ApplicationCacheErrorEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, []),
+    new: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.message]: core.String,
@@ -58693,12 +58696,12 @@
     [dartx.url]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ApplicationCacheErrorEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ApplicationCacheErrorEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html.ApplicationCacheErrorEvent);
+dart.registerExtension(dart.global.ApplicationCacheErrorEvent, html$.ApplicationCacheErrorEvent);
 dart.defineExtensionNames([
   'toString',
   'alt',
@@ -58717,12 +58720,12 @@
   'search',
   'username'
 ]);
-html.AreaElement = class AreaElement extends html.HtmlElement {
+html$.AreaElement = class AreaElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.AreaElement._check(html.document[dartx.createElement]("area"));
+    return html$.AreaElement._check(html$.document[dartx.createElement]("area"));
   }
   created() {
     this[dartx.alt] = null;
@@ -58833,13 +58836,13 @@
     return String(this);
   }
 };
-dart.defineNamedConstructor(html.AreaElement, 'created');
-html.AreaElement[dart.implements] = () => [html.UrlUtils];
-dart.setSignature(html.AreaElement, {
+dart.defineNamedConstructor(html$.AreaElement, 'created');
+html$.AreaElement[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.AreaElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AreaElement, []),
-    new: dart.definiteFunctionType(html.AreaElement, []),
-    created: dart.definiteFunctionType(html.AreaElement, [])
+    _: dart.definiteFunctionType(html$.AreaElement, []),
+    new: dart.definiteFunctionType(html$.AreaElement, []),
+    created: dart.definiteFunctionType(html$.AreaElement, [])
   }),
   fields: () => ({
     [dartx.alt]: core.String,
@@ -58859,7 +58862,7 @@
     [dartx.username]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLAreaElement, html.AreaElement);
+dart.registerExtension(dart.global.HTMLAreaElement, html$.AreaElement);
 dart.defineExtensionNames([
   'addTextTrack',
   'canPlayType',
@@ -58909,7 +58912,7 @@
   'audioDecodedByteCount',
   'videoDecodedByteCount'
 ]);
-html.MediaElement = class MediaElement extends html.HtmlElement {
+html$.MediaElement = class MediaElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59124,29 +59127,29 @@
     return this.webkitGenerateKeyRequest.apply(this, args);
   }
   get [dartx.onKeyAdded]() {
-    return html.MediaElement.keyAddedEvent.forElement(this);
+    return html$.MediaElement.keyAddedEvent.forElement(this);
   }
   get [dartx.onKeyError]() {
-    return html.MediaElement.keyErrorEvent.forElement(this);
+    return html$.MediaElement.keyErrorEvent.forElement(this);
   }
   get [dartx.onKeyMessage]() {
-    return html.MediaElement.keyMessageEvent.forElement(this);
+    return html$.MediaElement.keyMessageEvent.forElement(this);
   }
   get [dartx.onNeedKey]() {
-    return html.MediaElement.needKeyEvent.forElement(this);
+    return html$.MediaElement.needKeyEvent.forElement(this);
   }
 };
-dart.defineNamedConstructor(html.MediaElement, 'created');
-dart.setSignature(html.MediaElement, {
+dart.defineNamedConstructor(html$.MediaElement, 'created');
+dart.setSignature(html$.MediaElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaElement, []),
-    created: dart.definiteFunctionType(html.MediaElement, [])
+    _: dart.definiteFunctionType(html$.MediaElement, []),
+    created: dart.definiteFunctionType(html$.MediaElement, [])
   }),
   fields: () => ({
-    [dartx.audioTracks]: html.AudioTrackList,
+    [dartx.audioTracks]: html$.AudioTrackList,
     [dartx.autoplay]: core.bool,
-    [dartx.buffered]: html.TimeRanges,
-    [dartx.controller]: html.MediaController,
+    [dartx.buffered]: html$.TimeRanges,
+    [dartx.controller]: html$.MediaController,
     [dartx.controls]: core.bool,
     [dartx.crossOrigin]: core.String,
     [dartx.currentSrc]: core.String,
@@ -59155,41 +59158,41 @@
     [dartx.defaultPlaybackRate]: core.num,
     [dartx.duration]: core.double,
     [dartx.ended]: core.bool,
-    [dartx.error]: html.MediaError,
+    [dartx.error]: html$.MediaError,
     [dartx.loop]: core.bool,
     [dartx.mediaGroup]: core.String,
-    [dartx.mediaKeys]: html.MediaKeys,
+    [dartx.mediaKeys]: html$.MediaKeys,
     [dartx.muted]: core.bool,
     [dartx.networkState]: core.int,
     [dartx.paused]: core.bool,
     [dartx.playbackRate]: core.num,
-    [dartx.played]: html.TimeRanges,
+    [dartx.played]: html$.TimeRanges,
     [dartx.preload]: core.String,
     [dartx.readyState]: core.int,
-    [dartx.seekable]: html.TimeRanges,
+    [dartx.seekable]: html$.TimeRanges,
     [dartx.seeking]: core.bool,
-    [dartx.session]: html.MediaSession,
+    [dartx.session]: html$.MediaSession,
     [dartx.sinkId]: core.String,
     [dartx.src]: core.String,
-    [dartx.textTracks]: html.TextTrackList,
-    [dartx.videoTracks]: html.VideoTrackList,
+    [dartx.textTracks]: html$.TextTrackList,
+    [dartx.videoTracks]: html$.VideoTrackList,
     [dartx.volume]: core.num,
     [dartx.audioDecodedByteCount]: core.int,
     [dartx.videoDecodedByteCount]: core.int
   }),
   getters: () => ({
-    [dartx.onKeyAdded]: dart.definiteFunctionType(html.ElementStream$(html.MediaKeyEvent), []),
-    [dartx.onKeyError]: dart.definiteFunctionType(html.ElementStream$(html.MediaKeyEvent), []),
-    [dartx.onKeyMessage]: dart.definiteFunctionType(html.ElementStream$(html.MediaKeyEvent), []),
-    [dartx.onNeedKey]: dart.definiteFunctionType(html.ElementStream$(html.MediaKeyEvent), [])
+    [dartx.onKeyAdded]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onKeyError]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onKeyMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), []),
+    [dartx.onNeedKey]: dart.definiteFunctionType(html$.ElementStream$(html$.MediaKeyEvent), [])
   }),
   methods: () => ({
-    [dartx.addTextTrack]: dart.definiteFunctionType(html.TextTrack, [core.String], [core.String, core.String]),
+    [dartx.addTextTrack]: dart.definiteFunctionType(html$.TextTrack, [core.String], [core.String, core.String]),
     [dartx.canPlayType]: dart.definiteFunctionType(core.String, [core.String], [core.String]),
     [dartx.load]: dart.definiteFunctionType(dart.void, []),
     [dartx.pause]: dart.definiteFunctionType(dart.void, []),
     [dartx.play]: dart.definiteFunctionType(dart.void, []),
-    [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html.MediaKeys]),
+    [dartx.setMediaKeys]: dart.definiteFunctionType(async.Future, [html$.MediaKeys]),
     [dartx.setSinkId]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.addKey]: dart.definiteFunctionType(dart.void, [core.String, typed_data.Uint8List], [typed_data.Uint8List, core.String]),
     [dartx.cancelKeyRequest]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
@@ -59211,16 +59214,16 @@
     NETWORK_NO_SOURCE: core.int
   })
 });
-html.MediaElement.HAVE_CURRENT_DATA = 2;
-html.MediaElement.HAVE_ENOUGH_DATA = 4;
-html.MediaElement.HAVE_FUTURE_DATA = 3;
-html.MediaElement.HAVE_METADATA = 1;
-html.MediaElement.HAVE_NOTHING = 0;
-html.MediaElement.NETWORK_EMPTY = 0;
-html.MediaElement.NETWORK_IDLE = 1;
-html.MediaElement.NETWORK_LOADING = 2;
-html.MediaElement.NETWORK_NO_SOURCE = 3;
-dart.defineLazy(html.MediaElement, {
+html$.MediaElement.HAVE_CURRENT_DATA = 2;
+html$.MediaElement.HAVE_ENOUGH_DATA = 4;
+html$.MediaElement.HAVE_FUTURE_DATA = 3;
+html$.MediaElement.HAVE_METADATA = 1;
+html$.MediaElement.HAVE_NOTHING = 0;
+html$.MediaElement.NETWORK_EMPTY = 0;
+html$.MediaElement.NETWORK_IDLE = 1;
+html$.MediaElement.NETWORK_LOADING = 2;
+html$.MediaElement.NETWORK_NO_SOURCE = 3;
+dart.defineLazy(html$.MediaElement, {
   get keyAddedEvent() {
     return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitkeyadded'));
   },
@@ -59234,14 +59237,14 @@
     return dart.const(new (EventStreamProviderOfMediaKeyEvent())('webkitneedkey'));
   }
 });
-dart.registerExtension(dart.global.HTMLMediaElement, html.MediaElement);
-html.AudioElement = class AudioElement extends html.MediaElement {
+dart.registerExtension(dart.global.HTMLMediaElement, html$.MediaElement);
+html$.AudioElement = class AudioElement extends html$.MediaElement {
   static _(src) {
     if (src === void 0) src = null;
     if (src != null) {
-      return html.AudioElement._create_1(src);
+      return html$.AudioElement._create_1(src);
     }
-    return html.AudioElement._create_2();
+    return html$.AudioElement._create_2();
   }
   static _create_1(src) {
     return new Audio(src);
@@ -59254,23 +59257,23 @@
   }
   static new(src) {
     if (src === void 0) src = null;
-    return html.AudioElement._(src);
+    return html$.AudioElement._(src);
   }
 };
-dart.defineNamedConstructor(html.AudioElement, 'created');
-dart.setSignature(html.AudioElement, {
+dart.defineNamedConstructor(html$.AudioElement, 'created');
+dart.setSignature(html$.AudioElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AudioElement, [], [core.String]),
-    created: dart.definiteFunctionType(html.AudioElement, []),
-    new: dart.definiteFunctionType(html.AudioElement, [], [core.String])
+    _: dart.definiteFunctionType(html$.AudioElement, [], [core.String]),
+    created: dart.definiteFunctionType(html$.AudioElement, []),
+    new: dart.definiteFunctionType(html$.AudioElement, [], [core.String])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.AudioElement, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.AudioElement, [])
+    _create_1: dart.definiteFunctionType(html$.AudioElement, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AudioElement, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.HTMLAudioElement, html.AudioElement);
+dart.registerExtension(dart.global.HTMLAudioElement, html$.AudioElement);
 dart.defineExtensionNames([
   'enabled',
   'id',
@@ -59278,7 +59281,7 @@
   'label',
   'language'
 ]);
-html.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
+html$.AudioTrack = class AudioTrack extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59301,8 +59304,8 @@
     return this.language;
   }
 };
-dart.setSignature(html.AudioTrack, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AudioTrack, [])}),
+dart.setSignature(html$.AudioTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrack, [])}),
   fields: () => ({
     [dartx.enabled]: core.bool,
     [dartx.id]: core.String,
@@ -59311,14 +59314,14 @@
     [dartx.language]: core.String
   })
 });
-dart.registerExtension(dart.global.AudioTrack, html.AudioTrack);
+dart.registerExtension(dart.global.AudioTrack, html$.AudioTrack);
 const __getter__ = Symbol('__getter__');
 dart.defineExtensionNames([
   'getTrackById',
   'onChange',
   'length'
 ]);
-html.AudioTrackList = class AudioTrackList extends html.EventTarget {
+html$.AudioTrackList = class AudioTrackList extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59332,29 +59335,29 @@
     return this.getTrackById.apply(this, args);
   }
   get [dartx.onChange]() {
-    return html.AudioTrackList.changeEvent.forTarget(this);
+    return html$.AudioTrackList.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.AudioTrackList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.AudioTrackList, [])}),
+dart.setSignature(html$.AudioTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.AudioTrackList, [])}),
   fields: () => ({[dartx.length]: core.int}),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
-    [__getter__]: dart.definiteFunctionType(html.AudioTrack, [core.int]),
-    [dartx.getTrackById]: dart.definiteFunctionType(html.AudioTrack, [core.String])
+    [__getter__]: dart.definiteFunctionType(html$.AudioTrack, [core.int]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.AudioTrack, [core.String])
   }),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.AudioTrackList, {
+dart.defineLazy(html$.AudioTrackList, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.AudioTrackList, html.AudioTrackList);
+dart.registerExtension(dart.global.AudioTrackList, html$.AudioTrackList);
 dart.defineExtensionNames([
   'reason'
 ]);
-html.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html.Event {
+html$.AutocompleteErrorEvent = class AutocompleteErrorEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59362,9 +59365,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
+      return html$.AutocompleteErrorEvent._create_1(type, eventInitDict_1);
     }
-    return html.AutocompleteErrorEvent._create_2(type);
+    return html$.AutocompleteErrorEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.AutocompleteErrorEvent(type, eventInitDict);
@@ -59376,43 +59379,43 @@
     return this.reason;
   }
 };
-dart.setSignature(html.AutocompleteErrorEvent, {
+dart.setSignature(html$.AutocompleteErrorEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.AutocompleteErrorEvent, []),
-    new: dart.definiteFunctionType(html.AutocompleteErrorEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.AutocompleteErrorEvent, []),
+    new: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.reason]: core.String}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.AutocompleteErrorEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.AutocompleteErrorEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.AutocompleteErrorEvent, html.AutocompleteErrorEvent);
-html.BRElement = class BRElement extends html.HtmlElement {
+dart.registerExtension(dart.global.AutocompleteErrorEvent, html$.AutocompleteErrorEvent);
+html$.BRElement = class BRElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.BRElement._check(html.document[dartx.createElement]("br"));
+    return html$.BRElement._check(html$.document[dartx.createElement]("br"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.BRElement, 'created');
-dart.setSignature(html.BRElement, {
+dart.defineNamedConstructor(html$.BRElement, 'created');
+dart.setSignature(html$.BRElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.BRElement, []),
-    new: dart.definiteFunctionType(html.BRElement, []),
-    created: dart.definiteFunctionType(html.BRElement, [])
+    _: dart.definiteFunctionType(html$.BRElement, []),
+    new: dart.definiteFunctionType(html$.BRElement, []),
+    created: dart.definiteFunctionType(html$.BRElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLBRElement, html.BRElement);
+dart.registerExtension(dart.global.HTMLBRElement, html$.BRElement);
 dart.defineExtensionNames([
   'visible'
 ]);
-html.BarProp = class BarProp extends _interceptors.Interceptor {
+html$.BarProp = class BarProp extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59420,21 +59423,21 @@
     return this.visible;
   }
 };
-dart.setSignature(html.BarProp, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BarProp, [])}),
+dart.setSignature(html$.BarProp, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BarProp, [])}),
   fields: () => ({[dartx.visible]: core.bool})
 });
-dart.registerExtension(dart.global.BarProp, html.BarProp);
+dart.registerExtension(dart.global.BarProp, html$.BarProp);
 dart.defineExtensionNames([
   'href',
   'target'
 ]);
-html.BaseElement = class BaseElement extends html.HtmlElement {
+html$.BaseElement = class BaseElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.BaseElement._check(html.document[dartx.createElement]("base"));
+    return html$.BaseElement._check(html$.document[dartx.createElement]("base"));
   }
   created() {
     this[dartx.href] = null;
@@ -59454,26 +59457,26 @@
     this.target = value;
   }
 };
-dart.defineNamedConstructor(html.BaseElement, 'created');
-dart.setSignature(html.BaseElement, {
+dart.defineNamedConstructor(html$.BaseElement, 'created');
+dart.setSignature(html$.BaseElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.BaseElement, []),
-    new: dart.definiteFunctionType(html.BaseElement, []),
-    created: dart.definiteFunctionType(html.BaseElement, [])
+    _: dart.definiteFunctionType(html$.BaseElement, []),
+    new: dart.definiteFunctionType(html$.BaseElement, []),
+    created: dart.definiteFunctionType(html$.BaseElement, [])
   }),
   fields: () => ({
     [dartx.href]: core.String,
     [dartx.target]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLBaseElement, html.BaseElement);
+dart.registerExtension(dart.global.HTMLBaseElement, html$.BaseElement);
 dart.defineExtensionNames([
   'charging',
   'chargingTime',
   'dischargingTime',
   'level'
 ]);
-html.BatteryManager = class BatteryManager extends html.EventTarget {
+html$.BatteryManager = class BatteryManager extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59490,8 +59493,8 @@
     return this.level;
   }
 };
-dart.setSignature(html.BatteryManager, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BatteryManager, [])}),
+dart.setSignature(html$.BatteryManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BatteryManager, [])}),
   fields: () => ({
     [dartx.charging]: core.bool,
     [dartx.chargingTime]: core.double,
@@ -59499,13 +59502,13 @@
     [dartx.level]: core.double
   })
 });
-dart.registerExtension(dart.global.BatteryManager, html.BatteryManager);
+dart.registerExtension(dart.global.BatteryManager, html$.BatteryManager);
 dart.defineExtensionNames([
   'platforms',
   'prompt',
   'userChoice'
 ]);
-html.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html.Event {
+html$.BeforeInstallPromptEvent = class BeforeInstallPromptEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59513,9 +59516,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
+      return html$.BeforeInstallPromptEvent._create_1(type, eventInitDict_1);
     }
-    return html.BeforeInstallPromptEvent._create_2(type);
+    return html$.BeforeInstallPromptEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.BeforeInstallPromptEvent(type, eventInitDict);
@@ -59533,26 +59536,26 @@
     return this.prompt.apply(this, args);
   }
 };
-dart.setSignature(html.BeforeInstallPromptEvent, {
+dart.setSignature(html$.BeforeInstallPromptEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.BeforeInstallPromptEvent, []),
-    new: dart.definiteFunctionType(html.BeforeInstallPromptEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, []),
+    new: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.userChoice]: async.Future}),
   getters: () => ({[dartx.platforms]: dart.definiteFunctionType(core.List$(core.String), [])}),
   methods: () => ({[dartx.prompt]: dart.definiteFunctionType(async.Future, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.BeforeInstallPromptEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.BeforeInstallPromptEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.BeforeInstallPromptEvent, html.BeforeInstallPromptEvent);
+dart.registerExtension(dart.global.BeforeInstallPromptEvent, html$.BeforeInstallPromptEvent);
 dart.defineExtensionNames([
   'returnValue',
   'returnValue'
 ]);
-html.BeforeUnloadEvent = class BeforeUnloadEvent extends html.Event {
+html$.BeforeUnloadEvent = class BeforeUnloadEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59563,19 +59566,19 @@
     this.returnValue = value;
   }
 };
-dart.setSignature(html.BeforeUnloadEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BeforeUnloadEvent, [])}),
+dart.setSignature(html$.BeforeUnloadEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BeforeUnloadEvent, [])}),
   getters: () => ({[dartx.returnValue]: dart.definiteFunctionType(core.String, [])}),
   setters: () => ({[dartx.returnValue]: dart.definiteFunctionType(dart.void, [core.String])})
 });
-dart.registerExtension(dart.global.BeforeUnloadEvent, html.BeforeUnloadEvent);
+dart.registerExtension(dart.global.BeforeUnloadEvent, html$.BeforeUnloadEvent);
 dart.defineExtensionNames([
   'close',
   'slice',
   'size',
   'type'
 ]);
-html.Blob = class Blob extends _interceptors.Interceptor {
+html$.Blob = class Blob extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59595,12 +59598,12 @@
     if (type === void 0) type = null;
     if (endings === void 0) endings = null;
     if (type == null && endings == null) {
-      return html.Blob._check(html.Blob._create_1(blobParts));
+      return html$.Blob._check(html$.Blob._create_1(blobParts));
     }
-    let bag = html.Blob._create_bag();
-    if (type != null) html.Blob._bag_set(bag, 'type', type);
-    if (endings != null) html.Blob._bag_set(bag, 'endings', endings);
-    return html.Blob._check(html.Blob._create_2(blobParts, bag));
+    let bag = html$.Blob._create_bag();
+    if (type != null) html$.Blob._bag_set(bag, 'type', type);
+    if (endings != null) html$.Blob._bag_set(bag, 'endings', endings);
+    return html$.Blob._check(html$.Blob._create_2(blobParts, bag));
   }
   static _create_1(parts) {
     return new self.Blob(parts);
@@ -59615,10 +59618,10 @@
     bag[key] = value;
   }
 };
-dart.setSignature(html.Blob, {
+dart.setSignature(html$.Blob, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.Blob, []),
-    new: dart.definiteFunctionType(html.Blob, [core.List], [core.String, core.String])
+    _: dart.definiteFunctionType(html$.Blob, []),
+    new: dart.definiteFunctionType(html$.Blob, [core.List], [core.String, core.String])
   }),
   fields: () => ({
     [dartx.size]: core.int,
@@ -59626,7 +59629,7 @@
   }),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
-    [dartx.slice]: dart.definiteFunctionType(html.Blob, [], [core.int, core.int, core.String])
+    [dartx.slice]: dart.definiteFunctionType(html$.Blob, [], [core.int, core.int, core.String])
   }),
   statics: () => ({
     _create_1: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
@@ -59636,12 +59639,12 @@
   }),
   names: ['_create_1', '_create_2', '_create_bag', '_bag_set']
 });
-dart.registerExtension(dart.global.Blob, html.Blob);
+dart.registerExtension(dart.global.Blob, html$.Blob);
 const _requestDevice_1 = Symbol('_requestDevice_1');
 dart.defineExtensionNames([
   'requestDevice'
 ]);
-html.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
+html$.Bluetooth = class Bluetooth extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59653,14 +59656,14 @@
     return this.requestDevice.apply(this, args);
   }
 };
-dart.setSignature(html.Bluetooth, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Bluetooth, [])}),
+dart.setSignature(html$.Bluetooth, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Bluetooth, [])}),
   methods: () => ({
     [dartx.requestDevice]: dart.definiteFunctionType(async.Future, [core.Map]),
     [_requestDevice_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.Bluetooth, html.Bluetooth);
+dart.registerExtension(dart.global.Bluetooth, html$.Bluetooth);
 dart.defineExtensionNames([
   'connectGatt',
   'deviceClass',
@@ -59672,7 +59675,7 @@
   'vendorID',
   'vendorIDSource'
 ]);
-html.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
+html$.BluetoothDevice = class BluetoothDevice extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59704,8 +59707,8 @@
     return this.connectGATT.apply(this, args);
   }
 };
-dart.setSignature(html.BluetoothDevice, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BluetoothDevice, [])}),
+dart.setSignature(html$.BluetoothDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothDevice, [])}),
   fields: () => ({
     [dartx.deviceClass]: core.int,
     [dartx.instanceID]: core.String,
@@ -59718,13 +59721,13 @@
   }),
   methods: () => ({[dartx.connectGatt]: dart.definiteFunctionType(async.Future, [])})
 });
-dart.registerExtension(dart.global.BluetoothDevice, html.BluetoothDevice);
+dart.registerExtension(dart.global.BluetoothDevice, html$.BluetoothDevice);
 dart.defineExtensionNames([
   'readValue',
   'writeValue',
   'uuid'
 ]);
-html.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
+html$.BluetoothGattCharacteristic = class BluetoothGattCharacteristic extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59738,20 +59741,20 @@
     return this.writeValue.apply(this, args);
   }
 };
-dart.setSignature(html.BluetoothGattCharacteristic, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BluetoothGattCharacteristic, [])}),
+dart.setSignature(html$.BluetoothGattCharacteristic, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattCharacteristic, [])}),
   fields: () => ({[dartx.uuid]: core.String}),
   methods: () => ({
     [dartx.readValue]: dart.definiteFunctionType(async.Future, []),
     [dartx.writeValue]: dart.definiteFunctionType(async.Future, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html.BluetoothGattCharacteristic);
+dart.registerExtension(dart.global.BluetoothGATTCharacteristic, html$.BluetoothGattCharacteristic);
 dart.defineExtensionNames([
   'getPrimaryService',
   'connected'
 ]);
-html.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
+html$.BluetoothGattRemoteServer = class BluetoothGattRemoteServer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59762,18 +59765,18 @@
     return this.getPrimaryService.apply(this, args);
   }
 };
-dart.setSignature(html.BluetoothGattRemoteServer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BluetoothGattRemoteServer, [])}),
+dart.setSignature(html$.BluetoothGattRemoteServer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattRemoteServer, [])}),
   fields: () => ({[dartx.connected]: core.bool}),
   methods: () => ({[dartx.getPrimaryService]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
 });
-dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html.BluetoothGattRemoteServer);
+dart.registerExtension(dart.global.BluetoothGATTRemoteServer, html$.BluetoothGattRemoteServer);
 dart.defineExtensionNames([
   'getCharacteristic',
   'isPrimary',
   'uuid'
 ]);
-html.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
+html$.BluetoothGattService = class BluetoothGattService extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59787,22 +59790,22 @@
     return this.getCharacteristic.apply(this, args);
   }
 };
-dart.setSignature(html.BluetoothGattService, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BluetoothGattService, [])}),
+dart.setSignature(html$.BluetoothGattService, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothGattService, [])}),
   fields: () => ({
     [dartx.isPrimary]: core.bool,
     [dartx.uuid]: core.String
   }),
   methods: () => ({[dartx.getCharacteristic]: dart.definiteFunctionType(async.Future, [dart.dynamic])})
 });
-dart.registerExtension(dart.global.BluetoothGATTService, html.BluetoothGattService);
-html.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.BluetoothGATTService, html$.BluetoothGattService);
+html$.BluetoothUuid = class BluetoothUuid extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.BluetoothUuid, {
-  constructors: () => ({_: dart.definiteFunctionType(html.BluetoothUuid, [])}),
+dart.setSignature(html$.BluetoothUuid, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.BluetoothUuid, [])}),
   statics: () => ({
     canonicalUuid: dart.definiteFunctionType(core.String, [core.int]),
     getCharacteristic: dart.definiteFunctionType(core.String, [core.Object]),
@@ -59811,7 +59814,7 @@
   }),
   names: ['canonicalUuid', 'getCharacteristic', 'getDescriptor', 'getService']
 });
-dart.registerExtension(dart.global.BluetoothUUID, html.BluetoothUuid);
+dart.registerExtension(dart.global.BluetoothUUID, html$.BluetoothUuid);
 dart.defineExtensionNames([
   'arrayBuffer',
   'blob',
@@ -59819,7 +59822,7 @@
   'text',
   'bodyUsed'
 ]);
-html.Body = class Body extends _interceptors.Interceptor {
+html$.Body = class Body extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -59839,8 +59842,8 @@
     return this.text.apply(this, args);
   }
 };
-dart.setSignature(html.Body, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Body, [])}),
+dart.setSignature(html$.Body, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Body, [])}),
   fields: () => ({[dartx.bodyUsed]: core.bool}),
   methods: () => ({
     [dartx.arrayBuffer]: dart.definiteFunctionType(async.Future, []),
@@ -59849,7 +59852,7 @@
     [dartx.text]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.Body, html.Body);
+dart.registerExtension(dart.global.Body, html$.Body);
 dart.defineExtensionNames([
   'onBlur',
   'onError',
@@ -59865,72 +59868,72 @@
   'onStorage',
   'onUnload'
 ]);
-html.BodyElement = class BodyElement extends html.HtmlElement {
+html$.BodyElement = class BodyElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.BodyElement._check(html.document[dartx.createElement]("body"));
+    return html$.BodyElement._check(html$.document[dartx.createElement]("body"));
   }
   created() {
     super.created();
   }
   get [dartx.onBlur]() {
-    return html.BodyElement.blurEvent.forElement(this);
+    return html$.BodyElement.blurEvent.forElement(this);
   }
   get [dartx.onError]() {
-    return html.BodyElement.errorEvent.forElement(this);
+    return html$.BodyElement.errorEvent.forElement(this);
   }
   get [dartx.onFocus]() {
-    return html.BodyElement.focusEvent.forElement(this);
+    return html$.BodyElement.focusEvent.forElement(this);
   }
   get [dartx.onHashChange]() {
-    return html.BodyElement.hashChangeEvent.forElement(this);
+    return html$.BodyElement.hashChangeEvent.forElement(this);
   }
   get [dartx.onLoad]() {
-    return html.BodyElement.loadEvent.forElement(this);
+    return html$.BodyElement.loadEvent.forElement(this);
   }
   get [dartx.onMessage]() {
-    return html.BodyElement.messageEvent.forElement(this);
+    return html$.BodyElement.messageEvent.forElement(this);
   }
   get [dartx.onOffline]() {
-    return html.BodyElement.offlineEvent.forElement(this);
+    return html$.BodyElement.offlineEvent.forElement(this);
   }
   get [dartx.onOnline]() {
-    return html.BodyElement.onlineEvent.forElement(this);
+    return html$.BodyElement.onlineEvent.forElement(this);
   }
   get [dartx.onPopState]() {
-    return html.BodyElement.popStateEvent.forElement(this);
+    return html$.BodyElement.popStateEvent.forElement(this);
   }
   get [dartx.onResize]() {
-    return html.BodyElement.resizeEvent.forElement(this);
+    return html$.BodyElement.resizeEvent.forElement(this);
   }
   get [dartx.onScroll]() {
-    return html.BodyElement.scrollEvent.forElement(this);
+    return html$.BodyElement.scrollEvent.forElement(this);
   }
   get [dartx.onStorage]() {
-    return html.BodyElement.storageEvent.forElement(this);
+    return html$.BodyElement.storageEvent.forElement(this);
   }
   get [dartx.onUnload]() {
-    return html.BodyElement.unloadEvent.forElement(this);
+    return html$.BodyElement.unloadEvent.forElement(this);
   }
 };
-dart.defineNamedConstructor(html.BodyElement, 'created');
-html.BodyElement[dart.implements] = () => [html.WindowEventHandlers];
-dart.setSignature(html.BodyElement, {
+dart.defineNamedConstructor(html$.BodyElement, 'created');
+html$.BodyElement[dart.implements] = () => [html$.WindowEventHandlers];
+dart.setSignature(html$.BodyElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.BodyElement, []),
-    new: dart.definiteFunctionType(html.BodyElement, []),
-    created: dart.definiteFunctionType(html.BodyElement, [])
+    _: dart.definiteFunctionType(html$.BodyElement, []),
+    new: dart.definiteFunctionType(html$.BodyElement, []),
+    created: dart.definiteFunctionType(html$.BodyElement, [])
   }),
   getters: () => ({
-    [dartx.onHashChange]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(html.ElementStream$(html.MessageEvent), []),
-    [dartx.onOffline]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onOnline]: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-    [dartx.onPopState]: dart.definiteFunctionType(html.ElementStream$(html.PopStateEvent), []),
-    [dartx.onStorage]: dart.definiteFunctionType(html.ElementStream$(html.StorageEvent), []),
-    [dartx.onUnload]: dart.definiteFunctionType(html.ElementStream$(html.Event), [])
+    [dartx.onHashChange]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(html$.ElementStream$(html$.MessageEvent), []),
+    [dartx.onOffline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onOnline]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+    [dartx.onPopState]: dart.definiteFunctionType(html$.ElementStream$(html$.PopStateEvent), []),
+    [dartx.onStorage]: dart.definiteFunctionType(html$.ElementStream$(html$.StorageEvent), []),
+    [dartx.onUnload]: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
   }),
   sfields: () => ({
     blurEvent: EventStreamProviderOfEvent(),
@@ -59948,7 +59951,7 @@
     unloadEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(html.BodyElement, {
+dart.defineLazy(html$.BodyElement, {
   get blurEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('blur'));
   },
@@ -59989,7 +59992,7 @@
     return dart.const(new (EventStreamProviderOfEvent())('unload'));
   }
 });
-dart.registerExtension(dart.global.HTMLBodyElement, html.BodyElement);
+dart.registerExtension(dart.global.HTMLBodyElement, html$.BodyElement);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -60010,12 +60013,12 @@
   'value',
   'willValidate'
 ]);
-html.ButtonElement = class ButtonElement extends html.HtmlElement {
+html$.ButtonElement = class ButtonElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ButtonElement._check(html.document[dartx.createElement]("button"));
+    return html$.ButtonElement._check(html$.document[dartx.createElement]("button"));
   }
   created() {
     this[dartx.autofocus] = null;
@@ -60120,17 +60123,17 @@
     return this.setCustomValidity.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.ButtonElement, 'created');
-dart.setSignature(html.ButtonElement, {
+dart.defineNamedConstructor(html$.ButtonElement, 'created');
+dart.setSignature(html$.ButtonElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ButtonElement, []),
-    new: dart.definiteFunctionType(html.ButtonElement, []),
-    created: dart.definiteFunctionType(html.ButtonElement, [])
+    _: dart.definiteFunctionType(html$.ButtonElement, []),
+    new: dart.definiteFunctionType(html$.ButtonElement, []),
+    created: dart.definiteFunctionType(html$.ButtonElement, [])
   }),
   fields: () => ({
     [dartx.autofocus]: core.bool,
     [dartx.disabled]: core.bool,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.formAction]: core.String,
     [dartx.formEnctype]: core.String,
     [dartx.formMethod]: core.String,
@@ -60140,7 +60143,7 @@
     [dartx.name]: core.String,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.value]: core.String,
     [dartx.willValidate]: core.bool
   }),
@@ -60150,7 +60153,7 @@
     [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.registerExtension(dart.global.HTMLButtonElement, html.ButtonElement);
+dart.registerExtension(dart.global.HTMLButtonElement, html$.ButtonElement);
 const _createTextNode = Symbol('_createTextNode');
 dart.defineExtensionNames([
   'appendData',
@@ -60165,7 +60168,7 @@
   'nextElementSibling',
   'previousElementSibling'
 ]);
-html.CharacterData = class CharacterData extends html.Node {
+html$.CharacterData = class CharacterData extends html$.Node {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -60206,14 +60209,14 @@
     return this.previousElementSibling;
   }
 };
-html.CharacterData[dart.implements] = () => [html.NonDocumentTypeChildNode, html.ChildNode];
-dart.setSignature(html.CharacterData, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CharacterData, [])}),
+html$.CharacterData[dart.implements] = () => [html$.NonDocumentTypeChildNode, html$.ChildNode];
+dart.setSignature(html$.CharacterData, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CharacterData, [])}),
   fields: () => ({
     [dartx.data]: core.String,
     [dartx.length]: core.int,
-    [dartx.nextElementSibling]: html.Element,
-    [dartx.previousElementSibling]: html.Element
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element
   }),
   methods: () => ({
     [dartx.appendData]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -60225,15 +60228,15 @@
     [dartx.before]: dart.definiteFunctionType(dart.void, [core.Object])
   })
 });
-dart.registerExtension(dart.global.CharacterData, html.CharacterData);
+dart.registerExtension(dart.global.CharacterData, html$.CharacterData);
 dart.defineExtensionNames([
   'getDestinationInsertionPoints',
   'splitText',
   'wholeText'
 ]);
-html.Text = class Text extends html.CharacterData {
+html$.Text = class Text extends html$.CharacterData {
   static new(data) {
-    return html.document[_createTextNode](data);
+    return html$.document[_createTextNode](data);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -60248,27 +60251,27 @@
     return this.splitText.apply(this, args);
   }
 };
-dart.setSignature(html.Text, {
+dart.setSignature(html$.Text, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.Text, [core.String]),
-    _: dart.definiteFunctionType(html.Text, [])
+    new: dart.definiteFunctionType(html$.Text, [core.String]),
+    _: dart.definiteFunctionType(html$.Text, [])
   }),
   fields: () => ({[dartx.wholeText]: core.String}),
   methods: () => ({
-    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html.Node), []),
-    [dartx.splitText]: dart.definiteFunctionType(html.Text, [core.int])
+    [dartx.getDestinationInsertionPoints]: dart.definiteFunctionType(core.List$(html$.Node), []),
+    [dartx.splitText]: dart.definiteFunctionType(html$.Text, [core.int])
   })
 });
-dart.registerExtension(dart.global.Text, html.Text);
-html.CDataSection = class CDataSection extends html.Text {
+dart.registerExtension(dart.global.Text, html$.Text);
+html$.CDataSection = class CDataSection extends html$.Text {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.CDataSection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CDataSection, [])})
+dart.setSignature(html$.CDataSection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CDataSection, [])})
 });
-dart.registerExtension(dart.global.CDATASection, html.CDataSection);
+dart.registerExtension(dart.global.CDATASection, html$.CDataSection);
 const _match_1 = Symbol('_match_1');
 const _match_2 = Symbol('_match_2');
 dart.defineExtensionNames([
@@ -60278,7 +60281,7 @@
   'match',
   'open'
 ]);
-html.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
+html$.CacheStorage = class CacheStorage extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -60309,8 +60312,8 @@
     return this.open.apply(this, args);
   }
 };
-dart.setSignature(html.CacheStorage, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CacheStorage, [])}),
+dart.setSignature(html$.CacheStorage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CacheStorage, [])}),
   methods: () => ({
     [dartx.delete]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.has]: dart.definiteFunctionType(async.Future, [core.String]),
@@ -60321,7 +60324,7 @@
     [dartx.open]: dart.definiteFunctionType(async.Future, [core.String])
   })
 });
-dart.registerExtension(dart.global.CacheStorage, html.CacheStorage);
+dart.registerExtension(dart.global.CacheStorage, html$.CacheStorage);
 const _getContext_1 = Symbol('_getContext_1');
 const _getContext_2 = Symbol('_getContext_2');
 const _toDataUrl = Symbol('_toDataUrl');
@@ -60335,14 +60338,14 @@
   'height',
   'width'
 ]);
-html.CanvasElement = class CanvasElement extends html.HtmlElement {
+html$.CanvasElement = class CanvasElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(opts) {
     let width = opts && 'width' in opts ? opts.width : null;
     let height = opts && 'height' in opts ? opts.height : null;
-    let e = html.CanvasElement._check(html.document[dartx.createElement]("canvas"));
+    let e = html$.CanvasElement._check(html$.document[dartx.createElement]("canvas"));
     if (width != null) e[dartx.width] = width;
     if (height != null) e[dartx.height] = height;
     return e;
@@ -60382,10 +60385,10 @@
     return this.toDataURL.apply(this, args);
   }
   get [dartx.onWebGlContextLost]() {
-    return html.CanvasElement.webGlContextLostEvent.forElement(this);
+    return html$.CanvasElement.webGlContextLostEvent.forElement(this);
   }
   get [dartx.onWebGlContextRestored]() {
-    return html.CanvasElement.webGlContextRestoredEvent.forElement(this);
+    return html$.CanvasElement.webGlContextRestoredEvent.forElement(this);
   }
   get [dartx.context2D]() {
     return this.getContext('2d');
@@ -60410,22 +60413,22 @@
     return this[_toDataUrl](type, quality);
   }
 };
-dart.defineNamedConstructor(html.CanvasElement, 'created');
-html.CanvasElement[dart.implements] = () => [html.CanvasImageSource];
-dart.setSignature(html.CanvasElement, {
+dart.defineNamedConstructor(html$.CanvasElement, 'created');
+html$.CanvasElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.CanvasElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.CanvasElement, []),
-    new: dart.definiteFunctionType(html.CanvasElement, [], {width: core.int, height: core.int}),
-    created: dart.definiteFunctionType(html.CanvasElement, [])
+    _: dart.definiteFunctionType(html$.CanvasElement, []),
+    new: dart.definiteFunctionType(html$.CanvasElement, [], {width: core.int, height: core.int}),
+    created: dart.definiteFunctionType(html$.CanvasElement, [])
   }),
   fields: () => ({
     [dartx.height]: core.int,
     [dartx.width]: core.int
   }),
   getters: () => ({
-    [dartx.onWebGlContextLost]: dart.definiteFunctionType(html.ElementStream$(web_gl.ContextEvent), []),
-    [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html.ElementStream$(web_gl.ContextEvent), []),
-    [dartx.context2D]: dart.definiteFunctionType(html.CanvasRenderingContext2D, [])
+    [dartx.onWebGlContextLost]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
+    [dartx.onWebGlContextRestored]: dart.definiteFunctionType(html$.ElementStream$(web_gl.ContextEvent), []),
+    [dartx.context2D]: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])
   }),
   methods: () => ({
     [dartx.getContext]: dart.definiteFunctionType(core.Object, [core.String], [core.Map]),
@@ -60440,7 +60443,7 @@
     webGlContextRestoredEvent: EventStreamProviderOfContextEvent()
   })
 });
-dart.defineLazy(html.CanvasElement, {
+dart.defineLazy(html$.CanvasElement, {
   get webGlContextLostEvent() {
     return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextlost'));
   },
@@ -60448,11 +60451,11 @@
     return dart.const(new (EventStreamProviderOfContextEvent())('webglcontextrestored'));
   }
 });
-dart.registerExtension(dart.global.HTMLCanvasElement, html.CanvasElement);
+dart.registerExtension(dart.global.HTMLCanvasElement, html$.CanvasElement);
 dart.defineExtensionNames([
   'addColorStop'
 ]);
-html.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
+html$.CanvasGradient = class CanvasGradient extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -60460,15 +60463,15 @@
     return this.addColorStop.apply(this, args);
   }
 };
-dart.setSignature(html.CanvasGradient, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CanvasGradient, [])}),
+dart.setSignature(html$.CanvasGradient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasGradient, [])}),
   methods: () => ({[dartx.addColorStop]: dart.definiteFunctionType(dart.void, [core.num, core.String])})
 });
-dart.registerExtension(dart.global.CanvasGradient, html.CanvasGradient);
+dart.registerExtension(dart.global.CanvasGradient, html$.CanvasGradient);
 dart.defineExtensionNames([
   'setTransform'
 ]);
-html.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
+html$.CanvasPattern = class CanvasPattern extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -60476,12 +60479,12 @@
     return this.setTransform.apply(this, args);
   }
 };
-dart.setSignature(html.CanvasPattern, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CanvasPattern, [])}),
-  methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg.Matrix])})
+dart.setSignature(html$.CanvasPattern, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasPattern, [])}),
+  methods: () => ({[dartx.setTransform]: dart.definiteFunctionType(dart.void, [svg$.Matrix])})
 });
-dart.registerExtension(dart.global.CanvasPattern, html.CanvasPattern);
-html.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
+dart.registerExtension(dart.global.CanvasPattern, html$.CanvasPattern);
+html$.CanvasRenderingContext = class CanvasRenderingContext extends core.Object {};
 const _addHitRegion_1 = Symbol('_addHitRegion_1');
 const _addHitRegion_2 = Symbol('_addHitRegion_2');
 const _createImageData_1 = Symbol('_createImageData_1');
@@ -60571,7 +60574,7 @@
   'textAlign',
   'textBaseline'
 ]);
-html.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
+html$.CanvasRenderingContext2D = class CanvasRenderingContext2D extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -60722,7 +60725,7 @@
   }
   [dartx.createImageData](imagedata_OR_sw, sh) {
     if (sh === void 0) sh = null;
-    if (html.ImageData.is(imagedata_OR_sw) && sh == null) {
+    if (html$.ImageData.is(imagedata_OR_sw) && sh == null) {
       let imagedata_1 = html_common.convertDartToNative_ImageData(imagedata_OR_sw);
       return html_common.convertNativeToDart_ImageData(this[_createImageData_1](imagedata_1));
     }
@@ -60947,12 +60950,12 @@
     return 1.0;
   }
 };
-html.CanvasRenderingContext2D[dart.implements] = () => [html.CanvasRenderingContext];
-dart.setSignature(html.CanvasRenderingContext2D, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CanvasRenderingContext2D, [])}),
+html$.CanvasRenderingContext2D[dart.implements] = () => [html$.CanvasRenderingContext];
+dart.setSignature(html$.CanvasRenderingContext2D, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CanvasRenderingContext2D, [])}),
   fields: () => ({
-    [dartx.canvas]: html.CanvasElement,
-    [dartx.currentTransform]: svg.Matrix,
+    [dartx.canvas]: html$.CanvasElement,
+    [dartx.currentTransform]: svg$.Matrix,
     [dartx.direction]: core.String,
     [dartx.fillStyle]: core.Object,
     [dartx.filter]: core.String,
@@ -60985,24 +60988,24 @@
     [dartx.clearHitRegions]: dart.definiteFunctionType(dart.void, []),
     [dartx.clearRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
     [dartx.clip]: dart.definiteFunctionType(dart.void, [], [dart.dynamic, core.String]),
-    [dartx.createImageData]: dart.definiteFunctionType(html.ImageData, [dart.dynamic], [core.num]),
+    [dartx.createImageData]: dart.definiteFunctionType(html$.ImageData, [dart.dynamic], [core.num]),
     [_createImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
     [_createImageData_2]: dart.definiteFunctionType(dart.dynamic, [core.num, dart.dynamic]),
-    [dartx.createLinearGradient]: dart.definiteFunctionType(html.CanvasGradient, [core.num, core.num, core.num, core.num]),
-    [dartx.createPattern]: dart.definiteFunctionType(html.CanvasPattern, [core.Object, core.String]),
-    [dartx.createRadialGradient]: dart.definiteFunctionType(html.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
-    [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html.Element]),
+    [dartx.createLinearGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num]),
+    [dartx.createPattern]: dart.definiteFunctionType(html$.CanvasPattern, [core.Object, core.String]),
+    [dartx.createRadialGradient]: dart.definiteFunctionType(html$.CanvasGradient, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.drawFocusIfNeeded]: dart.definiteFunctionType(dart.void, [dart.dynamic], [html$.Element]),
     [dartx.fillRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
     [dartx.getContextAttributes]: dart.definiteFunctionType(core.Map, []),
     [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
-    [dartx.getImageData]: dart.definiteFunctionType(html.ImageData, [core.num, core.num, core.num, core.num]),
+    [dartx.getImageData]: dart.definiteFunctionType(html$.ImageData, [core.num, core.num, core.num, core.num]),
     [_getImageData_1]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
     [_getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
     [dartx.isContextLost]: dart.definiteFunctionType(core.bool, []),
     [dartx.isPointInPath]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [dart.dynamic, core.String]),
     [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [dart.dynamic, core.num], [core.num]),
-    [dartx.measureText]: dart.definiteFunctionType(html.TextMetrics, [core.String]),
-    [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
+    [dartx.measureText]: dart.definiteFunctionType(html$.TextMetrics, [core.String]),
+    [dartx.putImageData]: dart.definiteFunctionType(dart.void, [html$.ImageData, core.num, core.num], [core.num, core.num, core.num, core.num]),
     [_putImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic]),
     [_putImageData_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
     [dartx.removeHitRegion]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -61011,9 +61014,9 @@
     [dartx.rotate]: dart.definiteFunctionType(dart.void, [core.num]),
     [dartx.save]: dart.definiteFunctionType(dart.void, []),
     [dartx.scale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
-    [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html.Path2D]),
+    [dartx.scrollPathIntoView]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
     [dartx.setTransform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
-    [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html.Path2D]),
+    [dartx.stroke]: dart.definiteFunctionType(dart.void, [], [html$.Path2D]),
     [dartx.strokeRect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
     [dartx.strokeText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
     [dartx.transform]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
@@ -61027,45 +61030,45 @@
     [dartx.moveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
     [dartx.quadraticCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
     [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num]),
-    [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html.ImageData, [html.ImageData]),
+    [dartx.createImageDataFromImageData]: dart.definiteFunctionType(html$.ImageData, [html$.ImageData]),
     [dartx.setFillColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
     [dartx.setFillColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
     [dartx.setStrokeColorRgb]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int], [core.num]),
     [dartx.setStrokeColorHsl]: dart.definiteFunctionType(dart.void, [core.int, core.num, core.num], [core.num]),
     [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num], [core.bool]),
-    [dartx.createPatternFromImage]: dart.definiteFunctionType(html.CanvasPattern, [html.ImageElement, core.String]),
-    [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
-    [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html.CanvasImageSource, core.num, core.num]),
-    [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html.CanvasImageSource, core.num, core.num, core.num, core.num]),
-    [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.createPatternFromImage]: dart.definiteFunctionType(html$.CanvasPattern, [html$.ImageElement, core.String]),
+    [dartx.drawImageToRect]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, RectangleOfnum()], {sourceRect: RectangleOfnum()}),
+    [dartx.drawImage]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num]),
+    [dartx.drawImageScaled]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num]),
+    [dartx.drawImageScaledFromSource]: dart.definiteFunctionType(dart.void, [html$.CanvasImageSource, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
     [dartx.getLineDash]: dart.definiteFunctionType(core.List$(core.num), []),
     [dartx.setLineDash]: dart.definiteFunctionType(dart.void, [ListOfnum()]),
     [dartx.fillText]: dart.definiteFunctionType(dart.void, [core.String, core.num, core.num], [core.num]),
     [dartx.fill]: dart.definiteFunctionType(dart.void, [], [core.String])
   })
 });
-dart.registerExtension(dart.global.CanvasRenderingContext2D, html.CanvasRenderingContext2D);
-html.ChildNode = class ChildNode extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.CanvasRenderingContext2D, html$.CanvasRenderingContext2D);
+html$.ChildNode = class ChildNode extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.ChildNode, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ChildNode, [])})
+dart.setSignature(html$.ChildNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ChildNode, [])})
 });
-html.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
+html$.ChromiumValuebuffer = class ChromiumValuebuffer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.ChromiumValuebuffer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ChromiumValuebuffer, [])})
+dart.setSignature(html$.ChromiumValuebuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ChromiumValuebuffer, [])})
 });
-dart.registerExtension(dart.global.CHROMIUMValuebuffer, html.ChromiumValuebuffer);
+dart.registerExtension(dart.global.CHROMIUMValuebuffer, html$.ChromiumValuebuffer);
 dart.defineExtensionNames([
   'id'
 ]);
-html.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
+html$.GeofencingRegion = class GeofencingRegion extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61073,23 +61076,23 @@
     return this.id;
   }
 };
-dart.setSignature(html.GeofencingRegion, {
-  constructors: () => ({_: dart.definiteFunctionType(html.GeofencingRegion, [])}),
+dart.setSignature(html$.GeofencingRegion, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingRegion, [])}),
   fields: () => ({[dartx.id]: core.String})
 });
-dart.registerExtension(dart.global.GeofencingRegion, html.GeofencingRegion);
+dart.registerExtension(dart.global.GeofencingRegion, html$.GeofencingRegion);
 dart.defineExtensionNames([
   'latitude',
   'longitude',
   'radius'
 ]);
-html.CircularGeofencingRegion = class CircularGeofencingRegion extends html.GeofencingRegion {
+html$.CircularGeofencingRegion = class CircularGeofencingRegion extends html$.GeofencingRegion {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(init) {
     let init_1 = html_common.convertDartToNative_Dictionary(init);
-    return html.CircularGeofencingRegion._create_1(init_1);
+    return html$.CircularGeofencingRegion._create_1(init_1);
   }
   static _create_1(init) {
     return new self.CircularGeofencingRegion(init);
@@ -61104,10 +61107,10 @@
     return this.radius;
   }
 };
-dart.setSignature(html.CircularGeofencingRegion, {
+dart.setSignature(html$.CircularGeofencingRegion, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.CircularGeofencingRegion, []),
-    new: dart.definiteFunctionType(html.CircularGeofencingRegion, [core.Map])
+    _: dart.definiteFunctionType(html$.CircularGeofencingRegion, []),
+    new: dart.definiteFunctionType(html$.CircularGeofencingRegion, [core.Map])
   }),
   fields: () => ({
     [dartx.latitude]: core.double,
@@ -61118,12 +61121,12 @@
     MAX_RADIUS: core.num,
     MIN_RADIUS: core.num
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.CircularGeofencingRegion, [dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CircularGeofencingRegion, [dart.dynamic])}),
   names: ['_create_1']
 });
-html.CircularGeofencingRegion.MAX_RADIUS = 100.0;
-html.CircularGeofencingRegion.MIN_RADIUS = 1.0;
-dart.registerExtension(dart.global.CircularGeofencingRegion, html.CircularGeofencingRegion);
+html$.CircularGeofencingRegion.MAX_RADIUS = 100.0;
+html$.CircularGeofencingRegion.MIN_RADIUS = 1.0;
+dart.registerExtension(dart.global.CircularGeofencingRegion, html$.CircularGeofencingRegion);
 const _postMessage_1 = Symbol('_postMessage_1');
 const _postMessage_2 = Symbol('_postMessage_2');
 dart.defineExtensionNames([
@@ -61132,7 +61135,7 @@
   'id',
   'url'
 ]);
-html.Client = class Client extends _interceptors.Interceptor {
+html$.Client = class Client extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61163,8 +61166,8 @@
     return this.postMessage.apply(this, args);
   }
 };
-dart.setSignature(html.Client, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Client, [])}),
+dart.setSignature(html$.Client, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Client, [])}),
   fields: () => ({
     [dartx.frameType]: core.String,
     [dartx.id]: core.String,
@@ -61176,7 +61179,7 @@
     [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.Client, html.Client);
+dart.registerExtension(dart.global.Client, html$.Client);
 const _matchAll_1 = Symbol('_matchAll_1');
 const _matchAll_2 = Symbol('_matchAll_2');
 dart.defineExtensionNames([
@@ -61184,7 +61187,7 @@
   'matchAll',
   'openWindow'
 ]);
-html.Clients = class Clients extends _interceptors.Interceptor {
+html$.Clients = class Clients extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61209,8 +61212,8 @@
     return this.openWindow.apply(this, args);
   }
 };
-dart.setSignature(html.Clients, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Clients, [])}),
+dart.setSignature(html$.Clients, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Clients, [])}),
   methods: () => ({
     [dartx.claim]: dart.definiteFunctionType(async.Future, []),
     [dartx.matchAll]: dart.definiteFunctionType(async.Future, [], [core.Map]),
@@ -61219,11 +61222,11 @@
     [dartx.openWindow]: dart.definiteFunctionType(async.Future, [core.String])
   })
 });
-dart.registerExtension(dart.global.Clients, html.Clients);
+dart.registerExtension(dart.global.Clients, html$.Clients);
 dart.defineExtensionNames([
   'clipboardData'
 ]);
-html.ClipboardEvent = class ClipboardEvent extends html.Event {
+html$.ClipboardEvent = class ClipboardEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61231,17 +61234,17 @@
     return this.clipboardData;
   }
 };
-dart.setSignature(html.ClipboardEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ClipboardEvent, [])}),
-  fields: () => ({[dartx.clipboardData]: html.DataTransfer})
+dart.setSignature(html$.ClipboardEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ClipboardEvent, [])}),
+  fields: () => ({[dartx.clipboardData]: html$.DataTransfer})
 });
-dart.registerExtension(dart.global.ClipboardEvent, html.ClipboardEvent);
+dart.registerExtension(dart.global.ClipboardEvent, html$.ClipboardEvent);
 dart.defineExtensionNames([
   'code',
   'reason',
   'wasClean'
 ]);
-html.CloseEvent = class CloseEvent extends html.Event {
+html$.CloseEvent = class CloseEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61249,9 +61252,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.CloseEvent._create_1(type, eventInitDict_1);
+      return html$.CloseEvent._create_1(type, eventInitDict_1);
     }
-    return html.CloseEvent._create_2(type);
+    return html$.CloseEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.CloseEvent(type, eventInitDict);
@@ -61269,10 +61272,10 @@
     return this.wasClean;
   }
 };
-dart.setSignature(html.CloseEvent, {
+dart.setSignature(html$.CloseEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.CloseEvent, []),
-    new: dart.definiteFunctionType(html.CloseEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.CloseEvent, []),
+    new: dart.definiteFunctionType(html$.CloseEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.code]: core.int,
@@ -61280,31 +61283,31 @@
     [dartx.wasClean]: core.bool
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.CloseEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.CloseEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CloseEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.CloseEvent, html.CloseEvent);
-html.Comment = class Comment extends html.CharacterData {
+dart.registerExtension(dart.global.CloseEvent, html$.CloseEvent);
+html$.Comment = class Comment extends html$.CharacterData {
   static new(data) {
     if (data === void 0) data = null;
     if (data != null) {
-      return html.document.createComment(data);
+      return html$.document.createComment(data);
     }
-    return html.document.createComment("");
+    return html$.document.createComment("");
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.Comment, {
+dart.setSignature(html$.Comment, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.Comment, [], [core.String]),
-    _: dart.definiteFunctionType(html.Comment, [])
+    new: dart.definiteFunctionType(html$.Comment, [], [core.String]),
+    _: dart.definiteFunctionType(html$.Comment, [])
   })
 });
-dart.registerExtension(dart.global.Comment, html.Comment);
+dart.registerExtension(dart.global.Comment, html$.Comment);
 const _initCompositionEvent = Symbol('_initCompositionEvent');
 const _initUIEvent = Symbol('_initUIEvent');
 const _charCode = Symbol('_charCode');
@@ -61316,16 +61319,16 @@
   'detail',
   'sourceDevice'
 ]);
-html.UIEvent = class UIEvent extends html.Event {
+html$.UIEvent = class UIEvent extends html$.Event {
   static new(type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
     let detail = opts && 'detail' in opts ? opts.detail : 0;
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let e = html.UIEvent._check(html.document[_createEvent]("UIEvent"));
+    let e = html$.UIEvent._check(html$.document[_createEvent]("UIEvent"));
     e[_initUIEvent](type, canBubble, cancelable, view, detail);
     return e;
   }
@@ -61333,9 +61336,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.UIEvent._create_1(type, eventInitDict_1);
+      return html$.UIEvent._create_1(type, eventInitDict_1);
     }
-    return html.UIEvent._create_2(type);
+    return html$.UIEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.UIEvent(type, eventInitDict);
@@ -61356,7 +61359,7 @@
     return this.sourceDevice;
   }
   get [dartx.view]() {
-    return html._convertNativeToDart_Window(this[_get_view]);
+    return html$._convertNativeToDart_Window(this[_get_view]);
   }
   get [_get_view]() {
     return this.view;
@@ -61368,32 +61371,32 @@
     return this.initUIEvent.apply(this, args);
   }
 };
-dart.setSignature(html.UIEvent, {
+dart.setSignature(html$.UIEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.UIEvent, [core.String], {view: html.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
-    _: dart.definiteFunctionType(html.UIEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.UIEvent, [core.String], {view: html$.Window, detail: core.int, canBubble: core.bool, cancelable: core.bool}),
+    _: dart.definiteFunctionType(html$.UIEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [_charCode]: core.int,
     [dartx.detail]: core.int,
     [_keyCode]: core.int,
-    [dartx.sourceDevice]: html.InputDevice,
+    [dartx.sourceDevice]: html$.InputDevice,
     [_get_view]: dart.dynamic,
     [_which]: core.int
   }),
-  getters: () => ({[dartx.view]: dart.definiteFunctionType(html.WindowBase, [])}),
-  methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.int])}),
+  getters: () => ({[dartx.view]: dart.definiteFunctionType(html$.WindowBase, [])}),
+  methods: () => ({[_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.UIEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.UIEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.UIEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.UIEvent, html.UIEvent);
+dart.registerExtension(dart.global.UIEvent, html$.UIEvent);
 dart.defineExtensionNames([
   'data'
 ]);
-html.CompositionEvent = class CompositionEvent extends html.UIEvent {
+html$.CompositionEvent = class CompositionEvent extends html$.UIEvent {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
@@ -61401,9 +61404,9 @@
     let data = opts && 'data' in opts ? opts.data : null;
     let locale = opts && 'locale' in opts ? opts.locale : null;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let e = html.CompositionEvent._check(html.document[_createEvent]("CompositionEvent"));
+    let e = html$.CompositionEvent._check(html$.document[_createEvent]("CompositionEvent"));
     if (dart.test(html_common.Device.isFirefox)) {
       e.initCompositionEvent(type, canBubble, cancelable, view, data, locale);
     } else {
@@ -61415,9 +61418,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.CompositionEvent._create_1(type, eventInitDict_1);
+      return html$.CompositionEvent._create_1(type, eventInitDict_1);
     }
-    return html.CompositionEvent._create_2(type);
+    return html$.CompositionEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.CompositionEvent(type, eventInitDict);
@@ -61432,20 +61435,20 @@
     return this.initCompositionEvent.apply(this, args);
   }
 };
-dart.setSignature(html.CompositionEvent, {
+dart.setSignature(html$.CompositionEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html.Window, data: core.String, locale: core.String}),
-    _: dart.definiteFunctionType(html.CompositionEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.CompositionEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String, locale: core.String}),
+    _: dart.definiteFunctionType(html$.CompositionEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.data]: core.String}),
-  methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.String])}),
+  methods: () => ({[_initCompositionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.CompositionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.CompositionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CompositionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.CompositionEvent, html.CompositionEvent);
+dart.registerExtension(dart.global.CompositionEvent, html$.CompositionEvent);
 dart.defineExtensionNames([
   'disconnect',
   'supports',
@@ -61454,12 +61457,12 @@
   'scrollTop',
   'transform'
 ]);
-html.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
+html$.CompositorProxy = class CompositorProxy extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(element, attributeArray) {
-    return html.CompositorProxy._create_1(element, attributeArray);
+    return html$.CompositorProxy._create_1(element, attributeArray);
   }
   static _create_1(element, attributeArray) {
     return new self.CompositorProxy(element, attributeArray);
@@ -61495,37 +61498,37 @@
     return this.supports.apply(this, args);
   }
 };
-dart.setSignature(html.CompositorProxy, {
+dart.setSignature(html$.CompositorProxy, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.CompositorProxy, []),
-    new: dart.definiteFunctionType(html.CompositorProxy, [html.Element, ListOfString()])
+    _: dart.definiteFunctionType(html$.CompositorProxy, []),
+    new: dart.definiteFunctionType(html$.CompositorProxy, [html$.Element, ListOfString()])
   }),
   fields: () => ({
     [dartx.opacity]: core.num,
     [dartx.scrollLeft]: core.num,
     [dartx.scrollTop]: core.num,
-    [dartx.transform]: html.DomMatrix
+    [dartx.transform]: html$.DomMatrix
   }),
   methods: () => ({
     [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
     [dartx.supports]: dart.definiteFunctionType(core.bool, [core.String])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.CompositorProxy, [dart.dynamic, dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorProxy, [dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.CompositorProxy, html.CompositorProxy);
+dart.registerExtension(dart.global.CompositorProxy, html$.CompositorProxy);
 dart.defineExtensionNames([
   'postMessage',
   'terminate',
   'onError',
   'onMessage'
 ]);
-html.CompositorWorker = class CompositorWorker extends html.EventTarget {
+html$.CompositorWorker = class CompositorWorker extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(scriptUrl) {
-    return html.CompositorWorker._create_1(scriptUrl);
+    return html$.CompositorWorker._create_1(scriptUrl);
   }
   static _create_1(scriptUrl) {
     return new self.CompositorWorker(scriptUrl);
@@ -61551,21 +61554,21 @@
     return this.terminate.apply(this, args);
   }
   get [dartx.onError]() {
-    return html.CompositorWorker.errorEvent.forTarget(this);
+    return html$.CompositorWorker.errorEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.CompositorWorker.messageEvent.forTarget(this);
+    return html$.CompositorWorker.messageEvent.forTarget(this);
   }
 };
-html.CompositorWorker[dart.implements] = () => [html.AbstractWorker];
-dart.setSignature(html.CompositorWorker, {
+html$.CompositorWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.CompositorWorker, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.CompositorWorker, []),
-    new: dart.definiteFunctionType(html.CompositorWorker, [core.String])
+    _: dart.definiteFunctionType(html$.CompositorWorker, []),
+    new: dart.definiteFunctionType(html$.CompositorWorker, [core.String])
   }),
   getters: () => ({
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
   }),
   methods: () => ({
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
@@ -61577,10 +61580,10 @@
     errorEvent: EventStreamProviderOfEvent(),
     messageEvent: EventStreamProviderOfMessageEvent()
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.CompositorWorker, [dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.CompositorWorker, [dart.dynamic])}),
   names: ['_create_1']
 });
-dart.defineLazy(html.CompositorWorker, {
+dart.defineLazy(html$.CompositorWorker, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   },
@@ -61588,7 +61591,7 @@
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.CompositorWorker, html.CompositorWorker);
+dart.registerExtension(dart.global.CompositorWorker, html$.CompositorWorker);
 const _fetch_1 = Symbol('_fetch_1');
 const _fetch_2 = Symbol('_fetch_2');
 const _webkitRequestFileSystem = Symbol('_webkitRequestFileSystem');
@@ -61619,7 +61622,7 @@
   'performance',
   'self'
 ]);
-html.WorkerGlobalScope = class WorkerGlobalScope extends html.EventTarget {
+html$.WorkerGlobalScope = class WorkerGlobalScope extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61722,35 +61725,35 @@
     return this.setTimeout.apply(this, args);
   }
   get [dartx.onError]() {
-    return html.WorkerGlobalScope.errorEvent.forTarget(this);
+    return html$.WorkerGlobalScope.errorEvent.forTarget(this);
   }
 };
-html.WorkerGlobalScope[dart.implements] = () => [html._WindowTimers, html.WindowBase64];
-dart.setSignature(html.WorkerGlobalScope, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WorkerGlobalScope, [])}),
+html$.WorkerGlobalScope[dart.implements] = () => [html$._WindowTimers, html$.WindowBase64];
+dart.setSignature(html$.WorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerGlobalScope, [])}),
   fields: () => ({
-    [dartx.caches]: html.CacheStorage,
-    [dartx.console]: html.WorkerConsole,
-    [dartx.crypto]: html.Crypto,
+    [dartx.caches]: html$.CacheStorage,
+    [dartx.console]: html$.WorkerConsole,
+    [dartx.crypto]: html$.Crypto,
     [dartx.indexedDB]: indexed_db.IdbFactory,
-    [dartx.location]: html._WorkerLocation,
-    [dartx.navigator]: html._WorkerNavigator,
-    [dartx.performance]: html.WorkerPerformance,
-    [dartx.self]: html.WorkerGlobalScope
+    [dartx.location]: html$._WorkerLocation,
+    [dartx.navigator]: html$._WorkerNavigator,
+    [dartx.performance]: html$.WorkerPerformance,
+    [dartx.self]: html$.WorkerGlobalScope
   }),
-  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
     [dartx.fetch]: dart.definiteFunctionType(async.Future, [dart.dynamic], [core.Map]),
     [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
     [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
     [dartx.importScripts]: dart.definiteFunctionType(dart.void, [core.String]),
-    [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html._FileSystemCallback, html._ErrorCallback]),
-    [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html.FileSystem), [core.int, core.int]),
-    [dartx.requestFileSystemSync]: dart.definiteFunctionType(html._DOMFileSystemSync, [core.int, core.int]),
-    [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html._EntrySync, [core.String]),
-    [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html._EntryCallback], [html._ErrorCallback]),
-    [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String]),
+    [_webkitRequestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$._FileSystemCallback, html$._ErrorCallback]),
+    [dartx.webkitRequestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
+    [dartx.requestFileSystemSync]: dart.definiteFunctionType(html$._DOMFileSystemSync, [core.int, core.int]),
+    [dartx.resolveLocalFileSystemSyncUrl]: dart.definiteFunctionType(html$._EntrySync, [core.String]),
+    [_webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
+    [dartx.webkitResolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
     [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
     [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
@@ -61766,21 +61769,21 @@
     TEMPORARY: core.int
   })
 });
-html.WorkerGlobalScope.PERSISTENT = 1;
-html.WorkerGlobalScope.TEMPORARY = 0;
-dart.defineLazy(html.WorkerGlobalScope, {
+html$.WorkerGlobalScope.PERSISTENT = 1;
+html$.WorkerGlobalScope.TEMPORARY = 0;
+dart.defineLazy(html$.WorkerGlobalScope, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   }
 });
-dart.registerExtension(dart.global.WorkerGlobalScope, html.WorkerGlobalScope);
+dart.registerExtension(dart.global.WorkerGlobalScope, html$.WorkerGlobalScope);
 dart.defineExtensionNames([
   'cancelAnimationFrame',
   'postMessage',
   'requestAnimationFrame',
   'onMessage'
 ]);
-html.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html.WorkerGlobalScope {
+html$.CompositorWorkerGlobalScope = class CompositorWorkerGlobalScope extends html$.WorkerGlobalScope {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61808,36 +61811,36 @@
     return this.requestAnimationFrame.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
+    return html$.CompositorWorkerGlobalScope.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.CompositorWorkerGlobalScope, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CompositorWorkerGlobalScope, [])}),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+dart.setSignature(html$.CompositorWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CompositorWorkerGlobalScope, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
     [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
     [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html.FrameRequestCallback])
+    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback])
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.CompositorWorkerGlobalScope, {
+dart.defineLazy(html$.CompositorWorkerGlobalScope, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html.CompositorWorkerGlobalScope);
+dart.registerExtension(dart.global.CompositorWorkerGlobalScope, html$.CompositorWorkerGlobalScope);
 const _isConsoleDefined = Symbol('_isConsoleDefined');
-html.Console = class Console extends core.Object {
+html$.Console = class Console extends core.Object {
   _safe() {
   }
   get [_isConsoleDefined]() {
     return typeof console != "undefined";
   }
   get memory() {
-    return html.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
+    return html$.MemoryInfo._check(dart.test(this[_isConsoleDefined]) ? console.memory : null);
   }
   assertCondition(condition, arg) {
     return dart.test(this[_isConsoleDefined]) ? console.assertCondition(condition, arg) : null;
@@ -61906,15 +61909,15 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.defineNamedConstructor(html.Console, '_safe');
-dart.setSignature(html.Console, {
+dart.defineNamedConstructor(html$.Console, '_safe');
+dart.setSignature(html$.Console, {
   constructors: () => ({
-    _safe: dart.definiteFunctionType(html.Console, []),
-    _: dart.definiteFunctionType(html.Console, [])
+    _safe: dart.definiteFunctionType(html$.Console, []),
+    _: dart.definiteFunctionType(html$.Console, [])
   }),
   getters: () => ({
     [_isConsoleDefined]: dart.definiteFunctionType(core.bool, []),
-    memory: dart.definiteFunctionType(html.MemoryInfo, [])
+    memory: dart.definiteFunctionType(html$.MemoryInfo, [])
   }),
   methods: () => ({
     assertCondition: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
@@ -61939,11 +61942,11 @@
     trace: dart.definiteFunctionType(dart.void, [core.Object]),
     warn: dart.definiteFunctionType(dart.void, [core.Object])
   }),
-  sfields: () => ({_safeConsole: html.Console})
+  sfields: () => ({_safeConsole: html$.Console})
 });
-dart.defineLazy(html.Console, {
+dart.defineLazy(html$.Console, {
   get _safeConsole() {
-    return dart.const(new html.Console._safe());
+    return dart.const(new html$.Console._safe());
   }
 });
 dart.defineExtensionNames([
@@ -61951,7 +61954,7 @@
   'timeline',
   'timelineEnd'
 ]);
-html.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
+html$.ConsoleBase = class ConsoleBase extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -61965,32 +61968,32 @@
     return this.timelineEnd.apply(this, args);
   }
 };
-dart.setSignature(html.ConsoleBase, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ConsoleBase, [])}),
+dart.setSignature(html$.ConsoleBase, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ConsoleBase, [])}),
   methods: () => ({
     [dartx.assertCondition]: dart.definiteFunctionType(dart.void, [core.bool, core.Object]),
     [dartx.timeline]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.timelineEnd]: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.registerExtension(dart.global.ConsoleBase, html.ConsoleBase);
+dart.registerExtension(dart.global.ConsoleBase, html$.ConsoleBase);
 dart.defineExtensionNames([
   'getDistributedNodes',
   'select'
 ]);
-html.ContentElement = class ContentElement extends html.HtmlElement {
+html$.ContentElement = class ContentElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ContentElement._check(html.document[dartx.createElement]("content"));
+    return html$.ContentElement._check(html$.document[dartx.createElement]("content"));
   }
   created() {
     this[dartx.select] = null;
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('content');
+    return html$.Element.isTagSupported('content');
   }
   get [dartx.select]() {
     return this.select;
@@ -62002,18 +62005,18 @@
     return this.getDistributedNodes.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.ContentElement, 'created');
-dart.setSignature(html.ContentElement, {
+dart.defineNamedConstructor(html$.ContentElement, 'created');
+dart.setSignature(html$.ContentElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ContentElement, []),
-    new: dart.definiteFunctionType(html.ContentElement, []),
-    created: dart.definiteFunctionType(html.ContentElement, [])
+    _: dart.definiteFunctionType(html$.ContentElement, []),
+    new: dart.definiteFunctionType(html$.ContentElement, []),
+    created: dart.definiteFunctionType(html$.ContentElement, [])
   }),
   fields: () => ({[dartx.select]: core.String}),
-  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html.Node), [])}),
+  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLContentElement, html.ContentElement);
+dart.registerExtension(dart.global.HTMLContentElement, html$.ContentElement);
 dart.defineExtensionNames([
   'accuracy',
   'altitude',
@@ -62023,7 +62026,7 @@
   'longitude',
   'speed'
 ]);
-html.Coordinates = class Coordinates extends _interceptors.Interceptor {
+html$.Coordinates = class Coordinates extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62049,8 +62052,8 @@
     return this.speed;
   }
 };
-dart.setSignature(html.Coordinates, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Coordinates, [])}),
+dart.setSignature(html$.Coordinates, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Coordinates, [])}),
   fields: () => ({
     [dartx.accuracy]: core.double,
     [dartx.altitude]: core.double,
@@ -62061,14 +62064,14 @@
     [dartx.speed]: core.double
   })
 });
-dart.registerExtension(dart.global.Coordinates, html.Coordinates);
+dart.registerExtension(dart.global.Coordinates, html$.Coordinates);
 dart.defineExtensionNames([
   'iconUrl',
   'id',
   'name',
   'type'
 ]);
-html.Credential = class Credential extends _interceptors.Interceptor {
+html$.Credential = class Credential extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62085,8 +62088,8 @@
     return this.type;
   }
 };
-dart.setSignature(html.Credential, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Credential, [])}),
+dart.setSignature(html$.Credential, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Credential, [])}),
   fields: () => ({
     [dartx.iconUrl]: core.String,
     [dartx.id]: core.String,
@@ -62094,7 +62097,7 @@
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.Credential, html.Credential);
+dart.registerExtension(dart.global.Credential, html$.Credential);
 const _request_1 = Symbol('_request_1');
 const _request_2 = Symbol('_request_2');
 dart.defineExtensionNames([
@@ -62102,7 +62105,7 @@
   'request',
   'requireUserMediation'
 ]);
-html.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
+html$.CredentialsContainer = class CredentialsContainer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62127,22 +62130,22 @@
     return this.requireUserMediation.apply(this, args);
   }
 };
-dart.setSignature(html.CredentialsContainer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CredentialsContainer, [])}),
+dart.setSignature(html$.CredentialsContainer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CredentialsContainer, [])}),
   methods: () => ({
-    [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html.Credential]),
+    [dartx.notifySignedIn]: dart.definiteFunctionType(async.Future, [html$.Credential]),
     [dartx.request]: dart.definiteFunctionType(async.Future, [], [core.Map]),
     [_request_1]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
     [_request_2]: dart.definiteFunctionType(async.Future, []),
     [dartx.requireUserMediation]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.CredentialsContainer, html.CredentialsContainer);
+dart.registerExtension(dart.global.CredentialsContainer, html$.CredentialsContainer);
 dart.defineExtensionNames([
   'acceptConnection',
   'client'
 ]);
-html.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html.Event {
+html$.CrossOriginConnectEvent = class CrossOriginConnectEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62153,18 +62156,18 @@
     return this.acceptConnection.apply(this, args);
   }
 };
-dart.setSignature(html.CrossOriginConnectEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CrossOriginConnectEvent, [])}),
-  fields: () => ({[dartx.client]: html.CrossOriginServiceWorkerClient}),
+dart.setSignature(html$.CrossOriginConnectEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginConnectEvent, [])}),
+  fields: () => ({[dartx.client]: html$.CrossOriginServiceWorkerClient}),
   methods: () => ({[dartx.acceptConnection]: dart.definiteFunctionType(dart.void, [async.Future])})
 });
-dart.registerExtension(dart.global.CrossOriginConnectEvent, html.CrossOriginConnectEvent);
+dart.registerExtension(dart.global.CrossOriginConnectEvent, html$.CrossOriginConnectEvent);
 dart.defineExtensionNames([
   'postMessage',
   'origin',
   'targetUrl'
 ]);
-html.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html.EventTarget {
+html$.CrossOriginServiceWorkerClient = class CrossOriginServiceWorkerClient extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62192,8 +62195,8 @@
     return this.postMessage.apply(this, args);
   }
 };
-dart.setSignature(html.CrossOriginServiceWorkerClient, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CrossOriginServiceWorkerClient, [])}),
+dart.setSignature(html$.CrossOriginServiceWorkerClient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CrossOriginServiceWorkerClient, [])}),
   fields: () => ({
     [dartx.origin]: core.String,
     [dartx.targetUrl]: core.String
@@ -62204,13 +62207,13 @@
     [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html.CrossOriginServiceWorkerClient);
+dart.registerExtension(dart.global.CrossOriginServiceWorkerClient, html$.CrossOriginServiceWorkerClient);
 const _getRandomValues = Symbol('_getRandomValues');
 dart.defineExtensionNames([
   'getRandomValues',
   'subtle'
 ]);
-html.Crypto = class Crypto extends _interceptors.Interceptor {
+html$.Crypto = class Crypto extends _interceptors.Interceptor {
   [dartx.getRandomValues](array) {
     return this[_getRandomValues](array);
   }
@@ -62227,23 +62230,23 @@
     return this.getRandomValues.apply(this, args);
   }
 };
-dart.setSignature(html.Crypto, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Crypto, [])}),
-  fields: () => ({[dartx.subtle]: html._SubtleCrypto}),
+dart.setSignature(html$.Crypto, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Crypto, [])}),
+  fields: () => ({[dartx.subtle]: html$._SubtleCrypto}),
   methods: () => ({
     [dartx.getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData]),
     [_getRandomValues]: dart.definiteFunctionType(typed_data.TypedData, [typed_data.TypedData])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.Crypto, html.Crypto);
+dart.registerExtension(dart.global.Crypto, html$.Crypto);
 dart.defineExtensionNames([
   'algorithm',
   'extractable',
   'type',
   'usages'
 ]);
-html.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
+html$.CryptoKey = class CryptoKey extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62260,8 +62263,8 @@
     return this.usages;
   }
 };
-dart.setSignature(html.CryptoKey, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CryptoKey, [])}),
+dart.setSignature(html$.CryptoKey, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CryptoKey, [])}),
   fields: () => ({
     [dartx.algorithm]: core.Object,
     [dartx.extractable]: core.bool,
@@ -62269,28 +62272,28 @@
     [dartx.usages]: ListOfString()
   })
 });
-dart.registerExtension(dart.global.CryptoKey, html.CryptoKey);
-html.Css = class Css extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.CryptoKey, html$.CryptoKey);
+html$.Css = class Css extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.Css, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Css, [])}),
+dart.setSignature(html$.Css, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Css, [])}),
   statics: () => ({
     supports: dart.definiteFunctionType(core.bool, [core.String, core.String]),
     supportsCondition: dart.definiteFunctionType(core.bool, [core.String])
   }),
   names: ['supports', 'supportsCondition']
 });
-dart.registerExtension(dart.global.CSS, html.Css);
+dart.registerExtension(dart.global.CSS, html$.Css);
 dart.defineExtensionNames([
   'cssText',
   'parentRule',
   'parentStyleSheet',
   'type'
 ]);
-html.CssRule = class CssRule extends _interceptors.Interceptor {
+html$.CssRule = class CssRule extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62310,12 +62313,12 @@
     return this.type;
   }
 };
-dart.setSignature(html.CssRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssRule, [])}),
+dart.setSignature(html$.CssRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssRule, [])}),
   fields: () => ({
     [dartx.cssText]: core.String,
-    [dartx.parentRule]: html.CssRule,
-    [dartx.parentStyleSheet]: html.CssStyleSheet,
+    [dartx.parentRule]: html$.CssRule,
+    [dartx.parentStyleSheet]: html$.CssStyleSheet,
     [dartx.type]: core.int
   }),
   sfields: () => ({
@@ -62333,23 +62336,23 @@
     WEBKIT_KEYFRAME_RULE: core.int
   })
 });
-html.CssRule.CHARSET_RULE = 2;
-html.CssRule.FONT_FACE_RULE = 5;
-html.CssRule.IMPORT_RULE = 3;
-html.CssRule.KEYFRAMES_RULE = 7;
-html.CssRule.KEYFRAME_RULE = 8;
-html.CssRule.MEDIA_RULE = 4;
-html.CssRule.PAGE_RULE = 6;
-html.CssRule.STYLE_RULE = 1;
-html.CssRule.SUPPORTS_RULE = 12;
-html.CssRule.VIEWPORT_RULE = 15;
-html.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
-html.CssRule.WEBKIT_KEYFRAME_RULE = 8;
-dart.registerExtension(dart.global.CSSRule, html.CssRule);
+html$.CssRule.CHARSET_RULE = 2;
+html$.CssRule.FONT_FACE_RULE = 5;
+html$.CssRule.IMPORT_RULE = 3;
+html$.CssRule.KEYFRAMES_RULE = 7;
+html$.CssRule.KEYFRAME_RULE = 8;
+html$.CssRule.MEDIA_RULE = 4;
+html$.CssRule.PAGE_RULE = 6;
+html$.CssRule.STYLE_RULE = 1;
+html$.CssRule.SUPPORTS_RULE = 12;
+html$.CssRule.VIEWPORT_RULE = 15;
+html$.CssRule.WEBKIT_KEYFRAMES_RULE = 7;
+html$.CssRule.WEBKIT_KEYFRAME_RULE = 8;
+dart.registerExtension(dart.global.CSSRule, html$.CssRule);
 dart.defineExtensionNames([
   'encoding'
 ]);
-html.CssCharsetRule = class CssCharsetRule extends html.CssRule {
+html$.CssCharsetRule = class CssCharsetRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62360,15 +62363,15 @@
     this.encoding = value;
   }
 };
-dart.setSignature(html.CssCharsetRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssCharsetRule, [])}),
+dart.setSignature(html$.CssCharsetRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssCharsetRule, [])}),
   fields: () => ({[dartx.encoding]: core.String})
 });
-dart.registerExtension(dart.global.CSSCharsetRule, html.CssCharsetRule);
+dart.registerExtension(dart.global.CSSCharsetRule, html$.CssCharsetRule);
 dart.defineExtensionNames([
   'style'
 ]);
-html.CssFontFaceRule = class CssFontFaceRule extends html.CssRule {
+html$.CssFontFaceRule = class CssFontFaceRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62376,17 +62379,17 @@
     return this.style;
   }
 };
-dart.setSignature(html.CssFontFaceRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssFontFaceRule, [])}),
-  fields: () => ({[dartx.style]: html.CssStyleDeclaration})
+dart.setSignature(html$.CssFontFaceRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssFontFaceRule, [])}),
+  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
 });
-dart.registerExtension(dart.global.CSSFontFaceRule, html.CssFontFaceRule);
+dart.registerExtension(dart.global.CSSFontFaceRule, html$.CssFontFaceRule);
 dart.defineExtensionNames([
   'deleteRule',
   'insertRule',
   'cssRules'
 ]);
-html.CssGroupingRule = class CssGroupingRule extends html.CssRule {
+html$.CssGroupingRule = class CssGroupingRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62400,21 +62403,21 @@
     return this.insertRule.apply(this, args);
   }
 };
-dart.setSignature(html.CssGroupingRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssGroupingRule, [])}),
+dart.setSignature(html$.CssGroupingRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssGroupingRule, [])}),
   fields: () => ({[dartx.cssRules]: ListOfCssRule()}),
   methods: () => ({
     [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
   })
 });
-dart.registerExtension(dart.global.CSSGroupingRule, html.CssGroupingRule);
+dart.registerExtension(dart.global.CSSGroupingRule, html$.CssGroupingRule);
 dart.defineExtensionNames([
   'href',
   'media',
   'styleSheet'
 ]);
-html.CssImportRule = class CssImportRule extends html.CssRule {
+html$.CssImportRule = class CssImportRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62428,20 +62431,20 @@
     return this.styleSheet;
   }
 };
-dart.setSignature(html.CssImportRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssImportRule, [])}),
+dart.setSignature(html$.CssImportRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssImportRule, [])}),
   fields: () => ({
     [dartx.href]: core.String,
-    [dartx.media]: html.MediaList,
-    [dartx.styleSheet]: html.CssStyleSheet
+    [dartx.media]: html$.MediaList,
+    [dartx.styleSheet]: html$.CssStyleSheet
   })
 });
-dart.registerExtension(dart.global.CSSImportRule, html.CssImportRule);
+dart.registerExtension(dart.global.CSSImportRule, html$.CssImportRule);
 dart.defineExtensionNames([
   'keyText',
   'style'
 ]);
-html.CssKeyframeRule = class CssKeyframeRule extends html.CssRule {
+html$.CssKeyframeRule = class CssKeyframeRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62455,16 +62458,16 @@
     return this.style;
   }
 };
-dart.setSignature(html.CssKeyframeRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssKeyframeRule, [])}),
+dart.setSignature(html$.CssKeyframeRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframeRule, [])}),
   fields: () => ({
     [dartx.keyText]: core.String,
-    [dartx.style]: html.CssStyleDeclaration
+    [dartx.style]: html$.CssStyleDeclaration
   })
 });
-dart.registerExtension(dart.global.CSSKeyframeRule, html.CssKeyframeRule);
-dart.registerExtension(dart.global.MozCSSKeyframeRule, html.CssKeyframeRule);
-dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html.CssKeyframeRule);
+dart.registerExtension(dart.global.CSSKeyframeRule, html$.CssKeyframeRule);
+dart.registerExtension(dart.global.MozCSSKeyframeRule, html$.CssKeyframeRule);
+dart.registerExtension(dart.global.WebKitCSSKeyframeRule, html$.CssKeyframeRule);
 dart.defineExtensionNames([
   'appendRule',
   'deleteRule',
@@ -62472,7 +62475,7 @@
   'cssRules',
   'name'
 ]);
-html.CssKeyframesRule = class CssKeyframesRule extends html.CssRule {
+html$.CssKeyframesRule = class CssKeyframesRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62498,26 +62501,26 @@
     return this.findRule.apply(this, args);
   }
 };
-dart.setSignature(html.CssKeyframesRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssKeyframesRule, [])}),
+dart.setSignature(html$.CssKeyframesRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssKeyframesRule, [])}),
   fields: () => ({
     [dartx.cssRules]: ListOfCssRule(),
     [dartx.name]: core.String
   }),
   methods: () => ({
-    [__getter__]: dart.definiteFunctionType(html.CssKeyframeRule, [core.int]),
+    [__getter__]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.int]),
     [dartx.appendRule]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.deleteRule]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.findRule]: dart.definiteFunctionType(html.CssKeyframeRule, [core.String])
+    [dartx.findRule]: dart.definiteFunctionType(html$.CssKeyframeRule, [core.String])
   })
 });
-dart.registerExtension(dart.global.CSSKeyframesRule, html.CssKeyframesRule);
-dart.registerExtension(dart.global.MozCSSKeyframesRule, html.CssKeyframesRule);
-dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html.CssKeyframesRule);
+dart.registerExtension(dart.global.CSSKeyframesRule, html$.CssKeyframesRule);
+dart.registerExtension(dart.global.MozCSSKeyframesRule, html$.CssKeyframesRule);
+dart.registerExtension(dart.global.WebKitCSSKeyframesRule, html$.CssKeyframesRule);
 dart.defineExtensionNames([
   'media'
 ]);
-html.CssMediaRule = class CssMediaRule extends html.CssGroupingRule {
+html$.CssMediaRule = class CssMediaRule extends html$.CssGroupingRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62525,16 +62528,16 @@
     return this.media;
   }
 };
-dart.setSignature(html.CssMediaRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssMediaRule, [])}),
-  fields: () => ({[dartx.media]: html.MediaList})
+dart.setSignature(html$.CssMediaRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssMediaRule, [])}),
+  fields: () => ({[dartx.media]: html$.MediaList})
 });
-dart.registerExtension(dart.global.CSSMediaRule, html.CssMediaRule);
+dart.registerExtension(dart.global.CSSMediaRule, html$.CssMediaRule);
 dart.defineExtensionNames([
   'selectorText',
   'style'
 ]);
-html.CssPageRule = class CssPageRule extends html.CssRule {
+html$.CssPageRule = class CssPageRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -62548,14 +62551,14 @@
     return this.style;
   }
 };
-dart.setSignature(html.CssPageRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssPageRule, [])}),
+dart.setSignature(html$.CssPageRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssPageRule, [])}),
   fields: () => ({
     [dartx.selectorText]: core.String,
-    [dartx.style]: html.CssStyleDeclaration
+    [dartx.style]: html$.CssStyleDeclaration
   })
 });
-dart.registerExtension(dart.global.CSSPageRule, html.CssPageRule);
+dart.registerExtension(dart.global.CSSPageRule, html$.CssPageRule);
 const _getPropertyValueHelper = Symbol('_getPropertyValueHelper');
 const _supportsProperty = Symbol('_supportsProperty');
 const _getPropertyValue = Symbol('_getPropertyValue');
@@ -62591,7 +62594,7 @@
 const _borderWidth = Symbol('_borderWidth');
 const _bottom = Symbol('_bottom');
 const _captionSide = Symbol('_captionSide');
-const _clear = Symbol('_clear');
+const _clear$1 = Symbol('_clear');
 const _clip = Symbol('_clip');
 const _color = Symbol('_color');
 const _content = Symbol('_content');
@@ -62605,7 +62608,7 @@
 const _fontStyle = Symbol('_fontStyle');
 const _fontVariant = Symbol('_fontVariant');
 const _fontWeight = Symbol('_fontWeight');
-const _height = Symbol('_height');
+const _height$ = Symbol('_height');
 const _left = Symbol('_left');
 const _letterSpacing = Symbol('_letterSpacing');
 const _lineHeight = Symbol('_lineHeight');
@@ -62635,7 +62638,7 @@
 const _pageBreakAfter = Symbol('_pageBreakAfter');
 const _pageBreakBefore = Symbol('_pageBreakBefore');
 const _pageBreakInside = Symbol('_pageBreakInside');
-const _position = Symbol('_position');
+const _position$1 = Symbol('_position');
 const _quotes = Symbol('_quotes');
 const _right = Symbol('_right');
 const _tableLayout = Symbol('_tableLayout');
@@ -62648,7 +62651,7 @@
 const _verticalAlign = Symbol('_verticalAlign');
 const _visibility = Symbol('_visibility');
 const _whiteSpace = Symbol('_whiteSpace');
-const _width = Symbol('_width');
+const _width$ = Symbol('_width');
 const _wordSpacing = Symbol('_wordSpacing');
 const _zIndex = Symbol('_zIndex');
 dart.defineExtensionNames([
@@ -63337,7 +63340,7 @@
   'zoom',
   'zoom'
 ]);
-html.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
+html$.CssStyleDeclarationBase = class CssStyleDeclarationBase extends core.Object {
   get alignContent() {
     return this[dartx.getPropertyValue]('align-content');
   }
@@ -65391,7 +65394,7 @@
     this[dartx.setProperty]('zoom', value, '');
   }
 };
-dart.setSignature(html.CssStyleDeclarationBase, {
+dart.setSignature(html$.CssStyleDeclarationBase, {
   getters: () => ({
     alignContent: dart.definiteFunctionType(core.String, []),
     alignItems: dart.definiteFunctionType(core.String, []),
@@ -66081,7 +66084,7 @@
     zoom: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.defineExtensionMembers(html.CssStyleDeclarationBase, [
+dart.defineExtensionMembers(html$.CssStyleDeclarationBase, [
   'alignContent',
   'alignContent',
   'alignItems',
@@ -66958,12 +66961,12 @@
   'length',
   'parentRule'
 ]);
-html.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html.CssStyleDeclarationBase) {
+html$.CssStyleDeclaration = class CssStyleDeclaration extends dart.mixin(_interceptors.Interceptor, html$.CssStyleDeclarationBase) {
   static new() {
-    return html.CssStyleDeclaration.css('');
+    return html$.CssStyleDeclaration.css('');
   }
   static css(css) {
-    let style = html.Element.tag('div')[dartx.style];
+    let style = html$.Element.tag('div')[dartx.style];
     style[dartx.cssText] = css;
     return style;
   }
@@ -66972,14 +66975,14 @@
     return propValue != null ? propValue : '';
   }
   [_getPropertyValueHelper](propertyName) {
-    if (dart.test(this[_supportsProperty](html.CssStyleDeclaration._camelCase(propertyName)))) {
+    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
       return this[_getPropertyValue](propertyName);
     } else {
       return this[_getPropertyValue](dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName));
     }
   }
   [dartx.supportsProperty](propertyName) {
-    return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
+    return dart.test(this[_supportsProperty](propertyName)) || dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName))));
   }
   [_supportsProperty](propertyName) {
     return propertyName in this;
@@ -66989,21 +66992,21 @@
     return this[_setPropertyHelper](this[_browserPropertyName](propertyName), value, priority);
   }
   [_browserPropertyName](propertyName) {
-    let name = html.CssStyleDeclaration._readCache(propertyName);
+    let name = html$.CssStyleDeclaration._readCache(propertyName);
     if (typeof name == 'string') return name;
-    if (dart.test(this[_supportsProperty](html.CssStyleDeclaration._camelCase(propertyName)))) {
+    if (dart.test(this[_supportsProperty](html$.CssStyleDeclaration._camelCase(propertyName)))) {
       name = propertyName;
     } else {
       name = dart.notNull(html_common.Device.cssPrefix) + dart.notNull(propertyName);
     }
-    html.CssStyleDeclaration._writeCache(propertyName, name);
+    html$.CssStyleDeclaration._writeCache(propertyName, name);
     return name;
   }
   static _readCache(key) {
-    return html.CssStyleDeclaration._propertyCache[key];
+    return html$.CssStyleDeclaration._propertyCache[key];
   }
   static _writeCache(key, value) {
-    html.CssStyleDeclaration._propertyCache[key] = value;
+    html$.CssStyleDeclaration._propertyCache[key] = value;
   }
   static _camelCase(hyphenated) {
     let replacedMs = hyphenated.replace(/^-ms-/, "ms-");
@@ -67016,7 +67019,7 @@
     this.setProperty(propertyName, value, priority);
   }
   static get supportsTransitions() {
-    return html.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
+    return html$.document[dartx.body][dartx.style][dartx.supportsProperty]('transition');
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -67406,15 +67409,15 @@
     this.captionSide = value;
   }
   get [dartx.clear]() {
-    return this[_clear];
+    return this[_clear$1];
   }
   set [dartx.clear](value) {
-    this[_clear] = value == null ? '' : value;
+    this[_clear$1] = value == null ? '' : value;
   }
-  get [_clear]() {
+  get [_clear$1]() {
     return this.clear;
   }
-  set [_clear](value) {
+  set [_clear$1](value) {
     this.clear = value;
   }
   get [dartx.clip]() {
@@ -67574,15 +67577,15 @@
     this.fontWeight = value;
   }
   get [dartx.height]() {
-    return this[_height];
+    return this[_height$];
   }
   set [dartx.height](value) {
-    this[_height] = value == null ? '' : value;
+    this[_height$] = value == null ? '' : value;
   }
-  get [_height]() {
+  get [_height$]() {
     return this.height;
   }
-  set [_height](value) {
+  set [_height$](value) {
     this.height = value;
   }
   get [dartx.left]() {
@@ -67934,15 +67937,15 @@
     this.pageBreakInside = value;
   }
   get [dartx.position]() {
-    return this[_position];
+    return this[_position$1];
   }
   set [dartx.position](value) {
-    this[_position] = value == null ? '' : value;
+    this[_position$1] = value == null ? '' : value;
   }
-  get [_position]() {
+  get [_position$1]() {
     return this.position;
   }
-  set [_position](value) {
+  set [_position$1](value) {
     this.position = value;
   }
   get [dartx.quotes]() {
@@ -68090,15 +68093,15 @@
     this.whiteSpace = value;
   }
   get [dartx.width]() {
-    return this[_width];
+    return this[_width$];
   }
   set [dartx.width](value) {
-    this[_width] = value == null ? '' : value;
+    this[_width$] = value == null ? '' : value;
   }
-  get [_width]() {
+  get [_width$]() {
     return this.width;
   }
-  set [_width](value) {
+  set [_width$](value) {
     this.width = value;
   }
   get [dartx.wordSpacing]() {
@@ -68126,16 +68129,16 @@
     this.zIndex = value;
   }
 };
-dart.setSignature(html.CssStyleDeclaration, {
+dart.setSignature(html$.CssStyleDeclaration, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.CssStyleDeclaration, []),
-    css: dart.definiteFunctionType(html.CssStyleDeclaration, [core.String]),
-    _: dart.definiteFunctionType(html.CssStyleDeclaration, [])
+    new: dart.definiteFunctionType(html$.CssStyleDeclaration, []),
+    css: dart.definiteFunctionType(html$.CssStyleDeclaration, [core.String]),
+    _: dart.definiteFunctionType(html$.CssStyleDeclaration, [])
   }),
   fields: () => ({
     [dartx.cssText]: core.String,
     [dartx.length]: core.int,
-    [dartx.parentRule]: html.CssRule,
+    [dartx.parentRule]: html$.CssRule,
     [_background]: core.String,
     [_backgroundAttachment]: core.String,
     [_backgroundColor]: core.String,
@@ -68166,7 +68169,7 @@
     [_borderWidth]: core.String,
     [_bottom]: core.String,
     [_captionSide]: core.String,
-    [_clear]: core.String,
+    [_clear$1]: core.String,
     [_clip]: core.String,
     [_color]: core.String,
     [_content]: core.String,
@@ -68180,7 +68183,7 @@
     [_fontStyle]: core.String,
     [_fontVariant]: core.String,
     [_fontWeight]: core.String,
-    [_height]: core.String,
+    [_height$]: core.String,
     [_left]: core.String,
     [_letterSpacing]: core.String,
     [_lineHeight]: core.String,
@@ -68210,7 +68213,7 @@
     [_pageBreakAfter]: core.String,
     [_pageBreakBefore]: core.String,
     [_pageBreakInside]: core.String,
-    [_position]: core.String,
+    [_position$1]: core.String,
     [_quotes]: core.String,
     [_right]: core.String,
     [_tableLayout]: core.String,
@@ -68223,7 +68226,7 @@
     [_verticalAlign]: core.String,
     [_visibility]: core.String,
     [_whiteSpace]: core.String,
-    [_width]: core.String,
+    [_width$]: core.String,
     [_wordSpacing]: core.String,
     [_zIndex]: core.String
   }),
@@ -68249,22 +68252,22 @@
   }),
   names: ['_readCache', '_writeCache', '_camelCase']
 });
-dart.defineLazy(html.CssStyleDeclaration, {
+dart.defineLazy(html$.CssStyleDeclaration, {
   get _propertyCache() {
     return {};
   }
 });
-dart.registerExtension(dart.global.CSSStyleDeclaration, html.CssStyleDeclaration);
-dart.registerExtension(dart.global.MSStyleCSSProperties, html.CssStyleDeclaration);
-dart.registerExtension(dart.global.CSS2Properties, html.CssStyleDeclaration);
+dart.registerExtension(dart.global.CSSStyleDeclaration, html$.CssStyleDeclaration);
+dart.registerExtension(dart.global.MSStyleCSSProperties, html$.CssStyleDeclaration);
+dart.registerExtension(dart.global.CSS2Properties, html$.CssStyleDeclaration);
 const _elementIterable = Symbol('_elementIterable');
 const _elementCssStyleDeclarationSetIterable = Symbol('_elementCssStyleDeclarationSetIterable');
 const _setAll = Symbol('_setAll');
-html._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html.CssStyleDeclarationBase) {
+html$._CssStyleDeclarationSet = class _CssStyleDeclarationSet extends dart.mixin(core.Object, html$.CssStyleDeclarationBase) {
   new(elementIterable) {
     this[_elementIterable] = elementIterable;
     this[_elementCssStyleDeclarationSetIterable] = null;
-    this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html.CssStyleDeclaration)(dart.fn(e => html.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
+    this[_elementCssStyleDeclarationSetIterable] = core.List.from(this[_elementIterable])[dartx.map](html$.CssStyleDeclaration)(dart.fn(e => html$.CssStyleDeclaration._check(dart.dload(e, 'style')), dynamicToCssStyleDeclaration()));
   }
   getPropertyValue(propertyName) {
     return this[_elementCssStyleDeclarationSetIterable][dartx.first][dartx.getPropertyValue](propertyName);
@@ -68820,8 +68823,8 @@
     return super.zIndex;
   }
 };
-dart.setSignature(html._CssStyleDeclarationSet, {
-  constructors: () => ({new: dart.definiteFunctionType(html._CssStyleDeclarationSet, [IterableOfElement()])}),
+dart.setSignature(html$._CssStyleDeclarationSet, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CssStyleDeclarationSet, [IterableOfElement()])}),
   fields: () => ({
     [_elementIterable]: IterableOfElement(),
     [_elementCssStyleDeclarationSetIterable]: IterableOfCssStyleDeclaration()
@@ -68832,7 +68835,7 @@
     [_setAll]: dart.definiteFunctionType(dart.void, [core.String, core.String])
   })
 });
-dart.defineExtensionMembers(html._CssStyleDeclarationSet, [
+dart.defineExtensionMembers(html$._CssStyleDeclarationSet, [
   'getPropertyValue',
   'setProperty',
   'background',
@@ -68930,7 +68933,7 @@
   'selectorText',
   'style'
 ]);
-html.CssStyleRule = class CssStyleRule extends html.CssRule {
+html$.CssStyleRule = class CssStyleRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -68944,14 +68947,14 @@
     return this.style;
   }
 };
-dart.setSignature(html.CssStyleRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssStyleRule, [])}),
+dart.setSignature(html$.CssStyleRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleRule, [])}),
   fields: () => ({
     [dartx.selectorText]: core.String,
-    [dartx.style]: html.CssStyleDeclaration
+    [dartx.style]: html$.CssStyleDeclaration
   })
 });
-dart.registerExtension(dart.global.CSSStyleRule, html.CssStyleRule);
+dart.registerExtension(dart.global.CSSStyleRule, html$.CssStyleRule);
 dart.defineExtensionNames([
   'disabled',
   'href',
@@ -68961,7 +68964,7 @@
   'title',
   'type'
 ]);
-html.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
+html$.StyleSheet = class StyleSheet extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -68990,19 +68993,19 @@
     return this.type;
   }
 };
-dart.setSignature(html.StyleSheet, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StyleSheet, [])}),
+dart.setSignature(html$.StyleSheet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StyleSheet, [])}),
   fields: () => ({
     [dartx.disabled]: core.bool,
     [dartx.href]: core.String,
-    [dartx.media]: html.MediaList,
-    [dartx.ownerNode]: html.Node,
-    [dartx.parentStyleSheet]: html.StyleSheet,
+    [dartx.media]: html$.MediaList,
+    [dartx.ownerNode]: html$.Node,
+    [dartx.parentStyleSheet]: html$.StyleSheet,
     [dartx.title]: core.String,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.StyleSheet, html.StyleSheet);
+dart.registerExtension(dart.global.StyleSheet, html$.StyleSheet);
 dart.defineExtensionNames([
   'addRule',
   'deleteRule',
@@ -69012,7 +69015,7 @@
   'ownerRule',
   'rules'
 ]);
-html.CssStyleSheet = class CssStyleSheet extends html.StyleSheet {
+html$.CssStyleSheet = class CssStyleSheet extends html$.StyleSheet {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69038,11 +69041,11 @@
     return this.removeRule.apply(this, args);
   }
 };
-dart.setSignature(html.CssStyleSheet, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssStyleSheet, [])}),
+dart.setSignature(html$.CssStyleSheet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssStyleSheet, [])}),
   fields: () => ({
     [dartx.cssRules]: ListOfCssRule(),
-    [dartx.ownerRule]: html.CssRule,
+    [dartx.ownerRule]: html$.CssRule,
     [dartx.rules]: ListOfCssRule()
   }),
   methods: () => ({
@@ -69052,14 +69055,14 @@
     [dartx.removeRule]: dart.definiteFunctionType(dart.void, [core.int])
   })
 });
-dart.registerExtension(dart.global.CSSStyleSheet, html.CssStyleSheet);
+dart.registerExtension(dart.global.CSSStyleSheet, html$.CssStyleSheet);
 dart.defineExtensionNames([
   'deleteRule',
   'insertRule',
   'conditionText',
   'cssRules'
 ]);
-html.CssSupportsRule = class CssSupportsRule extends html.CssRule {
+html$.CssSupportsRule = class CssSupportsRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69076,8 +69079,8 @@
     return this.insertRule.apply(this, args);
   }
 };
-dart.setSignature(html.CssSupportsRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssSupportsRule, [])}),
+dart.setSignature(html$.CssSupportsRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssSupportsRule, [])}),
   fields: () => ({
     [dartx.conditionText]: core.String,
     [dartx.cssRules]: ListOfCssRule()
@@ -69087,11 +69090,11 @@
     [dartx.insertRule]: dart.definiteFunctionType(core.int, [core.String, core.int])
   })
 });
-dart.registerExtension(dart.global.CSSSupportsRule, html.CssSupportsRule);
+dart.registerExtension(dart.global.CSSSupportsRule, html$.CssSupportsRule);
 dart.defineExtensionNames([
   'style'
 ]);
-html.CssViewportRule = class CssViewportRule extends html.CssRule {
+html$.CssViewportRule = class CssViewportRule extends html$.CssRule {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69099,11 +69102,11 @@
     return this.style;
   }
 };
-dart.setSignature(html.CssViewportRule, {
-  constructors: () => ({_: dart.definiteFunctionType(html.CssViewportRule, [])}),
-  fields: () => ({[dartx.style]: html.CssStyleDeclaration})
+dart.setSignature(html$.CssViewportRule, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.CssViewportRule, [])}),
+  fields: () => ({[dartx.style]: html$.CssStyleDeclaration})
 });
-dart.registerExtension(dart.global.CSSViewportRule, html.CssViewportRule);
+dart.registerExtension(dart.global.CSSViewportRule, html$.CssViewportRule);
 const _dartDetail = Symbol('_dartDetail');
 const _initCustomEvent = Symbol('_initCustomEvent');
 const _detail = Symbol('_detail');
@@ -69111,7 +69114,7 @@
 dart.defineExtensionNames([
   'detail'
 ]);
-html.CustomEvent = class CustomEvent extends html.Event {
+html$.CustomEvent = class CustomEvent extends html$.Event {
   get [_dartDetail]() {
     return this._dartDetail;
   }
@@ -69122,7 +69125,7 @@
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
     let detail = opts && 'detail' in opts ? opts.detail : null;
-    let e = html.CustomEvent._check(html.document[_createEvent]('CustomEvent'));
+    let e = html$.CustomEvent._check(html$.document[_createEvent]('CustomEvent'));
     e[_dartDetail] = detail;
     if (core.List.is(detail) || core.Map.is(detail) || typeof detail == 'string' || typeof detail == 'number') {
       try {
@@ -69147,9 +69150,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.CustomEvent._create_1(type, eventInitDict_1);
+      return html$.CustomEvent._create_1(type, eventInitDict_1);
     }
-    return html.CustomEvent._create_2(type);
+    return html$.CustomEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.CustomEvent(type, eventInitDict);
@@ -69167,10 +69170,10 @@
     return this.initCustomEvent.apply(this, args);
   }
 };
-dart.setSignature(html.CustomEvent, {
+dart.setSignature(html$.CustomEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
-    _: dart.definiteFunctionType(html.CustomEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.CustomEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, detail: core.Object}),
+    _: dart.definiteFunctionType(html$.CustomEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [_dartDetail]: dart.dynamic,
@@ -69182,64 +69185,64 @@
   }),
   methods: () => ({[_initCustomEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.CustomEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.CustomEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.CustomEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.CustomEvent, html.CustomEvent);
-html.DListElement = class DListElement extends html.HtmlElement {
+dart.registerExtension(dart.global.CustomEvent, html$.CustomEvent);
+html$.DListElement = class DListElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.DListElement._check(html.document[dartx.createElement]("dl"));
+    return html$.DListElement._check(html$.document[dartx.createElement]("dl"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.DListElement, 'created');
-dart.setSignature(html.DListElement, {
+dart.defineNamedConstructor(html$.DListElement, 'created');
+dart.setSignature(html$.DListElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DListElement, []),
-    new: dart.definiteFunctionType(html.DListElement, []),
-    created: dart.definiteFunctionType(html.DListElement, [])
+    _: dart.definiteFunctionType(html$.DListElement, []),
+    new: dart.definiteFunctionType(html$.DListElement, []),
+    created: dart.definiteFunctionType(html$.DListElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLDListElement, html.DListElement);
+dart.registerExtension(dart.global.HTMLDListElement, html$.DListElement);
 dart.defineExtensionNames([
   'options'
 ]);
-html.DataListElement = class DataListElement extends html.HtmlElement {
+html$.DataListElement = class DataListElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.DataListElement._check(html.document[dartx.createElement]("datalist"));
+    return html$.DataListElement._check(html$.document[dartx.createElement]("datalist"));
   }
   created() {
     this[dartx.options] = null;
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('datalist');
+    return html$.Element.isTagSupported('datalist');
   }
   get [dartx.options]() {
     return this.options;
   }
 };
-dart.defineNamedConstructor(html.DataListElement, 'created');
-dart.setSignature(html.DataListElement, {
+dart.defineNamedConstructor(html$.DataListElement, 'created');
+dart.setSignature(html$.DataListElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DataListElement, []),
-    new: dart.definiteFunctionType(html.DataListElement, []),
-    created: dart.definiteFunctionType(html.DataListElement, [])
+    _: dart.definiteFunctionType(html$.DataListElement, []),
+    new: dart.definiteFunctionType(html$.DataListElement, []),
+    created: dart.definiteFunctionType(html$.DataListElement, [])
   }),
   fields: () => ({[dartx.options]: ListOfNode()}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLDataListElement, html.DataListElement);
+dart.registerExtension(dart.global.HTMLDataListElement, html$.DataListElement);
 dart.defineExtensionNames([
   'clearData',
   'getData',
@@ -69251,7 +69254,7 @@
   'items',
   'types'
 ]);
-html.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
+html$.DataTransfer = class DataTransfer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69289,23 +69292,23 @@
     return this.setDragImage.apply(this, args);
   }
 };
-dart.setSignature(html.DataTransfer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DataTransfer, [])}),
+dart.setSignature(html$.DataTransfer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransfer, [])}),
   fields: () => ({
     [dartx.dropEffect]: core.String,
     [dartx.effectAllowed]: core.String,
     [dartx.files]: ListOfFile(),
-    [dartx.items]: html.DataTransferItemList,
+    [dartx.items]: html$.DataTransferItemList,
     [dartx.types]: ListOfString()
   }),
   methods: () => ({
     [dartx.clearData]: dart.definiteFunctionType(dart.void, [], [core.String]),
     [dartx.getData]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.setData]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-    [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html.Element, core.int, core.int])
+    [dartx.setDragImage]: dart.definiteFunctionType(dart.void, [html$.Element, core.int, core.int])
   })
 });
-dart.registerExtension(dart.global.DataTransfer, html.DataTransfer);
+dart.registerExtension(dart.global.DataTransfer, html$.DataTransfer);
 const _getAsString = Symbol('_getAsString');
 dart.defineExtensionNames([
   'getAsFile',
@@ -69314,7 +69317,7 @@
   'kind',
   'type'
 ]);
-html.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
+html$.DataTransferItem = class DataTransferItem extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69341,20 +69344,20 @@
     return this.webkitGetAsEntry.apply(this, args);
   }
 };
-dart.setSignature(html.DataTransferItem, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DataTransferItem, [])}),
+dart.setSignature(html$.DataTransferItem, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItem, [])}),
   fields: () => ({
     [dartx.kind]: core.String,
     [dartx.type]: core.String
   }),
   methods: () => ({
-    [dartx.getAsFile]: dart.definiteFunctionType(html.Blob, []),
-    [_getAsString]: dart.definiteFunctionType(dart.void, [html._StringCallback]),
+    [dartx.getAsFile]: dart.definiteFunctionType(html$.Blob, []),
+    [_getAsString]: dart.definiteFunctionType(dart.void, [html$._StringCallback]),
     [dartx.getAsString]: dart.definiteFunctionType(async.Future$(core.String), []),
-    [dartx.getAsEntry]: dart.definiteFunctionType(html.Entry, [])
+    [dartx.getAsEntry]: dart.definiteFunctionType(html$.Entry, [])
   })
 });
-dart.registerExtension(dart.global.DataTransferItem, html.DataTransferItem);
+dart.registerExtension(dart.global.DataTransferItem, html$.DataTransferItem);
 dart.defineExtensionNames([
   'add',
   'addData',
@@ -69365,7 +69368,7 @@
   '_get',
   'length'
 ]);
-html.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
+html$.DataTransferItemList = class DataTransferItemList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69394,26 +69397,26 @@
     return this[index];
   }
 };
-dart.setSignature(html.DataTransferItemList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DataTransferItemList, [])}),
+dart.setSignature(html$.DataTransferItemList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DataTransferItemList, [])}),
   fields: () => ({[dartx.length]: core.int}),
   methods: () => ({
-    [dartx.add]: dart.definiteFunctionType(html.DataTransferItem, [dart.dynamic], [core.String]),
-    [dartx.addData]: dart.definiteFunctionType(html.DataTransferItem, [core.String, core.String]),
-    [dartx.addFile]: dart.definiteFunctionType(html.DataTransferItem, [html.File]),
+    [dartx.add]: dart.definiteFunctionType(html$.DataTransferItem, [dart.dynamic], [core.String]),
+    [dartx.addData]: dart.definiteFunctionType(html$.DataTransferItem, [core.String, core.String]),
+    [dartx.addFile]: dart.definiteFunctionType(html$.DataTransferItem, [html$.File]),
     [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-    [dartx.item]: dart.definiteFunctionType(html.DataTransferItem, [core.int]),
+    [dartx.item]: dart.definiteFunctionType(html$.DataTransferItem, [core.int]),
     [dartx.remove]: dart.definiteFunctionType(dart.void, [core.int]),
-    [dartx._get]: dart.definiteFunctionType(html.DataTransferItem, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.DataTransferItem, [core.int])
   })
 });
-dart.registerExtension(dart.global.DataTransferItemList, html.DataTransferItemList);
-html.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
+dart.registerExtension(dart.global.DataTransferItemList, html$.DataTransferItemList);
+html$.DatabaseCallback = dart.typedef('DatabaseCallback', () => dart.functionType(dart.void, [web_sql.SqlDatabase]));
 dart.defineExtensionNames([
   'postMessage',
   'onMessage'
 ]);
-html.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html.WorkerGlobalScope {
+html$.DedicatedWorkerGlobalScope = class DedicatedWorkerGlobalScope extends html$.WorkerGlobalScope {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69435,12 +69438,12 @@
     return this.postMessage.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
+    return html$.DedicatedWorkerGlobalScope.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.DedicatedWorkerGlobalScope, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DedicatedWorkerGlobalScope, [])}),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+dart.setSignature(html$.DedicatedWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DedicatedWorkerGlobalScope, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
     [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, ListOfMessagePort()]),
@@ -69448,16 +69451,16 @@
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.DedicatedWorkerGlobalScope, {
+dart.defineLazy(html$.DedicatedWorkerGlobalScope, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html.DedicatedWorkerGlobalScope);
+dart.registerExtension(dart.global.DedicatedWorkerGlobalScope, html$.DedicatedWorkerGlobalScope);
 dart.defineExtensionNames([
   'session'
 ]);
-html.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html.Event {
+html$.DefaultSessionStartEvent = class DefaultSessionStartEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69465,9 +69468,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
+      return html$.DefaultSessionStartEvent._create_1(type, eventInitDict_1);
     }
-    return html.DefaultSessionStartEvent._create_2(type);
+    return html$.DefaultSessionStartEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.DefaultSessionStartEvent(type, eventInitDict);
@@ -69479,24 +69482,24 @@
     return this.session;
   }
 };
-dart.setSignature(html.DefaultSessionStartEvent, {
+dart.setSignature(html$.DefaultSessionStartEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DefaultSessionStartEvent, []),
-    new: dart.definiteFunctionType(html.DefaultSessionStartEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.DefaultSessionStartEvent, []),
+    new: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.session]: html.PresentationSession}),
+  fields: () => ({[dartx.session]: html$.PresentationSession}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.DefaultSessionStartEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DefaultSessionStartEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.DefaultSessionStartEvent, html.DefaultSessionStartEvent);
+dart.registerExtension(dart.global.DefaultSessionStartEvent, html$.DefaultSessionStartEvent);
 dart.defineExtensionNames([
   'queryUsageAndQuota',
   'requestQuota'
 ]);
-html.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
+html$.DeprecatedStorageInfo = class DeprecatedStorageInfo extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69507,25 +69510,25 @@
     return this.requestQuota.apply(this, args);
   }
 };
-dart.setSignature(html.DeprecatedStorageInfo, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DeprecatedStorageInfo, [])}),
+dart.setSignature(html$.DeprecatedStorageInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageInfo, [])}),
   methods: () => ({
-    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html.StorageUsageCallback, html.StorageErrorCallback]),
-    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html.StorageQuotaCallback, html.StorageErrorCallback])
+    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageUsageCallback, html$.StorageErrorCallback]),
+    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int, core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
   }),
   sfields: () => ({
     PERSISTENT: core.int,
     TEMPORARY: core.int
   })
 });
-html.DeprecatedStorageInfo.PERSISTENT = 1;
-html.DeprecatedStorageInfo.TEMPORARY = 0;
-dart.registerExtension(dart.global.DeprecatedStorageInfo, html.DeprecatedStorageInfo);
+html$.DeprecatedStorageInfo.PERSISTENT = 1;
+html$.DeprecatedStorageInfo.TEMPORARY = 0;
+dart.registerExtension(dart.global.DeprecatedStorageInfo, html$.DeprecatedStorageInfo);
 dart.defineExtensionNames([
   'queryUsageAndQuota',
   'requestQuota'
 ]);
-html.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
+html$.DeprecatedStorageQuota = class DeprecatedStorageQuota extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69536,30 +69539,30 @@
     return this.requestQuota.apply(this, args);
   }
 };
-dart.setSignature(html.DeprecatedStorageQuota, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DeprecatedStorageQuota, [])}),
+dart.setSignature(html$.DeprecatedStorageQuota, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeprecatedStorageQuota, [])}),
   methods: () => ({
-    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html.StorageUsageCallback], [html.StorageErrorCallback]),
-    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html.StorageQuotaCallback, html.StorageErrorCallback])
+    [dartx.queryUsageAndQuota]: dart.definiteFunctionType(dart.void, [html$.StorageUsageCallback], [html$.StorageErrorCallback]),
+    [dartx.requestQuota]: dart.definiteFunctionType(dart.void, [core.int], [html$.StorageQuotaCallback, html$.StorageErrorCallback])
   })
 });
-dart.registerExtension(dart.global.DeprecatedStorageQuota, html.DeprecatedStorageQuota);
+dart.registerExtension(dart.global.DeprecatedStorageQuota, html$.DeprecatedStorageQuota);
 dart.defineExtensionNames([
   'open'
 ]);
-html.DetailsElement = class DetailsElement extends html.HtmlElement {
+html$.DetailsElement = class DetailsElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.DetailsElement._check(html.document[dartx.createElement]("details"));
+    return html$.DetailsElement._check(html$.document[dartx.createElement]("details"));
   }
   created() {
     this[dartx.open] = null;
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('details');
+    return html$.Element.isTagSupported('details');
   }
   get [dartx.open]() {
     return this.open;
@@ -69568,23 +69571,23 @@
     this.open = value;
   }
 };
-dart.defineNamedConstructor(html.DetailsElement, 'created');
-dart.setSignature(html.DetailsElement, {
+dart.defineNamedConstructor(html$.DetailsElement, 'created');
+dart.setSignature(html$.DetailsElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DetailsElement, []),
-    new: dart.definiteFunctionType(html.DetailsElement, []),
-    created: dart.definiteFunctionType(html.DetailsElement, [])
+    _: dart.definiteFunctionType(html$.DetailsElement, []),
+    new: dart.definiteFunctionType(html$.DetailsElement, []),
+    created: dart.definiteFunctionType(html$.DetailsElement, [])
   }),
   fields: () => ({[dartx.open]: core.bool}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLDetailsElement, html.DetailsElement);
+dart.registerExtension(dart.global.HTMLDetailsElement, html$.DetailsElement);
 dart.defineExtensionNames([
   'x',
   'y',
   'z'
 ]);
-html.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
+html$.DeviceAcceleration = class DeviceAcceleration extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69598,19 +69601,19 @@
     return this.z;
   }
 };
-dart.setSignature(html.DeviceAcceleration, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DeviceAcceleration, [])}),
+dart.setSignature(html$.DeviceAcceleration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceAcceleration, [])}),
   fields: () => ({
     [dartx.x]: core.double,
     [dartx.y]: core.double,
     [dartx.z]: core.double
   })
 });
-dart.registerExtension(dart.global.DeviceAcceleration, html.DeviceAcceleration);
+dart.registerExtension(dart.global.DeviceAcceleration, html$.DeviceAcceleration);
 dart.defineExtensionNames([
   'value'
 ]);
-html.DeviceLightEvent = class DeviceLightEvent extends html.Event {
+html$.DeviceLightEvent = class DeviceLightEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69618,9 +69621,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.DeviceLightEvent._create_1(type, eventInitDict_1);
+      return html$.DeviceLightEvent._create_1(type, eventInitDict_1);
     }
-    return html.DeviceLightEvent._create_2(type);
+    return html$.DeviceLightEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.DeviceLightEvent(type, eventInitDict);
@@ -69632,19 +69635,19 @@
     return this.value;
   }
 };
-dart.setSignature(html.DeviceLightEvent, {
+dart.setSignature(html$.DeviceLightEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DeviceLightEvent, []),
-    new: dart.definiteFunctionType(html.DeviceLightEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.DeviceLightEvent, []),
+    new: dart.definiteFunctionType(html$.DeviceLightEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.value]: core.double}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.DeviceLightEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DeviceLightEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.DeviceLightEvent, html.DeviceLightEvent);
+dart.registerExtension(dart.global.DeviceLightEvent, html$.DeviceLightEvent);
 dart.defineExtensionNames([
   'initDeviceMotionEvent',
   'acceleration',
@@ -69652,7 +69655,7 @@
   'interval',
   'rotationRate'
 ]);
-html.DeviceMotionEvent = class DeviceMotionEvent extends html.Event {
+html$.DeviceMotionEvent = class DeviceMotionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69672,17 +69675,17 @@
     return this.initDeviceMotionEvent.apply(this, args);
   }
 };
-dart.setSignature(html.DeviceMotionEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DeviceMotionEvent, [])}),
+dart.setSignature(html$.DeviceMotionEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceMotionEvent, [])}),
   fields: () => ({
-    [dartx.acceleration]: html.DeviceAcceleration,
-    [dartx.accelerationIncludingGravity]: html.DeviceAcceleration,
+    [dartx.acceleration]: html$.DeviceAcceleration,
+    [dartx.accelerationIncludingGravity]: html$.DeviceAcceleration,
     [dartx.interval]: core.double,
-    [dartx.rotationRate]: html.DeviceRotationRate
+    [dartx.rotationRate]: html$.DeviceRotationRate
   }),
-  methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.DeviceAcceleration, html.DeviceAcceleration, html.DeviceRotationRate, core.num])})
+  methods: () => ({[dartx.initDeviceMotionEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.DeviceAcceleration, html$.DeviceAcceleration, html$.DeviceRotationRate, core.num])})
 });
-dart.registerExtension(dart.global.DeviceMotionEvent, html.DeviceMotionEvent);
+dart.registerExtension(dart.global.DeviceMotionEvent, html$.DeviceMotionEvent);
 const _initDeviceOrientationEvent = Symbol('_initDeviceOrientationEvent');
 dart.defineExtensionNames([
   'absolute',
@@ -69690,7 +69693,7 @@
   'beta',
   'gamma'
 ]);
-html.DeviceOrientationEvent = class DeviceOrientationEvent extends html.Event {
+html$.DeviceOrientationEvent = class DeviceOrientationEvent extends html$.Event {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
@@ -69698,7 +69701,7 @@
     let beta = opts && 'beta' in opts ? opts.beta : 0;
     let gamma = opts && 'gamma' in opts ? opts.gamma : 0;
     let absolute = opts && 'absolute' in opts ? opts.absolute : false;
-    let e = html.DeviceOrientationEvent._check(html.document[_createEvent]("DeviceOrientationEvent"));
+    let e = html$.DeviceOrientationEvent._check(html$.document[_createEvent]("DeviceOrientationEvent"));
     e[_initDeviceOrientationEvent](type, canBubble, cancelable, alpha, beta, gamma, absolute);
     return e;
   }
@@ -69721,10 +69724,10 @@
     return this.initDeviceOrientationEvent.apply(this, args);
   }
 };
-dart.setSignature(html.DeviceOrientationEvent, {
+dart.setSignature(html$.DeviceOrientationEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
-    _: dart.definiteFunctionType(html.DeviceOrientationEvent, [])
+    new: dart.definiteFunctionType(html$.DeviceOrientationEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, alpha: core.num, beta: core.num, gamma: core.num, absolute: core.bool}),
+    _: dart.definiteFunctionType(html$.DeviceOrientationEvent, [])
   }),
   fields: () => ({
     [dartx.absolute]: core.bool,
@@ -69734,13 +69737,13 @@
   }),
   methods: () => ({[_initDeviceOrientationEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.num, core.num, core.num, core.bool])})
 });
-dart.registerExtension(dart.global.DeviceOrientationEvent, html.DeviceOrientationEvent);
+dart.registerExtension(dart.global.DeviceOrientationEvent, html$.DeviceOrientationEvent);
 dart.defineExtensionNames([
   'alpha',
   'beta',
   'gamma'
 ]);
-html.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
+html$.DeviceRotationRate = class DeviceRotationRate extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69754,15 +69757,15 @@
     return this.gamma;
   }
 };
-dart.setSignature(html.DeviceRotationRate, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DeviceRotationRate, [])}),
+dart.setSignature(html$.DeviceRotationRate, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DeviceRotationRate, [])}),
   fields: () => ({
     [dartx.alpha]: core.double,
     [dartx.beta]: core.double,
     [dartx.gamma]: core.double
   })
 });
-dart.registerExtension(dart.global.DeviceRotationRate, html.DeviceRotationRate);
+dart.registerExtension(dart.global.DeviceRotationRate, html$.DeviceRotationRate);
 dart.defineExtensionNames([
   'close',
   'show',
@@ -69770,7 +69773,7 @@
   'open',
   'returnValue'
 ]);
-html.DialogElement = class DialogElement extends html.HtmlElement {
+html$.DialogElement = class DialogElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69801,11 +69804,11 @@
     return this.showModal.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.DialogElement, 'created');
-dart.setSignature(html.DialogElement, {
+dart.defineNamedConstructor(html$.DialogElement, 'created');
+dart.setSignature(html$.DialogElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DialogElement, []),
-    created: dart.definiteFunctionType(html.DialogElement, [])
+    _: dart.definiteFunctionType(html$.DialogElement, []),
+    created: dart.definiteFunctionType(html$.DialogElement, [])
   }),
   fields: () => ({
     [dartx.open]: core.bool,
@@ -69817,7 +69820,7 @@
     [dartx.showModal]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.HTMLDialogElement, html.DialogElement);
+dart.registerExtension(dart.global.HTMLDialogElement, html$.DialogElement);
 const _getDirectory = Symbol('_getDirectory');
 const _getFile = Symbol('_getFile');
 const __getDirectory_1 = Symbol('__getDirectory_1');
@@ -69835,7 +69838,7 @@
 const _getMetadata = Symbol('_getMetadata');
 const _getParent = Symbol('_getParent');
 const _moveTo = Symbol('_moveTo');
-const _remove = Symbol('_remove');
+const _remove$ = Symbol('_remove');
 dart.defineExtensionNames([
   'copyTo',
   'getMetadata',
@@ -69849,7 +69852,7 @@
   'isFile',
   'name'
 ]);
-html.Entry = class Entry extends _interceptors.Interceptor {
+html$.Entry = class Entry extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -69918,12 +69921,12 @@
       }, FileErrorToNull())});
     return completer.future;
   }
-  [_remove](...args) {
+  [_remove$](...args) {
     return this.remove.apply(this, args);
   }
   [dartx.remove]() {
     let completer = async.Completer.new();
-    this[_remove](dart.fn(() => {
+    this[_remove$](dart.fn(() => {
       completer.complete();
     }, VoidToNull()), dart.fn(error => {
       completer.completeError(error);
@@ -69934,30 +69937,30 @@
     return this.toURL.apply(this, args);
   }
 };
-dart.setSignature(html.Entry, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Entry, [])}),
+dart.setSignature(html$.Entry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Entry, [])}),
   fields: () => ({
-    [dartx.filesystem]: html.FileSystem,
+    [dartx.filesystem]: html$.FileSystem,
     [dartx.fullPath]: core.String,
     [dartx.isDirectory]: core.bool,
     [dartx.isFile]: core.bool,
     [dartx.name]: core.String
   }),
   methods: () => ({
-    [_copyTo]: dart.definiteFunctionType(dart.void, [html.DirectoryEntry], {name: core.String, successCallback: html._EntryCallback, errorCallback: html._ErrorCallback}),
-    [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html.Entry), [html.DirectoryEntry], {name: core.String}),
-    [_getMetadata]: dart.definiteFunctionType(dart.void, [html.MetadataCallback], [html._ErrorCallback]),
-    [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html.Metadata), []),
-    [_getParent]: dart.definiteFunctionType(dart.void, [], [html._EntryCallback, html._ErrorCallback]),
-    [dartx.getParent]: dart.definiteFunctionType(async.Future$(html.Entry), []),
-    [_moveTo]: dart.definiteFunctionType(dart.void, [html.DirectoryEntry], {name: core.String, successCallback: html._EntryCallback, errorCallback: html._ErrorCallback}),
-    [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html.Entry), [html.DirectoryEntry], {name: core.String}),
-    [_remove]: dart.definiteFunctionType(dart.void, [html.VoidCallback], [html._ErrorCallback]),
+    [_copyTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [dartx.copyTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
+    [_getMetadata]: dart.definiteFunctionType(dart.void, [html$.MetadataCallback], [html$._ErrorCallback]),
+    [dartx.getMetadata]: dart.definiteFunctionType(async.Future$(html$.Metadata), []),
+    [_getParent]: dart.definiteFunctionType(dart.void, [], [html$._EntryCallback, html$._ErrorCallback]),
+    [dartx.getParent]: dart.definiteFunctionType(async.Future$(html$.Entry), []),
+    [_moveTo]: dart.definiteFunctionType(dart.void, [html$.DirectoryEntry], {name: core.String, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [dartx.moveTo]: dart.definiteFunctionType(async.Future$(html$.Entry), [html$.DirectoryEntry], {name: core.String}),
+    [_remove$]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
     [dartx.remove]: dart.definiteFunctionType(async.Future, []),
     [dartx.toUrl]: dart.definiteFunctionType(core.String, [])
   })
 });
-dart.registerExtension(dart.global.Entry, html.Entry);
+dart.registerExtension(dart.global.Entry, html$.Entry);
 dart.defineExtensionNames([
   'createDirectory',
   'getDirectory',
@@ -69966,7 +69969,7 @@
   'createReader',
   'removeRecursively'
 ]);
-html.DirectoryEntry = class DirectoryEntry extends html.Entry {
+html$.DirectoryEntry = class DirectoryEntry extends html$.Entry {
   [dartx.createDirectory](path, opts) {
     let exclusive = opts && 'exclusive' in opts ? opts.exclusive : false;
     return this[_getDirectory](path, {options: dart.map({create: true, exclusive: exclusive}, core.String, core.bool)});
@@ -70088,36 +70091,36 @@
     return completer.future;
   }
 };
-dart.setSignature(html.DirectoryEntry, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DirectoryEntry, [])}),
+dart.setSignature(html$.DirectoryEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryEntry, [])}),
   methods: () => ({
-    [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String], {exclusive: core.bool}),
-    [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String]),
-    [dartx.createFile]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String], {exclusive: core.bool}),
-    [dartx.getFile]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String]),
-    [dartx.createReader]: dart.definiteFunctionType(html.DirectoryReader, []),
-    [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html._EntryCallback, errorCallback: html._ErrorCallback}),
-    [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html._EntryCallback, html._ErrorCallback]),
-    [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html._EntryCallback]),
+    [dartx.createDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
+    [dartx.getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.createFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {exclusive: core.bool}),
+    [dartx.getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
+    [dartx.createReader]: dart.definiteFunctionType(html$.DirectoryReader, []),
+    [__getDirectory]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [__getDirectory_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
+    [__getDirectory_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
     [__getDirectory_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
     [__getDirectory_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [_getDirectory]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String], {options: core.Map}),
-    [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html._EntryCallback, errorCallback: html._ErrorCallback}),
-    [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html._EntryCallback, html._ErrorCallback]),
-    [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html._EntryCallback]),
+    [_getDirectory]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
+    [__getFile]: dart.definiteFunctionType(dart.void, [core.String], {options: core.Map, successCallback: html$._EntryCallback, errorCallback: html$._ErrorCallback}),
+    [__getFile_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback, html$._ErrorCallback]),
+    [__getFile_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, html$._EntryCallback]),
     [__getFile_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
     [__getFile_4]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [_getFile]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String], {options: core.Map}),
-    [_removeRecursively]: dart.definiteFunctionType(dart.void, [html.VoidCallback], [html._ErrorCallback]),
+    [_getFile]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String], {options: core.Map}),
+    [_removeRecursively]: dart.definiteFunctionType(dart.void, [html$.VoidCallback], [html$._ErrorCallback]),
     [dartx.removeRecursively]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.DirectoryEntry, html.DirectoryEntry);
+dart.registerExtension(dart.global.DirectoryEntry, html$.DirectoryEntry);
 const _readEntries = Symbol('_readEntries');
 dart.defineExtensionNames([
   'readEntries'
 ]);
-html.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
+html$.DirectoryReader = class DirectoryReader extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -70134,37 +70137,37 @@
     return completer.future;
   }
 };
-dart.setSignature(html.DirectoryReader, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DirectoryReader, [])}),
+dart.setSignature(html$.DirectoryReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DirectoryReader, [])}),
   methods: () => ({
-    [_readEntries]: dart.definiteFunctionType(dart.void, [html._EntriesCallback], [html._ErrorCallback]),
-    [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html.Entry)), [])
+    [_readEntries]: dart.definiteFunctionType(dart.void, [html$._EntriesCallback], [html$._ErrorCallback]),
+    [dartx.readEntries]: dart.definiteFunctionType(async.Future$(core.List$(html$.Entry)), [])
   })
 });
-dart.registerExtension(dart.global.DirectoryReader, html.DirectoryReader);
-html.DivElement = class DivElement extends html.HtmlElement {
+dart.registerExtension(dart.global.DirectoryReader, html$.DirectoryReader);
+html$.DivElement = class DivElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.DivElement._check(html.document[dartx.createElement]("div"));
+    return html$.DivElement._check(html$.document[dartx.createElement]("div"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.DivElement, 'created');
-dart.setSignature(html.DivElement, {
+dart.defineNamedConstructor(html$.DivElement, 'created');
+dart.setSignature(html$.DivElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DivElement, []),
-    new: dart.definiteFunctionType(html.DivElement, []),
-    created: dart.definiteFunctionType(html.DivElement, [])
+    _: dart.definiteFunctionType(html$.DivElement, []),
+    new: dart.definiteFunctionType(html$.DivElement, []),
+    created: dart.definiteFunctionType(html$.DivElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLDivElement, html.DivElement);
+dart.registerExtension(dart.global.HTMLDivElement, html$.DivElement);
 const _body = Symbol('_body');
 const _get_window = Symbol('_get_window');
-const _head = Symbol('_head');
+const _head$0 = Symbol('_head');
 const _lastModified = Symbol('_lastModified');
 const _preferredStylesheetSet = Symbol('_preferredStylesheetSet');
 const _referrer = Symbol('_referrer');
@@ -70307,7 +70310,7 @@
   'scrollingElement',
   'timeline'
 ]);
-html.Document = class Document extends html.Node {
+html$.Document = class Document extends html$.Node {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -70333,7 +70336,7 @@
     return this.currentScript;
   }
   get [dartx.window]() {
-    return html._convertNativeToDart_Window(this[_get_window]);
+    return html$._convertNativeToDart_Window(this[_get_window]);
   }
   get [_get_window]() {
     return this.defaultView;
@@ -70353,7 +70356,7 @@
   get [dartx.fullscreenEnabled]() {
     return this.fullscreenEnabled;
   }
-  get [_head]() {
+  get [_head$0]() {
     return this.head;
   }
   get [dartx.hidden]() {
@@ -70444,7 +70447,7 @@
     return this.createTextNode.apply(this, args);
   }
   [_createTouch](window, target, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force) {
-    let target_1 = html._convertDartToNative_EventTarget(target);
+    let target_1 = html$._convertDartToNative_EventTarget(target);
     return this[_createTouch_1](window, target_1, identifier, pageX, pageY, screenX, screenY, radiusX, radiusY, rotationAngle, force);
   }
   [_createTouch_1](...args) {
@@ -70526,221 +70529,221 @@
     return this.querySelectorAll.apply(this, args);
   }
   get [dartx.onAbort]() {
-    return html.Element.abortEvent.forTarget(this);
+    return html$.Element.abortEvent.forTarget(this);
   }
   get [dartx.onBeforeCopy]() {
-    return html.Element.beforeCopyEvent.forTarget(this);
+    return html$.Element.beforeCopyEvent.forTarget(this);
   }
   get [dartx.onBeforeCut]() {
-    return html.Element.beforeCutEvent.forTarget(this);
+    return html$.Element.beforeCutEvent.forTarget(this);
   }
   get [dartx.onBeforePaste]() {
-    return html.Element.beforePasteEvent.forTarget(this);
+    return html$.Element.beforePasteEvent.forTarget(this);
   }
   get [dartx.onBlur]() {
-    return html.Element.blurEvent.forTarget(this);
+    return html$.Element.blurEvent.forTarget(this);
   }
   get [dartx.onCanPlay]() {
-    return html.Element.canPlayEvent.forTarget(this);
+    return html$.Element.canPlayEvent.forTarget(this);
   }
   get [dartx.onCanPlayThrough]() {
-    return html.Element.canPlayThroughEvent.forTarget(this);
+    return html$.Element.canPlayThroughEvent.forTarget(this);
   }
   get [dartx.onChange]() {
-    return html.Element.changeEvent.forTarget(this);
+    return html$.Element.changeEvent.forTarget(this);
   }
   get [dartx.onClick]() {
-    return html.Element.clickEvent.forTarget(this);
+    return html$.Element.clickEvent.forTarget(this);
   }
   get [dartx.onContextMenu]() {
-    return html.Element.contextMenuEvent.forTarget(this);
+    return html$.Element.contextMenuEvent.forTarget(this);
   }
   get [dartx.onCopy]() {
-    return html.Element.copyEvent.forTarget(this);
+    return html$.Element.copyEvent.forTarget(this);
   }
   get [dartx.onCut]() {
-    return html.Element.cutEvent.forTarget(this);
+    return html$.Element.cutEvent.forTarget(this);
   }
   get [dartx.onDoubleClick]() {
-    return html.Element.doubleClickEvent.forTarget(this);
+    return html$.Element.doubleClickEvent.forTarget(this);
   }
   get [dartx.onDrag]() {
-    return html.Element.dragEvent.forTarget(this);
+    return html$.Element.dragEvent.forTarget(this);
   }
   get [dartx.onDragEnd]() {
-    return html.Element.dragEndEvent.forTarget(this);
+    return html$.Element.dragEndEvent.forTarget(this);
   }
   get [dartx.onDragEnter]() {
-    return html.Element.dragEnterEvent.forTarget(this);
+    return html$.Element.dragEnterEvent.forTarget(this);
   }
   get [dartx.onDragLeave]() {
-    return html.Element.dragLeaveEvent.forTarget(this);
+    return html$.Element.dragLeaveEvent.forTarget(this);
   }
   get [dartx.onDragOver]() {
-    return html.Element.dragOverEvent.forTarget(this);
+    return html$.Element.dragOverEvent.forTarget(this);
   }
   get [dartx.onDragStart]() {
-    return html.Element.dragStartEvent.forTarget(this);
+    return html$.Element.dragStartEvent.forTarget(this);
   }
   get [dartx.onDrop]() {
-    return html.Element.dropEvent.forTarget(this);
+    return html$.Element.dropEvent.forTarget(this);
   }
   get [dartx.onDurationChange]() {
-    return html.Element.durationChangeEvent.forTarget(this);
+    return html$.Element.durationChangeEvent.forTarget(this);
   }
   get [dartx.onEmptied]() {
-    return html.Element.emptiedEvent.forTarget(this);
+    return html$.Element.emptiedEvent.forTarget(this);
   }
   get [dartx.onEnded]() {
-    return html.Element.endedEvent.forTarget(this);
+    return html$.Element.endedEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.Element.errorEvent.forTarget(this);
+    return html$.Element.errorEvent.forTarget(this);
   }
   get [dartx.onFocus]() {
-    return html.Element.focusEvent.forTarget(this);
+    return html$.Element.focusEvent.forTarget(this);
   }
   get [dartx.onInput]() {
-    return html.Element.inputEvent.forTarget(this);
+    return html$.Element.inputEvent.forTarget(this);
   }
   get [dartx.onInvalid]() {
-    return html.Element.invalidEvent.forTarget(this);
+    return html$.Element.invalidEvent.forTarget(this);
   }
   get [dartx.onKeyDown]() {
-    return html.Element.keyDownEvent.forTarget(this);
+    return html$.Element.keyDownEvent.forTarget(this);
   }
   get [dartx.onKeyPress]() {
-    return html.Element.keyPressEvent.forTarget(this);
+    return html$.Element.keyPressEvent.forTarget(this);
   }
   get [dartx.onKeyUp]() {
-    return html.Element.keyUpEvent.forTarget(this);
+    return html$.Element.keyUpEvent.forTarget(this);
   }
   get [dartx.onLoad]() {
-    return html.Element.loadEvent.forTarget(this);
+    return html$.Element.loadEvent.forTarget(this);
   }
   get [dartx.onLoadedData]() {
-    return html.Element.loadedDataEvent.forTarget(this);
+    return html$.Element.loadedDataEvent.forTarget(this);
   }
   get [dartx.onLoadedMetadata]() {
-    return html.Element.loadedMetadataEvent.forTarget(this);
+    return html$.Element.loadedMetadataEvent.forTarget(this);
   }
   get [dartx.onMouseDown]() {
-    return html.Element.mouseDownEvent.forTarget(this);
+    return html$.Element.mouseDownEvent.forTarget(this);
   }
   get [dartx.onMouseEnter]() {
-    return html.Element.mouseEnterEvent.forTarget(this);
+    return html$.Element.mouseEnterEvent.forTarget(this);
   }
   get [dartx.onMouseLeave]() {
-    return html.Element.mouseLeaveEvent.forTarget(this);
+    return html$.Element.mouseLeaveEvent.forTarget(this);
   }
   get [dartx.onMouseMove]() {
-    return html.Element.mouseMoveEvent.forTarget(this);
+    return html$.Element.mouseMoveEvent.forTarget(this);
   }
   get [dartx.onMouseOut]() {
-    return html.Element.mouseOutEvent.forTarget(this);
+    return html$.Element.mouseOutEvent.forTarget(this);
   }
   get [dartx.onMouseOver]() {
-    return html.Element.mouseOverEvent.forTarget(this);
+    return html$.Element.mouseOverEvent.forTarget(this);
   }
   get [dartx.onMouseUp]() {
-    return html.Element.mouseUpEvent.forTarget(this);
+    return html$.Element.mouseUpEvent.forTarget(this);
   }
   get [dartx.onMouseWheel]() {
-    return html.Element.mouseWheelEvent.forTarget(this);
+    return html$.Element.mouseWheelEvent.forTarget(this);
   }
   get [dartx.onPaste]() {
-    return html.Element.pasteEvent.forTarget(this);
+    return html$.Element.pasteEvent.forTarget(this);
   }
   get [dartx.onPause]() {
-    return html.Element.pauseEvent.forTarget(this);
+    return html$.Element.pauseEvent.forTarget(this);
   }
   get [dartx.onPlay]() {
-    return html.Element.playEvent.forTarget(this);
+    return html$.Element.playEvent.forTarget(this);
   }
   get [dartx.onPlaying]() {
-    return html.Element.playingEvent.forTarget(this);
+    return html$.Element.playingEvent.forTarget(this);
   }
   get [dartx.onPointerLockChange]() {
-    return html.Document.pointerLockChangeEvent.forTarget(this);
+    return html$.Document.pointerLockChangeEvent.forTarget(this);
   }
   get [dartx.onPointerLockError]() {
-    return html.Document.pointerLockErrorEvent.forTarget(this);
+    return html$.Document.pointerLockErrorEvent.forTarget(this);
   }
   get [dartx.onRateChange]() {
-    return html.Element.rateChangeEvent.forTarget(this);
+    return html$.Element.rateChangeEvent.forTarget(this);
   }
   get [dartx.onReadyStateChange]() {
-    return html.Document.readyStateChangeEvent.forTarget(this);
+    return html$.Document.readyStateChangeEvent.forTarget(this);
   }
   get [dartx.onReset]() {
-    return html.Element.resetEvent.forTarget(this);
+    return html$.Element.resetEvent.forTarget(this);
   }
   get [dartx.onResize]() {
-    return html.Element.resizeEvent.forTarget(this);
+    return html$.Element.resizeEvent.forTarget(this);
   }
   get [dartx.onScroll]() {
-    return html.Element.scrollEvent.forTarget(this);
+    return html$.Element.scrollEvent.forTarget(this);
   }
   get [dartx.onSearch]() {
-    return html.Element.searchEvent.forTarget(this);
+    return html$.Element.searchEvent.forTarget(this);
   }
   get [dartx.onSecurityPolicyViolation]() {
-    return html.Document.securityPolicyViolationEvent.forTarget(this);
+    return html$.Document.securityPolicyViolationEvent.forTarget(this);
   }
   get [dartx.onSeeked]() {
-    return html.Element.seekedEvent.forTarget(this);
+    return html$.Element.seekedEvent.forTarget(this);
   }
   get [dartx.onSeeking]() {
-    return html.Element.seekingEvent.forTarget(this);
+    return html$.Element.seekingEvent.forTarget(this);
   }
   get [dartx.onSelect]() {
-    return html.Element.selectEvent.forTarget(this);
+    return html$.Element.selectEvent.forTarget(this);
   }
   get [dartx.onSelectionChange]() {
-    return html.Document.selectionChangeEvent.forTarget(this);
+    return html$.Document.selectionChangeEvent.forTarget(this);
   }
   get [dartx.onSelectStart]() {
-    return html.Element.selectStartEvent.forTarget(this);
+    return html$.Element.selectStartEvent.forTarget(this);
   }
   get [dartx.onStalled]() {
-    return html.Element.stalledEvent.forTarget(this);
+    return html$.Element.stalledEvent.forTarget(this);
   }
   get [dartx.onSubmit]() {
-    return html.Element.submitEvent.forTarget(this);
+    return html$.Element.submitEvent.forTarget(this);
   }
   get [dartx.onSuspend]() {
-    return html.Element.suspendEvent.forTarget(this);
+    return html$.Element.suspendEvent.forTarget(this);
   }
   get [dartx.onTimeUpdate]() {
-    return html.Element.timeUpdateEvent.forTarget(this);
+    return html$.Element.timeUpdateEvent.forTarget(this);
   }
   get [dartx.onTouchCancel]() {
-    return html.Element.touchCancelEvent.forTarget(this);
+    return html$.Element.touchCancelEvent.forTarget(this);
   }
   get [dartx.onTouchEnd]() {
-    return html.Element.touchEndEvent.forTarget(this);
+    return html$.Element.touchEndEvent.forTarget(this);
   }
   get [dartx.onTouchMove]() {
-    return html.Element.touchMoveEvent.forTarget(this);
+    return html$.Element.touchMoveEvent.forTarget(this);
   }
   get [dartx.onTouchStart]() {
-    return html.Element.touchStartEvent.forTarget(this);
+    return html$.Element.touchStartEvent.forTarget(this);
   }
   get [dartx.onVolumeChange]() {
-    return html.Element.volumeChangeEvent.forTarget(this);
+    return html$.Element.volumeChangeEvent.forTarget(this);
   }
   get [dartx.onWaiting]() {
-    return html.Element.waitingEvent.forTarget(this);
+    return html$.Element.waitingEvent.forTarget(this);
   }
   get [dartx.onFullscreenChange]() {
-    return html.Element.fullscreenChangeEvent.forTarget(this);
+    return html$.Element.fullscreenChangeEvent.forTarget(this);
   }
   get [dartx.onFullscreenError]() {
-    return html.Element.fullscreenErrorEvent.forTarget(this);
+    return html$.Element.fullscreenErrorEvent.forTarget(this);
   }
   [dartx.querySelectorAll](T) {
     return selectors => {
-      return new (html._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
     };
   }
   [dartx.query](relativeSelectors) {
@@ -70759,7 +70762,7 @@
   }
   [dartx.createElement](tagName, typeExtension) {
     if (typeExtension === void 0) typeExtension = null;
-    return html.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
+    return html$.Element._check(typeExtension == null ? this[_createElement_2](tagName) : this[_createElement](tagName, typeExtension));
   }
   [_createElement_2](tagName) {
     return this.createElement(tagName);
@@ -70769,7 +70772,7 @@
   }
   [dartx.createElementNS](namespaceURI, qualifiedName, typeExtension) {
     if (typeExtension === void 0) typeExtension = null;
-    return html.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
+    return html$.Element._check(typeExtension == null ? this[_createElementNS_2](namespaceURI, qualifiedName) : this[_createElementNS](namespaceURI, qualifiedName, typeExtension));
   }
   [_createNodeIterator](root, whatToShow, filter) {
     if (whatToShow === void 0) whatToShow = null;
@@ -70785,144 +70788,144 @@
     return this.visibilityState || this.mozVisibilityState || this.msVisibilityState || this.webkitVisibilityState;
   }
 };
-dart.setSignature(html.Document, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Document, [])}),
+dart.setSignature(html$.Document, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Document, [])}),
   fields: () => ({
-    [dartx.activeElement]: html.Element,
-    [_body]: html.HtmlElement,
+    [dartx.activeElement]: html$.Element,
+    [_body]: html$.HtmlElement,
     [dartx.contentType]: core.String,
     [dartx.cookie]: core.String,
-    [dartx.currentScript]: html.ScriptElement,
+    [dartx.currentScript]: html$.ScriptElement,
     [_get_window]: dart.dynamic,
-    [dartx.documentElement]: html.Element,
+    [dartx.documentElement]: html$.Element,
     [dartx.domain]: core.String,
-    [dartx.fonts]: html.FontFaceSet,
-    [dartx.fullscreenElement]: html.Element,
+    [dartx.fonts]: html$.FontFaceSet,
+    [dartx.fullscreenElement]: html$.Element,
     [dartx.fullscreenEnabled]: core.bool,
-    [_head]: html.HeadElement,
+    [_head$0]: html$.HeadElement,
     [dartx.hidden]: core.bool,
-    [dartx.implementation]: html.DomImplementation,
+    [dartx.implementation]: html$.DomImplementation,
     [_lastModified]: core.String,
     [dartx.origin]: core.String,
-    [dartx.pointerLockElement]: html.Element,
+    [dartx.pointerLockElement]: html$.Element,
     [_preferredStylesheetSet]: core.String,
     [dartx.readyState]: core.String,
     [_referrer]: core.String,
-    [dartx.rootElement]: svg.SvgSvgElement,
-    [dartx.scrollingElement]: html.Element,
+    [dartx.rootElement]: svg$.SvgSvgElement,
+    [dartx.scrollingElement]: html$.Element,
     [_selectedStylesheetSet]: core.String,
     [_styleSheets]: ListOfStyleSheet(),
-    [dartx.timeline]: html.AnimationTimeline,
+    [dartx.timeline]: html$.AnimationTimeline,
     [_title]: core.String,
     [_visibilityState]: core.String,
-    [_webkitFullscreenElement]: html.Element,
+    [_webkitFullscreenElement]: html$.Element,
     [_webkitFullscreenEnabled]: core.bool,
     [_webkitHidden]: core.bool,
     [_webkitVisibilityState]: core.String,
     [_childElementCount]: core.int,
     [_children]: ListOfNode(),
-    [_firstElementChild]: html.Element,
-    [_lastElementChild]: html.Element
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
   }),
   getters: () => ({
-    [dartx.window]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html.ClipboardEvent), []),
-    [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html.ClipboardEvent), []),
-    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html.WheelEvent), []),
-    [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html.ClipboardEvent), []),
-    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html.SecurityPolicyViolationEvent), []),
-    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
+    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforeCopy]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforeCut]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBeforePaste]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onCopy]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onCut]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    [dartx.onPaste]: dart.definiteFunctionType(async.Stream$(html$.ClipboardEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPointerLockChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPointerLockError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSecurityPolicyViolation]: dart.definiteFunctionType(async.Stream$(html$.SecurityPolicyViolationEvent), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelectionChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelectStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFullscreenChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFullscreenError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
     [dartx.supportsRegisterElement]: dart.definiteFunctionType(core.bool, []),
     [dartx.supportsRegister]: dart.definiteFunctionType(core.bool, []),
     [dartx.visibilityState]: dart.definiteFunctionType(core.String, [])
   }),
   methods: () => ({
-    [dartx.adoptNode]: dart.definiteFunctionType(html.Node, [html.Node]),
-    [_caretRangeFromPoint]: dart.definiteFunctionType(html.Range, [core.int, core.int]),
-    [dartx.createDocumentFragment]: dart.definiteFunctionType(html.DocumentFragment, []),
-    [_createElement]: dart.definiteFunctionType(html.Element, [core.String], [core.String]),
-    [_createElementNS]: dart.definiteFunctionType(html.Element, [core.String, core.String], [core.String]),
-    [_createEvent]: dart.definiteFunctionType(html.Event, [core.String]),
-    [dartx.createRange]: dart.definiteFunctionType(html.Range, []),
-    [_createTextNode]: dart.definiteFunctionType(html.Text, [core.String]),
-    [_createTouch]: dart.definiteFunctionType(html.Touch, [html.Window, html.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
-    [_createTouch_1]: dart.definiteFunctionType(html.Touch, [html.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    [_createTouchList]: dart.definiteFunctionType(html.TouchList, [html.Touch]),
-    [_elementFromPoint]: dart.definiteFunctionType(html.Element, [core.int, core.int]),
-    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html.Element), [core.int, core.int]),
+    [dartx.adoptNode]: dart.definiteFunctionType(html$.Node, [html$.Node]),
+    [_caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
+    [dartx.createDocumentFragment]: dart.definiteFunctionType(html$.DocumentFragment, []),
+    [_createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
+    [_createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
+    [_createEvent]: dart.definiteFunctionType(html$.Event, [core.String]),
+    [dartx.createRange]: dart.definiteFunctionType(html$.Range, []),
+    [_createTextNode]: dart.definiteFunctionType(html$.Text, [core.String]),
+    [_createTouch]: dart.definiteFunctionType(html$.Touch, [html$.Window, html$.EventTarget, core.int, core.num, core.num, core.num, core.num, core.num, core.num, core.num, core.num]),
+    [_createTouch_1]: dart.definiteFunctionType(html$.Touch, [html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    [_createTouchList]: dart.definiteFunctionType(html$.TouchList, [html$.Touch]),
+    [_elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
     [dartx.execCommand]: dart.definiteFunctionType(core.bool, [core.String], [core.bool, core.String]),
     [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, []),
     [dartx.exitPointerLock]: dart.definiteFunctionType(dart.void, []),
     [_getCssCanvasContext]: dart.definiteFunctionType(core.Object, [core.String, core.String, core.int, core.int]),
-    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
-    [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
-    [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
-    [dartx.importNode]: dart.definiteFunctionType(html.Node, [html.Node], [core.bool]),
+    [dartx.getElementsByClassName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.getElementsByName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.getElementsByTagName]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.importNode]: dart.definiteFunctionType(html$.Node, [html$.Node], [core.bool]),
     [dartx.queryCommandEnabled]: dart.definiteFunctionType(core.bool, [core.String]),
     [dartx.queryCommandIndeterm]: dart.definiteFunctionType(core.bool, [core.String]),
     [dartx.queryCommandState]: dart.definiteFunctionType(core.bool, [core.String]),
@@ -70930,18 +70933,18 @@
     [dartx.queryCommandValue]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.transformDocumentToTreeView]: dart.definiteFunctionType(dart.void, [core.String]),
     [_webkitExitFullscreen]: dart.definiteFunctionType(dart.void, []),
-    [dartx.getElementById]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.querySelector]: dart.definiteFunctionType(html.Element, [core.String]),
-    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html.Node), [core.String]),
-    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
-    [dartx.query]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.queryAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
-    [dartx.createElement]: dart.definiteFunctionType(html.Element, [core.String], [core.String]),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String]),
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.createElement]: dart.definiteFunctionType(html$.Element, [core.String], [core.String]),
     [_createElement_2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
     [_createElementNS_2]: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
-    [dartx.createElementNS]: dart.definiteFunctionType(html.Element, [core.String, core.String], [core.String]),
-    [_createNodeIterator]: dart.definiteFunctionType(html.NodeIterator, [html.Node], [core.int, html.NodeFilter]),
-    [_createTreeWalker]: dart.definiteFunctionType(html.TreeWalker, [html.Node], [core.int, html.NodeFilter])
+    [dartx.createElementNS]: dart.definiteFunctionType(html$.Element, [core.String, core.String], [core.String]),
+    [_createNodeIterator]: dart.definiteFunctionType(html$.NodeIterator, [html$.Node], [core.int, html$.NodeFilter]),
+    [_createTreeWalker]: dart.definiteFunctionType(html$.TreeWalker, [html$.Node], [core.int, html$.NodeFilter])
   }),
   sfields: () => ({
     pointerLockChangeEvent: EventStreamProviderOfEvent(),
@@ -70951,7 +70954,7 @@
     selectionChangeEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(html.Document, {
+dart.defineLazy(html$.Document, {
   get pointerLockChangeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('pointerlockchange'));
   },
@@ -70968,7 +70971,7 @@
     return dart.const(new (EventStreamProviderOfEvent())('selectionchange'));
   }
 });
-dart.registerExtension(dart.global.Document, html.Document);
+dart.registerExtension(dart.global.Document, html$.Document);
 const _docChildren = Symbol('_docChildren');
 dart.defineExtensionNames([
   'children',
@@ -70984,19 +70987,19 @@
   'getElementById',
   'querySelector'
 ]);
-html.DocumentFragment = class DocumentFragment extends html.Node {
+html$.DocumentFragment = class DocumentFragment extends html$.Node {
   static new() {
-    return html.document[dartx.createDocumentFragment]();
+    return html$.document[dartx.createDocumentFragment]();
   }
   static html(html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    return html.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
+    return html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
   }
   static svg(svgContent, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    return svg.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
+    return svg$.SvgSvgElement.new()[dartx.createFragment](svgContent, {validator: validator, treeSanitizer: treeSanitizer});
   }
   get [_children]() {
     return dart.throw(new core.UnimplementedError('Use _docChildren instead'));
@@ -71021,11 +71024,11 @@
   }
   [dartx.querySelectorAll](T) {
     return selectors => {
-      return new (html._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
+      return new (html$._FrozenElementList$(T))._wrap(this[_querySelectorAll](selectors));
     };
   }
   get [dartx.innerHtml]() {
-    let e = html.Element.tag("div");
+    let e = html$.Element.tag("div");
     e[dartx.append](this[dartx.clone](true));
     return e[dartx.innerHtml];
   }
@@ -71036,16 +71039,16 @@
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
     this[dartx.nodes][dartx.clear]();
-    this[dartx.append](html.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
+    this[dartx.append](html$.document[dartx.body][dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer}));
   }
   [dartx.appendText](text) {
-    this[dartx.append](html.Text.new(text));
+    this[dartx.append](html$.Text.new(text));
   }
   [dartx.appendHtml](text, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let NodeTreeSanitizer = opts && 'NodeTreeSanitizer' in opts ? opts.NodeTreeSanitizer : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    this[dartx.append](html.DocumentFragment.html(text, {validator: validator, treeSanitizer: html.NodeTreeSanitizer._check(treeSanitizer)}));
+    this[dartx.append](html$.DocumentFragment.html(text, {validator: validator, treeSanitizer: html$.NodeTreeSanitizer._check(treeSanitizer)}));
   }
   [dartx.query](relativeSelectors) {
     return this[dartx.querySelector](relativeSelectors);
@@ -71077,23 +71080,23 @@
     return this.querySelectorAll.apply(this, args);
   }
 };
-html.DocumentFragment[dart.implements] = () => [html.NonElementParentNode, html.ParentNode];
-dart.setSignature(html.DocumentFragment, {
+html$.DocumentFragment[dart.implements] = () => [html$.NonElementParentNode, html$.ParentNode];
+dart.setSignature(html$.DocumentFragment, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.DocumentFragment, []),
-    html: dart.definiteFunctionType(html.DocumentFragment, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
-    svg: dart.definiteFunctionType(html.DocumentFragment, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
-    _: dart.definiteFunctionType(html.DocumentFragment, [])
+    new: dart.definiteFunctionType(html$.DocumentFragment, []),
+    html: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    svg: dart.definiteFunctionType(html$.DocumentFragment, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    _: dart.definiteFunctionType(html$.DocumentFragment, [])
   }),
   fields: () => ({
     [_docChildren]: ListOfElement(),
     [_childElementCount]: core.int,
-    [_firstElementChild]: html.Element,
-    [_lastElementChild]: html.Element
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
   }),
   getters: () => ({
-    [_children]: dart.definiteFunctionType(html.HtmlCollection, []),
-    [dartx.children]: dart.definiteFunctionType(core.List$(html.Element), []),
+    [_children]: dart.definiteFunctionType(html$.HtmlCollection, []),
+    [dartx.children]: dart.definiteFunctionType(core.List$(html$.Element), []),
     [dartx.innerHtml]: dart.definiteFunctionType(core.String, [])
   }),
   setters: () => ({
@@ -71101,32 +71104,32 @@
     [dartx.innerHtml]: dart.definiteFunctionType(dart.void, [core.String])
   }),
   methods: () => ({
-    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
-    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
+    [dartx.querySelectorAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.setInnerHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
     [dartx.appendText]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
-    [dartx.query]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.queryAll]: dart.definiteFunctionType(T => [html.ElementList$(T), [core.String]]),
-    [dartx.getElementById]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.querySelector]: dart.definiteFunctionType(html.Element, [core.String]),
-    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html.Node), [core.String])
+    [dartx.appendHtml]: dart.definiteFunctionType(dart.void, [core.String], {validator: html$.NodeValidator, NodeTreeSanitizer: dart.dynamic, treeSanitizer: dart.dynamic}),
+    [dartx.query]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.queryAll]: dart.definiteFunctionType(T => [html$.ElementList$(T), [core.String]]),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.querySelector]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [_querySelectorAll]: dart.definiteFunctionType(core.List$(html$.Node), [core.String])
   })
 });
-dart.registerExtension(dart.global.DocumentFragment, html.DocumentFragment);
+dart.registerExtension(dart.global.DocumentFragment, html$.DocumentFragment);
 dart.defineExtensionNames([
   'message',
   'name'
 ]);
-html.DomError = class DomError extends _interceptors.Interceptor {
+html$.DomError = class DomError extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(name, message) {
     if (message === void 0) message = null;
     if (message != null) {
-      return html.DomError._create_1(name, message);
+      return html$.DomError._create_1(name, message);
     }
-    return html.DomError._create_2(name);
+    return html$.DomError._create_2(name);
   }
   static _create_1(name, message) {
     return new DOMError(name, message);
@@ -71141,28 +71144,28 @@
     return this.name;
   }
 };
-dart.setSignature(html.DomError, {
+dart.setSignature(html$.DomError, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomError, []),
-    new: dart.definiteFunctionType(html.DomError, [core.String], [core.String])
+    _: dart.definiteFunctionType(html$.DomError, []),
+    new: dart.definiteFunctionType(html$.DomError, [core.String], [core.String])
   }),
   fields: () => ({
     [dartx.message]: core.String,
     [dartx.name]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.DomError, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.DomError, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.DomError, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DomError, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.DOMError, html.DomError);
+dart.registerExtension(dart.global.DOMError, html$.DomError);
 dart.defineExtensionNames([
   'name',
   'toString',
   'message'
 ]);
-html.DomException = class DomException extends _interceptors.Interceptor {
+html$.DomException = class DomException extends _interceptors.Interceptor {
   get [dartx.name]() {
     let errorName = this.name;
     if (dart.test(html_common.Device.isWebKit) && errorName == 'SECURITY_ERR') return 'SecurityError';
@@ -71179,8 +71182,8 @@
     return String(this);
   }
 };
-dart.setSignature(html.DomException, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomException, [])}),
+dart.setSignature(html$.DomException, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomException, [])}),
   fields: () => ({[dartx.message]: core.String}),
   getters: () => ({[dartx.name]: dart.definiteFunctionType(core.String, [])}),
   sfields: () => ({
@@ -71207,35 +71210,35 @@
     DATA_CLONE: core.String
   })
 });
-html.DomException.INDEX_SIZE = 'IndexSizeError';
-html.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
-html.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
-html.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
-html.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
-html.DomException.NOT_FOUND = 'NotFoundError';
-html.DomException.NOT_SUPPORTED = 'NotSupportedError';
-html.DomException.INVALID_STATE = 'InvalidStateError';
-html.DomException.SYNTAX = 'SyntaxError';
-html.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
-html.DomException.NAMESPACE = 'NamespaceError';
-html.DomException.INVALID_ACCESS = 'InvalidAccessError';
-html.DomException.TYPE_MISMATCH = 'TypeMismatchError';
-html.DomException.SECURITY = 'SecurityError';
-html.DomException.NETWORK = 'NetworkError';
-html.DomException.ABORT = 'AbortError';
-html.DomException.URL_MISMATCH = 'URLMismatchError';
-html.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
-html.DomException.TIMEOUT = 'TimeoutError';
-html.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
-html.DomException.DATA_CLONE = 'DataCloneError';
-dart.registerExtension(dart.global.DOMException, html.DomException);
+html$.DomException.INDEX_SIZE = 'IndexSizeError';
+html$.DomException.HIERARCHY_REQUEST = 'HierarchyRequestError';
+html$.DomException.WRONG_DOCUMENT = 'WrongDocumentError';
+html$.DomException.INVALID_CHARACTER = 'InvalidCharacterError';
+html$.DomException.NO_MODIFICATION_ALLOWED = 'NoModificationAllowedError';
+html$.DomException.NOT_FOUND = 'NotFoundError';
+html$.DomException.NOT_SUPPORTED = 'NotSupportedError';
+html$.DomException.INVALID_STATE = 'InvalidStateError';
+html$.DomException.SYNTAX = 'SyntaxError';
+html$.DomException.INVALID_MODIFICATION = 'InvalidModificationError';
+html$.DomException.NAMESPACE = 'NamespaceError';
+html$.DomException.INVALID_ACCESS = 'InvalidAccessError';
+html$.DomException.TYPE_MISMATCH = 'TypeMismatchError';
+html$.DomException.SECURITY = 'SecurityError';
+html$.DomException.NETWORK = 'NetworkError';
+html$.DomException.ABORT = 'AbortError';
+html$.DomException.URL_MISMATCH = 'URLMismatchError';
+html$.DomException.QUOTA_EXCEEDED = 'QuotaExceededError';
+html$.DomException.TIMEOUT = 'TimeoutError';
+html$.DomException.INVALID_NODE_TYPE = 'InvalidNodeTypeError';
+html$.DomException.DATA_CLONE = 'DataCloneError';
+dart.registerExtension(dart.global.DOMException, html$.DomException);
 dart.defineExtensionNames([
   'createDocument',
   'createDocumentType',
   'createHtmlDocument',
   'hasFeature'
 ]);
-html.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
+html$.DomImplementation = class DomImplementation extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -71252,20 +71255,20 @@
     return this.hasFeature.apply(this, args);
   }
 };
-dart.setSignature(html.DomImplementation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomImplementation, [])}),
+dart.setSignature(html$.DomImplementation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomImplementation, [])}),
   methods: () => ({
-    [dartx.createDocument]: dart.definiteFunctionType(html.XmlDocument, [core.String, core.String, html._DocumentType]),
-    [dartx.createDocumentType]: dart.definiteFunctionType(html._DocumentType, [core.String, core.String, core.String]),
-    [dartx.createHtmlDocument]: dart.definiteFunctionType(html.HtmlDocument, [core.String]),
+    [dartx.createDocument]: dart.definiteFunctionType(html$.XmlDocument, [core.String, core.String, html$._DocumentType]),
+    [dartx.createDocumentType]: dart.definiteFunctionType(html$._DocumentType, [core.String, core.String, core.String]),
+    [dartx.createHtmlDocument]: dart.definiteFunctionType(html$.HtmlDocument, [core.String]),
     [dartx.hasFeature]: dart.definiteFunctionType(core.bool, [])
   })
 });
-dart.registerExtension(dart.global.DOMImplementation, html.DomImplementation);
+dart.registerExtension(dart.global.DOMImplementation, html$.DomImplementation);
 dart.defineExtensionNames([
   'next'
 ]);
-html.DomIterator = class DomIterator extends _interceptors.Interceptor {
+html$.DomIterator = class DomIterator extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -71273,11 +71276,11 @@
     return this.next.apply(this, args);
   }
 };
-dart.setSignature(html.DomIterator, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomIterator, [])}),
+dart.setSignature(html$.DomIterator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomIterator, [])}),
   methods: () => ({[dartx.next]: dart.definiteFunctionType(core.Object, [], [core.Object])})
 });
-dart.registerExtension(dart.global.Iterator, html.DomIterator);
+dart.registerExtension(dart.global.Iterator, html$.DomIterator);
 dart.defineExtensionNames([
   'a',
   'b',
@@ -71311,7 +71314,7 @@
   'toFloat64Array',
   'translate'
 ]);
-html.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
+html$.DomMatrixReadOnly = class DomMatrixReadOnly extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -71409,8 +71412,8 @@
     return this.translate.apply(this, args);
   }
 };
-dart.setSignature(html.DomMatrixReadOnly, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomMatrixReadOnly, [])}),
+dart.setSignature(html$.DomMatrixReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomMatrixReadOnly, [])}),
   getters: () => ({
     [dartx.a]: dart.definiteFunctionType(core.num, []),
     [dartx.b]: dart.definiteFunctionType(core.num, []),
@@ -71438,16 +71441,16 @@
     [dartx.m44]: dart.definiteFunctionType(core.num, [])
   }),
   methods: () => ({
-    [dartx.multiply]: dart.definiteFunctionType(html.DomMatrix, [html.DomMatrix]),
-    [dartx.scale]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num]),
-    [dartx.scale3d]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num, core.num]),
-    [dartx.scaleNonUniform]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.multiply]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.scale]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
+    [dartx.scale3d]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
+    [dartx.scaleNonUniform]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
     [dartx.toFloat32Array]: dart.definiteFunctionType(typed_data.Float32List, []),
     [dartx.toFloat64Array]: dart.definiteFunctionType(typed_data.Float64List, []),
-    [dartx.translate]: dart.definiteFunctionType(html.DomMatrix, [core.num, core.num], [core.num])
+    [dartx.translate]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
   })
 });
-dart.registerExtension(dart.global.DOMMatrixReadOnly, html.DomMatrixReadOnly);
+dart.registerExtension(dart.global.DOMMatrixReadOnly, html$.DomMatrixReadOnly);
 dart.defineExtensionNames([
   'a',
   'a',
@@ -71500,17 +71503,17 @@
   'scaleSelf',
   'translateSelf'
 ]);
-html.DomMatrix = class DomMatrix extends html.DomMatrixReadOnly {
+html$.DomMatrix = class DomMatrix extends html$.DomMatrixReadOnly {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(other) {
     if (other === void 0) other = null;
     if (other == null) {
-      return html.DomMatrix._create_1();
+      return html$.DomMatrix._create_1();
     }
-    if (html.DomMatrixReadOnly.is(other) || other == null) {
-      return html.DomMatrix._create_2(other);
+    if (html$.DomMatrixReadOnly.is(other) || other == null) {
+      return html$.DomMatrix._create_2(other);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -71671,10 +71674,10 @@
     return this.translateSelf.apply(this, args);
   }
 };
-dart.setSignature(html.DomMatrix, {
+dart.setSignature(html$.DomMatrix, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomMatrix, []),
-    new: dart.definiteFunctionType(html.DomMatrix, [], [html.DomMatrixReadOnly])
+    _: dart.definiteFunctionType(html$.DomMatrix, []),
+    new: dart.definiteFunctionType(html$.DomMatrix, [], [html$.DomMatrixReadOnly])
   }),
   setters: () => ({
     [dartx.a]: dart.definiteFunctionType(dart.void, [core.num]),
@@ -71701,29 +71704,29 @@
     [dartx.m44]: dart.definiteFunctionType(dart.void, [core.num])
   }),
   methods: () => ({
-    [dartx.multiplySelf]: dart.definiteFunctionType(html.DomMatrix, [html.DomMatrix]),
-    [dartx.preMultiplySelf]: dart.definiteFunctionType(html.DomMatrix, [html.DomMatrix]),
-    [dartx.scale3dSelf]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num, core.num]),
-    [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
-    [dartx.scaleSelf]: dart.definiteFunctionType(html.DomMatrix, [core.num], [core.num, core.num]),
-    [dartx.translateSelf]: dart.definiteFunctionType(html.DomMatrix, [core.num, core.num], [core.num])
+    [dartx.multiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.preMultiplySelf]: dart.definiteFunctionType(html$.DomMatrix, [html$.DomMatrix]),
+    [dartx.scale3dSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num]),
+    [dartx.scaleNonUniformSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num, core.num, core.num, core.num]),
+    [dartx.scaleSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num], [core.num, core.num]),
+    [dartx.translateSelf]: dart.definiteFunctionType(html$.DomMatrix, [core.num, core.num], [core.num])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.DomMatrix, []),
-    _create_2: dart.definiteFunctionType(html.DomMatrix, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.DomMatrix, []),
+    _create_2: dart.definiteFunctionType(html$.DomMatrix, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.DOMMatrix, html.DomMatrix);
+dart.registerExtension(dart.global.DOMMatrix, html$.DomMatrix);
 dart.defineExtensionNames([
   'parseFromString'
 ]);
-html.DomParser = class DomParser extends _interceptors.Interceptor {
+html$.DomParser = class DomParser extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.DomParser._create_1();
+    return html$.DomParser._create_1();
   }
   static _create_1() {
     return new DOMParser();
@@ -71732,28 +71735,28 @@
     return this.parseFromString.apply(this, args);
   }
 };
-dart.setSignature(html.DomParser, {
+dart.setSignature(html$.DomParser, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomParser, []),
-    new: dart.definiteFunctionType(html.DomParser, [])
+    _: dart.definiteFunctionType(html$.DomParser, []),
+    new: dart.definiteFunctionType(html$.DomParser, [])
   }),
-  methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html.Document, [core.String, core.String])}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.DomParser, [])}),
+  methods: () => ({[dartx.parseFromString]: dart.definiteFunctionType(html$.Document, [core.String, core.String])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomParser, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.DOMParser, html.DomParser);
+dart.registerExtension(dart.global.DOMParser, html$.DomParser);
 dart.defineExtensionNames([
   'w',
   'x',
   'y',
   'z'
 ]);
-html.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
+html$.DomPointReadOnly = class DomPointReadOnly extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(x, y, z, w) {
-    return html.DomPointReadOnly._create_1(x, y, z, w);
+    return html$.DomPointReadOnly._create_1(x, y, z, w);
   }
   static _create_1(x, y, z, w) {
     return new DOMPointReadOnly(x, y, z, w);
@@ -71771,10 +71774,10 @@
     return this.z;
   }
 };
-dart.setSignature(html.DomPointReadOnly, {
+dart.setSignature(html$.DomPointReadOnly, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomPointReadOnly, []),
-    new: dart.definiteFunctionType(html.DomPointReadOnly, [core.num, core.num, core.num, core.num])
+    _: dart.definiteFunctionType(html$.DomPointReadOnly, []),
+    new: dart.definiteFunctionType(html$.DomPointReadOnly, [core.num, core.num, core.num, core.num])
   }),
   getters: () => ({
     [dartx.w]: dart.definiteFunctionType(core.num, []),
@@ -71782,10 +71785,10 @@
     [dartx.y]: dart.definiteFunctionType(core.num, []),
     [dartx.z]: dart.definiteFunctionType(core.num, [])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomPointReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.DOMPointReadOnly, html.DomPointReadOnly);
+dart.registerExtension(dart.global.DOMPointReadOnly, html$.DomPointReadOnly);
 dart.defineExtensionNames([
   'w',
   'w',
@@ -71796,7 +71799,7 @@
   'z',
   'z'
 ]);
-html.DomPoint = class DomPoint extends html.DomPointReadOnly {
+html$.DomPoint = class DomPoint extends html$.DomPointReadOnly {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -71807,22 +71810,22 @@
     if (w === void 0) w = null;
     if ((core.Map.is(point_OR_x) || point_OR_x == null) && y == null && z == null && w == null) {
       let point_1 = html_common.convertDartToNative_Dictionary(core.Map._check(point_OR_x));
-      return html.DomPoint._create_1(point_1);
+      return html$.DomPoint._create_1(point_1);
     }
     if (point_OR_x == null && y == null && z == null && w == null) {
-      return html.DomPoint._create_2();
+      return html$.DomPoint._create_2();
     }
     if ((typeof point_OR_x == 'number' || point_OR_x == null) && y == null && z == null && w == null) {
-      return html.DomPoint._create_3(point_OR_x);
+      return html$.DomPoint._create_3(point_OR_x);
     }
     if ((typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && z == null && w == null) {
-      return html.DomPoint._create_4(point_OR_x, y);
+      return html$.DomPoint._create_4(point_OR_x, y);
     }
     if ((typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null) && w == null) {
-      return html.DomPoint._create_5(point_OR_x, y, z);
+      return html$.DomPoint._create_5(point_OR_x, y, z);
     }
     if ((typeof w == 'number' || w == null) && (typeof z == 'number' || z == null) && (typeof y == 'number' || y == null) && (typeof point_OR_x == 'number' || point_OR_x == null)) {
-      return html.DomPoint._create_6(point_OR_x, y, z, w);
+      return html$.DomPoint._create_6(point_OR_x, y, z, w);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -71872,10 +71875,10 @@
     this.z = value;
   }
 };
-dart.setSignature(html.DomPoint, {
+dart.setSignature(html$.DomPoint, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomPoint, []),
-    new: dart.definiteFunctionType(html.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
+    _: dart.definiteFunctionType(html$.DomPoint, []),
+    new: dart.definiteFunctionType(html$.DomPoint, [], [dart.dynamic, core.num, core.num, core.num])
   }),
   setters: () => ({
     [dartx.w]: dart.definiteFunctionType(dart.void, [core.num]),
@@ -71885,16 +71888,16 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.DomPoint, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.DomPoint, []),
-    _create_3: dart.definiteFunctionType(html.DomPoint, [dart.dynamic]),
-    _create_4: dart.definiteFunctionType(html.DomPoint, [dart.dynamic, dart.dynamic]),
-    _create_5: dart.definiteFunctionType(html.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_6: dart.definiteFunctionType(html.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.DomPoint, []),
+    _create_3: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_6: dart.definiteFunctionType(html$.DomPoint, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6']
 });
-dart.registerExtension(dart.global.DOMPoint, html.DomPoint);
+dart.registerExtension(dart.global.DOMPoint, html$.DomPoint);
 dart.defineExtensionNames([
   'toString',
   '==',
@@ -71917,7 +71920,7 @@
   'x',
   'y'
 ]);
-html.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
+html$.DomRectReadOnly = class DomRectReadOnly extends _interceptors.Interceptor {
   [dartx.toString]() {
     return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
   }
@@ -71926,7 +71929,7 @@
     return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
   }
   get [dartx.hashCode]() {
-    return html._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
   }
   [dartx.intersection](other) {
     let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
@@ -71972,7 +71975,7 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(x, y, width, height) {
-    return html.DomRectReadOnly._create_1(x, y, width, height);
+    return html$.DomRectReadOnly._create_1(x, y, width, height);
   }
   static _create_1(x, y, width, height) {
     return new DOMRectReadOnly(x, y, width, height);
@@ -72002,11 +72005,11 @@
     return this.y;
   }
 };
-html.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
-dart.setSignature(html.DomRectReadOnly, {
+html$.DomRectReadOnly[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$.DomRectReadOnly, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.DomRectReadOnly, []),
-    new: dart.definiteFunctionType(html.DomRectReadOnly, [core.num, core.num, core.num, core.num])
+    _: dart.definiteFunctionType(html$.DomRectReadOnly, []),
+    new: dart.definiteFunctionType(html$.DomRectReadOnly, [core.num, core.num, core.num, core.num])
   }),
   getters: () => ({
     [dartx.topLeft]: dart.definiteFunctionType(math.Point$(core.num), []),
@@ -72029,10 +72032,10 @@
     [dartx.containsRectangle]: dart.definiteFunctionType(core.bool, [RectangleOfnum()]),
     [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.DomRectReadOnly, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.DOMRectReadOnly, html.DomRectReadOnly);
+dart.registerExtension(dart.global.DOMRectReadOnly, html$.DomRectReadOnly);
 dart.defineExtensionNames([
   'add',
   'contains',
@@ -72041,7 +72044,7 @@
   'toggle',
   'length'
 ]);
-html.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
+html$.DomTokenList = class DomTokenList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -72064,8 +72067,8 @@
     return this.toggle.apply(this, args);
   }
 };
-dart.setSignature(html.DomTokenList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomTokenList, [])}),
+dart.setSignature(html$.DomTokenList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomTokenList, [])}),
   fields: () => ({[dartx.length]: core.int}),
   methods: () => ({
     [dartx.add]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -72075,11 +72078,11 @@
     [dartx.toggle]: dart.definiteFunctionType(core.bool, [core.String], [core.bool])
   })
 });
-dart.registerExtension(dart.global.DOMTokenList, html.DomTokenList);
+dart.registerExtension(dart.global.DOMTokenList, html$.DomTokenList);
 dart.defineExtensionNames([
   'value'
 ]);
-html.DomSettableTokenList = class DomSettableTokenList extends html.DomTokenList {
+html$.DomSettableTokenList = class DomSettableTokenList extends html$.DomTokenList {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -72090,13 +72093,13 @@
     this.value = value;
   }
 };
-dart.setSignature(html.DomSettableTokenList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomSettableTokenList, [])}),
+dart.setSignature(html$.DomSettableTokenList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomSettableTokenList, [])}),
   fields: () => ({[dartx.value]: core.String})
 });
-dart.registerExtension(dart.global.DOMSettableTokenList, html.DomSettableTokenList);
-html.ImmutableListMixin$ = dart.generic(E => {
-  let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html.FixedSizeListIterator$(E)))();
+dart.registerExtension(dart.global.DOMSettableTokenList, html$.DomSettableTokenList);
+html$.ImmutableListMixin$ = dart.generic(E => {
+  let FixedSizeListIteratorOfE = () => (FixedSizeListIteratorOfE = dart.constFn(html$.FixedSizeListIterator$(E)))();
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
   let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
@@ -72232,7 +72235,7 @@
   ]);
   return ImmutableListMixin;
 });
-html.ImmutableListMixin = ImmutableListMixin();
+html$.ImmutableListMixin = ImmutableListMixin();
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -72244,7 +72247,7 @@
   'elementAt',
   'item'
 ]);
-html.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html.ImmutableListMixin$(core.String)) {
+html$.DomStringList = class DomStringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -72293,9 +72296,9 @@
     return this.item.apply(this, args);
   }
 };
-html.DomStringList[dart.implements] = () => [ListOfString()];
-dart.setSignature(html.DomStringList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomStringList, [])}),
+html$.DomStringList[dart.implements] = () => [ListOfString()];
+dart.setSignature(html$.DomStringList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
@@ -72305,64 +72308,64 @@
     [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
   })
 });
-dart.registerExtension(dart.global.DOMStringList, html.DomStringList);
-html.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.DOMStringList, html$.DomStringList);
+html$.DomStringMap = class DomStringMap extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.DomStringMap, {
-  constructors: () => ({_: dart.definiteFunctionType(html.DomStringMap, [])})
+dart.setSignature(html$.DomStringMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.DomStringMap, [])})
 });
-html.EffectModel = class EffectModel extends _interceptors.Interceptor {
+html$.EffectModel = class EffectModel extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.EffectModel, {
-  constructors: () => ({_: dart.definiteFunctionType(html.EffectModel, [])})
+dart.setSignature(html$.EffectModel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.EffectModel, [])})
 });
-dart.registerExtension(dart.global.EffectModel, html.EffectModel);
+dart.registerExtension(dart.global.EffectModel, html$.EffectModel);
 const _childElements = Symbol('_childElements');
-const _element = Symbol('_element');
-const _filter = Symbol('_filter');
-html._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html.Element) {
+const _element$ = Symbol('_element');
+const _filter$0 = Symbol('_filter');
+html$._ChildrenElementList = class _ChildrenElementList extends collection.ListBase$(html$.Element) {
   _wrap(element) {
-    this[_childElements] = html.HtmlCollection._check(element[_children]);
-    this[_element] = element;
+    this[_childElements] = html$.HtmlCollection._check(element[_children]);
+    this[_element$] = element;
   }
   contains(element) {
     return this[_childElements][dartx.contains](element);
   }
   get isEmpty() {
-    return this[_element][_firstElementChild] == null;
+    return this[_element$][_firstElementChild] == null;
   }
   get length() {
     return this[_childElements][dartx.length];
   }
   _get(index) {
-    return html.Element._check(this[_childElements][dartx._get](index));
+    return html$.Element._check(this[_childElements][dartx._get](index));
   }
   _set(index, value) {
-    this[_element][_replaceChild](value, this[_childElements][dartx._get](index));
+    this[_element$][_replaceChild](value, this[_childElements][dartx._get](index));
     return value;
   }
   set length(newLength) {
     dart.throw(new core.UnsupportedError('Cannot resize element lists'));
   }
   add(value) {
-    this[_element][dartx.append](value);
+    this[_element$][dartx.append](value);
     return value;
   }
   get iterator() {
     return this[dartx.toList]()[dartx.iterator];
   }
   addAll(iterable) {
-    if (html._ChildNodeListLazy.is(iterable)) {
+    if (html$._ChildNodeListLazy.is(iterable)) {
       iterable = ListOfElement().from(iterable);
     }
     for (let element of iterable) {
-      this[_element][dartx.append](element);
+      this[_element$][dartx.append](element);
     }
   }
   sort(compare) {
@@ -72374,17 +72377,17 @@
     dart.throw(new core.UnsupportedError('Cannot shuffle element lists'));
   }
   removeWhere(test) {
-    this[_filter](test, false);
+    this[_filter$0](test, false);
   }
   retainWhere(test) {
-    this[_filter](test, true);
+    this[_filter$0](test, true);
   }
-  [_filter](test, retainMatching) {
+  [_filter$0](test, retainMatching) {
     let removed = null;
     if (dart.test(retainMatching)) {
-      removed = this[_element][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool()));
+      removed = this[_element$][dartx.children][dartx.where](dart.fn(e => !dart.test(test(e)), ElementTobool$()));
     } else {
-      removed = this[_element][dartx.children][dartx.where](test);
+      removed = this[_element$][dartx.children][dartx.where](test);
     }
     for (let e of core.Iterable._check(removed))
       dart.dsend(e, 'remove');
@@ -72401,10 +72404,10 @@
     dart.throw(new core.UnimplementedError());
   }
   remove(object) {
-    if (html.Element.is(object)) {
+    if (html$.Element.is(object)) {
       let element = object;
-      if (core.identical(element[dartx.parentNode], this[_element])) {
-        this[_element][_removeChild](element);
+      if (core.identical(element[dartx.parentNode], this[_element$])) {
+        this[_element$][_removeChild](element);
         return true;
       }
     }
@@ -72415,38 +72418,38 @@
       dart.throw(new core.RangeError.range(index, 0, this.length));
     }
     if (index == this.length) {
-      this[_element][dartx.append](element);
+      this[_element$][dartx.append](element);
     } else {
-      this[_element][dartx.insertBefore](element, this._get(index));
+      this[_element$][dartx.insertBefore](element, this._get(index));
     }
   }
   setAll(index, iterable) {
     dart.throw(new core.UnimplementedError());
   }
   clear() {
-    this[_element][_clearChildren]();
+    this[_element$][_clearChildren]();
   }
   removeAt(index) {
     let result = this._get(index);
     if (result != null) {
-      this[_element][_removeChild](result);
+      this[_element$][_removeChild](result);
     }
     return result;
   }
   removeLast() {
     let result = this.last;
     if (result != null) {
-      this[_element][_removeChild](result);
+      this[_element$][_removeChild](result);
     }
     return result;
   }
   get first() {
-    let result = this[_element][_firstElementChild];
+    let result = this[_element$][_firstElementChild];
     if (result == null) dart.throw(new core.StateError("No elements"));
     return result;
   }
   get last() {
-    let result = this[_element][_lastElementChild];
+    let result = this[_element$][_lastElementChild];
     if (result == null) dart.throw(new core.StateError("No elements"));
     return result;
   }
@@ -72458,28 +72461,28 @@
     return this[_childElements];
   }
 };
-dart.addSimpleTypeTests(html._ChildrenElementList);
-dart.defineNamedConstructor(html._ChildrenElementList, '_wrap');
-html._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
-dart.setSignature(html._ChildrenElementList, {
-  constructors: () => ({_wrap: dart.definiteFunctionType(html._ChildrenElementList, [html.Element])}),
+dart.addSimpleTypeTests(html$._ChildrenElementList);
+dart.defineNamedConstructor(html$._ChildrenElementList, '_wrap');
+html$._ChildrenElementList[dart.implements] = () => [html_common.NodeListWrapper];
+dart.setSignature(html$._ChildrenElementList, {
+  constructors: () => ({_wrap: dart.definiteFunctionType(html$._ChildrenElementList, [html$.Element])}),
   fields: () => ({
-    [_element]: html.Element,
-    [_childElements]: html.HtmlCollection
+    [_element$]: html$.Element,
+    [_childElements]: html$.HtmlCollection
   }),
   getters: () => ({
     length: dart.definiteFunctionType(core.int, []),
-    rawList: dart.definiteFunctionType(core.List$(html.Node), [])
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
   }),
   setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    _get: dart.definiteFunctionType(html.Element, [core.int]),
-    _set: dart.definiteFunctionType(dart.void, [core.int, html.Element]),
-    add: dart.definiteFunctionType(html.Element, [html.Element]),
-    [_filter]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
+    _get: dart.definiteFunctionType(html$.Element, [core.int]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
+    add: dart.definiteFunctionType(html$.Element, [html$.Element]),
+    [_filter$0]: dart.definiteFunctionType(dart.void, [ElementTobool(), core.bool])
   })
 });
-dart.defineExtensionMembers(html._ChildrenElementList, [
+dart.defineExtensionMembers(html$._ChildrenElementList, [
   'contains',
   '_get',
   '_set',
@@ -72506,15 +72509,15 @@
   'last',
   'single'
 ]);
-html.ElementList$ = dart.generic(T => {
+html$.ElementList$ = dart.generic(T => {
   class ElementList extends collection.ListBase$(T) {}
   return ElementList;
 });
-html.ElementList = ElementList();
+html$.ElementList = ElementList();
 const _nodeList = Symbol('_nodeList');
 const _forElementList = Symbol('_forElementList');
-html._FrozenElementList$ = dart.generic(E => {
-  let ElementListOfE = () => (ElementListOfE = dart.constFn(html.ElementList$(E)))();
+html$._FrozenElementList$ = dart.generic(E => {
+  let ElementListOfE = () => (ElementListOfE = dart.constFn(html$.ElementList$(E)))();
   let ComparatorOfE = () => (ComparatorOfE = dart.constFn(core.Comparator$(E)))();
   let EToIterableOfString = () => (EToIterableOfString = dart.constFn(dart.definiteFunctionType(IterableOfString(), [E])))();
   class _FrozenElementList extends collection.ListBase$(E) {
@@ -72525,7 +72528,7 @@
       return this[_nodeList][dartx.length];
     }
     _get(index) {
-      return html._downcast(html.Node, E)(this[_nodeList][dartx._get](index));
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx._get](index));
     }
     _set(index, value) {
       E._check(value);
@@ -72544,25 +72547,25 @@
       dart.throw(new core.UnsupportedError('Cannot shuffle list'));
     }
     get first() {
-      return html._downcast(html.Node, E)(this[_nodeList][dartx.first]);
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.first]);
     }
     get last() {
-      return html._downcast(html.Node, E)(this[_nodeList][dartx.last]);
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.last]);
     }
     get single() {
-      return html._downcast(html.Node, E)(this[_nodeList][dartx.single]);
+      return html$._downcast(html$.Node, E)(this[_nodeList][dartx.single]);
     }
     get classes() {
-      return html._MultiElementCssClassSet.new(this);
+      return html$._MultiElementCssClassSet.new(this);
     }
     get style() {
-      return new html._CssStyleDeclarationSet(this);
+      return new html$._CssStyleDeclarationSet(this);
     }
     set classes(value) {
       this[dartx.forEach](dart.fn(e => e[dartx.classes] = value, EToIterableOfString()));
     }
     get contentEdge() {
-      return new html._ContentCssListRect(this);
+      return new html$._ContentCssListRect(this);
     }
     get paddingEdge() {
       return this.first[dartx.paddingEdge];
@@ -72577,296 +72580,296 @@
       return this[_nodeList];
     }
     get onAbort() {
-      return html.Element.abortEvent[_forElementList](this);
+      return html$.Element.abortEvent[_forElementList](this);
     }
     get onBeforeCopy() {
-      return html.Element.beforeCopyEvent[_forElementList](this);
+      return html$.Element.beforeCopyEvent[_forElementList](this);
     }
     get onBeforeCut() {
-      return html.Element.beforeCutEvent[_forElementList](this);
+      return html$.Element.beforeCutEvent[_forElementList](this);
     }
     get onBeforePaste() {
-      return html.Element.beforePasteEvent[_forElementList](this);
+      return html$.Element.beforePasteEvent[_forElementList](this);
     }
     get onBlur() {
-      return html.Element.blurEvent[_forElementList](this);
+      return html$.Element.blurEvent[_forElementList](this);
     }
     get onCanPlay() {
-      return html.Element.canPlayEvent[_forElementList](this);
+      return html$.Element.canPlayEvent[_forElementList](this);
     }
     get onCanPlayThrough() {
-      return html.Element.canPlayThroughEvent[_forElementList](this);
+      return html$.Element.canPlayThroughEvent[_forElementList](this);
     }
     get onChange() {
-      return html.Element.changeEvent[_forElementList](this);
+      return html$.Element.changeEvent[_forElementList](this);
     }
     get onClick() {
-      return html.Element.clickEvent[_forElementList](this);
+      return html$.Element.clickEvent[_forElementList](this);
     }
     get onContextMenu() {
-      return html.Element.contextMenuEvent[_forElementList](this);
+      return html$.Element.contextMenuEvent[_forElementList](this);
     }
     get onCopy() {
-      return html.Element.copyEvent[_forElementList](this);
+      return html$.Element.copyEvent[_forElementList](this);
     }
     get onCut() {
-      return html.Element.cutEvent[_forElementList](this);
+      return html$.Element.cutEvent[_forElementList](this);
     }
     get onDoubleClick() {
-      return html.Element.doubleClickEvent[_forElementList](this);
+      return html$.Element.doubleClickEvent[_forElementList](this);
     }
     get onDrag() {
-      return html.Element.dragEvent[_forElementList](this);
+      return html$.Element.dragEvent[_forElementList](this);
     }
     get onDragEnd() {
-      return html.Element.dragEndEvent[_forElementList](this);
+      return html$.Element.dragEndEvent[_forElementList](this);
     }
     get onDragEnter() {
-      return html.Element.dragEnterEvent[_forElementList](this);
+      return html$.Element.dragEnterEvent[_forElementList](this);
     }
     get onDragLeave() {
-      return html.Element.dragLeaveEvent[_forElementList](this);
+      return html$.Element.dragLeaveEvent[_forElementList](this);
     }
     get onDragOver() {
-      return html.Element.dragOverEvent[_forElementList](this);
+      return html$.Element.dragOverEvent[_forElementList](this);
     }
     get onDragStart() {
-      return html.Element.dragStartEvent[_forElementList](this);
+      return html$.Element.dragStartEvent[_forElementList](this);
     }
     get onDrop() {
-      return html.Element.dropEvent[_forElementList](this);
+      return html$.Element.dropEvent[_forElementList](this);
     }
     get onDurationChange() {
-      return html.Element.durationChangeEvent[_forElementList](this);
+      return html$.Element.durationChangeEvent[_forElementList](this);
     }
     get onEmptied() {
-      return html.Element.emptiedEvent[_forElementList](this);
+      return html$.Element.emptiedEvent[_forElementList](this);
     }
     get onEnded() {
-      return html.Element.endedEvent[_forElementList](this);
+      return html$.Element.endedEvent[_forElementList](this);
     }
     get onError() {
-      return html.Element.errorEvent[_forElementList](this);
+      return html$.Element.errorEvent[_forElementList](this);
     }
     get onFocus() {
-      return html.Element.focusEvent[_forElementList](this);
+      return html$.Element.focusEvent[_forElementList](this);
     }
     get onInput() {
-      return html.Element.inputEvent[_forElementList](this);
+      return html$.Element.inputEvent[_forElementList](this);
     }
     get onInvalid() {
-      return html.Element.invalidEvent[_forElementList](this);
+      return html$.Element.invalidEvent[_forElementList](this);
     }
     get onKeyDown() {
-      return html.Element.keyDownEvent[_forElementList](this);
+      return html$.Element.keyDownEvent[_forElementList](this);
     }
     get onKeyPress() {
-      return html.Element.keyPressEvent[_forElementList](this);
+      return html$.Element.keyPressEvent[_forElementList](this);
     }
     get onKeyUp() {
-      return html.Element.keyUpEvent[_forElementList](this);
+      return html$.Element.keyUpEvent[_forElementList](this);
     }
     get onLoad() {
-      return html.Element.loadEvent[_forElementList](this);
+      return html$.Element.loadEvent[_forElementList](this);
     }
     get onLoadedData() {
-      return html.Element.loadedDataEvent[_forElementList](this);
+      return html$.Element.loadedDataEvent[_forElementList](this);
     }
     get onLoadedMetadata() {
-      return html.Element.loadedMetadataEvent[_forElementList](this);
+      return html$.Element.loadedMetadataEvent[_forElementList](this);
     }
     get onMouseDown() {
-      return html.Element.mouseDownEvent[_forElementList](this);
+      return html$.Element.mouseDownEvent[_forElementList](this);
     }
     get onMouseEnter() {
-      return html.Element.mouseEnterEvent[_forElementList](this);
+      return html$.Element.mouseEnterEvent[_forElementList](this);
     }
     get onMouseLeave() {
-      return html.Element.mouseLeaveEvent[_forElementList](this);
+      return html$.Element.mouseLeaveEvent[_forElementList](this);
     }
     get onMouseMove() {
-      return html.Element.mouseMoveEvent[_forElementList](this);
+      return html$.Element.mouseMoveEvent[_forElementList](this);
     }
     get onMouseOut() {
-      return html.Element.mouseOutEvent[_forElementList](this);
+      return html$.Element.mouseOutEvent[_forElementList](this);
     }
     get onMouseOver() {
-      return html.Element.mouseOverEvent[_forElementList](this);
+      return html$.Element.mouseOverEvent[_forElementList](this);
     }
     get onMouseUp() {
-      return html.Element.mouseUpEvent[_forElementList](this);
+      return html$.Element.mouseUpEvent[_forElementList](this);
     }
     get onMouseWheel() {
-      return html.Element.mouseWheelEvent[_forElementList](this);
+      return html$.Element.mouseWheelEvent[_forElementList](this);
     }
     get onPaste() {
-      return html.Element.pasteEvent[_forElementList](this);
+      return html$.Element.pasteEvent[_forElementList](this);
     }
     get onPause() {
-      return html.Element.pauseEvent[_forElementList](this);
+      return html$.Element.pauseEvent[_forElementList](this);
     }
     get onPlay() {
-      return html.Element.playEvent[_forElementList](this);
+      return html$.Element.playEvent[_forElementList](this);
     }
     get onPlaying() {
-      return html.Element.playingEvent[_forElementList](this);
+      return html$.Element.playingEvent[_forElementList](this);
     }
     get onRateChange() {
-      return html.Element.rateChangeEvent[_forElementList](this);
+      return html$.Element.rateChangeEvent[_forElementList](this);
     }
     get onReset() {
-      return html.Element.resetEvent[_forElementList](this);
+      return html$.Element.resetEvent[_forElementList](this);
     }
     get onResize() {
-      return html.Element.resizeEvent[_forElementList](this);
+      return html$.Element.resizeEvent[_forElementList](this);
     }
     get onScroll() {
-      return html.Element.scrollEvent[_forElementList](this);
+      return html$.Element.scrollEvent[_forElementList](this);
     }
     get onSearch() {
-      return html.Element.searchEvent[_forElementList](this);
+      return html$.Element.searchEvent[_forElementList](this);
     }
     get onSeeked() {
-      return html.Element.seekedEvent[_forElementList](this);
+      return html$.Element.seekedEvent[_forElementList](this);
     }
     get onSeeking() {
-      return html.Element.seekingEvent[_forElementList](this);
+      return html$.Element.seekingEvent[_forElementList](this);
     }
     get onSelect() {
-      return html.Element.selectEvent[_forElementList](this);
+      return html$.Element.selectEvent[_forElementList](this);
     }
     get onSelectStart() {
-      return html.Element.selectStartEvent[_forElementList](this);
+      return html$.Element.selectStartEvent[_forElementList](this);
     }
     get onStalled() {
-      return html.Element.stalledEvent[_forElementList](this);
+      return html$.Element.stalledEvent[_forElementList](this);
     }
     get onSubmit() {
-      return html.Element.submitEvent[_forElementList](this);
+      return html$.Element.submitEvent[_forElementList](this);
     }
     get onSuspend() {
-      return html.Element.suspendEvent[_forElementList](this);
+      return html$.Element.suspendEvent[_forElementList](this);
     }
     get onTimeUpdate() {
-      return html.Element.timeUpdateEvent[_forElementList](this);
+      return html$.Element.timeUpdateEvent[_forElementList](this);
     }
     get onTouchCancel() {
-      return html.Element.touchCancelEvent[_forElementList](this);
+      return html$.Element.touchCancelEvent[_forElementList](this);
     }
     get onTouchEnd() {
-      return html.Element.touchEndEvent[_forElementList](this);
+      return html$.Element.touchEndEvent[_forElementList](this);
     }
     get onTouchEnter() {
-      return html.Element.touchEnterEvent[_forElementList](this);
+      return html$.Element.touchEnterEvent[_forElementList](this);
     }
     get onTouchLeave() {
-      return html.Element.touchLeaveEvent[_forElementList](this);
+      return html$.Element.touchLeaveEvent[_forElementList](this);
     }
     get onTouchMove() {
-      return html.Element.touchMoveEvent[_forElementList](this);
+      return html$.Element.touchMoveEvent[_forElementList](this);
     }
     get onTouchStart() {
-      return html.Element.touchStartEvent[_forElementList](this);
+      return html$.Element.touchStartEvent[_forElementList](this);
     }
     get onTransitionEnd() {
-      return html.Element.transitionEndEvent[_forElementList](this);
+      return html$.Element.transitionEndEvent[_forElementList](this);
     }
     get onVolumeChange() {
-      return html.Element.volumeChangeEvent[_forElementList](this);
+      return html$.Element.volumeChangeEvent[_forElementList](this);
     }
     get onWaiting() {
-      return html.Element.waitingEvent[_forElementList](this);
+      return html$.Element.waitingEvent[_forElementList](this);
     }
     get onFullscreenChange() {
-      return html.Element.fullscreenChangeEvent[_forElementList](this);
+      return html$.Element.fullscreenChangeEvent[_forElementList](this);
     }
     get onFullscreenError() {
-      return html.Element.fullscreenErrorEvent[_forElementList](this);
+      return html$.Element.fullscreenErrorEvent[_forElementList](this);
     }
   }
   dart.defineNamedConstructor(_FrozenElementList, '_wrap');
   _FrozenElementList[dart.implements] = () => [ElementListOfE(), html_common.NodeListWrapper];
   dart.setSignature(_FrozenElementList, {
-    constructors: () => ({_wrap: dart.definiteFunctionType(html._FrozenElementList$(E), [ListOfNode()])}),
+    constructors: () => ({_wrap: dart.definiteFunctionType(html$._FrozenElementList$(E), [ListOfNode()])}),
     fields: () => ({[_nodeList]: ListOfNode()}),
     getters: () => ({
       length: dart.definiteFunctionType(core.int, []),
-      classes: dart.definiteFunctionType(html.CssClassSet, []),
-      style: dart.definiteFunctionType(html.CssStyleDeclarationBase, []),
-      contentEdge: dart.definiteFunctionType(html.CssRect, []),
-      paddingEdge: dart.definiteFunctionType(html.CssRect, []),
-      borderEdge: dart.definiteFunctionType(html.CssRect, []),
-      marginEdge: dart.definiteFunctionType(html.CssRect, []),
-      rawList: dart.definiteFunctionType(core.List$(html.Node), []),
-      onAbort: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onBeforeCopy: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onBeforeCut: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onBeforePaste: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onBlur: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onCanPlay: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onCanPlayThrough: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onChange: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onClick: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onContextMenu: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onCopy: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-      onCut: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-      onDoubleClick: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onDrag: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDragEnd: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDragEnter: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDragLeave: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDragOver: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDragStart: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDrop: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onDurationChange: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onEmptied: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onEnded: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onError: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onFocus: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onInput: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onInvalid: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onKeyDown: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-      onKeyPress: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-      onKeyUp: dart.definiteFunctionType(html.ElementStream$(html.KeyboardEvent), []),
-      onLoad: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onLoadedData: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onLoadedMetadata: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onMouseDown: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseEnter: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseLeave: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseMove: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseOut: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseOver: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseUp: dart.definiteFunctionType(html.ElementStream$(html.MouseEvent), []),
-      onMouseWheel: dart.definiteFunctionType(html.ElementStream$(html.WheelEvent), []),
-      onPaste: dart.definiteFunctionType(html.ElementStream$(html.ClipboardEvent), []),
-      onPause: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onPlay: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onPlaying: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onRateChange: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onReset: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onResize: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onScroll: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSearch: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSeeked: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSeeking: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSelect: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSelectStart: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onStalled: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSubmit: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onSuspend: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onTimeUpdate: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onTouchCancel: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTouchEnd: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTouchEnter: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTouchLeave: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTouchMove: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTouchStart: dart.definiteFunctionType(html.ElementStream$(html.TouchEvent), []),
-      onTransitionEnd: dart.definiteFunctionType(html.ElementStream$(html.TransitionEvent), []),
-      onVolumeChange: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onWaiting: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onFullscreenChange: dart.definiteFunctionType(html.ElementStream$(html.Event), []),
-      onFullscreenError: dart.definiteFunctionType(html.ElementStream$(html.Event), [])
+      classes: dart.definiteFunctionType(html$.CssClassSet, []),
+      style: dart.definiteFunctionType(html$.CssStyleDeclarationBase, []),
+      contentEdge: dart.definiteFunctionType(html$.CssRect, []),
+      paddingEdge: dart.definiteFunctionType(html$.CssRect, []),
+      borderEdge: dart.definiteFunctionType(html$.CssRect, []),
+      marginEdge: dart.definiteFunctionType(html$.CssRect, []),
+      rawList: dart.definiteFunctionType(core.List$(html$.Node), []),
+      onAbort: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforeCopy: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforeCut: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBeforePaste: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onBlur: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onCanPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onCanPlayThrough: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onClick: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onContextMenu: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onCopy: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onCut: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onDoubleClick: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onDrag: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragEnd: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDragStart: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDrop: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onDurationChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onEmptied: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onEnded: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFocus: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onInput: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onInvalid: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onKeyDown: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onKeyPress: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onKeyUp: dart.definiteFunctionType(html$.ElementStream$(html$.KeyboardEvent), []),
+      onLoad: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onLoadedData: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onLoadedMetadata: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onMouseDown: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseEnter: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseLeave: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseMove: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseOut: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseOver: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseUp: dart.definiteFunctionType(html$.ElementStream$(html$.MouseEvent), []),
+      onMouseWheel: dart.definiteFunctionType(html$.ElementStream$(html$.WheelEvent), []),
+      onPaste: dart.definiteFunctionType(html$.ElementStream$(html$.ClipboardEvent), []),
+      onPause: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onPlay: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onPlaying: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onRateChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onReset: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onResize: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onScroll: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSearch: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSeeked: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSeeking: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSelect: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSelectStart: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onStalled: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSubmit: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onSuspend: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onTimeUpdate: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onTouchCancel: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchEnter: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchLeave: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchMove: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTouchStart: dart.definiteFunctionType(html$.ElementStream$(html$.TouchEvent), []),
+      onTransitionEnd: dart.definiteFunctionType(html$.ElementStream$(html$.TransitionEvent), []),
+      onVolumeChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onWaiting: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFullscreenChange: dart.definiteFunctionType(html$.ElementStream$(html$.Event), []),
+      onFullscreenError: dart.definiteFunctionType(html$.ElementStream$(html$.Event), [])
     }),
     setters: () => ({
       length: dart.definiteFunctionType(dart.void, [core.int]),
@@ -72890,8 +72893,8 @@
   ]);
   return _FrozenElementList;
 });
-html._FrozenElementList = _FrozenElementList();
-html._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
+html$._FrozenElementList = _FrozenElementList();
+html$._ElementFactoryProvider = class _ElementFactoryProvider extends core.Object {
   static createElement_tag(tag, typeExtension) {
     if (typeExtension != null) {
       return document.createElement(tag, typeExtension);
@@ -72899,38 +72902,38 @@
     return document.createElement(tag);
   }
 };
-dart.setSignature(html._ElementFactoryProvider, {
+dart.setSignature(html$._ElementFactoryProvider, {
   statics: () => ({createElement_tag: dart.definiteFunctionType(dart.dynamic, [core.String, core.String])}),
   names: ['createElement_tag']
 });
-const _value = Symbol('_value');
-html.ScrollAlignment = class ScrollAlignment extends core.Object {
+const _value$2 = Symbol('_value');
+html$.ScrollAlignment = class ScrollAlignment extends core.Object {
   _internal(value) {
-    this[_value] = value;
+    this[_value$2] = value;
   }
   toString() {
-    return dart.str`ScrollAlignment.${this[_value]}`;
+    return dart.str`ScrollAlignment.${this[_value$2]}`;
   }
 };
-dart.defineNamedConstructor(html.ScrollAlignment, '_internal');
-dart.setSignature(html.ScrollAlignment, {
-  constructors: () => ({_internal: dart.definiteFunctionType(html.ScrollAlignment, [dart.dynamic])}),
-  fields: () => ({[_value]: dart.dynamic}),
+dart.defineNamedConstructor(html$.ScrollAlignment, '_internal');
+dart.setSignature(html$.ScrollAlignment, {
+  constructors: () => ({_internal: dart.definiteFunctionType(html$.ScrollAlignment, [dart.dynamic])}),
+  fields: () => ({[_value$2]: dart.dynamic}),
   sfields: () => ({
-    TOP: html.ScrollAlignment,
-    CENTER: html.ScrollAlignment,
-    BOTTOM: html.ScrollAlignment
+    TOP: html$.ScrollAlignment,
+    CENTER: html$.ScrollAlignment,
+    BOTTOM: html$.ScrollAlignment
   })
 });
-dart.defineLazy(html.ScrollAlignment, {
+dart.defineLazy(html$.ScrollAlignment, {
   get TOP() {
-    return dart.const(new html.ScrollAlignment._internal('TOP'));
+    return dart.const(new html$.ScrollAlignment._internal('TOP'));
   },
   get CENTER() {
-    return dart.const(new html.ScrollAlignment._internal('CENTER'));
+    return dart.const(new html$.ScrollAlignment._internal('CENTER'));
   },
   get BOTTOM() {
-    return dart.const(new html.ScrollAlignment._internal('BOTTOM'));
+    return dart.const(new html$.ScrollAlignment._internal('BOTTOM'));
   }
 });
 const __setter__ = Symbol('__setter__');
@@ -72941,12 +72944,12 @@
   'type',
   'width'
 ]);
-html.EmbedElement = class EmbedElement extends html.HtmlElement {
+html$.EmbedElement = class EmbedElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.EmbedElement._check(html.document[dartx.createElement]("embed"));
+    return html$.EmbedElement._check(html$.document[dartx.createElement]("embed"));
   }
   created() {
     this[dartx.height] = null;
@@ -72957,7 +72960,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('embed');
+    return html$.Element.isTagSupported('embed');
   }
   get [dartx.height]() {
     return this.height;
@@ -72996,12 +72999,12 @@
     return this.__setter__.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.EmbedElement, 'created');
-dart.setSignature(html.EmbedElement, {
+dart.defineNamedConstructor(html$.EmbedElement, 'created');
+dart.setSignature(html$.EmbedElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.EmbedElement, []),
-    new: dart.definiteFunctionType(html.EmbedElement, []),
-    created: dart.definiteFunctionType(html.EmbedElement, [])
+    _: dart.definiteFunctionType(html$.EmbedElement, []),
+    new: dart.definiteFunctionType(html$.EmbedElement, []),
+    created: dart.definiteFunctionType(html$.EmbedElement, [])
   }),
   fields: () => ({
     [dartx.height]: core.String,
@@ -73012,14 +73015,14 @@
   }),
   methods: () => ({
     [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html.Node])
+    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLEmbedElement, html.EmbedElement);
-html._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
-html._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html.Entry]));
-html._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html.FileError]));
+dart.registerExtension(dart.global.HTMLEmbedElement, html$.EmbedElement);
+html$._EntriesCallback = dart.typedef('_EntriesCallback', () => dart.functionType(dart.void, [ListOfEntry()]));
+html$._EntryCallback = dart.typedef('_EntryCallback', () => dart.functionType(dart.void, [html$.Entry]));
+html$._ErrorCallback = dart.typedef('_ErrorCallback', () => dart.functionType(dart.void, [html$.FileError]));
 dart.defineExtensionNames([
   'colno',
   'error',
@@ -73027,7 +73030,7 @@
   'lineno',
   'message'
 ]);
-html.ErrorEvent = class ErrorEvent extends html.Event {
+html$.ErrorEvent = class ErrorEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73035,9 +73038,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ErrorEvent._create_1(type, eventInitDict_1);
+      return html$.ErrorEvent._create_1(type, eventInitDict_1);
     }
-    return html.ErrorEvent._create_2(type);
+    return html$.ErrorEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ErrorEvent(type, eventInitDict);
@@ -73061,10 +73064,10 @@
     return this.message;
   }
 };
-dart.setSignature(html.ErrorEvent, {
+dart.setSignature(html$.ErrorEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ErrorEvent, []),
-    new: dart.definiteFunctionType(html.ErrorEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ErrorEvent, []),
+    new: dart.definiteFunctionType(html$.ErrorEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.colno]: core.int,
@@ -73074,12 +73077,12 @@
     [dartx.message]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ErrorEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ErrorEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ErrorEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ErrorEvent, html.ErrorEvent);
+dart.registerExtension(dart.global.ErrorEvent, html$.ErrorEvent);
 dart.defineExtensionNames([
   'close',
   'onError',
@@ -73089,11 +73092,11 @@
   'url',
   'withCredentials'
 ]);
-html.EventSource = class EventSource extends html.EventTarget {
+html$.EventSource = class EventSource extends html$.EventTarget {
   static new(url, opts) {
     let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : false;
     let parsedOptions = dart.map({withCredentials: withCredentials}, core.String, dart.dynamic);
-    return html.EventSource._factoryEventSource(url, parsedOptions);
+    return html$.EventSource._factoryEventSource(url, parsedOptions);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -73102,9 +73105,9 @@
     if (eventSourceInitDict === void 0) eventSourceInitDict = null;
     if (eventSourceInitDict != null) {
       let eventSourceInitDict_1 = html_common.convertDartToNative_Dictionary(eventSourceInitDict);
-      return html.EventSource._create_1(url, eventSourceInitDict_1);
+      return html$.EventSource._create_1(url, eventSourceInitDict_1);
     }
-    return html.EventSource._create_2(url);
+    return html$.EventSource._create_2(url);
   }
   static _create_1(url, eventSourceInitDict) {
     return new self.EventSource(url, eventSourceInitDict);
@@ -73125,19 +73128,19 @@
     return this.close.apply(this, args);
   }
   get [dartx.onError]() {
-    return html.EventSource.errorEvent.forTarget(this);
+    return html$.EventSource.errorEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.EventSource.messageEvent.forTarget(this);
+    return html$.EventSource.messageEvent.forTarget(this);
   }
   get [dartx.onOpen]() {
-    return html.EventSource.openEvent.forTarget(this);
+    return html$.EventSource.openEvent.forTarget(this);
   }
 };
-dart.setSignature(html.EventSource, {
+dart.setSignature(html$.EventSource, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.EventSource, [core.String], {withCredentials: dart.dynamic}),
-    _: dart.definiteFunctionType(html.EventSource, [])
+    new: dart.definiteFunctionType(html$.EventSource, [core.String], {withCredentials: dart.dynamic}),
+    _: dart.definiteFunctionType(html$.EventSource, [])
   }),
   fields: () => ({
     [dartx.readyState]: core.int,
@@ -73145,9 +73148,9 @@
     [dartx.withCredentials]: core.bool
   }),
   getters: () => ({
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), []),
-    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
   sfields: () => ({
@@ -73159,16 +73162,16 @@
     OPEN: core.int
   }),
   statics: () => ({
-    _factoryEventSource: dart.definiteFunctionType(html.EventSource, [core.String], [core.Map]),
-    _create_1: dart.definiteFunctionType(html.EventSource, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.EventSource, [dart.dynamic])
+    _factoryEventSource: dart.definiteFunctionType(html$.EventSource, [core.String], [core.Map]),
+    _create_1: dart.definiteFunctionType(html$.EventSource, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.EventSource, [dart.dynamic])
   }),
   names: ['_factoryEventSource', '_create_1', '_create_2']
 });
-html.EventSource.CLOSED = 2;
-html.EventSource.CONNECTING = 0;
-html.EventSource.OPEN = 1;
-dart.defineLazy(html.EventSource, {
+html$.EventSource.CLOSED = 2;
+html$.EventSource.CONNECTING = 0;
+html$.EventSource.OPEN = 1;
+dart.defineLazy(html$.EventSource, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   },
@@ -73179,9 +73182,9 @@
     return dart.const(new (EventStreamProviderOfEvent())('open'));
   }
 });
-dart.registerExtension(dart.global.EventSource, html.EventSource);
+dart.registerExtension(dart.global.EventSource, html$.EventSource);
 const _ptr = Symbol('_ptr');
-html.Events = class Events extends core.Object {
+html$.Events = class Events extends core.Object {
   new(ptr) {
     this[_ptr] = ptr;
   }
@@ -73189,29 +73192,29 @@
     return new (_EventStreamOfEvent())(this[_ptr], type, false);
   }
 };
-dart.setSignature(html.Events, {
-  constructors: () => ({new: dart.definiteFunctionType(html.Events, [html.EventTarget])}),
-  fields: () => ({[_ptr]: html.EventTarget}),
+dart.setSignature(html$.Events, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.Events, [html$.EventTarget])}),
+  fields: () => ({[_ptr]: html$.EventTarget}),
   methods: () => ({_get: dart.definiteFunctionType(async.Stream, [core.String])})
 });
-html.ElementEvents = class ElementEvents extends html.Events {
+html$.ElementEvents = class ElementEvents extends html$.Events {
   new(ptr) {
     super.new(ptr);
   }
   _get(type) {
-    if (dart.test(html.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
+    if (dart.test(html$.ElementEvents.webkitEvents[dartx.keys][dartx.contains](type[dartx.toLowerCase]()))) {
       if (dart.test(html_common.Device.isWebKit)) {
-        return new (_ElementEventStreamImplOfEvent())(this[_ptr], html.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
+        return new (_ElementEventStreamImplOfEvent())(this[_ptr], html$.ElementEvents.webkitEvents[dartx._get](type[dartx.toLowerCase]()), false);
       }
     }
     return new (_ElementEventStreamImplOfEvent())(this[_ptr], type, false);
   }
 };
-dart.setSignature(html.ElementEvents, {
-  constructors: () => ({new: dart.definiteFunctionType(html.ElementEvents, [html.Element])}),
+dart.setSignature(html$.ElementEvents, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ElementEvents, [html$.Element])}),
   sfields: () => ({webkitEvents: MapOfString$String()})
 });
-dart.defineLazy(html.ElementEvents, {
+dart.defineLazy(html$.ElementEvents, {
   get webkitEvents() {
     return dart.map({animationend: 'webkitAnimationEnd', animationiteration: 'webkitAnimationIteration', animationstart: 'webkitAnimationStart', fullscreenchange: 'webkitfullscreenchange', fullscreenerror: 'webkitfullscreenerror', keyadded: 'webkitkeyadded', keyerror: 'webkitkeyerror', keymessage: 'webkitkeymessage', needkey: 'webkitneedkey', pointerlockchange: 'webkitpointerlockchange', pointerlockerror: 'webkitpointerlockerror', resourcetimingbufferfull: 'webkitresourcetimingbufferfull', transitionend: 'webkitTransitionEnd', speechchange: 'webkitSpeechChange'}, core.String, core.String);
   }
@@ -73219,7 +73222,7 @@
 dart.defineExtensionNames([
   'waitUntil'
 ]);
-html.ExtendableEvent = class ExtendableEvent extends html.Event {
+html$.ExtendableEvent = class ExtendableEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73227,9 +73230,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ExtendableEvent._create_1(type, eventInitDict_1);
+      return html$.ExtendableEvent._create_1(type, eventInitDict_1);
     }
-    return html.ExtendableEvent._create_2(type);
+    return html$.ExtendableEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ExtendableEvent(type, eventInitDict);
@@ -73241,30 +73244,30 @@
     return this.waitUntil.apply(this, args);
   }
 };
-dart.setSignature(html.ExtendableEvent, {
+dart.setSignature(html$.ExtendableEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ExtendableEvent, []),
-    new: dart.definiteFunctionType(html.ExtendableEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ExtendableEvent, []),
+    new: dart.definiteFunctionType(html$.ExtendableEvent, [core.String], [core.Map])
   }),
   methods: () => ({[dartx.waitUntil]: dart.definiteFunctionType(dart.void, [core.Object])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ExtendableEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ExtendableEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ExtendableEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ExtendableEvent, html.ExtendableEvent);
+dart.registerExtension(dart.global.ExtendableEvent, html$.ExtendableEvent);
 dart.defineExtensionNames([
   'protocol',
   'provider'
 ]);
-html.FederatedCredential = class FederatedCredential extends html.Credential {
+html$.FederatedCredential = class FederatedCredential extends html$.Credential {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(data) {
     let data_1 = html_common.convertDartToNative_Dictionary(data);
-    return html.FederatedCredential._create_1(data_1);
+    return html$.FederatedCredential._create_1(data_1);
   }
   static _create_1(data) {
     return new self.FederatedCredential(data);
@@ -73276,25 +73279,25 @@
     return this.provider;
   }
 };
-dart.setSignature(html.FederatedCredential, {
+dart.setSignature(html$.FederatedCredential, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FederatedCredential, []),
-    new: dart.definiteFunctionType(html.FederatedCredential, [core.Map])
+    _: dart.definiteFunctionType(html$.FederatedCredential, []),
+    new: dart.definiteFunctionType(html$.FederatedCredential, [core.Map])
   }),
   fields: () => ({
     [dartx.protocol]: core.String,
     [dartx.provider]: core.String
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.FederatedCredential, [dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.FederatedCredential, [dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.FederatedCredential, html.FederatedCredential);
+dart.registerExtension(dart.global.FederatedCredential, html$.FederatedCredential);
 dart.defineExtensionNames([
   'respondWith',
   'isReload',
   'request'
 ]);
-html.FetchEvent = class FetchEvent extends html.ExtendableEvent {
+html$.FetchEvent = class FetchEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73302,9 +73305,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.FetchEvent._create_1(type, eventInitDict_1);
+      return html$.FetchEvent._create_1(type, eventInitDict_1);
     }
-    return html.FetchEvent._create_2(type);
+    return html$.FetchEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.FetchEvent(type, eventInitDict);
@@ -73322,23 +73325,23 @@
     return this.respondWith.apply(this, args);
   }
 };
-dart.setSignature(html.FetchEvent, {
+dart.setSignature(html$.FetchEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FetchEvent, []),
-    new: dart.definiteFunctionType(html.FetchEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.FetchEvent, []),
+    new: dart.definiteFunctionType(html$.FetchEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.isReload]: core.bool,
-    [dartx.request]: html._Request
+    [dartx.request]: html$._Request
   }),
   methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(dart.void, [core.Object])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.FetchEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.FetchEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FetchEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.FetchEvent, html.FetchEvent);
+dart.registerExtension(dart.global.FetchEvent, html$.FetchEvent);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -73352,12 +73355,12 @@
   'validity',
   'willValidate'
 ]);
-html.FieldSetElement = class FieldSetElement extends html.HtmlElement {
+html$.FieldSetElement = class FieldSetElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.FieldSetElement._check(html.document[dartx.createElement]("fieldset"));
+    return html$.FieldSetElement._check(html$.document[dartx.createElement]("fieldset"));
   }
   created() {
     this[dartx.disabled] = null;
@@ -73410,21 +73413,21 @@
     return this.setCustomValidity.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.FieldSetElement, 'created');
-dart.setSignature(html.FieldSetElement, {
+dart.defineNamedConstructor(html$.FieldSetElement, 'created');
+dart.setSignature(html$.FieldSetElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FieldSetElement, []),
-    new: dart.definiteFunctionType(html.FieldSetElement, []),
-    created: dart.definiteFunctionType(html.FieldSetElement, [])
+    _: dart.definiteFunctionType(html$.FieldSetElement, []),
+    new: dart.definiteFunctionType(html$.FieldSetElement, []),
+    created: dart.definiteFunctionType(html$.FieldSetElement, [])
   }),
   fields: () => ({
     [dartx.disabled]: core.bool,
-    [dartx.elements]: html.HtmlFormControlsCollection,
-    [dartx.form]: html.FormElement,
+    [dartx.elements]: html$.HtmlFormControlsCollection,
+    [dartx.form]: html$.FormElement,
     [dartx.name]: core.String,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.willValidate]: core.bool
   }),
   methods: () => ({
@@ -73433,7 +73436,7 @@
     [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.registerExtension(dart.global.HTMLFieldSetElement, html.FieldSetElement);
+dart.registerExtension(dart.global.HTMLFieldSetElement, html$.FieldSetElement);
 const _get_lastModifiedDate = Symbol('_get_lastModifiedDate');
 dart.defineExtensionNames([
   'lastModifiedDate',
@@ -73441,7 +73444,7 @@
   'name',
   'relativePath'
 ]);
-html.File = class File extends html.Blob {
+html$.File = class File extends html$.Blob {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73449,9 +73452,9 @@
     if (options === void 0) options = null;
     if (options != null) {
       let options_1 = html_common.convertDartToNative_Dictionary(options);
-      return html.File._create_1(fileBits, fileName, options_1);
+      return html$.File._create_1(fileBits, fileName, options_1);
     }
-    return html.File._create_2(fileBits, fileName);
+    return html$.File._create_2(fileBits, fileName);
   }
   static _create_1(fileBits, fileName, options) {
     return new self.File(fileBits, fileName, options);
@@ -73475,10 +73478,10 @@
     return this.webkitRelativePath;
   }
 };
-dart.setSignature(html.File, {
+dart.setSignature(html$.File, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.File, []),
-    new: dart.definiteFunctionType(html.File, [ListOfObject(), core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.File, []),
+    new: dart.definiteFunctionType(html$.File, [ListOfObject(), core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.lastModified]: core.int,
@@ -73488,20 +73491,20 @@
   }),
   getters: () => ({[dartx.lastModifiedDate]: dart.definiteFunctionType(core.DateTime, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.File, [dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.File, [dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.File, html.File);
-html._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html.File]));
+dart.registerExtension(dart.global.File, html$.File);
+html$._FileCallback = dart.typedef('_FileCallback', () => dart.functionType(dart.void, [html$.File]));
 const _createWriter = Symbol('_createWriter');
-const _file = Symbol('_file');
+const _file$ = Symbol('_file');
 dart.defineExtensionNames([
   'createWriter',
   'file'
 ]);
-html.FileEntry = class FileEntry extends html.Entry {
+html$.FileEntry = class FileEntry extends html$.Entry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73517,12 +73520,12 @@
     }, FileErrorToNull()));
     return completer.future;
   }
-  [_file](...args) {
+  [_file$](...args) {
     return this.file.apply(this, args);
   }
   [dartx.file]() {
-    let completer = CompleterOfFile().new();
-    this[_file](dart.fn(value => {
+    let completer = CompleterOfFile$().new();
+    this[_file$](dart.fn(value => {
       completer.complete(value);
     }, FileToNull()), dart.fn(error => {
       completer.completeError(error);
@@ -73530,20 +73533,20 @@
     return completer.future;
   }
 };
-dart.setSignature(html.FileEntry, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileEntry, [])}),
+dart.setSignature(html$.FileEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileEntry, [])}),
   methods: () => ({
-    [_createWriter]: dart.definiteFunctionType(dart.void, [html._FileWriterCallback], [html._ErrorCallback]),
-    [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html.FileWriter), []),
-    [_file]: dart.definiteFunctionType(dart.void, [html._FileCallback], [html._ErrorCallback]),
-    [dartx.file]: dart.definiteFunctionType(async.Future$(html.File), [])
+    [_createWriter]: dart.definiteFunctionType(dart.void, [html$._FileWriterCallback], [html$._ErrorCallback]),
+    [dartx.createWriter]: dart.definiteFunctionType(async.Future$(html$.FileWriter), []),
+    [_file$]: dart.definiteFunctionType(dart.void, [html$._FileCallback], [html$._ErrorCallback]),
+    [dartx.file]: dart.definiteFunctionType(async.Future$(html$.File), [])
   })
 });
-dart.registerExtension(dart.global.FileEntry, html.FileEntry);
+dart.registerExtension(dart.global.FileEntry, html$.FileEntry);
 dart.defineExtensionNames([
   'code'
 ]);
-html.FileError = class FileError extends html.DomError {
+html$.FileError = class FileError extends html$.DomError {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73551,8 +73554,8 @@
     return this.code;
   }
 };
-dart.setSignature(html.FileError, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileError, [])}),
+dart.setSignature(html$.FileError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileError, [])}),
   fields: () => ({[dartx.code]: core.int}),
   sfields: () => ({
     ABORT_ERR: core.int,
@@ -73569,19 +73572,19 @@
     TYPE_MISMATCH_ERR: core.int
   })
 });
-html.FileError.ABORT_ERR = 3;
-html.FileError.ENCODING_ERR = 5;
-html.FileError.INVALID_MODIFICATION_ERR = 9;
-html.FileError.INVALID_STATE_ERR = 7;
-html.FileError.NOT_FOUND_ERR = 1;
-html.FileError.NOT_READABLE_ERR = 4;
-html.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
-html.FileError.PATH_EXISTS_ERR = 12;
-html.FileError.QUOTA_EXCEEDED_ERR = 10;
-html.FileError.SECURITY_ERR = 2;
-html.FileError.SYNTAX_ERR = 8;
-html.FileError.TYPE_MISMATCH_ERR = 11;
-dart.registerExtension(dart.global.FileError, html.FileError);
+html$.FileError.ABORT_ERR = 3;
+html$.FileError.ENCODING_ERR = 5;
+html$.FileError.INVALID_MODIFICATION_ERR = 9;
+html$.FileError.INVALID_STATE_ERR = 7;
+html$.FileError.NOT_FOUND_ERR = 1;
+html$.FileError.NOT_READABLE_ERR = 4;
+html$.FileError.NO_MODIFICATION_ALLOWED_ERR = 6;
+html$.FileError.PATH_EXISTS_ERR = 12;
+html$.FileError.QUOTA_EXCEEDED_ERR = 10;
+html$.FileError.SECURITY_ERR = 2;
+html$.FileError.SYNTAX_ERR = 8;
+html$.FileError.TYPE_MISMATCH_ERR = 11;
+dart.registerExtension(dart.global.FileError, html$.FileError);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -73593,7 +73596,7 @@
   'elementAt',
   'item'
 ]);
-html.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.File), html.ImmutableListMixin$(html.File)) {
+html$.FileList = class FileList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.File), html$.ImmutableListMixin$(html$.File)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73639,18 +73642,18 @@
     return this.item.apply(this, args);
   }
 };
-html.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
-dart.setSignature(html.FileList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileList, [])}),
+html$.FileList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfFile()];
+dart.setSignature(html$.FileList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.File, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.File]),
-    [dartx.item]: dart.definiteFunctionType(html.File, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.File, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.File]),
+    [dartx.item]: dart.definiteFunctionType(html$.File, [core.int])
   })
 });
-dart.registerExtension(dart.global.FileList, html.FileList);
+dart.registerExtension(dart.global.FileList, html$.FileList);
 dart.defineExtensionNames([
   'result',
   'abort',
@@ -73666,7 +73669,7 @@
   'error',
   'readyState'
 ]);
-html.FileReader = class FileReader extends html.EventTarget {
+html$.FileReader = class FileReader extends html$.EventTarget {
   get [dartx.result]() {
     let res = this.result;
     if (typed_data.ByteBuffer.is(res)) {
@@ -73678,7 +73681,7 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.FileReader._create_1();
+    return html$.FileReader._create_1();
   }
   static _create_1() {
     return new self.FileReader();
@@ -73702,47 +73705,47 @@
     return this.readAsText.apply(this, args);
   }
   get [dartx.onAbort]() {
-    return html.FileReader.abortEvent.forTarget(this);
+    return html$.FileReader.abortEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.FileReader.errorEvent.forTarget(this);
+    return html$.FileReader.errorEvent.forTarget(this);
   }
   get [dartx.onLoad]() {
-    return html.FileReader.loadEvent.forTarget(this);
+    return html$.FileReader.loadEvent.forTarget(this);
   }
   get [dartx.onLoadEnd]() {
-    return html.FileReader.loadEndEvent.forTarget(this);
+    return html$.FileReader.loadEndEvent.forTarget(this);
   }
   get [dartx.onLoadStart]() {
-    return html.FileReader.loadStartEvent.forTarget(this);
+    return html$.FileReader.loadStartEvent.forTarget(this);
   }
   get [dartx.onProgress]() {
-    return html.FileReader.progressEvent.forTarget(this);
+    return html$.FileReader.progressEvent.forTarget(this);
   }
 };
-dart.setSignature(html.FileReader, {
+dart.setSignature(html$.FileReader, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FileReader, []),
-    new: dart.definiteFunctionType(html.FileReader, [])
+    _: dart.definiteFunctionType(html$.FileReader, []),
+    new: dart.definiteFunctionType(html$.FileReader, [])
   }),
   fields: () => ({
-    [dartx.error]: html.FileError,
+    [dartx.error]: html$.FileError,
     [dartx.readyState]: core.int
   }),
   getters: () => ({
     [dartx.result]: dart.definiteFunctionType(core.Object, []),
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), [])
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
-    [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html.Blob]),
-    [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html.Blob]),
-    [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html.Blob], [core.String])
+    [dartx.readAsArrayBuffer]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.readAsDataUrl]: dart.definiteFunctionType(dart.void, [html$.Blob]),
+    [dartx.readAsText]: dart.definiteFunctionType(dart.void, [html$.Blob], [core.String])
   }),
   sfields: () => ({
     abortEvent: EventStreamProviderOfProgressEvent(),
@@ -73755,13 +73758,13 @@
     EMPTY: core.int,
     LOADING: core.int
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.FileReader, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.FileReader, [])}),
   names: ['_create_1']
 });
-html.FileReader.DONE = 2;
-html.FileReader.EMPTY = 0;
-html.FileReader.LOADING = 1;
-dart.defineLazy(html.FileReader, {
+html$.FileReader.DONE = 2;
+html$.FileReader.EMPTY = 0;
+html$.FileReader.LOADING = 1;
+dart.defineLazy(html$.FileReader, {
   get abortEvent() {
     return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
   },
@@ -73781,11 +73784,11 @@
     return dart.const(new (EventStreamProviderOfProgressEvent())('progress'));
   }
 });
-dart.registerExtension(dart.global.FileReader, html.FileReader);
+dart.registerExtension(dart.global.FileReader, html$.FileReader);
 dart.defineExtensionNames([
   'type'
 ]);
-html.FileStream = class FileStream extends _interceptors.Interceptor {
+html$.FileStream = class FileStream extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73793,16 +73796,16 @@
     return this.type;
   }
 };
-dart.setSignature(html.FileStream, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileStream, [])}),
+dart.setSignature(html$.FileStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileStream, [])}),
   fields: () => ({[dartx.type]: core.String})
 });
-dart.registerExtension(dart.global.Stream, html.FileStream);
+dart.registerExtension(dart.global.Stream, html$.FileStream);
 dart.defineExtensionNames([
   'name',
   'root'
 ]);
-html.FileSystem = class FileSystem extends _interceptors.Interceptor {
+html$.FileSystem = class FileSystem extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73816,16 +73819,16 @@
     return this.root;
   }
 };
-dart.setSignature(html.FileSystem, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileSystem, [])}),
+dart.setSignature(html$.FileSystem, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileSystem, [])}),
   fields: () => ({
     [dartx.name]: core.String,
-    [dartx.root]: html.DirectoryEntry
+    [dartx.root]: html$.DirectoryEntry
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.DOMFileSystem, html.FileSystem);
-html._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html.FileSystem]));
+dart.registerExtension(dart.global.DOMFileSystem, html$.FileSystem);
+html$._FileSystemCallback = dart.typedef('_FileSystemCallback', () => dart.functionType(dart.void, [html$.FileSystem]));
 dart.defineExtensionNames([
   'abort',
   'seek',
@@ -73842,7 +73845,7 @@
   'position',
   'readyState'
 ]);
-html.FileWriter = class FileWriter extends html.EventTarget {
+html$.FileWriter = class FileWriter extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73871,45 +73874,45 @@
     return this.write.apply(this, args);
   }
   get [dartx.onAbort]() {
-    return html.FileWriter.abortEvent.forTarget(this);
+    return html$.FileWriter.abortEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.FileWriter.errorEvent.forTarget(this);
+    return html$.FileWriter.errorEvent.forTarget(this);
   }
   get [dartx.onProgress]() {
-    return html.FileWriter.progressEvent.forTarget(this);
+    return html$.FileWriter.progressEvent.forTarget(this);
   }
   get [dartx.onWrite]() {
-    return html.FileWriter.writeEvent.forTarget(this);
+    return html$.FileWriter.writeEvent.forTarget(this);
   }
   get [dartx.onWriteEnd]() {
-    return html.FileWriter.writeEndEvent.forTarget(this);
+    return html$.FileWriter.writeEndEvent.forTarget(this);
   }
   get [dartx.onWriteStart]() {
-    return html.FileWriter.writeStartEvent.forTarget(this);
+    return html$.FileWriter.writeStartEvent.forTarget(this);
   }
 };
-dart.setSignature(html.FileWriter, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FileWriter, [])}),
+dart.setSignature(html$.FileWriter, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FileWriter, [])}),
   fields: () => ({
-    [dartx.error]: html.FileError,
+    [dartx.error]: html$.FileError,
     [dartx.length]: core.int,
     [dartx.position]: core.int,
     [dartx.readyState]: core.int
   }),
   getters: () => ({
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), [])
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWrite]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWriteEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onWriteStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
     [dartx.seek]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.truncate]: dart.definiteFunctionType(dart.void, [core.int]),
-    [dartx.write]: dart.definiteFunctionType(dart.void, [html.Blob])
+    [dartx.write]: dart.definiteFunctionType(dart.void, [html$.Blob])
   }),
   sfields: () => ({
     abortEvent: EventStreamProviderOfProgressEvent(),
@@ -73923,10 +73926,10 @@
     WRITING: core.int
   })
 });
-html.FileWriter.DONE = 2;
-html.FileWriter.INIT = 0;
-html.FileWriter.WRITING = 1;
-dart.defineLazy(html.FileWriter, {
+html$.FileWriter.DONE = 2;
+html$.FileWriter.INIT = 0;
+html$.FileWriter.WRITING = 1;
+dart.defineLazy(html$.FileWriter, {
   get abortEvent() {
     return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
   },
@@ -73946,13 +73949,13 @@
     return dart.const(new (EventStreamProviderOfProgressEvent())('writestart'));
   }
 });
-dart.registerExtension(dart.global.FileWriter, html.FileWriter);
-html._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html.FileWriter]));
+dart.registerExtension(dart.global.FileWriter, html$.FileWriter);
+html$._FileWriterCallback = dart.typedef('_FileWriterCallback', () => dart.functionType(dart.void, [html$.FileWriter]));
 const _get_relatedTarget = Symbol('_get_relatedTarget');
 dart.defineExtensionNames([
   'relatedTarget'
 ]);
-html.FocusEvent = class FocusEvent extends html.UIEvent {
+html$.FocusEvent = class FocusEvent extends html$.UIEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -73960,9 +73963,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.FocusEvent._create_1(type, eventInitDict_1);
+      return html$.FocusEvent._create_1(type, eventInitDict_1);
     }
-    return html.FocusEvent._create_2(type);
+    return html$.FocusEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.FocusEvent(type, eventInitDict);
@@ -73971,26 +73974,26 @@
     return new self.FocusEvent(type);
   }
   get [dartx.relatedTarget]() {
-    return html._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
   }
   get [_get_relatedTarget]() {
     return this.relatedTarget;
   }
 };
-dart.setSignature(html.FocusEvent, {
+dart.setSignature(html$.FocusEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FocusEvent, []),
-    new: dart.definiteFunctionType(html.FocusEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.FocusEvent, []),
+    new: dart.definiteFunctionType(html$.FocusEvent, [core.String], [core.Map])
   }),
   fields: () => ({[_get_relatedTarget]: dart.dynamic}),
-  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html.EventTarget, [])}),
+  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.FocusEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.FocusEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FocusEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.FocusEvent, html.FocusEvent);
+dart.registerExtension(dart.global.FocusEvent, html$.FocusEvent);
 dart.defineExtensionNames([
   'load',
   'family',
@@ -74003,7 +74006,7 @@
   'variant',
   'weight'
 ]);
-html.FontFace = class FontFace extends _interceptors.Interceptor {
+html$.FontFace = class FontFace extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74011,9 +74014,9 @@
     if (descriptors === void 0) descriptors = null;
     if (descriptors != null) {
       let descriptors_1 = html_common.convertDartToNative_Dictionary(descriptors);
-      return html.FontFace._create_1(family, source, descriptors_1);
+      return html$.FontFace._create_1(family, source, descriptors_1);
     }
-    return html.FontFace._create_2(family, source);
+    return html$.FontFace._create_2(family, source);
   }
   static _create_1(family, source, descriptors) {
     return new self.FontFace(family, source, descriptors);
@@ -74073,10 +74076,10 @@
     return this.load.apply(this, args);
   }
 };
-dart.setSignature(html.FontFace, {
+dart.setSignature(html$.FontFace, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FontFace, []),
-    new: dart.definiteFunctionType(html.FontFace, [core.String, core.Object], [core.Map])
+    _: dart.definiteFunctionType(html$.FontFace, []),
+    new: dart.definiteFunctionType(html$.FontFace, [core.String, core.Object], [core.Map])
   }),
   fields: () => ({
     [dartx.family]: core.String,
@@ -74091,12 +74094,12 @@
   }),
   methods: () => ({[dartx.load]: dart.definiteFunctionType(async.Future, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.FontFace, [dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FontFace, [dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.FontFace, html.FontFace);
+dart.registerExtension(dart.global.FontFace, html$.FontFace);
 dart.defineExtensionNames([
   'add',
   'check',
@@ -74107,7 +74110,7 @@
   'size',
   'status'
 ]);
-html.FontFaceSet = class FontFaceSet extends html.EventTarget {
+html$.FontFaceSet = class FontFaceSet extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74136,27 +74139,27 @@
     return this.has.apply(this, args);
   }
 };
-dart.setSignature(html.FontFaceSet, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FontFaceSet, [])}),
+dart.setSignature(html$.FontFaceSet, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSet, [])}),
   fields: () => ({
     [dartx.size]: core.int,
     [dartx.status]: core.String
   }),
   methods: () => ({
-    [dartx.add]: dart.definiteFunctionType(dart.void, [html.FontFace]),
+    [dartx.add]: dart.definiteFunctionType(dart.void, [html$.FontFace]),
     [dartx.check]: dart.definiteFunctionType(core.bool, [core.String], [core.String]),
     [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-    [dartx.delete]: dart.definiteFunctionType(core.bool, [html.FontFace]),
-    [dartx.forEach]: dart.definiteFunctionType(dart.void, [html.FontFaceSetForEachCallback], [core.Object]),
-    [dartx.has]: dart.definiteFunctionType(core.bool, [html.FontFace])
+    [dartx.delete]: dart.definiteFunctionType(core.bool, [html$.FontFace]),
+    [dartx.forEach]: dart.definiteFunctionType(dart.void, [html$.FontFaceSetForEachCallback], [core.Object]),
+    [dartx.has]: dart.definiteFunctionType(core.bool, [html$.FontFace])
   })
 });
-dart.registerExtension(dart.global.FontFaceSet, html.FontFaceSet);
-html.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html.FontFace, html.FontFace, html.FontFaceSet]));
+dart.registerExtension(dart.global.FontFaceSet, html$.FontFaceSet);
+html$.FontFaceSetForEachCallback = dart.typedef('FontFaceSetForEachCallback', () => dart.functionType(dart.void, [html$.FontFace, html$.FontFace, html$.FontFaceSet]));
 dart.defineExtensionNames([
   'fontfaces'
 ]);
-html.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html.Event {
+html$.FontFaceSetLoadEvent = class FontFaceSetLoadEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74164,11 +74167,11 @@
     return this.fontfaces;
   }
 };
-dart.setSignature(html.FontFaceSetLoadEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.FontFaceSetLoadEvent, [])}),
+dart.setSignature(html$.FontFaceSetLoadEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.FontFaceSetLoadEvent, [])}),
   fields: () => ({[dartx.fontfaces]: ListOfFontFace()})
 });
-dart.registerExtension(dart.global.FontFaceSetLoadEvent, html.FontFaceSetLoadEvent);
+dart.registerExtension(dart.global.FontFaceSetLoadEvent, html$.FontFaceSetLoadEvent);
 dart.defineExtensionNames([
   'append',
   'appendBlob',
@@ -74178,16 +74181,16 @@
   'has',
   'set'
 ]);
-html.FormData = class FormData extends _interceptors.Interceptor {
+html$.FormData = class FormData extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(form) {
     if (form === void 0) form = null;
     if (form != null) {
-      return html.FormData._create_1(form);
+      return html$.FormData._create_1(form);
     }
-    return html.FormData._create_2();
+    return html$.FormData._create_2();
   }
   static _create_1(form) {
     return new self.FormData(form);
@@ -74220,14 +74223,14 @@
     return this.set.apply(this, args);
   }
 };
-dart.setSignature(html.FormData, {
+dart.setSignature(html$.FormData, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FormData, []),
-    new: dart.definiteFunctionType(html.FormData, [], [html.FormElement])
+    _: dart.definiteFunctionType(html$.FormData, []),
+    new: dart.definiteFunctionType(html$.FormData, [], [html$.FormElement])
   }),
   methods: () => ({
     [dartx.append]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
-    [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html.Blob], [core.String]),
+    [dartx.appendBlob]: dart.definiteFunctionType(dart.void, [core.String, html$.Blob], [core.String]),
     [dartx.delete]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.get]: dart.definiteFunctionType(core.Object, [core.String]),
     [dartx.getAll]: dart.definiteFunctionType(core.List$(core.Object), [core.String]),
@@ -74236,12 +74239,12 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.FormData, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.FormData, [])
+    _create_1: dart.definiteFunctionType(html$.FormData, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.FormData, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.FormData, html.FormData);
+dart.registerExtension(dart.global.FormData, html$.FormData);
 const _requestAutocomplete_1 = Symbol('_requestAutocomplete_1');
 dart.defineExtensionNames([
   'checkValidity',
@@ -74261,12 +74264,12 @@
   'noValidate',
   'target'
 ]);
-html.FormElement = class FormElement extends html.HtmlElement {
+html$.FormElement = class FormElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.FormElement._check(html.document[dartx.createElement]("form"));
+    return html$.FormElement._check(html$.document[dartx.createElement]("form"));
   }
   created() {
     this[dartx.acceptCharset] = null;
@@ -74365,12 +74368,12 @@
     return this.submit.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.FormElement, 'created');
-dart.setSignature(html.FormElement, {
+dart.defineNamedConstructor(html$.FormElement, 'created');
+dart.setSignature(html$.FormElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.FormElement, []),
-    new: dart.definiteFunctionType(html.FormElement, []),
-    created: dart.definiteFunctionType(html.FormElement, [])
+    _: dart.definiteFunctionType(html$.FormElement, []),
+    new: dart.definiteFunctionType(html$.FormElement, []),
+    created: dart.definiteFunctionType(html$.FormElement, [])
   }),
   fields: () => ({
     [dartx.acceptCharset]: core.String,
@@ -74387,7 +74390,7 @@
   methods: () => ({
     [__getter__]: dart.definiteFunctionType(core.Object, [core.String]),
     [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-    [dartx.item]: dart.definiteFunctionType(html.Element, [core.int]),
+    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
     [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
     [dartx.requestAutocomplete]: dart.definiteFunctionType(dart.void, [core.Map]),
     [_requestAutocomplete_1]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
@@ -74395,8 +74398,8 @@
     [dartx.submit]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.HTMLFormElement, html.FormElement);
-html.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
+dart.registerExtension(dart.global.HTMLFormElement, html$.FormElement);
+html$.FrameRequestCallback = dart.typedef('FrameRequestCallback', () => dart.functionType(dart.void, [core.num]));
 dart.defineExtensionNames([
   'axes',
   'buttons',
@@ -74406,7 +74409,7 @@
   'mapping',
   'timestamp'
 ]);
-html.Gamepad = class Gamepad extends _interceptors.Interceptor {
+html$.Gamepad = class Gamepad extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74432,8 +74435,8 @@
     return this.timestamp;
   }
 };
-dart.setSignature(html.Gamepad, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Gamepad, [])}),
+dart.setSignature(html$.Gamepad, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Gamepad, [])}),
   fields: () => ({
     [dartx.axes]: ListOfnum(),
     [dartx.buttons]: ListOfGamepadButton(),
@@ -74444,12 +74447,12 @@
     [dartx.timestamp]: core.int
   })
 });
-dart.registerExtension(dart.global.Gamepad, html.Gamepad);
+dart.registerExtension(dart.global.Gamepad, html$.Gamepad);
 dart.defineExtensionNames([
   'pressed',
   'value'
 ]);
-html.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
+html$.GamepadButton = class GamepadButton extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74460,18 +74463,18 @@
     return this.value;
   }
 };
-dart.setSignature(html.GamepadButton, {
-  constructors: () => ({_: dart.definiteFunctionType(html.GamepadButton, [])}),
+dart.setSignature(html$.GamepadButton, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GamepadButton, [])}),
   fields: () => ({
     [dartx.pressed]: core.bool,
     [dartx.value]: core.double
   })
 });
-dart.registerExtension(dart.global.GamepadButton, html.GamepadButton);
+dart.registerExtension(dart.global.GamepadButton, html$.GamepadButton);
 dart.defineExtensionNames([
   'gamepad'
 ]);
-html.GamepadEvent = class GamepadEvent extends html.Event {
+html$.GamepadEvent = class GamepadEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74479,9 +74482,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.GamepadEvent._create_1(type, eventInitDict_1);
+      return html$.GamepadEvent._create_1(type, eventInitDict_1);
     }
-    return html.GamepadEvent._create_2(type);
+    return html$.GamepadEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.GamepadEvent(type, eventInitDict);
@@ -74493,25 +74496,25 @@
     return this.gamepad;
   }
 };
-dart.setSignature(html.GamepadEvent, {
+dart.setSignature(html$.GamepadEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.GamepadEvent, []),
-    new: dart.definiteFunctionType(html.GamepadEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.GamepadEvent, []),
+    new: dart.definiteFunctionType(html$.GamepadEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.gamepad]: html.Gamepad}),
+  fields: () => ({[dartx.gamepad]: html$.Gamepad}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.GamepadEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.GamepadEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.GamepadEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.GamepadEvent, html.GamepadEvent);
+dart.registerExtension(dart.global.GamepadEvent, html$.GamepadEvent);
 dart.defineExtensionNames([
   'getRegisteredRegions',
   'registerRegion',
   'unregisterRegion'
 ]);
-html.Geofencing = class Geofencing extends _interceptors.Interceptor {
+html$.Geofencing = class Geofencing extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74525,20 +74528,20 @@
     return this.unregisterRegion.apply(this, args);
   }
 };
-dart.setSignature(html.Geofencing, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Geofencing, [])}),
+dart.setSignature(html$.Geofencing, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geofencing, [])}),
   methods: () => ({
     [dartx.getRegisteredRegions]: dart.definiteFunctionType(async.Future, []),
-    [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html.GeofencingRegion]),
+    [dartx.registerRegion]: dart.definiteFunctionType(async.Future, [html$.GeofencingRegion]),
     [dartx.unregisterRegion]: dart.definiteFunctionType(async.Future, [core.String])
   })
 });
-dart.registerExtension(dart.global.Geofencing, html.Geofencing);
+dart.registerExtension(dart.global.Geofencing, html$.Geofencing);
 dart.defineExtensionNames([
   'id',
   'region'
 ]);
-html.GeofencingEvent = class GeofencingEvent extends html.Event {
+html$.GeofencingEvent = class GeofencingEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74549,14 +74552,14 @@
     return this.region;
   }
 };
-dart.setSignature(html.GeofencingEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.GeofencingEvent, [])}),
+dart.setSignature(html$.GeofencingEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GeofencingEvent, [])}),
   fields: () => ({
     [dartx.id]: core.String,
-    [dartx.region]: html.GeofencingRegion
+    [dartx.region]: html$.GeofencingRegion
   })
 });
-dart.registerExtension(dart.global.GeofencingEvent, html.GeofencingEvent);
+dart.registerExtension(dart.global.GeofencingEvent, html$.GeofencingEvent);
 const _getCurrentPosition = Symbol('_getCurrentPosition');
 const _ensurePosition = Symbol('_ensurePosition');
 const _watchPosition = Symbol('_watchPosition');
@@ -74571,7 +74574,7 @@
   'getCurrentPosition',
   'watchPosition'
 ]);
-html.Geolocation = class Geolocation extends _interceptors.Interceptor {
+html$.Geolocation = class Geolocation extends _interceptors.Interceptor {
   [dartx.getCurrentPosition](opts) {
     let enableHighAccuracy = opts && 'enableHighAccuracy' in opts ? opts.enableHighAccuracy : null;
     let timeout = opts && 'timeout' in opts ? opts.timeout : null;
@@ -74631,13 +74634,13 @@
   }
   [_ensurePosition](domPosition) {
     try {
-      if (html.Geoposition.is(domPosition)) {
+      if (html$.Geoposition.is(domPosition)) {
         return domPosition;
       }
     } catch (e) {
     }
 
-    return new html._GeopositionWrapper(domPosition);
+    return new html$._GeopositionWrapper(domPosition);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -74691,25 +74694,25 @@
     return this.watchPosition.apply(this, args);
   }
 };
-dart.setSignature(html.Geolocation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Geolocation, [])}),
+dart.setSignature(html$.Geolocation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geolocation, [])}),
   methods: () => ({
-    [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
-    [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
-    [_ensurePosition]: dart.definiteFunctionType(html.Geoposition, [dart.dynamic]),
+    [dartx.getCurrentPosition]: dart.definiteFunctionType(async.Future$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
+    [dartx.watchPosition]: dart.definiteFunctionType(async.Stream$(html$.Geoposition), [], {enableHighAccuracy: core.bool, timeout: core.Duration, maximumAge: core.Duration}),
+    [_ensurePosition]: dart.definiteFunctionType(html$.Geoposition, [dart.dynamic]),
     [_clearWatch]: dart.definiteFunctionType(dart.void, [core.int]),
-    [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html._PositionCallback], [html._PositionErrorCallback, core.Map]),
-    [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html._PositionCallback, html._PositionErrorCallback, dart.dynamic]),
-    [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html._PositionCallback, html._PositionErrorCallback]),
-    [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html._PositionCallback]),
-    [_watchPosition]: dart.definiteFunctionType(core.int, [html._PositionCallback], [html._PositionErrorCallback, core.Map]),
-    [_watchPosition_1]: dart.definiteFunctionType(core.int, [html._PositionCallback, html._PositionErrorCallback, dart.dynamic]),
-    [_watchPosition_2]: dart.definiteFunctionType(core.int, [html._PositionCallback, html._PositionErrorCallback]),
-    [_watchPosition_3]: dart.definiteFunctionType(core.int, [html._PositionCallback])
+    [_getCurrentPosition]: dart.definiteFunctionType(dart.void, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
+    [_getCurrentPosition_1]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
+    [_getCurrentPosition_2]: dart.definiteFunctionType(dart.void, [html$._PositionCallback, html$._PositionErrorCallback]),
+    [_getCurrentPosition_3]: dart.definiteFunctionType(dart.void, [html$._PositionCallback]),
+    [_watchPosition]: dart.definiteFunctionType(core.int, [html$._PositionCallback], [html$._PositionErrorCallback, core.Map]),
+    [_watchPosition_1]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback, dart.dynamic]),
+    [_watchPosition_2]: dart.definiteFunctionType(core.int, [html$._PositionCallback, html$._PositionErrorCallback]),
+    [_watchPosition_3]: dart.definiteFunctionType(core.int, [html$._PositionCallback])
   })
 });
-dart.registerExtension(dart.global.Geolocation, html.Geolocation);
-html._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
+dart.registerExtension(dart.global.Geolocation, html$.Geolocation);
+html$._GeopositionWrapper = class _GeopositionWrapper extends core.Object {
   new(ptr) {
     this[_ptr] = ptr;
   }
@@ -74720,12 +74723,12 @@
     return this[_ptr].timestamp;
   }
 };
-html._GeopositionWrapper[dart.implements] = () => [html.Geoposition];
-dart.setSignature(html._GeopositionWrapper, {
-  constructors: () => ({new: dart.definiteFunctionType(html._GeopositionWrapper, [dart.dynamic])}),
+html$._GeopositionWrapper[dart.implements] = () => [html$.Geoposition];
+dart.setSignature(html$._GeopositionWrapper, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._GeopositionWrapper, [dart.dynamic])}),
   fields: () => ({[_ptr]: dart.dynamic}),
   getters: () => ({
-    coords: dart.definiteFunctionType(html.Coordinates, []),
+    coords: dart.definiteFunctionType(html$.Coordinates, []),
     timestamp: dart.definiteFunctionType(core.int, [])
   })
 });
@@ -74733,7 +74736,7 @@
   'coords',
   'timestamp'
 ]);
-html.Geoposition = class Geoposition extends _interceptors.Interceptor {
+html$.Geoposition = class Geoposition extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -74744,14 +74747,14 @@
     return this.timestamp;
   }
 };
-dart.setSignature(html.Geoposition, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Geoposition, [])}),
+dart.setSignature(html$.Geoposition, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Geoposition, [])}),
   fields: () => ({
-    [dartx.coords]: html.Coordinates,
+    [dartx.coords]: html$.Coordinates,
     [dartx.timestamp]: core.int
   })
 });
-dart.registerExtension(dart.global.Geoposition, html.Geoposition);
+dart.registerExtension(dart.global.Geoposition, html$.Geoposition);
 dart.defineExtensionNames([
   'onAbort',
   'onBlur',
@@ -74806,223 +74809,223 @@
   'onVolumeChange',
   'onWaiting'
 ]);
-html.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
+html$.GlobalEventHandlers = class GlobalEventHandlers extends core.Object {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get onAbort() {
-    return html.GlobalEventHandlers.abortEvent.forTarget(this);
+    return html$.GlobalEventHandlers.abortEvent.forTarget(this);
   }
   get onBlur() {
-    return html.GlobalEventHandlers.blurEvent.forTarget(this);
+    return html$.GlobalEventHandlers.blurEvent.forTarget(this);
   }
   get onCanPlay() {
-    return html.GlobalEventHandlers.canPlayEvent.forTarget(this);
+    return html$.GlobalEventHandlers.canPlayEvent.forTarget(this);
   }
   get onCanPlayThrough() {
-    return html.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
+    return html$.GlobalEventHandlers.canPlayThroughEvent.forTarget(this);
   }
   get onChange() {
-    return html.GlobalEventHandlers.changeEvent.forTarget(this);
+    return html$.GlobalEventHandlers.changeEvent.forTarget(this);
   }
   get onClick() {
-    return html.GlobalEventHandlers.clickEvent.forTarget(this);
+    return html$.GlobalEventHandlers.clickEvent.forTarget(this);
   }
   get onContextMenu() {
-    return html.GlobalEventHandlers.contextMenuEvent.forTarget(this);
+    return html$.GlobalEventHandlers.contextMenuEvent.forTarget(this);
   }
   get onDoubleClick() {
-    return html.GlobalEventHandlers.doubleClickEvent.forTarget(this);
+    return html$.GlobalEventHandlers.doubleClickEvent.forTarget(this);
   }
   get onDrag() {
-    return html.GlobalEventHandlers.dragEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragEvent.forTarget(this);
   }
   get onDragEnd() {
-    return html.GlobalEventHandlers.dragEndEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragEndEvent.forTarget(this);
   }
   get onDragEnter() {
-    return html.GlobalEventHandlers.dragEnterEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragEnterEvent.forTarget(this);
   }
   get onDragLeave() {
-    return html.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragLeaveEvent.forTarget(this);
   }
   get onDragOver() {
-    return html.GlobalEventHandlers.dragOverEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragOverEvent.forTarget(this);
   }
   get onDragStart() {
-    return html.GlobalEventHandlers.dragStartEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dragStartEvent.forTarget(this);
   }
   get onDrop() {
-    return html.GlobalEventHandlers.dropEvent.forTarget(this);
+    return html$.GlobalEventHandlers.dropEvent.forTarget(this);
   }
   get onDurationChange() {
-    return html.GlobalEventHandlers.durationChangeEvent.forTarget(this);
+    return html$.GlobalEventHandlers.durationChangeEvent.forTarget(this);
   }
   get onEmptied() {
-    return html.GlobalEventHandlers.emptiedEvent.forTarget(this);
+    return html$.GlobalEventHandlers.emptiedEvent.forTarget(this);
   }
   get onEnded() {
-    return html.GlobalEventHandlers.endedEvent.forTarget(this);
+    return html$.GlobalEventHandlers.endedEvent.forTarget(this);
   }
   get onError() {
-    return html.GlobalEventHandlers.errorEvent.forTarget(this);
+    return html$.GlobalEventHandlers.errorEvent.forTarget(this);
   }
   get onFocus() {
-    return html.GlobalEventHandlers.focusEvent.forTarget(this);
+    return html$.GlobalEventHandlers.focusEvent.forTarget(this);
   }
   get onInput() {
-    return html.GlobalEventHandlers.inputEvent.forTarget(this);
+    return html$.GlobalEventHandlers.inputEvent.forTarget(this);
   }
   get onInvalid() {
-    return html.GlobalEventHandlers.invalidEvent.forTarget(this);
+    return html$.GlobalEventHandlers.invalidEvent.forTarget(this);
   }
   get onKeyDown() {
-    return html.GlobalEventHandlers.keyDownEvent.forTarget(this);
+    return html$.GlobalEventHandlers.keyDownEvent.forTarget(this);
   }
   get onKeyPress() {
-    return html.GlobalEventHandlers.keyPressEvent.forTarget(this);
+    return html$.GlobalEventHandlers.keyPressEvent.forTarget(this);
   }
   get onKeyUp() {
-    return html.GlobalEventHandlers.keyUpEvent.forTarget(this);
+    return html$.GlobalEventHandlers.keyUpEvent.forTarget(this);
   }
   get onLoad() {
-    return html.GlobalEventHandlers.loadEvent.forTarget(this);
+    return html$.GlobalEventHandlers.loadEvent.forTarget(this);
   }
   get onLoadedData() {
-    return html.GlobalEventHandlers.loadedDataEvent.forTarget(this);
+    return html$.GlobalEventHandlers.loadedDataEvent.forTarget(this);
   }
   get onLoadedMetadata() {
-    return html.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
+    return html$.GlobalEventHandlers.loadedMetadataEvent.forTarget(this);
   }
   get onMouseDown() {
-    return html.GlobalEventHandlers.mouseDownEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseDownEvent.forTarget(this);
   }
   get onMouseEnter() {
-    return html.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseEnterEvent.forTarget(this);
   }
   get onMouseLeave() {
-    return html.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseLeaveEvent.forTarget(this);
   }
   get onMouseMove() {
-    return html.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseMoveEvent.forTarget(this);
   }
   get onMouseOut() {
-    return html.GlobalEventHandlers.mouseOutEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseOutEvent.forTarget(this);
   }
   get onMouseOver() {
-    return html.GlobalEventHandlers.mouseOverEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseOverEvent.forTarget(this);
   }
   get onMouseUp() {
-    return html.GlobalEventHandlers.mouseUpEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseUpEvent.forTarget(this);
   }
   get onMouseWheel() {
-    return html.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
+    return html$.GlobalEventHandlers.mouseWheelEvent.forTarget(this);
   }
   get onPause() {
-    return html.GlobalEventHandlers.pauseEvent.forTarget(this);
+    return html$.GlobalEventHandlers.pauseEvent.forTarget(this);
   }
   get onPlay() {
-    return html.GlobalEventHandlers.playEvent.forTarget(this);
+    return html$.GlobalEventHandlers.playEvent.forTarget(this);
   }
   get onPlaying() {
-    return html.GlobalEventHandlers.playingEvent.forTarget(this);
+    return html$.GlobalEventHandlers.playingEvent.forTarget(this);
   }
   get onRateChange() {
-    return html.GlobalEventHandlers.rateChangeEvent.forTarget(this);
+    return html$.GlobalEventHandlers.rateChangeEvent.forTarget(this);
   }
   get onReset() {
-    return html.GlobalEventHandlers.resetEvent.forTarget(this);
+    return html$.GlobalEventHandlers.resetEvent.forTarget(this);
   }
   get onResize() {
-    return html.GlobalEventHandlers.resizeEvent.forTarget(this);
+    return html$.GlobalEventHandlers.resizeEvent.forTarget(this);
   }
   get onScroll() {
-    return html.GlobalEventHandlers.scrollEvent.forTarget(this);
+    return html$.GlobalEventHandlers.scrollEvent.forTarget(this);
   }
   get onSeeked() {
-    return html.GlobalEventHandlers.seekedEvent.forTarget(this);
+    return html$.GlobalEventHandlers.seekedEvent.forTarget(this);
   }
   get onSeeking() {
-    return html.GlobalEventHandlers.seekingEvent.forTarget(this);
+    return html$.GlobalEventHandlers.seekingEvent.forTarget(this);
   }
   get onSelect() {
-    return html.GlobalEventHandlers.selectEvent.forTarget(this);
+    return html$.GlobalEventHandlers.selectEvent.forTarget(this);
   }
   get onStalled() {
-    return html.GlobalEventHandlers.stalledEvent.forTarget(this);
+    return html$.GlobalEventHandlers.stalledEvent.forTarget(this);
   }
   get onSubmit() {
-    return html.GlobalEventHandlers.submitEvent.forTarget(this);
+    return html$.GlobalEventHandlers.submitEvent.forTarget(this);
   }
   get onSuspend() {
-    return html.GlobalEventHandlers.suspendEvent.forTarget(this);
+    return html$.GlobalEventHandlers.suspendEvent.forTarget(this);
   }
   get onTimeUpdate() {
-    return html.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
+    return html$.GlobalEventHandlers.timeUpdateEvent.forTarget(this);
   }
   get onVolumeChange() {
-    return html.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
+    return html$.GlobalEventHandlers.volumeChangeEvent.forTarget(this);
   }
   get onWaiting() {
-    return html.GlobalEventHandlers.waitingEvent.forTarget(this);
+    return html$.GlobalEventHandlers.waitingEvent.forTarget(this);
   }
 };
-html.GlobalEventHandlers[dart.implements] = () => [html.EventTarget];
-dart.setSignature(html.GlobalEventHandlers, {
-  constructors: () => ({_: dart.definiteFunctionType(html.GlobalEventHandlers, [])}),
+html$.GlobalEventHandlers[dart.implements] = () => [html$.EventTarget];
+dart.setSignature(html$.GlobalEventHandlers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.GlobalEventHandlers, [])}),
   getters: () => ({
-    onAbort: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onBlur: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onCanPlay: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onChange: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onClick: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onContextMenu: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDoubleClick: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onDrag: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDragEnd: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDragEnter: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDragLeave: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDragOver: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDragStart: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDrop: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onDurationChange: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onEmptied: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onEnded: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onError: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onFocus: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onInput: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onInvalid: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onKeyDown: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    onKeyPress: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    onKeyUp: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    onLoad: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onLoadedData: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onMouseDown: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseEnter: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseLeave: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseMove: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseOut: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseOver: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseUp: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    onMouseWheel: dart.definiteFunctionType(async.Stream$(html.WheelEvent), []),
-    onPause: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onPlay: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onPlaying: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onRateChange: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onReset: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onResize: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onScroll: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onSeeked: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onSeeking: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onSelect: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onStalled: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onSubmit: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onSuspend: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onTimeUpdate: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onVolumeChange: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onWaiting: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    onAbort: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onBlur: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onCanPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onCanPlayThrough: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onClick: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onContextMenu: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDoubleClick: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onDrag: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragEnd: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDragStart: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDrop: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onDurationChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onEmptied: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onEnded: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onError: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onFocus: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onInput: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onInvalid: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onKeyDown: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onKeyPress: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onKeyUp: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    onLoad: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onLoadedData: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onLoadedMetadata: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onMouseDown: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseEnter: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseLeave: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseMove: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseOut: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseOver: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseUp: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    onMouseWheel: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    onPause: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPlay: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPlaying: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onRateChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onReset: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onResize: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onScroll: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSeeked: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSeeking: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSelect: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onStalled: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSubmit: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onSuspend: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onTimeUpdate: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onVolumeChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onWaiting: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   sfields: () => ({
     abortEvent: EventStreamProviderOfEvent(),
@@ -75079,7 +75082,7 @@
     waitingEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineExtensionMembers(html.GlobalEventHandlers, [
+dart.defineExtensionMembers(html$.GlobalEventHandlers, [
   'onAbort',
   'onBlur',
   'onCanPlay',
@@ -75133,7 +75136,7 @@
   'onVolumeChange',
   'onWaiting'
 ]);
-dart.defineLazy(html.GlobalEventHandlers, {
+dart.defineLazy(html$.GlobalEventHandlers, {
   get abortEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('abort'));
   },
@@ -75294,12 +75297,12 @@
 dart.defineExtensionNames([
   'color'
 ]);
-html.HRElement = class HRElement extends html.HtmlElement {
+html$.HRElement = class HRElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.HRElement._check(html.document[dartx.createElement]("hr"));
+    return html$.HRElement._check(html$.document[dartx.createElement]("hr"));
   }
   created() {
     this[dartx.color] = null;
@@ -75312,22 +75315,22 @@
     this.color = value;
   }
 };
-dart.defineNamedConstructor(html.HRElement, 'created');
-dart.setSignature(html.HRElement, {
+dart.defineNamedConstructor(html$.HRElement, 'created');
+dart.setSignature(html$.HRElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.HRElement, []),
-    new: dart.definiteFunctionType(html.HRElement, []),
-    created: dart.definiteFunctionType(html.HRElement, [])
+    _: dart.definiteFunctionType(html$.HRElement, []),
+    new: dart.definiteFunctionType(html$.HRElement, []),
+    created: dart.definiteFunctionType(html$.HRElement, [])
   }),
   fields: () => ({[dartx.color]: core.String})
 });
-dart.registerExtension(dart.global.HTMLHRElement, html.HRElement);
+dart.registerExtension(dart.global.HTMLHRElement, html$.HRElement);
 const _initHashChangeEvent = Symbol('_initHashChangeEvent');
 dart.defineExtensionNames([
   'newUrl',
   'oldUrl'
 ]);
-html.HashChangeEvent = class HashChangeEvent extends html.Event {
+html$.HashChangeEvent = class HashChangeEvent extends html$.Event {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : true;
@@ -75340,9 +75343,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.HashChangeEvent._create_1(type, eventInitDict_1);
+      return html$.HashChangeEvent._create_1(type, eventInitDict_1);
     }
-    return html.HashChangeEvent._create_2(type);
+    return html$.HashChangeEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.HashChangeEvent(type, eventInitDict);
@@ -75363,10 +75366,10 @@
     return this.initHashChangeEvent.apply(this, args);
   }
 };
-dart.setSignature(html.HashChangeEvent, {
+dart.setSignature(html$.HashChangeEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
-    _: dart.definiteFunctionType(html.HashChangeEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, oldUrl: core.String, newUrl: core.String}),
+    _: dart.definiteFunctionType(html$.HashChangeEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.newUrl]: core.String,
@@ -75375,50 +75378,50 @@
   methods: () => ({[_initHashChangeEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.HashChangeEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.HashChangeEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.HashChangeEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.HashChangeEvent, html.HashChangeEvent);
-html.HeadElement = class HeadElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HashChangeEvent, html$.HashChangeEvent);
+html$.HeadElement = class HeadElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.HeadElement._check(html.document[dartx.createElement]("head"));
+    return html$.HeadElement._check(html$.document[dartx.createElement]("head"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.HeadElement, 'created');
-dart.setSignature(html.HeadElement, {
+dart.defineNamedConstructor(html$.HeadElement, 'created');
+dart.setSignature(html$.HeadElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.HeadElement, []),
-    new: dart.definiteFunctionType(html.HeadElement, []),
-    created: dart.definiteFunctionType(html.HeadElement, [])
+    _: dart.definiteFunctionType(html$.HeadElement, []),
+    new: dart.definiteFunctionType(html$.HeadElement, []),
+    created: dart.definiteFunctionType(html$.HeadElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLHeadElement, html.HeadElement);
-html.Headers = class Headers extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.HTMLHeadElement, html$.HeadElement);
+html$.Headers = class Headers extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(input) {
     if (input === void 0) input = null;
     if (input == null) {
-      return html.Headers._create_1();
+      return html$.Headers._create_1();
     }
-    if (html.Headers.is(input)) {
-      return html.Headers._create_2(input);
+    if (html$.Headers.is(input)) {
+      return html$.Headers._create_2(input);
     }
     if (core.Map.is(input)) {
       let input_1 = html_common.convertDartToNative_Dictionary(input);
-      return html.Headers._create_3(input_1);
+      return html$.Headers._create_3(input_1);
     }
     if (ListOfObject().is(input)) {
-      return html.Headers._create_4(input);
+      return html$.Headers._create_4(input);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -75435,60 +75438,60 @@
     return new self.Headers(input);
   }
 };
-dart.setSignature(html.Headers, {
+dart.setSignature(html$.Headers, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.Headers, []),
-    new: dart.definiteFunctionType(html.Headers, [], [dart.dynamic])
+    _: dart.definiteFunctionType(html$.Headers, []),
+    new: dart.definiteFunctionType(html$.Headers, [], [dart.dynamic])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.Headers, []),
-    _create_2: dart.definiteFunctionType(html.Headers, [dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.Headers, [dart.dynamic]),
-    _create_4: dart.definiteFunctionType(html.Headers, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.Headers, []),
+    _create_2: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.Headers, [dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.Headers, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3', '_create_4']
 });
-dart.registerExtension(dart.global.Headers, html.Headers);
-html.HeadingElement = class HeadingElement extends html.HtmlElement {
+dart.registerExtension(dart.global.Headers, html$.Headers);
+html$.HeadingElement = class HeadingElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static h1() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h1"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h1"));
   }
   static h2() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h2"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h2"));
   }
   static h3() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h3"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h3"));
   }
   static h4() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h4"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h4"));
   }
   static h5() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h5"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h5"));
   }
   static h6() {
-    return html.HeadingElement._check(html.document[dartx.createElement]("h6"));
+    return html$.HeadingElement._check(html$.document[dartx.createElement]("h6"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.HeadingElement, 'created');
-dart.setSignature(html.HeadingElement, {
+dart.defineNamedConstructor(html$.HeadingElement, 'created');
+dart.setSignature(html$.HeadingElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.HeadingElement, []),
-    h1: dart.definiteFunctionType(html.HeadingElement, []),
-    h2: dart.definiteFunctionType(html.HeadingElement, []),
-    h3: dart.definiteFunctionType(html.HeadingElement, []),
-    h4: dart.definiteFunctionType(html.HeadingElement, []),
-    h5: dart.definiteFunctionType(html.HeadingElement, []),
-    h6: dart.definiteFunctionType(html.HeadingElement, []),
-    created: dart.definiteFunctionType(html.HeadingElement, [])
+    _: dart.definiteFunctionType(html$.HeadingElement, []),
+    h1: dart.definiteFunctionType(html$.HeadingElement, []),
+    h2: dart.definiteFunctionType(html$.HeadingElement, []),
+    h3: dart.definiteFunctionType(html$.HeadingElement, []),
+    h4: dart.definiteFunctionType(html$.HeadingElement, []),
+    h5: dart.definiteFunctionType(html$.HeadingElement, []),
+    h6: dart.definiteFunctionType(html$.HeadingElement, []),
+    created: dart.definiteFunctionType(html$.HeadingElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLHeadingElement, html.HeadingElement);
+dart.registerExtension(dart.global.HTMLHeadingElement, html$.HeadingElement);
 const _get_options = Symbol('_get_options');
 const _get_state = Symbol('_get_state');
 const _pushState_1 = Symbol('_pushState_1');
@@ -75505,7 +75508,7 @@
   'replaceState',
   'length'
 ]);
-html.History = class History extends _interceptors.Interceptor {
+html$.History = class History extends _interceptors.Interceptor {
   static get supportsState() {
     return !!window.history.pushState;
   }
@@ -75573,9 +75576,9 @@
     return this.replaceState.apply(this, args);
   }
 };
-html.History[dart.implements] = () => [html.HistoryBase];
-dart.setSignature(html.History, {
-  constructors: () => ({_: dart.definiteFunctionType(html.History, [])}),
+html$.History[dart.implements] = () => [html$.HistoryBase];
+dart.setSignature(html$.History, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.History, [])}),
   fields: () => ({
     [dartx.length]: core.int,
     [_get_options]: dart.dynamic,
@@ -75598,13 +75601,13 @@
   }),
   sgetters: () => ({supportsState: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.History, html.History);
+dart.registerExtension(dart.global.History, html$.History);
 dart.defineExtensionNames([
   'deviceId',
   'deviceName',
   'hardwareUnitId'
 ]);
-html.VRDevice = class VRDevice extends _interceptors.Interceptor {
+html$.VRDevice = class VRDevice extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75618,20 +75621,20 @@
     return this.hardwareUnitId;
   }
 };
-dart.setSignature(html.VRDevice, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VRDevice, [])}),
+dart.setSignature(html$.VRDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VRDevice, [])}),
   fields: () => ({
     [dartx.deviceId]: core.String,
     [dartx.deviceName]: core.String,
     [dartx.hardwareUnitId]: core.String
   })
 });
-dart.registerExtension(dart.global.VRDevice, html.VRDevice);
+dart.registerExtension(dart.global.VRDevice, html$.VRDevice);
 dart.defineExtensionNames([
   'getEyeParameters',
   'setFieldOfView'
 ]);
-html.HmdvrDevice = class HmdvrDevice extends html.VRDevice {
+html$.HmdvrDevice = class HmdvrDevice extends html$.VRDevice {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75642,14 +75645,14 @@
     return this.setFieldOfView.apply(this, args);
   }
 };
-dart.setSignature(html.HmdvrDevice, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HmdvrDevice, [])}),
+dart.setSignature(html$.HmdvrDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HmdvrDevice, [])}),
   methods: () => ({
-    [dartx.getEyeParameters]: dart.definiteFunctionType(html.VREyeParameters, [core.String]),
-    [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html.VRFieldOfView, html.VRFieldOfView])
+    [dartx.getEyeParameters]: dart.definiteFunctionType(html$.VREyeParameters, [core.String]),
+    [dartx.setFieldOfView]: dart.definiteFunctionType(dart.void, [], [html$.VRFieldOfView, html$.VRFieldOfView])
   })
 });
-dart.registerExtension(dart.global.HMDVRDevice, html.HmdvrDevice);
+dart.registerExtension(dart.global.HMDVRDevice, html$.HmdvrDevice);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -75662,7 +75665,7 @@
   'item',
   'namedItem'
 ]);
-html.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Node), html.ImmutableListMixin$(html.Node)) {
+html$.HtmlCollection = class HtmlCollection extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75711,19 +75714,19 @@
     return this.namedItem.apply(this, args);
   }
 };
-html.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-dart.setSignature(html.HtmlCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HtmlCollection, [])}),
+html$.HtmlCollection[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$.HtmlCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlCollection, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Node, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Node]),
-    [dartx.item]: dart.definiteFunctionType(html.Node, [core.int]),
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [dartx.item]: dart.definiteFunctionType(html$.Node, [core.int]),
     [dartx.namedItem]: dart.definiteFunctionType(core.Object, [core.String])
   })
 });
-dart.registerExtension(dart.global.HTMLCollection, html.HtmlCollection);
+dart.registerExtension(dart.global.HTMLCollection, html$.HtmlCollection);
 dart.defineExtensionNames([
   'caretRangeFromPoint',
   'elementFromPoint',
@@ -75744,7 +75747,7 @@
   'createElementUpgrader',
   'body'
 ]);
-html.HtmlDocument = class HtmlDocument extends html.Document {
+html$.HtmlDocument = class HtmlDocument extends html$.Document {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75764,10 +75767,10 @@
     return !!document.getCSSCanvasContext;
   }
   [dartx.getCssCanvasContext](contextId, name, width, height) {
-    return html.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
+    return html$.CanvasRenderingContext._check(this[_getCssCanvasContext](contextId, name, width, height));
   }
   get [dartx.head]() {
-    return this[_head];
+    return this[_head$0];
   }
   get [dartx.lastModified]() {
     return this[_lastModified];
@@ -75798,7 +75801,7 @@
   }
   [dartx.registerElement](tag, customElementClass, opts) {
     let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
-    html._registerCustomElement(window, this, tag, customElementClass, extendsTag);
+    html$._registerCustomElement(window, this, tag, customElementClass, extendsTag);
   }
   [dartx.register](tag, customElementClass, opts) {
     let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
@@ -75817,54 +75820,54 @@
     return 'visibilitychange';
   }
   get [dartx.onVisibilityChange]() {
-    return html.HtmlDocument.visibilityChangeEvent.forTarget(this);
+    return html$.HtmlDocument.visibilityChangeEvent.forTarget(this);
   }
   [dartx.createElementUpgrader](type, opts) {
     let extendsTag = opts && 'extendsTag' in opts ? opts.extendsTag : null;
-    return new html._JSElementUpgrader(this, type, extendsTag);
+    return new html$._JSElementUpgrader(this, type, extendsTag);
   }
 };
-dart.setSignature(html.HtmlDocument, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HtmlDocument, [])}),
-  fields: () => ({[dartx.body]: html.BodyElement}),
+dart.setSignature(html$.HtmlDocument, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlDocument, [])}),
+  fields: () => ({[dartx.body]: html$.BodyElement}),
   getters: () => ({
-    [dartx.head]: dart.definiteFunctionType(html.HeadElement, []),
+    [dartx.head]: dart.definiteFunctionType(html$.HeadElement, []),
     [dartx.lastModified]: dart.definiteFunctionType(core.String, []),
     [dartx.preferredStylesheetSet]: dart.definiteFunctionType(core.String, []),
     [dartx.referrer]: dart.definiteFunctionType(core.String, []),
     [dartx.selectedStylesheetSet]: dart.definiteFunctionType(core.String, []),
-    [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html.StyleSheet), []),
+    [dartx.styleSheets]: dart.definiteFunctionType(core.List$(html$.StyleSheet), []),
     [dartx.title]: dart.definiteFunctionType(core.String, []),
-    [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onVisibilityChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   setters: () => ({
     [dartx.selectedStylesheetSet]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.title]: dart.definiteFunctionType(dart.void, [core.String])
   }),
   methods: () => ({
-    [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html.Range, [core.int, core.int]),
-    [dartx.elementFromPoint]: dart.definiteFunctionType(html.Element, [core.int, core.int]),
-    [dartx.getCssCanvasContext]: dart.definiteFunctionType(html.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
+    [dartx.caretRangeFromPoint]: dart.definiteFunctionType(html$.Range, [core.int, core.int]),
+    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.getCssCanvasContext]: dart.definiteFunctionType(html$.CanvasRenderingContext, [core.String, core.String, core.int, core.int]),
     [dartx.registerElement]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
     [dartx.register]: dart.definiteFunctionType(dart.void, [core.String, core.Type], {extendsTag: core.String}),
-    [dartx.createElementUpgrader]: dart.definiteFunctionType(html.ElementUpgrader, [core.Type], {extendsTag: core.String})
+    [dartx.createElementUpgrader]: dart.definiteFunctionType(html$.ElementUpgrader, [core.Type], {extendsTag: core.String})
   }),
   sfields: () => ({visibilityChangeEvent: EventStreamProviderOfEvent()}),
   sgetters: () => ({supportsCssCanvasContext: dart.definiteFunctionType(core.bool, [])}),
-  statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html.EventTarget])}),
+  statics: () => ({_determineVisibilityChangeEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])}),
   names: ['_determineVisibilityChangeEventType']
 });
-dart.defineLazy(html.HtmlDocument, {
+dart.defineLazy(html$.HtmlDocument, {
   get visibilityChangeEvent() {
-    return dart.const(new (_CustomEventStreamProviderOfEvent())(html.HtmlDocument._determineVisibilityChangeEventType));
+    return dart.const(new (_CustomEventStreamProviderOfEvent())(html$.HtmlDocument._determineVisibilityChangeEventType));
   }
 });
-dart.registerExtension(dart.global.HTMLDocument, html.HtmlDocument);
+dart.registerExtension(dart.global.HTMLDocument, html$.HtmlDocument);
 dart.defineExtensionNames([
   'item',
   'namedItem'
 ]);
-html.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html.HtmlCollection {
+html$.HtmlFormControlsCollection = class HtmlFormControlsCollection extends html$.HtmlCollection {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75875,32 +75878,32 @@
     return this.namedItem.apply(this, args);
   }
 };
-dart.setSignature(html.HtmlFormControlsCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HtmlFormControlsCollection, [])})
+dart.setSignature(html$.HtmlFormControlsCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlFormControlsCollection, [])})
 });
-dart.registerExtension(dart.global.HTMLFormControlsCollection, html.HtmlFormControlsCollection);
-html.HtmlHtmlElement = class HtmlHtmlElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLFormControlsCollection, html$.HtmlFormControlsCollection);
+html$.HtmlHtmlElement = class HtmlHtmlElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.HtmlHtmlElement._check(html.document[dartx.createElement]("html"));
+    return html$.HtmlHtmlElement._check(html$.document[dartx.createElement]("html"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.HtmlHtmlElement, 'created');
-dart.setSignature(html.HtmlHtmlElement, {
+dart.defineNamedConstructor(html$.HtmlHtmlElement, 'created');
+dart.setSignature(html$.HtmlHtmlElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.HtmlHtmlElement, []),
-    new: dart.definiteFunctionType(html.HtmlHtmlElement, []),
-    created: dart.definiteFunctionType(html.HtmlHtmlElement, [])
+    _: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
+    new: dart.definiteFunctionType(html$.HtmlHtmlElement, []),
+    created: dart.definiteFunctionType(html$.HtmlHtmlElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLHtmlElement, html.HtmlHtmlElement);
+dart.registerExtension(dart.global.HTMLHtmlElement, html$.HtmlHtmlElement);
 const _item = Symbol('_item');
-html.HtmlOptionsCollection = class HtmlOptionsCollection extends html.HtmlCollection {
+html$.HtmlOptionsCollection = class HtmlOptionsCollection extends html$.HtmlCollection {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -75908,11 +75911,11 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html.HtmlOptionsCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HtmlOptionsCollection, [])}),
-  methods: () => ({[_item]: dart.definiteFunctionType(html.Node, [core.int])})
+dart.setSignature(html$.HtmlOptionsCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HtmlOptionsCollection, [])}),
+  methods: () => ({[_item]: dart.definiteFunctionType(html$.Node, [core.int])})
 });
-dart.registerExtension(dart.global.HTMLOptionsCollection, html.HtmlOptionsCollection);
+dart.registerExtension(dart.global.HTMLOptionsCollection, html$.HtmlOptionsCollection);
 const _get_response = Symbol('_get_response');
 dart.defineExtensionNames([
   'onAbort',
@@ -75923,42 +75926,42 @@
   'onProgress',
   'onTimeout'
 ]);
-html.HttpRequestEventTarget = class HttpRequestEventTarget extends html.EventTarget {
+html$.HttpRequestEventTarget = class HttpRequestEventTarget extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get [dartx.onAbort]() {
-    return html.HttpRequestEventTarget.abortEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.abortEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.HttpRequestEventTarget.errorEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.errorEvent.forTarget(this);
   }
   get [dartx.onLoad]() {
-    return html.HttpRequestEventTarget.loadEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.loadEvent.forTarget(this);
   }
   get [dartx.onLoadEnd]() {
-    return html.HttpRequestEventTarget.loadEndEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.loadEndEvent.forTarget(this);
   }
   get [dartx.onLoadStart]() {
-    return html.HttpRequestEventTarget.loadStartEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.loadStartEvent.forTarget(this);
   }
   get [dartx.onProgress]() {
-    return html.HttpRequestEventTarget.progressEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.progressEvent.forTarget(this);
   }
   get [dartx.onTimeout]() {
-    return html.HttpRequestEventTarget.timeoutEvent.forTarget(this);
+    return html$.HttpRequestEventTarget.timeoutEvent.forTarget(this);
   }
 };
-dart.setSignature(html.HttpRequestEventTarget, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HttpRequestEventTarget, [])}),
+dart.setSignature(html$.HttpRequestEventTarget, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestEventTarget, [])}),
   getters: () => ({
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), []),
-    [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), [])
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadEnd]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), []),
+    [dartx.onTimeout]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
   }),
   sfields: () => ({
     abortEvent: EventStreamProviderOfProgressEvent(),
@@ -75970,7 +75973,7 @@
     timeoutEvent: EventStreamProviderOfProgressEvent()
   })
 });
-dart.defineLazy(html.HttpRequestEventTarget, {
+dart.defineLazy(html$.HttpRequestEventTarget, {
   get abortEvent() {
     return dart.const(new (EventStreamProviderOfProgressEvent())('abort'));
   },
@@ -75993,7 +75996,7 @@
     return dart.const(new (EventStreamProviderOfProgressEvent())('timeout'));
   }
 });
-dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html.HttpRequestEventTarget);
+dart.registerExtension(dart.global.XMLHttpRequestEventTarget, html$.HttpRequestEventTarget);
 dart.defineExtensionNames([
   'responseHeaders',
   'open',
@@ -76016,11 +76019,11 @@
   'upload',
   'withCredentials'
 ]);
-html.HttpRequest = class HttpRequest extends html.HttpRequestEventTarget {
+html$.HttpRequest = class HttpRequest extends html$.HttpRequestEventTarget {
   static getString(url, opts) {
     let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
     let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
-    return html.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
+    return html$.HttpRequest.request(url, {withCredentials: withCredentials, onProgress: onProgress}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
   }
   static postFormData(url, data, opts) {
     let withCredentials = opts && 'withCredentials' in opts ? opts.withCredentials : null;
@@ -76035,8 +76038,8 @@
     if (requestHeaders == null) {
       requestHeaders = dart.map({}, core.String, core.String);
     }
-    requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString()));
-    return html.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
+    requestHeaders[dartx.putIfAbsent]('Content-Type', dart.fn(() => 'application/x-www-form-urlencoded; charset=UTF-8', VoidToString$()));
+    return html$.HttpRequest.request(url, {method: 'POST', withCredentials: withCredentials, responseType: responseType, requestHeaders: requestHeaders, sendData: formData, onProgress: onProgress});
   }
   static request(url, opts) {
     let method = opts && 'method' in opts ? opts.method : null;
@@ -76047,7 +76050,7 @@
     let sendData = opts && 'sendData' in opts ? opts.sendData : null;
     let onProgress = opts && 'onProgress' in opts ? opts.onProgress : null;
     let completer = CompleterOfHttpRequest().new();
-    let xhr = html.HttpRequest.new();
+    let xhr = html$.HttpRequest.new();
     if (method == null) {
       method = 'GET';
     }
@@ -76089,26 +76092,26 @@
     return completer.future;
   }
   static get supportsProgressEvent() {
-    let xhr = html.HttpRequest.new();
+    let xhr = html$.HttpRequest.new();
     return "onprogress" in xhr;
   }
   static get supportsCrossOrigin() {
-    let xhr = html.HttpRequest.new();
+    let xhr = html$.HttpRequest.new();
     return "withCredentials" in xhr;
   }
   static get supportsLoadEndEvent() {
-    let xhr = html.HttpRequest.new();
+    let xhr = html$.HttpRequest.new();
     return "onloadend" in xhr;
   }
   static get supportsOverrideMimeType() {
-    let xhr = html.HttpRequest.new();
+    let xhr = html$.HttpRequest.new();
     return "overrideMimeType" in xhr;
   }
   static requestCrossOrigin(url, opts) {
     let method = opts && 'method' in opts ? opts.method : null;
     let sendData = opts && 'sendData' in opts ? opts.sendData : null;
-    if (dart.test(html.HttpRequest.supportsCrossOrigin)) {
-      return html.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
+    if (dart.test(html$.HttpRequest.supportsCrossOrigin)) {
+      return html$.HttpRequest.request(url, {method: method, sendData: sendData}).then(core.String)(dart.fn(xhr => xhr[dartx.responseText], HttpRequestToString()));
     }
     let completer = CompleterOfString().new();
     if (method == null) {
@@ -76119,10 +76122,10 @@
     xhr.onload = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
       let response = xhr.responseText;
       completer.complete(response);
-    }, dynamicToNull()), 1);
+    }, dynamicToNull$()), 1);
     xhr.onerror = _js_helper.convertDartClosureToJS(dynamicToNull())(dart.fn(e => {
       completer.completeError(e);
-    }, dynamicToNull()), 1);
+    }, dynamicToNull$()), 1);
     xhr.onprogress = {};
     xhr.ontimeout = {};
     xhr.timeout = Number.MAX_VALUE;
@@ -76165,7 +76168,7 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.HttpRequest._create_1();
+    return html$.HttpRequest._create_1();
   }
   static _create_1() {
     return new XMLHttpRequest();
@@ -76174,7 +76177,7 @@
     return this.readyState;
   }
   get [dartx.response]() {
-    return html._convertNativeToDart_XHR_Response(this[_get_response]);
+    return html$._convertNativeToDart_XHR_Response(this[_get_response]);
   }
   get [_get_response]() {
     return this.response;
@@ -76234,13 +76237,13 @@
     return this.setRequestHeader.apply(this, args);
   }
   get [dartx.onReadyStateChange]() {
-    return html.HttpRequest.readyStateChangeEvent.forTarget(this);
+    return html$.HttpRequest.readyStateChangeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.HttpRequest, {
+dart.setSignature(html$.HttpRequest, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.HttpRequest, []),
-    new: dart.definiteFunctionType(html.HttpRequest, [])
+    _: dart.definiteFunctionType(html$.HttpRequest, []),
+    new: dart.definiteFunctionType(html$.HttpRequest, [])
   }),
   fields: () => ({
     [dartx.readyState]: core.int,
@@ -76248,17 +76251,17 @@
     [dartx.responseText]: core.String,
     [dartx.responseType]: core.String,
     [dartx.responseUrl]: core.String,
-    [dartx.responseXml]: html.Document,
+    [dartx.responseXml]: html$.Document,
     [dartx.status]: core.int,
     [dartx.statusText]: core.String,
     [dartx.timeout]: core.int,
-    [dartx.upload]: html.HttpRequestUpload,
+    [dartx.upload]: html$.HttpRequestUpload,
     [dartx.withCredentials]: core.bool
   }),
   getters: () => ({
     [dartx.responseHeaders]: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
     [dartx.response]: dart.definiteFunctionType(dart.dynamic, []),
-    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html.ProgressEvent), [])
+    [dartx.onReadyStateChange]: dart.definiteFunctionType(async.Stream$(html$.ProgressEvent), [])
   }),
   methods: () => ({
     [dartx.open]: dart.definiteFunctionType(dart.void, [core.String, core.String], {async: core.bool, user: core.String, password: core.String}),
@@ -76285,33 +76288,33 @@
   }),
   statics: () => ({
     getString: dart.definiteFunctionType(async.Future$(core.String), [core.String], {withCredentials: core.bool, onProgress: ProgressEventTovoid()}),
-    postFormData: dart.definiteFunctionType(async.Future$(html.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
-    request: dart.definiteFunctionType(async.Future$(html.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
+    postFormData: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String, MapOfString$String()], {withCredentials: core.bool, responseType: core.String, requestHeaders: MapOfString$String(), onProgress: ProgressEventTovoid()}),
+    request: dart.definiteFunctionType(async.Future$(html$.HttpRequest), [core.String], {method: core.String, withCredentials: core.bool, responseType: core.String, mimeType: core.String, requestHeaders: MapOfString$String(), sendData: dart.dynamic, onProgress: ProgressEventTovoid()}),
     requestCrossOrigin: dart.definiteFunctionType(async.Future$(core.String), [core.String], {method: core.String, sendData: core.String}),
-    _create_1: dart.definiteFunctionType(html.HttpRequest, [])
+    _create_1: dart.definiteFunctionType(html$.HttpRequest, [])
   }),
   names: ['getString', 'postFormData', 'request', 'requestCrossOrigin', '_create_1']
 });
-html.HttpRequest.DONE = 4;
-html.HttpRequest.HEADERS_RECEIVED = 2;
-html.HttpRequest.LOADING = 3;
-html.HttpRequest.OPENED = 1;
-html.HttpRequest.UNSENT = 0;
-dart.defineLazy(html.HttpRequest, {
+html$.HttpRequest.DONE = 4;
+html$.HttpRequest.HEADERS_RECEIVED = 2;
+html$.HttpRequest.LOADING = 3;
+html$.HttpRequest.OPENED = 1;
+html$.HttpRequest.UNSENT = 0;
+dart.defineLazy(html$.HttpRequest, {
   get readyStateChangeEvent() {
     return dart.const(new (EventStreamProviderOfProgressEvent())('readystatechange'));
   }
 });
-dart.registerExtension(dart.global.XMLHttpRequest, html.HttpRequest);
-html.HttpRequestUpload = class HttpRequestUpload extends html.HttpRequestEventTarget {
+dart.registerExtension(dart.global.XMLHttpRequest, html$.HttpRequest);
+html$.HttpRequestUpload = class HttpRequestUpload extends html$.HttpRequestEventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.HttpRequestUpload, {
-  constructors: () => ({_: dart.definiteFunctionType(html.HttpRequestUpload, [])})
+dart.setSignature(html$.HttpRequestUpload, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.HttpRequestUpload, [])})
 });
-dart.registerExtension(dart.global.XMLHttpRequestUpload, html.HttpRequestUpload);
+dart.registerExtension(dart.global.XMLHttpRequestUpload, html$.HttpRequestUpload);
 const _get_contentWindow = Symbol('_get_contentWindow');
 dart.defineExtensionNames([
   'contentWindow',
@@ -76323,12 +76326,12 @@
   'srcdoc',
   'width'
 ]);
-html.IFrameElement = class IFrameElement extends html.HtmlElement {
+html$.IFrameElement = class IFrameElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.IFrameElement._check(html.document[dartx.createElement]("iframe"));
+    return html$.IFrameElement._check(html$.document[dartx.createElement]("iframe"));
   }
   created() {
     this[dartx.allowFullscreen] = null;
@@ -76348,7 +76351,7 @@
     this.allowFullscreen = value;
   }
   get [dartx.contentWindow]() {
-    return html._convertNativeToDart_Window(this[_get_contentWindow]);
+    return html$._convertNativeToDart_Window(this[_get_contentWindow]);
   }
   get [_get_contentWindow]() {
     return this.contentWindow;
@@ -76387,31 +76390,31 @@
     this.width = value;
   }
 };
-dart.defineNamedConstructor(html.IFrameElement, 'created');
-dart.setSignature(html.IFrameElement, {
+dart.defineNamedConstructor(html$.IFrameElement, 'created');
+dart.setSignature(html$.IFrameElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.IFrameElement, []),
-    new: dart.definiteFunctionType(html.IFrameElement, []),
-    created: dart.definiteFunctionType(html.IFrameElement, [])
+    _: dart.definiteFunctionType(html$.IFrameElement, []),
+    new: dart.definiteFunctionType(html$.IFrameElement, []),
+    created: dart.definiteFunctionType(html$.IFrameElement, [])
   }),
   fields: () => ({
     [dartx.allowFullscreen]: core.bool,
     [_get_contentWindow]: dart.dynamic,
     [dartx.height]: core.String,
     [dartx.name]: core.String,
-    [dartx.sandbox]: html.DomSettableTokenList,
+    [dartx.sandbox]: html$.DomSettableTokenList,
     [dartx.src]: core.String,
     [dartx.srcdoc]: core.String,
     [dartx.width]: core.String
   }),
-  getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html.WindowBase, [])})
+  getters: () => ({[dartx.contentWindow]: dart.definiteFunctionType(html$.WindowBase, [])})
 });
-dart.registerExtension(dart.global.HTMLIFrameElement, html.IFrameElement);
+dart.registerExtension(dart.global.HTMLIFrameElement, html$.IFrameElement);
 dart.defineExtensionNames([
   'height',
   'width'
 ]);
-html.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
+html$.ImageBitmap = class ImageBitmap extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -76422,33 +76425,33 @@
     return this.width;
   }
 };
-dart.setSignature(html.ImageBitmap, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ImageBitmap, [])}),
+dart.setSignature(html$.ImageBitmap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ImageBitmap, [])}),
   fields: () => ({
     [dartx.height]: core.int,
     [dartx.width]: core.int
   })
 });
-dart.registerExtension(dart.global.ImageBitmap, html.ImageBitmap);
+dart.registerExtension(dart.global.ImageBitmap, html$.ImageBitmap);
 dart.defineExtensionNames([
   'data',
   'height',
   'width'
 ]);
-html.ImageData = class ImageData extends _interceptors.Interceptor {
+html$.ImageData = class ImageData extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(data_OR_sw, sh_OR_sw, sh) {
     if (sh === void 0) sh = null;
     if (typeof sh_OR_sw == 'number' && typeof data_OR_sw == 'number' && sh == null) {
-      return html.ImageData._create_1(data_OR_sw, sh_OR_sw);
+      return html$.ImageData._create_1(data_OR_sw, sh_OR_sw);
     }
     if (typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw) && sh == null) {
-      return html.ImageData._create_2(data_OR_sw, sh_OR_sw);
+      return html$.ImageData._create_2(data_OR_sw, sh_OR_sw);
     }
     if (typeof sh == 'number' && typeof sh_OR_sw == 'number' && typed_data.Uint8ClampedList.is(data_OR_sw)) {
-      return html.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
+      return html$.ImageData._create_3(data_OR_sw, sh_OR_sw, sh);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -76471,10 +76474,10 @@
     return this.width;
   }
 };
-dart.setSignature(html.ImageData, {
+dart.setSignature(html$.ImageData, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ImageData, []),
-    new: dart.definiteFunctionType(html.ImageData, [dart.dynamic, core.int], [core.int])
+    _: dart.definiteFunctionType(html$.ImageData, []),
+    new: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, core.int], [core.int])
   }),
   fields: () => ({
     [dartx.data]: typed_data.Uint8ClampedList,
@@ -76482,13 +76485,13 @@
     [dartx.width]: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ImageData, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ImageData, [dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.ImageData, [dart.dynamic, dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.registerExtension(dart.global.ImageData, html.ImageData);
+dart.registerExtension(dart.global.ImageData, html$.ImageData);
 dart.defineExtensionNames([
   'alt',
   'complete',
@@ -76504,7 +76507,7 @@
   'useMap',
   'width'
 ]);
-html.ImageElement = class ImageElement extends html.HtmlElement {
+html$.ImageElement = class ImageElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -76512,7 +76515,7 @@
     let src = opts && 'src' in opts ? opts.src : null;
     let width = opts && 'width' in opts ? opts.width : null;
     let height = opts && 'height' in opts ? opts.height : null;
-    let e = html.ImageElement._check(html.document[dartx.createElement]("img"));
+    let e = html$.ImageElement._check(html$.document[dartx.createElement]("img"));
     if (src != null) e[dartx.src] = src;
     if (width != null) e[dartx.width] = width;
     if (height != null) e[dartx.height] = height;
@@ -76601,13 +76604,13 @@
     this.width = value;
   }
 };
-dart.defineNamedConstructor(html.ImageElement, 'created');
-html.ImageElement[dart.implements] = () => [html.CanvasImageSource];
-dart.setSignature(html.ImageElement, {
+dart.defineNamedConstructor(html$.ImageElement, 'created');
+html$.ImageElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.ImageElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ImageElement, []),
-    new: dart.definiteFunctionType(html.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
-    created: dart.definiteFunctionType(html.ImageElement, [])
+    _: dart.definiteFunctionType(html$.ImageElement, []),
+    new: dart.definiteFunctionType(html$.ImageElement, [], {src: core.String, width: core.int, height: core.int}),
+    created: dart.definiteFunctionType(html$.ImageElement, [])
   }),
   fields: () => ({
     [dartx.alt]: core.String,
@@ -76625,11 +76628,11 @@
     [dartx.width]: core.int
   })
 });
-dart.registerExtension(dart.global.HTMLImageElement, html.ImageElement);
+dart.registerExtension(dart.global.HTMLImageElement, html$.ImageElement);
 dart.defineExtensionNames([
   'inspect'
 ]);
-html.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
+html$.InjectedScriptHost = class InjectedScriptHost extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -76637,15 +76640,15 @@
     return this.inspect.apply(this, args);
   }
 };
-dart.setSignature(html.InjectedScriptHost, {
-  constructors: () => ({_: dart.definiteFunctionType(html.InjectedScriptHost, [])}),
+dart.setSignature(html$.InjectedScriptHost, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.InjectedScriptHost, [])}),
   methods: () => ({[dartx.inspect]: dart.definiteFunctionType(dart.void, [core.Object, core.Object])})
 });
-dart.registerExtension(dart.global.InjectedScriptHost, html.InjectedScriptHost);
+dart.registerExtension(dart.global.InjectedScriptHost, html$.InjectedScriptHost);
 dart.defineExtensionNames([
   'firesTouchEvents'
 ]);
-html.InputDevice = class InputDevice extends _interceptors.Interceptor {
+html$.InputDevice = class InputDevice extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -76653,9 +76656,9 @@
     if (deviceInitDict === void 0) deviceInitDict = null;
     if (deviceInitDict != null) {
       let deviceInitDict_1 = html_common.convertDartToNative_Dictionary(deviceInitDict);
-      return html.InputDevice._create_1(deviceInitDict_1);
+      return html$.InputDevice._create_1(deviceInitDict_1);
     }
-    return html.InputDevice._create_2();
+    return html$.InputDevice._create_2();
   }
   static _create_1(deviceInitDict) {
     return new self.InputDevice(deviceInitDict);
@@ -76667,19 +76670,19 @@
     return this.firesTouchEvents;
   }
 };
-dart.setSignature(html.InputDevice, {
+dart.setSignature(html$.InputDevice, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.InputDevice, []),
-    new: dart.definiteFunctionType(html.InputDevice, [], [core.Map])
+    _: dart.definiteFunctionType(html$.InputDevice, []),
+    new: dart.definiteFunctionType(html$.InputDevice, [], [core.Map])
   }),
   fields: () => ({[dartx.firesTouchEvents]: core.bool}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.InputDevice, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.InputDevice, [])
+    _create_1: dart.definiteFunctionType(html$.InputDevice, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.InputDevice, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.InputDevice, html.InputDevice);
+dart.registerExtension(dart.global.InputDevice, html$.InputDevice);
 const _get_valueAsDate = Symbol('_get_valueAsDate');
 const _set_valueAsDate = Symbol('_set_valueAsDate');
 dart.defineExtensionNames([
@@ -76743,10 +76746,10 @@
   'width',
   'willValidate'
 ]);
-html.InputElement = class InputElement extends html.HtmlElement {
+html$.InputElement = class InputElement extends html$.HtmlElement {
   static new(opts) {
     let type = opts && 'type' in opts ? opts.type : null;
-    let e = html.InputElement._check(html.document[dartx.createElement]("input"));
+    let e = html$.InputElement._check(html$.document[dartx.createElement]("input"));
     if (type != null) {
       try {
         e[dartx.type] = type;
@@ -77122,13 +77125,13 @@
     return this.stepUp.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.InputElement, 'created');
-html.InputElement[dart.implements] = () => [html.HiddenInputElement, html.SearchInputElement, html.TextInputElement, html.UrlInputElement, html.TelephoneInputElement, html.EmailInputElement, html.PasswordInputElement, html.DateInputElement, html.MonthInputElement, html.WeekInputElement, html.TimeInputElement, html.LocalDateTimeInputElement, html.NumberInputElement, html.RangeInputElement, html.CheckboxInputElement, html.RadioButtonInputElement, html.FileUploadInputElement, html.SubmitButtonInputElement, html.ImageButtonInputElement, html.ResetButtonInputElement, html.ButtonInputElement];
-dart.setSignature(html.InputElement, {
+dart.defineNamedConstructor(html$.InputElement, 'created');
+html$.InputElement[dart.implements] = () => [html$.HiddenInputElement, html$.SearchInputElement, html$.TextInputElement, html$.UrlInputElement, html$.TelephoneInputElement, html$.EmailInputElement, html$.PasswordInputElement, html$.DateInputElement, html$.MonthInputElement, html$.WeekInputElement, html$.TimeInputElement, html$.LocalDateTimeInputElement, html$.NumberInputElement, html$.RangeInputElement, html$.CheckboxInputElement, html$.RadioButtonInputElement, html$.FileUploadInputElement, html$.SubmitButtonInputElement, html$.ImageButtonInputElement, html$.ResetButtonInputElement, html$.ButtonInputElement];
+dart.setSignature(html$.InputElement, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.InputElement, [], {type: core.String}),
-    _: dart.definiteFunctionType(html.InputElement, []),
-    created: dart.definiteFunctionType(html.InputElement, [])
+    new: dart.definiteFunctionType(html$.InputElement, [], {type: core.String}),
+    _: dart.definiteFunctionType(html$.InputElement, []),
+    created: dart.definiteFunctionType(html$.InputElement, [])
   }),
   fields: () => ({
     [dartx.accept]: core.String,
@@ -77143,7 +77146,7 @@
     [dartx.dirName]: core.String,
     [dartx.disabled]: core.bool,
     [dartx.files]: ListOfFile(),
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.formAction]: core.String,
     [dartx.formEnctype]: core.String,
     [dartx.formMethod]: core.String,
@@ -77154,7 +77157,7 @@
     [dartx.indeterminate]: core.bool,
     [dartx.inputMode]: core.String,
     [dartx.labels]: ListOfNode(),
-    [dartx.list]: html.HtmlElement,
+    [dartx.list]: html$.HtmlElement,
     [dartx.max]: core.String,
     [dartx.maxLength]: core.int,
     [dartx.min]: core.String,
@@ -77173,7 +77176,7 @@
     [dartx.step]: core.String,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.value]: core.String,
     [_get_valueAsDate]: dart.dynamic,
     [dartx.valueAsNumber]: core.num,
@@ -77198,7 +77201,7 @@
     [dartx.stepUp]: dart.definiteFunctionType(dart.void, [], [core.int])
   })
 });
-dart.registerExtension(dart.global.HTMLInputElement, html.InputElement);
+dart.registerExtension(dart.global.HTMLInputElement, html$.InputElement);
 dart.defineExtensionNames([
   'autofocus',
   'disabled',
@@ -77207,14 +77210,14 @@
   'name',
   'value'
 ]);
-html.InputElementBase = class InputElementBase extends core.Object {
+html$.InputElementBase = class InputElementBase extends core.Object {
   new() {
     this[autofocus] = null;
     this[disabled] = null;
     this[incremental] = null;
     this[indeterminate] = null;
     this[name] = null;
-    this[value] = null;
+    this[value$] = null;
   }
   get autofocus() {
     return this[autofocus];
@@ -77247,20 +77250,20 @@
     this[name] = value;
   }
   get value() {
-    return this[value];
+    return this[value$];
   }
   set value(value) {
-    this[value] = value;
+    this[value$] = value;
   }
 };
-const autofocus = Symbol(html.InputElementBase.name + "." + 'autofocus'.toString());
-const disabled = Symbol(html.InputElementBase.name + "." + 'disabled'.toString());
-const incremental = Symbol(html.InputElementBase.name + "." + 'incremental'.toString());
-const indeterminate = Symbol(html.InputElementBase.name + "." + 'indeterminate'.toString());
-const name = Symbol(html.InputElementBase.name + "." + 'name'.toString());
-const value = Symbol(html.InputElementBase.name + "." + 'value'.toString());
-html.InputElementBase[dart.implements] = () => [html.Element];
-dart.setSignature(html.InputElementBase, {
+const autofocus = Symbol(html$.InputElementBase.name + "." + 'autofocus'.toString());
+const disabled = Symbol(html$.InputElementBase.name + "." + 'disabled'.toString());
+const incremental = Symbol(html$.InputElementBase.name + "." + 'incremental'.toString());
+const indeterminate = Symbol(html$.InputElementBase.name + "." + 'indeterminate'.toString());
+const name = Symbol(html$.InputElementBase.name + "." + 'name'.toString());
+const value$ = Symbol(html$.InputElementBase.name + "." + 'value'.toString());
+html$.InputElementBase[dart.implements] = () => [html$.Element];
+dart.setSignature(html$.InputElementBase, {
   fields: () => ({
     autofocus: core.bool,
     disabled: core.bool,
@@ -77270,7 +77273,7 @@
     value: core.String
   })
 });
-dart.defineExtensionMembers(html.InputElementBase, [
+dart.defineExtensionMembers(html$.InputElementBase, [
   'autofocus',
   'autofocus',
   'disabled',
@@ -77284,14 +77287,14 @@
   'value',
   'value'
 ]);
-html.HiddenInputElement = class HiddenInputElement extends core.Object {
+html$.HiddenInputElement = class HiddenInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'hidden'});
+    return html$.InputElement.new({type: 'hidden'});
   }
 };
-html.HiddenInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.HiddenInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.HiddenInputElement, [])})
+html$.HiddenInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.HiddenInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.HiddenInputElement, [])})
 });
 dart.defineExtensionNames([
   'autocomplete',
@@ -77305,7 +77308,7 @@
   'selectionEnd',
   'selectionStart'
 ]);
-html.TextInputElementBase = class TextInputElementBase extends core.Object {
+html$.TextInputElementBase = class TextInputElementBase extends core.Object {
   new() {
     this[autocomplete] = null;
     this[maxLength] = null;
@@ -77379,18 +77382,18 @@
     this[selectionStart] = value;
   }
 };
-const autocomplete = Symbol(html.TextInputElementBase.name + "." + 'autocomplete'.toString());
-const maxLength = Symbol(html.TextInputElementBase.name + "." + 'maxLength'.toString());
-const pattern = Symbol(html.TextInputElementBase.name + "." + 'pattern'.toString());
-const placeholder = Symbol(html.TextInputElementBase.name + "." + 'placeholder'.toString());
-const readOnly = Symbol(html.TextInputElementBase.name + "." + 'readOnly'.toString());
-const required = Symbol(html.TextInputElementBase.name + "." + 'required'.toString());
-const size = Symbol(html.TextInputElementBase.name + "." + 'size'.toString());
-const selectionDirection = Symbol(html.TextInputElementBase.name + "." + 'selectionDirection'.toString());
-const selectionEnd = Symbol(html.TextInputElementBase.name + "." + 'selectionEnd'.toString());
-const selectionStart = Symbol(html.TextInputElementBase.name + "." + 'selectionStart'.toString());
-html.TextInputElementBase[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.TextInputElementBase, {
+const autocomplete = Symbol(html$.TextInputElementBase.name + "." + 'autocomplete'.toString());
+const maxLength = Symbol(html$.TextInputElementBase.name + "." + 'maxLength'.toString());
+const pattern = Symbol(html$.TextInputElementBase.name + "." + 'pattern'.toString());
+const placeholder = Symbol(html$.TextInputElementBase.name + "." + 'placeholder'.toString());
+const readOnly = Symbol(html$.TextInputElementBase.name + "." + 'readOnly'.toString());
+const required = Symbol(html$.TextInputElementBase.name + "." + 'required'.toString());
+const size = Symbol(html$.TextInputElementBase.name + "." + 'size'.toString());
+const selectionDirection = Symbol(html$.TextInputElementBase.name + "." + 'selectionDirection'.toString());
+const selectionEnd = Symbol(html$.TextInputElementBase.name + "." + 'selectionEnd'.toString());
+const selectionStart = Symbol(html$.TextInputElementBase.name + "." + 'selectionStart'.toString());
+html$.TextInputElementBase[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.TextInputElementBase, {
   fields: () => ({
     autocomplete: core.String,
     maxLength: core.int,
@@ -77404,7 +77407,7 @@
     selectionStart: core.int
   })
 });
-dart.defineExtensionMembers(html.TextInputElementBase, [
+dart.defineExtensionMembers(html$.TextInputElementBase, [
   'autocomplete',
   'autocomplete',
   'maxLength',
@@ -77429,9 +77432,9 @@
 dart.defineExtensionNames([
   'dirName'
 ]);
-html.SearchInputElement = class SearchInputElement extends core.Object {
+html$.SearchInputElement = class SearchInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'search'});
+    return html$.InputElement.new({type: 'search'});
   }
   get dirName() {
     return this[dirName];
@@ -77440,62 +77443,62 @@
     this[dirName] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'search'})[dartx.type] == 'search';
+    return html$.InputElement.new({type: 'search'})[dartx.type] == 'search';
   }
 };
-const dirName = Symbol(html.SearchInputElement.name + "." + 'dirName'.toString());
-html.SearchInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.SearchInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.SearchInputElement, [])}),
+const dirName = Symbol(html$.SearchInputElement.name + "." + 'dirName'.toString());
+html$.SearchInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.SearchInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.SearchInputElement, [])}),
   fields: () => ({dirName: core.String}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.SearchInputElement, ['dirName', 'dirName']);
+dart.defineExtensionMembers(html$.SearchInputElement, ['dirName', 'dirName']);
 dart.defineExtensionNames([
   'dirName'
 ]);
-html.TextInputElement = class TextInputElement extends core.Object {
+html$.TextInputElement = class TextInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'text'});
+    return html$.InputElement.new({type: 'text'});
   }
   get dirName() {
-    return this[dirName];
+    return this[dirName$];
   }
   set dirName(value) {
-    this[dirName] = value;
+    this[dirName$] = value;
   }
 };
-const dirName = Symbol(html.TextInputElement.name + "." + 'dirName'.toString());
-html.TextInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.TextInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.TextInputElement, [])}),
+const dirName$ = Symbol(html$.TextInputElement.name + "." + 'dirName'.toString());
+html$.TextInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.TextInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TextInputElement, [])}),
   fields: () => ({dirName: core.String})
 });
-dart.defineExtensionMembers(html.TextInputElement, ['dirName', 'dirName']);
-html.UrlInputElement = class UrlInputElement extends core.Object {
+dart.defineExtensionMembers(html$.TextInputElement, ['dirName', 'dirName']);
+html$.UrlInputElement = class UrlInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'url'});
+    return html$.InputElement.new({type: 'url'});
   }
   static get supported() {
-    return html.InputElement.new({type: 'url'})[dartx.type] == 'url';
+    return html$.InputElement.new({type: 'url'})[dartx.type] == 'url';
   }
 };
-html.UrlInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.UrlInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.UrlInputElement, [])}),
+html$.UrlInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.UrlInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.UrlInputElement, [])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-html.TelephoneInputElement = class TelephoneInputElement extends core.Object {
+html$.TelephoneInputElement = class TelephoneInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'tel'});
+    return html$.InputElement.new({type: 'tel'});
   }
   static get supported() {
-    return html.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
+    return html$.InputElement.new({type: 'tel'})[dartx.type] == 'tel';
   }
 };
-html.TelephoneInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.TelephoneInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.TelephoneInputElement, [])}),
+html$.TelephoneInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.TelephoneInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TelephoneInputElement, [])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
 dart.defineExtensionNames([
@@ -77509,27 +77512,27 @@
   'required',
   'size'
 ]);
-html.EmailInputElement = class EmailInputElement extends core.Object {
+html$.EmailInputElement = class EmailInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'email'});
+    return html$.InputElement.new({type: 'email'});
   }
   get autocomplete() {
-    return this[autocomplete];
+    return this[autocomplete$];
   }
   set autocomplete(value) {
-    this[autocomplete] = value;
+    this[autocomplete$] = value;
   }
   get autofocus() {
-    return this[autofocus];
+    return this[autofocus$];
   }
   set autofocus(value) {
-    this[autofocus] = value;
+    this[autofocus$] = value;
   }
   get maxLength() {
-    return this[maxLength];
+    return this[maxLength$];
   }
   set maxLength(value) {
-    this[maxLength] = value;
+    this[maxLength$] = value;
   }
   get multiple() {
     return this[multiple];
@@ -77538,51 +77541,51 @@
     this[multiple] = value;
   }
   get pattern() {
-    return this[pattern];
+    return this[pattern$];
   }
   set pattern(value) {
-    this[pattern] = value;
+    this[pattern$] = value;
   }
   get placeholder() {
-    return this[placeholder];
+    return this[placeholder$];
   }
   set placeholder(value) {
-    this[placeholder] = value;
+    this[placeholder$] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$] = value;
   }
   get required() {
-    return this[required];
+    return this[required$];
   }
   set required(value) {
-    this[required] = value;
+    this[required$] = value;
   }
   get size() {
-    return this[size];
+    return this[size$];
   }
   set size(value) {
-    this[size] = value;
+    this[size$] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'email'})[dartx.type] == 'email';
+    return html$.InputElement.new({type: 'email'})[dartx.type] == 'email';
   }
 };
-const autocomplete = Symbol(html.EmailInputElement.name + "." + 'autocomplete'.toString());
-const autofocus = Symbol(html.EmailInputElement.name + "." + 'autofocus'.toString());
-const maxLength = Symbol(html.EmailInputElement.name + "." + 'maxLength'.toString());
-const multiple = Symbol(html.EmailInputElement.name + "." + 'multiple'.toString());
-const pattern = Symbol(html.EmailInputElement.name + "." + 'pattern'.toString());
-const placeholder = Symbol(html.EmailInputElement.name + "." + 'placeholder'.toString());
-const readOnly = Symbol(html.EmailInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.EmailInputElement.name + "." + 'required'.toString());
-const size = Symbol(html.EmailInputElement.name + "." + 'size'.toString());
-html.EmailInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.EmailInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.EmailInputElement, [])}),
+const autocomplete$ = Symbol(html$.EmailInputElement.name + "." + 'autocomplete'.toString());
+const autofocus$ = Symbol(html$.EmailInputElement.name + "." + 'autofocus'.toString());
+const maxLength$ = Symbol(html$.EmailInputElement.name + "." + 'maxLength'.toString());
+const multiple = Symbol(html$.EmailInputElement.name + "." + 'multiple'.toString());
+const pattern$ = Symbol(html$.EmailInputElement.name + "." + 'pattern'.toString());
+const placeholder$ = Symbol(html$.EmailInputElement.name + "." + 'placeholder'.toString());
+const readOnly$ = Symbol(html$.EmailInputElement.name + "." + 'readOnly'.toString());
+const required$ = Symbol(html$.EmailInputElement.name + "." + 'required'.toString());
+const size$ = Symbol(html$.EmailInputElement.name + "." + 'size'.toString());
+html$.EmailInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.EmailInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.EmailInputElement, [])}),
   fields: () => ({
     autocomplete: core.String,
     autofocus: core.bool,
@@ -77596,7 +77599,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.EmailInputElement, [
+dart.defineExtensionMembers(html$.EmailInputElement, [
   'autocomplete',
   'autocomplete',
   'autofocus',
@@ -77616,14 +77619,14 @@
   'size',
   'size'
 ]);
-html.PasswordInputElement = class PasswordInputElement extends core.Object {
+html$.PasswordInputElement = class PasswordInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'password'});
+    return html$.InputElement.new({type: 'password'});
   }
 };
-html.PasswordInputElement[dart.implements] = () => [html.TextInputElementBase];
-dart.setSignature(html.PasswordInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.PasswordInputElement, [])})
+html$.PasswordInputElement[dart.implements] = () => [html$.TextInputElementBase];
+dart.setSignature(html$.PasswordInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.PasswordInputElement, [])})
 });
 dart.defineExtensionNames([
   'max',
@@ -77631,7 +77634,7 @@
   'step',
   'valueAsNumber'
 ]);
-html.RangeInputElementBase = class RangeInputElementBase extends core.Object {
+html$.RangeInputElementBase = class RangeInputElementBase extends core.Object {
   new() {
     this[max] = null;
     this[min] = null;
@@ -77663,12 +77666,12 @@
     this[valueAsNumber] = value;
   }
 };
-const max = Symbol(html.RangeInputElementBase.name + "." + 'max'.toString());
-const min = Symbol(html.RangeInputElementBase.name + "." + 'min'.toString());
-const step = Symbol(html.RangeInputElementBase.name + "." + 'step'.toString());
-const valueAsNumber = Symbol(html.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
-html.RangeInputElementBase[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.RangeInputElementBase, {
+const max = Symbol(html$.RangeInputElementBase.name + "." + 'max'.toString());
+const min = Symbol(html$.RangeInputElementBase.name + "." + 'min'.toString());
+const step = Symbol(html$.RangeInputElementBase.name + "." + 'step'.toString());
+const valueAsNumber = Symbol(html$.RangeInputElementBase.name + "." + 'valueAsNumber'.toString());
+html$.RangeInputElementBase[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.RangeInputElementBase, {
   fields: () => ({
     max: core.String,
     min: core.String,
@@ -77676,7 +77679,7 @@
     valueAsNumber: core.num
   })
 });
-dart.defineExtensionMembers(html.RangeInputElementBase, [
+dart.defineExtensionMembers(html$.RangeInputElementBase, [
   'max',
   'max',
   'min',
@@ -77691,9 +77694,9 @@
   'readOnly',
   'required'
 ]);
-html.DateInputElement = class DateInputElement extends core.Object {
+html$.DateInputElement = class DateInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'date'});
+    return html$.InputElement.new({type: 'date'});
   }
   get valueAsDate() {
     return this[valueAsDate];
@@ -77702,27 +77705,27 @@
     this[valueAsDate] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$0];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$0] = value;
   }
   get required() {
-    return this[required];
+    return this[required$0];
   }
   set required(value) {
-    this[required] = value;
+    this[required$0] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'date'})[dartx.type] == 'date';
+    return html$.InputElement.new({type: 'date'})[dartx.type] == 'date';
   }
 };
-const valueAsDate = Symbol(html.DateInputElement.name + "." + 'valueAsDate'.toString());
-const readOnly = Symbol(html.DateInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.DateInputElement.name + "." + 'required'.toString());
-html.DateInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.DateInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.DateInputElement, [])}),
+const valueAsDate = Symbol(html$.DateInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$0 = Symbol(html$.DateInputElement.name + "." + 'readOnly'.toString());
+const required$0 = Symbol(html$.DateInputElement.name + "." + 'required'.toString());
+html$.DateInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.DateInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.DateInputElement, [])}),
   fields: () => ({
     valueAsDate: core.DateTime,
     readOnly: core.bool,
@@ -77730,7 +77733,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.DateInputElement, [
+dart.defineExtensionMembers(html$.DateInputElement, [
   'valueAsDate',
   'valueAsDate',
   'readOnly',
@@ -77743,38 +77746,38 @@
   'readOnly',
   'required'
 ]);
-html.MonthInputElement = class MonthInputElement extends core.Object {
+html$.MonthInputElement = class MonthInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'month'});
+    return html$.InputElement.new({type: 'month'});
   }
   get valueAsDate() {
-    return this[valueAsDate];
+    return this[valueAsDate$];
   }
   set valueAsDate(value) {
-    this[valueAsDate] = value;
+    this[valueAsDate$] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$1];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$1] = value;
   }
   get required() {
-    return this[required];
+    return this[required$1];
   }
   set required(value) {
-    this[required] = value;
+    this[required$1] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'month'})[dartx.type] == 'month';
+    return html$.InputElement.new({type: 'month'})[dartx.type] == 'month';
   }
 };
-const valueAsDate = Symbol(html.MonthInputElement.name + "." + 'valueAsDate'.toString());
-const readOnly = Symbol(html.MonthInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.MonthInputElement.name + "." + 'required'.toString());
-html.MonthInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.MonthInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.MonthInputElement, [])}),
+const valueAsDate$ = Symbol(html$.MonthInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$1 = Symbol(html$.MonthInputElement.name + "." + 'readOnly'.toString());
+const required$1 = Symbol(html$.MonthInputElement.name + "." + 'required'.toString());
+html$.MonthInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.MonthInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.MonthInputElement, [])}),
   fields: () => ({
     valueAsDate: core.DateTime,
     readOnly: core.bool,
@@ -77782,7 +77785,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.MonthInputElement, [
+dart.defineExtensionMembers(html$.MonthInputElement, [
   'valueAsDate',
   'valueAsDate',
   'readOnly',
@@ -77795,38 +77798,38 @@
   'readOnly',
   'required'
 ]);
-html.WeekInputElement = class WeekInputElement extends core.Object {
+html$.WeekInputElement = class WeekInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'week'});
+    return html$.InputElement.new({type: 'week'});
   }
   get valueAsDate() {
-    return this[valueAsDate];
+    return this[valueAsDate$0];
   }
   set valueAsDate(value) {
-    this[valueAsDate] = value;
+    this[valueAsDate$0] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$2];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$2] = value;
   }
   get required() {
-    return this[required];
+    return this[required$2];
   }
   set required(value) {
-    this[required] = value;
+    this[required$2] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'week'})[dartx.type] == 'week';
+    return html$.InputElement.new({type: 'week'})[dartx.type] == 'week';
   }
 };
-const valueAsDate = Symbol(html.WeekInputElement.name + "." + 'valueAsDate'.toString());
-const readOnly = Symbol(html.WeekInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.WeekInputElement.name + "." + 'required'.toString());
-html.WeekInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.WeekInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.WeekInputElement, [])}),
+const valueAsDate$0 = Symbol(html$.WeekInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$2 = Symbol(html$.WeekInputElement.name + "." + 'readOnly'.toString());
+const required$2 = Symbol(html$.WeekInputElement.name + "." + 'required'.toString());
+html$.WeekInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.WeekInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.WeekInputElement, [])}),
   fields: () => ({
     valueAsDate: core.DateTime,
     readOnly: core.bool,
@@ -77834,7 +77837,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.WeekInputElement, [
+dart.defineExtensionMembers(html$.WeekInputElement, [
   'valueAsDate',
   'valueAsDate',
   'readOnly',
@@ -77847,38 +77850,38 @@
   'readOnly',
   'required'
 ]);
-html.TimeInputElement = class TimeInputElement extends core.Object {
+html$.TimeInputElement = class TimeInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'time'});
+    return html$.InputElement.new({type: 'time'});
   }
   get valueAsDate() {
-    return this[valueAsDate];
+    return this[valueAsDate$1];
   }
   set valueAsDate(value) {
-    this[valueAsDate] = value;
+    this[valueAsDate$1] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$3];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$3] = value;
   }
   get required() {
-    return this[required];
+    return this[required$3];
   }
   set required(value) {
-    this[required] = value;
+    this[required$3] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'time'})[dartx.type] == 'time';
+    return html$.InputElement.new({type: 'time'})[dartx.type] == 'time';
   }
 };
-const valueAsDate = Symbol(html.TimeInputElement.name + "." + 'valueAsDate'.toString());
-const readOnly = Symbol(html.TimeInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.TimeInputElement.name + "." + 'required'.toString());
-html.TimeInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.TimeInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.TimeInputElement, [])}),
+const valueAsDate$1 = Symbol(html$.TimeInputElement.name + "." + 'valueAsDate'.toString());
+const readOnly$3 = Symbol(html$.TimeInputElement.name + "." + 'readOnly'.toString());
+const required$3 = Symbol(html$.TimeInputElement.name + "." + 'required'.toString());
+html$.TimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.TimeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.TimeInputElement, [])}),
   fields: () => ({
     valueAsDate: core.DateTime,
     readOnly: core.bool,
@@ -77886,7 +77889,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.TimeInputElement, [
+dart.defineExtensionMembers(html$.TimeInputElement, [
   'valueAsDate',
   'valueAsDate',
   'readOnly',
@@ -77898,75 +77901,75 @@
   'readOnly',
   'required'
 ]);
-html.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
+html$.LocalDateTimeInputElement = class LocalDateTimeInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'datetime-local'});
+    return html$.InputElement.new({type: 'datetime-local'});
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$4];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$4] = value;
   }
   get required() {
-    return this[required];
+    return this[required$4];
   }
   set required(value) {
-    this[required] = value;
+    this[required$4] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
+    return html$.InputElement.new({type: 'datetime-local'})[dartx.type] == 'datetime-local';
   }
 };
-const readOnly = Symbol(html.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.LocalDateTimeInputElement.name + "." + 'required'.toString());
-html.LocalDateTimeInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.LocalDateTimeInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.LocalDateTimeInputElement, [])}),
+const readOnly$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'readOnly'.toString());
+const required$4 = Symbol(html$.LocalDateTimeInputElement.name + "." + 'required'.toString());
+html$.LocalDateTimeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.LocalDateTimeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.LocalDateTimeInputElement, [])}),
   fields: () => ({
     readOnly: core.bool,
     required: core.bool
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
+dart.defineExtensionMembers(html$.LocalDateTimeInputElement, ['readOnly', 'readOnly', 'required', 'required']);
 dart.defineExtensionNames([
   'placeholder',
   'readOnly',
   'required'
 ]);
-html.NumberInputElement = class NumberInputElement extends core.Object {
+html$.NumberInputElement = class NumberInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'number'});
+    return html$.InputElement.new({type: 'number'});
   }
   get placeholder() {
-    return this[placeholder];
+    return this[placeholder$0];
   }
   set placeholder(value) {
-    this[placeholder] = value;
+    this[placeholder$0] = value;
   }
   get readOnly() {
-    return this[readOnly];
+    return this[readOnly$5];
   }
   set readOnly(value) {
-    this[readOnly] = value;
+    this[readOnly$5] = value;
   }
   get required() {
-    return this[required];
+    return this[required$5];
   }
   set required(value) {
-    this[required] = value;
+    this[required$5] = value;
   }
   static get supported() {
-    return html.InputElement.new({type: 'number'})[dartx.type] == 'number';
+    return html$.InputElement.new({type: 'number'})[dartx.type] == 'number';
   }
 };
-const placeholder = Symbol(html.NumberInputElement.name + "." + 'placeholder'.toString());
-const readOnly = Symbol(html.NumberInputElement.name + "." + 'readOnly'.toString());
-const required = Symbol(html.NumberInputElement.name + "." + 'required'.toString());
-html.NumberInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.NumberInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.NumberInputElement, [])}),
+const placeholder$0 = Symbol(html$.NumberInputElement.name + "." + 'placeholder'.toString());
+const readOnly$5 = Symbol(html$.NumberInputElement.name + "." + 'readOnly'.toString());
+const required$5 = Symbol(html$.NumberInputElement.name + "." + 'required'.toString());
+html$.NumberInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.NumberInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.NumberInputElement, [])}),
   fields: () => ({
     placeholder: core.String,
     readOnly: core.bool,
@@ -77974,7 +77977,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineExtensionMembers(html.NumberInputElement, [
+dart.defineExtensionMembers(html$.NumberInputElement, [
   'placeholder',
   'placeholder',
   'readOnly',
@@ -77982,26 +77985,26 @@
   'required',
   'required'
 ]);
-html.RangeInputElement = class RangeInputElement extends core.Object {
+html$.RangeInputElement = class RangeInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'range'});
+    return html$.InputElement.new({type: 'range'});
   }
   static get supported() {
-    return html.InputElement.new({type: 'range'})[dartx.type] == 'range';
+    return html$.InputElement.new({type: 'range'})[dartx.type] == 'range';
   }
 };
-html.RangeInputElement[dart.implements] = () => [html.RangeInputElementBase];
-dart.setSignature(html.RangeInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.RangeInputElement, [])}),
+html$.RangeInputElement[dart.implements] = () => [html$.RangeInputElementBase];
+dart.setSignature(html$.RangeInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.RangeInputElement, [])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
 dart.defineExtensionNames([
   'checked',
   'required'
 ]);
-html.CheckboxInputElement = class CheckboxInputElement extends core.Object {
+html$.CheckboxInputElement = class CheckboxInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'checkbox'});
+    return html$.InputElement.new({type: 'checkbox'});
   }
   get checked() {
     return this[checked];
@@ -78010,64 +78013,64 @@
     this[checked] = value;
   }
   get required() {
-    return this[required];
+    return this[required$6];
   }
   set required(value) {
-    this[required] = value;
+    this[required$6] = value;
   }
 };
-const checked = Symbol(html.CheckboxInputElement.name + "." + 'checked'.toString());
-const required = Symbol(html.CheckboxInputElement.name + "." + 'required'.toString());
-html.CheckboxInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.CheckboxInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.CheckboxInputElement, [])}),
+const checked = Symbol(html$.CheckboxInputElement.name + "." + 'checked'.toString());
+const required$6 = Symbol(html$.CheckboxInputElement.name + "." + 'required'.toString());
+html$.CheckboxInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.CheckboxInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.CheckboxInputElement, [])}),
   fields: () => ({
     checked: core.bool,
     required: core.bool
   })
 });
-dart.defineExtensionMembers(html.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
+dart.defineExtensionMembers(html$.CheckboxInputElement, ['checked', 'checked', 'required', 'required']);
 dart.defineExtensionNames([
   'checked',
   'required'
 ]);
-html.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
+html$.RadioButtonInputElement = class RadioButtonInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'radio'});
+    return html$.InputElement.new({type: 'radio'});
   }
   get checked() {
-    return this[checked];
+    return this[checked$];
   }
   set checked(value) {
-    this[checked] = value;
+    this[checked$] = value;
   }
   get required() {
-    return this[required];
+    return this[required$7];
   }
   set required(value) {
-    this[required] = value;
+    this[required$7] = value;
   }
 };
-const checked = Symbol(html.RadioButtonInputElement.name + "." + 'checked'.toString());
-const required = Symbol(html.RadioButtonInputElement.name + "." + 'required'.toString());
-html.RadioButtonInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.RadioButtonInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.RadioButtonInputElement, [])}),
+const checked$ = Symbol(html$.RadioButtonInputElement.name + "." + 'checked'.toString());
+const required$7 = Symbol(html$.RadioButtonInputElement.name + "." + 'required'.toString());
+html$.RadioButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.RadioButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.RadioButtonInputElement, [])}),
   fields: () => ({
     checked: core.bool,
     required: core.bool
   })
 });
-dart.defineExtensionMembers(html.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
+dart.defineExtensionMembers(html$.RadioButtonInputElement, ['checked', 'checked', 'required', 'required']);
 dart.defineExtensionNames([
   'accept',
   'multiple',
   'required',
   'files'
 ]);
-html.FileUploadInputElement = class FileUploadInputElement extends core.Object {
+html$.FileUploadInputElement = class FileUploadInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'file'});
+    return html$.InputElement.new({type: 'file'});
   }
   get accept() {
     return this[accept];
@@ -78076,16 +78079,16 @@
     this[accept] = value;
   }
   get multiple() {
-    return this[multiple];
+    return this[multiple$];
   }
   set multiple(value) {
-    this[multiple] = value;
+    this[multiple$] = value;
   }
   get required() {
-    return this[required];
+    return this[required$8];
   }
   set required(value) {
-    this[required] = value;
+    this[required$8] = value;
   }
   get files() {
     return this[files];
@@ -78094,13 +78097,13 @@
     this[files] = value;
   }
 };
-const accept = Symbol(html.FileUploadInputElement.name + "." + 'accept'.toString());
-const multiple = Symbol(html.FileUploadInputElement.name + "." + 'multiple'.toString());
-const required = Symbol(html.FileUploadInputElement.name + "." + 'required'.toString());
-const files = Symbol(html.FileUploadInputElement.name + "." + 'files'.toString());
-html.FileUploadInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.FileUploadInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.FileUploadInputElement, [])}),
+const accept = Symbol(html$.FileUploadInputElement.name + "." + 'accept'.toString());
+const multiple$ = Symbol(html$.FileUploadInputElement.name + "." + 'multiple'.toString());
+const required$8 = Symbol(html$.FileUploadInputElement.name + "." + 'required'.toString());
+const files = Symbol(html$.FileUploadInputElement.name + "." + 'files'.toString());
+html$.FileUploadInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.FileUploadInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.FileUploadInputElement, [])}),
   fields: () => ({
     accept: core.String,
     multiple: core.bool,
@@ -78108,7 +78111,7 @@
     files: ListOfFile()
   })
 });
-dart.defineExtensionMembers(html.FileUploadInputElement, [
+dart.defineExtensionMembers(html$.FileUploadInputElement, [
   'accept',
   'accept',
   'multiple',
@@ -78125,9 +78128,9 @@
   'formNoValidate',
   'formTarget'
 ]);
-html.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
+html$.SubmitButtonInputElement = class SubmitButtonInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'submit'});
+    return html$.InputElement.new({type: 'submit'});
   }
   get formAction() {
     return this[formAction];
@@ -78160,14 +78163,14 @@
     this[formTarget] = value;
   }
 };
-const formAction = Symbol(html.SubmitButtonInputElement.name + "." + 'formAction'.toString());
-const formEnctype = Symbol(html.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
-const formMethod = Symbol(html.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
-const formNoValidate = Symbol(html.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
-const formTarget = Symbol(html.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
-html.SubmitButtonInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.SubmitButtonInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.SubmitButtonInputElement, [])}),
+const formAction = Symbol(html$.SubmitButtonInputElement.name + "." + 'formAction'.toString());
+const formEnctype = Symbol(html$.SubmitButtonInputElement.name + "." + 'formEnctype'.toString());
+const formMethod = Symbol(html$.SubmitButtonInputElement.name + "." + 'formMethod'.toString());
+const formNoValidate = Symbol(html$.SubmitButtonInputElement.name + "." + 'formNoValidate'.toString());
+const formTarget = Symbol(html$.SubmitButtonInputElement.name + "." + 'formTarget'.toString());
+html$.SubmitButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.SubmitButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.SubmitButtonInputElement, [])}),
   fields: () => ({
     formAction: core.String,
     formEnctype: core.String,
@@ -78176,7 +78179,7 @@
     formTarget: core.String
   })
 });
-dart.defineExtensionMembers(html.SubmitButtonInputElement, [
+dart.defineExtensionMembers(html$.SubmitButtonInputElement, [
   'formAction',
   'formAction',
   'formEnctype',
@@ -78199,9 +78202,9 @@
   'src',
   'width'
 ]);
-html.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
+html$.ImageButtonInputElement = class ImageButtonInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'image'});
+    return html$.InputElement.new({type: 'image'});
   }
   get alt() {
     return this[alt];
@@ -78210,34 +78213,34 @@
     this[alt] = value;
   }
   get formAction() {
-    return this[formAction];
+    return this[formAction$];
   }
   set formAction(value) {
-    this[formAction] = value;
+    this[formAction$] = value;
   }
   get formEnctype() {
-    return this[formEnctype];
+    return this[formEnctype$];
   }
   set formEnctype(value) {
-    this[formEnctype] = value;
+    this[formEnctype$] = value;
   }
   get formMethod() {
-    return this[formMethod];
+    return this[formMethod$];
   }
   set formMethod(value) {
-    this[formMethod] = value;
+    this[formMethod$] = value;
   }
   get formNoValidate() {
-    return this[formNoValidate];
+    return this[formNoValidate$];
   }
   set formNoValidate(value) {
-    this[formNoValidate] = value;
+    this[formNoValidate$] = value;
   }
   get formTarget() {
-    return this[formTarget];
+    return this[formTarget$];
   }
   set formTarget(value) {
-    this[formTarget] = value;
+    this[formTarget$] = value;
   }
   get height() {
     return this[height];
@@ -78258,18 +78261,18 @@
     this[width] = value;
   }
 };
-const alt = Symbol(html.ImageButtonInputElement.name + "." + 'alt'.toString());
-const formAction = Symbol(html.ImageButtonInputElement.name + "." + 'formAction'.toString());
-const formEnctype = Symbol(html.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
-const formMethod = Symbol(html.ImageButtonInputElement.name + "." + 'formMethod'.toString());
-const formNoValidate = Symbol(html.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
-const formTarget = Symbol(html.ImageButtonInputElement.name + "." + 'formTarget'.toString());
-const height = Symbol(html.ImageButtonInputElement.name + "." + 'height'.toString());
-const src = Symbol(html.ImageButtonInputElement.name + "." + 'src'.toString());
-const width = Symbol(html.ImageButtonInputElement.name + "." + 'width'.toString());
-html.ImageButtonInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.ImageButtonInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.ImageButtonInputElement, [])}),
+const alt = Symbol(html$.ImageButtonInputElement.name + "." + 'alt'.toString());
+const formAction$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formAction'.toString());
+const formEnctype$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formEnctype'.toString());
+const formMethod$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formMethod'.toString());
+const formNoValidate$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formNoValidate'.toString());
+const formTarget$ = Symbol(html$.ImageButtonInputElement.name + "." + 'formTarget'.toString());
+const height = Symbol(html$.ImageButtonInputElement.name + "." + 'height'.toString());
+const src = Symbol(html$.ImageButtonInputElement.name + "." + 'src'.toString());
+const width = Symbol(html$.ImageButtonInputElement.name + "." + 'width'.toString());
+html$.ImageButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ImageButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ImageButtonInputElement, [])}),
   fields: () => ({
     alt: core.String,
     formAction: core.String,
@@ -78282,7 +78285,7 @@
     width: core.int
   })
 });
-dart.defineExtensionMembers(html.ImageButtonInputElement, [
+dart.defineExtensionMembers(html$.ImageButtonInputElement, [
   'alt',
   'alt',
   'formAction',
@@ -78302,23 +78305,23 @@
   'width',
   'width'
 ]);
-html.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
+html$.ResetButtonInputElement = class ResetButtonInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'reset'});
+    return html$.InputElement.new({type: 'reset'});
   }
 };
-html.ResetButtonInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.ResetButtonInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.ResetButtonInputElement, [])})
+html$.ResetButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ResetButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ResetButtonInputElement, [])})
 });
-html.ButtonInputElement = class ButtonInputElement extends core.Object {
+html$.ButtonInputElement = class ButtonInputElement extends core.Object {
   static new() {
-    return html.InputElement.new({type: 'button'});
+    return html$.InputElement.new({type: 'button'});
   }
 };
-html.ButtonInputElement[dart.implements] = () => [html.InputElementBase];
-dart.setSignature(html.ButtonInputElement, {
-  constructors: () => ({new: dart.definiteFunctionType(html.ButtonInputElement, [])})
+html$.ButtonInputElement[dart.implements] = () => [html$.InputElementBase];
+dart.setSignature(html$.ButtonInputElement, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.ButtonInputElement, [])})
 });
 const _initKeyboardEvent = Symbol('_initKeyboardEvent');
 const _keyIdentifier = Symbol('_keyIdentifier');
@@ -78337,7 +78340,7 @@
   'repeat',
   'shiftKey'
 ]);
-html.KeyboardEvent = class KeyboardEvent extends html.UIEvent {
+html$.KeyboardEvent = class KeyboardEvent extends html$.UIEvent {
   static new(type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : true;
@@ -78348,9 +78351,9 @@
     let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
     let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let e = html.KeyboardEvent._check(html.document[_createEvent]("KeyboardEvent"));
+    let e = html$.KeyboardEvent._check(html$.document[_createEvent]("KeyboardEvent"));
     e[_initKeyboardEvent](type, canBubble, cancelable, view, "", keyLocation, ctrlKey, altKey, shiftKey, metaKey);
     return e;
   }
@@ -78374,9 +78377,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.KeyboardEvent._create_1(type, eventInitDict_1);
+      return html$.KeyboardEvent._create_1(type, eventInitDict_1);
     }
-    return html.KeyboardEvent._create_2(type);
+    return html$.KeyboardEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.KeyboardEvent(type, eventInitDict);
@@ -78418,10 +78421,10 @@
     return this.getModifierState.apply(this, args);
   }
 };
-dart.setSignature(html.KeyboardEvent, {
+dart.setSignature(html$.KeyboardEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.KeyboardEvent, [core.String], {view: html.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
-    _: dart.definiteFunctionType(html.KeyboardEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
+    _: dart.definiteFunctionType(html$.KeyboardEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.altKey]: core.bool,
@@ -78441,7 +78444,7 @@
     [dartx.which]: dart.definiteFunctionType(core.int, [])
   }),
   methods: () => ({
-    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
+    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
     [dartx.getModifierState]: dart.definiteFunctionType(core.bool, [core.String])
   }),
   sfields: () => ({
@@ -78451,31 +78454,31 @@
     DOM_KEY_LOCATION_STANDARD: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.KeyboardEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.KeyboardEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.KeyboardEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-html.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
-html.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
-html.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
-html.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
-dart.registerExtension(dart.global.KeyboardEvent, html.KeyboardEvent);
-html.KeyframeEffect = class KeyframeEffect extends html.AnimationEffectReadOnly {
+html$.KeyboardEvent.DOM_KEY_LOCATION_LEFT = 1;
+html$.KeyboardEvent.DOM_KEY_LOCATION_NUMPAD = 3;
+html$.KeyboardEvent.DOM_KEY_LOCATION_RIGHT = 2;
+html$.KeyboardEvent.DOM_KEY_LOCATION_STANDARD = 0;
+dart.registerExtension(dart.global.KeyboardEvent, html$.KeyboardEvent);
+html$.KeyframeEffect = class KeyframeEffect extends html$.AnimationEffectReadOnly {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(target, keyframes, timing) {
     if (timing === void 0) timing = null;
-    if (ListOfMap().is(keyframes) && (html.Element.is(target) || target == null) && timing == null) {
-      return html.KeyframeEffect._create_1(target, keyframes);
+    if (ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null) && timing == null) {
+      return html$.KeyframeEffect._create_1(target, keyframes);
     }
-    if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html.Element.is(target) || target == null)) {
-      return html.KeyframeEffect._create_2(target, keyframes, timing);
+    if (typeof timing == 'number' && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
+      return html$.KeyframeEffect._create_2(target, keyframes, timing);
     }
-    if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html.Element.is(target) || target == null)) {
+    if (core.Map.is(timing) && ListOfMap().is(keyframes) && (html$.Element.is(target) || target == null)) {
       let timing_1 = html_common.convertDartToNative_Dictionary(timing);
-      return html.KeyframeEffect._create_3(target, keyframes, timing_1);
+      return html$.KeyframeEffect._create_3(target, keyframes, timing_1);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -78489,19 +78492,19 @@
     return new self.KeyframeEffect(target, keyframes, timing);
   }
 };
-dart.setSignature(html.KeyframeEffect, {
+dart.setSignature(html$.KeyframeEffect, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.KeyframeEffect, []),
-    new: dart.definiteFunctionType(html.KeyframeEffect, [html.Element, ListOfMap()], [dart.dynamic])
+    _: dart.definiteFunctionType(html$.KeyframeEffect, []),
+    new: dart.definiteFunctionType(html$.KeyframeEffect, [html$.Element, ListOfMap()], [dart.dynamic])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.KeyframeEffect, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.KeyframeEffect, [dart.dynamic, dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.registerExtension(dart.global.KeyframeEffect, html.KeyframeEffect);
+dart.registerExtension(dart.global.KeyframeEffect, html$.KeyframeEffect);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -78518,12 +78521,12 @@
   'validity',
   'willValidate'
 ]);
-html.KeygenElement = class KeygenElement extends html.HtmlElement {
+html$.KeygenElement = class KeygenElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.KeygenElement._check(html.document[dartx.createElement]("keygen"));
+    return html$.KeygenElement._check(html$.document[dartx.createElement]("keygen"));
   }
   created() {
     this[dartx.autofocus] = null;
@@ -78540,7 +78543,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(html.Element.isTagSupported('keygen')) && html.KeygenElement.is(html.Element.tag('keygen'));
+    return dart.test(html$.Element.isTagSupported('keygen')) && html$.KeygenElement.is(html$.Element.tag('keygen'));
   }
   get [dartx.autofocus]() {
     return this.autofocus;
@@ -78600,24 +78603,24 @@
     return this.setCustomValidity.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.KeygenElement, 'created');
-dart.setSignature(html.KeygenElement, {
+dart.defineNamedConstructor(html$.KeygenElement, 'created');
+dart.setSignature(html$.KeygenElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.KeygenElement, []),
-    new: dart.definiteFunctionType(html.KeygenElement, []),
-    created: dart.definiteFunctionType(html.KeygenElement, [])
+    _: dart.definiteFunctionType(html$.KeygenElement, []),
+    new: dart.definiteFunctionType(html$.KeygenElement, []),
+    created: dart.definiteFunctionType(html$.KeygenElement, [])
   }),
   fields: () => ({
     [dartx.autofocus]: core.bool,
     [dartx.challenge]: core.String,
     [dartx.disabled]: core.bool,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.keytype]: core.String,
     [dartx.labels]: ListOfNode(),
     [dartx.name]: core.String,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.willValidate]: core.bool
   }),
   methods: () => ({
@@ -78627,16 +78630,16 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLKeygenElement, html.KeygenElement);
+dart.registerExtension(dart.global.HTMLKeygenElement, html$.KeygenElement);
 dart.defineExtensionNames([
   'value'
 ]);
-html.LIElement = class LIElement extends html.HtmlElement {
+html$.LIElement = class LIElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.LIElement._check(html.document[dartx.createElement]("li"));
+    return html$.LIElement._check(html$.document[dartx.createElement]("li"));
   }
   created() {
     this[dartx.value] = null;
@@ -78649,27 +78652,27 @@
     this.value = value;
   }
 };
-dart.defineNamedConstructor(html.LIElement, 'created');
-dart.setSignature(html.LIElement, {
+dart.defineNamedConstructor(html$.LIElement, 'created');
+dart.setSignature(html$.LIElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.LIElement, []),
-    new: dart.definiteFunctionType(html.LIElement, []),
-    created: dart.definiteFunctionType(html.LIElement, [])
+    _: dart.definiteFunctionType(html$.LIElement, []),
+    new: dart.definiteFunctionType(html$.LIElement, []),
+    created: dart.definiteFunctionType(html$.LIElement, [])
   }),
   fields: () => ({[dartx.value]: core.int})
 });
-dart.registerExtension(dart.global.HTMLLIElement, html.LIElement);
+dart.registerExtension(dart.global.HTMLLIElement, html$.LIElement);
 dart.defineExtensionNames([
   'control',
   'form',
   'htmlFor'
 ]);
-html.LabelElement = class LabelElement extends html.HtmlElement {
+html$.LabelElement = class LabelElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.LabelElement._check(html.document[dartx.createElement]("label"));
+    return html$.LabelElement._check(html$.document[dartx.createElement]("label"));
   }
   created() {
     this[dartx.control] = null;
@@ -78690,29 +78693,29 @@
     this.htmlFor = value;
   }
 };
-dart.defineNamedConstructor(html.LabelElement, 'created');
-dart.setSignature(html.LabelElement, {
+dart.defineNamedConstructor(html$.LabelElement, 'created');
+dart.setSignature(html$.LabelElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.LabelElement, []),
-    new: dart.definiteFunctionType(html.LabelElement, []),
-    created: dart.definiteFunctionType(html.LabelElement, [])
+    _: dart.definiteFunctionType(html$.LabelElement, []),
+    new: dart.definiteFunctionType(html$.LabelElement, []),
+    created: dart.definiteFunctionType(html$.LabelElement, [])
   }),
   fields: () => ({
-    [dartx.control]: html.HtmlElement,
-    [dartx.form]: html.FormElement,
+    [dartx.control]: html$.HtmlElement,
+    [dartx.form]: html$.FormElement,
     [dartx.htmlFor]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLLabelElement, html.LabelElement);
+dart.registerExtension(dart.global.HTMLLabelElement, html$.LabelElement);
 dart.defineExtensionNames([
   'form'
 ]);
-html.LegendElement = class LegendElement extends html.HtmlElement {
+html$.LegendElement = class LegendElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.LegendElement._check(html.document[dartx.createElement]("legend"));
+    return html$.LegendElement._check(html$.document[dartx.createElement]("legend"));
   }
   created() {
     this[dartx.form] = null;
@@ -78722,16 +78725,16 @@
     return this.form;
   }
 };
-dart.defineNamedConstructor(html.LegendElement, 'created');
-dart.setSignature(html.LegendElement, {
+dart.defineNamedConstructor(html$.LegendElement, 'created');
+dart.setSignature(html$.LegendElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.LegendElement, []),
-    new: dart.definiteFunctionType(html.LegendElement, []),
-    created: dart.definiteFunctionType(html.LegendElement, [])
+    _: dart.definiteFunctionType(html$.LegendElement, []),
+    new: dart.definiteFunctionType(html$.LegendElement, []),
+    created: dart.definiteFunctionType(html$.LegendElement, [])
   }),
-  fields: () => ({[dartx.form]: html.FormElement})
+  fields: () => ({[dartx.form]: html$.FormElement})
 });
-dart.registerExtension(dart.global.HTMLLegendElement, html.LegendElement);
+dart.registerExtension(dart.global.HTMLLegendElement, html$.LegendElement);
 dart.defineExtensionNames([
   'supportsImport',
   'crossOrigin',
@@ -78746,12 +78749,12 @@
   'sizes',
   'type'
 ]);
-html.LinkElement = class LinkElement extends html.HtmlElement {
+html$.LinkElement = class LinkElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.LinkElement._check(html.document[dartx.createElement]("link"));
+    return html$.LinkElement._check(html$.document[dartx.createElement]("link"));
   }
   created() {
     this[dartx.crossOrigin] = null;
@@ -78828,29 +78831,29 @@
     return "import" in this;
   }
 };
-dart.defineNamedConstructor(html.LinkElement, 'created');
-dart.setSignature(html.LinkElement, {
+dart.defineNamedConstructor(html$.LinkElement, 'created');
+dart.setSignature(html$.LinkElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.LinkElement, []),
-    new: dart.definiteFunctionType(html.LinkElement, []),
-    created: dart.definiteFunctionType(html.LinkElement, [])
+    _: dart.definiteFunctionType(html$.LinkElement, []),
+    new: dart.definiteFunctionType(html$.LinkElement, []),
+    created: dart.definiteFunctionType(html$.LinkElement, [])
   }),
   fields: () => ({
     [dartx.crossOrigin]: core.String,
     [dartx.disabled]: core.bool,
     [dartx.href]: core.String,
     [dartx.hreflang]: core.String,
-    [dartx.import]: html.Document,
+    [dartx.import]: html$.Document,
     [dartx.integrity]: core.String,
     [dartx.media]: core.String,
     [dartx.rel]: core.String,
-    [dartx.sheet]: html.StyleSheet,
-    [dartx.sizes]: html.DomSettableTokenList,
+    [dartx.sheet]: html$.StyleSheet,
+    [dartx.sizes]: html$.DomSettableTokenList,
     [dartx.type]: core.String
   }),
   getters: () => ({[dartx.supportsImport]: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLLinkElement, html.LinkElement);
+dart.registerExtension(dart.global.HTMLLinkElement, html$.LinkElement);
 dart.defineExtensionNames([
   'assign',
   'reload',
@@ -78867,7 +78870,7 @@
   'protocol',
   'search'
 ]);
-html.Location = class Location extends _interceptors.Interceptor {
+html$.Location = class Location extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -78941,9 +78944,9 @@
     return String(this);
   }
 };
-html.Location[dart.implements] = () => [html.LocationBase];
-dart.setSignature(html.Location, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Location, [])}),
+html$.Location[dart.implements] = () => [html$.LocationBase];
+dart.setSignature(html$.Location, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Location, [])}),
   fields: () => ({
     [dartx.ancestorOrigins]: ListOfString(),
     [dartx.hash]: core.String,
@@ -78962,17 +78965,17 @@
     [dartx.replace]: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.registerExtension(dart.global.Location, html.Location);
+dart.registerExtension(dart.global.Location, html$.Location);
 dart.defineExtensionNames([
   'areas',
   'name'
 ]);
-html.MapElement = class MapElement extends html.HtmlElement {
+html$.MapElement = class MapElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MapElement._check(html.document[dartx.createElement]("map"));
+    return html$.MapElement._check(html$.document[dartx.createElement]("map"));
   }
   created() {
     this[dartx.areas] = null;
@@ -78989,19 +78992,19 @@
     this.name = value;
   }
 };
-dart.defineNamedConstructor(html.MapElement, 'created');
-dart.setSignature(html.MapElement, {
+dart.defineNamedConstructor(html$.MapElement, 'created');
+dart.setSignature(html$.MapElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MapElement, []),
-    new: dart.definiteFunctionType(html.MapElement, []),
-    created: dart.definiteFunctionType(html.MapElement, [])
+    _: dart.definiteFunctionType(html$.MapElement, []),
+    new: dart.definiteFunctionType(html$.MapElement, []),
+    created: dart.definiteFunctionType(html$.MapElement, [])
   }),
   fields: () => ({
     [dartx.areas]: ListOfNode(),
     [dartx.name]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLMapElement, html.MapElement);
+dart.registerExtension(dart.global.HTMLMapElement, html$.MapElement);
 dart.defineExtensionNames([
   'pause',
   'play',
@@ -79018,12 +79021,12 @@
   'seekable',
   'volume'
 ]);
-html.MediaController = class MediaController extends html.EventTarget {
+html$.MediaController = class MediaController extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MediaController._create_1();
+    return html$.MediaController._create_1();
   }
   static _create_1() {
     return new self.MediaController();
@@ -79086,13 +79089,13 @@
     return this.unpause.apply(this, args);
   }
 };
-dart.setSignature(html.MediaController, {
+dart.setSignature(html$.MediaController, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaController, []),
-    new: dart.definiteFunctionType(html.MediaController, [])
+    _: dart.definiteFunctionType(html$.MediaController, []),
+    new: dart.definiteFunctionType(html$.MediaController, [])
   }),
   fields: () => ({
-    [dartx.buffered]: html.TimeRanges,
+    [dartx.buffered]: html$.TimeRanges,
     [dartx.currentTime]: core.num,
     [dartx.defaultPlaybackRate]: core.num,
     [dartx.duration]: core.double,
@@ -79100,8 +79103,8 @@
     [dartx.paused]: core.bool,
     [dartx.playbackRate]: core.num,
     [dartx.playbackState]: core.String,
-    [dartx.played]: html.TimeRanges,
-    [dartx.seekable]: html.TimeRanges,
+    [dartx.played]: html$.TimeRanges,
+    [dartx.seekable]: html$.TimeRanges,
     [dartx.volume]: core.num
   }),
   methods: () => ({
@@ -79109,17 +79112,17 @@
     [dartx.play]: dart.definiteFunctionType(dart.void, []),
     [dartx.unpause]: dart.definiteFunctionType(dart.void, [])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.MediaController, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaController, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.MediaController, html.MediaController);
+dart.registerExtension(dart.global.MediaController, html$.MediaController);
 dart.defineExtensionNames([
   'deviceId',
   'groupId',
   'kind',
   'label'
 ]);
-html.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
+html$.MediaDeviceInfo = class MediaDeviceInfo extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79136,8 +79139,8 @@
     return this.label;
   }
 };
-dart.setSignature(html.MediaDeviceInfo, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaDeviceInfo, [])}),
+dart.setSignature(html$.MediaDeviceInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDeviceInfo, [])}),
   fields: () => ({
     [dartx.deviceId]: core.String,
     [dartx.groupId]: core.String,
@@ -79145,13 +79148,13 @@
     [dartx.label]: core.String
   })
 });
-dart.registerExtension(dart.global.MediaDeviceInfo, html.MediaDeviceInfo);
+dart.registerExtension(dart.global.MediaDeviceInfo, html$.MediaDeviceInfo);
 const _getUserMedia_1 = Symbol('_getUserMedia_1');
 dart.defineExtensionNames([
   'enumerateDevices',
   'getUserMedia'
 ]);
-html.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
+html$.MediaDevices = class MediaDevices extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79166,20 +79169,20 @@
     return this.getUserMedia.apply(this, args);
   }
 };
-dart.setSignature(html.MediaDevices, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaDevices, [])}),
+dart.setSignature(html$.MediaDevices, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaDevices, [])}),
   methods: () => ({
     [dartx.enumerateDevices]: dart.definiteFunctionType(async.Future, []),
     [dartx.getUserMedia]: dart.definiteFunctionType(async.Future, [core.Map]),
     [_getUserMedia_1]: dart.definiteFunctionType(async.Future, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.MediaDevices, html.MediaDevices);
+dart.registerExtension(dart.global.MediaDevices, html$.MediaDevices);
 dart.defineExtensionNames([
   'initData',
   'initDataType'
 ]);
-html.MediaEncryptedEvent = class MediaEncryptedEvent extends html.Event {
+html$.MediaEncryptedEvent = class MediaEncryptedEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79187,9 +79190,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MediaEncryptedEvent._create_1(type, eventInitDict_1);
+      return html$.MediaEncryptedEvent._create_1(type, eventInitDict_1);
     }
-    return html.MediaEncryptedEvent._create_2(type);
+    return html$.MediaEncryptedEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MediaEncryptedEvent(type, eventInitDict);
@@ -79204,26 +79207,26 @@
     return this.initDataType;
   }
 };
-dart.setSignature(html.MediaEncryptedEvent, {
+dart.setSignature(html$.MediaEncryptedEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaEncryptedEvent, []),
-    new: dart.definiteFunctionType(html.MediaEncryptedEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MediaEncryptedEvent, []),
+    new: dart.definiteFunctionType(html$.MediaEncryptedEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.initData]: typed_data.ByteBuffer,
     [dartx.initDataType]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MediaEncryptedEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaEncryptedEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MediaEncryptedEvent, html.MediaEncryptedEvent);
+dart.registerExtension(dart.global.MediaEncryptedEvent, html$.MediaEncryptedEvent);
 dart.defineExtensionNames([
   'code'
 ]);
-html.MediaError = class MediaError extends _interceptors.Interceptor {
+html$.MediaError = class MediaError extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79231,8 +79234,8 @@
     return this.code;
   }
 };
-dart.setSignature(html.MediaError, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaError, [])}),
+dart.setSignature(html$.MediaError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaError, [])}),
   fields: () => ({[dartx.code]: core.int}),
   sfields: () => ({
     MEDIA_ERR_ABORTED: core.int,
@@ -79241,16 +79244,16 @@
     MEDIA_ERR_SRC_NOT_SUPPORTED: core.int
   })
 });
-html.MediaError.MEDIA_ERR_ABORTED = 1;
-html.MediaError.MEDIA_ERR_DECODE = 3;
-html.MediaError.MEDIA_ERR_NETWORK = 2;
-html.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
-dart.registerExtension(dart.global.MediaError, html.MediaError);
+html$.MediaError.MEDIA_ERR_ABORTED = 1;
+html$.MediaError.MEDIA_ERR_DECODE = 3;
+html$.MediaError.MEDIA_ERR_NETWORK = 2;
+html$.MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
+dart.registerExtension(dart.global.MediaError, html$.MediaError);
 dart.defineExtensionNames([
   'code',
   'systemCode'
 ]);
-html.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
+html$.MediaKeyError = class MediaKeyError extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79261,8 +79264,8 @@
     return this.systemCode;
   }
 };
-dart.setSignature(html.MediaKeyError, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaKeyError, [])}),
+dart.setSignature(html$.MediaKeyError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyError, [])}),
   fields: () => ({
     [dartx.code]: core.int,
     [dartx.systemCode]: core.int
@@ -79276,13 +79279,13 @@
     MEDIA_KEYERR_UNKNOWN: core.int
   })
 });
-html.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
-html.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
-html.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
-html.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
-html.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
-html.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
-dart.registerExtension(dart.global.MediaKeyError, html.MediaKeyError);
+html$.MediaKeyError.MEDIA_KEYERR_CLIENT = 2;
+html$.MediaKeyError.MEDIA_KEYERR_DOMAIN = 6;
+html$.MediaKeyError.MEDIA_KEYERR_HARDWARECHANGE = 5;
+html$.MediaKeyError.MEDIA_KEYERR_OUTPUT = 4;
+html$.MediaKeyError.MEDIA_KEYERR_SERVICE = 3;
+html$.MediaKeyError.MEDIA_KEYERR_UNKNOWN = 1;
+dart.registerExtension(dart.global.MediaKeyError, html$.MediaKeyError);
 dart.defineExtensionNames([
   'defaultUrl',
   'errorCode',
@@ -79292,7 +79295,7 @@
   'sessionId',
   'systemCode'
 ]);
-html.MediaKeyEvent = class MediaKeyEvent extends html.Event {
+html$.MediaKeyEvent = class MediaKeyEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79300,9 +79303,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MediaKeyEvent._create_1(type, eventInitDict_1);
+      return html$.MediaKeyEvent._create_1(type, eventInitDict_1);
     }
-    return html.MediaKeyEvent._create_2(type);
+    return html$.MediaKeyEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MediaKeyEvent(type, eventInitDict);
@@ -79332,14 +79335,14 @@
     return this.systemCode;
   }
 };
-dart.setSignature(html.MediaKeyEvent, {
+dart.setSignature(html$.MediaKeyEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaKeyEvent, []),
-    new: dart.definiteFunctionType(html.MediaKeyEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MediaKeyEvent, []),
+    new: dart.definiteFunctionType(html$.MediaKeyEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.defaultUrl]: core.String,
-    [dartx.errorCode]: html.MediaKeyError,
+    [dartx.errorCode]: html$.MediaKeyError,
     [dartx.initData]: typed_data.Uint8List,
     [dartx.keySystem]: core.String,
     [dartx.message]: typed_data.Uint8List,
@@ -79347,17 +79350,17 @@
     [dartx.systemCode]: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MediaKeyEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaKeyEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MediaKeyEvent, html.MediaKeyEvent);
+dart.registerExtension(dart.global.MediaKeyEvent, html$.MediaKeyEvent);
 dart.defineExtensionNames([
   'message',
   'messageType'
 ]);
-html.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html.Event {
+html$.MediaKeyMessageEvent = class MediaKeyMessageEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79365,9 +79368,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
+      return html$.MediaKeyMessageEvent._create_1(type, eventInitDict_1);
     }
-    return html.MediaKeyMessageEvent._create_2(type);
+    return html$.MediaKeyMessageEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MediaKeyMessageEvent(type, eventInitDict);
@@ -79382,23 +79385,23 @@
     return this.messageType;
   }
 };
-dart.setSignature(html.MediaKeyMessageEvent, {
+dart.setSignature(html$.MediaKeyMessageEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaKeyMessageEvent, []),
-    new: dart.definiteFunctionType(html.MediaKeyMessageEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MediaKeyMessageEvent, []),
+    new: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.message]: typed_data.ByteBuffer,
     [dartx.messageType]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MediaKeyMessageEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaKeyMessageEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MediaKeyMessageEvent, html.MediaKeyMessageEvent);
-const _update = Symbol('_update');
+dart.registerExtension(dart.global.MediaKeyMessageEvent, html$.MediaKeyMessageEvent);
+const _update$ = Symbol('_update');
 dart.defineExtensionNames([
   'close',
   'generateRequest',
@@ -79409,7 +79412,7 @@
   'keyStatuses',
   'sessionId'
 ]);
-html.MediaKeySession = class MediaKeySession extends html.EventTarget {
+html$.MediaKeySession = class MediaKeySession extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79437,16 +79440,16 @@
   [dartx.remove](...args) {
     return this.remove.apply(this, args);
   }
-  [_update](...args) {
+  [_update$](...args) {
     return this.update.apply(this, args);
   }
 };
-dart.setSignature(html.MediaKeySession, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaKeySession, [])}),
+dart.setSignature(html$.MediaKeySession, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySession, [])}),
   fields: () => ({
     [dartx.closed]: async.Future,
     [dartx.expiration]: core.double,
-    [dartx.keyStatuses]: html.MediaKeyStatusMap,
+    [dartx.keyStatuses]: html$.MediaKeyStatusMap,
     [dartx.sessionId]: core.String
   }),
   methods: () => ({
@@ -79454,14 +79457,14 @@
     [dartx.generateRequest]: dart.definiteFunctionType(async.Future, [core.String, dart.dynamic]),
     [dartx.load]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.remove]: dart.definiteFunctionType(async.Future, []),
-    [_update]: dart.definiteFunctionType(async.Future, [dart.dynamic])
+    [_update$]: dart.definiteFunctionType(async.Future, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.MediaKeySession, html.MediaKeySession);
+dart.registerExtension(dart.global.MediaKeySession, html$.MediaKeySession);
 dart.defineExtensionNames([
   'size'
 ]);
-html.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
+html$.MediaKeyStatusMap = class MediaKeyStatusMap extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79469,18 +79472,18 @@
     return this.size;
   }
 };
-dart.setSignature(html.MediaKeyStatusMap, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaKeyStatusMap, [])}),
+dart.setSignature(html$.MediaKeyStatusMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeyStatusMap, [])}),
   fields: () => ({[dartx.size]: core.int})
 });
-dart.registerExtension(dart.global.MediaKeyStatusMap, html.MediaKeyStatusMap);
+dart.registerExtension(dart.global.MediaKeyStatusMap, html$.MediaKeyStatusMap);
 const _getConfiguration_1 = Symbol('_getConfiguration_1');
 dart.defineExtensionNames([
   'createMediaKeys',
   'getConfiguration',
   'keySystem'
 ]);
-html.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
+html$.MediaKeySystemAccess = class MediaKeySystemAccess extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79497,8 +79500,8 @@
     return this.getConfiguration.apply(this, args);
   }
 };
-dart.setSignature(html.MediaKeySystemAccess, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaKeySystemAccess, [])}),
+dart.setSignature(html$.MediaKeySystemAccess, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeySystemAccess, [])}),
   fields: () => ({[dartx.keySystem]: core.String}),
   methods: () => ({
     [dartx.createMediaKeys]: dart.definiteFunctionType(async.Future, []),
@@ -79506,12 +79509,12 @@
     [_getConfiguration_1]: dart.definiteFunctionType(dart.dynamic, [])
   })
 });
-dart.registerExtension(dart.global.MediaKeySystemAccess, html.MediaKeySystemAccess);
+dart.registerExtension(dart.global.MediaKeySystemAccess, html$.MediaKeySystemAccess);
 const _createSession = Symbol('_createSession');
 dart.defineExtensionNames([
   'setServerCertificate'
 ]);
-html.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
+html$.MediaKeys = class MediaKeys extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79522,14 +79525,14 @@
     return this.setServerCertificate.apply(this, args);
   }
 };
-dart.setSignature(html.MediaKeys, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaKeys, [])}),
+dart.setSignature(html$.MediaKeys, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaKeys, [])}),
   methods: () => ({
-    [_createSession]: dart.definiteFunctionType(html.MediaKeySession, [], [core.String]),
+    [_createSession]: dart.definiteFunctionType(html$.MediaKeySession, [], [core.String]),
     [dartx.setServerCertificate]: dart.definiteFunctionType(async.Future, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.MediaKeys, html.MediaKeys);
+dart.registerExtension(dart.global.MediaKeys, html$.MediaKeys);
 dart.defineExtensionNames([
   'appendMedium',
   'deleteMedium',
@@ -79537,7 +79540,7 @@
   'length',
   'mediaText'
 ]);
-html.MediaList = class MediaList extends _interceptors.Interceptor {
+html$.MediaList = class MediaList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79560,8 +79563,8 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html.MediaList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaList, [])}),
+dart.setSignature(html$.MediaList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaList, [])}),
   fields: () => ({
     [dartx.length]: core.int,
     [dartx.mediaText]: core.String
@@ -79572,7 +79575,7 @@
     [dartx.item]: dart.definiteFunctionType(core.String, [core.int])
   })
 });
-dart.registerExtension(dart.global.MediaList, html.MediaList);
+dart.registerExtension(dart.global.MediaList, html$.MediaList);
 dart.defineExtensionNames([
   'addListener',
   'removeListener',
@@ -79580,7 +79583,7 @@
   'matches',
   'media'
 ]);
-html.MediaQueryList = class MediaQueryList extends html.EventTarget {
+html$.MediaQueryList = class MediaQueryList extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79597,33 +79600,33 @@
     return this.removeListener.apply(this, args);
   }
   get [dartx.onChange]() {
-    return html.MediaQueryList.changeEvent.forTarget(this);
+    return html$.MediaQueryList.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.MediaQueryList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaQueryList, [])}),
+dart.setSignature(html$.MediaQueryList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaQueryList, [])}),
   fields: () => ({
     [dartx.matches]: core.bool,
     [dartx.media]: core.String
   }),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
-    [dartx.addListener]: dart.definiteFunctionType(dart.void, [html.EventListener]),
-    [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html.EventListener])
+    [dartx.addListener]: dart.definiteFunctionType(dart.void, [html$.EventListener]),
+    [dartx.removeListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])
   }),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.MediaQueryList, {
+dart.defineLazy(html$.MediaQueryList, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.MediaQueryList, html.MediaQueryList);
+dart.registerExtension(dart.global.MediaQueryList, html$.MediaQueryList);
 dart.defineExtensionNames([
   'matches',
   'media'
 ]);
-html.MediaQueryListEvent = class MediaQueryListEvent extends html.Event {
+html$.MediaQueryListEvent = class MediaQueryListEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79631,9 +79634,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MediaQueryListEvent._create_1(type, eventInitDict_1);
+      return html$.MediaQueryListEvent._create_1(type, eventInitDict_1);
     }
-    return html.MediaQueryListEvent._create_2(type);
+    return html$.MediaQueryListEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MediaQueryListEvent(type, eventInitDict);
@@ -79648,32 +79651,32 @@
     return this.media;
   }
 };
-dart.setSignature(html.MediaQueryListEvent, {
+dart.setSignature(html$.MediaQueryListEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaQueryListEvent, []),
-    new: dart.definiteFunctionType(html.MediaQueryListEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MediaQueryListEvent, []),
+    new: dart.definiteFunctionType(html$.MediaQueryListEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.matches]: core.bool,
     [dartx.media]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MediaQueryListEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaQueryListEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MediaQueryListEvent, html.MediaQueryListEvent);
+dart.registerExtension(dart.global.MediaQueryListEvent, html$.MediaQueryListEvent);
 dart.defineExtensionNames([
   'activate',
   'deactivate'
 ]);
-html.MediaSession = class MediaSession extends _interceptors.Interceptor {
+html$.MediaSession = class MediaSession extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MediaSession._create_1();
+    return html$.MediaSession._create_1();
   }
   static _create_1() {
     return new self.MediaSession();
@@ -79685,19 +79688,19 @@
     return this.deactivate.apply(this, args);
   }
 };
-dart.setSignature(html.MediaSession, {
+dart.setSignature(html$.MediaSession, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaSession, []),
-    new: dart.definiteFunctionType(html.MediaSession, [])
+    _: dart.definiteFunctionType(html$.MediaSession, []),
+    new: dart.definiteFunctionType(html$.MediaSession, [])
   }),
   methods: () => ({
     [dartx.activate]: dart.definiteFunctionType(dart.void, []),
     [dartx.deactivate]: dart.definiteFunctionType(dart.void, [])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.MediaSession, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.MediaSession, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.MediaSession, html.MediaSession);
+dart.registerExtension(dart.global.MediaSession, html$.MediaSession);
 dart.defineExtensionNames([
   'addSourceBuffer',
   'endOfStream',
@@ -79707,12 +79710,12 @@
   'readyState',
   'sourceBuffers'
 ]);
-html.MediaSource = class MediaSource extends html.EventTarget {
+html$.MediaSource = class MediaSource extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MediaSource._create_1();
+    return html$.MediaSource._create_1();
   }
   static _create_1() {
     return new self.MediaSource();
@@ -79745,30 +79748,30 @@
     return this.removeSourceBuffer.apply(this, args);
   }
 };
-dart.setSignature(html.MediaSource, {
+dart.setSignature(html$.MediaSource, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaSource, []),
-    new: dart.definiteFunctionType(html.MediaSource, [])
+    _: dart.definiteFunctionType(html$.MediaSource, []),
+    new: dart.definiteFunctionType(html$.MediaSource, [])
   }),
   fields: () => ({
-    [dartx.activeSourceBuffers]: html.SourceBufferList,
+    [dartx.activeSourceBuffers]: html$.SourceBufferList,
     [dartx.duration]: core.num,
     [dartx.readyState]: core.String,
-    [dartx.sourceBuffers]: html.SourceBufferList
+    [dartx.sourceBuffers]: html$.SourceBufferList
   }),
   methods: () => ({
-    [dartx.addSourceBuffer]: dart.definiteFunctionType(html.SourceBuffer, [core.String]),
+    [dartx.addSourceBuffer]: dart.definiteFunctionType(html$.SourceBuffer, [core.String]),
     [dartx.endOfStream]: dart.definiteFunctionType(dart.void, [], [core.String]),
-    [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html.SourceBuffer])
+    [dartx.removeSourceBuffer]: dart.definiteFunctionType(dart.void, [html$.SourceBuffer])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaSource, []),
+    _create_1: dart.definiteFunctionType(html$.MediaSource, []),
     isTypeSupported: dart.definiteFunctionType(core.bool, [core.String])
   }),
   names: ['_create_1', 'isTypeSupported']
 });
-dart.registerExtension(dart.global.MediaSource, html.MediaSource);
+dart.registerExtension(dart.global.MediaSource, html$.MediaSource);
 dart.defineExtensionNames([
   'addTrack',
   'clone',
@@ -79786,20 +79789,20 @@
   'id',
   'label'
 ]);
-html.MediaStream = class MediaStream extends html.EventTarget {
+html$.MediaStream = class MediaStream extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(stream_OR_tracks) {
     if (stream_OR_tracks === void 0) stream_OR_tracks = null;
     if (stream_OR_tracks == null) {
-      return html.MediaStream._create_1();
+      return html$.MediaStream._create_1();
     }
-    if (html.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
-      return html.MediaStream._create_2(stream_OR_tracks);
+    if (html$.MediaStream.is(stream_OR_tracks) || stream_OR_tracks == null) {
+      return html$.MediaStream._create_2(stream_OR_tracks);
     }
     if (ListOfMediaStreamTrack().is(stream_OR_tracks) || stream_OR_tracks == null) {
-      return html.MediaStream._create_3(stream_OR_tracks);
+      return html$.MediaStream._create_3(stream_OR_tracks);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -79849,22 +79852,22 @@
     return this.stop.apply(this, args);
   }
   get [dartx.onAddTrack]() {
-    return html.MediaStream.addTrackEvent.forTarget(this);
+    return html$.MediaStream.addTrackEvent.forTarget(this);
   }
   get [dartx.onEnded]() {
-    return html.MediaStream.endedEvent.forTarget(this);
+    return html$.MediaStream.endedEvent.forTarget(this);
   }
   get [dartx.onRemoveTrack]() {
-    return html.MediaStream.removeTrackEvent.forTarget(this);
+    return html$.MediaStream.removeTrackEvent.forTarget(this);
   }
   static get supported() {
-    return !!(html.window[dartx.navigator].getUserMedia || html.window[dartx.navigator].webkitGetUserMedia || html.window[dartx.navigator].mozGetUserMedia || html.window[dartx.navigator].msGetUserMedia);
+    return !!(html$.window[dartx.navigator].getUserMedia || html$.window[dartx.navigator].webkitGetUserMedia || html$.window[dartx.navigator].mozGetUserMedia || html$.window[dartx.navigator].msGetUserMedia);
   }
 };
-dart.setSignature(html.MediaStream, {
+dart.setSignature(html$.MediaStream, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaStream, []),
-    new: dart.definiteFunctionType(html.MediaStream, [], [dart.dynamic])
+    _: dart.definiteFunctionType(html$.MediaStream, []),
+    new: dart.definiteFunctionType(html$.MediaStream, [], [dart.dynamic])
   }),
   fields: () => ({
     [dartx.active]: core.bool,
@@ -79873,18 +79876,18 @@
     [dartx.label]: core.String
   }),
   getters: () => ({
-    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRemoveTrack]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
-    [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html.MediaStreamTrack]),
-    [dartx.clone]: dart.definiteFunctionType(html.MediaStream, []),
-    [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html.MediaStreamTrack), []),
-    [dartx.getTrackById]: dart.definiteFunctionType(html.MediaStreamTrack, [core.String]),
-    [dartx.getTracks]: dart.definiteFunctionType(core.List$(html.MediaStreamTrack), []),
-    [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html.MediaStreamTrack), []),
-    [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html.MediaStreamTrack]),
+    [dartx.addTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
+    [dartx.clone]: dart.definiteFunctionType(html$.MediaStream, []),
+    [dartx.getAudioTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.MediaStreamTrack, [core.String]),
+    [dartx.getTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.getVideoTracks]: dart.definiteFunctionType(core.List$(html$.MediaStreamTrack), []),
+    [dartx.removeTrack]: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrack]),
     [dartx.stop]: dart.definiteFunctionType(dart.void, [])
   }),
   sfields: () => ({
@@ -79894,13 +79897,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaStream, []),
-    _create_2: dart.definiteFunctionType(html.MediaStream, [dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.MediaStream, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaStream, []),
+    _create_2: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.MediaStream, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.defineLazy(html.MediaStream, {
+dart.defineLazy(html$.MediaStream, {
   get addTrackEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('addtrack'));
   },
@@ -79911,11 +79914,11 @@
     return dart.const(new (EventStreamProviderOfEvent())('removetrack'));
   }
 });
-dart.registerExtension(dart.global.MediaStream, html.MediaStream);
+dart.registerExtension(dart.global.MediaStream, html$.MediaStream);
 dart.defineExtensionNames([
   'stream'
 ]);
-html.MediaStreamEvent = class MediaStreamEvent extends html.Event {
+html$.MediaStreamEvent = class MediaStreamEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79923,9 +79926,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MediaStreamEvent._create_1(type, eventInitDict_1);
+      return html$.MediaStreamEvent._create_1(type, eventInitDict_1);
     }
-    return html.MediaStreamEvent._create_2(type);
+    return html$.MediaStreamEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MediaStreamEvent(type, eventInitDict);
@@ -79940,20 +79943,20 @@
     return this.stream;
   }
 };
-dart.setSignature(html.MediaStreamEvent, {
+dart.setSignature(html$.MediaStreamEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MediaStreamEvent, []),
-    new: dart.definiteFunctionType(html.MediaStreamEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MediaStreamEvent, []),
+    new: dart.definiteFunctionType(html$.MediaStreamEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.stream]: html.MediaStream}),
+  fields: () => ({[dartx.stream]: html$.MediaStream}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MediaStreamEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MediaStreamEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MediaStreamEvent, html.MediaStreamEvent);
+dart.registerExtension(dart.global.MediaStreamEvent, html$.MediaStreamEvent);
 dart.defineExtensionNames([
   'clone',
   'stop',
@@ -79967,7 +79970,7 @@
   'muted',
   'readyState'
 ]);
-html.MediaStreamTrack = class MediaStreamTrack extends html.EventTarget {
+html$.MediaStreamTrack = class MediaStreamTrack extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -79997,7 +80000,7 @@
   }
   static getSources() {
     let completer = CompleterOfListOfSourceInfo().new();
-    html.MediaStreamTrack._getSources(dart.fn(value => {
+    html$.MediaStreamTrack._getSources(dart.fn(value => {
       completer.complete(value);
     }, ListOfSourceInfoToNull()));
     return completer.future;
@@ -80006,17 +80009,17 @@
     return this.stop.apply(this, args);
   }
   get [dartx.onEnded]() {
-    return html.MediaStreamTrack.endedEvent.forTarget(this);
+    return html$.MediaStreamTrack.endedEvent.forTarget(this);
   }
   get [dartx.onMute]() {
-    return html.MediaStreamTrack.muteEvent.forTarget(this);
+    return html$.MediaStreamTrack.muteEvent.forTarget(this);
   }
   get [dartx.onUnmute]() {
-    return html.MediaStreamTrack.unmuteEvent.forTarget(this);
+    return html$.MediaStreamTrack.unmuteEvent.forTarget(this);
   }
 };
-dart.setSignature(html.MediaStreamTrack, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaStreamTrack, [])}),
+dart.setSignature(html$.MediaStreamTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrack, [])}),
   fields: () => ({
     [dartx.enabled]: core.bool,
     [dartx.id]: core.String,
@@ -80026,12 +80029,12 @@
     [dartx.readyState]: core.String
   }),
   getters: () => ({
-    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMute]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onUnmute]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
-    [dartx.clone]: dart.definiteFunctionType(html.MediaStreamTrack, []),
+    [dartx.clone]: dart.definiteFunctionType(html$.MediaStreamTrack, []),
     [dartx.stop]: dart.definiteFunctionType(dart.void, [])
   }),
   sfields: () => ({
@@ -80040,12 +80043,12 @@
     unmuteEvent: EventStreamProviderOfEvent()
   }),
   statics: () => ({
-    _getSources: dart.definiteFunctionType(dart.void, [html.MediaStreamTrackSourcesCallback]),
-    getSources: dart.definiteFunctionType(async.Future$(core.List$(html.SourceInfo)), [])
+    _getSources: dart.definiteFunctionType(dart.void, [html$.MediaStreamTrackSourcesCallback]),
+    getSources: dart.definiteFunctionType(async.Future$(core.List$(html$.SourceInfo)), [])
   }),
   names: ['_getSources', 'getSources']
 });
-dart.defineLazy(html.MediaStreamTrack, {
+dart.defineLazy(html$.MediaStreamTrack, {
   get endedEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('ended'));
   },
@@ -80056,11 +80059,11 @@
     return dart.const(new (EventStreamProviderOfEvent())('unmute'));
   }
 });
-dart.registerExtension(dart.global.MediaStreamTrack, html.MediaStreamTrack);
+dart.registerExtension(dart.global.MediaStreamTrack, html$.MediaStreamTrack);
 dart.defineExtensionNames([
   'track'
 ]);
-html.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html.Event {
+html$.MediaStreamTrackEvent = class MediaStreamTrackEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80071,19 +80074,19 @@
     return this.track;
   }
 };
-dart.setSignature(html.MediaStreamTrackEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MediaStreamTrackEvent, [])}),
-  fields: () => ({[dartx.track]: html.MediaStreamTrack}),
+dart.setSignature(html$.MediaStreamTrackEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MediaStreamTrackEvent, [])}),
+  fields: () => ({[dartx.track]: html$.MediaStreamTrack}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.MediaStreamTrackEvent, html.MediaStreamTrackEvent);
-html.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
+dart.registerExtension(dart.global.MediaStreamTrackEvent, html$.MediaStreamTrackEvent);
+html$.MediaStreamTrackSourcesCallback = dart.typedef('MediaStreamTrackSourcesCallback', () => dart.functionType(dart.void, [ListOfSourceInfo()]));
 dart.defineExtensionNames([
   'jsHeapSizeLimit',
   'totalJSHeapSize',
   'usedJSHeapSize'
 ]);
-html.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
+html$.MemoryInfo = class MemoryInfo extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80097,25 +80100,25 @@
     return this.usedJSHeapSize;
   }
 };
-dart.setSignature(html.MemoryInfo, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MemoryInfo, [])}),
+dart.setSignature(html$.MemoryInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MemoryInfo, [])}),
   fields: () => ({
     [dartx.jsHeapSizeLimit]: core.int,
     [dartx.totalJSHeapSize]: core.int,
     [dartx.usedJSHeapSize]: core.int
   })
 });
-dart.registerExtension(dart.global.MemoryInfo, html.MemoryInfo);
+dart.registerExtension(dart.global.MemoryInfo, html$.MemoryInfo);
 dart.defineExtensionNames([
   'label',
   'type'
 ]);
-html.MenuElement = class MenuElement extends html.HtmlElement {
+html$.MenuElement = class MenuElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MenuElement._check(html.document[dartx.createElement]("menu"));
+    return html$.MenuElement._check(html$.document[dartx.createElement]("menu"));
   }
   created() {
     this[dartx.label] = null;
@@ -80135,19 +80138,19 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.MenuElement, 'created');
-dart.setSignature(html.MenuElement, {
+dart.defineNamedConstructor(html$.MenuElement, 'created');
+dart.setSignature(html$.MenuElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MenuElement, []),
-    new: dart.definiteFunctionType(html.MenuElement, []),
-    created: dart.definiteFunctionType(html.MenuElement, [])
+    _: dart.definiteFunctionType(html$.MenuElement, []),
+    new: dart.definiteFunctionType(html$.MenuElement, []),
+    created: dart.definiteFunctionType(html$.MenuElement, [])
   }),
   fields: () => ({
     [dartx.label]: core.String,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLMenuElement, html.MenuElement);
+dart.registerExtension(dart.global.HTMLMenuElement, html$.MenuElement);
 dart.defineExtensionNames([
   'checked',
   'defaultValue',
@@ -80157,7 +80160,7 @@
   'radiogroup',
   'type'
 ]);
-html.MenuItemElement = class MenuItemElement extends html.HtmlElement {
+html$.MenuItemElement = class MenuItemElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80214,11 +80217,11 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.MenuItemElement, 'created');
-dart.setSignature(html.MenuItemElement, {
+dart.defineNamedConstructor(html$.MenuItemElement, 'created');
+dart.setSignature(html$.MenuItemElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MenuItemElement, []),
-    created: dart.definiteFunctionType(html.MenuItemElement, [])
+    _: dart.definiteFunctionType(html$.MenuItemElement, []),
+    created: dart.definiteFunctionType(html$.MenuItemElement, [])
   }),
   fields: () => ({
     [dartx.checked]: core.bool,
@@ -80230,12 +80233,12 @@
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLMenuItemElement, html.MenuItemElement);
+dart.registerExtension(dart.global.HTMLMenuItemElement, html$.MenuItemElement);
 dart.defineExtensionNames([
   'port1',
   'port2'
 ]);
-html.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
+html$.MessageChannel = class MessageChannel extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80246,14 +80249,14 @@
     return this.port2;
   }
 };
-dart.setSignature(html.MessageChannel, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MessageChannel, [])}),
+dart.setSignature(html$.MessageChannel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MessageChannel, [])}),
   fields: () => ({
-    [dartx.port1]: html.MessagePort,
-    [dartx.port2]: html.MessagePort
+    [dartx.port1]: html$.MessagePort,
+    [dartx.port2]: html$.MessagePort
   })
 });
-dart.registerExtension(dart.global.MessageChannel, html.MessageChannel);
+dart.registerExtension(dart.global.MessageChannel, html$.MessageChannel);
 const _initMessageEvent = Symbol('_initMessageEvent');
 const _get_data = Symbol('_get_data');
 const _get_source = Symbol('_get_source');
@@ -80263,7 +80266,7 @@
   'lastEventId',
   'origin'
 ]);
-html.MessageEvent = class MessageEvent extends html.Event {
+html$.MessageEvent = class MessageEvent extends html$.Event {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
@@ -80273,12 +80276,12 @@
     let source = opts && 'source' in opts ? opts.source : null;
     let messagePorts = opts && 'messagePorts' in opts ? opts.messagePorts : null;
     if (source == null) {
-      source = html.window;
+      source = html$.window;
     }
     if (!dart.test(html_common.Device.isIE)) {
       return new self.MessageEvent(type, {bubbles: canBubble, cancelable: cancelable, data: data, origin: origin, lastEventId: lastEventId, source: source, ports: messagePorts});
     }
-    let event = html.MessageEvent._check(html.document[_createEvent]("MessageEvent"));
+    let event = html$.MessageEvent._check(html$.document[_createEvent]("MessageEvent"));
     event[_initMessageEvent](type, canBubble, cancelable, data, origin, lastEventId, source, messagePorts);
     return event;
   }
@@ -80292,9 +80295,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MessageEvent._create_1(type, eventInitDict_1);
+      return html$.MessageEvent._create_1(type, eventInitDict_1);
     }
-    return html.MessageEvent._create_2(type);
+    return html$.MessageEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MessageEvent(type, eventInitDict);
@@ -80309,7 +80312,7 @@
     return this.origin;
   }
   get [dartx.source]() {
-    return html._convertNativeToDart_EventTarget(this[_get_source]);
+    return html$._convertNativeToDart_EventTarget(this[_get_source]);
   }
   get [_get_source]() {
     return this.source;
@@ -80318,10 +80321,10 @@
     return this.initMessageEvent.apply(this, args);
   }
 };
-dart.setSignature(html.MessageEvent, {
+dart.setSignature(html$.MessageEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html.Window, messagePorts: ListOfMessagePort()}),
-    _: dart.definiteFunctionType(html.MessageEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.MessageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, data: core.Object, origin: core.String, lastEventId: core.String, source: html$.Window, messagePorts: ListOfMessagePort()}),
+    _: dart.definiteFunctionType(html$.MessageEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [_get_data]: dart.dynamic,
@@ -80331,23 +80334,23 @@
   }),
   getters: () => ({
     [dartx.data]: dart.definiteFunctionType(dart.dynamic, []),
-    [dartx.source]: dart.definiteFunctionType(html.EventTarget, [])
+    [dartx.source]: dart.definiteFunctionType(html$.EventTarget, [])
   }),
-  methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html.Window, ListOfMessagePort()])}),
+  methods: () => ({[_initMessageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.Object, core.String, core.String, html$.Window, ListOfMessagePort()])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MessageEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MessageEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MessageEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MessageEvent, html.MessageEvent);
+dart.registerExtension(dart.global.MessageEvent, html$.MessageEvent);
 dart.defineExtensionNames([
   'close',
   'postMessage',
   'start',
   'onMessage'
 ]);
-html.MessagePort = class MessagePort extends html.EventTarget {
+html$.MessagePort = class MessagePort extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80375,12 +80378,12 @@
     return this.start.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.MessagePort.messageEvent.forTarget(this);
+    return html$.MessagePort.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.MessagePort, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MessagePort, [])}),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+dart.setSignature(html$.MessagePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MessagePort, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
@@ -80390,23 +80393,23 @@
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.MessagePort, {
+dart.defineLazy(html$.MessagePort, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.MessagePort, html.MessagePort);
+dart.registerExtension(dart.global.MessagePort, html$.MessagePort);
 dart.defineExtensionNames([
   'content',
   'httpEquiv',
   'name'
 ]);
-html.MetaElement = class MetaElement extends html.HtmlElement {
+html$.MetaElement = class MetaElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MetaElement._check(html.document[dartx.createElement]("meta"));
+    return html$.MetaElement._check(html$.document[dartx.createElement]("meta"));
   }
   created() {
     this[dartx.content] = null;
@@ -80433,12 +80436,12 @@
     this.name = value;
   }
 };
-dart.defineNamedConstructor(html.MetaElement, 'created');
-dart.setSignature(html.MetaElement, {
+dart.defineNamedConstructor(html$.MetaElement, 'created');
+dart.setSignature(html$.MetaElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MetaElement, []),
-    new: dart.definiteFunctionType(html.MetaElement, []),
-    created: dart.definiteFunctionType(html.MetaElement, [])
+    _: dart.definiteFunctionType(html$.MetaElement, []),
+    new: dart.definiteFunctionType(html$.MetaElement, []),
+    created: dart.definiteFunctionType(html$.MetaElement, [])
   }),
   fields: () => ({
     [dartx.content]: core.String,
@@ -80446,13 +80449,13 @@
     [dartx.name]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLMetaElement, html.MetaElement);
+dart.registerExtension(dart.global.HTMLMetaElement, html$.MetaElement);
 const _get_modificationTime = Symbol('_get_modificationTime');
 dart.defineExtensionNames([
   'modificationTime',
   'size'
 ]);
-html.Metadata = class Metadata extends _interceptors.Interceptor {
+html$.Metadata = class Metadata extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80466,16 +80469,16 @@
     return this.size;
   }
 };
-dart.setSignature(html.Metadata, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Metadata, [])}),
+dart.setSignature(html$.Metadata, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Metadata, [])}),
   fields: () => ({
     [_get_modificationTime]: dart.dynamic,
     [dartx.size]: core.int
   }),
   getters: () => ({[dartx.modificationTime]: dart.definiteFunctionType(core.DateTime, [])})
 });
-dart.registerExtension(dart.global.Metadata, html.Metadata);
-html.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html.Metadata]));
+dart.registerExtension(dart.global.Metadata, html$.Metadata);
+html$.MetadataCallback = dart.typedef('MetadataCallback', () => dart.functionType(dart.void, [html$.Metadata]));
 dart.defineExtensionNames([
   'high',
   'labels',
@@ -80485,12 +80488,12 @@
   'optimum',
   'value'
 ]);
-html.MeterElement = class MeterElement extends html.HtmlElement {
+html$.MeterElement = class MeterElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.MeterElement._check(html.document[dartx.createElement]("meter"));
+    return html$.MeterElement._check(html$.document[dartx.createElement]("meter"));
   }
   created() {
     this[dartx.high] = null;
@@ -80503,7 +80506,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('meter');
+    return html$.Element.isTagSupported('meter');
   }
   get [dartx.high]() {
     return this.high;
@@ -80545,12 +80548,12 @@
     this.value = value;
   }
 };
-dart.defineNamedConstructor(html.MeterElement, 'created');
-dart.setSignature(html.MeterElement, {
+dart.defineNamedConstructor(html$.MeterElement, 'created');
+dart.setSignature(html$.MeterElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MeterElement, []),
-    new: dart.definiteFunctionType(html.MeterElement, []),
-    created: dart.definiteFunctionType(html.MeterElement, [])
+    _: dart.definiteFunctionType(html$.MeterElement, []),
+    new: dart.definiteFunctionType(html$.MeterElement, []),
+    created: dart.definiteFunctionType(html$.MeterElement, [])
   }),
   fields: () => ({
     [dartx.high]: core.num,
@@ -80563,13 +80566,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLMeterElement, html.MeterElement);
+dart.registerExtension(dart.global.HTMLMeterElement, html$.MeterElement);
 dart.defineExtensionNames([
   'inputs',
   'outputs',
   'sysexEnabled'
 ]);
-html.MidiAccess = class MidiAccess extends html.EventTarget {
+html$.MidiAccess = class MidiAccess extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80583,19 +80586,19 @@
     return this.sysexEnabled;
   }
 };
-dart.setSignature(html.MidiAccess, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiAccess, [])}),
+dart.setSignature(html$.MidiAccess, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiAccess, [])}),
   fields: () => ({
-    [dartx.inputs]: html.MidiInputMap,
-    [dartx.outputs]: html.MidiOutputMap,
+    [dartx.inputs]: html$.MidiInputMap,
+    [dartx.outputs]: html$.MidiOutputMap,
     [dartx.sysexEnabled]: core.bool
   })
 });
-dart.registerExtension(dart.global.MIDIAccess, html.MidiAccess);
+dart.registerExtension(dart.global.MIDIAccess, html$.MidiAccess);
 dart.defineExtensionNames([
   'port'
 ]);
-html.MidiConnectionEvent = class MidiConnectionEvent extends html.Event {
+html$.MidiConnectionEvent = class MidiConnectionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80603,9 +80606,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MidiConnectionEvent._create_1(type, eventInitDict_1);
+      return html$.MidiConnectionEvent._create_1(type, eventInitDict_1);
     }
-    return html.MidiConnectionEvent._create_2(type);
+    return html$.MidiConnectionEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new MIDIConnectionEvent(type, eventInitDict);
@@ -80617,19 +80620,19 @@
     return this.port;
   }
 };
-dart.setSignature(html.MidiConnectionEvent, {
+dart.setSignature(html$.MidiConnectionEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MidiConnectionEvent, []),
-    new: dart.definiteFunctionType(html.MidiConnectionEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MidiConnectionEvent, []),
+    new: dart.definiteFunctionType(html$.MidiConnectionEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.port]: html.MidiPort}),
+  fields: () => ({[dartx.port]: html$.MidiPort}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MidiConnectionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MidiConnectionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MIDIConnectionEvent, html.MidiConnectionEvent);
+dart.registerExtension(dart.global.MIDIConnectionEvent, html$.MidiConnectionEvent);
 dart.defineExtensionNames([
   'close',
   'open',
@@ -80641,7 +80644,7 @@
   'type',
   'version'
 ]);
-html.MidiPort = class MidiPort extends html.EventTarget {
+html$.MidiPort = class MidiPort extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80673,8 +80676,8 @@
     return this.open.apply(this, args);
   }
 };
-dart.setSignature(html.MidiPort, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiPort, [])}),
+dart.setSignature(html$.MidiPort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiPort, [])}),
   fields: () => ({
     [dartx.connection]: core.String,
     [dartx.id]: core.String,
@@ -80689,33 +80692,33 @@
     [dartx.open]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.MIDIPort, html.MidiPort);
+dart.registerExtension(dart.global.MIDIPort, html$.MidiPort);
 dart.defineExtensionNames([
   'onMidiMessage'
 ]);
-html.MidiInput = class MidiInput extends html.MidiPort {
+html$.MidiInput = class MidiInput extends html$.MidiPort {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get [dartx.onMidiMessage]() {
-    return html.MidiInput.midiMessageEvent.forTarget(this);
+    return html$.MidiInput.midiMessageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.MidiInput, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiInput, [])}),
-  getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html.MidiMessageEvent), [])}),
+dart.setSignature(html$.MidiInput, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInput, [])}),
+  getters: () => ({[dartx.onMidiMessage]: dart.definiteFunctionType(async.Stream$(html$.MidiMessageEvent), [])}),
   sfields: () => ({midiMessageEvent: EventStreamProviderOfMidiMessageEvent()})
 });
-dart.defineLazy(html.MidiInput, {
+dart.defineLazy(html$.MidiInput, {
   get midiMessageEvent() {
     return dart.const(new (EventStreamProviderOfMidiMessageEvent())('midimessage'));
   }
 });
-dart.registerExtension(dart.global.MIDIInput, html.MidiInput);
+dart.registerExtension(dart.global.MIDIInput, html$.MidiInput);
 dart.defineExtensionNames([
   'size'
 ]);
-html.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
+html$.MidiInputMap = class MidiInputMap extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80723,16 +80726,16 @@
     return this.size;
   }
 };
-dart.setSignature(html.MidiInputMap, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiInputMap, [])}),
+dart.setSignature(html$.MidiInputMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiInputMap, [])}),
   fields: () => ({[dartx.size]: core.int})
 });
-dart.registerExtension(dart.global.MIDIInputMap, html.MidiInputMap);
+dart.registerExtension(dart.global.MIDIInputMap, html$.MidiInputMap);
 dart.defineExtensionNames([
   'data',
   'receivedTime'
 ]);
-html.MidiMessageEvent = class MidiMessageEvent extends html.Event {
+html$.MidiMessageEvent = class MidiMessageEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80740,9 +80743,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MidiMessageEvent._create_1(type, eventInitDict_1);
+      return html$.MidiMessageEvent._create_1(type, eventInitDict_1);
     }
-    return html.MidiMessageEvent._create_2(type);
+    return html$.MidiMessageEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new MIDIMessageEvent(type, eventInitDict);
@@ -80757,26 +80760,26 @@
     return this.receivedTime;
   }
 };
-dart.setSignature(html.MidiMessageEvent, {
+dart.setSignature(html$.MidiMessageEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.MidiMessageEvent, []),
-    new: dart.definiteFunctionType(html.MidiMessageEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.MidiMessageEvent, []),
+    new: dart.definiteFunctionType(html$.MidiMessageEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.data]: typed_data.Uint8List,
     [dartx.receivedTime]: core.double
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MidiMessageEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MidiMessageEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MIDIMessageEvent, html.MidiMessageEvent);
+dart.registerExtension(dart.global.MIDIMessageEvent, html$.MidiMessageEvent);
 dart.defineExtensionNames([
   'send'
 ]);
-html.MidiOutput = class MidiOutput extends html.MidiPort {
+html$.MidiOutput = class MidiOutput extends html$.MidiPort {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80784,15 +80787,15 @@
     return this.send.apply(this, args);
   }
 };
-dart.setSignature(html.MidiOutput, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiOutput, [])}),
+dart.setSignature(html$.MidiOutput, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutput, [])}),
   methods: () => ({[dartx.send]: dart.definiteFunctionType(dart.void, [typed_data.Uint8List], [core.num])})
 });
-dart.registerExtension(dart.global.MIDIOutput, html.MidiOutput);
+dart.registerExtension(dart.global.MIDIOutput, html$.MidiOutput);
 dart.defineExtensionNames([
   'size'
 ]);
-html.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
+html$.MidiOutputMap = class MidiOutputMap extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80800,18 +80803,18 @@
     return this.size;
   }
 };
-dart.setSignature(html.MidiOutputMap, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MidiOutputMap, [])}),
+dart.setSignature(html$.MidiOutputMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MidiOutputMap, [])}),
   fields: () => ({[dartx.size]: core.int})
 });
-dart.registerExtension(dart.global.MIDIOutputMap, html.MidiOutputMap);
+dart.registerExtension(dart.global.MIDIOutputMap, html$.MidiOutputMap);
 dart.defineExtensionNames([
   'description',
   'enabledPlugin',
   'suffixes',
   'type'
 ]);
-html.MimeType = class MimeType extends _interceptors.Interceptor {
+html$.MimeType = class MimeType extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80828,16 +80831,16 @@
     return this.type;
   }
 };
-dart.setSignature(html.MimeType, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MimeType, [])}),
+dart.setSignature(html$.MimeType, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MimeType, [])}),
   fields: () => ({
     [dartx.description]: core.String,
-    [dartx.enabledPlugin]: html.Plugin,
+    [dartx.enabledPlugin]: html$.Plugin,
     [dartx.suffixes]: core.String,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.MimeType, html.MimeType);
+dart.registerExtension(dart.global.MimeType, html$.MimeType);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -80850,7 +80853,7 @@
   'item',
   'namedItem'
 ]);
-html.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.MimeType), html.ImmutableListMixin$(html.MimeType)) {
+html$.MimeTypeArray = class MimeTypeArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.MimeType), html$.ImmutableListMixin$(html$.MimeType)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80899,24 +80902,24 @@
     return this.namedItem.apply(this, args);
   }
 };
-html.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
-dart.setSignature(html.MimeTypeArray, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MimeTypeArray, [])}),
+html$.MimeTypeArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfMimeType()];
+dart.setSignature(html$.MimeTypeArray, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MimeTypeArray, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.MimeType, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.MimeType]),
-    [dartx.item]: dart.definiteFunctionType(html.MimeType, [core.int]),
-    [dartx.namedItem]: dart.definiteFunctionType(html.MimeType, [core.String])
+    [dartx._get]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.MimeType]),
+    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
   })
 });
-dart.registerExtension(dart.global.MimeTypeArray, html.MimeTypeArray);
+dart.registerExtension(dart.global.MimeTypeArray, html$.MimeTypeArray);
 dart.defineExtensionNames([
   'cite',
   'dateTime'
 ]);
-html.ModElement = class ModElement extends html.HtmlElement {
+html$.ModElement = class ModElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -80938,18 +80941,18 @@
     this.dateTime = value;
   }
 };
-dart.defineNamedConstructor(html.ModElement, 'created');
-dart.setSignature(html.ModElement, {
+dart.defineNamedConstructor(html$.ModElement, 'created');
+dart.setSignature(html$.ModElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ModElement, []),
-    created: dart.definiteFunctionType(html.ModElement, [])
+    _: dart.definiteFunctionType(html$.ModElement, []),
+    created: dart.definiteFunctionType(html$.ModElement, [])
   }),
   fields: () => ({
     [dartx.cite]: core.String,
     [dartx.dateTime]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLModElement, html.ModElement);
+dart.registerExtension(dart.global.HTMLModElement, html$.ModElement);
 const _initMouseEvent = Symbol('_initMouseEvent');
 const _clientX = Symbol('_clientX');
 const _clientY = Symbol('_clientY');
@@ -80983,7 +80986,7 @@
   'shiftKey',
   'toElement'
 ]);
-html.MouseEvent = class MouseEvent extends html.UIEvent {
+html$.MouseEvent = class MouseEvent extends html$.UIEvent {
   static new(type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
     let detail = opts && 'detail' in opts ? opts.detail : 0;
@@ -81000,9 +81003,9 @@
     let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
     let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let event = html.MouseEvent._check(html.document[_createEvent]('MouseEvent'));
+    let event = html$.MouseEvent._check(html$.document[_createEvent]('MouseEvent'));
     event[_initMouseEvent](type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
     return event;
   }
@@ -81010,9 +81013,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.MouseEvent._create_1(type, eventInitDict_1);
+      return html$.MouseEvent._create_1(type, eventInitDict_1);
     }
-    return html.MouseEvent._create_2(type);
+    return html$.MouseEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.MouseEvent(type, eventInitDict);
@@ -81069,7 +81072,7 @@
     return this.region;
   }
   get [dartx.relatedTarget]() {
-    return html._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
   }
   get [_get_relatedTarget]() {
     return this.relatedTarget;
@@ -81093,7 +81096,7 @@
     return this.webkitMovementY;
   }
   [_initMouseEvent](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
-    let relatedTarget_1 = html._convertDartToNative_EventTarget(relatedTarget);
+    let relatedTarget_1 = html$._convertDartToNative_EventTarget(relatedTarget);
     this[_initMouseEvent_1](type, bubbles, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget_1);
     return;
   }
@@ -81112,10 +81115,10 @@
       let y = this.offsetY;
       return new (PointOfnum())(x, y);
     } else {
-      if (!html.Element.is(this[dartx.target])) {
+      if (!html$.Element.is(this[dartx.target])) {
         dart.throw(new core.UnsupportedError('offsetX is only supported on elements'));
       }
-      let target = html.Element._check(this[dartx.target]);
+      let target = html$.Element._check(this[dartx.target]);
       let point = this[dartx.client]['-'](target[dartx.getBoundingClientRect]()[dartx.topLeft]);
       return new (PointOfnum())(point.x[dartx.toInt](), point.y[dartx.toInt]());
     }
@@ -81130,10 +81133,10 @@
     return new (PointOfnum())(this[_pageX], this[_pageY]);
   }
 };
-dart.setSignature(html.MouseEvent, {
+dart.setSignature(html$.MouseEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.MouseEvent, [core.String], {view: html.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html.EventTarget}),
-    _: dart.definiteFunctionType(html.MouseEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.MouseEvent, [core.String], {view: html$.Window, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
+    _: dart.definiteFunctionType(html$.MouseEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.altKey]: core.bool,
@@ -81142,8 +81145,8 @@
     [_clientX]: core.int,
     [_clientY]: core.int,
     [dartx.ctrlKey]: core.bool,
-    [dartx.dataTransfer]: html.DataTransfer,
-    [dartx.fromElement]: html.Node,
+    [dartx.dataTransfer]: html$.DataTransfer,
+    [dartx.fromElement]: html$.Node,
     [_layerX]: core.int,
     [_layerY]: core.int,
     [dartx.metaKey]: core.bool,
@@ -81156,12 +81159,12 @@
     [_screenX]: core.int,
     [_screenY]: core.int,
     [dartx.shiftKey]: core.bool,
-    [dartx.toElement]: html.Node,
+    [dartx.toElement]: html$.Node,
     [_webkitMovementX]: core.int,
     [_webkitMovementY]: core.int
   }),
   getters: () => ({
-    [dartx.relatedTarget]: dart.definiteFunctionType(html.EventTarget, []),
+    [dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, []),
     [dartx.client]: dart.definiteFunctionType(math.Point$(core.num), []),
     [dartx.movement]: dart.definiteFunctionType(math.Point$(core.num), []),
     [dartx.offset]: dart.definiteFunctionType(math.Point$(core.num), []),
@@ -81170,18 +81173,18 @@
     [dartx.page]: dart.definiteFunctionType(math.Point$(core.num), [])
   }),
   methods: () => ({
-    [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html.EventTarget]),
-    [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+    [_initMouseEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget]),
+    [_initMouseEvent_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, html$.Window, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.MouseEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.MouseEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.MouseEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.MouseEvent, html.MouseEvent);
-dart.registerExtension(dart.global.DragEvent, html.MouseEvent);
-html.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html.MutationObserver]));
+dart.registerExtension(dart.global.MouseEvent, html$.MouseEvent);
+dart.registerExtension(dart.global.DragEvent, html$.MouseEvent);
+html$.MutationCallback = dart.typedef('MutationCallback', () => dart.functionType(dart.void, [ListOfMutationRecord(), html$.MutationObserver]));
 const _observe_1 = Symbol('_observe_1');
 const _observe = Symbol('_observe');
 const _call = Symbol('_call');
@@ -81190,7 +81193,7 @@
   'takeRecords',
   'observe'
 ]);
-html.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
+html$.MutationObserver = class MutationObserver extends _interceptors.Interceptor {
   [dartx.disconnect](...args) {
     return this.disconnect.apply(this, args);
   }
@@ -81216,9 +81219,9 @@
     let attributeOldValue = opts && 'attributeOldValue' in opts ? opts.attributeOldValue : null;
     let characterDataOldValue = opts && 'characterDataOldValue' in opts ? opts.characterDataOldValue : null;
     let attributeFilter = opts && 'attributeFilter' in opts ? opts.attributeFilter : null;
-    let parsedOptions = html.MutationObserver._createDict();
+    let parsedOptions = html$.MutationObserver._createDict();
     function override(key, value) {
-      if (value != null) html.MutationObserver._add(parsedOptions, core.String._check(key), value);
+      if (value != null) html$.MutationObserver._add(parsedOptions, core.String._check(key), value);
     }
     dart.fn(override, dynamicAnddynamicToNull());
     override('childList', childList);
@@ -81228,7 +81231,7 @@
     override('attributeOldValue', attributeOldValue);
     override('characterDataOldValue', characterDataOldValue);
     if (attributeFilter != null) {
-      override('attributeFilter', html.MutationObserver._fixupList(attributeFilter));
+      override('attributeFilter', html$.MutationObserver._fixupList(attributeFilter));
     }
     this[_call](target, parsedOptions);
   }
@@ -81246,17 +81249,17 @@
   }
   static new(callback) {
     0;
-    return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html._wrapBinaryZone(ListOfMutationRecord(), html.MutationObserver, dart.void)(callback), 2));
+    return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(_js_helper.convertDartClosureToJS(_wrapZoneBinaryCallbackOfListOfMutationRecord$MutationObserver$void())(html$._wrapBinaryZone(ListOfMutationRecord(), html$.MutationObserver, dart.void)(callback), 2));
   }
 };
-dart.setSignature(html.MutationObserver, {
-  constructors: () => ({new: dart.definiteFunctionType(html.MutationObserver, [html.MutationCallback])}),
+dart.setSignature(html$.MutationObserver, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.MutationObserver, [html$.MutationCallback])}),
   methods: () => ({
     [dartx.disconnect]: dart.definiteFunctionType(dart.void, []),
-    [_observe]: dart.definiteFunctionType(dart.void, [html.Node, core.Map]),
-    [_observe_1]: dart.definiteFunctionType(dart.void, [html.Node, dart.dynamic]),
-    [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html.MutationRecord), []),
-    [dartx.observe]: dart.definiteFunctionType(dart.void, [html.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
+    [_observe]: dart.definiteFunctionType(dart.void, [html$.Node, core.Map]),
+    [_observe_1]: dart.definiteFunctionType(dart.void, [html$.Node, dart.dynamic]),
+    [dartx.takeRecords]: dart.definiteFunctionType(core.List$(html$.MutationRecord), []),
+    [dartx.observe]: dart.definiteFunctionType(dart.void, [html$.Node], {childList: core.bool, attributes: core.bool, characterData: core.bool, subtree: core.bool, attributeOldValue: core.bool, characterDataOldValue: core.bool, attributeFilter: ListOfString()}),
     [_call]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic])
   }),
   sfields: () => ({_boolKeys: MapOfString$bool()}),
@@ -81268,9 +81271,9 @@
   }),
   names: ['_createDict', '_add', '_fixupList']
 });
-html.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
-dart.registerExtension(dart.global.MutationObserver, html.MutationObserver);
-dart.registerExtension(dart.global.WebKitMutationObserver, html.MutationObserver);
+html$.MutationObserver._boolKeys = dart.const(dart.map({childList: true, attributes: true, characterData: true, subtree: true, attributeOldValue: true, characterDataOldValue: true}, core.String, core.bool));
+dart.registerExtension(dart.global.MutationObserver, html$.MutationObserver);
+dart.registerExtension(dart.global.WebKitMutationObserver, html$.MutationObserver);
 dart.defineExtensionNames([
   'addedNodes',
   'attributeName',
@@ -81282,7 +81285,7 @@
   'target',
   'type'
 ]);
-html.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
+html$.MutationRecord = class MutationRecord extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81314,21 +81317,21 @@
     return this.type;
   }
 };
-dart.setSignature(html.MutationRecord, {
-  constructors: () => ({_: dart.definiteFunctionType(html.MutationRecord, [])}),
+dart.setSignature(html$.MutationRecord, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.MutationRecord, [])}),
   fields: () => ({
     [dartx.addedNodes]: ListOfNode(),
     [dartx.attributeName]: core.String,
     [dartx.attributeNamespace]: core.String,
-    [dartx.nextSibling]: html.Node,
+    [dartx.nextSibling]: html$.Node,
     [dartx.oldValue]: core.String,
-    [dartx.previousSibling]: html.Node,
+    [dartx.previousSibling]: html$.Node,
     [dartx.removedNodes]: ListOfNode(),
-    [dartx.target]: html.Node,
+    [dartx.target]: html$.Node,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.MutationRecord, html.MutationRecord);
+dart.registerExtension(dart.global.MutationRecord, html$.MutationRecord);
 const _ensureGetUserMedia = Symbol('_ensureGetUserMedia');
 const _getUserMedia = Symbol('_getUserMedia');
 const _requestMidiAccess_1 = Symbol('_requestMidiAccess_1');
@@ -81374,7 +81377,7 @@
   'onLine',
   'cookieEnabled'
 ]);
-html.Navigator = class Navigator extends _interceptors.Interceptor {
+html$.Navigator = class Navigator extends _interceptors.Interceptor {
   get [dartx.language]() {
     return this.language || this.userLanguage;
   }
@@ -81525,28 +81528,28 @@
     return this.getStorageUpdates.apply(this, args);
   }
 };
-html.Navigator[dart.implements] = () => [html.NavigatorStorageUtils, html.NavigatorCpu, html.NavigatorLanguage, html.NavigatorOnLine, html.NavigatorID];
-dart.setSignature(html.Navigator, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Navigator, [])}),
+html$.Navigator[dart.implements] = () => [html$.NavigatorStorageUtils, html$.NavigatorCpu, html$.NavigatorLanguage, html$.NavigatorOnLine, html$.NavigatorID];
+dart.setSignature(html$.Navigator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Navigator, [])}),
   fields: () => ({
-    [dartx.bluetooth]: html.Bluetooth,
-    [dartx.connection]: html.NetworkInformation,
-    [dartx.credentials]: html.CredentialsContainer,
+    [dartx.bluetooth]: html$.Bluetooth,
+    [dartx.connection]: html$.NetworkInformation,
+    [dartx.credentials]: html$.CredentialsContainer,
     [dartx.doNotTrack]: core.String,
-    [dartx.geolocation]: html.Geolocation,
+    [dartx.geolocation]: html$.Geolocation,
     [dartx.maxTouchPoints]: core.int,
-    [dartx.mediaDevices]: html.MediaDevices,
-    [dartx.mimeTypes]: html.MimeTypeArray,
-    [dartx.permissions]: html.Permissions,
-    [dartx.presentation]: html.Presentation,
+    [dartx.mediaDevices]: html$.MediaDevices,
+    [dartx.mimeTypes]: html$.MimeTypeArray,
+    [dartx.permissions]: html$.Permissions,
+    [dartx.presentation]: html$.Presentation,
     [dartx.productSub]: core.String,
-    [dartx.serviceWorker]: html.ServiceWorkerContainer,
-    [dartx.services]: html.ServicePortCollection,
-    [dartx.storageQuota]: html.StorageQuota,
+    [dartx.serviceWorker]: html$.ServiceWorkerContainer,
+    [dartx.services]: html$.ServicePortCollection,
+    [dartx.storageQuota]: html$.StorageQuota,
     [dartx.vendor]: core.String,
     [dartx.vendorSub]: core.String,
-    [dartx.persistentStorage]: html.DeprecatedStorageQuota,
-    [dartx.temporaryStorage]: html.DeprecatedStorageQuota,
+    [dartx.persistentStorage]: html$.DeprecatedStorageQuota,
+    [dartx.temporaryStorage]: html$.DeprecatedStorageQuota,
     [dartx.hardwareConcurrency]: core.int,
     [dartx.appCodeName]: core.String,
     [dartx.appName]: core.String,
@@ -81561,11 +81564,11 @@
   }),
   getters: () => ({[dartx.language]: dart.definiteFunctionType(core.String, [])}),
   methods: () => ({
-    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
+    [dartx.getUserMedia]: dart.definiteFunctionType(async.Future$(html$.MediaStream), [], {audio: dart.dynamic, video: dart.dynamic}),
     [_ensureGetUserMedia]: dart.definiteFunctionType(dart.dynamic, []),
-    [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html._NavigatorUserMediaSuccessCallback, html._NavigatorUserMediaErrorCallback]),
+    [_getUserMedia]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$._NavigatorUserMediaSuccessCallback, html$._NavigatorUserMediaErrorCallback]),
     [dartx.getBattery]: dart.definiteFunctionType(async.Future, []),
-    [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html.Gamepad), []),
+    [dartx.getGamepads]: dart.definiteFunctionType(core.List$(html$.Gamepad), []),
     [dartx.getVRDevices]: dart.definiteFunctionType(async.Future, []),
     [dartx.registerProtocolHandler]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
     [dartx.requestMidiAccess]: dart.definiteFunctionType(async.Future, [], [core.Map]),
@@ -81576,11 +81579,11 @@
     [dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.Navigator, html.Navigator);
+dart.registerExtension(dart.global.Navigator, html$.Navigator);
 dart.defineExtensionNames([
   'hardwareConcurrency'
 ]);
-html.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
+html$.NavigatorCpu = class NavigatorCpu extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81591,12 +81594,12 @@
     super.hardwareConcurrency = value;
   }
 };
-const hardwareConcurrency = Symbol(html.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
-dart.setSignature(html.NavigatorCpu, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorCpu, [])}),
+const hardwareConcurrency = Symbol(html$.NavigatorCpu.name + "." + 'hardwareConcurrency'.toString());
+dart.setSignature(html$.NavigatorCpu, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorCpu, [])}),
   fields: () => ({hardwareConcurrency: core.int})
 });
-dart.defineExtensionMembers(html.NavigatorCpu, ['hardwareConcurrency']);
+dart.defineExtensionMembers(html$.NavigatorCpu, ['hardwareConcurrency']);
 dart.defineExtensionNames([
   'appCodeName',
   'appName',
@@ -81606,7 +81609,7 @@
   'product',
   'userAgent'
 ]);
-html.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
+html$.NavigatorID = class NavigatorID extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81653,15 +81656,15 @@
     super.userAgent = value;
   }
 };
-const appCodeName = Symbol(html.NavigatorID.name + "." + 'appCodeName'.toString());
-const appName = Symbol(html.NavigatorID.name + "." + 'appName'.toString());
-const appVersion = Symbol(html.NavigatorID.name + "." + 'appVersion'.toString());
-const dartEnabled = Symbol(html.NavigatorID.name + "." + 'dartEnabled'.toString());
-const platform = Symbol(html.NavigatorID.name + "." + 'platform'.toString());
-const product = Symbol(html.NavigatorID.name + "." + 'product'.toString());
-const userAgent = Symbol(html.NavigatorID.name + "." + 'userAgent'.toString());
-dart.setSignature(html.NavigatorID, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorID, [])}),
+const appCodeName = Symbol(html$.NavigatorID.name + "." + 'appCodeName'.toString());
+const appName = Symbol(html$.NavigatorID.name + "." + 'appName'.toString());
+const appVersion = Symbol(html$.NavigatorID.name + "." + 'appVersion'.toString());
+const dartEnabled = Symbol(html$.NavigatorID.name + "." + 'dartEnabled'.toString());
+const platform = Symbol(html$.NavigatorID.name + "." + 'platform'.toString());
+const product = Symbol(html$.NavigatorID.name + "." + 'product'.toString());
+const userAgent = Symbol(html$.NavigatorID.name + "." + 'userAgent'.toString());
+dart.setSignature(html$.NavigatorID, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorID, [])}),
   fields: () => ({
     appCodeName: core.String,
     appName: core.String,
@@ -81672,7 +81675,7 @@
     userAgent: core.String
   })
 });
-dart.defineExtensionMembers(html.NavigatorID, [
+dart.defineExtensionMembers(html$.NavigatorID, [
   'appCodeName',
   'appName',
   'appVersion',
@@ -81685,7 +81688,7 @@
   'language',
   'languages'
 ]);
-html.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
+html$.NavigatorLanguage = class NavigatorLanguage extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81702,20 +81705,20 @@
     super.languages = value;
   }
 };
-const language = Symbol(html.NavigatorLanguage.name + "." + 'language'.toString());
-const languages = Symbol(html.NavigatorLanguage.name + "." + 'languages'.toString());
-dart.setSignature(html.NavigatorLanguage, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorLanguage, [])}),
+const language = Symbol(html$.NavigatorLanguage.name + "." + 'language'.toString());
+const languages = Symbol(html$.NavigatorLanguage.name + "." + 'languages'.toString());
+dart.setSignature(html$.NavigatorLanguage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorLanguage, [])}),
   fields: () => ({
     language: core.String,
     languages: ListOfString()
   })
 });
-dart.defineExtensionMembers(html.NavigatorLanguage, ['language', 'languages']);
+dart.defineExtensionMembers(html$.NavigatorLanguage, ['language', 'languages']);
 dart.defineExtensionNames([
   'onLine'
 ]);
-html.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
+html$.NavigatorOnLine = class NavigatorOnLine extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81726,17 +81729,17 @@
     super.onLine = value;
   }
 };
-const onLine = Symbol(html.NavigatorOnLine.name + "." + 'onLine'.toString());
-dart.setSignature(html.NavigatorOnLine, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorOnLine, [])}),
+const onLine = Symbol(html$.NavigatorOnLine.name + "." + 'onLine'.toString());
+dart.setSignature(html$.NavigatorOnLine, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorOnLine, [])}),
   fields: () => ({onLine: core.bool})
 });
-dart.defineExtensionMembers(html.NavigatorOnLine, ['onLine']);
+dart.defineExtensionMembers(html$.NavigatorOnLine, ['onLine']);
 dart.defineExtensionNames([
   'getStorageUpdates',
   'cookieEnabled'
 ]);
-html.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
+html$.NavigatorStorageUtils = class NavigatorStorageUtils extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81747,18 +81750,18 @@
     return this.getStorageUpdates.apply(this, args);
   }
 };
-dart.setSignature(html.NavigatorStorageUtils, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorStorageUtils, [])}),
+dart.setSignature(html$.NavigatorStorageUtils, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorStorageUtils, [])}),
   fields: () => ({[dartx.cookieEnabled]: core.bool}),
   methods: () => ({[dartx.getStorageUpdates]: dart.definiteFunctionType(dart.void, [])})
 });
-dart.registerExtension(dart.global.NavigatorStorageUtils, html.NavigatorStorageUtils);
+dart.registerExtension(dart.global.NavigatorStorageUtils, html$.NavigatorStorageUtils);
 dart.defineExtensionNames([
   'constraintName',
   'message',
   'name'
 ]);
-html.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
+html$.NavigatorUserMediaError = class NavigatorUserMediaError extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81772,21 +81775,21 @@
     return this.name;
   }
 };
-dart.setSignature(html.NavigatorUserMediaError, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NavigatorUserMediaError, [])}),
+dart.setSignature(html$.NavigatorUserMediaError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NavigatorUserMediaError, [])}),
   fields: () => ({
     [dartx.constraintName]: core.String,
     [dartx.message]: core.String,
     [dartx.name]: core.String
   })
 });
-dart.registerExtension(dart.global.NavigatorUserMediaError, html.NavigatorUserMediaError);
-html._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html.NavigatorUserMediaError]));
-html._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html.MediaStream]));
+dart.registerExtension(dart.global.NavigatorUserMediaError, html$.NavigatorUserMediaError);
+html$._NavigatorUserMediaErrorCallback = dart.typedef('_NavigatorUserMediaErrorCallback', () => dart.functionType(dart.void, [html$.NavigatorUserMediaError]));
+html$._NavigatorUserMediaSuccessCallback = dart.typedef('_NavigatorUserMediaSuccessCallback', () => dart.functionType(dart.void, [html$.MediaStream]));
 dart.defineExtensionNames([
   'type'
 ]);
-html.NetworkInformation = class NetworkInformation extends html.EventTarget {
+html$.NetworkInformation = class NetworkInformation extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -81794,12 +81797,12 @@
     return this.type;
   }
 };
-dart.setSignature(html.NetworkInformation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NetworkInformation, [])}),
+dart.setSignature(html$.NetworkInformation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NetworkInformation, [])}),
   fields: () => ({[dartx.type]: core.String})
 });
-dart.registerExtension(dart.global.NetworkInformation, html.NetworkInformation);
-html._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html.Node) {
+dart.registerExtension(dart.global.NetworkInformation, html$.NetworkInformation);
+html$._ChildNodeListLazy = class _ChildNodeListLazy extends collection.ListBase$(html$.Node) {
   new(this$) {
     this[_this] = this$;
   }
@@ -81823,7 +81826,7 @@
     this[_this][dartx.append](value);
   }
   addAll(iterable) {
-    if (html._ChildNodeListLazy.is(iterable)) {
+    if (html$._ChildNodeListLazy.is(iterable)) {
       let otherList = iterable;
       if (!core.identical(otherList[_this], this[_this])) {
         for (let i = 0, len = otherList.length; i < dart.notNull(len); ++i) {
@@ -81872,13 +81875,13 @@
     return result;
   }
   remove(object) {
-    if (!html.Node.is(object)) return false;
-    let node = html.Node._check(object);
+    if (!html$.Node.is(object)) return false;
+    let node = html$.Node._check(object);
     if (!core.identical(this[_this], node[dartx.parentNode])) return false;
     this[_this][_removeChild](node);
     return true;
   }
-  [_filter](test, removeMatching) {
+  [_filter$0](test, removeMatching) {
     let child = this[_this][dartx.firstChild];
     while (child != null) {
       let nextChild = child[dartx.nextNode];
@@ -81889,10 +81892,10 @@
     }
   }
   removeWhere(test) {
-    this[_filter](test, true);
+    this[_filter$0](test, true);
   }
   retainWhere(test) {
-    this[_filter](test, false);
+    this[_filter$0](test, false);
   }
   clear() {
     this[_this][_clearChildren]();
@@ -81933,23 +81936,23 @@
     return this[_this][dartx.childNodes];
   }
 };
-dart.addSimpleTypeTests(html._ChildNodeListLazy);
-html._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
-dart.setSignature(html._ChildNodeListLazy, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ChildNodeListLazy, [html.Node])}),
-  fields: () => ({[_this]: html.Node}),
+dart.addSimpleTypeTests(html$._ChildNodeListLazy);
+html$._ChildNodeListLazy[dart.implements] = () => [html_common.NodeListWrapper];
+dart.setSignature(html$._ChildNodeListLazy, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ChildNodeListLazy, [html$.Node])}),
+  fields: () => ({[_this]: html$.Node}),
   getters: () => ({
     length: dart.definiteFunctionType(core.int, []),
-    rawList: dart.definiteFunctionType(core.List$(html.Node), [])
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
   }),
   setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [_filter]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
-    _set: dart.definiteFunctionType(dart.void, [core.int, html.Node]),
-    _get: dart.definiteFunctionType(html.Node, [core.int])
+    [_filter$0]: dart.definiteFunctionType(dart.void, [NodeTobool(), core.bool]),
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    _get: dart.definiteFunctionType(html$.Node, [core.int])
   })
 });
-dart.defineExtensionMembers(html._ChildNodeListLazy, [
+dart.defineExtensionMembers(html$._ChildNodeListLazy, [
   'add',
   'addAll',
   'insert',
@@ -81974,13 +81977,13 @@
   'length',
   'length'
 ]);
-html.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
+html$.NodeFilter = class NodeFilter extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.NodeFilter, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NodeFilter, [])}),
+dart.setSignature(html$.NodeFilter, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NodeFilter, [])}),
   sfields: () => ({
     FILTER_ACCEPT: core.int,
     FILTER_REJECT: core.int,
@@ -81995,18 +81998,18 @@
     SHOW_TEXT: core.int
   })
 });
-html.NodeFilter.FILTER_ACCEPT = 1;
-html.NodeFilter.FILTER_REJECT = 2;
-html.NodeFilter.FILTER_SKIP = 3;
-html.NodeFilter.SHOW_ALL = 4294967295;
-html.NodeFilter.SHOW_COMMENT = 128;
-html.NodeFilter.SHOW_DOCUMENT = 256;
-html.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
-html.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
-html.NodeFilter.SHOW_ELEMENT = 1;
-html.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
-html.NodeFilter.SHOW_TEXT = 4;
-dart.registerExtension(dart.global.NodeFilter, html.NodeFilter);
+html$.NodeFilter.FILTER_ACCEPT = 1;
+html$.NodeFilter.FILTER_REJECT = 2;
+html$.NodeFilter.FILTER_SKIP = 3;
+html$.NodeFilter.SHOW_ALL = 4294967295;
+html$.NodeFilter.SHOW_COMMENT = 128;
+html$.NodeFilter.SHOW_DOCUMENT = 256;
+html$.NodeFilter.SHOW_DOCUMENT_FRAGMENT = 1024;
+html$.NodeFilter.SHOW_DOCUMENT_TYPE = 512;
+html$.NodeFilter.SHOW_ELEMENT = 1;
+html$.NodeFilter.SHOW_PROCESSING_INSTRUCTION = 64;
+html$.NodeFilter.SHOW_TEXT = 4;
+dart.registerExtension(dart.global.NodeFilter, html$.NodeFilter);
 dart.defineExtensionNames([
   'detach',
   'nextNode',
@@ -82016,9 +82019,9 @@
   'root',
   'whatToShow'
 ]);
-html.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
+html$.NodeIterator = class NodeIterator extends _interceptors.Interceptor {
   static new(root, whatToShow) {
-    return html.document[_createNodeIterator](root, whatToShow, null);
+    return html$.document[_createNodeIterator](root, whatToShow, null);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -82045,24 +82048,24 @@
     return this.previousNode.apply(this, args);
   }
 };
-dart.setSignature(html.NodeIterator, {
+dart.setSignature(html$.NodeIterator, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.NodeIterator, [html.Node, core.int]),
-    _: dart.definiteFunctionType(html.NodeIterator, [])
+    new: dart.definiteFunctionType(html$.NodeIterator, [html$.Node, core.int]),
+    _: dart.definiteFunctionType(html$.NodeIterator, [])
   }),
   fields: () => ({
     [dartx.pointerBeforeReferenceNode]: core.bool,
-    [dartx.referenceNode]: html.Node,
-    [dartx.root]: html.Node,
+    [dartx.referenceNode]: html$.Node,
+    [dartx.root]: html$.Node,
     [dartx.whatToShow]: core.int
   }),
   methods: () => ({
     [dartx.detach]: dart.definiteFunctionType(dart.void, []),
-    [dartx.nextNode]: dart.definiteFunctionType(html.Node, []),
-    [dartx.previousNode]: dart.definiteFunctionType(html.Node, [])
+    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, [])
   })
 });
-dart.registerExtension(dart.global.NodeIterator, html.NodeIterator);
+dart.registerExtension(dart.global.NodeIterator, html$.NodeIterator);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -82073,7 +82076,7 @@
   'single',
   'elementAt'
 ]);
-html.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Node), html.ImmutableListMixin$(html.Node)) {
+html$.NodeList = class NodeList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82119,24 +82122,24 @@
     return this.item.apply(this, args);
   }
 };
-html.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-dart.setSignature(html.NodeList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NodeList, [])}),
+html$.NodeList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$.NodeList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NodeList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Node, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Node]),
-    [_item]: dart.definiteFunctionType(html.Node, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [_item]: dart.definiteFunctionType(html$.Node, [core.int])
   })
 });
-dart.registerExtension(dart.global.NodeList, html.NodeList);
-dart.registerExtension(dart.global.RadioNodeList, html.NodeList);
+dart.registerExtension(dart.global.NodeList, html$.NodeList);
+dart.registerExtension(dart.global.RadioNodeList, html$.NodeList);
 dart.defineExtensionNames([
   'nextElementSibling',
   'previousElementSibling'
 ]);
-html.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
+html$.NonDocumentTypeChildNode = class NonDocumentTypeChildNode extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82147,18 +82150,18 @@
     return this.previousElementSibling;
   }
 };
-dart.setSignature(html.NonDocumentTypeChildNode, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NonDocumentTypeChildNode, [])}),
+dart.setSignature(html$.NonDocumentTypeChildNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NonDocumentTypeChildNode, [])}),
   fields: () => ({
-    [dartx.nextElementSibling]: html.Element,
-    [dartx.previousElementSibling]: html.Element
+    [dartx.nextElementSibling]: html$.Element,
+    [dartx.previousElementSibling]: html$.Element
   })
 });
-dart.registerExtension(dart.global.NonDocumentTypeChildNode, html.NonDocumentTypeChildNode);
+dart.registerExtension(dart.global.NonDocumentTypeChildNode, html$.NonDocumentTypeChildNode);
 dart.defineExtensionNames([
   'getElementById'
 ]);
-html.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
+html$.NonElementParentNode = class NonElementParentNode extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82166,11 +82169,11 @@
     return this.getElementById.apply(this, args);
   }
 };
-dart.setSignature(html.NonElementParentNode, {
-  constructors: () => ({_: dart.definiteFunctionType(html.NonElementParentNode, [])}),
-  methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html.Element, [core.String])})
+dart.setSignature(html$.NonElementParentNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.NonElementParentNode, [])}),
+  methods: () => ({[dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String])})
 });
-dart.registerExtension(dart.global.NonElementParentNode, html.NonElementParentNode);
+dart.registerExtension(dart.global.NonElementParentNode, html$.NonElementParentNode);
 dart.defineExtensionNames([
   'close',
   'onClick',
@@ -82188,7 +82191,7 @@
   'title',
   'vibrate'
 ]);
-html.Notification = class Notification extends html.EventTarget {
+html$.Notification = class Notification extends html$.EventTarget {
   static new(title, opts) {
     let dir = opts && 'dir' in opts ? opts.dir : null;
     let body = opts && 'body' in opts ? opts.body : null;
@@ -82201,7 +82204,7 @@
     if (lang != null) parsedOptions[dartx._set]('lang', lang);
     if (tag != null) parsedOptions[dartx._set]('tag', tag);
     if (icon != null) parsedOptions[dartx._set]('icon', icon);
-    return html.Notification._factoryNotification(title, parsedOptions);
+    return html$.Notification._factoryNotification(title, parsedOptions);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -82210,9 +82213,9 @@
     if (options === void 0) options = null;
     if (options != null) {
       let options_1 = html_common.convertDartToNative_Dictionary(options);
-      return html.Notification._create_1(title, options_1);
+      return html$.Notification._create_1(title, options_1);
     }
-    return html.Notification._create_2(title);
+    return html$.Notification._create_2(title);
   }
   static _create_1(title, options) {
     return new self.Notification(title, options);
@@ -82258,28 +82261,28 @@
   }
   static requestPermission() {
     let completer = CompleterOfString().new();
-    html.Notification._requestPermission(dart.fn(value => {
+    html$.Notification._requestPermission(dart.fn(value => {
       completer.complete(value);
     }, StringToNull()));
     return completer.future;
   }
   get [dartx.onClick]() {
-    return html.Notification.clickEvent.forTarget(this);
+    return html$.Notification.clickEvent.forTarget(this);
   }
   get [dartx.onClose]() {
-    return html.Notification.closeEvent.forTarget(this);
+    return html$.Notification.closeEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.Notification.errorEvent.forTarget(this);
+    return html$.Notification.errorEvent.forTarget(this);
   }
   get [dartx.onShow]() {
-    return html.Notification.showEvent.forTarget(this);
+    return html$.Notification.showEvent.forTarget(this);
   }
 };
-dart.setSignature(html.Notification, {
+dart.setSignature(html$.Notification, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
-    _: dart.definiteFunctionType(html.Notification, [])
+    new: dart.definiteFunctionType(html$.Notification, [core.String], {dir: core.String, body: core.String, lang: core.String, tag: core.String, icon: core.String}),
+    _: dart.definiteFunctionType(html$.Notification, [])
   }),
   fields: () => ({
     [dartx.body]: core.String,
@@ -82294,10 +82297,10 @@
     [dartx.vibrate]: ListOfint()
   }),
   getters: () => ({
-    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onShow]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({[dartx.close]: dart.definiteFunctionType(dart.void, [])}),
   sfields: () => ({
@@ -82308,15 +82311,15 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _factoryNotification: dart.definiteFunctionType(html.Notification, [core.String], [core.Map]),
-    _create_1: dart.definiteFunctionType(html.Notification, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.Notification, [dart.dynamic]),
-    _requestPermission: dart.definiteFunctionType(dart.void, [], [html._NotificationPermissionCallback]),
+    _factoryNotification: dart.definiteFunctionType(html$.Notification, [core.String], [core.Map]),
+    _create_1: dart.definiteFunctionType(html$.Notification, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.Notification, [dart.dynamic]),
+    _requestPermission: dart.definiteFunctionType(dart.void, [], [html$._NotificationPermissionCallback]),
     requestPermission: dart.definiteFunctionType(async.Future$(core.String), [])
   }),
   names: ['_factoryNotification', '_create_1', '_create_2', '_requestPermission', 'requestPermission']
 });
-dart.defineLazy(html.Notification, {
+dart.defineLazy(html$.Notification, {
   get clickEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('click'));
   },
@@ -82330,11 +82333,11 @@
     return dart.const(new (EventStreamProviderOfEvent())('show'));
   }
 });
-dart.registerExtension(dart.global.Notification, html.Notification);
+dart.registerExtension(dart.global.Notification, html$.Notification);
 dart.defineExtensionNames([
   'notification'
 ]);
-html.NotificationEvent = class NotificationEvent extends html.ExtendableEvent {
+html$.NotificationEvent = class NotificationEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82342,9 +82345,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.NotificationEvent._create_1(type, eventInitDict_1);
+      return html$.NotificationEvent._create_1(type, eventInitDict_1);
     }
-    return html.NotificationEvent._create_2(type);
+    return html$.NotificationEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.NotificationEvent(type, eventInitDict);
@@ -82356,31 +82359,31 @@
     return this.notification;
   }
 };
-dart.setSignature(html.NotificationEvent, {
+dart.setSignature(html$.NotificationEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.NotificationEvent, []),
-    new: dart.definiteFunctionType(html.NotificationEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.NotificationEvent, []),
+    new: dart.definiteFunctionType(html$.NotificationEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.notification]: html.Notification}),
+  fields: () => ({[dartx.notification]: html$.Notification}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.NotificationEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.NotificationEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.NotificationEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.NotificationEvent, html.NotificationEvent);
-html._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
+dart.registerExtension(dart.global.NotificationEvent, html$.NotificationEvent);
+html$._NotificationPermissionCallback = dart.typedef('_NotificationPermissionCallback', () => dart.functionType(dart.void, [core.String]));
 dart.defineExtensionNames([
   'reversed',
   'start',
   'type'
 ]);
-html.OListElement = class OListElement extends html.HtmlElement {
+html$.OListElement = class OListElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.OListElement._check(html.document[dartx.createElement]("ol"));
+    return html$.OListElement._check(html$.document[dartx.createElement]("ol"));
   }
   created() {
     this[dartx.reversed] = null;
@@ -82407,12 +82410,12 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.OListElement, 'created');
-dart.setSignature(html.OListElement, {
+dart.defineNamedConstructor(html$.OListElement, 'created');
+dart.setSignature(html$.OListElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.OListElement, []),
-    new: dart.definiteFunctionType(html.OListElement, []),
-    created: dart.definiteFunctionType(html.OListElement, [])
+    _: dart.definiteFunctionType(html$.OListElement, []),
+    new: dart.definiteFunctionType(html$.OListElement, []),
+    created: dart.definiteFunctionType(html$.OListElement, [])
   }),
   fields: () => ({
     [dartx.reversed]: core.bool,
@@ -82420,7 +82423,7 @@
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLOListElement, html.OListElement);
+dart.registerExtension(dart.global.HTMLOListElement, html$.OListElement);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -82436,12 +82439,12 @@
   'width',
   'willValidate'
 ]);
-html.ObjectElement = class ObjectElement extends html.HtmlElement {
+html$.ObjectElement = class ObjectElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ObjectElement._check(html.document[dartx.createElement]("object"));
+    return html$.ObjectElement._check(html$.document[dartx.createElement]("object"));
   }
   created() {
     this[dartx.data] = null;
@@ -82457,7 +82460,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('object');
+    return html$.Element.isTagSupported('object');
   }
   get [dartx.data]() {
     return this.data;
@@ -82523,45 +82526,45 @@
     return this.setCustomValidity.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.ObjectElement, 'created');
-dart.setSignature(html.ObjectElement, {
+dart.defineNamedConstructor(html$.ObjectElement, 'created');
+dart.setSignature(html$.ObjectElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ObjectElement, []),
-    new: dart.definiteFunctionType(html.ObjectElement, []),
-    created: dart.definiteFunctionType(html.ObjectElement, [])
+    _: dart.definiteFunctionType(html$.ObjectElement, []),
+    new: dart.definiteFunctionType(html$.ObjectElement, []),
+    created: dart.definiteFunctionType(html$.ObjectElement, [])
   }),
   fields: () => ({
     [dartx.data]: core.String,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.height]: core.String,
     [dartx.name]: core.String,
     [dartx.type]: core.String,
     [dartx.useMap]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.width]: core.String,
     [dartx.willValidate]: core.bool
   }),
   methods: () => ({
     [__getter__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html.Node]),
+    [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
     [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
     [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
     [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLObjectElement, html.ObjectElement);
+dart.registerExtension(dart.global.HTMLObjectElement, html$.ObjectElement);
 dart.defineExtensionNames([
   'disabled',
   'label'
 ]);
-html.OptGroupElement = class OptGroupElement extends html.HtmlElement {
+html$.OptGroupElement = class OptGroupElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.OptGroupElement._check(html.document[dartx.createElement]("optgroup"));
+    return html$.OptGroupElement._check(html$.document[dartx.createElement]("optgroup"));
   }
   created() {
     this[dartx.disabled] = null;
@@ -82581,19 +82584,19 @@
     this.label = value;
   }
 };
-dart.defineNamedConstructor(html.OptGroupElement, 'created');
-dart.setSignature(html.OptGroupElement, {
+dart.defineNamedConstructor(html$.OptGroupElement, 'created');
+dart.setSignature(html$.OptGroupElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.OptGroupElement, []),
-    new: dart.definiteFunctionType(html.OptGroupElement, []),
-    created: dart.definiteFunctionType(html.OptGroupElement, [])
+    _: dart.definiteFunctionType(html$.OptGroupElement, []),
+    new: dart.definiteFunctionType(html$.OptGroupElement, []),
+    created: dart.definiteFunctionType(html$.OptGroupElement, [])
   }),
   fields: () => ({
     [dartx.disabled]: core.bool,
     [dartx.label]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLOptGroupElement, html.OptGroupElement);
+dart.registerExtension(dart.global.HTMLOptGroupElement, html$.OptGroupElement);
 dart.defineExtensionNames([
   'defaultSelected',
   'disabled',
@@ -82603,12 +82606,12 @@
   'selected',
   'value'
 ]);
-html.OptionElement = class OptionElement extends html.HtmlElement {
+html$.OptionElement = class OptionElement extends html$.HtmlElement {
   static new(opts) {
     let data = opts && 'data' in opts ? opts.data : '';
     let value = opts && 'value' in opts ? opts.value : '';
     let selected = opts && 'selected' in opts ? opts.selected : false;
-    return html.OptionElement._(data, value, null, selected);
+    return html$.OptionElement._(data, value, null, selected);
   }
   static _(data, value, defaultSelected, selected) {
     if (data === void 0) data = null;
@@ -82616,18 +82619,18 @@
     if (defaultSelected === void 0) defaultSelected = null;
     if (selected === void 0) selected = null;
     if (selected != null) {
-      return html.OptionElement._create_1(data, value, defaultSelected, selected);
+      return html$.OptionElement._create_1(data, value, defaultSelected, selected);
     }
     if (defaultSelected != null) {
-      return html.OptionElement._create_2(data, value, defaultSelected);
+      return html$.OptionElement._create_2(data, value, defaultSelected);
     }
     if (value != null) {
-      return html.OptionElement._create_3(data, value);
+      return html$.OptionElement._create_3(data, value);
     }
     if (data != null) {
-      return html.OptionElement._create_4(data);
+      return html$.OptionElement._create_4(data);
     }
-    return html.OptionElement._create_5();
+    return html$.OptionElement._create_5();
   }
   static _create_1(data, value, defaultSelected, selected) {
     return new Option(data, value, defaultSelected, selected);
@@ -82691,32 +82694,32 @@
     this.value = value;
   }
 };
-dart.defineNamedConstructor(html.OptionElement, 'created');
-dart.setSignature(html.OptionElement, {
+dart.defineNamedConstructor(html$.OptionElement, 'created');
+dart.setSignature(html$.OptionElement, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
-    _: dart.definiteFunctionType(html.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
-    created: dart.definiteFunctionType(html.OptionElement, [])
+    new: dart.definiteFunctionType(html$.OptionElement, [], {data: core.String, value: core.String, selected: core.bool}),
+    _: dart.definiteFunctionType(html$.OptionElement, [], [core.String, core.String, core.bool, core.bool]),
+    created: dart.definiteFunctionType(html$.OptionElement, [])
   }),
   fields: () => ({
     [dartx.defaultSelected]: core.bool,
     [dartx.disabled]: core.bool,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.index]: core.int,
     [dartx.label]: core.String,
     [dartx.selected]: core.bool,
     [dartx.value]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.OptionElement, [dart.dynamic, dart.dynamic]),
-    _create_4: dart.definiteFunctionType(html.OptionElement, [dart.dynamic]),
-    _create_5: dart.definiteFunctionType(html.OptionElement, [])
+    _create_1: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.OptionElement, [dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.OptionElement, [])
   }),
   names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
 });
-dart.registerExtension(dart.global.HTMLOptionElement, html.OptionElement);
+dart.registerExtension(dart.global.HTMLOptionElement, html$.OptionElement);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -82732,12 +82735,12 @@
   'value',
   'willValidate'
 ]);
-html.OutputElement = class OutputElement extends html.HtmlElement {
+html$.OutputElement = class OutputElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.OutputElement._check(html.document[dartx.createElement]("output"));
+    return html$.OutputElement._check(html$.document[dartx.createElement]("output"));
   }
   created() {
     this[dartx.defaultValue] = null;
@@ -82753,7 +82756,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('output');
+    return html$.Element.isTagSupported('output');
   }
   get [dartx.defaultValue]() {
     return this.defaultValue;
@@ -82804,22 +82807,22 @@
     return this.setCustomValidity.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.OutputElement, 'created');
-dart.setSignature(html.OutputElement, {
+dart.defineNamedConstructor(html$.OutputElement, 'created');
+dart.setSignature(html$.OutputElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.OutputElement, []),
-    new: dart.definiteFunctionType(html.OutputElement, []),
-    created: dart.definiteFunctionType(html.OutputElement, [])
+    _: dart.definiteFunctionType(html$.OutputElement, []),
+    new: dart.definiteFunctionType(html$.OutputElement, []),
+    created: dart.definiteFunctionType(html$.OutputElement, [])
   }),
   fields: () => ({
     [dartx.defaultValue]: core.String,
-    [dartx.form]: html.FormElement,
-    [dartx.htmlFor]: html.DomSettableTokenList,
+    [dartx.form]: html$.FormElement,
+    [dartx.htmlFor]: html$.DomSettableTokenList,
     [dartx.labels]: ListOfNode(),
     [dartx.name]: core.String,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.value]: core.String,
     [dartx.willValidate]: core.bool
   }),
@@ -82830,11 +82833,11 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLOutputElement, html.OutputElement);
+dart.registerExtension(dart.global.HTMLOutputElement, html$.OutputElement);
 dart.defineExtensionNames([
   'persisted'
 ]);
-html.PageTransitionEvent = class PageTransitionEvent extends html.Event {
+html$.PageTransitionEvent = class PageTransitionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82842,9 +82845,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.PageTransitionEvent._create_1(type, eventInitDict_1);
+      return html$.PageTransitionEvent._create_1(type, eventInitDict_1);
     }
-    return html.PageTransitionEvent._create_2(type);
+    return html$.PageTransitionEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.PageTransitionEvent(type, eventInitDict);
@@ -82856,49 +82859,49 @@
     return this.persisted;
   }
 };
-dart.setSignature(html.PageTransitionEvent, {
+dart.setSignature(html$.PageTransitionEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PageTransitionEvent, []),
-    new: dart.definiteFunctionType(html.PageTransitionEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.PageTransitionEvent, []),
+    new: dart.definiteFunctionType(html$.PageTransitionEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.persisted]: core.bool}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PageTransitionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PageTransitionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.PageTransitionEvent, html.PageTransitionEvent);
-html.ParagraphElement = class ParagraphElement extends html.HtmlElement {
+dart.registerExtension(dart.global.PageTransitionEvent, html$.PageTransitionEvent);
+html$.ParagraphElement = class ParagraphElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ParagraphElement._check(html.document[dartx.createElement]("p"));
+    return html$.ParagraphElement._check(html$.document[dartx.createElement]("p"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.ParagraphElement, 'created');
-dart.setSignature(html.ParagraphElement, {
+dart.defineNamedConstructor(html$.ParagraphElement, 'created');
+dart.setSignature(html$.ParagraphElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ParagraphElement, []),
-    new: dart.definiteFunctionType(html.ParagraphElement, []),
-    created: dart.definiteFunctionType(html.ParagraphElement, [])
+    _: dart.definiteFunctionType(html$.ParagraphElement, []),
+    new: dart.definiteFunctionType(html$.ParagraphElement, []),
+    created: dart.definiteFunctionType(html$.ParagraphElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLParagraphElement, html.ParagraphElement);
+dart.registerExtension(dart.global.HTMLParagraphElement, html$.ParagraphElement);
 dart.defineExtensionNames([
   'name',
   'value'
 ]);
-html.ParamElement = class ParamElement extends html.HtmlElement {
+html$.ParamElement = class ParamElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ParamElement._check(html.document[dartx.createElement]("param"));
+    return html$.ParamElement._check(html$.document[dartx.createElement]("param"));
   }
   created() {
     this[dartx.name] = null;
@@ -82918,38 +82921,38 @@
     this.value = value;
   }
 };
-dart.defineNamedConstructor(html.ParamElement, 'created');
-dart.setSignature(html.ParamElement, {
+dart.defineNamedConstructor(html$.ParamElement, 'created');
+dart.setSignature(html$.ParamElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ParamElement, []),
-    new: dart.definiteFunctionType(html.ParamElement, []),
-    created: dart.definiteFunctionType(html.ParamElement, [])
+    _: dart.definiteFunctionType(html$.ParamElement, []),
+    new: dart.definiteFunctionType(html$.ParamElement, []),
+    created: dart.definiteFunctionType(html$.ParamElement, [])
   }),
   fields: () => ({
     [dartx.name]: core.String,
     [dartx.value]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLParamElement, html.ParamElement);
-html.ParentNode = class ParentNode extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.HTMLParamElement, html$.ParamElement);
+html$.ParentNode = class ParentNode extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.ParentNode, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ParentNode, [])}),
+dart.setSignature(html$.ParentNode, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ParentNode, [])}),
   fields: () => ({
     [_childElementCount]: core.int,
     [_children]: ListOfNode(),
-    [_firstElementChild]: html.Element,
-    [_lastElementChild]: html.Element
+    [_firstElementChild]: html$.Element,
+    [_lastElementChild]: html$.Element
   })
 });
 dart.defineExtensionNames([
   'formData',
   'password'
 ]);
-html.PasswordCredential = class PasswordCredential extends html.Credential {
+html$.PasswordCredential = class PasswordCredential extends html$.Credential {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -82957,12 +82960,12 @@
     if (name === void 0) name = null;
     if (iconURL === void 0) iconURL = null;
     if (iconURL != null) {
-      return html.PasswordCredential._create_1(id, password, name, iconURL);
+      return html$.PasswordCredential._create_1(id, password, name, iconURL);
     }
     if (name != null) {
-      return html.PasswordCredential._create_2(id, password, name);
+      return html$.PasswordCredential._create_2(id, password, name);
     }
-    return html.PasswordCredential._create_3(id, password);
+    return html$.PasswordCredential._create_3(id, password);
   }
   static _create_1(id, password, name, iconURL) {
     return new self.PasswordCredential(id, password, name, iconURL);
@@ -82980,23 +82983,23 @@
     return this.password;
   }
 };
-dart.setSignature(html.PasswordCredential, {
+dart.setSignature(html$.PasswordCredential, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PasswordCredential, []),
-    new: dart.definiteFunctionType(html.PasswordCredential, [core.String, core.String], [core.String, core.String])
+    _: dart.definiteFunctionType(html$.PasswordCredential, []),
+    new: dart.definiteFunctionType(html$.PasswordCredential, [core.String, core.String], [core.String, core.String])
   }),
   fields: () => ({
-    [dartx.formData]: html.FormData,
+    [dartx.formData]: html$.FormData,
     [dartx.password]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.PasswordCredential, [dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.PasswordCredential, [dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.registerExtension(dart.global.PasswordCredential, html.PasswordCredential);
+dart.registerExtension(dart.global.PasswordCredential, html$.PasswordCredential);
 dart.defineExtensionNames([
   'addPath',
   'arc',
@@ -83009,20 +83012,20 @@
   'quadraticCurveTo',
   'rect'
 ]);
-html.Path2D = class Path2D extends _interceptors.Interceptor {
+html$.Path2D = class Path2D extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(path_OR_text) {
     if (path_OR_text === void 0) path_OR_text = null;
     if (path_OR_text == null) {
-      return html.Path2D._create_1();
+      return html$.Path2D._create_1();
     }
-    if (html.Path2D.is(path_OR_text) || path_OR_text == null) {
-      return html.Path2D._create_2(path_OR_text);
+    if (html$.Path2D.is(path_OR_text) || path_OR_text == null) {
+      return html$.Path2D._create_2(path_OR_text);
     }
     if (typeof path_OR_text == 'string' || path_OR_text == null) {
-      return html.Path2D._create_3(path_OR_text);
+      return html$.Path2D._create_3(path_OR_text);
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -83066,14 +83069,14 @@
     return this.rect.apply(this, args);
   }
 };
-html.Path2D[dart.implements] = () => [html._CanvasPathMethods];
-dart.setSignature(html.Path2D, {
+html$.Path2D[dart.implements] = () => [html$._CanvasPathMethods];
+dart.setSignature(html$.Path2D, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.Path2D, []),
-    new: dart.definiteFunctionType(html.Path2D, [], [dart.dynamic])
+    _: dart.definiteFunctionType(html$.Path2D, []),
+    new: dart.definiteFunctionType(html$.Path2D, [], [dart.dynamic])
   }),
   methods: () => ({
-    [dartx.addPath]: dart.definiteFunctionType(dart.void, [html.Path2D], [svg.Matrix]),
+    [dartx.addPath]: dart.definiteFunctionType(dart.void, [html$.Path2D], [svg$.Matrix]),
     [dartx.arc]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.bool]),
     [dartx.arcTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num]),
     [dartx.bezierCurveTo]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num, core.num, core.num]),
@@ -83085,13 +83088,13 @@
     [dartx.rect]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num, core.num])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.Path2D, []),
-    _create_2: dart.definiteFunctionType(html.Path2D, [dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.Path2D, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.Path2D, []),
+    _create_2: dart.definiteFunctionType(html$.Path2D, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.Path2D, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.registerExtension(dart.global.Path2D, html.Path2D);
+dart.registerExtension(dart.global.Path2D, html$.Path2D);
 dart.defineExtensionNames([
   'clearFrameTimings',
   'clearMarks',
@@ -83110,7 +83113,7 @@
   'navigation',
   'timing'
 ]);
-html.Performance = class Performance extends html.EventTarget {
+html$.Performance = class Performance extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83163,24 +83166,24 @@
     return this.webkitSetResourceTimingBufferSize.apply(this, args);
   }
   get [dartx.onResourceTimingBufferFull]() {
-    return html.Performance.resourceTimingBufferFullEvent.forTarget(this);
+    return html$.Performance.resourceTimingBufferFullEvent.forTarget(this);
   }
 };
-dart.setSignature(html.Performance, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Performance, [])}),
+dart.setSignature(html$.Performance, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Performance, [])}),
   fields: () => ({
-    [dartx.memory]: html.MemoryInfo,
-    [dartx.navigation]: html.PerformanceNavigation,
-    [dartx.timing]: html.PerformanceTiming
+    [dartx.memory]: html$.MemoryInfo,
+    [dartx.navigation]: html$.PerformanceNavigation,
+    [dartx.timing]: html$.PerformanceTiming
   }),
-  getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onResourceTimingBufferFull]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.clearFrameTimings]: dart.definiteFunctionType(dart.void, []),
     [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), []),
-    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), [core.String, core.String]),
-    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), [core.String]),
+    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
+    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
+    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
     [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
     [dartx.now]: dart.definiteFunctionType(core.double, []),
@@ -83191,19 +83194,19 @@
   sfields: () => ({resourceTimingBufferFullEvent: EventStreamProviderOfEvent()}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineLazy(html.Performance, {
+dart.defineLazy(html$.Performance, {
   get resourceTimingBufferFullEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('webkitresourcetimingbufferfull'));
   }
 });
-dart.registerExtension(dart.global.Performance, html.Performance);
+dart.registerExtension(dart.global.Performance, html$.Performance);
 dart.defineExtensionNames([
   'duration',
   'entryType',
   'name',
   'startTime'
 ]);
-html.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
+html$.PerformanceEntry = class PerformanceEntry extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83220,8 +83223,8 @@
     return this.startTime;
   }
 };
-dart.setSignature(html.PerformanceEntry, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceEntry, [])}),
+dart.setSignature(html$.PerformanceEntry, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceEntry, [])}),
   fields: () => ({
     [dartx.duration]: core.double,
     [dartx.entryType]: core.String,
@@ -83229,11 +83232,11 @@
     [dartx.startTime]: core.double
   })
 });
-dart.registerExtension(dart.global.PerformanceEntry, html.PerformanceEntry);
+dart.registerExtension(dart.global.PerformanceEntry, html$.PerformanceEntry);
 dart.defineExtensionNames([
   'sourceFrame'
 ]);
-html.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html.PerformanceEntry {
+html$.PerformanceCompositeTiming = class PerformanceCompositeTiming extends html$.PerformanceEntry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83241,34 +83244,34 @@
     return this.sourceFrame;
   }
 };
-dart.setSignature(html.PerformanceCompositeTiming, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceCompositeTiming, [])}),
+dart.setSignature(html$.PerformanceCompositeTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceCompositeTiming, [])}),
   fields: () => ({[dartx.sourceFrame]: core.int})
 });
-dart.registerExtension(dart.global.PerformanceCompositeTiming, html.PerformanceCompositeTiming);
-html.PerformanceMark = class PerformanceMark extends html.PerformanceEntry {
+dart.registerExtension(dart.global.PerformanceCompositeTiming, html$.PerformanceCompositeTiming);
+html$.PerformanceMark = class PerformanceMark extends html$.PerformanceEntry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.PerformanceMark, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceMark, [])})
+dart.setSignature(html$.PerformanceMark, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMark, [])})
 });
-dart.registerExtension(dart.global.PerformanceMark, html.PerformanceMark);
-html.PerformanceMeasure = class PerformanceMeasure extends html.PerformanceEntry {
+dart.registerExtension(dart.global.PerformanceMark, html$.PerformanceMark);
+html$.PerformanceMeasure = class PerformanceMeasure extends html$.PerformanceEntry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.PerformanceMeasure, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceMeasure, [])})
+dart.setSignature(html$.PerformanceMeasure, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceMeasure, [])})
 });
-dart.registerExtension(dart.global.PerformanceMeasure, html.PerformanceMeasure);
+dart.registerExtension(dart.global.PerformanceMeasure, html$.PerformanceMeasure);
 dart.defineExtensionNames([
   'redirectCount',
   'type'
 ]);
-html.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
+html$.PerformanceNavigation = class PerformanceNavigation extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83279,8 +83282,8 @@
     return this.type;
   }
 };
-dart.setSignature(html.PerformanceNavigation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceNavigation, [])}),
+dart.setSignature(html$.PerformanceNavigation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceNavigation, [])}),
   fields: () => ({
     [dartx.redirectCount]: core.int,
     [dartx.type]: core.int
@@ -83292,15 +83295,15 @@
     TYPE_RESERVED: core.int
   })
 });
-html.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
-html.PerformanceNavigation.TYPE_NAVIGATE = 0;
-html.PerformanceNavigation.TYPE_RELOAD = 1;
-html.PerformanceNavigation.TYPE_RESERVED = 255;
-dart.registerExtension(dart.global.PerformanceNavigation, html.PerformanceNavigation);
+html$.PerformanceNavigation.TYPE_BACK_FORWARD = 2;
+html$.PerformanceNavigation.TYPE_NAVIGATE = 0;
+html$.PerformanceNavigation.TYPE_RELOAD = 1;
+html$.PerformanceNavigation.TYPE_RESERVED = 255;
+dart.registerExtension(dart.global.PerformanceNavigation, html$.PerformanceNavigation);
 dart.defineExtensionNames([
   'sourceFrame'
 ]);
-html.PerformanceRenderTiming = class PerformanceRenderTiming extends html.PerformanceEntry {
+html$.PerformanceRenderTiming = class PerformanceRenderTiming extends html$.PerformanceEntry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83308,11 +83311,11 @@
     return this.sourceFrame;
   }
 };
-dart.setSignature(html.PerformanceRenderTiming, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceRenderTiming, [])}),
+dart.setSignature(html$.PerformanceRenderTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceRenderTiming, [])}),
   fields: () => ({[dartx.sourceFrame]: core.int})
 });
-dart.registerExtension(dart.global.PerformanceRenderTiming, html.PerformanceRenderTiming);
+dart.registerExtension(dart.global.PerformanceRenderTiming, html$.PerformanceRenderTiming);
 dart.defineExtensionNames([
   'connectEnd',
   'connectStart',
@@ -83328,7 +83331,7 @@
   'secureConnectionStart',
   'workerStart'
 ]);
-html.PerformanceResourceTiming = class PerformanceResourceTiming extends html.PerformanceEntry {
+html$.PerformanceResourceTiming = class PerformanceResourceTiming extends html$.PerformanceEntry {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83372,8 +83375,8 @@
     return this.workerStart;
   }
 };
-dart.setSignature(html.PerformanceResourceTiming, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceResourceTiming, [])}),
+dart.setSignature(html$.PerformanceResourceTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceResourceTiming, [])}),
   fields: () => ({
     [dartx.connectEnd]: core.double,
     [dartx.connectStart]: core.double,
@@ -83390,7 +83393,7 @@
     [dartx.workerStart]: core.double
   })
 });
-dart.registerExtension(dart.global.PerformanceResourceTiming, html.PerformanceResourceTiming);
+dart.registerExtension(dart.global.PerformanceResourceTiming, html$.PerformanceResourceTiming);
 dart.defineExtensionNames([
   'connectEnd',
   'connectStart',
@@ -83414,7 +83417,7 @@
   'unloadEventEnd',
   'unloadEventStart'
 ]);
-html.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
+html$.PerformanceTiming = class PerformanceTiming extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83482,8 +83485,8 @@
     return this.unloadEventStart;
   }
 };
-dart.setSignature(html.PerformanceTiming, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PerformanceTiming, [])}),
+dart.setSignature(html$.PerformanceTiming, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PerformanceTiming, [])}),
   fields: () => ({
     [dartx.connectEnd]: core.int,
     [dartx.connectStart]: core.int,
@@ -83508,17 +83511,17 @@
     [dartx.unloadEventStart]: core.int
   })
 });
-dart.registerExtension(dart.global.PerformanceTiming, html.PerformanceTiming);
+dart.registerExtension(dart.global.PerformanceTiming, html$.PerformanceTiming);
 dart.defineExtensionNames([
   'registration'
 ]);
-html.PeriodicSyncEvent = class PeriodicSyncEvent extends html.ExtendableEvent {
+html$.PeriodicSyncEvent = class PeriodicSyncEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(type, init) {
     let init_1 = html_common.convertDartToNative_Dictionary(init);
-    return html.PeriodicSyncEvent._create_1(type, init_1);
+    return html$.PeriodicSyncEvent._create_1(type, init_1);
   }
   static _create_1(type, init) {
     return new self.PeriodicSyncEvent(type, init);
@@ -83527,16 +83530,16 @@
     return this.registration;
   }
 };
-dart.setSignature(html.PeriodicSyncEvent, {
+dart.setSignature(html$.PeriodicSyncEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PeriodicSyncEvent, []),
-    new: dart.definiteFunctionType(html.PeriodicSyncEvent, [core.String, core.Map])
+    _: dart.definiteFunctionType(html$.PeriodicSyncEvent, []),
+    new: dart.definiteFunctionType(html$.PeriodicSyncEvent, [core.String, core.Map])
   }),
-  fields: () => ({[dartx.registration]: html.PeriodicSyncRegistration}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
+  fields: () => ({[dartx.registration]: html$.PeriodicSyncRegistration}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.PeriodicSyncEvent, [dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.PeriodicSyncEvent, html.PeriodicSyncEvent);
+dart.registerExtension(dart.global.PeriodicSyncEvent, html$.PeriodicSyncEvent);
 const _register_1 = Symbol('_register_1');
 const _register_2 = Symbol('_register_2');
 dart.defineExtensionNames([
@@ -83546,7 +83549,7 @@
   'register',
   'minPossiblePeriod'
 ]);
-html.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
+html$.PeriodicSyncManager = class PeriodicSyncManager extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83577,8 +83580,8 @@
     return this.register.apply(this, args);
   }
 };
-dart.setSignature(html.PeriodicSyncManager, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PeriodicSyncManager, [])}),
+dart.setSignature(html$.PeriodicSyncManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncManager, [])}),
   fields: () => ({[dartx.minPossiblePeriod]: core.int}),
   methods: () => ({
     [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
@@ -83589,7 +83592,7 @@
     [_register_2]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.PeriodicSyncManager, html.PeriodicSyncManager);
+dart.registerExtension(dart.global.PeriodicSyncManager, html$.PeriodicSyncManager);
 dart.defineExtensionNames([
   'unregister',
   'minPeriod',
@@ -83597,7 +83600,7 @@
   'powerState',
   'tag'
 ]);
-html.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
+html$.PeriodicSyncRegistration = class PeriodicSyncRegistration extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83617,8 +83620,8 @@
     return this.unregister.apply(this, args);
   }
 };
-dart.setSignature(html.PeriodicSyncRegistration, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PeriodicSyncRegistration, [])}),
+dart.setSignature(html$.PeriodicSyncRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PeriodicSyncRegistration, [])}),
   fields: () => ({
     [dartx.minPeriod]: core.int,
     [dartx.networkState]: core.String,
@@ -83627,13 +83630,13 @@
   }),
   methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
 });
-dart.registerExtension(dart.global.PeriodicSyncRegistration, html.PeriodicSyncRegistration);
+dart.registerExtension(dart.global.PeriodicSyncRegistration, html$.PeriodicSyncRegistration);
 dart.defineExtensionNames([
   'onChange',
   'state',
   'status'
 ]);
-html.PermissionStatus = class PermissionStatus extends html.EventTarget {
+html$.PermissionStatus = class PermissionStatus extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83644,28 +83647,28 @@
     return this.status;
   }
   get [dartx.onChange]() {
-    return html.PermissionStatus.changeEvent.forTarget(this);
+    return html$.PermissionStatus.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.PermissionStatus, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PermissionStatus, [])}),
+dart.setSignature(html$.PermissionStatus, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PermissionStatus, [])}),
   fields: () => ({
     [dartx.state]: core.String,
     [dartx.status]: core.String
   }),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.PermissionStatus, {
+dart.defineLazy(html$.PermissionStatus, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.PermissionStatus, html.PermissionStatus);
+dart.registerExtension(dart.global.PermissionStatus, html$.PermissionStatus);
 dart.defineExtensionNames([
   'query'
 ]);
-html.Permissions = class Permissions extends _interceptors.Interceptor {
+html$.Permissions = class Permissions extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83673,12 +83676,12 @@
     return this.query.apply(this, args);
   }
 };
-dart.setSignature(html.Permissions, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Permissions, [])}),
+dart.setSignature(html$.Permissions, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Permissions, [])}),
   methods: () => ({[dartx.query]: dart.definiteFunctionType(async.Future, [core.Object])})
 });
-dart.registerExtension(dart.global.Permissions, html.Permissions);
-html.PictureElement = class PictureElement extends html.HtmlElement {
+dart.registerExtension(dart.global.Permissions, html$.Permissions);
+html$.PictureElement = class PictureElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83686,14 +83689,14 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html.PictureElement, 'created');
-dart.setSignature(html.PictureElement, {
+dart.defineNamedConstructor(html$.PictureElement, 'created');
+dart.setSignature(html$.PictureElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PictureElement, []),
-    created: dart.definiteFunctionType(html.PictureElement, [])
+    _: dart.definiteFunctionType(html$.PictureElement, []),
+    created: dart.definiteFunctionType(html$.PictureElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLPictureElement, html.PictureElement);
+dart.registerExtension(dart.global.HTMLPictureElement, html$.PictureElement);
 dart.defineExtensionNames([
   'item',
   'namedItem',
@@ -83702,7 +83705,7 @@
   'length',
   'name'
 ]);
-html.Plugin = class Plugin extends _interceptors.Interceptor {
+html$.Plugin = class Plugin extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83725,8 +83728,8 @@
     return this.namedItem.apply(this, args);
   }
 };
-dart.setSignature(html.Plugin, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Plugin, [])}),
+dart.setSignature(html$.Plugin, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Plugin, [])}),
   fields: () => ({
     [dartx.description]: core.String,
     [dartx.filename]: core.String,
@@ -83734,11 +83737,11 @@
     [dartx.name]: core.String
   }),
   methods: () => ({
-    [dartx.item]: dart.definiteFunctionType(html.MimeType, [core.int]),
-    [dartx.namedItem]: dart.definiteFunctionType(html.MimeType, [core.String])
+    [dartx.item]: dart.definiteFunctionType(html$.MimeType, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.MimeType, [core.String])
   })
 });
-dart.registerExtension(dart.global.Plugin, html.Plugin);
+dart.registerExtension(dart.global.Plugin, html$.Plugin);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -83752,7 +83755,7 @@
   'namedItem',
   'refresh'
 ]);
-html.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Plugin), html.ImmutableListMixin$(html.Plugin)) {
+html$.PluginArray = class PluginArray extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Plugin), html$.ImmutableListMixin$(html$.Plugin)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83804,26 +83807,26 @@
     return this.refresh.apply(this, args);
   }
 };
-html.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
-dart.setSignature(html.PluginArray, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PluginArray, [])}),
+html$.PluginArray[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfPlugin()];
+dart.setSignature(html$.PluginArray, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PluginArray, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Plugin, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Plugin]),
-    [dartx.item]: dart.definiteFunctionType(html.Plugin, [core.int]),
-    [dartx.namedItem]: dart.definiteFunctionType(html.Plugin, [core.String]),
+    [dartx._get]: dart.definiteFunctionType(html$.Plugin, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Plugin]),
+    [dartx.item]: dart.definiteFunctionType(html$.Plugin, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.Plugin, [core.String]),
     [dartx.refresh]: dart.definiteFunctionType(dart.void, [core.bool])
   })
 });
-dart.registerExtension(dart.global.PluginArray, html.PluginArray);
+dart.registerExtension(dart.global.PluginArray, html$.PluginArray);
 dart.defineExtensionNames([
   'createdCallback',
   'closeable',
   'message'
 ]);
-html.PluginPlaceholderElement = class PluginPlaceholderElement extends html.DivElement {
+html$.PluginPlaceholderElement = class PluginPlaceholderElement extends html$.DivElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83848,11 +83851,11 @@
     return this.createdCallback.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.PluginPlaceholderElement, 'created');
-dart.setSignature(html.PluginPlaceholderElement, {
+dart.defineNamedConstructor(html$.PluginPlaceholderElement, 'created');
+dart.setSignature(html$.PluginPlaceholderElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PluginPlaceholderElement, []),
-    created: dart.definiteFunctionType(html.PluginPlaceholderElement, [])
+    _: dart.definiteFunctionType(html$.PluginPlaceholderElement, []),
+    created: dart.definiteFunctionType(html$.PluginPlaceholderElement, [])
   }),
   fields: () => ({
     [dartx.closeable]: core.bool,
@@ -83860,7 +83863,7 @@
   }),
   methods: () => ({[dartx.createdCallback]: dart.definiteFunctionType(dart.void, [])})
 });
-dart.registerExtension(dart.global.PluginPlaceholderElement, html.PluginPlaceholderElement);
+dart.registerExtension(dart.global.PluginPlaceholderElement, html$.PluginPlaceholderElement);
 dart.defineExtensionNames([
   'height',
   'isPrimary',
@@ -83871,7 +83874,7 @@
   'tiltY',
   'width'
 ]);
-html.PointerEvent = class PointerEvent extends html.MouseEvent {
+html$.PointerEvent = class PointerEvent extends html$.MouseEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83879,9 +83882,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.PointerEvent._create_1(type, eventInitDict_1);
+      return html$.PointerEvent._create_1(type, eventInitDict_1);
     }
-    return html.PointerEvent._create_2(type);
+    return html$.PointerEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.PointerEvent(type, eventInitDict);
@@ -83914,10 +83917,10 @@
     return this.width;
   }
 };
-dart.setSignature(html.PointerEvent, {
+dart.setSignature(html$.PointerEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PointerEvent, []),
-    new: dart.definiteFunctionType(html.PointerEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.PointerEvent, []),
+    new: dart.definiteFunctionType(html$.PointerEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.height]: core.double,
@@ -83930,16 +83933,16 @@
     [dartx.width]: core.double
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PointerEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PointerEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PointerEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.PointerEvent, html.PointerEvent);
+dart.registerExtension(dart.global.PointerEvent, html$.PointerEvent);
 dart.defineExtensionNames([
   'state'
 ]);
-html.PopStateEvent = class PopStateEvent extends html.Event {
+html$.PopStateEvent = class PopStateEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83947,9 +83950,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.PopStateEvent._create_1(type, eventInitDict_1);
+      return html$.PopStateEvent._create_1(type, eventInitDict_1);
     }
-    return html.PopStateEvent._create_2(type);
+    return html$.PopStateEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.PopStateEvent(type, eventInitDict);
@@ -83964,26 +83967,26 @@
     return this.state;
   }
 };
-dart.setSignature(html.PopStateEvent, {
+dart.setSignature(html$.PopStateEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PopStateEvent, []),
-    new: dart.definiteFunctionType(html.PopStateEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.PopStateEvent, []),
+    new: dart.definiteFunctionType(html$.PopStateEvent, [core.String], [core.Map])
   }),
   fields: () => ({[_get_state]: dart.dynamic}),
   getters: () => ({[dartx.state]: dart.definiteFunctionType(dart.dynamic, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PopStateEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PopStateEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PopStateEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.PopStateEvent, html.PopStateEvent);
-html._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html.Geoposition]));
+dart.registerExtension(dart.global.PopStateEvent, html$.PopStateEvent);
+html$._PositionCallback = dart.typedef('_PositionCallback', () => dart.functionType(dart.void, [html$.Geoposition]));
 dart.defineExtensionNames([
   'code',
   'message'
 ]);
-html.PositionError = class PositionError extends _interceptors.Interceptor {
+html$.PositionError = class PositionError extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -83994,8 +83997,8 @@
     return this.message;
   }
 };
-dart.setSignature(html.PositionError, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PositionError, [])}),
+dart.setSignature(html$.PositionError, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PositionError, [])}),
   fields: () => ({
     [dartx.code]: core.int,
     [dartx.message]: core.String
@@ -84006,17 +84009,17 @@
     TIMEOUT: core.int
   })
 });
-html.PositionError.PERMISSION_DENIED = 1;
-html.PositionError.POSITION_UNAVAILABLE = 2;
-html.PositionError.TIMEOUT = 3;
-dart.registerExtension(dart.global.PositionError, html.PositionError);
-html._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html.PositionError]));
+html$.PositionError.PERMISSION_DENIED = 1;
+html$.PositionError.POSITION_UNAVAILABLE = 2;
+html$.PositionError.TIMEOUT = 3;
+dart.registerExtension(dart.global.PositionError, html$.PositionError);
+html$._PositionErrorCallback = dart.typedef('_PositionErrorCallback', () => dart.functionType(dart.void, [html$.PositionError]));
 dart.defineExtensionNames([
   'getImmediateState',
   'getState',
   'resetSensor'
 ]);
-html.PositionSensorVRDevice = class PositionSensorVRDevice extends html.VRDevice {
+html$.PositionSensorVRDevice = class PositionSensorVRDevice extends html$.VRDevice {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84030,42 +84033,42 @@
     return this.resetSensor.apply(this, args);
   }
 };
-dart.setSignature(html.PositionSensorVRDevice, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PositionSensorVRDevice, [])}),
+dart.setSignature(html$.PositionSensorVRDevice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PositionSensorVRDevice, [])}),
   methods: () => ({
-    [dartx.getImmediateState]: dart.definiteFunctionType(html.VRPositionState, []),
-    [dartx.getState]: dart.definiteFunctionType(html.VRPositionState, []),
+    [dartx.getImmediateState]: dart.definiteFunctionType(html$.VRPositionState, []),
+    [dartx.getState]: dart.definiteFunctionType(html$.VRPositionState, []),
     [dartx.resetSensor]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.PositionSensorVRDevice, html.PositionSensorVRDevice);
-html.PreElement = class PreElement extends html.HtmlElement {
+dart.registerExtension(dart.global.PositionSensorVRDevice, html$.PositionSensorVRDevice);
+html$.PreElement = class PreElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.PreElement._check(html.document[dartx.createElement]("pre"));
+    return html$.PreElement._check(html$.document[dartx.createElement]("pre"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.PreElement, 'created');
-dart.setSignature(html.PreElement, {
+dart.defineNamedConstructor(html$.PreElement, 'created');
+dart.setSignature(html$.PreElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PreElement, []),
-    new: dart.definiteFunctionType(html.PreElement, []),
-    created: dart.definiteFunctionType(html.PreElement, [])
+    _: dart.definiteFunctionType(html$.PreElement, []),
+    new: dart.definiteFunctionType(html$.PreElement, []),
+    created: dart.definiteFunctionType(html$.PreElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLPreElement, html.PreElement);
+dart.registerExtension(dart.global.HTMLPreElement, html$.PreElement);
 dart.defineExtensionNames([
   'getAvailability',
   'joinSession',
   'startSession',
   'session'
 ]);
-html.Presentation = class Presentation extends html.EventTarget {
+html$.Presentation = class Presentation extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84082,21 +84085,21 @@
     return this.startSession.apply(this, args);
   }
 };
-dart.setSignature(html.Presentation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Presentation, [])}),
-  fields: () => ({[dartx.session]: html.PresentationSession}),
+dart.setSignature(html$.Presentation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Presentation, [])}),
+  fields: () => ({[dartx.session]: html$.PresentationSession}),
   methods: () => ({
     [dartx.getAvailability]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.joinSession]: dart.definiteFunctionType(async.Future, [core.String, core.String]),
     [dartx.startSession]: dart.definiteFunctionType(async.Future, [core.String])
   })
 });
-dart.registerExtension(dart.global.Presentation, html.Presentation);
+dart.registerExtension(dart.global.Presentation, html$.Presentation);
 dart.defineExtensionNames([
   'onChange',
   'value'
 ]);
-html.PresentationAvailability = class PresentationAvailability extends html.EventTarget {
+html$.PresentationAvailability = class PresentationAvailability extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84104,21 +84107,21 @@
     return this.value;
   }
   get [dartx.onChange]() {
-    return html.PresentationAvailability.changeEvent.forTarget(this);
+    return html$.PresentationAvailability.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.PresentationAvailability, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PresentationAvailability, [])}),
+dart.setSignature(html$.PresentationAvailability, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationAvailability, [])}),
   fields: () => ({[dartx.value]: core.bool}),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.PresentationAvailability, {
+dart.defineLazy(html$.PresentationAvailability, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.PresentationAvailability, html.PresentationAvailability);
+dart.registerExtension(dart.global.PresentationAvailability, html$.PresentationAvailability);
 dart.defineExtensionNames([
   'close',
   'send',
@@ -84127,7 +84130,7 @@
   'id',
   'state'
 ]);
-html.PresentationSession = class PresentationSession extends html.EventTarget {
+html$.PresentationSession = class PresentationSession extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84150,34 +84153,34 @@
     return this.send.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.PresentationSession.messageEvent.forTarget(this);
+    return html$.PresentationSession.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.PresentationSession, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PresentationSession, [])}),
+dart.setSignature(html$.PresentationSession, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PresentationSession, [])}),
   fields: () => ({
     [dartx.binaryType]: core.String,
     [dartx.id]: core.String,
     [dartx.state]: core.String
   }),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
     [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic])
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.PresentationSession, {
+dart.defineLazy(html$.PresentationSession, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.PresentationSession, html.PresentationSession);
+dart.registerExtension(dart.global.PresentationSession, html$.PresentationSession);
 dart.defineExtensionNames([
   'sheet',
   'target'
 ]);
-html.ProcessingInstruction = class ProcessingInstruction extends html.CharacterData {
+html$.ProcessingInstruction = class ProcessingInstruction extends html$.CharacterData {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84188,26 +84191,26 @@
     return this.target;
   }
 };
-dart.setSignature(html.ProcessingInstruction, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ProcessingInstruction, [])}),
+dart.setSignature(html$.ProcessingInstruction, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ProcessingInstruction, [])}),
   fields: () => ({
-    [dartx.sheet]: html.StyleSheet,
+    [dartx.sheet]: html$.StyleSheet,
     [dartx.target]: core.String
   })
 });
-dart.registerExtension(dart.global.ProcessingInstruction, html.ProcessingInstruction);
+dart.registerExtension(dart.global.ProcessingInstruction, html$.ProcessingInstruction);
 dart.defineExtensionNames([
   'labels',
   'max',
   'position',
   'value'
 ]);
-html.ProgressElement = class ProgressElement extends html.HtmlElement {
+html$.ProgressElement = class ProgressElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ProgressElement._check(html.document[dartx.createElement]("progress"));
+    return html$.ProgressElement._check(html$.document[dartx.createElement]("progress"));
   }
   created() {
     this[dartx.labels] = null;
@@ -84217,7 +84220,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('progress');
+    return html$.Element.isTagSupported('progress');
   }
   get [dartx.labels]() {
     return this.labels;
@@ -84238,12 +84241,12 @@
     this.value = value;
   }
 };
-dart.defineNamedConstructor(html.ProgressElement, 'created');
-dart.setSignature(html.ProgressElement, {
+dart.defineNamedConstructor(html$.ProgressElement, 'created');
+dart.setSignature(html$.ProgressElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ProgressElement, []),
-    new: dart.definiteFunctionType(html.ProgressElement, []),
-    created: dart.definiteFunctionType(html.ProgressElement, [])
+    _: dart.definiteFunctionType(html$.ProgressElement, []),
+    new: dart.definiteFunctionType(html$.ProgressElement, []),
+    created: dart.definiteFunctionType(html$.ProgressElement, [])
   }),
   fields: () => ({
     [dartx.labels]: ListOfNode(),
@@ -84253,13 +84256,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLProgressElement, html.ProgressElement);
+dart.registerExtension(dart.global.HTMLProgressElement, html$.ProgressElement);
 dart.defineExtensionNames([
   'lengthComputable',
   'loaded',
   'total'
 ]);
-html.ProgressEvent = class ProgressEvent extends html.Event {
+html$.ProgressEvent = class ProgressEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84267,9 +84270,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ProgressEvent._create_1(type, eventInitDict_1);
+      return html$.ProgressEvent._create_1(type, eventInitDict_1);
     }
-    return html.ProgressEvent._create_2(type);
+    return html$.ProgressEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ProgressEvent(type, eventInitDict);
@@ -84287,10 +84290,10 @@
     return this.total;
   }
 };
-dart.setSignature(html.ProgressEvent, {
+dart.setSignature(html$.ProgressEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ProgressEvent, []),
-    new: dart.definiteFunctionType(html.ProgressEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ProgressEvent, []),
+    new: dart.definiteFunctionType(html$.ProgressEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.lengthComputable]: core.bool,
@@ -84298,17 +84301,17 @@
     [dartx.total]: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ProgressEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ProgressEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ProgressEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ProgressEvent, html.ProgressEvent);
+dart.registerExtension(dart.global.ProgressEvent, html$.ProgressEvent);
 dart.defineExtensionNames([
   'promise',
   'reason'
 ]);
-html.PromiseRejectionEvent = class PromiseRejectionEvent extends html.Event {
+html$.PromiseRejectionEvent = class PromiseRejectionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84316,9 +84319,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.PromiseRejectionEvent._create_1(type, eventInitDict_1);
+      return html$.PromiseRejectionEvent._create_1(type, eventInitDict_1);
     }
-    return html.PromiseRejectionEvent._create_2(type);
+    return html$.PromiseRejectionEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.PromiseRejectionEvent(type, eventInitDict);
@@ -84333,26 +84336,26 @@
     return this.reason;
   }
 };
-dart.setSignature(html.PromiseRejectionEvent, {
+dart.setSignature(html$.PromiseRejectionEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PromiseRejectionEvent, []),
-    new: dart.definiteFunctionType(html.PromiseRejectionEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.PromiseRejectionEvent, []),
+    new: dart.definiteFunctionType(html$.PromiseRejectionEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.promise]: async.Future,
     [dartx.reason]: core.Object
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PromiseRejectionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PromiseRejectionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.PromiseRejectionEvent, html.PromiseRejectionEvent);
+dart.registerExtension(dart.global.PromiseRejectionEvent, html$.PromiseRejectionEvent);
 dart.defineExtensionNames([
   'data'
 ]);
-html.PushEvent = class PushEvent extends html.ExtendableEvent {
+html$.PushEvent = class PushEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84360,9 +84363,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.PushEvent._create_1(type, eventInitDict_1);
+      return html$.PushEvent._create_1(type, eventInitDict_1);
     }
-    return html.PushEvent._create_2(type);
+    return html$.PushEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.PushEvent(type, eventInitDict);
@@ -84374,19 +84377,19 @@
     return this.data;
   }
 };
-dart.setSignature(html.PushEvent, {
+dart.setSignature(html$.PushEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PushEvent, []),
-    new: dart.definiteFunctionType(html.PushEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.PushEvent, []),
+    new: dart.definiteFunctionType(html$.PushEvent, [core.String], [core.Map])
   }),
-  fields: () => ({[dartx.data]: html.PushMessageData}),
+  fields: () => ({[dartx.data]: html$.PushMessageData}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.PushEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.PushEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.PushEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.PushEvent, html.PushEvent);
+dart.registerExtension(dart.global.PushEvent, html$.PushEvent);
 const _permissionState_1 = Symbol('_permissionState_1');
 const _permissionState_2 = Symbol('_permissionState_2');
 const _subscribe_1 = Symbol('_subscribe_1');
@@ -84396,7 +84399,7 @@
   'permissionState',
   'subscribe'
 ]);
-html.PushManager = class PushManager extends _interceptors.Interceptor {
+html$.PushManager = class PushManager extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84432,8 +84435,8 @@
     return this.subscribe.apply(this, args);
   }
 };
-dart.setSignature(html.PushManager, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PushManager, [])}),
+dart.setSignature(html$.PushManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PushManager, [])}),
   methods: () => ({
     [dartx.getSubscription]: dart.definiteFunctionType(async.Future, []),
     [dartx.permissionState]: dart.definiteFunctionType(async.Future, [], [core.Map]),
@@ -84444,19 +84447,19 @@
     [_subscribe_2]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.PushManager, html.PushManager);
+dart.registerExtension(dart.global.PushManager, html$.PushManager);
 dart.defineExtensionNames([
   'arrayBuffer',
   'blob',
   'json',
   'text'
 ]);
-html.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
+html$.PushMessageData = class PushMessageData extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(message) {
-    return html.PushMessageData._create_1(message);
+    return html$.PushMessageData._create_1(message);
   }
   static _create_1(message) {
     return new self.PushMessageData(message);
@@ -84474,26 +84477,26 @@
     return this.text.apply(this, args);
   }
 };
-dart.setSignature(html.PushMessageData, {
+dart.setSignature(html$.PushMessageData, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.PushMessageData, []),
-    new: dart.definiteFunctionType(html.PushMessageData, [core.String])
+    _: dart.definiteFunctionType(html$.PushMessageData, []),
+    new: dart.definiteFunctionType(html$.PushMessageData, [core.String])
   }),
   methods: () => ({
     [dartx.arrayBuffer]: dart.definiteFunctionType(typed_data.ByteBuffer, []),
-    [dartx.blob]: dart.definiteFunctionType(html.Blob, []),
+    [dartx.blob]: dart.definiteFunctionType(html$.Blob, []),
     [dartx.json]: dart.definiteFunctionType(core.Object, []),
     [dartx.text]: dart.definiteFunctionType(core.String, [])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.PushMessageData, [dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.PushMessageData, [dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.PushMessageData, html.PushMessageData);
+dart.registerExtension(dart.global.PushMessageData, html$.PushMessageData);
 dart.defineExtensionNames([
   'unsubscribe',
   'endpoint'
 ]);
-html.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
+html$.PushSubscription = class PushSubscription extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84504,21 +84507,21 @@
     return this.unsubscribe.apply(this, args);
   }
 };
-dart.setSignature(html.PushSubscription, {
-  constructors: () => ({_: dart.definiteFunctionType(html.PushSubscription, [])}),
+dart.setSignature(html$.PushSubscription, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.PushSubscription, [])}),
   fields: () => ({[dartx.endpoint]: core.String}),
   methods: () => ({[dartx.unsubscribe]: dart.definiteFunctionType(async.Future, [])})
 });
-dart.registerExtension(dart.global.PushSubscription, html.PushSubscription);
+dart.registerExtension(dart.global.PushSubscription, html$.PushSubscription);
 dart.defineExtensionNames([
   'cite'
 ]);
-html.QuoteElement = class QuoteElement extends html.HtmlElement {
+html$.QuoteElement = class QuoteElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.QuoteElement._check(html.document[dartx.createElement]("q"));
+    return html$.QuoteElement._check(html$.document[dartx.createElement]("q"));
   }
   created() {
     this[dartx.cite] = null;
@@ -84531,19 +84534,19 @@
     this.cite = value;
   }
 };
-dart.defineNamedConstructor(html.QuoteElement, 'created');
-dart.setSignature(html.QuoteElement, {
+dart.defineNamedConstructor(html$.QuoteElement, 'created');
+dart.setSignature(html$.QuoteElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.QuoteElement, []),
-    new: dart.definiteFunctionType(html.QuoteElement, []),
-    created: dart.definiteFunctionType(html.QuoteElement, [])
+    _: dart.definiteFunctionType(html$.QuoteElement, []),
+    new: dart.definiteFunctionType(html$.QuoteElement, []),
+    created: dart.definiteFunctionType(html$.QuoteElement, [])
   }),
   fields: () => ({[dartx.cite]: core.String})
 });
-dart.registerExtension(dart.global.HTMLQuoteElement, html.QuoteElement);
-html._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
-html._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html.RtcSessionDescription]));
-html.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html.RtcStatsResponse]));
+dart.registerExtension(dart.global.HTMLQuoteElement, html$.QuoteElement);
+html$._RtcErrorCallback = dart.typedef('_RtcErrorCallback', () => dart.functionType(dart.void, [core.String]));
+html$._RtcSessionDescriptionCallback = dart.typedef('_RtcSessionDescriptionCallback', () => dart.functionType(dart.void, [html$.RtcSessionDescription]));
+html$.RtcStatsCallback = dart.typedef('RtcStatsCallback', () => dart.functionType(dart.void, [html$.RtcStatsResponse]));
 dart.defineExtensionNames([
   'cloneContents',
   'cloneRange',
@@ -84575,12 +84578,12 @@
   'startContainer',
   'startOffset'
 ]);
-html.Range = class Range extends _interceptors.Interceptor {
+html$.Range = class Range extends _interceptors.Interceptor {
   static new() {
-    return html.document[dartx.createRange]();
+    return html$.document[dartx.createRange]();
   }
   static fromPoint(point) {
-    return html.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
+    return html$.document[_caretRangeFromPoint](dart.asInt(point.x), dart.asInt(point.y));
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -84676,44 +84679,44 @@
     return "createContextualFragment" in window.Range.prototype;
   }
 };
-dart.setSignature(html.Range, {
+dart.setSignature(html$.Range, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.Range, []),
-    fromPoint: dart.definiteFunctionType(html.Range, [PointOfnum()]),
-    _: dart.definiteFunctionType(html.Range, [])
+    new: dart.definiteFunctionType(html$.Range, []),
+    fromPoint: dart.definiteFunctionType(html$.Range, [PointOfnum()]),
+    _: dart.definiteFunctionType(html$.Range, [])
   }),
   fields: () => ({
     [dartx.collapsed]: core.bool,
-    [dartx.commonAncestorContainer]: html.Node,
-    [dartx.endContainer]: html.Node,
+    [dartx.commonAncestorContainer]: html$.Node,
+    [dartx.endContainer]: html$.Node,
     [dartx.endOffset]: core.int,
-    [dartx.startContainer]: html.Node,
+    [dartx.startContainer]: html$.Node,
     [dartx.startOffset]: core.int
   }),
   methods: () => ({
-    [dartx.cloneContents]: dart.definiteFunctionType(html.DocumentFragment, []),
-    [dartx.cloneRange]: dart.definiteFunctionType(html.Range, []),
+    [dartx.cloneContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
+    [dartx.cloneRange]: dart.definiteFunctionType(html$.Range, []),
     [dartx.collapse]: dart.definiteFunctionType(dart.void, [], [core.bool]),
-    [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html.Range]),
-    [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html.Node, core.int]),
-    [dartx.createContextualFragment]: dart.definiteFunctionType(html.DocumentFragment, [core.String]),
+    [dartx.compareBoundaryPoints]: dart.definiteFunctionType(core.int, [core.int, html$.Range]),
+    [dartx.comparePoint]: dart.definiteFunctionType(core.int, [html$.Node, core.int]),
+    [dartx.createContextualFragment]: dart.definiteFunctionType(html$.DocumentFragment, [core.String]),
     [dartx.deleteContents]: dart.definiteFunctionType(dart.void, []),
     [dartx.detach]: dart.definiteFunctionType(dart.void, []),
     [dartx.expand]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.extractContents]: dart.definiteFunctionType(html.DocumentFragment, []),
+    [dartx.extractContents]: dart.definiteFunctionType(html$.DocumentFragment, []),
     [dartx.getBoundingClientRect]: dart.definiteFunctionType(math.Rectangle$(core.num), []),
     [dartx.getClientRects]: dart.definiteFunctionType(core.List$(math.Rectangle$(core.num)), []),
-    [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html.Node, core.int]),
-    [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html.Node, core.int]),
-    [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.setStart]: dart.definiteFunctionType(dart.void, [html.Node, core.int]),
-    [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html.Node])
+    [dartx.insertNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.isPointInRange]: dart.definiteFunctionType(core.bool, [html$.Node, core.int]),
+    [dartx.selectNode]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.selectNodeContents]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setEnd]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
+    [dartx.setEndAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setEndBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setStart]: dart.definiteFunctionType(dart.void, [html$.Node, core.int]),
+    [dartx.setStartAfter]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setStartBefore]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.surroundContents]: dart.definiteFunctionType(dart.void, [html$.Node])
   }),
   sfields: () => ({
     END_TO_END: core.int,
@@ -84723,16 +84726,16 @@
   }),
   sgetters: () => ({supportsCreateContextualFragment: dart.definiteFunctionType(core.bool, [])})
 });
-html.Range.END_TO_END = 2;
-html.Range.END_TO_START = 3;
-html.Range.START_TO_END = 1;
-html.Range.START_TO_START = 0;
-dart.registerExtension(dart.global.Range, html.Range);
+html$.Range.END_TO_END = 2;
+html$.Range.END_TO_START = 3;
+html$.Range.START_TO_END = 1;
+html$.Range.START_TO_START = 0;
+dart.registerExtension(dart.global.Range, html$.Range);
 dart.defineExtensionNames([
   'cancel',
   'getReader'
 ]);
-html.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
+html$.ReadableByteStream = class ReadableByteStream extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84743,21 +84746,21 @@
     return this.getReader.apply(this, args);
   }
 };
-dart.setSignature(html.ReadableByteStream, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ReadableByteStream, [])}),
+dart.setSignature(html$.ReadableByteStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStream, [])}),
   methods: () => ({
     [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-    [dartx.getReader]: dart.definiteFunctionType(html.ReadableByteStreamReader, [])
+    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])
   })
 });
-dart.registerExtension(dart.global.ReadableByteStream, html.ReadableByteStream);
+dart.registerExtension(dart.global.ReadableByteStream, html$.ReadableByteStream);
 dart.defineExtensionNames([
   'cancel',
   'read',
   'releaseLock',
   'closed'
 ]);
-html.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
+html$.ReadableByteStreamReader = class ReadableByteStreamReader extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84774,8 +84777,8 @@
     return this.releaseLock.apply(this, args);
   }
 };
-dart.setSignature(html.ReadableByteStreamReader, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ReadableByteStreamReader, [])}),
+dart.setSignature(html$.ReadableByteStreamReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableByteStreamReader, [])}),
   fields: () => ({[dartx.closed]: async.Future}),
   methods: () => ({
     [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
@@ -84783,12 +84786,12 @@
     [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.ReadableByteStreamReader, html.ReadableByteStreamReader);
+dart.registerExtension(dart.global.ReadableByteStreamReader, html$.ReadableByteStreamReader);
 dart.defineExtensionNames([
   'cancel',
   'getReader'
 ]);
-html.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
+html$.ReadableStream = class ReadableStream extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84799,21 +84802,21 @@
     return this.getReader.apply(this, args);
   }
 };
-dart.setSignature(html.ReadableStream, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ReadableStream, [])}),
+dart.setSignature(html$.ReadableStream, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStream, [])}),
   methods: () => ({
     [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
-    [dartx.getReader]: dart.definiteFunctionType(html.ReadableStreamReader, [])
+    [dartx.getReader]: dart.definiteFunctionType(html$.ReadableStreamReader, [])
   })
 });
-dart.registerExtension(dart.global.ReadableStream, html.ReadableStream);
+dart.registerExtension(dart.global.ReadableStream, html$.ReadableStream);
 dart.defineExtensionNames([
   'cancel',
   'read',
   'releaseLock',
   'closed'
 ]);
-html.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
+html$.ReadableStreamReader = class ReadableStreamReader extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84830,8 +84833,8 @@
     return this.releaseLock.apply(this, args);
   }
 };
-dart.setSignature(html.ReadableStreamReader, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ReadableStreamReader, [])}),
+dart.setSignature(html$.ReadableStreamReader, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ReadableStreamReader, [])}),
   fields: () => ({[dartx.closed]: async.Future}),
   methods: () => ({
     [dartx.cancel]: dart.definiteFunctionType(async.Future, [], [core.Object]),
@@ -84839,11 +84842,11 @@
     [dartx.releaseLock]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.ReadableStreamReader, html.ReadableStreamReader);
+dart.registerExtension(dart.global.ReadableStreamReader, html$.ReadableStreamReader);
 dart.defineExtensionNames([
   'relatedTarget'
 ]);
-html.RelatedEvent = class RelatedEvent extends html.Event {
+html$.RelatedEvent = class RelatedEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84851,9 +84854,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.RelatedEvent._create_1(type, eventInitDict_1);
+      return html$.RelatedEvent._create_1(type, eventInitDict_1);
     }
-    return html.RelatedEvent._create_2(type);
+    return html$.RelatedEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.RelatedEvent(type, eventInitDict);
@@ -84862,31 +84865,31 @@
     return new self.RelatedEvent(type);
   }
   get [dartx.relatedTarget]() {
-    return html._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
+    return html$._convertNativeToDart_EventTarget(this[_get_relatedTarget]);
   }
   get [_get_relatedTarget]() {
     return this.relatedTarget;
   }
 };
-dart.setSignature(html.RelatedEvent, {
+dart.setSignature(html$.RelatedEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.RelatedEvent, []),
-    new: dart.definiteFunctionType(html.RelatedEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.RelatedEvent, []),
+    new: dart.definiteFunctionType(html$.RelatedEvent, [core.String], [core.Map])
   }),
   fields: () => ({[_get_relatedTarget]: dart.dynamic}),
-  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html.EventTarget, [])}),
+  getters: () => ({[dartx.relatedTarget]: dart.definiteFunctionType(html$.EventTarget, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.RelatedEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.RelatedEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.RelatedEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.RelatedEvent, html.RelatedEvent);
-html.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
+dart.registerExtension(dart.global.RelatedEvent, html$.RelatedEvent);
+html$.RequestAnimationFrameCallback = dart.typedef('RequestAnimationFrameCallback', () => dart.functionType(dart.void, [core.num]));
 dart.defineExtensionNames([
   'url'
 ]);
-html.ResourceProgressEvent = class ResourceProgressEvent extends html.ProgressEvent {
+html$.ResourceProgressEvent = class ResourceProgressEvent extends html$.ProgressEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84894,11 +84897,11 @@
     return this.url;
   }
 };
-dart.setSignature(html.ResourceProgressEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ResourceProgressEvent, [])}),
+dart.setSignature(html$.ResourceProgressEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ResourceProgressEvent, [])}),
   fields: () => ({[dartx.url]: core.String})
 });
-dart.registerExtension(dart.global.ResourceProgressEvent, html.ResourceProgressEvent);
+dart.registerExtension(dart.global.ResourceProgressEvent, html$.ResourceProgressEvent);
 dart.defineExtensionNames([
   'close',
   'send',
@@ -84922,7 +84925,7 @@
   'readyState',
   'reliable'
 ]);
-html.RtcDataChannel = class RtcDataChannel extends html.EventTarget {
+html$.RtcDataChannel = class RtcDataChannel extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -84981,20 +84984,20 @@
     return this.send.apply(this, args);
   }
   get [dartx.onClose]() {
-    return html.RtcDataChannel.closeEvent.forTarget(this);
+    return html$.RtcDataChannel.closeEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.RtcDataChannel.errorEvent.forTarget(this);
+    return html$.RtcDataChannel.errorEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.RtcDataChannel.messageEvent.forTarget(this);
+    return html$.RtcDataChannel.messageEvent.forTarget(this);
   }
   get [dartx.onOpen]() {
-    return html.RtcDataChannel.openEvent.forTarget(this);
+    return html$.RtcDataChannel.openEvent.forTarget(this);
   }
 };
-dart.setSignature(html.RtcDataChannel, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcDataChannel, [])}),
+dart.setSignature(html$.RtcDataChannel, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannel, [])}),
   fields: () => ({
     [dartx.binaryType]: core.String,
     [dartx.bufferedAmount]: core.int,
@@ -85009,15 +85012,15 @@
     [dartx.reliable]: core.bool
   }),
   getters: () => ({
-    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), []),
-    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
     [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html.Blob]),
+    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
     [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
     [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
@@ -85029,7 +85032,7 @@
     openEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(html.RtcDataChannel, {
+dart.defineLazy(html$.RtcDataChannel, {
   get closeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('close'));
   },
@@ -85043,12 +85046,12 @@
     return dart.const(new (EventStreamProviderOfEvent())('open'));
   }
 });
-dart.registerExtension(dart.global.RTCDataChannel, html.RtcDataChannel);
-dart.registerExtension(dart.global.DataChannel, html.RtcDataChannel);
+dart.registerExtension(dart.global.RTCDataChannel, html$.RtcDataChannel);
+dart.registerExtension(dart.global.DataChannel, html$.RtcDataChannel);
 dart.defineExtensionNames([
   'channel'
 ]);
-html.RtcDataChannelEvent = class RtcDataChannelEvent extends html.Event {
+html$.RtcDataChannelEvent = class RtcDataChannelEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85056,11 +85059,11 @@
     return this.channel;
   }
 };
-dart.setSignature(html.RtcDataChannelEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcDataChannelEvent, [])}),
-  fields: () => ({[dartx.channel]: html.RtcDataChannel})
+dart.setSignature(html$.RtcDataChannelEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDataChannelEvent, [])}),
+  fields: () => ({[dartx.channel]: html$.RtcDataChannel})
 });
-dart.registerExtension(dart.global.RTCDataChannelEvent, html.RtcDataChannelEvent);
+dart.registerExtension(dart.global.RTCDataChannelEvent, html$.RtcDataChannelEvent);
 dart.defineExtensionNames([
   'insertDtmf',
   'onToneChange',
@@ -85070,7 +85073,7 @@
   'toneBuffer',
   'track'
 ]);
-html.RtcDtmfSender = class RtcDtmfSender extends html.EventTarget {
+html$.RtcDtmfSender = class RtcDtmfSender extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85093,38 +85096,38 @@
     return this.insertDTMF.apply(this, args);
   }
   get [dartx.onToneChange]() {
-    return html.RtcDtmfSender.toneChangeEvent.forTarget(this);
+    return html$.RtcDtmfSender.toneChangeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.RtcDtmfSender, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcDtmfSender, [])}),
+dart.setSignature(html$.RtcDtmfSender, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcDtmfSender, [])}),
   fields: () => ({
     [dartx.canInsertDtmf]: core.bool,
     [dartx.duration]: core.int,
     [dartx.interToneGap]: core.int,
     [dartx.toneBuffer]: core.String,
-    [dartx.track]: html.MediaStreamTrack
+    [dartx.track]: html$.MediaStreamTrack
   }),
-  getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html.RtcDtmfToneChangeEvent), [])}),
+  getters: () => ({[dartx.onToneChange]: dart.definiteFunctionType(async.Stream$(html$.RtcDtmfToneChangeEvent), [])}),
   methods: () => ({[dartx.insertDtmf]: dart.definiteFunctionType(dart.void, [core.String], [core.int, core.int])}),
   sfields: () => ({toneChangeEvent: EventStreamProviderOfRtcDtmfToneChangeEvent()})
 });
-dart.defineLazy(html.RtcDtmfSender, {
+dart.defineLazy(html$.RtcDtmfSender, {
   get toneChangeEvent() {
     return dart.const(new (EventStreamProviderOfRtcDtmfToneChangeEvent())('tonechange'));
   }
 });
-dart.registerExtension(dart.global.RTCDTMFSender, html.RtcDtmfSender);
+dart.registerExtension(dart.global.RTCDTMFSender, html$.RtcDtmfSender);
 dart.defineExtensionNames([
   'tone'
 ]);
-html.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html.Event {
+html$.RtcDtmfToneChangeEvent = class RtcDtmfToneChangeEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(type, eventInitDict) {
     let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-    return html.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
+    return html$.RtcDtmfToneChangeEvent._create_1(type, eventInitDict_1);
   }
   static _create_1(type, eventInitDict) {
     return new RTCDTMFToneChangeEvent(type, eventInitDict);
@@ -85133,22 +85136,22 @@
     return this.tone;
   }
 };
-dart.setSignature(html.RtcDtmfToneChangeEvent, {
+dart.setSignature(html$.RtcDtmfToneChangeEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.RtcDtmfToneChangeEvent, []),
-    new: dart.definiteFunctionType(html.RtcDtmfToneChangeEvent, [core.String, core.Map])
+    _: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, []),
+    new: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [core.String, core.Map])
   }),
   fields: () => ({[dartx.tone]: core.String}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.RtcDtmfToneChangeEvent, [dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html.RtcDtmfToneChangeEvent);
+dart.registerExtension(dart.global.RTCDTMFToneChangeEvent, html$.RtcDtmfToneChangeEvent);
 dart.defineExtensionNames([
   'candidate',
   'sdpMLineIndex',
   'sdpMid'
 ]);
-html.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
+html$.RtcIceCandidate = class RtcIceCandidate extends _interceptors.Interceptor {
   static new(dictionary) {
     let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCIceCandidate` : 'RTCIceCandidate'];
     return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
@@ -85175,10 +85178,10 @@
     this.sdpMid = value;
   }
 };
-dart.setSignature(html.RtcIceCandidate, {
+dart.setSignature(html$.RtcIceCandidate, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.RtcIceCandidate, [core.Map]),
-    _: dart.definiteFunctionType(html.RtcIceCandidate, [])
+    new: dart.definiteFunctionType(html$.RtcIceCandidate, [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcIceCandidate, [])
   }),
   fields: () => ({
     [dartx.candidate]: core.String,
@@ -85186,12 +85189,12 @@
     [dartx.sdpMid]: core.String
   })
 });
-dart.registerExtension(dart.global.RTCIceCandidate, html.RtcIceCandidate);
-dart.registerExtension(dart.global.mozRTCIceCandidate, html.RtcIceCandidate);
+dart.registerExtension(dart.global.RTCIceCandidate, html$.RtcIceCandidate);
+dart.registerExtension(dart.global.mozRTCIceCandidate, html$.RtcIceCandidate);
 dart.defineExtensionNames([
   'candidate'
 ]);
-html.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html.Event {
+html$.RtcIceCandidateEvent = class RtcIceCandidateEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85199,12 +85202,12 @@
     return this.candidate;
   }
 };
-dart.setSignature(html.RtcIceCandidateEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcIceCandidateEvent, [])}),
-  fields: () => ({[dartx.candidate]: html.RtcIceCandidate})
+dart.setSignature(html$.RtcIceCandidateEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcIceCandidateEvent, [])}),
+  fields: () => ({[dartx.candidate]: html$.RtcIceCandidate})
 });
-dart.registerExtension(dart.global.RTCIceCandidateEvent, html.RtcIceCandidateEvent);
-dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html.RtcIceCandidateEvent);
+dart.registerExtension(dart.global.RTCIceCandidateEvent, html$.RtcIceCandidateEvent);
+dart.registerExtension(dart.global.RTCPeerConnectionIceEvent, html$.RtcIceCandidateEvent);
 const _createOffer = Symbol('_createOffer');
 const _createAnswer = Symbol('_createAnswer');
 const _getStats = Symbol('_getStats');
@@ -85250,7 +85253,7 @@
   'remoteDescription',
   'signalingState'
 ]);
-html.RtcPeerConnection = class RtcPeerConnection extends html.EventTarget {
+html$.RtcPeerConnection = class RtcPeerConnection extends html$.EventTarget {
   static new(rtcIceServers, mediaConstraints) {
     if (mediaConstraints === void 0) mediaConstraints = null;
     let constructorName = window[dart.str`${html_common.Device.propertyPrefix}RTCPeerConnection`];
@@ -85262,7 +85265,7 @@
   }
   static get supported() {
     try {
-      html.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
+      html$.RtcPeerConnection.new(dart.map({iceServers: JSArrayOfMapOfString$String().of([dart.map({url: "stun:localhost"}, core.String, core.String)])}, core.String, ListOfMapOfString$String()));
       return true;
     } catch (_) {
       return false;
@@ -85454,76 +85457,76 @@
     return this.updateIce.apply(this, args);
   }
   get [dartx.onAddStream]() {
-    return html.RtcPeerConnection.addStreamEvent.forTarget(this);
+    return html$.RtcPeerConnection.addStreamEvent.forTarget(this);
   }
   get [dartx.onDataChannel]() {
-    return html.RtcPeerConnection.dataChannelEvent.forTarget(this);
+    return html$.RtcPeerConnection.dataChannelEvent.forTarget(this);
   }
   get [dartx.onIceCandidate]() {
-    return html.RtcPeerConnection.iceCandidateEvent.forTarget(this);
+    return html$.RtcPeerConnection.iceCandidateEvent.forTarget(this);
   }
   get [dartx.onIceConnectionStateChange]() {
-    return html.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
+    return html$.RtcPeerConnection.iceConnectionStateChangeEvent.forTarget(this);
   }
   get [dartx.onNegotiationNeeded]() {
-    return html.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
+    return html$.RtcPeerConnection.negotiationNeededEvent.forTarget(this);
   }
   get [dartx.onRemoveStream]() {
-    return html.RtcPeerConnection.removeStreamEvent.forTarget(this);
+    return html$.RtcPeerConnection.removeStreamEvent.forTarget(this);
   }
   get [dartx.onSignalingStateChange]() {
-    return html.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
+    return html$.RtcPeerConnection.signalingStateChangeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.RtcPeerConnection, {
+dart.setSignature(html$.RtcPeerConnection, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.RtcPeerConnection, [core.Map], [core.Map]),
-    _: dart.definiteFunctionType(html.RtcPeerConnection, [])
+    new: dart.definiteFunctionType(html$.RtcPeerConnection, [core.Map], [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcPeerConnection, [])
   }),
   fields: () => ({
     [dartx.iceConnectionState]: core.String,
     [dartx.iceGatheringState]: core.String,
-    [dartx.localDescription]: html.RtcSessionDescription,
-    [dartx.remoteDescription]: html.RtcSessionDescription,
+    [dartx.localDescription]: html$.RtcSessionDescription,
+    [dartx.remoteDescription]: html$.RtcSessionDescription,
     [dartx.signalingState]: core.String
   }),
   getters: () => ({
-    [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html.MediaStreamEvent), []),
-    [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html.RtcDataChannelEvent), []),
-    [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html.RtcIceCandidateEvent), []),
-    [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html.MediaStreamEvent), []),
-    [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onAddStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
+    [dartx.onDataChannel]: dart.definiteFunctionType(async.Stream$(html$.RtcDataChannelEvent), []),
+    [dartx.onIceCandidate]: dart.definiteFunctionType(async.Stream$(html$.RtcIceCandidateEvent), []),
+    [dartx.onIceConnectionStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onNegotiationNeeded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRemoveStream]: dart.definiteFunctionType(async.Stream$(html$.MediaStreamEvent), []),
+    [dartx.onSignalingStateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
-    [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html.RtcSessionDescription), [], [core.Map]),
-    [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html.RtcSessionDescription), [], [core.Map]),
-    [dartx.getStats]: dart.definiteFunctionType(async.Future$(html.RtcStatsResponse), [html.MediaStreamTrack]),
-    [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html.RtcIceCandidate, html.VoidCallback, html._RtcErrorCallback]),
-    [dartx.addStream]: dart.definiteFunctionType(dart.void, [html.MediaStream], [core.Map]),
-    [_addStream_1]: dart.definiteFunctionType(dart.void, [html.MediaStream, dart.dynamic]),
-    [_addStream_2]: dart.definiteFunctionType(dart.void, [html.MediaStream]),
+    [dartx.createOffer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
+    [dartx.createAnswer]: dart.definiteFunctionType(async.Future$(html$.RtcSessionDescription), [], [core.Map]),
+    [dartx.getStats]: dart.definiteFunctionType(async.Future$(html$.RtcStatsResponse), [html$.MediaStreamTrack]),
+    [dartx.addIceCandidate]: dart.definiteFunctionType(dart.void, [html$.RtcIceCandidate, html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.addStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream], [core.Map]),
+    [_addStream_1]: dart.definiteFunctionType(dart.void, [html$.MediaStream, dart.dynamic]),
+    [_addStream_2]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
     [dartx.close]: dart.definiteFunctionType(dart.void, []),
-    [_createAnswer]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback], [html._RtcErrorCallback, core.Map]),
-    [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback, html._RtcErrorCallback, dart.dynamic]),
-    [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback, html._RtcErrorCallback]),
-    [dartx.createDtmfSender]: dart.definiteFunctionType(html.RtcDtmfSender, [html.MediaStreamTrack]),
-    [dartx.createDataChannel]: dart.definiteFunctionType(html.RtcDataChannel, [core.String], [core.Map]),
-    [_createDataChannel_1]: dart.definiteFunctionType(html.RtcDataChannel, [dart.dynamic, dart.dynamic]),
-    [_createDataChannel_2]: dart.definiteFunctionType(html.RtcDataChannel, [dart.dynamic]),
-    [_createOffer]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback], [html._RtcErrorCallback, core.Map]),
-    [_createOffer_1]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback, html._RtcErrorCallback, dart.dynamic]),
-    [_createOffer_2]: dart.definiteFunctionType(dart.void, [html._RtcSessionDescriptionCallback, html._RtcErrorCallback]),
-    [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html.MediaStream), []),
-    [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html.MediaStream), []),
-    [_getStats]: dart.definiteFunctionType(dart.void, [html.RtcStatsCallback, html.MediaStreamTrack]),
-    [dartx.getStreamById]: dart.definiteFunctionType(html.MediaStream, [core.String]),
-    [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html.MediaStream]),
-    [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html.RtcSessionDescription], [html.VoidCallback, html._RtcErrorCallback]),
-    [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html.RtcSessionDescription]),
-    [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html.RtcSessionDescription], [html.VoidCallback, html._RtcErrorCallback]),
-    [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html.RtcSessionDescription]),
+    [_createAnswer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
+    [_createAnswer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
+    [_createAnswer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
+    [dartx.createDtmfSender]: dart.definiteFunctionType(html$.RtcDtmfSender, [html$.MediaStreamTrack]),
+    [dartx.createDataChannel]: dart.definiteFunctionType(html$.RtcDataChannel, [core.String], [core.Map]),
+    [_createDataChannel_1]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic, dart.dynamic]),
+    [_createDataChannel_2]: dart.definiteFunctionType(html$.RtcDataChannel, [dart.dynamic]),
+    [_createOffer]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback], [html$._RtcErrorCallback, core.Map]),
+    [_createOffer_1]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback, dart.dynamic]),
+    [_createOffer_2]: dart.definiteFunctionType(dart.void, [html$._RtcSessionDescriptionCallback, html$._RtcErrorCallback]),
+    [dartx.getLocalStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
+    [dartx.getRemoteStreams]: dart.definiteFunctionType(core.List$(html$.MediaStream), []),
+    [_getStats]: dart.definiteFunctionType(dart.void, [html$.RtcStatsCallback, html$.MediaStreamTrack]),
+    [dartx.getStreamById]: dart.definiteFunctionType(html$.MediaStream, [core.String]),
+    [dartx.removeStream]: dart.definiteFunctionType(dart.void, [html$.MediaStream]),
+    [_setLocalDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.setLocalDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
+    [_setRemoteDescription]: dart.definiteFunctionType(dart.void, [html$.RtcSessionDescription], [html$.VoidCallback, html$._RtcErrorCallback]),
+    [dartx.setRemoteDescription]: dart.definiteFunctionType(async.Future, [html$.RtcSessionDescription]),
     [dartx.updateIce]: dart.definiteFunctionType(dart.void, [], [core.Map, core.Map]),
     [_updateIce_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
     [_updateIce_2]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
@@ -85540,7 +85543,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineLazy(html.RtcPeerConnection, {
+dart.defineLazy(html$.RtcPeerConnection, {
   get addStreamEvent() {
     return dart.const(new (EventStreamProviderOfMediaStreamEvent())('addstream'));
   },
@@ -85563,13 +85566,13 @@
     return dart.const(new (EventStreamProviderOfEvent())('signalingstatechange'));
   }
 });
-dart.registerExtension(dart.global.RTCPeerConnection, html.RtcPeerConnection);
-dart.registerExtension(dart.global.mozRTCPeerConnection, html.RtcPeerConnection);
+dart.registerExtension(dart.global.RTCPeerConnection, html$.RtcPeerConnection);
+dart.registerExtension(dart.global.mozRTCPeerConnection, html$.RtcPeerConnection);
 dart.defineExtensionNames([
   'sdp',
   'type'
 ]);
-html.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
+html$.RtcSessionDescription = class RtcSessionDescription extends _interceptors.Interceptor {
   static new(dictionary) {
     let constructorName = window[dart.test(html_common.Device.isFirefox) ? dart.str`${html_common.Device.propertyPrefix}RTCSessionDescription` : 'RTCSessionDescription'];
     return new constructorName(html_common.convertDartToNative_SerializedScriptValue(dictionary));
@@ -85590,18 +85593,18 @@
     this.type = value;
   }
 };
-dart.setSignature(html.RtcSessionDescription, {
+dart.setSignature(html$.RtcSessionDescription, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.RtcSessionDescription, [core.Map]),
-    _: dart.definiteFunctionType(html.RtcSessionDescription, [])
+    new: dart.definiteFunctionType(html$.RtcSessionDescription, [core.Map]),
+    _: dart.definiteFunctionType(html$.RtcSessionDescription, [])
   }),
   fields: () => ({
     [dartx.sdp]: core.String,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.RTCSessionDescription, html.RtcSessionDescription);
-dart.registerExtension(dart.global.mozRTCSessionDescription, html.RtcSessionDescription);
+dart.registerExtension(dart.global.RTCSessionDescription, html$.RtcSessionDescription);
+dart.registerExtension(dart.global.mozRTCSessionDescription, html$.RtcSessionDescription);
 const _get_timestamp = Symbol('_get_timestamp');
 dart.defineExtensionNames([
   'timestamp',
@@ -85610,7 +85613,7 @@
   'id',
   'type'
 ]);
-html.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
+html$.RtcStatsReport = class RtcStatsReport extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85633,8 +85636,8 @@
     return this.stat.apply(this, args);
   }
 };
-dart.setSignature(html.RtcStatsReport, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcStatsReport, [])}),
+dart.setSignature(html$.RtcStatsReport, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsReport, [])}),
   fields: () => ({
     [dartx.id]: core.String,
     [_get_timestamp]: dart.dynamic,
@@ -85646,12 +85649,12 @@
     [dartx.stat]: dart.definiteFunctionType(core.String, [core.String])
   })
 });
-dart.registerExtension(dart.global.RTCStatsReport, html.RtcStatsReport);
+dart.registerExtension(dart.global.RTCStatsReport, html$.RtcStatsReport);
 dart.defineExtensionNames([
   'namedItem',
   'result'
 ]);
-html.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
+html$.RtcStatsResponse = class RtcStatsResponse extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85662,14 +85665,14 @@
     return this.result.apply(this, args);
   }
 };
-dart.setSignature(html.RtcStatsResponse, {
-  constructors: () => ({_: dart.definiteFunctionType(html.RtcStatsResponse, [])}),
+dart.setSignature(html$.RtcStatsResponse, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.RtcStatsResponse, [])}),
   methods: () => ({
-    [dartx.namedItem]: dart.definiteFunctionType(html.RtcStatsReport, [core.String]),
-    [dartx.result]: dart.definiteFunctionType(core.List$(html.RtcStatsReport), [])
+    [dartx.namedItem]: dart.definiteFunctionType(html$.RtcStatsReport, [core.String]),
+    [dartx.result]: dart.definiteFunctionType(core.List$(html$.RtcStatsReport), [])
   })
 });
-dart.registerExtension(dart.global.RTCStatsResponse, html.RtcStatsResponse);
+dart.registerExtension(dart.global.RTCStatsResponse, html$.RtcStatsResponse);
 const _availLeft = Symbol('_availLeft');
 const _availTop = Symbol('_availTop');
 const _availWidth = Symbol('_availWidth');
@@ -85682,7 +85685,7 @@
   'pixelDepth',
   'width'
 ]);
-html.Screen = class Screen extends _interceptors.Interceptor {
+html$.Screen = class Screen extends _interceptors.Interceptor {
   get [dartx.available]() {
     return new (RectangleOfint())(this[_availLeft], this[_availTop], this[_availWidth], this[_availHeight]);
   }
@@ -85717,8 +85720,8 @@
     return this.width;
   }
 };
-dart.setSignature(html.Screen, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Screen, [])}),
+dart.setSignature(html$.Screen, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Screen, [])}),
   fields: () => ({
     [_availHeight]: core.int,
     [_availLeft]: core.int,
@@ -85726,13 +85729,13 @@
     [_availWidth]: core.int,
     [dartx.colorDepth]: core.int,
     [dartx.height]: core.int,
-    [dartx.orientation]: html.ScreenOrientation,
+    [dartx.orientation]: html$.ScreenOrientation,
     [dartx.pixelDepth]: core.int,
     [dartx.width]: core.int
   }),
   getters: () => ({[dartx.available]: dart.definiteFunctionType(math.Rectangle$(core.num), [])})
 });
-dart.registerExtension(dart.global.Screen, html.Screen);
+dart.registerExtension(dart.global.Screen, html$.Screen);
 dart.defineExtensionNames([
   'lock',
   'unlock',
@@ -85740,7 +85743,7 @@
   'angle',
   'type'
 ]);
-html.ScreenOrientation = class ScreenOrientation extends html.EventTarget {
+html$.ScreenOrientation = class ScreenOrientation extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85757,28 +85760,28 @@
     return this.unlock.apply(this, args);
   }
   get [dartx.onChange]() {
-    return html.ScreenOrientation.changeEvent.forTarget(this);
+    return html$.ScreenOrientation.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.ScreenOrientation, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ScreenOrientation, [])}),
+dart.setSignature(html$.ScreenOrientation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ScreenOrientation, [])}),
   fields: () => ({
     [dartx.angle]: core.int,
     [dartx.type]: core.String
   }),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.lock]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.unlock]: dart.definiteFunctionType(dart.void, [])
   }),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.ScreenOrientation, {
+dart.defineLazy(html$.ScreenOrientation, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.ScreenOrientation, html.ScreenOrientation);
+dart.registerExtension(dart.global.ScreenOrientation, html$.ScreenOrientation);
 dart.defineExtensionNames([
   'async',
   'charset',
@@ -85789,12 +85792,12 @@
   'src',
   'type'
 ]);
-html.ScriptElement = class ScriptElement extends html.HtmlElement {
+html$.ScriptElement = class ScriptElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ScriptElement._check(html.document[dartx.createElement]("script"));
+    return html$.ScriptElement._check(html$.document[dartx.createElement]("script"));
   }
   created() {
     this[dartx.async] = null;
@@ -85856,12 +85859,12 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.ScriptElement, 'created');
-dart.setSignature(html.ScriptElement, {
+dart.defineNamedConstructor(html$.ScriptElement, 'created');
+dart.setSignature(html$.ScriptElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ScriptElement, []),
-    new: dart.definiteFunctionType(html.ScriptElement, []),
-    created: dart.definiteFunctionType(html.ScriptElement, [])
+    _: dart.definiteFunctionType(html$.ScriptElement, []),
+    new: dart.definiteFunctionType(html$.ScriptElement, []),
+    created: dart.definiteFunctionType(html$.ScriptElement, [])
   }),
   fields: () => ({
     [dartx.async]: core.bool,
@@ -85874,7 +85877,7 @@
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLScriptElement, html.ScriptElement);
+dart.registerExtension(dart.global.HTMLScriptElement, html$.ScriptElement);
 dart.defineExtensionNames([
   'consumeDelta',
   'deltaGranularity',
@@ -85888,7 +85891,7 @@
   'velocityX',
   'velocityY'
 ]);
-html.ScrollState = class ScrollState extends _interceptors.Interceptor {
+html$.ScrollState = class ScrollState extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -85902,30 +85905,30 @@
     if (isBeginning === void 0) isBeginning = null;
     if (isEnding === void 0) isEnding = null;
     if (isEnding != null) {
-      return html.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
+      return html$.ScrollState._create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
     }
     if (isBeginning != null) {
-      return html.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
+      return html$.ScrollState._create_2(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning);
     }
     if (inInertialPhase != null) {
-      return html.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
+      return html$.ScrollState._create_3(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase);
     }
     if (velocityY != null) {
-      return html.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
+      return html$.ScrollState._create_4(deltaX, deltaY, deltaGranularity, velocityX, velocityY);
     }
     if (velocityX != null) {
-      return html.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
+      return html$.ScrollState._create_5(deltaX, deltaY, deltaGranularity, velocityX);
     }
     if (deltaGranularity != null) {
-      return html.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
+      return html$.ScrollState._create_6(deltaX, deltaY, deltaGranularity);
     }
     if (deltaY != null) {
-      return html.ScrollState._create_7(deltaX, deltaY);
+      return html$.ScrollState._create_7(deltaX, deltaY);
     }
     if (deltaX != null) {
-      return html.ScrollState._create_8(deltaX);
+      return html$.ScrollState._create_8(deltaX);
     }
-    return html.ScrollState._create_9();
+    return html$.ScrollState._create_9();
   }
   static _create_1(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding) {
     return new self.ScrollState(deltaX, deltaY, deltaGranularity, velocityX, velocityY, inInertialPhase, isBeginning, isEnding);
@@ -85988,10 +85991,10 @@
     return this.consumeDelta.apply(this, args);
   }
 };
-dart.setSignature(html.ScrollState, {
+dart.setSignature(html$.ScrollState, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ScrollState, []),
-    new: dart.definiteFunctionType(html.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
+    _: dart.definiteFunctionType(html$.ScrollState, []),
+    new: dart.definiteFunctionType(html$.ScrollState, [], [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool, core.bool])
   }),
   fields: () => ({
     [dartx.deltaGranularity]: core.double,
@@ -86007,19 +86010,19 @@
   }),
   methods: () => ({[dartx.consumeDelta]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_4: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_5: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_6: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_7: dart.definiteFunctionType(html.ScrollState, [dart.dynamic, dart.dynamic]),
-    _create_8: dart.definiteFunctionType(html.ScrollState, [dart.dynamic]),
-    _create_9: dart.definiteFunctionType(html.ScrollState, [])
+    _create_1: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_6: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_7: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic, dart.dynamic]),
+    _create_8: dart.definiteFunctionType(html$.ScrollState, [dart.dynamic]),
+    _create_9: dart.definiteFunctionType(html$.ScrollState, [])
   }),
   names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5', '_create_6', '_create_7', '_create_8', '_create_9']
 });
-dart.registerExtension(dart.global.ScrollState, html.ScrollState);
+dart.registerExtension(dart.global.ScrollState, html$.ScrollState);
 dart.defineExtensionNames([
   'blockedUri',
   'columnNumber',
@@ -86032,7 +86035,7 @@
   'statusCode',
   'violatedDirective'
 ]);
-html.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html.Event {
+html$.SecurityPolicyViolationEvent = class SecurityPolicyViolationEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86040,9 +86043,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
+      return html$.SecurityPolicyViolationEvent._create_1(type, eventInitDict_1);
     }
-    return html.SecurityPolicyViolationEvent._create_2(type);
+    return html$.SecurityPolicyViolationEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.SecurityPolicyViolationEvent(type, eventInitDict);
@@ -86081,10 +86084,10 @@
     return this.violatedDirective;
   }
 };
-dart.setSignature(html.SecurityPolicyViolationEvent, {
+dart.setSignature(html$.SecurityPolicyViolationEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SecurityPolicyViolationEvent, []),
-    new: dart.definiteFunctionType(html.SecurityPolicyViolationEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, []),
+    new: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.blockedUri]: core.String,
@@ -86099,12 +86102,12 @@
     [dartx.violatedDirective]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.SecurityPolicyViolationEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SecurityPolicyViolationEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html.SecurityPolicyViolationEvent);
+dart.registerExtension(dart.global.SecurityPolicyViolationEvent, html$.SecurityPolicyViolationEvent);
 dart.defineExtensionNames([
   'add',
   'checkValidity',
@@ -86130,12 +86133,12 @@
   'value',
   'willValidate'
 ]);
-html.SelectElement = class SelectElement extends html.HtmlElement {
+html$.SelectElement = class SelectElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.SelectElement._check(html.document[dartx.createElement]("select"));
+    return html$.SelectElement._check(html$.document[dartx.createElement]("select"));
   }
   created() {
     this[dartx.autofocus] = null;
@@ -86249,7 +86252,7 @@
     return this.setCustomValidity.apply(this, args);
   }
   get [dartx.options]() {
-    let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html.Element)('option'));
+    let options = ListOfOptionElement().from(this[dartx.querySelectorAll](html$.Element)('option'));
     return new (UnmodifiableListViewOfOptionElement())(options);
   }
   get [dartx.selectedOptions]() {
@@ -86261,17 +86264,17 @@
     }
   }
 };
-dart.defineNamedConstructor(html.SelectElement, 'created');
-dart.setSignature(html.SelectElement, {
+dart.defineNamedConstructor(html$.SelectElement, 'created');
+dart.setSignature(html$.SelectElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SelectElement, []),
-    new: dart.definiteFunctionType(html.SelectElement, []),
-    created: dart.definiteFunctionType(html.SelectElement, [])
+    _: dart.definiteFunctionType(html$.SelectElement, []),
+    new: dart.definiteFunctionType(html$.SelectElement, []),
+    created: dart.definiteFunctionType(html$.SelectElement, [])
   }),
   fields: () => ({
     [dartx.autofocus]: core.bool,
     [dartx.disabled]: core.bool,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.labels]: ListOfNode(),
     [dartx.length]: core.int,
     [dartx.multiple]: core.bool,
@@ -86281,25 +86284,25 @@
     [dartx.size]: core.int,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.value]: core.String,
     [dartx.willValidate]: core.bool
   }),
   getters: () => ({
-    [dartx.options]: dart.definiteFunctionType(core.List$(html.OptionElement), []),
-    [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html.OptionElement), [])
+    [dartx.options]: dart.definiteFunctionType(core.List$(html$.OptionElement), []),
+    [dartx.selectedOptions]: dart.definiteFunctionType(core.List$(html$.OptionElement), [])
   }),
   methods: () => ({
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html.OptionElement]),
+    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, html$.OptionElement]),
     [dartx.add]: dart.definiteFunctionType(dart.void, [core.Object, core.Object]),
     [dartx.checkValidity]: dart.definiteFunctionType(core.bool, []),
-    [dartx.item]: dart.definiteFunctionType(html.Element, [core.int]),
-    [dartx.namedItem]: dart.definiteFunctionType(html.OptionElement, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.Element, [core.int]),
+    [dartx.namedItem]: dart.definiteFunctionType(html$.OptionElement, [core.String]),
     [dartx.reportValidity]: dart.definiteFunctionType(core.bool, []),
     [dartx.setCustomValidity]: dart.definiteFunctionType(dart.void, [core.String])
   })
 });
-dart.registerExtension(dart.global.HTMLSelectElement, html.SelectElement);
+dart.registerExtension(dart.global.HTMLSelectElement, html$.SelectElement);
 dart.defineExtensionNames([
   'addRange',
   'collapse',
@@ -86327,7 +86330,7 @@
   'rangeCount',
   'type'
 ]);
-html.Selection = class Selection extends _interceptors.Interceptor {
+html$.Selection = class Selection extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86407,39 +86410,39 @@
     return this.setPosition.apply(this, args);
   }
 };
-dart.setSignature(html.Selection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Selection, [])}),
+dart.setSignature(html$.Selection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Selection, [])}),
   fields: () => ({
-    [dartx.anchorNode]: html.Node,
+    [dartx.anchorNode]: html$.Node,
     [dartx.anchorOffset]: core.int,
-    [dartx.baseNode]: html.Node,
+    [dartx.baseNode]: html$.Node,
     [dartx.baseOffset]: core.int,
-    [dartx.extentNode]: html.Node,
+    [dartx.extentNode]: html$.Node,
     [dartx.extentOffset]: core.int,
-    [dartx.focusNode]: html.Node,
+    [dartx.focusNode]: html$.Node,
     [dartx.focusOffset]: core.int,
     [dartx.isCollapsed]: core.bool,
     [dartx.rangeCount]: core.int,
     [dartx.type]: core.String
   }),
   methods: () => ({
-    [dartx.addRange]: dart.definiteFunctionType(dart.void, [html.Range]),
-    [dartx.collapse]: dart.definiteFunctionType(dart.void, [html.Node], [core.int]),
+    [dartx.addRange]: dart.definiteFunctionType(dart.void, [html$.Range]),
+    [dartx.collapse]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
     [dartx.collapseToEnd]: dart.definiteFunctionType(dart.void, []),
     [dartx.collapseToStart]: dart.definiteFunctionType(dart.void, []),
-    [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html.Node, core.bool]),
+    [dartx.containsNode]: dart.definiteFunctionType(core.bool, [html$.Node, core.bool]),
     [dartx.deleteFromDocument]: dart.definiteFunctionType(dart.void, []),
     [dartx.empty]: dart.definiteFunctionType(dart.void, []),
-    [dartx.extend]: dart.definiteFunctionType(dart.void, [html.Node], [core.int]),
-    [dartx.getRangeAt]: dart.definiteFunctionType(html.Range, [core.int]),
+    [dartx.extend]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int]),
+    [dartx.getRangeAt]: dart.definiteFunctionType(html$.Range, [core.int]),
     [dartx.modify]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
     [dartx.removeAllRanges]: dart.definiteFunctionType(dart.void, []),
-    [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html.Node]),
-    [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html.Node, core.int, html.Node, core.int]),
-    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html.Node], [core.int])
+    [dartx.selectAllChildren]: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [dartx.setBaseAndExtent]: dart.definiteFunctionType(dart.void, [html$.Node, core.int, html$.Node, core.int]),
+    [dartx.setPosition]: dart.definiteFunctionType(dart.void, [html$.Node], [core.int])
   })
 });
-dart.registerExtension(dart.global.Selection, html.Selection);
+dart.registerExtension(dart.global.Selection, html$.Selection);
 dart.defineExtensionNames([
   'close',
   'postMessage',
@@ -86447,7 +86450,7 @@
   'name',
   'targetUrl'
 ]);
-html.ServicePort = class ServicePort extends _interceptors.Interceptor {
+html$.ServicePort = class ServicePort extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86481,8 +86484,8 @@
     return this.postMessage.apply(this, args);
   }
 };
-dart.setSignature(html.ServicePort, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ServicePort, [])}),
+dart.setSignature(html$.ServicePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePort, [])}),
   fields: () => ({
     [dartx.data]: core.Object,
     [dartx.name]: core.String,
@@ -86495,7 +86498,7 @@
     [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic])
   })
 });
-dart.registerExtension(dart.global.ServicePort, html.ServicePort);
+dart.registerExtension(dart.global.ServicePort, html$.ServicePort);
 const _connect_1 = Symbol('_connect_1');
 const _connect_2 = Symbol('_connect_2');
 dart.defineExtensionNames([
@@ -86504,7 +86507,7 @@
   'matchAll',
   'onMessage'
 ]);
-html.ServicePortCollection = class ServicePortCollection extends html.EventTarget {
+html$.ServicePortCollection = class ServicePortCollection extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86544,12 +86547,12 @@
     return this.matchAll.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.ServicePortCollection.messageEvent.forTarget(this);
+    return html$.ServicePortCollection.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.ServicePortCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ServicePortCollection, [])}),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+dart.setSignature(html$.ServicePortCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServicePortCollection, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.connect]: dart.definiteFunctionType(async.Future, [core.String], [core.Map]),
     [_connect_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
@@ -86562,18 +86565,18 @@
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.ServicePortCollection, {
+dart.defineLazy(html$.ServicePortCollection, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.ServicePortCollection, html.ServicePortCollection);
+dart.registerExtension(dart.global.ServicePortCollection, html$.ServicePortCollection);
 dart.defineExtensionNames([
   'respondWith',
   'origin',
   'targetUrl'
 ]);
-html.ServicePortConnectEvent = class ServicePortConnectEvent extends html.ExtendableEvent {
+html$.ServicePortConnectEvent = class ServicePortConnectEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86581,9 +86584,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ServicePortConnectEvent._create_1(type, eventInitDict_1);
+      return html$.ServicePortConnectEvent._create_1(type, eventInitDict_1);
     }
-    return html.ServicePortConnectEvent._create_2(type);
+    return html$.ServicePortConnectEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ServicePortConnectEvent(type, eventInitDict);
@@ -86601,10 +86604,10 @@
     return this.respondWith.apply(this, args);
   }
 };
-dart.setSignature(html.ServicePortConnectEvent, {
+dart.setSignature(html$.ServicePortConnectEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ServicePortConnectEvent, []),
-    new: dart.definiteFunctionType(html.ServicePortConnectEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ServicePortConnectEvent, []),
+    new: dart.definiteFunctionType(html$.ServicePortConnectEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.origin]: core.String,
@@ -86612,12 +86615,12 @@
   }),
   methods: () => ({[dartx.respondWith]: dart.definiteFunctionType(async.Future, [async.Future])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ServicePortConnectEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ServicePortConnectEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ServicePortConnectEvent, html.ServicePortConnectEvent);
+dart.registerExtension(dart.global.ServicePortConnectEvent, html$.ServicePortConnectEvent);
 dart.defineExtensionNames([
   'getRegistration',
   'getRegistrations',
@@ -86626,7 +86629,7 @@
   'controller',
   'ready'
 ]);
-html.ServiceWorkerContainer = class ServiceWorkerContainer extends html.EventTarget {
+html$.ServiceWorkerContainer = class ServiceWorkerContainer extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86657,16 +86660,16 @@
     return this.register.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.ServiceWorkerContainer.messageEvent.forTarget(this);
+    return html$.ServiceWorkerContainer.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.ServiceWorkerContainer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ServiceWorkerContainer, [])}),
+dart.setSignature(html$.ServiceWorkerContainer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerContainer, [])}),
   fields: () => ({
-    [dartx.controller]: html._ServiceWorker,
+    [dartx.controller]: html$._ServiceWorker,
     [dartx.ready]: async.Future
   }),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({
     [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [], [core.String]),
     [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
@@ -86676,12 +86679,12 @@
   }),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.ServiceWorkerContainer, {
+dart.defineLazy(html$.ServiceWorkerContainer, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.ServiceWorkerContainer, html.ServiceWorkerContainer);
+dart.registerExtension(dart.global.ServiceWorkerContainer, html$.ServiceWorkerContainer);
 dart.defineExtensionNames([
   'skipWaiting',
   'onMessage',
@@ -86689,7 +86692,7 @@
   'ports',
   'registration'
 ]);
-html.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html.WorkerGlobalScope {
+html$.ServiceWorkerGlobalScope = class ServiceWorkerGlobalScope extends html$.WorkerGlobalScope {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86706,26 +86709,26 @@
     return this.skipWaiting.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
+    return html$.ServiceWorkerGlobalScope.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.ServiceWorkerGlobalScope, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ServiceWorkerGlobalScope, [])}),
+dart.setSignature(html$.ServiceWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerGlobalScope, [])}),
   fields: () => ({
-    [dartx.clients]: html.Clients,
-    [dartx.ports]: html.StashedPortCollection,
-    [dartx.registration]: html.ServiceWorkerRegistration
+    [dartx.clients]: html$.Clients,
+    [dartx.ports]: html$.StashedPortCollection,
+    [dartx.registration]: html$.ServiceWorkerRegistration
   }),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
   methods: () => ({[dartx.skipWaiting]: dart.definiteFunctionType(async.Future, [])}),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.ServiceWorkerGlobalScope, {
+dart.defineLazy(html$.ServiceWorkerGlobalScope, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html.ServiceWorkerGlobalScope);
+dart.registerExtension(dart.global.ServiceWorkerGlobalScope, html$.ServiceWorkerGlobalScope);
 dart.defineExtensionNames([
   'data',
   'lastEventId',
@@ -86733,7 +86736,7 @@
   'ports',
   'source'
 ]);
-html.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html.Event {
+html$.ServiceWorkerMessageEvent = class ServiceWorkerMessageEvent extends html$.Event {
   get [dartx.data]() {
     return html_common.convertNativeToDart_SerializedScriptValue(this[_get_data]);
   }
@@ -86747,9 +86750,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
+      return html$.ServiceWorkerMessageEvent._create_1(type, eventInitDict_1);
     }
-    return html.ServiceWorkerMessageEvent._create_2(type);
+    return html$.ServiceWorkerMessageEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.ServiceWorkerMessageEvent(type, eventInitDict);
@@ -86770,10 +86773,10 @@
     return this.source;
   }
 };
-dart.setSignature(html.ServiceWorkerMessageEvent, {
+dart.setSignature(html$.ServiceWorkerMessageEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ServiceWorkerMessageEvent, []),
-    new: dart.definiteFunctionType(html.ServiceWorkerMessageEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, []),
+    new: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [_get_data]: dart.dynamic,
@@ -86784,12 +86787,12 @@
   }),
   getters: () => ({[dartx.data]: dart.definiteFunctionType(dart.dynamic, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.ServiceWorkerMessageEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.ServiceWorkerMessageEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html.ServiceWorkerMessageEvent);
+dart.registerExtension(dart.global.ServiceWorkerMessageEvent, html$.ServiceWorkerMessageEvent);
 const _getNotifications_1 = Symbol('_getNotifications_1');
 const _getNotifications_2 = Symbol('_getNotifications_2');
 const _showNotification_1 = Symbol('_showNotification_1');
@@ -86808,7 +86811,7 @@
   'sync',
   'waiting'
 ]);
-html.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html.EventTarget {
+html$.ServiceWorkerRegistration = class ServiceWorkerRegistration extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86871,17 +86874,17 @@
     return this.update.apply(this, args);
   }
 };
-dart.setSignature(html.ServiceWorkerRegistration, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ServiceWorkerRegistration, [])}),
+dart.setSignature(html$.ServiceWorkerRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ServiceWorkerRegistration, [])}),
   fields: () => ({
-    [dartx.active]: html._ServiceWorker,
-    [dartx.geofencing]: html.Geofencing,
-    [dartx.installing]: html._ServiceWorker,
-    [dartx.periodicSync]: html.PeriodicSyncManager,
-    [dartx.pushManager]: html.PushManager,
+    [dartx.active]: html$._ServiceWorker,
+    [dartx.geofencing]: html$.Geofencing,
+    [dartx.installing]: html$._ServiceWorker,
+    [dartx.periodicSync]: html$.PeriodicSyncManager,
+    [dartx.pushManager]: html$.PushManager,
     [dartx.scope]: core.String,
-    [dartx.sync]: html.SyncManager,
-    [dartx.waiting]: html._ServiceWorker
+    [dartx.sync]: html$.SyncManager,
+    [dartx.waiting]: html$._ServiceWorker
   }),
   methods: () => ({
     [dartx.getNotifications]: dart.definiteFunctionType(async.Future, [], [core.Map]),
@@ -86894,38 +86897,38 @@
     [dartx.update]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.ServiceWorkerRegistration, html.ServiceWorkerRegistration);
+dart.registerExtension(dart.global.ServiceWorkerRegistration, html$.ServiceWorkerRegistration);
 dart.defineExtensionNames([
   'getDistributedNodes'
 ]);
-html.ShadowElement = class ShadowElement extends html.HtmlElement {
+html$.ShadowElement = class ShadowElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.ShadowElement._check(html.document[dartx.createElement]("shadow"));
+    return html$.ShadowElement._check(html$.document[dartx.createElement]("shadow"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('shadow');
+    return html$.Element.isTagSupported('shadow');
   }
   [dartx.getDistributedNodes](...args) {
     return this.getDistributedNodes.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.ShadowElement, 'created');
-dart.setSignature(html.ShadowElement, {
+dart.defineNamedConstructor(html$.ShadowElement, 'created');
+dart.setSignature(html$.ShadowElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.ShadowElement, []),
-    new: dart.definiteFunctionType(html.ShadowElement, []),
-    created: dart.definiteFunctionType(html.ShadowElement, [])
+    _: dart.definiteFunctionType(html$.ShadowElement, []),
+    new: dart.definiteFunctionType(html$.ShadowElement, []),
+    created: dart.definiteFunctionType(html$.ShadowElement, [])
   }),
-  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html.Node), [])}),
+  methods: () => ({[dartx.getDistributedNodes]: dart.definiteFunctionType(core.List$(html$.Node), [])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLShadowElement, html.ShadowElement);
+dart.registerExtension(dart.global.HTMLShadowElement, html$.ShadowElement);
 dart.defineExtensionNames([
   'clone',
   'elementFromPoint',
@@ -86942,7 +86945,7 @@
   'olderShadowRoot',
   'styleSheets'
 ]);
-html.ShadowRoot = class ShadowRoot extends html.DocumentFragment {
+html$.ShadowRoot = class ShadowRoot extends html$.DocumentFragment {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -86983,35 +86986,35 @@
     return !!(Element.prototype.createShadowRoot || Element.prototype.webkitCreateShadowRoot);
   }
   static _shadowRootDeprecationReport() {
-    if (!dart.test(html.ShadowRoot._shadowRootDeprecationReported)) {
-      html.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
-      html.ShadowRoot._shadowRootDeprecationReported = true;
+    if (!dart.test(html$.ShadowRoot._shadowRootDeprecationReported)) {
+      html$.window[dartx.console].warn('ShadowRoot.resetStyleInheritance and ShadowRoot.applyAuthorStyles now deprecated in dart:html.\nPlease remove them from your code.\n');
+      html$.ShadowRoot._shadowRootDeprecationReported = true;
     }
   }
   get [dartx.resetStyleInheritance]() {
-    html.ShadowRoot._shadowRootDeprecationReport();
+    html$.ShadowRoot._shadowRootDeprecationReport();
     return false;
   }
   set [dartx.resetStyleInheritance](value) {
-    html.ShadowRoot._shadowRootDeprecationReport();
+    html$.ShadowRoot._shadowRootDeprecationReport();
   }
   get [dartx.applyAuthorStyles]() {
-    html.ShadowRoot._shadowRootDeprecationReport();
+    html$.ShadowRoot._shadowRootDeprecationReport();
     return false;
   }
   set [dartx.applyAuthorStyles](value) {
-    html.ShadowRoot._shadowRootDeprecationReport();
+    html$.ShadowRoot._shadowRootDeprecationReport();
   }
 };
-const innerHtml = Symbol(html.ShadowRoot.name + "." + dartx.innerHtml.toString());
-dart.setSignature(html.ShadowRoot, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ShadowRoot, [])}),
+const innerHtml = Symbol(html$.ShadowRoot.name + "." + dartx.innerHtml.toString());
+dart.setSignature(html$.ShadowRoot, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ShadowRoot, [])}),
   fields: () => ({
-    [dartx.activeElement]: html.Element,
+    [dartx.activeElement]: html$.Element,
     [dartx.delegatesFocus]: core.bool,
-    [dartx.host]: html.Element,
+    [dartx.host]: html$.Element,
     [dartx.innerHtml]: core.String,
-    [dartx.olderShadowRoot]: html.ShadowRoot,
+    [dartx.olderShadowRoot]: html$.ShadowRoot,
     [dartx.styleSheets]: ListOfStyleSheet()
   }),
   getters: () => ({
@@ -87023,21 +87026,21 @@
     [dartx.applyAuthorStyles]: dart.definiteFunctionType(dart.void, [core.bool])
   }),
   methods: () => ({
-    [dartx.elementFromPoint]: dart.definiteFunctionType(html.Element, [core.int, core.int]),
-    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html.Element), [core.int, core.int]),
-    [dartx.getSelection]: dart.definiteFunctionType(html.Selection, [])
+    [dartx.elementFromPoint]: dart.definiteFunctionType(html$.Element, [core.int, core.int]),
+    [dartx.elementsFromPoint]: dart.definiteFunctionType(core.List$(html$.Element), [core.int, core.int]),
+    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, [])
   }),
   sfields: () => ({_shadowRootDeprecationReported: core.bool}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({_shadowRootDeprecationReport: dart.definiteFunctionType(dart.void, [])}),
   names: ['_shadowRootDeprecationReport']
 });
-html.ShadowRoot._shadowRootDeprecationReported = false;
-dart.registerExtension(dart.global.ShadowRoot, html.ShadowRoot);
+html$.ShadowRoot._shadowRootDeprecationReported = false;
+dart.registerExtension(dart.global.ShadowRoot, html$.ShadowRoot);
 dart.defineExtensionNames([
   'byteLength'
 ]);
-html.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
+html$.SharedArrayBuffer = class SharedArrayBuffer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87045,26 +87048,26 @@
     return this.byteLength;
   }
 };
-dart.setSignature(html.SharedArrayBuffer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SharedArrayBuffer, [])}),
+dart.setSignature(html$.SharedArrayBuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SharedArrayBuffer, [])}),
   fields: () => ({[dartx.byteLength]: core.int})
 });
-dart.registerExtension(dart.global.SharedArrayBuffer, html.SharedArrayBuffer);
+dart.registerExtension(dart.global.SharedArrayBuffer, html$.SharedArrayBuffer);
 dart.defineExtensionNames([
   'onError',
   'port',
   'workerStart'
 ]);
-html.SharedWorker = class SharedWorker extends html.EventTarget {
+html$.SharedWorker = class SharedWorker extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(scriptURL, name) {
     if (name === void 0) name = null;
     if (name != null) {
-      return html.SharedWorker._create_1(scriptURL, name);
+      return html$.SharedWorker._create_1(scriptURL, name);
     }
-    return html.SharedWorker._create_2(scriptURL);
+    return html$.SharedWorker._create_2(scriptURL);
   }
   static _create_1(scriptURL, name) {
     return new self.SharedWorker(scriptURL, name);
@@ -87079,38 +87082,38 @@
     return this.workerStart;
   }
   get [dartx.onError]() {
-    return html.SharedWorker.errorEvent.forTarget(this);
+    return html$.SharedWorker.errorEvent.forTarget(this);
   }
 };
-html.SharedWorker[dart.implements] = () => [html.AbstractWorker];
-dart.setSignature(html.SharedWorker, {
+html$.SharedWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.SharedWorker, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SharedWorker, []),
-    new: dart.definiteFunctionType(html.SharedWorker, [core.String], [core.String])
+    _: dart.definiteFunctionType(html$.SharedWorker, []),
+    new: dart.definiteFunctionType(html$.SharedWorker, [core.String], [core.String])
   }),
   fields: () => ({
-    [dartx.port]: html.MessagePort,
+    [dartx.port]: html$.MessagePort,
     [dartx.workerStart]: core.double
   }),
-  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   sfields: () => ({errorEvent: EventStreamProviderOfEvent()}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.SharedWorker, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.SharedWorker, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SharedWorker, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.defineLazy(html.SharedWorker, {
+dart.defineLazy(html$.SharedWorker, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   }
 });
-dart.registerExtension(dart.global.SharedWorker, html.SharedWorker);
+dart.registerExtension(dart.global.SharedWorker, html$.SharedWorker);
 dart.defineExtensionNames([
   'onConnect',
   'name'
 ]);
-html.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html.WorkerGlobalScope {
+html$.SharedWorkerGlobalScope = class SharedWorkerGlobalScope extends html$.WorkerGlobalScope {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87118,21 +87121,21 @@
     return this.name;
   }
   get [dartx.onConnect]() {
-    return html.SharedWorkerGlobalScope.connectEvent.forTarget(this);
+    return html$.SharedWorkerGlobalScope.connectEvent.forTarget(this);
   }
 };
-dart.setSignature(html.SharedWorkerGlobalScope, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SharedWorkerGlobalScope, [])}),
+dart.setSignature(html$.SharedWorkerGlobalScope, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SharedWorkerGlobalScope, [])}),
   fields: () => ({[dartx.name]: core.String}),
-  getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onConnect]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   sfields: () => ({connectEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.SharedWorkerGlobalScope, {
+dart.defineLazy(html$.SharedWorkerGlobalScope, {
   get connectEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('connect'));
   }
 });
-dart.registerExtension(dart.global.SharedWorkerGlobalScope, html.SharedWorkerGlobalScope);
+dart.registerExtension(dart.global.SharedWorkerGlobalScope, html$.SharedWorkerGlobalScope);
 dart.defineExtensionNames([
   'abort',
   'appendBuffer',
@@ -87147,7 +87150,7 @@
   'trackDefaults',
   'updating'
 ]);
-html.SourceBuffer = class SourceBuffer extends html.EventTarget {
+html$.SourceBuffer = class SourceBuffer extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87203,26 +87206,26 @@
     return this.remove.apply(this, args);
   }
 };
-dart.setSignature(html.SourceBuffer, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SourceBuffer, [])}),
+dart.setSignature(html$.SourceBuffer, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBuffer, [])}),
   fields: () => ({
     [dartx.appendWindowEnd]: core.num,
     [dartx.appendWindowStart]: core.num,
-    [dartx.buffered]: html.TimeRanges,
+    [dartx.buffered]: html$.TimeRanges,
     [dartx.mode]: core.String,
     [dartx.timestampOffset]: core.num,
-    [dartx.trackDefaults]: html.TrackDefaultList,
+    [dartx.trackDefaults]: html$.TrackDefaultList,
     [dartx.updating]: core.bool
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
     [dartx.appendBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
-    [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html.FileStream], [core.int]),
+    [dartx.appendStream]: dart.definiteFunctionType(dart.void, [html$.FileStream], [core.int]),
     [dartx.appendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData]),
     [dartx.remove]: dart.definiteFunctionType(dart.void, [core.num, core.num])
   })
 });
-dart.registerExtension(dart.global.SourceBuffer, html.SourceBuffer);
+dart.registerExtension(dart.global.SourceBuffer, html$.SourceBuffer);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -87234,7 +87237,7 @@
   'elementAt',
   'item'
 ]);
-html.SourceBufferList = class SourceBufferList extends dart.mixin(html.EventTarget, collection.ListMixin$(html.SourceBuffer), html.ImmutableListMixin$(html.SourceBuffer)) {
+html$.SourceBufferList = class SourceBufferList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.SourceBuffer), html$.ImmutableListMixin$(html$.SourceBuffer)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87280,18 +87283,18 @@
     return this.item.apply(this, args);
   }
 };
-html.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
-dart.setSignature(html.SourceBufferList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SourceBufferList, [])}),
+html$.SourceBufferList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSourceBuffer()];
+dart.setSignature(html$.SourceBufferList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceBufferList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.SourceBuffer, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.SourceBuffer]),
-    [dartx.item]: dart.definiteFunctionType(html.SourceBuffer, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.SourceBuffer, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SourceBuffer]),
+    [dartx.item]: dart.definiteFunctionType(html$.SourceBuffer, [core.int])
   })
 });
-dart.registerExtension(dart.global.SourceBufferList, html.SourceBufferList);
+dart.registerExtension(dart.global.SourceBufferList, html$.SourceBufferList);
 dart.defineExtensionNames([
   'media',
   'sizes',
@@ -87299,12 +87302,12 @@
   'srcset',
   'type'
 ]);
-html.SourceElement = class SourceElement extends html.HtmlElement {
+html$.SourceElement = class SourceElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.SourceElement._check(html.document[dartx.createElement]("source"));
+    return html$.SourceElement._check(html$.document[dartx.createElement]("source"));
   }
   created() {
     this[dartx.media] = null;
@@ -87345,12 +87348,12 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.SourceElement, 'created');
-dart.setSignature(html.SourceElement, {
+dart.defineNamedConstructor(html$.SourceElement, 'created');
+dart.setSignature(html$.SourceElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SourceElement, []),
-    new: dart.definiteFunctionType(html.SourceElement, []),
-    created: dart.definiteFunctionType(html.SourceElement, [])
+    _: dart.definiteFunctionType(html$.SourceElement, []),
+    new: dart.definiteFunctionType(html$.SourceElement, []),
+    created: dart.definiteFunctionType(html$.SourceElement, [])
   }),
   fields: () => ({
     [dartx.media]: core.String,
@@ -87360,14 +87363,14 @@
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLSourceElement, html.SourceElement);
+dart.registerExtension(dart.global.HTMLSourceElement, html$.SourceElement);
 dart.defineExtensionNames([
   'facing',
   'id',
   'kind',
   'label'
 ]);
-html.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
+html$.SourceInfo = class SourceInfo extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87384,8 +87387,8 @@
     return this.label;
   }
 };
-dart.setSignature(html.SourceInfo, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SourceInfo, [])}),
+dart.setSignature(html$.SourceInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SourceInfo, [])}),
   fields: () => ({
     [dartx.facing]: core.String,
     [dartx.id]: core.String,
@@ -87393,37 +87396,37 @@
     [dartx.label]: core.String
   })
 });
-dart.registerExtension(dart.global.SourceInfo, html.SourceInfo);
-html.SpanElement = class SpanElement extends html.HtmlElement {
+dart.registerExtension(dart.global.SourceInfo, html$.SourceInfo);
+html$.SpanElement = class SpanElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.SpanElement._check(html.document[dartx.createElement]("span"));
+    return html$.SpanElement._check(html$.document[dartx.createElement]("span"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.SpanElement, 'created');
-dart.setSignature(html.SpanElement, {
+dart.defineNamedConstructor(html$.SpanElement, 'created');
+dart.setSignature(html$.SpanElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpanElement, []),
-    new: dart.definiteFunctionType(html.SpanElement, []),
-    created: dart.definiteFunctionType(html.SpanElement, [])
+    _: dart.definiteFunctionType(html$.SpanElement, []),
+    new: dart.definiteFunctionType(html$.SpanElement, []),
+    created: dart.definiteFunctionType(html$.SpanElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLSpanElement, html.SpanElement);
+dart.registerExtension(dart.global.HTMLSpanElement, html$.SpanElement);
 dart.defineExtensionNames([
   'src',
   'weight'
 ]);
-html.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
+html$.SpeechGrammar = class SpeechGrammar extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.SpeechGrammar._create_1();
+    return html$.SpeechGrammar._create_1();
   }
   static _create_1() {
     return new self.SpeechGrammar();
@@ -87441,19 +87444,19 @@
     this.weight = value;
   }
 };
-dart.setSignature(html.SpeechGrammar, {
+dart.setSignature(html$.SpeechGrammar, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechGrammar, []),
-    new: dart.definiteFunctionType(html.SpeechGrammar, [])
+    _: dart.definiteFunctionType(html$.SpeechGrammar, []),
+    new: dart.definiteFunctionType(html$.SpeechGrammar, [])
   }),
   fields: () => ({
     [dartx.src]: core.String,
     [dartx.weight]: core.num
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.SpeechGrammar, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammar, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.SpeechGrammar, html.SpeechGrammar);
+dart.registerExtension(dart.global.SpeechGrammar, html$.SpeechGrammar);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -87467,12 +87470,12 @@
   'addFromUri',
   'item'
 ]);
-html.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.SpeechGrammar), html.ImmutableListMixin$(html.SpeechGrammar)) {
+html$.SpeechGrammarList = class SpeechGrammarList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechGrammar), html$.ImmutableListMixin$(html$.SpeechGrammar)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.SpeechGrammarList._create_1();
+    return html$.SpeechGrammarList._create_1();
   }
   static _create_1() {
     return new self.SpeechGrammarList();
@@ -87525,25 +87528,25 @@
     return this.item.apply(this, args);
   }
 };
-html.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
-dart.setSignature(html.SpeechGrammarList, {
+html$.SpeechGrammarList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechGrammar()];
+dart.setSignature(html$.SpeechGrammarList, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechGrammarList, []),
-    new: dart.definiteFunctionType(html.SpeechGrammarList, [])
+    _: dart.definiteFunctionType(html$.SpeechGrammarList, []),
+    new: dart.definiteFunctionType(html$.SpeechGrammarList, [])
   }),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.SpeechGrammar, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.SpeechGrammar]),
+    [dartx._get]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechGrammar]),
     [dartx.addFromString]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
     [dartx.addFromUri]: dart.definiteFunctionType(dart.void, [core.String], [core.num]),
-    [dartx.item]: dart.definiteFunctionType(html.SpeechGrammar, [core.int])
+    [dartx.item]: dart.definiteFunctionType(html$.SpeechGrammar, [core.int])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.SpeechGrammarList, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SpeechGrammarList, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.SpeechGrammarList, html.SpeechGrammarList);
+dart.registerExtension(dart.global.SpeechGrammarList, html$.SpeechGrammarList);
 dart.defineExtensionNames([
   'abort',
   'start',
@@ -87567,7 +87570,7 @@
   'maxAlternatives',
   'serviceUri'
 ]);
-html.SpeechRecognition = class SpeechRecognition extends html.EventTarget {
+html$.SpeechRecognition = class SpeechRecognition extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87626,68 +87629,68 @@
     return this.stop.apply(this, args);
   }
   get [dartx.onAudioEnd]() {
-    return html.SpeechRecognition.audioEndEvent.forTarget(this);
+    return html$.SpeechRecognition.audioEndEvent.forTarget(this);
   }
   get [dartx.onAudioStart]() {
-    return html.SpeechRecognition.audioStartEvent.forTarget(this);
+    return html$.SpeechRecognition.audioStartEvent.forTarget(this);
   }
   get [dartx.onEnd]() {
-    return html.SpeechRecognition.endEvent.forTarget(this);
+    return html$.SpeechRecognition.endEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.SpeechRecognition.errorEvent.forTarget(this);
+    return html$.SpeechRecognition.errorEvent.forTarget(this);
   }
   get [dartx.onNoMatch]() {
-    return html.SpeechRecognition.noMatchEvent.forTarget(this);
+    return html$.SpeechRecognition.noMatchEvent.forTarget(this);
   }
   get [dartx.onResult]() {
-    return html.SpeechRecognition.resultEvent.forTarget(this);
+    return html$.SpeechRecognition.resultEvent.forTarget(this);
   }
   get [dartx.onSoundEnd]() {
-    return html.SpeechRecognition.soundEndEvent.forTarget(this);
+    return html$.SpeechRecognition.soundEndEvent.forTarget(this);
   }
   get [dartx.onSoundStart]() {
-    return html.SpeechRecognition.soundStartEvent.forTarget(this);
+    return html$.SpeechRecognition.soundStartEvent.forTarget(this);
   }
   get [dartx.onSpeechEnd]() {
-    return html.SpeechRecognition.speechEndEvent.forTarget(this);
+    return html$.SpeechRecognition.speechEndEvent.forTarget(this);
   }
   get [dartx.onSpeechStart]() {
-    return html.SpeechRecognition.speechStartEvent.forTarget(this);
+    return html$.SpeechRecognition.speechStartEvent.forTarget(this);
   }
   get [dartx.onStart]() {
-    return html.SpeechRecognition.startEvent.forTarget(this);
+    return html$.SpeechRecognition.startEvent.forTarget(this);
   }
   static new() {
     return new (window.SpeechRecognition || window.webkitSpeechRecognition)();
   }
 };
-dart.setSignature(html.SpeechRecognition, {
+dart.setSignature(html$.SpeechRecognition, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechRecognition, []),
-    new: dart.definiteFunctionType(html.SpeechRecognition, [])
+    _: dart.definiteFunctionType(html$.SpeechRecognition, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognition, [])
   }),
   fields: () => ({
-    [dartx.audioTrack]: html.MediaStreamTrack,
+    [dartx.audioTrack]: html$.MediaStreamTrack,
     [dartx.continuous]: core.bool,
-    [dartx.grammars]: html.SpeechGrammarList,
+    [dartx.grammars]: html$.SpeechGrammarList,
     [dartx.interimResults]: core.bool,
     [dartx.lang]: core.String,
     [dartx.maxAlternatives]: core.int,
     [dartx.serviceUri]: core.String
   }),
   getters: () => ({
-    [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.SpeechRecognitionError), []),
-    [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html.SpeechRecognitionEvent), []),
-    [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html.SpeechRecognitionEvent), []),
-    [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onAudioEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAudioStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionError), []),
+    [dartx.onNoMatch]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
+    [dartx.onResult]: dart.definiteFunctionType(async.Stream$(html$.SpeechRecognitionEvent), []),
+    [dartx.onSoundEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSoundStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSpeechEnd]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSpeechStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
     [dartx.abort]: dart.definiteFunctionType(dart.void, []),
@@ -87709,7 +87712,7 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.defineLazy(html.SpeechRecognition, {
+dart.defineLazy(html$.SpeechRecognition, {
   get audioEndEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('audioend'));
   },
@@ -87744,12 +87747,12 @@
     return dart.const(new (EventStreamProviderOfEvent())('start'));
   }
 });
-dart.registerExtension(dart.global.SpeechRecognition, html.SpeechRecognition);
+dart.registerExtension(dart.global.SpeechRecognition, html$.SpeechRecognition);
 dart.defineExtensionNames([
   'confidence',
   'transcript'
 ]);
-html.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
+html$.SpeechRecognitionAlternative = class SpeechRecognitionAlternative extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87760,19 +87763,19 @@
     return this.transcript;
   }
 };
-dart.setSignature(html.SpeechRecognitionAlternative, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SpeechRecognitionAlternative, [])}),
+dart.setSignature(html$.SpeechRecognitionAlternative, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [])}),
   fields: () => ({
     [dartx.confidence]: core.double,
     [dartx.transcript]: core.String
   })
 });
-dart.registerExtension(dart.global.SpeechRecognitionAlternative, html.SpeechRecognitionAlternative);
+dart.registerExtension(dart.global.SpeechRecognitionAlternative, html$.SpeechRecognitionAlternative);
 dart.defineExtensionNames([
   'error',
   'message'
 ]);
-html.SpeechRecognitionError = class SpeechRecognitionError extends html.Event {
+html$.SpeechRecognitionError = class SpeechRecognitionError extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87780,9 +87783,9 @@
     if (initDict === void 0) initDict = null;
     if (initDict != null) {
       let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
-      return html.SpeechRecognitionError._create_1(type, initDict_1);
+      return html$.SpeechRecognitionError._create_1(type, initDict_1);
     }
-    return html.SpeechRecognitionError._create_2(type);
+    return html$.SpeechRecognitionError._create_2(type);
   }
   static _create_1(type, initDict) {
     return new self.SpeechRecognitionError(type, initDict);
@@ -87797,29 +87800,29 @@
     return this.message;
   }
 };
-dart.setSignature(html.SpeechRecognitionError, {
+dart.setSignature(html$.SpeechRecognitionError, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechRecognitionError, []),
-    new: dart.definiteFunctionType(html.SpeechRecognitionError, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.SpeechRecognitionError, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognitionError, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.error]: core.String,
     [dartx.message]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.SpeechRecognitionError, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionError, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.SpeechRecognitionError, html.SpeechRecognitionError);
+dart.registerExtension(dart.global.SpeechRecognitionError, html$.SpeechRecognitionError);
 dart.defineExtensionNames([
   'emma',
   'interpretation',
   'resultIndex',
   'results'
 ]);
-html.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html.Event {
+html$.SpeechRecognitionEvent = class SpeechRecognitionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87827,9 +87830,9 @@
     if (initDict === void 0) initDict = null;
     if (initDict != null) {
       let initDict_1 = html_common.convertDartToNative_Dictionary(initDict);
-      return html.SpeechRecognitionEvent._create_1(type, initDict_1);
+      return html$.SpeechRecognitionEvent._create_1(type, initDict_1);
     }
-    return html.SpeechRecognitionEvent._create_2(type);
+    return html$.SpeechRecognitionEvent._create_2(type);
   }
   static _create_1(type, initDict) {
     return new self.SpeechRecognitionEvent(type, initDict);
@@ -87850,30 +87853,30 @@
     return this.results;
   }
 };
-dart.setSignature(html.SpeechRecognitionEvent, {
+dart.setSignature(html$.SpeechRecognitionEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechRecognitionEvent, []),
-    new: dart.definiteFunctionType(html.SpeechRecognitionEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.SpeechRecognitionEvent, []),
+    new: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [core.String], [core.Map])
   }),
   fields: () => ({
-    [dartx.emma]: html.Document,
-    [dartx.interpretation]: html.Document,
+    [dartx.emma]: html$.Document,
+    [dartx.interpretation]: html$.Document,
     [dartx.resultIndex]: core.int,
     [dartx.results]: ListOfSpeechRecognitionResult()
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.SpeechRecognitionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechRecognitionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.SpeechRecognitionEvent, html.SpeechRecognitionEvent);
+dart.registerExtension(dart.global.SpeechRecognitionEvent, html$.SpeechRecognitionEvent);
 dart.defineExtensionNames([
   'item',
   'isFinal',
   'length'
 ]);
-html.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
+html$.SpeechRecognitionResult = class SpeechRecognitionResult extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87887,15 +87890,15 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html.SpeechRecognitionResult, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SpeechRecognitionResult, [])}),
+dart.setSignature(html$.SpeechRecognitionResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechRecognitionResult, [])}),
   fields: () => ({
     [dartx.isFinal]: core.bool,
     [dartx.length]: core.int
   }),
-  methods: () => ({[dartx.item]: dart.definiteFunctionType(html.SpeechRecognitionAlternative, [core.int])})
+  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionAlternative, [core.int])})
 });
-dart.registerExtension(dart.global.SpeechRecognitionResult, html.SpeechRecognitionResult);
+dart.registerExtension(dart.global.SpeechRecognitionResult, html$.SpeechRecognitionResult);
 dart.defineExtensionNames([
   'cancel',
   'getVoices',
@@ -87906,7 +87909,7 @@
   'pending',
   'speaking'
 ]);
-html.SpeechSynthesis = class SpeechSynthesis extends html.EventTarget {
+html$.SpeechSynthesis = class SpeechSynthesis extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87935,8 +87938,8 @@
     return this.speak.apply(this, args);
   }
 };
-dart.setSignature(html.SpeechSynthesis, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SpeechSynthesis, [])}),
+dart.setSignature(html$.SpeechSynthesis, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesis, [])}),
   fields: () => ({
     [dartx.paused]: core.bool,
     [dartx.pending]: core.bool,
@@ -87944,20 +87947,20 @@
   }),
   methods: () => ({
     [dartx.cancel]: dart.definiteFunctionType(dart.void, []),
-    [dartx.getVoices]: dart.definiteFunctionType(core.List$(html.SpeechSynthesisVoice), []),
+    [dartx.getVoices]: dart.definiteFunctionType(core.List$(html$.SpeechSynthesisVoice), []),
     [dartx.pause]: dart.definiteFunctionType(dart.void, []),
     [dartx.resume]: dart.definiteFunctionType(dart.void, []),
-    [dartx.speak]: dart.definiteFunctionType(dart.void, [html.SpeechSynthesisUtterance])
+    [dartx.speak]: dart.definiteFunctionType(dart.void, [html$.SpeechSynthesisUtterance])
   })
 });
-dart.registerExtension(dart.global.SpeechSynthesis, html.SpeechSynthesis);
+dart.registerExtension(dart.global.SpeechSynthesis, html$.SpeechSynthesis);
 dart.defineExtensionNames([
   'charIndex',
   'elapsedTime',
   'name',
   'utterance'
 ]);
-html.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html.Event {
+html$.SpeechSynthesisEvent = class SpeechSynthesisEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -87974,16 +87977,16 @@
     return this.utterance;
   }
 };
-dart.setSignature(html.SpeechSynthesisEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SpeechSynthesisEvent, [])}),
+dart.setSignature(html$.SpeechSynthesisEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisEvent, [])}),
   fields: () => ({
     [dartx.charIndex]: core.int,
     [dartx.elapsedTime]: core.double,
     [dartx.name]: core.String,
-    [dartx.utterance]: html.SpeechSynthesisUtterance
+    [dartx.utterance]: html$.SpeechSynthesisUtterance
   })
 });
-dart.registerExtension(dart.global.SpeechSynthesisEvent, html.SpeechSynthesisEvent);
+dart.registerExtension(dart.global.SpeechSynthesisEvent, html$.SpeechSynthesisEvent);
 dart.defineExtensionNames([
   'onBoundary',
   'onEnd',
@@ -87999,16 +88002,16 @@
   'voice',
   'volume'
 ]);
-html.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html.EventTarget {
+html$.SpeechSynthesisUtterance = class SpeechSynthesisUtterance extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(text) {
     if (text === void 0) text = null;
     if (text != null) {
-      return html.SpeechSynthesisUtterance._create_1(text);
+      return html$.SpeechSynthesisUtterance._create_1(text);
     }
-    return html.SpeechSynthesisUtterance._create_2();
+    return html$.SpeechSynthesisUtterance._create_2();
   }
   static _create_1(text) {
     return new self.SpeechSynthesisUtterance(text);
@@ -88053,48 +88056,48 @@
     this.volume = value;
   }
   get [dartx.onBoundary]() {
-    return html.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.boundaryEvent.forTarget(this);
   }
   get [dartx.onEnd]() {
-    return html.SpeechSynthesisUtterance.endEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.endEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.SpeechSynthesisUtterance.errorEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.errorEvent.forTarget(this);
   }
   get [dartx.onMark]() {
-    return html.SpeechSynthesisUtterance.markEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.markEvent.forTarget(this);
   }
   get [dartx.onPause]() {
-    return html.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.pauseEvent.forTarget(this);
   }
   get [dartx.onResume]() {
-    return html.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.resumeEvent.forTarget(this);
   }
   get [dartx.onStart]() {
-    return html.SpeechSynthesisUtterance.startEvent.forTarget(this);
+    return html$.SpeechSynthesisUtterance.startEvent.forTarget(this);
   }
 };
-dart.setSignature(html.SpeechSynthesisUtterance, {
+dart.setSignature(html$.SpeechSynthesisUtterance, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SpeechSynthesisUtterance, []),
-    new: dart.definiteFunctionType(html.SpeechSynthesisUtterance, [], [core.String])
+    _: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, []),
+    new: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [], [core.String])
   }),
   fields: () => ({
     [dartx.lang]: core.String,
     [dartx.pitch]: core.num,
     [dartx.rate]: core.num,
     [dartx.text]: core.String,
-    [dartx.voice]: html.SpeechSynthesisVoice,
+    [dartx.voice]: html$.SpeechSynthesisVoice,
     [dartx.volume]: core.num
   }),
   getters: () => ({
-    [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html.SpeechSynthesisEvent), []),
-    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html.SpeechSynthesisEvent), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html.SpeechSynthesisEvent), []),
-    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html.SpeechSynthesisEvent), []),
-    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html.SpeechSynthesisEvent), [])
+    [dartx.onBoundary]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onEnd]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMark]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResume]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), []),
+    [dartx.onStart]: dart.definiteFunctionType(async.Stream$(html$.SpeechSynthesisEvent), [])
   }),
   sfields: () => ({
     boundaryEvent: EventStreamProviderOfSpeechSynthesisEvent(),
@@ -88106,12 +88109,12 @@
     startEvent: EventStreamProviderOfSpeechSynthesisEvent()
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.SpeechSynthesisUtterance, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.SpeechSynthesisUtterance, [])
+    _create_1: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.SpeechSynthesisUtterance, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.defineLazy(html.SpeechSynthesisUtterance, {
+dart.defineLazy(html$.SpeechSynthesisUtterance, {
   get boundaryEvent() {
     return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('boundary'));
   },
@@ -88134,7 +88137,7 @@
     return dart.const(new (EventStreamProviderOfSpeechSynthesisEvent())('start'));
   }
 });
-dart.registerExtension(dart.global.SpeechSynthesisUtterance, html.SpeechSynthesisUtterance);
+dart.registerExtension(dart.global.SpeechSynthesisUtterance, html$.SpeechSynthesisUtterance);
 dart.defineExtensionNames([
   'defaultValue',
   'lang',
@@ -88142,7 +88145,7 @@
   'name',
   'voiceUri'
 ]);
-html.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
+html$.SpeechSynthesisVoice = class SpeechSynthesisVoice extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88162,8 +88165,8 @@
     return this.voiceURI;
   }
 };
-dart.setSignature(html.SpeechSynthesisVoice, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SpeechSynthesisVoice, [])}),
+dart.setSignature(html$.SpeechSynthesisVoice, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SpeechSynthesisVoice, [])}),
   fields: () => ({
     [dartx.defaultValue]: core.bool,
     [dartx.lang]: core.String,
@@ -88172,11 +88175,11 @@
     [dartx.voiceUri]: core.String
   })
 });
-dart.registerExtension(dart.global.SpeechSynthesisVoice, html.SpeechSynthesisVoice);
+dart.registerExtension(dart.global.SpeechSynthesisVoice, html$.SpeechSynthesisVoice);
 dart.defineExtensionNames([
   'name'
 ]);
-html.StashedMessagePort = class StashedMessagePort extends html.MessagePort {
+html$.StashedMessagePort = class StashedMessagePort extends html$.MessagePort {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88184,16 +88187,16 @@
     return this.name;
   }
 };
-dart.setSignature(html.StashedMessagePort, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StashedMessagePort, [])}),
+dart.setSignature(html$.StashedMessagePort, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StashedMessagePort, [])}),
   fields: () => ({[dartx.name]: core.String})
 });
-dart.registerExtension(dart.global.StashedMessagePort, html.StashedMessagePort);
+dart.registerExtension(dart.global.StashedMessagePort, html$.StashedMessagePort);
 dart.defineExtensionNames([
   'add',
   'onMessage'
 ]);
-html.StashedPortCollection = class StashedPortCollection extends html.EventTarget {
+html$.StashedPortCollection = class StashedPortCollection extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88201,26 +88204,26 @@
     return this.add.apply(this, args);
   }
   get [dartx.onMessage]() {
-    return html.StashedPortCollection.messageEvent.forTarget(this);
+    return html$.StashedPortCollection.messageEvent.forTarget(this);
   }
 };
-dart.setSignature(html.StashedPortCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StashedPortCollection, [])}),
-  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])}),
-  methods: () => ({[dartx.add]: dart.definiteFunctionType(html.StashedMessagePort, [core.String, html.MessagePort])}),
+dart.setSignature(html$.StashedPortCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StashedPortCollection, [])}),
+  getters: () => ({[dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])}),
+  methods: () => ({[dartx.add]: dart.definiteFunctionType(html$.StashedMessagePort, [core.String, html$.MessagePort])}),
   sfields: () => ({messageEvent: EventStreamProviderOfMessageEvent()})
 });
-dart.defineLazy(html.StashedPortCollection, {
+dart.defineLazy(html$.StashedPortCollection, {
   get messageEvent() {
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.StashedPortCollection, html.StashedPortCollection);
+dart.registerExtension(dart.global.StashedPortCollection, html$.StashedPortCollection);
 const _getItem = Symbol('_getItem');
 const _setItem = Symbol('_setItem');
 const _removeItem = Symbol('_removeItem');
 const _key = Symbol('_key');
-const _length = Symbol('_length');
+const _length$3 = Symbol('_length');
 const __delete__ = Symbol('__delete__');
 dart.defineExtensionNames([
   'addAll',
@@ -88238,14 +88241,14 @@
   'isEmpty',
   'isNotEmpty'
 ]);
-html.Storage = class Storage extends _interceptors.Interceptor {
+html$.Storage = class Storage extends _interceptors.Interceptor {
   [dartx.addAll](other) {
     other[dartx.forEach](dart.fn((k, v) => {
       this[dartx._set](k, v);
     }, StringAndStringToNull()));
   }
   [dartx.containsValue](value) {
-    return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool()));
+    return this[dartx.values][dartx.any](dart.fn(e => dart.equals(e, value), StringTobool$()));
   }
   [dartx.containsKey](key) {
     return this[_getItem](core.String._check(key)) != null;
@@ -88267,7 +88270,7 @@
     return value;
   }
   [dartx.clear]() {
-    return this[_clear]();
+    return this[_clear$1]();
   }
   [dartx.forEach](f) {
     for (let i = 0; true; i++) {
@@ -88278,16 +88281,16 @@
   }
   get [dartx.keys]() {
     let keys = JSArrayOfString().of([]);
-    this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid()));
+    this[dartx.forEach](dart.fn((k, v) => keys[dartx.add](k), StringAndStringTovoid$()));
     return keys;
   }
   get [dartx.values]() {
     let values = JSArrayOfString().of([]);
-    this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid()));
+    this[dartx.forEach](dart.fn((k, v) => values[dartx.add](v), StringAndStringTovoid$()));
     return values;
   }
   get [dartx.length]() {
-    return this[_length];
+    return this[_length$3];
   }
   get [dartx.isEmpty]() {
     return this[_key](0) == null;
@@ -88298,7 +88301,7 @@
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
-  get [_length]() {
+  get [_length$3]() {
     return this.length;
   }
   [__delete__](...args) {
@@ -88310,7 +88313,7 @@
   [__setter__](...args) {
     return this.__setter__.apply(this, args);
   }
-  [_clear](...args) {
+  [_clear$1](...args) {
     return this.clear.apply(this, args);
   }
   [_getItem](...args) {
@@ -88326,10 +88329,10 @@
     return this.setItem.apply(this, args);
   }
 };
-html.Storage[dart.implements] = () => [MapOfString$String()];
-dart.setSignature(html.Storage, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Storage, [])}),
-  fields: () => ({[_length]: core.int}),
+html$.Storage[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$.Storage, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Storage, [])}),
+  fields: () => ({[_length$3]: core.int}),
   getters: () => ({
     [dartx.keys]: dart.definiteFunctionType(core.Iterable$(core.String), []),
     [dartx.values]: dart.definiteFunctionType(core.Iterable$(core.String), []),
@@ -88350,15 +88353,15 @@
     [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
     [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-    [_clear]: dart.definiteFunctionType(dart.void, []),
+    [_clear$1]: dart.definiteFunctionType(dart.void, []),
     [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
     [_key]: dart.definiteFunctionType(core.String, [core.int]),
     [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
     [_setItem]: dart.definiteFunctionType(dart.void, [core.String, core.String])
   })
 });
-dart.registerExtension(dart.global.Storage, html.Storage);
-html.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html.DomError]));
+dart.registerExtension(dart.global.Storage, html$.Storage);
+html$.StorageErrorCallback = dart.typedef('StorageErrorCallback', () => dart.functionType(dart.void, [html$.DomError]));
 const _initStorageEvent = Symbol('_initStorageEvent');
 dart.defineExtensionNames([
   'key',
@@ -88367,7 +88370,7 @@
   'storageArea',
   'url'
 ]);
-html.StorageEvent = class StorageEvent extends html.Event {
+html$.StorageEvent = class StorageEvent extends html$.Event {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
@@ -88376,7 +88379,7 @@
     let newValue = opts && 'newValue' in opts ? opts.newValue : null;
     let url = opts && 'url' in opts ? opts.url : null;
     let storageArea = opts && 'storageArea' in opts ? opts.storageArea : null;
-    let e = html.StorageEvent._check(html.document[_createEvent]("StorageEvent"));
+    let e = html$.StorageEvent._check(html$.document[_createEvent]("StorageEvent"));
     e[_initStorageEvent](type, canBubble, cancelable, key, oldValue, newValue, url, storageArea);
     return e;
   }
@@ -88384,9 +88387,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.StorageEvent._create_1(type, eventInitDict_1);
+      return html$.StorageEvent._create_1(type, eventInitDict_1);
     }
-    return html.StorageEvent._create_2(type);
+    return html$.StorageEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.StorageEvent(type, eventInitDict);
@@ -88413,31 +88416,31 @@
     return this.initStorageEvent.apply(this, args);
   }
 };
-dart.setSignature(html.StorageEvent, {
+dart.setSignature(html$.StorageEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html.Storage}),
-    _: dart.definiteFunctionType(html.StorageEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.StorageEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, key: core.String, oldValue: core.String, newValue: core.String, url: core.String, storageArea: html$.Storage}),
+    _: dart.definiteFunctionType(html$.StorageEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.key]: core.String,
     [dartx.newValue]: core.String,
     [dartx.oldValue]: core.String,
-    [dartx.storageArea]: html.Storage,
+    [dartx.storageArea]: html$.Storage,
     [dartx.url]: core.String
   }),
-  methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html.Storage])}),
+  methods: () => ({[_initStorageEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, core.String, core.String, core.String, core.String, html$.Storage])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.StorageEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.StorageEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.StorageEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.StorageEvent, html.StorageEvent);
+dart.registerExtension(dart.global.StorageEvent, html$.StorageEvent);
 dart.defineExtensionNames([
   'quota',
   'usage'
 ]);
-html.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
+html$.StorageInfo = class StorageInfo extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88448,20 +88451,20 @@
     return this.usage;
   }
 };
-dart.setSignature(html.StorageInfo, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StorageInfo, [])}),
+dart.setSignature(html$.StorageInfo, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StorageInfo, [])}),
   fields: () => ({
     [dartx.quota]: core.int,
     [dartx.usage]: core.int
   })
 });
-dart.registerExtension(dart.global.StorageInfo, html.StorageInfo);
+dart.registerExtension(dart.global.StorageInfo, html$.StorageInfo);
 dart.defineExtensionNames([
   'queryInfo',
   'requestPersistentQuota',
   'supportedTypes'
 ]);
-html.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
+html$.StorageQuota = class StorageQuota extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88475,30 +88478,30 @@
     return this.requestPersistentQuota.apply(this, args);
   }
 };
-dart.setSignature(html.StorageQuota, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StorageQuota, [])}),
+dart.setSignature(html$.StorageQuota, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StorageQuota, [])}),
   fields: () => ({[dartx.supportedTypes]: ListOfString()}),
   methods: () => ({
     [dartx.queryInfo]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.requestPersistentQuota]: dart.definiteFunctionType(async.Future, [core.int])
   })
 });
-dart.registerExtension(dart.global.StorageQuota, html.StorageQuota);
-html.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
-html.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
-html._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
+dart.registerExtension(dart.global.StorageQuota, html$.StorageQuota);
+html$.StorageQuotaCallback = dart.typedef('StorageQuotaCallback', () => dart.functionType(dart.void, [core.int]));
+html$.StorageUsageCallback = dart.typedef('StorageUsageCallback', () => dart.functionType(dart.void, [core.int, core.int]));
+html$._StringCallback = dart.typedef('_StringCallback', () => dart.functionType(dart.void, [core.String]));
 dart.defineExtensionNames([
   'disabled',
   'media',
   'sheet',
   'type'
 ]);
-html.StyleElement = class StyleElement extends html.HtmlElement {
+html$.StyleElement = class StyleElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.StyleElement._check(html.document[dartx.createElement]("style"));
+    return html$.StyleElement._check(html$.document[dartx.createElement]("style"));
   }
   created() {
     this[dartx.disabled] = null;
@@ -88529,26 +88532,26 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(html.StyleElement, 'created');
-dart.setSignature(html.StyleElement, {
+dart.defineNamedConstructor(html$.StyleElement, 'created');
+dart.setSignature(html$.StyleElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.StyleElement, []),
-    new: dart.definiteFunctionType(html.StyleElement, []),
-    created: dart.definiteFunctionType(html.StyleElement, [])
+    _: dart.definiteFunctionType(html$.StyleElement, []),
+    new: dart.definiteFunctionType(html$.StyleElement, []),
+    created: dart.definiteFunctionType(html$.StyleElement, [])
   }),
   fields: () => ({
     [dartx.disabled]: core.bool,
     [dartx.media]: core.String,
-    [dartx.sheet]: html.StyleSheet,
+    [dartx.sheet]: html$.StyleSheet,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.HTMLStyleElement, html.StyleElement);
+dart.registerExtension(dart.global.HTMLStyleElement, html$.StyleElement);
 dart.defineExtensionNames([
   'matchMedium',
   'type'
 ]);
-html.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
+html$.StyleMedia = class StyleMedia extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88559,22 +88562,22 @@
     return this.matchMedium.apply(this, args);
   }
 };
-dart.setSignature(html.StyleMedia, {
-  constructors: () => ({_: dart.definiteFunctionType(html.StyleMedia, [])}),
+dart.setSignature(html$.StyleMedia, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.StyleMedia, [])}),
   fields: () => ({[dartx.type]: core.String}),
   methods: () => ({[dartx.matchMedium]: dart.definiteFunctionType(core.bool, [core.String])})
 });
-dart.registerExtension(dart.global.StyleMedia, html.StyleMedia);
+dart.registerExtension(dart.global.StyleMedia, html$.StyleMedia);
 dart.defineExtensionNames([
   'registration'
 ]);
-html.SyncEvent = class SyncEvent extends html.ExtendableEvent {
+html$.SyncEvent = class SyncEvent extends html$.ExtendableEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(type, init) {
     let init_1 = html_common.convertDartToNative_Dictionary(init);
-    return html.SyncEvent._create_1(type, init_1);
+    return html$.SyncEvent._create_1(type, init_1);
   }
   static _create_1(type, init) {
     return new self.SyncEvent(type, init);
@@ -88583,23 +88586,23 @@
     return this.registration;
   }
 };
-dart.setSignature(html.SyncEvent, {
+dart.setSignature(html$.SyncEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.SyncEvent, []),
-    new: dart.definiteFunctionType(html.SyncEvent, [core.String, core.Map])
+    _: dart.definiteFunctionType(html$.SyncEvent, []),
+    new: dart.definiteFunctionType(html$.SyncEvent, [core.String, core.Map])
   }),
-  fields: () => ({[dartx.registration]: html.SyncRegistration}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.SyncEvent, [dart.dynamic, dart.dynamic])}),
+  fields: () => ({[dartx.registration]: html$.SyncRegistration}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.SyncEvent, [dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.SyncEvent, html.SyncEvent);
+dart.registerExtension(dart.global.SyncEvent, html$.SyncEvent);
 dart.defineExtensionNames([
   'getRegistration',
   'getRegistrations',
   'permissionState',
   'register'
 ]);
-html.SyncManager = class SyncManager extends _interceptors.Interceptor {
+html$.SyncManager = class SyncManager extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88627,8 +88630,8 @@
     return this.register.apply(this, args);
   }
 };
-dart.setSignature(html.SyncManager, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SyncManager, [])}),
+dart.setSignature(html$.SyncManager, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SyncManager, [])}),
   methods: () => ({
     [dartx.getRegistration]: dart.definiteFunctionType(async.Future, [core.String]),
     [dartx.getRegistrations]: dart.definiteFunctionType(async.Future, []),
@@ -88638,12 +88641,12 @@
     [_register_2]: dart.definiteFunctionType(async.Future, [])
   })
 });
-dart.registerExtension(dart.global.SyncManager, html.SyncManager);
+dart.registerExtension(dart.global.SyncManager, html$.SyncManager);
 dart.defineExtensionNames([
   'unregister',
   'tag'
 ]);
-html.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
+html$.SyncRegistration = class SyncRegistration extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -88654,44 +88657,44 @@
     return this.unregister.apply(this, args);
   }
 };
-dart.setSignature(html.SyncRegistration, {
-  constructors: () => ({_: dart.definiteFunctionType(html.SyncRegistration, [])}),
+dart.setSignature(html$.SyncRegistration, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.SyncRegistration, [])}),
   fields: () => ({[dartx.tag]: core.String}),
   methods: () => ({[dartx.unregister]: dart.definiteFunctionType(async.Future, [])})
 });
-dart.registerExtension(dart.global.SyncRegistration, html.SyncRegistration);
-html.TableCaptionElement = class TableCaptionElement extends html.HtmlElement {
+dart.registerExtension(dart.global.SyncRegistration, html$.SyncRegistration);
+html$.TableCaptionElement = class TableCaptionElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TableCaptionElement._check(html.document[dartx.createElement]("caption"));
+    return html$.TableCaptionElement._check(html$.document[dartx.createElement]("caption"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.TableCaptionElement, 'created');
-dart.setSignature(html.TableCaptionElement, {
+dart.defineNamedConstructor(html$.TableCaptionElement, 'created');
+dart.setSignature(html$.TableCaptionElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableCaptionElement, []),
-    new: dart.definiteFunctionType(html.TableCaptionElement, []),
-    created: dart.definiteFunctionType(html.TableCaptionElement, [])
+    _: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    new: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    created: dart.definiteFunctionType(html$.TableCaptionElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLTableCaptionElement, html.TableCaptionElement);
+dart.registerExtension(dart.global.HTMLTableCaptionElement, html$.TableCaptionElement);
 dart.defineExtensionNames([
   'cellIndex',
   'colSpan',
   'headers',
   'rowSpan'
 ]);
-html.TableCellElement = class TableCellElement extends html.HtmlElement {
+html$.TableCellElement = class TableCellElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TableCellElement._check(html.document[dartx.createElement]("td"));
+    return html$.TableCellElement._check(html$.document[dartx.createElement]("td"));
   }
   created() {
     this[dartx.cellIndex] = null;
@@ -88722,12 +88725,12 @@
     this.rowSpan = value;
   }
 };
-dart.defineNamedConstructor(html.TableCellElement, 'created');
-dart.setSignature(html.TableCellElement, {
+dart.defineNamedConstructor(html$.TableCellElement, 'created');
+dart.setSignature(html$.TableCellElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableCellElement, []),
-    new: dart.definiteFunctionType(html.TableCellElement, []),
-    created: dart.definiteFunctionType(html.TableCellElement, [])
+    _: dart.definiteFunctionType(html$.TableCellElement, []),
+    new: dart.definiteFunctionType(html$.TableCellElement, []),
+    created: dart.definiteFunctionType(html$.TableCellElement, [])
   }),
   fields: () => ({
     [dartx.cellIndex]: core.int,
@@ -88736,18 +88739,18 @@
     [dartx.rowSpan]: core.int
   })
 });
-dart.registerExtension(dart.global.HTMLTableCellElement, html.TableCellElement);
-dart.registerExtension(dart.global.HTMLTableDataCellElement, html.TableCellElement);
-dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html.TableCellElement);
+dart.registerExtension(dart.global.HTMLTableCellElement, html$.TableCellElement);
+dart.registerExtension(dart.global.HTMLTableDataCellElement, html$.TableCellElement);
+dart.registerExtension(dart.global.HTMLTableHeaderCellElement, html$.TableCellElement);
 dart.defineExtensionNames([
   'span'
 ]);
-html.TableColElement = class TableColElement extends html.HtmlElement {
+html$.TableColElement = class TableColElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TableColElement._check(html.document[dartx.createElement]("col"));
+    return html$.TableColElement._check(html$.document[dartx.createElement]("col"));
   }
   created() {
     this[dartx.span] = null;
@@ -88760,16 +88763,16 @@
     this.span = value;
   }
 };
-dart.defineNamedConstructor(html.TableColElement, 'created');
-dart.setSignature(html.TableColElement, {
+dart.defineNamedConstructor(html$.TableColElement, 'created');
+dart.setSignature(html$.TableColElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableColElement, []),
-    new: dart.definiteFunctionType(html.TableColElement, []),
-    created: dart.definiteFunctionType(html.TableColElement, [])
+    _: dart.definiteFunctionType(html$.TableColElement, []),
+    new: dart.definiteFunctionType(html$.TableColElement, []),
+    created: dart.definiteFunctionType(html$.TableColElement, [])
   }),
   fields: () => ({[dartx.span]: core.int})
 });
-dart.registerExtension(dart.global.HTMLTableColElement, html.TableColElement);
+dart.registerExtension(dart.global.HTMLTableColElement, html$.TableColElement);
 const _tBodies = Symbol('_tBodies');
 const _rows = Symbol('_rows');
 const _createCaption = Symbol('_createCaption');
@@ -88796,7 +88799,7 @@
   'tFoot',
   'tHead'
 ]);
-html.TableElement = class TableElement extends html.HtmlElement {
+html$.TableElement = class TableElement extends html$.HtmlElement {
   get [dartx.tBodies]() {
     return new (_WrappedListOfTableSectionElement())(this[_tBodies]);
   }
@@ -88807,27 +88810,27 @@
     return this[dartx.insertRow](-1);
   }
   [dartx.createCaption]() {
-    return html.TableCaptionElement._check(this[_createCaption]());
+    return html$.TableCaptionElement._check(this[_createCaption]());
   }
   [dartx.createTBody]() {
     return this[_createTBody]();
   }
   [dartx.createTFoot]() {
-    return html.TableSectionElement._check(this[_createTFoot]());
+    return html$.TableSectionElement._check(this[_createTFoot]());
   }
   [dartx.createTHead]() {
-    return html.TableSectionElement._check(this[_createTHead]());
+    return html$.TableSectionElement._check(this[_createTHead]());
   }
   [dartx.insertRow](index) {
-    return html.TableRowElement._check(this[_insertRow](index));
+    return html$.TableRowElement._check(this[_insertRow](index));
   }
   [_createTBody]() {
     if (!!this.createTBody) {
       return this[_nativeCreateTBody]();
     }
-    let tbody = html.Element.tag('tbody');
+    let tbody = html$.Element.tag('tbody');
     this[dartx.children][dartx.add](tbody);
-    return html.TableSectionElement._check(tbody);
+    return html$.TableSectionElement._check(tbody);
   }
   [_nativeCreateTBody](...args) {
     return this.createTBody.apply(this, args);
@@ -88835,12 +88838,12 @@
   [dartx.createFragment](html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    if (dart.test(html.Range.supportsCreateContextualFragment)) {
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
       return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
     }
     let contextualHtml = dart.str`<table>${html}</table>`;
-    let table = html.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
-    let fragment = html.DocumentFragment.new();
+    let table = html$.Element.html(contextualHtml, {validator: validator, treeSanitizer: treeSanitizer});
+    let fragment = html$.DocumentFragment.new();
     fragment[dartx.nodes][dartx.addAll](table[dartx.nodes]);
     return fragment;
   }
@@ -88848,7 +88851,7 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TableElement._check(html.document[dartx.createElement]("table"));
+    return html$.TableElement._check(html$.document[dartx.createElement]("table"));
   }
   created() {
     this[dartx.caption] = null;
@@ -88907,44 +88910,44 @@
     return this.insertRow.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.TableElement, 'created');
-dart.setSignature(html.TableElement, {
+dart.defineNamedConstructor(html$.TableElement, 'created');
+dart.setSignature(html$.TableElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableElement, []),
-    new: dart.definiteFunctionType(html.TableElement, []),
-    created: dart.definiteFunctionType(html.TableElement, [])
+    _: dart.definiteFunctionType(html$.TableElement, []),
+    new: dart.definiteFunctionType(html$.TableElement, []),
+    created: dart.definiteFunctionType(html$.TableElement, [])
   }),
   fields: () => ({
-    [dartx.caption]: html.TableCaptionElement,
+    [dartx.caption]: html$.TableCaptionElement,
     [_rows]: ListOfNode(),
     [_tBodies]: ListOfNode(),
-    [dartx.tFoot]: html.TableSectionElement,
-    [dartx.tHead]: html.TableSectionElement
+    [dartx.tFoot]: html$.TableSectionElement,
+    [dartx.tHead]: html$.TableSectionElement
   }),
   getters: () => ({
-    [dartx.tBodies]: dart.definiteFunctionType(core.List$(html.TableSectionElement), []),
-    [dartx.rows]: dart.definiteFunctionType(core.List$(html.TableRowElement), [])
+    [dartx.tBodies]: dart.definiteFunctionType(core.List$(html$.TableSectionElement), []),
+    [dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])
   }),
   methods: () => ({
-    [dartx.addRow]: dart.definiteFunctionType(html.TableRowElement, []),
-    [dartx.createCaption]: dart.definiteFunctionType(html.TableCaptionElement, []),
-    [dartx.createTBody]: dart.definiteFunctionType(html.TableSectionElement, []),
-    [dartx.createTFoot]: dart.definiteFunctionType(html.TableSectionElement, []),
-    [dartx.createTHead]: dart.definiteFunctionType(html.TableSectionElement, []),
-    [dartx.insertRow]: dart.definiteFunctionType(html.TableRowElement, [core.int]),
-    [_createTBody]: dart.definiteFunctionType(html.TableSectionElement, []),
-    [_nativeCreateTBody]: dart.definiteFunctionType(html.TableSectionElement, []),
-    [_createCaption]: dart.definiteFunctionType(html.HtmlElement, []),
-    [_createTFoot]: dart.definiteFunctionType(html.HtmlElement, []),
-    [_createTHead]: dart.definiteFunctionType(html.HtmlElement, []),
+    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
+    [dartx.createCaption]: dart.definiteFunctionType(html$.TableCaptionElement, []),
+    [dartx.createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.createTFoot]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.createTHead]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
+    [_createTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [_nativeCreateTBody]: dart.definiteFunctionType(html$.TableSectionElement, []),
+    [_createCaption]: dart.definiteFunctionType(html$.HtmlElement, []),
+    [_createTFoot]: dart.definiteFunctionType(html$.HtmlElement, []),
+    [_createTHead]: dart.definiteFunctionType(html$.HtmlElement, []),
     [dartx.deleteCaption]: dart.definiteFunctionType(dart.void, []),
     [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
     [dartx.deleteTFoot]: dart.definiteFunctionType(dart.void, []),
     [dartx.deleteTHead]: dart.definiteFunctionType(dart.void, []),
-    [_insertRow]: dart.definiteFunctionType(html.HtmlElement, [], [core.int])
+    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
   })
 });
-dart.registerExtension(dart.global.HTMLTableElement, html.TableElement);
+dart.registerExtension(dart.global.HTMLTableElement, html$.TableElement);
 const _cells = Symbol('_cells');
 const _insertCell = Symbol('_insertCell');
 dart.defineExtensionNames([
@@ -88956,7 +88959,7 @@
   'rowIndex',
   'sectionRowIndex'
 ]);
-html.TableRowElement = class TableRowElement extends html.HtmlElement {
+html$.TableRowElement = class TableRowElement extends html$.HtmlElement {
   get [dartx.cells]() {
     return new (_WrappedListOfTableCellElement())(this[_cells]);
   }
@@ -88964,16 +88967,16 @@
     return this[dartx.insertCell](-1);
   }
   [dartx.insertCell](index) {
-    return html.TableCellElement._check(this[_insertCell](index));
+    return html$.TableCellElement._check(this[_insertCell](index));
   }
   [dartx.createFragment](html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    if (dart.test(html.Range.supportsCreateContextualFragment)) {
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
       return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
     }
-    let fragment = html.DocumentFragment.new();
-    let section = html.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
+    let fragment = html$.DocumentFragment.new();
+    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
     let row = section[dartx.nodes][dartx.single];
     fragment[dartx.nodes][dartx.addAll](row[dartx.nodes]);
     return fragment;
@@ -88982,7 +88985,7 @@
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TableRowElement._check(html.document[dartx.createElement]("tr"));
+    return html$.TableRowElement._check(html$.document[dartx.createElement]("tr"));
   }
   created() {
     this[_cells] = null;
@@ -89006,27 +89009,27 @@
     return this.insertCell.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.TableRowElement, 'created');
-dart.setSignature(html.TableRowElement, {
+dart.defineNamedConstructor(html$.TableRowElement, 'created');
+dart.setSignature(html$.TableRowElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableRowElement, []),
-    new: dart.definiteFunctionType(html.TableRowElement, []),
-    created: dart.definiteFunctionType(html.TableRowElement, [])
+    _: dart.definiteFunctionType(html$.TableRowElement, []),
+    new: dart.definiteFunctionType(html$.TableRowElement, []),
+    created: dart.definiteFunctionType(html$.TableRowElement, [])
   }),
   fields: () => ({
     [_cells]: ListOfNode(),
     [dartx.rowIndex]: core.int,
     [dartx.sectionRowIndex]: core.int
   }),
-  getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html.TableCellElement), [])}),
+  getters: () => ({[dartx.cells]: dart.definiteFunctionType(core.List$(html$.TableCellElement), [])}),
   methods: () => ({
-    [dartx.addCell]: dart.definiteFunctionType(html.TableCellElement, []),
-    [dartx.insertCell]: dart.definiteFunctionType(html.TableCellElement, [core.int]),
+    [dartx.addCell]: dart.definiteFunctionType(html$.TableCellElement, []),
+    [dartx.insertCell]: dart.definiteFunctionType(html$.TableCellElement, [core.int]),
     [dartx.deleteCell]: dart.definiteFunctionType(dart.void, [core.int]),
-    [_insertCell]: dart.definiteFunctionType(html.HtmlElement, [], [core.int])
+    [_insertCell]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
   })
 });
-dart.registerExtension(dart.global.HTMLTableRowElement, html.TableRowElement);
+dart.registerExtension(dart.global.HTMLTableRowElement, html$.TableRowElement);
 dart.defineExtensionNames([
   'rows',
   'addRow',
@@ -89034,7 +89037,7 @@
   'createFragment',
   'deleteRow'
 ]);
-html.TableSectionElement = class TableSectionElement extends html.HtmlElement {
+html$.TableSectionElement = class TableSectionElement extends html$.HtmlElement {
   get [dartx.rows]() {
     return new (_WrappedListOfTableRowElement())(this[_rows]);
   }
@@ -89042,16 +89045,16 @@
     return this[dartx.insertRow](-1);
   }
   [dartx.insertRow](index) {
-    return html.TableRowElement._check(this[_insertRow](index));
+    return html$.TableRowElement._check(this[_insertRow](index));
   }
   [dartx.createFragment](html, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
-    if (dart.test(html.Range.supportsCreateContextualFragment)) {
+    if (dart.test(html$.Range.supportsCreateContextualFragment)) {
       return super[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer});
     }
-    let fragment = html.DocumentFragment.new();
-    let section = html.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
+    let fragment = html$.DocumentFragment.new();
+    let section = html$.TableElement.new()[dartx.createFragment](html, {validator: validator, treeSanitizer: treeSanitizer})[dartx.nodes][dartx.single];
     fragment[dartx.nodes][dartx.addAll](section[dartx.nodes]);
     return fragment;
   }
@@ -89072,39 +89075,39 @@
     return this.insertRow.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.TableSectionElement, 'created');
-dart.setSignature(html.TableSectionElement, {
+dart.defineNamedConstructor(html$.TableSectionElement, 'created');
+dart.setSignature(html$.TableSectionElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TableSectionElement, []),
-    created: dart.definiteFunctionType(html.TableSectionElement, [])
+    _: dart.definiteFunctionType(html$.TableSectionElement, []),
+    created: dart.definiteFunctionType(html$.TableSectionElement, [])
   }),
   fields: () => ({[_rows]: ListOfNode()}),
-  getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html.TableRowElement), [])}),
+  getters: () => ({[dartx.rows]: dart.definiteFunctionType(core.List$(html$.TableRowElement), [])}),
   methods: () => ({
-    [dartx.addRow]: dart.definiteFunctionType(html.TableRowElement, []),
-    [dartx.insertRow]: dart.definiteFunctionType(html.TableRowElement, [core.int]),
+    [dartx.addRow]: dart.definiteFunctionType(html$.TableRowElement, []),
+    [dartx.insertRow]: dart.definiteFunctionType(html$.TableRowElement, [core.int]),
     [dartx.deleteRow]: dart.definiteFunctionType(dart.void, [core.int]),
-    [_insertRow]: dart.definiteFunctionType(html.HtmlElement, [], [core.int])
+    [_insertRow]: dart.definiteFunctionType(html$.HtmlElement, [], [core.int])
   })
 });
-dart.registerExtension(dart.global.HTMLTableSectionElement, html.TableSectionElement);
+dart.registerExtension(dart.global.HTMLTableSectionElement, html$.TableSectionElement);
 dart.defineExtensionNames([
   'setInnerHtml',
   'content'
 ]);
-html.TemplateElement = class TemplateElement extends html.HtmlElement {
+html$.TemplateElement = class TemplateElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TemplateElement._check(html.document[dartx.createElement]("template"));
+    return html$.TemplateElement._check(html$.document[dartx.createElement]("template"));
   }
   created() {
     this[dartx.content] = null;
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('template');
+    return html$.Element.isTagSupported('template');
   }
   get [dartx.content]() {
     return this.content;
@@ -89117,17 +89120,17 @@
     this[dartx.content][dartx.append](fragment);
   }
 };
-dart.defineNamedConstructor(html.TemplateElement, 'created');
-dart.setSignature(html.TemplateElement, {
+dart.defineNamedConstructor(html$.TemplateElement, 'created');
+dart.setSignature(html$.TemplateElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TemplateElement, []),
-    new: dart.definiteFunctionType(html.TemplateElement, []),
-    created: dart.definiteFunctionType(html.TemplateElement, [])
+    _: dart.definiteFunctionType(html$.TemplateElement, []),
+    new: dart.definiteFunctionType(html$.TemplateElement, []),
+    created: dart.definiteFunctionType(html$.TemplateElement, [])
   }),
-  fields: () => ({[dartx.content]: html.DocumentFragment}),
+  fields: () => ({[dartx.content]: html$.DocumentFragment}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.HTMLTemplateElement, html.TemplateElement);
+dart.registerExtension(dart.global.HTMLTemplateElement, html$.TemplateElement);
 dart.defineExtensionNames([
   'checkValidity',
   'reportValidity',
@@ -89162,12 +89165,12 @@
   'willValidate',
   'wrap'
 ]);
-html.TextAreaElement = class TextAreaElement extends html.HtmlElement {
+html$.TextAreaElement = class TextAreaElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TextAreaElement._check(html.document[dartx.createElement]("textarea"));
+    return html$.TextAreaElement._check(html$.document[dartx.createElement]("textarea"));
   }
   created() {
     this[dartx.autocapitalize] = null;
@@ -89352,12 +89355,12 @@
     return this.setSelectionRange.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.TextAreaElement, 'created');
-dart.setSignature(html.TextAreaElement, {
+dart.defineNamedConstructor(html$.TextAreaElement, 'created');
+dart.setSignature(html$.TextAreaElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TextAreaElement, []),
-    new: dart.definiteFunctionType(html.TextAreaElement, []),
-    created: dart.definiteFunctionType(html.TextAreaElement, [])
+    _: dart.definiteFunctionType(html$.TextAreaElement, []),
+    new: dart.definiteFunctionType(html$.TextAreaElement, []),
+    created: dart.definiteFunctionType(html$.TextAreaElement, [])
   }),
   fields: () => ({
     [dartx.autocapitalize]: core.String,
@@ -89366,7 +89369,7 @@
     [dartx.defaultValue]: core.String,
     [dartx.dirName]: core.String,
     [dartx.disabled]: core.bool,
-    [dartx.form]: html.FormElement,
+    [dartx.form]: html$.FormElement,
     [dartx.inputMode]: core.String,
     [dartx.labels]: ListOfNode(),
     [dartx.maxLength]: core.int,
@@ -89382,7 +89385,7 @@
     [dartx.textLength]: core.int,
     [dartx.type]: core.String,
     [dartx.validationMessage]: core.String,
-    [dartx.validity]: html.ValidityState,
+    [dartx.validity]: html$.ValidityState,
     [dartx.value]: core.String,
     [dartx.willValidate]: core.bool,
     [dartx.wrap]: core.String
@@ -89396,21 +89399,21 @@
     [dartx.setSelectionRange]: dart.definiteFunctionType(dart.void, [core.int, core.int], [core.String])
   })
 });
-dart.registerExtension(dart.global.HTMLTextAreaElement, html.TextAreaElement);
+dart.registerExtension(dart.global.HTMLTextAreaElement, html$.TextAreaElement);
 const _initTextEvent = Symbol('_initTextEvent');
 dart.defineExtensionNames([
   'data'
 ]);
-html.TextEvent = class TextEvent extends html.UIEvent {
+html$.TextEvent = class TextEvent extends html$.UIEvent {
   static new(type, opts) {
     let canBubble = opts && 'canBubble' in opts ? opts.canBubble : false;
     let cancelable = opts && 'cancelable' in opts ? opts.cancelable : false;
     let view = opts && 'view' in opts ? opts.view : null;
     let data = opts && 'data' in opts ? opts.data : null;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let e = html.TextEvent._check(html.document[_createEvent]("TextEvent"));
+    let e = html$.TextEvent._check(html$.document[_createEvent]("TextEvent"));
     e[_initTextEvent](type, canBubble, cancelable, view, data);
     return e;
   }
@@ -89424,15 +89427,15 @@
     return this.initTextEvent.apply(this, args);
   }
 };
-dart.setSignature(html.TextEvent, {
+dart.setSignature(html$.TextEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html.Window, data: core.String}),
-    _: dart.definiteFunctionType(html.TextEvent, [])
+    new: dart.definiteFunctionType(html$.TextEvent, [core.String], {canBubble: core.bool, cancelable: core.bool, view: html$.Window, data: core.String}),
+    _: dart.definiteFunctionType(html$.TextEvent, [])
   }),
   fields: () => ({[dartx.data]: core.String}),
-  methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.String])})
+  methods: () => ({[_initTextEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String])})
 });
-dart.registerExtension(dart.global.TextEvent, html.TextEvent);
+dart.registerExtension(dart.global.TextEvent, html$.TextEvent);
 dart.defineExtensionNames([
   'actualBoundingBoxAscent',
   'actualBoundingBoxDescent',
@@ -89447,7 +89450,7 @@
   'ideographicBaseline',
   'width'
 ]);
-html.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
+html$.TextMetrics = class TextMetrics extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89488,8 +89491,8 @@
     return this.width;
   }
 };
-dart.setSignature(html.TextMetrics, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TextMetrics, [])}),
+dart.setSignature(html$.TextMetrics, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextMetrics, [])}),
   fields: () => ({
     [dartx.actualBoundingBoxAscent]: core.double,
     [dartx.actualBoundingBoxDescent]: core.double,
@@ -89505,7 +89508,7 @@
     [dartx.width]: core.double
   })
 });
-dart.registerExtension(dart.global.TextMetrics, html.TextMetrics);
+dart.registerExtension(dart.global.TextMetrics, html$.TextMetrics);
 dart.defineExtensionNames([
   'addCue',
   'addRegion',
@@ -89521,7 +89524,7 @@
   'mode',
   'regions'
 ]);
-html.TextTrack = class TextTrack extends html.EventTarget {
+html$.TextTrack = class TextTrack extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89565,36 +89568,36 @@
     return this.removeRegion.apply(this, args);
   }
   get [dartx.onCueChange]() {
-    return html.TextTrack.cueChangeEvent.forTarget(this);
+    return html$.TextTrack.cueChangeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.TextTrack, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TextTrack, [])}),
+dart.setSignature(html$.TextTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrack, [])}),
   fields: () => ({
-    [dartx.activeCues]: html.TextTrackCueList,
-    [dartx.cues]: html.TextTrackCueList,
+    [dartx.activeCues]: html$.TextTrackCueList,
+    [dartx.cues]: html$.TextTrackCueList,
     [dartx.id]: core.String,
     [dartx.kind]: core.String,
     [dartx.label]: core.String,
     [dartx.language]: core.String,
     [dartx.mode]: core.String,
-    [dartx.regions]: html.VttRegionList
+    [dartx.regions]: html$.VttRegionList
   }),
-  getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onCueChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
-    [dartx.addCue]: dart.definiteFunctionType(dart.void, [html.TextTrackCue]),
-    [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html.VttRegion]),
-    [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html.TextTrackCue]),
-    [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html.VttRegion])
+    [dartx.addCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
+    [dartx.addRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion]),
+    [dartx.removeCue]: dart.definiteFunctionType(dart.void, [html$.TextTrackCue]),
+    [dartx.removeRegion]: dart.definiteFunctionType(dart.void, [html$.VttRegion])
   }),
   sfields: () => ({cueChangeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.TextTrack, {
+dart.defineLazy(html$.TextTrack, {
   get cueChangeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('cuechange'));
   }
 });
-dart.registerExtension(dart.global.TextTrack, html.TextTrack);
+dart.registerExtension(dart.global.TextTrack, html$.TextTrack);
 dart.defineExtensionNames([
   'onEnter',
   'onExit',
@@ -89604,7 +89607,7 @@
   'startTime',
   'track'
 ]);
-html.TextTrackCue = class TextTrackCue extends html.EventTarget {
+html$.TextTrackCue = class TextTrackCue extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89636,31 +89639,31 @@
     return this.track;
   }
   get [dartx.onEnter]() {
-    return html.TextTrackCue.enterEvent.forTarget(this);
+    return html$.TextTrackCue.enterEvent.forTarget(this);
   }
   get [dartx.onExit]() {
-    return html.TextTrackCue.exitEvent.forTarget(this);
+    return html$.TextTrackCue.exitEvent.forTarget(this);
   }
 };
-dart.setSignature(html.TextTrackCue, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TextTrackCue, [])}),
+dart.setSignature(html$.TextTrackCue, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCue, [])}),
   fields: () => ({
     [dartx.endTime]: core.num,
     [dartx.id]: core.String,
     [dartx.pauseOnExit]: core.bool,
     [dartx.startTime]: core.num,
-    [dartx.track]: html.TextTrack
+    [dartx.track]: html$.TextTrack
   }),
   getters: () => ({
-    [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onEnter]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onExit]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   sfields: () => ({
     enterEvent: EventStreamProviderOfEvent(),
     exitEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(html.TextTrackCue, {
+dart.defineLazy(html$.TextTrackCue, {
   get enterEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('enter'));
   },
@@ -89668,7 +89671,7 @@
     return dart.const(new (EventStreamProviderOfEvent())('exit'));
   }
 });
-dart.registerExtension(dart.global.TextTrackCue, html.TextTrackCue);
+dart.registerExtension(dart.global.TextTrackCue, html$.TextTrackCue);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -89681,7 +89684,7 @@
   'getCueById',
   'item'
 ]);
-html.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.TextTrackCue), html.ImmutableListMixin$(html.TextTrackCue)) {
+html$.TextTrackCueList = class TextTrackCueList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.TextTrackCue), html$.ImmutableListMixin$(html$.TextTrackCue)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89730,19 +89733,19 @@
     return this.item.apply(this, args);
   }
 };
-html.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
-dart.setSignature(html.TextTrackCueList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TextTrackCueList, [])}),
+html$.TextTrackCueList[dart.implements] = () => [ListOfTextTrackCue(), _js_helper.JavaScriptIndexingBehavior];
+dart.setSignature(html$.TextTrackCueList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackCueList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.TextTrackCue, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.TextTrackCue]),
-    [dartx.getCueById]: dart.definiteFunctionType(html.TextTrackCue, [core.String]),
-    [dartx.item]: dart.definiteFunctionType(html.TextTrackCue, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.TextTrackCue, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrackCue]),
+    [dartx.getCueById]: dart.definiteFunctionType(html$.TextTrackCue, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.TextTrackCue, [core.int])
   })
 });
-dart.registerExtension(dart.global.TextTrackCueList, html.TextTrackCueList);
+dart.registerExtension(dart.global.TextTrackCueList, html$.TextTrackCueList);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -89757,7 +89760,7 @@
   'onAddTrack',
   'onChange'
 ]);
-html.TextTrackList = class TextTrackList extends dart.mixin(html.EventTarget, collection.ListMixin$(html.TextTrack), html.ImmutableListMixin$(html.TextTrack)) {
+html$.TextTrackList = class TextTrackList extends dart.mixin(html$.EventTarget, collection.ListMixin$(html$.TextTrack), html$.ImmutableListMixin$(html$.TextTrack)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89806,33 +89809,33 @@
     return this.item.apply(this, args);
   }
   get [dartx.onAddTrack]() {
-    return html.TextTrackList.addTrackEvent.forTarget(this);
+    return html$.TextTrackList.addTrackEvent.forTarget(this);
   }
   get [dartx.onChange]() {
-    return html.TextTrackList.changeEvent.forTarget(this);
+    return html$.TextTrackList.changeEvent.forTarget(this);
   }
 };
-html.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
-dart.setSignature(html.TextTrackList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TextTrackList, [])}),
+html$.TextTrackList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTextTrack()];
+dart.setSignature(html$.TextTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TextTrackList, [])}),
   getters: () => ({
     [dartx.length]: dart.definiteFunctionType(core.int, []),
-    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html.TrackEvent), []),
-    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onAddTrack]: dart.definiteFunctionType(async.Stream$(html$.TrackEvent), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.TextTrack, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.TextTrack]),
-    [dartx.getTrackById]: dart.definiteFunctionType(html.TextTrack, [core.String]),
-    [dartx.item]: dart.definiteFunctionType(html.TextTrack, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.TextTrack, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.TextTrack]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.TextTrack, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.TextTrack, [core.int])
   }),
   sfields: () => ({
     addTrackEvent: EventStreamProviderOfTrackEvent(),
     changeEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(html.TextTrackList, {
+dart.defineLazy(html$.TextTrackList, {
   get addTrackEvent() {
     return dart.const(new (EventStreamProviderOfTrackEvent())('addtrack'));
   },
@@ -89840,13 +89843,13 @@
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.TextTrackList, html.TextTrackList);
+dart.registerExtension(dart.global.TextTrackList, html$.TextTrackList);
 dart.defineExtensionNames([
   'end',
   'start',
   'length'
 ]);
-html.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
+html$.TimeRanges = class TimeRanges extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89860,36 +89863,36 @@
     return this.start.apply(this, args);
   }
 };
-dart.setSignature(html.TimeRanges, {
-  constructors: () => ({_: dart.definiteFunctionType(html.TimeRanges, [])}),
+dart.setSignature(html$.TimeRanges, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.TimeRanges, [])}),
   fields: () => ({[dartx.length]: core.int}),
   methods: () => ({
     [dartx.end]: dart.definiteFunctionType(core.double, [core.int]),
     [dartx.start]: dart.definiteFunctionType(core.double, [core.int])
   })
 });
-dart.registerExtension(dart.global.TimeRanges, html.TimeRanges);
-html.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
-html.TitleElement = class TitleElement extends html.HtmlElement {
+dart.registerExtension(dart.global.TimeRanges, html$.TimeRanges);
+html$.TimeoutHandler = dart.typedef('TimeoutHandler', () => dart.functionType(dart.void, []));
+html$.TitleElement = class TitleElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TitleElement._check(html.document[dartx.createElement]("title"));
+    return html$.TitleElement._check(html$.document[dartx.createElement]("title"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.TitleElement, 'created');
-dart.setSignature(html.TitleElement, {
+dart.defineNamedConstructor(html$.TitleElement, 'created');
+dart.setSignature(html$.TitleElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TitleElement, []),
-    new: dart.definiteFunctionType(html.TitleElement, []),
-    created: dart.definiteFunctionType(html.TitleElement, [])
+    _: dart.definiteFunctionType(html$.TitleElement, []),
+    new: dart.definiteFunctionType(html$.TitleElement, []),
+    created: dart.definiteFunctionType(html$.TitleElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLTitleElement, html.TitleElement);
+dart.registerExtension(dart.global.HTMLTitleElement, html$.TitleElement);
 const _radiusX = Symbol('_radiusX');
 const _radiusY = Symbol('_radiusY');
 const __clientX = Symbol('__clientX');
@@ -89911,7 +89914,7 @@
   'identifier',
   'rotationAngle'
 ]);
-html.Touch = class Touch extends _interceptors.Interceptor {
+html$.Touch = class Touch extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -89949,7 +89952,7 @@
     return this.screenY;
   }
   get [dartx.target]() {
-    return html._convertNativeToDart_EventTarget(this[_get_target]);
+    return html$._convertNativeToDart_EventTarget(this[_get_target]);
   }
   get [_get_target]() {
     return this.target;
@@ -89994,8 +89997,8 @@
     return this[__radiusY];
   }
 };
-dart.setSignature(html.Touch, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Touch, [])}),
+dart.setSignature(html$.Touch, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Touch, [])}),
   fields: () => ({
     [_clientX]: core.double,
     [_clientY]: core.double,
@@ -90011,7 +90014,7 @@
     [_get_target]: dart.dynamic
   }),
   getters: () => ({
-    [dartx.target]: dart.definiteFunctionType(html.EventTarget, []),
+    [dartx.target]: dart.definiteFunctionType(html$.EventTarget, []),
     [__clientX]: dart.definiteFunctionType(core.int, []),
     [__clientY]: dart.definiteFunctionType(core.int, []),
     [__screenX]: dart.definiteFunctionType(core.int, []),
@@ -90027,7 +90030,7 @@
     [dartx.radiusY]: dart.definiteFunctionType(core.int, [])
   })
 });
-dart.registerExtension(dart.global.Touch, html.Touch);
+dart.registerExtension(dart.global.Touch, html$.Touch);
 const _initTouchEvent = Symbol('_initTouchEvent');
 dart.defineExtensionNames([
   'altKey',
@@ -90038,7 +90041,7 @@
   'targetTouches',
   'touches'
 ]);
-html.TouchEvent = class TouchEvent extends html.UIEvent {
+html$.TouchEvent = class TouchEvent extends html$.UIEvent {
   static new(touches, targetTouches, changedTouches, type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
     let screenX = opts && 'screenX' in opts ? opts.screenX : 0;
@@ -90050,9 +90053,9 @@
     let shiftKey = opts && 'shiftKey' in opts ? opts.shiftKey : false;
     let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
-    let e = html.TouchEvent._check(html.document[_createEvent]("TouchEvent"));
+    let e = html$.TouchEvent._check(html$.document[_createEvent]("TouchEvent"));
     e[_initTouchEvent](touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
     return e;
   }
@@ -90087,24 +90090,24 @@
     return html_common.Device.isEventTypeSupported('TouchEvent');
   }
 };
-dart.setSignature(html.TouchEvent, {
+dart.setSignature(html$.TouchEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.TouchEvent, [html.TouchList, html.TouchList, html.TouchList, core.String], {view: html.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
-    _: dart.definiteFunctionType(html.TouchEvent, [])
+    new: dart.definiteFunctionType(html$.TouchEvent, [html$.TouchList, html$.TouchList, html$.TouchList, core.String], {view: html$.Window, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool}),
+    _: dart.definiteFunctionType(html$.TouchEvent, [])
   }),
   fields: () => ({
     [dartx.altKey]: core.bool,
-    [dartx.changedTouches]: html.TouchList,
+    [dartx.changedTouches]: html$.TouchList,
     [dartx.ctrlKey]: core.bool,
     [dartx.metaKey]: core.bool,
     [dartx.shiftKey]: core.bool,
-    [dartx.targetTouches]: html.TouchList,
-    [dartx.touches]: html.TouchList
+    [dartx.targetTouches]: html$.TouchList,
+    [dartx.touches]: html$.TouchList
   }),
-  methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html.TouchList, html.TouchList, html.TouchList, core.String, html.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
+  methods: () => ({[_initTouchEvent]: dart.definiteFunctionType(dart.void, [html$.TouchList, html$.TouchList, html$.TouchList, core.String, html$.Window, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.TouchEvent, html.TouchEvent);
+dart.registerExtension(dart.global.TouchEvent, html$.TouchEvent);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -90116,7 +90119,7 @@
   'elementAt',
   'item'
 ]);
-html.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Touch), html.ImmutableListMixin$(html.Touch)) {
+html$.TouchList = class TouchList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Touch), html$.ImmutableListMixin$(html$.Touch)) {
   static new() {
     return null;
   }
@@ -90168,22 +90171,22 @@
     return this.item.apply(this, args);
   }
 };
-html.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
-dart.setSignature(html.TouchList, {
+html$.TouchList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfTouch()];
+dart.setSignature(html$.TouchList, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.TouchList, []),
-    _: dart.definiteFunctionType(html.TouchList, [])
+    new: dart.definiteFunctionType(html$.TouchList, []),
+    _: dart.definiteFunctionType(html$.TouchList, [])
   }),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Touch, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Touch]),
-    [dartx.item]: dart.definiteFunctionType(html.Touch, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.Touch, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Touch]),
+    [dartx.item]: dart.definiteFunctionType(html$.Touch, [core.int])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.TouchList, html.TouchList);
+dart.registerExtension(dart.global.TouchList, html$.TouchList);
 dart.defineExtensionNames([
   'byteStreamTrackID',
   'kinds',
@@ -90191,7 +90194,7 @@
   'language',
   'type'
 ]);
-html.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
+html$.TrackDefault = class TrackDefault extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90199,10 +90202,10 @@
     if (byteStreamTrackID === void 0) byteStreamTrackID = null;
     if (byteStreamTrackID != null) {
       let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
-      return html.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
+      return html$.TrackDefault._create_1(type, language, label, kinds_1, byteStreamTrackID);
     }
     let kinds_1 = html_common.convertDartToNative_StringArray(kinds);
-    return html.TrackDefault._create_2(type, language, label, kinds_1);
+    return html$.TrackDefault._create_2(type, language, label, kinds_1);
   }
   static _create_1(type, language, label, kinds, byteStreamTrackID) {
     return new self.TrackDefault(type, language, label, kinds, byteStreamTrackID);
@@ -90226,10 +90229,10 @@
     return this.type;
   }
 };
-dart.setSignature(html.TrackDefault, {
+dart.setSignature(html$.TrackDefault, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TrackDefault, []),
-    new: dart.definiteFunctionType(html.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
+    _: dart.definiteFunctionType(html$.TrackDefault, []),
+    new: dart.definiteFunctionType(html$.TrackDefault, [core.String, core.String, core.String, ListOfString()], [core.String])
   }),
   fields: () => ({
     [dartx.byteStreamTrackID]: core.String,
@@ -90239,26 +90242,26 @@
     [dartx.type]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackDefault, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.TrackDefault, html.TrackDefault);
+dart.registerExtension(dart.global.TrackDefault, html$.TrackDefault);
 dart.defineExtensionNames([
   'item',
   'length'
 ]);
-html.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
+html$.TrackDefaultList = class TrackDefaultList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(trackDefaults) {
     if (trackDefaults === void 0) trackDefaults = null;
     if (trackDefaults != null) {
-      return html.TrackDefaultList._create_1(trackDefaults);
+      return html$.TrackDefaultList._create_1(trackDefaults);
     }
-    return html.TrackDefaultList._create_2();
+    return html$.TrackDefaultList._create_2();
   }
   static _create_1(trackDefaults) {
     return new self.TrackDefaultList(trackDefaults);
@@ -90273,20 +90276,20 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html.TrackDefaultList, {
+dart.setSignature(html$.TrackDefaultList, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TrackDefaultList, []),
-    new: dart.definiteFunctionType(html.TrackDefaultList, [], [ListOfTrackDefault()])
+    _: dart.definiteFunctionType(html$.TrackDefaultList, []),
+    new: dart.definiteFunctionType(html$.TrackDefaultList, [], [ListOfTrackDefault()])
   }),
   fields: () => ({[dartx.length]: core.int}),
-  methods: () => ({[dartx.item]: dart.definiteFunctionType(html.TrackDefault, [core.int])}),
+  methods: () => ({[dartx.item]: dart.definiteFunctionType(html$.TrackDefault, [core.int])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.TrackDefaultList, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.TrackDefaultList, [])
+    _create_1: dart.definiteFunctionType(html$.TrackDefaultList, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackDefaultList, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.TrackDefaultList, html.TrackDefaultList);
+dart.registerExtension(dart.global.TrackDefaultList, html$.TrackDefaultList);
 dart.defineExtensionNames([
   'defaultValue',
   'kind',
@@ -90296,12 +90299,12 @@
   'srclang',
   'track'
 ]);
-html.TrackElement = class TrackElement extends html.HtmlElement {
+html$.TrackElement = class TrackElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.TrackElement._check(html.document[dartx.createElement]("track"));
+    return html$.TrackElement._check(html$.document[dartx.createElement]("track"));
   }
   created() {
     this[dartx.defaultValue] = null;
@@ -90314,7 +90317,7 @@
     super.created();
   }
   static get supported() {
-    return html.Element.isTagSupported('track');
+    return html$.Element.isTagSupported('track');
   }
   get [dartx.defaultValue]() {
     return this.default;
@@ -90353,12 +90356,12 @@
     return this.track;
   }
 };
-dart.defineNamedConstructor(html.TrackElement, 'created');
-dart.setSignature(html.TrackElement, {
+dart.defineNamedConstructor(html$.TrackElement, 'created');
+dart.setSignature(html$.TrackElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TrackElement, []),
-    new: dart.definiteFunctionType(html.TrackElement, []),
-    created: dart.definiteFunctionType(html.TrackElement, [])
+    _: dart.definiteFunctionType(html$.TrackElement, []),
+    new: dart.definiteFunctionType(html$.TrackElement, []),
+    created: dart.definiteFunctionType(html$.TrackElement, [])
   }),
   fields: () => ({
     [dartx.defaultValue]: core.bool,
@@ -90367,7 +90370,7 @@
     [dartx.readyState]: core.int,
     [dartx.src]: core.String,
     [dartx.srclang]: core.String,
-    [dartx.track]: html.TextTrack
+    [dartx.track]: html$.TextTrack
   }),
   sfields: () => ({
     ERROR: core.int,
@@ -90377,15 +90380,15 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-html.TrackElement.ERROR = 3;
-html.TrackElement.LOADED = 2;
-html.TrackElement.LOADING = 1;
-html.TrackElement.NONE = 0;
-dart.registerExtension(dart.global.HTMLTrackElement, html.TrackElement);
+html$.TrackElement.ERROR = 3;
+html$.TrackElement.LOADED = 2;
+html$.TrackElement.LOADING = 1;
+html$.TrackElement.NONE = 0;
+dart.registerExtension(dart.global.HTMLTrackElement, html$.TrackElement);
 dart.defineExtensionNames([
   'track'
 ]);
-html.TrackEvent = class TrackEvent extends html.Event {
+html$.TrackEvent = class TrackEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90393,9 +90396,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.TrackEvent._create_1(type, eventInitDict_1);
+      return html$.TrackEvent._create_1(type, eventInitDict_1);
     }
-    return html.TrackEvent._create_2(type);
+    return html$.TrackEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.TrackEvent(type, eventInitDict);
@@ -90407,25 +90410,25 @@
     return this.track;
   }
 };
-dart.setSignature(html.TrackEvent, {
+dart.setSignature(html$.TrackEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TrackEvent, []),
-    new: dart.definiteFunctionType(html.TrackEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.TrackEvent, []),
+    new: dart.definiteFunctionType(html$.TrackEvent, [core.String], [core.Map])
   }),
   fields: () => ({[dartx.track]: core.Object}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.TrackEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.TrackEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TrackEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.TrackEvent, html.TrackEvent);
+dart.registerExtension(dart.global.TrackEvent, html$.TrackEvent);
 dart.defineExtensionNames([
   'elapsedTime',
   'propertyName',
   'pseudoElement'
 ]);
-html.TransitionEvent = class TransitionEvent extends html.Event {
+html$.TransitionEvent = class TransitionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90433,9 +90436,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.TransitionEvent._create_1(type, eventInitDict_1);
+      return html$.TransitionEvent._create_1(type, eventInitDict_1);
     }
-    return html.TransitionEvent._create_2(type);
+    return html$.TransitionEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.TransitionEvent(type, eventInitDict);
@@ -90453,10 +90456,10 @@
     return this.pseudoElement;
   }
 };
-dart.setSignature(html.TransitionEvent, {
+dart.setSignature(html$.TransitionEvent, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.TransitionEvent, []),
-    new: dart.definiteFunctionType(html.TransitionEvent, [core.String], [core.Map])
+    _: dart.definiteFunctionType(html$.TransitionEvent, []),
+    new: dart.definiteFunctionType(html$.TransitionEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [dartx.elapsedTime]: core.double,
@@ -90464,13 +90467,13 @@
     [dartx.pseudoElement]: core.String
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.TransitionEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.TransitionEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.TransitionEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.TransitionEvent, html.TransitionEvent);
-dart.registerExtension(dart.global.WebKitTransitionEvent, html.TransitionEvent);
+dart.registerExtension(dart.global.TransitionEvent, html$.TransitionEvent);
+dart.registerExtension(dart.global.WebKitTransitionEvent, html$.TransitionEvent);
 dart.defineExtensionNames([
   'firstChild',
   'lastChild',
@@ -90484,9 +90487,9 @@
   'root',
   'whatToShow'
 ]);
-html.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
+html$.TreeWalker = class TreeWalker extends _interceptors.Interceptor {
   static new(root, whatToShow) {
-    return html.document[_createTreeWalker](root, whatToShow, null);
+    return html$.document[_createTreeWalker](root, whatToShow, null);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -90528,49 +90531,49 @@
     return this.previousSibling.apply(this, args);
   }
 };
-dart.setSignature(html.TreeWalker, {
+dart.setSignature(html$.TreeWalker, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.TreeWalker, [html.Node, core.int]),
-    _: dart.definiteFunctionType(html.TreeWalker, [])
+    new: dart.definiteFunctionType(html$.TreeWalker, [html$.Node, core.int]),
+    _: dart.definiteFunctionType(html$.TreeWalker, [])
   }),
   fields: () => ({
-    [dartx.currentNode]: html.Node,
-    [dartx.filter]: html.NodeFilter,
-    [dartx.root]: html.Node,
+    [dartx.currentNode]: html$.Node,
+    [dartx.filter]: html$.NodeFilter,
+    [dartx.root]: html$.Node,
     [dartx.whatToShow]: core.int
   }),
   methods: () => ({
-    [dartx.firstChild]: dart.definiteFunctionType(html.Node, []),
-    [dartx.lastChild]: dart.definiteFunctionType(html.Node, []),
-    [dartx.nextNode]: dart.definiteFunctionType(html.Node, []),
-    [dartx.nextSibling]: dart.definiteFunctionType(html.Node, []),
-    [dartx.parentNode]: dart.definiteFunctionType(html.Node, []),
-    [dartx.previousNode]: dart.definiteFunctionType(html.Node, []),
-    [dartx.previousSibling]: dart.definiteFunctionType(html.Node, [])
+    [dartx.firstChild]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.lastChild]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.nextNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.nextSibling]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.parentNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousNode]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.previousSibling]: dart.definiteFunctionType(html$.Node, [])
   })
 });
-dart.registerExtension(dart.global.TreeWalker, html.TreeWalker);
-html.UListElement = class UListElement extends html.HtmlElement {
+dart.registerExtension(dart.global.TreeWalker, html$.TreeWalker);
+html$.UListElement = class UListElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.UListElement._check(html.document[dartx.createElement]("ul"));
+    return html$.UListElement._check(html$.document[dartx.createElement]("ul"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(html.UListElement, 'created');
-dart.setSignature(html.UListElement, {
+dart.defineNamedConstructor(html$.UListElement, 'created');
+dart.setSignature(html$.UListElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.UListElement, []),
-    new: dart.definiteFunctionType(html.UListElement, []),
-    created: dart.definiteFunctionType(html.UListElement, [])
+    _: dart.definiteFunctionType(html$.UListElement, []),
+    new: dart.definiteFunctionType(html$.UListElement, []),
+    created: dart.definiteFunctionType(html$.UListElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLUListElement, html.UListElement);
-html.UnknownElement = class UnknownElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLUListElement, html$.UListElement);
+html$.UnknownElement = class UnknownElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90578,14 +90581,14 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html.UnknownElement, 'created');
-dart.setSignature(html.UnknownElement, {
+dart.defineNamedConstructor(html$.UnknownElement, 'created');
+dart.setSignature(html$.UnknownElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.UnknownElement, []),
-    created: dart.definiteFunctionType(html.UnknownElement, [])
+    _: dart.definiteFunctionType(html$.UnknownElement, []),
+    created: dart.definiteFunctionType(html$.UnknownElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLUnknownElement, html.UnknownElement);
+dart.registerExtension(dart.global.HTMLUnknownElement, html$.UnknownElement);
 dart.defineExtensionNames([
   'toString',
   'hash',
@@ -90600,7 +90603,7 @@
   'search',
   'username'
 ]);
-html.Url = class Url extends _interceptors.Interceptor {
+html$.Url = class Url extends _interceptors.Interceptor {
   static createObjectUrl(blob_OR_source_OR_stream) {
     return (self.URL || self.webkitURL).createObjectURL(blob_OR_source_OR_stream);
   }
@@ -90686,9 +90689,9 @@
     this.username = value;
   }
 };
-html.Url[dart.implements] = () => [html.UrlUtils];
-dart.setSignature(html.Url, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Url, [])}),
+html$.Url[dart.implements] = () => [html$.UrlUtils];
+dart.setSignature(html$.Url, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Url, [])}),
   fields: () => ({
     [dartx.hash]: core.String,
     [dartx.host]: core.String,
@@ -90704,14 +90707,14 @@
   }),
   statics: () => ({
     createObjectUrl: dart.definiteFunctionType(core.String, [dart.dynamic]),
-    createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html.MediaSource]),
-    createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html.MediaStream]),
-    createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html.Blob]),
+    createObjectUrlFromSource: dart.definiteFunctionType(core.String, [html$.MediaSource]),
+    createObjectUrlFromStream: dart.definiteFunctionType(core.String, [html$.MediaStream]),
+    createObjectUrlFromBlob: dart.definiteFunctionType(core.String, [html$.Blob]),
     revokeObjectUrl: dart.definiteFunctionType(dart.void, [core.String])
   }),
   names: ['createObjectUrl', 'createObjectUrlFromSource', 'createObjectUrlFromStream', 'createObjectUrlFromBlob', 'revokeObjectUrl']
 });
-dart.registerExtension(dart.global.URL, html.Url);
+dart.registerExtension(dart.global.URL, html$.Url);
 dart.defineExtensionNames([
   'hash',
   'host',
@@ -90725,7 +90728,7 @@
   'search',
   'username'
 ]);
-html.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
+html$.UrlUtils = class UrlUtils extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90796,19 +90799,19 @@
     this[username] = value;
   }
 };
-const hash = Symbol(html.UrlUtils.name + "." + 'hash'.toString());
-const host = Symbol(html.UrlUtils.name + "." + 'host'.toString());
-const hostname = Symbol(html.UrlUtils.name + "." + 'hostname'.toString());
-const href = Symbol(html.UrlUtils.name + "." + 'href'.toString());
-const origin = Symbol(html.UrlUtils.name + "." + 'origin'.toString());
-const password = Symbol(html.UrlUtils.name + "." + 'password'.toString());
-const pathname = Symbol(html.UrlUtils.name + "." + 'pathname'.toString());
-const port = Symbol(html.UrlUtils.name + "." + 'port'.toString());
-const protocol = Symbol(html.UrlUtils.name + "." + 'protocol'.toString());
-const search = Symbol(html.UrlUtils.name + "." + 'search'.toString());
-const username = Symbol(html.UrlUtils.name + "." + 'username'.toString());
-dart.setSignature(html.UrlUtils, {
-  constructors: () => ({_: dart.definiteFunctionType(html.UrlUtils, [])}),
+const hash = Symbol(html$.UrlUtils.name + "." + 'hash'.toString());
+const host = Symbol(html$.UrlUtils.name + "." + 'host'.toString());
+const hostname = Symbol(html$.UrlUtils.name + "." + 'hostname'.toString());
+const href = Symbol(html$.UrlUtils.name + "." + 'href'.toString());
+const origin = Symbol(html$.UrlUtils.name + "." + 'origin'.toString());
+const password = Symbol(html$.UrlUtils.name + "." + 'password'.toString());
+const pathname = Symbol(html$.UrlUtils.name + "." + 'pathname'.toString());
+const port = Symbol(html$.UrlUtils.name + "." + 'port'.toString());
+const protocol = Symbol(html$.UrlUtils.name + "." + 'protocol'.toString());
+const search = Symbol(html$.UrlUtils.name + "." + 'search'.toString());
+const username = Symbol(html$.UrlUtils.name + "." + 'username'.toString());
+dart.setSignature(html$.UrlUtils, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtils, [])}),
   fields: () => ({
     hash: core.String,
     host: core.String,
@@ -90823,7 +90826,7 @@
     username: core.String
   })
 });
-dart.defineExtensionMembers(html.UrlUtils, [
+dart.defineExtensionMembers(html$.UrlUtils, [
   'hash',
   'hash',
   'host',
@@ -90857,76 +90860,76 @@
   'protocol',
   'search'
 ]);
-html.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
+html$.UrlUtilsReadOnly = class UrlUtilsReadOnly extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get hash() {
-    return this[hash];
+    return this[hash$];
   }
   set hash(value) {
     super.hash = value;
   }
   get host() {
-    return this[host];
+    return this[host$];
   }
   set host(value) {
     super.host = value;
   }
   get hostname() {
-    return this[hostname];
+    return this[hostname$];
   }
   set hostname(value) {
     super.hostname = value;
   }
   get href() {
-    return this[href];
+    return this[href$];
   }
   set href(value) {
     super.href = value;
   }
   get origin() {
-    return this[origin];
+    return this[origin$];
   }
   set origin(value) {
     super.origin = value;
   }
   get pathname() {
-    return this[pathname];
+    return this[pathname$];
   }
   set pathname(value) {
     super.pathname = value;
   }
   get port() {
-    return this[port];
+    return this[port$];
   }
   set port(value) {
     super.port = value;
   }
   get protocol() {
-    return this[protocol];
+    return this[protocol$];
   }
   set protocol(value) {
     super.protocol = value;
   }
   get search() {
-    return this[search];
+    return this[search$];
   }
   set search(value) {
     super.search = value;
   }
 };
-const hash = Symbol(html.UrlUtilsReadOnly.name + "." + 'hash'.toString());
-const host = Symbol(html.UrlUtilsReadOnly.name + "." + 'host'.toString());
-const hostname = Symbol(html.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
-const href = Symbol(html.UrlUtilsReadOnly.name + "." + 'href'.toString());
-const origin = Symbol(html.UrlUtilsReadOnly.name + "." + 'origin'.toString());
-const pathname = Symbol(html.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
-const port = Symbol(html.UrlUtilsReadOnly.name + "." + 'port'.toString());
-const protocol = Symbol(html.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
-const search = Symbol(html.UrlUtilsReadOnly.name + "." + 'search'.toString());
-dart.setSignature(html.UrlUtilsReadOnly, {
-  constructors: () => ({_: dart.definiteFunctionType(html.UrlUtilsReadOnly, [])}),
+const hash$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hash'.toString());
+const host$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'host'.toString());
+const hostname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'hostname'.toString());
+const href$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'href'.toString());
+const origin$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'origin'.toString());
+const pathname$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'pathname'.toString());
+const port$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'port'.toString());
+const protocol$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'protocol'.toString());
+const search$ = Symbol(html$.UrlUtilsReadOnly.name + "." + 'search'.toString());
+dart.setSignature(html$.UrlUtilsReadOnly, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.UrlUtilsReadOnly, [])}),
   fields: () => ({
     hash: core.String,
     host: core.String,
@@ -90939,7 +90942,7 @@
     search: core.String
   })
 });
-dart.defineExtensionMembers(html.UrlUtilsReadOnly, [
+dart.defineExtensionMembers(html$.UrlUtilsReadOnly, [
   'hash',
   'host',
   'hostname',
@@ -90958,7 +90961,7 @@
   'recommendedFieldOfView',
   'renderRect'
 ]);
-html.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
+html$.VREyeParameters = class VREyeParameters extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -90981,25 +90984,25 @@
     return this.renderRect;
   }
 };
-dart.setSignature(html.VREyeParameters, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VREyeParameters, [])}),
+dart.setSignature(html$.VREyeParameters, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VREyeParameters, [])}),
   fields: () => ({
-    [dartx.currentFieldOfView]: html.VRFieldOfView,
-    [dartx.eyeTranslation]: html.DomPoint,
-    [dartx.maximumFieldOfView]: html.VRFieldOfView,
-    [dartx.minimumFieldOfView]: html.VRFieldOfView,
-    [dartx.recommendedFieldOfView]: html.VRFieldOfView,
-    [dartx.renderRect]: html._DomRect
+    [dartx.currentFieldOfView]: html$.VRFieldOfView,
+    [dartx.eyeTranslation]: html$.DomPoint,
+    [dartx.maximumFieldOfView]: html$.VRFieldOfView,
+    [dartx.minimumFieldOfView]: html$.VRFieldOfView,
+    [dartx.recommendedFieldOfView]: html$.VRFieldOfView,
+    [dartx.renderRect]: html$._DomRect
   })
 });
-dart.registerExtension(dart.global.VREyeParameters, html.VREyeParameters);
+dart.registerExtension(dart.global.VREyeParameters, html$.VREyeParameters);
 dart.defineExtensionNames([
   'downDegrees',
   'leftDegrees',
   'rightDegrees',
   'upDegrees'
 ]);
-html.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
+html$.VRFieldOfView = class VRFieldOfView extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91007,9 +91010,9 @@
     if (fov === void 0) fov = null;
     if (fov != null) {
       let fov_1 = html_common.convertDartToNative_Dictionary(fov);
-      return html.VRFieldOfView._create_1(fov_1);
+      return html$.VRFieldOfView._create_1(fov_1);
     }
-    return html.VRFieldOfView._create_2();
+    return html$.VRFieldOfView._create_2();
   }
   static _create_1(fov) {
     return new self.VRFieldOfView(fov);
@@ -91042,10 +91045,10 @@
     this.upDegrees = value;
   }
 };
-dart.setSignature(html.VRFieldOfView, {
+dart.setSignature(html$.VRFieldOfView, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.VRFieldOfView, []),
-    new: dart.definiteFunctionType(html.VRFieldOfView, [], [core.Map])
+    _: dart.definiteFunctionType(html$.VRFieldOfView, []),
+    new: dart.definiteFunctionType(html$.VRFieldOfView, [], [core.Map])
   }),
   fields: () => ({
     [dartx.downDegrees]: core.num,
@@ -91054,12 +91057,12 @@
     [dartx.upDegrees]: core.num
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.VRFieldOfView, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.VRFieldOfView, [])
+    _create_1: dart.definiteFunctionType(html$.VRFieldOfView, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.VRFieldOfView, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.VRFieldOfView, html.VRFieldOfView);
+dart.registerExtension(dart.global.VRFieldOfView, html$.VRFieldOfView);
 dart.defineExtensionNames([
   'angularAcceleration',
   'angularVelocity',
@@ -91069,7 +91072,7 @@
   'position',
   'timeStamp'
 ]);
-html.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
+html$.VRPositionState = class VRPositionState extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91095,19 +91098,19 @@
     return this.timeStamp;
   }
 };
-dart.setSignature(html.VRPositionState, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VRPositionState, [])}),
+dart.setSignature(html$.VRPositionState, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VRPositionState, [])}),
   fields: () => ({
-    [dartx.angularAcceleration]: html.DomPoint,
-    [dartx.angularVelocity]: html.DomPoint,
-    [dartx.linearAcceleration]: html.DomPoint,
-    [dartx.linearVelocity]: html.DomPoint,
-    [dartx.orientation]: html.DomPoint,
-    [dartx.position]: html.DomPoint,
+    [dartx.angularAcceleration]: html$.DomPoint,
+    [dartx.angularVelocity]: html$.DomPoint,
+    [dartx.linearAcceleration]: html$.DomPoint,
+    [dartx.linearVelocity]: html$.DomPoint,
+    [dartx.orientation]: html$.DomPoint,
+    [dartx.position]: html$.DomPoint,
     [dartx.timeStamp]: core.double
   })
 });
-dart.registerExtension(dart.global.VRPositionState, html.VRPositionState);
+dart.registerExtension(dart.global.VRPositionState, html$.VRPositionState);
 dart.defineExtensionNames([
   'badInput',
   'customError',
@@ -91121,7 +91124,7 @@
   'valid',
   'valueMissing'
 ]);
-html.ValidityState = class ValidityState extends _interceptors.Interceptor {
+html$.ValidityState = class ValidityState extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91159,8 +91162,8 @@
     return this.valueMissing;
   }
 };
-dart.setSignature(html.ValidityState, {
-  constructors: () => ({_: dart.definiteFunctionType(html.ValidityState, [])}),
+dart.setSignature(html$.ValidityState, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.ValidityState, [])}),
   fields: () => ({
     [dartx.badInput]: core.bool,
     [dartx.customError]: core.bool,
@@ -91175,7 +91178,7 @@
     [dartx.valueMissing]: core.bool
   })
 });
-dart.registerExtension(dart.global.ValidityState, html.ValidityState);
+dart.registerExtension(dart.global.ValidityState, html$.ValidityState);
 dart.defineExtensionNames([
   'getVideoPlaybackQuality',
   'enterFullscreen',
@@ -91188,12 +91191,12 @@
   'droppedFrameCount',
   'width'
 ]);
-html.VideoElement = class VideoElement extends html.MediaElement {
+html$.VideoElement = class VideoElement extends html$.MediaElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.VideoElement._check(html.document[dartx.createElement]("video"));
+    return html$.VideoElement._check(html$.document[dartx.createElement]("video"));
   }
   created() {
     this[dartx.height] = null;
@@ -91245,13 +91248,13 @@
     return this.webkitExitFullscreen.apply(this, args);
   }
 };
-dart.defineNamedConstructor(html.VideoElement, 'created');
-html.VideoElement[dart.implements] = () => [html.CanvasImageSource];
-dart.setSignature(html.VideoElement, {
+dart.defineNamedConstructor(html$.VideoElement, 'created');
+html$.VideoElement[dart.implements] = () => [html$.CanvasImageSource];
+dart.setSignature(html$.VideoElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.VideoElement, []),
-    new: dart.definiteFunctionType(html.VideoElement, []),
-    created: dart.definiteFunctionType(html.VideoElement, [])
+    _: dart.definiteFunctionType(html$.VideoElement, []),
+    new: dart.definiteFunctionType(html$.VideoElement, []),
+    created: dart.definiteFunctionType(html$.VideoElement, [])
   }),
   fields: () => ({
     [dartx.height]: core.int,
@@ -91263,19 +91266,19 @@
     [dartx.width]: core.int
   }),
   methods: () => ({
-    [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html.VideoPlaybackQuality, []),
+    [dartx.getVideoPlaybackQuality]: dart.definiteFunctionType(html$.VideoPlaybackQuality, []),
     [dartx.enterFullscreen]: dart.definiteFunctionType(dart.void, []),
     [dartx.exitFullscreen]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.HTMLVideoElement, html.VideoElement);
+dart.registerExtension(dart.global.HTMLVideoElement, html$.VideoElement);
 dart.defineExtensionNames([
   'corruptedVideoFrames',
   'creationTime',
   'droppedVideoFrames',
   'totalVideoFrames'
 ]);
-html.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
+html$.VideoPlaybackQuality = class VideoPlaybackQuality extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91292,8 +91295,8 @@
     return this.totalVideoFrames;
   }
 };
-dart.setSignature(html.VideoPlaybackQuality, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VideoPlaybackQuality, [])}),
+dart.setSignature(html$.VideoPlaybackQuality, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoPlaybackQuality, [])}),
   fields: () => ({
     [dartx.corruptedVideoFrames]: core.int,
     [dartx.creationTime]: core.double,
@@ -91301,7 +91304,7 @@
     [dartx.totalVideoFrames]: core.int
   })
 });
-dart.registerExtension(dart.global.VideoPlaybackQuality, html.VideoPlaybackQuality);
+dart.registerExtension(dart.global.VideoPlaybackQuality, html$.VideoPlaybackQuality);
 dart.defineExtensionNames([
   'id',
   'kind',
@@ -91309,7 +91312,7 @@
   'language',
   'selected'
 ]);
-html.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
+html$.VideoTrack = class VideoTrack extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91332,8 +91335,8 @@
     this.selected = value;
   }
 };
-dart.setSignature(html.VideoTrack, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VideoTrack, [])}),
+dart.setSignature(html$.VideoTrack, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrack, [])}),
   fields: () => ({
     [dartx.id]: core.String,
     [dartx.kind]: core.String,
@@ -91342,14 +91345,14 @@
     [dartx.selected]: core.bool
   })
 });
-dart.registerExtension(dart.global.VideoTrack, html.VideoTrack);
+dart.registerExtension(dart.global.VideoTrack, html$.VideoTrack);
 dart.defineExtensionNames([
   'getTrackById',
   'onChange',
   'length',
   'selectedIndex'
 ]);
-html.VideoTrackList = class VideoTrackList extends html.EventTarget {
+html$.VideoTrackList = class VideoTrackList extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91366,29 +91369,29 @@
     return this.getTrackById.apply(this, args);
   }
   get [dartx.onChange]() {
-    return html.VideoTrackList.changeEvent.forTarget(this);
+    return html$.VideoTrackList.changeEvent.forTarget(this);
   }
 };
-dart.setSignature(html.VideoTrackList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VideoTrackList, [])}),
+dart.setSignature(html$.VideoTrackList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VideoTrackList, [])}),
   fields: () => ({
     [dartx.length]: core.int,
     [dartx.selectedIndex]: core.int
   }),
-  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
-    [__getter__]: dart.definiteFunctionType(html.VideoTrack, [core.int]),
-    [dartx.getTrackById]: dart.definiteFunctionType(html.VideoTrack, [core.String])
+    [__getter__]: dart.definiteFunctionType(html$.VideoTrack, [core.int]),
+    [dartx.getTrackById]: dart.definiteFunctionType(html$.VideoTrack, [core.String])
   }),
   sfields: () => ({changeEvent: EventStreamProviderOfEvent()})
 });
-dart.defineLazy(html.VideoTrackList, {
+dart.defineLazy(html$.VideoTrackList, {
   get changeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('change'));
   }
 });
-dart.registerExtension(dart.global.VideoTrackList, html.VideoTrackList);
-html.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
+dart.registerExtension(dart.global.VideoTrackList, html$.VideoTrackList);
+html$.VoidCallback = dart.typedef('VoidCallback', () => dart.functionType(dart.void, []));
 dart.defineExtensionNames([
   'getCueAsHtml',
   'align',
@@ -91400,12 +91403,12 @@
   'text',
   'vertical'
 ]);
-html.VttCue = class VttCue extends html.TextTrackCue {
+html$.VttCue = class VttCue extends html$.TextTrackCue {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(startTime, endTime, text) {
-    return html.VttCue._create_1(startTime, endTime, text);
+    return html$.VttCue._create_1(startTime, endTime, text);
   }
   static _create_1(startTime, endTime, text) {
     return new VTTCue(startTime, endTime, text);
@@ -91462,10 +91465,10 @@
     return this.getCueAsHTML.apply(this, args);
   }
 };
-dart.setSignature(html.VttCue, {
+dart.setSignature(html$.VttCue, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.VttCue, []),
-    new: dart.definiteFunctionType(html.VttCue, [core.num, core.num, core.String])
+    _: dart.definiteFunctionType(html$.VttCue, []),
+    new: dart.definiteFunctionType(html$.VttCue, [core.num, core.num, core.String])
   }),
   fields: () => ({
     [dartx.align]: core.String,
@@ -91477,11 +91480,11 @@
     [dartx.text]: core.String,
     [dartx.vertical]: core.String
   }),
-  methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html.DocumentFragment, [])}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
+  methods: () => ({[dartx.getCueAsHtml]: dart.definiteFunctionType(html$.DocumentFragment, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttCue, [dart.dynamic, dart.dynamic, dart.dynamic])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.VTTCue, html.VttCue);
+dart.registerExtension(dart.global.VTTCue, html$.VttCue);
 dart.defineExtensionNames([
   'height',
   'id',
@@ -91493,12 +91496,12 @@
   'viewportAnchorY',
   'width'
 ]);
-html.VttRegion = class VttRegion extends _interceptors.Interceptor {
+html$.VttRegion = class VttRegion extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.VttRegion._create_1();
+    return html$.VttRegion._create_1();
   }
   static _create_1() {
     return new VTTRegion();
@@ -91555,10 +91558,10 @@
     this.width = value;
   }
 };
-dart.setSignature(html.VttRegion, {
+dart.setSignature(html$.VttRegion, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.VttRegion, []),
-    new: dart.definiteFunctionType(html.VttRegion, [])
+    _: dart.definiteFunctionType(html$.VttRegion, []),
+    new: dart.definiteFunctionType(html$.VttRegion, [])
   }),
   fields: () => ({
     [dartx.height]: core.int,
@@ -91566,21 +91569,21 @@
     [dartx.regionAnchorX]: core.num,
     [dartx.regionAnchorY]: core.num,
     [dartx.scroll]: core.String,
-    [dartx.track]: html.TextTrack,
+    [dartx.track]: html$.TextTrack,
     [dartx.viewportAnchorX]: core.num,
     [dartx.viewportAnchorY]: core.num,
     [dartx.width]: core.num
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.VttRegion, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.VttRegion, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.VTTRegion, html.VttRegion);
+dart.registerExtension(dart.global.VTTRegion, html$.VttRegion);
 dart.defineExtensionNames([
   'getRegionById',
   'item',
   'length'
 ]);
-html.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
+html$.VttRegionList = class VttRegionList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -91594,15 +91597,15 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html.VttRegionList, {
-  constructors: () => ({_: dart.definiteFunctionType(html.VttRegionList, [])}),
+dart.setSignature(html$.VttRegionList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.VttRegionList, [])}),
   fields: () => ({[dartx.length]: core.int}),
   methods: () => ({
-    [dartx.getRegionById]: dart.definiteFunctionType(html.VttRegion, [core.String]),
-    [dartx.item]: dart.definiteFunctionType(html.VttRegion, [core.int])
+    [dartx.getRegionById]: dart.definiteFunctionType(html$.VttRegion, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.VttRegion, [core.int])
   })
 });
-dart.registerExtension(dart.global.VTTRegionList, html.VttRegionList);
+dart.registerExtension(dart.global.VTTRegionList, html$.VttRegionList);
 dart.defineExtensionNames([
   'close',
   'send',
@@ -91621,16 +91624,16 @@
   'readyState',
   'url'
 ]);
-html.WebSocket = class WebSocket extends html.EventTarget {
+html$.WebSocket = class WebSocket extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(url, protocols) {
     if (protocols === void 0) protocols = null;
     if (protocols != null) {
-      return html.WebSocket._create_1(url, protocols);
+      return html$.WebSocket._create_1(url, protocols);
     }
-    return html.WebSocket._create_2(url);
+    return html$.WebSocket._create_2(url);
   }
   static _create_1(url, protocols) {
     return new self.WebSocket(url, protocols);
@@ -91681,22 +91684,22 @@
     return this.send.apply(this, args);
   }
   get [dartx.onClose]() {
-    return html.WebSocket.closeEvent.forTarget(this);
+    return html$.WebSocket.closeEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.WebSocket.errorEvent.forTarget(this);
+    return html$.WebSocket.errorEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.WebSocket.messageEvent.forTarget(this);
+    return html$.WebSocket.messageEvent.forTarget(this);
   }
   get [dartx.onOpen]() {
-    return html.WebSocket.openEvent.forTarget(this);
+    return html$.WebSocket.openEvent.forTarget(this);
   }
 };
-dart.setSignature(html.WebSocket, {
+dart.setSignature(html$.WebSocket, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.WebSocket, []),
-    new: dart.definiteFunctionType(html.WebSocket, [core.String], [core.Object])
+    _: dart.definiteFunctionType(html$.WebSocket, []),
+    new: dart.definiteFunctionType(html$.WebSocket, [core.String], [core.Object])
   }),
   fields: () => ({
     [dartx.binaryType]: core.String,
@@ -91707,15 +91710,15 @@
     [dartx.url]: core.String
   }),
   getters: () => ({
-    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html.CloseEvent), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), []),
-    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    [dartx.onClose]: dart.definiteFunctionType(async.Stream$(html$.CloseEvent), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onOpen]: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   methods: () => ({
     [dartx.close]: dart.definiteFunctionType(dart.void, [], [core.int, core.String]),
     [dartx.send]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html.Blob]),
+    [dartx.sendBlob]: dart.definiteFunctionType(dart.void, [html$.Blob]),
     [dartx.sendByteBuffer]: dart.definiteFunctionType(dart.void, [typed_data.ByteBuffer]),
     [dartx.sendString]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.sendTypedData]: dart.definiteFunctionType(dart.void, [typed_data.TypedData])
@@ -91732,16 +91735,16 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.WebSocket, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.WebSocket, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.WebSocket, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-html.WebSocket.CLOSED = 3;
-html.WebSocket.CLOSING = 2;
-html.WebSocket.CONNECTING = 0;
-html.WebSocket.OPEN = 1;
-dart.defineLazy(html.WebSocket, {
+html$.WebSocket.CLOSED = 3;
+html$.WebSocket.CLOSING = 2;
+html$.WebSocket.CONNECTING = 0;
+html$.WebSocket.OPEN = 1;
+dart.defineLazy(html$.WebSocket, {
   get closeEvent() {
     return dart.const(new (EventStreamProviderOfCloseEvent())('close'));
   },
@@ -91755,7 +91758,7 @@
     return dart.const(new (EventStreamProviderOfEvent())('open'));
   }
 });
-dart.registerExtension(dart.global.WebSocket, html.WebSocket);
+dart.registerExtension(dart.global.WebSocket, html$.WebSocket);
 const _deltaX = Symbol('_deltaX');
 const _deltaY = Symbol('_deltaY');
 const _wheelDelta = Symbol('_wheelDelta');
@@ -91770,7 +91773,7 @@
   'deltaMode',
   'deltaZ'
 ]);
-html.WheelEvent = class WheelEvent extends html.MouseEvent {
+html$.WheelEvent = class WheelEvent extends html$.MouseEvent {
   static new(type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
     let deltaX = opts && 'deltaX' in opts ? opts.deltaX : 0;
@@ -91792,7 +91795,7 @@
     let relatedTarget = opts && 'relatedTarget' in opts ? opts.relatedTarget : null;
     let options = dart.map({view: view, deltaMode: deltaMode, deltaX: deltaX, deltaY: deltaY, deltaZ: deltaZ, detail: detail, screenX: screenX, screenY: screenY, clientX: clientX, clientY: clientY, button: button, bubbles: canBubble, cancelable: cancelable, ctrlKey: ctrlKey, altKey: altKey, shiftKey: shiftKey, metaKey: metaKey, relatedTarget: relatedTarget}, core.String, core.Object);
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
     return new self.WheelEvent(type, html_common.convertDartToNative_Dictionary(options));
   }
@@ -91800,9 +91803,9 @@
     if (eventInitDict === void 0) eventInitDict = null;
     if (eventInitDict != null) {
       let eventInitDict_1 = html_common.convertDartToNative_Dictionary(eventInitDict);
-      return html.WheelEvent._create_1(type, eventInitDict_1);
+      return html$.WheelEvent._create_1(type, eventInitDict_1);
     }
-    return html.WheelEvent._create_2(type);
+    return html$.WheelEvent._create_2(type);
   }
   static _create_1(type, eventInitDict) {
     return new self.WheelEvent(type, eventInitDict);
@@ -91859,10 +91862,10 @@
     return this.initWheelEvent.apply(this, args);
   }
 };
-dart.setSignature(html.WheelEvent, {
+dart.setSignature(html$.WheelEvent, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.WheelEvent, [core.String], {view: html.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html.EventTarget}),
-    _: dart.definiteFunctionType(html.WheelEvent, [core.String], [core.Map])
+    new: dart.definiteFunctionType(html$.WheelEvent, [core.String], {view: html$.Window, deltaX: core.num, deltaY: core.num, deltaZ: core.num, deltaMode: core.int, detail: core.int, screenX: core.int, screenY: core.int, clientX: core.int, clientY: core.int, button: core.int, canBubble: core.bool, cancelable: core.bool, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, relatedTarget: html$.EventTarget}),
+    _: dart.definiteFunctionType(html$.WheelEvent, [core.String], [core.Map])
   }),
   fields: () => ({
     [_deltaX]: core.double,
@@ -91880,8 +91883,8 @@
     [_hasInitWheelEvent]: dart.definiteFunctionType(core.bool, [])
   }),
   methods: () => ({
-    [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html.EventTarget, core.int]),
-    [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.int, core.int, core.int, core.int, core.int, core.int, html.EventTarget, core.String, core.int, core.int, core.int, core.int])
+    [_initMouseScrollEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.bool, core.bool, core.bool, core.bool, core.int, html$.EventTarget, core.int]),
+    [_initWheelEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int, core.int, core.int, core.int, core.int, core.int, html$.EventTarget, core.String, core.int, core.int, core.int, core.int])
   }),
   sfields: () => ({
     DOM_DELTA_LINE: core.int,
@@ -91889,15 +91892,15 @@
     DOM_DELTA_PIXEL: core.int
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html.WheelEvent, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html.WheelEvent, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$.WheelEvent, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-html.WheelEvent.DOM_DELTA_LINE = 1;
-html.WheelEvent.DOM_DELTA_PAGE = 2;
-html.WheelEvent.DOM_DELTA_PIXEL = 0;
-dart.registerExtension(dart.global.WheelEvent, html.WheelEvent);
+html$.WheelEvent.DOM_DELTA_LINE = 1;
+html$.WheelEvent.DOM_DELTA_PAGE = 2;
+html$.WheelEvent.DOM_DELTA_PIXEL = 0;
+dart.registerExtension(dart.global.WheelEvent, html$.WheelEvent);
 const _open2 = Symbol('_open2');
 const _open3 = Symbol('_open3');
 const _location = Symbol('_location');
@@ -92073,7 +92076,7 @@
   'styleMedia',
   'toolbar'
 ]);
-html.Window = class Window extends html.EventTarget {
+html$.Window = class Window extends html$.EventTarget {
   get [dartx.animationFrame]() {
     let completer = CompleterOfnum().sync();
     this[dartx.requestAnimationFrame](dart.fn(time => {
@@ -92093,13 +92096,13 @@
   [dartx.open](url, name, options) {
     if (options === void 0) options = null;
     if (options == null) {
-      return html._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
+      return html$._DOMWindowCrossFrame._createSafe(this[_open2](url, name));
     } else {
-      return html._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
+      return html$._DOMWindowCrossFrame._createSafe(this[_open3](url, name, options));
     }
   }
   get [dartx.location]() {
-    return html.Location._check(this[_location]);
+    return html$.Location._check(this[_location]);
   }
   set [dartx.location](value) {
     this[_location] = value;
@@ -92112,7 +92115,7 @@
   }
   [dartx.requestAnimationFrame](callback) {
     this[_ensureRequestAnimationFrame]();
-    return this[_requestAnimationFrame](html._wrapZone(core.num, dart.dynamic)(callback));
+    return this[_requestAnimationFrame](html$._wrapZone(core.num, dart.dynamic)(callback));
   }
   [dartx.cancelAnimationFrame](id) {
     this[_ensureRequestAnimationFrame]();
@@ -92147,14 +92150,14 @@
     return this.indexedDB || this.webkitIndexedDB || this.mozIndexedDB;
   }
   get [dartx.console]() {
-    return html.Console._safeConsole;
+    return html$.Console._safeConsole;
   }
   [dartx.requestFileSystem](size, opts) {
     let persistent = opts && 'persistent' in opts ? opts.persistent : false;
     return this[_requestFileSystem](dart.test(persistent) ? 1 : 0, size);
   }
   static get supportsPointConversions() {
-    return html.DomPoint.supported;
+    return html$.DomPoint.supported;
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -92217,7 +92220,7 @@
     return this.offscreenBuffering;
   }
   get [dartx.opener]() {
-    return html._convertNativeToDart_Window(this[_get_opener]);
+    return html$._convertNativeToDart_Window(this[_get_opener]);
   }
   get [_get_opener]() {
     return this.opener;
@@ -92241,7 +92244,7 @@
     return this.pageYOffset;
   }
   get [dartx.parent]() {
-    return html._convertNativeToDart_Window(this[_get_parent]);
+    return html$._convertNativeToDart_Window(this[_get_parent]);
   }
   get [_get_parent]() {
     return this.parent;
@@ -92268,7 +92271,7 @@
     return this.scrollbars;
   }
   get [dartx.self]() {
-    return html._convertNativeToDart_Window(this[_get_self]);
+    return html$._convertNativeToDart_Window(this[_get_self]);
   }
   get [_get_self]() {
     return this.self;
@@ -92295,23 +92298,23 @@
     return this.toolbar;
   }
   get [dartx.top]() {
-    return html._convertNativeToDart_Window(this[_get_top]);
+    return html$._convertNativeToDart_Window(this[_get_top]);
   }
   get [_get_top]() {
     return this.top;
   }
   get [dartx.window]() {
-    return html._convertNativeToDart_Window(this[_get_window]);
+    return html$._convertNativeToDart_Window(this[_get_window]);
   }
   get [_get_window]() {
     return this.window;
   }
   [__getter__](index_OR_name) {
     if (typeof index_OR_name == 'number') {
-      return html._convertNativeToDart_Window(this[__getter___1](index_OR_name));
+      return html$._convertNativeToDart_Window(this[__getter___1](index_OR_name));
     }
     if (typeof index_OR_name == 'string') {
-      return html._convertNativeToDart_Window(this[__getter___2](index_OR_name));
+      return html$._convertNativeToDart_Window(this[__getter___2](index_OR_name));
     }
     dart.throw(new core.ArgumentError("Incorrect number or type of arguments"));
   }
@@ -92575,232 +92578,232 @@
     return this.setTimeout.apply(this, args);
   }
   get [dartx.onContentLoaded]() {
-    return html.Window.contentLoadedEvent.forTarget(this);
+    return html$.Window.contentLoadedEvent.forTarget(this);
   }
   get [dartx.onAbort]() {
-    return html.Element.abortEvent.forTarget(this);
+    return html$.Element.abortEvent.forTarget(this);
   }
   get [dartx.onBlur]() {
-    return html.Element.blurEvent.forTarget(this);
+    return html$.Element.blurEvent.forTarget(this);
   }
   get [dartx.onCanPlay]() {
-    return html.Element.canPlayEvent.forTarget(this);
+    return html$.Element.canPlayEvent.forTarget(this);
   }
   get [dartx.onCanPlayThrough]() {
-    return html.Element.canPlayThroughEvent.forTarget(this);
+    return html$.Element.canPlayThroughEvent.forTarget(this);
   }
   get [dartx.onChange]() {
-    return html.Element.changeEvent.forTarget(this);
+    return html$.Element.changeEvent.forTarget(this);
   }
   get [dartx.onClick]() {
-    return html.Element.clickEvent.forTarget(this);
+    return html$.Element.clickEvent.forTarget(this);
   }
   get [dartx.onContextMenu]() {
-    return html.Element.contextMenuEvent.forTarget(this);
+    return html$.Element.contextMenuEvent.forTarget(this);
   }
   get [dartx.onDoubleClick]() {
-    return html.Element.doubleClickEvent.forTarget(this);
+    return html$.Element.doubleClickEvent.forTarget(this);
   }
   get [dartx.onDeviceMotion]() {
-    return html.Window.deviceMotionEvent.forTarget(this);
+    return html$.Window.deviceMotionEvent.forTarget(this);
   }
   get [dartx.onDeviceOrientation]() {
-    return html.Window.deviceOrientationEvent.forTarget(this);
+    return html$.Window.deviceOrientationEvent.forTarget(this);
   }
   get [dartx.onDrag]() {
-    return html.Element.dragEvent.forTarget(this);
+    return html$.Element.dragEvent.forTarget(this);
   }
   get [dartx.onDragEnd]() {
-    return html.Element.dragEndEvent.forTarget(this);
+    return html$.Element.dragEndEvent.forTarget(this);
   }
   get [dartx.onDragEnter]() {
-    return html.Element.dragEnterEvent.forTarget(this);
+    return html$.Element.dragEnterEvent.forTarget(this);
   }
   get [dartx.onDragLeave]() {
-    return html.Element.dragLeaveEvent.forTarget(this);
+    return html$.Element.dragLeaveEvent.forTarget(this);
   }
   get [dartx.onDragOver]() {
-    return html.Element.dragOverEvent.forTarget(this);
+    return html$.Element.dragOverEvent.forTarget(this);
   }
   get [dartx.onDragStart]() {
-    return html.Element.dragStartEvent.forTarget(this);
+    return html$.Element.dragStartEvent.forTarget(this);
   }
   get [dartx.onDrop]() {
-    return html.Element.dropEvent.forTarget(this);
+    return html$.Element.dropEvent.forTarget(this);
   }
   get [dartx.onDurationChange]() {
-    return html.Element.durationChangeEvent.forTarget(this);
+    return html$.Element.durationChangeEvent.forTarget(this);
   }
   get [dartx.onEmptied]() {
-    return html.Element.emptiedEvent.forTarget(this);
+    return html$.Element.emptiedEvent.forTarget(this);
   }
   get [dartx.onEnded]() {
-    return html.Element.endedEvent.forTarget(this);
+    return html$.Element.endedEvent.forTarget(this);
   }
   get [dartx.onError]() {
-    return html.Element.errorEvent.forTarget(this);
+    return html$.Element.errorEvent.forTarget(this);
   }
   get [dartx.onFocus]() {
-    return html.Element.focusEvent.forTarget(this);
+    return html$.Element.focusEvent.forTarget(this);
   }
   get [dartx.onHashChange]() {
-    return html.Window.hashChangeEvent.forTarget(this);
+    return html$.Window.hashChangeEvent.forTarget(this);
   }
   get [dartx.onInput]() {
-    return html.Element.inputEvent.forTarget(this);
+    return html$.Element.inputEvent.forTarget(this);
   }
   get [dartx.onInvalid]() {
-    return html.Element.invalidEvent.forTarget(this);
+    return html$.Element.invalidEvent.forTarget(this);
   }
   get [dartx.onKeyDown]() {
-    return html.Element.keyDownEvent.forTarget(this);
+    return html$.Element.keyDownEvent.forTarget(this);
   }
   get [dartx.onKeyPress]() {
-    return html.Element.keyPressEvent.forTarget(this);
+    return html$.Element.keyPressEvent.forTarget(this);
   }
   get [dartx.onKeyUp]() {
-    return html.Element.keyUpEvent.forTarget(this);
+    return html$.Element.keyUpEvent.forTarget(this);
   }
   get [dartx.onLoad]() {
-    return html.Element.loadEvent.forTarget(this);
+    return html$.Element.loadEvent.forTarget(this);
   }
   get [dartx.onLoadedData]() {
-    return html.Element.loadedDataEvent.forTarget(this);
+    return html$.Element.loadedDataEvent.forTarget(this);
   }
   get [dartx.onLoadedMetadata]() {
-    return html.Element.loadedMetadataEvent.forTarget(this);
+    return html$.Element.loadedMetadataEvent.forTarget(this);
   }
   get [dartx.onLoadStart]() {
-    return html.Window.loadStartEvent.forTarget(this);
+    return html$.Window.loadStartEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.Window.messageEvent.forTarget(this);
+    return html$.Window.messageEvent.forTarget(this);
   }
   get [dartx.onMouseDown]() {
-    return html.Element.mouseDownEvent.forTarget(this);
+    return html$.Element.mouseDownEvent.forTarget(this);
   }
   get [dartx.onMouseEnter]() {
-    return html.Element.mouseEnterEvent.forTarget(this);
+    return html$.Element.mouseEnterEvent.forTarget(this);
   }
   get [dartx.onMouseLeave]() {
-    return html.Element.mouseLeaveEvent.forTarget(this);
+    return html$.Element.mouseLeaveEvent.forTarget(this);
   }
   get [dartx.onMouseMove]() {
-    return html.Element.mouseMoveEvent.forTarget(this);
+    return html$.Element.mouseMoveEvent.forTarget(this);
   }
   get [dartx.onMouseOut]() {
-    return html.Element.mouseOutEvent.forTarget(this);
+    return html$.Element.mouseOutEvent.forTarget(this);
   }
   get [dartx.onMouseOver]() {
-    return html.Element.mouseOverEvent.forTarget(this);
+    return html$.Element.mouseOverEvent.forTarget(this);
   }
   get [dartx.onMouseUp]() {
-    return html.Element.mouseUpEvent.forTarget(this);
+    return html$.Element.mouseUpEvent.forTarget(this);
   }
   get [dartx.onMouseWheel]() {
-    return html.Element.mouseWheelEvent.forTarget(this);
+    return html$.Element.mouseWheelEvent.forTarget(this);
   }
   get [dartx.onOffline]() {
-    return html.Window.offlineEvent.forTarget(this);
+    return html$.Window.offlineEvent.forTarget(this);
   }
   get [dartx.onOnline]() {
-    return html.Window.onlineEvent.forTarget(this);
+    return html$.Window.onlineEvent.forTarget(this);
   }
   get [dartx.onPageHide]() {
-    return html.Window.pageHideEvent.forTarget(this);
+    return html$.Window.pageHideEvent.forTarget(this);
   }
   get [dartx.onPageShow]() {
-    return html.Window.pageShowEvent.forTarget(this);
+    return html$.Window.pageShowEvent.forTarget(this);
   }
   get [dartx.onPause]() {
-    return html.Element.pauseEvent.forTarget(this);
+    return html$.Element.pauseEvent.forTarget(this);
   }
   get [dartx.onPlay]() {
-    return html.Element.playEvent.forTarget(this);
+    return html$.Element.playEvent.forTarget(this);
   }
   get [dartx.onPlaying]() {
-    return html.Element.playingEvent.forTarget(this);
+    return html$.Element.playingEvent.forTarget(this);
   }
   get [dartx.onPopState]() {
-    return html.Window.popStateEvent.forTarget(this);
+    return html$.Window.popStateEvent.forTarget(this);
   }
   get [dartx.onProgress]() {
-    return html.Window.progressEvent.forTarget(this);
+    return html$.Window.progressEvent.forTarget(this);
   }
   get [dartx.onRateChange]() {
-    return html.Element.rateChangeEvent.forTarget(this);
+    return html$.Element.rateChangeEvent.forTarget(this);
   }
   get [dartx.onReset]() {
-    return html.Element.resetEvent.forTarget(this);
+    return html$.Element.resetEvent.forTarget(this);
   }
   get [dartx.onResize]() {
-    return html.Element.resizeEvent.forTarget(this);
+    return html$.Element.resizeEvent.forTarget(this);
   }
   get [dartx.onScroll]() {
-    return html.Element.scrollEvent.forTarget(this);
+    return html$.Element.scrollEvent.forTarget(this);
   }
   get [dartx.onSearch]() {
-    return html.Element.searchEvent.forTarget(this);
+    return html$.Element.searchEvent.forTarget(this);
   }
   get [dartx.onSeeked]() {
-    return html.Element.seekedEvent.forTarget(this);
+    return html$.Element.seekedEvent.forTarget(this);
   }
   get [dartx.onSeeking]() {
-    return html.Element.seekingEvent.forTarget(this);
+    return html$.Element.seekingEvent.forTarget(this);
   }
   get [dartx.onSelect]() {
-    return html.Element.selectEvent.forTarget(this);
+    return html$.Element.selectEvent.forTarget(this);
   }
   get [dartx.onStalled]() {
-    return html.Element.stalledEvent.forTarget(this);
+    return html$.Element.stalledEvent.forTarget(this);
   }
   get [dartx.onStorage]() {
-    return html.Window.storageEvent.forTarget(this);
+    return html$.Window.storageEvent.forTarget(this);
   }
   get [dartx.onSubmit]() {
-    return html.Element.submitEvent.forTarget(this);
+    return html$.Element.submitEvent.forTarget(this);
   }
   get [dartx.onSuspend]() {
-    return html.Element.suspendEvent.forTarget(this);
+    return html$.Element.suspendEvent.forTarget(this);
   }
   get [dartx.onTimeUpdate]() {
-    return html.Element.timeUpdateEvent.forTarget(this);
+    return html$.Element.timeUpdateEvent.forTarget(this);
   }
   get [dartx.onTouchCancel]() {
-    return html.Element.touchCancelEvent.forTarget(this);
+    return html$.Element.touchCancelEvent.forTarget(this);
   }
   get [dartx.onTouchEnd]() {
-    return html.Element.touchEndEvent.forTarget(this);
+    return html$.Element.touchEndEvent.forTarget(this);
   }
   get [dartx.onTouchMove]() {
-    return html.Element.touchMoveEvent.forTarget(this);
+    return html$.Element.touchMoveEvent.forTarget(this);
   }
   get [dartx.onTouchStart]() {
-    return html.Element.touchStartEvent.forTarget(this);
+    return html$.Element.touchStartEvent.forTarget(this);
   }
   get [dartx.onTransitionEnd]() {
-    return html.Element.transitionEndEvent.forTarget(this);
+    return html$.Element.transitionEndEvent.forTarget(this);
   }
   get [dartx.onUnload]() {
-    return html.Window.unloadEvent.forTarget(this);
+    return html$.Window.unloadEvent.forTarget(this);
   }
   get [dartx.onVolumeChange]() {
-    return html.Element.volumeChangeEvent.forTarget(this);
+    return html$.Element.volumeChangeEvent.forTarget(this);
   }
   get [dartx.onWaiting]() {
-    return html.Element.waitingEvent.forTarget(this);
+    return html$.Element.waitingEvent.forTarget(this);
   }
   get [dartx.onAnimationEnd]() {
-    return html.Window.animationEndEvent.forTarget(this);
+    return html$.Window.animationEndEvent.forTarget(this);
   }
   get [dartx.onAnimationIteration]() {
-    return html.Window.animationIterationEvent.forTarget(this);
+    return html$.Window.animationIterationEvent.forTarget(this);
   }
   get [dartx.onAnimationStart]() {
-    return html.Window.animationStartEvent.forTarget(this);
+    return html$.Window.animationStartEvent.forTarget(this);
   }
   get [dartx.onBeforeUnload]() {
-    return html.Window.beforeUnloadEvent.forTarget(this);
+    return html$.Window.beforeUnloadEvent.forTarget(this);
   }
   [dartx.moveTo](p) {
     this[_moveTo](dart.asInt(p.x), dart.asInt(p.y));
@@ -92818,25 +92821,25 @@
     return "scrollY" in this ? this.scrollY[dartx.round]() : this[dartx.document][dartx.documentElement][dartx.scrollTop];
   }
 };
-html.Window[dart.implements] = () => [html.WindowEventHandlers, html.WindowBase, html.GlobalEventHandlers, html._WindowTimers, html.WindowBase64];
-dart.setSignature(html.Window, {
-  constructors: () => ({_: dart.definiteFunctionType(html.Window, [])}),
+html$.Window[dart.implements] = () => [html$.WindowEventHandlers, html$.WindowBase, html$.GlobalEventHandlers, html$._WindowTimers, html$.WindowBase64];
+dart.setSignature(html$.Window, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.Window, [])}),
   fields: () => ({
-    [dartx.applicationCache]: html.ApplicationCache,
-    [dartx.caches]: html.CacheStorage,
+    [dartx.applicationCache]: html$.ApplicationCache,
+    [dartx.caches]: html$.CacheStorage,
     [dartx.closed]: core.bool,
-    [dartx.crypto]: html.Crypto,
+    [dartx.crypto]: html$.Crypto,
     [dartx.defaultStatus]: core.String,
     [dartx.defaultstatus]: core.String,
     [dartx.devicePixelRatio]: core.double,
-    [dartx.history]: html.History,
+    [dartx.history]: html$.History,
     [dartx.innerHeight]: core.int,
     [dartx.innerWidth]: core.int,
-    [dartx.localStorage]: html.Storage,
-    [dartx.locationbar]: html.BarProp,
-    [dartx.menubar]: html.BarProp,
+    [dartx.localStorage]: html$.Storage,
+    [dartx.locationbar]: html$.BarProp,
+    [dartx.menubar]: html$.BarProp,
     [dartx.name]: core.String,
-    [dartx.navigator]: html.Navigator,
+    [dartx.navigator]: html$.Navigator,
     [dartx.offscreenBuffering]: core.bool,
     [_get_opener]: dart.dynamic,
     [dartx.orientation]: core.int,
@@ -92845,111 +92848,111 @@
     [_pageXOffset]: core.double,
     [_pageYOffset]: core.double,
     [_get_parent]: dart.dynamic,
-    [dartx.performance]: html.Performance,
-    [dartx.screen]: html.Screen,
+    [dartx.performance]: html$.Performance,
+    [dartx.screen]: html$.Screen,
     [dartx.screenLeft]: core.int,
     [dartx.screenTop]: core.int,
     [dartx.screenX]: core.int,
     [dartx.screenY]: core.int,
-    [dartx.scrollbars]: html.BarProp,
+    [dartx.scrollbars]: html$.BarProp,
     [_get_self]: dart.dynamic,
-    [dartx.sessionStorage]: html.Storage,
-    [dartx.speechSynthesis]: html.SpeechSynthesis,
+    [dartx.sessionStorage]: html$.Storage,
+    [dartx.speechSynthesis]: html$.SpeechSynthesis,
     [dartx.status]: core.String,
-    [dartx.statusbar]: html.BarProp,
-    [dartx.styleMedia]: html.StyleMedia,
-    [dartx.toolbar]: html.BarProp,
+    [dartx.statusbar]: html$.BarProp,
+    [dartx.styleMedia]: html$.StyleMedia,
+    [dartx.toolbar]: html$.BarProp,
     [_get_top]: dart.dynamic,
     [_get_window]: dart.dynamic
   }),
   getters: () => ({
     [dartx.animationFrame]: dart.definiteFunctionType(async.Future$(core.num), []),
-    [dartx.document]: dart.definiteFunctionType(html.Document, []),
-    [dartx.location]: dart.definiteFunctionType(html.Location, []),
+    [dartx.document]: dart.definiteFunctionType(html$.Document, []),
+    [dartx.location]: dart.definiteFunctionType(html$.Location, []),
     [_location]: dart.definiteFunctionType(dart.dynamic, []),
     [dartx.indexedDB]: dart.definiteFunctionType(indexed_db.IdbFactory, []),
-    [dartx.console]: dart.definiteFunctionType(html.Console, []),
-    [dartx.opener]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.parent]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.self]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.top]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.window]: dart.definiteFunctionType(html.WindowBase, []),
-    [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html.DeviceMotionEvent), []),
-    [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html.DeviceOrientationEvent), []),
-    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html.KeyboardEvent), []),
-    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), []),
-    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html.MouseEvent), []),
-    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html.WheelEvent), []),
-    [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html.PopStateEvent), []),
-    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html.StorageEvent), []),
-    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html.TouchEvent), []),
-    [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html.TransitionEvent), []),
-    [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html.AnimationEvent), []),
-    [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html.AnimationEvent), []),
-    [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html.AnimationEvent), []),
-    [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html.Event), []),
+    [dartx.console]: dart.definiteFunctionType(html$.Console, []),
+    [dartx.opener]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.parent]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.self]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.top]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.window]: dart.definiteFunctionType(html$.WindowBase, []),
+    [dartx.onContentLoaded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAbort]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onBlur]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onCanPlayThrough]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onClick]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onContextMenu]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDoubleClick]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onDeviceMotion]: dart.definiteFunctionType(async.Stream$(html$.DeviceMotionEvent), []),
+    [dartx.onDeviceOrientation]: dart.definiteFunctionType(async.Stream$(html$.DeviceOrientationEvent), []),
+    [dartx.onDrag]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnd]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDragStart]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDrop]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onDurationChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEmptied]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onFocus]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onHashChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInput]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onInvalid]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onKeyDown]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyPress]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onKeyUp]: dart.definiteFunctionType(async.Stream$(html$.KeyboardEvent), []),
+    [dartx.onLoad]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedData]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadedMetadata]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onLoadStart]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    [dartx.onMouseDown]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseEnter]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseLeave]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseMove]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOut]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseOver]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseUp]: dart.definiteFunctionType(async.Stream$(html$.MouseEvent), []),
+    [dartx.onMouseWheel]: dart.definiteFunctionType(async.Stream$(html$.WheelEvent), []),
+    [dartx.onOffline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onOnline]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPageHide]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPageShow]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPause]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlay]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPlaying]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onPopState]: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
+    [dartx.onProgress]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onRateChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onReset]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onResize]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onScroll]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSearch]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeked]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSeeking]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSelect]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStalled]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onStorage]: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
+    [dartx.onSubmit]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onSuspend]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTimeUpdate]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onTouchCancel]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchEnd]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchMove]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTouchStart]: dart.definiteFunctionType(async.Stream$(html$.TouchEvent), []),
+    [dartx.onTransitionEnd]: dart.definiteFunctionType(async.Stream$(html$.TransitionEvent), []),
+    [dartx.onUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onVolumeChange]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onWaiting]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onAnimationEnd]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onAnimationIteration]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onAnimationStart]: dart.definiteFunctionType(async.Stream$(html$.AnimationEvent), []),
+    [dartx.onBeforeUnload]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
     [dartx.pageXOffset]: dart.definiteFunctionType(core.int, []),
     [dartx.pageYOffset]: dart.definiteFunctionType(core.int, []),
     [dartx.scrollX]: dart.definiteFunctionType(core.int, []),
@@ -92958,19 +92961,19 @@
   setters: () => ({
     [dartx.location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
     [_location]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
-    [dartx.opener]: dart.definiteFunctionType(dart.void, [html.Window])
+    [dartx.opener]: dart.definiteFunctionType(dart.void, [html$.Window])
   }),
   methods: () => ({
-    [_open2]: dart.definiteFunctionType(html.WindowBase, [dart.dynamic, dart.dynamic]),
-    [_open3]: dart.definiteFunctionType(html.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    [dartx.open]: dart.definiteFunctionType(html.WindowBase, [core.String, core.String], [core.String]),
-    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html.FrameRequestCallback]),
+    [_open2]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic]),
+    [_open3]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    [dartx.open]: dart.definiteFunctionType(html$.WindowBase, [core.String, core.String], [core.String]),
+    [dartx.requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
     [dartx.cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
-    [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html.FrameRequestCallback]),
+    [_requestAnimationFrame]: dart.definiteFunctionType(core.int, [html$.FrameRequestCallback]),
     [_cancelAnimationFrame]: dart.definiteFunctionType(dart.void, [core.int]),
     [_ensureRequestAnimationFrame]: dart.definiteFunctionType(dart.dynamic, []),
-    [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html.FileSystem), [core.int], {persistent: core.bool}),
-    [__getter__]: dart.definiteFunctionType(html.WindowBase, [dart.dynamic]),
+    [dartx.requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int], {persistent: core.bool}),
+    [__getter__]: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic]),
     [__getter___1]: dart.definiteFunctionType(dart.dynamic, [core.int]),
     [__getter___2]: dart.definiteFunctionType(dart.dynamic, [core.String]),
     [dartx.alert]: dart.definiteFunctionType(dart.void, [], [core.String]),
@@ -92980,13 +92983,13 @@
     [_fetch_1]: dart.definiteFunctionType(async.Future, [dart.dynamic, dart.dynamic]),
     [_fetch_2]: dart.definiteFunctionType(async.Future, [dart.dynamic]),
     [dartx.find]: dart.definiteFunctionType(core.bool, [core.String, core.bool, core.bool, core.bool, core.bool, core.bool, core.bool]),
-    [_getComputedStyle]: dart.definiteFunctionType(html.CssStyleDeclaration, [html.Element, core.String]),
-    [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html.CssRule), [html.Element, core.String]),
-    [dartx.getSelection]: dart.definiteFunctionType(html.Selection, []),
-    [dartx.matchMedia]: dart.definiteFunctionType(html.MediaQueryList, [core.String]),
+    [_getComputedStyle]: dart.definiteFunctionType(html$.CssStyleDeclaration, [html$.Element, core.String]),
+    [dartx.getMatchedCssRules]: dart.definiteFunctionType(core.List$(html$.CssRule), [html$.Element, core.String]),
+    [dartx.getSelection]: dart.definiteFunctionType(html$.Selection, []),
+    [dartx.matchMedia]: dart.definiteFunctionType(html$.MediaQueryList, [core.String]),
     [dartx.moveBy]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
     [_moveTo]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
-    [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html.DatabaseCallback]),
+    [dartx.openDatabase]: dart.definiteFunctionType(web_sql.SqlDatabase, [core.String, core.String, core.String, core.int], [html$.DatabaseCallback]),
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [ListOfMessagePort()]),
     [_postMessage_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, ListOfMessagePort()]),
     [_postMessage_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
@@ -93012,10 +93015,10 @@
     [_scrollTo_4]: dart.definiteFunctionType(dart.void, [core.int, core.int]),
     [_scrollTo_5]: dart.definiteFunctionType(dart.void, [core.int, core.int, dart.dynamic]),
     [dartx.stop]: dart.definiteFunctionType(dart.void, []),
-    [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html._FileSystemCallback], [html._ErrorCallback]),
-    [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html.FileSystem), [core.int, core.int]),
-    [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html._EntryCallback], [html._ErrorCallback]),
-    [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html.Entry), [core.String]),
+    [__requestFileSystem]: dart.definiteFunctionType(dart.void, [core.int, core.int, html$._FileSystemCallback], [html$._ErrorCallback]),
+    [_requestFileSystem]: dart.definiteFunctionType(async.Future$(html$.FileSystem), [core.int, core.int]),
+    [_resolveLocalFileSystemUrl]: dart.definiteFunctionType(dart.void, [core.String, html$._EntryCallback], [html$._ErrorCallback]),
+    [dartx.resolveLocalFileSystemUrl]: dart.definiteFunctionType(async.Future$(html$.Entry), [core.String]),
     [dartx.atob]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.btoa]: dart.definiteFunctionType(core.String, [core.String]),
     [_setInterval_String]: dart.definiteFunctionType(core.int, [core.String], [core.int, core.Object]),
@@ -93050,9 +93053,9 @@
   }),
   sgetters: () => ({supportsPointConversions: dart.definiteFunctionType(core.bool, [])})
 });
-html.Window.PERSISTENT = 1;
-html.Window.TEMPORARY = 0;
-dart.defineLazy(html.Window, {
+html$.Window.PERSISTENT = 1;
+html$.Window.TEMPORARY = 0;
+dart.defineLazy(html$.Window, {
   get contentLoadedEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('DOMContentLoaded'));
   },
@@ -93105,13 +93108,13 @@
     return dart.const(new (EventStreamProviderOfAnimationEvent())('webkitAnimationStart'));
   },
   get beforeUnloadEvent() {
-    return dart.const(new html._BeforeUnloadEventStreamProvider('beforeunload'));
+    return dart.const(new html$._BeforeUnloadEventStreamProvider('beforeunload'));
   }
 });
-dart.registerExtension(dart.global.Window, html.Window);
-dart.registerExtension(dart.global.DOMWindow, html.Window);
+dart.registerExtension(dart.global.Window, html$.Window);
+dart.registerExtension(dart.global.DOMWindow, html$.Window);
 const _returnValue = Symbol('_returnValue');
-html._WrappedEvent = class _WrappedEvent extends core.Object {
+html$._WrappedEvent = class _WrappedEvent extends core.Object {
   new(wrapped) {
     this.wrapped = wrapped;
     this[_selector] = null;
@@ -93156,8 +93159,8 @@
     if (this[_selector] == null) {
       dart.throw(new core.UnsupportedError('Cannot call matchingTarget if this Event did' + ' not arise as a result of event delegation.'));
     }
-    let currentTarget = html.Element._check(this.currentTarget);
-    let target = html.Element._check(this.target);
+    let currentTarget = html$.Element._check(this.currentTarget);
+    let target = html$.Element._check(this.target);
     let matchedTarget = null;
     do {
       if (dart.test(target[dartx.matches](this[_selector]))) return target;
@@ -93175,24 +93178,24 @@
     return this.wrapped[_get_target];
   }
 };
-html._WrappedEvent[dart.implements] = () => [html.Event];
-dart.setSignature(html._WrappedEvent, {
-  constructors: () => ({new: dart.definiteFunctionType(html._WrappedEvent, [html.Event])}),
+html$._WrappedEvent[dart.implements] = () => [html$.Event];
+dart.setSignature(html$._WrappedEvent, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._WrappedEvent, [html$.Event])}),
   fields: () => ({
-    wrapped: html.Event,
+    wrapped: html$.Event,
     [_selector]: core.String
   }),
   getters: () => ({
     bubbles: dart.definiteFunctionType(core.bool, []),
     cancelable: dart.definiteFunctionType(core.bool, []),
-    currentTarget: dart.definiteFunctionType(html.EventTarget, []),
+    currentTarget: dart.definiteFunctionType(html$.EventTarget, []),
     defaultPrevented: dart.definiteFunctionType(core.bool, []),
     eventPhase: dart.definiteFunctionType(core.int, []),
-    target: dart.definiteFunctionType(html.EventTarget, []),
+    target: dart.definiteFunctionType(html$.EventTarget, []),
     timeStamp: dart.definiteFunctionType(core.int, []),
     type: dart.definiteFunctionType(core.String, []),
-    matchingTarget: dart.definiteFunctionType(html.Element, []),
-    path: dart.definiteFunctionType(core.List$(html.Node), []),
+    matchingTarget: dart.definiteFunctionType(html$.Element, []),
+    path: dart.definiteFunctionType(core.List$(html$.Node), []),
     [_get_currentTarget]: dart.definiteFunctionType(dart.dynamic, []),
     [_get_target]: dart.definiteFunctionType(dart.dynamic, [])
   }),
@@ -93203,7 +93206,7 @@
     stopPropagation: dart.definiteFunctionType(dart.void, [])
   })
 });
-html._BeforeUnloadEvent = class _BeforeUnloadEvent extends html._WrappedEvent {
+html$._BeforeUnloadEvent = class _BeforeUnloadEvent extends html$._WrappedEvent {
   new(base) {
     this[_returnValue] = null;
     super.new(base);
@@ -93218,15 +93221,15 @@
     }
   }
 };
-html._BeforeUnloadEvent[dart.implements] = () => [html.BeforeUnloadEvent];
-dart.setSignature(html._BeforeUnloadEvent, {
-  constructors: () => ({new: dart.definiteFunctionType(html._BeforeUnloadEvent, [html.Event])}),
+html$._BeforeUnloadEvent[dart.implements] = () => [html$.BeforeUnloadEvent];
+dart.setSignature(html$._BeforeUnloadEvent, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEvent, [html$.Event])}),
   fields: () => ({[_returnValue]: core.String}),
   getters: () => ({returnValue: dart.definiteFunctionType(core.String, [])}),
   setters: () => ({returnValue: dart.definiteFunctionType(dart.void, [core.String])})
 });
 const _eventType = Symbol('_eventType');
-html._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
+html$._BeforeUnloadEventStreamProvider = class _BeforeUnloadEventStreamProvider extends core.Object {
   new(eventType) {
     this[_eventType] = eventType;
   }
@@ -93235,7 +93238,7 @@
     let stream = new (_EventStreamOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
     let controller = StreamControllerOfBeforeUnloadEvent().new({sync: true});
     stream.listen(dart.fn(event => {
-      let wrapped = new html._BeforeUnloadEvent(event);
+      let wrapped = new html$._BeforeUnloadEvent(event);
       controller.add(wrapped);
     }, BeforeUnloadEventToNull()));
     return controller.stream;
@@ -93252,31 +93255,31 @@
     return new (_ElementListEventStreamImplOfBeforeUnloadEvent())(e, this[_eventType], useCapture);
   }
 };
-html._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
-dart.setSignature(html._BeforeUnloadEventStreamProvider, {
-  constructors: () => ({new: dart.definiteFunctionType(html._BeforeUnloadEventStreamProvider, [core.String])}),
+html$._BeforeUnloadEventStreamProvider[dart.implements] = () => [EventStreamProviderOfBeforeUnloadEvent()];
+dart.setSignature(html$._BeforeUnloadEventStreamProvider, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BeforeUnloadEventStreamProvider, [core.String])}),
   fields: () => ({[_eventType]: core.String}),
   methods: () => ({
-    forTarget: dart.definiteFunctionType(async.Stream$(html.BeforeUnloadEvent), [html.EventTarget], {useCapture: core.bool}),
-    getEventType: dart.definiteFunctionType(core.String, [html.EventTarget]),
-    forElement: dart.definiteFunctionType(html.ElementStream$(html.BeforeUnloadEvent), [html.Element], {useCapture: core.bool}),
-    [_forElementList]: dart.definiteFunctionType(html.ElementStream$(html.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
+    forTarget: dart.definiteFunctionType(async.Stream$(html$.BeforeUnloadEvent), [html$.EventTarget], {useCapture: core.bool}),
+    getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget]),
+    forElement: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [html$.Element], {useCapture: core.bool}),
+    [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(html$.BeforeUnloadEvent), [ElementListOfElement()], {useCapture: core.bool})
   })
 });
-html.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
+html$.WindowBase64 = class WindowBase64 extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.WindowBase64, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WindowBase64, [])})
+dart.setSignature(html$.WindowBase64, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowBase64, [])})
 });
 dart.defineExtensionNames([
   'focus',
   'focused',
   'visibilityState'
 ]);
-html.WindowClient = class WindowClient extends html.Client {
+html$.WindowClient = class WindowClient extends html$.Client {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93290,15 +93293,15 @@
     return this.focus.apply(this, args);
   }
 };
-dart.setSignature(html.WindowClient, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WindowClient, [])}),
+dart.setSignature(html$.WindowClient, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowClient, [])}),
   fields: () => ({
     [dartx.focused]: core.bool,
     [dartx.visibilityState]: core.String
   }),
   methods: () => ({[dartx.focus]: dart.definiteFunctionType(async.Future, [])})
 });
-dart.registerExtension(dart.global.WindowClient, html.WindowClient);
+dart.registerExtension(dart.global.WindowClient, html$.WindowClient);
 dart.defineExtensionNames([
   'onHashChange',
   'onMessage',
@@ -93308,42 +93311,42 @@
   'onStorage',
   'onUnload'
 ]);
-html.WindowEventHandlers = class WindowEventHandlers extends html.EventTarget {
+html$.WindowEventHandlers = class WindowEventHandlers extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get onHashChange() {
-    return html.WindowEventHandlers.hashChangeEvent.forTarget(this);
+    return html$.WindowEventHandlers.hashChangeEvent.forTarget(this);
   }
   get onMessage() {
-    return html.WindowEventHandlers.messageEvent.forTarget(this);
+    return html$.WindowEventHandlers.messageEvent.forTarget(this);
   }
   get onOffline() {
-    return html.WindowEventHandlers.offlineEvent.forTarget(this);
+    return html$.WindowEventHandlers.offlineEvent.forTarget(this);
   }
   get onOnline() {
-    return html.WindowEventHandlers.onlineEvent.forTarget(this);
+    return html$.WindowEventHandlers.onlineEvent.forTarget(this);
   }
   get onPopState() {
-    return html.WindowEventHandlers.popStateEvent.forTarget(this);
+    return html$.WindowEventHandlers.popStateEvent.forTarget(this);
   }
   get onStorage() {
-    return html.WindowEventHandlers.storageEvent.forTarget(this);
+    return html$.WindowEventHandlers.storageEvent.forTarget(this);
   }
   get onUnload() {
-    return html.WindowEventHandlers.unloadEvent.forTarget(this);
+    return html$.WindowEventHandlers.unloadEvent.forTarget(this);
   }
 };
-dart.setSignature(html.WindowEventHandlers, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WindowEventHandlers, [])}),
+dart.setSignature(html$.WindowEventHandlers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WindowEventHandlers, [])}),
   getters: () => ({
-    onHashChange: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onMessage: dart.definiteFunctionType(async.Stream$(html.MessageEvent), []),
-    onOffline: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onOnline: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    onPopState: dart.definiteFunctionType(async.Stream$(html.PopStateEvent), []),
-    onStorage: dart.definiteFunctionType(async.Stream$(html.StorageEvent), []),
-    onUnload: dart.definiteFunctionType(async.Stream$(html.Event), [])
+    onHashChange: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onMessage: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), []),
+    onOffline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onOnline: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    onPopState: dart.definiteFunctionType(async.Stream$(html$.PopStateEvent), []),
+    onStorage: dart.definiteFunctionType(async.Stream$(html$.StorageEvent), []),
+    onUnload: dart.definiteFunctionType(async.Stream$(html$.Event), [])
   }),
   sfields: () => ({
     hashChangeEvent: EventStreamProviderOfEvent(),
@@ -93355,7 +93358,7 @@
     unloadEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineExtensionMembers(html.WindowEventHandlers, [
+dart.defineExtensionMembers(html$.WindowEventHandlers, [
   'onHashChange',
   'onMessage',
   'onOffline',
@@ -93364,7 +93367,7 @@
   'onStorage',
   'onUnload'
 ]);
-dart.defineLazy(html.WindowEventHandlers, {
+dart.defineLazy(html$.WindowEventHandlers, {
   get hashChangeEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('hashchange'));
   },
@@ -93393,12 +93396,12 @@
   'onError',
   'onMessage'
 ]);
-html.Worker = class Worker extends html.EventTarget {
+html$.Worker = class Worker extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(scriptUrl) {
-    return html.Worker._create_1(scriptUrl);
+    return html$.Worker._create_1(scriptUrl);
   }
   static _create_1(scriptUrl) {
     return new self.Worker(scriptUrl);
@@ -93427,21 +93430,21 @@
     return this.terminate.apply(this, args);
   }
   get [dartx.onError]() {
-    return html.Worker.errorEvent.forTarget(this);
+    return html$.Worker.errorEvent.forTarget(this);
   }
   get [dartx.onMessage]() {
-    return html.Worker.messageEvent.forTarget(this);
+    return html$.Worker.messageEvent.forTarget(this);
   }
 };
-html.Worker[dart.implements] = () => [html.AbstractWorker];
-dart.setSignature(html.Worker, {
+html$.Worker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$.Worker, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.Worker, []),
-    new: dart.definiteFunctionType(html.Worker, [core.String])
+    _: dart.definiteFunctionType(html$.Worker, []),
+    new: dart.definiteFunctionType(html$.Worker, [core.String])
   }),
   getters: () => ({
-    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html.Event), []),
-    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html.MessageEvent), [])
+    [dartx.onError]: dart.definiteFunctionType(async.Stream$(html$.Event), []),
+    [dartx.onMessage]: dart.definiteFunctionType(async.Stream$(html$.MessageEvent), [])
   }),
   methods: () => ({
     [dartx.postMessage]: dart.definiteFunctionType(dart.void, [dart.dynamic], [ListOfMessagePort()]),
@@ -93454,10 +93457,10 @@
     messageEvent: EventStreamProviderOfMessageEvent()
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.Worker, [dart.dynamic])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.Worker, [dart.dynamic])}),
   names: ['_create_1']
 });
-dart.defineLazy(html.Worker, {
+dart.defineLazy(html$.Worker, {
   get errorEvent() {
     return dart.const(new (EventStreamProviderOfEvent())('error'));
   },
@@ -93465,16 +93468,16 @@
     return dart.const(new (EventStreamProviderOfMessageEvent())('message'));
   }
 });
-dart.registerExtension(dart.global.Worker, html.Worker);
-html.WorkerConsole = class WorkerConsole extends html.ConsoleBase {
+dart.registerExtension(dart.global.Worker, html$.Worker);
+html$.WorkerConsole = class WorkerConsole extends html$.ConsoleBase {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.WorkerConsole, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WorkerConsole, [])})
+dart.setSignature(html$.WorkerConsole, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerConsole, [])})
 });
-dart.registerExtension(dart.global.WorkerConsole, html.WorkerConsole);
+dart.registerExtension(dart.global.WorkerConsole, html$.WorkerConsole);
 dart.defineExtensionNames([
   'clearMarks',
   'clearMeasures',
@@ -93488,7 +93491,7 @@
   'setResourceTimingBufferSize',
   'memory'
 ]);
-html.WorkerPerformance = class WorkerPerformance extends html.EventTarget {
+html$.WorkerPerformance = class WorkerPerformance extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93526,15 +93529,15 @@
     return this.webkitSetResourceTimingBufferSize.apply(this, args);
   }
 };
-dart.setSignature(html.WorkerPerformance, {
-  constructors: () => ({_: dart.definiteFunctionType(html.WorkerPerformance, [])}),
-  fields: () => ({[dartx.memory]: html.MemoryInfo}),
+dart.setSignature(html$.WorkerPerformance, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.WorkerPerformance, [])}),
+  fields: () => ({[dartx.memory]: html$.MemoryInfo}),
   methods: () => ({
     [dartx.clearMarks]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.clearMeasures]: dart.definiteFunctionType(dart.void, [core.String]),
-    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), []),
-    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), [core.String, core.String]),
-    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html.PerformanceEntry), [core.String]),
+    [dartx.getEntries]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), []),
+    [dartx.getEntriesByName]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String, core.String]),
+    [dartx.getEntriesByType]: dart.definiteFunctionType(core.List$(html$.PerformanceEntry), [core.String]),
     [dartx.mark]: dart.definiteFunctionType(dart.void, [core.String]),
     [dartx.measure]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
     [dartx.now]: dart.definiteFunctionType(core.double, []),
@@ -93542,18 +93545,18 @@
     [dartx.setResourceTimingBufferSize]: dart.definiteFunctionType(dart.void, [core.int])
   })
 });
-dart.registerExtension(dart.global.WorkerPerformance, html.WorkerPerformance);
+dart.registerExtension(dart.global.WorkerPerformance, html$.WorkerPerformance);
 dart.defineExtensionNames([
   'createExpression',
   'createNSResolver',
   'evaluate'
 ]);
-html.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
+html$.XPathEvaluator = class XPathEvaluator extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.XPathEvaluator._create_1();
+    return html$.XPathEvaluator._create_1();
   }
   static _create_1() {
     return new self.XPathEvaluator();
@@ -93568,24 +93571,24 @@
     return this.evaluate.apply(this, args);
   }
 };
-dart.setSignature(html.XPathEvaluator, {
+dart.setSignature(html$.XPathEvaluator, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.XPathEvaluator, []),
-    new: dart.definiteFunctionType(html.XPathEvaluator, [])
+    _: dart.definiteFunctionType(html$.XPathEvaluator, []),
+    new: dart.definiteFunctionType(html$.XPathEvaluator, [])
   }),
   methods: () => ({
-    [dartx.createExpression]: dart.definiteFunctionType(html.XPathExpression, [core.String, html.XPathNSResolver]),
-    [dartx.createNSResolver]: dart.definiteFunctionType(html.XPathNSResolver, [html.Node]),
-    [dartx.evaluate]: dart.definiteFunctionType(html.XPathResult, [core.String, html.Node, html.XPathNSResolver], [core.int, core.Object])
+    [dartx.createExpression]: dart.definiteFunctionType(html$.XPathExpression, [core.String, html$.XPathNSResolver]),
+    [dartx.createNSResolver]: dart.definiteFunctionType(html$.XPathNSResolver, [html$.Node]),
+    [dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [core.String, html$.Node, html$.XPathNSResolver], [core.int, core.Object])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.XPathEvaluator, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XPathEvaluator, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.XPathEvaluator, html.XPathEvaluator);
+dart.registerExtension(dart.global.XPathEvaluator, html$.XPathEvaluator);
 dart.defineExtensionNames([
   'evaluate'
 ]);
-html.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
+html$.XPathExpression = class XPathExpression extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93593,15 +93596,15 @@
     return this.evaluate.apply(this, args);
   }
 };
-dart.setSignature(html.XPathExpression, {
-  constructors: () => ({_: dart.definiteFunctionType(html.XPathExpression, [])}),
-  methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html.XPathResult, [html.Node], [core.int, core.Object])})
+dart.setSignature(html$.XPathExpression, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathExpression, [])}),
+  methods: () => ({[dartx.evaluate]: dart.definiteFunctionType(html$.XPathResult, [html$.Node], [core.int, core.Object])})
 });
-dart.registerExtension(dart.global.XPathExpression, html.XPathExpression);
+dart.registerExtension(dart.global.XPathExpression, html$.XPathExpression);
 dart.defineExtensionNames([
   'lookupNamespaceUri'
 ]);
-html.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
+html$.XPathNSResolver = class XPathNSResolver extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93609,11 +93612,11 @@
     return this.lookupNamespaceURI.apply(this, args);
   }
 };
-dart.setSignature(html.XPathNSResolver, {
-  constructors: () => ({_: dart.definiteFunctionType(html.XPathNSResolver, [])}),
+dart.setSignature(html$.XPathNSResolver, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathNSResolver, [])}),
   methods: () => ({[dartx.lookupNamespaceUri]: dart.definiteFunctionType(core.String, [core.String])})
 });
-dart.registerExtension(dart.global.XPathNSResolver, html.XPathNSResolver);
+dart.registerExtension(dart.global.XPathNSResolver, html$.XPathNSResolver);
 dart.defineExtensionNames([
   'iterateNext',
   'snapshotItem',
@@ -93625,7 +93628,7 @@
   'snapshotLength',
   'stringValue'
 ]);
-html.XPathResult = class XPathResult extends _interceptors.Interceptor {
+html$.XPathResult = class XPathResult extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93657,20 +93660,20 @@
     return this.snapshotItem.apply(this, args);
   }
 };
-dart.setSignature(html.XPathResult, {
-  constructors: () => ({_: dart.definiteFunctionType(html.XPathResult, [])}),
+dart.setSignature(html$.XPathResult, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XPathResult, [])}),
   fields: () => ({
     [dartx.booleanValue]: core.bool,
     [dartx.invalidIteratorState]: core.bool,
     [dartx.numberValue]: core.double,
     [dartx.resultType]: core.int,
-    [dartx.singleNodeValue]: html.Node,
+    [dartx.singleNodeValue]: html$.Node,
     [dartx.snapshotLength]: core.int,
     [dartx.stringValue]: core.String
   }),
   methods: () => ({
-    [dartx.iterateNext]: dart.definiteFunctionType(html.Node, []),
-    [dartx.snapshotItem]: dart.definiteFunctionType(html.Node, [core.int])
+    [dartx.iterateNext]: dart.definiteFunctionType(html$.Node, []),
+    [dartx.snapshotItem]: dart.definiteFunctionType(html$.Node, [core.int])
   }),
   sfields: () => ({
     ANY_TYPE: core.int,
@@ -93685,35 +93688,35 @@
     UNORDERED_NODE_SNAPSHOT_TYPE: core.int
   })
 });
-html.XPathResult.ANY_TYPE = 0;
-html.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
-html.XPathResult.BOOLEAN_TYPE = 3;
-html.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
-html.XPathResult.NUMBER_TYPE = 1;
-html.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
-html.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
-html.XPathResult.STRING_TYPE = 2;
-html.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
-html.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
-dart.registerExtension(dart.global.XPathResult, html.XPathResult);
-html.XmlDocument = class XmlDocument extends html.Document {
+html$.XPathResult.ANY_TYPE = 0;
+html$.XPathResult.ANY_UNORDERED_NODE_TYPE = 8;
+html$.XPathResult.BOOLEAN_TYPE = 3;
+html$.XPathResult.FIRST_ORDERED_NODE_TYPE = 9;
+html$.XPathResult.NUMBER_TYPE = 1;
+html$.XPathResult.ORDERED_NODE_ITERATOR_TYPE = 5;
+html$.XPathResult.ORDERED_NODE_SNAPSHOT_TYPE = 7;
+html$.XPathResult.STRING_TYPE = 2;
+html$.XPathResult.UNORDERED_NODE_ITERATOR_TYPE = 4;
+html$.XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE = 6;
+dart.registerExtension(dart.global.XPathResult, html$.XPathResult);
+html$.XmlDocument = class XmlDocument extends html$.Document {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html.XmlDocument, {
-  constructors: () => ({_: dart.definiteFunctionType(html.XmlDocument, [])})
+dart.setSignature(html$.XmlDocument, {
+  constructors: () => ({_: dart.definiteFunctionType(html$.XmlDocument, [])})
 });
-dart.registerExtension(dart.global.XMLDocument, html.XmlDocument);
+dart.registerExtension(dart.global.XMLDocument, html$.XmlDocument);
 dart.defineExtensionNames([
   'serializeToString'
 ]);
-html.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
+html$.XmlSerializer = class XmlSerializer extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.XmlSerializer._create_1();
+    return html$.XmlSerializer._create_1();
   }
   static _create_1() {
     return new XMLSerializer();
@@ -93722,16 +93725,16 @@
     return this.serializeToString.apply(this, args);
   }
 };
-dart.setSignature(html.XmlSerializer, {
+dart.setSignature(html$.XmlSerializer, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.XmlSerializer, []),
-    new: dart.definiteFunctionType(html.XmlSerializer, [])
+    _: dart.definiteFunctionType(html$.XmlSerializer, []),
+    new: dart.definiteFunctionType(html$.XmlSerializer, [])
   }),
-  methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html.Node])}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.XmlSerializer, [])}),
+  methods: () => ({[dartx.serializeToString]: dart.definiteFunctionType(core.String, [html$.Node])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XmlSerializer, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.XMLSerializer, html.XmlSerializer);
+dart.registerExtension(dart.global.XMLSerializer, html$.XmlSerializer);
 dart.defineExtensionNames([
   'clearParameters',
   'getParameter',
@@ -93742,12 +93745,12 @@
   'transformToDocument',
   'transformToFragment'
 ]);
-html.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
+html$.XsltProcessor = class XsltProcessor extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html.XsltProcessor._create_1();
+    return html$.XsltProcessor._create_1();
   }
   static _create_1() {
     return new XSLTProcessor();
@@ -93780,31 +93783,31 @@
     return this.transformToFragment.apply(this, args);
   }
 };
-dart.setSignature(html.XsltProcessor, {
+dart.setSignature(html$.XsltProcessor, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html.XsltProcessor, []),
-    new: dart.definiteFunctionType(html.XsltProcessor, [])
+    _: dart.definiteFunctionType(html$.XsltProcessor, []),
+    new: dart.definiteFunctionType(html$.XsltProcessor, [])
   }),
   methods: () => ({
     [dartx.clearParameters]: dart.definiteFunctionType(dart.void, []),
     [dartx.getParameter]: dart.definiteFunctionType(core.String, [core.String, core.String]),
-    [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html.Node]),
+    [dartx.importStylesheet]: dart.definiteFunctionType(dart.void, [html$.Node]),
     [dartx.removeParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String]),
     [dartx.reset]: dart.definiteFunctionType(dart.void, []),
     [dartx.setParameter]: dart.definiteFunctionType(dart.void, [core.String, core.String, core.String]),
-    [dartx.transformToDocument]: dart.definiteFunctionType(html.Document, [html.Node]),
-    [dartx.transformToFragment]: dart.definiteFunctionType(html.DocumentFragment, [html.Node, html.Document])
+    [dartx.transformToDocument]: dart.definiteFunctionType(html$.Document, [html$.Node]),
+    [dartx.transformToFragment]: dart.definiteFunctionType(html$.DocumentFragment, [html$.Node, html$.Document])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])}),
-  statics: () => ({_create_1: dart.definiteFunctionType(html.XsltProcessor, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$.XsltProcessor, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.XSLTProcessor, html.XsltProcessor);
+dart.registerExtension(dart.global.XSLTProcessor, html$.XsltProcessor);
 dart.defineExtensionNames([
   'name',
   'value'
 ]);
-html._Attr = class _Attr extends html.Node {
+html$._Attr = class _Attr extends html$.Node {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -93818,30 +93821,30 @@
     this.value = value;
   }
 };
-dart.setSignature(html._Attr, {
-  constructors: () => ({_: dart.definiteFunctionType(html._Attr, [])}),
+dart.setSignature(html$._Attr, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._Attr, [])}),
   fields: () => ({
     [dartx.name]: core.String,
     [dartx.value]: core.String
   })
 });
-dart.registerExtension(dart.global.Attr, html._Attr);
-html._Cache = class _Cache extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.Attr, html$._Attr);
+html$._Cache = class _Cache extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._Cache, {
-  constructors: () => ({_: dart.definiteFunctionType(html._Cache, [])})
+dart.setSignature(html$._Cache, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._Cache, [])})
 });
-dart.registerExtension(dart.global.Cache, html._Cache);
-html._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.Cache, html$._Cache);
+html$._CanvasPathMethods = class _CanvasPathMethods extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._CanvasPathMethods, {
-  constructors: () => ({_: dart.definiteFunctionType(html._CanvasPathMethods, [])})
+dart.setSignature(html$._CanvasPathMethods, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._CanvasPathMethods, [])})
 });
 dart.defineExtensionNames([
   'toString',
@@ -93863,7 +93866,7 @@
   'top',
   'width'
 ]);
-html._ClientRect = class _ClientRect extends _interceptors.Interceptor {
+html$._ClientRect = class _ClientRect extends _interceptors.Interceptor {
   [dartx.toString]() {
     return dart.str`Rectangle (${this[dartx.left]}, ${this[dartx.top]}) ${this[dartx.width]} x ${this[dartx.height]}`;
   }
@@ -93872,7 +93875,7 @@
     return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.width], dart.dload(other, 'width')) && dart.equals(this[dartx.height], dart.dload(other, 'height'));
   }
   get [dartx.hashCode]() {
-    return html._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.width]), dart.hashCode(this[dartx.height]));
   }
   [dartx.intersection](other) {
     let x0 = math.max(core.num)(this[dartx.left], other[dartx.left]);
@@ -93936,9 +93939,9 @@
     return this.width;
   }
 };
-html._ClientRect[dart.implements] = () => [RectangleOfnum()];
-dart.setSignature(html._ClientRect, {
-  constructors: () => ({_: dart.definiteFunctionType(html._ClientRect, [])}),
+html$._ClientRect[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$._ClientRect, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRect, [])}),
   fields: () => ({
     [dartx.bottom]: core.double,
     [dartx.height]: core.double,
@@ -93961,8 +93964,8 @@
     [dartx.containsPoint]: dart.definiteFunctionType(core.bool, [PointOfnum()])
   })
 });
-dart.registerExtension(dart.global.ClientRect, html._ClientRect);
-html._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
+dart.registerExtension(dart.global.ClientRect, html$._ClientRect);
+html$._JenkinsSmiHash = class _JenkinsSmiHash extends core.Object {
   static combine(hash, value) {
     hash = 536870911 & dart.notNull(hash) + dart.notNull(value);
     hash = 536870911 & dart.notNull(hash) + ((524287 & dart.notNull(hash)) << 10);
@@ -93974,13 +93977,13 @@
     return 536870911 & dart.notNull(hash) + ((16383 & dart.notNull(hash)) << 15);
   }
   static hash2(a, b) {
-    return html._JenkinsSmiHash.finish(html._JenkinsSmiHash.combine(html._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
+    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)));
   }
   static hash4(a, b, c, d) {
-    return html._JenkinsSmiHash.finish(html._JenkinsSmiHash.combine(html._JenkinsSmiHash.combine(html._JenkinsSmiHash.combine(html._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
+    return html$._JenkinsSmiHash.finish(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(html$._JenkinsSmiHash.combine(0, core.int._check(a)), core.int._check(b)), core.int._check(c)), core.int._check(d)));
   }
 };
-dart.setSignature(html._JenkinsSmiHash, {
+dart.setSignature(html$._JenkinsSmiHash, {
   statics: () => ({
     combine: dart.definiteFunctionType(core.int, [core.int, core.int]),
     finish: dart.definiteFunctionType(core.int, [core.int]),
@@ -94000,7 +94003,7 @@
   'elementAt',
   'item'
 ]);
-html._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html.ImmutableListMixin$(math.Rectangle$(core.num))) {
+html$._ClientRectList = class _ClientRectList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(math.Rectangle$(core.num)), html$.ImmutableListMixin$(math.Rectangle$(core.num))) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94049,9 +94052,9 @@
     return this.item.apply(this, args);
   }
 };
-html._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
-dart.setSignature(html._ClientRectList, {
-  constructors: () => ({_: dart.definiteFunctionType(html._ClientRectList, [])}),
+html$._ClientRectList[dart.implements] = () => [ListOfRectangleOfnum()];
+dart.setSignature(html$._ClientRectList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ClientRectList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
@@ -94061,8 +94064,8 @@
     [dartx.item]: dart.definiteFunctionType(math.Rectangle$(core.num), [core.int])
   })
 });
-dart.registerExtension(dart.global.ClientRectList, html._ClientRectList);
-dart.registerExtension(dart.global.DOMRectList, html._ClientRectList);
+dart.registerExtension(dart.global.ClientRectList, html$._ClientRectList);
+dart.registerExtension(dart.global.DOMRectList, html$._ClientRectList);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -94074,7 +94077,7 @@
   'elementAt',
   'item'
 ]);
-html._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.CssRule), html.ImmutableListMixin$(html.CssRule)) {
+html$._CssRuleList = class _CssRuleList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.CssRule), html$.ImmutableListMixin$(html$.CssRule)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94120,64 +94123,64 @@
     return this.item.apply(this, args);
   }
 };
-html._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
-dart.setSignature(html._CssRuleList, {
-  constructors: () => ({_: dart.definiteFunctionType(html._CssRuleList, [])}),
+html$._CssRuleList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfCssRule()];
+dart.setSignature(html$._CssRuleList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._CssRuleList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.CssRule, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.CssRule]),
-    [dartx.item]: dart.definiteFunctionType(html.CssRule, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.CssRule, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.CssRule]),
+    [dartx.item]: dart.definiteFunctionType(html$.CssRule, [core.int])
   })
 });
-dart.registerExtension(dart.global.CSSRuleList, html._CssRuleList);
-html._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.CSSRuleList, html$._CssRuleList);
+html$._DOMFileSystemSync = class _DOMFileSystemSync extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._DOMFileSystemSync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._DOMFileSystemSync, [])})
+dart.setSignature(html$._DOMFileSystemSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DOMFileSystemSync, [])})
 });
-dart.registerExtension(dart.global.DOMFileSystemSync, html._DOMFileSystemSync);
-html._EntrySync = class _EntrySync extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.DOMFileSystemSync, html$._DOMFileSystemSync);
+html$._EntrySync = class _EntrySync extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._EntrySync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._EntrySync, [])})
+dart.setSignature(html$._EntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._EntrySync, [])})
 });
-dart.registerExtension(dart.global.EntrySync, html._EntrySync);
-html._DirectoryEntrySync = class _DirectoryEntrySync extends html._EntrySync {
+dart.registerExtension(dart.global.EntrySync, html$._EntrySync);
+html$._DirectoryEntrySync = class _DirectoryEntrySync extends html$._EntrySync {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._DirectoryEntrySync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._DirectoryEntrySync, [])})
+dart.setSignature(html$._DirectoryEntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryEntrySync, [])})
 });
-dart.registerExtension(dart.global.DirectoryEntrySync, html._DirectoryEntrySync);
-html._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.DirectoryEntrySync, html$._DirectoryEntrySync);
+html$._DirectoryReaderSync = class _DirectoryReaderSync extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._DirectoryReaderSync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._DirectoryReaderSync, [])})
+dart.setSignature(html$._DirectoryReaderSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DirectoryReaderSync, [])})
 });
-dart.registerExtension(dart.global.DirectoryReaderSync, html._DirectoryReaderSync);
-html._DocumentType = class _DocumentType extends html.Node {
+dart.registerExtension(dart.global.DirectoryReaderSync, html$._DirectoryReaderSync);
+html$._DocumentType = class _DocumentType extends html$.Node {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-html._DocumentType[dart.implements] = () => [html.ChildNode];
-dart.setSignature(html._DocumentType, {
-  constructors: () => ({_: dart.definiteFunctionType(html._DocumentType, [])})
+html$._DocumentType[dart.implements] = () => [html$.ChildNode];
+dart.setSignature(html$._DocumentType, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._DocumentType, [])})
 });
-dart.registerExtension(dart.global.DocumentType, html._DocumentType);
+dart.registerExtension(dart.global.DocumentType, html$._DocumentType);
 dart.defineExtensionNames([
   'height',
   'height',
@@ -94188,7 +94191,7 @@
   'y',
   'y'
 ]);
-html._DomRect = class _DomRect extends html.DomRectReadOnly {
+html$._DomRect = class _DomRect extends html$.DomRectReadOnly {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94198,18 +94201,18 @@
     if (width === void 0) width = null;
     if (height === void 0) height = null;
     if (height != null) {
-      return html._DomRect._create_1(x, y, width, height);
+      return html$._DomRect._create_1(x, y, width, height);
     }
     if (width != null) {
-      return html._DomRect._create_2(x, y, width);
+      return html$._DomRect._create_2(x, y, width);
     }
     if (y != null) {
-      return html._DomRect._create_3(x, y);
+      return html$._DomRect._create_3(x, y);
     }
     if (x != null) {
-      return html._DomRect._create_4(x);
+      return html$._DomRect._create_4(x);
     }
-    return html._DomRect._create_5();
+    return html$._DomRect._create_5();
   }
   static _create_1(x, y, width, height) {
     return new DOMRect(x, y, width, height);
@@ -94251,10 +94254,10 @@
     this.y = value;
   }
 };
-dart.setSignature(html._DomRect, {
+dart.setSignature(html$._DomRect, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._DomRect, []),
-    new: dart.definiteFunctionType(html._DomRect, [], [core.num, core.num, core.num, core.num])
+    _: dart.definiteFunctionType(html$._DomRect, []),
+    new: dart.definiteFunctionType(html$._DomRect, [], [core.num, core.num, core.num, core.num])
   }),
   setters: () => ({
     [dartx.height]: dart.definiteFunctionType(dart.void, [core.num]),
@@ -94263,53 +94266,53 @@
     [dartx.y]: dart.definiteFunctionType(dart.void, [core.num])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html._DomRect, [dart.dynamic, dart.dynamic]),
-    _create_4: dart.definiteFunctionType(html._DomRect, [dart.dynamic]),
-    _create_5: dart.definiteFunctionType(html._DomRect, [])
+    _create_1: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic, dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$._DomRect, [dart.dynamic, dart.dynamic]),
+    _create_4: dart.definiteFunctionType(html$._DomRect, [dart.dynamic]),
+    _create_5: dart.definiteFunctionType(html$._DomRect, [])
   }),
   names: ['_create_1', '_create_2', '_create_3', '_create_4', '_create_5']
 });
-dart.registerExtension(dart.global.DOMRect, html._DomRect);
-html._FileEntrySync = class _FileEntrySync extends html._EntrySync {
+dart.registerExtension(dart.global.DOMRect, html$._DomRect);
+html$._FileEntrySync = class _FileEntrySync extends html$._EntrySync {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._FileEntrySync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._FileEntrySync, [])})
+dart.setSignature(html$._FileEntrySync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._FileEntrySync, [])})
 });
-dart.registerExtension(dart.global.FileEntrySync, html._FileEntrySync);
-html._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.FileEntrySync, html$._FileEntrySync);
+html$._FileReaderSync = class _FileReaderSync extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return html._FileReaderSync._create_1();
+    return html$._FileReaderSync._create_1();
   }
   static _create_1() {
     return new FileReaderSync();
   }
 };
-dart.setSignature(html._FileReaderSync, {
+dart.setSignature(html$._FileReaderSync, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._FileReaderSync, []),
-    new: dart.definiteFunctionType(html._FileReaderSync, [])
+    _: dart.definiteFunctionType(html$._FileReaderSync, []),
+    new: dart.definiteFunctionType(html$._FileReaderSync, [])
   }),
-  statics: () => ({_create_1: dart.definiteFunctionType(html._FileReaderSync, [])}),
+  statics: () => ({_create_1: dart.definiteFunctionType(html$._FileReaderSync, [])}),
   names: ['_create_1']
 });
-dart.registerExtension(dart.global.FileReaderSync, html._FileReaderSync);
-html._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.FileReaderSync, html$._FileReaderSync);
+html$._FileWriterSync = class _FileWriterSync extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._FileWriterSync, {
-  constructors: () => ({_: dart.definiteFunctionType(html._FileWriterSync, [])})
+dart.setSignature(html$._FileWriterSync, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._FileWriterSync, [])})
 });
-dart.registerExtension(dart.global.FileWriterSync, html._FileWriterSync);
+dart.registerExtension(dart.global.FileWriterSync, html$._FileWriterSync);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -94321,7 +94324,7 @@
   'elementAt',
   'item'
 ]);
-html._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Gamepad), html.ImmutableListMixin$(html.Gamepad)) {
+html$._GamepadList = class _GamepadList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Gamepad), html$.ImmutableListMixin$(html$.Gamepad)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94367,19 +94370,19 @@
     return this.item.apply(this, args);
   }
 };
-html._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
-dart.setSignature(html._GamepadList, {
-  constructors: () => ({_: dart.definiteFunctionType(html._GamepadList, [])}),
+html$._GamepadList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfGamepad()];
+dart.setSignature(html$._GamepadList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._GamepadList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Gamepad, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Gamepad]),
-    [dartx.item]: dart.definiteFunctionType(html.Gamepad, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.Gamepad, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Gamepad]),
+    [dartx.item]: dart.definiteFunctionType(html$.Gamepad, [core.int])
   })
 });
-dart.registerExtension(dart.global.GamepadList, html._GamepadList);
-html._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.GamepadList, html$._GamepadList);
+html$._HTMLAllCollection = class _HTMLAllCollection extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94387,12 +94390,12 @@
     return this.item.apply(this, args);
   }
 };
-dart.setSignature(html._HTMLAllCollection, {
-  constructors: () => ({_: dart.definiteFunctionType(html._HTMLAllCollection, [])}),
-  methods: () => ({[_item]: dart.definiteFunctionType(html.Element, [core.int])})
+dart.setSignature(html$._HTMLAllCollection, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._HTMLAllCollection, [])}),
+  methods: () => ({[_item]: dart.definiteFunctionType(html$.Element, [core.int])})
 });
-dart.registerExtension(dart.global.HTMLAllCollection, html._HTMLAllCollection);
-html._HTMLAppletElement = class _HTMLAppletElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLAllCollection, html$._HTMLAllCollection);
+html$._HTMLAppletElement = class _HTMLAppletElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94400,15 +94403,15 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLAppletElement, 'created');
-dart.setSignature(html._HTMLAppletElement, {
+dart.defineNamedConstructor(html$._HTMLAppletElement, 'created');
+dart.setSignature(html$._HTMLAppletElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLAppletElement, []),
-    created: dart.definiteFunctionType(html._HTMLAppletElement, [])
+    _: dart.definiteFunctionType(html$._HTMLAppletElement, []),
+    created: dart.definiteFunctionType(html$._HTMLAppletElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLAppletElement, html._HTMLAppletElement);
-html._HTMLDirectoryElement = class _HTMLDirectoryElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLAppletElement, html$._HTMLAppletElement);
+html$._HTMLDirectoryElement = class _HTMLDirectoryElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94416,15 +94419,15 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLDirectoryElement, 'created');
-dart.setSignature(html._HTMLDirectoryElement, {
+dart.defineNamedConstructor(html$._HTMLDirectoryElement, 'created');
+dart.setSignature(html$._HTMLDirectoryElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLDirectoryElement, []),
-    created: dart.definiteFunctionType(html._HTMLDirectoryElement, [])
+    _: dart.definiteFunctionType(html$._HTMLDirectoryElement, []),
+    created: dart.definiteFunctionType(html$._HTMLDirectoryElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLDirectoryElement, html._HTMLDirectoryElement);
-html._HTMLFontElement = class _HTMLFontElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLDirectoryElement, html$._HTMLDirectoryElement);
+html$._HTMLFontElement = class _HTMLFontElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94432,15 +94435,15 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLFontElement, 'created');
-dart.setSignature(html._HTMLFontElement, {
+dart.defineNamedConstructor(html$._HTMLFontElement, 'created');
+dart.setSignature(html$._HTMLFontElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLFontElement, []),
-    created: dart.definiteFunctionType(html._HTMLFontElement, [])
+    _: dart.definiteFunctionType(html$._HTMLFontElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFontElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLFontElement, html._HTMLFontElement);
-html._HTMLFrameElement = class _HTMLFrameElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLFontElement, html$._HTMLFontElement);
+html$._HTMLFrameElement = class _HTMLFrameElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94448,15 +94451,15 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLFrameElement, 'created');
-dart.setSignature(html._HTMLFrameElement, {
+dart.defineNamedConstructor(html$._HTMLFrameElement, 'created');
+dart.setSignature(html$._HTMLFrameElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLFrameElement, []),
-    created: dart.definiteFunctionType(html._HTMLFrameElement, [])
+    _: dart.definiteFunctionType(html$._HTMLFrameElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFrameElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLFrameElement, html._HTMLFrameElement);
-html._HTMLFrameSetElement = class _HTMLFrameSetElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLFrameElement, html$._HTMLFrameElement);
+html$._HTMLFrameSetElement = class _HTMLFrameSetElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94464,16 +94467,16 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLFrameSetElement, 'created');
-html._HTMLFrameSetElement[dart.implements] = () => [html.WindowEventHandlers];
-dart.setSignature(html._HTMLFrameSetElement, {
+dart.defineNamedConstructor(html$._HTMLFrameSetElement, 'created');
+html$._HTMLFrameSetElement[dart.implements] = () => [html$.WindowEventHandlers];
+dart.setSignature(html$._HTMLFrameSetElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLFrameSetElement, []),
-    created: dart.definiteFunctionType(html._HTMLFrameSetElement, [])
+    _: dart.definiteFunctionType(html$._HTMLFrameSetElement, []),
+    created: dart.definiteFunctionType(html$._HTMLFrameSetElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLFrameSetElement, html._HTMLFrameSetElement);
-html._HTMLMarqueeElement = class _HTMLMarqueeElement extends html.HtmlElement {
+dart.registerExtension(dart.global.HTMLFrameSetElement, html$._HTMLFrameSetElement);
+html$._HTMLMarqueeElement = class _HTMLMarqueeElement extends html$.HtmlElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94481,14 +94484,14 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(html._HTMLMarqueeElement, 'created');
-dart.setSignature(html._HTMLMarqueeElement, {
+dart.defineNamedConstructor(html$._HTMLMarqueeElement, 'created');
+dart.setSignature(html$._HTMLMarqueeElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._HTMLMarqueeElement, []),
-    created: dart.definiteFunctionType(html._HTMLMarqueeElement, [])
+    _: dart.definiteFunctionType(html$._HTMLMarqueeElement, []),
+    created: dart.definiteFunctionType(html$._HTMLMarqueeElement, [])
   })
 });
-dart.registerExtension(dart.global.HTMLMarqueeElement, html._HTMLMarqueeElement);
+dart.registerExtension(dart.global.HTMLMarqueeElement, html$._HTMLMarqueeElement);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -94506,7 +94509,7 @@
   'setNamedItem',
   'setNamedItemNS'
 ]);
-html._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.Node), html.ImmutableListMixin$(html.Node)) {
+html$._NamedNodeMap = class _NamedNodeMap extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.Node), html$.ImmutableListMixin$(html$.Node)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94570,34 +94573,34 @@
     return this.setNamedItemNS.apply(this, args);
   }
 };
-html._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
-dart.setSignature(html._NamedNodeMap, {
-  constructors: () => ({_: dart.definiteFunctionType(html._NamedNodeMap, [])}),
+html$._NamedNodeMap[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfNode()];
+dart.setSignature(html$._NamedNodeMap, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._NamedNodeMap, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.Node, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.Node]),
-    [dartx.getNamedItem]: dart.definiteFunctionType(html._Attr, [core.String]),
-    [dartx.getNamedItemNS]: dart.definiteFunctionType(html._Attr, [core.String, core.String]),
-    [dartx.item]: dart.definiteFunctionType(html._Attr, [core.int]),
-    [dartx.removeNamedItem]: dart.definiteFunctionType(html._Attr, [core.String]),
-    [dartx.removeNamedItemNS]: dart.definiteFunctionType(html._Attr, [core.String, core.String]),
-    [dartx.setNamedItem]: dart.definiteFunctionType(html._Attr, [html._Attr]),
-    [dartx.setNamedItemNS]: dart.definiteFunctionType(html._Attr, [html._Attr])
+    [dartx._get]: dart.definiteFunctionType(html$.Node, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.Node]),
+    [dartx.getNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
+    [dartx.getNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$._Attr, [core.int]),
+    [dartx.removeNamedItem]: dart.definiteFunctionType(html$._Attr, [core.String]),
+    [dartx.removeNamedItemNS]: dart.definiteFunctionType(html$._Attr, [core.String, core.String]),
+    [dartx.setNamedItem]: dart.definiteFunctionType(html$._Attr, [html$._Attr]),
+    [dartx.setNamedItemNS]: dart.definiteFunctionType(html$._Attr, [html$._Attr])
   })
 });
-dart.registerExtension(dart.global.NamedNodeMap, html._NamedNodeMap);
-dart.registerExtension(dart.global.MozNamedAttrMap, html._NamedNodeMap);
-html._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.NamedNodeMap, html$._NamedNodeMap);
+dart.registerExtension(dart.global.MozNamedAttrMap, html$._NamedNodeMap);
+html$._PagePopupController = class _PagePopupController extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._PagePopupController, {
-  constructors: () => ({_: dart.definiteFunctionType(html._PagePopupController, [])})
+dart.setSignature(html$._PagePopupController, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._PagePopupController, [])})
 });
-dart.registerExtension(dart.global.PagePopupController, html._PagePopupController);
+dart.registerExtension(dart.global.PagePopupController, html$._PagePopupController);
 dart.defineExtensionNames([
   'clone',
   'context',
@@ -94607,7 +94610,7 @@
   'referrer',
   'url'
 ]);
-html._Request = class _Request extends html.Body {
+html$._Request = class _Request extends html$.Body {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94615,9 +94618,9 @@
     if (requestInitDict === void 0) requestInitDict = null;
     if (requestInitDict != null) {
       let requestInitDict_1 = html_common.convertDartToNative_Dictionary(requestInitDict);
-      return html._Request._create_1(input, requestInitDict_1);
+      return html$._Request._create_1(input, requestInitDict_1);
     }
-    return html._Request._create_2(input);
+    return html$._Request._create_2(input);
   }
   static _create_1(input, requestInitDict) {
     return new Request(input, requestInitDict);
@@ -94647,28 +94650,28 @@
     return this.clone.apply(this, args);
   }
 };
-dart.setSignature(html._Request, {
+dart.setSignature(html$._Request, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._Request, []),
-    new: dart.definiteFunctionType(html._Request, [core.Object], [core.Map])
+    _: dart.definiteFunctionType(html$._Request, []),
+    new: dart.definiteFunctionType(html$._Request, [core.Object], [core.Map])
   }),
   fields: () => ({
     [dartx.context]: core.String,
     [dartx.credentials]: core.String,
-    [dartx.headers]: html.Headers,
+    [dartx.headers]: html$.Headers,
     [dartx.mode]: core.String,
     [dartx.referrer]: core.String,
     [dartx.url]: core.String
   }),
-  methods: () => ({[dartx.clone]: dart.definiteFunctionType(html._Request, [])}),
+  methods: () => ({[dartx.clone]: dart.definiteFunctionType(html$._Request, [])}),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html._Request, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html._Request, [dart.dynamic])
+    _create_1: dart.definiteFunctionType(html$._Request, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._Request, [dart.dynamic])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.Request, html._Request);
-html._Response = class _Response extends html.Body {
+dart.registerExtension(dart.global.Request, html$._Request);
+html$._Response = class _Response extends html$.Body {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94677,12 +94680,12 @@
     if (responseInitDict === void 0) responseInitDict = null;
     if (responseInitDict != null) {
       let responseInitDict_1 = html_common.convertDartToNative_Dictionary(responseInitDict);
-      return html._Response._create_1(body, responseInitDict_1);
+      return html$._Response._create_1(body, responseInitDict_1);
     }
     if (body != null) {
-      return html._Response._create_2(body);
+      return html$._Response._create_2(body);
     }
-    return html._Response._create_3();
+    return html$._Response._create_3();
   }
   static _create_1(body, responseInitDict) {
     return new Response(body, responseInitDict);
@@ -94694,29 +94697,29 @@
     return new Response();
   }
 };
-dart.setSignature(html._Response, {
+dart.setSignature(html$._Response, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._Response, []),
-    new: dart.definiteFunctionType(html._Response, [], [core.Object, core.Map])
+    _: dart.definiteFunctionType(html$._Response, []),
+    new: dart.definiteFunctionType(html$._Response, [], [core.Object, core.Map])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html._Response, [dart.dynamic, dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html._Response, [dart.dynamic]),
-    _create_3: dart.definiteFunctionType(html._Response, [])
+    _create_1: dart.definiteFunctionType(html$._Response, [dart.dynamic, dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._Response, [dart.dynamic]),
+    _create_3: dart.definiteFunctionType(html$._Response, [])
   }),
   names: ['_create_1', '_create_2', '_create_3']
 });
-dart.registerExtension(dart.global.Response, html._Response);
-html._ServiceWorker = class _ServiceWorker extends html.EventTarget {
+dart.registerExtension(dart.global.Response, html$._Response);
+html$._ServiceWorker = class _ServiceWorker extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-html._ServiceWorker[dart.implements] = () => [html.AbstractWorker];
-dart.setSignature(html._ServiceWorker, {
-  constructors: () => ({_: dart.definiteFunctionType(html._ServiceWorker, [])})
+html$._ServiceWorker[dart.implements] = () => [html$.AbstractWorker];
+dart.setSignature(html$._ServiceWorker, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._ServiceWorker, [])})
 });
-dart.registerExtension(dart.global.ServiceWorker, html._ServiceWorker);
+dart.registerExtension(dart.global.ServiceWorker, html$._ServiceWorker);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -94728,7 +94731,7 @@
   'elementAt',
   'item'
 ]);
-html._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.SpeechRecognitionResult), html.ImmutableListMixin$(html.SpeechRecognitionResult)) {
+html$._SpeechRecognitionResultList = class _SpeechRecognitionResultList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.SpeechRecognitionResult), html$.ImmutableListMixin$(html$.SpeechRecognitionResult)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94774,18 +94777,18 @@
     return this.item.apply(this, args);
   }
 };
-html._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
-dart.setSignature(html._SpeechRecognitionResultList, {
-  constructors: () => ({_: dart.definiteFunctionType(html._SpeechRecognitionResultList, [])}),
+html$._SpeechRecognitionResultList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfSpeechRecognitionResult()];
+dart.setSignature(html$._SpeechRecognitionResultList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._SpeechRecognitionResultList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.SpeechRecognitionResult, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.SpeechRecognitionResult]),
-    [dartx.item]: dart.definiteFunctionType(html.SpeechRecognitionResult, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.SpeechRecognitionResult]),
+    [dartx.item]: dart.definiteFunctionType(html$.SpeechRecognitionResult, [core.int])
   })
 });
-dart.registerExtension(dart.global.SpeechRecognitionResultList, html._SpeechRecognitionResultList);
+dart.registerExtension(dart.global.SpeechRecognitionResultList, html$._SpeechRecognitionResultList);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -94797,7 +94800,7 @@
   'elementAt',
   'item'
 ]);
-html._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html.StyleSheet), html.ImmutableListMixin$(html.StyleSheet)) {
+html$._StyleSheetList = class _StyleSheetList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(html$.StyleSheet), html$.ImmutableListMixin$(html$.StyleSheet)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -94846,38 +94849,38 @@
     return this.item.apply(this, args);
   }
 };
-html._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
-dart.setSignature(html._StyleSheetList, {
-  constructors: () => ({_: dart.definiteFunctionType(html._StyleSheetList, [])}),
+html$._StyleSheetList[dart.implements] = () => [_js_helper.JavaScriptIndexingBehavior, ListOfStyleSheet()];
+dart.setSignature(html$._StyleSheetList, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._StyleSheetList, [])}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(html.StyleSheet, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html.StyleSheet]),
-    [__getter__]: dart.definiteFunctionType(html.CssStyleSheet, [core.String]),
-    [dartx.item]: dart.definiteFunctionType(html.StyleSheet, [core.int])
+    [dartx._get]: dart.definiteFunctionType(html$.StyleSheet, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, html$.StyleSheet]),
+    [__getter__]: dart.definiteFunctionType(html$.CssStyleSheet, [core.String]),
+    [dartx.item]: dart.definiteFunctionType(html$.StyleSheet, [core.int])
   })
 });
-dart.registerExtension(dart.global.StyleSheetList, html._StyleSheetList);
-html._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.StyleSheetList, html$._StyleSheetList);
+html$._SubtleCrypto = class _SubtleCrypto extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._SubtleCrypto, {
-  constructors: () => ({_: dart.definiteFunctionType(html._SubtleCrypto, [])})
+dart.setSignature(html$._SubtleCrypto, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._SubtleCrypto, [])})
 });
-dart.registerExtension(dart.global.SubtleCrypto, html._SubtleCrypto);
-html._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.SubtleCrypto, html$._SubtleCrypto);
+html$._WebKitCSSMatrix = class _WebKitCSSMatrix extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new(cssValue) {
     if (cssValue === void 0) cssValue = null;
     if (cssValue != null) {
-      return html._WebKitCSSMatrix._create_1(cssValue);
+      return html$._WebKitCSSMatrix._create_1(cssValue);
     }
-    return html._WebKitCSSMatrix._create_2();
+    return html$._WebKitCSSMatrix._create_2();
   }
   static _create_1(cssValue) {
     return new WebKitCSSMatrix(cssValue);
@@ -94886,59 +94889,59 @@
     return new WebKitCSSMatrix();
   }
 };
-dart.setSignature(html._WebKitCSSMatrix, {
+dart.setSignature(html$._WebKitCSSMatrix, {
   constructors: () => ({
-    _: dart.definiteFunctionType(html._WebKitCSSMatrix, []),
-    new: dart.definiteFunctionType(html._WebKitCSSMatrix, [], [core.String])
+    _: dart.definiteFunctionType(html$._WebKitCSSMatrix, []),
+    new: dart.definiteFunctionType(html$._WebKitCSSMatrix, [], [core.String])
   }),
   statics: () => ({
-    _create_1: dart.definiteFunctionType(html._WebKitCSSMatrix, [dart.dynamic]),
-    _create_2: dart.definiteFunctionType(html._WebKitCSSMatrix, [])
+    _create_1: dart.definiteFunctionType(html$._WebKitCSSMatrix, [dart.dynamic]),
+    _create_2: dart.definiteFunctionType(html$._WebKitCSSMatrix, [])
   }),
   names: ['_create_1', '_create_2']
 });
-dart.registerExtension(dart.global.WebKitCSSMatrix, html._WebKitCSSMatrix);
-html._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.WebKitCSSMatrix, html$._WebKitCSSMatrix);
+html$._WindowTimers = class _WindowTimers extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._WindowTimers, {
-  constructors: () => ({_: dart.definiteFunctionType(html._WindowTimers, [])})
+dart.setSignature(html$._WindowTimers, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WindowTimers, [])})
 });
-html._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
+html$._WorkerLocation = class _WorkerLocation extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-html._WorkerLocation[dart.implements] = () => [html.UrlUtilsReadOnly];
-dart.setSignature(html._WorkerLocation, {
-  constructors: () => ({_: dart.definiteFunctionType(html._WorkerLocation, [])})
+html$._WorkerLocation[dart.implements] = () => [html$.UrlUtilsReadOnly];
+dart.setSignature(html$._WorkerLocation, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerLocation, [])})
 });
-dart.registerExtension(dart.global.WorkerLocation, html._WorkerLocation);
-html._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.WorkerLocation, html$._WorkerLocation);
+html$._WorkerNavigator = class _WorkerNavigator extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-html._WorkerNavigator[dart.implements] = () => [html.NavigatorCpu, html.NavigatorOnLine, html.NavigatorID];
-dart.setSignature(html._WorkerNavigator, {
-  constructors: () => ({_: dart.definiteFunctionType(html._WorkerNavigator, [])})
+html$._WorkerNavigator[dart.implements] = () => [html$.NavigatorCpu, html$.NavigatorOnLine, html$.NavigatorID];
+dart.setSignature(html$._WorkerNavigator, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._WorkerNavigator, [])})
 });
-dart.registerExtension(dart.global.WorkerNavigator, html._WorkerNavigator);
-html._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html.ProgressEvent {
+dart.registerExtension(dart.global.WorkerNavigator, html$._WorkerNavigator);
+html$._XMLHttpRequestProgressEvent = class _XMLHttpRequestProgressEvent extends html$.ProgressEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(html._XMLHttpRequestProgressEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(html._XMLHttpRequestProgressEvent, [])})
+dart.setSignature(html$._XMLHttpRequestProgressEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(html$._XMLHttpRequestProgressEvent, [])})
 });
-dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html._XMLHttpRequestProgressEvent);
+dart.registerExtension(dart.global.XMLHttpRequestProgressEvent, html$._XMLHttpRequestProgressEvent);
 const _matches = Symbol('_matches');
-html._AttributeMap = class _AttributeMap extends core.Object {
+html$._AttributeMap = class _AttributeMap extends core.Object {
   new(element) {
-    this[_element] = element;
+    this[_element$] = element;
   }
   addAll(other) {
     other[dartx.forEach](dart.fn((k, v) => {
@@ -94971,10 +94974,10 @@
     }
   }
   get keys() {
-    let attributes = this[_element][_attributes];
+    let attributes = this[_element$][_attributes$];
     let keys = JSArrayOfString().of([]);
     for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
-      let attr = html._Attr._check(attributes[dartx._get](i));
+      let attr = html$._Attr._check(attributes[dartx._get](i));
       if (dart.test(this[_matches](attr))) {
         keys[dartx.add](attr[dartx.name]);
       }
@@ -94982,10 +94985,10 @@
     return keys;
   }
   get values() {
-    let attributes = this[_element][_attributes];
+    let attributes = this[_element$][_attributes$];
     let values = JSArrayOfString().of([]);
     for (let i = 0, len = attributes[dartx.length]; i < dart.notNull(len); i++) {
-      let attr = html._Attr._check(attributes[dartx._get](i));
+      let attr = html$._Attr._check(attributes[dartx._get](i));
       if (dart.test(this[_matches](attr))) {
         values[dartx.add](attr[dartx.value]);
       }
@@ -94999,10 +95002,10 @@
     return !dart.test(this.isEmpty);
   }
 };
-html._AttributeMap[dart.implements] = () => [MapOfString$String()];
-dart.setSignature(html._AttributeMap, {
-  constructors: () => ({new: dart.definiteFunctionType(html._AttributeMap, [html.Element])}),
-  fields: () => ({[_element]: html.Element}),
+html$._AttributeMap[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$._AttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._AttributeMap, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
   getters: () => ({
     keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
     values: dart.definiteFunctionType(core.Iterable$(core.String), []),
@@ -95017,7 +95020,7 @@
     forEach: dart.definiteFunctionType(dart.void, [StringAndStringTovoid()])
   })
 });
-dart.defineExtensionMembers(html._AttributeMap, [
+dart.defineExtensionMembers(html$._AttributeMap, [
   'addAll',
   'containsValue',
   'putIfAbsent',
@@ -95028,23 +95031,23 @@
   'isEmpty',
   'isNotEmpty'
 ]);
-html._ElementAttributeMap = class _ElementAttributeMap extends html._AttributeMap {
+html$._ElementAttributeMap = class _ElementAttributeMap extends html$._AttributeMap {
   new(element) {
     super.new(element);
   }
   containsKey(key) {
-    return this[_element][_hasAttribute](core.String._check(key));
+    return this[_element$][_hasAttribute](core.String._check(key));
   }
   _get(key) {
-    return this[_element][dartx.getAttribute](core.String._check(key));
+    return this[_element$][dartx.getAttribute](core.String._check(key));
   }
   _set(key, value) {
-    this[_element][dartx.setAttribute](key, value);
+    this[_element$][dartx.setAttribute](key, value);
     return value;
   }
   remove(key) {
-    let value = this[_element][dartx.getAttribute](core.String._check(key));
-    this[_element][_removeAttribute](core.String._check(key));
+    let value = this[_element$][dartx.getAttribute](core.String._check(key));
+    this[_element$][_removeAttribute](core.String._check(key));
     return value;
   }
   get length() {
@@ -95054,18 +95057,18 @@
     return node[_namespaceUri] == null;
   }
 };
-dart.setSignature(html._ElementAttributeMap, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ElementAttributeMap, [html.Element])}),
+dart.setSignature(html$._ElementAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ElementAttributeMap, [html$.Element])}),
   getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
   methods: () => ({
     containsKey: dart.definiteFunctionType(core.bool, [core.Object]),
     _get: dart.definiteFunctionType(core.String, [core.Object]),
     _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
     remove: dart.definiteFunctionType(core.String, [core.Object]),
-    [_matches]: dart.definiteFunctionType(core.bool, [html.Node])
+    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
   })
 });
-dart.defineExtensionMembers(html._ElementAttributeMap, [
+dart.defineExtensionMembers(html$._ElementAttributeMap, [
   'containsKey',
   '_get',
   '_set',
@@ -95073,24 +95076,24 @@
   'length'
 ]);
 const _namespace = Symbol('_namespace');
-html._NamespacedAttributeMap = class _NamespacedAttributeMap extends html._AttributeMap {
+html$._NamespacedAttributeMap = class _NamespacedAttributeMap extends html$._AttributeMap {
   new(element, namespace) {
     this[_namespace] = namespace;
     super.new(element);
   }
   containsKey(key) {
-    return this[_element][_hasAttributeNS](this[_namespace], core.String._check(key));
+    return this[_element$][_hasAttributeNS](this[_namespace], core.String._check(key));
   }
   _get(key) {
-    return this[_element][dartx.getAttributeNS](this[_namespace], core.String._check(key));
+    return this[_element$][dartx.getAttributeNS](this[_namespace], core.String._check(key));
   }
   _set(key, value) {
-    this[_element][dartx.setAttributeNS](this[_namespace], key, value);
+    this[_element$][dartx.setAttributeNS](this[_namespace], key, value);
     return value;
   }
   remove(key) {
     let value = this._get(key);
-    this[_element][_removeAttributeNS](this[_namespace], core.String._check(key));
+    this[_element$][_removeAttributeNS](this[_namespace], core.String._check(key));
     return value;
   }
   get length() {
@@ -95100,8 +95103,8 @@
     return node[_namespaceUri] == this[_namespace];
   }
 };
-dart.setSignature(html._NamespacedAttributeMap, {
-  constructors: () => ({new: dart.definiteFunctionType(html._NamespacedAttributeMap, [html.Element, core.String])}),
+dart.setSignature(html$._NamespacedAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._NamespacedAttributeMap, [html$.Element, core.String])}),
   fields: () => ({[_namespace]: core.String}),
   getters: () => ({length: dart.definiteFunctionType(core.int, [])}),
   methods: () => ({
@@ -95109,10 +95112,10 @@
     _get: dart.definiteFunctionType(core.String, [core.Object]),
     _set: dart.definiteFunctionType(dart.void, [core.String, core.String]),
     remove: dart.definiteFunctionType(core.String, [core.Object]),
-    [_matches]: dart.definiteFunctionType(core.bool, [html.Node])
+    [_matches]: dart.definiteFunctionType(core.bool, [html$.Node])
   })
 });
-dart.defineExtensionMembers(html._NamespacedAttributeMap, [
+dart.defineExtensionMembers(html$._NamespacedAttributeMap, [
   'containsKey',
   '_get',
   '_set',
@@ -95123,9 +95126,9 @@
 const _strip = Symbol('_strip');
 const _toHyphenedName = Symbol('_toHyphenedName');
 const _toCamelCase = Symbol('_toCamelCase');
-html._DataAttributeMap = class _DataAttributeMap extends core.Object {
+html$._DataAttributeMap = class _DataAttributeMap extends core.Object {
   new(attributes) {
-    this[_attributes] = attributes;
+    this[_attributes$] = attributes;
   }
   addAll(other) {
     other[dartx.forEach](dart.fn((k, v) => {
@@ -95133,23 +95136,23 @@
     }, StringAndStringToNull()));
   }
   containsValue(value) {
-    return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool()));
+    return this.values[dartx.any](dart.fn(v => dart.equals(v, value), StringTobool$()));
   }
   containsKey(key) {
-    return this[_attributes][dartx.containsKey](this[_attr](core.String._check(key)));
+    return this[_attributes$][dartx.containsKey](this[_attr](core.String._check(key)));
   }
   _get(key) {
-    return this[_attributes][dartx._get](this[_attr](core.String._check(key)));
+    return this[_attributes$][dartx._get](this[_attr](core.String._check(key)));
   }
   _set(key, value) {
-    this[_attributes][dartx._set](this[_attr](key), value);
+    this[_attributes$][dartx._set](this[_attr](key), value);
     return value;
   }
   putIfAbsent(key, ifAbsent) {
-    return this[_attributes][dartx.putIfAbsent](this[_attr](key), ifAbsent);
+    return this[_attributes$][dartx.putIfAbsent](this[_attr](key), ifAbsent);
   }
   remove(key) {
-    return this[_attributes][dartx.remove](this[_attr](core.String._check(key)));
+    return this[_attributes$][dartx.remove](this[_attr](core.String._check(key)));
   }
   clear() {
     for (let key of this.keys) {
@@ -95157,7 +95160,7 @@
     }
   }
   forEach(f) {
-    this[_attributes][dartx.forEach](dart.fn((key, value) => {
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
       if (dart.test(this[_matches](key))) {
         f(this[_strip](key), value);
       }
@@ -95165,7 +95168,7 @@
   }
   get keys() {
     let keys = JSArrayOfString().of([]);
-    this[_attributes][dartx.forEach](dart.fn((key, value) => {
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
       if (dart.test(this[_matches](key))) {
         keys[dartx.add](this[_strip](key));
       }
@@ -95174,7 +95177,7 @@
   }
   get values() {
     let values = JSArrayOfString().of([]);
-    this[_attributes][dartx.forEach](dart.fn((key, value) => {
+    this[_attributes$][dartx.forEach](dart.fn((key, value) => {
       if (dart.test(this[_matches](key))) {
         values[dartx.add](value);
       }
@@ -95221,10 +95224,10 @@
     return sb.toString();
   }
 };
-html._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
-dart.setSignature(html._DataAttributeMap, {
-  constructors: () => ({new: dart.definiteFunctionType(html._DataAttributeMap, [MapOfString$String()])}),
-  fields: () => ({[_attributes]: MapOfString$String()}),
+html$._DataAttributeMap[dart.implements] = () => [MapOfString$String()];
+dart.setSignature(html$._DataAttributeMap, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._DataAttributeMap, [MapOfString$String()])}),
+  fields: () => ({[_attributes$]: MapOfString$String()}),
   getters: () => ({
     keys: dart.definiteFunctionType(core.Iterable$(core.String), []),
     values: dart.definiteFunctionType(core.Iterable$(core.String), []),
@@ -95249,7 +95252,7 @@
     [_toHyphenedName]: dart.definiteFunctionType(core.String, [core.String])
   })
 });
-dart.defineExtensionMembers(html._DataAttributeMap, [
+dart.defineExtensionMembers(html$._DataAttributeMap, [
   'addAll',
   'containsValue',
   'containsKey',
@@ -95265,17 +95268,17 @@
   'isEmpty',
   'isNotEmpty'
 ]);
-html.CanvasImageSource = class CanvasImageSource extends core.Object {};
-html.WindowBase = class WindowBase extends core.Object {};
-html.WindowBase[dart.implements] = () => [html.EventTarget];
-html.LocationBase = class LocationBase extends core.Object {};
-html.HistoryBase = class HistoryBase extends core.Object {};
-html.CssClassSet = class CssClassSet extends core.Object {};
-html.CssClassSet[dart.implements] = () => [SetOfString()];
+html$.CanvasImageSource = class CanvasImageSource extends core.Object {};
+html$.WindowBase = class WindowBase extends core.Object {};
+html$.WindowBase[dart.implements] = () => [html$.EventTarget];
+html$.LocationBase = class LocationBase extends core.Object {};
+html$.HistoryBase = class HistoryBase extends core.Object {};
+html$.CssClassSet = class CssClassSet extends core.Object {};
+html$.CssClassSet[dart.implements] = () => [SetOfString()];
 const _addOrSubtractToBoxModel = Symbol('_addOrSubtractToBoxModel');
-html.CssRect = class CssRect extends core.Object {
+html$.CssRect = class CssRect extends core.Object {
   new(element) {
-    this[_element] = element;
+    this[_element$] = element;
   }
   set height(newHeight) {
     dart.throw(new core.UnsupportedError("Can only set height for content rect."));
@@ -95284,17 +95287,17 @@
     dart.throw(new core.UnsupportedError("Can only set width for content rect."));
   }
   [_addOrSubtractToBoxModel](dimensions, augmentingMeasurement) {
-    let styles = this[_element][dartx.getComputedStyle]();
+    let styles = this[_element$][dartx.getComputedStyle]();
     let val = 0;
     for (let measurement of dimensions) {
-      if (augmentingMeasurement == html._MARGIN) {
-        val = dart.notNull(val) + dart.notNull(new html.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
+      if (augmentingMeasurement == html$._MARGIN) {
+        val = dart.notNull(val) + dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${augmentingMeasurement}-${measurement}`)).value);
       }
-      if (augmentingMeasurement == html._CONTENT) {
-        val = dart.notNull(val) - dart.notNull(new html.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html._PADDING}-${measurement}`)).value);
+      if (augmentingMeasurement == html$._CONTENT) {
+        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`${html$._PADDING}-${measurement}`)).value);
       }
-      if (augmentingMeasurement != html._MARGIN) {
-        val = dart.notNull(val) - dart.notNull(new html.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
+      if (augmentingMeasurement != html$._MARGIN) {
+        val = dart.notNull(val) - dart.notNull(new html$.Dimension.css(styles[dartx.getPropertyValue](dart.str`border-${measurement}-width`)).value);
       }
     }
     return val;
@@ -95313,7 +95316,7 @@
     return dart.equals(this.left, dart.dload(other, 'left')) && dart.equals(this.top, dart.dload(other, 'top')) && dart.equals(this.right, dart.dload(other, 'right')) && dart.equals(this.bottom, dart.dload(other, 'bottom'));
   }
   get hashCode() {
-    return html._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
+    return html$._JenkinsSmiHash.hash4(dart.hashCode(this.left), dart.hashCode(this.top), dart.hashCode(this.right), dart.hashCode(this.bottom));
   }
   intersection(other) {
     let x0 = math.max(core.num)(this.left, other[dartx.left]);
@@ -95356,10 +95359,10 @@
     return new (PointOfnum())(this.left, dart.notNull(this.top) + dart.notNull(this.height));
   }
 };
-html.CssRect[dart.implements] = () => [RectangleOfnum()];
-dart.setSignature(html.CssRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html.CssRect, [html.Element])}),
-  fields: () => ({[_element]: html.Element}),
+html$.CssRect[dart.implements] = () => [RectangleOfnum()];
+dart.setSignature(html$.CssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.CssRect, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
   getters: () => ({
     right: dart.definiteFunctionType(core.num, []),
     bottom: dart.definiteFunctionType(core.num, []),
@@ -95381,7 +95384,7 @@
     containsPoint: dart.definiteFunctionType(core.bool, [PointOfnum()])
   })
 });
-dart.defineExtensionMembers(html.CssRect, [
+dart.defineExtensionMembers(html$.CssRect, [
   'toString',
   '==',
   'intersection',
@@ -95397,47 +95400,47 @@
   'bottomRight',
   'bottomLeft'
 ]);
-html._ContentCssRect = class _ContentCssRect extends html.CssRect {
+html$._ContentCssRect = class _ContentCssRect extends html$.CssRect {
   new(element) {
     super.new(element);
   }
   get height() {
-    return dart.notNull(this[_element][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html._HEIGHT, html._CONTENT));
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._CONTENT));
   }
   get width() {
-    return dart.notNull(this[_element][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html._WIDTH, html._CONTENT));
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._CONTENT));
   }
   set height(newHeight) {
-    if (html.Dimension.is(newHeight)) {
-      if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html.Dimension.px(0);
-      this[_element][dartx.style][dartx.height] = dart.toString(newHeight);
+    if (html$.Dimension.is(newHeight)) {
+      if (dart.test(dart.dsend(dart.dload(newHeight, 'value'), '<', 0))) newHeight = new html$.Dimension.px(0);
+      this[_element$][dartx.style][dartx.height] = dart.toString(newHeight);
     } else if (typeof newHeight == 'number') {
       if (dart.test(dart.dsend(newHeight, '<', 0))) newHeight = 0;
-      this[_element][dartx.style][dartx.height] = dart.str`${newHeight}px`;
+      this[_element$][dartx.style][dartx.height] = dart.str`${newHeight}px`;
     } else {
       dart.throw(new core.ArgumentError("newHeight is not a Dimension or num"));
     }
   }
   set width(newWidth) {
-    if (html.Dimension.is(newWidth)) {
-      if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html.Dimension.px(0);
-      this[_element][dartx.style][dartx.width] = dart.toString(newWidth);
+    if (html$.Dimension.is(newWidth)) {
+      if (dart.test(dart.dsend(dart.dload(newWidth, 'value'), '<', 0))) newWidth = new html$.Dimension.px(0);
+      this[_element$][dartx.style][dartx.width] = dart.toString(newWidth);
     } else if (typeof newWidth == 'number') {
       if (dart.test(dart.dsend(newWidth, '<', 0))) newWidth = 0;
-      this[_element][dartx.style][dartx.width] = dart.str`${newWidth}px`;
+      this[_element$][dartx.style][dartx.width] = dart.str`${newWidth}px`;
     } else {
       dart.throw(new core.ArgumentError("newWidth is not a Dimension or num"));
     }
   }
   get left() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html._CONTENT));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._CONTENT));
   }
   get top() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html._CONTENT));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._CONTENT));
   }
 };
-dart.setSignature(html._ContentCssRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ContentCssRect, [html.Element])}),
+dart.setSignature(html$._ContentCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssRect, [html$.Element])}),
   getters: () => ({
     height: dart.definiteFunctionType(core.num, []),
     width: dart.definiteFunctionType(core.num, []),
@@ -95445,56 +95448,56 @@
     top: dart.definiteFunctionType(core.num, [])
   })
 });
-dart.defineExtensionMembers(html._ContentCssRect, ['height', 'width', 'left', 'top']);
+dart.defineExtensionMembers(html$._ContentCssRect, ['height', 'width', 'left', 'top']);
 const _elementList = Symbol('_elementList');
-html._ContentCssListRect = class _ContentCssListRect extends html._ContentCssRect {
+html$._ContentCssListRect = class _ContentCssListRect extends html$._ContentCssRect {
   new(elementList) {
     this[_elementList] = null;
     super.new(elementList[dartx.first]);
     this[_elementList] = elementList;
   }
   set height(newHeight) {
-    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid()));
+    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].height = newHeight, ElementTovoid$()));
   }
   get height() {
     return super.height;
   }
   set width(newWidth) {
-    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid()));
+    this[_elementList][dartx.forEach](dart.fn(e => e[dartx.contentEdge].width = newWidth, ElementTovoid$()));
   }
   get width() {
     return super.width;
   }
 };
-dart.setSignature(html._ContentCssListRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ContentCssListRect, [ListOfElement()])}),
+dart.setSignature(html$._ContentCssListRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ContentCssListRect, [ListOfElement()])}),
   fields: () => ({[_elementList]: ListOfElement()})
 });
-html._PaddingCssRect = class _PaddingCssRect extends html.CssRect {
+html$._PaddingCssRect = class _PaddingCssRect extends html$.CssRect {
   new(element) {
-    super.new(html.Element._check(element));
+    super.new(html$.Element._check(element));
   }
   get height() {
-    return dart.notNull(this[_element][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html._HEIGHT, html._PADDING));
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._PADDING));
   }
   set height(value) {
     super.height = value;
   }
   get width() {
-    return dart.notNull(this[_element][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html._WIDTH, html._PADDING));
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._PADDING));
   }
   set width(value) {
     super.width = value;
   }
   get left() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html._PADDING));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._PADDING));
   }
   get top() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html._PADDING));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._PADDING));
   }
 };
-dart.setSignature(html._PaddingCssRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html._PaddingCssRect, [dart.dynamic])}),
+dart.setSignature(html$._PaddingCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._PaddingCssRect, [dart.dynamic])}),
   getters: () => ({
     height: dart.definiteFunctionType(core.num, []),
     width: dart.definiteFunctionType(core.num, []),
@@ -95502,32 +95505,32 @@
     top: dart.definiteFunctionType(core.num, [])
   })
 });
-dart.defineExtensionMembers(html._PaddingCssRect, ['height', 'width', 'left', 'top']);
-html._BorderCssRect = class _BorderCssRect extends html.CssRect {
+dart.defineExtensionMembers(html$._PaddingCssRect, ['height', 'width', 'left', 'top']);
+html$._BorderCssRect = class _BorderCssRect extends html$.CssRect {
   new(element) {
-    super.new(html.Element._check(element));
+    super.new(html$.Element._check(element));
   }
   get height() {
-    return this[_element][dartx.offsetHeight];
+    return this[_element$][dartx.offsetHeight];
   }
   set height(value) {
     super.height = value;
   }
   get width() {
-    return this[_element][dartx.offsetWidth];
+    return this[_element$][dartx.offsetWidth];
   }
   set width(value) {
     super.width = value;
   }
   get left() {
-    return this[_element][dartx.getBoundingClientRect]()[dartx.left];
+    return this[_element$][dartx.getBoundingClientRect]()[dartx.left];
   }
   get top() {
-    return this[_element][dartx.getBoundingClientRect]()[dartx.top];
+    return this[_element$][dartx.getBoundingClientRect]()[dartx.top];
   }
 };
-dart.setSignature(html._BorderCssRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html._BorderCssRect, [dart.dynamic])}),
+dart.setSignature(html$._BorderCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._BorderCssRect, [dart.dynamic])}),
   getters: () => ({
     height: dart.definiteFunctionType(core.num, []),
     width: dart.definiteFunctionType(core.num, []),
@@ -95535,32 +95538,32 @@
     top: dart.definiteFunctionType(core.num, [])
   })
 });
-dart.defineExtensionMembers(html._BorderCssRect, ['height', 'width', 'left', 'top']);
-html._MarginCssRect = class _MarginCssRect extends html.CssRect {
+dart.defineExtensionMembers(html$._BorderCssRect, ['height', 'width', 'left', 'top']);
+html$._MarginCssRect = class _MarginCssRect extends html$.CssRect {
   new(element) {
-    super.new(html.Element._check(element));
+    super.new(html$.Element._check(element));
   }
   get height() {
-    return dart.notNull(this[_element][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html._HEIGHT, html._MARGIN));
+    return dart.notNull(this[_element$][dartx.offsetHeight]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._HEIGHT, html$._MARGIN));
   }
   set height(value) {
     super.height = value;
   }
   get width() {
-    return dart.notNull(this[_element][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html._WIDTH, html._MARGIN));
+    return dart.notNull(this[_element$][dartx.offsetWidth]) + dart.notNull(this[_addOrSubtractToBoxModel](html$._WIDTH, html$._MARGIN));
   }
   set width(value) {
     super.width = value;
   }
   get left() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html._MARGIN));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.left]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['left']), html$._MARGIN));
   }
   get top() {
-    return dart.notNull(this[_element][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html._MARGIN));
+    return dart.notNull(this[_element$][dartx.getBoundingClientRect]()[dartx.top]) - dart.notNull(this[_addOrSubtractToBoxModel](JSArrayOfString().of(['top']), html$._MARGIN));
   }
 };
-dart.setSignature(html._MarginCssRect, {
-  constructors: () => ({new: dart.definiteFunctionType(html._MarginCssRect, [dart.dynamic])}),
+dart.setSignature(html$._MarginCssRect, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._MarginCssRect, [dart.dynamic])}),
   getters: () => ({
     height: dart.definiteFunctionType(core.num, []),
     width: dart.definiteFunctionType(core.num, []),
@@ -95568,20 +95571,20 @@
     top: dart.definiteFunctionType(core.num, [])
   })
 });
-dart.defineExtensionMembers(html._MarginCssRect, ['height', 'width', 'left', 'top']);
-dart.defineLazy(html, {
+dart.defineExtensionMembers(html$._MarginCssRect, ['height', 'width', 'left', 'top']);
+dart.defineLazy(html$, {
   get _HEIGHT() {
     return JSArrayOfString().of(['top', 'bottom']);
   }
 });
-dart.defineLazy(html, {
+dart.defineLazy(html$, {
   get _WIDTH() {
     return JSArrayOfString().of(['right', 'left']);
   }
 });
-html._CONTENT = 'content';
-html._PADDING = 'padding';
-html._MARGIN = 'margin';
+html$._CONTENT = 'content';
+html$._PADDING = 'padding';
+html$._MARGIN = 'margin';
 const _sets = Symbol('_sets');
 const _validateToken = Symbol('_validateToken');
 html_common.CssClassSetImpl = class CssClassSetImpl extends core.Object {
@@ -95687,7 +95690,7 @@
   }
   toggleAll(iterable, shouldAdd) {
     if (shouldAdd === void 0) shouldAdd = null;
-    iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool()));
+    iterable[dartx.forEach](dart.fn(e => this.toggle(e, shouldAdd), StringTobool$()));
   }
   retainAll(iterable) {
     this.modify(dart.fn(s => s.retainAll(iterable), SetOfStringTovoid()));
@@ -95762,7 +95765,7 @@
     return ret;
   }
 };
-html_common.CssClassSetImpl[dart.implements] = () => [html.CssClassSet];
+html_common.CssClassSetImpl[dart.implements] = () => [html$.CssClassSet];
 dart.setSignature(html_common.CssClassSetImpl, {
   getters: () => ({
     frozen: dart.definiteFunctionType(core.bool, []),
@@ -95850,9 +95853,9 @@
     return core.RegExp.new('^\\S+$');
   }
 });
-html._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
+html$._MultiElementCssClassSet = class _MultiElementCssClassSet extends html_common.CssClassSetImpl {
   static new(elements) {
-    return new html._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
+    return new html$._MultiElementCssClassSet._(elements, ListOfCssClassSetImpl()._check(elements[dartx.map](html$.CssClassSet)(dart.fn(e => e[dartx.classes], ElementToCssClassSet()))[dartx.toList]()));
   }
   _(elementIterable, sets) {
     this[_elementIterable] = elementIterable;
@@ -95880,11 +95883,11 @@
     return this[_sets][dartx.fold](core.bool)(false, dart.fn((changed, e) => dart.test(e.remove(value)) || dart.test(changed), boolAndCssClassSetImplTobool()));
   }
 };
-dart.defineNamedConstructor(html._MultiElementCssClassSet, '_');
-dart.setSignature(html._MultiElementCssClassSet, {
+dart.defineNamedConstructor(html$._MultiElementCssClassSet, '_');
+dart.setSignature(html$._MultiElementCssClassSet, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html._MultiElementCssClassSet, [IterableOfElement()]),
-    _: dart.definiteFunctionType(html._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
+    new: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement()]),
+    _: dart.definiteFunctionType(html$._MultiElementCssClassSet, [IterableOfElement(), ListOfCssClassSetImpl()])
   }),
   fields: () => ({
     [_elementIterable]: IterableOfElement(),
@@ -95895,13 +95898,13 @@
     writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
   })
 });
-html._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
+html$._ElementCssClassSet = class _ElementCssClassSet extends html_common.CssClassSetImpl {
   new(element) {
-    this[_element] = element;
+    this[_element$] = element;
   }
   readClasses() {
     let s = LinkedHashSetOfString().new();
-    let classname = this[_element][dartx.className];
+    let classname = this[_element$][dartx.className];
     for (let name of classname[dartx.split](' ')) {
       let trimmed = name[dartx.trim]();
       if (!dart.test(trimmed[dartx.isEmpty])) {
@@ -95911,10 +95914,10 @@
     return s;
   }
   writeClasses(s) {
-    this[_element][dartx.className] = s.join(' ');
+    this[_element$][dartx.className] = s.join(' ');
   }
   get length() {
-    return html._ElementCssClassSet._classListLength(html._ElementCssClassSet._classListOf(this[_element]));
+    return html$._ElementCssClassSet._classListLength(html$._ElementCssClassSet._classListOf(this[_element$]));
   }
   get isEmpty() {
     return this.length == 0;
@@ -95923,87 +95926,87 @@
     return this.length != 0;
   }
   clear() {
-    this[_element][dartx.className] = '';
+    this[_element$][dartx.className] = '';
   }
   contains(value) {
-    return html._ElementCssClassSet._contains(this[_element], value);
+    return html$._ElementCssClassSet._contains(this[_element$], value);
   }
   add(value) {
-    return html._ElementCssClassSet._add(this[_element], value);
+    return html$._ElementCssClassSet._add(this[_element$], value);
   }
   remove(value) {
-    return typeof value == 'string' && dart.test(html._ElementCssClassSet._remove(this[_element], value));
+    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._remove(this[_element$], value));
   }
   toggle(value, shouldAdd) {
     if (shouldAdd === void 0) shouldAdd = null;
-    return html._ElementCssClassSet._toggle(this[_element], value, shouldAdd);
+    return html$._ElementCssClassSet._toggle(this[_element$], value, shouldAdd);
   }
   addAll(iterable) {
-    html._ElementCssClassSet._addAll(this[_element], iterable);
+    html$._ElementCssClassSet._addAll(this[_element$], iterable);
   }
   removeAll(iterable) {
-    html._ElementCssClassSet._removeAll(this[_element], IterableOfString()._check(iterable));
+    html$._ElementCssClassSet._removeAll(this[_element$], IterableOfString()._check(iterable));
   }
   retainAll(iterable) {
-    html._ElementCssClassSet._removeWhere(this[_element], dart.bind(iterable[dartx.toSet](), 'contains'), false);
+    html$._ElementCssClassSet._removeWhere(this[_element$], dart.bind(iterable[dartx.toSet](), 'contains'), false);
   }
   removeWhere(test) {
-    html._ElementCssClassSet._removeWhere(this[_element], test, true);
+    html$._ElementCssClassSet._removeWhere(this[_element$], test, true);
   }
   retainWhere(test) {
-    html._ElementCssClassSet._removeWhere(this[_element], test, false);
+    html$._ElementCssClassSet._removeWhere(this[_element$], test, false);
   }
   static _contains(_element, value) {
-    return typeof value == 'string' && dart.test(html._ElementCssClassSet._classListContains(html._ElementCssClassSet._classListOf(_element), value));
+    return typeof value == 'string' && dart.test(html$._ElementCssClassSet._classListContains(html$._ElementCssClassSet._classListOf(_element), value));
   }
   static _add(_element, value) {
-    let list = html._ElementCssClassSet._classListOf(_element);
-    let added = !dart.test(html._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
-    html._ElementCssClassSet._classListAdd(list, value);
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    let added = !dart.test(html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value));
+    html$._ElementCssClassSet._classListAdd(list, value);
     return added;
   }
   static _remove(_element, value) {
-    let list = html._ElementCssClassSet._classListOf(_element);
-    let removed = html._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
-    html._ElementCssClassSet._classListRemove(list, value);
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    let removed = html$._ElementCssClassSet._classListContainsBeforeAddOrRemove(list, value);
+    html$._ElementCssClassSet._classListRemove(list, value);
     return removed;
   }
   static _toggle(_element, value, shouldAdd) {
-    return shouldAdd == null ? html._ElementCssClassSet._toggleDefault(_element, value) : html._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
+    return shouldAdd == null ? html$._ElementCssClassSet._toggleDefault(_element, value) : html$._ElementCssClassSet._toggleOnOff(_element, value, shouldAdd);
   }
   static _toggleDefault(_element, value) {
-    let list = html._ElementCssClassSet._classListOf(_element);
-    return html._ElementCssClassSet._classListToggle1(list, value);
+    let list = html$._ElementCssClassSet._classListOf(_element);
+    return html$._ElementCssClassSet._classListToggle1(list, value);
   }
   static _toggleOnOff(_element, value, shouldAdd) {
-    let list = html._ElementCssClassSet._classListOf(_element);
+    let list = html$._ElementCssClassSet._classListOf(_element);
     if (dart.test(shouldAdd)) {
-      html._ElementCssClassSet._classListAdd(list, value);
+      html$._ElementCssClassSet._classListAdd(list, value);
       return true;
     } else {
-      html._ElementCssClassSet._classListRemove(list, value);
+      html$._ElementCssClassSet._classListRemove(list, value);
       return false;
     }
   }
   static _addAll(_element, iterable) {
-    let list = html._ElementCssClassSet._classListOf(_element);
+    let list = html$._ElementCssClassSet._classListOf(_element);
     for (let value of iterable) {
-      html._ElementCssClassSet._classListAdd(list, value);
+      html$._ElementCssClassSet._classListAdd(list, value);
     }
   }
   static _removeAll(_element, iterable) {
-    let list = html._ElementCssClassSet._classListOf(_element);
+    let list = html$._ElementCssClassSet._classListOf(_element);
     for (let value of iterable) {
-      html._ElementCssClassSet._classListRemove(list, value);
+      html$._ElementCssClassSet._classListRemove(list, value);
     }
   }
   static _removeWhere(_element, test, doRemove) {
-    let list = html._ElementCssClassSet._classListOf(_element);
+    let list = html$._ElementCssClassSet._classListOf(_element);
     let i = 0;
-    while (i < dart.notNull(html._ElementCssClassSet._classListLength(list))) {
+    while (i < dart.notNull(html$._ElementCssClassSet._classListLength(list))) {
       let item = list[dartx.item](i);
       if (doRemove == test(item)) {
-        html._ElementCssClassSet._classListRemove(list, item);
+        html$._ElementCssClassSet._classListRemove(list, item);
       } else {
         ++i;
       }
@@ -96034,75 +96037,75 @@
     return list.toggle(value, shouldAdd);
   }
 };
-dart.setSignature(html._ElementCssClassSet, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ElementCssClassSet, [html.Element])}),
-  fields: () => ({[_element]: html.Element}),
+dart.setSignature(html$._ElementCssClassSet, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ElementCssClassSet, [html$.Element])}),
+  fields: () => ({[_element$]: html$.Element}),
   methods: () => ({
     readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
     writeClasses: dart.definiteFunctionType(dart.void, [SetOfString()])
   }),
   statics: () => ({
-    _contains: dart.definiteFunctionType(core.bool, [html.Element, core.Object]),
-    _add: dart.definiteFunctionType(core.bool, [html.Element, core.String]),
-    _remove: dart.definiteFunctionType(core.bool, [html.Element, core.String]),
-    _toggle: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.bool]),
-    _toggleDefault: dart.definiteFunctionType(core.bool, [html.Element, core.String]),
-    _toggleOnOff: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.bool]),
-    _addAll: dart.definiteFunctionType(dart.void, [html.Element, IterableOfString()]),
-    _removeAll: dart.definiteFunctionType(dart.void, [html.Element, IterableOfString()]),
-    _removeWhere: dart.definiteFunctionType(dart.void, [html.Element, StringTobool(), core.bool]),
-    _classListOf: dart.definiteFunctionType(html.DomTokenList, [html.Element]),
-    _classListLength: dart.definiteFunctionType(core.int, [html.DomTokenList]),
-    _classListContains: dart.definiteFunctionType(core.bool, [html.DomTokenList, core.String]),
-    _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html.DomTokenList, core.String]),
-    _classListAdd: dart.definiteFunctionType(dart.void, [html.DomTokenList, core.String]),
-    _classListRemove: dart.definiteFunctionType(dart.void, [html.DomTokenList, core.String]),
-    _classListToggle1: dart.definiteFunctionType(core.bool, [html.DomTokenList, core.String]),
-    _classListToggle2: dart.definiteFunctionType(core.bool, [html.DomTokenList, core.String, core.bool])
+    _contains: dart.definiteFunctionType(core.bool, [html$.Element, core.Object]),
+    _add: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _remove: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _toggle: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
+    _toggleDefault: dart.definiteFunctionType(core.bool, [html$.Element, core.String]),
+    _toggleOnOff: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.bool]),
+    _addAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
+    _removeAll: dart.definiteFunctionType(dart.void, [html$.Element, IterableOfString()]),
+    _removeWhere: dart.definiteFunctionType(dart.void, [html$.Element, StringTobool(), core.bool]),
+    _classListOf: dart.definiteFunctionType(html$.DomTokenList, [html$.Element]),
+    _classListLength: dart.definiteFunctionType(core.int, [html$.DomTokenList]),
+    _classListContains: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListContainsBeforeAddOrRemove: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListAdd: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
+    _classListRemove: dart.definiteFunctionType(dart.void, [html$.DomTokenList, core.String]),
+    _classListToggle1: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String]),
+    _classListToggle2: dart.definiteFunctionType(core.bool, [html$.DomTokenList, core.String, core.bool])
   }),
   names: ['_contains', '_add', '_remove', '_toggle', '_toggleDefault', '_toggleOnOff', '_addAll', '_removeAll', '_removeWhere', '_classListOf', '_classListLength', '_classListContains', '_classListContainsBeforeAddOrRemove', '_classListAdd', '_classListRemove', '_classListToggle1', '_classListToggle2']
 });
-dart.defineExtensionMembers(html._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
+dart.defineExtensionMembers(html$._ElementCssClassSet, ['contains', 'length', 'isEmpty', 'isNotEmpty']);
 const _unit = Symbol('_unit');
-html.Dimension = class Dimension extends core.Object {
+html$.Dimension = class Dimension extends core.Object {
   percent(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = '%';
   }
   px(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'px';
   }
   pc(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'pc';
   }
   pt(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'pt';
   }
   inch(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'in';
   }
   cm(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'cm';
   }
   mm(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'mm';
   }
   em(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'em';
   }
   ex(value) {
-    this[_value] = value;
+    this[_value$2] = value;
     this[_unit] = 'ex';
   }
   css(cssValue) {
-    this[_value] = null;
+    this[_value$2] = null;
     this[_unit] = null;
     if (cssValue == '') cssValue = '0px';
     if (dart.test(cssValue[dartx.endsWith]('%'))) {
@@ -96111,52 +96114,52 @@
       this[_unit] = cssValue[dartx.substring](dart.notNull(cssValue[dartx.length]) - 2);
     }
     if (dart.test(cssValue[dartx.contains]('.'))) {
-      this[_value] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+      this[_value$2] = core.double.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
     } else {
-      this[_value] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
+      this[_value$2] = core.int.parse(cssValue[dartx.substring](0, dart.notNull(cssValue[dartx.length]) - dart.notNull(this[_unit][dartx.length])));
     }
   }
   toString() {
-    return dart.str`${this[_value]}${this[_unit]}`;
+    return dart.str`${this[_value$2]}${this[_unit]}`;
   }
   get value() {
-    return this[_value];
+    return this[_value$2];
   }
 };
-dart.defineNamedConstructor(html.Dimension, 'percent');
-dart.defineNamedConstructor(html.Dimension, 'px');
-dart.defineNamedConstructor(html.Dimension, 'pc');
-dart.defineNamedConstructor(html.Dimension, 'pt');
-dart.defineNamedConstructor(html.Dimension, 'inch');
-dart.defineNamedConstructor(html.Dimension, 'cm');
-dart.defineNamedConstructor(html.Dimension, 'mm');
-dart.defineNamedConstructor(html.Dimension, 'em');
-dart.defineNamedConstructor(html.Dimension, 'ex');
-dart.defineNamedConstructor(html.Dimension, 'css');
-dart.setSignature(html.Dimension, {
+dart.defineNamedConstructor(html$.Dimension, 'percent');
+dart.defineNamedConstructor(html$.Dimension, 'px');
+dart.defineNamedConstructor(html$.Dimension, 'pc');
+dart.defineNamedConstructor(html$.Dimension, 'pt');
+dart.defineNamedConstructor(html$.Dimension, 'inch');
+dart.defineNamedConstructor(html$.Dimension, 'cm');
+dart.defineNamedConstructor(html$.Dimension, 'mm');
+dart.defineNamedConstructor(html$.Dimension, 'em');
+dart.defineNamedConstructor(html$.Dimension, 'ex');
+dart.defineNamedConstructor(html$.Dimension, 'css');
+dart.setSignature(html$.Dimension, {
   constructors: () => ({
-    percent: dart.definiteFunctionType(html.Dimension, [core.num]),
-    px: dart.definiteFunctionType(html.Dimension, [core.num]),
-    pc: dart.definiteFunctionType(html.Dimension, [core.num]),
-    pt: dart.definiteFunctionType(html.Dimension, [core.num]),
-    inch: dart.definiteFunctionType(html.Dimension, [core.num]),
-    cm: dart.definiteFunctionType(html.Dimension, [core.num]),
-    mm: dart.definiteFunctionType(html.Dimension, [core.num]),
-    em: dart.definiteFunctionType(html.Dimension, [core.num]),
-    ex: dart.definiteFunctionType(html.Dimension, [core.num]),
-    css: dart.definiteFunctionType(html.Dimension, [core.String])
+    percent: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    px: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    pc: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    pt: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    inch: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    cm: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    mm: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    em: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    ex: dart.definiteFunctionType(html$.Dimension, [core.num]),
+    css: dart.definiteFunctionType(html$.Dimension, [core.String])
   }),
   fields: () => ({
-    [_value]: core.num,
+    [_value$2]: core.num,
     [_unit]: core.String
   }),
   getters: () => ({value: dart.definiteFunctionType(core.num, [])})
 });
-html.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html.Event]));
-html.EventStreamProvider$ = dart.generic(T => {
-  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html._EventStream$(T)))();
-  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html._ElementEventStreamImpl$(T)))();
-  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html._ElementListEventStreamImpl$(T)))();
+html$.EventListener = dart.typedef('EventListener', () => dart.functionType(dart.dynamic, [html$.Event]));
+html$.EventStreamProvider$ = dart.generic(T => {
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
+  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
   class EventStreamProvider extends core.Object {
     new(eventType) {
       this[_eventType] = eventType;
@@ -96179,36 +96182,36 @@
   }
   dart.addTypeTests(EventStreamProvider);
   dart.setSignature(EventStreamProvider, {
-    constructors: () => ({new: dart.definiteFunctionType(html.EventStreamProvider$(T), [core.String])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$.EventStreamProvider$(T), [core.String])}),
     fields: () => ({[_eventType]: core.String}),
     methods: () => ({
-      forTarget: dart.definiteFunctionType(async.Stream$(T), [html.EventTarget], {useCapture: core.bool}),
-      forElement: dart.definiteFunctionType(html.ElementStream$(T), [html.Element], {useCapture: core.bool}),
-      [_forElementList]: dart.definiteFunctionType(html.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
-      getEventType: dart.definiteFunctionType(core.String, [html.EventTarget])
+      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
+      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
+      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
+      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
     })
   });
   return EventStreamProvider;
 });
-html.EventStreamProvider = EventStreamProvider();
-html.ElementStream$ = dart.generic(T => {
+html$.EventStreamProvider = EventStreamProvider();
+html$.ElementStream$ = dart.generic(T => {
   let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
   class ElementStream extends core.Object {}
   dart.addTypeTests(ElementStream);
   ElementStream[dart.implements] = () => [StreamOfT()];
   return ElementStream;
 });
-html.ElementStream = ElementStream();
-const _target = Symbol('_target');
+html$.ElementStream = ElementStream();
+const _target$0 = Symbol('_target');
 const _useCapture = Symbol('_useCapture');
-html._EventStream$ = dart.generic(T => {
-  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html._EventStreamSubscription$(T)))();
+html$._EventStream$ = dart.generic(T => {
+  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
   let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   class _EventStream extends async.Stream$(T) {
     new(target, eventType, useCapture) {
-      this[_target] = target;
+      this[_target$0] = target;
       this[_eventType] = eventType;
       this[_useCapture] = useCapture;
       super.new();
@@ -96225,13 +96228,13 @@
       let onError = opts && 'onError' in opts ? opts.onError : null;
       let onDone = opts && 'onDone' in opts ? opts.onDone : null;
       let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
-      return new (_EventStreamSubscriptionOfT())(this[_target], this[_eventType], onData, this[_useCapture]);
+      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, this[_useCapture]);
     }
   }
   dart.setSignature(_EventStream, {
-    constructors: () => ({new: dart.definiteFunctionType(html._EventStream$(T), [html.EventTarget, core.String, core.bool])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._EventStream$(T), [html$.EventTarget, core.String, core.bool])}),
     fields: () => ({
-      [_target]: html.EventTarget,
+      [_target$0]: html$.EventTarget,
       [_eventType]: core.String,
       [_useCapture]: core.bool
     }),
@@ -96239,35 +96242,35 @@
   });
   return _EventStream;
 });
-html._EventStream = _EventStream();
-html._matchesWithAncestors = function(event, selector) {
+html$._EventStream = _EventStream();
+html$._matchesWithAncestors = function(event, selector) {
   let target = event[dartx.target];
-  return html.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
+  return html$.Element.is(target) ? target[dartx.matchesWithAncestors](selector) : false;
 };
-dart.fn(html._matchesWithAncestors, EventAndStringTobool());
-html._ElementEventStreamImpl$ = dart.generic(T => {
-  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html._EventStreamSubscription$(T)))();
-  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html.ElementStream$(T)))();
+dart.fn(html$._matchesWithAncestors, EventAndStringTobool());
+html$._ElementEventStreamImpl$ = dart.generic(T => {
+  let _EventStreamSubscriptionOfT = () => (_EventStreamSubscriptionOfT = dart.constFn(html$._EventStreamSubscription$(T)))();
+  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   let TToT = () => (TToT = dart.constFn(dart.definiteFunctionType(T, [T])))();
   let TTobool = () => (TTobool = dart.constFn(dart.definiteFunctionType(core.bool, [T])))();
-  class _ElementEventStreamImpl extends html._EventStream$(T) {
+  class _ElementEventStreamImpl extends html$._EventStream$(T) {
     new(target, eventType, useCapture) {
-      super.new(html.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
+      super.new(html$.EventTarget._check(target), core.String._check(eventType), core.bool._check(useCapture));
     }
     matches(selector) {
-      return this.where(dart.fn(event => html._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
+      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
         e[_selector] = selector;
         return e;
       }, TToT()));
     }
     capture(onData) {
-      return new (_EventStreamSubscriptionOfT())(this[_target], this[_eventType], onData, true);
+      return new (_EventStreamSubscriptionOfT())(this[_target$0], this[_eventType], onData, true);
     }
   }
   _ElementEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
   dart.setSignature(_ElementEventStreamImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(html._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._ElementEventStreamImpl$(T), [dart.dynamic, dart.dynamic, dart.dynamic])}),
     methods: () => ({
       matches: dart.definiteFunctionType(async.Stream$(T), [core.String]),
       capture: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()])
@@ -96275,12 +96278,12 @@
   });
   return _ElementEventStreamImpl;
 });
-html._ElementEventStreamImpl = _ElementEventStreamImpl();
+html$._ElementEventStreamImpl = _ElementEventStreamImpl();
 const _targetList = Symbol('_targetList');
-html._ElementListEventStreamImpl$ = dart.generic(T => {
-  let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html._StreamPool$(T)))();
-  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html._EventStream$(T)))();
-  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html.ElementStream$(T)))();
+html$._ElementListEventStreamImpl$ = dart.generic(T => {
+  let _StreamPoolOfT = () => (_StreamPoolOfT = dart.constFn(html$._StreamPool$(T)))();
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let ElementStreamOfT = () => (ElementStreamOfT = dart.constFn(html$.ElementStream$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
@@ -96294,7 +96297,7 @@
       super.new();
     }
     matches(selector) {
-      return this.where(dart.fn(event => html._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
+      return this.where(dart.fn(event => html$._matchesWithAncestors(event, selector), TTobool())).map(T)(dart.fn(e => {
         e[_selector] = selector;
         return e;
       }, TToT()));
@@ -96327,7 +96330,7 @@
   }
   _ElementListEventStreamImpl[dart.implements] = () => [ElementStreamOfT()];
   dart.setSignature(_ElementListEventStreamImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(html._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._ElementListEventStreamImpl$(T), [IterableOfElement(), core.String, core.bool])}),
     fields: () => ({
       [_targetList]: IterableOfElement(),
       [_useCapture]: core.bool,
@@ -96341,44 +96344,44 @@
   });
   return _ElementListEventStreamImpl;
 });
-html._ElementListEventStreamImpl = _ElementListEventStreamImpl();
-html._EventListener$ = dart.generic(T => {
+html$._ElementListEventStreamImpl = _ElementListEventStreamImpl();
+html$._EventListener$ = dart.generic(T => {
   const _EventListener = dart.typedef('_EventListener', () => dart.functionType(dart.dynamic, [T]));
   return _EventListener;
 });
-html._EventListener = _EventListener();
-const _onData = Symbol('_onData');
-const _pauseCount = Symbol('_pauseCount');
+html$._EventListener = _EventListener();
+const _onData$0 = Symbol('_onData');
+const _pauseCount$0 = Symbol('_pauseCount');
 const _tryResume = Symbol('_tryResume');
 const _canceled = Symbol('_canceled');
 const _unlisten = Symbol('_unlisten');
-html._EventStreamSubscription$ = dart.generic(T => {
+html$._EventStreamSubscription$ = dart.generic(T => {
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   class _EventStreamSubscription extends async.StreamSubscription$(T) {
     new(target, eventType, onData, useCapture) {
-      this[_target] = target;
+      this[_target$0] = target;
       this[_eventType] = eventType;
       this[_useCapture] = useCapture;
-      this[_onData] = onData == null ? null : html._wrapZone(html.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
-      this[_pauseCount] = 0;
+      this[_onData$0] = onData == null ? null : html$._wrapZone(html$.Event, dart.dynamic)(dart.fn(e => dart.dcall(onData, e), EventTodynamic()));
+      this[_pauseCount$0] = 0;
       this[_tryResume]();
     }
     cancel() {
       if (dart.test(this[_canceled])) return null;
       this[_unlisten]();
-      this[_target] = null;
-      this[_onData] = null;
+      this[_target$0] = null;
+      this[_onData$0] = null;
       return null;
     }
     get [_canceled]() {
-      return this[_target] == null;
+      return this[_target$0] == null;
     }
     onData(handleData) {
       if (dart.test(this[_canceled])) {
         dart.throw(new core.StateError("Subscription has been canceled."));
       }
       this[_unlisten]();
-      this[_onData] = html._wrapZone(html.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
+      this[_onData$0] = html$._wrapZone(html$.Event, dart.dynamic)(_wrapZoneCallbackOfEvent$dynamic()._check(handleData));
       this[_tryResume]();
     }
     onError(handleError) {}
@@ -96386,28 +96389,28 @@
     pause(resumeSignal) {
       if (resumeSignal === void 0) resumeSignal = null;
       if (dart.test(this[_canceled])) return;
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) + 1;
+      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) + 1;
       this[_unlisten]();
       if (resumeSignal != null) {
         resumeSignal.whenComplete(dart.bind(this, 'resume'));
       }
     }
     get isPaused() {
-      return dart.notNull(this[_pauseCount]) > 0;
+      return dart.notNull(this[_pauseCount$0]) > 0;
     }
     resume() {
       if (dart.test(this[_canceled]) || !dart.test(this.isPaused)) return;
-      this[_pauseCount] = dart.notNull(this[_pauseCount]) - 1;
+      this[_pauseCount$0] = dart.notNull(this[_pauseCount$0]) - 1;
       this[_tryResume]();
     }
     [_tryResume]() {
-      if (this[_onData] != null && !dart.test(this.isPaused)) {
-        this[_target][dartx.addEventListener](this[_eventType], this[_onData], this[_useCapture]);
+      if (this[_onData$0] != null && !dart.test(this.isPaused)) {
+        this[_target$0][dartx.addEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
       }
     }
     [_unlisten]() {
-      if (this[_onData] != null) {
-        this[_target][dartx.removeEventListener](this[_eventType], this[_onData], this[_useCapture]);
+      if (this[_onData$0] != null) {
+        this[_target$0][dartx.removeEventListener](this[_eventType], this[_onData$0], this[_useCapture]);
       }
     }
     asFuture(E) {
@@ -96419,12 +96422,12 @@
     }
   }
   dart.setSignature(_EventStreamSubscription, {
-    constructors: () => ({new: dart.definiteFunctionType(html._EventStreamSubscription$(T), [html.EventTarget, core.String, TTovoid(), core.bool])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._EventStreamSubscription$(T), [html$.EventTarget, core.String, TTovoid(), core.bool])}),
     fields: () => ({
-      [_pauseCount]: core.int,
-      [_target]: html.EventTarget,
+      [_pauseCount$0]: core.int,
+      [_target$0]: html$.EventTarget,
       [_eventType]: core.String,
-      [_onData]: html.EventListener,
+      [_onData$0]: html$.EventListener,
       [_useCapture]: core.bool
     }),
     getters: () => ({
@@ -96445,29 +96448,29 @@
   });
   return _EventStreamSubscription;
 });
-html._EventStreamSubscription = _EventStreamSubscription();
-html.CustomStream$ = dart.generic(T => {
+html$._EventStreamSubscription = _EventStreamSubscription();
+html$.CustomStream$ = dart.generic(T => {
   let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
   class CustomStream extends core.Object {}
   dart.addTypeTests(CustomStream);
   CustomStream[dart.implements] = () => [StreamOfT()];
   return CustomStream;
 });
-html.CustomStream = CustomStream();
+html$.CustomStream = CustomStream();
 const _streamController = Symbol('_streamController');
-const _type = Symbol('_type');
-html._CustomEventStreamImpl$ = dart.generic(T => {
+const _type$ = Symbol('_type');
+html$._CustomEventStreamImpl$ = dart.generic(T => {
   let StreamControllerOfT = () => (StreamControllerOfT = dart.constFn(async.StreamController$(T)))();
-  let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html.CustomStream$(T)))();
+  let CustomStreamOfT = () => (CustomStreamOfT = dart.constFn(html$.CustomStream$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
   let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamSubscriptionOfTTovoid = () => (StreamSubscriptionOfTTovoid = dart.constFn(dart.functionType(dart.void, [StreamSubscriptionOfT()])))();
   class _CustomEventStreamImpl extends async.Stream$(T) {
     new(type) {
       this[_streamController] = null;
-      this[_type] = null;
+      this[_type$] = null;
       super.new();
-      this[_type] = type;
+      this[_type$] = type;
       this[_streamController] = StreamControllerOfT().broadcast({sync: true});
     }
     listen(onData, opts) {
@@ -96486,15 +96489,15 @@
     }
     add(event) {
       T._check(event);
-      if (event[dartx.type] == this[_type]) this[_streamController].add(event);
+      if (event[dartx.type] == this[_type$]) this[_streamController].add(event);
     }
   }
   _CustomEventStreamImpl[dart.implements] = () => [CustomStreamOfT()];
   dart.setSignature(_CustomEventStreamImpl, {
-    constructors: () => ({new: dart.definiteFunctionType(html._CustomEventStreamImpl$(T), [core.String])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamImpl$(T), [core.String])}),
     fields: () => ({
       [_streamController]: StreamControllerOfT(),
-      [_type]: core.String
+      [_type$]: core.String
     }),
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription$(T), [TTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
@@ -96503,8 +96506,8 @@
   });
   return _CustomEventStreamImpl;
 });
-html._CustomEventStreamImpl = _CustomEventStreamImpl();
-const _parent = Symbol('_parent');
+html$._CustomEventStreamImpl = _CustomEventStreamImpl();
+const _parent$ = Symbol('_parent');
 const _shadowKeyCode = Symbol('_shadowKeyCode');
 const _shadowCharCode = Symbol('_shadowCharCode');
 const _shadowAltKey = Symbol('_shadowAltKey');
@@ -96513,7 +96516,7 @@
 const _realAltKey = Symbol('_realAltKey');
 const _currentTarget = Symbol('_currentTarget');
 const _shadowKeyIdentifier = Symbol('_shadowKeyIdentifier');
-html.KeyEvent = class KeyEvent extends html._WrappedEvent {
+html$.KeyEvent = class KeyEvent extends html$._WrappedEvent {
   get keyCode() {
     return this[_shadowKeyCode];
   }
@@ -96527,30 +96530,30 @@
     return this.keyCode;
   }
   get [_realKeyCode]() {
-    return this[_parent].keyCode;
+    return this[_parent$].keyCode;
   }
   get [_realCharCode]() {
-    return this[_parent].charCode;
+    return this[_parent$].charCode;
   }
   get [_realAltKey]() {
-    return this[_parent].altKey;
+    return this[_parent$].altKey;
   }
   static _makeRecord() {
-    let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html.KeyboardEvent));
+    let interceptor = _foreign_helper.JS_INTERCEPTOR_CONSTANT(dart.wrapType(html$.KeyboardEvent));
     return _js_helper.makeLeafDispatchRecord(interceptor);
   }
   wrap(parent) {
-    this[_parent] = null;
+    this[_parent$] = null;
     this[_shadowAltKey] = null;
     this[_shadowCharCode] = null;
     this[_shadowKeyCode] = null;
     this[_currentTarget] = null;
     super.new(parent);
-    this[_parent] = parent;
+    this[_parent$] = parent;
     this[_shadowAltKey] = this[_realAltKey];
     this[_shadowCharCode] = this[_realCharCode];
     this[_shadowKeyCode] = this[_realKeyCode];
-    this[_currentTarget] = this[_parent][dartx.currentTarget];
+    this[_currentTarget] = this[_parent$][dartx.currentTarget];
   }
   static new(type, opts) {
     let view = opts && 'view' in opts ? opts.view : null;
@@ -96565,11 +96568,11 @@
     let metaKey = opts && 'metaKey' in opts ? opts.metaKey : false;
     let currentTarget = opts && 'currentTarget' in opts ? opts.currentTarget : null;
     if (view == null) {
-      view = html.window;
+      view = html$.window;
     }
     let eventObj = null;
-    if (dart.test(html.KeyEvent.canUseDispatchEvent)) {
-      eventObj = html.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
+    if (dart.test(html$.KeyEvent.canUseDispatchEvent)) {
+      eventObj = html$.Event.eventType('Event', type, {canBubble: canBubble, cancelable: cancelable});
       eventObj.keyCode = keyCode;
       eventObj.which = keyCode;
       eventObj.charCode = charCode;
@@ -96579,7 +96582,7 @@
       eventObj.shiftKey = shiftKey;
       eventObj.metaKey = metaKey;
     } else {
-      eventObj = html.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
+      eventObj = html$.Event.eventType('KeyboardEvent', type, {canBubble: canBubble, cancelable: cancelable});
       Object.defineProperty(eventObj, 'keyCode', {
         get: function() {
           return this.keyCodeVal;
@@ -96595,15 +96598,15 @@
           return this.charCodeVal;
         }
       });
-      let keyIdentifier = html.KeyEvent._convertToHexString(charCode, keyCode);
+      let keyIdentifier = html$.KeyEvent._convertToHexString(charCode, keyCode);
       dart.dsend(eventObj, _initKeyboardEvent, type, canBubble, cancelable, view, keyIdentifier, keyLocation, ctrlKey, altKey, shiftKey, metaKey);
       eventObj.keyCodeVal = keyCode;
       eventObj.charCodeVal = charCode;
     }
-    _interceptors.setDispatchProperty(eventObj, html.KeyEvent._keyboardEventDispatchRecord);
-    let keyEvent = new html.KeyEvent.wrap(html.KeyboardEvent._check(eventObj));
+    _interceptors.setDispatchProperty(eventObj, html$.KeyEvent._keyboardEventDispatchRecord);
+    let keyEvent = new html$.KeyEvent.wrap(html$.KeyboardEvent._check(eventObj));
     if (keyEvent[_currentTarget] == null) {
-      keyEvent[_currentTarget] = currentTarget == null ? html.window : currentTarget;
+      keyEvent[_currentTarget] = currentTarget == null ? html$.window : currentTarget;
     }
     return keyEvent;
   }
@@ -96622,41 +96625,41 @@
       sb.write(hex);
       return sb.toString();
     } else {
-      return html.KeyCode._convertKeyCodeToKeyName(keyCode);
+      return html$.KeyCode._convertKeyCodeToKeyName(keyCode);
     }
   }
   get code() {
-    return this[_parent][dartx.code];
+    return this[_parent$][dartx.code];
   }
   get ctrlKey() {
-    return this[_parent][dartx.ctrlKey];
+    return this[_parent$][dartx.ctrlKey];
   }
   get detail() {
-    return this[_parent][dartx.detail];
+    return this[_parent$][dartx.detail];
   }
   get key() {
-    return this[_parent][dartx.key];
+    return this[_parent$][dartx.key];
   }
   get keyLocation() {
-    return this[_parent][dartx.keyLocation];
+    return this[_parent$][dartx.keyLocation];
   }
   get metaKey() {
-    return this[_parent][dartx.metaKey];
+    return this[_parent$][dartx.metaKey];
   }
   get shiftKey() {
-    return this[_parent][dartx.shiftKey];
+    return this[_parent$][dartx.shiftKey];
   }
   get sourceDevice() {
-    return this[_parent][dartx.sourceDevice];
+    return this[_parent$][dartx.sourceDevice];
   }
   get view() {
-    return html.Window._check(this[_parent][dartx.view]);
+    return html$.Window._check(this[_parent$][dartx.view]);
   }
   [_initUIEvent](type, canBubble, cancelable, view, detail) {
     dart.throw(new core.UnsupportedError("Cannot initialize a UI Event from a KeyEvent."));
   }
   get [_shadowKeyIdentifier]() {
-    return this[_parent].keyIdentifier;
+    return this[_parent$].keyIdentifier;
   }
   get [_charCode]() {
     return this.charCode;
@@ -96686,19 +96689,19 @@
     return dart.throw(new core.UnimplementedError());
   }
 };
-dart.defineNamedConstructor(html.KeyEvent, 'wrap');
-html.KeyEvent[dart.implements] = () => [html.KeyboardEvent];
-dart.setSignature(html.KeyEvent, {
+dart.defineNamedConstructor(html$.KeyEvent, 'wrap');
+html$.KeyEvent[dart.implements] = () => [html$.KeyboardEvent];
+dart.setSignature(html$.KeyEvent, {
   constructors: () => ({
-    wrap: dart.definiteFunctionType(html.KeyEvent, [html.KeyboardEvent]),
-    new: dart.definiteFunctionType(html.KeyEvent, [core.String], {view: html.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html.EventTarget})
+    wrap: dart.definiteFunctionType(html$.KeyEvent, [html$.KeyboardEvent]),
+    new: dart.definiteFunctionType(html$.KeyEvent, [core.String], {view: html$.Window, canBubble: core.bool, cancelable: core.bool, keyCode: core.int, charCode: core.int, keyLocation: core.int, ctrlKey: core.bool, altKey: core.bool, shiftKey: core.bool, metaKey: core.bool, currentTarget: html$.EventTarget})
   }),
   fields: () => ({
-    [_parent]: html.KeyboardEvent,
+    [_parent$]: html$.KeyboardEvent,
     [_shadowAltKey]: core.bool,
     [_shadowCharCode]: core.int,
     [_shadowKeyCode]: core.int,
-    [_currentTarget]: html.EventTarget
+    [_currentTarget]: html$.EventTarget
   }),
   getters: () => ({
     keyCode: dart.definiteFunctionType(core.int, []),
@@ -96715,8 +96718,8 @@
     keyLocation: dart.definiteFunctionType(core.int, []),
     metaKey: dart.definiteFunctionType(core.bool, []),
     shiftKey: dart.definiteFunctionType(core.bool, []),
-    sourceDevice: dart.definiteFunctionType(html.InputDevice, []),
-    view: dart.definiteFunctionType(html.Window, []),
+    sourceDevice: dart.definiteFunctionType(html$.InputDevice, []),
+    view: dart.definiteFunctionType(html$.Window, []),
     [_shadowKeyIdentifier]: dart.definiteFunctionType(core.String, []),
     [_charCode]: dart.definiteFunctionType(core.int, []),
     [_keyCode]: dart.definiteFunctionType(core.int, []),
@@ -96727,8 +96730,8 @@
     [_get_view]: dart.definiteFunctionType(dart.dynamic, [])
   }),
   methods: () => ({
-    [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.int]),
-    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
+    [_initUIEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.int]),
+    [_initKeyboardEvent]: dart.definiteFunctionType(dart.void, [core.String, core.bool, core.bool, html$.Window, core.String, core.int, core.bool, core.bool, core.bool, core.bool]),
     getModifierState: dart.definiteFunctionType(core.bool, [core.String])
   }),
   sfields: () => ({
@@ -96744,42 +96747,42 @@
   }),
   names: ['_makeRecord', '_convertToHexString']
 });
-dart.defineLazy(html.KeyEvent, {
+dart.defineLazy(html$.KeyEvent, {
   get _keyboardEventDispatchRecord() {
-    return html.KeyEvent._makeRecord();
+    return html$.KeyEvent._makeRecord();
   },
   get keyDownEvent() {
-    return new html._KeyboardEventHandler('keydown');
+    return new html$._KeyboardEventHandler('keydown');
   },
   set keyDownEvent(_) {},
   get keyUpEvent() {
-    return new html._KeyboardEventHandler('keyup');
+    return new html$._KeyboardEventHandler('keyup');
   },
   set keyUpEvent(_) {},
   get keyPressEvent() {
-    return new html._KeyboardEventHandler('keypress');
+    return new html$._KeyboardEventHandler('keypress');
   },
   set keyPressEvent(_) {}
 });
-html._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html._CustomEventStreamImpl$(html.KeyEvent) {
+html$._CustomKeyEventStreamImpl = class _CustomKeyEventStreamImpl extends html$._CustomEventStreamImpl$(html$.KeyEvent) {
   new(type) {
     super.new(type);
   }
   add(event) {
-    if (event.type == this[_type]) {
-      event.currentTarget[dartx.dispatchEvent](event[_parent]);
+    if (event.type == this[_type$]) {
+      event.currentTarget[dartx.dispatchEvent](event[_parent$]);
       this[_streamController].add(event);
     }
   }
 };
-dart.addSimpleTypeTests(html._CustomKeyEventStreamImpl);
-html._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
-dart.setSignature(html._CustomKeyEventStreamImpl, {
-  constructors: () => ({new: dart.definiteFunctionType(html._CustomKeyEventStreamImpl, [core.String])})
+dart.addSimpleTypeTests(html$._CustomKeyEventStreamImpl);
+html$._CustomKeyEventStreamImpl[dart.implements] = () => [CustomStreamOfKeyEvent()];
+dart.setSignature(html$._CustomKeyEventStreamImpl, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CustomKeyEventStreamImpl, [core.String])})
 });
 const _subscriptions = Symbol('_subscriptions');
-const _controller = Symbol('_controller');
-html._StreamPool$ = dart.generic(T => {
+const _controller$1 = Symbol('_controller');
+html$._StreamPool$ = dart.generic(T => {
   let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
   let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let MapOfStreamOfT$StreamSubscriptionOfT = () => (MapOfStreamOfT$StreamSubscriptionOfT = dart.constFn(core.Map$(StreamOfT(), StreamSubscriptionOfT())))();
@@ -96787,16 +96790,16 @@
   class _StreamPool extends core.Object {
     broadcast() {
       this[_subscriptions] = MapOfStreamOfT$StreamSubscriptionOfT().new();
-      this[_controller] = null;
-      this[_controller] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
+      this[_controller$1] = null;
+      this[_controller$1] = StreamControllerOfT().broadcast({sync: true, onCancel: dart.bind(this, 'close')});
     }
     get stream() {
-      return this[_controller].stream;
+      return this[_controller$1].stream;
     }
     add(stream) {
       StreamOfT()._check(stream);
       if (dart.test(this[_subscriptions][dartx.containsKey](stream))) return;
-      this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller], 'add'), {onError: dart.bind(this[_controller], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid())}));
+      this[_subscriptions][dartx._set](stream, stream.listen(dart.bind(this[_controller$1], 'add'), {onError: dart.bind(this[_controller$1], 'addError'), onDone: dart.fn(() => this.remove(stream), VoidTovoid$())}));
     }
     remove(stream) {
       StreamOfT()._check(stream);
@@ -96808,15 +96811,15 @@
         subscription.cancel();
       }
       this[_subscriptions][dartx.clear]();
-      this[_controller].close();
+      this[_controller$1].close();
     }
   }
   dart.addTypeTests(_StreamPool);
   dart.defineNamedConstructor(_StreamPool, 'broadcast');
   dart.setSignature(_StreamPool, {
-    constructors: () => ({broadcast: dart.definiteFunctionType(html._StreamPool$(T), [])}),
+    constructors: () => ({broadcast: dart.definiteFunctionType(html$._StreamPool$(T), [])}),
     fields: () => ({
-      [_controller]: StreamControllerOfT(),
+      [_controller$1]: StreamControllerOfT(),
       [_subscriptions]: MapOfStreamOfT$StreamSubscriptionOfT()
     }),
     getters: () => ({stream: dart.definiteFunctionType(async.Stream$(T), [])}),
@@ -96828,13 +96831,13 @@
   });
   return _StreamPool;
 });
-html._StreamPool = _StreamPool();
+html$._StreamPool = _StreamPool();
 const _eventTypeGetter = Symbol('_eventTypeGetter');
-html._CustomEventStreamProvider$ = dart.generic(T => {
-  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html._EventStream$(T)))();
-  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html._ElementEventStreamImpl$(T)))();
-  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html._ElementListEventStreamImpl$(T)))();
-  let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html.EventStreamProvider$(T)))();
+html$._CustomEventStreamProvider$ = dart.generic(T => {
+  let _EventStreamOfT = () => (_EventStreamOfT = dart.constFn(html$._EventStream$(T)))();
+  let _ElementEventStreamImplOfT = () => (_ElementEventStreamImplOfT = dart.constFn(html$._ElementEventStreamImpl$(T)))();
+  let _ElementListEventStreamImplOfT = () => (_ElementListEventStreamImplOfT = dart.constFn(html$._ElementListEventStreamImpl$(T)))();
+  let EventStreamProviderOfT = () => (EventStreamProviderOfT = dart.constFn(html$.EventStreamProvider$(T)))();
   class _CustomEventStreamProvider extends core.Object {
     new(eventTypeGetter) {
       this[_eventTypeGetter] = eventTypeGetter;
@@ -96861,40 +96864,40 @@
   dart.addTypeTests(_CustomEventStreamProvider);
   _CustomEventStreamProvider[dart.implements] = () => [EventStreamProviderOfT()];
   dart.setSignature(_CustomEventStreamProvider, {
-    constructors: () => ({new: dart.definiteFunctionType(html._CustomEventStreamProvider$(T), [dart.dynamic])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._CustomEventStreamProvider$(T), [dart.dynamic])}),
     fields: () => ({[_eventTypeGetter]: dart.dynamic}),
     getters: () => ({[_eventType]: dart.definiteFunctionType(core.String, [])}),
     methods: () => ({
-      forTarget: dart.definiteFunctionType(async.Stream$(T), [html.EventTarget], {useCapture: core.bool}),
-      forElement: dart.definiteFunctionType(html.ElementStream$(T), [html.Element], {useCapture: core.bool}),
-      [_forElementList]: dart.definiteFunctionType(html.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
-      getEventType: dart.definiteFunctionType(core.String, [html.EventTarget])
+      forTarget: dart.definiteFunctionType(async.Stream$(T), [html$.EventTarget], {useCapture: core.bool}),
+      forElement: dart.definiteFunctionType(html$.ElementStream$(T), [html$.Element], {useCapture: core.bool}),
+      [_forElementList]: dart.definiteFunctionType(html$.ElementStream$(T), [ElementListOfElement()], {useCapture: core.bool}),
+      getEventType: dart.definiteFunctionType(core.String, [html$.EventTarget])
     })
   });
   return _CustomEventStreamProvider;
 });
-html._CustomEventStreamProvider = _CustomEventStreamProvider();
-html._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
+html$._CustomEventStreamProvider = _CustomEventStreamProvider();
+html$._Html5NodeValidator = class _Html5NodeValidator extends core.Object {
   new(opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-    this.uriPolicy = uriPolicy != null ? uriPolicy : html.UriPolicy.new();
-    if (dart.test(html._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
-      for (let attr of html._Html5NodeValidator._standardAttributes) {
-        html._Html5NodeValidator._attributeValidators[dartx._set](attr, html._Html5NodeValidator._standardAttributeValidator);
+    this.uriPolicy = uriPolicy != null ? uriPolicy : html$.UriPolicy.new();
+    if (dart.test(html$._Html5NodeValidator._attributeValidators[dartx.isEmpty])) {
+      for (let attr of html$._Html5NodeValidator._standardAttributes) {
+        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._standardAttributeValidator);
       }
-      for (let attr of html._Html5NodeValidator._uriAttributes) {
-        html._Html5NodeValidator._attributeValidators[dartx._set](attr, html._Html5NodeValidator._uriAttributeValidator);
+      for (let attr of html$._Html5NodeValidator._uriAttributes) {
+        html$._Html5NodeValidator._attributeValidators[dartx._set](attr, html$._Html5NodeValidator._uriAttributeValidator);
       }
     }
   }
   allowsElement(element) {
-    return html._Html5NodeValidator._allowedElements.contains(html.Element._safeTagName(element));
+    return html$._Html5NodeValidator._allowedElements.contains(html$.Element._safeTagName(element));
   }
   allowsAttribute(element, attributeName, value) {
-    let tagName = html.Element._safeTagName(element);
-    let validator = html._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
+    let tagName = html$.Element._safeTagName(element);
+    let validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`${tagName}::${attributeName}`);
     if (validator == null) {
-      validator = html._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
+      validator = html$._Html5NodeValidator._attributeValidators[dartx._get](dart.str`*::${attributeName}`);
     }
     if (validator == null) {
       return false;
@@ -96908,13 +96911,13 @@
     return context.uriPolicy.allowsUri(value);
   }
 };
-html._Html5NodeValidator[dart.implements] = () => [html.NodeValidator];
-dart.setSignature(html._Html5NodeValidator, {
-  constructors: () => ({new: dart.definiteFunctionType(html._Html5NodeValidator, [], {uriPolicy: html.UriPolicy})}),
-  fields: () => ({uriPolicy: html.UriPolicy}),
+html$._Html5NodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._Html5NodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._Html5NodeValidator, [], {uriPolicy: html$.UriPolicy})}),
+  fields: () => ({uriPolicy: html$.UriPolicy}),
   methods: () => ({
-    allowsElement: dart.definiteFunctionType(core.bool, [html.Element]),
-    allowsAttribute: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String])
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   }),
   sfields: () => ({
     _allowedElements: SetOfString(),
@@ -96923,14 +96926,14 @@
     _attributeValidators: MapOfString$Function()
   }),
   statics: () => ({
-    _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String, html._Html5NodeValidator]),
-    _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String, html._Html5NodeValidator])
+    _standardAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator]),
+    _uriAttributeValidator: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String, html$._Html5NodeValidator])
   }),
   names: ['_standardAttributeValidator', '_uriAttributeValidator']
 });
-html._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
-html._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
-dart.defineLazy(html._Html5NodeValidator, {
+html$._Html5NodeValidator._standardAttributes = dart.constList(['*::class', '*::dir', '*::draggable', '*::hidden', '*::id', '*::inert', '*::itemprop', '*::itemref', '*::itemscope', '*::lang', '*::spellcheck', '*::title', '*::translate', 'A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'AREA::accesskey', 'AREA::alt', 'AREA::coords', 'AREA::nohref', 'AREA::shape', 'AREA::tabindex', 'AREA::target', 'AUDIO::controls', 'AUDIO::loop', 'AUDIO::mediagroup', 'AUDIO::muted', 'AUDIO::preload', 'BDO::dir', 'BODY::alink', 'BODY::bgcolor', 'BODY::link', 'BODY::text', 'BODY::vlink', 'BR::clear', 'BUTTON::accesskey', 'BUTTON::disabled', 'BUTTON::name', 'BUTTON::tabindex', 'BUTTON::type', 'BUTTON::value', 'CANVAS::height', 'CANVAS::width', 'CAPTION::align', 'COL::align', 'COL::char', 'COL::charoff', 'COL::span', 'COL::valign', 'COL::width', 'COLGROUP::align', 'COLGROUP::char', 'COLGROUP::charoff', 'COLGROUP::span', 'COLGROUP::valign', 'COLGROUP::width', 'COMMAND::checked', 'COMMAND::command', 'COMMAND::disabled', 'COMMAND::label', 'COMMAND::radiogroup', 'COMMAND::type', 'DATA::value', 'DEL::datetime', 'DETAILS::open', 'DIR::compact', 'DIV::align', 'DL::compact', 'FIELDSET::disabled', 'FONT::color', 'FONT::face', 'FONT::size', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target', 'FRAME::name', 'H1::align', 'H2::align', 'H3::align', 'H4::align', 'H5::align', 'H6::align', 'HR::align', 'HR::noshade', 'HR::size', 'HR::width', 'HTML::version', 'IFRAME::align', 'IFRAME::frameborder', 'IFRAME::height', 'IFRAME::marginheight', 'IFRAME::marginwidth', 'IFRAME::width', 'IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width', 'INPUT::accept', 'INPUT::accesskey', 'INPUT::align', 'INPUT::alt', 'INPUT::autocomplete', 'INPUT::autofocus', 'INPUT::checked', 'INPUT::disabled', 'INPUT::inputmode', 'INPUT::ismap', 'INPUT::list', 'INPUT::max', 'INPUT::maxlength', 'INPUT::min', 'INPUT::multiple', 'INPUT::name', 'INPUT::placeholder', 'INPUT::readonly', 'INPUT::required', 'INPUT::size', 'INPUT::step', 'INPUT::tabindex', 'INPUT::type', 'INPUT::usemap', 'INPUT::value', 'INS::datetime', 'KEYGEN::disabled', 'KEYGEN::keytype', 'KEYGEN::name', 'LABEL::accesskey', 'LABEL::for', 'LEGEND::accesskey', 'LEGEND::align', 'LI::type', 'LI::value', 'LINK::sizes', 'MAP::name', 'MENU::compact', 'MENU::label', 'MENU::type', 'METER::high', 'METER::low', 'METER::max', 'METER::min', 'METER::value', 'OBJECT::typemustmatch', 'OL::compact', 'OL::reversed', 'OL::start', 'OL::type', 'OPTGROUP::disabled', 'OPTGROUP::label', 'OPTION::disabled', 'OPTION::label', 'OPTION::selected', 'OPTION::value', 'OUTPUT::for', 'OUTPUT::name', 'P::align', 'PRE::width', 'PROGRESS::max', 'PROGRESS::min', 'PROGRESS::value', 'SELECT::autocomplete', 'SELECT::disabled', 'SELECT::multiple', 'SELECT::name', 'SELECT::required', 'SELECT::size', 'SELECT::tabindex', 'SOURCE::type', 'TABLE::align', 'TABLE::bgcolor', 'TABLE::border', 'TABLE::cellpadding', 'TABLE::cellspacing', 'TABLE::frame', 'TABLE::rules', 'TABLE::summary', 'TABLE::width', 'TBODY::align', 'TBODY::char', 'TBODY::charoff', 'TBODY::valign', 'TD::abbr', 'TD::align', 'TD::axis', 'TD::bgcolor', 'TD::char', 'TD::charoff', 'TD::colspan', 'TD::headers', 'TD::height', 'TD::nowrap', 'TD::rowspan', 'TD::scope', 'TD::valign', 'TD::width', 'TEXTAREA::accesskey', 'TEXTAREA::autocomplete', 'TEXTAREA::cols', 'TEXTAREA::disabled', 'TEXTAREA::inputmode', 'TEXTAREA::name', 'TEXTAREA::placeholder', 'TEXTAREA::readonly', 'TEXTAREA::required', 'TEXTAREA::rows', 'TEXTAREA::tabindex', 'TEXTAREA::wrap', 'TFOOT::align', 'TFOOT::char', 'TFOOT::charoff', 'TFOOT::valign', 'TH::abbr', 'TH::align', 'TH::axis', 'TH::bgcolor', 'TH::char', 'TH::charoff', 'TH::colspan', 'TH::headers', 'TH::height', 'TH::nowrap', 'TH::rowspan', 'TH::scope', 'TH::valign', 'TH::width', 'THEAD::align', 'THEAD::char', 'THEAD::charoff', 'THEAD::valign', 'TR::align', 'TR::bgcolor', 'TR::char', 'TR::charoff', 'TR::valign', 'TRACK::default', 'TRACK::kind', 'TRACK::label', 'TRACK::srclang', 'UL::compact', 'UL::type', 'VIDEO::controls', 'VIDEO::height', 'VIDEO::loop', 'VIDEO::mediagroup', 'VIDEO::muted', 'VIDEO::preload', 'VIDEO::width'], core.String);
+html$._Html5NodeValidator._uriAttributes = dart.constList(['A::href', 'AREA::href', 'BLOCKQUOTE::cite', 'BODY::background', 'COMMAND::icon', 'DEL::cite', 'FORM::action', 'IMG::src', 'INPUT::src', 'INS::cite', 'Q::cite', 'VIDEO::poster'], core.String);
+dart.defineLazy(html$._Html5NodeValidator, {
   get _allowedElements() {
     return SetOfString().from(JSArrayOfString().of(['A', 'ABBR', 'ACRONYM', 'ADDRESS', 'AREA', 'ARTICLE', 'ASIDE', 'AUDIO', 'B', 'BDI', 'BDO', 'BIG', 'BLOCKQUOTE', 'BR', 'BUTTON', 'CANVAS', 'CAPTION', 'CENTER', 'CITE', 'CODE', 'COL', 'COLGROUP', 'COMMAND', 'DATA', 'DATALIST', 'DD', 'DEL', 'DETAILS', 'DFN', 'DIR', 'DIV', 'DL', 'DT', 'EM', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FONT', 'FOOTER', 'FORM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER', 'HGROUP', 'HR', 'I', 'IFRAME', 'IMG', 'INPUT', 'INS', 'KBD', 'LABEL', 'LEGEND', 'LI', 'MAP', 'MARK', 'MENU', 'METER', 'NAV', 'NOBR', 'OL', 'OPTGROUP', 'OPTION', 'OUTPUT', 'P', 'PRE', 'PROGRESS', 'Q', 'S', 'SAMP', 'SECTION', 'SELECT', 'SMALL', 'SOURCE', 'SPAN', 'STRIKE', 'STRONG', 'SUB', 'SUMMARY', 'SUP', 'TABLE', 'TBODY', 'TD', 'TEXTAREA', 'TFOOT', 'TH', 'THEAD', 'TIME', 'TR', 'TRACK', 'TT', 'U', 'UL', 'VAR', 'VIDEO', 'WBR']));
   },
@@ -96938,178 +96941,178 @@
     return dart.map({}, core.String, core.Function);
   }
 });
-html.KeyCode = class KeyCode extends core.Object {
+html$.KeyCode = class KeyCode extends core.Object {
   static isCharacterKey(keyCode) {
-    if (dart.notNull(keyCode) >= html.KeyCode.ZERO && dart.notNull(keyCode) <= html.KeyCode.NINE || dart.notNull(keyCode) >= html.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html.KeyCode.A && dart.notNull(keyCode) <= html.KeyCode.Z) {
+    if (dart.notNull(keyCode) >= html$.KeyCode.ZERO && dart.notNull(keyCode) <= html$.KeyCode.NINE || dart.notNull(keyCode) >= html$.KeyCode.NUM_ZERO && dart.notNull(keyCode) <= html$.KeyCode.NUM_MULTIPLY || dart.notNull(keyCode) >= html$.KeyCode.A && dart.notNull(keyCode) <= html$.KeyCode.Z) {
       return true;
     }
     if (dart.test(html_common.Device.isWebKit) && keyCode == 0) {
       return true;
     }
-    return keyCode == html.KeyCode.SPACE || keyCode == html.KeyCode.QUESTION_MARK || keyCode == html.KeyCode.NUM_PLUS || keyCode == html.KeyCode.NUM_MINUS || keyCode == html.KeyCode.NUM_PERIOD || keyCode == html.KeyCode.NUM_DIVISION || keyCode == html.KeyCode.SEMICOLON || keyCode == html.KeyCode.FF_SEMICOLON || keyCode == html.KeyCode.DASH || keyCode == html.KeyCode.EQUALS || keyCode == html.KeyCode.FF_EQUALS || keyCode == html.KeyCode.COMMA || keyCode == html.KeyCode.PERIOD || keyCode == html.KeyCode.SLASH || keyCode == html.KeyCode.APOSTROPHE || keyCode == html.KeyCode.SINGLE_QUOTE || keyCode == html.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html.KeyCode.BACKSLASH || keyCode == html.KeyCode.CLOSE_SQUARE_BRACKET;
+    return keyCode == html$.KeyCode.SPACE || keyCode == html$.KeyCode.QUESTION_MARK || keyCode == html$.KeyCode.NUM_PLUS || keyCode == html$.KeyCode.NUM_MINUS || keyCode == html$.KeyCode.NUM_PERIOD || keyCode == html$.KeyCode.NUM_DIVISION || keyCode == html$.KeyCode.SEMICOLON || keyCode == html$.KeyCode.FF_SEMICOLON || keyCode == html$.KeyCode.DASH || keyCode == html$.KeyCode.EQUALS || keyCode == html$.KeyCode.FF_EQUALS || keyCode == html$.KeyCode.COMMA || keyCode == html$.KeyCode.PERIOD || keyCode == html$.KeyCode.SLASH || keyCode == html$.KeyCode.APOSTROPHE || keyCode == html$.KeyCode.SINGLE_QUOTE || keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || keyCode == html$.KeyCode.BACKSLASH || keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET;
   }
   static _convertKeyCodeToKeyName(keyCode) {
     switch (keyCode) {
-      case html.KeyCode.ALT:
+      case html$.KeyCode.ALT:
       {
-        return html._KeyName.ALT;
+        return html$._KeyName.ALT;
       }
-      case html.KeyCode.BACKSPACE:
+      case html$.KeyCode.BACKSPACE:
       {
-        return html._KeyName.BACKSPACE;
+        return html$._KeyName.BACKSPACE;
       }
-      case html.KeyCode.CAPS_LOCK:
+      case html$.KeyCode.CAPS_LOCK:
       {
-        return html._KeyName.CAPS_LOCK;
+        return html$._KeyName.CAPS_LOCK;
       }
-      case html.KeyCode.CTRL:
+      case html$.KeyCode.CTRL:
       {
-        return html._KeyName.CONTROL;
+        return html$._KeyName.CONTROL;
       }
-      case html.KeyCode.DELETE:
+      case html$.KeyCode.DELETE:
       {
-        return html._KeyName.DEL;
+        return html$._KeyName.DEL;
       }
-      case html.KeyCode.DOWN:
+      case html$.KeyCode.DOWN:
       {
-        return html._KeyName.DOWN;
+        return html$._KeyName.DOWN;
       }
-      case html.KeyCode.END:
+      case html$.KeyCode.END:
       {
-        return html._KeyName.END;
+        return html$._KeyName.END;
       }
-      case html.KeyCode.ENTER:
+      case html$.KeyCode.ENTER:
       {
-        return html._KeyName.ENTER;
+        return html$._KeyName.ENTER;
       }
-      case html.KeyCode.ESC:
+      case html$.KeyCode.ESC:
       {
-        return html._KeyName.ESC;
+        return html$._KeyName.ESC;
       }
-      case html.KeyCode.F1:
+      case html$.KeyCode.F1:
       {
-        return html._KeyName.F1;
+        return html$._KeyName.F1;
       }
-      case html.KeyCode.F2:
+      case html$.KeyCode.F2:
       {
-        return html._KeyName.F2;
+        return html$._KeyName.F2;
       }
-      case html.KeyCode.F3:
+      case html$.KeyCode.F3:
       {
-        return html._KeyName.F3;
+        return html$._KeyName.F3;
       }
-      case html.KeyCode.F4:
+      case html$.KeyCode.F4:
       {
-        return html._KeyName.F4;
+        return html$._KeyName.F4;
       }
-      case html.KeyCode.F5:
+      case html$.KeyCode.F5:
       {
-        return html._KeyName.F5;
+        return html$._KeyName.F5;
       }
-      case html.KeyCode.F6:
+      case html$.KeyCode.F6:
       {
-        return html._KeyName.F6;
+        return html$._KeyName.F6;
       }
-      case html.KeyCode.F7:
+      case html$.KeyCode.F7:
       {
-        return html._KeyName.F7;
+        return html$._KeyName.F7;
       }
-      case html.KeyCode.F8:
+      case html$.KeyCode.F8:
       {
-        return html._KeyName.F8;
+        return html$._KeyName.F8;
       }
-      case html.KeyCode.F9:
+      case html$.KeyCode.F9:
       {
-        return html._KeyName.F9;
+        return html$._KeyName.F9;
       }
-      case html.KeyCode.F10:
+      case html$.KeyCode.F10:
       {
-        return html._KeyName.F10;
+        return html$._KeyName.F10;
       }
-      case html.KeyCode.F11:
+      case html$.KeyCode.F11:
       {
-        return html._KeyName.F11;
+        return html$._KeyName.F11;
       }
-      case html.KeyCode.F12:
+      case html$.KeyCode.F12:
       {
-        return html._KeyName.F12;
+        return html$._KeyName.F12;
       }
-      case html.KeyCode.HOME:
+      case html$.KeyCode.HOME:
       {
-        return html._KeyName.HOME;
+        return html$._KeyName.HOME;
       }
-      case html.KeyCode.INSERT:
+      case html$.KeyCode.INSERT:
       {
-        return html._KeyName.INSERT;
+        return html$._KeyName.INSERT;
       }
-      case html.KeyCode.LEFT:
+      case html$.KeyCode.LEFT:
       {
-        return html._KeyName.LEFT;
+        return html$._KeyName.LEFT;
       }
-      case html.KeyCode.META:
+      case html$.KeyCode.META:
       {
-        return html._KeyName.META;
+        return html$._KeyName.META;
       }
-      case html.KeyCode.NUMLOCK:
+      case html$.KeyCode.NUMLOCK:
       {
-        return html._KeyName.NUM_LOCK;
+        return html$._KeyName.NUM_LOCK;
       }
-      case html.KeyCode.PAGE_DOWN:
+      case html$.KeyCode.PAGE_DOWN:
       {
-        return html._KeyName.PAGE_DOWN;
+        return html$._KeyName.PAGE_DOWN;
       }
-      case html.KeyCode.PAGE_UP:
+      case html$.KeyCode.PAGE_UP:
       {
-        return html._KeyName.PAGE_UP;
+        return html$._KeyName.PAGE_UP;
       }
-      case html.KeyCode.PAUSE:
+      case html$.KeyCode.PAUSE:
       {
-        return html._KeyName.PAUSE;
+        return html$._KeyName.PAUSE;
       }
-      case html.KeyCode.PRINT_SCREEN:
+      case html$.KeyCode.PRINT_SCREEN:
       {
-        return html._KeyName.PRINT_SCREEN;
+        return html$._KeyName.PRINT_SCREEN;
       }
-      case html.KeyCode.RIGHT:
+      case html$.KeyCode.RIGHT:
       {
-        return html._KeyName.RIGHT;
+        return html$._KeyName.RIGHT;
       }
-      case html.KeyCode.SCROLL_LOCK:
+      case html$.KeyCode.SCROLL_LOCK:
       {
-        return html._KeyName.SCROLL;
+        return html$._KeyName.SCROLL;
       }
-      case html.KeyCode.SHIFT:
+      case html$.KeyCode.SHIFT:
       {
-        return html._KeyName.SHIFT;
+        return html$._KeyName.SHIFT;
       }
-      case html.KeyCode.SPACE:
+      case html$.KeyCode.SPACE:
       {
-        return html._KeyName.SPACEBAR;
+        return html$._KeyName.SPACEBAR;
       }
-      case html.KeyCode.TAB:
+      case html$.KeyCode.TAB:
       {
-        return html._KeyName.TAB;
+        return html$._KeyName.TAB;
       }
-      case html.KeyCode.UP:
+      case html$.KeyCode.UP:
       {
-        return html._KeyName.UP;
+        return html$._KeyName.UP;
       }
-      case html.KeyCode.WIN_IME:
-      case html.KeyCode.WIN_KEY:
-      case html.KeyCode.WIN_KEY_LEFT:
-      case html.KeyCode.WIN_KEY_RIGHT:
+      case html$.KeyCode.WIN_IME:
+      case html$.KeyCode.WIN_KEY:
+      case html$.KeyCode.WIN_KEY_LEFT:
+      case html$.KeyCode.WIN_KEY_RIGHT:
       {
-        return html._KeyName.WIN;
+        return html$._KeyName.WIN;
       }
       default:
       {
-        return html._KeyName.UNIDENTIFIED;
+        return html$._KeyName.UNIDENTIFIED;
       }
     }
-    return html._KeyName.UNIDENTIFIED;
+    return html$._KeyName.UNIDENTIFIED;
   }
 };
-dart.setSignature(html.KeyCode, {
+dart.setSignature(html$.KeyCode, {
   sfields: () => ({
     WIN_KEY_FF_LINUX: core.int,
     MAC_ENTER: core.int,
@@ -97242,132 +97245,132 @@
   }),
   names: ['isCharacterKey', '_convertKeyCodeToKeyName']
 });
-html.KeyCode.WIN_KEY_FF_LINUX = 0;
-html.KeyCode.MAC_ENTER = 3;
-html.KeyCode.BACKSPACE = 8;
-html.KeyCode.TAB = 9;
-html.KeyCode.NUM_CENTER = 12;
-html.KeyCode.ENTER = 13;
-html.KeyCode.SHIFT = 16;
-html.KeyCode.CTRL = 17;
-html.KeyCode.ALT = 18;
-html.KeyCode.PAUSE = 19;
-html.KeyCode.CAPS_LOCK = 20;
-html.KeyCode.ESC = 27;
-html.KeyCode.SPACE = 32;
-html.KeyCode.PAGE_UP = 33;
-html.KeyCode.PAGE_DOWN = 34;
-html.KeyCode.END = 35;
-html.KeyCode.HOME = 36;
-html.KeyCode.LEFT = 37;
-html.KeyCode.UP = 38;
-html.KeyCode.RIGHT = 39;
-html.KeyCode.DOWN = 40;
-html.KeyCode.NUM_NORTH_EAST = 33;
-html.KeyCode.NUM_SOUTH_EAST = 34;
-html.KeyCode.NUM_SOUTH_WEST = 35;
-html.KeyCode.NUM_NORTH_WEST = 36;
-html.KeyCode.NUM_WEST = 37;
-html.KeyCode.NUM_NORTH = 38;
-html.KeyCode.NUM_EAST = 39;
-html.KeyCode.NUM_SOUTH = 40;
-html.KeyCode.PRINT_SCREEN = 44;
-html.KeyCode.INSERT = 45;
-html.KeyCode.NUM_INSERT = 45;
-html.KeyCode.DELETE = 46;
-html.KeyCode.NUM_DELETE = 46;
-html.KeyCode.ZERO = 48;
-html.KeyCode.ONE = 49;
-html.KeyCode.TWO = 50;
-html.KeyCode.THREE = 51;
-html.KeyCode.FOUR = 52;
-html.KeyCode.FIVE = 53;
-html.KeyCode.SIX = 54;
-html.KeyCode.SEVEN = 55;
-html.KeyCode.EIGHT = 56;
-html.KeyCode.NINE = 57;
-html.KeyCode.FF_SEMICOLON = 59;
-html.KeyCode.FF_EQUALS = 61;
-html.KeyCode.QUESTION_MARK = 63;
-html.KeyCode.A = 65;
-html.KeyCode.B = 66;
-html.KeyCode.C = 67;
-html.KeyCode.D = 68;
-html.KeyCode.E = 69;
-html.KeyCode.F = 70;
-html.KeyCode.G = 71;
-html.KeyCode.H = 72;
-html.KeyCode.I = 73;
-html.KeyCode.J = 74;
-html.KeyCode.K = 75;
-html.KeyCode.L = 76;
-html.KeyCode.M = 77;
-html.KeyCode.N = 78;
-html.KeyCode.O = 79;
-html.KeyCode.P = 80;
-html.KeyCode.Q = 81;
-html.KeyCode.R = 82;
-html.KeyCode.S = 83;
-html.KeyCode.T = 84;
-html.KeyCode.U = 85;
-html.KeyCode.V = 86;
-html.KeyCode.W = 87;
-html.KeyCode.X = 88;
-html.KeyCode.Y = 89;
-html.KeyCode.Z = 90;
-html.KeyCode.META = 91;
-html.KeyCode.WIN_KEY_LEFT = 91;
-html.KeyCode.WIN_KEY_RIGHT = 92;
-html.KeyCode.CONTEXT_MENU = 93;
-html.KeyCode.NUM_ZERO = 96;
-html.KeyCode.NUM_ONE = 97;
-html.KeyCode.NUM_TWO = 98;
-html.KeyCode.NUM_THREE = 99;
-html.KeyCode.NUM_FOUR = 100;
-html.KeyCode.NUM_FIVE = 101;
-html.KeyCode.NUM_SIX = 102;
-html.KeyCode.NUM_SEVEN = 103;
-html.KeyCode.NUM_EIGHT = 104;
-html.KeyCode.NUM_NINE = 105;
-html.KeyCode.NUM_MULTIPLY = 106;
-html.KeyCode.NUM_PLUS = 107;
-html.KeyCode.NUM_MINUS = 109;
-html.KeyCode.NUM_PERIOD = 110;
-html.KeyCode.NUM_DIVISION = 111;
-html.KeyCode.F1 = 112;
-html.KeyCode.F2 = 113;
-html.KeyCode.F3 = 114;
-html.KeyCode.F4 = 115;
-html.KeyCode.F5 = 116;
-html.KeyCode.F6 = 117;
-html.KeyCode.F7 = 118;
-html.KeyCode.F8 = 119;
-html.KeyCode.F9 = 120;
-html.KeyCode.F10 = 121;
-html.KeyCode.F11 = 122;
-html.KeyCode.F12 = 123;
-html.KeyCode.NUMLOCK = 144;
-html.KeyCode.SCROLL_LOCK = 145;
-html.KeyCode.FIRST_MEDIA_KEY = 166;
-html.KeyCode.LAST_MEDIA_KEY = 183;
-html.KeyCode.SEMICOLON = 186;
-html.KeyCode.DASH = 189;
-html.KeyCode.EQUALS = 187;
-html.KeyCode.COMMA = 188;
-html.KeyCode.PERIOD = 190;
-html.KeyCode.SLASH = 191;
-html.KeyCode.APOSTROPHE = 192;
-html.KeyCode.TILDE = 192;
-html.KeyCode.SINGLE_QUOTE = 222;
-html.KeyCode.OPEN_SQUARE_BRACKET = 219;
-html.KeyCode.BACKSLASH = 220;
-html.KeyCode.CLOSE_SQUARE_BRACKET = 221;
-html.KeyCode.WIN_KEY = 224;
-html.KeyCode.MAC_FF_META = 224;
-html.KeyCode.WIN_IME = 229;
-html.KeyCode.UNKNOWN = -1;
-html.KeyLocation = class KeyLocation extends core.Object {};
-dart.setSignature(html.KeyLocation, {
+html$.KeyCode.WIN_KEY_FF_LINUX = 0;
+html$.KeyCode.MAC_ENTER = 3;
+html$.KeyCode.BACKSPACE = 8;
+html$.KeyCode.TAB = 9;
+html$.KeyCode.NUM_CENTER = 12;
+html$.KeyCode.ENTER = 13;
+html$.KeyCode.SHIFT = 16;
+html$.KeyCode.CTRL = 17;
+html$.KeyCode.ALT = 18;
+html$.KeyCode.PAUSE = 19;
+html$.KeyCode.CAPS_LOCK = 20;
+html$.KeyCode.ESC = 27;
+html$.KeyCode.SPACE = 32;
+html$.KeyCode.PAGE_UP = 33;
+html$.KeyCode.PAGE_DOWN = 34;
+html$.KeyCode.END = 35;
+html$.KeyCode.HOME = 36;
+html$.KeyCode.LEFT = 37;
+html$.KeyCode.UP = 38;
+html$.KeyCode.RIGHT = 39;
+html$.KeyCode.DOWN = 40;
+html$.KeyCode.NUM_NORTH_EAST = 33;
+html$.KeyCode.NUM_SOUTH_EAST = 34;
+html$.KeyCode.NUM_SOUTH_WEST = 35;
+html$.KeyCode.NUM_NORTH_WEST = 36;
+html$.KeyCode.NUM_WEST = 37;
+html$.KeyCode.NUM_NORTH = 38;
+html$.KeyCode.NUM_EAST = 39;
+html$.KeyCode.NUM_SOUTH = 40;
+html$.KeyCode.PRINT_SCREEN = 44;
+html$.KeyCode.INSERT = 45;
+html$.KeyCode.NUM_INSERT = 45;
+html$.KeyCode.DELETE = 46;
+html$.KeyCode.NUM_DELETE = 46;
+html$.KeyCode.ZERO = 48;
+html$.KeyCode.ONE = 49;
+html$.KeyCode.TWO = 50;
+html$.KeyCode.THREE = 51;
+html$.KeyCode.FOUR = 52;
+html$.KeyCode.FIVE = 53;
+html$.KeyCode.SIX = 54;
+html$.KeyCode.SEVEN = 55;
+html$.KeyCode.EIGHT = 56;
+html$.KeyCode.NINE = 57;
+html$.KeyCode.FF_SEMICOLON = 59;
+html$.KeyCode.FF_EQUALS = 61;
+html$.KeyCode.QUESTION_MARK = 63;
+html$.KeyCode.A = 65;
+html$.KeyCode.B = 66;
+html$.KeyCode.C = 67;
+html$.KeyCode.D = 68;
+html$.KeyCode.E = 69;
+html$.KeyCode.F = 70;
+html$.KeyCode.G = 71;
+html$.KeyCode.H = 72;
+html$.KeyCode.I = 73;
+html$.KeyCode.J = 74;
+html$.KeyCode.K = 75;
+html$.KeyCode.L = 76;
+html$.KeyCode.M = 77;
+html$.KeyCode.N = 78;
+html$.KeyCode.O = 79;
+html$.KeyCode.P = 80;
+html$.KeyCode.Q = 81;
+html$.KeyCode.R = 82;
+html$.KeyCode.S = 83;
+html$.KeyCode.T = 84;
+html$.KeyCode.U = 85;
+html$.KeyCode.V = 86;
+html$.KeyCode.W = 87;
+html$.KeyCode.X = 88;
+html$.KeyCode.Y = 89;
+html$.KeyCode.Z = 90;
+html$.KeyCode.META = 91;
+html$.KeyCode.WIN_KEY_LEFT = 91;
+html$.KeyCode.WIN_KEY_RIGHT = 92;
+html$.KeyCode.CONTEXT_MENU = 93;
+html$.KeyCode.NUM_ZERO = 96;
+html$.KeyCode.NUM_ONE = 97;
+html$.KeyCode.NUM_TWO = 98;
+html$.KeyCode.NUM_THREE = 99;
+html$.KeyCode.NUM_FOUR = 100;
+html$.KeyCode.NUM_FIVE = 101;
+html$.KeyCode.NUM_SIX = 102;
+html$.KeyCode.NUM_SEVEN = 103;
+html$.KeyCode.NUM_EIGHT = 104;
+html$.KeyCode.NUM_NINE = 105;
+html$.KeyCode.NUM_MULTIPLY = 106;
+html$.KeyCode.NUM_PLUS = 107;
+html$.KeyCode.NUM_MINUS = 109;
+html$.KeyCode.NUM_PERIOD = 110;
+html$.KeyCode.NUM_DIVISION = 111;
+html$.KeyCode.F1 = 112;
+html$.KeyCode.F2 = 113;
+html$.KeyCode.F3 = 114;
+html$.KeyCode.F4 = 115;
+html$.KeyCode.F5 = 116;
+html$.KeyCode.F6 = 117;
+html$.KeyCode.F7 = 118;
+html$.KeyCode.F8 = 119;
+html$.KeyCode.F9 = 120;
+html$.KeyCode.F10 = 121;
+html$.KeyCode.F11 = 122;
+html$.KeyCode.F12 = 123;
+html$.KeyCode.NUMLOCK = 144;
+html$.KeyCode.SCROLL_LOCK = 145;
+html$.KeyCode.FIRST_MEDIA_KEY = 166;
+html$.KeyCode.LAST_MEDIA_KEY = 183;
+html$.KeyCode.SEMICOLON = 186;
+html$.KeyCode.DASH = 189;
+html$.KeyCode.EQUALS = 187;
+html$.KeyCode.COMMA = 188;
+html$.KeyCode.PERIOD = 190;
+html$.KeyCode.SLASH = 191;
+html$.KeyCode.APOSTROPHE = 192;
+html$.KeyCode.TILDE = 192;
+html$.KeyCode.SINGLE_QUOTE = 222;
+html$.KeyCode.OPEN_SQUARE_BRACKET = 219;
+html$.KeyCode.BACKSLASH = 220;
+html$.KeyCode.CLOSE_SQUARE_BRACKET = 221;
+html$.KeyCode.WIN_KEY = 224;
+html$.KeyCode.MAC_FF_META = 224;
+html$.KeyCode.WIN_IME = 229;
+html$.KeyCode.UNKNOWN = -1;
+html$.KeyLocation = class KeyLocation extends core.Object {};
+dart.setSignature(html$.KeyLocation, {
   sfields: () => ({
     STANDARD: core.int,
     LEFT: core.int,
@@ -97377,14 +97380,14 @@
     JOYSTICK: core.int
   })
 });
-html.KeyLocation.STANDARD = 0;
-html.KeyLocation.LEFT = 1;
-html.KeyLocation.RIGHT = 2;
-html.KeyLocation.NUMPAD = 3;
-html.KeyLocation.MOBILE = 4;
-html.KeyLocation.JOYSTICK = 5;
-html._KeyName = class _KeyName extends core.Object {};
-dart.setSignature(html._KeyName, {
+html$.KeyLocation.STANDARD = 0;
+html$.KeyLocation.LEFT = 1;
+html$.KeyLocation.RIGHT = 2;
+html$.KeyLocation.NUMPAD = 3;
+html$.KeyLocation.MOBILE = 4;
+html$.KeyLocation.JOYSTICK = 5;
+html$._KeyName = class _KeyName extends core.Object {};
+dart.setSignature(html$._KeyName, {
   sfields: () => ({
     ACCEPT: core.String,
     ADD: core.String,
@@ -97537,309 +97540,309 @@
     UNIDENTIFIED: core.String
   })
 });
-html._KeyName.ACCEPT = "Accept";
-html._KeyName.ADD = "Add";
-html._KeyName.AGAIN = "Again";
-html._KeyName.ALL_CANDIDATES = "AllCandidates";
-html._KeyName.ALPHANUMERIC = "Alphanumeric";
-html._KeyName.ALT = "Alt";
-html._KeyName.ALT_GRAPH = "AltGraph";
-html._KeyName.APPS = "Apps";
-html._KeyName.ATTN = "Attn";
-html._KeyName.BROWSER_BACK = "BrowserBack";
-html._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
-html._KeyName.BROWSER_FORWARD = "BrowserForward";
-html._KeyName.BROWSER_NAME = "BrowserHome";
-html._KeyName.BROWSER_REFRESH = "BrowserRefresh";
-html._KeyName.BROWSER_SEARCH = "BrowserSearch";
-html._KeyName.BROWSER_STOP = "BrowserStop";
-html._KeyName.CAMERA = "Camera";
-html._KeyName.CAPS_LOCK = "CapsLock";
-html._KeyName.CLEAR = "Clear";
-html._KeyName.CODE_INPUT = "CodeInput";
-html._KeyName.COMPOSE = "Compose";
-html._KeyName.CONTROL = "Control";
-html._KeyName.CRSEL = "Crsel";
-html._KeyName.CONVERT = "Convert";
-html._KeyName.COPY = "Copy";
-html._KeyName.CUT = "Cut";
-html._KeyName.DECIMAL = "Decimal";
-html._KeyName.DIVIDE = "Divide";
-html._KeyName.DOWN = "Down";
-html._KeyName.DOWN_LEFT = "DownLeft";
-html._KeyName.DOWN_RIGHT = "DownRight";
-html._KeyName.EJECT = "Eject";
-html._KeyName.END = "End";
-html._KeyName.ENTER = "Enter";
-html._KeyName.ERASE_EOF = "EraseEof";
-html._KeyName.EXECUTE = "Execute";
-html._KeyName.EXSEL = "Exsel";
-html._KeyName.FN = "Fn";
-html._KeyName.F1 = "F1";
-html._KeyName.F2 = "F2";
-html._KeyName.F3 = "F3";
-html._KeyName.F4 = "F4";
-html._KeyName.F5 = "F5";
-html._KeyName.F6 = "F6";
-html._KeyName.F7 = "F7";
-html._KeyName.F8 = "F8";
-html._KeyName.F9 = "F9";
-html._KeyName.F10 = "F10";
-html._KeyName.F11 = "F11";
-html._KeyName.F12 = "F12";
-html._KeyName.F13 = "F13";
-html._KeyName.F14 = "F14";
-html._KeyName.F15 = "F15";
-html._KeyName.F16 = "F16";
-html._KeyName.F17 = "F17";
-html._KeyName.F18 = "F18";
-html._KeyName.F19 = "F19";
-html._KeyName.F20 = "F20";
-html._KeyName.F21 = "F21";
-html._KeyName.F22 = "F22";
-html._KeyName.F23 = "F23";
-html._KeyName.F24 = "F24";
-html._KeyName.FINAL_MODE = "FinalMode";
-html._KeyName.FIND = "Find";
-html._KeyName.FULL_WIDTH = "FullWidth";
-html._KeyName.HALF_WIDTH = "HalfWidth";
-html._KeyName.HANGUL_MODE = "HangulMode";
-html._KeyName.HANJA_MODE = "HanjaMode";
-html._KeyName.HELP = "Help";
-html._KeyName.HIRAGANA = "Hiragana";
-html._KeyName.HOME = "Home";
-html._KeyName.INSERT = "Insert";
-html._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
-html._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
-html._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
-html._KeyName.JUNJA_MODE = "JunjaMode";
-html._KeyName.KANA_MODE = "KanaMode";
-html._KeyName.KANJI_MODE = "KanjiMode";
-html._KeyName.KATAKANA = "Katakana";
-html._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
-html._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
-html._KeyName.LAUNCH_MAIL = "LaunchMail";
-html._KeyName.LEFT = "Left";
-html._KeyName.MENU = "Menu";
-html._KeyName.META = "Meta";
-html._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
-html._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
-html._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
-html._KeyName.MEDIA_STOP = "MediaStop";
-html._KeyName.MODE_CHANGE = "ModeChange";
-html._KeyName.NEXT_CANDIDATE = "NextCandidate";
-html._KeyName.NON_CONVERT = "Nonconvert";
-html._KeyName.NUM_LOCK = "NumLock";
-html._KeyName.PAGE_DOWN = "PageDown";
-html._KeyName.PAGE_UP = "PageUp";
-html._KeyName.PASTE = "Paste";
-html._KeyName.PAUSE = "Pause";
-html._KeyName.PLAY = "Play";
-html._KeyName.POWER = "Power";
-html._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
-html._KeyName.PRINT_SCREEN = "PrintScreen";
-html._KeyName.PROCESS = "Process";
-html._KeyName.PROPS = "Props";
-html._KeyName.RIGHT = "Right";
-html._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
-html._KeyName.SCROLL = "Scroll";
-html._KeyName.SELECT = "Select";
-html._KeyName.SELECT_MEDIA = "SelectMedia";
-html._KeyName.SEPARATOR = "Separator";
-html._KeyName.SHIFT = "Shift";
-html._KeyName.SOFT_1 = "Soft1";
-html._KeyName.SOFT_2 = "Soft2";
-html._KeyName.SOFT_3 = "Soft3";
-html._KeyName.SOFT_4 = "Soft4";
-html._KeyName.STOP = "Stop";
-html._KeyName.SUBTRACT = "Subtract";
-html._KeyName.SYMBOL_LOCK = "SymbolLock";
-html._KeyName.UP = "Up";
-html._KeyName.UP_LEFT = "UpLeft";
-html._KeyName.UP_RIGHT = "UpRight";
-html._KeyName.UNDO = "Undo";
-html._KeyName.VOLUME_DOWN = "VolumeDown";
-html._KeyName.VOLUMN_MUTE = "VolumeMute";
-html._KeyName.VOLUMN_UP = "VolumeUp";
-html._KeyName.WIN = "Win";
-html._KeyName.ZOOM = "Zoom";
-html._KeyName.BACKSPACE = "Backspace";
-html._KeyName.TAB = "Tab";
-html._KeyName.CANCEL = "Cancel";
-html._KeyName.ESC = "Esc";
-html._KeyName.SPACEBAR = "Spacebar";
-html._KeyName.DEL = "Del";
-html._KeyName.DEAD_GRAVE = "DeadGrave";
-html._KeyName.DEAD_EACUTE = "DeadEacute";
-html._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
-html._KeyName.DEAD_TILDE = "DeadTilde";
-html._KeyName.DEAD_MACRON = "DeadMacron";
-html._KeyName.DEAD_BREVE = "DeadBreve";
-html._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
-html._KeyName.DEAD_UMLAUT = "DeadUmlaut";
-html._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
-html._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
-html._KeyName.DEAD_CARON = "DeadCaron";
-html._KeyName.DEAD_CEDILLA = "DeadCedilla";
-html._KeyName.DEAD_OGONEK = "DeadOgonek";
-html._KeyName.DEAD_IOTA = "DeadIota";
-html._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
-html._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
-html._KeyName.UNIDENTIFIED = "Unidentified";
-const _stream = Symbol('_stream');
+html$._KeyName.ACCEPT = "Accept";
+html$._KeyName.ADD = "Add";
+html$._KeyName.AGAIN = "Again";
+html$._KeyName.ALL_CANDIDATES = "AllCandidates";
+html$._KeyName.ALPHANUMERIC = "Alphanumeric";
+html$._KeyName.ALT = "Alt";
+html$._KeyName.ALT_GRAPH = "AltGraph";
+html$._KeyName.APPS = "Apps";
+html$._KeyName.ATTN = "Attn";
+html$._KeyName.BROWSER_BACK = "BrowserBack";
+html$._KeyName.BROWSER_FAVORTIES = "BrowserFavorites";
+html$._KeyName.BROWSER_FORWARD = "BrowserForward";
+html$._KeyName.BROWSER_NAME = "BrowserHome";
+html$._KeyName.BROWSER_REFRESH = "BrowserRefresh";
+html$._KeyName.BROWSER_SEARCH = "BrowserSearch";
+html$._KeyName.BROWSER_STOP = "BrowserStop";
+html$._KeyName.CAMERA = "Camera";
+html$._KeyName.CAPS_LOCK = "CapsLock";
+html$._KeyName.CLEAR = "Clear";
+html$._KeyName.CODE_INPUT = "CodeInput";
+html$._KeyName.COMPOSE = "Compose";
+html$._KeyName.CONTROL = "Control";
+html$._KeyName.CRSEL = "Crsel";
+html$._KeyName.CONVERT = "Convert";
+html$._KeyName.COPY = "Copy";
+html$._KeyName.CUT = "Cut";
+html$._KeyName.DECIMAL = "Decimal";
+html$._KeyName.DIVIDE = "Divide";
+html$._KeyName.DOWN = "Down";
+html$._KeyName.DOWN_LEFT = "DownLeft";
+html$._KeyName.DOWN_RIGHT = "DownRight";
+html$._KeyName.EJECT = "Eject";
+html$._KeyName.END = "End";
+html$._KeyName.ENTER = "Enter";
+html$._KeyName.ERASE_EOF = "EraseEof";
+html$._KeyName.EXECUTE = "Execute";
+html$._KeyName.EXSEL = "Exsel";
+html$._KeyName.FN = "Fn";
+html$._KeyName.F1 = "F1";
+html$._KeyName.F2 = "F2";
+html$._KeyName.F3 = "F3";
+html$._KeyName.F4 = "F4";
+html$._KeyName.F5 = "F5";
+html$._KeyName.F6 = "F6";
+html$._KeyName.F7 = "F7";
+html$._KeyName.F8 = "F8";
+html$._KeyName.F9 = "F9";
+html$._KeyName.F10 = "F10";
+html$._KeyName.F11 = "F11";
+html$._KeyName.F12 = "F12";
+html$._KeyName.F13 = "F13";
+html$._KeyName.F14 = "F14";
+html$._KeyName.F15 = "F15";
+html$._KeyName.F16 = "F16";
+html$._KeyName.F17 = "F17";
+html$._KeyName.F18 = "F18";
+html$._KeyName.F19 = "F19";
+html$._KeyName.F20 = "F20";
+html$._KeyName.F21 = "F21";
+html$._KeyName.F22 = "F22";
+html$._KeyName.F23 = "F23";
+html$._KeyName.F24 = "F24";
+html$._KeyName.FINAL_MODE = "FinalMode";
+html$._KeyName.FIND = "Find";
+html$._KeyName.FULL_WIDTH = "FullWidth";
+html$._KeyName.HALF_WIDTH = "HalfWidth";
+html$._KeyName.HANGUL_MODE = "HangulMode";
+html$._KeyName.HANJA_MODE = "HanjaMode";
+html$._KeyName.HELP = "Help";
+html$._KeyName.HIRAGANA = "Hiragana";
+html$._KeyName.HOME = "Home";
+html$._KeyName.INSERT = "Insert";
+html$._KeyName.JAPANESE_HIRAGANA = "JapaneseHiragana";
+html$._KeyName.JAPANESE_KATAKANA = "JapaneseKatakana";
+html$._KeyName.JAPANESE_ROMAJI = "JapaneseRomaji";
+html$._KeyName.JUNJA_MODE = "JunjaMode";
+html$._KeyName.KANA_MODE = "KanaMode";
+html$._KeyName.KANJI_MODE = "KanjiMode";
+html$._KeyName.KATAKANA = "Katakana";
+html$._KeyName.LAUNCH_APPLICATION_1 = "LaunchApplication1";
+html$._KeyName.LAUNCH_APPLICATION_2 = "LaunchApplication2";
+html$._KeyName.LAUNCH_MAIL = "LaunchMail";
+html$._KeyName.LEFT = "Left";
+html$._KeyName.MENU = "Menu";
+html$._KeyName.META = "Meta";
+html$._KeyName.MEDIA_NEXT_TRACK = "MediaNextTrack";
+html$._KeyName.MEDIA_PAUSE_PLAY = "MediaPlayPause";
+html$._KeyName.MEDIA_PREVIOUS_TRACK = "MediaPreviousTrack";
+html$._KeyName.MEDIA_STOP = "MediaStop";
+html$._KeyName.MODE_CHANGE = "ModeChange";
+html$._KeyName.NEXT_CANDIDATE = "NextCandidate";
+html$._KeyName.NON_CONVERT = "Nonconvert";
+html$._KeyName.NUM_LOCK = "NumLock";
+html$._KeyName.PAGE_DOWN = "PageDown";
+html$._KeyName.PAGE_UP = "PageUp";
+html$._KeyName.PASTE = "Paste";
+html$._KeyName.PAUSE = "Pause";
+html$._KeyName.PLAY = "Play";
+html$._KeyName.POWER = "Power";
+html$._KeyName.PREVIOUS_CANDIDATE = "PreviousCandidate";
+html$._KeyName.PRINT_SCREEN = "PrintScreen";
+html$._KeyName.PROCESS = "Process";
+html$._KeyName.PROPS = "Props";
+html$._KeyName.RIGHT = "Right";
+html$._KeyName.ROMAN_CHARACTERS = "RomanCharacters";
+html$._KeyName.SCROLL = "Scroll";
+html$._KeyName.SELECT = "Select";
+html$._KeyName.SELECT_MEDIA = "SelectMedia";
+html$._KeyName.SEPARATOR = "Separator";
+html$._KeyName.SHIFT = "Shift";
+html$._KeyName.SOFT_1 = "Soft1";
+html$._KeyName.SOFT_2 = "Soft2";
+html$._KeyName.SOFT_3 = "Soft3";
+html$._KeyName.SOFT_4 = "Soft4";
+html$._KeyName.STOP = "Stop";
+html$._KeyName.SUBTRACT = "Subtract";
+html$._KeyName.SYMBOL_LOCK = "SymbolLock";
+html$._KeyName.UP = "Up";
+html$._KeyName.UP_LEFT = "UpLeft";
+html$._KeyName.UP_RIGHT = "UpRight";
+html$._KeyName.UNDO = "Undo";
+html$._KeyName.VOLUME_DOWN = "VolumeDown";
+html$._KeyName.VOLUMN_MUTE = "VolumeMute";
+html$._KeyName.VOLUMN_UP = "VolumeUp";
+html$._KeyName.WIN = "Win";
+html$._KeyName.ZOOM = "Zoom";
+html$._KeyName.BACKSPACE = "Backspace";
+html$._KeyName.TAB = "Tab";
+html$._KeyName.CANCEL = "Cancel";
+html$._KeyName.ESC = "Esc";
+html$._KeyName.SPACEBAR = "Spacebar";
+html$._KeyName.DEL = "Del";
+html$._KeyName.DEAD_GRAVE = "DeadGrave";
+html$._KeyName.DEAD_EACUTE = "DeadEacute";
+html$._KeyName.DEAD_CIRCUMFLEX = "DeadCircumflex";
+html$._KeyName.DEAD_TILDE = "DeadTilde";
+html$._KeyName.DEAD_MACRON = "DeadMacron";
+html$._KeyName.DEAD_BREVE = "DeadBreve";
+html$._KeyName.DEAD_ABOVE_DOT = "DeadAboveDot";
+html$._KeyName.DEAD_UMLAUT = "DeadUmlaut";
+html$._KeyName.DEAD_ABOVE_RING = "DeadAboveRing";
+html$._KeyName.DEAD_DOUBLEACUTE = "DeadDoubleacute";
+html$._KeyName.DEAD_CARON = "DeadCaron";
+html$._KeyName.DEAD_CEDILLA = "DeadCedilla";
+html$._KeyName.DEAD_OGONEK = "DeadOgonek";
+html$._KeyName.DEAD_IOTA = "DeadIota";
+html$._KeyName.DEAD_VOICED_SOUND = "DeadVoicedSound";
+html$._KeyName.DEC_SEMIVOICED_SOUND = "DeadSemivoicedSound";
+html$._KeyName.UNIDENTIFIED = "Unidentified";
+const _stream$0 = Symbol('_stream');
 const _keyDownList = Symbol('_keyDownList');
 const _capsLockOn = Symbol('_capsLockOn');
 const _determineKeyCodeForKeypress = Symbol('_determineKeyCodeForKeypress');
 const _findCharCodeKeyDown = Symbol('_findCharCodeKeyDown');
 const _firesKeyPressEvent = Symbol('_firesKeyPressEvent');
 const _normalizeKeyCodes = Symbol('_normalizeKeyCodes');
-html._KeyboardEventHandler = class _KeyboardEventHandler extends html.EventStreamProvider$(html.KeyEvent) {
+html$._KeyboardEventHandler = class _KeyboardEventHandler extends html$.EventStreamProvider$(html$.KeyEvent) {
   forTarget(e, opts) {
     let useCapture = opts && 'useCapture' in opts ? opts.useCapture : false;
-    let handler = new html._KeyboardEventHandler.initializeAllEventListeners(this[_type], e);
-    return handler[_stream];
+    let handler = new html$._KeyboardEventHandler.initializeAllEventListeners(this[_type$], e);
+    return handler[_stream$0];
   }
   new(type) {
     this[_keyDownList] = JSArrayOfKeyEvent().of([]);
-    this[_type] = type;
-    this[_stream] = new html._CustomKeyEventStreamImpl('event');
-    this[_target] = null;
-    super.new(html._KeyboardEventHandler._EVENT_TYPE);
+    this[_type$] = type;
+    this[_stream$0] = new html$._CustomKeyEventStreamImpl('event');
+    this[_target$0] = null;
+    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
   }
   initializeAllEventListeners(type, target) {
     this[_keyDownList] = JSArrayOfKeyEvent().of([]);
-    this[_type] = type;
-    this[_target] = target;
-    this[_stream] = null;
-    super.new(html._KeyboardEventHandler._EVENT_TYPE);
-    html.Element.keyDownEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
-    html.Element.keyPressEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
-    html.Element.keyUpEvent.forTarget(this[_target], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
-    this[_stream] = new html._CustomKeyEventStreamImpl(this[_type]);
+    this[_type$] = type;
+    this[_target$0] = target;
+    this[_stream$0] = null;
+    super.new(html$._KeyboardEventHandler._EVENT_TYPE);
+    html$.Element.keyDownEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyDown'));
+    html$.Element.keyPressEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyPress'));
+    html$.Element.keyUpEvent.forTarget(this[_target$0], {useCapture: true}).listen(dart.bind(this, 'processKeyUp'));
+    this[_stream$0] = new html$._CustomKeyEventStreamImpl(this[_type$]);
   }
   get [_capsLockOn]() {
-    return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html.KeyCode.CAPS_LOCK, KeyEventTobool()));
+    return this[_keyDownList][dartx.any](dart.fn(element => element.keyCode == html$.KeyCode.CAPS_LOCK, KeyEventTobool()));
   }
   [_determineKeyCodeForKeypress](event) {
     for (let prevEvent of this[_keyDownList]) {
       if (prevEvent[_shadowCharCode] == event[dartx.charCode]) {
         return prevEvent.keyCode;
       }
-      if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
+      if ((dart.test(event[dartx.shiftKey]) || dart.test(this[_capsLockOn])) && dart.notNull(event[dartx.charCode]) >= dart.notNull("A"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) <= dart.notNull("Z"[dartx.codeUnits][dartx._get](0)) && dart.notNull(event[dartx.charCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET) == prevEvent[_shadowCharCode]) {
         return prevEvent.keyCode;
       }
     }
-    return html.KeyCode.UNKNOWN;
+    return html$.KeyCode.UNKNOWN;
   }
   [_findCharCodeKeyDown](event) {
     if (event[dartx.keyLocation] == 3) {
       switch (event[dartx.keyCode]) {
-        case html.KeyCode.NUM_ZERO:
+        case html$.KeyCode.NUM_ZERO:
         {
-          return html.KeyCode.ZERO;
+          return html$.KeyCode.ZERO;
         }
-        case html.KeyCode.NUM_ONE:
+        case html$.KeyCode.NUM_ONE:
         {
-          return html.KeyCode.ONE;
+          return html$.KeyCode.ONE;
         }
-        case html.KeyCode.NUM_TWO:
+        case html$.KeyCode.NUM_TWO:
         {
-          return html.KeyCode.TWO;
+          return html$.KeyCode.TWO;
         }
-        case html.KeyCode.NUM_THREE:
+        case html$.KeyCode.NUM_THREE:
         {
-          return html.KeyCode.THREE;
+          return html$.KeyCode.THREE;
         }
-        case html.KeyCode.NUM_FOUR:
+        case html$.KeyCode.NUM_FOUR:
         {
-          return html.KeyCode.FOUR;
+          return html$.KeyCode.FOUR;
         }
-        case html.KeyCode.NUM_FIVE:
+        case html$.KeyCode.NUM_FIVE:
         {
-          return html.KeyCode.FIVE;
+          return html$.KeyCode.FIVE;
         }
-        case html.KeyCode.NUM_SIX:
+        case html$.KeyCode.NUM_SIX:
         {
-          return html.KeyCode.SIX;
+          return html$.KeyCode.SIX;
         }
-        case html.KeyCode.NUM_SEVEN:
+        case html$.KeyCode.NUM_SEVEN:
         {
-          return html.KeyCode.SEVEN;
+          return html$.KeyCode.SEVEN;
         }
-        case html.KeyCode.NUM_EIGHT:
+        case html$.KeyCode.NUM_EIGHT:
         {
-          return html.KeyCode.EIGHT;
+          return html$.KeyCode.EIGHT;
         }
-        case html.KeyCode.NUM_NINE:
+        case html$.KeyCode.NUM_NINE:
         {
-          return html.KeyCode.NINE;
+          return html$.KeyCode.NINE;
         }
-        case html.KeyCode.NUM_MULTIPLY:
+        case html$.KeyCode.NUM_MULTIPLY:
         {
           return 42;
         }
-        case html.KeyCode.NUM_PLUS:
+        case html$.KeyCode.NUM_PLUS:
         {
           return 43;
         }
-        case html.KeyCode.NUM_MINUS:
+        case html$.KeyCode.NUM_MINUS:
         {
           return 45;
         }
-        case html.KeyCode.NUM_PERIOD:
+        case html$.KeyCode.NUM_PERIOD:
         {
           return 46;
         }
-        case html.KeyCode.NUM_DIVISION:
+        case html$.KeyCode.NUM_DIVISION:
         {
           return 47;
         }
       }
     } else if (dart.notNull(event[dartx.keyCode]) >= 65 && dart.notNull(event[dartx.keyCode]) <= 90) {
-      return dart.notNull(event[dartx.keyCode]) + dart.notNull(html._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
+      return dart.notNull(event[dartx.keyCode]) + dart.notNull(html$._KeyboardEventHandler._ROMAN_ALPHABET_OFFSET);
     }
     switch (event[dartx.keyCode]) {
-      case html.KeyCode.SEMICOLON:
+      case html$.KeyCode.SEMICOLON:
       {
-        return html.KeyCode.FF_SEMICOLON;
+        return html$.KeyCode.FF_SEMICOLON;
       }
-      case html.KeyCode.EQUALS:
+      case html$.KeyCode.EQUALS:
       {
-        return html.KeyCode.FF_EQUALS;
+        return html$.KeyCode.FF_EQUALS;
       }
-      case html.KeyCode.COMMA:
+      case html$.KeyCode.COMMA:
       {
         return 44;
       }
-      case html.KeyCode.DASH:
+      case html$.KeyCode.DASH:
       {
         return 45;
       }
-      case html.KeyCode.PERIOD:
+      case html$.KeyCode.PERIOD:
       {
         return 46;
       }
-      case html.KeyCode.SLASH:
+      case html$.KeyCode.SLASH:
       {
         return 47;
       }
-      case html.KeyCode.APOSTROPHE:
+      case html$.KeyCode.APOSTROPHE:
       {
         return 96;
       }
-      case html.KeyCode.OPEN_SQUARE_BRACKET:
+      case html$.KeyCode.OPEN_SQUARE_BRACKET:
       {
         return 91;
       }
-      case html.KeyCode.BACKSLASH:
+      case html$.KeyCode.BACKSLASH:
       {
         return 92;
       }
-      case html.KeyCode.CLOSE_SQUARE_BRACKET:
+      case html$.KeyCode.CLOSE_SQUARE_BRACKET:
       {
         return 93;
       }
-      case html.KeyCode.SINGLE_QUOTE:
+      case html$.KeyCode.SINGLE_QUOTE:
       {
         return 39;
       }
@@ -97851,85 +97854,85 @@
       return true;
     }
     if (dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && dart.test(event.altKey)) {
-      return html.KeyCode.isCharacterKey(event.keyCode);
+      return html$.KeyCode.isCharacterKey(event.keyCode);
     }
     if (dart.test(event.altKey) && !dart.test(event.ctrlKey)) {
       return false;
     }
-    if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html.KeyCode.META)) {
+    if (!dart.test(event.shiftKey) && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META)) {
       return false;
     }
-    if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html.KeyCode.BACKSLASH || event.keyCode == html.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html.KeyCode.TILDE || event.keyCode == html.KeyCode.SEMICOLON || event.keyCode == html.KeyCode.DASH || event.keyCode == html.KeyCode.EQUALS || event.keyCode == html.KeyCode.COMMA || event.keyCode == html.KeyCode.PERIOD || event.keyCode == html.KeyCode.SLASH || event.keyCode == html.KeyCode.APOSTROPHE || event.keyCode == html.KeyCode.SINGLE_QUOTE)) {
+    if (dart.test(html_common.Device.isWebKit) && dart.test(event.ctrlKey) && dart.test(event.shiftKey) && (event.keyCode == html$.KeyCode.BACKSLASH || event.keyCode == html$.KeyCode.OPEN_SQUARE_BRACKET || event.keyCode == html$.KeyCode.CLOSE_SQUARE_BRACKET || event.keyCode == html$.KeyCode.TILDE || event.keyCode == html$.KeyCode.SEMICOLON || event.keyCode == html$.KeyCode.DASH || event.keyCode == html$.KeyCode.EQUALS || event.keyCode == html$.KeyCode.COMMA || event.keyCode == html$.KeyCode.PERIOD || event.keyCode == html$.KeyCode.SLASH || event.keyCode == html$.KeyCode.APOSTROPHE || event.keyCode == html$.KeyCode.SINGLE_QUOTE)) {
       return false;
     }
     switch (event.keyCode) {
-      case html.KeyCode.ENTER:
+      case html$.KeyCode.ENTER:
       {
         return !dart.test(html_common.Device.isIE);
       }
-      case html.KeyCode.ESC:
+      case html$.KeyCode.ESC:
       {
         return !dart.test(html_common.Device.isWebKit);
       }
     }
-    return html.KeyCode.isCharacterKey(event.keyCode);
+    return html$.KeyCode.isCharacterKey(event.keyCode);
   }
   [_normalizeKeyCodes](event) {
     if (dart.test(html_common.Device.isFirefox)) {
       switch (event[dartx.keyCode]) {
-        case html.KeyCode.FF_EQUALS:
+        case html$.KeyCode.FF_EQUALS:
         {
-          return html.KeyCode.EQUALS;
+          return html$.KeyCode.EQUALS;
         }
-        case html.KeyCode.FF_SEMICOLON:
+        case html$.KeyCode.FF_SEMICOLON:
         {
-          return html.KeyCode.SEMICOLON;
+          return html$.KeyCode.SEMICOLON;
         }
-        case html.KeyCode.MAC_FF_META:
+        case html$.KeyCode.MAC_FF_META:
         {
-          return html.KeyCode.META;
+          return html$.KeyCode.META;
         }
-        case html.KeyCode.WIN_KEY_FF_LINUX:
+        case html$.KeyCode.WIN_KEY_FF_LINUX:
         {
-          return html.KeyCode.WIN_KEY;
+          return html$.KeyCode.WIN_KEY;
         }
       }
     }
     return event[dartx.keyCode];
   }
   processKeyDown(e) {
-    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
+    if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && (this[_keyDownList][dartx.last].keyCode == html$.KeyCode.CTRL && !dart.test(e[dartx.ctrlKey]) || this[_keyDownList][dartx.last].keyCode == html$.KeyCode.ALT && !dart.test(e[dartx.altKey]) || dart.test(html_common.Device.userAgent[dartx.contains]('Mac')) && this[_keyDownList][dartx.last].keyCode == html$.KeyCode.META && !dart.test(e[dartx.metaKey]))) {
       this[_keyDownList][dartx.clear]();
     }
-    let event = new html.KeyEvent.wrap(e);
+    let event = new html$.KeyEvent.wrap(e);
     event[_shadowKeyCode] = this[_normalizeKeyCodes](event);
     event[_shadowCharCode] = this[_findCharCodeKeyDown](event);
     if (dart.notNull(this[_keyDownList][dartx.length]) > 0 && event.keyCode != this[_keyDownList][dartx.last].keyCode && !dart.test(this[_firesKeyPressEvent](event))) {
       this.processKeyPress(e);
     }
     this[_keyDownList][dartx.add](event);
-    this[_stream].add(event);
+    this[_stream$0].add(event);
   }
   processKeyPress(event) {
-    let e = new html.KeyEvent.wrap(event);
+    let e = new html$.KeyEvent.wrap(event);
     if (dart.test(html_common.Device.isIE)) {
-      if (e.keyCode == html.KeyCode.ENTER || e.keyCode == html.KeyCode.ESC) {
+      if (e.keyCode == html$.KeyCode.ENTER || e.keyCode == html$.KeyCode.ESC) {
         e[_shadowCharCode] = 0;
       } else {
         e[_shadowCharCode] = e.keyCode;
       }
     } else if (dart.test(html_common.Device.isOpera)) {
-      e[_shadowCharCode] = dart.test(html.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
+      e[_shadowCharCode] = dart.test(html$.KeyCode.isCharacterKey(e.keyCode)) ? e.keyCode : 0;
     }
     e[_shadowKeyCode] = this[_determineKeyCodeForKeypress](e);
-    if (e[_shadowKeyIdentifier] != null && dart.test(html._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
-      e[_shadowKeyCode] = html._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
+    if (e[_shadowKeyIdentifier] != null && dart.test(html$._KeyboardEventHandler._keyIdentifier[dartx.containsKey](e[_shadowKeyIdentifier]))) {
+      e[_shadowKeyCode] = html$._KeyboardEventHandler._keyIdentifier[dartx._get](e[_shadowKeyIdentifier]);
     }
     e[_shadowAltKey] = this[_keyDownList][dartx.any](dart.fn(element => element.altKey, KeyEventTobool()));
-    this[_stream].add(e);
+    this[_stream$0].add(e);
   }
   processKeyUp(event) {
-    let e = new html.KeyEvent.wrap(event);
+    let e = new html$.KeyEvent.wrap(event);
     let toRemove = null;
     for (let key of this[_keyDownList]) {
       if (key.keyCode == e.keyCode) {
@@ -97941,32 +97944,32 @@
     } else if (dart.notNull(this[_keyDownList][dartx.length]) > 0) {
       this[_keyDownList][dartx.removeLast]();
     }
-    this[_stream].add(e);
+    this[_stream$0].add(e);
   }
 };
-dart.addSimpleTypeTests(html._KeyboardEventHandler);
-dart.defineNamedConstructor(html._KeyboardEventHandler, 'initializeAllEventListeners');
-dart.setSignature(html._KeyboardEventHandler, {
+dart.addSimpleTypeTests(html$._KeyboardEventHandler);
+dart.defineNamedConstructor(html$._KeyboardEventHandler, 'initializeAllEventListeners');
+dart.setSignature(html$._KeyboardEventHandler, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html._KeyboardEventHandler, [core.String]),
-    initializeAllEventListeners: dart.definiteFunctionType(html._KeyboardEventHandler, [core.String, html.EventTarget])
+    new: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String]),
+    initializeAllEventListeners: dart.definiteFunctionType(html$._KeyboardEventHandler, [core.String, html$.EventTarget])
   }),
   fields: () => ({
     [_keyDownList]: ListOfKeyEvent(),
-    [_type]: core.String,
-    [_target]: html.EventTarget,
-    [_stream]: html._CustomKeyEventStreamImpl
+    [_type$]: core.String,
+    [_target$0]: html$.EventTarget,
+    [_stream$0]: html$._CustomKeyEventStreamImpl
   }),
   getters: () => ({[_capsLockOn]: dart.definiteFunctionType(core.bool, [])}),
   methods: () => ({
-    forTarget: dart.definiteFunctionType(html.CustomStream$(html.KeyEvent), [html.EventTarget], {useCapture: core.bool}),
-    [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html.KeyboardEvent]),
-    [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html.KeyboardEvent]),
-    [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html.KeyEvent]),
-    [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html.KeyboardEvent]),
-    processKeyDown: dart.definiteFunctionType(dart.void, [html.KeyboardEvent]),
-    processKeyPress: dart.definiteFunctionType(dart.void, [html.KeyboardEvent]),
-    processKeyUp: dart.definiteFunctionType(dart.void, [html.KeyboardEvent])
+    forTarget: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget], {useCapture: core.bool}),
+    [_determineKeyCodeForKeypress]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    [_findCharCodeKeyDown]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    [_firesKeyPressEvent]: dart.definiteFunctionType(core.bool, [html$.KeyEvent]),
+    [_normalizeKeyCodes]: dart.definiteFunctionType(core.int, [html$.KeyboardEvent]),
+    processKeyDown: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
+    processKeyPress: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent]),
+    processKeyUp: dart.definiteFunctionType(dart.void, [html$.KeyboardEvent])
   }),
   sfields: () => ({
     _ROMAN_ALPHABET_OFFSET: core.int,
@@ -97974,34 +97977,34 @@
     _keyIdentifier: MapOfString$int()
   })
 });
-html._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
-html._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html.KeyCode.UP, Down: html.KeyCode.DOWN, Left: html.KeyCode.LEFT, Right: html.KeyCode.RIGHT, Enter: html.KeyCode.ENTER, F1: html.KeyCode.F1, F2: html.KeyCode.F2, F3: html.KeyCode.F3, F4: html.KeyCode.F4, F5: html.KeyCode.F5, F6: html.KeyCode.F6, F7: html.KeyCode.F7, F8: html.KeyCode.F8, F9: html.KeyCode.F9, F10: html.KeyCode.F10, F11: html.KeyCode.F11, F12: html.KeyCode.F12, 'U+007F': html.KeyCode.DELETE, Home: html.KeyCode.HOME, End: html.KeyCode.END, PageUp: html.KeyCode.PAGE_UP, PageDown: html.KeyCode.PAGE_DOWN, Insert: html.KeyCode.INSERT}, core.String, core.int));
-dart.defineLazy(html._KeyboardEventHandler, {
+html$._KeyboardEventHandler._EVENT_TYPE = 'KeyEvent';
+html$._KeyboardEventHandler._keyIdentifier = dart.const(dart.map({Up: html$.KeyCode.UP, Down: html$.KeyCode.DOWN, Left: html$.KeyCode.LEFT, Right: html$.KeyCode.RIGHT, Enter: html$.KeyCode.ENTER, F1: html$.KeyCode.F1, F2: html$.KeyCode.F2, F3: html$.KeyCode.F3, F4: html$.KeyCode.F4, F5: html$.KeyCode.F5, F6: html$.KeyCode.F6, F7: html$.KeyCode.F7, F8: html$.KeyCode.F8, F9: html$.KeyCode.F9, F10: html$.KeyCode.F10, F11: html$.KeyCode.F11, F12: html$.KeyCode.F12, 'U+007F': html$.KeyCode.DELETE, Home: html$.KeyCode.HOME, End: html$.KeyCode.END, PageUp: html$.KeyCode.PAGE_UP, PageDown: html$.KeyCode.PAGE_DOWN, Insert: html$.KeyCode.INSERT}, core.String, core.int));
+dart.defineLazy(html$._KeyboardEventHandler, {
   get _ROMAN_ALPHABET_OFFSET() {
     return dart.notNull("a"[dartx.codeUnits][dartx._get](0)) - dart.notNull("A"[dartx.codeUnits][dartx._get](0));
   }
 });
-html.KeyboardEventStream = class KeyboardEventStream extends core.Object {
+html$.KeyboardEventStream = class KeyboardEventStream extends core.Object {
   static onKeyPress(target) {
-    return new html._KeyboardEventHandler('keypress').forTarget(target);
+    return new html$._KeyboardEventHandler('keypress').forTarget(target);
   }
   static onKeyUp(target) {
-    return new html._KeyboardEventHandler('keyup').forTarget(target);
+    return new html$._KeyboardEventHandler('keyup').forTarget(target);
   }
   static onKeyDown(target) {
-    return new html._KeyboardEventHandler('keydown').forTarget(target);
+    return new html$._KeyboardEventHandler('keydown').forTarget(target);
   }
 };
-dart.setSignature(html.KeyboardEventStream, {
+dart.setSignature(html$.KeyboardEventStream, {
   statics: () => ({
-    onKeyPress: dart.definiteFunctionType(html.CustomStream$(html.KeyEvent), [html.EventTarget]),
-    onKeyUp: dart.definiteFunctionType(html.CustomStream$(html.KeyEvent), [html.EventTarget]),
-    onKeyDown: dart.definiteFunctionType(html.CustomStream$(html.KeyEvent), [html.EventTarget])
+    onKeyPress: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
+    onKeyUp: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget]),
+    onKeyDown: dart.definiteFunctionType(html$.CustomStream$(html$.KeyEvent), [html$.EventTarget])
   }),
   names: ['onKeyPress', 'onKeyUp', 'onKeyDown']
 });
 const _validators = Symbol('_validators');
-html.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
+html$.NodeValidatorBuilder = class NodeValidatorBuilder extends core.Object {
   new() {
     this[_validators] = JSArrayOfNodeValidator().of([]);
   }
@@ -98013,19 +98016,19 @@
   allowNavigation(uriPolicy) {
     if (uriPolicy === void 0) uriPolicy = null;
     if (uriPolicy == null) {
-      uriPolicy = html.UriPolicy.new();
+      uriPolicy = html$.UriPolicy.new();
     }
-    this.add(html._SimpleNodeValidator.allowNavigation(uriPolicy));
+    this.add(html$._SimpleNodeValidator.allowNavigation(uriPolicy));
   }
   allowImages(uriPolicy) {
     if (uriPolicy === void 0) uriPolicy = null;
     if (uriPolicy == null) {
-      uriPolicy = html.UriPolicy.new();
+      uriPolicy = html$.UriPolicy.new();
     }
-    this.add(html._SimpleNodeValidator.allowImages(uriPolicy));
+    this.add(html$._SimpleNodeValidator.allowImages(uriPolicy));
   }
   allowTextElements() {
-    this.add(html._SimpleNodeValidator.allowTextElements());
+    this.add(html$._SimpleNodeValidator.allowTextElements());
   }
   allowInlineStyles(opts) {
     let tagName = opts && 'tagName' in opts ? opts.tagName : null;
@@ -98034,26 +98037,26 @@
     } else {
       tagName = tagName[dartx.toUpperCase]();
     }
-    this.add(new html._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
+    this.add(new html$._SimpleNodeValidator(null, {allowedAttributes: JSArrayOfString().of([dart.str`${tagName}::style`])}));
   }
   allowHtml5(opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-    this.add(new html._Html5NodeValidator({uriPolicy: uriPolicy}));
+    this.add(new html$._Html5NodeValidator({uriPolicy: uriPolicy}));
   }
   allowSvg() {
-    this.add(new html._SvgNodeValidator());
+    this.add(new html$._SvgNodeValidator());
   }
   allowCustomElement(tagName, opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
     let attributes = opts && 'attributes' in opts ? opts.attributes : null;
     let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
     let tagNameUpper = tagName[dartx.toUpperCase]();
-    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString())));
-    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString())));
+    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${tagNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
     if (uriPolicy == null) {
-      uriPolicy = html.UriPolicy.new();
+      uriPolicy = html$.UriPolicy.new();
     }
-    this.add(new html._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
+    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper]), attrs, uriAttrs, false, true));
   }
   allowTagExtension(tagName, baseName, opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
@@ -98061,12 +98064,12 @@
     let uriAttributes = opts && 'uriAttributes' in opts ? opts.uriAttributes : null;
     let baseNameUpper = baseName[dartx.toUpperCase]();
     let tagNameUpper = tagName[dartx.toUpperCase]();
-    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString())));
-    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString())));
+    let attrs = dart.nullSafe(attributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
+    let uriAttrs = dart.nullSafe(uriAttributes, _ => _[dartx.map](core.String)(dart.fn(name => dart.str`${baseNameUpper}::${name[dartx.toLowerCase]()}`, StringToString$())));
     if (uriPolicy == null) {
-      uriPolicy = html.UriPolicy.new();
+      uriPolicy = html$.UriPolicy.new();
     }
-    this.add(new html._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
+    this.add(new html$._CustomElementNodeValidator(uriPolicy, JSArrayOfString().of([tagNameUpper, baseNameUpper]), attrs, uriAttrs, true, false));
   }
   allowElement(tagName, opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
@@ -98075,7 +98078,7 @@
     this.allowCustomElement(tagName, {uriPolicy: uriPolicy, attributes: attributes, uriAttributes: uriAttributes});
   }
   allowTemplating() {
-    this.add(new html._TemplatingNodeValidator());
+    this.add(new html$._TemplatingNodeValidator());
   }
   add(validator) {
     this[_validators][dartx.add](validator);
@@ -98087,49 +98090,49 @@
     return this[_validators][dartx.any](dart.fn(v => v.allowsAttribute(element, attributeName, value), NodeValidatorTobool()));
   }
 };
-dart.defineNamedConstructor(html.NodeValidatorBuilder, 'common');
-html.NodeValidatorBuilder[dart.implements] = () => [html.NodeValidator];
-dart.setSignature(html.NodeValidatorBuilder, {
+dart.defineNamedConstructor(html$.NodeValidatorBuilder, 'common');
+html$.NodeValidatorBuilder[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$.NodeValidatorBuilder, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.NodeValidatorBuilder, []),
-    common: dart.definiteFunctionType(html.NodeValidatorBuilder, [])
+    new: dart.definiteFunctionType(html$.NodeValidatorBuilder, []),
+    common: dart.definiteFunctionType(html$.NodeValidatorBuilder, [])
   }),
   fields: () => ({[_validators]: ListOfNodeValidator()}),
   methods: () => ({
-    allowNavigation: dart.definiteFunctionType(dart.void, [], [html.UriPolicy]),
-    allowImages: dart.definiteFunctionType(dart.void, [], [html.UriPolicy]),
+    allowNavigation: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
+    allowImages: dart.definiteFunctionType(dart.void, [], [html$.UriPolicy]),
     allowTextElements: dart.definiteFunctionType(dart.void, []),
     allowInlineStyles: dart.definiteFunctionType(dart.void, [], {tagName: core.String}),
-    allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html.UriPolicy}),
+    allowHtml5: dart.definiteFunctionType(dart.void, [], {uriPolicy: html$.UriPolicy}),
     allowSvg: dart.definiteFunctionType(dart.void, []),
-    allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
-    allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
-    allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowCustomElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowTagExtension: dart.definiteFunctionType(dart.void, [core.String, core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
+    allowElement: dart.definiteFunctionType(dart.void, [core.String], {uriPolicy: html$.UriPolicy, attributes: IterableOfString(), uriAttributes: IterableOfString()}),
     allowTemplating: dart.definiteFunctionType(dart.void, []),
-    add: dart.definiteFunctionType(dart.void, [html.NodeValidator]),
-    allowsElement: dart.definiteFunctionType(core.bool, [html.Element]),
-    allowsAttribute: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String])
+    add: dart.definiteFunctionType(dart.void, [html$.NodeValidator]),
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-let const;
-html._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
+let const$83;
+let const$84;
+let const$85;
+let const$86;
+let const$87;
+let const$88;
+let const$89;
+let const$90;
+let const$91;
+let const$92;
+html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
   static allowNavigation(uriPolicy) {
-    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const || (const = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const || (const = dart.constList(['A::href', 'FORM::action'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
   }
   static allowImages(uriPolicy) {
-    return new html._SimpleNodeValidator(uriPolicy, {allowedElements: const || (const = dart.constList(['IMG'], core.String)), allowedAttributes: const || (const = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const || (const = dart.constList(['IMG::src'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
   }
   static allowTextElements() {
-    return new html._SimpleNodeValidator(null, {allowedElements: const || (const = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+    return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
   }
   new(uriPolicy, opts) {
     let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
@@ -98139,20 +98142,20 @@
     this.allowedAttributes = SetOfString().new();
     this.allowedUriAttributes = SetOfString().new();
     this.uriPolicy = uriPolicy;
-    this.allowedElements.addAll((allowedElements != null ? allowedElements : const || (const = dart.constList([], core.String))));
-    allowedAttributes = allowedAttributes != null ? allowedAttributes : const || (const = dart.constList([], core.String));
-    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const || (const = dart.constList([], core.String));
-    let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool()));
-    let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool()));
+    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
+    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
+    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+    let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
+    let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
     this.allowedAttributes.addAll(legalAttributes);
     this.allowedUriAttributes.addAll(allowedUriAttributes);
     this.allowedUriAttributes.addAll(extraUriAttributes);
   }
   allowsElement(element) {
-    return this.allowedElements.contains(html.Element._safeTagName(element));
+    return this.allowedElements.contains(html$.Element._safeTagName(element));
   }
   allowsAttribute(element, attributeName, value) {
-    let tagName = html.Element._safeTagName(element);
+    let tagName = html$.Element._safeTagName(element);
     if (dart.test(this.allowedUriAttributes.contains(dart.str`${tagName}::${attributeName}`))) {
       return this.uriPolicy.allowsUri(value);
     } else if (dart.test(this.allowedUriAttributes.contains(dart.str`*::${attributeName}`))) {
@@ -98169,26 +98172,26 @@
     return false;
   }
 };
-html._SimpleNodeValidator[dart.implements] = () => [html.NodeValidator];
-dart.setSignature(html._SimpleNodeValidator, {
+html$._SimpleNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._SimpleNodeValidator, {
   constructors: () => ({
-    allowNavigation: dart.definiteFunctionType(html._SimpleNodeValidator, [html.UriPolicy]),
-    allowImages: dart.definiteFunctionType(html._SimpleNodeValidator, [html.UriPolicy]),
-    allowTextElements: dart.definiteFunctionType(html._SimpleNodeValidator, []),
-    new: dart.definiteFunctionType(html._SimpleNodeValidator, [html.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
+    allowNavigation: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
+    allowImages: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy]),
+    allowTextElements: dart.definiteFunctionType(html$._SimpleNodeValidator, []),
+    new: dart.definiteFunctionType(html$._SimpleNodeValidator, [html$.UriPolicy], {allowedElements: IterableOfString(), allowedAttributes: IterableOfString(), allowedUriAttributes: IterableOfString()})
   }),
   fields: () => ({
     allowedElements: SetOfString(),
     allowedAttributes: SetOfString(),
     allowedUriAttributes: SetOfString(),
-    uriPolicy: html.UriPolicy
+    uriPolicy: html$.UriPolicy
   }),
   methods: () => ({
-    allowsElement: dart.definiteFunctionType(core.bool, [html.Element]),
-    allowsAttribute: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String])
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
-html._CustomElementNodeValidator = class _CustomElementNodeValidator extends html._SimpleNodeValidator {
+html$._CustomElementNodeValidator = class _CustomElementNodeValidator extends html$._SimpleNodeValidator {
   new(uriPolicy, allowedElements, allowedAttributes, allowedUriAttributes, allowTypeExtension, allowCustomTag) {
     this.allowTypeExtension = allowTypeExtension == true;
     this.allowCustomTag = allowCustomTag == true;
@@ -98198,10 +98201,10 @@
     if (dart.test(this.allowTypeExtension)) {
       let isAttr = element[dartx.attributes][dartx._get]('is');
       if (isAttr != null) {
-        return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html.Element._safeTagName(element)));
+        return dart.test(this.allowedElements.contains(isAttr[dartx.toUpperCase]())) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
       }
     }
-    return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html.Element._safeTagName(element)));
+    return dart.test(this.allowCustomTag) && dart.test(this.allowedElements.contains(html$.Element._safeTagName(element)));
   }
   allowsAttribute(element, attributeName, value) {
     if (dart.test(this.allowsElement(element))) {
@@ -98213,18 +98216,18 @@
     return false;
   }
 };
-dart.setSignature(html._CustomElementNodeValidator, {
-  constructors: () => ({new: dart.definiteFunctionType(html._CustomElementNodeValidator, [html.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
+dart.setSignature(html$._CustomElementNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._CustomElementNodeValidator, [html$.UriPolicy, IterableOfString(), IterableOfString(), IterableOfString(), core.bool, core.bool])}),
   fields: () => ({
     allowTypeExtension: core.bool,
     allowCustomTag: core.bool
   })
 });
 const _templateAttrs = Symbol('_templateAttrs');
-html._TemplatingNodeValidator = class _TemplatingNodeValidator extends html._SimpleNodeValidator {
+html$._TemplatingNodeValidator = class _TemplatingNodeValidator extends html$._SimpleNodeValidator {
   new() {
-    this[_templateAttrs] = SetOfString().from(html._TemplatingNodeValidator._TEMPLATE_ATTRS);
-    super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString()))});
+    this[_templateAttrs] = SetOfString().from(html$._TemplatingNodeValidator._TEMPLATE_ATTRS);
+    super.new(null, {allowedElements: JSArrayOfString().of(['TEMPLATE']), allowedAttributes: html$._TemplatingNodeValidator._TEMPLATE_ATTRS[dartx.map](core.String)(dart.fn(attr => dart.str`TEMPLATE::${attr}`, StringToString$()))});
   }
   allowsAttribute(element, attributeName, value) {
     if (dart.test(super.allowsAttribute(element, attributeName, value))) {
@@ -98239,21 +98242,21 @@
     return false;
   }
 };
-dart.setSignature(html._TemplatingNodeValidator, {
-  constructors: () => ({new: dart.definiteFunctionType(html._TemplatingNodeValidator, [])}),
+dart.setSignature(html$._TemplatingNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._TemplatingNodeValidator, [])}),
   fields: () => ({[_templateAttrs]: SetOfString()}),
   sfields: () => ({_TEMPLATE_ATTRS: ListOfString()})
 });
-html._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
-html._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
+html$._TemplatingNodeValidator._TEMPLATE_ATTRS = dart.constList(['bind', 'if', 'ref', 'repeat', 'syntax'], core.String);
+html$._SvgNodeValidator = class _SvgNodeValidator extends core.Object {
   allowsElement(element) {
-    if (svg.ScriptElement.is(element)) {
+    if (svg$.ScriptElement.is(element)) {
       return false;
     }
-    if (svg.SvgElement.is(element) && html.Element._safeTagName(element) == 'foreignObject') {
+    if (svg$.SvgElement.is(element) && html$.Element._safeTagName(element) == 'foreignObject') {
       return false;
     }
-    if (svg.SvgElement.is(element)) {
+    if (svg$.SvgElement.is(element)) {
       return true;
     }
     return false;
@@ -98265,107 +98268,107 @@
     return this.allowsElement(element);
   }
 };
-html._SvgNodeValidator[dart.implements] = () => [html.NodeValidator];
-dart.setSignature(html._SvgNodeValidator, {
+html$._SvgNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._SvgNodeValidator, {
   methods: () => ({
-    allowsElement: dart.definiteFunctionType(core.bool, [html.Element]),
-    allowsAttribute: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String])
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
-html.ReadyState = class ReadyState extends core.Object {};
-dart.setSignature(html.ReadyState, {
+html$.ReadyState = class ReadyState extends core.Object {};
+dart.setSignature(html$.ReadyState, {
   sfields: () => ({
     LOADING: core.String,
     INTERACTIVE: core.String,
     COMPLETE: core.String
   })
 });
-html.ReadyState.LOADING = "loading";
-html.ReadyState.INTERACTIVE = "interactive";
-html.ReadyState.COMPLETE = "complete";
-const _list = Symbol('_list');
-html._WrappedList$ = dart.generic(E => {
-  let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html._WrappedIterator$(E)))();
+html$.ReadyState.LOADING = "loading";
+html$.ReadyState.INTERACTIVE = "interactive";
+html$.ReadyState.COMPLETE = "complete";
+const _list$ = Symbol('_list');
+html$._WrappedList$ = dart.generic(E => {
+  let _WrappedIteratorOfE = () => (_WrappedIteratorOfE = dart.constFn(html$._WrappedIterator$(E)))();
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let EAndEToint = () => (EAndEToint = dart.constFn(dart.functionType(core.int, [E, E])))();
   class _WrappedList extends collection.ListBase$(E) {
     new(list) {
-      this[_list] = list;
+      this[_list$] = list;
     }
     get iterator() {
-      return new (_WrappedIteratorOfE())(this[_list][dartx.iterator]);
+      return new (_WrappedIteratorOfE())(this[_list$][dartx.iterator]);
     }
     get length() {
-      return this[_list][dartx.length];
+      return this[_list$][dartx.length];
     }
     add(element) {
       E._check(element);
-      this[_list][dartx.add](element);
+      this[_list$][dartx.add](element);
     }
     remove(element) {
-      return this[_list][dartx.remove](element);
+      return this[_list$][dartx.remove](element);
     }
     clear() {
-      this[_list][dartx.clear]();
+      this[_list$][dartx.clear]();
     }
     _get(index) {
-      return html._downcast(html.Node, E)(this[_list][dartx._get](index));
+      return html$._downcast(html$.Node, E)(this[_list$][dartx._get](index));
     }
     _set(index, value) {
       E._check(value);
-      this[_list][dartx._set](index, value);
+      this[_list$][dartx._set](index, value);
       return value;
     }
     set length(newLength) {
-      this[_list][dartx.length] = newLength;
+      this[_list$][dartx.length] = newLength;
     }
     sort(compare) {
       if (compare === void 0) compare = null;
-      this[_list][dartx.sort](dart.fn((a, b) => compare(html._downcast(html.Node, E)(a), html._downcast(html.Node, E)(b)), NodeAndNodeToint()));
+      this[_list$][dartx.sort](dart.fn((a, b) => compare(html$._downcast(html$.Node, E)(a), html$._downcast(html$.Node, E)(b)), NodeAndNodeToint()));
     }
     indexOf(element, start) {
       if (start === void 0) start = 0;
-      return this[_list][dartx.indexOf](html.Node._check(element), start);
+      return this[_list$][dartx.indexOf](html$.Node._check(element), start);
     }
     lastIndexOf(element, start) {
       if (start === void 0) start = null;
-      return this[_list][dartx.lastIndexOf](html.Node._check(element), start);
+      return this[_list$][dartx.lastIndexOf](html$.Node._check(element), start);
     }
     insert(index, element) {
       E._check(element);
-      return this[_list][dartx.insert](index, element);
+      return this[_list$][dartx.insert](index, element);
     }
     removeAt(index) {
-      return html._downcast(html.Node, E)(this[_list][dartx.removeAt](index));
+      return html$._downcast(html$.Node, E)(this[_list$][dartx.removeAt](index));
     }
     setRange(start, end, iterable, skipCount) {
       IterableOfE()._check(iterable);
       if (skipCount === void 0) skipCount = 0;
-      this[_list][dartx.setRange](start, end, iterable, skipCount);
+      this[_list$][dartx.setRange](start, end, iterable, skipCount);
     }
     removeRange(start, end) {
-      this[_list][dartx.removeRange](start, end);
+      this[_list$][dartx.removeRange](start, end);
     }
     replaceRange(start, end, iterable) {
       IterableOfE()._check(iterable);
-      this[_list][dartx.replaceRange](start, end, iterable);
+      this[_list$][dartx.replaceRange](start, end, iterable);
     }
     fillRange(start, end, fillValue) {
       if (fillValue === void 0) fillValue = null;
       E._check(fillValue);
-      this[_list][dartx.fillRange](start, end, fillValue);
+      this[_list$][dartx.fillRange](start, end, fillValue);
     }
     get rawList() {
-      return this[_list];
+      return this[_list$];
     }
   }
   _WrappedList[dart.implements] = () => [html_common.NodeListWrapper];
   dart.setSignature(_WrappedList, {
-    constructors: () => ({new: dart.definiteFunctionType(html._WrappedList$(E), [ListOfNode()])}),
-    fields: () => ({[_list]: ListOfNode()}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedList$(E), [ListOfNode()])}),
+    fields: () => ({[_list$]: ListOfNode()}),
     getters: () => ({
       length: dart.definiteFunctionType(core.int, []),
-      rawList: dart.definiteFunctionType(core.List$(html.Node), [])
+      rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
     }),
     setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
     methods: () => ({
@@ -98394,45 +98397,45 @@
   ]);
   return _WrappedList;
 });
-html._WrappedList = _WrappedList();
-const _iterator = Symbol('_iterator');
-html._WrappedIterator$ = dart.generic(E => {
+html$._WrappedList = _WrappedList();
+const _iterator$1 = Symbol('_iterator');
+html$._WrappedIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class _WrappedIterator extends core.Object {
     new(iterator) {
-      this[_iterator] = iterator;
+      this[_iterator$1] = iterator;
     }
     moveNext() {
-      return this[_iterator].moveNext();
+      return this[_iterator$1].moveNext();
     }
     get current() {
-      return html._downcast(html.Node, E)(this[_iterator].current);
+      return html$._downcast(html$.Node, E)(this[_iterator$1].current);
     }
   }
   dart.addTypeTests(_WrappedIterator);
   _WrappedIterator[dart.implements] = () => [IteratorOfE()];
   dart.setSignature(_WrappedIterator, {
-    constructors: () => ({new: dart.definiteFunctionType(html._WrappedIterator$(E), [IteratorOfNode()])}),
-    fields: () => ({[_iterator]: IteratorOfNode()}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._WrappedIterator$(E), [IteratorOfNode()])}),
+    fields: () => ({[_iterator$1]: IteratorOfNode()}),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
   });
   return _WrappedIterator;
 });
-html._WrappedIterator = _WrappedIterator();
-html._downcast = function(From, To) {
+html$._WrappedIterator = _WrappedIterator();
+html$._downcast = function(From, To) {
   return x => {
     return To._check(x);
   };
 };
-dart.fn(html._downcast, FromToTo());
-html._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
+dart.fn(html$._downcast, FromToTo());
+html$._HttpRequestUtils = class _HttpRequestUtils extends core.Object {
   static get(url, onComplete, withCredentials) {
-    let request = html.HttpRequest.new();
+    let request = html$.HttpRequest.new();
     request[dartx.open]('GET', url, {async: true});
     request[dartx.withCredentials] = withCredentials;
     request[dartx.onReadyStateChange].listen(dart.fn(e => {
-      if (request[dartx.readyState] == html.HttpRequest.DONE) {
+      if (request[dartx.readyState] == html$.HttpRequest.DONE) {
         onComplete(request);
       }
     }, ProgressEventToNull()));
@@ -98440,164 +98443,164 @@
     return request;
   }
 };
-dart.setSignature(html._HttpRequestUtils, {
-  statics: () => ({get: dart.definiteFunctionType(html.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
+dart.setSignature(html$._HttpRequestUtils, {
+  statics: () => ({get: dart.definiteFunctionType(html$.HttpRequest, [core.String, HttpRequestTodynamic(), core.bool])}),
   names: ['get']
 });
 const _array = Symbol('_array');
-const _current = Symbol('_current');
-html.FixedSizeListIterator$ = dart.generic(T => {
+const _current$4 = Symbol('_current');
+html$.FixedSizeListIterator$ = dart.generic(T => {
   let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
   let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
   class FixedSizeListIterator extends core.Object {
     new(array) {
       this[_array] = array;
-      this[_position] = -1;
-      this[_length] = array[dartx.length];
-      this[_current] = null;
+      this[_position$1] = -1;
+      this[_length$3] = array[dartx.length];
+      this[_current$4] = null;
     }
     moveNext() {
-      let nextPosition = dart.notNull(this[_position]) + 1;
-      if (nextPosition < dart.notNull(this[_length])) {
-        this[_current] = this[_array][dartx._get](nextPosition);
-        this[_position] = nextPosition;
+      let nextPosition = dart.notNull(this[_position$1]) + 1;
+      if (nextPosition < dart.notNull(this[_length$3])) {
+        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_position$1] = nextPosition;
         return true;
       }
-      this[_current] = null;
-      this[_position] = this[_length];
+      this[_current$4] = null;
+      this[_position$1] = this[_length$3];
       return false;
     }
     get current() {
-      return this[_current];
+      return this[_current$4];
     }
   }
   dart.addTypeTests(FixedSizeListIterator);
   FixedSizeListIterator[dart.implements] = () => [IteratorOfT()];
   dart.setSignature(FixedSizeListIterator, {
-    constructors: () => ({new: dart.definiteFunctionType(html.FixedSizeListIterator$(T), [ListOfT()])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$.FixedSizeListIterator$(T), [ListOfT()])}),
     fields: () => ({
       [_array]: ListOfT(),
-      [_length]: core.int,
-      [_position]: core.int,
-      [_current]: T
+      [_length$3]: core.int,
+      [_position$1]: core.int,
+      [_current$4]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
   });
   return FixedSizeListIterator;
 });
-html.FixedSizeListIterator = FixedSizeListIterator();
-html._VariableSizeListIterator$ = dart.generic(T => {
+html$.FixedSizeListIterator = FixedSizeListIterator();
+html$._VariableSizeListIterator$ = dart.generic(T => {
   let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
   let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
   class _VariableSizeListIterator extends core.Object {
     new(array) {
       this[_array] = array;
-      this[_position] = -1;
-      this[_current] = null;
+      this[_position$1] = -1;
+      this[_current$4] = null;
     }
     moveNext() {
-      let nextPosition = dart.notNull(this[_position]) + 1;
+      let nextPosition = dart.notNull(this[_position$1]) + 1;
       if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-        this[_current] = this[_array][dartx._get](nextPosition);
-        this[_position] = nextPosition;
+        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_position$1] = nextPosition;
         return true;
       }
-      this[_current] = null;
-      this[_position] = this[_array][dartx.length];
+      this[_current$4] = null;
+      this[_position$1] = this[_array][dartx.length];
       return false;
     }
     get current() {
-      return this[_current];
+      return this[_current$4];
     }
   }
   dart.addTypeTests(_VariableSizeListIterator);
   _VariableSizeListIterator[dart.implements] = () => [IteratorOfT()];
   dart.setSignature(_VariableSizeListIterator, {
-    constructors: () => ({new: dart.definiteFunctionType(html._VariableSizeListIterator$(T), [ListOfT()])}),
+    constructors: () => ({new: dart.definiteFunctionType(html$._VariableSizeListIterator$(T), [ListOfT()])}),
     fields: () => ({
       [_array]: ListOfT(),
-      [_position]: core.int,
-      [_current]: T
+      [_position$1]: core.int,
+      [_current$4]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
   });
   return _VariableSizeListIterator;
 });
-html._VariableSizeListIterator = _VariableSizeListIterator();
-html._convertNativeToDart_Window = function(win) {
+html$._VariableSizeListIterator = _VariableSizeListIterator();
+html$._convertNativeToDart_Window = function(win) {
   if (win == null) return null;
-  return html._DOMWindowCrossFrame._createSafe(win);
+  return html$._DOMWindowCrossFrame._createSafe(win);
 };
-dart.fn(html._convertNativeToDart_Window, dynamicToWindowBase());
-html._convertNativeToDart_EventTarget = function(e) {
+dart.fn(html$._convertNativeToDart_Window, dynamicToWindowBase());
+html$._convertNativeToDart_EventTarget = function(e) {
   if (e == null) {
     return null;
   }
   if ("postMessage" in e) {
-    let window = html._DOMWindowCrossFrame._createSafe(e);
-    if (html.EventTarget.is(window)) {
+    let window = html$._DOMWindowCrossFrame._createSafe(e);
+    if (html$.EventTarget.is(window)) {
       return window;
     }
     return null;
   } else
-    return html.EventTarget._check(e);
+    return html$.EventTarget._check(e);
 };
-dart.fn(html._convertNativeToDart_EventTarget, dynamicToEventTarget());
+dart.fn(html$._convertNativeToDart_EventTarget, dynamicToEventTarget());
 const _window = Symbol('_window');
-html._convertDartToNative_EventTarget = function(e) {
-  if (html._DOMWindowCrossFrame.is(e)) {
-    return html.EventTarget._check(e[_window]);
+html$._convertDartToNative_EventTarget = function(e) {
+  if (html$._DOMWindowCrossFrame.is(e)) {
+    return html$.EventTarget._check(e[_window]);
   } else {
-    return html.EventTarget._check(e);
+    return html$.EventTarget._check(e);
   }
 };
-dart.fn(html._convertDartToNative_EventTarget, dynamicToEventTarget());
-html._convertNativeToDart_XHR_Response = function(o) {
-  if (html.Document.is(o)) {
+dart.fn(html$._convertDartToNative_EventTarget, dynamicToEventTarget());
+html$._convertNativeToDart_XHR_Response = function(o) {
+  if (html$.Document.is(o)) {
     return o;
   }
   return html_common.convertNativeToDart_SerializedScriptValue(o);
 };
-dart.fn(html._convertNativeToDart_XHR_Response, dynamicTodynamic());
-html._callConstructor = function(constructor, interceptor) {
+dart.fn(html$._convertNativeToDart_XHR_Response, dynamicTodynamic$());
+html$._callConstructor = function(constructor, interceptor) {
   return dart.fn(receiver => {
     _js_helper.setNativeSubclassDispatchRecord(receiver, interceptor);
     receiver.constructor = receiver.__proto__.constructor;
     return constructor(receiver);
-  }, dynamicTodynamic());
+  }, dynamicTodynamic$());
 };
-dart.fn(html._callConstructor, dynamicAnddynamicTodynamic());
-html._callAttached = function(receiver) {
+dart.fn(html$._callConstructor, dynamicAnddynamicTodynamic$());
+html$._callAttached = function(receiver) {
   return dart.dsend(receiver, 'attached');
 };
-dart.fn(html._callAttached, dynamicTodynamic());
-html._callDetached = function(receiver) {
+dart.fn(html$._callAttached, dynamicTodynamic$());
+html$._callDetached = function(receiver) {
   return dart.dsend(receiver, 'detached');
 };
-dart.fn(html._callDetached, dynamicTodynamic());
-html._callAttributeChanged = function(receiver, name, oldValue, newValue) {
+dart.fn(html$._callDetached, dynamicTodynamic$());
+html$._callAttributeChanged = function(receiver, name, oldValue, newValue) {
   return dart.dsend(receiver, 'attributeChanged', name, oldValue, newValue);
 };
-dart.fn(html._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
-html._makeCallbackMethod = function(callback) {
+dart.fn(html$._callAttributeChanged, dynamicAnddynamicAnddynamic__Todynamic());
+html$._makeCallbackMethod = function(callback) {
   return (function(invokeCallback) {
     return function() {
       return invokeCallback(this);
     };
   })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 1));
 };
-dart.fn(html._makeCallbackMethod, dynamicTodynamic());
-html._makeCallbackMethod3 = function(callback) {
+dart.fn(html$._makeCallbackMethod, dynamicTodynamic$());
+html$._makeCallbackMethod3 = function(callback) {
   return (function(invokeCallback) {
     return function(arg1, arg2, arg3) {
       return invokeCallback(this, arg1, arg2, arg3);
     };
   })(_js_helper.convertDartClosureToJS(dart.dynamic)(callback, 4));
 };
-dart.fn(html._makeCallbackMethod3, dynamicTodynamic());
-html._registerCustomElement = function(context, document, tag, type, extendsTagName) {
+dart.fn(html$._makeCallbackMethod3, dynamicTodynamic$());
+html$._registerCustomElement = function(context, document, tag, type, extendsTagName) {
   let interceptorClass = _interceptors.findInterceptorConstructorForType(type);
   if (interceptorClass == null) {
     dart.throw(new core.ArgumentError(type));
@@ -98607,7 +98610,7 @@
   if (constructor == null) {
     dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
   }
-  _interceptors.getNativeInterceptor(html.Element.tag('article'));
+  _interceptors.getNativeInterceptor(html$.Element.tag('article'));
   let baseClassName = core.String._check(_js_helper.findDispatchTagForInterceptorClass(interceptorClass));
   if (baseClassName == null) {
     dart.throw(new core.ArgumentError(type));
@@ -98623,10 +98626,10 @@
   }
   let baseConstructor = context[baseClassName];
   let properties = {};
-  properties.createdCallback = {value: html._makeCallbackMethod(html._callConstructor(constructor, interceptor))};
-  properties.attachedCallback = {value: html._makeCallbackMethod(html._callAttached)};
-  properties.detachedCallback = {value: html._makeCallbackMethod(html._callDetached)};
-  properties.attributeChangedCallback = {value: html._makeCallbackMethod3(html._callAttributeChanged)};
+  properties.createdCallback = {value: html$._makeCallbackMethod(html$._callConstructor(constructor, interceptor))};
+  properties.attachedCallback = {value: html$._makeCallbackMethod(html$._callAttached)};
+  properties.detachedCallback = {value: html$._makeCallbackMethod(html$._callDetached)};
+  properties.attributeChangedCallback = {value: html$._makeCallbackMethod3(html$._callAttributeChanged)};
   let baseProto = baseConstructor.prototype;
   let proto = Object.create(baseProto, properties);
   _js_helper.setNativeSubclassDispatchRecord(proto, interceptor);
@@ -98636,14 +98639,14 @@
   }
   document.registerElement(tag, options);
 };
-dart.fn(html._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
-html._initializeCustomElement = function(e) {
+dart.fn(html$._registerCustomElement, dynamicAnddynamicAndString__Tovoid());
+html$._initializeCustomElement = function(e) {
 };
-dart.fn(html._initializeCustomElement, ElementTovoid());
+dart.fn(html$._initializeCustomElement, ElementTovoid$());
 const _interceptor = Symbol('_interceptor');
 const _constructor = Symbol('_constructor');
 const _nativeType = Symbol('_nativeType');
-html._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
+html$._JSElementUpgrader = class _JSElementUpgrader extends core.Object {
   new(document, type, extendsTag) {
     this[_interceptor] = null;
     this[_constructor] = null;
@@ -98656,7 +98659,7 @@
     if (this[_constructor] == null) {
       dart.throw(new core.ArgumentError(dart.str`${type} has no constructor called 'created'`));
     }
-    _interceptors.getNativeInterceptor(html.Element.tag('article'));
+    _interceptors.getNativeInterceptor(html$.Element.tag('article'));
     let baseClassName = _js_helper.findDispatchTagForInterceptorClass(interceptorClass);
     if (baseClassName == null) {
       dart.throw(new core.ArgumentError(type));
@@ -98665,7 +98668,7 @@
       if (!dart.equals(baseClassName, 'HTMLElement')) {
         dart.throw(new core.UnsupportedError('Class must provide extendsTag if base ' + 'native class is not HtmlElement'));
       }
-      this[_nativeType] = dart.wrapType(html.HtmlElement);
+      this[_nativeType] = dart.wrapType(html$.HtmlElement);
     } else {
       let element = document[dartx.createElement](extendsTag);
       if (!(element instanceof window[baseClassName])) {
@@ -98684,34 +98687,34 @@
     return element;
   }
 };
-html._JSElementUpgrader[dart.implements] = () => [html.ElementUpgrader];
-dart.setSignature(html._JSElementUpgrader, {
-  constructors: () => ({new: dart.definiteFunctionType(html._JSElementUpgrader, [html.Document, core.Type, core.String])}),
+html$._JSElementUpgrader[dart.implements] = () => [html$.ElementUpgrader];
+dart.setSignature(html$._JSElementUpgrader, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._JSElementUpgrader, [html$.Document, core.Type, core.String])}),
   fields: () => ({
     [_interceptor]: dart.dynamic,
     [_constructor]: dart.dynamic,
     [_nativeType]: dart.dynamic
   }),
-  methods: () => ({upgrade: dart.definiteFunctionType(html.Element, [html.Element])})
+  methods: () => ({upgrade: dart.definiteFunctionType(html$.Element, [html$.Element])})
 });
-html._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
+html$._DOMWindowCrossFrame = class _DOMWindowCrossFrame extends core.Object {
   get history() {
-    return html._HistoryCrossFrame._createSafe(this[_window].history);
+    return html$._HistoryCrossFrame._createSafe(this[_window].history);
   }
   get location() {
-    return html._LocationCrossFrame._createSafe(this[_window].location);
+    return html$._LocationCrossFrame._createSafe(this[_window].location);
   }
   get closed() {
     return this[_window].closed;
   }
   get opener() {
-    return html._DOMWindowCrossFrame._createSafe(this[_window].opener);
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].opener);
   }
   get parent() {
-    return html._DOMWindowCrossFrame._createSafe(this[_window].parent);
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].parent);
   }
   get top() {
-    return html._DOMWindowCrossFrame._createSafe(this[_window].top);
+    return html$._DOMWindowCrossFrame._createSafe(this[_window].top);
   }
   close() {
     return this[_window].close();
@@ -98728,10 +98731,10 @@
     this[_window] = window;
   }
   static _createSafe(w) {
-    if (core.identical(w, html.window)) {
-      return html.WindowBase._check(w);
+    if (core.identical(w, html$.window)) {
+      return html$.WindowBase._check(w);
     } else {
-      return new html._DOMWindowCrossFrame(w);
+      return new html$._DOMWindowCrossFrame(w);
     }
   }
   get on() {
@@ -98757,32 +98760,32 @@
     return dart.throw(new core.UnsupportedError('You can only attach EventListeners to your own window.'));
   }
 };
-html._DOMWindowCrossFrame[dart.implements] = () => [html.WindowBase];
-dart.setSignature(html._DOMWindowCrossFrame, {
-  constructors: () => ({new: dart.definiteFunctionType(html._DOMWindowCrossFrame, [dart.dynamic])}),
+html$._DOMWindowCrossFrame[dart.implements] = () => [html$.WindowBase];
+dart.setSignature(html$._DOMWindowCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._DOMWindowCrossFrame, [dart.dynamic])}),
   fields: () => ({[_window]: dart.dynamic}),
   getters: () => ({
-    history: dart.definiteFunctionType(html.HistoryBase, []),
-    location: dart.definiteFunctionType(html.LocationBase, []),
+    history: dart.definiteFunctionType(html$.HistoryBase, []),
+    location: dart.definiteFunctionType(html$.LocationBase, []),
     closed: dart.definiteFunctionType(core.bool, []),
-    opener: dart.definiteFunctionType(html.WindowBase, []),
-    parent: dart.definiteFunctionType(html.WindowBase, []),
-    top: dart.definiteFunctionType(html.WindowBase, []),
-    on: dart.definiteFunctionType(html.Events, [])
+    opener: dart.definiteFunctionType(html$.WindowBase, []),
+    parent: dart.definiteFunctionType(html$.WindowBase, []),
+    top: dart.definiteFunctionType(html$.WindowBase, []),
+    on: dart.definiteFunctionType(html$.Events, [])
   }),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
     postMessage: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String], [core.List]),
-    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    addEventListener: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    dispatchEvent: dart.definiteFunctionType(core.bool, [html.Event]),
-    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool]),
-    removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html.EventListener], [core.bool])
+    [_addEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    addEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    dispatchEvent: dart.definiteFunctionType(core.bool, [html$.Event]),
+    [_removeEventListener]: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool]),
+    removeEventListener: dart.definiteFunctionType(dart.void, [core.String, html$.EventListener], [core.bool])
   }),
-  statics: () => ({_createSafe: dart.definiteFunctionType(html.WindowBase, [dart.dynamic])}),
+  statics: () => ({_createSafe: dart.definiteFunctionType(html$.WindowBase, [dart.dynamic])}),
   names: ['_createSafe']
 });
-dart.defineExtensionMembers(html._DOMWindowCrossFrame, [
+dart.defineExtensionMembers(html$._DOMWindowCrossFrame, [
   'close',
   'postMessage',
   'history',
@@ -98792,9 +98795,9 @@
   'parent',
   'top'
 ]);
-html._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
+html$._LocationCrossFrame = class _LocationCrossFrame extends core.Object {
   set href(val) {
-    return html._LocationCrossFrame._setHref(this[_location], val);
+    return html$._LocationCrossFrame._setHref(this[_location], val);
   }
   static _setHref(location, val) {
     location.href = val;
@@ -98803,27 +98806,27 @@
     this[_location] = location;
   }
   static _createSafe(location) {
-    if (core.identical(location, html.window[dartx.location])) {
-      return html.LocationBase._check(location);
+    if (core.identical(location, html$.window[dartx.location])) {
+      return html$.LocationBase._check(location);
     } else {
-      return new html._LocationCrossFrame(location);
+      return new html$._LocationCrossFrame(location);
     }
   }
 };
-html._LocationCrossFrame[dart.implements] = () => [html.LocationBase];
-dart.setSignature(html._LocationCrossFrame, {
-  constructors: () => ({new: dart.definiteFunctionType(html._LocationCrossFrame, [dart.dynamic])}),
+html$._LocationCrossFrame[dart.implements] = () => [html$.LocationBase];
+dart.setSignature(html$._LocationCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._LocationCrossFrame, [dart.dynamic])}),
   fields: () => ({[_location]: dart.dynamic}),
   setters: () => ({href: dart.definiteFunctionType(dart.void, [core.String])}),
   statics: () => ({
     _setHref: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic]),
-    _createSafe: dart.definiteFunctionType(html.LocationBase, [dart.dynamic])
+    _createSafe: dart.definiteFunctionType(html$.LocationBase, [dart.dynamic])
   }),
   names: ['_setHref', '_createSafe']
 });
-dart.defineExtensionMembers(html._LocationCrossFrame, ['href']);
+dart.defineExtensionMembers(html$._LocationCrossFrame, ['href']);
 const _history = Symbol('_history');
-html._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
+html$._HistoryCrossFrame = class _HistoryCrossFrame extends core.Object {
   back() {
     return this[_history].back();
   }
@@ -98837,178 +98840,178 @@
     this[_history] = history;
   }
   static _createSafe(h) {
-    if (core.identical(h, html.window[dartx.history])) {
-      return html.HistoryBase._check(h);
+    if (core.identical(h, html$.window[dartx.history])) {
+      return html$.HistoryBase._check(h);
     } else {
-      return new html._HistoryCrossFrame(h);
+      return new html$._HistoryCrossFrame(h);
     }
   }
 };
-html._HistoryCrossFrame[dart.implements] = () => [html.HistoryBase];
-dart.setSignature(html._HistoryCrossFrame, {
-  constructors: () => ({new: dart.definiteFunctionType(html._HistoryCrossFrame, [dart.dynamic])}),
+html$._HistoryCrossFrame[dart.implements] = () => [html$.HistoryBase];
+dart.setSignature(html$._HistoryCrossFrame, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._HistoryCrossFrame, [dart.dynamic])}),
   fields: () => ({[_history]: dart.dynamic}),
   methods: () => ({
     back: dart.definiteFunctionType(dart.void, []),
     forward: dart.definiteFunctionType(dart.void, []),
     go: dart.definiteFunctionType(dart.void, [core.int])
   }),
-  statics: () => ({_createSafe: dart.definiteFunctionType(html.HistoryBase, [dart.dynamic])}),
+  statics: () => ({_createSafe: dart.definiteFunctionType(html$.HistoryBase, [dart.dynamic])}),
   names: ['_createSafe']
 });
-dart.defineExtensionMembers(html._HistoryCrossFrame, ['back', 'forward', 'go']);
-html.Platform = class Platform extends core.Object {};
-dart.setSignature(html.Platform, {
+dart.defineExtensionMembers(html$._HistoryCrossFrame, ['back', 'forward', 'go']);
+html$.Platform = class Platform extends core.Object {};
+dart.setSignature(html$.Platform, {
   sfields: () => ({
     supportsTypedData: core.bool,
     supportsSimd: core.bool
   })
 });
-html.Platform.supportsSimd = false;
-dart.defineLazy(html.Platform, {
+html$.Platform.supportsSimd = false;
+dart.defineLazy(html$.Platform, {
   get supportsTypedData() {
     return !!window.ArrayBuffer;
   }
 });
-html._wrapZoneCallback$ = dart.generic((A, R) => {
+html$._wrapZoneCallback$ = dart.generic((A, R) => {
   const _wrapZoneCallback = dart.typedef('_wrapZoneCallback', () => dart.functionType(R, [A]));
   return _wrapZoneCallback;
 });
-html._wrapZoneCallback = _wrapZoneCallback();
-html._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
+html$._wrapZoneCallback = _wrapZoneCallback();
+html$._wrapZoneBinaryCallback$ = dart.generic((A, B, R) => {
   const _wrapZoneBinaryCallback = dart.typedef('_wrapZoneBinaryCallback', () => dart.functionType(R, [A, B]));
   return _wrapZoneBinaryCallback;
 });
-html._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
-html._wrapZone = function(A, R) {
+html$._wrapZoneBinaryCallback = _wrapZoneBinaryCallback();
+html$._wrapZone = function(A, R) {
   return callback => {
     if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
     if (callback == null) return null;
     return async.Zone.current.bindUnaryCallback(R, A)(callback, {runGuarded: true});
   };
 };
-dart.fn(html._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
-html._wrapBinaryZone = function(A, B, R) {
+dart.fn(html$._wrapZone, _wrapZoneCallbackOfA$RTo_wrapZoneCallbackOfA$R());
+html$._wrapBinaryZone = function(A, B, R) {
   return callback => {
     if (dart.equals(async.Zone.current, async.Zone.ROOT)) return callback;
     if (callback == null) return null;
     return async.Zone.current.bindBinaryCallback(R, A, B)(callback, {runGuarded: true});
   };
 };
-dart.fn(html._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
-html.query = function(relativeSelectors) {
-  return html.document[dartx.query](relativeSelectors);
+dart.fn(html$._wrapBinaryZone, _wrapZoneBinaryCallbackOfA$B$RTo_wrapZoneBinaryCallbackOfA$B$R());
+html$.query = function(relativeSelectors) {
+  return html$.document[dartx.query](relativeSelectors);
 };
-dart.fn(html.query, StringToElement());
-html.queryAll = function(relativeSelectors) {
-  return html.document[dartx.queryAll](html.Element)(relativeSelectors);
+dart.fn(html$.query, StringToElement());
+html$.queryAll = function(relativeSelectors) {
+  return html$.document[dartx.queryAll](html$.Element)(relativeSelectors);
 };
-dart.fn(html.queryAll, StringToElementListOfElement());
-html.querySelector = function(selectors) {
-  return html.document[dartx.querySelector](selectors);
+dart.fn(html$.queryAll, StringToElementListOfElement());
+html$.querySelector = function(selectors) {
+  return html$.document[dartx.querySelector](selectors);
 };
-dart.fn(html.querySelector, StringToElement());
-html.querySelectorAll = function(selectors) {
-  return html.document[dartx.querySelectorAll](html.Element)(selectors);
+dart.fn(html$.querySelector, StringToElement());
+html$.querySelectorAll = function(selectors) {
+  return html$.document[dartx.querySelectorAll](html$.Element)(selectors);
 };
-dart.fn(html.querySelectorAll, StringToElementListOfElement());
-html.ElementUpgrader = class ElementUpgrader extends core.Object {};
-html.NodeValidator = class NodeValidator extends core.Object {
+dart.fn(html$.querySelectorAll, StringToElementListOfElement());
+html$.ElementUpgrader = class ElementUpgrader extends core.Object {};
+html$.NodeValidator = class NodeValidator extends core.Object {
   static new(opts) {
     let uriPolicy = opts && 'uriPolicy' in opts ? opts.uriPolicy : null;
-    return new html._Html5NodeValidator({uriPolicy: uriPolicy});
+    return new html$._Html5NodeValidator({uriPolicy: uriPolicy});
   }
   static throws(base) {
-    return new html._ThrowsNodeValidator(base);
+    return new html$._ThrowsNodeValidator(base);
   }
 };
-dart.setSignature(html.NodeValidator, {
+dart.setSignature(html$.NodeValidator, {
   constructors: () => ({
-    new: dart.definiteFunctionType(html.NodeValidator, [], {uriPolicy: html.UriPolicy}),
-    throws: dart.definiteFunctionType(html.NodeValidator, [html.NodeValidator])
+    new: dart.definiteFunctionType(html$.NodeValidator, [], {uriPolicy: html$.UriPolicy}),
+    throws: dart.definiteFunctionType(html$.NodeValidator, [html$.NodeValidator])
   })
 });
-html.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
+html$.NodeTreeSanitizer = class NodeTreeSanitizer extends core.Object {
   static new(validator) {
-    return new html._ValidatingTreeSanitizer(validator);
+    return new html$._ValidatingTreeSanitizer(validator);
   }
 };
-dart.setSignature(html.NodeTreeSanitizer, {
-  constructors: () => ({new: dart.definiteFunctionType(html.NodeTreeSanitizer, [html.NodeValidator])}),
-  sfields: () => ({trusted: html._TrustedHtmlTreeSanitizer})
+dart.setSignature(html$.NodeTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.NodeTreeSanitizer, [html$.NodeValidator])}),
+  sfields: () => ({trusted: html$._TrustedHtmlTreeSanitizer})
 });
-dart.defineLazy(html.NodeTreeSanitizer, {
+dart.defineLazy(html$.NodeTreeSanitizer, {
   get trusted() {
-    return dart.const(new html._TrustedHtmlTreeSanitizer());
+    return dart.const(new html$._TrustedHtmlTreeSanitizer());
   }
 });
-html._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
+html$._TrustedHtmlTreeSanitizer = class _TrustedHtmlTreeSanitizer extends core.Object {
   new() {
   }
   sanitizeTree(node) {}
 };
-html._TrustedHtmlTreeSanitizer[dart.implements] = () => [html.NodeTreeSanitizer];
-dart.setSignature(html._TrustedHtmlTreeSanitizer, {
-  constructors: () => ({new: dart.definiteFunctionType(html._TrustedHtmlTreeSanitizer, [])}),
-  methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html.Node])})
+html$._TrustedHtmlTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
+dart.setSignature(html$._TrustedHtmlTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._TrustedHtmlTreeSanitizer, [])}),
+  methods: () => ({sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node])})
 });
-html.UriPolicy = class UriPolicy extends core.Object {
+html$.UriPolicy = class UriPolicy extends core.Object {
   static new() {
-    return new html._SameOriginUriPolicy();
+    return new html$._SameOriginUriPolicy();
   }
 };
-dart.setSignature(html.UriPolicy, {
-  constructors: () => ({new: dart.definiteFunctionType(html.UriPolicy, [])})
+dart.setSignature(html$.UriPolicy, {
+  constructors: () => ({new: dart.definiteFunctionType(html$.UriPolicy, [])})
 });
 const _hiddenAnchor = Symbol('_hiddenAnchor');
 const _loc = Symbol('_loc');
-html._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
+html$._SameOriginUriPolicy = class _SameOriginUriPolicy extends core.Object {
   new() {
-    this[_hiddenAnchor] = html.AnchorElement.new();
-    this[_loc] = html.window[dartx.location];
+    this[_hiddenAnchor] = html$.AnchorElement.new();
+    this[_loc] = html$.window[dartx.location];
   }
   allowsUri(uri) {
     this[_hiddenAnchor][dartx.href] = uri;
     return this[_hiddenAnchor][dartx.hostname] == this[_loc][dartx.hostname] && this[_hiddenAnchor][dartx.port] == this[_loc][dartx.port] && this[_hiddenAnchor][dartx.protocol] == this[_loc][dartx.protocol] || this[_hiddenAnchor][dartx.hostname] == '' && this[_hiddenAnchor][dartx.port] == '' && (this[_hiddenAnchor][dartx.protocol] == ':' || this[_hiddenAnchor][dartx.protocol] == '');
   }
 };
-html._SameOriginUriPolicy[dart.implements] = () => [html.UriPolicy];
-dart.setSignature(html._SameOriginUriPolicy, {
+html$._SameOriginUriPolicy[dart.implements] = () => [html$.UriPolicy];
+dart.setSignature(html$._SameOriginUriPolicy, {
   fields: () => ({
-    [_hiddenAnchor]: html.AnchorElement,
-    [_loc]: html.Location
+    [_hiddenAnchor]: html$.AnchorElement,
+    [_loc]: html$.Location
   }),
   methods: () => ({allowsUri: dart.definiteFunctionType(core.bool, [core.String])})
 });
-html._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
+html$._ThrowsNodeValidator = class _ThrowsNodeValidator extends core.Object {
   new(validator) {
     this.validator = validator;
   }
   allowsElement(element) {
     if (!dart.test(this.validator.allowsElement(element))) {
-      dart.throw(new core.ArgumentError(html.Element._safeTagName(element)));
+      dart.throw(new core.ArgumentError(html$.Element._safeTagName(element)));
     }
     return true;
   }
   allowsAttribute(element, attributeName, value) {
     if (!dart.test(this.validator.allowsAttribute(element, attributeName, value))) {
-      dart.throw(new core.ArgumentError(dart.str`${html.Element._safeTagName(element)}[${attributeName}="${value}"]`));
+      dart.throw(new core.ArgumentError(dart.str`${html$.Element._safeTagName(element)}[${attributeName}="${value}"]`));
     }
   }
 };
-html._ThrowsNodeValidator[dart.implements] = () => [html.NodeValidator];
-dart.setSignature(html._ThrowsNodeValidator, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ThrowsNodeValidator, [html.NodeValidator])}),
-  fields: () => ({validator: html.NodeValidator}),
+html$._ThrowsNodeValidator[dart.implements] = () => [html$.NodeValidator];
+dart.setSignature(html$._ThrowsNodeValidator, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ThrowsNodeValidator, [html$.NodeValidator])}),
+  fields: () => ({validator: html$.NodeValidator}),
   methods: () => ({
-    allowsElement: dart.definiteFunctionType(core.bool, [html.Element]),
-    allowsAttribute: dart.definiteFunctionType(core.bool, [html.Element, core.String, core.String])
+    allowsElement: dart.definiteFunctionType(core.bool, [html$.Element]),
+    allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
 const _removeNode = Symbol('_removeNode');
 const _sanitizeElement = Symbol('_sanitizeElement');
 const _sanitizeUntrustedElement = Symbol('_sanitizeUntrustedElement');
-html._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
+html$._ValidatingTreeSanitizer = class _ValidatingTreeSanitizer extends core.Object {
   new(validator) {
     this.validator = validator;
   }
@@ -99039,8 +99042,8 @@
     try {
       attrs = dart.dload(element, 'attributes');
       isAttr = dart.dindex(attrs, 'is');
-      let corruptedTest1 = html.Element._hasCorruptedAttributes(html.Element._check(element));
-      corrupted = dart.test(corruptedTest1) ? true : html.Element._hasCorruptedAttributesAdditionalCheck(html.Element._check(element));
+      let corruptedTest1 = html$.Element._hasCorruptedAttributes(html$.Element._check(element));
+      corrupted = dart.test(corruptedTest1) ? true : html$.Element._hasCorruptedAttributesAdditionalCheck(html$.Element._check(element));
     } catch (e) {
     }
 
@@ -99051,15 +99054,15 @@
     }
 
     try {
-      let elementTagName = html.Element._safeTagName(element);
-      this[_sanitizeElement](html.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
+      let elementTagName = html$.Element._safeTagName(element);
+      this[_sanitizeElement](html$.Element._check(element), parent, corrupted, elementText, elementTagName, core.Map._check(attrs), core.String._check(isAttr));
     } catch (e$) {
       if (core.ArgumentError.is(e$)) {
         throw e$;
       } else {
         let e = e$;
-        this[_removeNode](html.Node._check(element), parent);
-        html.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
+        this[_removeNode](html$.Node._check(element), parent);
+        html$.window[dartx.console].warn(dart.str`Removing corrupted element ${elementText}`);
       }
     }
 
@@ -99067,18 +99070,18 @@
   [_sanitizeElement](element, parent, corrupted, text, tag, attrs, isAttr) {
     if (false != corrupted) {
       this[_removeNode](element, parent);
-      html.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
+      html$.window[dartx.console].warn(dart.str`Removing element due to corrupted attributes on <${text}>`);
       return;
     }
     if (!dart.test(this.validator.allowsElement(element))) {
       this[_removeNode](element, parent);
-      html.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
+      html$.window[dartx.console].warn(dart.str`Removing disallowed element <${tag}> from ${parent}`);
       return;
     }
     if (isAttr != null) {
       if (!dart.test(this.validator.allowsAttribute(element, 'is', isAttr))) {
         this[_removeNode](element, parent);
-        html.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
+        html$.window[dartx.console].warn('Removing disallowed type extension ' + dart.str`<${tag} is="${isAttr}">`);
         return;
       }
     }
@@ -99086,26 +99089,26 @@
     for (let i = dart.notNull(attrs[dartx.length]) - 1; i >= 0; --i) {
       let name = keys[dartx._get](i);
       if (!dart.test(this.validator.allowsAttribute(element, core.String._check(dart.dsend(name, 'toLowerCase')), core.String._check(attrs[dartx._get](name))))) {
-        html.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
+        html$.window[dartx.console].warn('Removing disallowed attribute ' + dart.str`<${tag} ${name}="${attrs[dartx._get](name)}">`);
         attrs[dartx.remove](name);
       }
     }
-    if (html.TemplateElement.is(element)) {
+    if (html$.TemplateElement.is(element)) {
       let template = element;
       this.sanitizeTree(template[dartx.content]);
     }
   }
   sanitizeNode(node, parent) {
     switch (node[dartx.nodeType]) {
-      case html.Node.ELEMENT_NODE:
+      case html$.Node.ELEMENT_NODE:
       {
         this[_sanitizeUntrustedElement](node, parent);
         break;
       }
-      case html.Node.COMMENT_NODE:
-      case html.Node.DOCUMENT_FRAGMENT_NODE:
-      case html.Node.TEXT_NODE:
-      case html.Node.CDATA_SECTION_NODE:
+      case html$.Node.COMMENT_NODE:
+      case html$.Node.DOCUMENT_FRAGMENT_NODE:
+      case html$.Node.TEXT_NODE:
+      case html$.Node.CDATA_SECTION_NODE:
       {
         break;
       }
@@ -99116,26 +99119,26 @@
     }
   }
 };
-html._ValidatingTreeSanitizer[dart.implements] = () => [html.NodeTreeSanitizer];
-dart.setSignature(html._ValidatingTreeSanitizer, {
-  constructors: () => ({new: dart.definiteFunctionType(html._ValidatingTreeSanitizer, [html.NodeValidator])}),
-  fields: () => ({validator: html.NodeValidator}),
+html$._ValidatingTreeSanitizer[dart.implements] = () => [html$.NodeTreeSanitizer];
+dart.setSignature(html$._ValidatingTreeSanitizer, {
+  constructors: () => ({new: dart.definiteFunctionType(html$._ValidatingTreeSanitizer, [html$.NodeValidator])}),
+  fields: () => ({validator: html$.NodeValidator}),
   methods: () => ({
-    sanitizeTree: dart.definiteFunctionType(dart.void, [html.Node]),
-    [_removeNode]: dart.definiteFunctionType(dart.void, [html.Node, html.Node]),
-    [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html.Node]),
-    [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html.Element, html.Node, core.bool, core.String, core.String, core.Map, core.String]),
-    sanitizeNode: dart.definiteFunctionType(dart.void, [html.Node, html.Node])
+    sanitizeTree: dart.definiteFunctionType(dart.void, [html$.Node]),
+    [_removeNode]: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node]),
+    [_sanitizeUntrustedElement]: dart.definiteFunctionType(dart.void, [dart.dynamic, html$.Node]),
+    [_sanitizeElement]: dart.definiteFunctionType(dart.void, [html$.Element, html$.Node, core.bool, core.String, core.String, core.Map, core.String]),
+    sanitizeNode: dart.definiteFunctionType(dart.void, [html$.Node, html$.Node])
   })
 });
 html_common.convertDartToNative_SerializedScriptValue = function(value) {
   return html_common.convertDartToNative_PrepareForStructuredClone(value);
 };
-dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic());
+dart.fn(html_common.convertDartToNative_SerializedScriptValue, dynamicTodynamic$());
 html_common.convertNativeToDart_SerializedScriptValue = function(object) {
   return html_common.convertNativeToDart_AcceptStructuredClone(object, {mustCopy: true});
 };
-dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic());
+dart.fn(html_common.convertNativeToDart_SerializedScriptValue, dynamicTodynamic$());
 html_common._StructuredClone = class _StructuredClone extends core.Object {
   new() {
     this.values = [];
@@ -99168,10 +99171,10 @@
     if (core.RegExp.is(e)) {
       dart.throw(new core.UnimplementedError('structured clone of RegExp'));
     }
-    if (html.File.is(e)) return e;
-    if (html.Blob.is(e)) return e;
-    if (html.FileList.is(e)) return e;
-    if (html.ImageData.is(e)) return e;
+    if (html$.File.is(e)) return e;
+    if (html$.Blob.is(e)) return e;
+    if (html$.FileList.is(e)) return e;
+    if (html$.ImageData.is(e)) return e;
     if (dart.test(this.cloneNotRequired(e))) return e;
     if (core.Map.is(e)) {
       let slot = this.findSlot(e);
@@ -99265,7 +99268,7 @@
       if (copy != null) return copy;
       copy = dart.map();
       this.writeSlot(slot, copy);
-      this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic()));
+      this.forEachJsField(e, dart.fn((key, value) => dart.dsetindex(copy, key, this.walk(value)), dynamicAnddynamicTodynamic$()));
       return copy;
     }
     if (dart.test(html_common.isJavaScriptArray(e))) {
@@ -99330,7 +99333,7 @@
 html_common.convertNativeToDart_ContextAttributes = function(nativeContextAttributes) {
   return new html_common.ContextAttributes(nativeContextAttributes.alpha, nativeContextAttributes.antialias, nativeContextAttributes.depth, nativeContextAttributes.failIfMajorPerformanceCaveat, nativeContextAttributes.premultipliedAlpha, nativeContextAttributes.preserveDrawingBuffer, nativeContextAttributes.stencil);
 };
-dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic());
+dart.fn(html_common.convertNativeToDart_ContextAttributes, dynamicTodynamic$());
 html_common._TypedImageData = class _TypedImageData extends core.Object {
   new(data, height, width) {
     this.data = data;
@@ -99338,7 +99341,7 @@
     this.width = width;
   }
 };
-html_common._TypedImageData[dart.implements] = () => [html.ImageData];
+html_common._TypedImageData[dart.implements] = () => [html$.ImageData];
 dart.setSignature(html_common._TypedImageData, {
   constructors: () => ({new: dart.definiteFunctionType(html_common._TypedImageData, [typed_data.Uint8ClampedList, core.int, core.int])}),
   fields: () => ({
@@ -99349,7 +99352,7 @@
 });
 html_common.convertNativeToDart_ImageData = function(nativeImageData) {
   0;
-  if (html.ImageData.is(nativeImageData)) {
+  if (html$.ImageData.is(nativeImageData)) {
     let data = nativeImageData[dartx.data];
     if (data.constructor === Array) {
       if (typeof CanvasPixelArray !== "undefined") {
@@ -99411,7 +99414,7 @@
 html_common.convertDartToNative_PrepareForStructuredClone = function(value) {
   return new html_common._StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
 };
-dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic());
+dart.fn(html_common.convertDartToNative_PrepareForStructuredClone, dynamicTodynamic$());
 html_common.convertNativeToDart_AcceptStructuredClone = function(object, opts) {
   let mustCopy = opts && 'mustCopy' in opts ? opts.mustCopy : false;
   return new html_common._AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, {mustCopy: mustCopy});
@@ -99472,39 +99475,39 @@
 html_common.isJavaScriptDate = function(value) {
   return value instanceof Date;
 };
-dart.fn(html_common.isJavaScriptDate, dynamicTobool());
+dart.fn(html_common.isJavaScriptDate, dynamicTobool$());
 html_common.isJavaScriptRegExp = function(value) {
   return value instanceof RegExp;
 };
-dart.fn(html_common.isJavaScriptRegExp, dynamicTobool());
+dart.fn(html_common.isJavaScriptRegExp, dynamicTobool$());
 html_common.isJavaScriptArray = function(value) {
   return value instanceof Array;
 };
-dart.fn(html_common.isJavaScriptArray, dynamicTobool());
+dart.fn(html_common.isJavaScriptArray, dynamicTobool$());
 html_common.isJavaScriptSimpleObject = function(value) {
   let proto = Object.getPrototypeOf(value);
   return proto === Object.prototype || proto === null;
 };
-dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool());
+dart.fn(html_common.isJavaScriptSimpleObject, dynamicTobool$());
 html_common.isImmutableJavaScriptArray = function(value) {
   return !!value.immutable$list;
 };
-dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool());
+dart.fn(html_common.isImmutableJavaScriptArray, dynamicTobool$());
 html_common.isJavaScriptPromise = function(value) {
   return typeof Promise != "undefined" && value instanceof Promise;
 };
-dart.fn(html_common.isJavaScriptPromise, dynamicTobool());
+dart.fn(html_common.isJavaScriptPromise, dynamicTobool$());
 html_common.convertNativePromiseToDartFuture = function(promise) {
   let completer = async.Completer.new();
-  let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid()), 1);
-  let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid()), 1);
+  let then = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.complete(result), dynamicTovoid$()), 1);
+  let error = _js_helper.convertDartClosureToJS(dynamicTovoid())(dart.fn(result => completer.completeError(result), dynamicTovoid$()), 1);
   let newPromise = promise.then(then).catch(error);
   return completer.future;
 };
 dart.fn(html_common.convertNativePromiseToDartFuture, dynamicToFuture());
 html_common.Device = class Device extends core.Object {
   static get userAgent() {
-    return html.window[dartx.navigator][dartx.userAgent];
+    return html$.window[dartx.navigator][dartx.userAgent];
   }
   static get isOpera() {
     if (html_common.Device._isOpera == null) {
@@ -99560,8 +99563,8 @@
   }
   static isEventTypeSupported(eventType) {
     try {
-      let e = html.Event.eventType(eventType, '');
-      return html.Event.is(e);
+      let e = html$.Event.eventType(eventType, '');
+      return html$.Event.is(e);
     } catch (_) {
     }
 
@@ -99597,18 +99600,18 @@
 html_common.Device._cachedPropertyPrefix = null;
 const _childNodes = Symbol('_childNodes');
 const _node = Symbol('_node');
-const _iterable = Symbol('_iterable');
+const _iterable$0 = Symbol('_iterable');
 const _filtered = Symbol('_filtered');
-html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html.Element) {
+html_common.FilteredElementList = class FilteredElementList extends collection.ListBase$(html$.Element) {
   new(node) {
     this[_childNodes] = node[dartx.nodes];
     this[_node] = node;
   }
-  get [_iterable]() {
-    return this[_childNodes][dartx.where](dart.fn(n => html.Element.is(n), NodeTobool()))[dartx.map](html.Element)(dart.fn(n => html.Element.as(n), NodeToElement()));
+  get [_iterable$0]() {
+    return this[_childNodes][dartx.where](dart.fn(n => html$.Element.is(n), NodeTobool$()))[dartx.map](html$.Element)(dart.fn(n => html$.Element.as(n), NodeToElement()));
   }
   get [_filtered]() {
-    return ListOfElement().from(this[_iterable], {growable: false});
+    return ListOfElement().from(this[_iterable$0], {growable: false});
   }
   forEach(f) {
     this[_filtered][dartx.forEach](f);
@@ -99635,8 +99638,8 @@
     }
   }
   contains(needle) {
-    if (!html.Element.is(needle)) return false;
-    let element = html.Element._check(needle);
+    if (!html$.Element.is(needle)) return false;
+    let element = html$.Element._check(needle);
     return dart.equals(element[dartx.parentNode], this[_node]);
   }
   get reversed() {
@@ -99658,13 +99661,13 @@
     dart.throw(new core.UnsupportedError('Cannot replaceRange on filtered list'));
   }
   removeRange(start, end) {
-    core.List.from(this[_iterable][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid()));
+    core.List.from(this[_iterable$0][dartx.skip](start)[dartx.take](dart.notNull(end) - dart.notNull(start)))[dartx.forEach](dart.fn(el => dart.dsend(el, 'remove'), dynamicTovoid$()));
   }
   clear() {
     this[_childNodes][dartx.clear]();
   }
   removeLast() {
-    let result = this[_iterable][dartx.last];
+    let result = this[_iterable$0][dartx.last];
     if (result != null) {
       result[dartx.remove]();
     }
@@ -99674,7 +99677,7 @@
     if (index == this.length) {
       this.add(value);
     } else {
-      let element = this[_iterable][dartx.elementAt](index);
+      let element = this[_iterable$0][dartx.elementAt](index);
       element[dartx.parentNode][dartx.insertBefore](value, element);
     }
   }
@@ -99682,7 +99685,7 @@
     if (index == this.length) {
       this.addAll(iterable);
     } else {
-      let element = this[_iterable][dartx.elementAt](index);
+      let element = this[_iterable$0][dartx.elementAt](index);
       element[dartx.parentNode][dartx.insertAllBefore](iterable, element);
     }
   }
@@ -99692,19 +99695,19 @@
     return result;
   }
   remove(element) {
-    if (!html.Element.is(element)) return false;
+    if (!html$.Element.is(element)) return false;
     if (dart.test(this.contains(element))) {
-      html.Element.as(element)[dartx.remove]();
+      html$.Element.as(element)[dartx.remove]();
       return true;
     } else {
       return false;
     }
   }
   get length() {
-    return this[_iterable][dartx.length];
+    return this[_iterable$0][dartx.length];
   }
   _get(index) {
-    return this[_iterable][dartx.elementAt](index);
+    return this[_iterable$0][dartx.elementAt](index);
   }
   get iterator() {
     return this[_filtered][dartx.iterator];
@@ -99716,21 +99719,21 @@
 dart.addSimpleTypeTests(html_common.FilteredElementList);
 html_common.FilteredElementList[dart.implements] = () => [html_common.NodeListWrapper];
 dart.setSignature(html_common.FilteredElementList, {
-  constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html.Node])}),
+  constructors: () => ({new: dart.definiteFunctionType(html_common.FilteredElementList, [html$.Node])}),
   fields: () => ({
-    [_node]: html.Node,
+    [_node]: html$.Node,
     [_childNodes]: ListOfNode()
   }),
   getters: () => ({
-    [_iterable]: dart.definiteFunctionType(core.Iterable$(html.Element), []),
-    [_filtered]: dart.definiteFunctionType(core.List$(html.Element), []),
+    [_iterable$0]: dart.definiteFunctionType(core.Iterable$(html$.Element), []),
+    [_filtered]: dart.definiteFunctionType(core.List$(html$.Element), []),
     length: dart.definiteFunctionType(core.int, []),
-    rawList: dart.definiteFunctionType(core.List$(html.Node), [])
+    rawList: dart.definiteFunctionType(core.List$(html$.Node), [])
   }),
   setters: () => ({length: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    _set: dart.definiteFunctionType(dart.void, [core.int, html.Element]),
-    _get: dart.definiteFunctionType(html.Element, [core.int])
+    _set: dart.definiteFunctionType(dart.void, [core.int, html$.Element]),
+    _get: dart.definiteFunctionType(html$.Element, [core.int])
   })
 });
 dart.defineExtensionMembers(html_common.FilteredElementList, [
@@ -99804,17 +99807,17 @@
   names: ['indexOf', 'lastIndexOf', 'getRange']
 });
 html_common.NodeListWrapper = class NodeListWrapper extends core.Object {};
-svg._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
+svg$._SvgElementFactoryProvider = class _SvgElementFactoryProvider extends core.Object {
   static createSvgElement_tag(tag) {
-    let temp = html.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
-    return svg.SvgElement._check(temp);
+    let temp = html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag);
+    return svg$.SvgElement._check(temp);
   }
 };
-dart.setSignature(svg._SvgElementFactoryProvider, {
-  statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg.SvgElement, [core.String])}),
+dart.setSignature(svg$._SvgElementFactoryProvider, {
+  statics: () => ({createSvgElement_tag: dart.definiteFunctionType(svg$.SvgElement, [core.String])}),
   names: ['createSvgElement_tag']
 });
-const _children = Symbol('_children');
+const _children$ = Symbol('_children');
 const _svgClassName = Symbol('_svgClassName');
 dart.defineExtensionNames([
   'classes',
@@ -99886,29 +99889,29 @@
   'ownerSvgElement',
   'viewportElement'
 ]);
-svg.SvgElement = class SvgElement extends html.Element {
+svg$.SvgElement = class SvgElement extends html$.Element {
   static tag(tag) {
-    return svg.SvgElement._check(html.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
+    return svg$.SvgElement._check(html$.document[dartx.createElementNS]("http://www.w3.org/2000/svg", tag));
   }
   static svg(svg, opts) {
     let validator = opts && 'validator' in opts ? opts.validator : null;
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
     if (validator == null && treeSanitizer == null) {
-      validator = new html.NodeValidatorBuilder.common();
+      validator = new html$.NodeValidatorBuilder.common();
       validator.allowSvg();
     }
-    let match = svg.SvgElement._START_TAG_REGEXP.firstMatch(svg);
+    let match = svg$.SvgElement._START_TAG_REGEXP.firstMatch(svg);
     let parentElement = null;
     if (match != null && match.group(1)[dartx.toLowerCase]() == 'svg') {
-      parentElement = html.document[dartx.body];
+      parentElement = html$.document[dartx.body];
     } else {
-      parentElement = svg.SvgSvgElement.new();
+      parentElement = svg$.SvgSvgElement.new();
     }
     let fragment = dart.dsend(parentElement, 'createFragment', svg, {validator: validator, treeSanitizer: treeSanitizer});
-    return svg.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg.SvgElement.is(e), dynamicTobool())), 'single'));
+    return svg$.SvgElement._check(dart.dload(dart.dsend(dart.dload(fragment, 'nodes'), 'where', dart.fn(e => svg$.SvgElement.is(e), dynamicTobool$())), 'single'));
   }
   get [dartx.classes]() {
-    return new svg._AttributeClassSet(this);
+    return new svg$._AttributeClassSet(this);
   }
   set [dartx.classes](value) {
     super[dartx.classes] = value;
@@ -99922,14 +99925,14 @@
     children[dartx.addAll](value);
   }
   get [dartx.outerHtml]() {
-    let container = html.Element.tag("div");
-    let cloned = svg.SvgElement._check(this[dartx.clone](true));
+    let container = html$.Element.tag("div");
+    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
     container[dartx.children][dartx.add](cloned);
     return container[dartx.innerHtml];
   }
   get [dartx.innerHtml]() {
-    let container = html.Element.tag("div");
-    let cloned = svg.SvgElement._check(this[dartx.clone](true));
+    let container = html$.Element.tag("div");
+    let cloned = svg$.SvgElement._check(this[dartx.clone](true));
     container[dartx.children][dartx.addAll](cloned[dartx.children]);
     return container[dartx.innerHtml];
   }
@@ -99941,14 +99944,14 @@
     let treeSanitizer = opts && 'treeSanitizer' in opts ? opts.treeSanitizer : null;
     if (treeSanitizer == null) {
       if (validator == null) {
-        validator = new html.NodeValidatorBuilder.common();
+        validator = new html$.NodeValidatorBuilder.common();
         validator.allowSvg();
       }
-      treeSanitizer = html.NodeTreeSanitizer.new(validator);
+      treeSanitizer = html$.NodeTreeSanitizer.new(validator);
     }
     let html = dart.str`<svg version="1.1">${svg}</svg>`;
-    let fragment = html.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
-    let svgFragment = html.DocumentFragment.new();
+    let fragment = html$.document[dartx.body][dartx.createFragment](html, {treeSanitizer: treeSanitizer});
+    let svgFragment = html$.DocumentFragment.new();
     let root = fragment[dartx.nodes][dartx.single];
     while (root[dartx.firstChild] != null) {
       svgFragment[dartx.append](root[dartx.firstChild]);
@@ -99966,7 +99969,7 @@
   [dartx.insertAdjacentElement](where, element) {
     dart.throw(new core.UnsupportedError("Cannot invoke insertAdjacentElement on SVG."));
   }
-  get [_children]() {
+  get [_children$]() {
     dart.throw(new core.UnsupportedError("Cannot get _children on SVG."));
   }
   get [dartx.isContentEditable]() {
@@ -99976,8 +99979,8 @@
     dart.throw(new core.UnsupportedError("Cannot invoke click SVG."));
   }
   static isTagSupported(tag) {
-    let e = svg.SvgElement.tag(tag);
-    return svg.SvgElement.is(e) && !html.UnknownElement.is(e);
+    let e = svg$.SvgElement.tag(tag);
+    return svg$.SvgElement.is(e) && !html$.UnknownElement.is(e);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -100003,178 +100006,178 @@
     return this.focus.apply(this, args);
   }
   get [dartx.onAbort]() {
-    return svg.SvgElement.abortEvent.forElement(this);
+    return svg$.SvgElement.abortEvent.forElement(this);
   }
   get [dartx.onBlur]() {
-    return svg.SvgElement.blurEvent.forElement(this);
+    return svg$.SvgElement.blurEvent.forElement(this);
   }
   get [dartx.onCanPlay]() {
-    return svg.SvgElement.canPlayEvent.forElement(this);
+    return svg$.SvgElement.canPlayEvent.forElement(this);
   }
   get [dartx.onCanPlayThrough]() {
-    return svg.SvgElement.canPlayThroughEvent.forElement(this);
+    return svg$.SvgElement.canPlayThroughEvent.forElement(this);
   }
   get [dartx.onChange]() {
-    return svg.SvgElement.changeEvent.forElement(this);
+    return svg$.SvgElement.changeEvent.forElement(this);
   }
   get [dartx.onClick]() {
-    return svg.SvgElement.clickEvent.forElement(this);
+    return svg$.SvgElement.clickEvent.forElement(this);
   }
   get [dartx.onContextMenu]() {
-    return svg.SvgElement.contextMenuEvent.forElement(this);
+    return svg$.SvgElement.contextMenuEvent.forElement(this);
   }
   get [dartx.onDoubleClick]() {
-    return svg.SvgElement.doubleClickEvent.forElement(this);
+    return svg$.SvgElement.doubleClickEvent.forElement(this);
   }
   get [dartx.onDrag]() {
-    return svg.SvgElement.dragEvent.forElement(this);
+    return svg$.SvgElement.dragEvent.forElement(this);
   }
   get [dartx.onDragEnd]() {
-    return svg.SvgElement.dragEndEvent.forElement(this);
+    return svg$.SvgElement.dragEndEvent.forElement(this);
   }
   get [dartx.onDragEnter]() {
-    return svg.SvgElement.dragEnterEvent.forElement(this);
+    return svg$.SvgElement.dragEnterEvent.forElement(this);
   }
   get [dartx.onDragLeave]() {
-    return svg.SvgElement.dragLeaveEvent.forElement(this);
+    return svg$.SvgElement.dragLeaveEvent.forElement(this);
   }
   get [dartx.onDragOver]() {
-    return svg.SvgElement.dragOverEvent.forElement(this);
+    return svg$.SvgElement.dragOverEvent.forElement(this);
   }
   get [dartx.onDragStart]() {
-    return svg.SvgElement.dragStartEvent.forElement(this);
+    return svg$.SvgElement.dragStartEvent.forElement(this);
   }
   get [dartx.onDrop]() {
-    return svg.SvgElement.dropEvent.forElement(this);
+    return svg$.SvgElement.dropEvent.forElement(this);
   }
   get [dartx.onDurationChange]() {
-    return svg.SvgElement.durationChangeEvent.forElement(this);
+    return svg$.SvgElement.durationChangeEvent.forElement(this);
   }
   get [dartx.onEmptied]() {
-    return svg.SvgElement.emptiedEvent.forElement(this);
+    return svg$.SvgElement.emptiedEvent.forElement(this);
   }
   get [dartx.onEnded]() {
-    return svg.SvgElement.endedEvent.forElement(this);
+    return svg$.SvgElement.endedEvent.forElement(this);
   }
   get [dartx.onError]() {
-    return svg.SvgElement.errorEvent.forElement(this);
+    return svg$.SvgElement.errorEvent.forElement(this);
   }
   get [dartx.onFocus]() {
-    return svg.SvgElement.focusEvent.forElement(this);
+    return svg$.SvgElement.focusEvent.forElement(this);
   }
   get [dartx.onInput]() {
-    return svg.SvgElement.inputEvent.forElement(this);
+    return svg$.SvgElement.inputEvent.forElement(this);
   }
   get [dartx.onInvalid]() {
-    return svg.SvgElement.invalidEvent.forElement(this);
+    return svg$.SvgElement.invalidEvent.forElement(this);
   }
   get [dartx.onKeyDown]() {
-    return svg.SvgElement.keyDownEvent.forElement(this);
+    return svg$.SvgElement.keyDownEvent.forElement(this);
   }
   get [dartx.onKeyPress]() {
-    return svg.SvgElement.keyPressEvent.forElement(this);
+    return svg$.SvgElement.keyPressEvent.forElement(this);
   }
   get [dartx.onKeyUp]() {
-    return svg.SvgElement.keyUpEvent.forElement(this);
+    return svg$.SvgElement.keyUpEvent.forElement(this);
   }
   get [dartx.onLoad]() {
-    return svg.SvgElement.loadEvent.forElement(this);
+    return svg$.SvgElement.loadEvent.forElement(this);
   }
   get [dartx.onLoadedData]() {
-    return svg.SvgElement.loadedDataEvent.forElement(this);
+    return svg$.SvgElement.loadedDataEvent.forElement(this);
   }
   get [dartx.onLoadedMetadata]() {
-    return svg.SvgElement.loadedMetadataEvent.forElement(this);
+    return svg$.SvgElement.loadedMetadataEvent.forElement(this);
   }
   get [dartx.onMouseDown]() {
-    return svg.SvgElement.mouseDownEvent.forElement(this);
+    return svg$.SvgElement.mouseDownEvent.forElement(this);
   }
   get [dartx.onMouseEnter]() {
-    return svg.SvgElement.mouseEnterEvent.forElement(this);
+    return svg$.SvgElement.mouseEnterEvent.forElement(this);
   }
   get [dartx.onMouseLeave]() {
-    return svg.SvgElement.mouseLeaveEvent.forElement(this);
+    return svg$.SvgElement.mouseLeaveEvent.forElement(this);
   }
   get [dartx.onMouseMove]() {
-    return svg.SvgElement.mouseMoveEvent.forElement(this);
+    return svg$.SvgElement.mouseMoveEvent.forElement(this);
   }
   get [dartx.onMouseOut]() {
-    return svg.SvgElement.mouseOutEvent.forElement(this);
+    return svg$.SvgElement.mouseOutEvent.forElement(this);
   }
   get [dartx.onMouseOver]() {
-    return svg.SvgElement.mouseOverEvent.forElement(this);
+    return svg$.SvgElement.mouseOverEvent.forElement(this);
   }
   get [dartx.onMouseUp]() {
-    return svg.SvgElement.mouseUpEvent.forElement(this);
+    return svg$.SvgElement.mouseUpEvent.forElement(this);
   }
   get [dartx.onMouseWheel]() {
-    return svg.SvgElement.mouseWheelEvent.forElement(this);
+    return svg$.SvgElement.mouseWheelEvent.forElement(this);
   }
   get [dartx.onPause]() {
-    return svg.SvgElement.pauseEvent.forElement(this);
+    return svg$.SvgElement.pauseEvent.forElement(this);
   }
   get [dartx.onPlay]() {
-    return svg.SvgElement.playEvent.forElement(this);
+    return svg$.SvgElement.playEvent.forElement(this);
   }
   get [dartx.onPlaying]() {
-    return svg.SvgElement.playingEvent.forElement(this);
+    return svg$.SvgElement.playingEvent.forElement(this);
   }
   get [dartx.onRateChange]() {
-    return svg.SvgElement.rateChangeEvent.forElement(this);
+    return svg$.SvgElement.rateChangeEvent.forElement(this);
   }
   get [dartx.onReset]() {
-    return svg.SvgElement.resetEvent.forElement(this);
+    return svg$.SvgElement.resetEvent.forElement(this);
   }
   get [dartx.onResize]() {
-    return svg.SvgElement.resizeEvent.forElement(this);
+    return svg$.SvgElement.resizeEvent.forElement(this);
   }
   get [dartx.onScroll]() {
-    return svg.SvgElement.scrollEvent.forElement(this);
+    return svg$.SvgElement.scrollEvent.forElement(this);
   }
   get [dartx.onSeeked]() {
-    return svg.SvgElement.seekedEvent.forElement(this);
+    return svg$.SvgElement.seekedEvent.forElement(this);
   }
   get [dartx.onSeeking]() {
-    return svg.SvgElement.seekingEvent.forElement(this);
+    return svg$.SvgElement.seekingEvent.forElement(this);
   }
   get [dartx.onSelect]() {
-    return svg.SvgElement.selectEvent.forElement(this);
+    return svg$.SvgElement.selectEvent.forElement(this);
   }
   get [dartx.onStalled]() {
-    return svg.SvgElement.stalledEvent.forElement(this);
+    return svg$.SvgElement.stalledEvent.forElement(this);
   }
   get [dartx.onSubmit]() {
-    return svg.SvgElement.submitEvent.forElement(this);
+    return svg$.SvgElement.submitEvent.forElement(this);
   }
   get [dartx.onSuspend]() {
-    return svg.SvgElement.suspendEvent.forElement(this);
+    return svg$.SvgElement.suspendEvent.forElement(this);
   }
   get [dartx.onTimeUpdate]() {
-    return svg.SvgElement.timeUpdateEvent.forElement(this);
+    return svg$.SvgElement.timeUpdateEvent.forElement(this);
   }
   get [dartx.onVolumeChange]() {
-    return svg.SvgElement.volumeChangeEvent.forElement(this);
+    return svg$.SvgElement.volumeChangeEvent.forElement(this);
   }
   get [dartx.onWaiting]() {
-    return svg.SvgElement.waitingEvent.forElement(this);
+    return svg$.SvgElement.waitingEvent.forElement(this);
   }
 };
-dart.defineNamedConstructor(svg.SvgElement, 'created');
-svg.SvgElement[dart.implements] = () => [html.GlobalEventHandlers];
-dart.setSignature(svg.SvgElement, {
+dart.defineNamedConstructor(svg$.SvgElement, 'created');
+svg$.SvgElement[dart.implements] = () => [html$.GlobalEventHandlers];
+dart.setSignature(svg$.SvgElement, {
   constructors: () => ({
-    tag: dart.definiteFunctionType(svg.SvgElement, [core.String]),
-    svg: dart.definiteFunctionType(svg.SvgElement, [core.String], {validator: html.NodeValidator, treeSanitizer: html.NodeTreeSanitizer}),
-    _: dart.definiteFunctionType(svg.SvgElement, []),
-    created: dart.definiteFunctionType(svg.SvgElement, [])
+    tag: dart.definiteFunctionType(svg$.SvgElement, [core.String]),
+    svg: dart.definiteFunctionType(svg$.SvgElement, [core.String], {validator: html$.NodeValidator, treeSanitizer: html$.NodeTreeSanitizer}),
+    _: dart.definiteFunctionType(svg$.SvgElement, []),
+    created: dart.definiteFunctionType(svg$.SvgElement, [])
   }),
   fields: () => ({
-    [dartx.ownerSvgElement]: svg.SvgSvgElement,
-    [dartx.viewportElement]: svg.SvgElement
+    [dartx.ownerSvgElement]: svg$.SvgSvgElement,
+    [dartx.viewportElement]: svg$.SvgElement
   }),
   getters: () => ({
-    [_children]: dart.definiteFunctionType(html.HtmlCollection, []),
-    [_svgClassName]: dart.definiteFunctionType(svg.AnimatedString, [])
+    [_children$]: dart.definiteFunctionType(html$.HtmlCollection, []),
+    [_svgClassName]: dart.definiteFunctionType(svg$.AnimatedString, [])
   }),
   sfields: () => ({
     _START_TAG_REGEXP: core.RegExp,
@@ -100232,7 +100235,7 @@
     waitingEvent: EventStreamProviderOfEvent()
   })
 });
-dart.defineLazy(svg.SvgElement, {
+dart.defineLazy(svg$.SvgElement, {
   get _START_TAG_REGEXP() {
     return core.RegExp.new('<(\\w+)');
   },
@@ -100393,7 +100396,7 @@
     return dart.const(new (EventStreamProviderOfEvent())('waiting'));
   }
 });
-dart.registerExtension(dart.global.SVGElement, svg.SvgElement);
+dart.registerExtension(dart.global.SVGElement, svg$.SvgElement);
 dart.defineExtensionNames([
   'getBBox',
   'getCtm',
@@ -100407,7 +100410,7 @@
   'requiredFeatures',
   'systemLanguage'
 ]);
-svg.GraphicsElement = class GraphicsElement extends svg.SvgElement {
+svg$.GraphicsElement = class GraphicsElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100454,40 +100457,40 @@
     return this.hasExtension.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.GraphicsElement, 'created');
-svg.GraphicsElement[dart.implements] = () => [svg.Tests];
-dart.setSignature(svg.GraphicsElement, {
+dart.defineNamedConstructor(svg$.GraphicsElement, 'created');
+svg$.GraphicsElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.GraphicsElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.GraphicsElement, []),
-    created: dart.definiteFunctionType(svg.GraphicsElement, [])
+    _: dart.definiteFunctionType(svg$.GraphicsElement, []),
+    created: dart.definiteFunctionType(svg$.GraphicsElement, [])
   }),
   fields: () => ({
-    [dartx.farthestViewportElement]: svg.SvgElement,
-    [dartx.nearestViewportElement]: svg.SvgElement,
-    [dartx.transform]: svg.AnimatedTransformList,
-    [dartx.requiredExtensions]: svg.StringList,
-    [dartx.requiredFeatures]: svg.StringList,
-    [dartx.systemLanguage]: svg.StringList
+    [dartx.farthestViewportElement]: svg$.SvgElement,
+    [dartx.nearestViewportElement]: svg$.SvgElement,
+    [dartx.transform]: svg$.AnimatedTransformList,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
   }),
   methods: () => ({
-    [dartx.getBBox]: dart.definiteFunctionType(svg.Rect, []),
-    [dartx.getCtm]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.getScreenCtm]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.getTransformToElement]: dart.definiteFunctionType(svg.Matrix, [svg.SvgElement]),
+    [dartx.getBBox]: dart.definiteFunctionType(svg$.Rect, []),
+    [dartx.getCtm]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.getScreenCtm]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.getTransformToElement]: dart.definiteFunctionType(svg$.Matrix, [svg$.SvgElement]),
     [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
   })
 });
-dart.registerExtension(dart.global.SVGGraphicsElement, svg.GraphicsElement);
+dart.registerExtension(dart.global.SVGGraphicsElement, svg$.GraphicsElement);
 dart.defineExtensionNames([
   'target',
   'href'
 ]);
-svg.AElement = class AElement extends svg.GraphicsElement {
+svg$.AElement = class AElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.AElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("a"));
+    return svg$.AElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("a"));
   }
   created() {
     this[dartx.target] = null;
@@ -100501,20 +100504,20 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.AElement, 'created');
-svg.AElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.AElement, {
+dart.defineNamedConstructor(svg$.AElement, 'created');
+svg$.AElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.AElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.AElement, []),
-    new: dart.definiteFunctionType(svg.AElement, []),
-    created: dart.definiteFunctionType(svg.AElement, [])
+    _: dart.definiteFunctionType(svg$.AElement, []),
+    new: dart.definiteFunctionType(svg$.AElement, []),
+    created: dart.definiteFunctionType(svg$.AElement, [])
   }),
   fields: () => ({
-    [dartx.target]: svg.AnimatedString,
-    [dartx.href]: svg.AnimatedString
+    [dartx.target]: svg$.AnimatedString,
+    [dartx.href]: svg$.AnimatedString
   })
 });
-dart.registerExtension(dart.global.SVGAElement, svg.AElement);
+dart.registerExtension(dart.global.SVGAElement, svg$.AElement);
 dart.defineExtensionNames([
   'convertToSpecifiedUnits',
   'newValueSpecifiedUnits',
@@ -100523,7 +100526,7 @@
   'valueAsString',
   'valueInSpecifiedUnits'
 ]);
-svg.Angle = class Angle extends _interceptors.Interceptor {
+svg$.Angle = class Angle extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100555,8 +100558,8 @@
     return this.newValueSpecifiedUnits.apply(this, args);
   }
 };
-dart.setSignature(svg.Angle, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Angle, [])}),
+dart.setSignature(svg$.Angle, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Angle, [])}),
   fields: () => ({
     [dartx.unitType]: core.int,
     [dartx.value]: core.num,
@@ -100575,12 +100578,12 @@
     SVG_ANGLETYPE_UNSPECIFIED: core.int
   })
 });
-svg.Angle.SVG_ANGLETYPE_DEG = 2;
-svg.Angle.SVG_ANGLETYPE_GRAD = 4;
-svg.Angle.SVG_ANGLETYPE_RAD = 3;
-svg.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
-svg.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
-dart.registerExtension(dart.global.SVGAngle, svg.Angle);
+svg$.Angle.SVG_ANGLETYPE_DEG = 2;
+svg$.Angle.SVG_ANGLETYPE_GRAD = 4;
+svg$.Angle.SVG_ANGLETYPE_RAD = 3;
+svg$.Angle.SVG_ANGLETYPE_UNKNOWN = 0;
+svg$.Angle.SVG_ANGLETYPE_UNSPECIFIED = 1;
+dart.registerExtension(dart.global.SVGAngle, svg$.Angle);
 dart.defineExtensionNames([
   'beginElement',
   'beginElementAt',
@@ -100595,12 +100598,12 @@
   'requiredFeatures',
   'systemLanguage'
 ]);
-svg.AnimationElement = class AnimationElement extends svg.SvgElement {
+svg$.AnimationElement = class AnimationElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.AnimationElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("animation"));
+    return svg$.AnimationElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animation"));
   }
   created() {
     this[dartx.targetElement] = null;
@@ -100646,19 +100649,19 @@
     return this.hasExtension.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.AnimationElement, 'created');
-svg.AnimationElement[dart.implements] = () => [svg.Tests];
-dart.setSignature(svg.AnimationElement, {
+dart.defineNamedConstructor(svg$.AnimationElement, 'created');
+svg$.AnimationElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.AnimationElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.AnimationElement, []),
-    new: dart.definiteFunctionType(svg.AnimationElement, []),
-    created: dart.definiteFunctionType(svg.AnimationElement, [])
+    _: dart.definiteFunctionType(svg$.AnimationElement, []),
+    new: dart.definiteFunctionType(svg$.AnimationElement, []),
+    created: dart.definiteFunctionType(svg$.AnimationElement, [])
   }),
   fields: () => ({
-    [dartx.targetElement]: svg.SvgElement,
-    [dartx.requiredExtensions]: svg.StringList,
-    [dartx.requiredFeatures]: svg.StringList,
-    [dartx.systemLanguage]: svg.StringList
+    [dartx.targetElement]: svg$.SvgElement,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
   }),
   methods: () => ({
     [dartx.beginElement]: dart.definiteFunctionType(dart.void, []),
@@ -100671,84 +100674,84 @@
     [dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])
   })
 });
-dart.registerExtension(dart.global.SVGAnimationElement, svg.AnimationElement);
-svg.AnimateElement = class AnimateElement extends svg.AnimationElement {
+dart.registerExtension(dart.global.SVGAnimationElement, svg$.AnimationElement);
+svg$.AnimateElement = class AnimateElement extends svg$.AnimationElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.AnimateElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("animate"));
+    return svg$.AnimateElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animate"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('animate')) && svg.AnimateElement.is(svg.SvgElement.tag('animate'));
+    return dart.test(svg$.SvgElement.isTagSupported('animate')) && svg$.AnimateElement.is(svg$.SvgElement.tag('animate'));
   }
 };
-dart.defineNamedConstructor(svg.AnimateElement, 'created');
-dart.setSignature(svg.AnimateElement, {
+dart.defineNamedConstructor(svg$.AnimateElement, 'created');
+dart.setSignature(svg$.AnimateElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.AnimateElement, []),
-    new: dart.definiteFunctionType(svg.AnimateElement, []),
-    created: dart.definiteFunctionType(svg.AnimateElement, [])
+    _: dart.definiteFunctionType(svg$.AnimateElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGAnimateElement, svg.AnimateElement);
-svg.AnimateMotionElement = class AnimateMotionElement extends svg.AnimationElement {
+dart.registerExtension(dart.global.SVGAnimateElement, svg$.AnimateElement);
+svg$.AnimateMotionElement = class AnimateMotionElement extends svg$.AnimationElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.AnimateMotionElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
+    return svg$.AnimateMotionElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateMotion"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('animateMotion')) && svg.AnimateMotionElement.is(svg.SvgElement.tag('animateMotion'));
+    return dart.test(svg$.SvgElement.isTagSupported('animateMotion')) && svg$.AnimateMotionElement.is(svg$.SvgElement.tag('animateMotion'));
   }
 };
-dart.defineNamedConstructor(svg.AnimateMotionElement, 'created');
-dart.setSignature(svg.AnimateMotionElement, {
+dart.defineNamedConstructor(svg$.AnimateMotionElement, 'created');
+dart.setSignature(svg$.AnimateMotionElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.AnimateMotionElement, []),
-    new: dart.definiteFunctionType(svg.AnimateMotionElement, []),
-    created: dart.definiteFunctionType(svg.AnimateMotionElement, [])
+    _: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateMotionElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateMotionElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGAnimateMotionElement, svg.AnimateMotionElement);
-svg.AnimateTransformElement = class AnimateTransformElement extends svg.AnimationElement {
+dart.registerExtension(dart.global.SVGAnimateMotionElement, svg$.AnimateMotionElement);
+svg$.AnimateTransformElement = class AnimateTransformElement extends svg$.AnimationElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.AnimateTransformElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
+    return svg$.AnimateTransformElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("animateTransform"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('animateTransform')) && svg.AnimateTransformElement.is(svg.SvgElement.tag('animateTransform'));
+    return dart.test(svg$.SvgElement.isTagSupported('animateTransform')) && svg$.AnimateTransformElement.is(svg$.SvgElement.tag('animateTransform'));
   }
 };
-dart.defineNamedConstructor(svg.AnimateTransformElement, 'created');
-dart.setSignature(svg.AnimateTransformElement, {
+dart.defineNamedConstructor(svg$.AnimateTransformElement, 'created');
+dart.setSignature(svg$.AnimateTransformElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.AnimateTransformElement, []),
-    new: dart.definiteFunctionType(svg.AnimateTransformElement, []),
-    created: dart.definiteFunctionType(svg.AnimateTransformElement, [])
+    _: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
+    new: dart.definiteFunctionType(svg$.AnimateTransformElement, []),
+    created: dart.definiteFunctionType(svg$.AnimateTransformElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGAnimateTransformElement, svg.AnimateTransformElement);
+dart.registerExtension(dart.global.SVGAnimateTransformElement, svg$.AnimateTransformElement);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
+svg$.AnimatedAngle = class AnimatedAngle extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100759,19 +100762,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedAngle, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedAngle, [])}),
+dart.setSignature(svg$.AnimatedAngle, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedAngle, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.Angle,
-    [dartx.baseVal]: svg.Angle
+    [dartx.animVal]: svg$.Angle,
+    [dartx.baseVal]: svg$.Angle
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedAngle, svg.AnimatedAngle);
+dart.registerExtension(dart.global.SVGAnimatedAngle, svg$.AnimatedAngle);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
+svg$.AnimatedBoolean = class AnimatedBoolean extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100785,19 +100788,19 @@
     this.baseVal = value;
   }
 };
-dart.setSignature(svg.AnimatedBoolean, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedBoolean, [])}),
+dart.setSignature(svg$.AnimatedBoolean, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedBoolean, [])}),
   fields: () => ({
     [dartx.animVal]: core.bool,
     [dartx.baseVal]: core.bool
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedBoolean, svg.AnimatedBoolean);
+dart.registerExtension(dart.global.SVGAnimatedBoolean, svg$.AnimatedBoolean);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
+svg$.AnimatedEnumeration = class AnimatedEnumeration extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100811,19 +100814,19 @@
     this.baseVal = value;
   }
 };
-dart.setSignature(svg.AnimatedEnumeration, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedEnumeration, [])}),
+dart.setSignature(svg$.AnimatedEnumeration, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedEnumeration, [])}),
   fields: () => ({
     [dartx.animVal]: core.int,
     [dartx.baseVal]: core.int
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg.AnimatedEnumeration);
+dart.registerExtension(dart.global.SVGAnimatedEnumeration, svg$.AnimatedEnumeration);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
+svg$.AnimatedInteger = class AnimatedInteger extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100837,19 +100840,19 @@
     this.baseVal = value;
   }
 };
-dart.setSignature(svg.AnimatedInteger, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedInteger, [])}),
+dart.setSignature(svg$.AnimatedInteger, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedInteger, [])}),
   fields: () => ({
     [dartx.animVal]: core.int,
     [dartx.baseVal]: core.int
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedInteger, svg.AnimatedInteger);
+dart.registerExtension(dart.global.SVGAnimatedInteger, svg$.AnimatedInteger);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
+svg$.AnimatedLength = class AnimatedLength extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100860,19 +100863,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedLength, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedLength, [])}),
+dart.setSignature(svg$.AnimatedLength, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLength, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.Length,
-    [dartx.baseVal]: svg.Length
+    [dartx.animVal]: svg$.Length,
+    [dartx.baseVal]: svg$.Length
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedLength, svg.AnimatedLength);
+dart.registerExtension(dart.global.SVGAnimatedLength, svg$.AnimatedLength);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
+svg$.AnimatedLengthList = class AnimatedLengthList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100883,19 +100886,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedLengthList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedLengthList, [])}),
+dart.setSignature(svg$.AnimatedLengthList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedLengthList, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.LengthList,
-    [dartx.baseVal]: svg.LengthList
+    [dartx.animVal]: svg$.LengthList,
+    [dartx.baseVal]: svg$.LengthList
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedLengthList, svg.AnimatedLengthList);
+dart.registerExtension(dart.global.SVGAnimatedLengthList, svg$.AnimatedLengthList);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
+svg$.AnimatedNumber = class AnimatedNumber extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100909,19 +100912,19 @@
     this.baseVal = value;
   }
 };
-dart.setSignature(svg.AnimatedNumber, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedNumber, [])}),
+dart.setSignature(svg$.AnimatedNumber, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumber, [])}),
   fields: () => ({
     [dartx.animVal]: core.double,
     [dartx.baseVal]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedNumber, svg.AnimatedNumber);
+dart.registerExtension(dart.global.SVGAnimatedNumber, svg$.AnimatedNumber);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
+svg$.AnimatedNumberList = class AnimatedNumberList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100932,19 +100935,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedNumberList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedNumberList, [])}),
+dart.setSignature(svg$.AnimatedNumberList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedNumberList, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.NumberList,
-    [dartx.baseVal]: svg.NumberList
+    [dartx.animVal]: svg$.NumberList,
+    [dartx.baseVal]: svg$.NumberList
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedNumberList, svg.AnimatedNumberList);
+dart.registerExtension(dart.global.SVGAnimatedNumberList, svg$.AnimatedNumberList);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
+svg$.AnimatedPreserveAspectRatio = class AnimatedPreserveAspectRatio extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100955,19 +100958,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedPreserveAspectRatio, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedPreserveAspectRatio, [])}),
+dart.setSignature(svg$.AnimatedPreserveAspectRatio, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedPreserveAspectRatio, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.PreserveAspectRatio,
-    [dartx.baseVal]: svg.PreserveAspectRatio
+    [dartx.animVal]: svg$.PreserveAspectRatio,
+    [dartx.baseVal]: svg$.PreserveAspectRatio
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg.AnimatedPreserveAspectRatio);
+dart.registerExtension(dart.global.SVGAnimatedPreserveAspectRatio, svg$.AnimatedPreserveAspectRatio);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
+svg$.AnimatedRect = class AnimatedRect extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -100978,19 +100981,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedRect, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedRect, [])}),
+dart.setSignature(svg$.AnimatedRect, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedRect, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.Rect,
-    [dartx.baseVal]: svg.Rect
+    [dartx.animVal]: svg$.Rect,
+    [dartx.baseVal]: svg$.Rect
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedRect, svg.AnimatedRect);
+dart.registerExtension(dart.global.SVGAnimatedRect, svg$.AnimatedRect);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
+svg$.AnimatedString = class AnimatedString extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -101004,19 +101007,19 @@
     this.baseVal = value;
   }
 };
-dart.setSignature(svg.AnimatedString, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedString, [])}),
+dart.setSignature(svg$.AnimatedString, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedString, [])}),
   fields: () => ({
     [dartx.animVal]: core.String,
     [dartx.baseVal]: core.String
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedString, svg.AnimatedString);
+dart.registerExtension(dart.global.SVGAnimatedString, svg$.AnimatedString);
 dart.defineExtensionNames([
   'animVal',
   'baseVal'
 ]);
-svg.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
+svg$.AnimatedTransformList = class AnimatedTransformList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -101027,19 +101030,19 @@
     return this.baseVal;
   }
 };
-dart.setSignature(svg.AnimatedTransformList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.AnimatedTransformList, [])}),
+dart.setSignature(svg$.AnimatedTransformList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.AnimatedTransformList, [])}),
   fields: () => ({
-    [dartx.animVal]: svg.TransformList,
-    [dartx.baseVal]: svg.TransformList
+    [dartx.animVal]: svg$.TransformList,
+    [dartx.baseVal]: svg$.TransformList
   })
 });
-dart.registerExtension(dart.global.SVGAnimatedTransformList, svg.AnimatedTransformList);
+dart.registerExtension(dart.global.SVGAnimatedTransformList, svg$.AnimatedTransformList);
 dart.defineExtensionNames([
   'isPointInFill',
   'isPointInStroke'
 ]);
-svg.GeometryElement = class GeometryElement extends svg.GraphicsElement {
+svg$.GeometryElement = class GeometryElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -101053,29 +101056,29 @@
     return this.isPointInStroke.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.GeometryElement, 'created');
-dart.setSignature(svg.GeometryElement, {
+dart.defineNamedConstructor(svg$.GeometryElement, 'created');
+dart.setSignature(svg$.GeometryElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.GeometryElement, []),
-    created: dart.definiteFunctionType(svg.GeometryElement, [])
+    _: dart.definiteFunctionType(svg$.GeometryElement, []),
+    created: dart.definiteFunctionType(svg$.GeometryElement, [])
   }),
   methods: () => ({
-    [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg.Point]),
-    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg.Point])
+    [dartx.isPointInFill]: dart.definiteFunctionType(core.bool, [svg$.Point]),
+    [dartx.isPointInStroke]: dart.definiteFunctionType(core.bool, [svg$.Point])
   })
 });
-dart.registerExtension(dart.global.SVGGeometryElement, svg.GeometryElement);
+dart.registerExtension(dart.global.SVGGeometryElement, svg$.GeometryElement);
 dart.defineExtensionNames([
   'cx',
   'cy',
   'r'
 ]);
-svg.CircleElement = class CircleElement extends svg.GeometryElement {
+svg$.CircleElement = class CircleElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.CircleElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("circle"));
+    return svg$.CircleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("circle"));
   }
   created() {
     this[dartx.cx] = null;
@@ -101093,29 +101096,29 @@
     return this.r;
   }
 };
-dart.defineNamedConstructor(svg.CircleElement, 'created');
-dart.setSignature(svg.CircleElement, {
+dart.defineNamedConstructor(svg$.CircleElement, 'created');
+dart.setSignature(svg$.CircleElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.CircleElement, []),
-    new: dart.definiteFunctionType(svg.CircleElement, []),
-    created: dart.definiteFunctionType(svg.CircleElement, [])
+    _: dart.definiteFunctionType(svg$.CircleElement, []),
+    new: dart.definiteFunctionType(svg$.CircleElement, []),
+    created: dart.definiteFunctionType(svg$.CircleElement, [])
   }),
   fields: () => ({
-    [dartx.cx]: svg.AnimatedLength,
-    [dartx.cy]: svg.AnimatedLength,
-    [dartx.r]: svg.AnimatedLength
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.r]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGCircleElement, svg.CircleElement);
+dart.registerExtension(dart.global.SVGCircleElement, svg$.CircleElement);
 dart.defineExtensionNames([
   'clipPathUnits'
 ]);
-svg.ClipPathElement = class ClipPathElement extends svg.GraphicsElement {
+svg$.ClipPathElement = class ClipPathElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.ClipPathElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
+    return svg$.ClipPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("clipPath"));
   }
   created() {
     this[dartx.clipPathUnits] = null;
@@ -101125,57 +101128,57 @@
     return this.clipPathUnits;
   }
 };
-dart.defineNamedConstructor(svg.ClipPathElement, 'created');
-dart.setSignature(svg.ClipPathElement, {
+dart.defineNamedConstructor(svg$.ClipPathElement, 'created');
+dart.setSignature(svg$.ClipPathElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.ClipPathElement, []),
-    new: dart.definiteFunctionType(svg.ClipPathElement, []),
-    created: dart.definiteFunctionType(svg.ClipPathElement, [])
+    _: dart.definiteFunctionType(svg$.ClipPathElement, []),
+    new: dart.definiteFunctionType(svg$.ClipPathElement, []),
+    created: dart.definiteFunctionType(svg$.ClipPathElement, [])
   }),
-  fields: () => ({[dartx.clipPathUnits]: svg.AnimatedEnumeration})
+  fields: () => ({[dartx.clipPathUnits]: svg$.AnimatedEnumeration})
 });
-dart.registerExtension(dart.global.SVGClipPathElement, svg.ClipPathElement);
-svg.DefsElement = class DefsElement extends svg.GraphicsElement {
+dart.registerExtension(dart.global.SVGClipPathElement, svg$.ClipPathElement);
+svg$.DefsElement = class DefsElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.DefsElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("defs"));
+    return svg$.DefsElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("defs"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.DefsElement, 'created');
-dart.setSignature(svg.DefsElement, {
+dart.defineNamedConstructor(svg$.DefsElement, 'created');
+dart.setSignature(svg$.DefsElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.DefsElement, []),
-    new: dart.definiteFunctionType(svg.DefsElement, []),
-    created: dart.definiteFunctionType(svg.DefsElement, [])
+    _: dart.definiteFunctionType(svg$.DefsElement, []),
+    new: dart.definiteFunctionType(svg$.DefsElement, []),
+    created: dart.definiteFunctionType(svg$.DefsElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGDefsElement, svg.DefsElement);
-svg.DescElement = class DescElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGDefsElement, svg$.DefsElement);
+svg$.DescElement = class DescElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.DescElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("desc"));
+    return svg$.DescElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("desc"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.DescElement, 'created');
-dart.setSignature(svg.DescElement, {
+dart.defineNamedConstructor(svg$.DescElement, 'created');
+dart.setSignature(svg$.DescElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.DescElement, []),
-    new: dart.definiteFunctionType(svg.DescElement, []),
-    created: dart.definiteFunctionType(svg.DescElement, [])
+    _: dart.definiteFunctionType(svg$.DescElement, []),
+    new: dart.definiteFunctionType(svg$.DescElement, []),
+    created: dart.definiteFunctionType(svg$.DescElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGDescElement, svg.DescElement);
-svg.DiscardElement = class DiscardElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGDescElement, svg$.DescElement);
+svg$.DiscardElement = class DiscardElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -101183,26 +101186,26 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.DiscardElement, 'created');
-dart.setSignature(svg.DiscardElement, {
+dart.defineNamedConstructor(svg$.DiscardElement, 'created');
+dart.setSignature(svg$.DiscardElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.DiscardElement, []),
-    created: dart.definiteFunctionType(svg.DiscardElement, [])
+    _: dart.definiteFunctionType(svg$.DiscardElement, []),
+    created: dart.definiteFunctionType(svg$.DiscardElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGDiscardElement, svg.DiscardElement);
+dart.registerExtension(dart.global.SVGDiscardElement, svg$.DiscardElement);
 dart.defineExtensionNames([
   'cx',
   'cy',
   'rx',
   'ry'
 ]);
-svg.EllipseElement = class EllipseElement extends svg.GeometryElement {
+svg$.EllipseElement = class EllipseElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.EllipseElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
+    return svg$.EllipseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("ellipse"));
   }
   created() {
     this[dartx.cx] = null;
@@ -101224,21 +101227,21 @@
     return this.ry;
   }
 };
-dart.defineNamedConstructor(svg.EllipseElement, 'created');
-dart.setSignature(svg.EllipseElement, {
+dart.defineNamedConstructor(svg$.EllipseElement, 'created');
+dart.setSignature(svg$.EllipseElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.EllipseElement, []),
-    new: dart.definiteFunctionType(svg.EllipseElement, []),
-    created: dart.definiteFunctionType(svg.EllipseElement, [])
+    _: dart.definiteFunctionType(svg$.EllipseElement, []),
+    new: dart.definiteFunctionType(svg$.EllipseElement, []),
+    created: dart.definiteFunctionType(svg$.EllipseElement, [])
   }),
   fields: () => ({
-    [dartx.cx]: svg.AnimatedLength,
-    [dartx.cy]: svg.AnimatedLength,
-    [dartx.rx]: svg.AnimatedLength,
-    [dartx.ry]: svg.AnimatedLength
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.rx]: svg$.AnimatedLength,
+    [dartx.ry]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGEllipseElement, svg.EllipseElement);
+dart.registerExtension(dart.global.SVGEllipseElement, svg$.EllipseElement);
 dart.defineExtensionNames([
   'in1',
   'in2',
@@ -101249,12 +101252,12 @@
   'x',
   'y'
 ]);
-svg.FEBlendElement = class FEBlendElement extends svg.SvgElement {
+svg$.FEBlendElement = class FEBlendElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEBlendElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
+    return svg$.FEBlendElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feBlend"));
   }
   created() {
     this[dartx.in1] = null;
@@ -101268,7 +101271,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feBlend')) && svg.FEBlendElement.is(svg.SvgElement.tag('feBlend'));
+    return dart.test(svg$.SvgElement.isTagSupported('feBlend')) && svg$.FEBlendElement.is(svg$.SvgElement.tag('feBlend'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -101295,23 +101298,23 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEBlendElement, 'created');
-svg.FEBlendElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEBlendElement, {
+dart.defineNamedConstructor(svg$.FEBlendElement, 'created');
+svg$.FEBlendElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEBlendElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEBlendElement, []),
-    new: dart.definiteFunctionType(svg.FEBlendElement, []),
-    created: dart.definiteFunctionType(svg.FEBlendElement, [])
+    _: dart.definiteFunctionType(svg$.FEBlendElement, []),
+    new: dart.definiteFunctionType(svg$.FEBlendElement, []),
+    created: dart.definiteFunctionType(svg$.FEBlendElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.in2]: svg.AnimatedString,
-    [dartx.mode]: svg.AnimatedEnumeration,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.mode]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_FEBLEND_MODE_DARKEN: core.int,
@@ -101323,13 +101326,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-svg.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
-svg.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
-svg.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
-svg.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
-svg.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
-svg.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGFEBlendElement, svg.FEBlendElement);
+svg$.FEBlendElement.SVG_FEBLEND_MODE_DARKEN = 4;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_LIGHTEN = 5;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_MULTIPLY = 2;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_NORMAL = 1;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_SCREEN = 3;
+svg$.FEBlendElement.SVG_FEBLEND_MODE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEBlendElement, svg$.FEBlendElement);
 dart.defineExtensionNames([
   'in1',
   'type',
@@ -101340,12 +101343,12 @@
   'x',
   'y'
 ]);
-svg.FEColorMatrixElement = class FEColorMatrixElement extends svg.SvgElement {
+svg$.FEColorMatrixElement = class FEColorMatrixElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEColorMatrixElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
+    return svg$.FEColorMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix"));
   }
   created() {
     this[dartx.in1] = null;
@@ -101359,7 +101362,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feColorMatrix')) && svg.FEColorMatrixElement.is(svg.SvgElement.tag('feColorMatrix'));
+    return dart.test(svg$.SvgElement.isTagSupported('feColorMatrix')) && svg$.FEColorMatrixElement.is(svg$.SvgElement.tag('feColorMatrix'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -101386,23 +101389,23 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEColorMatrixElement, 'created');
-svg.FEColorMatrixElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEColorMatrixElement, {
+dart.defineNamedConstructor(svg$.FEColorMatrixElement, 'created');
+svg$.FEColorMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEColorMatrixElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEColorMatrixElement, []),
-    new: dart.definiteFunctionType(svg.FEColorMatrixElement, []),
-    created: dart.definiteFunctionType(svg.FEColorMatrixElement, [])
+    _: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
+    new: dart.definiteFunctionType(svg$.FEColorMatrixElement, []),
+    created: dart.definiteFunctionType(svg$.FEColorMatrixElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.type]: svg.AnimatedEnumeration,
-    [dartx.values]: svg.AnimatedNumberList,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.type]: svg$.AnimatedEnumeration,
+    [dartx.values]: svg$.AnimatedNumberList,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_FECOLORMATRIX_TYPE_HUEROTATE: core.int,
@@ -101413,12 +101416,12 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-svg.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
-svg.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
-svg.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
-svg.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
-svg.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg.FEColorMatrixElement);
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
+svg$.FEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEColorMatrixElement, svg$.FEColorMatrixElement);
 dart.defineExtensionNames([
   'in1',
   'height',
@@ -101427,12 +101430,12 @@
   'x',
   'y'
 ]);
-svg.FEComponentTransferElement = class FEComponentTransferElement extends svg.SvgElement {
+svg$.FEComponentTransferElement = class FEComponentTransferElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEComponentTransferElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
+    return svg$.FEComponentTransferElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer"));
   }
   created() {
     this[dartx.in1] = null;
@@ -101444,7 +101447,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feComponentTransfer')) && svg.FEComponentTransferElement.is(svg.SvgElement.tag('feComponentTransfer'));
+    return dart.test(svg$.SvgElement.isTagSupported('feComponentTransfer')) && svg$.FEComponentTransferElement.is(svg$.SvgElement.tag('feComponentTransfer'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -101465,25 +101468,25 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEComponentTransferElement, 'created');
-svg.FEComponentTransferElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEComponentTransferElement, {
+dart.defineNamedConstructor(svg$.FEComponentTransferElement, 'created');
+svg$.FEComponentTransferElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEComponentTransferElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEComponentTransferElement, []),
-    new: dart.definiteFunctionType(svg.FEComponentTransferElement, []),
-    created: dart.definiteFunctionType(svg.FEComponentTransferElement, [])
+    _: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
+    new: dart.definiteFunctionType(svg$.FEComponentTransferElement, []),
+    created: dart.definiteFunctionType(svg$.FEComponentTransferElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg.FEComponentTransferElement);
+dart.registerExtension(dart.global.SVGFEComponentTransferElement, svg$.FEComponentTransferElement);
 dart.defineExtensionNames([
   'in1',
   'in2',
@@ -101498,7 +101501,7 @@
   'x',
   'y'
 ]);
-svg.FECompositeElement = class FECompositeElement extends svg.SvgElement {
+svg$.FECompositeElement = class FECompositeElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -101554,26 +101557,26 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FECompositeElement, 'created');
-svg.FECompositeElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FECompositeElement, {
+dart.defineNamedConstructor(svg$.FECompositeElement, 'created');
+svg$.FECompositeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FECompositeElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FECompositeElement, []),
-    created: dart.definiteFunctionType(svg.FECompositeElement, [])
+    _: dart.definiteFunctionType(svg$.FECompositeElement, []),
+    created: dart.definiteFunctionType(svg$.FECompositeElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.in2]: svg.AnimatedString,
-    [dartx.k1]: svg.AnimatedNumber,
-    [dartx.k2]: svg.AnimatedNumber,
-    [dartx.k3]: svg.AnimatedNumber,
-    [dartx.k4]: svg.AnimatedNumber,
-    [dartx.operator]: svg.AnimatedEnumeration,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.k1]: svg$.AnimatedNumber,
+    [dartx.k2]: svg$.AnimatedNumber,
+    [dartx.k3]: svg$.AnimatedNumber,
+    [dartx.k4]: svg$.AnimatedNumber,
+    [dartx.operator]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_FECOMPOSITE_OPERATOR_ARITHMETIC: core.int,
@@ -101585,14 +101588,14 @@
     SVG_FECOMPOSITE_OPERATOR_XOR: core.int
   })
 });
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
-svg.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
-dart.registerExtension(dart.global.SVGFECompositeElement, svg.FECompositeElement);
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN = 2;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT = 3;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER = 1;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
+svg$.FECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR = 5;
+dart.registerExtension(dart.global.SVGFECompositeElement, svg$.FECompositeElement);
 dart.defineExtensionNames([
   'bias',
   'divisor',
@@ -101612,12 +101615,12 @@
   'x',
   'y'
 ]);
-svg.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg.SvgElement {
+svg$.FEConvolveMatrixElement = class FEConvolveMatrixElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEConvolveMatrixElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
+    return svg$.FEConvolveMatrixElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix"));
   }
   created() {
     this[dartx.bias] = null;
@@ -101640,7 +101643,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feConvolveMatrix')) && svg.FEConvolveMatrixElement.is(svg.SvgElement.tag('feConvolveMatrix'));
+    return dart.test(svg$.SvgElement.isTagSupported('feConvolveMatrix')) && svg$.FEConvolveMatrixElement.is(svg$.SvgElement.tag('feConvolveMatrix'));
   }
   get [dartx.bias]() {
     return this.bias;
@@ -101694,32 +101697,32 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEConvolveMatrixElement, 'created');
-svg.FEConvolveMatrixElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEConvolveMatrixElement, {
+dart.defineNamedConstructor(svg$.FEConvolveMatrixElement, 'created');
+svg$.FEConvolveMatrixElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEConvolveMatrixElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEConvolveMatrixElement, []),
-    new: dart.definiteFunctionType(svg.FEConvolveMatrixElement, []),
-    created: dart.definiteFunctionType(svg.FEConvolveMatrixElement, [])
+    _: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
+    new: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, []),
+    created: dart.definiteFunctionType(svg$.FEConvolveMatrixElement, [])
   }),
   fields: () => ({
-    [dartx.bias]: svg.AnimatedNumber,
-    [dartx.divisor]: svg.AnimatedNumber,
-    [dartx.edgeMode]: svg.AnimatedEnumeration,
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.kernelMatrix]: svg.AnimatedNumberList,
-    [dartx.kernelUnitLengthX]: svg.AnimatedNumber,
-    [dartx.kernelUnitLengthY]: svg.AnimatedNumber,
-    [dartx.orderX]: svg.AnimatedInteger,
-    [dartx.orderY]: svg.AnimatedInteger,
-    [dartx.preserveAlpha]: svg.AnimatedBoolean,
-    [dartx.targetX]: svg.AnimatedInteger,
-    [dartx.targetY]: svg.AnimatedInteger,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.bias]: svg$.AnimatedNumber,
+    [dartx.divisor]: svg$.AnimatedNumber,
+    [dartx.edgeMode]: svg$.AnimatedEnumeration,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelMatrix]: svg$.AnimatedNumberList,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.orderX]: svg$.AnimatedInteger,
+    [dartx.orderY]: svg$.AnimatedInteger,
+    [dartx.preserveAlpha]: svg$.AnimatedBoolean,
+    [dartx.targetX]: svg$.AnimatedInteger,
+    [dartx.targetY]: svg$.AnimatedInteger,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_EDGEMODE_DUPLICATE: core.int,
@@ -101729,11 +101732,11 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-svg.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
-svg.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
-svg.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
-svg.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
-dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg.FEConvolveMatrixElement);
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE = 1;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_NONE = 3;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_UNKNOWN = 0;
+svg$.FEConvolveMatrixElement.SVG_EDGEMODE_WRAP = 2;
+dart.registerExtension(dart.global.SVGFEConvolveMatrixElement, svg$.FEConvolveMatrixElement);
 dart.defineExtensionNames([
   'diffuseConstant',
   'in1',
@@ -101746,12 +101749,12 @@
   'x',
   'y'
 ]);
-svg.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg.SvgElement {
+svg$.FEDiffuseLightingElement = class FEDiffuseLightingElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEDiffuseLightingElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
+    return svg$.FEDiffuseLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting"));
   }
   created() {
     this[dartx.diffuseConstant] = null;
@@ -101767,7 +101770,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feDiffuseLighting')) && svg.FEDiffuseLightingElement.is(svg.SvgElement.tag('feDiffuseLighting'));
+    return dart.test(svg$.SvgElement.isTagSupported('feDiffuseLighting')) && svg$.FEDiffuseLightingElement.is(svg$.SvgElement.tag('feDiffuseLighting'));
   }
   get [dartx.diffuseConstant]() {
     return this.diffuseConstant;
@@ -101800,29 +101803,29 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEDiffuseLightingElement, 'created');
-svg.FEDiffuseLightingElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEDiffuseLightingElement, {
+dart.defineNamedConstructor(svg$.FEDiffuseLightingElement, 'created');
+svg$.FEDiffuseLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEDiffuseLightingElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEDiffuseLightingElement, []),
-    new: dart.definiteFunctionType(svg.FEDiffuseLightingElement, []),
-    created: dart.definiteFunctionType(svg.FEDiffuseLightingElement, [])
+    _: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
+    new: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, []),
+    created: dart.definiteFunctionType(svg$.FEDiffuseLightingElement, [])
   }),
   fields: () => ({
-    [dartx.diffuseConstant]: svg.AnimatedNumber,
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.kernelUnitLengthX]: svg.AnimatedNumber,
-    [dartx.kernelUnitLengthY]: svg.AnimatedNumber,
-    [dartx.surfaceScale]: svg.AnimatedNumber,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.diffuseConstant]: svg$.AnimatedNumber,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.surfaceScale]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg.FEDiffuseLightingElement);
+dart.registerExtension(dart.global.SVGFEDiffuseLightingElement, svg$.FEDiffuseLightingElement);
 dart.defineExtensionNames([
   'in1',
   'in2',
@@ -101835,12 +101838,12 @@
   'x',
   'y'
 ]);
-svg.FEDisplacementMapElement = class FEDisplacementMapElement extends svg.SvgElement {
+svg$.FEDisplacementMapElement = class FEDisplacementMapElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEDisplacementMapElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
+    return svg$.FEDisplacementMapElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap"));
   }
   created() {
     this[dartx.in1] = null;
@@ -101856,7 +101859,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feDisplacementMap')) && svg.FEDisplacementMapElement.is(svg.SvgElement.tag('feDisplacementMap'));
+    return dart.test(svg$.SvgElement.isTagSupported('feDisplacementMap')) && svg$.FEDisplacementMapElement.is(svg$.SvgElement.tag('feDisplacementMap'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -101889,25 +101892,25 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEDisplacementMapElement, 'created');
-svg.FEDisplacementMapElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEDisplacementMapElement, {
+dart.defineNamedConstructor(svg$.FEDisplacementMapElement, 'created');
+svg$.FEDisplacementMapElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEDisplacementMapElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEDisplacementMapElement, []),
-    new: dart.definiteFunctionType(svg.FEDisplacementMapElement, []),
-    created: dart.definiteFunctionType(svg.FEDisplacementMapElement, [])
+    _: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
+    new: dart.definiteFunctionType(svg$.FEDisplacementMapElement, []),
+    created: dart.definiteFunctionType(svg$.FEDisplacementMapElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.in2]: svg.AnimatedString,
-    [dartx.scale]: svg.AnimatedNumber,
-    [dartx.xChannelSelector]: svg.AnimatedEnumeration,
-    [dartx.yChannelSelector]: svg.AnimatedEnumeration,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.in2]: svg$.AnimatedString,
+    [dartx.scale]: svg$.AnimatedNumber,
+    [dartx.xChannelSelector]: svg$.AnimatedEnumeration,
+    [dartx.yChannelSelector]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_CHANNEL_A: core.int,
@@ -101918,22 +101921,22 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-svg.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
-svg.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
-svg.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
-svg.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
-svg.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg.FEDisplacementMapElement);
+svg$.FEDisplacementMapElement.SVG_CHANNEL_A = 4;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_B = 3;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_G = 2;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_R = 1;
+svg$.FEDisplacementMapElement.SVG_CHANNEL_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEDisplacementMapElement, svg$.FEDisplacementMapElement);
 dart.defineExtensionNames([
   'azimuth',
   'elevation'
 ]);
-svg.FEDistantLightElement = class FEDistantLightElement extends svg.SvgElement {
+svg$.FEDistantLightElement = class FEDistantLightElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEDistantLightElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
+    return svg$.FEDistantLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feDistantLight"));
   }
   created() {
     this[dartx.azimuth] = null;
@@ -101941,7 +101944,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feDistantLight')) && svg.FEDistantLightElement.is(svg.SvgElement.tag('feDistantLight'));
+    return dart.test(svg$.SvgElement.isTagSupported('feDistantLight')) && svg$.FEDistantLightElement.is(svg$.SvgElement.tag('feDistantLight'));
   }
   get [dartx.azimuth]() {
     return this.azimuth;
@@ -101950,20 +101953,20 @@
     return this.elevation;
   }
 };
-dart.defineNamedConstructor(svg.FEDistantLightElement, 'created');
-dart.setSignature(svg.FEDistantLightElement, {
+dart.defineNamedConstructor(svg$.FEDistantLightElement, 'created');
+dart.setSignature(svg$.FEDistantLightElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEDistantLightElement, []),
-    new: dart.definiteFunctionType(svg.FEDistantLightElement, []),
-    created: dart.definiteFunctionType(svg.FEDistantLightElement, [])
+    _: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
+    new: dart.definiteFunctionType(svg$.FEDistantLightElement, []),
+    created: dart.definiteFunctionType(svg$.FEDistantLightElement, [])
   }),
   fields: () => ({
-    [dartx.azimuth]: svg.AnimatedNumber,
-    [dartx.elevation]: svg.AnimatedNumber
+    [dartx.azimuth]: svg$.AnimatedNumber,
+    [dartx.elevation]: svg$.AnimatedNumber
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEDistantLightElement, svg.FEDistantLightElement);
+dart.registerExtension(dart.global.SVGFEDistantLightElement, svg$.FEDistantLightElement);
 dart.defineExtensionNames([
   'height',
   'result',
@@ -101971,12 +101974,12 @@
   'x',
   'y'
 ]);
-svg.FEFloodElement = class FEFloodElement extends svg.SvgElement {
+svg$.FEFloodElement = class FEFloodElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEFloodElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
+    return svg$.FEFloodElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFlood"));
   }
   created() {
     this[dartx.height] = null;
@@ -101987,7 +101990,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feFlood')) && svg.FEFloodElement.is(svg.SvgElement.tag('feFlood'));
+    return dart.test(svg$.SvgElement.isTagSupported('feFlood')) && svg$.FEFloodElement.is(svg$.SvgElement.tag('feFlood'));
   }
   get [dartx.height]() {
     return this.height;
@@ -102005,25 +102008,25 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEFloodElement, 'created');
-svg.FEFloodElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEFloodElement, {
+dart.defineNamedConstructor(svg$.FEFloodElement, 'created');
+svg$.FEFloodElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEFloodElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEFloodElement, []),
-    new: dart.definiteFunctionType(svg.FEFloodElement, []),
-    created: dart.definiteFunctionType(svg.FEFloodElement, [])
+    _: dart.definiteFunctionType(svg$.FEFloodElement, []),
+    new: dart.definiteFunctionType(svg$.FEFloodElement, []),
+    created: dart.definiteFunctionType(svg$.FEFloodElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEFloodElement, svg.FEFloodElement);
-svg._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGFEFloodElement, svg$.FEFloodElement);
+svg$._SVGComponentTransferFunctionElement = class _SVGComponentTransferFunctionElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -102031,110 +102034,110 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(svg._SVGComponentTransferFunctionElement, 'created');
-dart.setSignature(svg._SVGComponentTransferFunctionElement, {
+dart.defineNamedConstructor(svg$._SVGComponentTransferFunctionElement, 'created');
+dart.setSignature(svg$._SVGComponentTransferFunctionElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg._SVGComponentTransferFunctionElement, []),
-    created: dart.definiteFunctionType(svg._SVGComponentTransferFunctionElement, [])
+    _: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, []),
+    created: dart.definiteFunctionType(svg$._SVGComponentTransferFunctionElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg._SVGComponentTransferFunctionElement);
-svg.FEFuncAElement = class FEFuncAElement extends svg._SVGComponentTransferFunctionElement {
+dart.registerExtension(dart.global.SVGComponentTransferFunctionElement, svg$._SVGComponentTransferFunctionElement);
+svg$.FEFuncAElement = class FEFuncAElement extends svg$._SVGComponentTransferFunctionElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEFuncAElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
+    return svg$.FEFuncAElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncA"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feFuncA')) && svg.FEFuncAElement.is(svg.SvgElement.tag('feFuncA'));
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncA')) && svg$.FEFuncAElement.is(svg$.SvgElement.tag('feFuncA'));
   }
 };
-dart.defineNamedConstructor(svg.FEFuncAElement, 'created');
-dart.setSignature(svg.FEFuncAElement, {
+dart.defineNamedConstructor(svg$.FEFuncAElement, 'created');
+dart.setSignature(svg$.FEFuncAElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEFuncAElement, []),
-    new: dart.definiteFunctionType(svg.FEFuncAElement, []),
-    created: dart.definiteFunctionType(svg.FEFuncAElement, [])
+    _: dart.definiteFunctionType(svg$.FEFuncAElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncAElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncAElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEFuncAElement, svg.FEFuncAElement);
-svg.FEFuncBElement = class FEFuncBElement extends svg._SVGComponentTransferFunctionElement {
+dart.registerExtension(dart.global.SVGFEFuncAElement, svg$.FEFuncAElement);
+svg$.FEFuncBElement = class FEFuncBElement extends svg$._SVGComponentTransferFunctionElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEFuncBElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
+    return svg$.FEFuncBElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncB"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feFuncB')) && svg.FEFuncBElement.is(svg.SvgElement.tag('feFuncB'));
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncB')) && svg$.FEFuncBElement.is(svg$.SvgElement.tag('feFuncB'));
   }
 };
-dart.defineNamedConstructor(svg.FEFuncBElement, 'created');
-dart.setSignature(svg.FEFuncBElement, {
+dart.defineNamedConstructor(svg$.FEFuncBElement, 'created');
+dart.setSignature(svg$.FEFuncBElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEFuncBElement, []),
-    new: dart.definiteFunctionType(svg.FEFuncBElement, []),
-    created: dart.definiteFunctionType(svg.FEFuncBElement, [])
+    _: dart.definiteFunctionType(svg$.FEFuncBElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncBElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncBElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEFuncBElement, svg.FEFuncBElement);
-svg.FEFuncGElement = class FEFuncGElement extends svg._SVGComponentTransferFunctionElement {
+dart.registerExtension(dart.global.SVGFEFuncBElement, svg$.FEFuncBElement);
+svg$.FEFuncGElement = class FEFuncGElement extends svg$._SVGComponentTransferFunctionElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEFuncGElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
+    return svg$.FEFuncGElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncG"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feFuncG')) && svg.FEFuncGElement.is(svg.SvgElement.tag('feFuncG'));
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncG')) && svg$.FEFuncGElement.is(svg$.SvgElement.tag('feFuncG'));
   }
 };
-dart.defineNamedConstructor(svg.FEFuncGElement, 'created');
-dart.setSignature(svg.FEFuncGElement, {
+dart.defineNamedConstructor(svg$.FEFuncGElement, 'created');
+dart.setSignature(svg$.FEFuncGElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEFuncGElement, []),
-    new: dart.definiteFunctionType(svg.FEFuncGElement, []),
-    created: dart.definiteFunctionType(svg.FEFuncGElement, [])
+    _: dart.definiteFunctionType(svg$.FEFuncGElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncGElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncGElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEFuncGElement, svg.FEFuncGElement);
-svg.FEFuncRElement = class FEFuncRElement extends svg._SVGComponentTransferFunctionElement {
+dart.registerExtension(dart.global.SVGFEFuncGElement, svg$.FEFuncGElement);
+svg$.FEFuncRElement = class FEFuncRElement extends svg$._SVGComponentTransferFunctionElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEFuncRElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
+    return svg$.FEFuncRElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feFuncR"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feFuncR')) && svg.FEFuncRElement.is(svg.SvgElement.tag('feFuncR'));
+    return dart.test(svg$.SvgElement.isTagSupported('feFuncR')) && svg$.FEFuncRElement.is(svg$.SvgElement.tag('feFuncR'));
   }
 };
-dart.defineNamedConstructor(svg.FEFuncRElement, 'created');
-dart.setSignature(svg.FEFuncRElement, {
+dart.defineNamedConstructor(svg$.FEFuncRElement, 'created');
+dart.setSignature(svg$.FEFuncRElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEFuncRElement, []),
-    new: dart.definiteFunctionType(svg.FEFuncRElement, []),
-    created: dart.definiteFunctionType(svg.FEFuncRElement, [])
+    _: dart.definiteFunctionType(svg$.FEFuncRElement, []),
+    new: dart.definiteFunctionType(svg$.FEFuncRElement, []),
+    created: dart.definiteFunctionType(svg$.FEFuncRElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEFuncRElement, svg.FEFuncRElement);
+dart.registerExtension(dart.global.SVGFEFuncRElement, svg$.FEFuncRElement);
 dart.defineExtensionNames([
   'setStdDeviation',
   'in1',
@@ -102146,12 +102149,12 @@
   'x',
   'y'
 ]);
-svg.FEGaussianBlurElement = class FEGaussianBlurElement extends svg.SvgElement {
+svg$.FEGaussianBlurElement = class FEGaussianBlurElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEGaussianBlurElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
+    return svg$.FEGaussianBlurElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur"));
   }
   created() {
     this[dartx.in1] = null;
@@ -102165,7 +102168,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feGaussianBlur')) && svg.FEGaussianBlurElement.is(svg.SvgElement.tag('feGaussianBlur'));
+    return dart.test(svg$.SvgElement.isTagSupported('feGaussianBlur')) && svg$.FEGaussianBlurElement.is(svg$.SvgElement.tag('feGaussianBlur'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -102195,28 +102198,28 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEGaussianBlurElement, 'created');
-svg.FEGaussianBlurElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEGaussianBlurElement, {
+dart.defineNamedConstructor(svg$.FEGaussianBlurElement, 'created');
+svg$.FEGaussianBlurElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEGaussianBlurElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEGaussianBlurElement, []),
-    new: dart.definiteFunctionType(svg.FEGaussianBlurElement, []),
-    created: dart.definiteFunctionType(svg.FEGaussianBlurElement, [])
+    _: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
+    new: dart.definiteFunctionType(svg$.FEGaussianBlurElement, []),
+    created: dart.definiteFunctionType(svg$.FEGaussianBlurElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.stdDeviationX]: svg.AnimatedNumber,
-    [dartx.stdDeviationY]: svg.AnimatedNumber,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.stdDeviationX]: svg$.AnimatedNumber,
+    [dartx.stdDeviationY]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   methods: () => ({[dartx.setStdDeviation]: dart.definiteFunctionType(dart.void, [core.num, core.num])}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg.FEGaussianBlurElement);
+dart.registerExtension(dart.global.SVGFEGaussianBlurElement, svg$.FEGaussianBlurElement);
 dart.defineExtensionNames([
   'preserveAspectRatio',
   'height',
@@ -102226,12 +102229,12 @@
   'y',
   'href'
 ]);
-svg.FEImageElement = class FEImageElement extends svg.SvgElement {
+svg$.FEImageElement = class FEImageElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEImageElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
+    return svg$.FEImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feImage"));
   }
   created() {
     this[dartx.preserveAspectRatio] = null;
@@ -102244,7 +102247,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feImage')) && svg.FEImageElement.is(svg.SvgElement.tag('feImage'));
+    return dart.test(svg$.SvgElement.isTagSupported('feImage')) && svg$.FEImageElement.is(svg$.SvgElement.tag('feImage'));
   }
   get [dartx.preserveAspectRatio]() {
     return this.preserveAspectRatio;
@@ -102268,26 +102271,26 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.FEImageElement, 'created');
-svg.FEImageElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes, svg.UriReference];
-dart.setSignature(svg.FEImageElement, {
+dart.defineNamedConstructor(svg$.FEImageElement, 'created');
+svg$.FEImageElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes, svg$.UriReference];
+dart.setSignature(svg$.FEImageElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEImageElement, []),
-    new: dart.definiteFunctionType(svg.FEImageElement, []),
-    created: dart.definiteFunctionType(svg.FEImageElement, [])
+    _: dart.definiteFunctionType(svg$.FEImageElement, []),
+    new: dart.definiteFunctionType(svg$.FEImageElement, []),
+    created: dart.definiteFunctionType(svg$.FEImageElement, [])
   }),
   fields: () => ({
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.href]: svg.AnimatedString
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEImageElement, svg.FEImageElement);
+dart.registerExtension(dart.global.SVGFEImageElement, svg$.FEImageElement);
 dart.defineExtensionNames([
   'height',
   'result',
@@ -102295,12 +102298,12 @@
   'x',
   'y'
 ]);
-svg.FEMergeElement = class FEMergeElement extends svg.SvgElement {
+svg$.FEMergeElement = class FEMergeElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEMergeElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
+    return svg$.FEMergeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMerge"));
   }
   created() {
     this[dartx.height] = null;
@@ -102311,7 +102314,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feMerge')) && svg.FEMergeElement.is(svg.SvgElement.tag('feMerge'));
+    return dart.test(svg$.SvgElement.isTagSupported('feMerge')) && svg$.FEMergeElement.is(svg$.SvgElement.tag('feMerge'));
   }
   get [dartx.height]() {
     return this.height;
@@ -102329,56 +102332,56 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEMergeElement, 'created');
-svg.FEMergeElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEMergeElement, {
+dart.defineNamedConstructor(svg$.FEMergeElement, 'created');
+svg$.FEMergeElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEMergeElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEMergeElement, []),
-    new: dart.definiteFunctionType(svg.FEMergeElement, []),
-    created: dart.definiteFunctionType(svg.FEMergeElement, [])
+    _: dart.definiteFunctionType(svg$.FEMergeElement, []),
+    new: dart.definiteFunctionType(svg$.FEMergeElement, []),
+    created: dart.definiteFunctionType(svg$.FEMergeElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEMergeElement, svg.FEMergeElement);
+dart.registerExtension(dart.global.SVGFEMergeElement, svg$.FEMergeElement);
 dart.defineExtensionNames([
   'in1'
 ]);
-svg.FEMergeNodeElement = class FEMergeNodeElement extends svg.SvgElement {
+svg$.FEMergeNodeElement = class FEMergeNodeElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEMergeNodeElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
+    return svg$.FEMergeNodeElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feMergeNode"));
   }
   created() {
     this[dartx.in1] = null;
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feMergeNode')) && svg.FEMergeNodeElement.is(svg.SvgElement.tag('feMergeNode'));
+    return dart.test(svg$.SvgElement.isTagSupported('feMergeNode')) && svg$.FEMergeNodeElement.is(svg$.SvgElement.tag('feMergeNode'));
   }
   get [dartx.in1]() {
     return this.in1;
   }
 };
-dart.defineNamedConstructor(svg.FEMergeNodeElement, 'created');
-dart.setSignature(svg.FEMergeNodeElement, {
+dart.defineNamedConstructor(svg$.FEMergeNodeElement, 'created');
+dart.setSignature(svg$.FEMergeNodeElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEMergeNodeElement, []),
-    new: dart.definiteFunctionType(svg.FEMergeNodeElement, []),
-    created: dart.definiteFunctionType(svg.FEMergeNodeElement, [])
+    _: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
+    new: dart.definiteFunctionType(svg$.FEMergeNodeElement, []),
+    created: dart.definiteFunctionType(svg$.FEMergeNodeElement, [])
   }),
-  fields: () => ({[dartx.in1]: svg.AnimatedString}),
+  fields: () => ({[dartx.in1]: svg$.AnimatedString}),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg.FEMergeNodeElement);
+dart.registerExtension(dart.global.SVGFEMergeNodeElement, svg$.FEMergeNodeElement);
 dart.defineExtensionNames([
   'in1',
   'operator',
@@ -102390,7 +102393,7 @@
   'x',
   'y'
 ]);
-svg.FEMorphologyElement = class FEMorphologyElement extends svg.SvgElement {
+svg$.FEMorphologyElement = class FEMorphologyElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -102434,23 +102437,23 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEMorphologyElement, 'created');
-svg.FEMorphologyElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEMorphologyElement, {
+dart.defineNamedConstructor(svg$.FEMorphologyElement, 'created');
+svg$.FEMorphologyElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEMorphologyElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEMorphologyElement, []),
-    created: dart.definiteFunctionType(svg.FEMorphologyElement, [])
+    _: dart.definiteFunctionType(svg$.FEMorphologyElement, []),
+    created: dart.definiteFunctionType(svg$.FEMorphologyElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.operator]: svg.AnimatedEnumeration,
-    [dartx.radiusX]: svg.AnimatedNumber,
-    [dartx.radiusY]: svg.AnimatedNumber,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.operator]: svg$.AnimatedEnumeration,
+    [dartx.radiusX]: svg$.AnimatedNumber,
+    [dartx.radiusY]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_MORPHOLOGY_OPERATOR_DILATE: core.int,
@@ -102458,10 +102461,10 @@
     SVG_MORPHOLOGY_OPERATOR_UNKNOWN: core.int
   })
 });
-svg.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
-svg.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
-svg.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGFEMorphologyElement, svg.FEMorphologyElement);
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE = 2;
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
+svg$.FEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFEMorphologyElement, svg$.FEMorphologyElement);
 dart.defineExtensionNames([
   'dx',
   'dy',
@@ -102472,12 +102475,12 @@
   'x',
   'y'
 ]);
-svg.FEOffsetElement = class FEOffsetElement extends svg.SvgElement {
+svg$.FEOffsetElement = class FEOffsetElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEOffsetElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
+    return svg$.FEOffsetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feOffset"));
   }
   created() {
     this[dartx.dx] = null;
@@ -102491,7 +102494,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feOffset')) && svg.FEOffsetElement.is(svg.SvgElement.tag('feOffset'));
+    return dart.test(svg$.SvgElement.isTagSupported('feOffset')) && svg$.FEOffsetElement.is(svg$.SvgElement.tag('feOffset'));
   }
   get [dartx.dx]() {
     return this.dx;
@@ -102518,38 +102521,38 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FEOffsetElement, 'created');
-svg.FEOffsetElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FEOffsetElement, {
+dart.defineNamedConstructor(svg$.FEOffsetElement, 'created');
+svg$.FEOffsetElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FEOffsetElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEOffsetElement, []),
-    new: dart.definiteFunctionType(svg.FEOffsetElement, []),
-    created: dart.definiteFunctionType(svg.FEOffsetElement, [])
+    _: dart.definiteFunctionType(svg$.FEOffsetElement, []),
+    new: dart.definiteFunctionType(svg$.FEOffsetElement, []),
+    created: dart.definiteFunctionType(svg$.FEOffsetElement, [])
   }),
   fields: () => ({
-    [dartx.dx]: svg.AnimatedNumber,
-    [dartx.dy]: svg.AnimatedNumber,
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.dx]: svg$.AnimatedNumber,
+    [dartx.dy]: svg$.AnimatedNumber,
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEOffsetElement, svg.FEOffsetElement);
+dart.registerExtension(dart.global.SVGFEOffsetElement, svg$.FEOffsetElement);
 dart.defineExtensionNames([
   'x',
   'y',
   'z'
 ]);
-svg.FEPointLightElement = class FEPointLightElement extends svg.SvgElement {
+svg$.FEPointLightElement = class FEPointLightElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FEPointLightElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
+    return svg$.FEPointLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("fePointLight"));
   }
   created() {
     this[dartx.x] = null;
@@ -102558,7 +102561,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('fePointLight')) && svg.FEPointLightElement.is(svg.SvgElement.tag('fePointLight'));
+    return dart.test(svg$.SvgElement.isTagSupported('fePointLight')) && svg$.FEPointLightElement.is(svg$.SvgElement.tag('fePointLight'));
   }
   get [dartx.x]() {
     return this.x;
@@ -102570,21 +102573,21 @@
     return this.z;
   }
 };
-dart.defineNamedConstructor(svg.FEPointLightElement, 'created');
-dart.setSignature(svg.FEPointLightElement, {
+dart.defineNamedConstructor(svg$.FEPointLightElement, 'created');
+dart.setSignature(svg$.FEPointLightElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FEPointLightElement, []),
-    new: dart.definiteFunctionType(svg.FEPointLightElement, []),
-    created: dart.definiteFunctionType(svg.FEPointLightElement, [])
+    _: dart.definiteFunctionType(svg$.FEPointLightElement, []),
+    new: dart.definiteFunctionType(svg$.FEPointLightElement, []),
+    created: dart.definiteFunctionType(svg$.FEPointLightElement, [])
   }),
   fields: () => ({
-    [dartx.x]: svg.AnimatedNumber,
-    [dartx.y]: svg.AnimatedNumber,
-    [dartx.z]: svg.AnimatedNumber
+    [dartx.x]: svg$.AnimatedNumber,
+    [dartx.y]: svg$.AnimatedNumber,
+    [dartx.z]: svg$.AnimatedNumber
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFEPointLightElement, svg.FEPointLightElement);
+dart.registerExtension(dart.global.SVGFEPointLightElement, svg$.FEPointLightElement);
 dart.defineExtensionNames([
   'in1',
   'kernelUnitLengthX',
@@ -102598,12 +102601,12 @@
   'x',
   'y'
 ]);
-svg.FESpecularLightingElement = class FESpecularLightingElement extends svg.SvgElement {
+svg$.FESpecularLightingElement = class FESpecularLightingElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FESpecularLightingElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
+    return svg$.FESpecularLightingElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting"));
   }
   created() {
     this[dartx.in1] = null;
@@ -102620,7 +102623,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feSpecularLighting')) && svg.FESpecularLightingElement.is(svg.SvgElement.tag('feSpecularLighting'));
+    return dart.test(svg$.SvgElement.isTagSupported('feSpecularLighting')) && svg$.FESpecularLightingElement.is(svg$.SvgElement.tag('feSpecularLighting'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -102656,30 +102659,30 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FESpecularLightingElement, 'created');
-svg.FESpecularLightingElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FESpecularLightingElement, {
+dart.defineNamedConstructor(svg$.FESpecularLightingElement, 'created');
+svg$.FESpecularLightingElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FESpecularLightingElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FESpecularLightingElement, []),
-    new: dart.definiteFunctionType(svg.FESpecularLightingElement, []),
-    created: dart.definiteFunctionType(svg.FESpecularLightingElement, [])
+    _: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
+    new: dart.definiteFunctionType(svg$.FESpecularLightingElement, []),
+    created: dart.definiteFunctionType(svg$.FESpecularLightingElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.kernelUnitLengthX]: svg.AnimatedNumber,
-    [dartx.kernelUnitLengthY]: svg.AnimatedNumber,
-    [dartx.specularConstant]: svg.AnimatedNumber,
-    [dartx.specularExponent]: svg.AnimatedNumber,
-    [dartx.surfaceScale]: svg.AnimatedNumber,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.kernelUnitLengthX]: svg$.AnimatedNumber,
+    [dartx.kernelUnitLengthY]: svg$.AnimatedNumber,
+    [dartx.specularConstant]: svg$.AnimatedNumber,
+    [dartx.specularExponent]: svg$.AnimatedNumber,
+    [dartx.surfaceScale]: svg$.AnimatedNumber,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg.FESpecularLightingElement);
+dart.registerExtension(dart.global.SVGFESpecularLightingElement, svg$.FESpecularLightingElement);
 dart.defineExtensionNames([
   'limitingConeAngle',
   'pointsAtX',
@@ -102690,12 +102693,12 @@
   'y',
   'z'
 ]);
-svg.FESpotLightElement = class FESpotLightElement extends svg.SvgElement {
+svg$.FESpotLightElement = class FESpotLightElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FESpotLightElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
+    return svg$.FESpotLightElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feSpotLight"));
   }
   created() {
     this[dartx.limitingConeAngle] = null;
@@ -102709,7 +102712,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feSpotLight')) && svg.FESpotLightElement.is(svg.SvgElement.tag('feSpotLight'));
+    return dart.test(svg$.SvgElement.isTagSupported('feSpotLight')) && svg$.FESpotLightElement.is(svg$.SvgElement.tag('feSpotLight'));
   }
   get [dartx.limitingConeAngle]() {
     return this.limitingConeAngle;
@@ -102736,26 +102739,26 @@
     return this.z;
   }
 };
-dart.defineNamedConstructor(svg.FESpotLightElement, 'created');
-dart.setSignature(svg.FESpotLightElement, {
+dart.defineNamedConstructor(svg$.FESpotLightElement, 'created');
+dart.setSignature(svg$.FESpotLightElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FESpotLightElement, []),
-    new: dart.definiteFunctionType(svg.FESpotLightElement, []),
-    created: dart.definiteFunctionType(svg.FESpotLightElement, [])
+    _: dart.definiteFunctionType(svg$.FESpotLightElement, []),
+    new: dart.definiteFunctionType(svg$.FESpotLightElement, []),
+    created: dart.definiteFunctionType(svg$.FESpotLightElement, [])
   }),
   fields: () => ({
-    [dartx.limitingConeAngle]: svg.AnimatedNumber,
-    [dartx.pointsAtX]: svg.AnimatedNumber,
-    [dartx.pointsAtY]: svg.AnimatedNumber,
-    [dartx.pointsAtZ]: svg.AnimatedNumber,
-    [dartx.specularExponent]: svg.AnimatedNumber,
-    [dartx.x]: svg.AnimatedNumber,
-    [dartx.y]: svg.AnimatedNumber,
-    [dartx.z]: svg.AnimatedNumber
+    [dartx.limitingConeAngle]: svg$.AnimatedNumber,
+    [dartx.pointsAtX]: svg$.AnimatedNumber,
+    [dartx.pointsAtY]: svg$.AnimatedNumber,
+    [dartx.pointsAtZ]: svg$.AnimatedNumber,
+    [dartx.specularExponent]: svg$.AnimatedNumber,
+    [dartx.x]: svg$.AnimatedNumber,
+    [dartx.y]: svg$.AnimatedNumber,
+    [dartx.z]: svg$.AnimatedNumber
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFESpotLightElement, svg.FESpotLightElement);
+dart.registerExtension(dart.global.SVGFESpotLightElement, svg$.FESpotLightElement);
 dart.defineExtensionNames([
   'in1',
   'height',
@@ -102764,12 +102767,12 @@
   'x',
   'y'
 ]);
-svg.FETileElement = class FETileElement extends svg.SvgElement {
+svg$.FETileElement = class FETileElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FETileElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
+    return svg$.FETileElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTile"));
   }
   created() {
     this[dartx.in1] = null;
@@ -102781,7 +102784,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feTile')) && svg.FETileElement.is(svg.SvgElement.tag('feTile'));
+    return dart.test(svg$.SvgElement.isTagSupported('feTile')) && svg$.FETileElement.is(svg$.SvgElement.tag('feTile'));
   }
   get [dartx.in1]() {
     return this.in1;
@@ -102802,25 +102805,25 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FETileElement, 'created');
-svg.FETileElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FETileElement, {
+dart.defineNamedConstructor(svg$.FETileElement, 'created');
+svg$.FETileElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FETileElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FETileElement, []),
-    new: dart.definiteFunctionType(svg.FETileElement, []),
-    created: dart.definiteFunctionType(svg.FETileElement, [])
+    _: dart.definiteFunctionType(svg$.FETileElement, []),
+    new: dart.definiteFunctionType(svg$.FETileElement, []),
+    created: dart.definiteFunctionType(svg$.FETileElement, [])
   }),
   fields: () => ({
-    [dartx.in1]: svg.AnimatedString,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.in1]: svg$.AnimatedString,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFETileElement, svg.FETileElement);
+dart.registerExtension(dart.global.SVGFETileElement, svg$.FETileElement);
 dart.defineExtensionNames([
   'baseFrequencyX',
   'baseFrequencyY',
@@ -102834,12 +102837,12 @@
   'x',
   'y'
 ]);
-svg.FETurbulenceElement = class FETurbulenceElement extends svg.SvgElement {
+svg$.FETurbulenceElement = class FETurbulenceElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FETurbulenceElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
+    return svg$.FETurbulenceElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("feTurbulence"));
   }
   created() {
     this[dartx.baseFrequencyX] = null;
@@ -102856,7 +102859,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('feTurbulence')) && svg.FETurbulenceElement.is(svg.SvgElement.tag('feTurbulence'));
+    return dart.test(svg$.SvgElement.isTagSupported('feTurbulence')) && svg$.FETurbulenceElement.is(svg$.SvgElement.tag('feTurbulence'));
   }
   get [dartx.baseFrequencyX]() {
     return this.baseFrequencyX;
@@ -102892,26 +102895,26 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.FETurbulenceElement, 'created');
-svg.FETurbulenceElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg.FETurbulenceElement, {
+dart.defineNamedConstructor(svg$.FETurbulenceElement, 'created');
+svg$.FETurbulenceElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$.FETurbulenceElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FETurbulenceElement, []),
-    new: dart.definiteFunctionType(svg.FETurbulenceElement, []),
-    created: dart.definiteFunctionType(svg.FETurbulenceElement, [])
+    _: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
+    new: dart.definiteFunctionType(svg$.FETurbulenceElement, []),
+    created: dart.definiteFunctionType(svg$.FETurbulenceElement, [])
   }),
   fields: () => ({
-    [dartx.baseFrequencyX]: svg.AnimatedNumber,
-    [dartx.baseFrequencyY]: svg.AnimatedNumber,
-    [dartx.numOctaves]: svg.AnimatedInteger,
-    [dartx.seed]: svg.AnimatedNumber,
-    [dartx.stitchTiles]: svg.AnimatedEnumeration,
-    [dartx.type]: svg.AnimatedEnumeration,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.result]: svg.AnimatedString,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.baseFrequencyX]: svg$.AnimatedNumber,
+    [dartx.baseFrequencyY]: svg$.AnimatedNumber,
+    [dartx.numOctaves]: svg$.AnimatedInteger,
+    [dartx.seed]: svg$.AnimatedNumber,
+    [dartx.stitchTiles]: svg$.AnimatedEnumeration,
+    [dartx.type]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.result]: svg$.AnimatedString,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sfields: () => ({
     SVG_STITCHTYPE_NOSTITCH: core.int,
@@ -102923,13 +102926,13 @@
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-svg.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
-svg.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
-svg.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
-svg.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
-svg.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
-svg.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGFETurbulenceElement, svg.FETurbulenceElement);
+svg$.FETurbulenceElement.SVG_STITCHTYPE_NOSTITCH = 2;
+svg$.FETurbulenceElement.SVG_STITCHTYPE_STITCH = 1;
+svg$.FETurbulenceElement.SVG_STITCHTYPE_UNKNOWN = 0;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE = 2;
+svg$.FETurbulenceElement.SVG_TURBULENCE_TYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGFETurbulenceElement, svg$.FETurbulenceElement);
 dart.defineExtensionNames([
   'filterUnits',
   'height',
@@ -102939,12 +102942,12 @@
   'y',
   'href'
 ]);
-svg.FilterElement = class FilterElement extends svg.SvgElement {
+svg$.FilterElement = class FilterElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.FilterElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("filter"));
+    return svg$.FilterElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("filter"));
   }
   created() {
     this[dartx.filterUnits] = null;
@@ -102957,7 +102960,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('filter')) && svg.FilterElement.is(svg.SvgElement.tag('filter'));
+    return dart.test(svg$.SvgElement.isTagSupported('filter')) && svg$.FilterElement.is(svg$.SvgElement.tag('filter'));
   }
   get [dartx.filterUnits]() {
     return this.filterUnits;
@@ -102981,26 +102984,26 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.FilterElement, 'created');
-svg.FilterElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.FilterElement, {
+dart.defineNamedConstructor(svg$.FilterElement, 'created');
+svg$.FilterElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.FilterElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.FilterElement, []),
-    new: dart.definiteFunctionType(svg.FilterElement, []),
-    created: dart.definiteFunctionType(svg.FilterElement, [])
+    _: dart.definiteFunctionType(svg$.FilterElement, []),
+    new: dart.definiteFunctionType(svg$.FilterElement, []),
+    created: dart.definiteFunctionType(svg$.FilterElement, [])
   }),
   fields: () => ({
-    [dartx.filterUnits]: svg.AnimatedEnumeration,
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.primitiveUnits]: svg.AnimatedEnumeration,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.href]: svg.AnimatedString
+    [dartx.filterUnits]: svg$.AnimatedEnumeration,
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.primitiveUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGFilterElement, svg.FilterElement);
+dart.registerExtension(dart.global.SVGFilterElement, svg$.FilterElement);
 dart.defineExtensionNames([
   'height',
   'result',
@@ -103008,12 +103011,12 @@
   'x',
   'y'
 ]);
-svg.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
+svg$.FilterPrimitiveStandardAttributes = class FilterPrimitiveStandardAttributes extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get height() {
-    return this[height];
+    return this[height$];
   }
   set height(value) {
     super.height = value;
@@ -103025,7 +103028,7 @@
     super.result = value;
   }
   get width() {
-    return this[width];
+    return this[width$];
   }
   set width(value) {
     super.width = value;
@@ -103043,22 +103046,22 @@
     super.y = value;
   }
 };
-const height = Symbol(svg.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
-const result = Symbol(svg.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
-const width = Symbol(svg.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
-const x = Symbol(svg.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
-const y = Symbol(svg.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
-dart.setSignature(svg.FilterPrimitiveStandardAttributes, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.FilterPrimitiveStandardAttributes, [])}),
+const height$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'height'.toString());
+const result = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'result'.toString());
+const width$ = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'width'.toString());
+const x = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'x'.toString());
+const y = Symbol(svg$.FilterPrimitiveStandardAttributes.name + "." + 'y'.toString());
+dart.setSignature(svg$.FilterPrimitiveStandardAttributes, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.FilterPrimitiveStandardAttributes, [])}),
   fields: () => ({
-    height: svg.AnimatedLength,
-    result: svg.AnimatedString,
-    width: svg.AnimatedLength,
-    x: svg.AnimatedLength,
-    y: svg.AnimatedLength
+    height: svg$.AnimatedLength,
+    result: svg$.AnimatedString,
+    width: svg$.AnimatedLength,
+    x: svg$.AnimatedLength,
+    y: svg$.AnimatedLength
   })
 });
-dart.defineExtensionMembers(svg.FilterPrimitiveStandardAttributes, [
+dart.defineExtensionMembers(svg$.FilterPrimitiveStandardAttributes, [
   'height',
   'result',
   'width',
@@ -103069,7 +103072,7 @@
   'preserveAspectRatio',
   'viewBox'
 ]);
-svg.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
+svg$.FitToViewBox = class FitToViewBox extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103086,28 +103089,28 @@
     super.viewBox = value;
   }
 };
-const preserveAspectRatio = Symbol(svg.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
-const viewBox = Symbol(svg.FitToViewBox.name + "." + 'viewBox'.toString());
-dart.setSignature(svg.FitToViewBox, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.FitToViewBox, [])}),
+const preserveAspectRatio = Symbol(svg$.FitToViewBox.name + "." + 'preserveAspectRatio'.toString());
+const viewBox = Symbol(svg$.FitToViewBox.name + "." + 'viewBox'.toString());
+dart.setSignature(svg$.FitToViewBox, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.FitToViewBox, [])}),
   fields: () => ({
-    preserveAspectRatio: svg.AnimatedPreserveAspectRatio,
-    viewBox: svg.AnimatedRect
+    preserveAspectRatio: svg$.AnimatedPreserveAspectRatio,
+    viewBox: svg$.AnimatedRect
   })
 });
-dart.defineExtensionMembers(svg.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
+dart.defineExtensionMembers(svg$.FitToViewBox, ['preserveAspectRatio', 'viewBox']);
 dart.defineExtensionNames([
   'height',
   'width',
   'x',
   'y'
 ]);
-svg.ForeignObjectElement = class ForeignObjectElement extends svg.GraphicsElement {
+svg$.ForeignObjectElement = class ForeignObjectElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.ForeignObjectElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
+    return svg$.ForeignObjectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("foreignObject"));
   }
   created() {
     this[dartx.height] = null;
@@ -103117,7 +103120,7 @@
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('foreignObject')) && svg.ForeignObjectElement.is(svg.SvgElement.tag('foreignObject'));
+    return dart.test(svg$.SvgElement.isTagSupported('foreignObject')) && svg$.ForeignObjectElement.is(svg$.SvgElement.tag('foreignObject'));
   }
   get [dartx.height]() {
     return this.height;
@@ -103132,42 +103135,42 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.ForeignObjectElement, 'created');
-dart.setSignature(svg.ForeignObjectElement, {
+dart.defineNamedConstructor(svg$.ForeignObjectElement, 'created');
+dart.setSignature(svg$.ForeignObjectElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.ForeignObjectElement, []),
-    new: dart.definiteFunctionType(svg.ForeignObjectElement, []),
-    created: dart.definiteFunctionType(svg.ForeignObjectElement, [])
+    _: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
+    new: dart.definiteFunctionType(svg$.ForeignObjectElement, []),
+    created: dart.definiteFunctionType(svg$.ForeignObjectElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGForeignObjectElement, svg.ForeignObjectElement);
-svg.GElement = class GElement extends svg.GraphicsElement {
+dart.registerExtension(dart.global.SVGForeignObjectElement, svg$.ForeignObjectElement);
+svg$.GElement = class GElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.GElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("g"));
+    return svg$.GElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("g"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.GElement, 'created');
-dart.setSignature(svg.GElement, {
+dart.defineNamedConstructor(svg$.GElement, 'created');
+dart.setSignature(svg$.GElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.GElement, []),
-    new: dart.definiteFunctionType(svg.GElement, []),
-    created: dart.definiteFunctionType(svg.GElement, [])
+    _: dart.definiteFunctionType(svg$.GElement, []),
+    new: dart.definiteFunctionType(svg$.GElement, []),
+    created: dart.definiteFunctionType(svg$.GElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGGElement, svg.GElement);
+dart.registerExtension(dart.global.SVGGElement, svg$.GElement);
 dart.defineExtensionNames([
   'height',
   'preserveAspectRatio',
@@ -103176,12 +103179,12 @@
   'y',
   'href'
 ]);
-svg.ImageElement = class ImageElement extends svg.GraphicsElement {
+svg$.ImageElement = class ImageElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.ImageElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("image"));
+    return svg$.ImageElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("image"));
   }
   created() {
     this[dartx.height] = null;
@@ -103211,24 +103214,24 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.ImageElement, 'created');
-svg.ImageElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.ImageElement, {
+dart.defineNamedConstructor(svg$.ImageElement, 'created');
+svg$.ImageElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.ImageElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.ImageElement, []),
-    new: dart.definiteFunctionType(svg.ImageElement, []),
-    created: dart.definiteFunctionType(svg.ImageElement, [])
+    _: dart.definiteFunctionType(svg$.ImageElement, []),
+    new: dart.definiteFunctionType(svg$.ImageElement, []),
+    created: dart.definiteFunctionType(svg$.ImageElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.href]: svg.AnimatedString
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
   })
 });
-dart.registerExtension(dart.global.SVGImageElement, svg.ImageElement);
+dart.registerExtension(dart.global.SVGImageElement, svg$.ImageElement);
 dart.defineExtensionNames([
   'convertToSpecifiedUnits',
   'newValueSpecifiedUnits',
@@ -103237,7 +103240,7 @@
   'valueAsString',
   'valueInSpecifiedUnits'
 ]);
-svg.Length = class Length extends _interceptors.Interceptor {
+svg$.Length = class Length extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103269,8 +103272,8 @@
     return this.newValueSpecifiedUnits.apply(this, args);
   }
 };
-dart.setSignature(svg.Length, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Length, [])}),
+dart.setSignature(svg$.Length, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Length, [])}),
   fields: () => ({
     [dartx.unitType]: core.int,
     [dartx.value]: core.num,
@@ -103295,19 +103298,19 @@
     SVG_LENGTHTYPE_UNKNOWN: core.int
   })
 });
-svg.Length.SVG_LENGTHTYPE_CM = 6;
-svg.Length.SVG_LENGTHTYPE_EMS = 3;
-svg.Length.SVG_LENGTHTYPE_EXS = 4;
-svg.Length.SVG_LENGTHTYPE_IN = 8;
-svg.Length.SVG_LENGTHTYPE_MM = 7;
-svg.Length.SVG_LENGTHTYPE_NUMBER = 1;
-svg.Length.SVG_LENGTHTYPE_PC = 10;
-svg.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
-svg.Length.SVG_LENGTHTYPE_PT = 9;
-svg.Length.SVG_LENGTHTYPE_PX = 5;
-svg.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGLength, svg.Length);
-const __setter__ = Symbol('__setter__');
+svg$.Length.SVG_LENGTHTYPE_CM = 6;
+svg$.Length.SVG_LENGTHTYPE_EMS = 3;
+svg$.Length.SVG_LENGTHTYPE_EXS = 4;
+svg$.Length.SVG_LENGTHTYPE_IN = 8;
+svg$.Length.SVG_LENGTHTYPE_MM = 7;
+svg$.Length.SVG_LENGTHTYPE_NUMBER = 1;
+svg$.Length.SVG_LENGTHTYPE_PC = 10;
+svg$.Length.SVG_LENGTHTYPE_PERCENTAGE = 2;
+svg$.Length.SVG_LENGTHTYPE_PT = 9;
+svg$.Length.SVG_LENGTHTYPE_PX = 5;
+svg$.Length.SVG_LENGTHTYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGLength, svg$.Length);
+const __setter__$ = Symbol('__setter__');
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -103326,7 +103329,7 @@
   'replaceItem',
   'numberOfItems'
 ]);
-svg.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg.Length), html.ImmutableListMixin$(svg.Length)) {
+svg$.LengthList = class LengthList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Length), html$.ImmutableListMixin$(svg$.Length)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103371,7 +103374,7 @@
   [dartx.elementAt](index) {
     return this[dartx._get](index);
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -103396,37 +103399,37 @@
     return this.replaceItem.apply(this, args);
   }
 };
-svg.LengthList[dart.implements] = () => [ListOfLength()];
-dart.setSignature(svg.LengthList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.LengthList, [])}),
+svg$.LengthList[dart.implements] = () => [ListOfLength()];
+dart.setSignature(svg$.LengthList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.LengthList, [])}),
   fields: () => ({[dartx.numberOfItems]: core.int}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(svg.Length, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg.Length]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, svg.Length]),
-    [dartx.appendItem]: dart.definiteFunctionType(svg.Length, [svg.Length]),
-    [dartx.getItem]: dart.definiteFunctionType(svg.Length, [core.int]),
-    [dartx.initialize]: dart.definiteFunctionType(svg.Length, [svg.Length]),
-    [dartx.insertItemBefore]: dart.definiteFunctionType(svg.Length, [svg.Length, core.int]),
-    [dartx.removeItem]: dart.definiteFunctionType(svg.Length, [core.int]),
-    [dartx.replaceItem]: dart.definiteFunctionType(svg.Length, [svg.Length, core.int])
+    [dartx._get]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Length]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Length, [svg$.Length]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Length, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Length, [svg$.Length, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGLengthList, svg.LengthList);
+dart.registerExtension(dart.global.SVGLengthList, svg$.LengthList);
 dart.defineExtensionNames([
   'x1',
   'x2',
   'y1',
   'y2'
 ]);
-svg.LineElement = class LineElement extends svg.GeometryElement {
+svg$.LineElement = class LineElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.LineElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("line"));
+    return svg$.LineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("line"));
   }
   created() {
     this[dartx.x1] = null;
@@ -103448,28 +103451,28 @@
     return this.y2;
   }
 };
-dart.defineNamedConstructor(svg.LineElement, 'created');
-dart.setSignature(svg.LineElement, {
+dart.defineNamedConstructor(svg$.LineElement, 'created');
+dart.setSignature(svg$.LineElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.LineElement, []),
-    new: dart.definiteFunctionType(svg.LineElement, []),
-    created: dart.definiteFunctionType(svg.LineElement, [])
+    _: dart.definiteFunctionType(svg$.LineElement, []),
+    new: dart.definiteFunctionType(svg$.LineElement, []),
+    created: dart.definiteFunctionType(svg$.LineElement, [])
   }),
   fields: () => ({
-    [dartx.x1]: svg.AnimatedLength,
-    [dartx.x2]: svg.AnimatedLength,
-    [dartx.y1]: svg.AnimatedLength,
-    [dartx.y2]: svg.AnimatedLength
+    [dartx.x1]: svg$.AnimatedLength,
+    [dartx.x2]: svg$.AnimatedLength,
+    [dartx.y1]: svg$.AnimatedLength,
+    [dartx.y2]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGLineElement, svg.LineElement);
+dart.registerExtension(dart.global.SVGLineElement, svg$.LineElement);
 dart.defineExtensionNames([
   'gradientTransform',
   'gradientUnits',
   'spreadMethod',
   'href'
 ]);
-svg._GradientElement = class _GradientElement extends svg.SvgElement {
+svg$._GradientElement = class _GradientElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103493,18 +103496,18 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg._GradientElement, 'created');
-svg._GradientElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg._GradientElement, {
+dart.defineNamedConstructor(svg$._GradientElement, 'created');
+svg$._GradientElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$._GradientElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg._GradientElement, []),
-    created: dart.definiteFunctionType(svg._GradientElement, [])
+    _: dart.definiteFunctionType(svg$._GradientElement, []),
+    created: dart.definiteFunctionType(svg$._GradientElement, [])
   }),
   fields: () => ({
-    [dartx.gradientTransform]: svg.AnimatedTransformList,
-    [dartx.gradientUnits]: svg.AnimatedEnumeration,
-    [dartx.spreadMethod]: svg.AnimatedEnumeration,
-    [dartx.href]: svg.AnimatedString
+    [dartx.gradientTransform]: svg$.AnimatedTransformList,
+    [dartx.gradientUnits]: svg$.AnimatedEnumeration,
+    [dartx.spreadMethod]: svg$.AnimatedEnumeration,
+    [dartx.href]: svg$.AnimatedString
   }),
   sfields: () => ({
     SVG_SPREADMETHOD_PAD: core.int,
@@ -103513,23 +103516,23 @@
     SVG_SPREADMETHOD_UNKNOWN: core.int
   })
 });
-svg._GradientElement.SVG_SPREADMETHOD_PAD = 1;
-svg._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
-svg._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
-svg._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGGradientElement, svg._GradientElement);
+svg$._GradientElement.SVG_SPREADMETHOD_PAD = 1;
+svg$._GradientElement.SVG_SPREADMETHOD_REFLECT = 2;
+svg$._GradientElement.SVG_SPREADMETHOD_REPEAT = 3;
+svg$._GradientElement.SVG_SPREADMETHOD_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGGradientElement, svg$._GradientElement);
 dart.defineExtensionNames([
   'x1',
   'x2',
   'y1',
   'y2'
 ]);
-svg.LinearGradientElement = class LinearGradientElement extends svg._GradientElement {
+svg$.LinearGradientElement = class LinearGradientElement extends svg$._GradientElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.LinearGradientElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
+    return svg$.LinearGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("linearGradient"));
   }
   created() {
     this[dartx.x1] = null;
@@ -103551,21 +103554,21 @@
     return this.y2;
   }
 };
-dart.defineNamedConstructor(svg.LinearGradientElement, 'created');
-dart.setSignature(svg.LinearGradientElement, {
+dart.defineNamedConstructor(svg$.LinearGradientElement, 'created');
+dart.setSignature(svg$.LinearGradientElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.LinearGradientElement, []),
-    new: dart.definiteFunctionType(svg.LinearGradientElement, []),
-    created: dart.definiteFunctionType(svg.LinearGradientElement, [])
+    _: dart.definiteFunctionType(svg$.LinearGradientElement, []),
+    new: dart.definiteFunctionType(svg$.LinearGradientElement, []),
+    created: dart.definiteFunctionType(svg$.LinearGradientElement, [])
   }),
   fields: () => ({
-    [dartx.x1]: svg.AnimatedLength,
-    [dartx.x2]: svg.AnimatedLength,
-    [dartx.y1]: svg.AnimatedLength,
-    [dartx.y2]: svg.AnimatedLength
+    [dartx.x1]: svg$.AnimatedLength,
+    [dartx.x2]: svg$.AnimatedLength,
+    [dartx.y1]: svg$.AnimatedLength,
+    [dartx.y2]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGLinearGradientElement, svg.LinearGradientElement);
+dart.registerExtension(dart.global.SVGLinearGradientElement, svg$.LinearGradientElement);
 dart.defineExtensionNames([
   'setOrientToAngle',
   'setOrientToAuto',
@@ -103579,12 +103582,12 @@
   'preserveAspectRatio',
   'viewBox'
 ]);
-svg.MarkerElement = class MarkerElement extends svg.SvgElement {
+svg$.MarkerElement = class MarkerElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.MarkerElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("marker"));
+    return svg$.MarkerElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("marker"));
   }
   created() {
     this[dartx.markerHeight] = null;
@@ -103632,27 +103635,27 @@
     return this.viewBox;
   }
 };
-dart.defineNamedConstructor(svg.MarkerElement, 'created');
-svg.MarkerElement[dart.implements] = () => [svg.FitToViewBox];
-dart.setSignature(svg.MarkerElement, {
+dart.defineNamedConstructor(svg$.MarkerElement, 'created');
+svg$.MarkerElement[dart.implements] = () => [svg$.FitToViewBox];
+dart.setSignature(svg$.MarkerElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.MarkerElement, []),
-    new: dart.definiteFunctionType(svg.MarkerElement, []),
-    created: dart.definiteFunctionType(svg.MarkerElement, [])
+    _: dart.definiteFunctionType(svg$.MarkerElement, []),
+    new: dart.definiteFunctionType(svg$.MarkerElement, []),
+    created: dart.definiteFunctionType(svg$.MarkerElement, [])
   }),
   fields: () => ({
-    [dartx.markerHeight]: svg.AnimatedLength,
-    [dartx.markerUnits]: svg.AnimatedEnumeration,
-    [dartx.markerWidth]: svg.AnimatedLength,
-    [dartx.orientAngle]: svg.AnimatedAngle,
-    [dartx.orientType]: svg.AnimatedEnumeration,
-    [dartx.refX]: svg.AnimatedLength,
-    [dartx.refY]: svg.AnimatedLength,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect
+    [dartx.markerHeight]: svg$.AnimatedLength,
+    [dartx.markerUnits]: svg$.AnimatedEnumeration,
+    [dartx.markerWidth]: svg$.AnimatedLength,
+    [dartx.orientAngle]: svg$.AnimatedAngle,
+    [dartx.orientType]: svg$.AnimatedEnumeration,
+    [dartx.refX]: svg$.AnimatedLength,
+    [dartx.refY]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect
   }),
   methods: () => ({
-    [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg.Angle]),
+    [dartx.setOrientToAngle]: dart.definiteFunctionType(dart.void, [svg$.Angle]),
     [dartx.setOrientToAuto]: dart.definiteFunctionType(dart.void, [])
   }),
   sfields: () => ({
@@ -103664,13 +103667,13 @@
     SVG_MARKER_ORIENT_UNKNOWN: core.int
   })
 });
-svg.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
-svg.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
-svg.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
-svg.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
-svg.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
-svg.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGMarkerElement, svg.MarkerElement);
+svg$.MarkerElement.SVG_MARKERUNITS_STROKEWIDTH = 2;
+svg$.MarkerElement.SVG_MARKERUNITS_UNKNOWN = 0;
+svg$.MarkerElement.SVG_MARKERUNITS_USERSPACEONUSE = 1;
+svg$.MarkerElement.SVG_MARKER_ORIENT_ANGLE = 2;
+svg$.MarkerElement.SVG_MARKER_ORIENT_AUTO = 1;
+svg$.MarkerElement.SVG_MARKER_ORIENT_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGMarkerElement, svg$.MarkerElement);
 dart.defineExtensionNames([
   'hasExtension',
   'height',
@@ -103683,12 +103686,12 @@
   'requiredFeatures',
   'systemLanguage'
 ]);
-svg.MaskElement = class MaskElement extends svg.SvgElement {
+svg$.MaskElement = class MaskElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.MaskElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("mask"));
+    return svg$.MaskElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mask"));
   }
   created() {
     this[dartx.height] = null;
@@ -103733,28 +103736,28 @@
     return this.hasExtension.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.MaskElement, 'created');
-svg.MaskElement[dart.implements] = () => [svg.Tests];
-dart.setSignature(svg.MaskElement, {
+dart.defineNamedConstructor(svg$.MaskElement, 'created');
+svg$.MaskElement[dart.implements] = () => [svg$.Tests];
+dart.setSignature(svg$.MaskElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.MaskElement, []),
-    new: dart.definiteFunctionType(svg.MaskElement, []),
-    created: dart.definiteFunctionType(svg.MaskElement, [])
+    _: dart.definiteFunctionType(svg$.MaskElement, []),
+    new: dart.definiteFunctionType(svg$.MaskElement, []),
+    created: dart.definiteFunctionType(svg$.MaskElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.maskContentUnits]: svg.AnimatedEnumeration,
-    [dartx.maskUnits]: svg.AnimatedEnumeration,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.requiredExtensions]: svg.StringList,
-    [dartx.requiredFeatures]: svg.StringList,
-    [dartx.systemLanguage]: svg.StringList
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.maskContentUnits]: svg$.AnimatedEnumeration,
+    [dartx.maskUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList
   }),
   methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
 });
-dart.registerExtension(dart.global.SVGMaskElement, svg.MaskElement);
+dart.registerExtension(dart.global.SVGMaskElement, svg$.MaskElement);
 dart.defineExtensionNames([
   'flipX',
   'flipY',
@@ -103774,7 +103777,7 @@
   'e',
   'f'
 ]);
-svg.Matrix = class Matrix extends _interceptors.Interceptor {
+svg$.Matrix = class Matrix extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103848,8 +103851,8 @@
     return this.translate.apply(this, args);
   }
 };
-dart.setSignature(svg.Matrix, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Matrix, [])}),
+dart.setSignature(svg$.Matrix, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Matrix, [])}),
   fields: () => ({
     [dartx.a]: core.num,
     [dartx.b]: core.num,
@@ -103859,21 +103862,21 @@
     [dartx.f]: core.num
   }),
   methods: () => ({
-    [dartx.flipX]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.flipY]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.inverse]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.multiply]: dart.definiteFunctionType(svg.Matrix, [svg.Matrix]),
-    [dartx.rotate]: dart.definiteFunctionType(svg.Matrix, [core.num]),
-    [dartx.rotateFromVector]: dart.definiteFunctionType(svg.Matrix, [core.num, core.num]),
-    [dartx.scale]: dart.definiteFunctionType(svg.Matrix, [core.num]),
-    [dartx.scaleNonUniform]: dart.definiteFunctionType(svg.Matrix, [core.num, core.num]),
-    [dartx.skewX]: dart.definiteFunctionType(svg.Matrix, [core.num]),
-    [dartx.skewY]: dart.definiteFunctionType(svg.Matrix, [core.num]),
-    [dartx.translate]: dart.definiteFunctionType(svg.Matrix, [core.num, core.num])
+    [dartx.flipX]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.flipY]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.inverse]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.multiply]: dart.definiteFunctionType(svg$.Matrix, [svg$.Matrix]),
+    [dartx.rotate]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.rotateFromVector]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
+    [dartx.scale]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.scaleNonUniform]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num]),
+    [dartx.skewX]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.skewY]: dart.definiteFunctionType(svg$.Matrix, [core.num]),
+    [dartx.translate]: dart.definiteFunctionType(svg$.Matrix, [core.num, core.num])
   })
 });
-dart.registerExtension(dart.global.SVGMatrix, svg.Matrix);
-svg.MetadataElement = class MetadataElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGMatrix, svg$.Matrix);
+svg$.MetadataElement = class MetadataElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103881,18 +103884,18 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.MetadataElement, 'created');
-dart.setSignature(svg.MetadataElement, {
+dart.defineNamedConstructor(svg$.MetadataElement, 'created');
+dart.setSignature(svg$.MetadataElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.MetadataElement, []),
-    created: dart.definiteFunctionType(svg.MetadataElement, [])
+    _: dart.definiteFunctionType(svg$.MetadataElement, []),
+    created: dart.definiteFunctionType(svg$.MetadataElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGMetadataElement, svg.MetadataElement);
+dart.registerExtension(dart.global.SVGMetadataElement, svg$.MetadataElement);
 dart.defineExtensionNames([
   'value'
 ]);
-svg.Number = class Number extends _interceptors.Interceptor {
+svg$.Number = class Number extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103903,11 +103906,11 @@
     this.value = value;
   }
 };
-dart.setSignature(svg.Number, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Number, [])}),
+dart.setSignature(svg$.Number, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Number, [])}),
   fields: () => ({[dartx.value]: core.num})
 });
-dart.registerExtension(dart.global.SVGNumber, svg.Number);
+dart.registerExtension(dart.global.SVGNumber, svg$.Number);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -103926,7 +103929,7 @@
   'replaceItem',
   'numberOfItems'
 ]);
-svg.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg.Number), html.ImmutableListMixin$(svg.Number)) {
+svg$.NumberList = class NumberList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Number), html$.ImmutableListMixin$(svg$.Number)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -103971,7 +103974,7 @@
   [dartx.elementAt](index) {
     return this[dartx._get](index);
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -103996,25 +103999,25 @@
     return this.replaceItem.apply(this, args);
   }
 };
-svg.NumberList[dart.implements] = () => [ListOfNumber()];
-dart.setSignature(svg.NumberList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.NumberList, [])}),
+svg$.NumberList[dart.implements] = () => [ListOfNumber()];
+dart.setSignature(svg$.NumberList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.NumberList, [])}),
   fields: () => ({[dartx.numberOfItems]: core.int}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(svg.Number, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg.Number]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, svg.Number]),
-    [dartx.appendItem]: dart.definiteFunctionType(svg.Number, [svg.Number]),
-    [dartx.getItem]: dart.definiteFunctionType(svg.Number, [core.int]),
-    [dartx.initialize]: dart.definiteFunctionType(svg.Number, [svg.Number]),
-    [dartx.insertItemBefore]: dart.definiteFunctionType(svg.Number, [svg.Number, core.int]),
-    [dartx.removeItem]: dart.definiteFunctionType(svg.Number, [core.int]),
-    [dartx.replaceItem]: dart.definiteFunctionType(svg.Number, [svg.Number, core.int])
+    [dartx._get]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Number]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Number, [svg$.Number]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Number, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Number, [svg$.Number, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGNumberList, svg.NumberList);
+dart.registerExtension(dart.global.SVGNumberList, svg$.NumberList);
 dart.defineExtensionNames([
   'createSvgPathSegArcAbs',
   'createSvgPathSegArcRel',
@@ -104044,12 +104047,12 @@
   'pathLength',
   'pathSegList'
 ]);
-svg.PathElement = class PathElement extends svg.GeometryElement {
+svg$.PathElement = class PathElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.PathElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("path"));
+    return svg$.PathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("path"));
   }
   created() {
     this[dartx.animatedNormalizedPathSegList] = null;
@@ -104141,51 +104144,51 @@
     return this.getTotalLength.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.PathElement, 'created');
-dart.setSignature(svg.PathElement, {
+dart.defineNamedConstructor(svg$.PathElement, 'created');
+dart.setSignature(svg$.PathElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.PathElement, []),
-    new: dart.definiteFunctionType(svg.PathElement, []),
-    created: dart.definiteFunctionType(svg.PathElement, [])
+    _: dart.definiteFunctionType(svg$.PathElement, []),
+    new: dart.definiteFunctionType(svg$.PathElement, []),
+    created: dart.definiteFunctionType(svg$.PathElement, [])
   }),
   fields: () => ({
-    [dartx.animatedNormalizedPathSegList]: svg.PathSegList,
-    [dartx.animatedPathSegList]: svg.PathSegList,
-    [dartx.normalizedPathSegList]: svg.PathSegList,
-    [dartx.pathLength]: svg.AnimatedNumber,
-    [dartx.pathSegList]: svg.PathSegList
+    [dartx.animatedNormalizedPathSegList]: svg$.PathSegList,
+    [dartx.animatedPathSegList]: svg$.PathSegList,
+    [dartx.normalizedPathSegList]: svg$.PathSegList,
+    [dartx.pathLength]: svg$.AnimatedNumber,
+    [dartx.pathSegList]: svg$.PathSegList
   }),
   methods: () => ({
-    [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
-    [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
-    [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg.PathSegClosePath, []),
-    [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
-    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
-    [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg.PathSegLinetoAbs, [core.num, core.num]),
-    [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg.PathSegLinetoHorizontalAbs, [core.num]),
-    [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg.PathSegLinetoHorizontalRel, [core.num]),
-    [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg.PathSegLinetoRel, [core.num, core.num]),
-    [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg.PathSegLinetoVerticalAbs, [core.num]),
-    [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg.PathSegLinetoVerticalRel, [core.num]),
-    [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg.PathSegMovetoAbs, [core.num, core.num]),
-    [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg.PathSegMovetoRel, [core.num, core.num]),
+    [dartx.createSvgPathSegArcAbs]: dart.definiteFunctionType(svg$.PathSegArcAbs, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
+    [dartx.createSvgPathSegArcRel]: dart.definiteFunctionType(svg$.PathSegArcRel, [core.num, core.num, core.num, core.num, core.num, core.bool, core.bool]),
+    [dartx.createSvgPathSegClosePath]: dart.definiteFunctionType(svg$.PathSegClosePath, []),
+    [dartx.createSvgPathSegCurvetoCubicAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [core.num, core.num, core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoCubicSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [core.num, core.num, core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticSmoothAbs]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegCurvetoQuadraticSmoothRel]: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoAbs]: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoHorizontalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [core.num]),
+    [dartx.createSvgPathSegLinetoHorizontalRel]: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [core.num]),
+    [dartx.createSvgPathSegLinetoRel]: dart.definiteFunctionType(svg$.PathSegLinetoRel, [core.num, core.num]),
+    [dartx.createSvgPathSegLinetoVerticalAbs]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [core.num]),
+    [dartx.createSvgPathSegLinetoVerticalRel]: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [core.num]),
+    [dartx.createSvgPathSegMovetoAbs]: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [core.num, core.num]),
+    [dartx.createSvgPathSegMovetoRel]: dart.definiteFunctionType(svg$.PathSegMovetoRel, [core.num, core.num]),
     [dartx.getPathSegAtLength]: dart.definiteFunctionType(core.int, [core.num]),
-    [dartx.getPointAtLength]: dart.definiteFunctionType(svg.Point, [core.num]),
+    [dartx.getPointAtLength]: dart.definiteFunctionType(svg$.Point, [core.num]),
     [dartx.getTotalLength]: dart.definiteFunctionType(core.double, [])
   })
 });
-dart.registerExtension(dart.global.SVGPathElement, svg.PathElement);
+dart.registerExtension(dart.global.SVGPathElement, svg$.PathElement);
 dart.defineExtensionNames([
   'pathSegType',
   'pathSegTypeAsLetter'
 ]);
-svg.PathSeg = class PathSeg extends _interceptors.Interceptor {
+svg$.PathSeg = class PathSeg extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104196,8 +104199,8 @@
     return this.pathSegTypeAsLetter;
   }
 };
-dart.setSignature(svg.PathSeg, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSeg, [])}),
+dart.setSignature(svg$.PathSeg, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSeg, [])}),
   fields: () => ({
     [dartx.pathSegType]: core.int,
     [dartx.pathSegTypeAsLetter]: core.String
@@ -104225,27 +104228,27 @@
     PATHSEG_UNKNOWN: core.int
   })
 });
-svg.PathSeg.PATHSEG_ARC_ABS = 10;
-svg.PathSeg.PATHSEG_ARC_REL = 11;
-svg.PathSeg.PATHSEG_CLOSEPATH = 1;
-svg.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
-svg.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
-svg.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
-svg.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
-svg.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
-svg.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
-svg.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
-svg.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
-svg.PathSeg.PATHSEG_LINETO_ABS = 4;
-svg.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
-svg.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
-svg.PathSeg.PATHSEG_LINETO_REL = 5;
-svg.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
-svg.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
-svg.PathSeg.PATHSEG_MOVETO_ABS = 2;
-svg.PathSeg.PATHSEG_MOVETO_REL = 3;
-svg.PathSeg.PATHSEG_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGPathSeg, svg.PathSeg);
+svg$.PathSeg.PATHSEG_ARC_ABS = 10;
+svg$.PathSeg.PATHSEG_ARC_REL = 11;
+svg$.PathSeg.PATHSEG_CLOSEPATH = 1;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+svg$.PathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
+svg$.PathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
+svg$.PathSeg.PATHSEG_LINETO_ABS = 4;
+svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+svg$.PathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;
+svg$.PathSeg.PATHSEG_LINETO_REL = 5;
+svg$.PathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;
+svg$.PathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;
+svg$.PathSeg.PATHSEG_MOVETO_ABS = 2;
+svg$.PathSeg.PATHSEG_MOVETO_REL = 3;
+svg$.PathSeg.PATHSEG_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGPathSeg, svg$.PathSeg);
 dart.defineExtensionNames([
   'angle',
   'largeArcFlag',
@@ -104255,7 +104258,7 @@
   'x',
   'y'
 ]);
-svg.PathSegArcAbs = class PathSegArcAbs extends svg.PathSeg {
+svg$.PathSegArcAbs = class PathSegArcAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104302,8 +104305,8 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegArcAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegArcAbs, [])}),
+dart.setSignature(svg$.PathSegArcAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcAbs, [])}),
   fields: () => ({
     [dartx.angle]: core.num,
     [dartx.largeArcFlag]: core.bool,
@@ -104314,7 +104317,7 @@
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegArcAbs, svg.PathSegArcAbs);
+dart.registerExtension(dart.global.SVGPathSegArcAbs, svg$.PathSegArcAbs);
 dart.defineExtensionNames([
   'angle',
   'largeArcFlag',
@@ -104324,7 +104327,7 @@
   'x',
   'y'
 ]);
-svg.PathSegArcRel = class PathSegArcRel extends svg.PathSeg {
+svg$.PathSegArcRel = class PathSegArcRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104371,8 +104374,8 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegArcRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegArcRel, [])}),
+dart.setSignature(svg$.PathSegArcRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegArcRel, [])}),
   fields: () => ({
     [dartx.angle]: core.num,
     [dartx.largeArcFlag]: core.bool,
@@ -104383,16 +104386,16 @@
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegArcRel, svg.PathSegArcRel);
-svg.PathSegClosePath = class PathSegClosePath extends svg.PathSeg {
+dart.registerExtension(dart.global.SVGPathSegArcRel, svg$.PathSegArcRel);
+svg$.PathSegClosePath = class PathSegClosePath extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(svg.PathSegClosePath, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegClosePath, [])})
+dart.setSignature(svg$.PathSegClosePath, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegClosePath, [])})
 });
-dart.registerExtension(dart.global.SVGPathSegClosePath, svg.PathSegClosePath);
+dart.registerExtension(dart.global.SVGPathSegClosePath, svg$.PathSegClosePath);
 dart.defineExtensionNames([
   'x',
   'x1',
@@ -104401,7 +104404,7 @@
   'y1',
   'y2'
 ]);
-svg.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg.PathSeg {
+svg$.PathSegCurvetoCubicAbs = class PathSegCurvetoCubicAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104442,8 +104445,8 @@
     this.y2 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoCubicAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoCubicAbs, [])}),
+dart.setSignature(svg$.PathSegCurvetoCubicAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x1]: core.num,
@@ -104453,7 +104456,7 @@
     [dartx.y2]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg.PathSegCurvetoCubicAbs);
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicAbs, svg$.PathSegCurvetoCubicAbs);
 dart.defineExtensionNames([
   'x',
   'x1',
@@ -104462,7 +104465,7 @@
   'y1',
   'y2'
 ]);
-svg.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg.PathSeg {
+svg$.PathSegCurvetoCubicRel = class PathSegCurvetoCubicRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104503,8 +104506,8 @@
     this.y2 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoCubicRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoCubicRel, [])}),
+dart.setSignature(svg$.PathSegCurvetoCubicRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x1]: core.num,
@@ -104514,14 +104517,14 @@
     [dartx.y2]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg.PathSegCurvetoCubicRel);
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicRel, svg$.PathSegCurvetoCubicRel);
 dart.defineExtensionNames([
   'x',
   'x2',
   'y',
   'y2'
 ]);
-svg.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg.PathSeg {
+svg$.PathSegCurvetoCubicSmoothAbs = class PathSegCurvetoCubicSmoothAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104550,8 +104553,8 @@
     this.y2 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoCubicSmoothAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoCubicSmoothAbs, [])}),
+dart.setSignature(svg$.PathSegCurvetoCubicSmoothAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x2]: core.num,
@@ -104559,14 +104562,14 @@
     [dartx.y2]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg.PathSegCurvetoCubicSmoothAbs);
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothAbs, svg$.PathSegCurvetoCubicSmoothAbs);
 dart.defineExtensionNames([
   'x',
   'x2',
   'y',
   'y2'
 ]);
-svg.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg.PathSeg {
+svg$.PathSegCurvetoCubicSmoothRel = class PathSegCurvetoCubicSmoothRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104595,8 +104598,8 @@
     this.y2 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoCubicSmoothRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoCubicSmoothRel, [])}),
+dart.setSignature(svg$.PathSegCurvetoCubicSmoothRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoCubicSmoothRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x2]: core.num,
@@ -104604,14 +104607,14 @@
     [dartx.y2]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg.PathSegCurvetoCubicSmoothRel);
+dart.registerExtension(dart.global.SVGPathSegCurvetoCubicSmoothRel, svg$.PathSegCurvetoCubicSmoothRel);
 dart.defineExtensionNames([
   'x',
   'x1',
   'y',
   'y1'
 ]);
-svg.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg.PathSeg {
+svg$.PathSegCurvetoQuadraticAbs = class PathSegCurvetoQuadraticAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104640,8 +104643,8 @@
     this.y1 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoQuadraticAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticAbs, [])}),
+dart.setSignature(svg$.PathSegCurvetoQuadraticAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x1]: core.num,
@@ -104649,14 +104652,14 @@
     [dartx.y1]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg.PathSegCurvetoQuadraticAbs);
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticAbs, svg$.PathSegCurvetoQuadraticAbs);
 dart.defineExtensionNames([
   'x',
   'x1',
   'y',
   'y1'
 ]);
-svg.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg.PathSeg {
+svg$.PathSegCurvetoQuadraticRel = class PathSegCurvetoQuadraticRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104685,8 +104688,8 @@
     this.y1 = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoQuadraticRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticRel, [])}),
+dart.setSignature(svg$.PathSegCurvetoQuadraticRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.x1]: core.num,
@@ -104694,12 +104697,12 @@
     [dartx.y1]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg.PathSegCurvetoQuadraticRel);
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticRel, svg$.PathSegCurvetoQuadraticRel);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg.PathSeg {
+svg$.PathSegCurvetoQuadraticSmoothAbs = class PathSegCurvetoQuadraticSmoothAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104716,19 +104719,19 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoQuadraticSmoothAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticSmoothAbs, [])}),
+dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg.PathSegCurvetoQuadraticSmoothAbs);
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothAbs, svg$.PathSegCurvetoQuadraticSmoothAbs);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg.PathSeg {
+svg$.PathSegCurvetoQuadraticSmoothRel = class PathSegCurvetoQuadraticSmoothRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104745,19 +104748,19 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegCurvetoQuadraticSmoothRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegCurvetoQuadraticSmoothRel, [])}),
+dart.setSignature(svg$.PathSegCurvetoQuadraticSmoothRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegCurvetoQuadraticSmoothRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg.PathSegCurvetoQuadraticSmoothRel);
+dart.registerExtension(dart.global.SVGPathSegCurvetoQuadraticSmoothRel, svg$.PathSegCurvetoQuadraticSmoothRel);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegLinetoAbs = class PathSegLinetoAbs extends svg.PathSeg {
+svg$.PathSegLinetoAbs = class PathSegLinetoAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104774,18 +104777,18 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoAbs, [])}),
+dart.setSignature(svg$.PathSegLinetoAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg.PathSegLinetoAbs);
+dart.registerExtension(dart.global.SVGPathSegLinetoAbs, svg$.PathSegLinetoAbs);
 dart.defineExtensionNames([
   'x'
 ]);
-svg.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg.PathSeg {
+svg$.PathSegLinetoHorizontalAbs = class PathSegLinetoHorizontalAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104796,15 +104799,15 @@
     this.x = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoHorizontalAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoHorizontalAbs, [])}),
+dart.setSignature(svg$.PathSegLinetoHorizontalAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalAbs, [])}),
   fields: () => ({[dartx.x]: core.num})
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg.PathSegLinetoHorizontalAbs);
+dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalAbs, svg$.PathSegLinetoHorizontalAbs);
 dart.defineExtensionNames([
   'x'
 ]);
-svg.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg.PathSeg {
+svg$.PathSegLinetoHorizontalRel = class PathSegLinetoHorizontalRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104815,16 +104818,16 @@
     this.x = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoHorizontalRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoHorizontalRel, [])}),
+dart.setSignature(svg$.PathSegLinetoHorizontalRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoHorizontalRel, [])}),
   fields: () => ({[dartx.x]: core.num})
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg.PathSegLinetoHorizontalRel);
+dart.registerExtension(dart.global.SVGPathSegLinetoHorizontalRel, svg$.PathSegLinetoHorizontalRel);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegLinetoRel = class PathSegLinetoRel extends svg.PathSeg {
+svg$.PathSegLinetoRel = class PathSegLinetoRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104841,18 +104844,18 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoRel, [])}),
+dart.setSignature(svg$.PathSegLinetoRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg.PathSegLinetoRel);
+dart.registerExtension(dart.global.SVGPathSegLinetoRel, svg$.PathSegLinetoRel);
 dart.defineExtensionNames([
   'y'
 ]);
-svg.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg.PathSeg {
+svg$.PathSegLinetoVerticalAbs = class PathSegLinetoVerticalAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104863,15 +104866,15 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoVerticalAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoVerticalAbs, [])}),
+dart.setSignature(svg$.PathSegLinetoVerticalAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalAbs, [])}),
   fields: () => ({[dartx.y]: core.num})
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg.PathSegLinetoVerticalAbs);
+dart.registerExtension(dart.global.SVGPathSegLinetoVerticalAbs, svg$.PathSegLinetoVerticalAbs);
 dart.defineExtensionNames([
   'y'
 ]);
-svg.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg.PathSeg {
+svg$.PathSegLinetoVerticalRel = class PathSegLinetoVerticalRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104882,11 +104885,11 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegLinetoVerticalRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegLinetoVerticalRel, [])}),
+dart.setSignature(svg$.PathSegLinetoVerticalRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegLinetoVerticalRel, [])}),
   fields: () => ({[dartx.y]: core.num})
 });
-dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg.PathSegLinetoVerticalRel);
+dart.registerExtension(dart.global.SVGPathSegLinetoVerticalRel, svg$.PathSegLinetoVerticalRel);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -104905,7 +104908,7 @@
   'replaceItem',
   'numberOfItems'
 ]);
-svg.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg.PathSeg), html.ImmutableListMixin$(svg.PathSeg)) {
+svg$.PathSegList = class PathSegList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.PathSeg), html$.ImmutableListMixin$(svg$.PathSeg)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -104950,7 +104953,7 @@
   [dartx.elementAt](index) {
     return this[dartx._get](index);
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -104975,30 +104978,30 @@
     return this.replaceItem.apply(this, args);
   }
 };
-svg.PathSegList[dart.implements] = () => [ListOfPathSeg()];
-dart.setSignature(svg.PathSegList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegList, [])}),
+svg$.PathSegList[dart.implements] = () => [ListOfPathSeg()];
+dart.setSignature(svg$.PathSegList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegList, [])}),
   fields: () => ({[dartx.numberOfItems]: core.int}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(svg.PathSeg, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg.PathSeg]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, svg.PathSeg]),
-    [dartx.appendItem]: dart.definiteFunctionType(svg.PathSeg, [svg.PathSeg]),
-    [dartx.getItem]: dart.definiteFunctionType(svg.PathSeg, [core.int]),
-    [dartx.initialize]: dart.definiteFunctionType(svg.PathSeg, [svg.PathSeg]),
-    [dartx.insertItemBefore]: dart.definiteFunctionType(svg.PathSeg, [svg.PathSeg, core.int]),
-    [dartx.removeItem]: dart.definiteFunctionType(svg.PathSeg, [core.int]),
-    [dartx.replaceItem]: dart.definiteFunctionType(svg.PathSeg, [svg.PathSeg, core.int])
+    [dartx._get]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.PathSeg]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.PathSeg, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.PathSeg, [svg$.PathSeg, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGPathSegList, svg.PathSegList);
+dart.registerExtension(dart.global.SVGPathSegList, svg$.PathSegList);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegMovetoAbs = class PathSegMovetoAbs extends svg.PathSeg {
+svg$.PathSegMovetoAbs = class PathSegMovetoAbs extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105015,19 +105018,19 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegMovetoAbs, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegMovetoAbs, [])}),
+dart.setSignature(svg$.PathSegMovetoAbs, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoAbs, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg.PathSegMovetoAbs);
+dart.registerExtension(dart.global.SVGPathSegMovetoAbs, svg$.PathSegMovetoAbs);
 dart.defineExtensionNames([
   'x',
   'y'
 ]);
-svg.PathSegMovetoRel = class PathSegMovetoRel extends svg.PathSeg {
+svg$.PathSegMovetoRel = class PathSegMovetoRel extends svg$.PathSeg {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105044,14 +105047,14 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.PathSegMovetoRel, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PathSegMovetoRel, [])}),
+dart.setSignature(svg$.PathSegMovetoRel, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PathSegMovetoRel, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg.PathSegMovetoRel);
+dart.registerExtension(dart.global.SVGPathSegMovetoRel, svg$.PathSegMovetoRel);
 dart.defineExtensionNames([
   'hasExtension',
   'height',
@@ -105068,12 +105071,12 @@
   'systemLanguage',
   'href'
 ]);
-svg.PatternElement = class PatternElement extends svg.SvgElement {
+svg$.PatternElement = class PatternElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.PatternElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
+    return svg$.PatternElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("pattern"));
   }
   created() {
     this[dartx.height] = null;
@@ -105134,38 +105137,38 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.PatternElement, 'created');
-svg.PatternElement[dart.implements] = () => [svg.FitToViewBox, svg.UriReference, svg.Tests];
-dart.setSignature(svg.PatternElement, {
+dart.defineNamedConstructor(svg$.PatternElement, 'created');
+svg$.PatternElement[dart.implements] = () => [svg$.FitToViewBox, svg$.UriReference, svg$.Tests];
+dart.setSignature(svg$.PatternElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.PatternElement, []),
-    new: dart.definiteFunctionType(svg.PatternElement, []),
-    created: dart.definiteFunctionType(svg.PatternElement, [])
+    _: dart.definiteFunctionType(svg$.PatternElement, []),
+    new: dart.definiteFunctionType(svg$.PatternElement, []),
+    created: dart.definiteFunctionType(svg$.PatternElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.patternContentUnits]: svg.AnimatedEnumeration,
-    [dartx.patternTransform]: svg.AnimatedTransformList,
-    [dartx.patternUnits]: svg.AnimatedEnumeration,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect,
-    [dartx.requiredExtensions]: svg.StringList,
-    [dartx.requiredFeatures]: svg.StringList,
-    [dartx.systemLanguage]: svg.StringList,
-    [dartx.href]: svg.AnimatedString
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.patternContentUnits]: svg$.AnimatedEnumeration,
+    [dartx.patternTransform]: svg$.AnimatedTransformList,
+    [dartx.patternUnits]: svg$.AnimatedEnumeration,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
+    [dartx.requiredExtensions]: svg$.StringList,
+    [dartx.requiredFeatures]: svg$.StringList,
+    [dartx.systemLanguage]: svg$.StringList,
+    [dartx.href]: svg$.AnimatedString
   }),
   methods: () => ({[dartx.hasExtension]: dart.definiteFunctionType(core.bool, [core.String])})
 });
-dart.registerExtension(dart.global.SVGPatternElement, svg.PatternElement);
+dart.registerExtension(dart.global.SVGPatternElement, svg$.PatternElement);
 dart.defineExtensionNames([
   'matrixTransform',
   'x',
   'y'
 ]);
-svg.Point = class Point extends _interceptors.Interceptor {
+svg$.Point = class Point extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105185,15 +105188,15 @@
     return this.matrixTransform.apply(this, args);
   }
 };
-dart.setSignature(svg.Point, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Point, [])}),
+dart.setSignature(svg$.Point, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Point, [])}),
   fields: () => ({
     [dartx.x]: core.num,
     [dartx.y]: core.num
   }),
-  methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg.Point, [svg.Matrix])})
+  methods: () => ({[dartx.matrixTransform]: dart.definiteFunctionType(svg$.Point, [svg$.Matrix])})
 });
-dart.registerExtension(dart.global.SVGPoint, svg.Point);
+dart.registerExtension(dart.global.SVGPoint, svg$.Point);
 dart.defineExtensionNames([
   'appendItem',
   'clear',
@@ -105205,7 +105208,7 @@
   'length',
   'numberOfItems'
 ]);
-svg.PointList = class PointList extends _interceptors.Interceptor {
+svg$.PointList = class PointList extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105215,7 +105218,7 @@
   get [dartx.numberOfItems]() {
     return this.numberOfItems;
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -105240,34 +105243,34 @@
     return this.replaceItem.apply(this, args);
   }
 };
-dart.setSignature(svg.PointList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PointList, [])}),
+dart.setSignature(svg$.PointList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PointList, [])}),
   fields: () => ({
     [dartx.length]: core.int,
     [dartx.numberOfItems]: core.int
   }),
   methods: () => ({
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, svg.Point]),
-    [dartx.appendItem]: dart.definiteFunctionType(svg.Point, [svg.Point]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Point]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
     [dartx.clear]: dart.definiteFunctionType(dart.void, []),
-    [dartx.getItem]: dart.definiteFunctionType(svg.Point, [core.int]),
-    [dartx.initialize]: dart.definiteFunctionType(svg.Point, [svg.Point]),
-    [dartx.insertItemBefore]: dart.definiteFunctionType(svg.Point, [svg.Point, core.int]),
-    [dartx.removeItem]: dart.definiteFunctionType(svg.Point, [core.int]),
-    [dartx.replaceItem]: dart.definiteFunctionType(svg.Point, [svg.Point, core.int])
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Point, [svg$.Point]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Point, [svg$.Point, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGPointList, svg.PointList);
+dart.registerExtension(dart.global.SVGPointList, svg$.PointList);
 dart.defineExtensionNames([
   'animatedPoints',
   'points'
 ]);
-svg.PolygonElement = class PolygonElement extends svg.GeometryElement {
+svg$.PolygonElement = class PolygonElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.PolygonElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
+    return svg$.PolygonElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polygon"));
   }
   created() {
     this[dartx.animatedPoints] = null;
@@ -105281,29 +105284,29 @@
     return this.points;
   }
 };
-dart.defineNamedConstructor(svg.PolygonElement, 'created');
-dart.setSignature(svg.PolygonElement, {
+dart.defineNamedConstructor(svg$.PolygonElement, 'created');
+dart.setSignature(svg$.PolygonElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.PolygonElement, []),
-    new: dart.definiteFunctionType(svg.PolygonElement, []),
-    created: dart.definiteFunctionType(svg.PolygonElement, [])
+    _: dart.definiteFunctionType(svg$.PolygonElement, []),
+    new: dart.definiteFunctionType(svg$.PolygonElement, []),
+    created: dart.definiteFunctionType(svg$.PolygonElement, [])
   }),
   fields: () => ({
-    [dartx.animatedPoints]: svg.PointList,
-    [dartx.points]: svg.PointList
+    [dartx.animatedPoints]: svg$.PointList,
+    [dartx.points]: svg$.PointList
   })
 });
-dart.registerExtension(dart.global.SVGPolygonElement, svg.PolygonElement);
+dart.registerExtension(dart.global.SVGPolygonElement, svg$.PolygonElement);
 dart.defineExtensionNames([
   'animatedPoints',
   'points'
 ]);
-svg.PolylineElement = class PolylineElement extends svg.GeometryElement {
+svg$.PolylineElement = class PolylineElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.PolylineElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
+    return svg$.PolylineElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("polyline"));
   }
   created() {
     this[dartx.animatedPoints] = null;
@@ -105317,24 +105320,24 @@
     return this.points;
   }
 };
-dart.defineNamedConstructor(svg.PolylineElement, 'created');
-dart.setSignature(svg.PolylineElement, {
+dart.defineNamedConstructor(svg$.PolylineElement, 'created');
+dart.setSignature(svg$.PolylineElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.PolylineElement, []),
-    new: dart.definiteFunctionType(svg.PolylineElement, []),
-    created: dart.definiteFunctionType(svg.PolylineElement, [])
+    _: dart.definiteFunctionType(svg$.PolylineElement, []),
+    new: dart.definiteFunctionType(svg$.PolylineElement, []),
+    created: dart.definiteFunctionType(svg$.PolylineElement, [])
   }),
   fields: () => ({
-    [dartx.animatedPoints]: svg.PointList,
-    [dartx.points]: svg.PointList
+    [dartx.animatedPoints]: svg$.PointList,
+    [dartx.points]: svg$.PointList
   })
 });
-dart.registerExtension(dart.global.SVGPolylineElement, svg.PolylineElement);
+dart.registerExtension(dart.global.SVGPolylineElement, svg$.PolylineElement);
 dart.defineExtensionNames([
   'align',
   'meetOrSlice'
 ]);
-svg.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
+svg$.PreserveAspectRatio = class PreserveAspectRatio extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105351,8 +105354,8 @@
     this.meetOrSlice = value;
   }
 };
-dart.setSignature(svg.PreserveAspectRatio, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.PreserveAspectRatio, [])}),
+dart.setSignature(svg$.PreserveAspectRatio, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.PreserveAspectRatio, [])}),
   fields: () => ({
     [dartx.align]: core.int,
     [dartx.meetOrSlice]: core.int
@@ -105374,21 +105377,21 @@
     SVG_PRESERVEASPECTRATIO_XMINYMIN: core.int
   })
 });
-svg.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
-svg.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
-svg.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
-svg.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
-dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg.PreserveAspectRatio);
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_MEET = 1;
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_SLICE = 2;
+svg$.PreserveAspectRatio.SVG_MEETORSLICE_UNKNOWN = 0;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE = 1;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_UNKNOWN = 0;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMID = 7;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMID = 6;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMAX = 8;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMID = 5;
+svg$.PreserveAspectRatio.SVG_PRESERVEASPECTRATIO_XMINYMIN = 2;
+dart.registerExtension(dart.global.SVGPreserveAspectRatio, svg$.PreserveAspectRatio);
 dart.defineExtensionNames([
   'cx',
   'cy',
@@ -105397,12 +105400,12 @@
   'fy',
   'r'
 ]);
-svg.RadialGradientElement = class RadialGradientElement extends svg._GradientElement {
+svg$.RadialGradientElement = class RadialGradientElement extends svg$._GradientElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.RadialGradientElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
+    return svg$.RadialGradientElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("radialGradient"));
   }
   created() {
     this[dartx.cx] = null;
@@ -105432,30 +105435,30 @@
     return this.r;
   }
 };
-dart.defineNamedConstructor(svg.RadialGradientElement, 'created');
-dart.setSignature(svg.RadialGradientElement, {
+dart.defineNamedConstructor(svg$.RadialGradientElement, 'created');
+dart.setSignature(svg$.RadialGradientElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.RadialGradientElement, []),
-    new: dart.definiteFunctionType(svg.RadialGradientElement, []),
-    created: dart.definiteFunctionType(svg.RadialGradientElement, [])
+    _: dart.definiteFunctionType(svg$.RadialGradientElement, []),
+    new: dart.definiteFunctionType(svg$.RadialGradientElement, []),
+    created: dart.definiteFunctionType(svg$.RadialGradientElement, [])
   }),
   fields: () => ({
-    [dartx.cx]: svg.AnimatedLength,
-    [dartx.cy]: svg.AnimatedLength,
-    [dartx.fr]: svg.AnimatedLength,
-    [dartx.fx]: svg.AnimatedLength,
-    [dartx.fy]: svg.AnimatedLength,
-    [dartx.r]: svg.AnimatedLength
+    [dartx.cx]: svg$.AnimatedLength,
+    [dartx.cy]: svg$.AnimatedLength,
+    [dartx.fr]: svg$.AnimatedLength,
+    [dartx.fx]: svg$.AnimatedLength,
+    [dartx.fy]: svg$.AnimatedLength,
+    [dartx.r]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGRadialGradientElement, svg.RadialGradientElement);
+dart.registerExtension(dart.global.SVGRadialGradientElement, svg$.RadialGradientElement);
 dart.defineExtensionNames([
   'height',
   'width',
   'x',
   'y'
 ]);
-svg.Rect = class Rect extends _interceptors.Interceptor {
+svg$.Rect = class Rect extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105484,8 +105487,8 @@
     this.y = value;
   }
 };
-dart.setSignature(svg.Rect, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Rect, [])}),
+dart.setSignature(svg$.Rect, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Rect, [])}),
   fields: () => ({
     [dartx.height]: core.num,
     [dartx.width]: core.num,
@@ -105493,7 +105496,7 @@
     [dartx.y]: core.num
   })
 });
-dart.registerExtension(dart.global.SVGRect, svg.Rect);
+dart.registerExtension(dart.global.SVGRect, svg$.Rect);
 dart.defineExtensionNames([
   'height',
   'rx',
@@ -105502,12 +105505,12 @@
   'x',
   'y'
 ]);
-svg.RectElement = class RectElement extends svg.GeometryElement {
+svg$.RectElement = class RectElement extends svg$.GeometryElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.RectElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("rect"));
+    return svg$.RectElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("rect"));
   }
   created() {
     this[dartx.height] = null;
@@ -105537,33 +105540,33 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.RectElement, 'created');
-dart.setSignature(svg.RectElement, {
+dart.defineNamedConstructor(svg$.RectElement, 'created');
+dart.setSignature(svg$.RectElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.RectElement, []),
-    new: dart.definiteFunctionType(svg.RectElement, []),
-    created: dart.definiteFunctionType(svg.RectElement, [])
+    _: dart.definiteFunctionType(svg$.RectElement, []),
+    new: dart.definiteFunctionType(svg$.RectElement, []),
+    created: dart.definiteFunctionType(svg$.RectElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.rx]: svg.AnimatedLength,
-    [dartx.ry]: svg.AnimatedLength,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.rx]: svg$.AnimatedLength,
+    [dartx.ry]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength
   })
 });
-dart.registerExtension(dart.global.SVGRectElement, svg.RectElement);
+dart.registerExtension(dart.global.SVGRectElement, svg$.RectElement);
 dart.defineExtensionNames([
   'type',
   'href'
 ]);
-svg.ScriptElement = class ScriptElement extends svg.SvgElement {
+svg$.ScriptElement = class ScriptElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.ScriptElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("script"));
+    return svg$.ScriptElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("script"));
   }
   created() {
     this[dartx.type] = null;
@@ -105580,53 +105583,53 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.ScriptElement, 'created');
-svg.ScriptElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.ScriptElement, {
+dart.defineNamedConstructor(svg$.ScriptElement, 'created');
+svg$.ScriptElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.ScriptElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.ScriptElement, []),
-    new: dart.definiteFunctionType(svg.ScriptElement, []),
-    created: dart.definiteFunctionType(svg.ScriptElement, [])
+    _: dart.definiteFunctionType(svg$.ScriptElement, []),
+    new: dart.definiteFunctionType(svg$.ScriptElement, []),
+    created: dart.definiteFunctionType(svg$.ScriptElement, [])
   }),
   fields: () => ({
     [dartx.type]: core.String,
-    [dartx.href]: svg.AnimatedString
+    [dartx.href]: svg$.AnimatedString
   })
 });
-dart.registerExtension(dart.global.SVGScriptElement, svg.ScriptElement);
-svg.SetElement = class SetElement extends svg.AnimationElement {
+dart.registerExtension(dart.global.SVGScriptElement, svg$.ScriptElement);
+svg$.SetElement = class SetElement extends svg$.AnimationElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.SetElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("set"));
+    return svg$.SetElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("set"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('set')) && svg.SetElement.is(svg.SvgElement.tag('set'));
+    return dart.test(svg$.SvgElement.isTagSupported('set')) && svg$.SetElement.is(svg$.SvgElement.tag('set'));
   }
 };
-dart.defineNamedConstructor(svg.SetElement, 'created');
-dart.setSignature(svg.SetElement, {
+dart.defineNamedConstructor(svg$.SetElement, 'created');
+dart.setSignature(svg$.SetElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.SetElement, []),
-    new: dart.definiteFunctionType(svg.SetElement, []),
-    created: dart.definiteFunctionType(svg.SetElement, [])
+    _: dart.definiteFunctionType(svg$.SetElement, []),
+    new: dart.definiteFunctionType(svg$.SetElement, []),
+    created: dart.definiteFunctionType(svg$.SetElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGSetElement, svg.SetElement);
+dart.registerExtension(dart.global.SVGSetElement, svg$.SetElement);
 dart.defineExtensionNames([
   'gradientOffset'
 ]);
-svg.StopElement = class StopElement extends svg.SvgElement {
+svg$.StopElement = class StopElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.StopElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("stop"));
+    return svg$.StopElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("stop"));
   }
   created() {
     this[dartx.gradientOffset] = null;
@@ -105636,16 +105639,16 @@
     return this.offset;
   }
 };
-dart.defineNamedConstructor(svg.StopElement, 'created');
-dart.setSignature(svg.StopElement, {
+dart.defineNamedConstructor(svg$.StopElement, 'created');
+dart.setSignature(svg$.StopElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.StopElement, []),
-    new: dart.definiteFunctionType(svg.StopElement, []),
-    created: dart.definiteFunctionType(svg.StopElement, [])
+    _: dart.definiteFunctionType(svg$.StopElement, []),
+    new: dart.definiteFunctionType(svg$.StopElement, []),
+    created: dart.definiteFunctionType(svg$.StopElement, [])
   }),
-  fields: () => ({[dartx.gradientOffset]: svg.AnimatedNumber})
+  fields: () => ({[dartx.gradientOffset]: svg$.AnimatedNumber})
 });
-dart.registerExtension(dart.global.SVGStopElement, svg.StopElement);
+dart.registerExtension(dart.global.SVGStopElement, svg$.StopElement);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -105664,7 +105667,7 @@
   'replaceItem',
   'numberOfItems'
 ]);
-svg.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html.ImmutableListMixin$(core.String)) {
+svg$.StringList = class StringList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.String), html$.ImmutableListMixin$(core.String)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -105709,7 +105712,7 @@
   [dartx.elementAt](index) {
     return this[dartx._get](index);
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -105734,16 +105737,16 @@
     return this.replaceItem.apply(this, args);
   }
 };
-svg.StringList[dart.implements] = () => [ListOfString()];
-dart.setSignature(svg.StringList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.StringList, [])}),
+svg$.StringList[dart.implements] = () => [ListOfString()];
+dart.setSignature(svg$.StringList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.StringList, [])}),
   fields: () => ({[dartx.numberOfItems]: core.int}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
     [dartx._get]: dart.definiteFunctionType(core.String, [core.int]),
     [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, core.String]),
     [dartx.appendItem]: dart.definiteFunctionType(core.String, [core.String]),
     [dartx.getItem]: dart.definiteFunctionType(core.String, [core.int]),
     [dartx.initialize]: dart.definiteFunctionType(core.String, [core.String]),
@@ -105752,19 +105755,19 @@
     [dartx.replaceItem]: dart.definiteFunctionType(core.String, [core.String, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGStringList, svg.StringList);
+dart.registerExtension(dart.global.SVGStringList, svg$.StringList);
 dart.defineExtensionNames([
   'disabled',
   'media',
   'sheet',
   'type'
 ]);
-svg.StyleElement = class StyleElement extends svg.SvgElement {
+svg$.StyleElement = class StyleElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.StyleElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("style"));
+    return svg$.StyleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("style"));
   }
   created() {
     this[dartx.disabled] = null;
@@ -105795,28 +105798,28 @@
     this.type = value;
   }
 };
-dart.defineNamedConstructor(svg.StyleElement, 'created');
-dart.setSignature(svg.StyleElement, {
+dart.defineNamedConstructor(svg$.StyleElement, 'created');
+dart.setSignature(svg$.StyleElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.StyleElement, []),
-    new: dart.definiteFunctionType(svg.StyleElement, []),
-    created: dart.definiteFunctionType(svg.StyleElement, [])
+    _: dart.definiteFunctionType(svg$.StyleElement, []),
+    new: dart.definiteFunctionType(svg$.StyleElement, []),
+    created: dart.definiteFunctionType(svg$.StyleElement, [])
   }),
   fields: () => ({
     [dartx.disabled]: core.bool,
     [dartx.media]: core.String,
-    [dartx.sheet]: html.StyleSheet,
+    [dartx.sheet]: html$.StyleSheet,
     [dartx.type]: core.String
   })
 });
-dart.registerExtension(dart.global.SVGStyleElement, svg.StyleElement);
-const _element = Symbol('_element');
-svg._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
+dart.registerExtension(dart.global.SVGStyleElement, svg$.StyleElement);
+const _element$0 = Symbol('_element');
+svg$._AttributeClassSet = class _AttributeClassSet extends html_common.CssClassSetImpl {
   new(element) {
-    this[_element] = element;
+    this[_element$0] = element;
   }
   readClasses() {
-    let classname = this[_element][dartx.attributes][dartx._get]('class');
+    let classname = this[_element$0][dartx.attributes][dartx._get]('class');
     let s = LinkedHashSetOfString().new();
     if (classname == null) {
       return s;
@@ -105830,12 +105833,12 @@
     return s;
   }
   writeClasses(s) {
-    this[_element][dartx.attributes][dartx._set]('class', s.join(' '));
+    this[_element$0][dartx.attributes][dartx._set]('class', s.join(' '));
   }
 };
-dart.setSignature(svg._AttributeClassSet, {
-  constructors: () => ({new: dart.definiteFunctionType(svg._AttributeClassSet, [html.Element])}),
-  fields: () => ({[_element]: html.Element}),
+dart.setSignature(svg$._AttributeClassSet, {
+  constructors: () => ({new: dart.definiteFunctionType(svg$._AttributeClassSet, [html$.Element])}),
+  fields: () => ({[_element$0]: html$.Element}),
   methods: () => ({
     readClasses: dart.definiteFunctionType(core.Set$(core.String), []),
     writeClasses: dart.definiteFunctionType(dart.void, [core.Set])
@@ -105882,11 +105885,11 @@
   'viewBox',
   'zoomAndPan'
 ]);
-svg.SvgSvgElement = class SvgSvgElement extends svg.GraphicsElement {
+svg$.SvgSvgElement = class SvgSvgElement extends svg$.GraphicsElement {
   static new() {
-    let el = svg.SvgElement.tag("svg");
+    let el = svg$.SvgElement.tag("svg");
     el[dartx.attributes][dartx._set]('version', "1.1");
-    return svg.SvgSvgElement._check(el);
+    return svg$.SvgSvgElement._check(el);
   }
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
@@ -106034,50 +106037,50 @@
     this.zoomAndPan = value;
   }
 };
-dart.defineNamedConstructor(svg.SvgSvgElement, 'created');
-svg.SvgSvgElement[dart.implements] = () => [svg.FitToViewBox, svg.ZoomAndPan];
-dart.setSignature(svg.SvgSvgElement, {
+dart.defineNamedConstructor(svg$.SvgSvgElement, 'created');
+svg$.SvgSvgElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.SvgSvgElement, {
   constructors: () => ({
-    new: dart.definiteFunctionType(svg.SvgSvgElement, []),
-    _: dart.definiteFunctionType(svg.SvgSvgElement, []),
-    created: dart.definiteFunctionType(svg.SvgSvgElement, [])
+    new: dart.definiteFunctionType(svg$.SvgSvgElement, []),
+    _: dart.definiteFunctionType(svg$.SvgSvgElement, []),
+    created: dart.definiteFunctionType(svg$.SvgSvgElement, [])
   }),
   fields: () => ({
     [dartx.currentScale]: core.num,
-    [dartx.currentTranslate]: svg.Point,
-    [dartx.currentView]: svg.ViewSpec,
-    [dartx.height]: svg.AnimatedLength,
+    [dartx.currentTranslate]: svg$.Point,
+    [dartx.currentView]: svg$.ViewSpec,
+    [dartx.height]: svg$.AnimatedLength,
     [dartx.pixelUnitToMillimeterX]: core.double,
     [dartx.pixelUnitToMillimeterY]: core.double,
     [dartx.screenPixelToMillimeterX]: core.double,
     [dartx.screenPixelToMillimeterY]: core.double,
     [dartx.useCurrentView]: core.bool,
-    [dartx.viewport]: svg.Rect,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect,
+    [dartx.viewport]: svg$.Rect,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
     [dartx.zoomAndPan]: core.int
   }),
   methods: () => ({
     [dartx.animationsPaused]: dart.definiteFunctionType(core.bool, []),
-    [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg.SvgElement, svg.Rect]),
-    [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg.SvgElement, svg.Rect]),
-    [dartx.createSvgAngle]: dart.definiteFunctionType(svg.Angle, []),
-    [dartx.createSvgLength]: dart.definiteFunctionType(svg.Length, []),
-    [dartx.createSvgMatrix]: dart.definiteFunctionType(svg.Matrix, []),
-    [dartx.createSvgNumber]: dart.definiteFunctionType(svg.Number, []),
-    [dartx.createSvgPoint]: dart.definiteFunctionType(svg.Point, []),
-    [dartx.createSvgRect]: dart.definiteFunctionType(svg.Rect, []),
-    [dartx.createSvgTransform]: dart.definiteFunctionType(svg.Transform, []),
-    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg.Transform, [svg.Matrix]),
+    [dartx.checkEnclosure]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
+    [dartx.checkIntersection]: dart.definiteFunctionType(core.bool, [svg$.SvgElement, svg$.Rect]),
+    [dartx.createSvgAngle]: dart.definiteFunctionType(svg$.Angle, []),
+    [dartx.createSvgLength]: dart.definiteFunctionType(svg$.Length, []),
+    [dartx.createSvgMatrix]: dart.definiteFunctionType(svg$.Matrix, []),
+    [dartx.createSvgNumber]: dart.definiteFunctionType(svg$.Number, []),
+    [dartx.createSvgPoint]: dart.definiteFunctionType(svg$.Point, []),
+    [dartx.createSvgRect]: dart.definiteFunctionType(svg$.Rect, []),
+    [dartx.createSvgTransform]: dart.definiteFunctionType(svg$.Transform, []),
+    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
     [dartx.deselectAll]: dart.definiteFunctionType(dart.void, []),
     [dartx.forceRedraw]: dart.definiteFunctionType(dart.void, []),
     [dartx.getCurrentTime]: dart.definiteFunctionType(core.double, []),
-    [dartx.getElementById]: dart.definiteFunctionType(html.Element, [core.String]),
-    [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html.Node), [svg.Rect, svg.SvgElement]),
-    [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html.Node), [svg.Rect, svg.SvgElement]),
+    [dartx.getElementById]: dart.definiteFunctionType(html$.Element, [core.String]),
+    [dartx.getEnclosureList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
+    [dartx.getIntersectionList]: dart.definiteFunctionType(core.List$(html$.Node), [svg$.Rect, svg$.SvgElement]),
     [dartx.pauseAnimations]: dart.definiteFunctionType(dart.void, []),
     [dartx.setCurrentTime]: dart.definiteFunctionType(dart.void, [core.num]),
     [dartx.suspendRedraw]: dart.definiteFunctionType(core.int, [core.int]),
@@ -106086,37 +106089,37 @@
     [dartx.unsuspendRedrawAll]: dart.definiteFunctionType(dart.void, [])
   })
 });
-dart.registerExtension(dart.global.SVGSVGElement, svg.SvgSvgElement);
-svg.SwitchElement = class SwitchElement extends svg.GraphicsElement {
+dart.registerExtension(dart.global.SVGSVGElement, svg$.SvgSvgElement);
+svg$.SwitchElement = class SwitchElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.SwitchElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("switch"));
+    return svg$.SwitchElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("switch"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.SwitchElement, 'created');
-dart.setSignature(svg.SwitchElement, {
+dart.defineNamedConstructor(svg$.SwitchElement, 'created');
+dart.setSignature(svg$.SwitchElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.SwitchElement, []),
-    new: dart.definiteFunctionType(svg.SwitchElement, []),
-    created: dart.definiteFunctionType(svg.SwitchElement, [])
+    _: dart.definiteFunctionType(svg$.SwitchElement, []),
+    new: dart.definiteFunctionType(svg$.SwitchElement, []),
+    created: dart.definiteFunctionType(svg$.SwitchElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGSwitchElement, svg.SwitchElement);
+dart.registerExtension(dart.global.SVGSwitchElement, svg$.SwitchElement);
 dart.defineExtensionNames([
   'preserveAspectRatio',
   'viewBox'
 ]);
-svg.SymbolElement = class SymbolElement extends svg.SvgElement {
+svg$.SymbolElement = class SymbolElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.SymbolElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
+    return svg$.SymbolElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("symbol"));
   }
   created() {
     this[dartx.preserveAspectRatio] = null;
@@ -106130,20 +106133,20 @@
     return this.viewBox;
   }
 };
-dart.defineNamedConstructor(svg.SymbolElement, 'created');
-svg.SymbolElement[dart.implements] = () => [svg.FitToViewBox];
-dart.setSignature(svg.SymbolElement, {
+dart.defineNamedConstructor(svg$.SymbolElement, 'created');
+svg$.SymbolElement[dart.implements] = () => [svg$.FitToViewBox];
+dart.setSignature(svg$.SymbolElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.SymbolElement, []),
-    new: dart.definiteFunctionType(svg.SymbolElement, []),
-    created: dart.definiteFunctionType(svg.SymbolElement, [])
+    _: dart.definiteFunctionType(svg$.SymbolElement, []),
+    new: dart.definiteFunctionType(svg$.SymbolElement, []),
+    created: dart.definiteFunctionType(svg$.SymbolElement, [])
   }),
   fields: () => ({
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect
   })
 });
-dart.registerExtension(dart.global.SVGSymbolElement, svg.SymbolElement);
+dart.registerExtension(dart.global.SVGSymbolElement, svg$.SymbolElement);
 dart.defineExtensionNames([
   'getCharNumAtPosition',
   'getComputedTextLength',
@@ -106157,7 +106160,7 @@
   'lengthAdjust',
   'textLength'
 ]);
-svg.TextContentElement = class TextContentElement extends svg.GraphicsElement {
+svg$.TextContentElement = class TextContentElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106200,24 +106203,24 @@
     return this.selectSubString.apply(this, args);
   }
 };
-dart.defineNamedConstructor(svg.TextContentElement, 'created');
-dart.setSignature(svg.TextContentElement, {
+dart.defineNamedConstructor(svg$.TextContentElement, 'created');
+dart.setSignature(svg$.TextContentElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TextContentElement, []),
-    created: dart.definiteFunctionType(svg.TextContentElement, [])
+    _: dart.definiteFunctionType(svg$.TextContentElement, []),
+    created: dart.definiteFunctionType(svg$.TextContentElement, [])
   }),
   fields: () => ({
-    [dartx.lengthAdjust]: svg.AnimatedEnumeration,
-    [dartx.textLength]: svg.AnimatedLength
+    [dartx.lengthAdjust]: svg$.AnimatedEnumeration,
+    [dartx.textLength]: svg$.AnimatedLength
   }),
   methods: () => ({
-    [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg.Point]),
+    [dartx.getCharNumAtPosition]: dart.definiteFunctionType(core.int, [svg$.Point]),
     [dartx.getComputedTextLength]: dart.definiteFunctionType(core.double, []),
-    [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg.Point, [core.int]),
-    [dartx.getExtentOfChar]: dart.definiteFunctionType(svg.Rect, [core.int]),
+    [dartx.getEndPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
+    [dartx.getExtentOfChar]: dart.definiteFunctionType(svg$.Rect, [core.int]),
     [dartx.getNumberOfChars]: dart.definiteFunctionType(core.int, []),
     [dartx.getRotationOfChar]: dart.definiteFunctionType(core.double, [core.int]),
-    [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg.Point, [core.int]),
+    [dartx.getStartPositionOfChar]: dart.definiteFunctionType(svg$.Point, [core.int]),
     [dartx.getSubStringLength]: dart.definiteFunctionType(core.double, [core.int, core.int]),
     [dartx.selectSubString]: dart.definiteFunctionType(dart.void, [core.int, core.int])
   }),
@@ -106227,10 +106230,10 @@
     LENGTHADJUST_UNKNOWN: core.int
   })
 });
-svg.TextContentElement.LENGTHADJUST_SPACING = 1;
-svg.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
-svg.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGTextContentElement, svg.TextContentElement);
+svg$.TextContentElement.LENGTHADJUST_SPACING = 1;
+svg$.TextContentElement.LENGTHADJUST_SPACINGANDGLYPHS = 2;
+svg$.TextContentElement.LENGTHADJUST_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTextContentElement, svg$.TextContentElement);
 dart.defineExtensionNames([
   'dx',
   'dy',
@@ -106238,7 +106241,7 @@
   'x',
   'y'
 ]);
-svg.TextPositioningElement = class TextPositioningElement extends svg.TextContentElement {
+svg$.TextPositioningElement = class TextPositioningElement extends svg$.TextContentElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106266,47 +106269,47 @@
     return this.y;
   }
 };
-dart.defineNamedConstructor(svg.TextPositioningElement, 'created');
-dart.setSignature(svg.TextPositioningElement, {
+dart.defineNamedConstructor(svg$.TextPositioningElement, 'created');
+dart.setSignature(svg$.TextPositioningElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TextPositioningElement, []),
-    created: dart.definiteFunctionType(svg.TextPositioningElement, [])
+    _: dart.definiteFunctionType(svg$.TextPositioningElement, []),
+    created: dart.definiteFunctionType(svg$.TextPositioningElement, [])
   }),
   fields: () => ({
-    [dartx.dx]: svg.AnimatedLengthList,
-    [dartx.dy]: svg.AnimatedLengthList,
-    [dartx.rotate]: svg.AnimatedNumberList,
-    [dartx.x]: svg.AnimatedLengthList,
-    [dartx.y]: svg.AnimatedLengthList
+    [dartx.dx]: svg$.AnimatedLengthList,
+    [dartx.dy]: svg$.AnimatedLengthList,
+    [dartx.rotate]: svg$.AnimatedNumberList,
+    [dartx.x]: svg$.AnimatedLengthList,
+    [dartx.y]: svg$.AnimatedLengthList
   })
 });
-dart.registerExtension(dart.global.SVGTextPositioningElement, svg.TextPositioningElement);
-svg.TSpanElement = class TSpanElement extends svg.TextPositioningElement {
+dart.registerExtension(dart.global.SVGTextPositioningElement, svg$.TextPositioningElement);
+svg$.TSpanElement = class TSpanElement extends svg$.TextPositioningElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.TSpanElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
+    return svg$.TSpanElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("tspan"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.TSpanElement, 'created');
-dart.setSignature(svg.TSpanElement, {
+dart.defineNamedConstructor(svg$.TSpanElement, 'created');
+dart.setSignature(svg$.TSpanElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TSpanElement, []),
-    new: dart.definiteFunctionType(svg.TSpanElement, []),
-    created: dart.definiteFunctionType(svg.TSpanElement, [])
+    _: dart.definiteFunctionType(svg$.TSpanElement, []),
+    new: dart.definiteFunctionType(svg$.TSpanElement, []),
+    created: dart.definiteFunctionType(svg$.TSpanElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGTSpanElement, svg.TSpanElement);
+dart.registerExtension(dart.global.SVGTSpanElement, svg$.TSpanElement);
 dart.defineExtensionNames([
   'requiredExtensions',
   'requiredFeatures',
   'systemLanguage'
 ]);
-svg.Tests = class Tests extends _interceptors.Interceptor {
+svg$.Tests = class Tests extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106329,45 +106332,45 @@
     super.systemLanguage = value;
   }
 };
-const requiredExtensions = Symbol(svg.Tests.name + "." + 'requiredExtensions'.toString());
-const requiredFeatures = Symbol(svg.Tests.name + "." + 'requiredFeatures'.toString());
-const systemLanguage = Symbol(svg.Tests.name + "." + 'systemLanguage'.toString());
-dart.setSignature(svg.Tests, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Tests, [])}),
+const requiredExtensions = Symbol(svg$.Tests.name + "." + 'requiredExtensions'.toString());
+const requiredFeatures = Symbol(svg$.Tests.name + "." + 'requiredFeatures'.toString());
+const systemLanguage = Symbol(svg$.Tests.name + "." + 'systemLanguage'.toString());
+dart.setSignature(svg$.Tests, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Tests, [])}),
   fields: () => ({
-    requiredExtensions: svg.StringList,
-    requiredFeatures: svg.StringList,
-    systemLanguage: svg.StringList
+    requiredExtensions: svg$.StringList,
+    requiredFeatures: svg$.StringList,
+    systemLanguage: svg$.StringList
   })
 });
-dart.defineExtensionMembers(svg.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
-svg.TextElement = class TextElement extends svg.TextPositioningElement {
+dart.defineExtensionMembers(svg$.Tests, ['requiredExtensions', 'requiredFeatures', 'systemLanguage']);
+svg$.TextElement = class TextElement extends svg$.TextPositioningElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.TextElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("text"));
+    return svg$.TextElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("text"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.TextElement, 'created');
-dart.setSignature(svg.TextElement, {
+dart.defineNamedConstructor(svg$.TextElement, 'created');
+dart.setSignature(svg$.TextElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TextElement, []),
-    new: dart.definiteFunctionType(svg.TextElement, []),
-    created: dart.definiteFunctionType(svg.TextElement, [])
+    _: dart.definiteFunctionType(svg$.TextElement, []),
+    new: dart.definiteFunctionType(svg$.TextElement, []),
+    created: dart.definiteFunctionType(svg$.TextElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGTextElement, svg.TextElement);
+dart.registerExtension(dart.global.SVGTextElement, svg$.TextElement);
 dart.defineExtensionNames([
   'method',
   'spacing',
   'startOffset',
   'href'
 ]);
-svg.TextPathElement = class TextPathElement extends svg.TextContentElement {
+svg$.TextPathElement = class TextPathElement extends svg$.TextContentElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106391,18 +106394,18 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.TextPathElement, 'created');
-svg.TextPathElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.TextPathElement, {
+dart.defineNamedConstructor(svg$.TextPathElement, 'created');
+svg$.TextPathElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.TextPathElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TextPathElement, []),
-    created: dart.definiteFunctionType(svg.TextPathElement, [])
+    _: dart.definiteFunctionType(svg$.TextPathElement, []),
+    created: dart.definiteFunctionType(svg$.TextPathElement, [])
   }),
   fields: () => ({
-    [dartx.method]: svg.AnimatedEnumeration,
-    [dartx.spacing]: svg.AnimatedEnumeration,
-    [dartx.startOffset]: svg.AnimatedLength,
-    [dartx.href]: svg.AnimatedString
+    [dartx.method]: svg$.AnimatedEnumeration,
+    [dartx.spacing]: svg$.AnimatedEnumeration,
+    [dartx.startOffset]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
   }),
   sfields: () => ({
     TEXTPATH_METHODTYPE_ALIGN: core.int,
@@ -106413,33 +106416,33 @@
     TEXTPATH_SPACINGTYPE_UNKNOWN: core.int
   })
 });
-svg.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
-svg.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
-svg.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
-svg.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
-svg.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
-svg.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGTextPathElement, svg.TextPathElement);
-svg.TitleElement = class TitleElement extends svg.SvgElement {
+svg$.TextPathElement.TEXTPATH_METHODTYPE_ALIGN = 1;
+svg$.TextPathElement.TEXTPATH_METHODTYPE_STRETCH = 2;
+svg$.TextPathElement.TEXTPATH_METHODTYPE_UNKNOWN = 0;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_AUTO = 1;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_EXACT = 2;
+svg$.TextPathElement.TEXTPATH_SPACINGTYPE_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTextPathElement, svg$.TextPathElement);
+svg$.TitleElement = class TitleElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.TitleElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("title"));
+    return svg$.TitleElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("title"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg.TitleElement, 'created');
-dart.setSignature(svg.TitleElement, {
+dart.defineNamedConstructor(svg$.TitleElement, 'created');
+dart.setSignature(svg$.TitleElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.TitleElement, []),
-    new: dart.definiteFunctionType(svg.TitleElement, []),
-    created: dart.definiteFunctionType(svg.TitleElement, [])
+    _: dart.definiteFunctionType(svg$.TitleElement, []),
+    new: dart.definiteFunctionType(svg$.TitleElement, []),
+    created: dart.definiteFunctionType(svg$.TitleElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGTitleElement, svg.TitleElement);
+dart.registerExtension(dart.global.SVGTitleElement, svg$.TitleElement);
 dart.defineExtensionNames([
   'setMatrix',
   'setRotate',
@@ -106451,7 +106454,7 @@
   'matrix',
   'type'
 ]);
-svg.Transform = class Transform extends _interceptors.Interceptor {
+svg$.Transform = class Transform extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106483,15 +106486,15 @@
     return this.setTranslate.apply(this, args);
   }
 };
-dart.setSignature(svg.Transform, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.Transform, [])}),
+dart.setSignature(svg$.Transform, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.Transform, [])}),
   fields: () => ({
     [dartx.angle]: core.double,
-    [dartx.matrix]: svg.Matrix,
+    [dartx.matrix]: svg$.Matrix,
     [dartx.type]: core.int
   }),
   methods: () => ({
-    [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg.Matrix]),
+    [dartx.setMatrix]: dart.definiteFunctionType(dart.void, [svg$.Matrix]),
     [dartx.setRotate]: dart.definiteFunctionType(dart.void, [core.num, core.num, core.num]),
     [dartx.setScale]: dart.definiteFunctionType(dart.void, [core.num, core.num]),
     [dartx.setSkewX]: dart.definiteFunctionType(dart.void, [core.num]),
@@ -106508,14 +106511,14 @@
     SVG_TRANSFORM_UNKNOWN: core.int
   })
 });
-svg.Transform.SVG_TRANSFORM_MATRIX = 1;
-svg.Transform.SVG_TRANSFORM_ROTATE = 4;
-svg.Transform.SVG_TRANSFORM_SCALE = 3;
-svg.Transform.SVG_TRANSFORM_SKEWX = 5;
-svg.Transform.SVG_TRANSFORM_SKEWY = 6;
-svg.Transform.SVG_TRANSFORM_TRANSLATE = 2;
-svg.Transform.SVG_TRANSFORM_UNKNOWN = 0;
-dart.registerExtension(dart.global.SVGTransform, svg.Transform);
+svg$.Transform.SVG_TRANSFORM_MATRIX = 1;
+svg$.Transform.SVG_TRANSFORM_ROTATE = 4;
+svg$.Transform.SVG_TRANSFORM_SCALE = 3;
+svg$.Transform.SVG_TRANSFORM_SKEWX = 5;
+svg$.Transform.SVG_TRANSFORM_SKEWY = 6;
+svg$.Transform.SVG_TRANSFORM_TRANSLATE = 2;
+svg$.Transform.SVG_TRANSFORM_UNKNOWN = 0;
+dart.registerExtension(dart.global.SVGTransform, svg$.Transform);
 dart.defineExtensionNames([
   'length',
   '_get',
@@ -106536,7 +106539,7 @@
   'replaceItem',
   'numberOfItems'
 ]);
-svg.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg.Transform), html.ImmutableListMixin$(svg.Transform)) {
+svg$.TransformList = class TransformList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(svg$.Transform), html$.ImmutableListMixin$(svg$.Transform)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106581,7 +106584,7 @@
   [dartx.elementAt](index) {
     return this[dartx._get](index);
   }
-  [__setter__](...args) {
+  [__setter__$](...args) {
     return this.__setter__.apply(this, args);
   }
   [dartx.appendItem](...args) {
@@ -106612,64 +106615,64 @@
     return this.replaceItem.apply(this, args);
   }
 };
-svg.TransformList[dart.implements] = () => [ListOfTransform()];
-dart.setSignature(svg.TransformList, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.TransformList, [])}),
+svg$.TransformList[dart.implements] = () => [ListOfTransform()];
+dart.setSignature(svg$.TransformList, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.TransformList, [])}),
   fields: () => ({[dartx.numberOfItems]: core.int}),
   getters: () => ({[dartx.length]: dart.definiteFunctionType(core.int, [])}),
   setters: () => ({[dartx.length]: dart.definiteFunctionType(dart.void, [core.int])}),
   methods: () => ({
-    [dartx._get]: dart.definiteFunctionType(svg.Transform, [core.int]),
-    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg.Transform]),
-    [__setter__]: dart.definiteFunctionType(dart.void, [core.int, svg.Transform]),
-    [dartx.appendItem]: dart.definiteFunctionType(svg.Transform, [svg.Transform]),
-    [dartx.consolidate]: dart.definiteFunctionType(svg.Transform, []),
-    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg.Transform, [svg.Matrix]),
-    [dartx.getItem]: dart.definiteFunctionType(svg.Transform, [core.int]),
-    [dartx.initialize]: dart.definiteFunctionType(svg.Transform, [svg.Transform]),
-    [dartx.insertItemBefore]: dart.definiteFunctionType(svg.Transform, [svg.Transform, core.int]),
-    [dartx.removeItem]: dart.definiteFunctionType(svg.Transform, [core.int]),
-    [dartx.replaceItem]: dart.definiteFunctionType(svg.Transform, [svg.Transform, core.int])
+    [dartx._get]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx._set]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
+    [__setter__$]: dart.definiteFunctionType(dart.void, [core.int, svg$.Transform]),
+    [dartx.appendItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
+    [dartx.consolidate]: dart.definiteFunctionType(svg$.Transform, []),
+    [dartx.createSvgTransformFromMatrix]: dart.definiteFunctionType(svg$.Transform, [svg$.Matrix]),
+    [dartx.getItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx.initialize]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform]),
+    [dartx.insertItemBefore]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int]),
+    [dartx.removeItem]: dart.definiteFunctionType(svg$.Transform, [core.int]),
+    [dartx.replaceItem]: dart.definiteFunctionType(svg$.Transform, [svg$.Transform, core.int])
   })
 });
-dart.registerExtension(dart.global.SVGTransformList, svg.TransformList);
-svg.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
+dart.registerExtension(dart.global.SVGTransformList, svg$.TransformList);
+svg$.UnitTypes = class UnitTypes extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
 };
-dart.setSignature(svg.UnitTypes, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.UnitTypes, [])}),
+dart.setSignature(svg$.UnitTypes, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.UnitTypes, [])}),
   sfields: () => ({
     SVG_UNIT_TYPE_OBJECTBOUNDINGBOX: core.int,
     SVG_UNIT_TYPE_UNKNOWN: core.int,
     SVG_UNIT_TYPE_USERSPACEONUSE: core.int
   })
 });
-svg.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
-svg.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
-svg.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
-dart.registerExtension(dart.global.SVGUnitTypes, svg.UnitTypes);
+svg$.UnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
+svg$.UnitTypes.SVG_UNIT_TYPE_UNKNOWN = 0;
+svg$.UnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE = 1;
+dart.registerExtension(dart.global.SVGUnitTypes, svg$.UnitTypes);
 dart.defineExtensionNames([
   'href'
 ]);
-svg.UriReference = class UriReference extends _interceptors.Interceptor {
+svg$.UriReference = class UriReference extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   get href() {
-    return this[href];
+    return this[href$0];
   }
   set href(value) {
     super.href = value;
   }
 };
-const href = Symbol(svg.UriReference.name + "." + 'href'.toString());
-dart.setSignature(svg.UriReference, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.UriReference, [])}),
-  fields: () => ({href: svg.AnimatedString})
+const href$0 = Symbol(svg$.UriReference.name + "." + 'href'.toString());
+dart.setSignature(svg$.UriReference, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.UriReference, [])}),
+  fields: () => ({href: svg$.AnimatedString})
 });
-dart.defineExtensionMembers(svg.UriReference, ['href']);
+dart.defineExtensionMembers(svg$.UriReference, ['href']);
 dart.defineExtensionNames([
   'height',
   'width',
@@ -106677,12 +106680,12 @@
   'y',
   'href'
 ]);
-svg.UseElement = class UseElement extends svg.GraphicsElement {
+svg$.UseElement = class UseElement extends svg$.GraphicsElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.UseElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("use"));
+    return svg$.UseElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("use"));
   }
   created() {
     this[dartx.height] = null;
@@ -106708,35 +106711,35 @@
     return this.href;
   }
 };
-dart.defineNamedConstructor(svg.UseElement, 'created');
-svg.UseElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg.UseElement, {
+dart.defineNamedConstructor(svg$.UseElement, 'created');
+svg$.UseElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$.UseElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.UseElement, []),
-    new: dart.definiteFunctionType(svg.UseElement, []),
-    created: dart.definiteFunctionType(svg.UseElement, [])
+    _: dart.definiteFunctionType(svg$.UseElement, []),
+    new: dart.definiteFunctionType(svg$.UseElement, []),
+    created: dart.definiteFunctionType(svg$.UseElement, [])
   }),
   fields: () => ({
-    [dartx.height]: svg.AnimatedLength,
-    [dartx.width]: svg.AnimatedLength,
-    [dartx.x]: svg.AnimatedLength,
-    [dartx.y]: svg.AnimatedLength,
-    [dartx.href]: svg.AnimatedString
+    [dartx.height]: svg$.AnimatedLength,
+    [dartx.width]: svg$.AnimatedLength,
+    [dartx.x]: svg$.AnimatedLength,
+    [dartx.y]: svg$.AnimatedLength,
+    [dartx.href]: svg$.AnimatedString
   })
 });
-dart.registerExtension(dart.global.SVGUseElement, svg.UseElement);
+dart.registerExtension(dart.global.SVGUseElement, svg$.UseElement);
 dart.defineExtensionNames([
   'viewTarget',
   'preserveAspectRatio',
   'viewBox',
   'zoomAndPan'
 ]);
-svg.ViewElement = class ViewElement extends svg.SvgElement {
+svg$.ViewElement = class ViewElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg.ViewElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("view"));
+    return svg$.ViewElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("view"));
   }
   created() {
     this[dartx.viewTarget] = null;
@@ -106761,22 +106764,22 @@
     this.zoomAndPan = value;
   }
 };
-dart.defineNamedConstructor(svg.ViewElement, 'created');
-svg.ViewElement[dart.implements] = () => [svg.FitToViewBox, svg.ZoomAndPan];
-dart.setSignature(svg.ViewElement, {
+dart.defineNamedConstructor(svg$.ViewElement, 'created');
+svg$.ViewElement[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.ViewElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg.ViewElement, []),
-    new: dart.definiteFunctionType(svg.ViewElement, []),
-    created: dart.definiteFunctionType(svg.ViewElement, [])
+    _: dart.definiteFunctionType(svg$.ViewElement, []),
+    new: dart.definiteFunctionType(svg$.ViewElement, []),
+    created: dart.definiteFunctionType(svg$.ViewElement, [])
   }),
   fields: () => ({
-    [dartx.viewTarget]: svg.StringList,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect,
+    [dartx.viewTarget]: svg$.StringList,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
     [dartx.zoomAndPan]: core.int
   })
 });
-dart.registerExtension(dart.global.SVGViewElement, svg.ViewElement);
+dart.registerExtension(dart.global.SVGViewElement, svg$.ViewElement);
 dart.defineExtensionNames([
   'preserveAspectRatioString',
   'transform',
@@ -106788,7 +106791,7 @@
   'viewBox',
   'zoomAndPan'
 ]);
-svg.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
+svg$.ViewSpec = class ViewSpec extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106823,26 +106826,26 @@
     this.zoomAndPan = value;
   }
 };
-svg.ViewSpec[dart.implements] = () => [svg.FitToViewBox, svg.ZoomAndPan];
-dart.setSignature(svg.ViewSpec, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.ViewSpec, [])}),
+svg$.ViewSpec[dart.implements] = () => [svg$.FitToViewBox, svg$.ZoomAndPan];
+dart.setSignature(svg$.ViewSpec, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ViewSpec, [])}),
   fields: () => ({
     [dartx.preserveAspectRatioString]: core.String,
-    [dartx.transform]: svg.TransformList,
+    [dartx.transform]: svg$.TransformList,
     [dartx.transformString]: core.String,
     [dartx.viewBoxString]: core.String,
-    [dartx.viewTarget]: svg.SvgElement,
+    [dartx.viewTarget]: svg$.SvgElement,
     [dartx.viewTargetString]: core.String,
-    [dartx.preserveAspectRatio]: svg.AnimatedPreserveAspectRatio,
-    [dartx.viewBox]: svg.AnimatedRect,
+    [dartx.preserveAspectRatio]: svg$.AnimatedPreserveAspectRatio,
+    [dartx.viewBox]: svg$.AnimatedRect,
     [dartx.zoomAndPan]: core.int
   })
 });
-dart.registerExtension(dart.global.SVGViewSpec, svg.ViewSpec);
+dart.registerExtension(dart.global.SVGViewSpec, svg$.ViewSpec);
 dart.defineExtensionNames([
   'zoomAndPan'
 ]);
-svg.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
+svg$.ZoomAndPan = class ZoomAndPan extends _interceptors.Interceptor {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106853,9 +106856,9 @@
     this[zoomAndPan] = value;
   }
 };
-const zoomAndPan = Symbol(svg.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
-dart.setSignature(svg.ZoomAndPan, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.ZoomAndPan, [])}),
+const zoomAndPan = Symbol(svg$.ZoomAndPan.name + "." + 'zoomAndPan'.toString());
+dart.setSignature(svg$.ZoomAndPan, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomAndPan, [])}),
   fields: () => ({zoomAndPan: core.int}),
   sfields: () => ({
     SVG_ZOOMANDPAN_DISABLE: core.int,
@@ -106863,10 +106866,10 @@
     SVG_ZOOMANDPAN_UNKNOWN: core.int
   })
 });
-dart.defineExtensionMembers(svg.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
-svg.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
-svg.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
-svg.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
+dart.defineExtensionMembers(svg$.ZoomAndPan, ['zoomAndPan', 'zoomAndPan']);
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_DISABLE = 1;
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_MAGNIFY = 2;
+svg$.ZoomAndPan.SVG_ZOOMANDPAN_UNKNOWN = 0;
 dart.defineExtensionNames([
   'newScale',
   'newTranslate',
@@ -106874,7 +106877,7 @@
   'previousTranslate',
   'zoomRectScreen'
 ]);
-svg.ZoomEvent = class ZoomEvent extends html.UIEvent {
+svg$.ZoomEvent = class ZoomEvent extends html$.UIEvent {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106894,43 +106897,43 @@
     return this.zoomRectScreen;
   }
 };
-dart.setSignature(svg.ZoomEvent, {
-  constructors: () => ({_: dart.definiteFunctionType(svg.ZoomEvent, [])}),
+dart.setSignature(svg$.ZoomEvent, {
+  constructors: () => ({_: dart.definiteFunctionType(svg$.ZoomEvent, [])}),
   fields: () => ({
     [dartx.newScale]: core.double,
-    [dartx.newTranslate]: svg.Point,
+    [dartx.newTranslate]: svg$.Point,
     [dartx.previousScale]: core.double,
-    [dartx.previousTranslate]: svg.Point,
-    [dartx.zoomRectScreen]: svg.Rect
+    [dartx.previousTranslate]: svg$.Point,
+    [dartx.zoomRectScreen]: svg$.Rect
   })
 });
-dart.registerExtension(dart.global.SVGZoomEvent, svg.ZoomEvent);
-svg._SVGCursorElement = class _SVGCursorElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGZoomEvent, svg$.ZoomEvent);
+svg$._SVGCursorElement = class _SVGCursorElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg._SVGCursorElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
+    return svg$._SVGCursorElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("cursor"));
   }
   created() {
     super.created();
   }
   static get supported() {
-    return dart.test(svg.SvgElement.isTagSupported('cursor')) && svg._SVGCursorElement.is(svg.SvgElement.tag('cursor'));
+    return dart.test(svg$.SvgElement.isTagSupported('cursor')) && svg$._SVGCursorElement.is(svg$.SvgElement.tag('cursor'));
   }
 };
-dart.defineNamedConstructor(svg._SVGCursorElement, 'created');
-svg._SVGCursorElement[dart.implements] = () => [svg.UriReference, svg.Tests];
-dart.setSignature(svg._SVGCursorElement, {
+dart.defineNamedConstructor(svg$._SVGCursorElement, 'created');
+svg$._SVGCursorElement[dart.implements] = () => [svg$.UriReference, svg$.Tests];
+dart.setSignature(svg$._SVGCursorElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg._SVGCursorElement, []),
-    new: dart.definiteFunctionType(svg._SVGCursorElement, []),
-    created: dart.definiteFunctionType(svg._SVGCursorElement, [])
+    _: dart.definiteFunctionType(svg$._SVGCursorElement, []),
+    new: dart.definiteFunctionType(svg$._SVGCursorElement, []),
+    created: dart.definiteFunctionType(svg$._SVGCursorElement, [])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
-dart.registerExtension(dart.global.SVGCursorElement, svg._SVGCursorElement);
-svg._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGCursorElement, svg$._SVGCursorElement);
+svg$._SVGFEDropShadowElement = class _SVGFEDropShadowElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -106938,36 +106941,36 @@
     super.created();
   }
 };
-dart.defineNamedConstructor(svg._SVGFEDropShadowElement, 'created');
-svg._SVGFEDropShadowElement[dart.implements] = () => [svg.FilterPrimitiveStandardAttributes];
-dart.setSignature(svg._SVGFEDropShadowElement, {
+dart.defineNamedConstructor(svg$._SVGFEDropShadowElement, 'created');
+svg$._SVGFEDropShadowElement[dart.implements] = () => [svg$.FilterPrimitiveStandardAttributes];
+dart.setSignature(svg$._SVGFEDropShadowElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg._SVGFEDropShadowElement, []),
-    created: dart.definiteFunctionType(svg._SVGFEDropShadowElement, [])
+    _: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, []),
+    created: dart.definiteFunctionType(svg$._SVGFEDropShadowElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGFEDropShadowElement, svg._SVGFEDropShadowElement);
-svg._SVGMPathElement = class _SVGMPathElement extends svg.SvgElement {
+dart.registerExtension(dart.global.SVGFEDropShadowElement, svg$._SVGFEDropShadowElement);
+svg$._SVGMPathElement = class _SVGMPathElement extends svg$.SvgElement {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
   static new() {
-    return svg._SVGMPathElement._check(svg._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
+    return svg$._SVGMPathElement._check(svg$._SvgElementFactoryProvider.createSvgElement_tag("mpath"));
   }
   created() {
     super.created();
   }
 };
-dart.defineNamedConstructor(svg._SVGMPathElement, 'created');
-svg._SVGMPathElement[dart.implements] = () => [svg.UriReference];
-dart.setSignature(svg._SVGMPathElement, {
+dart.defineNamedConstructor(svg$._SVGMPathElement, 'created');
+svg$._SVGMPathElement[dart.implements] = () => [svg$.UriReference];
+dart.setSignature(svg$._SVGMPathElement, {
   constructors: () => ({
-    _: dart.definiteFunctionType(svg._SVGMPathElement, []),
-    new: dart.definiteFunctionType(svg._SVGMPathElement, []),
-    created: dart.definiteFunctionType(svg._SVGMPathElement, [])
+    _: dart.definiteFunctionType(svg$._SVGMPathElement, []),
+    new: dart.definiteFunctionType(svg$._SVGMPathElement, []),
+    created: dart.definiteFunctionType(svg$._SVGMPathElement, [])
   })
 });
-dart.registerExtension(dart.global.SVGMPathElement, svg._SVGMPathElement);
+dart.registerExtension(dart.global.SVGMPathElement, svg$._SVGMPathElement);
 const _connect = Symbol('_connect');
 dart.defineExtensionNames([
   'disconnect',
@@ -106980,7 +106983,7 @@
   'numberOfInputs',
   'numberOfOutputs'
 ]);
-web_audio.AudioNode = class AudioNode extends html.EventTarget {
+web_audio.AudioNode = class AudioNode extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -107248,7 +107251,7 @@
     [dartx.loopStart]: core.num,
     [dartx.playbackRate]: web_audio.AudioParam
   }),
-  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.start]: dart.definiteFunctionType(dart.void, [core.num], [core.num, core.num]),
     [dartx.stop]: dart.definiteFunctionType(dart.void, [core.num])
@@ -107285,7 +107288,7 @@
   'listener',
   'sampleRate'
 ]);
-web_audio.AudioContext = class AudioContext extends html.EventTarget {
+web_audio.AudioContext = class AudioContext extends html$.EventTarget {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -107408,7 +107411,7 @@
     [dartx.listener]: web_audio.AudioListener,
     [dartx.sampleRate]: core.double
   }),
-  getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onComplete]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.createAnalyser]: dart.definiteFunctionType(web_audio.AnalyserNode, []),
     [dartx.createBiquadFilter]: dart.definiteFunctionType(web_audio.BiquadFilterNode, []),
@@ -107419,9 +107422,9 @@
     [dartx.createConvolver]: dart.definiteFunctionType(web_audio.ConvolverNode, []),
     [dartx.createDelay]: dart.definiteFunctionType(web_audio.DelayNode, [], [core.num]),
     [dartx.createDynamicsCompressor]: dart.definiteFunctionType(web_audio.DynamicsCompressorNode, []),
-    [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html.MediaElement]),
+    [dartx.createMediaElementSource]: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [html$.MediaElement]),
     [dartx.createMediaStreamDestination]: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, []),
-    [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html.MediaStream]),
+    [dartx.createMediaStreamSource]: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [html$.MediaStream]),
     [dartx.createOscillator]: dart.definiteFunctionType(web_audio.OscillatorNode, []),
     [dartx.createPanner]: dart.definiteFunctionType(web_audio.PannerNode, []),
     [dartx.createPeriodicWave]: dart.definiteFunctionType(web_audio.PeriodicWave, [typed_data.Float32List, typed_data.Float32List]),
@@ -107563,7 +107566,7 @@
   'outputBuffer',
   'playbackTime'
 ]);
-web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html.Event {
+web_audio.AudioProcessingEvent = class AudioProcessingEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -107770,7 +107773,7 @@
 };
 dart.setSignature(web_audio.MediaElementAudioSourceNode, {
   constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaElementAudioSourceNode, [])}),
-  fields: () => ({[dartx.mediaElement]: html.MediaElement})
+  fields: () => ({[dartx.mediaElement]: html$.MediaElement})
 });
 dart.registerExtension(dart.global.MediaElementAudioSourceNode, web_audio.MediaElementAudioSourceNode);
 dart.defineExtensionNames([
@@ -107786,7 +107789,7 @@
 };
 dart.setSignature(web_audio.MediaStreamAudioDestinationNode, {
   constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioDestinationNode, [])}),
-  fields: () => ({[dartx.stream]: html.MediaStream})
+  fields: () => ({[dartx.stream]: html$.MediaStream})
 });
 dart.registerExtension(dart.global.MediaStreamAudioDestinationNode, web_audio.MediaStreamAudioDestinationNode);
 dart.defineExtensionNames([
@@ -107802,13 +107805,13 @@
 };
 dart.setSignature(web_audio.MediaStreamAudioSourceNode, {
   constructors: () => ({_: dart.definiteFunctionType(web_audio.MediaStreamAudioSourceNode, [])}),
-  fields: () => ({[dartx.mediaStream]: html.MediaStream})
+  fields: () => ({[dartx.mediaStream]: html$.MediaStream})
 });
 dart.registerExtension(dart.global.MediaStreamAudioSourceNode, web_audio.MediaStreamAudioSourceNode);
 dart.defineExtensionNames([
   'renderedBuffer'
 ]);
-web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html.Event {
+web_audio.OfflineAudioCompletionEvent = class OfflineAudioCompletionEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -107894,7 +107897,7 @@
     [dartx.frequency]: web_audio.AudioParam,
     [dartx.type]: core.String
   }),
-  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html.Event), [])}),
+  getters: () => ({[dartx.onEnded]: dart.definiteFunctionType(async.Stream$(html$.Event), [])}),
   methods: () => ({
     [dartx.noteOff]: dart.definiteFunctionType(dart.void, [core.num]),
     [dartx.noteOn]: dart.definiteFunctionType(dart.void, [core.num]),
@@ -108035,7 +108038,7 @@
   constructors: () => ({_: dart.definiteFunctionType(web_audio.ScriptProcessorNode, [])}),
   fields: () => ({[dartx.bufferSize]: core.int}),
   getters: () => ({[dartx.onAudioProcess]: dart.definiteFunctionType(async.Stream$(web_audio.AudioProcessingEvent), [])}),
-  methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html.EventListener])}),
+  methods: () => ({[dartx.setEventListener]: dart.definiteFunctionType(dart.void, [html$.EventListener])}),
   sfields: () => ({audioProcessEvent: EventStreamProviderOfAudioProcessingEvent()})
 });
 web_audio.ScriptProcessorNode.audioProcessEvent = dart.const(new (EventStreamProviderOfAudioProcessingEvent())('audioprocess'));
@@ -108070,7 +108073,7 @@
   })
 });
 dart.registerExtension(dart.global.WaveShaperNode, web_audio.WaveShaperNode);
-const _getContextAttributes_1 = Symbol('_getContextAttributes_1');
+const _getContextAttributes_1$ = Symbol('_getContextAttributes_1');
 const _texImage2D_1 = Symbol('_texImage2D_1');
 const _texImage2D_2 = Symbol('_texImage2D_2');
 const _texImage2D_3 = Symbol('_texImage2D_3');
@@ -108446,9 +108449,9 @@
     return this.getBufferParameter.apply(this, args);
   }
   [dartx.getContextAttributes]() {
-    return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1]()));
+    return web_gl.ContextAttributes._check(html_common.convertNativeToDart_ContextAttributes(this[_getContextAttributes_1$]()));
   }
-  [_getContextAttributes_1](...args) {
+  [_getContextAttributes_1$](...args) {
     return this.getContextAttributes.apply(this, args);
   }
   [dartx.getError](...args) {
@@ -108582,20 +108585,20 @@
       this[_texImage2D_1](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
-    if ((html.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
-      let pixels_1 = html_common.convertDartToNative_ImageData(html.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
+    if ((html$.ImageData.is(border_OR_canvas_OR_image_OR_pixels_OR_video) || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && format == null && type == null && pixels == null) {
+      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(border_OR_canvas_OR_image_OR_pixels_OR_video));
       this[_texImage2D_2](target, level, internalformat, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if (html.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+    if (html$.ImageElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
       this[_texImage2D_3](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if (html.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+    if (html$.CanvasElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
       this[_texImage2D_4](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
-    if (html.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
+    if (html$.VideoElement.is(border_OR_canvas_OR_image_OR_pixels_OR_video) && format == null && type == null && pixels == null) {
       this[_texImage2D_5](target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -108646,20 +108649,20 @@
       this[_texSubImage2D_1](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
-    if ((html.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
-      let pixels_1 = html_common.convertDartToNative_ImageData(html.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
+    if ((html$.ImageData.is(canvas_OR_format_OR_image_OR_pixels_OR_video) || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && type == null && pixels == null) {
+      let pixels_1 = html_common.convertDartToNative_ImageData(html$.ImageData._check(canvas_OR_format_OR_image_OR_pixels_OR_video));
       this[_texSubImage2D_2](target, level, xoffset, yoffset, format_OR_width, height_OR_type, pixels_1);
       return;
     }
-    if (html.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+    if (html$.ImageElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
       this[_texSubImage2D_3](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if (html.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+    if (html$.CanvasElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
       this[_texSubImage2D_4](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
-    if (html.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
+    if (html$.VideoElement.is(canvas_OR_format_OR_image_OR_pixels_OR_video) && type == null && pixels == null) {
       this[_texSubImage2D_5](target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
@@ -108803,11 +108806,11 @@
     return this.texSubImage2D.apply(this, args);
   }
 };
-web_gl.RenderingContext[dart.implements] = () => [html.CanvasRenderingContext];
+web_gl.RenderingContext[dart.implements] = () => [html$.CanvasRenderingContext];
 dart.setSignature(web_gl.RenderingContext, {
   constructors: () => ({_: dart.definiteFunctionType(web_gl.RenderingContext, [])}),
   fields: () => ({
-    [dartx.canvas]: html.CanvasElement,
+    [dartx.canvas]: html$.CanvasElement,
     [dartx.drawingBufferHeight]: core.int,
     [dartx.drawingBufferWidth]: core.int
   }),
@@ -108876,7 +108879,7 @@
     [dartx.getAttribLocation]: dart.definiteFunctionType(core.int, [web_gl.Program, core.String]),
     [dartx.getBufferParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int]),
     [dartx.getContextAttributes]: dart.definiteFunctionType(web_gl.ContextAttributes, []),
-    [_getContextAttributes_1]: dart.definiteFunctionType(dart.dynamic, []),
+    [_getContextAttributes_1$]: dart.definiteFunctionType(dart.dynamic, []),
     [dartx.getError]: dart.definiteFunctionType(core.int, []),
     [dartx.getExtension]: dart.definiteFunctionType(core.Object, [core.String]),
     [dartx.getFramebufferAttachmentParameter]: dart.definiteFunctionType(core.Object, [core.int, core.int, core.int]),
@@ -108921,27 +108924,27 @@
     [dartx.texImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, core.int, typed_data.TypedData]),
     [_texImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, dart.dynamic, typed_data.TypedData]),
     [_texImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.ImageElement]),
-    [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.CanvasElement]),
-    [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.VideoElement]),
-    [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html.CanvasElement]),
-    [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html.ImageElement]),
-    [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html.ImageData]),
+    [_texImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
+    [_texImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
+    [_texImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
+    [dartx.texImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
+    [dartx.texImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
+    [dartx.texImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
     [_texImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html.VideoElement]),
+    [dartx.texImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
     [dartx.texParameterf]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.num]),
     [dartx.texParameteri]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int]),
     [dartx.texSubImage2D]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, dart.dynamic], [core.int, typed_data.TypedData]),
     [_texSubImage2D_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, core.int, dart.dynamic, typed_data.TypedData]),
     [_texSubImage2D_2]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.ImageElement]),
-    [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.CanvasElement]),
-    [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html.VideoElement]),
-    [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html.CanvasElement]),
-    [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html.ImageElement]),
-    [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html.ImageData]),
+    [_texSubImage2D_3]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.ImageElement]),
+    [_texSubImage2D_4]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.CanvasElement]),
+    [_texSubImage2D_5]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, html$.VideoElement]),
+    [dartx.texSubImage2DCanvas]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.CanvasElement]),
+    [dartx.texSubImage2DImage]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageElement]),
+    [dartx.texSubImage2DImageData]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.ImageData]),
     [_texSubImage2DImageData_1]: dart.definiteFunctionType(dart.void, [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
-    [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html.VideoElement]),
+    [dartx.texSubImage2DVideo]: dart.definiteFunctionType(dart.void, [core.int, core.int, core.int, core.int, core.int, core.int, html$.VideoElement]),
     [dartx.uniform1f]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.num]),
     [dartx.uniform1fv]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, typed_data.Float32List]),
     [dartx.uniform1i]: dart.definiteFunctionType(dart.void, [web_gl.UniformLocation, core.int]),
@@ -110089,7 +110092,7 @@
 dart.defineExtensionNames([
   'statusMessage'
 ]);
-web_gl.ContextEvent = class ContextEvent extends html.Event {
+web_gl.ContextEvent = class ContextEvent extends html$.Event {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
@@ -110517,9 +110520,9 @@
   constructors: () => ({_: dart.definiteFunctionType(web_sql.SqlDatabase, [])}),
   fields: () => ({[dartx.version]: core.String}),
   methods: () => ({
-    [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html.VoidCallback]),
-    [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html.VoidCallback]),
-    [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html.VoidCallback])
+    [dartx.changeVersion]: dart.definiteFunctionType(dart.void, [core.String, core.String], [web_sql.SqlTransactionCallback, web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
+    [dartx.readTransaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback]),
+    [dartx.transaction]: dart.definiteFunctionType(dart.void, [web_sql.SqlTransactionCallback], [web_sql.SqlTransactionErrorCallback, html$.VoidCallback])
   }),
   sgetters: () => ({supported: dart.definiteFunctionType(core.bool, [])})
 });
@@ -110605,7 +110608,7 @@
   'elementAt',
   'item'
 ]);
-web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html.ImmutableListMixin$(core.Map)) {
+web_sql.SqlResultSetRowList = class SqlResultSetRowList extends dart.mixin(_interceptors.Interceptor, collection.ListMixin$(core.Map), html$.ImmutableListMixin$(core.Map)) {
   static _() {
     dart.throw(new core.UnsupportedError("Not supported"));
   }
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index e940863..585b7a4 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -27,6 +27,34 @@
   // Longer term, we can easily migrate to an existing JS module system:
   // ES6, AMD, RequireJS, ....
 
+  // Returns a proxy that delegates to the underlying loader.
+  // This defers loading of a module until a library is actually used.
+  const loadedModule = Symbol('loadedModule');
+  dart_library.defer = function(module, name, patch) {
+    let done = false;
+    function loadDeferred() {
+      done = true;
+      var mod = module[loadedModule];
+      var lib = mod[name];
+      // Install unproxied module and library in caller's context.
+      patch(mod, lib);
+    }
+    // The deferred library object.  Note, the only legal operations on a Dart
+    // library object should be get (to read a top-level variable, method, or
+    // Class) or set (to write a top-level variable).
+    return new Proxy({}, {
+      get: function(o, p) {
+        if (!done) loadDeferred();
+        return module[name][p];
+      },
+      set: function(o, p, value) {
+        if (!done) loadDeferred();
+        module[name][p] = value;
+        return true;
+      },
+    });
+  };
+
   class LibraryLoader {
 
     constructor(name, defaultValue, imports, loader) {
@@ -65,11 +93,33 @@
       let args = this.loadImports();
 
       // Load the library
-      args.unshift(this._library);
-      this._loader.apply(null, args);
+      let loader = this;
+      let library = this._library;
+      library[dartLibraryName] = this._name;
+      library[libraryImports] = this._imports;
+      library[loadedModule] = library;
+      args.unshift(library);
+
+      if (this._name == 'dart_sdk') {
+        // Eagerly load the SDK.
+        this._loader.apply(null, args);
+        loader._loader = null;
+      } else {
+        // Load / parse other modules on demand.
+        let done = false;
+        this._library = new Proxy(library, {
+          get: function(o, name) {
+            if (!done) {
+              done = true;
+              loader._loader.apply(null, args);
+              loader._loader = null;
+            }
+            return o[name];
+          }
+        });
+      }
+
       this._state = LibraryLoader.READY;
-      this._library[dartLibraryName] = this._name;
-      this._library[libraryImports] = this._imports;
       return this._library;
     }
 
@@ -121,14 +171,14 @@
     if (libraryName == null) libraryName = moduleName;
     let library = import_(moduleName)[libraryName];
     let dart_sdk = import_('dart_sdk');
+
     if (!_currentIsolate) {
-      // Create isolate and run main.
+      // Create isolate.
       _currentIsolate = true;
-      dart_sdk._isolate_helper.startRootIsolate(library.main, []);
-    } else {
-      // Main isolate is already initialized - just run main.
-      library.main();
+      dart_sdk._isolate_helper.startRootIsolate(() => {}, []);
     }
+
+    library.main();
   }
   dart_library.start = start;
 
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index 295dd7f..ca3e10c 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -2625,7 +2625,8 @@
         window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
       }
     }
-    return typeof window == "undefined" ? global : window;
+    var globalState = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : {};
+    return globalState;
   })();
   dart.JsSymbol = Symbol;
   dart._mixins = Symbol("mixins");
@@ -19095,12 +19096,14 @@
           return completer.future;
         };
       }
-      static forEach(input, f) {
-        let iterator = input[dartx.iterator];
-        return async.Future.doWhile(dart.fn(() => {
-          if (!dart.test(iterator.moveNext())) return false;
-          return async.Future.sync(dart.fn(() => dart.dcall(f, iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
-        }, VoidToObject$()));
+      static forEach(T) {
+        return (input, f) => {
+          let iterator = input[dartx.iterator];
+          return async.Future.doWhile(dart.fn(() => {
+            if (!dart.test(iterator.moveNext())) return false;
+            return async.Future.sync(dart.fn(() => f(iterator.current), VoidTodynamic$())).then(core.bool)(dart.fn(_ => true, dynamicTobool$()));
+          }, VoidToObject$()));
+        };
       }
       static doWhile(f) {
         let doneSignal = new async._Future();
@@ -19130,7 +19133,7 @@
       statics: () => ({
         wait: dart.definiteFunctionType(T => [async.Future$(core.List$(T)), [core.Iterable$(async.Future$(T))], {eagerError: core.bool, cleanUp: dart.functionType(dart.void, [T])}]),
         any: dart.definiteFunctionType(T => [async.Future$(T), [core.Iterable$(async.Future$(T))]]),
-        forEach: dart.definiteFunctionType(async.Future, [core.Iterable, dynamicTodynamic()]),
+        forEach: dart.definiteFunctionType(T => [async.Future, [core.Iterable$(T), dart.functionType(dart.dynamic, [T])]]),
         doWhile: dart.definiteFunctionType(async.Future, [VoidTodynamic()])
       }),
       names: ['wait', 'any', 'forEach', 'doWhile']
diff --git a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
index 8afc764..2578829 100644
--- a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
+++ b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
Binary files differ
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index a23e3e3..ef79b36 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -421,7 +421,7 @@
     var source = library.source;
     // TODO(jmesserly): we need to split out HTML.
     if (source.uri.scheme == 'dart') {
-      return 'dart_sdk';
+      return JS.dartSdkModule;
     }
     var moduleName = _buildUnit.libraryToModule(source);
     if (moduleName == null) {
diff --git a/pkg/dev_compiler/lib/src/compiler/js_names.dart b/pkg/dev_compiler/lib/src/compiler/js_names.dart
index 9bce2f5..456344a 100644
--- a/pkg/dev_compiler/lib/src/compiler/js_names.dart
+++ b/pkg/dev_compiler/lib/src/compiler/js_names.dart
@@ -6,6 +6,9 @@
 
 import '../js_ast/js_ast.dart';
 
+/// The ES6 name for the Dart SDK.  All dart:* libraries are in this module.
+const String dartSdkModule = 'dart_sdk';
+
 /// Unique instance for temporary variables. Will be renamed consistently
 /// across the entire file. Different instances will be named differently
 /// even if they have the same name, this makes it safe to use in code
@@ -107,6 +110,7 @@
 class _RenameVisitor extends VariableDeclarationVisitor {
   final pendingRenames = new Map<Object, Set<_FunctionScope>>();
 
+  final _FunctionScope globalScope = new _FunctionScope(null);
   final _FunctionScope rootScope = new _FunctionScope(null);
   _FunctionScope scope;
 
@@ -136,7 +140,7 @@
     }
     if (declScope == null) {
       // Assume it comes from the global scope.
-      declScope = rootScope;
+      declScope = globalScope;
       declScope.declared.add(id);
     }
     _markUsed(node, id, declScope);
@@ -146,7 +150,7 @@
     // If it needs rename, we can't add it to the used name set yet, instead we
     // will record all scopes it is visible in.
     Set<_FunctionScope> usedIn = null;
-    var rename = declScope != rootScope && needsRename(node);
+    var rename = declScope != globalScope && needsRename(node);
     if (rename) {
       usedIn = pendingRenames.putIfAbsent(id, () => new HashSet());
     }
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index 415554a..07510eb 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -161,8 +161,19 @@
       for (var importName in import.namedImports) {
         assert(!importName.isStar); // import * not supported in legacy modules.
         var asName = importName.asName ?? importName.name;
-        importStatements.add(js.statement(
-            'const # = #.#', [asName, moduleVar, importName.name.name]));
+        var fromName = importName.name.name;
+        // Load non-SDK modules on demand (i.e., deferred).
+        if (import.from.valueWithoutQuotes != dartSdkModule) {
+          importStatements.add(js.statement(
+              'let # = dart_library.defer(#, #, function (mod, lib) {'
+              '  # = mod;'
+              '  # = lib;'
+              '});',
+              [asName, moduleVar, js.string(fromName), moduleVar, asName]));
+        } else {
+          importStatements.add(js.statement(
+              'const # = #.#', [asName, moduleVar, importName.name.name]));
+        }
       }
     }
     statements.insertAll(0, importStatements);
@@ -201,7 +212,7 @@
 /// Generates CommonJS modules (used by Node.js).
 class CommonJSModuleBuilder extends _ModuleBuilder {
   Program build(Program module) {
-    var importStatements = <Statement>[];
+    var importStatements = [js.statement("'use strict';"),];
 
     // Collect imports/exports/statements.
     visitProgram(module);
@@ -238,12 +249,7 @@
       }
     }
 
-    // TODO(vsm): See https://github.com/dart-lang/sdk/issues/27309
-    // This extra level of indirection should be unnecessary.
-    var block =
-        js.statement("(function() { 'use strict'; #; })()", [statements]);
-
-    return new Program([block]);
+    return new Program(statements);
   }
 }
 
diff --git a/pkg/dev_compiler/test/codegen_expected/node_modules.js b/pkg/dev_compiler/test/codegen_expected/node_modules.js
index 2281378..5a7fa95 100644
--- a/pkg/dev_compiler/test/codegen_expected/node_modules.js
+++ b/pkg/dev_compiler/test/codegen_expected/node_modules.js
@@ -1,55 +1,53 @@
-(function() {
-  'use strict';
-  const dart_sdk = require('dart_sdk');
-  const core = dart_sdk.core;
-  const dart = dart_sdk.dart;
-  const dartx = dart_sdk.dartx;
-  const node_modules = Object.create(null);
-  let B = () => (B = dart.constFn(node_modules.B$()))();
-  let _B = () => (_B = dart.constFn(node_modules._B$()))();
-  let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
-  let VoidToString = () => (VoidToString = dart.constFn(dart.definiteFunctionType(core.String, [])))();
-  node_modules.Callback = dart.typedef('Callback', () => dart.functionType(dart.void, [], {i: core.int}));
-  node_modules.A = class A extends core.Object {};
-  node_modules._A = class _A extends core.Object {};
-  node_modules.B$ = dart.generic(T => {
-    class B extends core.Object {}
-    dart.addTypeTests(B);
-    return B;
-  });
-  node_modules.B = B();
-  node_modules._B$ = dart.generic(T => {
-    class _B extends core.Object {}
-    dart.addTypeTests(_B);
-    return _B;
-  });
-  node_modules._B = _B();
-  node_modules.f = function() {
-  };
-  dart.fn(node_modules.f, VoidTodynamic());
-  node_modules._f = function() {
-  };
-  dart.fn(node_modules._f, VoidTodynamic());
-  node_modules.constant = "abc";
-  node_modules.finalConstant = "abc";
-  dart.defineLazy(node_modules, {
-    get lazy() {
-      return dart.fn(() => {
-        core.print('lazy');
-        return "abc";
-      }, VoidToString())();
-    }
-  });
-  node_modules.mutable = "abc";
-  dart.defineLazy(node_modules, {
-    get lazyMutable() {
-      return dart.fn(() => {
-        core.print('lazyMutable');
-        return "abc";
-      }, VoidToString())();
-    },
-    set lazyMutable(_) {}
-  });
-  // Exports:
-  exports.node_modules = node_modules;
-})();
+'use strict';
+const dart_sdk = require('dart_sdk');
+const core = dart_sdk.core;
+const dart = dart_sdk.dart;
+const dartx = dart_sdk.dartx;
+const node_modules = Object.create(null);
+let B = () => (B = dart.constFn(node_modules.B$()))();
+let _B = () => (_B = dart.constFn(node_modules._B$()))();
+let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let VoidToString = () => (VoidToString = dart.constFn(dart.definiteFunctionType(core.String, [])))();
+node_modules.Callback = dart.typedef('Callback', () => dart.functionType(dart.void, [], {i: core.int}));
+node_modules.A = class A extends core.Object {};
+node_modules._A = class _A extends core.Object {};
+node_modules.B$ = dart.generic(T => {
+  class B extends core.Object {}
+  dart.addTypeTests(B);
+  return B;
+});
+node_modules.B = B();
+node_modules._B$ = dart.generic(T => {
+  class _B extends core.Object {}
+  dart.addTypeTests(_B);
+  return _B;
+});
+node_modules._B = _B();
+node_modules.f = function() {
+};
+dart.fn(node_modules.f, VoidTodynamic());
+node_modules._f = function() {
+};
+dart.fn(node_modules._f, VoidTodynamic());
+node_modules.constant = "abc";
+node_modules.finalConstant = "abc";
+dart.defineLazy(node_modules, {
+  get lazy() {
+    return dart.fn(() => {
+      core.print('lazy');
+      return "abc";
+    }, VoidToString())();
+  }
+});
+node_modules.mutable = "abc";
+dart.defineLazy(node_modules, {
+  get lazyMutable() {
+    return dart.fn(() => {
+      core.print('lazyMutable');
+      return "abc";
+    }, VoidToString())();
+  },
+  set lazyMutable(_) {}
+});
+// Exports:
+exports.node_modules = node_modules;
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart
index 49b2460..5b570c6 100644
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart
+++ b/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart
@@ -418,8 +418,8 @@
    * If [f] returns a non-[Future], iteration continues immediately. Otherwise
    * it waits for the returned [Future] to complete.
    */
-  static Future forEach(Iterable input, f(element)) {
-    Iterator iterator = input.iterator;
+  static Future forEach<T>(Iterable<T> input, f(T element)) {
+    var iterator = input.iterator;
     return doWhile(() {
       if (!iterator.moveNext()) return false;
       return new Future.sync(() => f(iterator.current)).then((_) => true);
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
index fb47401..eb3b1e0 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/runtime.dart
@@ -82,7 +82,10 @@
         window.SourceBufferList = new MediaSource().sourceBuffers.constructor;
       }
     }
-    return typeof window == "undefined" ? global : window;
+    var globalState = (typeof window != "undefined") ? window
+      : (typeof global != "undefined") ? global
+      : (typeof self != "undefined") ? self : {};
+    return globalState;
   }()
 ''');
 
diff --git a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
index 505af9f..849100a 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -4,53 +4,43 @@
 
 library fasta.analyzer.ast_builder;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show
-    BeginGroupToken,
-    Token;
+import 'package:front_end/src/fasta/scanner/token.dart'
+    show BeginGroupToken, Token;
 
 import 'package:analyzer/analyzer.dart';
 
-import 'package:analyzer/dart/ast/token.dart' as analyzer show
-    Token;
+import 'package:analyzer/dart/ast/token.dart' as analyzer show Token;
 
-import 'package:analyzer/dart/element/element.dart' show
-    Element;
+import 'package:analyzer/dart/element/element.dart' show Element;
 
-import 'package:analyzer/dart/ast/ast_factory.dart' show
-    AstFactory;
+import 'package:analyzer/dart/ast/ast_factory.dart' show AstFactory;
 
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
 
-import '../errors.dart' show
-    internalError;
+import 'package:kernel/ast.dart' show AsyncMarker;
 
-import '../source/scope_listener.dart' show
-    JumpTargetKind,
-    NullValue,
-    Scope,
-    ScopeListener;
+import '../errors.dart' show internalError;
 
-import '../kernel/kernel_builder.dart' show
-    Builder,
-    KernelLibraryBuilder,
-    ProcedureBuilder;
+import '../source/scope_listener.dart'
+    show JumpTargetKind, NullValue, Scope, ScopeListener;
+
+import '../kernel/kernel_builder.dart'
+    show Builder, KernelLibraryBuilder, ProcedureBuilder;
 
 import '../quote.dart';
 
-import '../source/outline_builder.dart' show
-    asyncMarkerFromTokens;
+import '../source/outline_builder.dart' show asyncMarkerFromTokens;
 
-import 'element_store.dart' show
-    AnalyzerLocalVariableElemment,
-    AnalyzerParameterElement,
-    ElementStore,
-    KernelClassElement;
+import 'element_store.dart'
+    show
+        AnalyzerLocalVariableElemment,
+        AnalyzerParameterElement,
+        ElementStore,
+        KernelClassElement;
 
-import 'token_utils.dart' show
-    toAnalyzerToken;
+import 'token_utils.dart' show toAnalyzerToken;
 
-import 'analyzer.dart' show
-    toKernel;
+import 'analyzer.dart' show toKernel;
 
 class AstBuilder extends ScopeListener {
   final AstFactory ast = standard.astFactory;
@@ -63,6 +53,11 @@
 
   bool isFirstIdentifier = false;
 
+  /// If `true`, the first call to [handleIdentifier] should push a
+  /// List<SimpleIdentifier> on the stack, and [handleQualified] should append
+  /// to the list.
+  var accumulateIdentifierComponents = false;
+
   AstBuilder(this.library, this.member, this.elementStore, Scope scope)
       : super(scope);
 
@@ -100,13 +95,12 @@
       Quote quote = analyzeQuote(first.value);
       List<InterpolationElement> elements = <InterpolationElement>[];
       elements.add(ast.interpolationString(
-              toAnalyzerToken(first),
-              unescapeFirstStringPart(first.value, quote)));
+          toAnalyzerToken(first), unescapeFirstStringPart(first.value, quote)));
       for (int i = 1; i < parts.length - 1; i++) {
         var part = parts[i];
         if (part is Token) {
-          elements.add(ast.interpolationString(
-                  toAnalyzerToken(part), part.value));
+          elements
+              .add(ast.interpolationString(toAnalyzerToken(part), part.value));
         } else if (part is Expression) {
           elements.add(ast.interpolationExpression(null, part, null));
         } else {
@@ -114,8 +108,8 @@
               "Unexpected part in string interpolation: ${part.runtimeType}");
         }
       }
-      elements.add(ast.interpolationString(toAnalyzerToken(last),
-              unescapeLastStringPart(last.value, quote)));
+      elements.add(ast.interpolationString(
+          toAnalyzerToken(last), unescapeLastStringPart(last.value, quote)));
       push(ast.stringInterpolation(elements));
     }
   }
@@ -128,8 +122,8 @@
   void endArguments(int count, Token beginToken, Token endToken) {
     debugEvent("Arguments");
     List expressions = popList(count);
-    ArgumentList arguments = ast.argumentList(toAnalyzerToken(beginToken),
-        expressions, toAnalyzerToken(endToken));
+    ArgumentList arguments = ast.argumentList(
+        toAnalyzerToken(beginToken), expressions, toAnalyzerToken(endToken));
     push(ast.methodInvocation(null, null, null, null, arguments));
   }
 
@@ -141,15 +135,23 @@
     debugEvent("handleIdentifier");
     String name = token.value;
     SimpleIdentifier identifier = ast.simpleIdentifier(toAnalyzerToken(token));
-    if (isFirstIdentifier) {
-      Builder builder = scope.lookup(name, token.charOffset, uri);
-      if (builder != null) {
-        Element element = elementStore[builder];
-        assert(element != null);
-        identifier.staticElement = element;
+    if (accumulateIdentifierComponents) {
+      if (isFirstIdentifier) {
+        push([identifier]);
+      } else {
+        push(identifier);
       }
+    } else {
+      if (isFirstIdentifier) {
+        Builder builder = scope.lookup(name, token.charOffset, uri);
+        if (builder != null) {
+          Element element = elementStore[builder];
+          assert(element != null);
+          identifier.staticElement = element;
+        }
+      }
+      push(identifier);
     }
-    push(identifier);
     isFirstIdentifier = false;
   }
 
@@ -177,8 +179,7 @@
     }
   }
 
-  void doPropertyGet(Token token) {
-  }
+  void doPropertyGet(Token token) {}
 
   void endExpressionStatement(Token token) {
     debugEvent("ExpressionStatement");
@@ -191,8 +192,8 @@
     if (beginToken != null) {
       exitLocalScope();
     }
-    push(ast.block(toAnalyzerToken(beginToken), statements,
-            toAnalyzerToken(endToken)));
+    push(ast.block(
+        toAnalyzerToken(beginToken), statements, toAnalyzerToken(endToken)));
   }
 
   void finishFunction(formals, asyncModifier, Statement body) {
@@ -243,13 +244,13 @@
     Expression identifierOrInvoke = pop();
     Expression receiver = pop();
     if (identifierOrInvoke is SimpleIdentifier) {
-      push(ast.propertyAccess(receiver, toAnalyzerToken(token),
-              identifierOrInvoke));
+      push(ast.propertyAccess(
+          receiver, toAnalyzerToken(token), identifierOrInvoke));
     } else if (identifierOrInvoke is MethodInvocation) {
       assert(identifierOrInvoke.target == null);
       identifierOrInvoke
-          ..target = receiver
-          ..operator = toAnalyzerToken(token);
+        ..target = receiver
+        ..operator = toAnalyzerToken(token);
       push(identifierOrInvoke);
     } else {
       internalError(
@@ -266,8 +267,8 @@
       bool hasExpression, Token beginToken, Token endToken) {
     debugEvent("ReturnStatement");
     Expression expression = hasExpression ? pop() : null;
-    push(ast.returnStatement(toAnalyzerToken(beginToken), expression,
-            toAnalyzerToken(endToken)));
+    push(ast.returnStatement(
+        toAnalyzerToken(beginToken), expression, toAnalyzerToken(endToken)));
   }
 
   void endIfStatement(Token ifToken, Token elseToken) {
@@ -276,9 +277,13 @@
     Expression condition = pop();
     BeginGroupToken leftParenthesis = ifToken.next;
     push(ast.ifStatement(
-            toAnalyzerToken(ifToken), toAnalyzerToken(ifToken.next), condition,
-            toAnalyzerToken(leftParenthesis.endGroup), thenPart,
-            toAnalyzerToken(elseToken), elsePart));
+        toAnalyzerToken(ifToken),
+        toAnalyzerToken(ifToken.next),
+        condition,
+        toAnalyzerToken(leftParenthesis.endGroup),
+        thenPart,
+        toAnalyzerToken(elseToken),
+        elsePart));
   }
 
   void prepareInitializers() {
@@ -301,7 +306,7 @@
     Identifier identifier = pop();
     // TODO(ahe): Don't push initializers, instead install them.
     push(ast.variableDeclaration(
-            identifier, toAnalyzerToken(assignmentOperator), initializer));
+        identifier, toAnalyzerToken(assignmentOperator), initializer));
   }
 
   void endInitializedIdentifier() {
@@ -326,8 +331,8 @@
     TypeName type = pop();
     pop(); // Modifiers.
     push(ast.variableDeclarationStatement(
-            ast.variableDeclarationList(null, null, null, type, variables),
-            toAnalyzerToken(endToken)));
+        ast.variableDeclarationList(null, null, null, type, variables),
+        toAnalyzerToken(endToken)));
   }
 
   void handleAssignmentExpression(Token token) {
@@ -341,8 +346,8 @@
     debugEvent("Block");
     List<Statement> statements = popList(count) ?? <Statement>[];
     exitLocalScope();
-    push(ast.block(toAnalyzerToken(beginToken), statements,
-            toAnalyzerToken(endToken)));
+    push(ast.block(
+        toAnalyzerToken(beginToken), statements, toAnalyzerToken(endToken)));
   }
 
   void endForStatement(
@@ -357,16 +362,16 @@
     exitLocalScope();
     BeginGroupToken leftParenthesis = beginToken.next;
     push(ast.forStatement(
-            toAnalyzerToken(beginToken),
-            toAnalyzerToken(leftParenthesis),
-            variables?.variables,
-            null, // initialization.
-            variables?.semicolon,
-            condition.expression,
-            condition.semicolon,
-            updates,
-            toAnalyzerToken(leftParenthesis.endGroup),
-            body));
+        toAnalyzerToken(beginToken),
+        toAnalyzerToken(leftParenthesis),
+        variables?.variables,
+        null, // initialization.
+        variables?.semicolon,
+        condition.expression,
+        condition.semicolon,
+        updates,
+        toAnalyzerToken(leftParenthesis.endGroup),
+        body));
   }
 
   void handleLiteralList(
@@ -374,12 +379,8 @@
     debugEvent("LiteralList");
     List<Expression> expressions = popList(count);
     TypeArgumentList typeArguments = pop();
-    push(ast.listLiteral(
-            toAnalyzerToken(constKeyword),
-            typeArguments,
-            toAnalyzerToken(beginToken),
-            expressions,
-            toAnalyzerToken(endToken)));
+    push(ast.listLiteral(toAnalyzerToken(constKeyword), typeArguments,
+        toAnalyzerToken(beginToken), expressions, toAnalyzerToken(endToken)));
   }
 
   void handleAsyncModifier(Token asyncToken, Token starToken) {
@@ -419,7 +420,7 @@
     List<MapLiteralEntry> entries = popList(count) ?? <MapLiteralEntry>[];
     TypeArgumentList typeArguments = pop();
     push(ast.mapLiteral(toAnalyzerToken(constKeyword), typeArguments,
-            toAnalyzerToken(beginToken), entries, toAnalyzerToken(endToken)));
+        toAnalyzerToken(beginToken), entries, toAnalyzerToken(endToken)));
   }
 
   void endLiteralMapEntry(Token colon, Token endToken) {
@@ -469,8 +470,8 @@
     debugEvent("IsOperator");
     TypeName type = pop();
     Expression expression = pop();
-    push(ast.isExpression(expression, toAnalyzerToken(operator),
-            toAnalyzerToken(not), type));
+    push(ast.isExpression(
+        expression, toAnalyzerToken(operator), toAnalyzerToken(not), type));
   }
 
   void handleConditionalExpression(Token question, Token colon) {
@@ -479,7 +480,7 @@
     Expression thenExpression = pop();
     Expression condition = pop();
     push(ast.conditionalExpression(condition, toAnalyzerToken(question),
-            thenExpression, toAnalyzerToken(colon), elseExpression));
+        thenExpression, toAnalyzerToken(colon), elseExpression));
   }
 
   void endThrowExpression(Token throwToken, Token endToken) {
@@ -496,8 +497,8 @@
     TypeName type = pop();
     pop(); // Modifiers.
     pop(); // Metadata.
-    SimpleFormalParameter node = ast.simpleFormalParameter(null, null,
-        toAnalyzerToken(thisKeyword), type, name);
+    SimpleFormalParameter node = ast.simpleFormalParameter(
+        null, null, toAnalyzerToken(thisKeyword), type, name);
     scope[name.name] = name.staticElement = new AnalyzerParameterElement(node);
     push(node);
   }
@@ -505,8 +506,8 @@
   void endFormalParameters(int count, Token beginToken, Token endToken) {
     debugEvent("FormalParameters");
     List<FormalParameter> parameters = popList(count) ?? <FormalParameter>[];
-    push(ast.formalParameterList(toAnalyzerToken(beginToken), parameters,
-            null, null, toAnalyzerToken(endToken)));
+    push(ast.formalParameterList(toAnalyzerToken(beginToken), parameters, null,
+        null, toAnalyzerToken(endToken)));
   }
 
   void handleCatchBlock(Token onKeyword, Token catchKeyword) {
@@ -528,19 +529,24 @@
       }
     }
     BeginGroupToken leftParenthesis = catchKeyword.next;
-    push(ast.catchClause(toAnalyzerToken(onKeyword), type,
-            toAnalyzerToken(catchKeyword), toAnalyzerToken(leftParenthesis),
-            exception, null, stackTrace,
-            toAnalyzerToken(leftParenthesis.endGroup), body));
+    push(ast.catchClause(
+        toAnalyzerToken(onKeyword),
+        type,
+        toAnalyzerToken(catchKeyword),
+        toAnalyzerToken(leftParenthesis),
+        exception,
+        null,
+        stackTrace,
+        toAnalyzerToken(leftParenthesis.endGroup),
+        body));
   }
 
-  void endTryStatement(
-      int catchCount, Token tryKeyword, Token finallyKeyword) {
+  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
     Block finallyBlock = popIfNotNull(finallyKeyword);
     List<CatchClause> catchClauses = popList(catchCount);
     Block body = pop();
     push(ast.tryStatement(toAnalyzerToken(tryKeyword), body, catchClauses,
-            toAnalyzerToken(finallyKeyword), finallyBlock));
+        toAnalyzerToken(finallyKeyword), finallyBlock));
   }
 
   void handleNoExpression(Token token) {
@@ -558,14 +564,18 @@
       Token token = peek();
       push(receiver);
       IndexExpression expression = ast.indexExpressionForCascade(
-          toAnalyzerToken(token), toAnalyzerToken(openCurlyBracket), index,
+          toAnalyzerToken(token),
+          toAnalyzerToken(openCurlyBracket),
+          index,
           toAnalyzerToken(closeCurlyBracket));
       assert(expression.isCascaded);
       push(expression);
     } else {
-      push(ast.indexExpressionForTarget(target,
-              toAnalyzerToken(openCurlyBracket), index,
-              toAnalyzerToken(closeCurlyBracket)));
+      push(ast.indexExpressionForTarget(
+          target,
+          toAnalyzerToken(openCurlyBracket),
+          index,
+          toAnalyzerToken(closeCurlyBracket)));
     }
   }
 
@@ -594,4 +604,363 @@
     // TODO(ahe): Don't ignore modifiers.
     push(NullValue.Modifiers);
   }
+
+  FunctionBody _endFunctionBody() {
+    AstNode body = pop();
+    // TODO(paulberry): asyncMarker should have a type that allows constructing
+    // the necessary analyzer AST data structures.
+    AsyncMarker asyncMarker = pop();
+    assert(asyncMarker == AsyncMarker.Sync);
+    analyzer.Token asyncKeyword = null;
+    analyzer.Token star = null;
+    if (body is Block) {
+      return ast.blockFunctionBody(asyncKeyword, star, body);
+    } else if (body is ReturnStatement) {
+      assert(star == null);
+      return ast.expressionFunctionBody(
+          asyncKeyword, body.returnKeyword, body.expression, body.semicolon);
+    } else {
+      return internalError(
+          'Unexpected function body type: ${body.runtimeType}');
+    }
+  }
+
+  void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+    debugEvent("TopLevelMethod");
+    FunctionBody body = _endFunctionBody();
+    FormalParameterList parameters = pop();
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    analyzer.Token propertyKeyword = toAnalyzerToken(getOrSet);
+    TypeAnnotation returnType = pop();
+    // TODO(paulberry): handle modifiers.
+    var modifiers = pop();
+    assert(modifiers == null);
+    analyzer.Token externalKeyword = null;
+    List<Annotation> metadata = pop();
+    // TODO(paulberry): capture doc comments.
+    Comment comment = null;
+    push(ast.functionDeclaration(
+        comment,
+        metadata,
+        externalKeyword,
+        returnType,
+        propertyKeyword,
+        name,
+        ast.functionExpression(typeParameters, parameters, body)));
+  }
+
+  @override
+  void endTopLevelDeclaration(Token token) {
+    debugEvent("TopLevelDeclaration");
+  }
+
+  @override
+  void endCompilationUnit(int count, Token token) {
+    debugEvent("CompilationUnit");
+    analyzer.Token beginToken = null; // TODO(paulberry)
+    ScriptTag scriptTag = null; // TODO(paulberry)
+    var directives = <Directive>[];
+    var declarations = <CompilationUnitMember>[];
+    analyzer.Token endToken = null; // TODO(paulberry)
+    for (AstNode node in popList(count)) {
+      if (node is Directive) {
+        directives.add(node);
+      } else if (node is CompilationUnitMember) {
+        declarations.add(node);
+      } else {
+        internalError(
+            'Unrecognized compilation unit member: ${node.runtimeType}');
+      }
+    }
+    push(ast.compilationUnit(
+        beginToken, scriptTag, directives, declarations, endToken));
+  }
+
+  void endImport(Token importKeyword, Token deferredKeyword, Token asKeyword,
+      Token semicolon) {
+    debugEvent("Import");
+    List<Combinator> combinators = pop();
+    SimpleIdentifier prefix;
+    if (asKeyword != null) prefix = pop();
+    List<Configuration> configurations = pop();
+    assert(configurations == null); // TODO(paulberry)
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    assert(metadata == null);
+    // TODO(paulberry): capture doc comments.
+    Comment comment = null;
+    push(ast.importDirective(
+        comment,
+        metadata,
+        toAnalyzerToken(importKeyword),
+        uri,
+        configurations,
+        toAnalyzerToken(deferredKeyword),
+        toAnalyzerToken(asKeyword),
+        prefix,
+        combinators,
+        toAnalyzerToken(semicolon)));
+  }
+
+  void endExport(Token exportKeyword, Token semicolon) {
+    debugEvent("Export");
+    List<Combinator> combinators = pop();
+    List<Configuration> configurations = pop();
+    assert(configurations == null); // TODO(paulberry)
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    assert(metadata == null);
+    // TODO(paulberry): capture doc comments.
+    Comment comment = null;
+    push(ast.exportDirective(comment, metadata, toAnalyzerToken(exportKeyword),
+        uri, configurations, combinators, toAnalyzerToken(semicolon)));
+  }
+
+  @override
+  void endConditionalUris(int count) {
+    debugEvent("ConditionalUris");
+    push(popList(count) ?? NullValue.ConditionalUris);
+  }
+
+  @override
+  void endIdentifierList(int count) {
+    debugEvent("IdentifierList");
+    push(popList(count) ?? NullValue.IdentifierList);
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    debugEvent("Show");
+    List<SimpleIdentifier> shownNames = pop();
+    push(ast.showCombinator(toAnalyzerToken(showKeyword), shownNames));
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    debugEvent("Hide");
+    List<SimpleIdentifier> hiddenNames = pop();
+    push(ast.hideCombinator(toAnalyzerToken(hideKeyword), hiddenNames));
+  }
+
+  @override
+  void endTypeList(int count) {
+    debugEvent("TypeList");
+    push(popList(count) ?? NullValue.TypeList);
+  }
+
+  @override
+  void endClassBody(int memberCount, Token beginToken, Token endToken) {
+    debugEvent("ClassBody");
+    push(new _ClassBody(
+        beginToken, popList(memberCount) ?? <ClassMember>[], endToken));
+  }
+
+  @override
+  void endClassDeclaration(int interfacesCount, Token beginToken,
+      Token extendsKeyword, Token implementsKeyword, Token endToken) {
+    debugEvent("ClassDeclaration");
+    _ClassBody body = pop();
+    ImplementsClause implementsClause;
+    if (implementsKeyword != null) {
+      List<TypeName> interfaces = popList(interfacesCount);
+      implementsClause =
+          ast.implementsClause(toAnalyzerToken(implementsKeyword), interfaces);
+    }
+    ExtendsClause extendsClause;
+    WithClause withClause;
+    var supertype = pop();
+    if (supertype == null) {
+      // No extends clause
+    } else if (supertype is TypeName) {
+      extendsClause =
+          ast.extendsClause(toAnalyzerToken(extendsKeyword), supertype);
+    } else if (supertype is _MixinApplication) {
+      extendsClause = ast.extendsClause(
+          toAnalyzerToken(extendsKeyword), supertype.supertype);
+      withClause = ast.withClause(
+          toAnalyzerToken(supertype.withKeyword), supertype.mixinTypes);
+    } else {
+      internalError('Unexpected kind of supertype ${supertype.runtimeType}');
+    }
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    Token classKeyword;
+    // TODO(paulberry,ahe): This is a hack.  The parser should give us the class
+    // keyword.
+    if (identical(beginToken.value, 'abstract')) {
+      classKeyword = beginToken.next;
+    } else {
+      classKeyword = beginToken;
+    }
+    var modifiers = pop();
+    assert(modifiers == null); // TODO(paulberry)
+    analyzer.Token abstractKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = null; // TODO(paulberry)
+    push(ast.classDeclaration(
+        comment,
+        metadata,
+        abstractKeyword,
+        toAnalyzerToken(classKeyword),
+        name,
+        typeParameters,
+        extendsClause,
+        withClause,
+        implementsClause,
+        toAnalyzerToken(body.beginToken),
+        body.members,
+        toAnalyzerToken(body.endToken)));
+  }
+
+  @override
+  void endMixinApplication() {
+    debugEvent("MixinApplication");
+    List<TypeName> mixinTypes = pop();
+    // TODO(paulberry,ahe): the parser doesn't give us enough information to
+    // locate the "with" keyword.
+    Token withKeyword;
+    TypeName supertype = pop();
+    push(new _MixinApplication(supertype, withKeyword, mixinTypes));
+  }
+
+  @override
+  void endNamedMixinApplication(
+      Token beginToken, Token implementsKeyword, Token endToken) {
+    debugEvent("NamedMixinApplication");
+    ImplementsClause implementsClause;
+    if (implementsKeyword != null) {
+      List<TypeName> interfaces = pop();
+      implementsClause =
+          ast.implementsClause(toAnalyzerToken(implementsKeyword), interfaces);
+    }
+    _MixinApplication mixinApplication = pop();
+    var superclass = mixinApplication.supertype;
+    var withClause = ast.withClause(
+        toAnalyzerToken(mixinApplication.withKeyword),
+        mixinApplication.mixinTypes);
+    // TODO(paulberry,ahe): the parser should give us the "=" token.
+    analyzer.Token equals;
+    TypeParameterList typeParameters = pop();
+    SimpleIdentifier name = pop();
+    Token classKeyword;
+    // TODO(paulberry,ahe): This is a hack.  The parser should give us the class
+    // keyword.
+    if (identical(beginToken.value, 'abstract')) {
+      classKeyword = beginToken.next;
+    } else {
+      classKeyword = beginToken;
+    }
+    var modifiers = pop();
+    assert(modifiers == null); // TODO(paulberry)
+    analyzer.Token abstractKeyword;
+    List<Annotation> metadata = pop();
+    Comment comment = null; // TODO(paulberry)
+    push(ast.classTypeAlias(
+        comment,
+        metadata,
+        toAnalyzerToken(classKeyword),
+        name,
+        typeParameters,
+        equals,
+        abstractKeyword,
+        superclass,
+        withClause,
+        implementsClause,
+        toAnalyzerToken(endToken)));
+  }
+
+  @override
+  void beginLibraryName(Token token) {
+    accumulateIdentifierComponents = true;
+    isFirstIdentifier = true;
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    debugEvent("LibraryName");
+    List<SimpleIdentifier> libraryName = pop();
+    var name = ast.libraryIdentifier(libraryName);
+    List<Annotation> metadata = pop();
+    Comment comment = null; // TODO(paulberry)
+    push(ast.libraryDirective(comment, metadata,
+        toAnalyzerToken(libraryKeyword), name, toAnalyzerToken(semicolon)));
+    accumulateIdentifierComponents = false;
+  }
+
+  @override
+  void handleQualified(Token period) {
+    if (accumulateIdentifierComponents) {
+      SimpleIdentifier identifier = pop();
+      List<SimpleIdentifier> list = pop();
+      list.add(identifier);
+      push(list);
+    } else {
+      // TODO(paulberry): implement.
+      logEvent('Qualified');
+    }
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    debugEvent("Part");
+    StringLiteral uri = pop();
+    List<Annotation> metadata = pop();
+    Comment comment = null; // TODO(paulberry)
+    push(ast.partDirective(comment, metadata, toAnalyzerToken(partKeyword), uri,
+        toAnalyzerToken(semicolon)));
+  }
+
+  @override
+  void beginPartOf(Token token) {
+    accumulateIdentifierComponents = true;
+    isFirstIdentifier = true;
+  }
+
+  @override
+  void endPartOf(Token partKeyword, Token semicolon) {
+    debugEvent("PartOf");
+    List<SimpleIdentifier> libraryName = pop();
+    var name = ast.libraryIdentifier(libraryName);
+    StringLiteral uri = null; // TODO(paulberry)
+    // TODO(paulberry,ahe): seems hacky.  It would be nice if the parser passed
+    // in a reference to the "of" keyword.
+    var ofKeyword = partKeyword.next;
+    List<Annotation> metadata = pop();
+    Comment comment = null; // TODO(paulberry)
+    push(ast.partOfDirective(comment, metadata, toAnalyzerToken(partKeyword),
+        toAnalyzerToken(ofKeyword), uri, name, toAnalyzerToken(semicolon)));
+    accumulateIdentifierComponents = false;
+  }
+}
+
+/// Data structure placed on the stack to represent a class body.
+///
+/// This is needed because analyzer has no separate AST representation of a
+/// class body; it simply stores all of the relevant data in the
+/// [ClassDeclaration] object.
+class _ClassBody {
+  final Token beginToken;
+
+  final List<ClassMember> members;
+
+  final Token endToken;
+
+  _ClassBody(this.beginToken, this.members, this.endToken);
+}
+
+/// Data structure placed on the stack to represent a mixin application (a
+/// structure of the form "A with B, C").
+///
+/// This is needed because analyzer has no separate AST representation of a
+/// mixin application; it simply stores all of the relevant data in the
+/// [ClassDeclaration] or [ClassTypeAlias] object.
+class _MixinApplication {
+  final TypeName supertype;
+
+  final Token withKeyword;
+
+  final List<TypeName> mixinTypes;
+
+  _MixinApplication(this.supertype, this.withKeyword, this.mixinTypes);
 }
diff --git a/pkg/front_end/lib/src/fasta/analyzer/mock_element.dart b/pkg/front_end/lib/src/fasta/analyzer/mock_element.dart
index e9ed649..b56deac 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/mock_element.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/mock_element.dart
@@ -13,6 +13,7 @@
 
 import '../errors.dart' show
     internalError;
+import 'package:analyzer/src/generated/source.dart';
 
 abstract class MockElement extends Builder
     implements Element, LocalElement {
@@ -211,6 +212,9 @@
 
   bool get hasLoadLibraryFunction => internalError("not supported.");
 
+  @override
+  LineInfo get lineInfo => internalError("not supported.");
+
   List<TopLevelVariableElement> get topLevelVariables {
     return internalError("not supported.");
   }
diff --git a/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart b/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
index ed5a9ea..08a6ce7 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
@@ -45,79 +45,192 @@
 import '../errors.dart' show
     internalError;
 
-/// Converts a stream of Fasta tokens (starting with [token] and continuing to
-/// EOF) to a stream of analyzer tokens.
+/// Class capable of converting a stream of Fasta tokens to a stream of analyzer
+/// tokens.
 ///
-/// If any error tokens are found in the stream, they are reported using the
-/// [reportError] callback.
-analyzer.Token toAnalyzerTokenStream(
-    Token token,
-    void reportError(analyzer.ScannerErrorCode errorCode, int offset,
-        List<Object> arguments)) {
-  var analyzerTokenHead = new analyzer.Token(null, 0);
-  analyzerTokenHead.previous = analyzerTokenHead;
-  var analyzerTokenTail = analyzerTokenHead;
-  // TODO(paulberry,ahe): Fasta includes comments directly in the token
-  // stream, rather than pointing to them via a "precedingComment" pointer, as
-  // analyzer does.  This seems like it will complicate parsing and other
-  // operations.
-  analyzer.CommentToken currentCommentHead;
-  analyzer.CommentToken currentCommentTail;
-  // Note: beginTokenStack and endTokenStack are seeded with a sentinel value
-  // so that we don't have to check if they're empty.
-  var beginTokenStack = <analyzer.BeginToken>[null];
-  var endTokenStack = <Token>[null];
-  void matchGroups(Token token, analyzer.Token translatedToken) {
-    // If this token closes a group, set the corresponding opener token
-    // to point to it.
-    if (identical(endTokenStack.last, token)) {
-      beginTokenStack.last.endToken = translatedToken;
-      beginTokenStack.removeLast();
-      endTokenStack.removeLast();
+/// This is a class rather than an ordinary method so that it can be subclassed
+/// in tests.
+///
+/// TODO(paulberry,ahe): Fasta includes comments directly in the token
+/// stream, rather than pointing to them via a "precedingComment" pointer, as
+/// analyzer does.  This seems like it will complicate parsing and other
+/// operations.
+class ToAnalyzerTokenStreamConverter {
+  /// Synthetic token pointing to the first token in the analyzer token stream.
+  analyzer.Token _analyzerTokenHead;
+
+  /// The most recently generated analyzer token, or [_analyzerTokenHead] if no
+  /// tokens have been generated yet.
+  analyzer.Token _analyzerTokenTail;
+
+  /// If a sequence of consecutive comment tokens is being processed, the first
+  /// translated analyzer comment token.  Otherwise `null`.
+  analyzer.CommentToken _currentCommentHead;
+
+  /// If a sequence of consecutive comment tokens is being processed, the last
+  /// translated analyzer comment token.  Otherwise `null`.
+  analyzer.CommentToken _currentCommentTail;
+
+  /// Stack of analyzer "begin" tokens which need to be linked up to
+  /// corresponding "end" tokens once those tokens are translated.
+  ///
+  /// The first element of this list is always a sentinel `null` value so that
+  /// we don't have to check if it is empty.
+  ///
+  /// See additional documentation in [_matchGroups].
+  List<analyzer.BeginToken> _beginTokenStack;
+
+  /// Stack of fasta "end" tokens corresponding to the tokens in
+  /// [_endTokenStack].
+  ///
+  /// The first element of this list is always a sentinel `null` value so that
+  /// we don't have to check if it is empty.
+  ///
+  /// See additional documentation in [_matchGroups].
+  List<Token> _endTokenStack;
+
+  /// Converts a stream of Fasta tokens (starting with [token] and continuing to
+  /// EOF) to a stream of analyzer tokens.
+  analyzer.Token convertTokens(Token token) {
+    _analyzerTokenHead = new analyzer.Token(null, 0);
+    _analyzerTokenHead.previous = _analyzerTokenHead;
+    _analyzerTokenTail = _analyzerTokenHead;
+    _currentCommentHead = null;
+    _currentCommentTail = null;
+    _beginTokenStack = [null];
+    _endTokenStack = <Token>[null];
+
+    while (true) {
+      if (token.info.kind == BAD_INPUT_TOKEN) {
+        ErrorToken errorToken = token;
+        _translateErrorToken(errorToken);
+      } else if (token.info.kind == COMMENT_TOKEN) {
+        var translatedToken = translateCommentToken(token);
+        if (_currentCommentHead == null) {
+          _currentCommentHead = _currentCommentTail = translatedToken;
+        } else {
+          _currentCommentTail.setNext(translatedToken);
+          _currentCommentTail = translatedToken;
+        }
+      } else {
+        var translatedToken = translateToken(token, _currentCommentHead);
+        _matchGroups(token, translatedToken);
+        translatedToken.setNext(translatedToken);
+        _currentCommentHead = _currentCommentTail = null;
+        _analyzerTokenTail.setNext(translatedToken);
+        translatedToken.previous = _analyzerTokenTail;
+        _analyzerTokenTail = translatedToken;
+      }
+      if (token.isEof) {
+        return _analyzerTokenHead.next;
+      }
+      token = token.next;
     }
-    // If this token opens a group, and there is a matching closer that's not
-    // synthetic, put it on the stack.  The easiest way to tell whether the
-    // closer is synthetic is to see if it has the same offset as the opener.
+  }
+
+  /// Handles an error found during [convertTokens].
+  ///
+  /// Intended to be overridden by derived classes; by default, does nothing.
+  void reportError(analyzer.ScannerErrorCode errorCode, int offset,
+      List<Object> arguments) {}
+
+  /// Translates a single fasta comment token to the corresponding analyzer
+  /// token.
+  analyzer.CommentToken translateCommentToken(Token token) {
+    // TODO(paulberry,ahe): It would be nice if the scanner gave us an
+    // easier way to distinguish between the two types of comment.
+    var type = token.value.startsWith('/*')
+        ? TokenType.MULTI_LINE_COMMENT
+        : TokenType.SINGLE_LINE_COMMENT;
+    return new analyzer.CommentToken(type, token.value, token.charOffset);
+  }
+
+  /// Translates a single fasta non-comment token to the corresponding analyzer
+  /// token.
+  ///
+  /// [precedingComments] is not `null`, the translated token is pointed to it.
+  analyzer.Token translateToken(
+          Token token, analyzer.CommentToken precedingComments) =>
+      toAnalyzerToken(token, precedingComments);
+
+  /// Creates appropriate begin/end token links based on the fact that [token]
+  /// was translated to [translatedToken].
+  ///
+  /// Background: both fasta and analyzer have links from a "BeginToken" to its
+  /// matching "EndToken" in a group (like parentheses and braces).  However,
+  /// fasta may contain synthetic tokens from error recovery that are not mapped
+  /// to the analyzer token stream.  We use [_beginTokenStack] and
+  /// [_endTokenStack] to create the appropriate links for non-synthetic tokens
+  /// in the way analyzer expects.
+  void _matchGroups(Token token, analyzer.Token translatedToken) {
+    if (identical(_endTokenStack.last, token)) {
+      _beginTokenStack.last.endToken = translatedToken;
+      _beginTokenStack.removeLast();
+      _endTokenStack.removeLast();
+    }
+    // Synthetic end tokens use the same offset as the begin token.
     if (translatedToken is analyzer.BeginToken &&
         token is BeginGroupToken &&
         token.endGroup != null &&
         token.endGroup.charOffset != token.charOffset) {
-      beginTokenStack.add(translatedToken);
-      endTokenStack.add(token.endGroup);
+      _beginTokenStack.add(translatedToken);
+      _endTokenStack.add(token.endGroup);
     }
   }
 
-  while (true) {
-    if (token.info.kind == BAD_INPUT_TOKEN) {
-      ErrorToken errorToken = token;
-      _translateErrorToken(errorToken, reportError);
-    } else if (token.info.kind == COMMENT_TOKEN) {
-      // TODO(paulberry,ahe): It would be nice if the scanner gave us an
-      // easier way to distinguish between the two types of comment.
-      var type = token.value.startsWith('/*')
-          ? TokenType.MULTI_LINE_COMMENT
-          : TokenType.SINGLE_LINE_COMMENT;
-      var translatedToken =
-          new analyzer.CommentToken(type, token.value, token.charOffset);
-      if (currentCommentHead == null) {
-        currentCommentHead = currentCommentTail = translatedToken;
-      } else {
-        currentCommentTail.setNext(translatedToken);
-        currentCommentTail = translatedToken;
+  /// Translates the given error [token] into an analyzer error and reports it
+  /// using [reportError].
+  void _translateErrorToken(ErrorToken token) {
+    int charOffset = token.charOffset;
+    // TODO(paulberry,ahe): why is endOffset sometimes null?
+    int endOffset = token.endOffset ?? charOffset;
+    void _makeError(
+        analyzer.ScannerErrorCode errorCode, List<Object> arguments) {
+      if (_isAtEnd(token, charOffset)) {
+        // Analyzer never generates an error message past the end of the input,
+        // since such an error would not be visible in an editor.
+        // TODO(paulberry,ahe): would it make sense to replicate this behavior
+        // in fasta, or move it elsewhere in analyzer?
+        charOffset--;
       }
-    } else {
-      var translatedToken = toAnalyzerToken(token, currentCommentHead);
-      matchGroups(token, translatedToken);
-      translatedToken.setNext(translatedToken);
-      currentCommentHead = currentCommentTail = null;
-      analyzerTokenTail.setNext(translatedToken);
-      translatedToken.previous = analyzerTokenTail;
-      analyzerTokenTail = translatedToken;
+      reportError(errorCode, charOffset, arguments);
     }
-    if (token.isEof) {
-      return analyzerTokenHead.next;
+
+    var errorCode = token.errorCode;
+    switch (errorCode) {
+      case ErrorKind.UnterminatedString:
+        // TODO(paulberry,ahe): Fasta reports the error location as the entire
+        // string; analyzer expects the end of the string.
+        charOffset = endOffset;
+        return _makeError(
+            analyzer.ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null);
+      case ErrorKind.UnmatchedToken:
+        return null;
+      case ErrorKind.UnterminatedComment:
+        // TODO(paulberry,ahe): Fasta reports the error location as the entire
+        // comment; analyzer expects the end of the comment.
+        charOffset = endOffset;
+        return _makeError(
+            analyzer.ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, null);
+      case ErrorKind.MissingExponent:
+        // TODO(paulberry,ahe): Fasta reports the error location as the entire
+        // number; analyzer expects the end of the number.
+        charOffset = endOffset;
+        return _makeError(analyzer.ScannerErrorCode.MISSING_DIGIT, null);
+      case ErrorKind.ExpectedHexDigit:
+        // TODO(paulberry,ahe): Fasta reports the error location as the entire
+        // number; analyzer expects the end of the number.
+        charOffset = endOffset;
+        return _makeError(analyzer.ScannerErrorCode.MISSING_HEX_DIGIT, null);
+      case ErrorKind.NonAsciiIdentifier:
+      case ErrorKind.NonAsciiWhitespace:
+        return _makeError(
+            analyzer.ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]);
+      case ErrorKind.UnexpectedDollarInString:
+        return null;
+      default:
+        throw new UnimplementedError('$errorCode');
     }
-    token = token.next;
   }
 }
 
@@ -130,14 +243,20 @@
 Token fromAnalyzerTokenStream(analyzer.Token analyzerToken) {
   Token tokenHead = new SymbolToken(EOF_INFO, -1);
   Token tokenTail = tokenHead;
+
+  // Both fasta and analyzer have links from a "BeginToken" to its matching
+  // "EndToken" in a group (like parentheses and braces).  However, only fasta
+  // makes these links for angle brackets.  We use these stacks to map the
+  // links from the analyzer token stream into equivalent links in the fasta
+  // token stream, and to create the links that fasta expects for angle
+  // brackets.
+
   // Note: beginTokenStack and endTokenStack are seeded with a sentinel value
   // so that we don't have to check if they're empty.
   var beginTokenStack = <BeginGroupToken>[null];
   var endTokenStack = <analyzer.Token>[null];
   var angleBracketStack = <BeginGroupToken>[];
   void matchGroups(analyzer.Token analyzerToken, Token translatedToken) {
-    // If this token closes a group, set the corresponding opener token to point
-    // to it.
     if (identical(endTokenStack.last, analyzerToken)) {
       angleBracketStack.clear();
       beginTokenStack.last.endGroup = translatedToken;
@@ -156,8 +275,6 @@
         angleBracketStack.removeLast().endGroup = translatedToken;
       }
     }
-    // If this token opens a group, and there is a matching closer, put it on
-    // the stack.
     // TODO(paulberry): generate synthetic closer tokens and "UnmatchedToken"
     // tokens as appropriate.
     if (translatedToken is BeginGroupToken &&
@@ -378,63 +495,6 @@
   }
 }
 
-/// Translates the given error [token] into an analyzer error and reports it
-/// using [reportError].
-void _translateErrorToken(
-    ErrorToken token,
-    void reportError(analyzer.ScannerErrorCode errorCode, int offset,
-        List<Object> arguments)) {
-  int charOffset = token.charOffset;
-  // TODO(paulberry,ahe): why is endOffset sometimes null?
-  int endOffset = token.endOffset ?? charOffset;
-  void _makeError(analyzer.ScannerErrorCode errorCode, List<Object> arguments) {
-    if (_isAtEnd(token, charOffset)) {
-      // Analyzer never generates an error message past the end of the input,
-      // since such an error would not be visible in an editor.
-      // TODO(paulberry,ahe): would it make sense to replicate this behavior
-      // in fasta, or move it elsewhere in analyzer?
-      charOffset--;
-    }
-    reportError(errorCode, charOffset, arguments);
-  }
-
-  var errorCode = token.errorCode;
-  switch (errorCode) {
-    case ErrorKind.UnterminatedString:
-      // TODO(paulberry,ahe): Fasta reports the error location as the entire
-      // string; analyzer expects the end of the string.
-      charOffset = endOffset;
-      return _makeError(
-          analyzer.ScannerErrorCode.UNTERMINATED_STRING_LITERAL, null);
-    case ErrorKind.UnmatchedToken:
-      return null;
-    case ErrorKind.UnterminatedComment:
-      // TODO(paulberry,ahe): Fasta reports the error location as the entire
-      // comment; analyzer expects the end of the comment.
-      charOffset = endOffset;
-      return _makeError(
-          analyzer.ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, null);
-    case ErrorKind.MissingExponent:
-      // TODO(paulberry,ahe): Fasta reports the error location as the entire
-      // number; analyzer expects the end of the number.
-      charOffset = endOffset;
-      return _makeError(analyzer.ScannerErrorCode.MISSING_DIGIT, null);
-    case ErrorKind.ExpectedHexDigit:
-      // TODO(paulberry,ahe): Fasta reports the error location as the entire
-      // number; analyzer expects the end of the number.
-      charOffset = endOffset;
-      return _makeError(analyzer.ScannerErrorCode.MISSING_HEX_DIGIT, null);
-    case ErrorKind.NonAsciiIdentifier:
-    case ErrorKind.NonAsciiWhitespace:
-      return _makeError(
-          analyzer.ScannerErrorCode.ILLEGAL_CHARACTER, [token.character]);
-    case ErrorKind.UnexpectedDollarInString:
-      return null;
-    default:
-      throw new UnimplementedError('$errorCode');
-  }
-}
-
 analyzer.Token toAnalyzerToken(Token token,
     [analyzer.CommentToken commentToken]) {
   if (token == null) return null;
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index 926a708..4ced502 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -33,6 +33,12 @@
       this.members, LibraryBuilder parent, int charOffset)
       : super(metadata, modifiers, name, parent, charOffset);
 
+  /// Returns true if this class is the result of applying a mixin to its
+  /// superclass.
+  bool get isMixinApplication => mixedInType != null;
+
+  T get mixedInType;
+
   List<ConstructorReferenceBuilder> get constructorReferences => null;
 
   Map<String, Builder> get constructors;
diff --git a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
index e7b319693..5e0a052 100644
--- a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
@@ -9,7 +9,8 @@
 
 import 'builder.dart' show
     TypeBuilder,
-    TypeDeclarationBuilder;
+    TypeDeclarationBuilder,
+    TypeVariableBuilder;
 
 import 'scope.dart' show
     Scope;
@@ -23,6 +24,16 @@
       Uri fileUri)
       : super(charOffset, fileUri);
 
+  void set typeVariables(List<TypeVariableBuilder> variables);
+
+  /// If this mixin application uses type variables, it needs a unique name
+  /// based on its subclass. If this name is provided, the name will be
+  /// `name^mixin`, otherwise it'll be `superclass&mixin`.
+  //
+  // TODO(ahe): This is to reduce diff against dartk. Consider if this is
+  // necessary.
+  void set subclassName(String value);
+
   String get name => null;
 
   void resolveIn(Scope scope) {
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
index 4c97dd2..2c4df33 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart
@@ -11,9 +11,13 @@
     Procedure,
     ProcedureKind;
 
+import '../errors.dart' show
+    internalError;
+
 import '../kernel/kernel_builder.dart' show
     Builder,
-    KernelClassBuilder;
+    KernelClassBuilder,
+    KernelTypeBuilder;
 
 import '../modifier.dart' show
     abstractMask;
@@ -50,6 +54,12 @@
     }
   }
 
+  /// Returns true if this class is the result of applying a mixin to its
+  /// superclass.
+  bool get isMixinApplication => cls.isMixinApplication;
+
+  KernelTypeBuilder get mixedInType => internalError("Not implemented.");
+
   Builder findConstructorOrFactory(String name) => constructors[name];
 }
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
index af46a61..3263645 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
@@ -140,6 +140,8 @@
     return enumBuilder;
   }
 
+  KernelTypeBuilder get mixedInType => null;
+
   InterfaceType buildType(List<KernelTypeBuilder> arguments) {
     return cls.rawType;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 2f810ea..82b942e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -92,7 +92,7 @@
   KernelTypeBuilder addMixinApplication(KernelTypeBuilder supertype,
       List<KernelTypeBuilder> mixins, int charOffset) {
     KernelTypeBuilder type = new KernelMixinApplicationBuilder(
-        supertype, mixins, charOffset, fileUri);
+        supertype, mixins, this, charOffset, fileUri);
     return addType(type);
   }
 
@@ -225,23 +225,6 @@
     if (builder is SourceClassBuilder) {
       Class cls = builder.build(this);
       library.addClass(cls);
-      Class superclass = cls.superclass;
-      if (superclass != null && superclass.isMixinApplication) {
-        List<Class> mixinApplications = <Class>[];
-        mixinApplicationClasses.add(cls);
-        while (superclass != null && superclass.isMixinApplication) {
-          if (superclass.parent == null) {
-            mixinApplications.add(superclass);
-          }
-          superclass = superclass.superclass;
-        }
-        for (Class cls in mixinApplications.reversed) {
-          // TODO(ahe): Should be able to move this into the above loop as long
-          // as we don't care about matching dartk perfectly.
-          library.addClass(cls);
-          mixinApplicationClasses.add(cls);
-        }
-      }
     } else if (builder is KernelFieldBuilder) {
       library.addMember(builder.build(library)..isStatic = true);
     } else if (builder is KernelProcedureBuilder) {
@@ -364,7 +347,7 @@
   }
 
   @override
-  void includePart(KernelLibraryBuilder part) {
+  void includePart(covariant KernelLibraryBuilder part) {
     super.includePart(part);
     nativeMethods.addAll(part.nativeMethods);
     boundlessTypeVariables.addAll(part.boundlessTypeVariables);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
index 34a3f8d..840febc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
@@ -5,17 +5,30 @@
 library fasta.kernel_mixin_application_builder;
 
 import 'package:kernel/ast.dart' show
-    Class,
     InterfaceType,
-    Supertype;
+    Supertype,
+    setParents;
+
+import '../modifier.dart' show
+    abstractMask;
 
 import 'kernel_builder.dart' show
+    Builder,
+    ConstructorReferenceBuilder,
+    KernelLibraryBuilder,
+    KernelNamedTypeBuilder,
     KernelTypeBuilder,
-    MixinApplicationBuilder;
+    KernelTypeVariableBuilder,
+    MixinApplicationBuilder,
+    TypeBuilder,
+    TypeVariableBuilder;
 
 import '../util/relativize.dart' show
     relativizeUri;
 
+import '../source/source_class_builder.dart' show
+    SourceClassBuilder;
+
 class KernelMixinApplicationBuilder
     extends MixinApplicationBuilder<KernelTypeBuilder>
     implements KernelTypeBuilder {
@@ -23,10 +36,16 @@
 
   final String relativeFileUri;
 
+  final KernelLibraryBuilder library;
+
   Supertype builtType;
 
+  List<TypeVariableBuilder> typeVariables;
+
+  String subclassName;
+
   KernelMixinApplicationBuilder(KernelTypeBuilder supertype,
-      List<KernelTypeBuilder> mixins, int charOffset, Uri fileUri)
+      List<KernelTypeBuilder> mixins, this.library, int charOffset, Uri fileUri)
       : charOffset = charOffset,
         relativeFileUri = relativizeUri(fileUri),
         super(supertype, mixins, charOffset, fileUri);
@@ -35,28 +54,48 @@
 
   Supertype buildSupertype() {
     if (builtType != null) return builtType;
-    Supertype supertype =
-        this.supertype.buildSupertype()?.classNode?.asRawSupertype;
-    if (supertype == null) {
-      return null;
-    }
+    KernelTypeBuilder s = this.supertype;
     for (KernelTypeBuilder builder in mixins) {
-      Supertype mixin = builder.buildSupertype()?.classNode?.asRawSupertype;
-      if (mixin == null) {
-        return null;
-      }
-      Class application = new Class(
-          name: "${supertype.classNode.name}&${mixin.classNode.name}",
-          isAbstract: true,
-          supertype: supertype,
-          mixedInType: mixin,
-          typeParameters: null, // TODO(ahe): Compute these.
-          fileUri: relativeFileUri);
-      application.fileOffset = charOffset;
-      // TODO(ahe): Use asThisSupertype instead and translate type variables.
-      supertype = application.asRawSupertype;
+      s = applyMixin(s, builder);
     }
-    builtType = supertype;
+    builtType = s.buildSupertype();
     return builtType;
   }
+
+  TypeBuilder applyMixin(TypeBuilder supertype, TypeBuilder mixin) {
+    KernelLibraryBuilder library = this.library.partOfLibrary ?? this.library;
+    List<TypeVariableBuilder> newTypeVariables;
+    List<KernelTypeBuilder> typeArguments;
+    if (typeVariables != null) {
+      newTypeVariables = library.copyTypeVariables(typeVariables);
+      Map<TypeVariableBuilder, TypeBuilder> substitution =
+          <TypeVariableBuilder, TypeBuilder>{};
+      typeArguments = <KernelTypeBuilder>[];
+      for (int i = 0; i < typeVariables.length; i++) {
+        substitution[typeVariables[i]] = newTypeVariables[i].asTypeBuilder();
+        typeArguments.add(typeVariables[i].asTypeBuilder());
+      }
+      supertype = supertype.subst(substitution);
+      mixin = mixin.subst(substitution);
+    }
+    // To reduce diff against dartk, we create a different name for mixin
+    // applications that have free type variables. We do this by setting
+    // [subclassName] when setting typeVariables.
+    String name = subclassName != null
+        ? "${subclassName}^${mixin.name}"
+        : "${supertype.name}&${mixin.name}";
+    SourceClassBuilder cls = new SourceClassBuilder(null, abstractMask, name,
+        newTypeVariables, supertype, null, <String, Builder>{}, library,
+        <ConstructorReferenceBuilder>[], charOffset, null, mixin);
+    library.addImplementationBuilder(name, cls, charOffset);
+    if (newTypeVariables != null) {
+      for (KernelTypeVariableBuilder t in newTypeVariables) {
+        cls.cls.typeParameters.add(t.parameter);
+      }
+      setParents(cls.cls.typeParameters, cls.cls);
+    }
+    return new KernelNamedTypeBuilder(name, typeArguments, charOffset,
+        library.fileUri)
+        ..builder = cls;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_named_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_named_mixin_application_builder.dart
index 1ad94b2..38766f1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_named_mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_named_mixin_application_builder.dart
@@ -29,4 +29,8 @@
           interfaces, <String, Builder>{}, parent, null, charOffset);
 
   KernelTypeBuilder get mixinApplication => supertype;
+
+  // TODO(ahe): This is a bit odd, as it means this answers false to
+  // [isMixinApplication], but its superclass is the mixin application.
+  KernelTypeBuilder get mixedInType => null;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 8704e05..3a43d7c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -229,6 +229,8 @@
       finishAllConstructors();
       loader.finishNativeMethods();
       transformMixinApplications();
+      // TODO(ahe): Don't call this from two different places.
+      setup_builtin_library.transformProgram(program);
       errors.addAll(loader.collectCompileTimeErrors().map((e) => e.format()));
       if (errors.isNotEmpty) {
         return handleInputError(uri, null, isFullProgram: true);
@@ -344,6 +346,9 @@
       if (cls != objectClass) {
         cls.supertype ??= objectClass.asRawSupertype;
       }
+      if (builder.isMixinApplication) {
+        cls.mixedInType = builder.mixedInType.buildSupertype();
+      }
     }
     ticker.logMs("Installed Object as implicit superclass");
   }
@@ -366,7 +371,7 @@
 
   /// If [builder] doesn't have a constructors, install the defaults.
   void installDefaultConstructor(SourceClassBuilder builder) {
-    if (!builder.constructors.isEmpty) return;
+    if (builder.isMixinApplication || builder.constructors.isNotEmpty) return;
     /// Quotes below are from [Dart Programming Language Specification, 4th
     /// Edition](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf):
     if (builder is NamedMixinApplicationBuilder) {
diff --git a/pkg/front_end/lib/src/fasta/operator.dart b/pkg/front_end/lib/src/fasta/operator.dart
index e6f4b23..d32e35d 100644
--- a/pkg/front_end/lib/src/fasta/operator.dart
+++ b/pkg/front_end/lib/src/fasta/operator.dart
@@ -77,4 +77,5 @@
     case Operator.truncatingDivide: return "~/";
     case Operator.unaryMinus: return "unary-";
   }
+  return null;
 }
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index 976f095..897a754 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -4,15 +4,11 @@
 
 library fasta.parser.listener;
 
-import '../scanner/token.dart' show
-    BeginGroupToken,
-    Token;
+import '../scanner/token.dart' show BeginGroupToken, Token;
 
-import '../util/link.dart' show
-    Link;
+import '../util/link.dart' show Link;
 
-import 'error_kind.dart' show
-    ErrorKind;
+import 'error_kind.dart' show ErrorKind;
 
 /// A parser event listener that does nothing except throw exceptions
 /// on parser errors.
@@ -63,12 +59,22 @@
 
   void beginClassBody(Token token) {}
 
+  /// Handle the end of the body of a class declaration.  The only substructures
+  /// are the class members.
   void endClassBody(int memberCount, Token beginToken, Token endToken) {
     logEvent("ClassBody");
   }
 
   void beginClassDeclaration(Token beginToken, Token name) {}
 
+  /// Handle the end of a class declaration.  Substructures:
+  /// - metadata
+  /// - modifiers
+  /// - class name
+  /// - type variables
+  /// - supertype (may be a mixin application)
+  /// - implemented types
+  /// - class body
   void endClassDeclaration(int interfacesCount, Token beginToken,
       Token extendsKeyword, Token implementsKeyword, Token endToken) {
     logEvent("ClassDeclaration");
@@ -100,15 +106,13 @@
     logEvent("DoWhileStatement");
   }
 
-  void beginDoWhileStatementBody(Token token) {
-  }
+  void beginDoWhileStatementBody(Token token) {}
 
   void endDoWhileStatementBody(Token token) {
     logEvent("DoWhileStatementBody");
   }
 
-  void beginWhileStatementBody(Token token) {
-  }
+  void beginWhileStatementBody(Token token) {}
 
   void endWhileStatementBody(Token token) {
     logEvent("WhileStatementBody");
@@ -122,6 +126,11 @@
 
   void beginExport(Token token) {}
 
+  /// Handle the end of an export directive.  Substructures:
+  /// - metadata
+  /// - uri
+  /// - conditional uris
+  /// - combinators
   void endExport(Token exportKeyword, Token semicolon) {
     logEvent("Export");
   }
@@ -168,8 +177,7 @@
     logEvent("ForStatement");
   }
 
-  void beginForStatementBody(Token token) {
-  }
+  void beginForStatementBody(Token token) {}
 
   void endForStatementBody(Token token) {
     logEvent("ForStatementBody");
@@ -180,15 +188,13 @@
     logEvent("ForIn");
   }
 
-  void beginForInExpression(Token token) {
-  }
+  void beginForInExpression(Token token) {}
 
   void endForInExpression(Token token) {
     logEvent("ForInExpression");
   }
 
-  void beginForInBody(Token token) {
-  }
+  void beginForInBody(Token token) {}
 
   void endForInBody(Token token) {
     logEvent("ForInBody");
@@ -232,12 +238,28 @@
 
   void beginMixinApplication(Token token) {}
 
+  /// Handle the end of a mixin application construct (e.g. "A with B, C").
+  /// Substructures:
+  /// - supertype
+  /// - mixin types (TypeList)
   void endMixinApplication() {
     logEvent("MixinApplication");
   }
 
   void beginNamedMixinApplication(Token beginToken, Token name) {}
 
+  /// Handle the end of a named mixin declaration.  Substructures:
+  /// - metadata
+  /// - modifiers
+  /// - class name
+  /// - type variables
+  /// - mixin application
+  /// - implemented types (TypeList)
+  ///
+  /// TODO(paulberry,ahe): it seems incosistent that for a named mixin
+  /// application, the implemented types are a TypeList, whereas for a class
+  /// declaration, each implemented type is listed separately on the stack, and
+  /// the number of implemented types is passed as a parameter.
   void endNamedMixinApplication(
       Token begin, Token implementsKeyword, Token endToken) {
     logEvent("NamedMixinApplication");
@@ -245,6 +267,8 @@
 
   void beginHide(Token hideKeyword) {}
 
+  /// Handle the end of a "hide" combinator.  Substructures:
+  /// - hidden names (IdentifierList)
   void endHide(Token hideKeyword) {
     logEvent("Hide");
   }
@@ -267,15 +291,13 @@
     logEvent("IfStatement");
   }
 
-  void beginThenStatement(Token token) {
-  }
+  void beginThenStatement(Token token) {}
 
   void endThenStatement(Token token) {
     logEvent("ThenStatement");
   }
 
-  void beginElseStatement(Token token) {
-  }
+  void beginElseStatement(Token token) {}
 
   void endElseStatement(Token token) {
     logEvent("ElseStatement");
@@ -283,6 +305,12 @@
 
   void beginImport(Token importKeyword) {}
 
+  /// Handle the end of an import directive.  Substructures:
+  /// - metadata
+  /// - uri
+  /// - conditional uris
+  /// - prefix identifier (only if asKeyword != null)
+  /// - combinators
   void endImport(Token importKeyword, Token DeferredKeyword, Token asKeyword,
       Token semicolon) {
     logEvent("Import");
@@ -312,8 +340,7 @@
     logEvent("InitializedIdentifier");
   }
 
-  void beginFieldInitializer(Token token) {
-  }
+  void beginFieldInitializer(Token token) {}
 
   void endFieldInitializer(Token assignment) {
     logEvent("FieldInitializer");
@@ -378,6 +405,8 @@
 
   void beginLibraryName(Token token) {}
 
+  /// Handle the end of a library directive.  Substructures:
+  /// - Library name (a qualified identifier)
   void endLibraryName(Token libraryKeyword, Token semicolon) {
     logEvent("LibraryName");
   }
@@ -438,12 +467,17 @@
 
   void beginPart(Token token) {}
 
+  /// Handle the end of a part directive.  Substructures:
+  /// - metadata
+  /// - uri
   void endPart(Token partKeyword, Token semicolon) {
     logEvent("Part");
   }
 
   void beginPartOf(Token token) {}
 
+  /// Handle the end of a "part of" directive.  Substructures:
+  /// - Library name (a qualified identifier)
   void endPartOf(Token partKeyword, Token semicolon) {
     logEvent("PartOf");
   }
@@ -469,6 +503,8 @@
 
   void beginShow(Token showKeyword) {}
 
+  /// Handle the end of a "show" combinator.  Substructures:
+  /// - shown names (IdentifierList)
   void endShow(Token showKeyword) {
     logEvent("Show");
   }
@@ -521,6 +557,15 @@
 
   void beginTopLevelMethod(Token token, Token name) {}
 
+  /// Handle the end of a top level method.  Substructures:
+  /// - metadata
+  /// - modifiers
+  /// - return type
+  /// - identifier
+  /// - type variables
+  /// - formal parameters
+  /// - async marker
+  /// - body
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
     logEvent("TopLevelMethod");
   }
@@ -531,8 +576,7 @@
     logEvent("CaseMatch");
   }
 
-  void beginCatchClause(Token token) {
-  }
+  void beginCatchClause(Token token) {}
 
   void endCatchClause(Token token) {
     logEvent("CatchClause");
@@ -546,8 +590,7 @@
     logEvent("FinallyBlock");
   }
 
-  void endTryStatement(
-      int catchCount, Token tryKeyword, Token finallyKeyword) {
+  void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
     logEvent("TryStatement");
   }
 
@@ -615,8 +658,7 @@
     logEvent("ConstExpression");
   }
 
-  void beginFunctionTypedFormalParameter(Token token) {
-  }
+  void beginFunctionTypedFormalParameter(Token token) {}
 
   void endFunctionTypedFormalParameter(Token token) {
     logEvent("FunctionTypedFormalParameter");
@@ -730,6 +772,11 @@
     logEvent("ParenthesizedExpression");
   }
 
+  /// Handle a construct of the form "identifier.identifier" occurring in a part
+  /// of the grammar where expressions in general are not allowed.
+  /// Substructures:
+  /// - Qualified identifier (before the period)
+  /// - Identifier (after the period)
   void handleQualified(Token period) {
     logEvent("Qualified");
   }
@@ -742,8 +789,7 @@
     logEvent("SuperExpression");
   }
 
-  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
-  }
+  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {}
 
   void handleSwitchCase(
       int labelCount,
@@ -802,8 +848,8 @@
 
   /// The parser noticed a syntax error, but was able to recover from it.
   void handleRecoverableError(Token token, ErrorKind kind, Map arguments) {
-    recoverableErrors.add(
-        new ParserError.fromTokens(token, token, kind, arguments));
+    recoverableErrors
+        .add(new ParserError.fromTokens(token, token, kind, arguments));
   }
 }
 
@@ -821,8 +867,7 @@
   ParserError(this.beginOffset, this.endOffset, this.kind, this.arguments);
 
   ParserError.fromTokens(Token begin, Token end, ErrorKind kind, Map arguments)
-      : this(begin.charOffset, end.charOffset + end.charCount, kind,
-          arguments);
+      : this(begin.charOffset, end.charOffset + end.charCount, kind, arguments);
 
   String toString() => "@${beginOffset}: $kind $arguments";
 }
diff --git a/pkg/front_end/lib/src/fasta/scanner/precedence.dart b/pkg/front_end/lib/src/fasta/scanner/precedence.dart
index d1a222b..bfc5c88 100644
--- a/pkg/front_end/lib/src/fasta/scanner/precedence.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/precedence.dart
@@ -14,6 +14,82 @@
   const PrecedenceInfo(this.value, this.precedence, this.kind);
 
   toString() => 'PrecedenceInfo($value, $precedence, $kind)';
+
+  static const List<PrecedenceInfo> all = const <PrecedenceInfo>[
+      BACKPING_INFO,
+      BACKSLASH_INFO,
+      PERIOD_PERIOD_PERIOD_INFO,
+      PERIOD_PERIOD_INFO,
+      BANG_INFO,
+      COLON_INFO,
+      INDEX_INFO,
+      MINUS_MINUS_INFO,
+      PLUS_PLUS_INFO,
+      TILDE_INFO,
+      FUNCTION_INFO,
+      HASH_INFO,
+      INDEX_EQ_INFO,
+      SEMICOLON_INFO,
+      COMMA_INFO,
+      AT_INFO,
+      AMPERSAND_EQ_INFO,
+      BAR_EQ_INFO,
+      CARET_EQ_INFO,
+      EQ_INFO,
+      GT_GT_EQ_INFO,
+      LT_LT_EQ_INFO,
+      MINUS_EQ_INFO,
+      PERCENT_EQ_INFO,
+      PLUS_EQ_INFO,
+      SLASH_EQ_INFO,
+      STAR_EQ_INFO,
+      TILDE_SLASH_EQ_INFO,
+      QUESTION_QUESTION_EQ_INFO,
+      QUESTION_INFO,
+      QUESTION_QUESTION_INFO,
+      BAR_BAR_INFO,
+      AMPERSAND_AMPERSAND_INFO,
+      BAR_INFO,
+      CARET_INFO,
+      AMPERSAND_INFO,
+      BANG_EQ_EQ_INFO,
+      BANG_EQ_INFO,
+      EQ_EQ_EQ_INFO,
+      EQ_EQ_INFO,
+      GT_EQ_INFO,
+      GT_INFO,
+      IS_INFO,
+      AS_INFO,
+      LT_EQ_INFO,
+      LT_INFO,
+      GT_GT_INFO,
+      LT_LT_INFO,
+      MINUS_INFO,
+      PLUS_INFO,
+      PERCENT_INFO,
+      SLASH_INFO,
+      STAR_INFO,
+      TILDE_SLASH_INFO,
+      PERIOD_INFO,
+      QUESTION_PERIOD_INFO,
+      KEYWORD_INFO,
+      EOF_INFO,
+      IDENTIFIER_INFO,
+      BAD_INPUT_INFO,
+      OPEN_PAREN_INFO,
+      CLOSE_PAREN_INFO,
+      OPEN_CURLY_BRACKET_INFO,
+      CLOSE_CURLY_BRACKET_INFO,
+      INT_INFO,
+      STRING_INFO,
+      OPEN_SQUARE_BRACKET_INFO,
+      CLOSE_SQUARE_BRACKET_INFO,
+      DOUBLE_INFO,
+      STRING_INTERPOLATION_INFO,
+      STRING_INTERPOLATION_IDENTIFIER_INFO,
+      HEXADECIMAL_INFO,
+      COMMENT_INFO,
+    ];
 }
 
 // TODO(ahe): The following are not tokens in Dart.
diff --git a/pkg/front_end/lib/src/fasta/scanner/token.dart b/pkg/front_end/lib/src/fasta/scanner/token.dart
index 8a72228..7bded75 100644
--- a/pkg/front_end/lib/src/fasta/scanner/token.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/token.dart
@@ -350,27 +350,27 @@
       isUnaryOperator(value);
 }
 
-bool isUnaryOperator(String value) => value == '~';
+bool isUnaryOperator(String value) => identical(value, "~");
 
 bool isBinaryOperator(String value) {
-  return value == '==' ||
-      value == '[]' ||
-      value == '*' ||
-      value == '/' ||
-      value == '%' ||
-      value == '~/' ||
-      value == '+' ||
-      value == '<<' ||
-      value == '>>' ||
-      value == '>=' ||
-      value == '>' ||
-      value == '<=' ||
-      value == '<' ||
-      value == '&' ||
-      value == '^' ||
-      value == '|';
+  return identical(value, "==") ||
+      identical(value, "[]") ||
+      identical(value, "*") ||
+      identical(value, "/") ||
+      identical(value, "%") ||
+      identical(value, "~/") ||
+      identical(value, "+") ||
+      identical(value, "<<") ||
+      identical(value, ">>") ||
+      identical(value, ">=") ||
+      identical(value, ">") ||
+      identical(value, "<=") ||
+      identical(value, "<") ||
+      identical(value, "&") ||
+      identical(value, "^") ||
+      identical(value, "|");
 }
 
-bool isTernaryOperator(String value) => value == '[]=';
+bool isTernaryOperator(String value) => identical(value, "[]=");
 
-bool isMinusOperator(String value) => value == '-';
+bool isMinusOperator(String value) => identical(value, "-");
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index e010ea9..81312da 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -210,6 +210,10 @@
     TypeBuilder supertype = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     String name = pop();
+    if (typeVariables != null && supertype is MixinApplicationBuilder) {
+      supertype.typeVariables = typeVariables;
+      supertype.subclassName = name;
+    }
     int modifiers = Modifier.validate(pop());
     List<MetadataBuilder> metadata = pop();
     library.addClass(metadata, modifiers, name, typeVariables, supertype,
@@ -321,6 +325,10 @@
     TypeBuilder mixinApplication = pop();
     List<TypeVariableBuilder> typeVariables = pop();
     String name = pop();
+    if (typeVariables != null && mixinApplication is MixinApplicationBuilder) {
+      mixinApplication.typeVariables = typeVariables;
+      mixinApplication.subclassName = name;
+    }
     int modifiers = Modifier.validate(pop());
     List<MetadataBuilder> metadata = pop();
     library.addNamedMixinApplication(
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 66f49af..5ab36ed 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -53,11 +53,13 @@
 
   final List<ConstructorReferenceBuilder> constructorReferences;
 
+  final KernelTypeBuilder mixedInType;
+
   SourceClassBuilder(List<MetadataBuilder> metadata, int modifiers,
       String name, List<TypeVariableBuilder> typeVariables,
-      KernelTypeBuilder supertype, List<KernelTypeBuilder>interfaces,
+      KernelTypeBuilder supertype, List<KernelTypeBuilder> interfaces,
       Map<String, Builder> members, LibraryBuilder parent,
-      this.constructorReferences, int charOffset, [Class cls])
+      this.constructorReferences, int charOffset, [Class cls, this.mixedInType])
       : cls = initializeClass(cls, name, parent, charOffset),
         membersInScope = computeMembersInScope(members),
         constructors = computeConstructors(members),
@@ -95,6 +97,7 @@
       } while (builder != null);
     });
     cls.supertype = supertype?.buildSupertype();
+    cls.mixedInType = mixedInType?.buildSupertype();
     // TODO(ahe): If `cls.supertype` is null, and this isn't Object, report a
     // compile-time error.
     cls.isAbstract = isAbstract;
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 4da1f85..42464db 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -25,6 +25,7 @@
 
 import '../builder/builder.dart' show
     Builder,
+    ClassBuilder,
     ConstructorReferenceBuilder,
     FormalParameterBuilder,
     LibraryBuilder,
@@ -57,6 +58,8 @@
 
   final Uri fileUri;
 
+  final List<List> implementationBuilders = <List<List>>[];
+
   String name;
 
   String partOf;
@@ -198,7 +201,7 @@
   TypeVariableBuilder addTypeVariable(String name, T bound, int charOffset);
 
   Builder addBuilder(String name, Builder builder, int charOffset) {
-    if (name.indexOf(".") != -1) {
+    if (name.indexOf(".") != -1 && name.indexOf("&") == -1) {
       addCompileTimeError(charOffset, "Only constructors and factories can have"
           " names containing a period ('.'): $name");
     }
@@ -231,26 +234,55 @@
         }
       });
       return existing;
-    } else if (existing != null && (existing.next != null ||
-            ((!existing.isGetter || !builder.isSetter) &&
-                (!existing.isSetter || !builder.isGetter)))) {
+    } else if (isDuplicatedDefinition(existing, builder)) {
       addCompileTimeError(charOffset, "Duplicated definition of '$name'.");
     }
     return members[name] = builder;
   }
 
+  bool isDuplicatedDefinition(Builder existing, Builder other) {
+    if (existing == null) return false;
+    Builder next = existing.next;
+    if (next == null) {
+      if (existing.isGetter && other.isSetter) return false;
+      if (existing.isSetter && other.isGetter) return false;
+    } else {
+      if (next is ClassBuilder && !next.isMixinApplication) return true;
+    }
+    if (existing is ClassBuilder && other is ClassBuilder) {
+      // We allow multiple mixin applications with the same name. An
+      // alternative is to share these mixin applications. This situation can
+      // happen if you have `class A extends Object with Mixin {}` and `class B
+      // extends Object with Mixin {}` in the same library.
+      return !existing.isMixinApplication || !other.isMixinApplication;
+    }
+    return true;
+  }
+
   void buildBuilder(Builder builder);
 
   R build() {
+    assert(implementationBuilders.isEmpty);
     members.forEach((String name, Builder builder) {
       do {
         buildBuilder(builder);
         builder = builder.next;
       } while (builder != null);
     });
+    for (List list in implementationBuilders) {
+      String name = list[0];
+      Builder builder = list[1];
+      int charOffset = list[2];
+      addBuilder(name, builder, charOffset);
+      buildBuilder(builder);
+    }
     return null;
   }
 
+  void addImplementationBuilder(String name, Builder builder, int charOffset) {
+    implementationBuilders.add([name, builder, charOffset]);
+  }
+
   void validatePart() {
     if (parts.isNotEmpty) {
       internalError("Part with parts: $uri");
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 0601d26..08f2069 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -4,26 +4,17 @@
 
 library fasta.stack_listener;
 
-import 'dart:collection' show
-    Queue;
+import 'dart:collection' show Queue;
 
-import 'package:front_end/src/fasta/parser.dart' show
-    ErrorKind,
-    Listener;
+import 'package:front_end/src/fasta/parser.dart' show ErrorKind, Listener;
 
-import 'package:front_end/src/fasta/scanner.dart' show
-    BeginGroupToken,
-    Token;
+import 'package:front_end/src/fasta/scanner.dart' show BeginGroupToken, Token;
 
-import 'package:kernel/ast.dart' show
-    AsyncMarker;
+import 'package:kernel/ast.dart' show AsyncMarker;
 
-import '../errors.dart' show
-    inputError,
-    internalError;
+import '../errors.dart' show inputError, internalError;
 
-import '../quote.dart' show
-    unescapeString;
+import '../quote.dart' show unescapeString;
 
 enum NullValue {
   Arguments,
@@ -31,6 +22,7 @@
   BreakTarget,
   CascadeReceiver,
   Combinators,
+  ConditionalUris,
   ContinueTarget,
   Expression,
   FieldInitializer,
@@ -136,8 +128,7 @@
     }
     if (recoverableErrors.isNotEmpty) {
       // TODO(ahe): Handle recoverable errors better.
-      inputError(uri, recoverableErrors.first.beginOffset,
-          recoverableErrors);
+      inputError(uri, recoverableErrors.first.beginOffset, recoverableErrors);
     }
   }
 
diff --git a/pkg/front_end/test/fasta/mixin.dart b/pkg/front_end/test/fasta/mixin.dart
index dbe5bf8..e88898ed 100644
--- a/pkg/front_end/test/fasta/mixin.dart
+++ b/pkg/front_end/test/fasta/mixin.dart
@@ -2,6 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+class B extends Object with M1, M2 {
+  B(value);
+}
+
 abstract class M1 {
   m() => print("M1");
 }
@@ -11,8 +15,20 @@
 }
 
 class C extends Object with M1, M2 {
+  C(value);
+}
+
+abstract class G1<T> {
+  m() => print(T);
+}
+
+class D<S> extends Object with G1<S> {
 }
 
 main() {
-  new C().m();
+  new B(null).m();
+  new C(null).m();
+  new D().m();
+  new D<int>().m();
+  new D<List<int>>().m();
 }
diff --git a/pkg/front_end/test/fasta/mixin.dart.direct.expect b/pkg/front_end/test/fasta/mixin.dart.direct.expect
index ab5f3d6..5c49faf 100644
--- a/pkg/front_end/test/fasta/mixin.dart.direct.expect
+++ b/pkg/front_end/test/fasta/mixin.dart.direct.expect
@@ -2,6 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
+class B extends self::Object&M1&M2 {
+  constructor •(dynamic value) → void
+    : super self::Object&M1&M2::•()
+    ;
+}
 abstract class M1 extends core::Object {
   constructor •() → void
     : super core::Object::•()
@@ -17,10 +22,22 @@
     return core::print("M2");
 }
 class C extends self::Object&M1&M2 {
-  constructor •() → void
+  constructor •(dynamic value) → void
     : super self::Object&M1&M2::•()
     ;
 }
+abstract class G1<T extends core::Object> extends core::Object {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::G1::T);
+}
+class D<S extends core::Object> extends self::D^G1<self::D::S> {
+  constructor •() → void
+    : super self::D^G1::•()
+    ;
+}
 abstract class Object&M1 extends core::Object implements self::M1 {
   constructor •() → void
     : super core::Object::•()
@@ -35,6 +52,31 @@
   method m() → dynamic
     return core::print("M2");
 }
+abstract class Object&M1 extends core::Object implements self::M1 {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class Object&M1&M2 extends self::Object&M1 implements self::M2 {
+  constructor •() → void
+    : super self::Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class D^G1<S extends core::Object> extends core::Object implements self::G1<self::D^G1::S> {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::D^G1::S);
+}
 static method main() → dynamic {
-  new self::C::•().m();
+  new self::B::•(null).m();
+  new self::C::•(null).m();
+  new self::D::•<dynamic>().m();
+  new self::D::•<core::int>().m();
+  new self::D::•<core::List<core::int>>().m();
 }
diff --git a/pkg/front_end/test/fasta/mixin.dart.outline.expect b/pkg/front_end/test/fasta/mixin.dart.outline.expect
index d0c955c..7c0c30a 100644
--- a/pkg/front_end/test/fasta/mixin.dart.outline.expect
+++ b/pkg/front_end/test/fasta/mixin.dart.outline.expect
@@ -2,6 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
+class B extends self::Object&M1&M2 {
+  constructor •(dynamic value) → void
+    ;
+}
 abstract class M1 extends core::Object {
   constructor •() → void
     ;
@@ -15,6 +19,16 @@
     ;
 }
 class C extends self::Object&M1&M2 {
+  constructor •(dynamic value) → void
+    ;
+}
+abstract class G1<T extends core::Object> extends core::Object {
+  constructor •() → void
+    ;
+  method m() → dynamic
+    ;
+}
+class D<S extends core::Object> extends self::D^G1<self::D::S> {
   constructor •() → void
     ;
 }
@@ -22,5 +36,11 @@
 }
 abstract class Object&M1&M2 = self::Object&M1 with self::M2 {
 }
+abstract class Object&M1 = core::Object with self::M1 {
+}
+abstract class Object&M1&M2 = self::Object&M1 with self::M2 {
+}
+abstract class D^G1<S extends core::Object> = core::Object with self::G1<self::D^G1::S> {
+}
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/test/fasta/testing.json b/pkg/front_end/test/fasta/testing.json
index af7e073..5c1d52c 100644
--- a/pkg/front_end/test/fasta/testing.json
+++ b/pkg/front_end/test/fasta/testing.json
@@ -131,6 +131,8 @@
 
   "analyze": {
 
+    "options": "../../.analysis_options",
+
     "uris": [
       "../../lib/src/fasta",
       "../../lib/src/fasta/analyzer",
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index 5002705..14a5d65 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_test.dart
@@ -41,10 +41,8 @@
     // Dart, remove this flag.
     var scanner = new fasta.StringScanner(source, includeComments: true);
     var token = scanner.tokenize();
-    return toAnalyzerTokenStream(token,
-        (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
-      listener.errors.add(new TestError(offset, errorCode, arguments));
-    });
+    return new ToAnalyzerTokenStreamConverter_WithListener(listener)
+        .convertTokens(token);
   }
 
   @override
@@ -375,10 +373,34 @@
   fasta.Token scan(String source) {
     var scanner = new fasta.StringScanner(source, includeComments: true);
     var fastaTokenStream = scanner.tokenize();
-    var analyzerTokenStream = toAnalyzerTokenStream(fastaTokenStream,
-        (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
-      fail('Unexpected error: $errorCode, $offset, $arguments');
-    });
+    var analyzerTokenStream = new ToAnalyzerTokenStreamConverter_NoErrors()
+        .convertTokens(fastaTokenStream);
     return fromAnalyzerTokenStream(analyzerTokenStream);
   }
 }
+
+/// Override of [ToAnalyzerTokenStreamConverter] that verifies that there are no
+/// errors.
+class ToAnalyzerTokenStreamConverter_NoErrors
+    extends ToAnalyzerTokenStreamConverter {
+  @override
+  void reportError(
+      ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+    fail('Unexpected error: $errorCode, $offset, $arguments');
+  }
+}
+
+/// Override of [ToAnalyzerTokenStreamConverter] that records errors in an
+/// [ErrorListener].
+class ToAnalyzerTokenStreamConverter_WithListener
+    extends ToAnalyzerTokenStreamConverter {
+  final ErrorListener _listener;
+
+  ToAnalyzerTokenStreamConverter_WithListener(this._listener);
+
+  @override
+  void reportError(
+      ScannerErrorCode errorCode, int offset, List<Object> arguments) {
+    _listener.errors.add(new TestError(offset, errorCode, arguments));
+  }
+}
diff --git a/pkg/front_end/test/scanner_roundtrip_test.dart b/pkg/front_end/test/scanner_roundtrip_test.dart
index a327451..398376b 100644
--- a/pkg/front_end/test/scanner_roundtrip_test.dart
+++ b/pkg/front_end/test/scanner_roundtrip_test.dart
@@ -3,11 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:front_end/src/fasta/analyzer/token_utils.dart';
-import 'package:front_end/src/scanner/errors.dart';
 import 'package:front_end/src/scanner/token.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'scanner_fasta_test.dart';
 import 'scanner_test.dart';
 
 main() {
@@ -32,13 +31,11 @@
         genericMethodComments: genericMethodComments,
         lazyAssignmentOperators: lazyAssignmentOperators);
     var fastaToken = fromAnalyzerTokenStream(analyzerToken);
-    return toAnalyzerTokenStream(fastaToken,
-        (ScannerErrorCode errorCode, int offset, List<Object> arguments) {
-      // Since [scanWithListener] reports errors to the listener, we don't
-      // expect any error tokens in the Fasta token stream; so this callback
-      // should never be called.
-      fail('Unexpected error reported: $errorCode, $offset, $arguments');
-    });
+    // Since [scanWithListener] reports errors to the listener, we don't
+    // expect any error tokens in the Fasta token stream, so we convert using
+    // ToAnalyzerTokenStreamConverter_NoErrors.
+    return new ToAnalyzerTokenStreamConverter_NoErrors()
+        .convertTokens(fastaToken);
   }
 
   @override
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index fd30f8d..d853ee8 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -783,7 +783,7 @@
 
   void test_mismatched_opener_in_interpolation() {
     // In an interpolation expression, analyzer considers a closing `}` to
-    // always matche the preceding unmatched `{`, even if there are intervening
+    // always match the preceding unmatched `{`, even if there are intervening
     // unmatched tokens, which means that `"${({(}}"` parses as though the open
     // parens are unmatched but everything else is matched.
     var stringStart = _scan(r'"${({(}}"');
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
new file mode 100644
index 0000000..ab80430
--- /dev/null
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -0,0 +1,298 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// An entrypoint used to run portions of fasta and measure its performance.
+library front_end.tool.fasta_perf;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:front_end/src/fasta/analyzer/ast_builder.dart';
+import 'package:front_end/src/fasta/ast_kind.dart' show AstKind;
+import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
+import 'package:front_end/src/fasta/kernel/kernel_target.dart'
+    show KernelTarget;
+import 'package:front_end/src/fasta/parser.dart';
+import 'package:front_end/src/fasta/scanner.dart';
+import 'package:front_end/src/fasta/scanner/io.dart' show readBytesFromFileSync;
+import 'package:front_end/src/fasta/scanner/precedence.dart';
+import 'package:front_end/src/fasta/source/scope_listener.dart' show Scope;
+import 'package:front_end/src/fasta/ticker.dart' show Ticker;
+import 'package:front_end/src/fasta/translate_uri.dart' show TranslateUri;
+import 'package:front_end/src/fasta/translate_uri.dart';
+
+/// Cumulative total number of chars scanned.
+int inputSize = 0;
+
+/// Cumulative time spent scanning.
+Stopwatch scanTimer = new Stopwatch();
+
+main(List<String> args) async {
+  // TODO(sigmund): provide sdk folder as well.
+  if (args.length < 2) {
+    print('usage: fasta_perf.dart <bench-id> <entry.dart>');
+    exit(1);
+  }
+  var bench = args[0];
+  var entryUri = Uri.base.resolve(args[1]);
+
+  await setup(entryUri);
+
+  Map<Uri, List<int>> files = await scanReachableFiles(entryUri);
+  var handlers = {
+    'scan': () async => scanFiles(files),
+    // TODO(sigmund): enable when we can run the ast-builder standalone.
+    // 'parse': () async => parseFiles(files),
+    'kernel_gen_e2e': () async {
+      await generateKernel(entryUri);
+    },
+    // TODO(sigmund): enable once we add a build step to create the
+    // platform.dill files.
+    // 'kernel_gen_e2e_sum': () async {
+    //   await generateKernel(entryUri, compileSdk: false);
+    // },
+  };
+
+  var handler = handlers[bench];
+  if (handler == null) {
+    // TODO(sigmund): implement the remaining benchmarks.
+    print('unsupported bench-id: $bench. Please specify one of the following: '
+        '${handlers.keys.join(", ")}');
+    exit(1);
+  }
+
+  // TODO(sigmund): replace the warmup with instrumented snapshots.
+  int iterations = bench.contains('kernel_gen') ? 2 : 10;
+  for (int i = 0; i < iterations; i++) {
+    var totalTimer = new Stopwatch()..start();
+    print('== iteration $i');
+    await handler();
+    totalTimer.stop();
+    report('total', totalTimer.elapsedMicroseconds);
+  }
+}
+
+/// Translates `dart:*` and `package:*` URIs to resolved URIs.
+TranslateUri uriResolver;
+
+/// Preliminary set up to be able to correctly resolve URIs on the given
+/// program.
+Future setup(Uri entryUri) async {
+  // TODO(sigmund): use `perf.dart::_findSdkPath` here when fasta can patch the
+  // sdk directly.
+  var sdkRoot =
+      Uri.base.resolve(Platform.resolvedExecutable).resolve('patched_sdk/');
+  uriResolver = await TranslateUri.parse(sdkRoot);
+}
+
+/// Scan [contents] and return the first token produced by the scanner.
+Token tokenize(List<int> contents) {
+  scanTimer.start();
+  var token = scan(contents).tokens;
+  scanTimer.stop();
+  return token;
+}
+
+/// Scans every file in [files] and reports the time spent doing so.
+void scanFiles(Map<Uri, List<int>> files) {
+  scanTimer = new Stopwatch();
+  for (var source in files.values) {
+    tokenize(source);
+  }
+  report('scan', scanTimer.elapsedMicroseconds);
+}
+
+/// Load and scans all files we need to process: files reachable from the
+/// entrypoint and all core libraries automatically included by the VM.
+Future<Map<Uri, List<int>>> scanReachableFiles(Uri entryUri) async {
+  var files = <Uri, List<int>>{};
+  var loadTimer = new Stopwatch()..start();
+  scanTimer = new Stopwatch();
+  var entrypoints = [
+    entryUri,
+    // These extra libraries are added to match the same set of libraries
+    // scanned by default by the VM and the other benchmarks.
+    Uri.parse('dart:async'),
+    Uri.parse('dart:collection'),
+    Uri.parse('dart:convert'),
+    Uri.parse('dart:core'),
+    Uri.parse('dart:developer'),
+    Uri.parse('dart:_internal'),
+    Uri.parse('dart:io'),
+    Uri.parse('dart:isolate'),
+    Uri.parse('dart:math'),
+    Uri.parse('dart:mirrors'),
+    Uri.parse('dart:typed_data'),
+  ];
+  for (var entry in entrypoints) {
+    await collectSources(entry, files);
+  }
+  loadTimer.stop();
+
+  inputSize = 0;
+  // adjust size because there is a null-terminator on the contents.
+  for (var source in files.values) inputSize += (source.length - 1);
+  print('input size: ${inputSize} chars');
+  var loadTime = loadTimer.elapsedMicroseconds - scanTimer.elapsedMicroseconds;
+  report('load', loadTime);
+  report('scan', scanTimer.elapsedMicroseconds);
+  return files;
+}
+
+/// Add to [files] all sources reachable from [start].
+Future<Null> collectSources(Uri start, Map<Uri, List<int>> files) async {
+  helper(Uri uri) {
+    uri = uriResolver.translate(uri) ?? uri;
+    if (uri == null) return;
+    if (files.containsKey(uri)) return;
+    var contents = readBytesFromFileSync(uri);
+    files[uri] = contents;
+    for (var directiveUri in extractDirectiveUris(contents)) {
+      helper(uri.resolve(directiveUri));
+    }
+  }
+
+  helper(start);
+}
+
+/// Parse [contents] as a Dart program and return the URIs that appear in its
+/// import, export, and part directives.
+Set<String> extractDirectiveUris(List<int> contents) {
+  var listener = new DirectiveListener();
+  new DirectiveParser(listener).parseUnit(tokenize(contents));
+  return listener.uris;
+}
+
+/// Diet parser that stops eagerly at the first sign that we have seen all the
+/// import, export, and part directives.
+class DirectiveParser extends ClassMemberParser {
+  DirectiveParser(listener) : super(listener);
+
+  static final _endToken = new SymbolToken(EOF_INFO, -1);
+
+  Token parseClassOrNamedMixinApplication(Token token) => _endToken;
+  Token parseEnum(Token token) => _endToken;
+  parseTypedef(token) => _endToken;
+  parseTopLevelMember(Token token) => _endToken;
+}
+
+/// Listener that records the URIs from imports, exports, and part directives.
+class DirectiveListener extends Listener {
+  bool _inDirective = false;
+  Set<String> uris = new Set<String>();
+
+  void _enterDirective() {
+    _inDirective = true;
+  }
+
+  void _exitDirective() {
+    _inDirective = false;
+  }
+
+  beginImport(_) => _enterDirective();
+  beginExport(_) => _enterDirective();
+  beginPart(_) => _enterDirective();
+
+  endExport(export, semicolon) => _exitDirective();
+  endImport(import, deferred, asKeyword, semicolon) => _exitDirective();
+  endPart(part, semicolon) => _exitDirective();
+
+  void beginLiteralString(Token token) {
+    if (_inDirective) {
+      var quotedString = token.value;
+      uris.add(quotedString.substring(1, quotedString.length - 1));
+    }
+  }
+}
+
+/// Parses every file in [files] and reports the time spent doing so.
+void parseFiles(Map<Uri, List<int>> files) {
+  scanTimer = new Stopwatch();
+  var parseTimer = new Stopwatch()..start();
+  files.forEach((uri, source) {
+    parseFull(uri, source);
+  });
+  parseTimer.stop();
+
+  report('scan', scanTimer.elapsedMicroseconds);
+  report(
+      'parse', parseTimer.elapsedMicroseconds - scanTimer.elapsedMicroseconds);
+}
+
+/// Parse the full body of [source].
+parseFull(Uri uri, List<int> source) {
+  var tokens = tokenize(source);
+  Parser parser = new Parser(new _PartialAstBuilder(uri));
+  parser.parseUnit(tokens);
+}
+
+class _EmptyScope extends Scope {
+  _EmptyScope() : super({}, null);
+}
+
+// Note: AstBuilder doesn't build compilation-units or classes, only method
+// bodies. So this listener is not feature complete.
+class _PartialAstBuilder extends AstBuilder {
+  final Uri uri;
+  _PartialAstBuilder(this.uri) : super(null, null, null, new _EmptyScope());
+
+  // Note: this method converts the body to kernel, so we skip that here.
+  @override
+  finishFunction(formals, asyncModifier, body) {}
+}
+
+// Invoke the fasta kernel generator for the program starting in [entryUri]
+// TODO(sigmund): update to uyse the frontend api once fasta is beind hit.
+generateKernel(Uri entryUri, {bool compileSdk: true}) async {
+  // TODO(sigmund): this is here only to compute the input size,
+  // we should extract the input size from the frontend instead.
+  scanReachableFiles(entryUri);
+
+  var timer = new Stopwatch()..start();
+  final Ticker ticker = new Ticker();
+  final DillTarget dillTarget = new DillTarget(ticker, uriResolver);
+  final KernelTarget kernelTarget = new KernelTarget(dillTarget, uriResolver);
+  var entrypoints = [
+    entryUri,
+    // These extra libraries are added to match the same set of libraries
+    // scanned by default by the VM and the other benchmarks.
+    Uri.parse('dart:async'),
+    Uri.parse('dart:collection'),
+    Uri.parse('dart:convert'),
+    Uri.parse('dart:core'),
+    Uri.parse('dart:developer'),
+    Uri.parse('dart:_internal'),
+    Uri.parse('dart:io'),
+    Uri.parse('dart:isolate'),
+    Uri.parse('dart:math'),
+    Uri.parse('dart:mirrors'),
+    Uri.parse('dart:typed_data'),
+  ];
+  entrypoints.forEach(kernelTarget.read);
+
+  if (!compileSdk) {
+    dillTarget.read(
+        Uri.base.resolve(Platform.resolvedExecutable).resolve('platform.dill'));
+  }
+  await dillTarget.writeOutline(null);
+  var program = await kernelTarget.writeOutline(null);
+  program = await kernelTarget.writeProgram(null, AstKind.Kernel);
+  if (kernelTarget.errors.isNotEmpty) {
+    throw kernelTarget.errors.first;
+  }
+  timer.stop();
+  report('kernel_gen_e2e', timer.elapsedMicroseconds);
+  return program;
+}
+
+/// Report that metric [name] took [time] micro-seconds to process
+/// [inputSize] characters.
+void report(String name, int time) {
+  var sb = new StringBuffer();
+  var padding = ' ' * (20 - name.length);
+  sb.write('$name:$padding $time us, ${time ~/ 1000} ms');
+  var invSpeed = (time * 1000 / inputSize).toStringAsFixed(2);
+  sb.write(', $invSpeed ns/char');
+  print('$sb');
+}
diff --git a/pkg/front_end/tool/fasta_perf_test.dart b/pkg/front_end/tool/fasta_perf_test.dart
new file mode 100644
index 0000000..4145908
--- /dev/null
+++ b/pkg/front_end/tool/fasta_perf_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// The only purpose of this file is to enable analyzer tests on `perf.dart`,
+/// the code here just has a dummy import to the rest of the code.
+library front_end.tool.perf_test;
+
+import 'dart:io' show Platform;
+import 'fasta_perf.dart' as m;
+
+main() async {
+  var benchIds = [
+    'scan',
+    'kernel_gen_e2e',
+  ];
+  var inputFile = Platform.script.resolve('../lib/file_system.dart').path;
+  for (var id in benchIds) {
+    await m.main([id, inputFile]);
+  }
+}
diff --git a/pkg/kernel/bin/dartk.dart b/pkg/kernel/bin/dartk.dart
index 84fbf77..b195bda 100755
--- a/pkg/kernel/bin/dartk.dart
+++ b/pkg/kernel/bin/dartk.dart
@@ -305,6 +305,7 @@
   TargetFlags targetFlags = new TargetFlags(
       strongMode: options['strong'],
       treeShake: options['tree-shake'],
+      kernelRuntime: Platform.script.resolve('../runtime/'),
       programRoots: programRoots);
   Target target = getTarget(options['target'], targetFlags);
 
diff --git a/pkg/kernel/bin/reified_dart.dart b/pkg/kernel/bin/reified_dart.dart
new file mode 100755
index 0000000..b87807d
--- /dev/null
+++ b/pkg/kernel/bin/reified_dart.dart
@@ -0,0 +1,173 @@
+#!/usr/bin/env dart
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:args/args.dart' as args;
+import 'package:path/path.dart' as path;
+
+args.ArgParser parser = new args.ArgParser(allowTrailingOptions: true)
+  ..addOption("sdk",
+      abbr: "s",
+      help: "Path to the Dart SDK. By default it will be searched at the path\n"
+          "'../../../out/ReleaseX64/patched_sdk' relative to the directory\n"
+          "of 'reified_dart'.",
+      defaultsTo: null)
+  ..addOption("dartk",
+      abbr: "k",
+      help: "Path to 'dartk' executable. By default it will be searched for\n"
+          "in the same directory as 'reified_dart'.",
+      defaultsTo: null)
+  ..addOption("dill-output",
+      abbr: "d",
+      help: "Path to intermediate reified .dill file. If not specified,\n"
+          "the intermediate file is created in a temporary location\n"
+          "and is removed after program execution.",
+      defaultsTo: null);
+
+String getUsage() => """
+Usage: reified_dart [options] FILE
+
+Reifies generic types in FILE and runs the transformed program.
+
+Examples:
+    reified_dart foo.dart
+    reified_dart --sdk=/path/to/sdk foo.dart
+    reified_dart --sdk=/path/to/sdk --dartk=/path/to/dartk foo.dart
+
+Options:
+${parser.usage}
+""";
+
+void fail(String message) {
+  stderr.writeln(message);
+  exit(1);
+}
+
+args.ArgResults options;
+
+void checkIsDirectory(String path, {String option, String description}) {
+  description = (description == null ? "" : "$description\n");
+  switch (new File(path).statSync().type) {
+    case FileSystemEntityType.DIRECTORY:
+    case FileSystemEntityType.LINK:
+      return;
+    case FileSystemEntityType.NOT_FOUND:
+      throw fail('$description$option not found: $path');
+    default:
+      fail('$description$option is not a directory: $path');
+  }
+}
+
+void checkIsFile(String path, {String option, String description}) {
+  description = (description == null ? "" : "$description\n");
+  var stat = new File(path).statSync();
+  switch (stat.type) {
+    case FileSystemEntityType.DIRECTORY:
+      throw fail('$description$option is a directory: $path');
+
+    case FileSystemEntityType.NOT_FOUND:
+      throw fail('$description$option not found: $path');
+  }
+}
+
+String getDefaultSdk() {
+  String currentFile = Platform.script.toFilePath();
+
+  // Respect different path separators.
+  String relativePath = "../../../out/ReleaseX64/patched_sdk";
+  List<String> components = relativePath.split("/");
+  relativePath = "";
+  for (String component in components) {
+    relativePath = path.join(relativePath, component);
+  }
+
+  String currentDir = path.dirname(currentFile);
+  String sdkPath = path.normalize(path.join(currentDir, relativePath));
+
+  checkIsDirectory(sdkPath,
+      option: "Path to Dart SDK",
+      description: "The --sdk option wasn't specified, "
+          "so default location was checked.");
+
+  return sdkPath;
+}
+
+String getDefaultDartk() {
+  String currentFile = Platform.script.toFilePath();
+  String dartkPath = path.join(path.dirname(currentFile), "dartk.dart");
+
+  checkIsFile(dartkPath,
+      option: "Path to 'dartk'",
+      description: "The --dartk option wasn't specified, "
+          "so default location was checked.");
+
+  return dartkPath;
+}
+
+main(List<String> arguments) async {
+  if (arguments.length == 0) {
+    fail(getUsage());
+  }
+
+  try {
+    options = parser.parse(arguments);
+  } on FormatException catch (e) {
+    fail(e.message);
+  }
+
+  if (options.rest.length != 1) {
+    fail("Exactly one FILE should be given.");
+  }
+
+  String inputFilename = options.rest.single;
+  checkIsFile(inputFilename, option: "Input file");
+
+  String sdkPath = options["sdk"] ?? getDefaultSdk();
+  checkIsDirectory(sdkPath, option: "Path to Dart SDK");
+
+  String dartkPath = options["dartk"] ?? getDefaultDartk();
+  checkIsFile(dartkPath, option: "Path to 'dartk'");
+
+  String dillOutput = options["dill-output"];
+  File tempFile = null;
+  if (dillOutput == null) {
+    Directory tmp = await Directory.systemTemp.createTemp();
+    Uri uri = tmp.uri.resolve("generated.dill");
+    dillOutput = uri.toFilePath();
+    tempFile = new File.fromUri(uri);
+  }
+
+  ProcessResult result = await Process.run(dartkPath, [
+    "--sdk=$sdkPath",
+    "--target=vmreify",
+    "--link",
+    "--out=$dillOutput",
+    inputFilename,
+  ]);
+  if (result.exitCode != 0) {
+    tempFile?.parent?.delete(recursive: true);
+    stdout.write(result.stdout);
+    stderr.write(result.stderr);
+    stderr.writeln("ERROR: execution of 'dartk' failed with exit code "
+        "${result.exitCode}");
+    exit(result.exitCode);
+  }
+
+  result = await Process.run("/usr/bin/env", [
+    "dart",
+    dillOutput,
+    inputFilename,
+  ]);
+
+  stdout.write(result.stdout);
+  stderr.write(result.stderr);
+  tempFile?.parent?.delete(recursive: true);
+  if (result.exitCode != 0) {
+    stderr.writeln("ERROR: execution of 'dart' failed with exit code "
+        "${result.exitCode}");
+    exit(result.exitCode);
+  }
+}
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index 5e73214..50d6339 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -7,16 +7,18 @@
 import 'dart:io';
 
 import 'package:args/args.dart';
-import 'package:kernel/verifier.dart';
 import 'package:kernel/kernel.dart';
-import 'package:kernel/transformations/continuation.dart' as cont;
-import 'package:kernel/transformations/infer_values.dart' as infer_values;
-import 'package:kernel/transformations/mixin_full_resolution.dart' as mix;
 import 'package:kernel/transformations/closure_conversion.dart' as closures;
+import 'package:kernel/transformations/continuation.dart' as cont;
+import 'package:kernel/transformations/empty.dart' as empty;
+import 'package:kernel/transformations/infer_values.dart' as infer_values;
+import 'package:kernel/transformations/method_call.dart' as method_call;
+import 'package:kernel/transformations/mixin_full_resolution.dart' as mix;
 import 'package:kernel/transformations/treeshaker.dart' as treeshaker;
+import 'package:kernel/verifier.dart';
 
-import 'util.dart';
 import 'batch_util.dart';
+import 'util.dart';
 
 ArgParser parser = new ArgParser()
   ..addOption('format',
@@ -90,6 +92,12 @@
       program =
           treeshaker.transformProgram(program, programRoots: programRoots);
       break;
+    case 'methodcall':
+      program = method_call.transformProgram(program);
+      break;
+    case 'empty':
+      program = empty.transformProgram(program);
+      break;
     default:
       throw 'Unknown transformation';
   }
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index ec89ffb..13186d5 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -9,6 +9,7 @@
 import 'flutter.dart';
 import 'vm.dart';
 import 'vmcc.dart';
+import 'vmreify.dart';
 
 final List<String> targetNames = targets.keys.toList();
 
@@ -16,8 +17,9 @@
   bool strongMode;
   bool treeShake;
   List<ProgramRoot> programRoots;
+  Uri kernelRuntime;
 
-  TargetFlags({this.strongMode: false, this.treeShake: false, this.programRoots: const <ProgramRoot>[]});
+  TargetFlags({this.strongMode: false, this.treeShake: false, this.programRoots: const <ProgramRoot>[], this.kernelRuntime});
 }
 
 typedef Target _TargetBuilder(TargetFlags flags);
@@ -26,6 +28,7 @@
   'none': (TargetFlags flags) => new NoneTarget(flags),
   'vm': (TargetFlags flags) => new VmTarget(flags),
   'vmcc': (TargetFlags flags) => new VmClosureConvertedTarget(flags),
+  'vmreify': (TargetFlags flags) => new VmGenericTypesReifiedTarget(flags),
   'flutter': (TargetFlags flags) => new FlutterTarget(flags),
 };
 
diff --git a/pkg/kernel/lib/target/vm.dart b/pkg/kernel/lib/target/vm.dart
index 1366cae..ed22544 100644
--- a/pkg/kernel/lib/target/vm.dart
+++ b/pkg/kernel/lib/target/vm.dart
@@ -74,13 +74,7 @@
     }
 
     if (flags.treeShake) {
-      new TreeShaker(program,
-              hierarchy: _hierarchy,
-              coreTypes: coreTypes,
-              strongMode: strongMode,
-              programRoots: flags.programRoots)
-          .transform(program);
-      _hierarchy = null; // Hierarchy must be recomputed.
+      performTreeShaking(program);
     }
 
     cont.transformProgram(program);
@@ -94,4 +88,15 @@
 
     new SanitizeForVM().transform(program);
   }
+
+  void performTreeShaking(Program program) {
+    var coreTypes = new CoreTypes(program);
+    new TreeShaker(program,
+        hierarchy: _hierarchy,
+        coreTypes: coreTypes,
+        strongMode: strongMode,
+        programRoots: flags.programRoots)
+        .transform(program);
+    _hierarchy = null; // Hierarchy must be recomputed.
+  }
 }
diff --git a/pkg/kernel/lib/target/vmreify.dart b/pkg/kernel/lib/target/vmreify.dart
new file mode 100644
index 0000000..db2c63e
--- /dev/null
+++ b/pkg/kernel/lib/target/vmreify.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+library kernel.target.vmreify;
+
+import '../ast.dart' show Program;
+import '../transformations/generic_types_reification.dart' as reify
+    show transformProgram;
+
+import 'targets.dart' show TargetFlags;
+import 'vmcc.dart' as vmcc_target;
+
+/// Specializes the kernel IR to the Dart VM with reified generic types.
+class VmGenericTypesReifiedTarget extends vmcc_target.VmClosureConvertedTarget {
+  VmGenericTypesReifiedTarget(TargetFlags flags) : super(flags);
+
+  @override
+  String get name => "vmreify";
+
+  // This is the order that bootstrap libraries are loaded according to
+  // `runtime/vm/object_store.h`.
+  List<String> get extraRequiredLibraries {
+    return new List<String>.from(super.extraRequiredLibraries)
+      ..add("${flags.kernelRuntime.resolve('reify/types.dart')}")
+      ..add("${flags.kernelRuntime.resolve('reify/declarations.dart')}")
+      ..add("${flags.kernelRuntime.resolve('reify/interceptors.dart')}");
+  }
+
+  @override
+  void performGlobalTransformations(Program program) {
+    super.performGlobalTransformations(program);
+    // TODO(dmitryas) this transformation should be made modular
+    reify.transformProgram(program);
+  }
+
+  // Disable tree shaking for Generic Types Reification. There are some runtime
+  // libraries that are required for the transformation and are shaken off,
+  // because they aren't invoked from the program being transformed prior to
+  // the transformation.
+  // TODO(dmitryas): remove this when the libraries are in dart:_internal
+  @override
+  void performTreeShaking(Program program) {}
+}
diff --git a/pkg/kernel/lib/transformations/empty.dart b/pkg/kernel/lib/transformations/empty.dart
new file mode 100644
index 0000000..3b84fb7
--- /dev/null
+++ b/pkg/kernel/lib/transformations/empty.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.empty;
+
+import '../ast.dart';
+import '../kernel.dart';
+import '../visitor.dart';
+
+Program transformProgram(Program program) {
+  new EmptyTransformer().visitProgram(program);
+  return program;
+}
+
+class EmptyTransformer extends Transformer {}
\ No newline at end of file
diff --git a/pkg/kernel/lib/transformations/generic_types_reification.dart b/pkg/kernel/lib/transformations/generic_types_reification.dart
new file mode 100644
index 0000000..ea64517
--- /dev/null
+++ b/pkg/kernel/lib/transformations/generic_types_reification.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformation.generic_types_reification;
+
+import '../ast.dart' show Program;
+
+import '../transformations/reify/reify_transformer.dart' as reify
+    show transformProgram;
+
+Program transformProgram(Program program) {
+  return reify.transformProgram(program);
+}
diff --git a/pkg/kernel/lib/transformations/method_call.dart b/pkg/kernel/lib/transformations/method_call.dart
new file mode 100644
index 0000000..6784dd3
--- /dev/null
+++ b/pkg/kernel/lib/transformations/method_call.dart
@@ -0,0 +1,1312 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.method_call;
+
+import 'dart:math' as math;
+
+import '../ast.dart';
+import '../class_hierarchy.dart';
+import '../core_types.dart';
+import '../kernel.dart';
+import '../visitor.dart';
+
+/// Problems with the method rewrite transformation:
+///
+/// * Cannot rewrite invocations to things called "call" because of tear-offs
+///   and whatnot that when invoked turns into variableName.call(...).
+///
+/// * Cannot rewrite invocations to things sharing a name with a field because
+///   one could have called clazz.fieldName(...).
+///
+/// * Rewrites will make stacktraces look weird.
+///
+/// * Rewrites will make noSuchMethod look weird --- e.g. calling a non-existing
+///   function foo(a: 42) turns into foo%0%a(42), i.e. the method name has
+///   changed ("foo" vs "foo%0%a") and the arguments has changed (named "a" vs
+///   positional).
+///   NOTE: At least for now this can be fixed by changing the
+///   invocation_mirror_patch file. Doing this I can make all dill, language
+///   and co19 tests pass!
+///
+/// Somewhat weird:
+///
+/// * Inserts methods that redirect to the correct noSuchMethod invocation
+///   so that program #1 example below will work.
+///   The reason it otherwise wouldn't is that b.foo(499, named1: 88) is
+///   rewritten to b.foo%1%named1(499, 88) which is not legal for class B
+///   (thus the method would not be create there) but IS legal for Bs parent
+///   class (A), so it would be created there. The call will thus go to the
+///   super (A) but shouldn't as foo was overwritten in B.
+///
+/// Program #1 example:
+/// class A {
+///   foo(required1, { named1: 499}) => print("Hello from class A");
+/// }
+///
+/// class B extends A {
+///   foo(required1) => print("Hello from class B");
+/// }
+///
+/// main() {
+///   var b = new B();
+///   b.foo(499, named1: 88);
+/// }
+Program transformProgram(Program program, [debug = false]) {
+  new MethodCallTransformer(debug).visitProgram(program);
+  return program;
+}
+
+class MethodCallTransformer extends Transformer {
+  /// Keep track of "visited" procedures and constructors to not visit already
+  /// visited stuff, nor visit newly created stubs.
+  Set<Member> _visited = new Set<Member>();
+
+  /// Some things currently cannot be rewritten. Calls to methods called "call"
+  /// (because invoking tear-offs and closures and whatnot becomes .call)
+  /// as well as clashes with field names as a field can contain a function
+  /// and one can then do a clazz.fieldName(...).
+  Set<String> blacklistedSelectors = new Set<String>.from(["call"]);
+
+  /// Map from a "originally named" procedure to the "%original" procedure
+  /// for procedures that was moved.
+  Map<Procedure, Procedure> _movedBodies = {};
+
+  /// Map from a "originally named" constructor to the "%original"
+  /// constructor for constructors that was moved.
+  Map<Constructor, Constructor> _movedConstructors = {};
+
+  /// For static method transformations:
+  /// Maps a procedure to the mapping of argument signature to procedure stub.
+  Map<Procedure, Map<String, Procedure>> _staticProcedureCalls = {};
+
+  /// For constructor transformations:
+  /// Maps a constructor to a mapping of argument signature to constructor stub.
+  Map<Constructor, Map<String, Constructor>> _constructorCalls = {};
+
+  /// For non-static method transformations:
+  /// Maps from method name to the set of legal number of positional arguments.
+  Map<String, Set<int>> _methodToLegalPositionalArgumentCount = {};
+
+  /// For non-static method transformations:
+  /// Maps from name of method to the set of new target names seen for at least
+  /// one instance (i.e. rewriting has been performed from key to all values in
+  /// the mapped to set at least once).
+  Map<Name, Set<String>> _rewrittenMethods = {};
+
+  /// For non-static method transformations:
+  /// Maps a procedure to the mapping of argument signature to procedure stub.
+  Map<Procedure, Map<String, Procedure>> _superProcedureCalls = {};
+
+  /// Whether in debug mode, i.e. if we can insert extra print statements for
+  /// debugging purposes.
+  bool _debug;
+
+  /// For noSuchMethod calls.
+  ClassHierarchy hierarchy;
+  CoreTypes coreTypes;
+  Constructor _invocationMirrorConstructor; // cached
+  Procedure _listFrom; // cached
+
+  MethodCallTransformer(this._debug);
+
+  @override
+  TreeNode visitProgram(Program node) {
+    hierarchy = new ClassHierarchy(node);
+    coreTypes = new CoreTypes(node);
+
+    // First move body of all procedures that takes optional positional or named
+    // parameters and record which non-static procedure names have optional
+    // positional arguments.
+    // Do the same for constructors. Then also rewrite constructor initializers
+    // using LocalInitializer and sort named arguments in those initializers
+    for (final library in node.libraries) {
+      for (final procedure in new List<Procedure>.from(library.procedures)) {
+        _moveAndTransformProcedure(procedure);
+      }
+
+      for (final clazz in library.classes) {
+        for (final field in clazz.fields) {
+          blacklistedSelectors.add(field.name.name);
+        }
+
+        for (final procedure in new List<Procedure>.from(clazz.procedures)) {
+          // This call creates new procedures
+          _moveAndTransformProcedure(procedure);
+          _recordNonStaticProcedureAndVariableArguments(procedure);
+        }
+
+        for (final constructor
+            in new List<Constructor>.from(clazz.constructors)) {
+          // This call creates new constructors
+          _moveAndTransformConstructor(constructor);
+        }
+
+        for (final constructor in clazz.constructors) {
+          _rewriteConstructorInitializations(constructor);
+        }
+      }
+    }
+
+    // Rewrite calls
+    node.transformChildren(this);
+
+    // Now for all method calls that was rewritten, make sure those call
+    // destinations actually exist, i.e. for each method with a matching name
+    // where the called-with-arguments is legal, create a stub
+    for (final library in node.libraries) {
+      for (final clazz in library.classes) {
+        for (final procedure in new List<Procedure>.from(clazz.procedures)) {
+          // This call creates new procedures
+          _createNeededNonStaticStubs(procedure);
+        }
+      }
+    }
+
+    return node;
+  }
+
+  @override
+  TreeNode visitProcedure(Procedure node) {
+    if (!_visited.contains(node)) {
+      _visited.add(node);
+      node.transformChildren(this);
+    }
+    return node;
+  }
+
+  @override
+  TreeNode visitConstructor(Constructor node) {
+    if (!_visited.contains(node)) {
+      _visited.add(node);
+      node.transformChildren(this);
+    }
+    return node;
+  }
+
+  @override
+  TreeNode visitStaticInvocation(StaticInvocation node) {
+    node.transformChildren(this);
+    if (!_isMethod(node.target)) return node;
+    if (!_hasAnyOptionalParameters(node.target.function)) return node;
+    if (!_callIsLegal(node.target.function, node.arguments)) return node;
+
+    // Rewrite with let if needed (without named arguments it won't do anything)
+    Expression rewrittenNode = _rewriteWithLetAndSort(node, node.arguments);
+
+    // Create/lookup target and set it as the new target
+    node.target = _getNewTargetForStaticLikeInvocation(
+        node.target, node.arguments, _staticProcedureCalls);
+
+    // Now turn any named parameters into positional parameters
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return rewrittenNode;
+  }
+
+  @override
+  TreeNode visitDirectMethodInvocation(DirectMethodInvocation node) {
+    node.transformChildren(this);
+    if (!_isMethod(node.target)) return node;
+    if (!_hasAnyOptionalParameters(node.target.function)) return node;
+    if (!_callIsLegal(node.target.function, node.arguments)) return node;
+
+    // Rewrite with let if needed (without named arguments it won't do anything)
+    Expression rewrittenNode = _rewriteWithLetAndSort(node, node.arguments);
+
+    // Create/lookup target and set it as the new target
+    node.target = _getNewTargetForStaticLikeInvocation(
+        node.target, node.arguments, _superProcedureCalls);
+
+    // Now turn any named parameters into positional parameters instead
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return rewrittenNode;
+  }
+
+  @override
+  TreeNode visitSuperMethodInvocation(SuperMethodInvocation node) {
+    // SuperMethodInvocation was changed since I originally wrote this,
+    // and now it seems to never be called anyway.
+    throw "visitSuperMethodInvocation is not implemented!";
+  }
+
+  @override
+  TreeNode visitMethodInvocation(MethodInvocation node) {
+    node.transformChildren(this);
+    final name = node.name.name;
+
+    // Don't renamed calls to methods that clashes in name with a field
+    // or is called "call".
+    if (blacklistedSelectors.contains(name)) return node;
+
+    // Rewrite with let if needed (without named arguments it won't do anything)
+    Expression rewrittenNode = _rewriteWithLetAndSort(node, node.arguments);
+
+    String argumentsSignature = _createArgumentsSignature(node.arguments);
+    if (node.arguments.named.isEmpty) {
+      // Positional: Don't rewrite if no procedure with that name can be called
+      // with a variable number of arguments, or where the number of arguments
+      // called with here isn't a legal number of arguments to any such
+      // procedure.
+      // Note for named arguments: Named arguments are always rewritten
+      // (except for 'call' methods) so there's no such check
+      final okCounts = _methodToLegalPositionalArgumentCount[name];
+
+      if (okCounts == null ||
+          !okCounts.contains(node.arguments.positional.length)) {
+        return node;
+      }
+    }
+
+    // Rewrite this call
+    final originalName = node.name;
+    node.name = _createName(node.name, argumentsSignature);
+
+    // Remember that we rewrote this call
+    _rewrittenMethods
+        .putIfAbsent(originalName, () => new Set<String>())
+        .add(argumentsSignature);
+
+    // Now turn any named parameters into positional parameters instead
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return rewrittenNode;
+  }
+
+  @override
+  TreeNode visitConstructorInvocation(ConstructorInvocation node) {
+    node.transformChildren(this);
+    if (!_callIsLegal(node.target.function, node.arguments)) return node;
+
+    Expression rewrittenNode;
+    if (node.isConst) {
+      // Sort named arguments by name => it's const so there's no side-effects!
+      // but DO NOT rewrite with let!
+      node.arguments.named.sort((a, b) => a.name.compareTo(b.name));
+      rewrittenNode = node;
+    } else {
+      rewrittenNode = _rewriteWithLetAndSort(node, node.arguments);
+    }
+    node.target = _getNewTargetForConstructor(node.target, node.arguments);
+
+    // Now turn named parameters into positional parameters instead
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return rewrittenNode;
+  }
+
+  @override
+  TreeNode visitSuperInitializer(SuperInitializer node) {
+    // Note that sorting was done in _rewriteConstructorInitializations
+    node.transformChildren(this);
+    if (!_callIsLegal(node.target.function, node.arguments)) return node;
+
+    node.target = _getNewTargetForConstructor(node.target, node.arguments);
+
+    // Now turn named parameters into positional parameters instead
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return node;
+  }
+
+  @override
+  TreeNode visitRedirectingInitializer(RedirectingInitializer node) {
+    // Note that sorting was done in _rewriteConstructorInitializations
+    node.transformChildren(this);
+    if (!_callIsLegal(node.target.function, node.arguments)) return node;
+
+    node.target = _getNewTargetForConstructor(node.target, node.arguments);
+
+    // Now turn named parameters into positional parameters instead
+    _turnNamedArgumentsIntoPositional(node.arguments);
+    return node;
+  }
+
+  /// Gets the new target for an invocation, using cache or creating a new one.
+  ///
+  /// Assumes that any let-rewrite, named argument sorting etc has been done
+  /// already.
+  Procedure _getNewTargetForStaticLikeInvocation(Procedure target,
+      Arguments arguments, Map<Procedure, Map<String, Procedure>> cache) {
+    final createdProcedures = cache.putIfAbsent(target, () => {});
+
+    // Rewrite target
+    final argumentsSignature = _createArgumentsSignature(arguments);
+    return createdProcedures[argumentsSignature] ??
+        _createAndCacheInvocationProcedure(
+            argumentsSignature,
+            arguments.positional.length,
+            arguments.named.map((e) => e.name).toList(),
+            target,
+            _movedBodies[target],
+            createdProcedures,
+            true);
+  }
+
+  /// Rewrite the [Argument]s turning named arguments into positional arguments.
+  ///
+  /// Note that if the [Argument]s does not take any named parameters this
+  /// method does nothing.
+  void _turnNamedArgumentsIntoPositional(Arguments arguments) {
+    for (final named in arguments.named) {
+      arguments.positional.add(named.value..parent = arguments);
+    }
+    arguments.named.clear();
+  }
+
+  /// Gets the new target for an invocation, using cache or creating a new one.
+  ///
+  /// Assumes that any let-rewrite, named argument sorting etc has been done
+  /// already.
+  Constructor _getNewTargetForConstructor(
+      Constructor target, Arguments arguments) {
+    if (!_isNotExternal(target)) return target;
+    if (!_hasAnyOptionalParameters(target.function)) return target;
+
+    final argumentsSignature = _createArgumentsSignature(arguments);
+    final createdConstructor = _constructorCalls.putIfAbsent(target, () => {});
+    return createdConstructor[argumentsSignature] ??
+        _createAndCacheInvocationConstructor(
+            argumentsSignature,
+            arguments.positional.length,
+            arguments.named.map((e) => e.name).toList(),
+            target,
+            _movedConstructors[target],
+            createdConstructor,
+            true);
+  }
+
+  /// Create a signature for the [Arguments].
+  ///
+  /// Assumes that any needed sorting etc has already been done.
+  ///
+  /// Looks like x%positionalCount%named --- but it shouldn't matter if always
+  /// using these methods
+  String _createArgumentsSignature(Arguments arguments) {
+    String namedString = arguments.named.map((e) => e.name).join("%");
+    return "${arguments.positional.length}%$namedString";
+  }
+
+  /// Parse the argument signature.
+  ///
+  /// First element will be the string representation of the number of
+  /// positional arguments used.
+  /// The rest will be the named arguments, except that with no named arguments
+  /// there still is a 2nd entry: the empty string...
+  List<String> _parseArgumentsSignature(String argumentsSignature) {
+    return argumentsSignature.split("%");
+  }
+
+  /// Rewrites an expression with let, replacing expressions in the [Arguments].
+  ///
+  /// Sorts the named arguments after rewriting with let.
+  ///
+  /// Note that this method does nothing if there are no named arguments, or the
+  /// named arguments list contain only a single named argument as any sorting
+  /// would have no effect. As such, the let-rewrite will also have no effect.
+  /// In such a case the return value is [original].
+  Expression _rewriteWithLetAndSort(Expression original, Arguments arguments) {
+    final named = arguments.named;
+
+    // Only bother if names can be unordered
+    if (named.length < 2) return original;
+
+    // Rewrite named with let in given order
+    Let let;
+    for (int i = named.length - 1; i >= 0; i--) {
+      VariableDeclaration letDeclaration =
+          new VariableDeclaration.forValue(named[i].value);
+      named[i].value = new VariableGet(letDeclaration)..parent = arguments;
+      let = new Let(letDeclaration, let ?? original);
+    }
+
+    // Sort named arguments by name
+    named.sort((a, b) => a.name.compareTo(b.name));
+
+    // Now also add the given positional arguments into the let
+    final expressions = arguments.positional;
+    for (int i = expressions.length - 1; i >= 0; i--) {
+      VariableDeclaration letDeclaration =
+          new VariableDeclaration.forValue(expressions[i]);
+      expressions[i] = new VariableGet(letDeclaration)..parent = arguments;
+      let = new Let(letDeclaration, let ?? original);
+    }
+
+    return let;
+  }
+
+  /// Creates all needed stubs for non static procedures.
+  ///
+  /// More specifically: If calls have been made to a procedure with the same
+  /// name as this procedure with both 1 and 2 arguments, where both of these
+  /// are legal inputs to this procedure, create stubs for both of them,
+  /// each of which calls with whatever default parameter values are defined for
+  /// the non-given arguments.
+  void _createNeededNonStaticStubs(Procedure procedure) {
+    final incomingCalls = _rewrittenMethods[procedure.name];
+    if (incomingCalls != null &&
+        procedure.kind == ProcedureKind.Method &&
+        !procedure.isStatic) {
+      final createdOnSuper = _superProcedureCalls[procedure];
+      final names =
+          procedure.function.namedParameters.map((e) => e.name).toSet();
+
+      // A procedure with this name was called on at least one object with
+      // an argument signature like any in [incomingCalls]
+      nextArgumentSignature:
+      for (final argumentsSignature in incomingCalls) {
+        // Skip if it was created in a super call already
+        if (createdOnSuper != null &&
+            createdOnSuper.containsKey(argumentsSignature)) {
+          continue;
+        }
+
+        final elements = _parseArgumentsSignature(argumentsSignature);
+        int positional = int.parse(elements[0]);
+
+        if (positional < procedure.function.requiredParameterCount ||
+            positional > procedure.function.positionalParameters.length) {
+          // We don't take that number of positional parameters!
+          // Call noSuchMethod in case anyone called on object with wrong
+          // parameters, but where superclass does take these parameters.
+          _createNoSuchMethodStub(
+              argumentsSignature, positional, elements.sublist(1), procedure);
+          continue;
+        }
+
+        if (elements.length > 2 || elements[1] != "") {
+          // Named: Could the call be for this method?
+          for (int i = 1; i < elements.length; i++) {
+            String name = elements[i];
+            // Using a name that we don't have?
+            if (!names.contains(name)) {
+              // Call noSuchMethod in case anyone called on object with wrong
+              // parameters, but where superclass does take these parameters.
+              _createNoSuchMethodStub(argumentsSignature, positional,
+                  elements.sublist(1), procedure);
+              continue nextArgumentSignature;
+            }
+          }
+        }
+
+        // Potential legal call => make stub
+        // Note the ?? here: E.g. contains on list doesn't take optionals so it
+        // wasn't moved, but calls were rewritten because contains on string
+        // takes either 1 or 2 arguments.
+        final destination = _movedBodies[procedure] ?? procedure;
+        _createAndCacheInvocationProcedure(argumentsSignature, positional,
+            elements.sublist(1), procedure, destination, {}, false);
+      }
+    }
+  }
+
+  /// Records how this procedure can be called (if it is non-static).
+  ///
+  /// More specifically: Assuming that the procedure given is non-static taking
+  /// a variable number of positional parameters, record all number of arguments
+  /// that is legal, e.g. foo(int a, [int b]) is legal for 1 and 2 parameters.
+  /// If it takes named parameters, remember how many positional there is so
+  /// we also know to rewrite calls without the named arguments.
+  void _recordNonStaticProcedureAndVariableArguments(Procedure procedure) {
+    if (_isMethod(procedure) &&
+        !procedure.isStatic &&
+        _hasAnyOptionalParameters(procedure.function)) {
+      final name = procedure.name.name;
+      final okCounts = _methodToLegalPositionalArgumentCount.putIfAbsent(
+          name, () => new Set<int>());
+      for (int i = procedure.function.requiredParameterCount;
+          i <= procedure.function.positionalParameters.length;
+          i++) {
+        okCounts.add(i);
+      }
+    }
+  }
+
+  /// Move body of procedure to new procedure and call that from this procedure.
+  ///
+  /// More specifically: For all procedures with optional positional parameters,
+  /// or named parameters, create a new procedure without optional positional
+  /// parameters and named parameters and move the body of the original
+  /// procedure into this new procedure.
+  /// Then make the body of the original procedure call the new procedure.
+  ///
+  /// The idea is that all rewrites should call the moved procedure instead,
+  /// bypassing the optional/named arguments entirely.
+  void _moveAndTransformProcedure(Procedure procedure) {
+    if (_isMethod(procedure) && _hasAnyOptionalParameters(procedure.function)) {
+      final function = procedure.function;
+
+      // Create variable lists
+      final newParameterDeclarations = <VariableDeclaration>[];
+      final newNamedParameterDeclarations = <VariableDeclaration>[];
+      final newParameterVariableGets = <Expression>[];
+      final targetParameters = function.positionalParameters;
+      final targetNamedParameters = function.namedParameters;
+      _moveVariableInitialization(
+          targetParameters,
+          targetNamedParameters,
+          newParameterDeclarations,
+          newNamedParameterDeclarations,
+          newParameterVariableGets,
+          procedure.function);
+
+      // Create new procedure looking like the old one
+      // (with the old body and parameters)
+      FunctionNode functionNode = _createShallowFunctionCopy(function);
+      final newProcedure = new Procedure(
+          _createOriginalName(procedure), ProcedureKind.Method, functionNode,
+          isAbstract: procedure.isAbstract,
+          isStatic: procedure.isStatic,
+          isConst: procedure.isConst,
+          fileUri: procedure.fileUri);
+
+      // Add procedure to the code
+      _addMember(procedure, newProcedure);
+
+      // Map moved body
+      _movedBodies[procedure] = newProcedure;
+
+      // Transform original procedure
+      if (procedure.isAbstract && procedure.function.body == null) {
+        // do basically nothing then
+        procedure.function.positionalParameters = newParameterDeclarations;
+        procedure.function.namedParameters = newNamedParameterDeclarations;
+      } else if (procedure.isStatic) {
+        final expression = new StaticInvocation(
+            newProcedure, new Arguments(newParameterVariableGets));
+        final statement = new ReturnStatement(expression)
+          ..parent = procedure.function;
+        procedure.function.body = statement;
+        procedure.function.positionalParameters = newParameterDeclarations;
+        procedure.function.namedParameters = newNamedParameterDeclarations;
+      } else {
+        final expression = new DirectMethodInvocation(new ThisExpression(),
+            newProcedure, new Arguments(newParameterVariableGets));
+        final statement = new ReturnStatement(expression)
+          ..parent = procedure.function;
+        procedure.function.body = statement;
+        procedure.function.positionalParameters = newParameterDeclarations;
+        procedure.function.namedParameters = newNamedParameterDeclarations;
+      }
+
+      if (_debug) {
+        // Debug flag set: Print something to the terminal before returning to
+        // easily detect if rewrites are missing.
+        Expression debugPrint = _getPrintExpression(
+            "DEBUG! Procedure shouldn't have been called...", procedure);
+        procedure.function.body = new Block(
+            [new ExpressionStatement(debugPrint), procedure.function.body])
+          ..parent = procedure.function;
+      }
+
+      // Mark original procedure as seen (i.e. don't transform it further)
+      _visited.add(procedure);
+    }
+  }
+
+  /// Rewrite constructor initializers by introducing variables and sorting.
+  ///
+  /// For any* [SuperInitializer] or [RedirectingInitializer], extract the
+  /// parameters, put them into variables, then sorting the named parameters.
+  /// The idea is to sort the named parameters without changing any invocation
+  /// order.
+  ///
+  /// * only with at least 2 named arguments, otherwise sorting would do nothing
+  void _rewriteConstructorInitializations(Constructor constructor) {
+    if (_isNotExternal(constructor)) {
+      // Basically copied from "super_calls.dart"
+      List<Initializer> initializers = constructor.initializers;
+      int foundIndex = -1;
+      Arguments arguments;
+      for (int i = initializers.length - 1; i >= 0; --i) {
+        Initializer initializer = initializers[i];
+        if (initializer is SuperInitializer) {
+          foundIndex = i;
+          arguments = initializer.arguments;
+          break;
+        } else if (initializer is RedirectingInitializer) {
+          foundIndex = i;
+          arguments = initializer.arguments;
+          break;
+        }
+      }
+      if (foundIndex == -1) return;
+
+      // Rewrite using variables if using named parameters (so we can sort them)
+      // (note that with 1 named it cannot be unsorted so we don't bother)
+      if (arguments.named.length < 2) return;
+
+      int argumentCount = arguments.positional.length + arguments.named.length;
+
+      // Make room for [argumentCount] [LocalInitializer]s before the
+      // super/redirector call.
+      initializers.length += argumentCount;
+      initializers.setRange(
+          foundIndex + argumentCount, // destination start (inclusive)
+          initializers.length, // destination end (exclusive)
+          initializers, // source list
+          foundIndex); // source start index
+
+      // Fill in the [argumentCount] reserved slots with the evaluation
+      // expressions of the arguments to the super/redirector constructor call
+      int storeIndex = foundIndex;
+      for (int i = 0; i < arguments.positional.length; ++i) {
+        var variable =
+            new VariableDeclaration.forValue(arguments.positional[i]);
+        arguments.positional[i] = new VariableGet(variable)..parent = arguments;
+        initializers[storeIndex++] = new LocalInitializer(variable)
+          ..parent = constructor;
+      }
+      for (int i = 0; i < arguments.named.length; ++i) {
+        NamedExpression argument = arguments.named[i];
+        var variable = new VariableDeclaration.forValue(argument.value);
+        arguments.named[i].value = new VariableGet(variable)..parent = argument;
+        initializers[storeIndex++] = new LocalInitializer(variable)
+          ..parent = constructor;
+      }
+
+      // Sort the named arguments
+      arguments.named.sort((a, b) => a.name.compareTo(b.name));
+    }
+  }
+
+  /// Move body of constructor to new one and call that from this one.
+  ///
+  /// More specifically: For all constructors with optional positional
+  /// parameters, or named parameters, create a new constructor without optional
+  /// positional parameters and named parameters, and move the body of the
+  /// original constructor into this new constructor.
+  /// Then make the original constructor redirect to the new constructor.
+  ///
+  /// The idea is that all rewrites should call the moved constructor instead,
+  /// bypassing the optional/named arguments entirely.
+  ///
+  /// This method is very similar to _moveAndTransformProcedure
+  void _moveAndTransformConstructor(Constructor constructor) {
+    if (_isNotExternal(constructor) &&
+        _hasAnyOptionalParameters(constructor.function)) {
+      final function = constructor.function;
+
+      // Create variable lists
+      final newParameterDeclarations = <VariableDeclaration>[];
+      final newNamedParameterDeclarations = <VariableDeclaration>[];
+      final newParameterVariableGets = <Expression>[];
+      final targetParameters = function.positionalParameters;
+      final targetNamedParameters = function.namedParameters;
+      _moveVariableInitialization(
+          targetParameters,
+          targetNamedParameters,
+          newParameterDeclarations,
+          newNamedParameterDeclarations,
+          newParameterVariableGets,
+          constructor.function);
+
+      // Create new constructor looking like the old one
+      // (with the old body, parameters and initializers)
+      FunctionNode functionNode = _createShallowFunctionCopy(function);
+      final newConstructor = new Constructor(functionNode,
+          name: _createOriginalName(constructor),
+          isConst: constructor.isConst,
+          isExternal: constructor.isExternal,
+          initializers: constructor.initializers);
+
+      // Add constructor to the code
+      _addMember(constructor, newConstructor);
+
+      // Map moved body
+      _movedConstructors[constructor] = newConstructor;
+
+      // Transform original constructor
+      constructor.function.body = null;
+      constructor.function.positionalParameters = newParameterDeclarations;
+      constructor.function.namedParameters = newNamedParameterDeclarations;
+      constructor.initializers = [
+        new RedirectingInitializer(
+            newConstructor, new Arguments(newParameterVariableGets))
+          ..parent = constructor
+      ];
+
+      if (_debug) {
+        // Debug flag set: Print something to the terminal before returning to
+        // easily detect if rewrites are missing.
+        Expression debugPrint = _getPrintExpression(
+            "DEBUG! Constructor shouldn't have been called...", constructor);
+        var variable = new VariableDeclaration.forValue(debugPrint);
+        final debugInitializer = new LocalInitializer(variable)
+          ..parent = constructor;
+        final redirector = constructor.initializers[0];
+        constructor.initializers = [debugInitializer, redirector];
+      }
+
+      // Mark original procedure as seen (i.e. don't transform it further)
+      _visited.add(constructor);
+    }
+  }
+
+  /// Creates a new [FunctionNode] based on the given one.
+  ///
+  /// Parameters are taken directly (i.e. after returning the parameters will
+  /// have a new parent (the returned value), but still be referenced in the
+  /// original [FunctionNode].
+  /// The same goes for the body of the function.
+  /// The caller should take steps to remedy this after this call.
+  ///
+  /// The parameters are no longer optional and named parameters have been
+  /// sorted and turned into regular parameters in the returned [FunctionNode].
+  FunctionNode _createShallowFunctionCopy(FunctionNode function) {
+    final newParameters =
+        new List<VariableDeclaration>.from(function.positionalParameters);
+    final named = new List<VariableDeclaration>.from(function.namedParameters);
+    named.sort((a, b) => a.name.compareTo(b.name));
+    newParameters.addAll(named);
+    final functionNode = new FunctionNode(function.body,
+        positionalParameters: newParameters,
+        namedParameters: [],
+        requiredParameterCount: newParameters.length,
+        returnType: function.returnType,
+        asyncMarker: function.asyncMarker);
+    return functionNode;
+  }
+
+  /// Creates new variables, moving old initializers into them
+  ///
+  /// Specifically: Given lists for output, create new variables based on
+  /// original parameters. Any new variable will receive the original variables
+  /// initializer, and the original variable will have its initializer set to
+  /// null.
+  /// Named parameters have been sorted in [newParameterVariableGets].
+  void _moveVariableInitialization(
+      List<VariableDeclaration> originalParameters,
+      List<VariableDeclaration> originalNamedParameters,
+      List<VariableDeclaration> newParameterDeclarations,
+      List<VariableDeclaration> newNamedParameterDeclarations,
+      List<Expression> newParameterVariableGets,
+      TreeNode newStuffParent) {
+    for (final orgVar in originalParameters) {
+      final variableDeclaration = new VariableDeclaration(orgVar.name,
+          initializer: orgVar.initializer,
+          type: orgVar.type,
+          isFinal: orgVar.isFinal,
+          isConst: orgVar.isConst)..parent = newStuffParent;
+      variableDeclaration.initializer?.parent = variableDeclaration;
+      newParameterDeclarations.add(variableDeclaration);
+      orgVar.initializer = null;
+      newParameterVariableGets.add(new VariableGet(variableDeclaration));
+    }
+
+    // Named expressions in newParameterVariableGets should be sorted
+    final tmp = new List<_Pair<String, Expression>>();
+    for (final orgVar in originalNamedParameters) {
+      final variableDeclaration = new VariableDeclaration(orgVar.name,
+          initializer: orgVar.initializer,
+          type: orgVar.type,
+          isFinal: orgVar.isFinal,
+          isConst: orgVar.isConst)..parent = newStuffParent;
+      variableDeclaration.initializer?.parent = variableDeclaration;
+      newNamedParameterDeclarations.add(variableDeclaration);
+      orgVar.initializer = null;
+      tmp.add(new _Pair(orgVar.name, new VariableGet(variableDeclaration)));
+    }
+    tmp.sort((a, b) => a.key.compareTo(b.key));
+    for (final item in tmp) {
+      newParameterVariableGets.add(item.value);
+    }
+  }
+
+  /// Creates a stub redirecting to noSuchMethod.
+  ///
+  /// Needed because if B extends A, both have a foo method, but taking
+  /// different optional parameters, a call on an instance of B with parameters
+  /// for A should actually result in a noSuchMethod call, but if only A has
+  /// the rewritten method name, that method will be called...
+  /// TODO: We only have to create these stubs for arguments that a procedures
+  /// super allows, otherwise it will become a noSuchMethod automatically!
+  Procedure _createNoSuchMethodStub(
+      String argumentsSignature,
+      int positionalCount,
+      List<String> givenNamedParameters,
+      Procedure existing) {
+    // Build parameter lists
+    final newParameterDeclarations = <VariableDeclaration>[];
+    final newParameterVariableGets = <Expression>[];
+    for (int i = 0; i < positionalCount + givenNamedParameters.length; i++) {
+      final variableDeclaration = new VariableDeclaration("v%$i");
+      newParameterDeclarations.add(variableDeclaration);
+      newParameterVariableGets.add(new VariableGet(variableDeclaration));
+    }
+
+    var procedureName = _createName(existing.name, argumentsSignature);
+
+    // Find noSuchMethod to call
+    Member noSuchMethod = hierarchy.getDispatchTarget(
+        existing.enclosingClass, new Name("noSuchMethod"));
+    Arguments argumentsToNoSuchMethod;
+
+    if (noSuchMethod.function.positionalParameters.length == 1 &&
+        noSuchMethod.function.namedParameters.isEmpty) {
+      // We have a correct noSuchMethod method.
+      ConstructorInvocation invocation = _createInvocation(
+          procedureName.name, new Arguments(newParameterVariableGets));
+      argumentsToNoSuchMethod = new Arguments([invocation]);
+    } else {
+      // Get noSuchMethod on Object then...
+      noSuchMethod = hierarchy.getDispatchTarget(
+          hierarchy.rootClass, new Name("noSuchMethod"));
+      ConstructorInvocation invocation = _createInvocation(
+          procedureName.name, new Arguments(newParameterVariableGets));
+      ConstructorInvocation invocationPrime =
+          _createInvocation("noSuchMethod", new Arguments([invocation]));
+      argumentsToNoSuchMethod = new Arguments([invocationPrime]);
+    }
+
+    // Create return statement to call noSuchMethod
+    ReturnStatement statement;
+    final expression = new DirectMethodInvocation(
+        new ThisExpression(), noSuchMethod, argumentsToNoSuchMethod);
+    statement = new ReturnStatement(expression);
+
+    // Build procedure
+    final functionNode = new FunctionNode(statement,
+        positionalParameters: newParameterDeclarations,
+        namedParameters: [],
+        requiredParameterCount: newParameterDeclarations.length,
+        returnType: existing.function.returnType,
+        asyncMarker: existing.function.asyncMarker);
+    final procedure = new Procedure(
+        procedureName, ProcedureKind.Method, functionNode,
+        isStatic: existing.isStatic, fileUri: existing.fileUri);
+
+    // Add procedure to the code
+    _addMember(existing, procedure);
+
+    // Mark the new procedure as visited already (i.e. don't rewrite it again!)
+    _visited.add(procedure);
+
+    return procedure;
+  }
+
+  /// Creates an "new _InvocationMirror(...)" invocation.
+  ConstructorInvocation _createInvocation(
+      String methodName, Arguments callArguments) {
+    if (_invocationMirrorConstructor == null) {
+      Class clazz = coreTypes.getCoreClass('dart:core', '_InvocationMirror');
+      _invocationMirrorConstructor = clazz.constructors[0];
+    }
+
+    // The _InvocationMirror constructor takes the following arguments:
+    // * Method name (a string).
+    // * An arguments descriptor - a list consisting of:
+    //   - number of arguments (including receiver).
+    //   - number of positional arguments (including receiver).
+    //   - pairs (2 entries in the list) of
+    //     * named arguments name.
+    //     * index of named argument in arguments list.
+    // * A list of arguments, where the first ones are the positional arguments.
+    // * Whether it's a super invocation or not.
+
+    int numPositionalArguments = callArguments.positional.length + 1;
+    int numArguments = numPositionalArguments + callArguments.named.length;
+    List<Expression> argumentsDescriptor = [
+      new IntLiteral(numArguments),
+      new IntLiteral(numPositionalArguments)
+    ];
+    List<Expression> arguments = [];
+    arguments.add(new ThisExpression());
+    for (Expression pos in callArguments.positional) {
+      arguments.add(pos);
+    }
+    for (NamedExpression named in callArguments.named) {
+      argumentsDescriptor.add(new StringLiteral(named.name));
+      argumentsDescriptor.add(new IntLiteral(arguments.length));
+      arguments.add(named.value);
+    }
+
+    return new ConstructorInvocation(
+        _invocationMirrorConstructor,
+        new Arguments([
+          new StringLiteral(methodName),
+          _fixedLengthList(argumentsDescriptor),
+          _fixedLengthList(arguments),
+          new BoolLiteral(false)
+        ]));
+  }
+
+  /// Create a fixed length list containing given expressions.
+  Expression _fixedLengthList(List<Expression> list) {
+    if (_listFrom == null) {
+      Class clazz = coreTypes.getCoreClass('dart:core', 'List');
+      _listFrom = clazz.procedures.firstWhere((c) => c.name.name == "from");
+    }
+    return new StaticInvocation(
+        _listFrom,
+        new Arguments([new ListLiteral(list)],
+            named: [new NamedExpression("growable", new BoolLiteral(false))],
+            types: [const DynamicType()]));
+  }
+
+  /// Creates a new procedure taking given arguments, caching it.
+  ///
+  /// Copies any non-given default values for parameters into the new procedure
+  /// to be able to call the [realTarget] without using optionals and named
+  /// parameters.
+  Procedure _createAndCacheInvocationProcedure(
+      String argumentsSignature,
+      int positionalCount,
+      List<String> givenNamedParameters,
+      Procedure target,
+      Procedure realTarget,
+      Map<String, Procedure> createdProcedures,
+      bool doSpecialCaseForAllParameters) {
+    // Special case: Calling with all parameters
+    if (doSpecialCaseForAllParameters &&
+        positionalCount == target.function.positionalParameters.length &&
+        givenNamedParameters.length == target.function.namedParameters.length) {
+      // We don't cache this procedure as this could make it look like
+      // something with name argumentsSignature actually exists
+      // while it doesn't (which is bad as we could then decide that we don't
+      // need to create a stub even though we do!)
+      return realTarget;
+    }
+
+    // Create and cache (save) constructor
+
+    // Build parameter lists
+    final newParameterDeclarations = <VariableDeclaration>[];
+    final newParameterVariableGets = <Expression>[];
+    _extractAndCreateParameters(positionalCount, newParameterDeclarations,
+        newParameterVariableGets, target, givenNamedParameters);
+
+    // Create return statement to call real target
+    ReturnStatement statement;
+    if (target.isAbstract && target.function?.body == null) {
+      // statement should just be null then
+    } else if (target.isStatic) {
+      final expression = new StaticInvocation(
+          realTarget, new Arguments(newParameterVariableGets));
+      statement = new ReturnStatement(expression);
+    } else {
+      final expression = new DirectMethodInvocation(new ThisExpression(),
+          realTarget, new Arguments(newParameterVariableGets));
+      statement = new ReturnStatement(expression);
+    }
+
+    // Build procedure
+    final functionNode = new FunctionNode(statement,
+        positionalParameters: newParameterDeclarations,
+        namedParameters: [],
+        requiredParameterCount: newParameterDeclarations.length,
+        returnType: target.function.returnType,
+        asyncMarker: target.function.asyncMarker);
+    final procedure = new Procedure(
+        _createName(target.name, argumentsSignature),
+        ProcedureKind.Method,
+        functionNode,
+        isAbstract: target.isAbstract,
+        isStatic: target.isStatic,
+        isConst: target.isConst,
+        fileUri: target.fileUri);
+
+    // Add procedure to the code
+    _addMember(target, procedure);
+
+    // Cache it for future reference
+    createdProcedures[argumentsSignature] = procedure;
+
+    // Mark the new procedure as visited already (i.e. don't rewrite it again!)
+    _visited.add(procedure);
+
+    return procedure;
+  }
+
+  /// Creates a new constructor taking given arguments, caching it.
+  ///
+  /// Copies any non-given default values for parameters into the new
+  /// constructor to be able to call the [realTarget] without using optionals
+  /// and named parameters.
+  Constructor _createAndCacheInvocationConstructor(
+      String argumentsSignature,
+      int positionalCount,
+      List<String> givenNamedParameters,
+      Constructor target,
+      Constructor realTarget,
+      Map<String, Constructor> createdConstructor,
+      bool doSpecialCaseForAllParameters) {
+    // Special case: Calling with all parameters
+    if (doSpecialCaseForAllParameters &&
+        positionalCount == target.function.positionalParameters.length &&
+        givenNamedParameters.length == target.function.namedParameters.length) {
+      createdConstructor[argumentsSignature] = realTarget;
+      return realTarget;
+    }
+
+    // Create and cache (save) constructor
+
+    // Build parameter lists
+    final newParameterDeclarations = <VariableDeclaration>[];
+    final newParameterVariableGets = <Expression>[];
+    _extractAndCreateParameters(positionalCount, newParameterDeclarations,
+        newParameterVariableGets, target, givenNamedParameters);
+
+    // Build constructor
+    final functionNode = new FunctionNode(null,
+        positionalParameters: newParameterDeclarations,
+        namedParameters: [],
+        requiredParameterCount: newParameterDeclarations.length,
+        returnType: target.function.returnType,
+        asyncMarker: target.function.asyncMarker);
+    final constructor = new Constructor(functionNode,
+        name: _createName(target.name, argumentsSignature),
+        isConst: target.isConst,
+        isExternal: target.isExternal,
+        initializers: [
+          new RedirectingInitializer(
+              realTarget, new Arguments(newParameterVariableGets))
+        ]);
+
+    // Add procedure to the code
+    _addMember(target, constructor);
+
+    // Cache it for future reference
+    createdConstructor[argumentsSignature] = constructor;
+
+    // Mark the new procedure as visited already (i.e. don't rewrite it again!)
+    _visited.add(constructor);
+
+    return constructor;
+  }
+
+  /// Extracts and creates parameters into the first two given lists.
+  ///
+  /// What is done:
+  /// Step 1: Re-create the parameters given (i.e. the non-optional positional
+  /// ones) - i.e. create a new variable with the same name etc, put it in
+  /// [newParameterDeclarations]; create VariableGet for that and put it in
+  /// [newParameterVariableGets]
+  /// Step 2: Re-create the positional parameters NOT given, i.e. insert
+  /// defaults and add to [newParameterVariableGets] only.
+  /// Step 3: Re-create the named arguments (in sorted order). For actually
+  /// given named parameters, do as in step 1, for not-given named parameters
+  /// do as in step 2.
+  ///
+  /// NOTE: [newParameterDeclarations] and [newParameterVariableGets] are OUTPUT
+  /// lists.
+  void _extractAndCreateParameters(
+      int positionalCount,
+      List<VariableDeclaration> newParameterDeclarations,
+      List<Expression> newParameterVariableGets,
+      Member target,
+      List<String> givenNamedParameters) {
+    // First re-create the parameters given (i.e. the non-optional positional ones)
+    final targetParameters = target.function.positionalParameters;
+    positionalCount = math.min(positionalCount, targetParameters.length);
+    for (int i = 0; i < positionalCount; i++) {
+      final orgVar = targetParameters[i];
+      final variableDeclaration = new VariableDeclaration(orgVar.name,
+          type: orgVar.type, isFinal: orgVar.isFinal, isConst: orgVar.isConst);
+      newParameterDeclarations.add(variableDeclaration);
+      newParameterVariableGets.add(new VariableGet(variableDeclaration));
+    }
+
+    // Default parameters for the rest of them
+    _fillInPositionalParameters(
+        positionalCount, target, newParameterVariableGets);
+
+    // Then all named parameters (given here or not)
+    final orgNamed =
+        new List<VariableDeclaration>.from(target.function.namedParameters);
+    orgNamed.sort((a, b) => a.name.compareTo(b.name));
+    final givenArgumentsIterator = givenNamedParameters.iterator;
+    givenArgumentsIterator.moveNext();
+    for (VariableDeclaration named in orgNamed) {
+      if (givenArgumentsIterator.current == named.name) {
+        // We have that one: Use it and move the iterator
+        final variableDeclaration = new VariableDeclaration(named.name);
+        newParameterDeclarations.add(variableDeclaration);
+        newParameterVariableGets.add(new VariableGet(variableDeclaration));
+        givenArgumentsIterator.moveNext();
+      } else {
+        // We don't have that one: Fill it in
+        _fillInSingleParameter(named, newParameterVariableGets, target);
+      }
+    }
+  }
+
+  /// Adds the new member the same place as the existing member
+  void _addMember(Member existingMember, Member newMember) {
+    if (existingMember.enclosingClass != null) {
+      existingMember.enclosingClass.addMember(newMember);
+    } else {
+      existingMember.enclosingLibrary.addMember(newMember);
+    }
+  }
+
+  /// Create expressions based on the default values from the given [Member].
+  ///
+  /// More specifically: static gets and nulls will be "copied" whereas other
+  /// things (e.g. literals or things like "a+b") will be moved from the
+  /// original member as argument initializers to const fields and both the
+  /// original member and the expression-copy will use static gets to these.
+  void _fillInPositionalParameters(
+      int startFrom, Member copyFrom, List<Expression> fillInto) {
+    final targetParameters = copyFrom.function.positionalParameters;
+    for (int i = startFrom; i < targetParameters.length; i++) {
+      final parameter = targetParameters[i];
+      _fillInSingleParameter(parameter, fillInto, copyFrom);
+    }
+  }
+
+  /// Create expression based on the default values from the given variable.
+  ///
+  /// More specifically: a static get or null will be "copied" whereas other
+  /// things (e.g. literals or things like "a+b") will be moved from the
+  /// original member as an argument initializer to a const field and both the
+  /// original member and the expression-copy will use a static get to it.
+  void _fillInSingleParameter(VariableDeclaration parameter,
+      List<Expression> fillInto, Member copyFrom) {
+    if (parameter.initializer is StaticGet) {
+      // Reference to const => recreate it
+      StaticGet staticGet = parameter.initializer;
+      fillInto.add(new StaticGet(staticGet.target));
+    } else if (parameter.initializer == null) {
+      // No default given => output null
+      fillInto.add(new NullLiteral());
+    } else if (parameter.initializer is IntLiteral) {
+      // Int literal => recreate (or else class ByteBuffer in typed_data will
+      // get 2 fields and the C++ code will complain!)
+      IntLiteral value = parameter.initializer;
+      fillInto.add(new IntLiteral(value.value));
+    } else {
+      // Advanced stuff => move to static const field and reference that
+      final initializer = parameter.initializer;
+      final f = new Field(
+          new Name('${copyFrom.name.name}%_${parameter.name}',
+              copyFrom.enclosingLibrary),
+          type: parameter.type,
+          initializer: initializer,
+          isFinal: false,
+          isConst: true,
+          isStatic: true,
+          fileUri: copyFrom.enclosingClass?.fileUri ??
+              copyFrom.enclosingLibrary.fileUri);
+      initializer.parent = f;
+
+      // Add field to the code
+      if (copyFrom.enclosingClass != null) {
+        copyFrom.enclosingClass.addMember(f);
+      } else {
+        copyFrom.enclosingLibrary.addMember(f);
+      }
+
+      // Use it at the call site
+      fillInto.add(new StaticGet(f));
+
+      // Now replace the initializer in the method to a StaticGet
+      parameter.initializer = new StaticGet(f)..parent = parameter;
+    }
+  }
+
+  /// Create an "original name" for a member.
+  ///
+  /// Specifically, for a member "x" just returns "x%original";
+  Name _createOriginalName(Member member) {
+    return new Name("${member.name.name}%original", member.enclosingLibrary);
+  }
+
+  /// Create a [Name] based on current name and argument signature.
+  Name _createName(Name name, String argumentsSignature) {
+    String nameString = '${name.name}%$argumentsSignature';
+    return new Name(nameString, name.library);
+  }
+
+  /// Is the procedure a method?
+  bool _isMethod(Procedure procedure) => procedure.kind == ProcedureKind.Method;
+
+  /// Is the procedure NOT marked as external?
+  bool _isNotExternal(Constructor constructor) => !constructor.isExternal;
+
+  /// Does the target function have any optional arguments? (positional/named)
+  bool _hasAnyOptionalParameters(FunctionNode targetFunction) =>
+      _hasOptionalParameters(targetFunction) ||
+      _hasNamedParameters(targetFunction);
+
+  /// Does the target function have optional positional arguments?
+  bool _hasOptionalParameters(FunctionNode targetFunction) =>
+      targetFunction.positionalParameters.length >
+      targetFunction.requiredParameterCount;
+
+  /// Does the target function have named parameters?
+  bool _hasNamedParameters(FunctionNode targetFunction) =>
+      targetFunction.namedParameters.isNotEmpty;
+
+  bool _callIsLegal(FunctionNode targetFunction, Arguments arguments) {
+    if ((targetFunction.requiredParameterCount > arguments.positional.length) ||
+        (targetFunction.positionalParameters.length <
+            arguments.positional.length)) {
+      // Given too few or too many positional arguments
+      return false;
+    }
+
+    // Do we give named that we don't take?
+    Set<String> givenNamed = arguments.named.map((v) => v.name).toSet();
+    Set<String> takenNamed =
+        targetFunction.namedParameters.map((v) => v.name).toSet();
+    givenNamed.removeAll(takenNamed);
+    return givenNamed.isEmpty;
+  }
+
+  // Below methods used to add debug prints etc
+
+  Library _getDartCoreLibrary(Program program) {
+    if (program == null) return null;
+    return program.libraries.firstWhere((lib) =>
+        lib.importUri.scheme == 'dart' && lib.importUri.path == 'core');
+  }
+
+  Procedure _getProcedureInLib(Library lib, String name) {
+    if (lib == null) return null;
+    return lib.procedures
+        .firstWhere((procedure) => procedure.name.name == name);
+  }
+
+  Procedure _getProcedureInClassInLib(
+      Library lib, String className, String procedureName) {
+    if (lib == null) return null;
+    Class clazz = lib.classes.firstWhere((clazz) => clazz.name == className);
+    return clazz.procedures
+        .firstWhere((procedure) => procedure.name.name == procedureName);
+  }
+
+  Expression _getPrintExpression(String msg, TreeNode treeNode) {
+    TreeNode program = treeNode;
+    while (program is! Program) program = program.parent;
+    var finalMsg = msg;
+    if (treeNode is Member) {
+      finalMsg += " [ ${treeNode.name.name} ]";
+      if (treeNode.enclosingClass != null) {
+        finalMsg += " [ class ${treeNode.enclosingClass.name} ]";
+      }
+      if (treeNode.enclosingLibrary != null) {
+        finalMsg += " [ lib ${treeNode.enclosingLibrary.name} ]";
+      }
+    }
+
+    var stacktrace = new StaticGet(_getProcedureInClassInLib(
+        _getDartCoreLibrary(program), 'StackTrace', 'current'));
+    var printStackTrace = new StaticInvocation(
+        _getProcedureInLib(_getDartCoreLibrary(program), 'print'),
+        new Arguments([
+          new StringConcatenation([
+            new StringLiteral(finalMsg),
+            new StringLiteral("\n"),
+            stacktrace,
+            new StringLiteral("\n")
+          ])
+        ]));
+
+    return printStackTrace;
+  }
+}
+
+class _Pair<K, V> {
+  final K key;
+  final V value;
+
+  _Pair(this.key, this.value);
+}
diff --git a/pkg/kernel/lib/transformations/reify/analysis/program_analysis.dart b/pkg/kernel/lib/transformations/reify/analysis/program_analysis.dart
new file mode 100644
index 0000000..8e712d7
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/analysis/program_analysis.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformation.reify.analysis.program_analysis;
+
+import '../asts.dart';
+import 'package:kernel/ast.dart';
+
+// TODO(karlklose): keep all predicates and derived information here and move
+// the actual data to a builder class.
+class ProgramKnowledge {
+  Map<Member, Set<TypeParameter>> _usedTypeVariables =
+      <Member, Set<TypeParameter>>{};
+
+  Map<Member, Set<DartType>> isTests = <Member, Set<DartType>>{};
+
+  Set<Class> _classTests;
+
+  /// Contains all classes that are used as the declaration of a type expression
+  /// in a type test.
+  Set<Class> get classTests {
+    if (_classTests == null) {
+      _classTests = isTests.values
+          .expand((set) => set)
+          .where((DartType type) => type is InterfaceType)
+          .map((DartType type) => (type as InterfaceType).classNode)
+          .toSet();
+    }
+    return _classTests;
+  }
+
+  recordTypeVariableUse(Expression expression, TypeParameter parameter) {
+    // TODO(karlklose): also record expression.
+    add(_usedTypeVariables, getEnclosingMember(expression), parameter);
+  }
+
+  Set<TypeParameter> usedParameters(Member member) {
+    return _usedTypeVariables[member] ?? new Set<TypeParameter>();
+  }
+
+  void recordIsTest(IsExpression node, DartType type) {
+    add(isTests, getEnclosingMember(node), type);
+  }
+
+  add(Map<dynamic, Set> map, key, value) {
+    map.putIfAbsent(key, () => new Set()).add(value);
+  }
+}
+
+typedef bool LibraryFilter(Library library);
+
+class ProgramAnalysis extends Visitor {
+  final ProgramKnowledge knowledge;
+  final LibraryFilter analyzeLibrary;
+
+  ProgramAnalysis(this.knowledge, this.analyzeLibrary);
+
+  defaultTreeNode(TreeNode node) => node.visitChildren(this);
+
+  visitLibrary(Library library) {
+    if (!analyzeLibrary(library)) {
+      return;
+    }
+    super.visitLibrary(library);
+  }
+
+  handleTypeReference(TreeNode node, DartType type) {
+    typeVariables(type).forEach((TypeParameter parameter) {
+      knowledge.recordTypeVariableUse(node, parameter);
+    });
+  }
+
+  handleInstantiation(InvocationExpression node) {
+    node.arguments.types.forEach((DartType type) {
+      handleTypeReference(node, type);
+    });
+  }
+
+  visitIsExpression(IsExpression node) {
+    knowledge.recordIsTest(node, node.type);
+    handleTypeReference(node, node.type);
+    node.visitChildren(this);
+  }
+
+  visitConstructorInvocation(ConstructorInvocation node) {
+    handleInstantiation(node);
+    node.visitChildren(this);
+  }
+
+  visitStaticInvocation(StaticInvocation node) {
+    if (node.target.kind == ProcedureKind.Factory) {
+      handleInstantiation(node);
+    }
+    node.visitChildren(this);
+  }
+}
+
+bool _analyzeAll(Library library) => true;
+
+ProgramKnowledge analyze(Program program,
+    {LibraryFilter analyzeLibrary: _analyzeAll}) {
+  ProgramKnowledge knowledge = new ProgramKnowledge();
+  program.accept(new ProgramAnalysis(knowledge, analyzeLibrary));
+  return knowledge;
+}
diff --git a/pkg/kernel/lib/transformations/reify/asts.dart b/pkg/kernel/lib/transformations/reify/asts.dart
new file mode 100644
index 0000000..0516b0b
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/asts.dart
@@ -0,0 +1,54 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.ast_helpers;
+
+import 'package:kernel/ast.dart';
+
+Class getEnclosingClass(TreeNode node) {
+  TreeNode original = node;
+  while (node != null && node is! Class) {
+    node = node.parent;
+  }
+  if (node == null) {
+    throw 'internal error: enclosing class not found for $original';
+  }
+  return node;
+}
+
+Library getEnclosingLibrary(TreeNode node) {
+  TreeNode original = node;
+  while (node != null && node is! Library) {
+    node = node.parent;
+  }
+  if (node == null) {
+    throw 'internal error: enclosing library not found for $original';
+  }
+  return node;
+}
+
+Member getEnclosingMember(TreeNode node) {
+  TreeNode original = node;
+  while (node != null && node is! Member) {
+    node = node.parent;
+  }
+  if (node == null) {
+    throw 'internal error: enclosing member not found for $original';
+  }
+  return node;
+}
+
+List<TypeParameter> typeVariables(DartType type) {
+  List<TypeParameter> parameters = <TypeParameter>[];
+  collect(DartType type) {
+    if (type is InterfaceType) {
+      type.typeArguments.map(collect);
+    } else if (type is TypeParameterType) {
+      parameters.add(type.parameter);
+    }
+  }
+
+  collect(type);
+  return parameters;
+}
diff --git a/pkg/kernel/lib/transformations/reify/reify_transformer.dart b/pkg/kernel/lib/transformations/reify/reify_transformer.dart
new file mode 100644
index 0000000..4561208
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/reify_transformer.dart
@@ -0,0 +1,114 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.standalone_runner;
+
+import 'analysis/program_analysis.dart';
+import 'dart:io' show File, IOSink;
+
+import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
+
+import 'package:kernel/ast.dart';
+
+import 'package:kernel/verifier.dart';
+import 'package:kernel/text/ast_to_text.dart' show Printer;
+
+import 'package:kernel/repository.dart' show Repository;
+
+import 'package:kernel/binary/loader.dart' show BinaryLoader;
+
+import 'transformation/remove_generics.dart';
+import 'transformation/transformer.dart'
+    show ReifyVisitor, RuntimeLibrary, RuntimeTypeSupportBuilder;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+RuntimeLibrary findRuntimeTypeLibrary(Program p) {
+  Library findLibraryEndingWith(String postfix) {
+    Iterable<Library> candidates = p.libraries.where((Library l) {
+      return l.importUri.toString().endsWith(postfix);
+    });
+    if (candidates.length != 1) {
+      String howMany = candidates.isEmpty ? "No" : "Multiple";
+      throw new Exception(
+          "$howMany candidates for runtime support library found.");
+    }
+    return candidates.single;
+  }
+
+  Library types = findLibraryEndingWith("reify/types.dart");
+  Library declarations = findLibraryEndingWith("reify/declarations.dart");
+  Library interceptors = findLibraryEndingWith("reify/interceptors.dart");
+  return new RuntimeLibrary(types, declarations, interceptors);
+}
+
+Program transformProgramUsingLibraries(
+    Program program, RuntimeLibrary runtimeLibrary,
+    [Library libraryToTransform]) {
+  LibraryFilter filter = libraryToTransform != null
+      ? (Library library) => library == libraryToTransform
+      : (_) => true;
+  ProgramKnowledge knowledge = analyze(program, analyzeLibrary: filter);
+  Library mainLibrary = program.mainMethod.parent;
+  RuntimeTypeSupportBuilder builder = new RuntimeTypeSupportBuilder(
+      runtimeLibrary, new CoreTypes(program), mainLibrary);
+  ReifyVisitor transformer =
+      new ReifyVisitor(runtimeLibrary, builder, knowledge, libraryToTransform);
+  // Transform the main program.
+  program = program.accept(transformer);
+  if (!filter(runtimeLibrary.interceptorsLibrary)) {
+    // We need to transform the interceptor function in any case to make sure
+    // that the type literals in the interceptor function are rewritten.
+    runtimeLibrary.interceptorFunction.accept(transformer);
+  }
+  builder.createDeclarations();
+  program = program.accept(new Erasure(transformer));
+  // TODO(karlklose): skip checks in debug mode
+  verifyProgram(program);
+  return program;
+}
+
+Program transformProgram(Program program) {
+  RuntimeLibrary runtimeLibrary = findRuntimeTypeLibrary(program);
+  Library mainLibrary = program.mainMethod.enclosingLibrary;
+  return transformProgramUsingLibraries(program, runtimeLibrary, mainLibrary);
+}
+
+main(List<String> arguments) async {
+  String path = arguments.first;
+  Uri output;
+  if (arguments.length > 1) {
+    output = Uri.base.resolve(arguments[1]);
+  }
+  Uri uri = Uri.base.resolve(path);
+  Repository repository = new Repository();
+  Program program = new BinaryLoader(repository).loadProgram(uri.toFilePath());
+
+  RuntimeLibrary runtimeLibrary = findRuntimeTypeLibrary(program);
+  Library mainLibrary = program.mainMethod.enclosingLibrary;
+  program =
+      transformProgramUsingLibraries(program, runtimeLibrary, mainLibrary);
+
+  if (output == null) {
+    // Print result
+    StringBuffer sb = new StringBuffer();
+    Printer printer = new Printer(sb);
+    printer.writeLibraryFile(mainLibrary);
+    print("$sb");
+  } else {
+    IOSink sink = new File.fromUri(output).openWrite();
+    try {
+      new BinaryPrinter(sink).writeProgramFile(program);
+    } finally {
+      await sink.close();
+    }
+    try {
+      // Check that we can read the binary file.
+      new BinaryLoader(new Repository()).loadProgram(output.toFilePath());
+    } catch (e) {
+      print("Error when attempting to read $output.");
+      rethrow;
+    }
+  }
+}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/binding.dart b/pkg/kernel/lib/transformations/reify/transformation/binding.dart
new file mode 100644
index 0000000..e53492f
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/transformation/binding.dart
@@ -0,0 +1,180 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.transformation.binding;
+
+import 'package:kernel/ast.dart';
+
+class RuntimeLibrary {
+  final Library typesLibrary;
+  final Library declarationsLibrary;
+  final Library interceptorsLibrary;
+
+  final Constructor dynamicTypeConstructor;
+  final Constructor interfaceTypeConstructor;
+  final Constructor declarationClassConstructor;
+  final Constructor functionTypeConstructor;
+  final Constructor voidTypeConstructor;
+
+  // The class used to mark instances that implement `$type`.
+  final Class markerClass;
+  final Class declarationClass;
+  final Class reifiedTypeClass;
+
+  DartType get typeType => reifiedTypeClass.rawType;
+
+  final Name variablesFieldName = new Name("variables");
+
+  /// The name of the field to create for the type information. This name is
+  /// extracted from the class `HasRuntimeTypeGetter`.
+  final Name runtimeTypeName;
+
+  final Procedure asInstanceOfFunction;
+  final Procedure isSubtypeOfFunction;
+  final Procedure typeArgumentsFunction;
+  final Procedure allocateDeclarationsFunction;
+  final Procedure initFunction;
+  final Procedure interceptorFunction;
+  final Procedure reifyFunction;
+  final Procedure attachTypeFunction;
+
+  factory RuntimeLibrary(Library typesLibrary, Library declarationsLibrary,
+      Library interceptorsLibrary) {
+    Class dynamicTypeClass;
+    Class interfaceTypeClass;
+    Class declarationClass;
+    Class functionTypeClass;
+    Class voidTypeClass;
+    Class markerClass;
+    Class reifiedTypeClass;
+
+    Procedure allocateDeclarationsFunction;
+    Procedure initFunction;
+    Procedure interceptorFunction;
+    Procedure reifyFunction;
+    Procedure attachTypeFunction;
+    Procedure asInstanceOfFunction;
+    Procedure isSubtypeOfFunction;
+    Procedure typeArgumentsFunction;
+
+    for (Procedure p in interceptorsLibrary.procedures) {
+      if (p.name.name == "type") {
+        interceptorFunction = p;
+      } else if (p.name.name == "reify") {
+        reifyFunction = p;
+      } else if (p.name.name == "attachType") {
+        attachTypeFunction = p;
+      }
+    }
+    for (Class c in interceptorsLibrary.classes) {
+      if (c.name == "HasRuntimeTypeGetter") {
+        markerClass = c;
+      }
+    }
+    for (Class c in typesLibrary.classes) {
+      if (c.name == 'Dynamic') {
+        dynamicTypeClass = c;
+      } else if (c.name == 'Interface') {
+        interfaceTypeClass = c;
+      } else if (c.name == 'FunctionType') {
+        functionTypeClass = c;
+      } else if (c.name == 'Void') {
+        voidTypeClass = c;
+      } else if (c.name == 'ReifiedType') {
+        reifiedTypeClass = c;
+      }
+    }
+    for (Procedure p in typesLibrary.procedures) {
+      if (p.name.name == "asInstanceOf") {
+        asInstanceOfFunction = p;
+      } else if (p.name.name == "isSubtypeOf") {
+        isSubtypeOfFunction = p;
+      } else if (p.name.name == "getTypeArguments") {
+        typeArgumentsFunction = p;
+      }
+    }
+    for (Procedure p in declarationsLibrary.procedures) {
+      if (p.name.name == "allocateDeclarations") {
+        allocateDeclarationsFunction = p;
+      } else if (p.name.name == "init") {
+        initFunction = p;
+      }
+    }
+    for (Class c in declarationsLibrary.classes) {
+      if (c.name == 'Class') {
+        declarationClass = c;
+      }
+    }
+
+    assert(dynamicTypeClass != null);
+    assert(declarationClass != null);
+    assert(interfaceTypeClass != null);
+    assert(functionTypeClass != null);
+    assert(voidTypeClass != null);
+    assert(markerClass != null);
+    assert(declarationClass != null);
+    assert(reifiedTypeClass != null);
+    assert(allocateDeclarationsFunction != null);
+    assert(initFunction != null);
+    assert(interceptorFunction != null);
+    assert(reifyFunction != null);
+    assert(attachTypeFunction != null);
+    assert(asInstanceOfFunction != null);
+    assert(isSubtypeOfFunction != null);
+    assert(typeArgumentsFunction != null);
+
+    return new RuntimeLibrary._(
+        markerClass.procedures.single.name,
+        typesLibrary,
+        declarationsLibrary,
+        interceptorsLibrary,
+        markerClass,
+        declarationClass,
+        reifiedTypeClass,
+        dynamicTypeClass.constructors.single,
+        interfaceTypeClass.constructors.single,
+        declarationClass.constructors.single,
+        functionTypeClass.constructors.single,
+        voidTypeClass.constructors.single,
+        allocateDeclarationsFunction,
+        initFunction,
+        interceptorFunction,
+        reifyFunction,
+        attachTypeFunction,
+        asInstanceOfFunction,
+        isSubtypeOfFunction,
+        typeArgumentsFunction);
+  }
+
+  RuntimeLibrary._(
+      this.runtimeTypeName,
+      this.typesLibrary,
+      this.declarationsLibrary,
+      this.interceptorsLibrary,
+      this.markerClass,
+      this.declarationClass,
+      this.reifiedTypeClass,
+      this.dynamicTypeConstructor,
+      this.interfaceTypeConstructor,
+      this.declarationClassConstructor,
+      this.functionTypeConstructor,
+      this.voidTypeConstructor,
+      this.allocateDeclarationsFunction,
+      this.initFunction,
+      this.interceptorFunction,
+      this.reifyFunction,
+      this.attachTypeFunction,
+      this.asInstanceOfFunction,
+      this.isSubtypeOfFunction,
+      this.typeArgumentsFunction);
+
+  /// Returns `true` if [node] is defined in the runtime library.
+  bool contains(TreeNode node) {
+    while (node is! Library) {
+      node = node.parent;
+      if (node == null) return false;
+    }
+    return node == typesLibrary || node == declarationsLibrary;
+  }
+}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/builder.dart b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
new file mode 100644
index 0000000..fef0f19
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/transformation/builder.dart
@@ -0,0 +1,511 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.transformation.builder;
+
+import '../asts.dart';
+import 'package:kernel/ast.dart';
+import 'dart:collection' show LinkedHashMap;
+import 'binding.dart' show RuntimeLibrary;
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+class Scope {
+  final Map<String, TreeNode> names = <String, TreeNode>{};
+
+  bool nameAlreadyTaken(String name, TreeNode node) {
+    TreeNode existing = names[name];
+    return existing != null && existing == node;
+  }
+
+  void add(String name, TreeNode node) {
+    assert(!nameAlreadyTaken(name, node));
+    names[name] = node;
+  }
+}
+
+class Namer {
+  final Scope scope;
+  Namer([Scope scope]) : this.scope = scope ?? new Scope();
+
+  String _getProposal(TreeNode node) {
+    if (node is Class) {
+      return node.name;
+    }
+    throw 'unsupported node: $node';
+  }
+
+  String getNameFor(TreeNode node) {
+    String base = _getProposal(node);
+    int id = 0;
+    String proposal = base;
+    while (scope.nameAlreadyTaken(proposal, node)) {
+      proposal = "$base${++id}";
+    }
+    scope.add(proposal, node);
+    return proposal;
+  }
+}
+
+class RuntimeTypeSupportBuilder {
+  // TODO(karlklose): group this together with other information about what
+  // needs to be built.
+  final LinkedHashMap<Class, int> reifiedClassIds =
+      new LinkedHashMap<Class, int>();
+
+  int currentDeclarationId = 0;
+
+  final Field declarations;
+
+  final RuntimeLibrary rtiLibrary;
+
+  final CoreTypes coreTypes;
+
+  final DartType declarationType;
+
+  RuntimeTypeSupportBuilder(
+      RuntimeLibrary rtiLibrary, CoreTypes coreTypes, Library mainLibrary)
+      : declarations = new Field(new Name(r"$declarations"),
+            isFinal: true, isStatic: true, fileUri: mainLibrary.fileUri),
+        declarationType = new InterfaceType(coreTypes.listClass,
+            <DartType>[rtiLibrary.declarationClass.rawType]),
+        rtiLibrary = rtiLibrary,
+        coreTypes = coreTypes {
+    mainLibrary.addMember(declarations);
+  }
+
+  int addDeclaration(Class cls) {
+    return reifiedClassIds.putIfAbsent(cls, () {
+      return currentDeclarationId++;
+    });
+  }
+
+  final Name indexOperatorName = new Name("[]");
+
+  MethodInvocation createArrayAccess(Expression target, int index) {
+    return new MethodInvocation(target, indexOperatorName,
+        new Arguments(<Expression>[new IntLiteral(index)]));
+  }
+
+  Expression createAccessDeclaration(Class cls) {
+    return createArrayAccess(new StaticGet(declarations), addDeclaration(cls));
+  }
+
+  Name getTypeTestTagName(Class cls) {
+    return new Name('\$is\$${cls.name}');
+  }
+
+  Name typeVariableGetterName(TypeParameter parameter) {
+    Class cls = getEnclosingClass(parameter);
+    return new Name("\$${cls.name}\$${parameter.name}");
+  }
+
+  // A call to a constructor or factory of a class that we have not transformed
+  // is wrapped in a call to `attachType`.
+  Expression attachTypeToConstructorInvocation(
+      InvocationExpression invocation, Member member) {
+    assert(member is Procedure && member.kind == ProcedureKind.Factory ||
+        member is Constructor);
+    Class targetClass = member.parent;
+    assert(targetClass != null);
+    DartType type = new InterfaceType(targetClass, invocation.arguments.types);
+    return callAttachType(invocation, type);
+  }
+
+  Expression callAttachType(Expression expression, DartType type) {
+    return new StaticInvocation(rtiLibrary.attachTypeFunction,
+        new Arguments(<Expression>[expression, createRuntimeType(type)]));
+  }
+
+  Expression createGetType(Expression receiver, {needsInterceptor: true}) {
+    if (receiver is ThisExpression || !needsInterceptor) {
+      return new PropertyGet(receiver, rtiLibrary.runtimeTypeName);
+    }
+    return new StaticInvocation(
+        rtiLibrary.interceptorFunction, new Arguments(<Expression>[receiver]));
+  }
+
+  Expression createGetTypeArguments(Expression typeObject) {
+    return new StaticInvocation(rtiLibrary.typeArgumentsFunction,
+        new Arguments(<Expression>[typeObject]));
+  }
+
+  // TODO(karlklose): consider adding a unique identifier for each test site.
+  /// `receiver.[subtypeTestName]([type])`
+  StaticInvocation createIsSubtypeOf(
+      Expression receiver, Expression typeExpression,
+      {targetHasTypeProperty: false}) {
+    Expression receiverType =
+        createGetType(receiver, needsInterceptor: !targetHasTypeProperty);
+    return new StaticInvocation(rtiLibrary.isSubtypeOfFunction,
+        new Arguments(<Expression>[receiverType, typeExpression]));
+  }
+
+  int getTypeVariableIndex(TypeParameter variable) {
+    Class c = getEnclosingClass(variable);
+    List<TypeParameter> variables = c.typeParameters;
+    for (int i = 0; i < variables.length; ++i) {
+      if (variables[i].name == variable.name) {
+        return i;
+      }
+    }
+    throw new Exception(
+        "Type variable $variable not found in enclosing class $c");
+  }
+
+  Expression createNewInterface(
+      Expression declaration, Expression typeArgumentList) {
+    List<Expression> arguments = <Expression>[declaration];
+    if (typeArgumentList != null) {
+      arguments.add(typeArgumentList);
+    }
+    return new ConstructorInvocation(
+        rtiLibrary.interfaceTypeConstructor, new Arguments(arguments));
+  }
+
+  /// Returns `true` if [types] is a list of [TypeParameterType]s that exactly
+  /// match the [TypeParameters] of the class they are defined in, i.e.,
+  ///   for all 0 <= i < cls.typeParameters.length.
+  ///     types[i].parameter == cls.typeParameters[i].
+  bool matchesTypeParameters(List<DartType> types) {
+    List<TypeParameter> parameters;
+    for (int i = 0; i < types.length; ++i) {
+      var type = types[i];
+      if (type is TypeParameterType) {
+        if (parameters == null) {
+          Class cls = getEnclosingClass(type.parameter);
+          parameters = cls.typeParameters;
+          if (parameters.length != types.length) return false;
+        }
+        if (type.parameter != parameters[i]) {
+          return false;
+        }
+      } else {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // TODO(karlklose): Refactor into visitor.
+  // TODO(karlklose): split this method in different strategies.
+  /// Creates an expression to represent a runtime type instance of type [type].
+  Expression createRuntimeType(DartType type,
+      {reifyTypeVariable: false,
+      Expression createReference(Class cls),
+      VariableDeclaration typeContext}) {
+    Expression buildReifiedTypeVariable(TypeParameterType type) {
+      Expression typeVariables = new PropertyGet(
+          createReference(type.parameter.parent),
+          rtiLibrary.variablesFieldName);
+      return createArrayAccess(
+          typeVariables, getTypeVariableIndex(type.parameter));
+    }
+
+    Expression buildDirectTypeVariableAccess(TypeParameterType variable) {
+      Class cls = getEnclosingClass(variable.parameter);
+      return extractTypeVariable(
+          cls,
+          variable.parameter,
+          getTypeVariableIndex(variable.parameter),
+          new VariableGet(typeContext));
+    }
+
+    Expression buildGetterTypeVariableAccess(TypeParameterType type) {
+      return new PropertyGet(
+          new ThisExpression(), typeVariableGetterName(type.parameter));
+    }
+
+    Expression buildTypeVariable(TypeParameterType type) {
+      if (reifyTypeVariable) {
+        assert(typeContext == null);
+        return buildReifiedTypeVariable(type);
+      } else if (typeContext != null) {
+        return buildDirectTypeVariableAccess(type);
+      } else {
+        return buildGetterTypeVariableAccess(type);
+      }
+    }
+
+    createReference ??= createAccessDeclaration;
+
+    /// Helper to make recursive invocation more readable.
+    Expression createPart(DartType type) {
+      return createRuntimeType(type,
+          reifyTypeVariable: reifyTypeVariable,
+          createReference: createReference,
+          typeContext: typeContext);
+    }
+
+    if (type is InterfaceType || type is Supertype) {
+      InterfaceType interfaceType = null;
+      if (type is InterfaceType) {
+        interfaceType = type;
+      } else {
+        interfaceType = (type as Supertype).asInterfaceType;
+      }
+      Class cls = interfaceType.classNode;
+      Expression declaration = createReference(cls);
+      List<DartType> typeArguments = interfaceType.typeArguments;
+      Expression typeArgumentList;
+      if (typeArguments.isNotEmpty) {
+        if (!reifyTypeVariable && matchesTypeParameters(typeArguments)) {
+          // The type argument list corresponds to the list of type parameters
+          // and we are not in "declaration emitter" mode, we can reuse the
+          // type argument vector.
+          TypeParameterType parameterType = typeArguments[0];
+          Class cls = parameterType.parameter.parent;
+          Expression typeObject = typeContext != null
+              ? new VariableGet(typeContext)
+              : createGetType(new ThisExpression());
+          typeArgumentList =
+              createGetTypeArguments(createCallAsInstanceOf(typeObject, cls));
+        } else {
+          typeArgumentList =
+              new ListLiteral(typeArguments.map(createPart).toList());
+        }
+      }
+      return createNewInterface(declaration, typeArgumentList);
+    } else if (type is DynamicType) {
+      return new ConstructorInvocation(
+          rtiLibrary.dynamicTypeConstructor, new Arguments([]),
+          isConst: true);
+    } else if (type is TypeParameterType) {
+      return buildTypeVariable(type);
+    } else if (type is FunctionType) {
+      FunctionType functionType = type;
+      Expression returnType = createPart(functionType.returnType);
+      List<Expression> encodedParameterTypes =
+          functionType.positionalParameters.map(createPart).toList();
+      List<NamedType> namedParameters = functionType.namedParameters;
+      int data;
+      if (namedParameters.isNotEmpty) {
+        for (NamedType param in namedParameters) {
+          encodedParameterTypes.add(new StringLiteral(param.name));
+          encodedParameterTypes.add(createPart(param.type));
+        }
+        data = functionType.namedParameters.length << 1 | 1;
+      } else {
+        data = (functionType.positionalParameters.length -
+                functionType.requiredParameterCount) <<
+            1;
+      }
+      Expression functionTypeExpression = new ConstructorInvocation(
+          rtiLibrary.interfaceTypeConstructor,
+          new Arguments(
+              <Expression>[createReference(coreTypes.functionClass)]));
+      Arguments arguments = new Arguments(<Expression>[
+        functionTypeExpression,
+        returnType,
+        new IntLiteral(data),
+        new ListLiteral(encodedParameterTypes)
+      ]);
+      return new ConstructorInvocation(
+          rtiLibrary.functionTypeConstructor, arguments);
+    } else if (type is VoidType) {
+      return new ConstructorInvocation(
+          rtiLibrary.voidTypeConstructor, new Arguments(<Expression>[]));
+    }
+    return new InvalidExpression();
+  }
+
+  Expression createCallAsInstanceOf(Expression receiver, Class cls) {
+    return new StaticInvocation(rtiLibrary.asInstanceOfFunction,
+        new Arguments(<Expression>[receiver, createAccessDeclaration(cls)]));
+  }
+
+  /// `get get$<variable-name> => <get-type>.arguments[<variable-index>]`
+  Member createTypeVariableGetter(
+      Class cls, TypeParameter variable, int index) {
+    Expression type = createGetType(new ThisExpression());
+    Expression argument = extractTypeVariable(cls, variable, index, type);
+    return new Procedure(
+        typeVariableGetterName(variable),
+        ProcedureKind.Getter,
+        new FunctionNode(new ReturnStatement(argument),
+            returnType: rtiLibrary.typeType),
+        fileUri: cls.fileUri);
+  }
+
+  Expression extractTypeVariable(
+      Class cls, TypeParameter variable, int index, Expression typeObject) {
+    Expression type = createCallAsInstanceOf(typeObject, cls);
+    Expression arguments = new StaticInvocation(
+        rtiLibrary.typeArgumentsFunction, new Arguments(<Expression>[type]));
+    // TODO(karlklose): use the global index instead of the local one.
+    return createArrayAccess(arguments, index);
+  }
+
+  void insertAsFirstArgument(Arguments arguments, Expression expression) {
+    expression.parent = arguments;
+    arguments.positional.insert(0, expression);
+  }
+
+  /// Creates a call to the `init` function that completes the definition of a
+  /// class by setting its (direct) supertypes.
+  Expression createCallInit(
+      VariableDeclaration declarations,
+      int index,
+      InterfaceType supertype,
+      List<InterfaceType> interfaces,
+      FunctionType callableType) {
+    /// Helper to create a reference to the declaration in the declaration
+    /// list instead of the field to avoid cycles if that field's
+    /// initialization depends on the class we are currently initializing.
+    Expression createReference(Class declaration) {
+      int id = reifiedClassIds[declaration];
+      return createArrayAccess(new VariableGet(declarations), id);
+    }
+
+    bool isNotMarkerInterface(InterfaceType interface) {
+      return interface.classNode != rtiLibrary.markerClass;
+    }
+
+    Expression createLocalType(DartType type) {
+      if (type == null) return null;
+      return createRuntimeType(type,
+          reifyTypeVariable: true, createReference: createReference);
+    }
+
+    Expression supertypeExpression =
+        supertype == null ? new NullLiteral() : createLocalType(supertype);
+
+    List<Expression> interfaceTypes = interfaces
+        .where(isNotMarkerInterface)
+        .map(createLocalType)
+        .toList(growable: false);
+
+    Expression callableTypeExpression = createLocalType(callableType);
+
+    List<Expression> arguments = <Expression>[
+      new VariableGet(declarations),
+      new IntLiteral(index),
+      supertypeExpression,
+    ];
+
+    if (interfaceTypes.isNotEmpty || callableTypeExpression != null) {
+      arguments.add(new ListLiteral(interfaceTypes));
+      if (callableTypeExpression != null) {
+        arguments.add(callableTypeExpression);
+      }
+    }
+
+    return new StaticInvocation(
+        rtiLibrary.initFunction, new Arguments(arguments));
+  }
+
+  Expression createDeclarationsInitializer() {
+    List<Statement> statements = <Statement>[];
+    // Call function to allocate the class declarations given the names and
+    // number of type variables of the classes.
+    Namer classNamer = new Namer();
+    List<Expression> names = <Expression>[];
+    List<Expression> parameterCount = <Expression>[];
+    reifiedClassIds.keys.forEach((Class c) {
+      names.add(new StringLiteral(classNamer.getNameFor(c)));
+      parameterCount.add(new IntLiteral(c.typeParameters.length));
+    });
+    Expression namesList = new ListLiteral(names);
+    Expression parameterCountList = new ListLiteral(parameterCount);
+    StaticInvocation callAllocate = new StaticInvocation(
+        rtiLibrary.allocateDeclarationsFunction,
+        new Arguments(<Expression>[namesList, parameterCountList]));
+
+    VariableDeclaration parameter =
+        new VariableDeclaration("d", type: declarationType);
+
+    reifiedClassIds.forEach((Class cls, int id) {
+      if (cls == rtiLibrary.markerClass) return;
+
+      // If the class declares a `call` method, translate the signature to a
+      // reified type.
+      FunctionType callableType;
+      Procedure call = cls.procedures.firstWhere(
+          (Procedure p) => p.name.name == "call",
+          orElse: () => null);
+      if (call != null) {
+        FunctionNode function = call.function;
+
+        final namedParameters = new List<NamedType>();
+        for (VariableDeclaration v in function.namedParameters) {
+          namedParameters.add(new NamedType(v.name, v.type));
+        }
+
+        List<DartType> positionalArguments = function.positionalParameters
+            .map((VariableDeclaration v) => v.type)
+            .toList();
+        callableType = new FunctionType(
+            positionalArguments, function.returnType,
+            namedParameters: namedParameters,
+            requiredParameterCount: function.requiredParameterCount);
+      }
+      statements.add(new ExpressionStatement(createCallInit(
+          parameter,
+          id,
+          cls.supertype?.asInterfaceType,
+          cls.implementedTypes.map((Supertype type) => type?.asInterfaceType),
+          callableType)));
+    });
+
+    statements.add(new ReturnStatement(new VariableGet(parameter)));
+
+    Expression function = new FunctionExpression(new FunctionNode(
+        new Block(statements),
+        positionalParameters: <VariableDeclaration>[parameter],
+        returnType: declarationType));
+
+    return new MethodInvocation(
+        function, new Name("call"), new Arguments(<Expression>[callAllocate]));
+  }
+
+  void createDeclarations() {
+    /// Recursively find all referenced classes in [type].
+    void collectNewReferencedClasses(DartType type, Set<Class> newClasses) {
+      if (type is InterfaceType || type is Supertype) {
+        InterfaceType interfaceType = null;
+        if (type is InterfaceType) {
+          interfaceType = type;
+        } else {
+          interfaceType = (type as Supertype).asInterfaceType;
+        }
+        Class cls = interfaceType.classNode;
+        if (!reifiedClassIds.containsKey(cls) && !newClasses.contains(cls)) {
+          newClasses.add(cls);
+        }
+
+        interfaceType.typeArguments.forEach((DartType argument) {
+          collectNewReferencedClasses(argument, newClasses);
+        });
+      }
+      // TODO(karlklose): function types
+    }
+
+    Iterable<Class> classes = reifiedClassIds.keys;
+    while (classes.isNotEmpty) {
+      Set<Class> newClasses = new Set<Class>();
+      for (Class c in classes) {
+        collectNewReferencedClasses(c.supertype?.asInterfaceType, newClasses);
+        c.implementedTypes.forEach((Supertype supertype) {
+          collectNewReferencedClasses(supertype?.asInterfaceType, newClasses);
+        });
+      }
+      for (Class newClass in newClasses) {
+        // Make sure that there is a declaration field for the class and its
+        // library's declaration list is setup.
+        addDeclaration(newClass);
+      }
+      classes = newClasses;
+    }
+    Expression initializer = createDeclarationsInitializer();
+    initializer.parent = declarations;
+    declarations.initializer = initializer;
+    declarations.type = declarationType;
+  }
+
+  Procedure createGetter(
+      Name name, Expression expression, Class cls, DartType type) {
+    return new Procedure(name, ProcedureKind.Getter,
+        new FunctionNode(new ReturnStatement(expression), returnType: type),
+        fileUri: cls.fileUri);
+  }
+}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart b/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart
new file mode 100644
index 0000000..aafff7d
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/transformation/remove_generics.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.transformation.remove_generics;
+
+import 'package:kernel/ast.dart';
+import 'transformer.dart';
+
+class Erasure extends Transformer with DartTypeVisitor<DartType> {
+  final ReifyVisitor reifyVisitor;
+
+  Erasure(this.reifyVisitor);
+
+  bool removeTypeParameters(Class cls) {
+    return reifyVisitor.needsTypeInformation(cls);
+  }
+
+  TreeNode removeTypeArgumentsOfConstructorCall(ConstructorInvocation node) {
+    Class cls = node.target.parent;
+    if (removeTypeParameters(cls)) {
+      node.arguments.types.clear();
+      Constructor target = node.target;
+      target.enclosingClass.typeParameters.clear();
+    }
+    return node;
+  }
+
+  TreeNode removeTypeArgumentsOfStaticCall(StaticInvocation node) {
+    Class cls = node.target.parent;
+    if (removeTypeParameters(cls)) {
+      node.arguments.types.clear();
+      Procedure target = node.target;
+      target.function.typeParameters.clear();
+    }
+    return node;
+  }
+
+  @override
+  defaultDartType(DartType type) => type;
+
+  @override
+  InterfaceType visitInterfaceType(InterfaceType type) {
+    if (removeTypeParameters(type.classNode)) {
+      return new InterfaceType(type.classNode, const <DartType>[]);
+    }
+    return type;
+  }
+
+  @override
+  Supertype visitSupertype(Supertype type) {
+    if (removeTypeParameters(type.classNode)) {
+      return new Supertype(type.classNode, const <DartType>[]);
+    }
+    return type;
+  }
+
+  @override
+  FunctionType visitFunctionType(FunctionType type) {
+    bool partHasChanged = false;
+
+    DartType translate(DartType type) {
+      DartType newType = type.accept(this);
+      if (newType != type) {
+        partHasChanged = true;
+        return newType;
+      } else {
+        return type;
+      }
+    }
+
+    DartType returnType = translate(type.returnType);
+    List<DartType> positionalTypes =
+        type.positionalParameters.map(translate).toList();
+    List<NamedType> namedParameters = new List<NamedType>();
+    for (NamedType param in type.namedParameters) {
+      namedParameters.add(new NamedType(param.name, translate(param.type)));
+    }
+    if (partHasChanged) {
+      return new FunctionType(positionalTypes, returnType,
+          namedParameters: namedParameters,
+          requiredParameterCount: type.requiredParameterCount);
+    } else {
+      return type;
+    }
+  }
+
+  @override
+  DynamicType visitTypeParameterType(_) => const DynamicType();
+
+  @override
+  DartType visitDartType(DartType type) {
+    return type.accept(this);
+  }
+
+  @override
+  StaticInvocation visitStaticInvocation(StaticInvocation node) {
+    node.transformChildren(this);
+    if (node.target.kind == ProcedureKind.Factory) {
+      node = removeTypeArgumentsOfStaticCall(node);
+    }
+    return node;
+  }
+
+  @override
+  ConstructorInvocation visitConstructorInvocation(ConstructorInvocation node) {
+    node.transformChildren(this);
+    return removeTypeArgumentsOfConstructorCall(node);
+  }
+
+  @override
+  Class visitClass(Class node) {
+    node.transformChildren(this);
+    if (removeTypeParameters(node)) {
+      node.typeParameters.clear();
+    }
+    return node;
+  }
+}
diff --git a/pkg/kernel/lib/transformations/reify/transformation/transformer.dart b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart
new file mode 100644
index 0000000..8672485
--- /dev/null
+++ b/pkg/kernel/lib/transformations/reify/transformation/transformer.dart
@@ -0,0 +1,575 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.transformation.transformer;
+
+import '../analysis/program_analysis.dart';
+import 'package:kernel/ast.dart';
+import 'binding.dart' show RuntimeLibrary;
+import 'builder.dart' show RuntimeTypeSupportBuilder;
+import 'dart:collection' show LinkedHashMap;
+import '../asts.dart';
+
+export 'binding.dart' show RuntimeLibrary;
+export 'builder.dart' show RuntimeTypeSupportBuilder;
+
+enum RuntimeTypeStorage {
+  none,
+  inheritedField,
+  field,
+  getter,
+}
+
+class TransformationContext {
+  /// Describes how the runtime type is stored on the object.
+  RuntimeTypeStorage runtimeTypeStorage;
+
+  /// Field added to store the runtime type if [runtimeType] is
+  /// [RuntimeTypeStorage.field].
+  Field runtimeTypeField;
+
+  /// The parameter for the type information introduced to the constructor or
+  /// to static initializers.
+  VariableDeclaration parameter;
+
+  /// A ordered collection of fields together with their initializers rewritten
+  /// to static initializer functions that can be used in the constructor's
+  /// initializer list.
+  /// The order is important because of possible side-effects in the
+  /// initializers.
+  LinkedHashMap<Field, Procedure> initializers;
+
+  // `true` if the visitor currently is in a field initializer, a initializer
+  // list of a constructor, or the body of a factory method. In these cases,
+  // type argument access is different than in an instance context, since `this`
+  // is not available.
+  bool inInitializer = false;
+
+  String toString() => "s: ${runtimeTypeStorage} f: $runtimeTypeField,"
+      " p: $parameter, i: $inInitializer";
+}
+
+abstract class DebugTrace {
+  static const bool debugTrace = false;
+
+  static const int lineLength = 80;
+
+  TransformationContext get context;
+
+  String getNodeLevel(TreeNode node) {
+    String level = "";
+    while (node != null && node is! Library) {
+      level = " $level";
+      node = node.parent;
+    }
+    return level;
+  }
+
+  String shorten(String s) {
+    return s.length > lineLength ? s.substring(0, lineLength) : s;
+  }
+
+  void trace(TreeNode node) {
+    if (debugTrace) {
+      String nodeText = node.toString().replaceAll("\n", " ");
+      print(shorten("trace:${getNodeLevel(node)}$context"
+          " [${node.runtimeType}] $nodeText"));
+    }
+  }
+}
+
+/// Rewrites a tree to remove generic types and runtime type checks and replace
+/// them with Dart objects.
+///
+/// Runtime types are stored in a field/getter called [runtimeTypeName] on the
+/// object, which for parameterized classes is initialized in the constructor.
+//  TODO(karlklose):
+//  - add a scoped namer
+//  - rewrite types (supertypes, implemented types)
+//  - rewrite as
+class ReifyVisitor extends Transformer with DebugTrace {
+  final RuntimeLibrary rtiLibrary;
+  final RuntimeTypeSupportBuilder builder;
+  final ProgramKnowledge knowledge;
+
+  ReifyVisitor(this.rtiLibrary, this.builder, this.knowledge,
+      [this.libraryToTransform]);
+
+  /// If not null, the transformation will only be applied to classes declared
+  /// in this library.
+  final Library libraryToTransform;
+
+  // TODO(karlklose): find a way to get rid of this state in the visitor.
+  TransformationContext context;
+
+  bool libraryShouldBeTransformed(Library library) {
+    return libraryToTransform == null || libraryToTransform == library;
+  }
+
+  bool needsTypeInformation(Class cls) {
+    return !isObject(cls) &&
+        !rtiLibrary.contains(cls) &&
+        libraryShouldBeTransformed(cls.enclosingLibrary);
+  }
+
+  bool usesTypeGetter(Class cls) {
+    return cls.typeParameters.isEmpty;
+  }
+
+  bool isObject(Class cls) {
+    // TODO(karlklose): use [CoreTypes].
+    return "$cls" == 'dart.core::Object';
+  }
+
+  Initializer addTypeAsArgument(initializer) {
+    assert(initializer is SuperInitializer ||
+        initializer is RedirectingInitializer);
+    Class cls = getEnclosingClass(initializer.target);
+    if (needsTypeInformation(cls) && !usesTypeGetter(cls)) {
+      // If the current class uses a getter for type information, we did not add
+      // a parameter to the constructor, but we can pass `null` as the value to
+      // initialize the type field, since it will be shadowed by the getter.
+      Expression type = (context.parameter != null)
+          ? new VariableGet(context.parameter)
+          : new NullLiteral();
+      builder.insertAsFirstArgument(initializer.arguments, type);
+    }
+    return initializer;
+  }
+
+  Expression interceptInstantiation(
+      InvocationExpression invocation, Member target) {
+    Class targetClass = target.parent;
+    Library targetLibrary = targetClass.parent;
+    Library currentLibrary = getEnclosingLibrary(invocation);
+    if (libraryShouldBeTransformed(currentLibrary) &&
+        !libraryShouldBeTransformed(targetLibrary) &&
+        !rtiLibrary.contains(target)) {
+      return builder.attachTypeToConstructorInvocation(invocation, target);
+    }
+    return invocation;
+  }
+
+  Expression createRuntimeType(DartType type) {
+    if (context?.inInitializer == true) {
+      // In initializer context, the instance type is provided in
+      // `context.parameter` as there is no `this`.
+      return builder.createRuntimeType(type, typeContext: context.parameter);
+    } else {
+      return builder.createRuntimeType(type);
+    }
+  }
+
+  TreeNode defaultTreeNode(TreeNode node) {
+    trace(node);
+    return super.defaultTreeNode(node);
+  }
+
+  Expression visitStaticInvocation(StaticInvocation invocation) {
+    trace(invocation);
+
+    invocation.transformChildren(this);
+
+    Procedure target = invocation.target;
+    if (target == rtiLibrary.reifyFunction) {
+      /// Rewrite calls to reify(TypeLiteral) to a reified type.
+      TypeLiteral literal = invocation.arguments.positional.single;
+      return createRuntimeType(literal.type);
+    } else if (target.kind == ProcedureKind.Factory) {
+      // Intercept calls to factories of classes we do not transform
+      return interceptInstantiation(invocation, target);
+    }
+    return invocation;
+  }
+
+  Library visitLibrary(Library library) {
+    trace(library);
+
+    if (libraryShouldBeTransformed(library)) {
+      library.transformChildren(this);
+    }
+    return library;
+  }
+
+  Expression visitConstructorInvocation(ConstructorInvocation invocation) {
+    invocation.transformChildren(this);
+    return interceptInstantiation(invocation, invocation.target);
+  }
+
+  Member getStaticInvocationTarget(InvocationExpression invocation) {
+    if (invocation is ConstructorInvocation) {
+      return invocation.target;
+    } else if (invocation is StaticInvocation) {
+      return invocation.target;
+    } else {
+      throw "Unexpected InvocationExpression $invocation.";
+    }
+  }
+
+  bool isInstantiation(TreeNode invocation) {
+    return invocation is ConstructorInvocation ||
+        invocation is StaticInvocation &&
+            invocation.target.kind == ProcedureKind.Factory;
+  }
+
+  bool isTypeVariable(DartType type) => type is TypeParameterType;
+
+  /// Add the runtime type as an extra argument to constructor invocations.
+  Arguments visitArguments(Arguments arguments) {
+    trace(arguments);
+
+    arguments.transformChildren(this);
+    TreeNode parent = arguments.parent;
+    if (isInstantiation(parent)) {
+      Class targetClass = getEnclosingClass(getStaticInvocationTarget(parent));
+      // Do not add the extra argument if the class does not need a type member
+      // or if it can be implemented as a getter.
+      if (!needsTypeInformation(targetClass) || usesTypeGetter(targetClass)) {
+        return arguments;
+      }
+
+      List<DartType> typeArguments = arguments.types;
+
+      Expression type =
+          createRuntimeType(new InterfaceType(targetClass, typeArguments));
+
+      builder.insertAsFirstArgument(arguments, type);
+    }
+    return arguments;
+  }
+
+  Field visitField(Field field) {
+    trace(field);
+
+    visitDartType(field.type);
+    for (Expression annotation in field.annotations) {
+      annotation.accept(this);
+    }
+    // Do not visit initializers, they have already been transformed when the
+    // class was handled.
+    return field;
+  }
+
+  /// Go through all initializers of fields and record a static initializer
+  /// function, if necessary.
+  void rewriteFieldInitializers(Class cls) {
+    assert(context != null);
+    context.initializers = new LinkedHashMap<Field, Procedure>();
+    List<Field> fields = cls.fields;
+    bool initializerRewritten = false;
+    for (Field field in fields) {
+      if (!initializerRewritten && knowledge.usedParameters(field).isEmpty) {
+        // This field needs no static initializer.
+        continue;
+      }
+
+      Expression initializer = field.initializer;
+      if (initializer == null || field.isStatic) continue;
+      // Declare a new variable that holds the type information and can be
+      // used to access type variables in initializer context.
+      // TODO(karlklose): some fields do not need the parameter.
+      VariableDeclaration typeObject = new VariableDeclaration(r"$type");
+      context.parameter = typeObject;
+      context.inInitializer = true;
+      // Translate the initializer while keeping track of whether there was
+      // already an initializers that required type information in
+      // [typeVariableUsedInInitializer].
+      initializer = initializer.accept(this);
+      context.parameter = null;
+      context.inInitializer = false;
+      // Create a static initializer function from the translated initializer
+      // expression and record it.
+      Name name = new Name("\$init\$${field.name.name}");
+      Statement body = new ReturnStatement(initializer);
+      Procedure staticInitializer = new Procedure(
+          name,
+          ProcedureKind.Method,
+          new FunctionNode(body,
+              positionalParameters: <VariableDeclaration>[typeObject]),
+          isStatic: true,
+          fileUri: cls.fileUri);
+      context.initializers[field] = staticInitializer;
+      // Finally, remove the initializer from the field.
+      field.initializer = null;
+    }
+  }
+
+  bool inheritsTypeProperty(Class cls) {
+    assert(needsTypeInformation(cls));
+    Class superclass = cls.superclass;
+    return needsTypeInformation(superclass);
+  }
+
+  Class visitClass(Class cls) {
+    trace(cls);
+
+    if (needsTypeInformation(cls)) {
+      context = new TransformationContext();
+      List<TypeParameter> typeParameters = cls.typeParameters;
+      if (usesTypeGetter(cls)) {
+        assert(typeParameters.isEmpty);
+        context.runtimeTypeStorage = RuntimeTypeStorage.getter;
+        Member getter = builder.createGetter(rtiLibrary.runtimeTypeName,
+            createRuntimeType(cls.rawType), cls, rtiLibrary.typeType);
+        cls.addMember(getter);
+      } else if (!inheritsTypeProperty(cls)) {
+        context.runtimeTypeStorage = RuntimeTypeStorage.field;
+        // TODO(karlklose): should we add the field to [Object]?
+        context.runtimeTypeField = new Field(rtiLibrary.runtimeTypeName,
+            fileUri: cls.fileUri, isFinal: true, type: rtiLibrary.typeType);
+        cls.addMember(context.runtimeTypeField);
+      } else {
+        context.runtimeTypeStorage = RuntimeTypeStorage.inheritedField;
+      }
+
+      for (int i = 0; i < typeParameters.length; ++i) {
+        TypeParameter variable = typeParameters[i];
+        cls.addMember(builder.createTypeVariableGetter(cls, variable, i));
+      }
+
+      // Tag the class as supporting the runtime type getter.
+      InterfaceType interfaceTypeForSupertype =
+          new InterfaceType(rtiLibrary.markerClass);
+      cls.implementedTypes.add(new Supertype(
+          interfaceTypeForSupertype.classNode,
+          interfaceTypeForSupertype.typeArguments));
+
+      // Before transforming the parts of the class declaration, rewrite field
+      // initializers that use type variables (or that would be called after one
+      // that does) to static functions that can be used from constructors.
+      rewriteFieldInitializers(cls);
+
+      // Add properties for declaration tests.
+      for (Class test in knowledge.classTests) {
+        if (test == rtiLibrary.markerClass) continue;
+
+        Procedure tag = builder.createGetter(
+            builder.getTypeTestTagName(test),
+            new BoolLiteral(isSuperClass(test, cls)),
+            cls,
+            builder.coreTypes.boolClass.rawType);
+        cls.addMember(tag);
+      }
+
+      // Add a runtimeType getter.
+      if (!usesTypeGetter(cls) && !inheritsTypeProperty(cls)) {
+        cls.addMember(new Procedure(
+            new Name("runtimeType"),
+            ProcedureKind.Getter,
+            new FunctionNode(
+                new ReturnStatement(new DirectPropertyGet(
+                    new ThisExpression(), context.runtimeTypeField)),
+                returnType: builder.coreTypes.typeClass.rawType),
+            fileUri: cls.fileUri));
+      }
+    }
+
+    cls.transformChildren(this);
+
+    // Add the static initializer functions. They have already been transformed.
+    if (context?.initializers != null) {
+      context.initializers.forEach((_, Procedure initializer) {
+        cls.addMember(initializer);
+      });
+    }
+
+    // TODO(karlklose): clear type arguments later, the order of class
+    // transformations otherwise influences the result.
+    // cls.typeParameters.clear();
+    context = null;
+    return cls;
+  }
+
+  // TODO(karlklose): replace with a structure that can answer also the question
+  // which tags must be overriden due to different values.
+  /// Returns `true` if [a] is a declaration used in a supertype of [b].
+  bool isSuperClass(Class a, Class b) {
+    if (b == null) return false;
+    if (a == b) return true;
+
+    if (isSuperClass(a, b.superclass)) {
+      return true;
+    }
+
+    Iterable<Class> interfaceClasses = b.implementedTypes
+        .map((Supertype type) => type.classNode)
+        .where((Class cls) => cls != rtiLibrary.markerClass);
+    return interfaceClasses
+        .any((Class declaration) => isSuperClass(a, declaration));
+  }
+
+  bool isConstructorOrFactory(TreeNode node) {
+    return isFactory(node) || node is Constructor;
+  }
+
+  bool isFactory(TreeNode node) {
+    return node is Procedure && node.kind == ProcedureKind.Factory;
+  }
+
+  bool needsParameterForRuntimeType(TreeNode node) {
+    if (!isConstructorOrFactory(node)) return false;
+
+    RuntimeTypeStorage access = context.runtimeTypeStorage;
+    assert(access != RuntimeTypeStorage.none);
+    return access == RuntimeTypeStorage.field ||
+        access == RuntimeTypeStorage.inheritedField;
+  }
+
+  FunctionNode visitFunctionNode(FunctionNode node) {
+    trace(node);
+
+    // If we have a [TransformationContext] with a runtime type field and we
+    // translate a constructor or factory, we need a parameter that the code of
+    // initializers or the factory body can use to access type arguments.
+    // The parameter field in the context will be reset in the visit-method of
+    // the parent.
+    if (context != null && needsParameterForRuntimeType(node.parent)) {
+      assert(context.parameter == null);
+      // Create the parameter and insert it as the function's first parameter.
+      context.parameter = new VariableDeclaration(
+          rtiLibrary.runtimeTypeName.name,
+          type: rtiLibrary.typeType);
+      context.parameter.parent = node;
+      node.positionalParameters.insert(0, context.parameter);
+      node.requiredParameterCount++;
+    }
+    node.transformChildren(this);
+    return node;
+  }
+
+  SuperInitializer visitSuperInitializer(SuperInitializer initializer) {
+    initializer.transformChildren(this);
+    return addTypeAsArgument(initializer);
+  }
+
+  RedirectingInitializer visitRedirectingInitializer(
+      RedirectingInitializer initializer) {
+    initializer.transformChildren(this);
+    return addTypeAsArgument(initializer);
+  }
+
+  Procedure visitProcedure(Procedure procedure) {
+    trace(procedure);
+
+    transformList(procedure.annotations, this, procedure.parent);
+    // Visit the function body in a initializing context, if it is a factory.
+    context?.inInitializer = isFactory(procedure);
+    procedure.function?.accept(this);
+    context?.inInitializer = false;
+
+    context?.parameter = null;
+    return procedure;
+  }
+
+  Constructor visitConstructor(Constructor constructor) {
+    trace(constructor);
+
+    transformList(constructor.annotations, this, constructor);
+    if (constructor.function != null) {
+      constructor.function = constructor.function.accept(this);
+      constructor.function?.parent = constructor;
+    }
+
+    context?.inInitializer = true;
+    transformList(constructor.initializers, this, constructor);
+    context?.inInitializer = false;
+
+    if (context != null) {
+      if (context.runtimeTypeStorage == RuntimeTypeStorage.field) {
+        // Initialize the runtime type field with value given in the additional
+        // constructor parameter.
+        assert(context.parameter != null);
+        Initializer initializer = new FieldInitializer(
+            context.runtimeTypeField, new VariableGet(context.parameter));
+        initializer.parent = constructor;
+        constructor.initializers.insert(0, initializer);
+      }
+      if (context.initializers != null) {
+        // For each field that needed a static initializer function, initialize
+        // the field by calling the function.
+        List<Initializer> fieldInitializers = <Initializer>[];
+        context.initializers.forEach((Field field, Procedure initializer) {
+          assert(context.parameter != null);
+          Arguments argument =
+              new Arguments(<Expression>[new VariableGet(context.parameter)]);
+          fieldInitializers.add(new FieldInitializer(
+              field, new StaticInvocation(initializer, argument)));
+        });
+        constructor.initializers.insertAll(0, fieldInitializers);
+      }
+      context.parameter = null;
+    }
+
+    return constructor;
+  }
+
+  /// Returns `true` if the given type can be tested using type test tags.
+  ///
+  /// This implies that there are no subtypes of the [type] that are not
+  /// transformed.
+  bool typeSupportsTagTest(InterfaceType type) {
+    return needsTypeInformation(type.classNode);
+  }
+
+  Expression visitIsExpression(IsExpression expression) {
+    trace(expression);
+
+    expression.transformChildren(this);
+
+    if (getEnclosingLibrary(expression) == rtiLibrary.interceptorsLibrary) {
+      // In the interceptor library we need actual is-checks at the moment.
+      return expression;
+    }
+
+    Expression target = expression.operand;
+    DartType type = expression.type;
+
+    if (type is InterfaceType && typeSupportsTagTest(type)) {
+      assert(knowledge.classTests.contains(type.classNode));
+      bool checkArguments =
+          type.typeArguments.any((DartType type) => type is! DynamicType);
+      Class declaration = type.classNode;
+      VariableDeclaration typeExpression =
+          new VariableDeclaration(null, initializer: createRuntimeType(type));
+      VariableDeclaration targetValue =
+          new VariableDeclaration(null, initializer: target);
+      Expression markerClassTest = new IsExpression(
+          new VariableGet(targetValue), rtiLibrary.markerClass.rawType);
+      Expression tagCheck = new PropertyGet(new VariableGet(targetValue),
+          builder.getTypeTestTagName(declaration));
+      Expression check = new LogicalExpression(markerClassTest, "&&", tagCheck);
+      if (checkArguments) {
+        // TODO(karlklose): support a direct argument check, we already checked
+        // the declaration.
+        Expression uninterceptedCheck = new Let(
+            typeExpression,
+            builder.createIsSubtypeOf(
+                new VariableGet(targetValue), new VariableGet(typeExpression),
+                targetHasTypeProperty: true));
+        check = new LogicalExpression(check, "&&", uninterceptedCheck);
+      }
+      return new Let(targetValue, check);
+    } else {
+      return builder.createIsSubtypeOf(target, createRuntimeType(type));
+    }
+  }
+
+  Expression visitListLiteral(ListLiteral node) {
+    trace(node);
+    node.transformChildren(this);
+    return builder.callAttachType(
+        node,
+        new InterfaceType(
+            builder.coreTypes.listClass, <DartType>[node.typeArgument]));
+  }
+
+  Expression visitMapLiteral(MapLiteral node) {
+    trace(node);
+    node.transformChildren(this);
+    return builder.callAttachType(
+        node,
+        new InterfaceType(builder.coreTypes.mapClass,
+            <DartType>[node.keyType, node.valueType]));
+  }
+}
diff --git a/pkg/kernel/runtime/reify/README.md b/pkg/kernel/runtime/reify/README.md
new file mode 100644
index 0000000..d3371fb
--- /dev/null
+++ b/pkg/kernel/runtime/reify/README.md
@@ -0,0 +1,14 @@
+<!--
+Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+for details. All rights reserved. Use of this source code is governed by a
+BSD-style license that can be found in the LICENSE file.
+-->
+# Runtime Support for Reified Generic Types
+
+This subdirectory contains files used at runtime by the code generated by
+[../reify_transformer.dart].
+
+The files in this directory can be imported by anyone, but files in this
+directory should be frugal about importing anything themselves. This is because
+this library is used by all programs that are tranformed and contributes to
+code size.
diff --git a/pkg/kernel/runtime/reify/declarations.dart b/pkg/kernel/runtime/reify/declarations.dart
new file mode 100644
index 0000000..7aeb474
--- /dev/null
+++ b/pkg/kernel/runtime/reify/declarations.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.runtime.declarations;
+
+import 'types.dart' show FunctionType, Interface, ReifiedType, TypeVariable;
+
+typedef String Id2String(Object id);
+
+/// Represents a class.
+///
+/// There's one instance of this class for each class in the program.
+///
+/// Note: not all classes can be represented as a compile-time constants. For
+/// example, most core classes, such as, `String`, `int`, and `double`
+/// implement `Comparable` in a way that cannot be expressed as a constant.
+class Class {
+  final id;
+
+  Interface supertype;
+
+  FunctionType callableType;
+
+  final List<TypeVariable> variables;
+
+  List<Interface> interfaces;
+
+  static Id2String debugId2String;
+
+  Class(this.id, this.supertype,
+      {this.callableType,
+      this.variables: const <TypeVariable>[],
+      this.interfaces /* set in init */});
+
+  Interface get thisType {
+    return new Interface(this, variables);
+  }
+
+  String get name => debugId2String == null ? "$id" : debugId2String(id);
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("class $name");
+    if (variables.isNotEmpty) {
+      sb.write("<");
+      bool first = true;
+      for (TypeVariable tv in variables) {
+        if (!first) {
+          sb.write(", ");
+        }
+        sb.write(tv);
+        sb.write(" extends ");
+        sb.write(tv.bound);
+      }
+      sb.write(">");
+    }
+    if (supertype != null) {
+      sb.write(" extends $supertype");
+    }
+    if (interfaces.isNotEmpty) {
+      sb.write(" implements ");
+      sb.writeAll(interfaces, ", ");
+    }
+    return "$sb";
+  }
+}
+
+/// Allocates a (non-growable) list of [amount] class declarations with ids `0`
+/// to `amount - 1`. This function is called from the generated code that
+/// initializes the type information.
+List<Class> allocateDeclarations(List<String> names, List<int> typeParameters) {
+  List<TypeVariable> allocateVariables(int amount) {
+    if (amount == 0) return const <TypeVariable>[];
+    return new List<TypeVariable>.generate(
+        amount, (int i) => new TypeVariable(i),
+        growable: false);
+  }
+
+  return new List<Class>.generate(
+      names.length,
+      (int i) => new Class(names[i], null,
+          variables: allocateVariables(typeParameters[i])),
+      growable: false);
+}
+
+/// Initializes the supertype and interfaces of `classes[index]`.
+/// This function is called from generated code.
+void init(List<Class> classes, int index, ReifiedType supertype,
+    [List<Interface> interfaces = const <Interface>[],
+    FunctionType callableType]) {
+  Class declaration = classes[index];
+  assert(supertype == null);
+  declaration.supertype = supertype;
+  assert(interfaces == null);
+  declaration.interfaces = interfaces;
+  declaration.callableType = callableType;
+}
diff --git a/pkg/kernel/runtime/reify/interceptors.dart b/pkg/kernel/runtime/reify/interceptors.dart
new file mode 100644
index 0000000..af4368d
--- /dev/null
+++ b/pkg/kernel/runtime/reify/interceptors.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library kernel.transformations.reify.runtime.interceptors;
+
+import 'types.dart' show ReifiedType;
+
+/// Helper method that generates a [ReifiedType] corresponding to the literal
+/// type [type].
+///
+/// Calls to this method are recognized in the transformation and replaced by
+/// code that constructs the correct type.
+ReifiedType reify(Type type) {
+  throw "This method should never be called in translated code";
+}
+
+/// Marker interface to indicate that we can extract the runtime type using
+/// a property getter.
+abstract class HasRuntimeTypeGetter {
+  ReifiedType get $type;
+}
+
+/// Interceptor to safely access the type of an object.
+///
+/// For native objects that do not have the `$type` field on them, the
+/// interceptor directly returns the type, otherwise the value of the field is
+/// returned.
+ReifiedType type(dynamic o) {
+  if (o == null) {
+    return reify(Null);
+  } else if (o is HasRuntimeTypeGetter) {
+    return o.$type;
+  } else if (o is bool) {
+    return reify(bool);
+  } else if (o is String) {
+    return reify(String);
+  } else if (o is int) {
+    return reify(int);
+  } else if (o is double) {
+    return reify(double);
+  } else if (o is Type) {
+    return reify(Type);
+  } else if (o is AbstractClassInstantiationError) {
+    return reify(AbstractClassInstantiationError);
+  } else if (o is NoSuchMethodError) {
+    return reify(NoSuchMethodError);
+  } else if (o is CyclicInitializationError) {
+    return reify(CyclicInitializationError);
+  } else if (o is UnsupportedError) {
+    return reify(UnsupportedError);
+  } else if (o is IntegerDivisionByZeroException) {
+    return reify(IntegerDivisionByZeroException);
+  } else if (o is RangeError) {
+    return reify(RangeError);
+  } else if (o is ArgumentError) {
+    return reify(ArgumentError);
+  }
+  ReifiedType type = _type[o];
+  if (type != null) {
+    return type;
+  }
+  throw 'Unable to get runtime type of ${o.runtimeType}';
+}
+
+// This constructor call is not intercepted with [attachType] since the runtime
+// library is currently never transformed.
+final Expando _type = new Expando();
+
+dynamic attachType(Object o, ReifiedType t) {
+  _type[o] = t;
+  return o;
+}
diff --git a/pkg/kernel/runtime/reify/types.dart b/pkg/kernel/runtime/reify/types.dart
new file mode 100644
index 0000000..630ca7d
--- /dev/null
+++ b/pkg/kernel/runtime/reify/types.dart
@@ -0,0 +1,678 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Notation:
+///
+/// * `[[T]]` is the runtime representation of type `T` (that is, `T` reified).
+library kernel.transformations.reify.runtime.types;
+
+import 'declarations.dart' show Class;
+
+export 'declarations.dart';
+
+export 'interceptors.dart';
+
+// The public interface of this library are static functions to access parts of
+// reified type objects and the constructors on the ReifiedType subclasses.
+
+bool isSubtypeOf(ReifiedType a, ReifiedType b) => a._isSubtypeOf(b);
+
+bool isMoreSpecificThan(ReifiedType a, ReifiedType b) {
+  return a._isMoreSpecificThan(b);
+}
+
+Kind getKind(ReifiedType type) => type._kind;
+
+ReifiedType asInstanceOf(Interface type, Class declaration) {
+  return type.asInstanceOf(declaration);
+}
+
+List<ReifiedType> getTypeArguments(Interface type) => type._typeArguments;
+
+bool isDynamic(ReifiedType type) => type._isDynamic;
+
+bool isFunction(ReifiedType type) => type._isFunction;
+
+bool isInterface(ReifiedType type) => type._isInterface;
+
+bool isIntersection(ReifiedType type) => type._isIntersection;
+
+bool isVariable(ReifiedType type) => type._isVariable;
+
+bool isVoid(ReifiedType type) => type._isVoid;
+
+bool isObject(ReifiedType type) => false;
+
+ReifiedType getSupertype(var type) => type._supertype;
+
+Iterable<ReifiedType> getInterfaces(Interface type) => type._interfaces;
+
+ReifiedType subst(ReifiedType type, List<ReifiedType> arguments,
+    List<ReifiedType> parameters) {
+  return type._subst(arguments, parameters);
+}
+
+// TODO(ahe): Do we need ReifiedNullType?
+
+ReifiedType _intersection(ReifiedType a, ReifiedType b) {
+  if (a == null) return b;
+  if (b == null) return a;
+  if (a == b) return a;
+  return new Intersection(a, b);
+}
+
+enum Kind {
+  Bottom,
+  Dynamic,
+  Function,
+  Interface,
+  Intersection,
+  Variable,
+  Void,
+}
+
+abstract class ReifiedType {
+  // TODO(ahe): Should this be a getter to save memory? Which is faster?
+  final Kind _kind;
+
+  const ReifiedType(this._kind);
+
+  bool get _isDynamic => _kind == Kind.Dynamic;
+
+  bool get _isFunction => _kind == Kind.Function;
+
+  bool get _isInterface => _kind == Kind.Interface;
+
+  bool get _isIntersection => _kind == Kind.Intersection;
+
+  bool get _isVariable => _kind == Kind.Variable;
+
+  bool get _isVoid => _kind == Kind.Void;
+
+  bool get _isObject => false;
+
+  /// Returns true if [this] is more specific than [type].
+  bool _isMoreSpecificThan(ReifiedType type);
+
+  /// Performs the substitution `[arguments[i]/parameters[i]]this`.
+  ///
+  /// The notation is known from this lambda calculus rule:
+  ///
+  ///     (lambda x.e0)e1 -> [e1/x]e0.
+  ///
+  /// Invariant: There must be the same number of [arguments] and [parameters].
+  ReifiedType _subst(List<ReifiedType> arguments, List<ReifiedType> parameters);
+
+  /// Returns true if [this] is a subtype of [type].
+  bool _isSubtypeOf(ReifiedType type) {
+    return _subst(const <ReifiedType>[const Bottom()],
+        const <ReifiedType>[const Dynamic()])._isMoreSpecificThan(type);
+  }
+
+  bool _isAssignableTo(ReifiedType type) {
+    if (type._isDynamic) return true;
+    return this._isSubtypeOf(type) || type._isSubtypeOf(this);
+  }
+}
+
+/// Represents the type `dynamic`.
+class Dynamic extends ReifiedType {
+  const Dynamic() : super(Kind.Dynamic);
+
+  bool _isMoreSpecificThan(ReifiedType type) => type._isDynamic;
+
+  ReifiedType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    int index = 0;
+    for (ReifiedType parameter in parameters) {
+      if (parameter._isDynamic) return arguments[index];
+      index++;
+    }
+    return this;
+  }
+
+  String toString() => "dynamic";
+}
+
+/// Represents the bottom type.
+class Bottom extends ReifiedType {
+  const Bottom() : super(Kind.Bottom);
+
+  bool _isMoreSpecificThan(ReifiedType type) => true;
+
+  ReifiedType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    return this;
+  }
+
+  String toString() => "<bottom>";
+}
+
+/// Represents the type `void`.
+class Void extends ReifiedType {
+  const Void() : super(Kind.Void);
+
+  bool _isMoreSpecificThan(ReifiedType type) {
+    // `void` isn't more specific than anything but itself.
+    return type._isVoid;
+  }
+
+  bool _isSubtypeOf(ReifiedType type) {
+    // `void` isn't the subtype of anything besides `dynamic` and itself.
+    return type._isVoid || type._isDynamic;
+  }
+
+  ReifiedType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    return this;
+  }
+
+  String toString() => "void";
+}
+
+/// Represents an interface type. That is, the type of any class.
+///
+/// For example, the type
+///
+///     String
+///
+/// Would be represented as:
+///
+///    new Interface(stringDeclaration);
+///
+/// Where `stringDeclaration` is an instance of [Class] which contains
+/// information about [String]'s supertype and implemented interfaces.
+///
+/// A parameterized type, for example:
+///
+///     Box<int>
+///
+/// Would be represented as:
+///
+///     new Interface(boxDeclaration,
+///         [new Interface(intDeclaration)]);
+///
+/// Implementation notes and considerations:
+///
+/// * It's possible that we want to split this class in two to save memory: one
+///   for non-generic classes and one for generic classes. Only the latter
+///   would need [_typeArguments]. However, this must be weighed against the
+///   additional polymorphism.
+/// * Generally, we don't canonicalize types. However, simple types like `new
+///   Interface(intDeclaration)` should be canonicalized to save
+///   memory. Precisely how this canonicalization will happen is TBD, but it
+///   may simply be by using compile-time constants.
+class Interface extends ReifiedType implements Type {
+  final Class _declaration;
+
+  final List<ReifiedType> _typeArguments;
+
+  const Interface(this._declaration,
+      [this._typeArguments = const <ReifiedType>[]])
+      : super(Kind.Interface);
+
+  bool get _isObject => _declaration.supertype == null;
+
+  Interface get _supertype {
+    return _declaration.supertype
+        ?._subst(_typeArguments, _declaration.variables);
+  }
+
+  Iterable<Interface> get _interfaces {
+    return _declaration.interfaces.map((Interface type) {
+      return type._subst(_typeArguments, _declaration.variables);
+    });
+  }
+
+  FunctionType get _callableType {
+    return _declaration.callableType
+        ?._subst(_typeArguments, _declaration.variables);
+  }
+
+  bool _isMoreSpecificThan(ReifiedType type) {
+    if (type._isDynamic) return true;
+    // Intersection types can only occur as the result of calling
+    // [asInstanceOf], they should never be passed in to this method.
+    assert(!type._isIntersection);
+    if (type._isFunction) {
+      return _callableType?._isMoreSpecificThan(type) ?? false;
+    }
+    if (!type._isInterface) return false;
+    if (this == type) return true;
+    ReifiedType supertype = asInstanceOfType(type);
+    if (supertype == null) {
+      // Special case: A callable class is a subtype of [Function], regardless
+      // if it implements [Function]. It isn't more specific than
+      // [Function]. The type representing [Function] is the supertype of
+      // `declaration.callableType`.
+      return _declaration.callableType?._supertype?._isSubtypeOf(type) ?? false;
+    }
+    if (type == supertype) return true;
+    switch (supertype._kind) {
+      case Kind.Dynamic:
+      case Kind.Variable:
+        // Shouldn't happen. See switch in [asInstanceOf].
+        throw "internal error: $supertype";
+
+      case Kind.Interface:
+        Interface s = supertype;
+        Interface t = type;
+        for (int i = 0; i < s._typeArguments.length; i++) {
+          if (!s._typeArguments[i]._isMoreSpecificThan(t._typeArguments[i])) {
+            return false;
+          }
+        }
+        return true;
+
+      case Kind.Intersection:
+        return supertype._isMoreSpecificThan(type);
+
+      default:
+        throw "Internal error: unhandled kind '${type._kind}'";
+    }
+  }
+
+  bool _isSubtypeOf(ReifiedType type) {
+    if (type._isInterface) {
+      Interface interface = type;
+      if (interface._declaration != this._declaration) {
+        // This addition to the specified rules allows us to handle cases like
+        //     class D extends A<dynamic> {}
+        //     new D() is A<A>
+        // where directly going to `isMoreSpecific` would leave `dynamic` in the
+        // result of `asInstanceOf(A)` instead of bottom.
+        ReifiedType that = asInstanceOf(interface._declaration);
+        if (that != null) {
+          return that._isSubtypeOf(type);
+        }
+      }
+    }
+    return super._isSubtypeOf(type) ||
+        (_callableType?._isSubtypeOf(type) ?? false);
+  }
+
+  /// Returns [this] translated to [type] if [type] is a supertype of
+  /// [this]. Otherwise null.
+  ///
+  /// For example, given:
+  ///
+  ///     class Box<T> {}
+  ///     class BeatBox extends Box<Beat> {}
+  ///     class Beat {}
+  ///
+  /// We have:
+  ///
+  ///     [[BeatBox]].asInstanceOf([[Box]]) -> [[Box<Beat>]].
+  ReifiedType asInstanceOf(Class other) {
+    if (_declaration == other) return this;
+    ReifiedType result = _declaration.supertype
+        ?._subst(_typeArguments, _declaration.variables)
+        ?.asInstanceOf(other);
+    for (Interface interface in _declaration.interfaces) {
+      result = _intersection(
+          result,
+          interface
+              ._subst(_typeArguments, _declaration.variables)
+              .asInstanceOf(other));
+    }
+    return result;
+  }
+
+  ReifiedType asInstanceOfType(Interface type) {
+    return asInstanceOf(type._declaration);
+  }
+
+  Interface _subst(List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    List<ReifiedType> copy;
+    int index = 0;
+    for (ReifiedType typeArgument in _typeArguments) {
+      ReifiedType substitution = typeArgument._subst(arguments, parameters);
+      if (substitution != typeArgument) {
+        if (copy == null) {
+          copy = new List<ReifiedType>.from(_typeArguments);
+        }
+        copy[index] = substitution;
+      }
+      index++;
+    }
+    return copy == null ? this : new Interface(_declaration, copy);
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write(_declaration.name);
+    if (_typeArguments.isNotEmpty) {
+      sb.write("<");
+      sb.writeAll(_typeArguments, ", ");
+      sb.write(">");
+    }
+    return "$sb";
+  }
+
+  int get hashCode {
+    int code = 23;
+    code = (71 * code + _declaration.hashCode) & 0x3fffffff;
+    for (ReifiedType typeArgument in _typeArguments) {
+      code = (71 * code + typeArgument.hashCode) & 0x3fffffff;
+    }
+    return code;
+  }
+
+  bool operator ==(other) {
+    if (other is Interface) {
+      if (_declaration != other._declaration) return false;
+      if (identical(_typeArguments, other._typeArguments)) return true;
+      assert(_typeArguments.length == other._typeArguments.length);
+      for (int i = 0; i < _typeArguments.length; i++) {
+        if (_typeArguments[i] != other._typeArguments[i]) {
+          return false;
+        }
+      }
+      return true;
+    }
+    return false;
+  }
+}
+
+/// Represents the intersection type of [typeA] and [typeB]. The intersection
+/// type represents a type that is a subtype of both [typeA] and [typeB].
+///
+/// This type is produced when a class implements the same interface twice with
+/// different type arguments. For example:
+///
+///     abstract class MyNumberList implements List<int>, List<double> {}
+///
+/// Can lead to this intersection type:
+///
+///     new Intersection([[List<int>]], [[List<double>]])
+///
+/// For example,
+///
+///     [[MyNumberList]].asInstanceOf([[List]]) ->
+///         new Intersection([[List<int>]], [[List<double>]])
+///
+/// Note: sometimes, people confuse this with union types. However the union
+/// type of `A` and `B` would be anything that is a subtype of either `A` or
+/// `B`.
+///
+/// See [Intersection types]
+/// (https://en.wikipedia.org/wiki/Type_system#Intersection_types).
+class Intersection extends ReifiedType {
+  final ReifiedType typeA;
+  final ReifiedType typeB;
+
+  const Intersection(this.typeA, this.typeB) : super(Kind.Intersection);
+
+  bool _isMoreSpecificThan(ReifiedType type) {
+    // In the above example, `MyNumberList` is a subtype of List<int> *or*
+    // List<double>.
+    return typeA._isMoreSpecificThan(type) || typeB._isMoreSpecificThan(type);
+  }
+
+  ReifiedType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    ReifiedType aSubstitution = typeA._subst(arguments, parameters);
+    ReifiedType bSubstitution = typeB._subst(arguments, parameters);
+    return (aSubstitution == typeA && bSubstitution == typeB)
+        ? this
+        : _intersection(aSubstitution, bSubstitution);
+  }
+
+  String toString() => "{ $typeA, $typeB }";
+}
+
+/// Represents a type variable aka type parameter.
+///
+/// For example, this class:
+///
+///     class Box<T> {}
+///
+/// Defines one type variable. In the type `Box<int>`, there are no type
+/// variables.  However, `int` is a type argument to the the type
+/// parameter/variable `T`.
+class TypeVariable extends ReifiedType {
+  final int _id;
+
+  // TODO(ahe): Do we need to reify bounds?
+  ReifiedType bound;
+
+  TypeVariable(this._id) : super(Kind.Variable);
+
+  bool _isMoreSpecificThan(ReifiedType type) {
+    if (type == this || type._isDynamic || type._isObject) return true;
+    // The bounds of a type variable may contain a cycle, such as:
+    //
+    //     class C<T extends S, S extends T> {}
+    //
+    // We use the [tortoise and hare algorithm]
+    // (https://en.wikipedia.org/wiki/Cycle_detection#Tortoise_and_hare) to
+    // handle cycles.
+    ReifiedType tortoise = bound;
+    if (tortoise == type) return true;
+    ReifiedType hare = getBoundOrNull(bound);
+    while (tortoise != hare) {
+      tortoise = getBoundOrNull(tortoise);
+      if (tortoise == type) return true;
+      hare = getBoundOrNull(getBoundOrNull(hare));
+    }
+    // Here we know that `tortoise == hare`. Either they're both `null` or we
+    // detected a cycle.
+    if (tortoise != null) {
+      // There was a cycle of type variables in the bounds, but it didn't
+      // involve [type]. The variable [tortoise] visited all the type variables
+      // in the cycle (at least once), and each time we compared it to [type].
+      return false;
+    }
+    // There are no cycles and it's safe to recurse on [bound].
+    return bound._isMoreSpecificThan(type);
+  }
+
+  ReifiedType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    int index = 0;
+    for (ReifiedType parameter in parameters) {
+      if (this == parameter) return arguments[index];
+      index++;
+    }
+    return this;
+  }
+
+  String toString() => "#$_id";
+}
+
+/// Represents a function type.
+class FunctionType extends ReifiedType {
+  /// Normally, the [Interface] representing [Function]. But an
+  /// implementation-specific subtype of [Function] may also be used.
+  final ReifiedType _supertype;
+
+  final ReifiedType _returnType;
+
+  /// Encodes number of optional parameters and if the optional parameters are
+  /// named.
+  final int _data;
+
+  /// Encodes the argument types. Positional parameters use one element, the
+  /// type; named parameters use two, the name [String] and type. Named
+  /// parameters must be sorted by name.
+  final List _encodedParameters;
+
+  static const FunctionTypeRelation subtypeRelation =
+      const FunctionSubtypeRelation();
+
+  static const FunctionTypeRelation moreSpecificRelation =
+      const FunctionMoreSpecificRelation();
+
+  const FunctionType(
+      this._supertype, this._returnType, this._data, this._encodedParameters)
+      : super(Kind.Function);
+
+  bool get hasNamedParameters => (_data & 1) == 1;
+
+  int get optionalParameters => _data >> 1;
+
+  int get parameters {
+    return hasNamedParameters
+        ? _encodedParameters.length - optionalParameters
+        : _encodedParameters.length;
+  }
+
+  int get requiredParameters {
+    return hasNamedParameters
+        ? _encodedParameters.length - optionalParameters * 2
+        : _encodedParameters.length - optionalParameters;
+  }
+
+  bool _isSubtypeOf(ReifiedType type) => subtypeRelation.areRelated(this, type);
+
+  bool _isMoreSpecificThan(ReifiedType type) {
+    return moreSpecificRelation.areRelated(this, type);
+  }
+
+  FunctionType _subst(
+      List<ReifiedType> arguments, List<ReifiedType> parameters) {
+    List substitutedParameters;
+    int positionalParameters =
+        hasNamedParameters ? requiredParameters : this.parameters;
+    for (int i = 0; i < _encodedParameters.length; i++) {
+      if (i >= positionalParameters) {
+        // Skip the name of a named parameter.
+        i++;
+      }
+      ReifiedType type = _encodedParameters[i];
+      ReifiedType substitution = type._subst(arguments, parameters);
+      if (substitution != type) {
+        if (substitutedParameters == null) {
+          substitutedParameters = new List.from(_encodedParameters);
+        }
+        substitutedParameters[i] = substitution;
+      }
+    }
+    ReifiedType substitutedReturnType =
+        _returnType._subst(arguments, parameters);
+    if (substitutedParameters == null) {
+      if (_returnType == substitutedReturnType) return this;
+      substitutedParameters = _encodedParameters;
+    }
+    return new FunctionType(
+        _supertype, substitutedReturnType, _data, substitutedParameters);
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write("(");
+    bool first = true;
+    for (int i = 0; i < requiredParameters; i++) {
+      if (!first) {
+        sb.write(", ");
+      }
+      sb.write(_encodedParameters[i]);
+      first = false;
+    }
+    if (requiredParameters != parameters) {
+      if (!first) {
+        sb.write(", ");
+      }
+      if (hasNamedParameters) {
+        sb.write("{");
+        first = true;
+        for (int i = requiredParameters;
+            i < _encodedParameters.length;
+            i += 2) {
+          if (!first) {
+            sb.write(", ");
+          }
+          sb.write(_encodedParameters[i + 1]);
+          sb.write(" ");
+          sb.write(_encodedParameters[i]);
+          first = false;
+        }
+        sb.write("}");
+      } else {
+        sb.write("[");
+        first = true;
+        for (int i = requiredParameters; i < _encodedParameters.length; i++) {
+          if (!first) {
+            sb.write(", ");
+          }
+          sb.write(_encodedParameters[i]);
+          first = false;
+        }
+        sb.write("]");
+      }
+    }
+    sb.write(") -> ");
+    sb.write(_returnType);
+    return "$sb";
+  }
+}
+
+abstract class FunctionTypeRelation {
+  const FunctionTypeRelation();
+
+  bool areRelated(FunctionType self, ReifiedType type, {bool isMoreSpecific}) {
+    if (!type._isFunction) {
+      return arePartsRelated(self._supertype, type);
+    }
+    FunctionType other = type;
+    if (!other._returnType._isVoid) {
+      if (!arePartsRelated(self._returnType, other._returnType)) return false;
+    }
+    int positionalParameters =
+        self.hasNamedParameters ? self.requiredParameters : self.parameters;
+    int otherPositionalParameters =
+        other.hasNamedParameters ? other.requiredParameters : other.parameters;
+    if (self.requiredParameters > other.requiredParameters) return false;
+    if (positionalParameters < otherPositionalParameters) return false;
+
+    for (int i = 0; i < otherPositionalParameters; i++) {
+      if (!arePartsRelated(
+          self._encodedParameters[i], other._encodedParameters[i])) {
+        return false;
+      }
+    }
+
+    if (!other.hasNamedParameters) true;
+
+    int j = positionalParameters;
+    for (int i = otherPositionalParameters;
+        i < other._encodedParameters.length;
+        i += 2) {
+      String name = other._encodedParameters[i];
+      for (; j < self._encodedParameters.length; j += 2) {
+        if (self._encodedParameters[j] == name) break;
+      }
+      if (j == self._encodedParameters.length) return false;
+      if (!arePartsRelated(
+          self._encodedParameters[j + 1], other._encodedParameters[i + 1])) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  bool arePartsRelated(ReifiedType a, ReifiedType b);
+}
+
+class FunctionSubtypeRelation extends FunctionTypeRelation {
+  const FunctionSubtypeRelation();
+
+  bool arePartsRelated(ReifiedType a, ReifiedType b) => a._isAssignableTo(b);
+}
+
+class FunctionMoreSpecificRelation extends FunctionTypeRelation {
+  const FunctionMoreSpecificRelation();
+
+  bool arePartsRelated(ReifiedType a, ReifiedType b) =>
+      a._isMoreSpecificThan(b);
+}
+
+/// If [type] is a type variable, return its bound. Otherwise `null`.
+ReifiedType getBoundOrNull(ReifiedType type) {
+  if (type == null) return null;
+  if (!type._isVariable) return null;
+  TypeVariable tv = type;
+  return tv.bound;
+}
diff --git a/pkg/kernel/test/closures/suite.dart b/pkg/kernel/test/closures/suite.dart
index 76e2c51..053e6fb4 100644
--- a/pkg/kernel/test/closures/suite.dart
+++ b/pkg/kernel/test/closures/suite.dart
@@ -126,7 +126,7 @@
 
   Uri packages = Uri.base.resolve(".packages");
   bool strongMode = false;
-  bool updateExpectations = environment["updateExpectations"] != "false";
+  bool updateExpectations = environment["updateExpectations"] == "true";
   return new TestContext(sdk, vm, packages, strongMode,
       createDartSdk(sdk, strongMode: strongMode), updateExpectations);
 }
diff --git a/pkg/kernel/test/reify/kernel_chain.dart b/pkg/kernel/test/reify/kernel_chain.dart
new file mode 100644
index 0000000..a74e8f3
--- /dev/null
+++ b/pkg/kernel/test/reify/kernel_chain.dart
@@ -0,0 +1,199 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library test.kernel.reify.suite;
+
+import 'dart:async' show Future;
+
+import 'dart:io' show Directory, File, IOSink;
+
+import 'dart:typed_data' show Uint8List;
+
+import 'package:kernel/kernel.dart' show Repository, loadProgramFromBinary;
+
+import 'package:kernel/text/ast_to_text.dart' show Printer;
+
+import 'package:testing/testing.dart'
+    show ChainContext, Result, StdioProcess, Step;
+
+import 'package:kernel/ast.dart' show Library, Program;
+
+import 'package:kernel/verifier.dart' show verifyProgram;
+
+import 'package:kernel/binary/ast_to_binary.dart' show BinaryPrinter;
+
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+
+import 'package:kernel/binary/loader.dart' show BinaryLoader;
+
+Future<bool> fileExists(Uri base, String path) async {
+  return await new File.fromUri(base.resolve(path)).exists();
+}
+
+class Print extends Step<Program, Program, ChainContext> {
+  const Print();
+
+  String get name => "print";
+
+  Future<Result<Program>> run(Program program, _) async {
+    StringBuffer sb = new StringBuffer();
+    for (Library library in program.libraries) {
+      Printer printer = new Printer(sb);
+      if (library.importUri.scheme != "dart") {
+        printer.writeLibraryFile(library);
+      }
+    }
+    print("$sb");
+    return pass(program);
+  }
+}
+
+class SanityCheck extends Step<Program, Program, ChainContext> {
+  const SanityCheck();
+
+  String get name => "sanity check";
+
+  Future<Result<Program>> run(Program program, _) async {
+    try {
+      verifyProgram(program);
+      return pass(program);
+    } catch (e, s) {
+      return crash(e, s);
+    }
+  }
+}
+
+class MatchExpectation extends Step<Program, Program, ChainContext> {
+  final String suffix;
+
+  final bool updateExpectations;
+
+  const MatchExpectation(this.suffix, {this.updateExpectations: true});
+
+  String get name => "match expectations";
+
+  Future<Result<Program>> run(Program program, _) async {
+    Library library = program.libraries
+        .firstWhere((Library library) => library.importUri.scheme != "dart");
+    Uri uri = library.importUri;
+    StringBuffer buffer = new StringBuffer();
+    new Printer(buffer).writeLibraryFile(library);
+
+    File expectedFile = new File("${uri.toFilePath()}$suffix");
+    if (await expectedFile.exists()) {
+      String expected = await expectedFile.readAsString();
+      if (expected.trim() != "$buffer".trim()) {
+        if (!updateExpectations) {
+          String diff = await runDiff(expectedFile.uri, "$buffer");
+          return fail(null, "$uri doesn't match ${expectedFile.uri}\n$diff");
+        }
+      } else {
+        return pass(program);
+      }
+    }
+    if (updateExpectations) {
+      await openWrite(expectedFile.uri, (IOSink sink) {
+        sink.writeln("$buffer".trim());
+      });
+      return pass(program);
+    } else {
+      return fail(
+          program,
+          """
+Please create file ${expectedFile.path} with this content:
+$buffer""");
+    }
+  }
+}
+
+class WriteDill extends Step<Program, Uri, ChainContext> {
+  const WriteDill();
+
+  String get name => "write .dill";
+
+  Future<Result<Uri>> run(Program program, _) async {
+    Directory tmp = await Directory.systemTemp.createTemp();
+    Uri uri = tmp.uri.resolve("generated.dill");
+    File generated = new File.fromUri(uri);
+    IOSink sink = generated.openWrite();
+    try {
+      new BinaryPrinter(sink).writeProgramFile(program);
+    } catch (e, s) {
+      return fail(uri, e, s);
+    } finally {
+      print("Wrote `${generated.path}`");
+      await sink.close();
+    }
+    return pass(uri);
+  }
+}
+
+class ReadDill extends Step<Uri, Uri, ChainContext> {
+  const ReadDill();
+
+  String get name => "read .dill";
+
+  Future<Result<Uri>> run(Uri uri, _) async {
+    try {
+      loadProgramFromBinary(uri.toFilePath());
+    } catch (e, s) {
+      return fail(uri, e, s);
+    }
+    return pass(uri);
+  }
+}
+
+class Copy extends Step<Program, Program, ChainContext> {
+  const Copy();
+
+  String get name => "copy program";
+
+  Future<Result<Program>> run(Program program, _) async {
+    BytesCollector sink = new BytesCollector();
+    new BinaryPrinter(sink).writeProgramFile(program);
+    Uint8List bytes = sink.collect();
+    BinaryLoader loader = new BinaryLoader(new Repository());
+    return pass(new BinaryBuilder(loader, bytes).readProgramFile());
+  }
+}
+
+class BytesCollector implements Sink<List<int>> {
+  final List<List<int>> lists = <List<int>>[];
+
+  int length = 0;
+
+  void add(List<int> data) {
+    lists.add(data);
+    length += data.length;
+  }
+
+  Uint8List collect() {
+    Uint8List result = new Uint8List(length);
+    int offset = 0;
+    for (List<int> list in lists) {
+      result.setRange(offset, offset += list.length, list);
+    }
+    lists.clear();
+    length = 0;
+    return result;
+  }
+
+  void close() {}
+}
+
+Future<String> runDiff(Uri expected, String actual) async {
+  StdioProcess process = await StdioProcess
+      .run("diff", <String>["-u", expected.toFilePath(), "-"], input: actual);
+  return process.output;
+}
+
+Future openWrite(Uri uri, f(IOSink sink)) async {
+  IOSink sink = new File.fromUri(uri).openWrite();
+  try {
+    await f(sink);
+  } finally {
+    await sink.close();
+  }
+  print("Wrote $uri");
+}
diff --git a/pkg/kernel/test/reify/reify.status b/pkg/kernel/test/reify/reify.status
new file mode 100644
index 0000000..17d58a8
--- /dev/null
+++ b/pkg/kernel/test/reify/reify.status
@@ -0,0 +1,4 @@
+# Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+# for details. All rights reserved. Use of this source code is governed by a
+# BSD-style license that can be found in the LICENSE.md file.
+
diff --git a/pkg/kernel/test/reify/suite.dart b/pkg/kernel/test/reify/suite.dart
new file mode 100644
index 0000000..2a8975e
--- /dev/null
+++ b/pkg/kernel/test/reify/suite.dart
@@ -0,0 +1,223 @@
+// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library test.kernel.reify.suite;
+
+import 'dart:async' show Future;
+
+import 'dart:io' show Directory, File, Platform;
+
+import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
+
+import 'package:kernel/analyzer/loader.dart'
+    show DartLoader, DartOptions, createDartSdk;
+
+import 'package:kernel/target/targets.dart' show Target, TargetFlags, getTarget;
+
+import 'package:kernel/repository.dart' show Repository;
+
+import 'kernel_chain.dart'
+    show MatchExpectation, Print, ReadDill, SanityCheck, WriteDill;
+
+import 'package:testing/testing.dart'
+    show
+        Chain,
+        ChainContext,
+        Result,
+        StdioProcess,
+        Step,
+        TestDescription,
+        runMe;
+
+import 'package:kernel/ast.dart' show Program;
+
+import 'package:kernel/transformations/closure_conversion.dart'
+    as closure_conversion;
+
+import 'package:kernel/transformations/generic_types_reification.dart'
+    as generic_types_reification;
+
+import 'package:package_config/discovery.dart' show loadPackagesFile;
+
+class TestContext extends ChainContext {
+  final Uri vm;
+
+  final Uri packages;
+
+  final DartOptions options;
+
+  final DartSdk dartSdk;
+
+  final List<Step> steps;
+
+  TestContext(String sdk, this.vm, Uri packages, bool strongMode, this.dartSdk,
+      bool updateExpectations)
+      : packages = packages,
+        options = new DartOptions(
+            strongMode: strongMode,
+            sdk: sdk,
+            packagePath: packages.toFilePath()),
+        steps = <Step>[
+          const Kernel(),
+          const Print(),
+          const SanityCheck(),
+          const ClosureConversion(),
+          const GenericTypesReification(),
+          const Print(),
+          const SanityCheck(),
+          new MatchExpectation(".expect",
+              updateExpectations: updateExpectations),
+          const WriteDill(),
+          const ReadDill(),
+          const Run(),
+        ];
+
+  Future<DartLoader> createLoader() async {
+    Repository repository = new Repository();
+    return new DartLoader(repository, options, await loadPackagesFile(packages),
+        dartSdk: dartSdk);
+  }
+}
+
+enum Environment {
+  directory,
+  file,
+}
+
+Future<String> getEnvironmentVariable(
+    String name, Environment kind, String undefined, notFound(String n)) async {
+  String result = Platform.environment[name];
+  if (result == null) {
+    throw undefined;
+  }
+  switch (kind) {
+    case Environment.directory:
+      if (!await new Directory(result).exists()) throw notFound(result);
+      break;
+
+    case Environment.file:
+      if (!await new File(result).exists()) throw notFound(result);
+      break;
+  }
+  return result;
+}
+
+Future<bool> fileExists(Uri base, String path) async {
+  return await new File.fromUri(base.resolve(path)).exists();
+}
+
+Future<TestContext> createContext(
+    Chain suite, Map<String, String> environment) async {
+  const String suggestion = """Try building the patched SDK by running
+    'tools/build.py patched_sdk'""";
+
+  // TODO(karlklose): The path is different on MacOS.
+  String sdk = "out/DebugX64/patched_sdk/";
+  Uri sdkUri = Uri.base.resolve(sdk);
+  const String asyncDart = "lib/async/async.dart";
+  if (!await fileExists(sdkUri, asyncDart)) {
+    throw "Couldn't find the patched SDK. $suggestion";
+  }
+  const String asyncSources = "lib/async/async_sources.gypi";
+  if (await fileExists(sdkUri, asyncSources)) {
+    throw "Found '$asyncSources' in '$sdk', so it isn't a patched SDK. "
+        "$suggestion";
+  }
+
+  // TODO(karlklose): select the VM based on the mode.
+  Uri vm = Uri.base.resolve("out/ReleaseX64/dart");
+
+  Uri packages = Uri.base.resolve(".packages");
+  bool strongMode = false;
+  bool updateExpectations = environment["updateExpectations"] == "true";
+  return new TestContext(sdk, vm, packages, strongMode,
+      createDartSdk(sdk, strongMode: strongMode), updateExpectations);
+}
+
+class Kernel extends Step<TestDescription, Program, TestContext> {
+  const Kernel();
+
+  String get name => "kernel";
+
+  Future<Result<Program>> run(
+      TestDescription description, TestContext testContext) async {
+    try {
+      DartLoader loader = await testContext.createLoader();
+
+      Target target = getTarget(
+          "vm", new TargetFlags(strongMode: testContext.options.strongMode));
+      // reifyTarget is used to add the GTR-specific runtime libraries
+      // when the program is being loaded
+      Target reifyTarget = getTarget(
+          "vmreify",
+          new TargetFlags(
+              strongMode: testContext.options.strongMode,
+              kernelRuntime: Platform.script.resolve('../../runtime/')));
+
+      String path = description.file.path;
+      Uri uri = Uri.base.resolve(path);
+      Program program = loader.loadProgram(uri, target: reifyTarget);
+      for (var error in loader.errors) {
+        return fail(program, "$error");
+      }
+      target
+        ..performModularTransformations(program)
+        ..performGlobalTransformations(program);
+      return pass(program);
+    } catch (e, s) {
+      return crash(e, s);
+    }
+  }
+}
+
+class ClosureConversion extends Step<Program, Program, TestContext> {
+  const ClosureConversion();
+
+  String get name => "closure conversion";
+
+  Future<Result<Program>> run(Program program, TestContext testContext) async {
+    try {
+      program = closure_conversion.transformProgram(program);
+      return pass(program);
+    } catch (e, s) {
+      return crash(e, s);
+    }
+  }
+}
+
+class GenericTypesReification extends Step<Program, Program, TestContext> {
+  const GenericTypesReification();
+
+  String get name => "generic types reification";
+
+  Future<Result<Program>> run(Program program, TestContext testContext) async {
+    try {
+      program = generic_types_reification.transformProgram(program);
+      return pass(program);
+    } catch (e, s) {
+      return crash(e, s);
+    }
+  }
+}
+
+class Run extends Step<Uri, int, TestContext> {
+  const Run();
+
+  String get name => "run";
+
+  Future<Result<int>> run(Uri uri, TestContext context) async {
+    File generated = new File.fromUri(uri);
+    StdioProcess process;
+    try {
+      process =
+          await StdioProcess.run(context.vm.toFilePath(), [generated.path]);
+      print(process.output);
+    } finally {
+      generated.parent.delete(recursive: true);
+    }
+    return process.toResult();
+  }
+}
+
+main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
diff --git a/pkg/kernel/test/reify/testing.json b/pkg/kernel/test/reify/testing.json
new file mode 100644
index 0000000..7b9fcaa
--- /dev/null
+++ b/pkg/kernel/test/reify/testing.json
@@ -0,0 +1,29 @@
+{
+"":"Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file",
+"":"for details. All rights reserved. Use of this source code is governed by a",
+"":"BSD-style license that can be found in the LICENSE.md file.",
+  "packages": "../../../../.packages",
+  "suites": [
+    {
+      "name": "reify",
+      "kind": "Chain",
+      "source": "suite.dart",
+      "path": "../../testcases/reify",
+      "status": "reify.status",
+      "pattern": [
+        "\\.dart$"
+      ],
+      "exclude": [
+        "/test/reify/suite\\.dart$",
+        "/testcases/reify/test_base\\.dart$"
+      ]
+    }
+  ],
+  "analyze": {
+    "uris": [
+      "suite.dart"
+    ],
+    "exclude": [
+    ]
+  }
+}
diff --git a/pkg/kernel/testcases/reify/closure2_test.dart b/pkg/kernel/testcases/reify/closure2_test.dart
new file mode 100644
index 0000000..e44aef9
--- /dev/null
+++ b/pkg/kernel/testcases/reify/closure2_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library closure2_test;
+
+import 'test_base.dart';
+
+class A<T> {
+  fun() => (o) => o is T;
+}
+
+class X {}
+
+class Y {}
+
+main() {
+  var tester = new A<X>().fun();
+
+  expectTrue(tester(new X()));
+  expectFalse(tester(new Y()));
+}
diff --git a/pkg/kernel/testcases/reify/closure2_test.dart.expect b/pkg/kernel/testcases/reify/closure2_test.dart.expect
new file mode 100644
index 0000000..a6c537a
--- /dev/null
+++ b/pkg/kernel/testcases/reify/closure2_test.dart.expect
@@ -0,0 +1,85 @@
+library closure2_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "dart:mock" as mock;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  method fun() → dynamic {
+    return new self::Closure#A#fun#function::•(new typ::Interface::•(self::$declarations.[](1), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0)))), null);
+  }
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+}
+class Y extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](3));
+}
+class Closure#A#fun#function extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type, final mock::Context context) → dynamic
+    : self::Closure#A#fun#function::$type = $type, self::Closure#A#fun#function::context = context
+    ;
+  method call(dynamic o) → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#A#fun#function::context};
+    return typ::isSubtypeOf(int::type(o), this.$Closure#A#fun#function$T);
+  }
+  get $Closure#A#fun#function$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::Closure#A#fun#function::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](17)));
+  dec::init(d, 1, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19))], new typ::FunctionType::•(new typ::Interface::•(d.[](19)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 2, new typ::Interface::•(d.[](17)));
+  dec::init(d, 3, new typ::Interface::•(d.[](17)));
+  dec::init(d, 4, new typ::Interface::•(d.[](17)));
+  dec::init(d, 5, new typ::Interface::•(d.[](17)));
+  dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](6))]), new typ::Interface::•(d.[](21))]);
+  dec::init(d, 7, new typ::Interface::•(d.[](22)));
+  dec::init(d, 8, new typ::Interface::•(d.[](22)));
+  dec::init(d, 9, new typ::Interface::•(d.[](17)));
+  dec::init(d, 10, new typ::Interface::•(d.[](23)));
+  dec::init(d, 11, new typ::Interface::•(d.[](23)));
+  dec::init(d, 12, new typ::Interface::•(d.[](23)));
+  dec::init(d, 13, new typ::Interface::•(d.[](23)));
+  dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](24))]);
+  dec::init(d, 15, new typ::Interface::•(d.[](16)));
+  dec::init(d, 16, new typ::Interface::•(d.[](23)));
+  dec::init(d, 17, null);
+  dec::init(d, 19, new typ::Interface::•(d.[](17)));
+  dec::init(d, 20, new typ::Interface::•(d.[](17)));
+  dec::init(d, 21, new typ::Interface::•(d.[](17)));
+  dec::init(d, 22, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](22))])]);
+  dec::init(d, 23, new typ::Interface::•(d.[](17)));
+  dec::init(d, 24, new typ::Interface::•(d.[](17)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "Closure#A#fun#function", "X", "Y", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Function", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  dynamic tester = new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])).fun();
+  tes::expectTrue(tester.call(new self::X::•()));
+  tes::expectFalse(tester.call(new self::Y::•()));
+}
diff --git a/pkg/kernel/testcases/reify/closure_test.dart b/pkg/kernel/testcases/reify/closure_test.dart
new file mode 100644
index 0000000..17206bc
--- /dev/null
+++ b/pkg/kernel/testcases/reify/closure_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library closure_test;
+
+import 'test_base.dart';
+
+class A {}
+
+class B {}
+
+typedef B A2B(A a);
+typedef A B2A(B b);
+
+bar(A a) {
+  return null;
+}
+
+B baz(a) {
+  return null;
+}
+
+main() {
+  B foo(A a) {
+    return null;
+  }
+
+  A qux(B b) {
+    return null;
+  }
+
+  expectTrue(foo is A2B);
+  expectTrue(qux is! A2B);
+  expectTrue(foo is! B2A);
+  expectTrue(qux is B2A);
+
+  expectTrue(bar is A2B);
+  expectTrue(bar is! B2A);
+  expectTrue(baz is A2B);
+  expectTrue(baz is! B2A);
+
+  var rab = bar;
+  var zab = baz;
+  expectTrue(rab is A2B);
+  expectTrue(rab is! B2A);
+  expectTrue(zab is A2B);
+  expectTrue(zab is! B2A);
+}
diff --git a/pkg/kernel/testcases/reify/closure_test.dart.expect b/pkg/kernel/testcases/reify/closure_test.dart.expect
new file mode 100644
index 0000000..50134be
--- /dev/null
+++ b/pkg/kernel/testcases/reify/closure_test.dart.expect
@@ -0,0 +1,162 @@
+library closure_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "dart:mock" as mock;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+}
+class B extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+}
+class Closure#main#foo extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#foo::context = context
+    ;
+  method call(self::A a) → self::B {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#foo::context};
+    return null;
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+}
+class Closure#main#qux extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#qux::context = context
+    ;
+  method call(self::B b) → self::A {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#qux::context};
+    return null;
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](3));
+}
+class Closure#bar extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(self::A a) → dynamic
+    return self::bar(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](4));
+}
+class Closure#bar extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(self::A a) → dynamic
+    return self::bar(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](5));
+}
+class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(dynamic a) → self::B
+    return self::baz(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](6));
+}
+class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(dynamic a) → self::B
+    return self::baz(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](7));
+}
+class Closure#bar extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(self::A a) → dynamic
+    return self::bar(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](8));
+}
+class Closure#baz extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(dynamic a) → self::B
+    return self::baz(a);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](9));
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](24)));
+  dec::init(d, 1, new typ::Interface::•(d.[](24)));
+  dec::init(d, 2, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 3, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](0)), 0, <dynamic>[new typ::Interface::•(d.[](1))]));
+  dec::init(d, 4, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 5, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 6, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 7, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 8, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), const typ::Dynamic::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 9, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](10))], new typ::FunctionType::•(new typ::Interface::•(d.[](10)), new typ::Interface::•(d.[](1)), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 10, new typ::Interface::•(d.[](24)));
+  dec::init(d, 11, new typ::Interface::•(d.[](24)));
+  dec::init(d, 12, new typ::Interface::•(d.[](24)));
+  dec::init(d, 13, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](26), <dynamic>[new typ::Interface::•(d.[](13))]), new typ::Interface::•(d.[](27))]);
+  dec::init(d, 14, new typ::Interface::•(d.[](28)));
+  dec::init(d, 15, new typ::Interface::•(d.[](28)));
+  dec::init(d, 16, new typ::Interface::•(d.[](24)));
+  dec::init(d, 17, new typ::Interface::•(d.[](29)));
+  dec::init(d, 18, new typ::Interface::•(d.[](29)));
+  dec::init(d, 19, new typ::Interface::•(d.[](29)));
+  dec::init(d, 20, new typ::Interface::•(d.[](29)));
+  dec::init(d, 21, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](30))]);
+  dec::init(d, 22, new typ::Interface::•(d.[](23)));
+  dec::init(d, 23, new typ::Interface::•(d.[](29)));
+  dec::init(d, 24, null);
+  dec::init(d, 26, new typ::Interface::•(d.[](24)));
+  dec::init(d, 27, new typ::Interface::•(d.[](24)));
+  dec::init(d, 28, new typ::Interface::•(d.[](24)), <dynamic>[new typ::Interface::•(d.[](26), <dynamic>[new typ::Interface::•(d.[](28))])]);
+  dec::init(d, 29, new typ::Interface::•(d.[](24)));
+  dec::init(d, 30, new typ::Interface::•(d.[](24)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Closure#main#foo", "Closure#main#qux", "Closure#bar", "Closure#bar", "Closure#baz", "Closure#baz", "Closure#bar", "Closure#baz", "Function", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method bar(self::A a) → dynamic {
+  return null;
+}
+static method baz(dynamic a) → self::B {
+  return null;
+}
+static method main() → dynamic {
+  final (self::A) → self::B foo = new self::Closure#main#foo::•(null);
+  final (self::B) → self::A qux = new self::Closure#main#qux::•(null);
+  tes::expectTrue(typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(foo), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type(qux), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#bar::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(new self::Closure#baz::•()), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  dynamic rab = new self::Closure#bar::•();
+  dynamic zab = new self::Closure#baz::•();
+  tes::expectTrue(typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(rab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(zab), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](10)), new typ::Interface::•(self::$declarations.[](0)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+}
diff --git a/pkg/kernel/testcases/reify/factories_test.dart b/pkg/kernel/testcases/reify/factories_test.dart
new file mode 100644
index 0000000..805df85
--- /dev/null
+++ b/pkg/kernel/testcases/reify/factories_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library factories_test;
+
+import 'test_base.dart';
+
+class A<T> {
+  factory A() {
+    return new B<T>();
+  }
+
+  factory A.named() {
+    return new A<T>.internal();
+  }
+
+  factory A.forward() = A<T>.internal;
+
+  A.internal();
+}
+
+class B<T> extends A<T> {
+  B() : super.internal();
+}
+
+class X {}
+
+class Y {}
+
+main() {
+  expectTrue(new A<X>.named() is A<X>);
+  expectTrue(new A<X>.named() is! A<Y>);
+  expectTrue(new A<X>.forward() is A<X>);
+  expectTrue(new A<X>.forward() is! A<Y>);
+  expectTrue(new A<X>() is B<X>);
+  expectTrue(new A<X>() is! B<Y>);
+  expectTrue(new A<X>.named() is! B<X>);
+  expectTrue(new A<X>.forward() is! B<X>);
+}
diff --git a/pkg/kernel/testcases/reify/factories_test.dart.expect b/pkg/kernel/testcases/reify/factories_test.dart.expect
new file mode 100644
index 0000000..de736e8
--- /dev/null
+++ b/pkg/kernel/testcases/reify/factories_test.dart.expect
@@ -0,0 +1,97 @@
+library factories_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor internal(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  static factory •(typ::ReifiedType $type) → self::A {
+    return new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[typ::getTypeArguments(typ::asInstanceOf($type, self::$declarations.[](0))).[](0)]));
+  }
+  static factory named(typ::ReifiedType $type) → self::A {
+    return new self::A::internal(new typ::Interface::•(self::$declarations.[](0), <dynamic>[typ::getTypeArguments(typ::asInstanceOf($type, self::$declarations.[](0))).[](0)]));
+  }
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get $is$A() → core::bool
+    return true;
+  get $is$B() → core::bool
+    return false;
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •(typ::ReifiedType $type) → void
+    : super self::A::internal($type)
+    ;
+  get $B$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get $is$A() → core::bool
+    return true;
+  get $is$B() → core::bool
+    return true;
+}
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return false;
+}
+class Y extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](3));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return false;
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](17)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0), <dynamic>[d.[](1).variables.[](0)]));
+  dec::init(d, 2, new typ::Interface::•(d.[](17)));
+  dec::init(d, 3, new typ::Interface::•(d.[](17)));
+  dec::init(d, 4, new typ::Interface::•(d.[](17)));
+  dec::init(d, 5, new typ::Interface::•(d.[](17)));
+  dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19), <dynamic>[new typ::Interface::•(d.[](6))]), new typ::Interface::•(d.[](20))]);
+  dec::init(d, 7, new typ::Interface::•(d.[](21)));
+  dec::init(d, 8, new typ::Interface::•(d.[](21)));
+  dec::init(d, 9, new typ::Interface::•(d.[](17)));
+  dec::init(d, 10, new typ::Interface::•(d.[](22)));
+  dec::init(d, 11, new typ::Interface::•(d.[](22)));
+  dec::init(d, 12, new typ::Interface::•(d.[](22)));
+  dec::init(d, 13, new typ::Interface::•(d.[](22)));
+  dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](23))]);
+  dec::init(d, 15, new typ::Interface::•(d.[](16)));
+  dec::init(d, 16, new typ::Interface::•(d.[](22)));
+  dec::init(d, 17, null);
+  dec::init(d, 19, new typ::Interface::•(d.[](17)));
+  dec::init(d, 20, new typ::Interface::•(d.[](17)));
+  dec::init(d, 21, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19), <dynamic>[new typ::Interface::•(d.[](21))])]);
+  dec::init(d, 22, new typ::Interface::•(d.[](17)));
+  dec::init(d, 23, new typ::Interface::•(d.[](17)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "X", "Y", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  tes::expectTrue(let dynamic #t1 = self::A::named(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t1.$type, #t2)));
+  tes::expectTrue(!(let dynamic #t3 = self::A::named(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](3))]) in typ::isSubtypeOf(#t3.$type, #t4))));
+  tes::expectTrue(let dynamic #t5 = new self::A::internal(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t5.$type, #t6)));
+  tes::expectTrue(!(let dynamic #t7 = new self::A::internal(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](3))]) in typ::isSubtypeOf(#t7.$type, #t8))));
+  tes::expectTrue(let dynamic #t9 = self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t9 is int::HasRuntimeTypeGetter && #t9.$is$B && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t9.$type, #t10)));
+  tes::expectTrue(!(let dynamic #t11 = self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t11 is int::HasRuntimeTypeGetter && #t11.$is$B && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](3))]) in typ::isSubtypeOf(#t11.$type, #t12))));
+  tes::expectTrue(!(let dynamic #t13 = self::A::named(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t13 is int::HasRuntimeTypeGetter && #t13.$is$B && (let dynamic #t14 = new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t13.$type, #t14))));
+  tes::expectTrue(!(let dynamic #t15 = new self::A::internal(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))])) in #t15 is int::HasRuntimeTypeGetter && #t15.$is$B && (let dynamic #t16 = new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t15.$type, #t16))));
+}
diff --git a/pkg/kernel/testcases/reify/field_initializer2_test.dart b/pkg/kernel/testcases/reify/field_initializer2_test.dart
new file mode 100644
index 0000000..47db808
--- /dev/null
+++ b/pkg/kernel/testcases/reify/field_initializer2_test.dart
@@ -0,0 +1,24 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library field_initializer2_test;
+
+import 'test_base.dart';
+
+class A<T> {}
+
+class B<T> {
+  var x = new A<T>();
+  var y;
+  B() : y = new A<T>();
+}
+
+main() {
+  var b = new B<A>();
+  expectTrue(b.x is A<A>);
+  expectTrue(b.y is A<A>);
+
+  expectFalse(b.x is A<B>);
+  expectFalse(b.y is A<B>);
+}
diff --git a/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect b/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect
new file mode 100644
index 0000000..e27360d
--- /dev/null
+++ b/pkg/kernel/testcases/reify/field_initializer2_test.dart.expect
@@ -0,0 +1,67 @@
+library field_initializer2_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get $is$A() → core::bool
+    return true;
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends core::Object implements int::HasRuntimeTypeGetter {
+  field dynamic x;
+  field dynamic y;
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::B::x = self::B::$init$x($type), self::B::$type = $type, self::B::y = new self::A::•(new typ::Interface::•(self::$declarations.[](0), typ::getTypeArguments(typ::asInstanceOf($type, self::$declarations.[](1))))), super core::Object::•()
+    ;
+  get $B$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get $is$A() → core::bool
+    return false;
+  get runtimeType() → core::Type
+    return this.{=self::B::$type};
+  static method $init$x(dynamic $type) → dynamic
+    return new self::A::•(new typ::Interface::•(self::$declarations.[](0), typ::getTypeArguments(typ::asInstanceOf($type, self::$declarations.[](1)))));
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](15)));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)));
+  dec::init(d, 10, new typ::Interface::•(d.[](20)));
+  dec::init(d, 11, new typ::Interface::•(d.[](20)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](20)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
+  dec::init(d, 20, new typ::Interface::•(d.[](15)));
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  dynamic b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]));
+  tes::expectTrue(let dynamic #t1 = b.x in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t1.$type, #t2)));
+  tes::expectTrue(let dynamic #t3 = b.y in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t3.$type, #t4)));
+  tes::expectFalse(let dynamic #t5 = b.x in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t5.$type, #t6)));
+  tes::expectFalse(let dynamic #t7 = b.y in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()])]) in typ::isSubtypeOf(#t7.$type, #t8)));
+}
diff --git a/pkg/kernel/testcases/reify/field_initializer_test.dart b/pkg/kernel/testcases/reify/field_initializer_test.dart
new file mode 100644
index 0000000..d1e4c9c
--- /dev/null
+++ b/pkg/kernel/testcases/reify/field_initializer_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library field_initializer_test;
+
+import 'test_base.dart';
+
+p(x) {
+  write(x);
+  return x;
+}
+
+class A<T> {
+  var a1 = p("a1");
+  var a2;
+
+  A() : a2 = p("a2") {
+    p("A");
+  }
+}
+
+class B<T> extends A<T> {
+  var b1 = p("b1");
+  var b2 = p("b2");
+  var b3;
+  var b4;
+
+  B()
+      : b3 = p("b3"),
+        b4 = p("b4"),
+        super() {
+    p("B");
+  }
+}
+
+main() {
+  var b = new B();
+  expectOutput("b1\nb2\nb3\nb4\na1\na2\nA\nB");
+}
diff --git a/pkg/kernel/testcases/reify/field_initializer_test.dart.expect b/pkg/kernel/testcases/reify/field_initializer_test.dart.expect
new file mode 100644
index 0000000..f5ad332
--- /dev/null
+++ b/pkg/kernel/testcases/reify/field_initializer_test.dart.expect
@@ -0,0 +1,65 @@
+library field_initializer_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  field dynamic a1 = self::p("a1");
+  field dynamic a2;
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, self::A::a2 = self::p("a2"), super core::Object::•() {
+    self::p("A");
+  }
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  field dynamic b1 = self::p("b1");
+  field dynamic b2 = self::p("b2");
+  field dynamic b3;
+  field dynamic b4;
+  constructor •(typ::ReifiedType $type) → void
+    : self::B::b3 = self::p("b3"), self::B::b4 = self::p("b4"), super self::A::•($type) {
+    self::p("B");
+  }
+  get $B$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0), <dynamic>[d.[](1).variables.[](0)]));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)));
+  dec::init(d, 10, new typ::Interface::•(d.[](20)));
+  dec::init(d, 11, new typ::Interface::•(d.[](20)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](20)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
+  dec::init(d, 20, new typ::Interface::•(d.[](15)));
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method p(dynamic x) → dynamic {
+  tes::write(x);
+  return x;
+}
+static method main() → dynamic {
+  dynamic b = new self::B::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[const typ::Dynamic::•()]));
+  tes::expectOutput("b1\nb2\nb3\nb4\na1\na2\nA\nB");
+}
diff --git a/pkg/kernel/testcases/reify/function_type_test.dart b/pkg/kernel/testcases/reify/function_type_test.dart
new file mode 100644
index 0000000..b67b743
--- /dev/null
+++ b/pkg/kernel/testcases/reify/function_type_test.dart
@@ -0,0 +1,266 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library function_type_test;
+
+import 'test_base.dart';
+
+class A {}
+
+class B extends A {}
+
+class C extends A {}
+
+class D implements Function {
+  B call(A a) {
+    return null;
+  }
+}
+
+class ER0P1 {
+  void call([A a]) {}
+}
+
+class ER1P0 {
+  void call(A a) {}
+}
+
+class ER1P1 {
+  void call(A a, [B b]) {}
+}
+
+class ER1P2 {
+  void call(A a, [B b, C c]) {}
+}
+
+class ER2P1 {
+  void call(A a, B b, [C c]) {}
+}
+
+class ER0N1 {
+  void call({A a}) {}
+}
+
+class ER1N0 {
+  void call(A a) {}
+}
+
+class ER1N1 {
+  void call(A a, {B b}) {}
+}
+
+class ER1N2 {
+  void call(A a, {B b, C c}) {}
+}
+
+class ER2N1 {
+  void call(A a, B b, {C c}) {}
+}
+
+class ER0N8 {
+  void call({kE, ii, oP, Ij, pA, zD, aZ, UU}) {}
+}
+
+C foo(A a) {
+  return null;
+}
+
+typedef B A2B(A a);
+
+typedef C C2C(C c);
+
+typedef void R0P1([A a]);
+typedef void R1P0(A a);
+typedef void R1P1(A a, [B b]);
+typedef void R1P2(A a, [B b, C c]);
+typedef void R2P1(A a, B b, [C c]);
+
+typedef void R0N1({A a});
+typedef void R1N0(A a);
+typedef void R1N1(A a, {B b});
+typedef void R1N2(A a, {B b, C c});
+typedef void R2N1(A a, B b, {C c});
+
+typedef void R0N8({aZ, oP, Ij, kE, pA, zD, UU, ii});
+
+void test(x) {
+  write(x is Function);
+  write(x is A2B);
+  write(x is C2C);
+
+  write(x is R0P1);
+  write(x is R1P0);
+  write(x is R1P1);
+  write(x is R1P2);
+  write(x is R2P1);
+
+  write(x is R0N1);
+  write(x is R1N0);
+  write(x is R1N1);
+  write(x is R1N2);
+  write(x is R2N1);
+}
+
+main() {
+  test(new D());
+  for (var c in [
+    new ER0P1(),
+    new ER1P0(),
+    new ER1P1(),
+    new ER1P2(),
+    new ER2P1(),
+    new ER0N1(),
+    new ER1N0(),
+    new ER1N1(),
+    new ER1N2(),
+    new ER2N1()
+  ]) {
+    test(c);
+  }
+
+  expectOutput("""
+true
+true
+false
+false
+true
+false
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+true
+true
+false
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+true
+true
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+true
+true
+true
+true
+false
+true
+false
+false
+false
+true
+false
+false
+false
+false
+false
+false
+true
+false
+false
+false
+false
+false
+true
+false
+false
+false
+false
+false
+false
+false
+true
+false
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+false
+true
+true
+false
+false
+true
+false
+false
+false
+true
+false
+false
+false
+false
+true
+true
+true
+false
+true
+false
+false
+false
+false
+false
+false
+false
+false
+false
+false
+false
+true""");
+}
diff --git a/pkg/kernel/testcases/reify/function_type_test.dart.expect b/pkg/kernel/testcases/reify/function_type_test.dart.expect
new file mode 100644
index 0000000..7d49eff
--- /dev/null
+++ b/pkg/kernel/testcases/reify/function_type_test.dart.expect
@@ -0,0 +1,223 @@
+library function_type_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$Function() → core::bool
+    return false;
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::A::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$Function() → core::bool
+    return false;
+}
+class C extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::A::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$Function() → core::bool
+    return false;
+}
+class D extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a) → self::B {
+    return null;
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](3));
+  get $is$Function() → core::bool
+    return true;
+}
+class ER0P1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call([self::A a]) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](4));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1P0 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](5));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1P1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, [self::B b]) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](6));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1P2 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, [self::B b, self::C c]) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](7));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER2P1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, self::B b, [self::C c]) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](8));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER0N1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call({self::A a}) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](9));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1N0 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](10));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1N1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, {self::B b}) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](11));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER1N2 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, {self::B b, self::C c}) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](12));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER2N1 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call(self::A a, self::B b, {self::C c}) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](13));
+  get $is$Function() → core::bool
+    return false;
+}
+class ER0N8 extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  method call({dynamic kE, dynamic ii, dynamic oP, dynamic Ij, dynamic pA, dynamic zD, dynamic aZ, dynamic UU}) → void {}
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](14));
+  get $is$Function() → core::bool
+    return false;
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](30)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0)));
+  dec::init(d, 2, new typ::Interface::•(d.[](0)));
+  dec::init(d, 3, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](15))], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Interface::•(d.[](1)), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 4, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 5, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 6, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1))]));
+  dec::init(d, 7, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 4, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
+  dec::init(d, 8, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), new typ::Interface::•(d.[](2))]));
+  dec::init(d, 9, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>["a", new typ::Interface::•(d.[](0))]));
+  dec::init(d, 10, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 11, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1))]));
+  dec::init(d, 12, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 5, <dynamic>[new typ::Interface::•(d.[](0)), "b", new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
+  dec::init(d, 13, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(d.[](0)), new typ::Interface::•(d.[](1)), "c", new typ::Interface::•(d.[](2))]));
+  dec::init(d, 14, new typ::Interface::•(d.[](30)), <dynamic>[], new typ::FunctionType::•(new typ::Interface::•(d.[](15)), new typ::Void::•(), 17, <dynamic>["kE", const typ::Dynamic::•(), "ii", const typ::Dynamic::•(), "oP", const typ::Dynamic::•(), "Ij", const typ::Dynamic::•(), "pA", const typ::Dynamic::•(), "zD", const typ::Dynamic::•(), "aZ", const typ::Dynamic::•(), "UU", const typ::Dynamic::•()]));
+  dec::init(d, 15, new typ::Interface::•(d.[](30)));
+  dec::init(d, 16, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](32), <dynamic>[d.[](16).variables.[](0)])]);
+  dec::init(d, 17, new typ::Interface::•(d.[](30)));
+  dec::init(d, 18, new typ::Interface::•(d.[](30)));
+  dec::init(d, 19, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](19))]), new typ::Interface::•(d.[](34))]);
+  dec::init(d, 20, new typ::Interface::•(d.[](35)));
+  dec::init(d, 21, new typ::Interface::•(d.[](35)));
+  dec::init(d, 22, new typ::Interface::•(d.[](30)));
+  dec::init(d, 23, new typ::Interface::•(d.[](36)));
+  dec::init(d, 24, new typ::Interface::•(d.[](36)));
+  dec::init(d, 25, new typ::Interface::•(d.[](36)));
+  dec::init(d, 26, new typ::Interface::•(d.[](36)));
+  dec::init(d, 27, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](37))]);
+  dec::init(d, 28, new typ::Interface::•(d.[](29)));
+  dec::init(d, 29, new typ::Interface::•(d.[](36)));
+  dec::init(d, 30, null);
+  dec::init(d, 32, new typ::Interface::•(d.[](38), <dynamic>[d.[](32).variables.[](0)]));
+  dec::init(d, 33, new typ::Interface::•(d.[](30)));
+  dec::init(d, 34, new typ::Interface::•(d.[](30)));
+  dec::init(d, 35, new typ::Interface::•(d.[](30)), <dynamic>[new typ::Interface::•(d.[](33), <dynamic>[new typ::Interface::•(d.[](35))])]);
+  dec::init(d, 36, new typ::Interface::•(d.[](30)));
+  dec::init(d, 37, new typ::Interface::•(d.[](30)));
+  dec::init(d, 38, new typ::Interface::•(d.[](30)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "C", "D", "ER0P1", "ER1P0", "ER1P1", "ER1P2", "ER2P1", "ER0N1", "ER1N0", "ER1N1", "ER1N2", "ER2N1", "ER0N8", "Function", "List", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "EfficientLengthIterable", "Comparable", "Pattern", "num", "Error", "Exception", "Iterable"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]));
+static method foo(self::A a) → self::C {
+  return null;
+}
+static method test(dynamic x) → void {
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::Interface::•(self::$declarations.[](15))));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Interface::•(self::$declarations.[](1)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Interface::•(self::$declarations.[](2)), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](2))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 4, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 2, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 3, <dynamic>["a", new typ::Interface::•(self::$declarations.[](0))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 0, <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), "b", new typ::Interface::•(self::$declarations.[](1))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 5, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), "b", new typ::Interface::•(self::$declarations.[](1)), "c", new typ::Interface::•(self::$declarations.[](2))])));
+  tes::write(typ::isSubtypeOf(int::type(x), new typ::FunctionType::•(new typ::Interface::•(self::$declarations.[](15)), new typ::Void::•(), 3, <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), "c", new typ::Interface::•(self::$declarations.[](2))])));
+}
+static method main() → dynamic {
+  self::test(new self::D::•());
+  for (dynamic c in int::attachType(<dynamic>[new self::ER0P1::•(), new self::ER1P0::•(), new self::ER1P1::•(), new self::ER1P2::•(), new self::ER2P1::•(), new self::ER0N1::•(), new self::ER1N0::•(), new self::ER1N1::•(), new self::ER1N2::•(), new self::ER2N1::•()], new typ::Interface::•(self::$declarations.[](16), <dynamic>[const typ::Dynamic::•()]))) {
+    self::test(c);
+  }
+  tes::expectOutput("true\ntrue\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\nfalse\ntrue");
+}
diff --git a/pkg/kernel/testcases/reify/is1_test.dart b/pkg/kernel/testcases/reify/is1_test.dart
new file mode 100644
index 0000000..e84dae9
--- /dev/null
+++ b/pkg/kernel/testcases/reify/is1_test.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library is1_test;
+
+import 'test_base.dart';
+
+class N {}
+
+class I extends N {}
+
+class D extends N {}
+
+class A<T> {}
+
+main() {
+  var x = new A<I>();
+  expectTrue(x is A<N>);
+  expectTrue(x is A<I>);
+  expectFalse(x is A<D>);
+
+  var y = new A();
+  expectTrue(y is A<N>);
+  expectTrue(y is A<I>);
+  expectTrue(y is A<D>);
+}
diff --git a/pkg/kernel/testcases/reify/is1_test.dart.expect b/pkg/kernel/testcases/reify/is1_test.dart.expect
new file mode 100644
index 0000000..7f3642a
--- /dev/null
+++ b/pkg/kernel/testcases/reify/is1_test.dart.expect
@@ -0,0 +1,83 @@
+library is1_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class N extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$A() → core::bool
+    return false;
+}
+class I extends self::N implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::N::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$A() → core::bool
+    return false;
+}
+class D extends self::N implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::N::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$A() → core::bool
+    return false;
+}
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3))).[](0);
+  get $is$A() → core::bool
+    return true;
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](17)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0)));
+  dec::init(d, 2, new typ::Interface::•(d.[](0)));
+  dec::init(d, 3, new typ::Interface::•(d.[](17)));
+  dec::init(d, 4, new typ::Interface::•(d.[](17)));
+  dec::init(d, 5, new typ::Interface::•(d.[](17)));
+  dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19), <dynamic>[new typ::Interface::•(d.[](6))]), new typ::Interface::•(d.[](20))]);
+  dec::init(d, 7, new typ::Interface::•(d.[](21)));
+  dec::init(d, 8, new typ::Interface::•(d.[](21)));
+  dec::init(d, 9, new typ::Interface::•(d.[](17)));
+  dec::init(d, 10, new typ::Interface::•(d.[](22)));
+  dec::init(d, 11, new typ::Interface::•(d.[](22)));
+  dec::init(d, 12, new typ::Interface::•(d.[](22)));
+  dec::init(d, 13, new typ::Interface::•(d.[](22)));
+  dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](23))]);
+  dec::init(d, 15, new typ::Interface::•(d.[](16)));
+  dec::init(d, 16, new typ::Interface::•(d.[](22)));
+  dec::init(d, 17, null);
+  dec::init(d, 19, new typ::Interface::•(d.[](17)));
+  dec::init(d, 20, new typ::Interface::•(d.[](17)));
+  dec::init(d, 21, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19), <dynamic>[new typ::Interface::•(d.[](21))])]);
+  dec::init(d, 22, new typ::Interface::•(d.[](17)));
+  dec::init(d, 23, new typ::Interface::•(d.[](17)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["N", "I", "D", "A", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  dynamic x = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]));
+  tes::expectTrue(let dynamic #t1 = x in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t1.$type, #t2)));
+  tes::expectTrue(let dynamic #t3 = x in #t3 is int::HasRuntimeTypeGetter && #t3.$is$A && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t3.$type, #t4)));
+  tes::expectFalse(let dynamic #t5 = x in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t5.$type, #t6)));
+  dynamic y = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[const typ::Dynamic::•()]));
+  tes::expectTrue(let dynamic #t7 = y in #t7 is int::HasRuntimeTypeGetter && #t7.$is$A && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t7.$type, #t8)));
+  tes::expectTrue(let dynamic #t9 = y in #t9 is int::HasRuntimeTypeGetter && #t9.$is$A && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t9.$type, #t10)));
+  tes::expectTrue(let dynamic #t11 = y in #t11 is int::HasRuntimeTypeGetter && #t11.$is$A && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t11.$type, #t12)));
+}
diff --git a/pkg/kernel/testcases/reify/literals_test.dart b/pkg/kernel/testcases/reify/literals_test.dart
new file mode 100644
index 0000000..6b820dd
--- /dev/null
+++ b/pkg/kernel/testcases/reify/literals_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library literals_test;
+
+import 'test_base.dart';
+
+class A {}
+
+class B {}
+
+main() {
+  expectTrue(<A>[] is List<A>);
+  expectTrue(<A>[] is! List<B>);
+
+  expectTrue(<A, B>{} is Map<A, B>);
+  expectTrue(<A, B>{} is! Map<A, A>);
+  expectTrue(<A, B>{} is! Map<B, B>);
+}
diff --git a/pkg/kernel/testcases/reify/literals_test.dart.expect b/pkg/kernel/testcases/reify/literals_test.dart.expect
new file mode 100644
index 0000000..3d0d11d
--- /dev/null
+++ b/pkg/kernel/testcases/reify/literals_test.dart.expect
@@ -0,0 +1,65 @@
+library literals_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$List() → core::bool
+    return false;
+  get $is$Map() → core::bool
+    return false;
+}
+class B extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$List() → core::bool
+    return false;
+  get $is$Map() → core::bool
+    return false;
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](17)));
+  dec::init(d, 1, new typ::Interface::•(d.[](17)));
+  dec::init(d, 2, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](19), <dynamic>[d.[](2).variables.[](0)])]);
+  dec::init(d, 3, new typ::Interface::•(d.[](17)));
+  dec::init(d, 4, new typ::Interface::•(d.[](17)));
+  dec::init(d, 5, new typ::Interface::•(d.[](17)));
+  dec::init(d, 6, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](6))]), new typ::Interface::•(d.[](21))]);
+  dec::init(d, 7, new typ::Interface::•(d.[](22)));
+  dec::init(d, 8, new typ::Interface::•(d.[](22)));
+  dec::init(d, 9, new typ::Interface::•(d.[](17)));
+  dec::init(d, 10, new typ::Interface::•(d.[](23)));
+  dec::init(d, 11, new typ::Interface::•(d.[](23)));
+  dec::init(d, 12, new typ::Interface::•(d.[](23)));
+  dec::init(d, 13, new typ::Interface::•(d.[](23)));
+  dec::init(d, 14, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](24))]);
+  dec::init(d, 15, new typ::Interface::•(d.[](16)));
+  dec::init(d, 16, new typ::Interface::•(d.[](23)));
+  dec::init(d, 17, null);
+  dec::init(d, 19, new typ::Interface::•(d.[](25), <dynamic>[d.[](19).variables.[](0)]));
+  dec::init(d, 20, new typ::Interface::•(d.[](17)));
+  dec::init(d, 21, new typ::Interface::•(d.[](17)));
+  dec::init(d, 22, new typ::Interface::•(d.[](17)), <dynamic>[new typ::Interface::•(d.[](20), <dynamic>[new typ::Interface::•(d.[](22))])]);
+  dec::init(d, 23, new typ::Interface::•(d.[](17)));
+  dec::init(d, 24, new typ::Interface::•(d.[](17)));
+  dec::init(d, 25, new typ::Interface::•(d.[](17)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "List", "Map", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "EfficientLengthIterable", "Comparable", "Pattern", "num", "Error", "Exception", "Iterable"], <dynamic>[0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]));
+static method main() → dynamic {
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(<self::A>[], new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]))), new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(int::attachType(<self::A>[], new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]))), new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(<self::A, self::B>{}, new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1))]))), new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(int::attachType(<self::A, self::B>{}, new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1))]))), new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](0))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(int::attachType(<self::A, self::B>{}, new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1))]))), new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](1))])));
+}
diff --git a/pkg/kernel/testcases/reify/multiple_variables_test.dart b/pkg/kernel/testcases/reify/multiple_variables_test.dart
new file mode 100644
index 0000000..5c33c33
--- /dev/null
+++ b/pkg/kernel/testcases/reify/multiple_variables_test.dart
@@ -0,0 +1,11 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library multiple_variables_test;
+
+import '../../runtime/reify/types.dart' as rti;
+
+class X<A, B, C, D, E> {}
+
+main() {}
diff --git a/pkg/kernel/testcases/reify/multiple_variables_test.dart.expect b/pkg/kernel/testcases/reify/multiple_variables_test.dart.expect
new file mode 100644
index 0000000..9b1dccf
--- /dev/null
+++ b/pkg/kernel/testcases/reify/multiple_variables_test.dart.expect
@@ -0,0 +1,49 @@
+library multiple_variables_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::X::$type = $type, super core::Object::•()
+    ;
+  get $X$A() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get $X$B() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](1);
+  get $X$C() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](2);
+  get $X$D() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](3);
+  get $X$E() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](4);
+  get runtimeType() → core::Type
+    return this.{=self::X::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](14)));
+  dec::init(d, 1, new typ::Interface::•(d.[](14)));
+  dec::init(d, 2, new typ::Interface::•(d.[](14)));
+  dec::init(d, 3, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](3))]), new typ::Interface::•(d.[](17))]);
+  dec::init(d, 4, new typ::Interface::•(d.[](18)));
+  dec::init(d, 5, new typ::Interface::•(d.[](18)));
+  dec::init(d, 6, new typ::Interface::•(d.[](14)));
+  dec::init(d, 7, new typ::Interface::•(d.[](19)));
+  dec::init(d, 8, new typ::Interface::•(d.[](19)));
+  dec::init(d, 9, new typ::Interface::•(d.[](19)));
+  dec::init(d, 10, new typ::Interface::•(d.[](19)));
+  dec::init(d, 11, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](20))]);
+  dec::init(d, 12, new typ::Interface::•(d.[](13)));
+  dec::init(d, 13, new typ::Interface::•(d.[](19)));
+  dec::init(d, 14, null);
+  dec::init(d, 16, new typ::Interface::•(d.[](14)));
+  dec::init(d, 17, new typ::Interface::•(d.[](14)));
+  dec::init(d, 18, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](18))])]);
+  dec::init(d, 19, new typ::Interface::•(d.[](14)));
+  dec::init(d, 20, new typ::Interface::•(d.[](14)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["X", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {}
diff --git a/pkg/kernel/testcases/reify/native_types_test.dart b/pkg/kernel/testcases/reify/native_types_test.dart
new file mode 100644
index 0000000..08de359
--- /dev/null
+++ b/pkg/kernel/testcases/reify/native_types_test.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library native_types;
+
+import 'test_base.dart';
+
+abstract class C {}
+
+class D {}
+
+var foo = bar;
+var bar = foo;
+
+main() {
+  expectTrue(1 is int);
+  expectTrue(1 is! double);
+
+  expectTrue(new List<int>() is List<int>);
+  expectTrue(new List<int>() is! List<double>);
+  expectTrue("hest" is String);
+  expectTrue("hest" is! int);
+
+  expectTrue(null is! String);
+  expectTrue(null is dynamic);
+  expectTrue(null is Object);
+
+  expectTrue(true is bool);
+  expectTrue(true is! int);
+
+  // Test error and exception classes
+  expectThrows(() => new C(), (e) => e is AbstractClassInstantiationError);  /// 01: static type warning
+
+  expectThrows(() => new D().foo(), (e) => e is NoSuchMethodError);  /// 02: static type warning
+
+  expectThrows(() => foo, (e) => e is CyclicInitializationError);
+
+  expectThrows(() => [][1], (e) => e is RangeError);
+
+  expectTrue(new UnsupportedError("") is UnsupportedError);
+
+  expectTrue(new ArgumentError() is ArgumentError);
+
+  expectTrue(
+      new IntegerDivisionByZeroException() is IntegerDivisionByZeroException);
+}
diff --git a/pkg/kernel/testcases/reify/native_types_test.dart.expect b/pkg/kernel/testcases/reify/native_types_test.dart.expect
new file mode 100644
index 0000000..0000d2f
--- /dev/null
+++ b/pkg/kernel/testcases/reify/native_types_test.dart.expect
@@ -0,0 +1,453 @@
+library native_types;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "dart:mock" as mock;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+abstract class C extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class D extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function::context = context
+    ;
+  method call() → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function::context};
+    return throw int::attachType(new core::AbstractClassInstantiationError::•("C"), new typ::Interface::•(self::$declarations.[](3)));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#1 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#1::context = context
+    ;
+  method call(dynamic e) → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#1::context};
+    return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](3)));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](4));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#2 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#2::context = context
+    ;
+  method call() → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#2::context};
+    return new self::D::•().foo();
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](5));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#3 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#3::context = context
+    ;
+  method call(dynamic e) → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#3::context};
+    return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](7)));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](6));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#4 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#4::context = context
+    ;
+  method call() → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#4::context};
+    return self::foo;
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](8));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#5 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#5::context = context
+    ;
+  method call(dynamic e) → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#5::context};
+    return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](10)));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](9));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#6 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#6::context = context
+    ;
+  method call() → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#6::context};
+    return int::attachType(<dynamic>[], new typ::Interface::•(self::$declarations.[](12), <dynamic>[const typ::Dynamic::•()])).[](1);
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](11));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+class Closure#main#function#7 extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field mock::Context context;
+  constructor •(final mock::Context context) → dynamic
+    : self::Closure#main#function#7::context = context
+    ;
+  method call(dynamic e) → dynamic {
+    "This is a temporary solution. In the VM, this will become an additional parameter.";
+    final mock::Context #contextParameter = this.{self::Closure#main#function#7::context};
+    return typ::isSubtypeOf(int::type(e), new typ::Interface::•(self::$declarations.[](14)));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](13));
+  get $is$AbstractClassInstantiationError() → core::bool
+    return false;
+  get $is$NoSuchMethodError() → core::bool
+    return false;
+  get $is$CyclicInitializationError() → core::bool
+    return false;
+  get $is$RangeError() → core::bool
+    return false;
+  get $is$int() → core::bool
+    return false;
+  get $is$double() → core::bool
+    return false;
+  get $is$List() → core::bool
+    return false;
+  get $is$String() → core::bool
+    return false;
+  get $is$Object() → core::bool
+    return true;
+  get $is$bool() → core::bool
+    return false;
+  get $is$UnsupportedError() → core::bool
+    return false;
+  get $is$ArgumentError() → core::bool
+    return false;
+  get $is$IntegerDivisionByZeroException() → core::bool
+    return false;
+}
+static field dynamic foo = self::bar;
+static field dynamic bar = self::foo;
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](18)));
+  dec::init(d, 1, new typ::Interface::•(d.[](18)));
+  dec::init(d, 2, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
+  dec::init(d, 3, new typ::Interface::•(d.[](27)));
+  dec::init(d, 4, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 5, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
+  dec::init(d, 6, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 7, new typ::Interface::•(d.[](27)));
+  dec::init(d, 8, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
+  dec::init(d, 9, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 10, new typ::Interface::•(d.[](27)));
+  dec::init(d, 11, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[]));
+  dec::init(d, 12, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](28), <dynamic>[d.[](12).variables.[](0)])]);
+  dec::init(d, 13, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](26))], new typ::FunctionType::•(new typ::Interface::•(d.[](26)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 14, new typ::Interface::•(d.[](21)));
+  dec::init(d, 15, new typ::Interface::•(d.[](29)));
+  dec::init(d, 16, new typ::Interface::•(d.[](29)));
+  dec::init(d, 17, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](30), <dynamic>[new typ::Interface::•(d.[](17))]), new typ::Interface::•(d.[](31))]);
+  dec::init(d, 18, null);
+  dec::init(d, 19, new typ::Interface::•(d.[](18)));
+  dec::init(d, 20, new typ::Interface::•(d.[](27)));
+  dec::init(d, 21, new typ::Interface::•(d.[](27)));
+  dec::init(d, 22, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](32))]);
+  dec::init(d, 23, new typ::Interface::•(d.[](18)));
+  dec::init(d, 24, new typ::Interface::•(d.[](18)));
+  dec::init(d, 26, new typ::Interface::•(d.[](18)));
+  dec::init(d, 27, new typ::Interface::•(d.[](18)));
+  dec::init(d, 28, new typ::Interface::•(d.[](33), <dynamic>[d.[](28).variables.[](0)]));
+  dec::init(d, 29, new typ::Interface::•(d.[](18)), <dynamic>[new typ::Interface::•(d.[](30), <dynamic>[new typ::Interface::•(d.[](29))])]);
+  dec::init(d, 30, new typ::Interface::•(d.[](18)));
+  dec::init(d, 31, new typ::Interface::•(d.[](18)));
+  dec::init(d, 32, new typ::Interface::•(d.[](18)));
+  dec::init(d, 33, new typ::Interface::•(d.[](18)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["C", "D", "Closure#main#function", "AbstractClassInstantiationError", "Closure#main#function#1", "Closure#main#function#2", "Closure#main#function#3", "NoSuchMethodError", "Closure#main#function#4", "Closure#main#function#5", "CyclicInitializationError", "Closure#main#function#6", "List", "Closure#main#function#7", "RangeError", "int", "double", "String", "Object", "bool", "UnsupportedError", "ArgumentError", "IntegerDivisionByZeroException", "Null", "Type", "HasRuntimeTypeGetter", "Function", "Error", "EfficientLengthIterable", "num", "Comparable", "Pattern", "Exception", "Iterable"], <dynamic>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]));
+static method main() → dynamic {
+  tes::expectTrue(typ::isSubtypeOf(int::type(1), new typ::Interface::•(self::$declarations.[](15))));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(1), new typ::Interface::•(self::$declarations.[](16))));
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(core::List::_internal<core::int>(), new typ::Interface::•(self::$declarations.[](12), <dynamic>[new typ::Interface::•(self::$declarations.[](15))]))), new typ::Interface::•(self::$declarations.[](12), <dynamic>[new typ::Interface::•(self::$declarations.[](15))])));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(int::attachType(core::List::_internal<core::int>(), new typ::Interface::•(self::$declarations.[](12), <dynamic>[new typ::Interface::•(self::$declarations.[](15))]))), new typ::Interface::•(self::$declarations.[](12), <dynamic>[new typ::Interface::•(self::$declarations.[](16))])));
+  tes::expectTrue(typ::isSubtypeOf(int::type("hest"), new typ::Interface::•(self::$declarations.[](17))));
+  tes::expectTrue(!typ::isSubtypeOf(int::type("hest"), new typ::Interface::•(self::$declarations.[](15))));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(null), new typ::Interface::•(self::$declarations.[](17))));
+  tes::expectTrue(typ::isSubtypeOf(int::type(null), const typ::Dynamic::•()));
+  tes::expectTrue(typ::isSubtypeOf(int::type(null), new typ::Interface::•(self::$declarations.[](18))));
+  tes::expectTrue(typ::isSubtypeOf(int::type(true), new typ::Interface::•(self::$declarations.[](19))));
+  tes::expectTrue(!typ::isSubtypeOf(int::type(true), new typ::Interface::•(self::$declarations.[](15))));
+  tes::expectThrows(new self::Closure#main#function::•(null), new self::Closure#main#function#1::•(null));
+  tes::expectThrows(new self::Closure#main#function#2::•(null), new self::Closure#main#function#3::•(null));
+  tes::expectThrows(new self::Closure#main#function#4::•(null), new self::Closure#main#function#5::•(null));
+  tes::expectThrows(new self::Closure#main#function#6::•(null), new self::Closure#main#function#7::•(null));
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(new core::UnsupportedError::•(""), new typ::Interface::•(self::$declarations.[](20)))), new typ::Interface::•(self::$declarations.[](20))));
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(new core::ArgumentError::•(), new typ::Interface::•(self::$declarations.[](21)))), new typ::Interface::•(self::$declarations.[](21))));
+  tes::expectTrue(typ::isSubtypeOf(int::type(int::attachType(new core::IntegerDivisionByZeroException::•(), new typ::Interface::•(self::$declarations.[](22)))), new typ::Interface::•(self::$declarations.[](22))));
+}
diff --git a/pkg/kernel/testcases/reify/reuse_type_variables_test.dart b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart
new file mode 100644
index 0000000..1e6cdc2
--- /dev/null
+++ b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart
@@ -0,0 +1,42 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library reuse_type_variables_test;
+
+import 'test_base.dart';
+
+class X {}
+
+class Y {}
+
+class Z {}
+
+class C<T, U, V> {
+  foo() => new D<T, U, V>();
+  bar() => new E<T, U>();
+  hest() => new D<T, V, U>();
+}
+
+class D<T, U, V> {
+  baz() => new C<T, U, V>();
+}
+
+class E<T, U> {
+  qux() => new C<T, U, U>();
+}
+
+main() {
+  var c = new C<X, Y, Z>();
+  var d = c.foo();
+  expectTrue(d is D<X, Y, Z>);
+  d = c.hest();
+  expectTrue(d is! D<X, Y, Z>);
+  expectTrue(d is D<X, Z, Y>);
+  c = d.baz();
+  expectTrue(c is C<X, Z, Y>);
+  var e = c.bar();
+  expectTrue(e is E<X, Z>);
+  c = e.qux();
+  expectTrue(c is C<X, Z, Z>);
+}
diff --git a/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect
new file mode 100644
index 0000000..ebdfa26
--- /dev/null
+++ b/pkg/kernel/testcases/reify/reuse_type_variables_test.dart.expect
@@ -0,0 +1,162 @@
+library reuse_type_variables_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$D() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$E() → core::bool
+    return false;
+}
+class Y extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$D() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$E() → core::bool
+    return false;
+}
+class Z extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$D() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$E() → core::bool
+    return false;
+}
+class C extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::C::$type = $type, super core::Object::•()
+    ;
+  method foo() → dynamic {
+    return new self::D::•(new typ::Interface::•(self::$declarations.[](4), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3)))));
+  }
+  method bar() → dynamic {
+    return new self::E::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[this.$C$T, this.$C$U]));
+  }
+  method hest() → dynamic {
+    return new self::D::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[this.$C$T, this.$C$V, this.$C$U]));
+  }
+  get $C$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3))).[](0);
+  get $C$U() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3))).[](1);
+  get $C$V() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3))).[](2);
+  get $is$D() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return true;
+  get $is$E() → core::bool
+    return false;
+  get runtimeType() → core::Type
+    return this.{=self::C::$type};
+}
+class D extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::D::$type = $type, super core::Object::•()
+    ;
+  method baz() → dynamic {
+    return new self::C::•(new typ::Interface::•(self::$declarations.[](3), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](4)))));
+  }
+  get $D$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](4))).[](0);
+  get $D$U() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](4))).[](1);
+  get $D$V() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](4))).[](2);
+  get $is$D() → core::bool
+    return true;
+  get $is$C() → core::bool
+    return false;
+  get $is$E() → core::bool
+    return false;
+  get runtimeType() → core::Type
+    return this.{=self::D::$type};
+}
+class E extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::E::$type = $type, super core::Object::•()
+    ;
+  method qux() → dynamic {
+    return new self::C::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[this.$E$T, this.$E$U, this.$E$U]));
+  }
+  get $E$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](5))).[](0);
+  get $E$U() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](5))).[](1);
+  get $is$D() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$E() → core::bool
+    return true;
+  get runtimeType() → core::Type
+    return this.{=self::E::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](19)));
+  dec::init(d, 1, new typ::Interface::•(d.[](19)));
+  dec::init(d, 2, new typ::Interface::•(d.[](19)));
+  dec::init(d, 3, new typ::Interface::•(d.[](19)));
+  dec::init(d, 4, new typ::Interface::•(d.[](19)));
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](19)));
+  dec::init(d, 8, new typ::Interface::•(d.[](19)), <dynamic>[new typ::Interface::•(d.[](21), <dynamic>[new typ::Interface::•(d.[](8))]), new typ::Interface::•(d.[](22))]);
+  dec::init(d, 9, new typ::Interface::•(d.[](23)));
+  dec::init(d, 10, new typ::Interface::•(d.[](23)));
+  dec::init(d, 11, new typ::Interface::•(d.[](19)));
+  dec::init(d, 12, new typ::Interface::•(d.[](24)));
+  dec::init(d, 13, new typ::Interface::•(d.[](24)));
+  dec::init(d, 14, new typ::Interface::•(d.[](24)));
+  dec::init(d, 15, new typ::Interface::•(d.[](24)));
+  dec::init(d, 16, new typ::Interface::•(d.[](19)), <dynamic>[new typ::Interface::•(d.[](25))]);
+  dec::init(d, 17, new typ::Interface::•(d.[](18)));
+  dec::init(d, 18, new typ::Interface::•(d.[](24)));
+  dec::init(d, 19, null);
+  dec::init(d, 21, new typ::Interface::•(d.[](19)));
+  dec::init(d, 22, new typ::Interface::•(d.[](19)));
+  dec::init(d, 23, new typ::Interface::•(d.[](19)), <dynamic>[new typ::Interface::•(d.[](21), <dynamic>[new typ::Interface::•(d.[](23))])]);
+  dec::init(d, 24, new typ::Interface::•(d.[](19)));
+  dec::init(d, 25, new typ::Interface::•(d.[](19)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["X", "Y", "Z", "C", "D", "E", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 0, 3, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  dynamic c = new self::C::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]));
+  dynamic d = c.foo();
+  tes::expectTrue(let dynamic #t1 = d in #t1 is int::HasRuntimeTypeGetter && #t1.$is$D && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t1.$type, #t2)));
+  d = c.hest();
+  tes::expectTrue(!(let dynamic #t3 = d in #t3 is int::HasRuntimeTypeGetter && #t3.$is$D && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](1)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t3.$type, #t4))));
+  tes::expectTrue(let dynamic #t5 = d in #t5 is int::HasRuntimeTypeGetter && #t5.$is$D && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t5.$type, #t6)));
+  c = d.baz();
+  tes::expectTrue(let dynamic #t7 = c in #t7 is int::HasRuntimeTypeGetter && #t7.$is$C && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t7.$type, #t8)));
+  dynamic e = c.bar();
+  tes::expectTrue(let dynamic #t9 = e in #t9 is int::HasRuntimeTypeGetter && #t9.$is$E && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t9.$type, #t10)));
+  c = e.qux();
+  tes::expectTrue(let dynamic #t11 = c in #t11 is int::HasRuntimeTypeGetter && #t11.$is$C && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0)), new typ::Interface::•(self::$declarations.[](2)), new typ::Interface::•(self::$declarations.[](2))]) in typ::isSubtypeOf(#t11.$type, #t12)));
+}
diff --git a/pkg/kernel/testcases/reify/runtime_type_test.dart b/pkg/kernel/testcases/reify/runtime_type_test.dart
new file mode 100644
index 0000000..39b6b54
--- /dev/null
+++ b/pkg/kernel/testcases/reify/runtime_type_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library runtime_type_test;
+
+import 'test_base.dart';
+
+class A<T> {}
+
+class X {}
+
+class Y {}
+
+bool eqt(a, b) => a.runtimeType == b.runtimeType;
+
+main() {
+  expectTrue(eqt(new A(), new A<dynamic>()));
+  expectTrue(eqt(new A<X>(), new A<X>()));
+  expectFalse(eqt(new A<X>(), new A()));
+  expectFalse(eqt(new A<X>(), new A<Y>()));
+}
diff --git a/pkg/kernel/testcases/reify/runtime_type_test.dart.expect b/pkg/kernel/testcases/reify/runtime_type_test.dart.expect
new file mode 100644
index 0000000..360e853
--- /dev/null
+++ b/pkg/kernel/testcases/reify/runtime_type_test.dart.expect
@@ -0,0 +1,66 @@
+library runtime_type_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+}
+class Y extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](16)));
+  dec::init(d, 1, new typ::Interface::•(d.[](16)));
+  dec::init(d, 2, new typ::Interface::•(d.[](16)));
+  dec::init(d, 3, new typ::Interface::•(d.[](16)));
+  dec::init(d, 4, new typ::Interface::•(d.[](16)));
+  dec::init(d, 5, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](5))]), new typ::Interface::•(d.[](19))]);
+  dec::init(d, 6, new typ::Interface::•(d.[](20)));
+  dec::init(d, 7, new typ::Interface::•(d.[](20)));
+  dec::init(d, 8, new typ::Interface::•(d.[](16)));
+  dec::init(d, 9, new typ::Interface::•(d.[](21)));
+  dec::init(d, 10, new typ::Interface::•(d.[](21)));
+  dec::init(d, 11, new typ::Interface::•(d.[](21)));
+  dec::init(d, 12, new typ::Interface::•(d.[](21)));
+  dec::init(d, 13, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](22))]);
+  dec::init(d, 14, new typ::Interface::•(d.[](15)));
+  dec::init(d, 15, new typ::Interface::•(d.[](21)));
+  dec::init(d, 16, null);
+  dec::init(d, 18, new typ::Interface::•(d.[](16)));
+  dec::init(d, 19, new typ::Interface::•(d.[](16)));
+  dec::init(d, 20, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](20))])]);
+  dec::init(d, 21, new typ::Interface::•(d.[](16)));
+  dec::init(d, 22, new typ::Interface::•(d.[](16)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "X", "Y", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method eqt(dynamic a, dynamic b) → core::bool {
+  return a.runtimeType.==(b.runtimeType);
+}
+static method main() → dynamic {
+  tes::expectTrue(self::eqt(new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])), new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()]))));
+  tes::expectTrue(self::eqt(new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])), new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]))));
+  tes::expectFalse(self::eqt(new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])), new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()]))));
+  tes::expectFalse(self::eqt(new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])), new self::A::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](2))]))));
+}
diff --git a/pkg/kernel/testcases/reify/simple_test.dart b/pkg/kernel/testcases/reify/simple_test.dart
new file mode 100644
index 0000000..4a2d11f
--- /dev/null
+++ b/pkg/kernel/testcases/reify/simple_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library simple_test;
+
+import 'test_base.dart';
+
+class C {}
+
+class A implements C {}
+
+class B extends C {}
+
+class D extends B {}
+
+testIs(o) {
+  write(o is A);
+  write(o is B);
+  write(o is C);
+  write(o is D);
+}
+
+testIsNot(o) {
+  write(o is! A);
+  write(o is! B);
+  write(o is! C);
+  write(o is! D);
+}
+
+main() {
+  var objects = [new A(), new B(), new C(), new D()];
+  objects.forEach(testIs);
+  objects.forEach(testIsNot);
+
+  expectOutput("""
+true
+false
+true
+false
+false
+true
+true
+false
+false
+false
+true
+false
+false
+true
+true
+true
+false
+true
+false
+true
+true
+false
+false
+true
+true
+true
+false
+true
+true
+false
+false
+false""");
+}
diff --git a/pkg/kernel/testcases/reify/simple_test.dart.expect b/pkg/kernel/testcases/reify/simple_test.dart.expect
new file mode 100644
index 0000000..3023fe3
--- /dev/null
+++ b/pkg/kernel/testcases/reify/simple_test.dart.expect
@@ -0,0 +1,152 @@
+library simple_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class C extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return true;
+  get $is$D() → core::bool
+    return false;
+}
+class A extends core::Object implements self::C, int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$A() → core::bool
+    return true;
+  get $is$B() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return true;
+  get $is$D() → core::bool
+    return false;
+}
+class B extends self::C implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::C::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return true;
+  get $is$C() → core::bool
+    return true;
+  get $is$D() → core::bool
+    return false;
+}
+class D extends self::B implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::B::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](3));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return true;
+  get $is$C() → core::bool
+    return true;
+  get $is$D() → core::bool
+    return true;
+}
+class Closure#testIs extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(dynamic o) → dynamic
+    return self::testIs(o);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](4));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$D() → core::bool
+    return false;
+}
+class Closure#testIsNot extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  constructor •() → dynamic
+    ;
+  method call(dynamic o) → dynamic
+    return self::testIsNot(o);
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](5));
+  get $is$A() → core::bool
+    return false;
+  get $is$B() → core::bool
+    return false;
+  get $is$C() → core::bool
+    return false;
+  get $is$D() → core::bool
+    return false;
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](20)));
+  dec::init(d, 1, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](0))]);
+  dec::init(d, 2, new typ::Interface::•(d.[](0)));
+  dec::init(d, 3, new typ::Interface::•(d.[](2)));
+  dec::init(d, 4, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22))], new typ::FunctionType::•(new typ::Interface::•(d.[](22)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 5, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22))], new typ::FunctionType::•(new typ::Interface::•(d.[](22)), const typ::Dynamic::•(), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 6, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](23), <dynamic>[d.[](6).variables.[](0)])]);
+  dec::init(d, 7, new typ::Interface::•(d.[](20)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](24), <dynamic>[new typ::Interface::•(d.[](9))]), new typ::Interface::•(d.[](25))]);
+  dec::init(d, 10, new typ::Interface::•(d.[](26)));
+  dec::init(d, 11, new typ::Interface::•(d.[](26)));
+  dec::init(d, 12, new typ::Interface::•(d.[](20)));
+  dec::init(d, 13, new typ::Interface::•(d.[](27)));
+  dec::init(d, 14, new typ::Interface::•(d.[](27)));
+  dec::init(d, 15, new typ::Interface::•(d.[](27)));
+  dec::init(d, 16, new typ::Interface::•(d.[](27)));
+  dec::init(d, 17, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](28))]);
+  dec::init(d, 18, new typ::Interface::•(d.[](19)));
+  dec::init(d, 19, new typ::Interface::•(d.[](27)));
+  dec::init(d, 20, null);
+  dec::init(d, 22, new typ::Interface::•(d.[](20)));
+  dec::init(d, 23, new typ::Interface::•(d.[](29), <dynamic>[d.[](23).variables.[](0)]));
+  dec::init(d, 24, new typ::Interface::•(d.[](20)));
+  dec::init(d, 25, new typ::Interface::•(d.[](20)));
+  dec::init(d, 26, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](24), <dynamic>[new typ::Interface::•(d.[](26))])]);
+  dec::init(d, 27, new typ::Interface::•(d.[](20)));
+  dec::init(d, 28, new typ::Interface::•(d.[](20)));
+  dec::init(d, 29, new typ::Interface::•(d.[](20)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["C", "A", "B", "D", "Closure#testIs", "Closure#testIsNot", "List", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Function", "EfficientLengthIterable", "Comparable", "Pattern", "num", "Error", "Exception", "Iterable"], <dynamic>[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1]));
+static method testIs(dynamic o) → dynamic {
+  tes::write(let dynamic #t1 = o in #t1 is int::HasRuntimeTypeGetter && #t1.$is$A);
+  tes::write(let dynamic #t2 = o in #t2 is int::HasRuntimeTypeGetter && #t2.$is$B);
+  tes::write(let dynamic #t3 = o in #t3 is int::HasRuntimeTypeGetter && #t3.$is$C);
+  tes::write(let dynamic #t4 = o in #t4 is int::HasRuntimeTypeGetter && #t4.$is$D);
+}
+static method testIsNot(dynamic o) → dynamic {
+  tes::write(!(let dynamic #t5 = o in #t5 is int::HasRuntimeTypeGetter && #t5.$is$A));
+  tes::write(!(let dynamic #t6 = o in #t6 is int::HasRuntimeTypeGetter && #t6.$is$B));
+  tes::write(!(let dynamic #t7 = o in #t7 is int::HasRuntimeTypeGetter && #t7.$is$C));
+  tes::write(!(let dynamic #t8 = o in #t8 is int::HasRuntimeTypeGetter && #t8.$is$D));
+}
+static method main() → dynamic {
+  dynamic objects = int::attachType(<dynamic>[new self::A::•(), new self::B::•(), new self::C::•(), new self::D::•()], new typ::Interface::•(self::$declarations.[](6), <dynamic>[const typ::Dynamic::•()]));
+  objects.forEach(new self::Closure#testIs::•());
+  objects.forEach(new self::Closure#testIsNot::•());
+  tes::expectOutput("true\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse\ntrue\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\nfalse\ntrue\ntrue\nfalse\nfalse\ntrue\ntrue\ntrue\nfalse\ntrue\ntrue\nfalse\nfalse\nfalse");
+}
diff --git a/pkg/kernel/testcases/reify/subclass_test.dart b/pkg/kernel/testcases/reify/subclass_test.dart
new file mode 100644
index 0000000..5b5b6bc
--- /dev/null
+++ b/pkg/kernel/testcases/reify/subclass_test.dart
@@ -0,0 +1,35 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library superclass_test;
+
+import 'test_base.dart';
+
+class X {}
+
+class Y {}
+
+class R<T> {}
+
+class A<T> {
+  foo() => new R<T>();
+}
+
+class B<T> extends A<T> {}
+
+class C<T> extends A<Y> {}
+
+class D<T> extends B<R<T>> {}
+
+main() {
+  expectTrue(new A<X>().foo() is R<X>);
+  expectTrue(new B<X>().foo() is R<X>);
+  expectTrue(new C<X>().foo() is R<Y>);
+  expectTrue(new D<X>().foo() is R<R<X>>);
+
+  expectTrue(new A<X>().foo() is! R<Y>);
+  expectTrue(new B<X>().foo() is! R<Y>);
+  expectTrue(new C<X>().foo() is! R<X>);
+  expectTrue(new D<X>().foo() is! R<R<Y>>);
+}
diff --git a/pkg/kernel/testcases/reify/subclass_test.dart.expect b/pkg/kernel/testcases/reify/subclass_test.dart.expect
new file mode 100644
index 0000000..55d42f8
--- /dev/null
+++ b/pkg/kernel/testcases/reify/subclass_test.dart.expect
@@ -0,0 +1,119 @@
+library superclass_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "./test_base.dart" as tes;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+  get $is$R() → core::bool
+    return false;
+}
+class Y extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+  get $is$R() → core::bool
+    return false;
+}
+class R extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::R::$type = $type, super core::Object::•()
+    ;
+  get $R$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](2))).[](0);
+  get $is$R() → core::bool
+    return true;
+  get runtimeType() → core::Type
+    return this.{=self::R::$type};
+}
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  method foo() → dynamic {
+    return new self::R::•(new typ::Interface::•(self::$declarations.[](2), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3)))));
+  }
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](3))).[](0);
+  get $is$R() → core::bool
+    return false;
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •(typ::ReifiedType $type) → void
+    : super self::A::•($type)
+    ;
+  get $B$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](4))).[](0);
+  get $is$R() → core::bool
+    return false;
+}
+class C extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •(typ::ReifiedType $type) → void
+    : super self::A::•($type)
+    ;
+  get $C$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](5))).[](0);
+  get $is$R() → core::bool
+    return false;
+}
+class D extends self::B implements int::HasRuntimeTypeGetter {
+  constructor •(typ::ReifiedType $type) → void
+    : super self::B::•($type)
+    ;
+  get $D$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](6))).[](0);
+  get $is$R() → core::bool
+    return false;
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](20)));
+  dec::init(d, 1, new typ::Interface::•(d.[](20)));
+  dec::init(d, 2, new typ::Interface::•(d.[](20)));
+  dec::init(d, 3, new typ::Interface::•(d.[](20)));
+  dec::init(d, 4, new typ::Interface::•(d.[](3), <dynamic>[d.[](4).variables.[](0)]));
+  dec::init(d, 5, new typ::Interface::•(d.[](3), <dynamic>[new typ::Interface::•(d.[](1))]));
+  dec::init(d, 6, new typ::Interface::•(d.[](4), <dynamic>[new typ::Interface::•(d.[](2), <dynamic>[d.[](6).variables.[](0)])]));
+  dec::init(d, 7, new typ::Interface::•(d.[](20)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22), <dynamic>[new typ::Interface::•(d.[](9))]), new typ::Interface::•(d.[](23))]);
+  dec::init(d, 10, new typ::Interface::•(d.[](24)));
+  dec::init(d, 11, new typ::Interface::•(d.[](24)));
+  dec::init(d, 12, new typ::Interface::•(d.[](20)));
+  dec::init(d, 13, new typ::Interface::•(d.[](25)));
+  dec::init(d, 14, new typ::Interface::•(d.[](25)));
+  dec::init(d, 15, new typ::Interface::•(d.[](25)));
+  dec::init(d, 16, new typ::Interface::•(d.[](25)));
+  dec::init(d, 17, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](26))]);
+  dec::init(d, 18, new typ::Interface::•(d.[](19)));
+  dec::init(d, 19, new typ::Interface::•(d.[](25)));
+  dec::init(d, 20, null);
+  dec::init(d, 22, new typ::Interface::•(d.[](20)));
+  dec::init(d, 23, new typ::Interface::•(d.[](20)));
+  dec::init(d, 24, new typ::Interface::•(d.[](20)), <dynamic>[new typ::Interface::•(d.[](22), <dynamic>[new typ::Interface::•(d.[](24))])]);
+  dec::init(d, 25, new typ::Interface::•(d.[](20)));
+  dec::init(d, 26, new typ::Interface::•(d.[](20)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["X", "Y", "R", "A", "B", "C", "D", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  tes::expectTrue(let dynamic #t1 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t1 is int::HasRuntimeTypeGetter && #t1.$is$R && (let dynamic #t2 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t1.$type, #t2)));
+  tes::expectTrue(let dynamic #t3 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t3 is int::HasRuntimeTypeGetter && #t3.$is$R && (let dynamic #t4 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t3.$type, #t4)));
+  tes::expectTrue(let dynamic #t5 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t5 is int::HasRuntimeTypeGetter && #t5.$is$R && (let dynamic #t6 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t5.$type, #t6)));
+  tes::expectTrue(let dynamic #t7 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t7 is int::HasRuntimeTypeGetter && #t7.$is$R && (let dynamic #t8 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])]) in typ::isSubtypeOf(#t7.$type, #t8)));
+  tes::expectTrue(!(let dynamic #t9 = new self::A::•(new typ::Interface::•(self::$declarations.[](3), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t9 is int::HasRuntimeTypeGetter && #t9.$is$R && (let dynamic #t10 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t9.$type, #t10))));
+  tes::expectTrue(!(let dynamic #t11 = new self::B::•(new typ::Interface::•(self::$declarations.[](4), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t11 is int::HasRuntimeTypeGetter && #t11.$is$R && (let dynamic #t12 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))]) in typ::isSubtypeOf(#t11.$type, #t12))));
+  tes::expectTrue(!(let dynamic #t13 = new self::C::•(new typ::Interface::•(self::$declarations.[](5), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t13 is int::HasRuntimeTypeGetter && #t13.$is$R && (let dynamic #t14 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]) in typ::isSubtypeOf(#t13.$type, #t14))));
+  tes::expectTrue(!(let dynamic #t15 = new self::D::•(new typ::Interface::•(self::$declarations.[](6), <dynamic>[new typ::Interface::•(self::$declarations.[](0))])).foo() in #t15 is int::HasRuntimeTypeGetter && #t15.$is$R && (let dynamic #t16 = new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](2), <dynamic>[new typ::Interface::•(self::$declarations.[](1))])]) in typ::isSubtypeOf(#t15.$type, #t16))));
+}
diff --git a/pkg/kernel/testcases/reify/super1_test.dart b/pkg/kernel/testcases/reify/super1_test.dart
new file mode 100644
index 0000000..bd007ff
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super1_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library super1_test;
+
+import 'test_base.dart';
+
+class A<T> {}
+
+class B<T> extends A<T> {
+  int i;
+  B(this.i) : super();
+
+  B.redirect() : this(42);
+}
+
+main() {}
diff --git a/pkg/kernel/testcases/reify/super1_test.dart.expect b/pkg/kernel/testcases/reify/super1_test.dart.expect
new file mode 100644
index 0000000..8b3d20d
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super1_test.dart.expect
@@ -0,0 +1,53 @@
+library super1_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  field core::int i;
+  constructor •(typ::ReifiedType $type, core::int i) → void
+    : self::B::i = i, super self::A::•($type)
+    ;
+  constructor redirect(typ::ReifiedType $type) → void
+    : this self::B::•($type, 42)
+    ;
+  get $B$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0), <dynamic>[d.[](1).variables.[](0)]));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)));
+  dec::init(d, 10, new typ::Interface::•(d.[](20)));
+  dec::init(d, 11, new typ::Interface::•(d.[](20)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](20)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
+  dec::init(d, 20, new typ::Interface::•(d.[](15)));
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {}
diff --git a/pkg/kernel/testcases/reify/super2_test.dart b/pkg/kernel/testcases/reify/super2_test.dart
new file mode 100644
index 0000000..0707d4a
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super2_test.dart
@@ -0,0 +1,15 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library super2_test;
+
+import 'test_base.dart';
+
+class X {}
+
+class A<T> {}
+
+class B extends A<X> {}
+
+main() {}
diff --git a/pkg/kernel/testcases/reify/super2_test.dart.expect b/pkg/kernel/testcases/reify/super2_test.dart.expect
new file mode 100644
index 0000000..eb95978
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super2_test.dart.expect
@@ -0,0 +1,57 @@
+library super2_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class X extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+}
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::A::•(null)
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](2));
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](16)));
+  dec::init(d, 1, new typ::Interface::•(d.[](16)));
+  dec::init(d, 2, new typ::Interface::•(d.[](1), <dynamic>[new typ::Interface::•(d.[](0))]));
+  dec::init(d, 3, new typ::Interface::•(d.[](16)));
+  dec::init(d, 4, new typ::Interface::•(d.[](16)));
+  dec::init(d, 5, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](5))]), new typ::Interface::•(d.[](19))]);
+  dec::init(d, 6, new typ::Interface::•(d.[](20)));
+  dec::init(d, 7, new typ::Interface::•(d.[](20)));
+  dec::init(d, 8, new typ::Interface::•(d.[](16)));
+  dec::init(d, 9, new typ::Interface::•(d.[](21)));
+  dec::init(d, 10, new typ::Interface::•(d.[](21)));
+  dec::init(d, 11, new typ::Interface::•(d.[](21)));
+  dec::init(d, 12, new typ::Interface::•(d.[](21)));
+  dec::init(d, 13, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](22))]);
+  dec::init(d, 14, new typ::Interface::•(d.[](15)));
+  dec::init(d, 15, new typ::Interface::•(d.[](21)));
+  dec::init(d, 16, null);
+  dec::init(d, 18, new typ::Interface::•(d.[](16)));
+  dec::init(d, 19, new typ::Interface::•(d.[](16)));
+  dec::init(d, 20, new typ::Interface::•(d.[](16)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](20))])]);
+  dec::init(d, 21, new typ::Interface::•(d.[](16)));
+  dec::init(d, 22, new typ::Interface::•(d.[](16)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["X", "A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {}
diff --git a/pkg/kernel/testcases/reify/super3_test.dart b/pkg/kernel/testcases/reify/super3_test.dart
new file mode 100644
index 0000000..4de6a33
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super3_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE.md file.
+
+library super3_test;
+
+import 'test_base.dart';
+
+class A<T> {
+  get foo => T;
+}
+
+class B extends A<A> {
+  B();
+  B.redirect() : this();
+}
+
+main() {
+  new B().foo;
+  new B.redirect();
+}
diff --git a/pkg/kernel/testcases/reify/super3_test.dart.expect b/pkg/kernel/testcases/reify/super3_test.dart.expect
new file mode 100644
index 0000000..7ced8ac
--- /dev/null
+++ b/pkg/kernel/testcases/reify/super3_test.dart.expect
@@ -0,0 +1,58 @@
+library super3_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class A extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::A::$type = $type, super core::Object::•()
+    ;
+  get foo() → dynamic {
+    return dynamic;
+  }
+  get $A$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::A::$type};
+}
+class B extends self::A implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super self::A::•(null)
+    ;
+  constructor redirect() → void
+    : this self::B::•()
+    ;
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](1));
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](0), <dynamic>[new typ::Interface::•(d.[](0), <dynamic>[const typ::Dynamic::•()])]));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)));
+  dec::init(d, 10, new typ::Interface::•(d.[](20)));
+  dec::init(d, 11, new typ::Interface::•(d.[](20)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](20)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
+  dec::init(d, 20, new typ::Interface::•(d.[](15)));
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["A", "B", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  new self::B::•().foo;
+  new self::B::redirect();
+}
diff --git a/pkg/kernel/testcases/reify/test_base.dart b/pkg/kernel/testcases/reify/test_base.dart
new file mode 100644
index 0000000..696cb73
--- /dev/null
+++ b/pkg/kernel/testcases/reify/test_base.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test_base;
+
+expectIs(expected, actual, [String note]) {
+  if (expected != actual) {
+    if (note != null) {
+      throw "Expected: '$expected': $note, actual: '$actual'";
+    }
+    throw "Expected: '$expected', actual: '$actual'";
+  }
+}
+
+expectTrue(actual) => expectIs(true, actual);
+
+expectFalse(actual) => expectIs(false, actual);
+
+expectThrows(f(), test(e)) {
+  var exception = false;
+  String note = null;
+  try {
+    f();
+  } catch (e) {
+    exception = test(e);
+    if (!exception) {
+      note = "$e [${e.runtimeType}]";
+    }
+  }
+  expectIs(true, exception, note);
+}
+
+expectOutput(String expected) => expectIs(expected, output);
+
+String output;
+
+write(o) {
+  output = output == null ? "$o" : "$output\n$o";
+}
diff --git a/pkg/kernel/testcases/reify/typevariable1_test.dart b/pkg/kernel/testcases/reify/typevariable1_test.dart
new file mode 100644
index 0000000..306a076
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable1_test.dart
@@ -0,0 +1,21 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library typevariable1_test;
+
+import 'test_base.dart';
+
+class Z {
+  get succ => new N<Z>();
+}
+
+class N<T> {
+  get succ => new N<N<T>>();
+  get pred => T;
+}
+
+main() {
+  var one = new Z().succ;
+  var two = one.succ;
+}
diff --git a/pkg/kernel/testcases/reify/typevariable1_test.dart.expect b/pkg/kernel/testcases/reify/typevariable1_test.dart.expect
new file mode 100644
index 0000000..6feca7a
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable1_test.dart.expect
@@ -0,0 +1,61 @@
+library typevariable1_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class Z extends core::Object implements int::HasRuntimeTypeGetter {
+  constructor •() → void
+    : super core::Object::•()
+    ;
+  get succ() → dynamic {
+    return new self::N::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](0))]));
+  }
+  get $type() → typ::ReifiedType
+    return new typ::Interface::•(self::$declarations.[](0));
+}
+class N extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::N::$type = $type, super core::Object::•()
+    ;
+  get succ() → dynamic {
+    return new self::N::•(new typ::Interface::•(self::$declarations.[](1), <dynamic>[new typ::Interface::•(self::$declarations.[](1), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))))]));
+  }
+  get pred() → dynamic {
+    return dynamic;
+  }
+  get $N$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::N::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](15)));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](18))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](19)));
+  dec::init(d, 6, new typ::Interface::•(d.[](19)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](20)));
+  dec::init(d, 9, new typ::Interface::•(d.[](20)));
+  dec::init(d, 10, new typ::Interface::•(d.[](20)));
+  dec::init(d, 11, new typ::Interface::•(d.[](20)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](21))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](20)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17), <dynamic>[new typ::Interface::•(d.[](19))])]);
+  dec::init(d, 20, new typ::Interface::•(d.[](15)));
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["Z", "N", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  dynamic one = new self::Z::•().succ;
+  dynamic two = one.succ;
+}
diff --git a/pkg/kernel/testcases/reify/typevariable2_test.dart b/pkg/kernel/testcases/reify/typevariable2_test.dart
new file mode 100644
index 0000000..1b4a0cd
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable2_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library typevariable2_test;
+
+import 'test_base.dart';
+
+class C<T> {
+  bool test(o) => o is T;
+  Type get t => T;
+}
+
+main() {}
diff --git a/pkg/kernel/testcases/reify/typevariable2_test.dart.expect b/pkg/kernel/testcases/reify/typevariable2_test.dart.expect
new file mode 100644
index 0000000..d6a878f
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable2_test.dart.expect
@@ -0,0 +1,65 @@
+library typevariable2_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class C extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::C::$type = $type, super core::Object::•()
+    ;
+  method test(dynamic o) → core::bool {
+    return typ::isSubtypeOf(int::type(o), this.$C$T);
+  }
+  get t() → core::Type {
+    return dynamic;
+  }
+  get test#get() → dynamic
+    return new self::Closure#C#test::•(new typ::Interface::•(self::$declarations.[](1), typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0)))), this);
+  get $C$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::C::$type};
+}
+class Closure#C#test extends core::Object implements core::Function, int::HasRuntimeTypeGetter {
+  field core::String note = "This is temporary. The VM doesn't need closure classes.";
+  field self::C self;
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type, final self::C self) → dynamic
+    : self::Closure#C#test::$type = $type, self::Closure#C#test::self = self
+    ;
+  method call(dynamic o) → core::bool
+    return this.{self::Closure#C#test::self}.{self::C::test}(o);
+  get $Closure#C#test$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](1))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::Closure#C#test::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](15)));
+  dec::init(d, 1, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](17))], new typ::FunctionType::•(new typ::Interface::•(d.[](17)), new typ::Interface::•(d.[](3)), 0, <dynamic>[const typ::Dynamic::•()]));
+  dec::init(d, 2, new typ::Interface::•(d.[](15)));
+  dec::init(d, 3, new typ::Interface::•(d.[](15)));
+  dec::init(d, 4, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](4))]), new typ::Interface::•(d.[](19))]);
+  dec::init(d, 5, new typ::Interface::•(d.[](20)));
+  dec::init(d, 6, new typ::Interface::•(d.[](20)));
+  dec::init(d, 7, new typ::Interface::•(d.[](15)));
+  dec::init(d, 8, new typ::Interface::•(d.[](21)));
+  dec::init(d, 9, new typ::Interface::•(d.[](21)));
+  dec::init(d, 10, new typ::Interface::•(d.[](21)));
+  dec::init(d, 11, new typ::Interface::•(d.[](21)));
+  dec::init(d, 12, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](22))]);
+  dec::init(d, 13, new typ::Interface::•(d.[](14)));
+  dec::init(d, 14, new typ::Interface::•(d.[](21)));
+  dec::init(d, 15, null);
+  dec::init(d, 17, new typ::Interface::•(d.[](15)));
+  dec::init(d, 18, new typ::Interface::•(d.[](15)));
+  dec::init(d, 19, new typ::Interface::•(d.[](15)));
+  dec::init(d, 20, new typ::Interface::•(d.[](15)), <dynamic>[new typ::Interface::•(d.[](18), <dynamic>[new typ::Interface::•(d.[](20))])]);
+  dec::init(d, 21, new typ::Interface::•(d.[](15)));
+  dec::init(d, 22, new typ::Interface::•(d.[](15)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["C", "Closure#C#test", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Function", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {}
diff --git a/pkg/kernel/testcases/reify/typevariable3_test.dart b/pkg/kernel/testcases/reify/typevariable3_test.dart
new file mode 100644
index 0000000..f7ecef8
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable3_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library typevariable3_test;
+
+import 'test_base.dart';
+
+class C<T> {
+  T foo(T t) {
+    T temp = t;
+    return temp;
+  }
+}
+
+main() {
+  C c = new C<C>().foo(new C());
+}
diff --git a/pkg/kernel/testcases/reify/typevariable3_test.dart.expect b/pkg/kernel/testcases/reify/typevariable3_test.dart.expect
new file mode 100644
index 0000000..c8e09ce
--- /dev/null
+++ b/pkg/kernel/testcases/reify/typevariable3_test.dart.expect
@@ -0,0 +1,47 @@
+library typevariable3_test;
+import self as self;
+import "dart:core" as core;
+import "../../runtime/reify/interceptors.dart" as int;
+import "../../runtime/reify/types.dart" as typ;
+import "../../runtime/reify/declarations.dart" as dec;
+
+class C extends core::Object implements int::HasRuntimeTypeGetter {
+  final field typ::ReifiedType $type;
+  constructor •(typ::ReifiedType $type) → void
+    : self::C::$type = $type, super core::Object::•()
+    ;
+  method foo(dynamic t) → dynamic {
+    dynamic temp = t;
+    return temp;
+  }
+  get $C$T() → typ::ReifiedType
+    return typ::getTypeArguments(typ::asInstanceOf(this.$type, self::$declarations.[](0))).[](0);
+  get runtimeType() → core::Type
+    return this.{=self::C::$type};
+}
+static final field core::List<dec::Class> $declarations = (core::List<dec::Class> d) → core::List<dec::Class> {
+  dec::init(d, 0, new typ::Interface::•(d.[](14)));
+  dec::init(d, 1, new typ::Interface::•(d.[](14)));
+  dec::init(d, 2, new typ::Interface::•(d.[](14)));
+  dec::init(d, 3, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](3))]), new typ::Interface::•(d.[](17))]);
+  dec::init(d, 4, new typ::Interface::•(d.[](18)));
+  dec::init(d, 5, new typ::Interface::•(d.[](18)));
+  dec::init(d, 6, new typ::Interface::•(d.[](14)));
+  dec::init(d, 7, new typ::Interface::•(d.[](19)));
+  dec::init(d, 8, new typ::Interface::•(d.[](19)));
+  dec::init(d, 9, new typ::Interface::•(d.[](19)));
+  dec::init(d, 10, new typ::Interface::•(d.[](19)));
+  dec::init(d, 11, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](20))]);
+  dec::init(d, 12, new typ::Interface::•(d.[](13)));
+  dec::init(d, 13, new typ::Interface::•(d.[](19)));
+  dec::init(d, 14, null);
+  dec::init(d, 16, new typ::Interface::•(d.[](14)));
+  dec::init(d, 17, new typ::Interface::•(d.[](14)));
+  dec::init(d, 18, new typ::Interface::•(d.[](14)), <dynamic>[new typ::Interface::•(d.[](16), <dynamic>[new typ::Interface::•(d.[](18))])]);
+  dec::init(d, 19, new typ::Interface::•(d.[](14)));
+  dec::init(d, 20, new typ::Interface::•(d.[](14)));
+  return d;
+}.call(dec::allocateDeclarations(<dynamic>["C", "Null", "bool", "String", "int", "double", "Type", "AbstractClassInstantiationError", "NoSuchMethodError", "CyclicInitializationError", "UnsupportedError", "IntegerDivisionByZeroException", "RangeError", "ArgumentError", "Object", "HasRuntimeTypeGetter", "Comparable", "Pattern", "num", "Error", "Exception"], <dynamic>[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]));
+static method main() → dynamic {
+  self::C c = new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])])).foo(new self::C::•(new typ::Interface::•(self::$declarations.[](0), <dynamic>[const typ::Dynamic::•()])));
+}
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 83593b4..eef45df 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -29,6 +29,11 @@
 
 front_end/test/fasta/compile_test: Pass, Slow
 
+# Skip tests for Generic Types Reification. These tests aren't meant to
+# be run. Instead, they are transformed by the reify transformation
+# routines and compared atainst the expected outcomes.
+kernel/testcases/reify/*: Skip
+
 [ $runtime != vm || $mode != release || $system == windows ]
 front_end/test/fasta/*: Skip
 
@@ -61,7 +66,9 @@
 
 [ $runtime == vm && $checked ]
 analysis_server/test/completion_test: Pass, Slow
+analysis_server/test/services/correction/fix_test: Pass, Slow
 analysis_server/test/socket_server_test: Skip # Pass, Slow
+analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
 
 [ $runtime == vm && $checked && $system == windows ]
 front_end/tool/perf_test: Slow, Pass
@@ -76,6 +83,9 @@
 front_end/test/incremental_resolved_ast_generator_test: Skip # Issue 28698
 front_end/tool/perf_test: Skip # Issue 28698
 
+[ $runtime == vm && $use_sdk == true ]
+front_end/tool/fasta_perf_test: SkipByDesign # depends on patched_sdk which is not built into the sdk
+
 [ $runtime == vm && $system == windows]
 analysis_server/*: Skip # Issue 27557
 analysis_server/test/analysis/get_errors_test: Skip # runtime error, Issue 22180
@@ -255,3 +265,6 @@
 
 [ $compiler == none ]
 kernel/test/closures_test: Fail
+
+[ $runtime == vm && $system == windows ]
+analyzer_cli/test/driver_test: Pass, Slow
diff --git a/pkg/pkgbuild.status b/pkg/pkgbuild.status
index 4fbd4ac..11219b2 100644
--- a/pkg/pkgbuild.status
+++ b/pkg/pkgbuild.status
@@ -9,3 +9,6 @@
 pkg/front_end: Fail # Issue 27655
 pkg/kernel: SkipByDesign # Issue 27937
 third_party/pkg/linter: SkipByDesign # Issue 27937
+
+[ $system == windows ]
+third_party/pkg/*: Pass, Slow
diff --git a/pkg/testing/lib/src/analyze.dart b/pkg/testing/lib/src/analyze.dart
index 1a7503a..c976020 100644
--- a/pkg/testing/lib/src/analyze.dart
+++ b/pkg/testing/lib/src/analyze.dart
@@ -26,11 +26,13 @@
     Suite;
 
 class Analyze extends Suite {
+  final Uri analysisOptions;
+
   final List<Uri> uris;
 
   final List<RegExp> exclude;
 
-  Analyze(this.uris, this.exclude)
+  Analyze(this.analysisOptions, this.uris, this.exclude)
       : super("analyze", "analyze", null);
 
   Future<Null> run(Uri packages, List<Uri> extraUris) {
@@ -38,18 +40,21 @@
     if (extraUris != null) {
       allUris.addAll(extraUris);
     }
-    return analyzeUris(packages, allUris, exclude);
+    return analyzeUris(analysisOptions, packages, allUris, exclude);
   }
 
   static Future<Analyze> fromJsonMap(
       Uri base, Map json, List<Suite> suites) async {
+    String optionsPath = json["options"];
+    Uri optionsUri = optionsPath == null ? null : base.resolve(optionsPath);
+
     List<Uri> uris = new List<Uri>.from(
         json["uris"].map((String relative) => base.resolve(relative)));
 
     List<RegExp> exclude =
         new List<RegExp>.from(json["exclude"].map((String p) => new RegExp(p)));
 
-    return new Analyze(uris, exclude);
+    return new Analyze(optionsUri, uris, exclude);
   }
 
   String toString() => "Analyze($uris, $exclude)";
@@ -104,7 +109,8 @@
 
 /// Run dartanalyzer on all tests in [uris].
 Future<Null> analyzeUris(
-    Uri packages, List<Uri> uris, List<RegExp> exclude) async {
+    Uri analysisOptions, Uri packages, List<Uri> uris,
+    List<RegExp> exclude) async {
   if (uris.isEmpty) return;
   const String analyzerPath = "bin/dartanalyzer";
   Uri analyzer = dartSdk.resolve(analyzerPath);
@@ -116,6 +122,9 @@
       "--package-warnings",
       "--format=machine",
   ];
+  if (analysisOptions != null) {
+    arguments.add("--options=${analysisOptions.toFilePath()}");
+  }
   arguments.addAll(uris.map((Uri uri) => uri.toFilePath()));
   if (isVerbose) {
     print("Running:\n  ${analyzer.toFilePath()} ${arguments.join(' ')}");
@@ -135,9 +144,6 @@
   Set<String> seen = new Set<String>();
   for (AnalyzerDiagnostic diagnostic in diagnostics) {
     String path = diagnostic.uri.path;
-    if (diagnostic.code == "DEPRECATED_MEMBER_USE") continue;
-    if (diagnostic.code == "MISSING_RETURN") continue;
-    if (diagnostic.code == "UNNECESSARY_CAST") continue;
     if (exclude.any((RegExp r) => path.contains(r))) continue;
     String message = "$diagnostic";
     if (seen.add(message)) {
diff --git a/pkg/testing/lib/src/run_tests.dart b/pkg/testing/lib/src/run_tests.dart
index bc29a3b..c439468 100644
--- a/pkg/testing/lib/src/run_tests.dart
+++ b/pkg/testing/lib/src/run_tests.dart
@@ -115,7 +115,7 @@
               return fail(
                   "Usage: run_tests.dart [$configPrefix=configuration_file]\n"
                   "Where configuration_file is one of:\n  "
-                  "${candiates.map((File file) => file.path).join('\n  ')}");
+                  "${candiates.map((file) => file.path).join('\n  ')}");
           }
         }
       }
diff --git a/pkg/testing/lib/src/test_dart.dart b/pkg/testing/lib/src/test_dart.dart
index 8c89ed5..9b6ce7e 100644
--- a/pkg/testing/lib/src/test_dart.dart
+++ b/pkg/testing/lib/src/test_dart.dart
@@ -29,8 +29,7 @@
 
   factory TestDart.fromJsonMap(Uri base, Map json, String name, String kind) {
     String common = json["common"] ?? "";
-    // TODO(ahe): Compute this value based on number of cores.
-    String processes = json["processes"] ?? "-j16";
+    String processes = json["processes"] ?? "-j${Platform.numberOfProcessors}";
     List<String> commandLines = json["command-lines"] ?? <String>[];
     return new TestDart(name, common, processes, commandLines);
   }
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 3404bbf..0f41578 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -482,9 +482,11 @@
   args = [
     "--executable",
     rebase_path("$gen_snapshot_dir/gen_snapshot"),
+    "--snapshot_kind",
+    "core",
     "--vm_output_bin",
     rebase_path(vm_isolate_snapshot, root_build_dir),
-    "--output_bin",
+    "--isolate_output_bin",
     rebase_path(isolate_snapshot, root_build_dir),
     "--target_os",
     current_os,
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 3119ce0..f5e2a63 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -1000,8 +1000,9 @@
             'tools/create_snapshot_bin.py',
             '--executable',
             '<(PRODUCT_DIR)/<(EXECUTABLE_PREFIX)gen_snapshot<(EXECUTABLE_SUFFIX)',
+            '--snapshot_kind', 'core',
             '--vm_output_bin', '<(vm_isolate_snapshot_bin_file)',
-            '--output_bin', '<(isolate_snapshot_bin_file)',
+            '--isolate_output_bin', '<(isolate_snapshot_bin_file)',
             '--target_os', '<(OS)',
             '--timestamp_file', '<(gen_snapshot_stamp_file)',
           ],
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index ceba8cd..5330a1c 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -6,7 +6,7 @@
 // NOTE: Do not import 'dart:io' in builtin.
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal';
+import 'dart:_internal' hide Symbol;
 import 'dart:isolate';
 import 'dart:typed_data';
 
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index a60f8a8..86c36d7 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -53,6 +53,7 @@
     'hashmap_test.cc',
     'io_buffer.cc',
     'io_buffer.h',
+    'isolate_data.cc',
     'isolate_data.h',
     'loader.cc',
     'loader.h',
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index cd005db..e03ad8f 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -690,8 +690,10 @@
   Dart_Handle builtin_lib =
       Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
   RETURN_IF_ERROR(builtin_lib);
+  Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
   Dart_Handle io_lib = Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
   RETURN_IF_ERROR(io_lib);
+  Builtin::SetNativeResolver(Builtin::kIOLibrary);
 
   // Setup the builtin library in a persistent handle attached the isolate
   // specific data as we seem to lookup and use builtin lib a lot.
diff --git a/runtime/bin/extensions.cc b/runtime/bin/extensions.cc
index fd0961f..9a53783 100644
--- a/runtime/bin/extensions.cc
+++ b/runtime/bin/extensions.cc
@@ -61,7 +61,7 @@
 
 
 // IMPORTANT: In the absolute path case, do not extract the filename and search
-// for that by passing it to LoadExtensionLibrary. That can lead to confusion in
+// for that by passing it to LoadLibrary. That can lead to confusion in
 // which the absolute path is wrong, and a different version of the library is
 // loaded from the standard location.
 void* Extensions::ResolveAbsPathExtension(const char* extension_path) {
diff --git a/runtime/bin/extensions.h b/runtime/bin/extensions.h
index 3739c43..aba3bff 100644
--- a/runtime/bin/extensions.h
+++ b/runtime/bin/extensions.h
@@ -20,8 +20,11 @@
                                    Dart_Handle parent_library);
 
   // Platform-specific implementations.
+  // Don't rename LoadExtensionLibrary to LoadLibrary since on Windows it
+  // conflicts with LoadLibraryW after mangling.
   static void* LoadExtensionLibrary(const char* library_file);
   static void* ResolveSymbol(void* lib_handle, const char* symbol);
+  static void UnloadLibrary(void* lib_handle);
 
  private:
   static Dart_Handle GetError();
diff --git a/runtime/bin/extensions_android.cc b/runtime/bin/extensions_android.cc
index 85b20ae..847dfb3 100644
--- a/runtime/bin/extensions_android.cc
+++ b/runtime/bin/extensions_android.cc
@@ -8,6 +8,8 @@
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
 
+#include "platform/assert.h"
+
 namespace dart {
 namespace bin {
 
@@ -21,11 +23,20 @@
   return dlopen(library_file, RTLD_LAZY);
 }
 
+
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
   dlerror();
   return dlsym(lib_handle, symbol);
 }
 
+
+void Extensions::UnloadLibrary(void* lib_handle) {
+  dlerror();
+  int result = dlclose(lib_handle);
+  ASSERT(result == 0);
+}
+
+
 Dart_Handle Extensions::GetError() {
   const char* err_str = dlerror();
   if (err_str != NULL) {
diff --git a/runtime/bin/extensions_fuchsia.cc b/runtime/bin/extensions_fuchsia.cc
index b464fe0..5d386f1 100644
--- a/runtime/bin/extensions_fuchsia.cc
+++ b/runtime/bin/extensions_fuchsia.cc
@@ -8,6 +8,8 @@
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
 
+#include "platform/assert.h"
+
 namespace dart {
 namespace bin {
 
@@ -21,11 +23,20 @@
   return dlopen(library_file, RTLD_LAZY);
 }
 
+
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
   dlerror();
   return dlsym(lib_handle, symbol);
 }
 
+
+void Extensions::UnloadLibrary(void* lib_handle) {
+  dlerror();
+  int result = dlclose(lib_handle);
+  ASSERT(result == 0);
+}
+
+
 Dart_Handle Extensions::GetError() {
   const char* err_str = dlerror();
   if (err_str != NULL) {
diff --git a/runtime/bin/extensions_linux.cc b/runtime/bin/extensions_linux.cc
index 1a45e67..b2c22d3 100644
--- a/runtime/bin/extensions_linux.cc
+++ b/runtime/bin/extensions_linux.cc
@@ -8,6 +8,8 @@
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
 
+#include "platform/assert.h"
+
 namespace dart {
 namespace bin {
 
@@ -21,11 +23,20 @@
   return dlopen(library_file, RTLD_LAZY);
 }
 
+
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
   dlerror();
   return dlsym(lib_handle, symbol);
 }
 
+
+void Extensions::UnloadLibrary(void* lib_handle) {
+  dlerror();
+  int result = dlclose(lib_handle);
+  ASSERT(result == 0);
+}
+
+
 Dart_Handle Extensions::GetError() {
   const char* err_str = dlerror();
   if (err_str != NULL) {
diff --git a/runtime/bin/extensions_macos.cc b/runtime/bin/extensions_macos.cc
index d994c17..8588295 100644
--- a/runtime/bin/extensions_macos.cc
+++ b/runtime/bin/extensions_macos.cc
@@ -8,6 +8,8 @@
 #include "bin/extensions.h"
 #include <dlfcn.h>  // NOLINT
 
+#include "platform/assert.h"
+
 namespace dart {
 namespace bin {
 
@@ -21,11 +23,20 @@
   return dlopen(library_file, RTLD_LAZY);
 }
 
+
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
   dlerror();
   return dlsym(lib_handle, symbol);
 }
 
+
+void Extensions::UnloadLibrary(void* lib_handle) {
+  dlerror();
+  int result = dlclose(lib_handle);
+  ASSERT(result == 0);
+}
+
+
 Dart_Handle Extensions::GetError() {
   const char* err_str = dlerror();
   if (err_str != NULL) {
diff --git a/runtime/bin/extensions_win.cc b/runtime/bin/extensions_win.cc
index b07bf59..bd742c0 100644
--- a/runtime/bin/extensions_win.cc
+++ b/runtime/bin/extensions_win.cc
@@ -8,6 +8,7 @@
 #include "bin/extensions.h"
 #include "bin/utils.h"
 #include "bin/utils_win.h"
+#include "platform/assert.h"
 
 namespace dart {
 namespace bin {
@@ -32,11 +33,20 @@
   return ext;
 }
 
+
 void* Extensions::ResolveSymbol(void* lib_handle, const char* symbol) {
   SetLastError(0);
   return GetProcAddress(reinterpret_cast<HMODULE>(lib_handle), symbol);
 }
 
+
+void Extensions::UnloadLibrary(void* lib_handle) {
+  SetLastError(0);
+  BOOL result = FreeLibrary(reinterpret_cast<HMODULE>(lib_handle));
+  ASSERT(result);
+}
+
+
 Dart_Handle Extensions::GetError() {
   int last_error = GetLastError();
   if (last_error != 0) {
diff --git a/runtime/bin/file.h b/runtime/bin/file.h
index d5d76b7..ec4ca3b 100644
--- a/runtime/bin/file.h
+++ b/runtime/bin/file.h
@@ -21,6 +21,23 @@
 // Forward declaration.
 class FileHandle;
 
+class MappedMemory {
+ public:
+  MappedMemory(void* address, intptr_t size) : address_(address), size_(size) {}
+  ~MappedMemory() { Unmap(); }
+
+  void* address() const { return address_; }
+  intptr_t size() const { return size_; }
+
+ private:
+  void Unmap();
+
+  void* address_;
+  intptr_t size_;
+
+  DISALLOW_COPY_AND_ASSIGN(MappedMemory);
+};
+
 class File : public ReferenceCounted<File> {
  public:
   enum FileOpenMode {
@@ -83,7 +100,7 @@
     kReadOnly = 0,
     kReadExecute = 1,
   };
-  void* Map(MapType type, int64_t position, int64_t length);
+  MappedMemory* Map(MapType type, int64_t position, int64_t length);
 
   // Read/Write attempt to transfer num_bytes to/from buffer. It returns
   // the number of bytes read/written.
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 4ec84278..3eb5095 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -79,7 +79,7 @@
 }
 
 
-void* File::Map(MapType type, int64_t position, int64_t length) {
+MappedMemory* File::Map(MapType type, int64_t position, int64_t length) {
   ASSERT(handle_->fd() >= 0);
   int prot = PROT_NONE;
   switch (type) {
@@ -96,7 +96,15 @@
   if (addr == MAP_FAILED) {
     return NULL;
   }
-  return addr;
+  return new MappedMemory(addr, length);
+}
+
+
+void MappedMemory::Unmap() {
+  int result = munmap(address_, size_);
+  ASSERT(result == 0);
+  address_ = 0;
+  size_ = 0;
 }
 
 
diff --git a/runtime/bin/file_fuchsia.cc b/runtime/bin/file_fuchsia.cc
index 1959595..b18f423 100644
--- a/runtime/bin/file_fuchsia.cc
+++ b/runtime/bin/file_fuchsia.cc
@@ -77,12 +77,17 @@
 }
 
 
-void* File::Map(MapType type, int64_t position, int64_t length) {
+MappedMemory* File::Map(MapType type, int64_t position, int64_t length) {
   UNIMPLEMENTED();
   return NULL;
 }
 
 
+void MappedMemory::Unmap() {
+  UNIMPLEMENTED();
+}
+
+
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
   return NO_RETRY_EXPECTED(read(handle_->fd(), buffer, num_bytes));
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 33d809f..95a994a 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -79,7 +79,7 @@
 }
 
 
-void* File::Map(MapType type, int64_t position, int64_t length) {
+MappedMemory* File::Map(MapType type, int64_t position, int64_t length) {
   ASSERT(handle_->fd() >= 0);
   int prot = PROT_NONE;
   switch (type) {
@@ -96,7 +96,15 @@
   if (addr == MAP_FAILED) {
     return NULL;
   }
-  return addr;
+  return new MappedMemory(addr, length);
+}
+
+
+void MappedMemory::Unmap() {
+  int result = munmap(address_, size_);
+  ASSERT(result == 0);
+  address_ = 0;
+  size_ = 0;
 }
 
 
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 842982f..f3d2829 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -81,7 +81,7 @@
 }
 
 
-void* File::Map(MapType type, int64_t position, int64_t length) {
+MappedMemory* File::Map(MapType type, int64_t position, int64_t length) {
   ASSERT(handle_->fd() >= 0);
   int prot = PROT_NONE;
   switch (type) {
@@ -98,7 +98,15 @@
   if (addr == MAP_FAILED) {
     return NULL;
   }
-  return addr;
+  return new MappedMemory(addr, length);
+}
+
+
+void MappedMemory::Unmap() {
+  int result = munmap(address_, size_);
+  ASSERT(result == 0);
+  address_ = 0;
+  size_ = 0;
 }
 
 
diff --git a/runtime/bin/file_win.cc b/runtime/bin/file_win.cc
index 9101ee6..989adfd 100644
--- a/runtime/bin/file_win.cc
+++ b/runtime/bin/file_win.cc
@@ -75,7 +75,7 @@
 }
 
 
-void* File::Map(File::MapType type, int64_t position, int64_t length) {
+MappedMemory* File::Map(File::MapType type, int64_t position, int64_t length) {
   DWORD prot_alloc;
   DWORD prot_final;
   switch (type) {
@@ -111,7 +111,15 @@
     VirtualFree(addr, 0, MEM_RELEASE);
     return NULL;
   }
-  return addr;
+  return new MappedMemory(addr, length);
+}
+
+
+void MappedMemory::Unmap() {
+  BOOL result = VirtualFree(address_, 0, MEM_RELEASE);
+  ASSERT(result);
+  address_ = 0;
+  size_ = 0;
 }
 
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index 732493d..40d1877 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -42,7 +42,7 @@
 #define CHECK_RESULT(result)                                                   \
   if (Dart_IsError(result)) {                                                  \
     intptr_t exit_code = 0;                                                    \
-    Log::PrintErr("Error: %s", Dart_GetError(result));                         \
+    Log::PrintErr("Error: %s\n", Dart_GetError(result));                       \
     if (Dart_IsCompilationError(result)) {                                     \
       exit_code = kCompilationErrorExitCode;                                   \
     } else if (Dart_IsApiError(result)) {                                      \
@@ -58,13 +58,26 @@
   }
 
 
+// The core snapshot to use when creating isolates. Normally NULL, but loaded
+// from a file when creating script snapshots.
+const uint8_t* isolate_snapshot_data = NULL;
+
+
 // Global state that indicates whether a snapshot is to be created and
 // if so which file to write the snapshot into.
+enum SnapshotKind {
+  kCore,
+  kScript,
+  kAppAOTBlobs,
+  kAppAOTAssembly,
+};
+static SnapshotKind snapshot_kind = kCore;
 static const char* vm_snapshot_data_filename = NULL;
 static const char* vm_snapshot_instructions_filename = NULL;
 static const char* isolate_snapshot_data_filename = NULL;
 static const char* isolate_snapshot_instructions_filename = NULL;
 static const char* assembly_filename = NULL;
+static const char* script_snapshot_filename = NULL;
 
 
 // Value of the --package-root flag.
@@ -189,6 +202,32 @@
 }
 
 
+static bool ProcessSnapshotKindOption(const char* option) {
+  const char* kind = ProcessOption(option, "--snapshot_kind=");
+  if (kind == NULL) {
+    return false;
+  }
+  if (strcmp(kind, "core") == 0) {
+    snapshot_kind = kCore;
+    return true;
+  } else if (strcmp(kind, "script") == 0) {
+    snapshot_kind = kScript;
+    return true;
+  } else if (strcmp(kind, "app-aot-blobs") == 0) {
+    snapshot_kind = kAppAOTBlobs;
+    return true;
+  } else if (strcmp(kind, "app-aot-assembly") == 0) {
+    snapshot_kind = kAppAOTAssembly;
+    return true;
+  }
+  Log::PrintErr(
+      "Unrecognized snapshot kind: '%s'\nValid kinds are: "
+      "core, script, app-aot-blobs, app-aot-assembly\n",
+      kind);
+  return false;
+}
+
+
 static bool ProcessVmSnapshotDataOption(const char* option) {
   const char* name = ProcessOption(option, "--vm_snapshot_data=");
   if (name != NULL) {
@@ -239,6 +278,16 @@
 }
 
 
+static bool ProcessScriptSnapshotOption(const char* option) {
+  const char* name = ProcessOption(option, "--script_snapshot=");
+  if (name != NULL) {
+    script_snapshot_filename = name;
+    return true;
+  }
+  return false;
+}
+
+
 static bool ProcessEmbedderEntryPointsManifestOption(const char* option) {
   const char* name = ProcessOption(option, "--embedder_entry_points_manifest=");
   if (name != NULL) {
@@ -286,8 +335,7 @@
 
 
 static bool IsSnapshottingForPrecompilation() {
-  return (assembly_filename != NULL) ||
-         (vm_snapshot_instructions_filename != NULL);
+  return (snapshot_kind == kAppAOTBlobs) || (snapshot_kind == kAppAOTAssembly);
 }
 
 
@@ -305,11 +353,13 @@
 
   // Parse out the vm options.
   while ((i < argc) && IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
-    if (ProcessVmSnapshotDataOption(argv[i]) ||
+    if (ProcessSnapshotKindOption(argv[i]) ||
+        ProcessVmSnapshotDataOption(argv[i]) ||
         ProcessVmSnapshotInstructionsOption(argv[i]) ||
         ProcessIsolateSnapshotDataOption(argv[i]) ||
         ProcessIsolateSnapshotInstructionsOption(argv[i]) ||
         ProcessAssemblyOption(argv[i]) ||
+        ProcessScriptSnapshotOption(argv[i]) ||
         ProcessEmbedderEntryPointsManifestOption(argv[i]) ||
         ProcessURLmappingOption(argv[i]) || ProcessPackageRootOption(argv[i]) ||
         ProcessPackagesOption(argv[i]) || ProcessEnvironmentOption(argv[i])) {
@@ -333,43 +383,63 @@
       (commandline_packages_file != NULL)) {
     Log::PrintErr(
         "Specifying both a packages directory and a packages "
-        "file is invalid.\n");
+        "file is invalid.\n\n");
     return -1;
   }
 
-  if (vm_snapshot_data_filename == NULL) {
-    Log::PrintErr("No vm snapshot output file specified.\n\n");
-    return -1;
+  switch (snapshot_kind) {
+    case kCore: {
+      if ((vm_snapshot_data_filename == NULL) ||
+          (isolate_snapshot_data_filename == NULL)) {
+        Log::PrintErr(
+            "Building a core snapshot requires specifying output files for "
+            "--vm_snapshot_data and --isolate_snapshot_data.\n\n");
+        return -1;
+      }
+      break;
+    }
+    case kScript: {
+      if ((vm_snapshot_data_filename == NULL) ||
+          (isolate_snapshot_data_filename == NULL) ||
+          (script_snapshot_filename == NULL) || (script_name == NULL)) {
+        Log::PrintErr(
+            "Building a script snapshot requires specifying input files for "
+            "--vm_snapshot_data and --isolate_snapshot_data, an output file "
+            "for --script-snapshot, and a Dart script.\n\n");
+        return -1;
+      }
+      break;
+    }
+    case kAppAOTBlobs: {
+      if ((vm_snapshot_data_filename == NULL) ||
+          (vm_snapshot_instructions_filename == NULL) ||
+          (isolate_snapshot_data_filename == NULL) ||
+          (isolate_snapshot_instructions_filename == NULL) ||
+          (script_name == NULL)) {
+        Log::PrintErr(
+            "Building an AOT snapshot as blobs requires specifying output "
+            "files for --vm_snapshot_data, --vm_snapshot_instructions, "
+            "--isolate_snapshot_data and --isolate_snapshot_instructions and a "
+            "Dart script.\n\n");
+        return -1;
+      }
+      break;
+    }
+    case kAppAOTAssembly: {
+      if ((assembly_filename == NULL) || (script_name == NULL)) {
+        Log::PrintErr(
+            "Building an AOT snapshot as assembly requires specifying "
+            "an output file for --assembly and a Dart script.\n\n");
+        return -1;
+      }
+      break;
+    }
   }
 
-  if (isolate_snapshot_data_filename == NULL) {
-    Log::PrintErr("No isolate snapshot output file specified.\n\n");
-    return -1;
-  }
-
-  bool precompiled_as_assembly = assembly_filename != NULL;
-  bool precompiled_as_blobs = (vm_snapshot_instructions_filename != NULL) ||
-                              (isolate_snapshot_instructions_filename != NULL);
-  if (precompiled_as_assembly && precompiled_as_blobs) {
-    Log::PrintErr(
-        "Cannot request a precompiled snapshot simultaneously as "
-        "assembly (--assembly=<output.file>) and as blobs "
-        "(--instructions-blob=<output.file> and "
-        "--rodata-blob=<output.file>)\n\n");
-    return -1;
-  }
-  if ((vm_snapshot_instructions_filename != NULL) !=
-      (isolate_snapshot_instructions_filename != NULL)) {
-    Log::PrintErr(
-        "Requesting a precompiled snapshot as blobs requires both "
-        "(--vm_snapshot_instructions=<output.file> and "
-        "--isolate_snapshot_instructions=<output.file>)\n\n");
-    return -1;
-  }
   if (IsSnapshottingForPrecompilation() && (entry_points_files->count() == 0)) {
     Log::PrintErr(
-        "Specifying an instructions snapshot filename indicates precompilation"
-        ". But no embedder entry points manifest was specified.\n\n");
+        "Building an AOT snapshot requires at least one embedder "
+        "entry points manifest.\n\n");
     return -1;
   }
 
@@ -379,17 +449,24 @@
 
 static void WriteSnapshotFile(const char* filename,
                               const uint8_t* buffer,
-                              const intptr_t size) {
+                              const intptr_t size,
+                              bool write_magic_number = false) {
   File* file = File::Open(filename, File::kWriteTruncate);
   if (file == NULL) {
     Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename);
     Dart_ExitScope();
     Dart_ShutdownIsolate();
-    Dart_Cleanup();
     exit(kErrorExitCode);
   }
+  if (write_magic_number) {
+    // Write the magic number to indicate file is a script snapshot.
+    DartUtils::WriteMagicNumber(file);
+  }
   if (!file->WriteFully(buffer, size)) {
-    Log::PrintErr("Error: Failed to write snapshot file.\n\n");
+    Log::PrintErr("Error: Unable to write snapshot file: %s\n\n", filename);
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+    exit(kErrorExitCode);
   }
   file->Release();
 }
@@ -495,10 +572,10 @@
   if (Dart_IsError(source)) {
     return source;
   }
-  if (IsSnapshottingForPrecompilation()) {
-    return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0);
-  } else {
+  if (snapshot_kind == kCore) {
     return Dart_LoadLibrary(resolved_uri, Dart_Null(), source, 0, 0);
+  } else {
+    return Dart_LoadScript(resolved_uri, Dart_Null(), source, 0, 0);
   }
 }
 
@@ -614,76 +691,70 @@
 "Usage:                                                                      \n"
 " gen_snapshot [<vm-flags>] [<options>] [<dart-script-file>]                 \n"
 "                                                                            \n"
+" Global options:                                                            \n"
+"   --package_root=<path>             Where to find packages, that is,       \n"
+"                                     package:...  imports.                  \n"
+"                                                                            \n"
+"   --packages=<packages_file>        Where to find a package spec file      \n"
+"                                                                            \n"
+"   --url_mapping=<mapping>           Uses the URL mapping(s) specified on   \n"
+"                                     the command line to load the           \n"
+"                                     libraries.                             \n"
+"                                                                            \n"
+" To create a core snapshot:                                                 \n"
+"   --snapshot_kind=core                                                     \n"
+"   --vm_snapshot_data=<output-file>                                         \n"
+"   --isolate_snapshot_data=<output-file>                                    \n"
+"   [<dart-script-file>]                                                     \n"
+"                                                                            \n"
+" Writes a snapshot of <dart-script-file> to the specified snapshot files.   \n"
+" If no <dart-script-file> is passed, a generic snapshot of all the corelibs \n"
+" is created.                                                                \n"
+"                                                                            \n"
+" To create a script snapshot with respect to a given core snapshot:         \n"
+"   --snapshot_kind=script                                                   \n"
+"   --vm_snapshot_data=<intput-file>                                         \n"
+"   --isolate_snapshot_data=<intput-file>                                    \n"
+"   --script_snapshot=<output-file>                                          \n"
+"   <dart-script-file>                                                       \n"
+"                                                                            \n"
 "  Writes a snapshot of <dart-script-file> to the specified snapshot files.  \n"
 "  If no <dart-script-file> is passed, a generic snapshot of all the corelibs\n"
-"  is created. It is required to specify the VM isolate snapshot and the     \n"
-"  isolate snapshot. The other flags are related to precompilation and are   \n"
-"  optional.                                                                 \n"
+"  is created.                                                               \n"
 "                                                                            \n"
-"  Precompilation:                                                           \n"
-"  In order to configure the snapshotter for precompilation, either          \n"
-"  --assembly=outputfile or --instructions_blob=outputfile1 and              \n"
-"  --rodata_blob=outputfile2 must be specified. If the former is choosen,    \n"
-"  assembly for the target architecture will be output into the given file,  \n"
-"  which must be compiled separately and either statically linked or         \n"
-"  dynamically loaded in the target executable. The symbols                  \n"
-"  kInstructionsSnapshot and kDataSnapshot must be passed to Dart_Initialize.\n"
-"  If the latter is choosen, binary data is output into the given files,     \n"
-"  which should be mmapped and passed to Dart_Initialize, with the           \n"
-"  instruction blob being mapped as executable.                              \n"
-"  In both cases, a entry points manifest must be given to list the places   \n"
-"  in the Dart program the embedder calls from the C API (Dart_Invoke, etc). \n"
-"  Not specifying these may cause the tree shaker to remove them from the    \n"
-"  program. The format of this manifest is as follows. Each line in the      \n"
-"  manifest is a comma separated list of three elements. The first entry is  \n"
-"  the library URI, the second entry is the class name and the final entry   \n"
-"  the function name. The file must be terminated with a newline charater.   \n"
+" To create an AOT application snapshot as blobs suitable for loading with   \n"
+" mmap:                                                                      \n"
+"   --snapshot_kind=app-aot-blobs                                            \n"
+"   --vm_snapshot_data=<output-file>                                         \n"
+"   --vm_snapshot_instructions=<output-file>                                 \n"
+"   --isolate_snapshot_data=<output-file>                                    \n"
+"   --isolate_snapshot_instructions=<output-file>                            \n"
+"   {--embedder_entry_points_manifest=<input-file>}                          \n"
+"   <dart-script-file>                                                       \n"
 "                                                                            \n"
-"    Example:                                                                \n"
-"      dart:something,SomeClass,doSomething                                  \n"
+" To create an AOT application snapshot as assembly suitable for compilation \n"
+" as a static or dynamic library:                                            \n"
+" mmap:                                                                      \n"
+"   --snapshot_kind=app-aot-blobs                                            \n"
+"   --assembly=<output-file>                                                 \n"
+"   {--embedder_entry_points_manifest=<input-file>}                          \n"
+"   <dart-script-file>                                                       \n"
 "                                                                            \n"
-"  Supported options:                                                        \n"
-"    --vm_snapshot_data=<file>         A full snapshot is a compact          \n"
-"    --isolate_snapshot_data=<file>    representation of the dart vm isolate \n"
-"                                      heap and dart isolate heap states.    \n"
-"                                      Both these options are required       \n"
+" AOT snapshots require entry points manifest files, which list the places   \n"
+" in the Dart program the embedder calls from the C API (Dart_Invoke, etc).  \n"
+" Not specifying these may cause the tree shaker to remove them from the     \n"
+" program. The format of this manifest is as follows. Each line in the       \n"
+" manifest is a comma separated list of three elements. The first entry is   \n"
+" the library URI, the second entry is the class name and the final entry    \n"
+" the function name. The file must be terminated with a newline charater.    \n"
 "                                                                            \n"
-"    --package_root=<path>             Where to find packages, that is,      \n"
-"                                      package:...  imports.                 \n"
-"                                                                            \n"
-"    --packages=<packages_file>        Where to find a package spec file     \n"
-"                                                                            \n"
-"    --url_mapping=<mapping>           Uses the URL mapping(s) specified on  \n"
-"                                      the command line to load the          \n"
-"                                      libraries.                            \n"
-"                                                                            \n"
-"    --assembly=<file>                 (Precompilation only) Contains the    \n"
-"                                      assembly that must be linked into     \n"
-"                                      the target binary                     \n"
-"                                                                            \n"
-"    --vm_snapshot_instructions=<file> (Precompilation only) Contains the    \n"
-"    --isolate_snapshot_instructions=<file> instructions and read-only data  \n"
-"                                      that must be mapped into the target   \n"
-"                                      binary                                \n"
-"                                                                            \n"
-"    --embedder_entry_points_manifest=<file> (Precompilation or app          \n"
-"                                      snapshots) Contains embedder's entry  \n"
-"                                      points into Dart code from the C API. \n"
+"   Example:                                                                 \n"
+"     dart:something,SomeClass,doSomething                                   \n"
 "\n");
 }
 // clang-format on
 
 
-static void VerifyLoaded(Dart_Handle library) {
-  if (Dart_IsError(library)) {
-    const char* err_msg = Dart_GetError(library);
-    Log::PrintErr("Errors encountered while loading: %s\n", err_msg);
-    CHECK_RESULT(library);
-  }
-  ASSERT(Dart_IsLibrary(library));
-}
-
-
 static const char StubNativeFunctionName[] = "StubNativeFunction";
 
 
@@ -1028,8 +1099,11 @@
 }
 
 
-static void CreateAndWriteSnapshot() {
-  ASSERT(!IsSnapshottingForPrecompilation());
+static void CreateAndWriteCoreSnapshot() {
+  ASSERT(snapshot_kind == kCore);
+  ASSERT(vm_snapshot_data_filename != NULL);
+  ASSERT(isolate_snapshot_data_filename != NULL);
+
   Dart_Handle result;
   uint8_t* vm_snapshot_data_buffer = NULL;
   intptr_t vm_snapshot_data_size = 0;
@@ -1048,10 +1122,21 @@
                     vm_snapshot_data_size);
   WriteSnapshotFile(isolate_snapshot_data_filename,
                     isolate_snapshot_data_buffer, isolate_snapshot_data_size);
-  Dart_ExitScope();
+}
 
-  // Shutdown the isolate.
-  Dart_ShutdownIsolate();
+
+static void CreateAndWriteScriptSnapshot() {
+  ASSERT(snapshot_kind == kScript);
+  ASSERT(script_snapshot_filename != NULL);
+
+  // First create a snapshot.
+  uint8_t* buffer = NULL;
+  intptr_t size = 0;
+  Dart_Handle result = Dart_CreateScriptSnapshot(&buffer, &size);
+  CHECK_RESULT(result);
+
+  // Now write it out to the specified file.
+  WriteSnapshotFile(script_snapshot_filename, buffer, size, false);
 }
 
 
@@ -1067,13 +1152,18 @@
   // Create a precompiled snapshot.
   bool as_assembly = assembly_filename != NULL;
   if (as_assembly) {
+    ASSERT(snapshot_kind == kAppAOTAssembly);
+
     uint8_t* assembly_buffer = NULL;
     intptr_t assembly_size = 0;
     result =
         Dart_CreateAppAOTSnapshotAsAssembly(&assembly_buffer, &assembly_size);
     CHECK_RESULT(result);
+
     WriteSnapshotFile(assembly_filename, assembly_buffer, assembly_size);
   } else {
+    ASSERT(snapshot_kind == kAppAOTBlobs);
+
     uint8_t* vm_snapshot_data_buffer = NULL;
     intptr_t vm_snapshot_data_size = 0;
     uint8_t* vm_snapshot_instructions_buffer = NULL;
@@ -1089,6 +1179,7 @@
         &isolate_snapshot_instructions_buffer,
         &isolate_snapshot_instructions_size);
     CHECK_RESULT(result);
+
     WriteSnapshotFile(vm_snapshot_data_filename, vm_snapshot_data_buffer,
                       vm_snapshot_data_size);
     WriteSnapshotFile(vm_snapshot_instructions_filename,
@@ -1100,11 +1191,6 @@
                       isolate_snapshot_instructions_buffer,
                       isolate_snapshot_instructions_size);
   }
-
-  Dart_ExitScope();
-
-  // Shutdown the isolate.
-  Dart_ShutdownIsolate();
 }
 
 
@@ -1112,7 +1198,7 @@
   // Set up the library tag handler for this isolate.
   Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
   if (Dart_IsError(result)) {
-    Log::PrintErr("%s", Dart_GetError(result));
+    Log::PrintErr("%s\n", Dart_GetError(result));
     Dart_ExitScope();
     Dart_ShutdownIsolate();
     exit(kErrorExitCode);
@@ -1120,7 +1206,7 @@
   // This is a generic dart snapshot which needs builtin library setup.
   Dart_Handle library =
       LoadGenericSnapshotCreationScript(Builtin::kBuiltinLibrary);
-  VerifyLoaded(library);
+  CHECK_RESULT(library);
 }
 
 
@@ -1128,7 +1214,7 @@
   SetupForUriResolution();
 
   Dart_Handle library = LoadGenericSnapshotCreationScript(Builtin::kIOLibrary);
-  VerifyLoaded(library);
+  CHECK_RESULT(library);
   Dart_Handle result = Dart_FinalizeLoading(false);
   if (Dart_IsError(result)) {
     const char* err_msg = Dart_GetError(library);
@@ -1148,30 +1234,30 @@
                                          void* data,
                                          char** error) {
   IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, package_config);
+      new IsolateData(script_uri, package_root, package_config, NULL);
   Dart_Isolate isolate = NULL;
-  isolate = Dart_CreateIsolate(script_uri, main, NULL, NULL, NULL, isolate_data,
-                               error);
+  isolate = Dart_CreateIsolate(script_uri, main, isolate_snapshot_data, NULL,
+                               NULL, isolate_data, error);
 
   if (isolate == NULL) {
-    Log::PrintErr("Error: Could not create service isolate");
+    Log::PrintErr("Error: Could not create service isolate\n");
     return NULL;
   }
 
   Dart_EnterScope();
   if (!Dart_IsServiceIsolate(isolate)) {
-    Log::PrintErr("Error: We only expect to create the service isolate");
+    Log::PrintErr("Error: We only expect to create the service isolate\n");
     return NULL;
   }
   Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
+  if (Dart_IsError(result)) {
+    Log::PrintErr("Error: Could not set tag handler for service isolate\n");
+    return NULL;
+  }
   // Setup the native resolver.
   Builtin::LoadAndCheckLibrary(Builtin::kBuiltinLibrary);
   Builtin::LoadAndCheckLibrary(Builtin::kIOLibrary);
-  if (Dart_IsError(result)) {
-    Log::PrintErr("Error: Could not set tag handler for service isolate");
-    return NULL;
-  }
-  CHECK_RESULT(result);
+
   ASSERT(Dart_IsServiceIsolate(isolate));
   // Load embedder specific bits and return. Will not start http server.
   if (!VmService::Setup("127.0.0.1", -1, false /* running_precompiled */,
@@ -1244,6 +1330,39 @@
   init_params.file_close = DartUtils::CloseFile;
   init_params.entropy_source = DartUtils::EntropySource;
 
+  MappedMemory* mapped_vm_snapshot_data = NULL;
+  MappedMemory* mapped_isolate_snapshot_data = NULL;
+  if (snapshot_kind == kScript) {
+    File* file = File::Open(vm_snapshot_data_filename, File::kRead);
+    if (file == NULL) {
+      Log::PrintErr("Failed to open: %s\n", vm_snapshot_data_filename);
+      return kErrorExitCode;
+    }
+    mapped_vm_snapshot_data = file->Map(File::kReadOnly, 0, file->Length());
+    if (mapped_vm_snapshot_data == NULL) {
+      Log::PrintErr("Failed to read: %s\n", vm_snapshot_data_filename);
+      return kErrorExitCode;
+    }
+    file->Close();
+    init_params.vm_snapshot_data =
+        reinterpret_cast<const uint8_t*>(mapped_vm_snapshot_data->address());
+
+    file = File::Open(isolate_snapshot_data_filename, File::kRead);
+    if (file == NULL) {
+      Log::PrintErr("Failed to open: %s\n", isolate_snapshot_data_filename);
+      return kErrorExitCode;
+    }
+    mapped_isolate_snapshot_data =
+        file->Map(File::kReadOnly, 0, file->Length());
+    if (mapped_isolate_snapshot_data == NULL) {
+      Log::PrintErr("Failed to read: %s\n", isolate_snapshot_data_filename);
+      return kErrorExitCode;
+    }
+    file->Close();
+    isolate_snapshot_data = reinterpret_cast<const uint8_t*>(
+        mapped_isolate_snapshot_data->address());
+  }
+
   char* error = Dart_Initialize(&init_params);
   if (error != NULL) {
     Log::PrintErr("VM initialization failed: %s\n", error);
@@ -1252,11 +1371,11 @@
   }
 
   IsolateData* isolate_data = new IsolateData(NULL, commandline_package_root,
-                                              commandline_packages_file);
-  Dart_Isolate isolate =
-      Dart_CreateIsolate(NULL, NULL, NULL, NULL, NULL, isolate_data, &error);
+                                              commandline_packages_file, NULL);
+  Dart_Isolate isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
+                                            NULL, NULL, isolate_data, &error);
   if (isolate == NULL) {
-    Log::PrintErr("Error: %s", error);
+    Log::PrintErr("Error: %s\n", error);
     free(error);
     exit(kErrorExitCode);
   }
@@ -1300,7 +1419,7 @@
 
     // Now we create an isolate into which we load all the code that needs to
     // be in the snapshot.
-    isolate_data = new IsolateData(NULL, NULL, NULL);
+    isolate_data = new IsolateData(NULL, NULL, NULL, NULL);
     const uint8_t* kernel = NULL;
     intptr_t kernel_length = 0;
     const bool is_kernel_file =
@@ -1316,10 +1435,10 @@
         is_kernel_file
             ? Dart_CreateIsolateFromKernel(NULL, NULL, kernel_program, NULL,
                                            isolate_data, &error)
-            : Dart_CreateIsolate(NULL, NULL, NULL, NULL, NULL, isolate_data,
-                                 &error);
+            : Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data, NULL, NULL,
+                                 isolate_data, &error);
     if (isolate == NULL) {
-      Log::PrintErr("%s", error);
+      Log::PrintErr("%s\n", error);
       free(error);
       exit(kErrorExitCode);
     }
@@ -1352,7 +1471,7 @@
     if (!is_kernel_file) {
       // Load the specified script.
       library = LoadSnapshotCreationScript(app_script_name);
-      VerifyLoaded(library);
+      CHECK_RESULT(library);
 
       ImportNativeEntryPointLibrariesIntoRoot(entry_points);
     }
@@ -1361,19 +1480,34 @@
     result = Dart_FinalizeLoading(false);
     CHECK_RESULT(result);
 
-    if (!IsSnapshottingForPrecompilation()) {
-      CreateAndWriteSnapshot();
-    } else {
-      CreateAndWritePrecompiledSnapshot(entry_points);
+    switch (snapshot_kind) {
+      case kCore:
+        CreateAndWriteCoreSnapshot();
+        break;
+      case kScript:
+        CreateAndWriteScriptSnapshot();
+        break;
+      case kAppAOTBlobs:
+      case kAppAOTAssembly:
+        CreateAndWritePrecompiledSnapshot(entry_points);
+        break;
+      default:
+        UNREACHABLE();
     }
 
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
+
     CleanupEntryPointsCollection(entry_points);
 
     Dart_EnterIsolate(UriResolverIsolateScope::isolate);
     Dart_ShutdownIsolate();
   } else {
     SetupForGenericSnapshotCreation();
-    CreateAndWriteSnapshot();
+    CreateAndWriteCoreSnapshot();
+
+    Dart_ExitScope();
+    Dart_ShutdownIsolate();
   }
   error = Dart_Cleanup();
   if (error != NULL) {
@@ -1381,6 +1515,8 @@
     free(error);
   }
   EventHandler::Stop();
+  delete mapped_vm_snapshot_data;
+  delete mapped_isolate_snapshot_data;
   return 0;
 }
 
diff --git a/runtime/bin/isolate_data.cc b/runtime/bin/isolate_data.cc
new file mode 100644
index 0000000..b37cf17
--- /dev/null
+++ b/runtime/bin/isolate_data.cc
@@ -0,0 +1,48 @@
+// Copyright (c) 2017, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "bin/isolate_data.h"
+#include "bin/snapshot_utils.h"
+
+namespace dart {
+namespace bin {
+
+IsolateData::IsolateData(const char* url,
+                         const char* package_root,
+                         const char* packages_file,
+                         AppSnapshot* app_snapshot)
+    : script_url((url != NULL) ? strdup(url) : NULL),
+      package_root(NULL),
+      packages_file(NULL),
+      udp_receive_buffer(NULL),
+      builtin_lib_(NULL),
+      loader_(NULL),
+      app_snapshot_(app_snapshot) {
+  if (package_root != NULL) {
+    ASSERT(packages_file == NULL);
+    this->package_root = strdup(package_root);
+  } else if (packages_file != NULL) {
+    this->packages_file = strdup(packages_file);
+  }
+}
+
+
+IsolateData::~IsolateData() {
+  free(script_url);
+  script_url = NULL;
+  free(package_root);
+  package_root = NULL;
+  free(packages_file);
+  packages_file = NULL;
+  free(udp_receive_buffer);
+  udp_receive_buffer = NULL;
+  if (builtin_lib_ != NULL) {
+    Dart_DeletePersistentHandle(builtin_lib_);
+  }
+  delete app_snapshot_;
+  app_snapshot_ = NULL;
+}
+
+}  // namespace bin
+}  // namespace dart
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 5ed1ed8..505081e 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -13,6 +13,7 @@
 namespace bin {
 
 // Forward declaration.
+class AppSnapshot;
 class EventHandler;
 class Loader;
 
@@ -23,34 +24,9 @@
  public:
   IsolateData(const char* url,
               const char* package_root,
-              const char* packages_file)
-      : script_url((url != NULL) ? strdup(url) : NULL),
-        package_root(NULL),
-        packages_file(NULL),
-        udp_receive_buffer(NULL),
-        builtin_lib_(NULL),
-        loader_(NULL) {
-    if (package_root != NULL) {
-      ASSERT(packages_file == NULL);
-      this->package_root = strdup(package_root);
-    } else if (packages_file != NULL) {
-      this->packages_file = strdup(packages_file);
-    }
-  }
-
-  ~IsolateData() {
-    free(script_url);
-    script_url = NULL;
-    free(package_root);
-    package_root = NULL;
-    free(packages_file);
-    packages_file = NULL;
-    free(udp_receive_buffer);
-    udp_receive_buffer = NULL;
-    if (builtin_lib_ != NULL) {
-      Dart_DeletePersistentHandle(builtin_lib_);
-    }
-  }
+              const char* packages_file,
+              AppSnapshot* app_snapshot);
+  ~IsolateData();
 
   Dart_Handle builtin_lib() const {
     ASSERT(builtin_lib_ != NULL);
@@ -83,6 +59,7 @@
  private:
   Dart_Handle builtin_lib_;
   Loader* loader_;
+  AppSnapshot* app_snapshot_;
 
   DISALLOW_COPY_AND_ASSIGN(IsolateData);
 };
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 6a104c1..dbcb739 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -105,6 +105,7 @@
 static char* app_script_uri = NULL;
 static const uint8_t* app_isolate_snapshot_data = NULL;
 static const uint8_t* app_isolate_snapshot_instructions = NULL;
+static AppSnapshot* app_snapshot = NULL;
 
 
 static Dart_Isolate main_isolate = NULL;
@@ -816,6 +817,7 @@
   const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data;
   const uint8_t* isolate_snapshot_instructions =
       app_isolate_snapshot_instructions;
+  AppSnapshot* app_snapshot = NULL;
 #else
   // JIT: Main isolate starts from the app snapshot, if any. Other isolates
   // use the core libraries snapshot.
@@ -823,6 +825,7 @@
   const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
   const uint8_t* isolate_snapshot_instructions =
       core_isolate_snapshot_instructions;
+  AppSnapshot* app_snapshot = NULL;
   if ((app_isolate_snapshot_data != NULL) &&
       (is_main_isolate || ((app_script_uri != NULL) &&
                            (strcmp(script_uri, app_script_uri) == 0)))) {
@@ -830,17 +833,14 @@
     isolate_snapshot_data = app_isolate_snapshot_data;
     isolate_snapshot_instructions = app_isolate_snapshot_instructions;
   } else if (!is_main_isolate) {
-    const uint8_t* file_vm_snapshot_data = NULL;
-    const uint8_t* file_vm_snapshot_instructions = NULL;
-    const uint8_t* file_isolate_snapshot_data = NULL;
-    const uint8_t* file_isolate_snapshot_instructions = NULL;
-    if (Snapshot::ReadAppSnapshot(
-            script_uri, &file_vm_snapshot_data, &file_vm_snapshot_instructions,
-            &file_isolate_snapshot_data, &file_isolate_snapshot_instructions)) {
-      // TODO(rmacnak): We are leaking the snapshot when the isolate shuts down.
+    app_snapshot = Snapshot::TryReadAppSnapshot(script_uri);
+    if (app_snapshot != NULL) {
       isolate_run_app_snapshot = true;
-      isolate_snapshot_data = file_isolate_snapshot_data;
-      isolate_snapshot_instructions = file_isolate_snapshot_instructions;
+      const uint8_t* ignore_vm_snapshot_data;
+      const uint8_t* ignore_vm_snapshot_instructions;
+      app_snapshot->SetBuffers(
+          &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
+          &isolate_snapshot_data, &isolate_snapshot_instructions);
     }
   }
 #endif
@@ -881,7 +881,7 @@
   }
 
   IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, packages_config);
+      new IsolateData(script_uri, package_root, packages_config, app_snapshot);
   // If the script is a Kernel binary, then we will try to bootstrap from the
   // script.
   Dart_Isolate isolate =
@@ -1069,7 +1069,7 @@
 "      --warn-on-pause-with-no-debugger\n"
 "  This set is subject to change.\n"
 "  Please see these options (--help --verbose) for further documentation.\n"
-"--snapshot-kind=<snapsot_kind>\n"
+"--snapshot-kind=<snapshot_kind>\n"
 "--snapshot=<file_name>\n"
 "  These snapshot options are used to generate a snapshot of the loaded\n"
 "  Dart script:\n"
@@ -1100,7 +1100,7 @@
 "      --warn-on-pause-with-no-debugger\n"
 "  This set is subject to change.\n"
 "  Please see these options for further documentation.\n"
-"--snapshot-kind=<snapsot_kind>\n"
+"--snapshot-kind=<snapshot_kind>\n"
 "--snapshot=<file_name>\n"
 "  These snapshot options are used to generate a snapshot of the loaded\n"
 "  Dart script:\n"
@@ -1639,10 +1639,12 @@
     Platform::Exit(kErrorExitCode);
   }
 
-  if (Snapshot::ReadAppSnapshot(
-          script_name, &vm_snapshot_data, &vm_snapshot_instructions,
-          &app_isolate_snapshot_data, &app_isolate_snapshot_instructions)) {
+  app_snapshot = Snapshot::TryReadAppSnapshot(script_name);
+  if (app_snapshot != NULL) {
     vm_run_app_snapshot = true;
+    app_snapshot->SetBuffers(&vm_snapshot_data, &vm_snapshot_instructions,
+                             &app_isolate_snapshot_data,
+                             &app_isolate_snapshot_instructions);
   }
 
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
@@ -1718,6 +1720,7 @@
   }
   EventHandler::Stop();
 
+  delete app_snapshot;
   free(app_script_uri);
 
   // Free copied argument strings if converted.
diff --git a/runtime/bin/process_fuchsia.cc b/runtime/bin/process_fuchsia.cc
index 02c5055..865ce0c 100644
--- a/runtime/bin/process_fuchsia.cc
+++ b/runtime/bin/process_fuchsia.cc
@@ -388,7 +388,7 @@
     item_count_--;
   }
 
-  // Interrupt message pipe.
+  // Interrupt channel.
   static mx_handle_t interrupt_in_;
   static mx_handle_t interrupt_out_;
 
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index d34a28c..8920d37 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -182,7 +182,7 @@
 
   _ProcessImpl(String path,
                List<String> arguments,
-               String this._workingDirectory,
+               this._workingDirectory,
                Map<String, String> environment,
                bool includeParentEnvironment,
                bool runInShell,
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 741d797..f1ad535 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.cc
@@ -24,28 +24,72 @@
 static const int64_t kAppSnapshotMagicNumber = 0xf6f6dcdc;
 static const int64_t kAppSnapshotPageSize = 4 * KB;
 
-static bool ReadAppSnapshotBlobs(const char* script_name,
-                                 const uint8_t** vm_data_buffer,
-                                 const uint8_t** vm_instructions_buffer,
-                                 const uint8_t** isolate_data_buffer,
-                                 const uint8_t** isolate_instructions_buffer) {
+class MappedAppSnapshot : public AppSnapshot {
+ public:
+  MappedAppSnapshot(MappedMemory* vm_snapshot_data,
+                    MappedMemory* vm_snapshot_instructions,
+                    MappedMemory* isolate_snapshot_data,
+                    MappedMemory* isolate_snapshot_instructions)
+      : vm_data_mapping_(vm_snapshot_data),
+        vm_instructions_mapping_(vm_snapshot_instructions),
+        isolate_data_mapping_(isolate_snapshot_data),
+        isolate_instructions_mapping_(isolate_snapshot_instructions) {}
+
+  ~MappedAppSnapshot() {
+    delete vm_data_mapping_;
+    delete vm_instructions_mapping_;
+    delete isolate_data_mapping_;
+    delete isolate_instructions_mapping_;
+  }
+
+  void SetBuffers(const uint8_t** vm_data_buffer,
+                  const uint8_t** vm_instructions_buffer,
+                  const uint8_t** isolate_data_buffer,
+                  const uint8_t** isolate_instructions_buffer) {
+    if (vm_data_mapping_ != NULL) {
+      *vm_data_buffer =
+          reinterpret_cast<const uint8_t*>(vm_data_mapping_->address());
+    }
+    if (vm_instructions_mapping_ != NULL) {
+      *vm_instructions_buffer =
+          reinterpret_cast<const uint8_t*>(vm_instructions_mapping_->address());
+    }
+    if (isolate_data_mapping_ != NULL) {
+      *isolate_data_buffer =
+          reinterpret_cast<const uint8_t*>(isolate_data_mapping_->address());
+    }
+    if (isolate_instructions_mapping_ != NULL) {
+      *isolate_instructions_buffer = reinterpret_cast<const uint8_t*>(
+          isolate_instructions_mapping_->address());
+    }
+  }
+
+ private:
+  MappedMemory* vm_data_mapping_;
+  MappedMemory* vm_instructions_mapping_;
+  MappedMemory* isolate_data_mapping_;
+  MappedMemory* isolate_instructions_mapping_;
+};
+
+
+static AppSnapshot* TryReadAppSnapshotBlobs(const char* script_name) {
   File* file = File::Open(script_name, File::kRead);
   if (file == NULL) {
-    return false;
+    return NULL;
   }
   if (file->Length() < kAppSnapshotHeaderSize) {
     file->Release();
-    return false;
+    return NULL;
   }
   int64_t header[5];
   ASSERT(sizeof(header) == kAppSnapshotHeaderSize);
   if (!file->ReadFully(&header, kAppSnapshotHeaderSize)) {
     file->Release();
-    return false;
+    return NULL;
   }
   if (header[0] != kAppSnapshotMagicNumber) {
     file->Release();
-    return false;
+    return NULL;
   }
 
   int64_t vm_data_size = header[1];
@@ -68,121 +112,143 @@
         Utils::RoundUp(isolate_instructions_position, kAppSnapshotPageSize);
   }
 
+  MappedMemory* vm_data_mapping = NULL;
   if (vm_data_size != 0) {
-    *vm_data_buffer = reinterpret_cast<const uint8_t*>(
-        file->Map(File::kReadOnly, vm_data_position, vm_data_size));
-    if (vm_data_buffer == NULL) {
-      Log::PrintErr("Failed to memory map snapshot\n");
-      Platform::Exit(kErrorExitCode);
+    vm_data_mapping =
+        file->Map(File::kReadOnly, vm_data_position, vm_data_size);
+    if (vm_data_mapping == NULL) {
+      FATAL1("Failed to memory map snapshot: %s\n", script_name);
     }
   }
 
+  MappedMemory* vm_instr_mapping = NULL;
   if (vm_instructions_size != 0) {
-    *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(file->Map(
-        File::kReadExecute, vm_instructions_position, vm_instructions_size));
-    if (*vm_instructions_buffer == NULL) {
-      Log::PrintErr("Failed to memory map snapshot\n");
-      Platform::Exit(kErrorExitCode);
+    vm_instr_mapping = file->Map(File::kReadExecute, vm_instructions_position,
+                                 vm_instructions_size);
+    if (vm_instr_mapping == NULL) {
+      FATAL1("Failed to memory map snapshot: %s\n", script_name);
     }
   }
 
-  *isolate_data_buffer = reinterpret_cast<const uint8_t*>(
-      file->Map(File::kReadOnly, isolate_data_position, isolate_data_size));
-  if (isolate_data_buffer == NULL) {
-    Log::PrintErr("Failed to memory map snapshot\n");
-    Platform::Exit(kErrorExitCode);
+  MappedMemory* isolate_data_mapping = NULL;
+  if (isolate_data_size != 0) {
+    isolate_data_mapping =
+        file->Map(File::kReadOnly, isolate_data_position, isolate_data_size);
+    if (isolate_data_mapping == NULL) {
+      FATAL1("Failed to memory map snapshot: %s\n", script_name);
+    }
   }
 
-  if (isolate_instructions_size == 0) {
-    *isolate_instructions_buffer = NULL;
-  } else {
-    *isolate_instructions_buffer = reinterpret_cast<const uint8_t*>(
+  MappedMemory* isolate_instr_mapping = NULL;
+  if (isolate_instructions_size != 0) {
+    isolate_instr_mapping =
         file->Map(File::kReadExecute, isolate_instructions_position,
-                  isolate_instructions_size));
-    if (*isolate_instructions_buffer == NULL) {
-      Log::PrintErr("Failed to memory map snapshot\n");
-      Platform::Exit(kErrorExitCode);
+                  isolate_instructions_size);
+    if (isolate_instr_mapping == NULL) {
+      FATAL1("Failed to memory map snapshot: %s\n", script_name);
     }
   }
 
   file->Release();
-  return true;
+  return new MappedAppSnapshot(vm_data_mapping, vm_instr_mapping,
+                               isolate_data_mapping, isolate_instr_mapping);
 }
 
 
 #if defined(DART_PRECOMPILED_RUNTIME)
-static bool ReadAppSnapshotDynamicLibrary(
-    const char* script_name,
-    const uint8_t** vm_data_buffer,
-    const uint8_t** vm_instructions_buffer,
-    const uint8_t** isolate_data_buffer,
-    const uint8_t** isolate_instructions_buffer) {
+class DylibAppSnapshot : public AppSnapshot {
+ public:
+  DylibAppSnapshot(void* library,
+                   const uint8_t* vm_snapshot_data,
+                   const uint8_t* vm_snapshot_instructions,
+                   const uint8_t* isolate_snapshot_data,
+                   const uint8_t* isolate_snapshot_instructions)
+      : library_(library),
+        vm_snapshot_data_(vm_snapshot_data),
+        vm_snapshot_instructions_(vm_snapshot_instructions),
+        isolate_snapshot_data_(isolate_snapshot_data),
+        isolate_snapshot_instructions_(isolate_snapshot_instructions) {}
+
+  ~DylibAppSnapshot() { Extensions::UnloadLibrary(library_); }
+
+  void SetBuffers(const uint8_t** vm_data_buffer,
+                  const uint8_t** vm_instructions_buffer,
+                  const uint8_t** isolate_data_buffer,
+                  const uint8_t** isolate_instructions_buffer) {
+    *vm_data_buffer = vm_snapshot_data_;
+    *vm_instructions_buffer = vm_snapshot_instructions_;
+    *isolate_data_buffer = isolate_snapshot_data_;
+    *isolate_instructions_buffer = isolate_snapshot_instructions_;
+  }
+
+ private:
+  void* library_;
+  const uint8_t* vm_snapshot_data_;
+  const uint8_t* vm_snapshot_instructions_;
+  const uint8_t* isolate_snapshot_data_;
+  const uint8_t* isolate_snapshot_instructions_;
+};
+
+
+static AppSnapshot* TryReadAppSnapshotDynamicLibrary(const char* script_name) {
   void* library = Extensions::LoadExtensionLibrary(script_name);
   if (library == NULL) {
-    return false;
+    return NULL;
   }
 
-  *vm_data_buffer = reinterpret_cast<const uint8_t*>(
+  const uint8_t* vm_data_buffer = reinterpret_cast<const uint8_t*>(
       Extensions::ResolveSymbol(library, kVmSnapshotDataSymbolName));
-  if (*vm_data_buffer == NULL) {
-    Log::PrintErr("Failed to resolve symbol '%s'\n", kVmSnapshotDataSymbolName);
-    Platform::Exit(kErrorExitCode);
+  if (vm_data_buffer == NULL) {
+    FATAL1("Failed to resolve symbol '%s'\n", kVmSnapshotDataSymbolName);
   }
 
-  *vm_instructions_buffer = reinterpret_cast<const uint8_t*>(
+  const uint8_t* vm_instructions_buffer = reinterpret_cast<const uint8_t*>(
       Extensions::ResolveSymbol(library, kVmSnapshotInstructionsSymbolName));
-  if (*vm_instructions_buffer == NULL) {
-    Log::PrintErr("Failed to resolve symbol '%s'\n",
-                  kVmSnapshotInstructionsSymbolName);
-    Platform::Exit(kErrorExitCode);
+  if (vm_instructions_buffer == NULL) {
+    FATAL1("Failed to resolve symbol '%s'\n",
+           kVmSnapshotInstructionsSymbolName);
   }
 
-  *isolate_data_buffer = reinterpret_cast<const uint8_t*>(
+  const uint8_t* isolate_data_buffer = reinterpret_cast<const uint8_t*>(
       Extensions::ResolveSymbol(library, kIsolateSnapshotDataSymbolName));
-  if (*isolate_data_buffer == NULL) {
-    Log::PrintErr("Failed to resolve symbol '%s'\n",
-                  kIsolateSnapshotDataSymbolName);
-    Platform::Exit(kErrorExitCode);
+  if (isolate_data_buffer == NULL) {
+    FATAL1("Failed to resolve symbol '%s'\n", kIsolateSnapshotDataSymbolName);
   }
 
-  *isolate_instructions_buffer =
+  const uint8_t* isolate_instructions_buffer =
       reinterpret_cast<const uint8_t*>(Extensions::ResolveSymbol(
           library, kIsolateSnapshotInstructionsSymbolName));
-  if (*isolate_instructions_buffer == NULL) {
-    Log::PrintErr("Failed to resolve symbol '%s'\n",
-                  kIsolateSnapshotInstructionsSymbolName);
-    Platform::Exit(kErrorExitCode);
+  if (isolate_instructions_buffer == NULL) {
+    FATAL1("Failed to resolve symbol '%s'\n",
+           kIsolateSnapshotInstructionsSymbolName);
   }
 
-  return true;
+  return new DylibAppSnapshot(library, vm_data_buffer, vm_instructions_buffer,
+                              isolate_data_buffer, isolate_instructions_buffer);
 }
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 
 
-bool Snapshot::ReadAppSnapshot(const char* script_name,
-                               const uint8_t** vm_data_buffer,
-                               const uint8_t** vm_instructions_buffer,
-                               const uint8_t** isolate_data_buffer,
-                               const uint8_t** isolate_instructions_buffer) {
+AppSnapshot* Snapshot::TryReadAppSnapshot(const char* script_name) {
   if (File::GetType(script_name, true) != File::kIsFile) {
     // If 'script_name' refers to a pipe, don't read to check for an app
     // snapshot since we cannot rewind if it isn't (and couldn't mmap it in
     // anyway if it was).
-    return false;
+    return NULL;
   }
-  if (ReadAppSnapshotBlobs(script_name, vm_data_buffer, vm_instructions_buffer,
-                           isolate_data_buffer, isolate_instructions_buffer)) {
-    return true;
+  AppSnapshot* snapshot = TryReadAppSnapshotBlobs(script_name);
+  if (snapshot != NULL) {
+    return snapshot;
   }
 #if defined(DART_PRECOMPILED_RUNTIME)
   // For testing AOT with the standalone embedder, we also support loading
   // from a dynamic library to simulate what happens on iOS.
-  return ReadAppSnapshotDynamicLibrary(
-      script_name, vm_data_buffer, vm_instructions_buffer, isolate_data_buffer,
-      isolate_instructions_buffer);
-#else
-  return false;
+  snapshot = TryReadAppSnapshotDynamicLibrary(script_name);
+  if (snapshot != NULL) {
+    return snapshot;
+  }
 #endif  //  defined(DART_PRECOMPILED_RUNTIME)
+  return NULL;
 }
 
 
diff --git a/runtime/bin/snapshot_utils.h b/runtime/bin/snapshot_utils.h
index fa66777..758b386 100644
--- a/runtime/bin/snapshot_utils.h
+++ b/runtime/bin/snapshot_utils.h
@@ -10,6 +10,22 @@
 namespace dart {
 namespace bin {
 
+class AppSnapshot {
+ public:
+  virtual ~AppSnapshot() {}
+
+  virtual void SetBuffers(const uint8_t** vm_data_buffer,
+                          const uint8_t** vm_instructions_buffer,
+                          const uint8_t** isolate_data_buffer,
+                          const uint8_t** isolate_instructions_buffer) = 0;
+
+ protected:
+  AppSnapshot() {}
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AppSnapshot);
+};
+
 class Snapshot {
  public:
   static void GenerateScript(const char* snapshot_filename);
@@ -17,11 +33,7 @@
   static void GenerateAppAOTAsBlobs(const char* snapshot_filename);
   static void GenerateAppAOTAsAssembly(const char* snapshot_filename);
 
-  static bool ReadAppSnapshot(const char* script_name,
-                              const uint8_t** vm_data_buffer,
-                              const uint8_t** vm_instructions_buffer,
-                              const uint8_t** isolate_data_buffer,
-                              const uint8_t** isolate_instructions_buffer);
+  static AppSnapshot* TryReadAppSnapshot(const char* script_name);
 
  private:
   DISALLOW_ALLOCATION();
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index c11cec1..3b81e08 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -144,9 +144,7 @@
 
   Future<InternetAddress> reverse() => _NativeSocket.reverseLookup(this);
 
-  _InternetAddress(String this.address,
-                   String this._host,
-                   List<int> this._in_addr);
+  _InternetAddress(this.address, this._host, this._in_addr);
 
   factory _InternetAddress.parse(String address) {
     if (address is !String) {
@@ -1527,7 +1525,7 @@
   var _subscription;
   var _detachReady;
 
-  _Socket(RawSocket this._raw) {
+  _Socket(this._raw) {
     _controller = new StreamController<List<int>>(sync: true,
         onListen: _onSubscriptionStateChange,
         onCancel: _onSubscriptionStateChange,
diff --git a/runtime/bin/vmservice_dartium.cc b/runtime/bin/vmservice_dartium.cc
index f3c91d9..8883ccd 100644
--- a/runtime/bin/vmservice_dartium.cc
+++ b/runtime/bin/vmservice_dartium.cc
@@ -43,7 +43,7 @@
   ASSERT(snapshot_buffer != NULL);
   // Create the isolate.
   IsolateData* isolate_data =
-      new IsolateData(DART_VM_SERVICE_ISOLATE_NAME, NULL, NULL);
+      new IsolateData(DART_VM_SERVICE_ISOLATE_NAME, NULL, NULL, NULL);
   char* error = 0;
   Dart_Isolate isolate =
       Dart_CreateIsolate(DART_VM_SERVICE_ISOLATE_NAME, "main", snapshot_buffer,
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index cf124ba..aab9f31 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -60,10 +60,9 @@
   }
 
   List<E> sublist(int start, [int end]) {
-    Lists.indicesCheck(this, start, end);
-    if (end == null) end = this.length;
+    end = RangeError.checkValidRange(start, end, this.length);
     int length = end - start;
-    if (start == end) return <E>[];
+    if (length == 0) return <E>[];
     var result = new _GrowableList<E>.withData(_slice(start, length, false));
     result._setLength(length);
     return result;
@@ -136,8 +135,7 @@
   int get length native "List_getLength";
 
   List<E> sublist(int start, [int end]) {
-    Lists.indicesCheck(this, start, end);
-    if (end == null) end = this.length;
+    end = RangeError.checkValidRange(start, end, this.length);
     int length = end - start;
     if (length == 0) return <E>[];
     List list = new _List(length);
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index d41a721..2a65b20 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:_internal";
+import "dart:_internal" hide Symbol;
 
 // We need to pass the value as first argument and leave the second and third
 // arguments empty (used for error handling).
diff --git a/runtime/lib/bigint.dart b/runtime/lib/bigint.dart
index 0c562d7..e4fc4eb 100644
--- a/runtime/lib/bigint.dart
+++ b/runtime/lib/bigint.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:typed_data' show Uint32List;
+
 // Copyright 2009 The Go Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
diff --git a/runtime/lib/class_id.cc b/runtime/lib/class_id.cc
index c950b0e..2d9f67d 100644
--- a/runtime/lib/class_id.cc
+++ b/runtime/lib/class_id.cc
@@ -13,24 +13,4 @@
   return Smi::New(instance.GetClassId());
 }
 
-
-DEFINE_NATIVE_ENTRY(ClassID_byName, 1) {
-  GET_NON_NULL_NATIVE_ARGUMENT(String, name, arguments->NativeArgAt(0));
-
-#define CLASS_LIST_WITH_NULL(V)                                                \
-  V(Null)                                                                      \
-  CLASS_LIST_NO_OBJECT(V)
-
-#define COMPARE(clazz)                                                         \
-  if (name.Equals(#clazz)) return Smi::New(k##clazz##Cid);
-
-  CLASS_LIST_WITH_NULL(COMPARE)
-
-#undef COMPARE
-#undef CLASS_LIST_WITH_NULL
-
-  UNREACHABLE();
-  return Smi::New(-1);
-}
-
 }  // namespace dart
diff --git a/runtime/lib/class_id.dart b/runtime/lib/class_id.dart
index 8a8d670..2f60f85 100644
--- a/runtime/lib/class_id.dart
+++ b/runtime/lib/class_id.dart
@@ -5,13 +5,5 @@
 class ClassID {
   static int getID(Object value) native "ClassID_getID";
 
-  static int _lookup(String name) native "ClassID_byName";
-
-  static final int cidArray = _lookup('Array');
-  static final int cidExternalOneByteString = _lookup('ExternalOneByteString');
-  static final int cidGrowableObjectArray = _lookup('GrowableObjectArray');
-  static final int cidImmutableArray = _lookup('ImmutableArray');
-  static final int cidOneByteString = _lookup('OneByteString');
-  static final int cidTwoByteString = _lookup('TwoByteString');
-  static final int cidBigint = _lookup('Bigint');
+  // VM injects class id constants into this class.
 }
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index 86ec9d8..8a37893 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:typed_data' show Uint32List;
+
 // Hash table with open addressing that separates the index from keys/values.
 
 abstract class _HashFieldBase {
diff --git a/runtime/lib/developer.dart b/runtime/lib/developer.dart
index 78c1d6d..3e46cc5 100644
--- a/runtime/lib/developer.dart
+++ b/runtime/lib/developer.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:isolate';
-import 'dart:_internal';
+import 'dart:_internal' hide Symbol;
 
 @patch bool debugger({bool when: true,
                      String message}) native "Developer_debugger";
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index 681b8db..9e5300a 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -46,3 +46,20 @@
 
 // Equivalent of calling FATAL from C++ code.
 fatal(msg) native "DartInternal_fatal";
+
+// Utility class now only used by the VM.
+class Lists {
+  static void copy(List src, int srcStart,
+                   List dst, int dstStart, int count) {
+    if (srcStart < dstStart) {
+      for (int i = srcStart + count - 1, j = dstStart + count - 1;
+           i >= srcStart; i--, j--) {
+        dst[j] = src[i];
+      }
+    } else {
+      for (int i = srcStart, j = dstStart; i < srcStart + count; i++, j++) {
+        dst[j] = src[i];
+      }
+    }
+  }
+}
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 20b1f6b..4ae2741 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:collection" show HashMap;
-import "dart:_internal";
+import "dart:_internal" hide Symbol;
 
 @patch class ReceivePort {
   @patch factory ReceivePort() = _ReceivePortImpl;
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index 7d5e752..b07a6bd 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -99,11 +99,11 @@
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  final _state;
+  final Uint32List _state;
   static const _kSTATE_LO = 0;
   static const _kSTATE_HI = 1;  // Unused in Dart code.
 
-  _Random._withState(Uint32List this._state);
+  _Random._withState(this._state);
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index f152adb..8336126 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -9,7 +9,7 @@
 
 class _InternalMirrorError {
   final String _msg;
-  const _InternalMirrorError(String this._msg);
+  const _InternalMirrorError(this._msg);
   String toString() => _msg;
 }
 
diff --git a/runtime/lib/string_buffer_patch.dart b/runtime/lib/string_buffer_patch.dart
index 80dddd5..8271cc9 100644
--- a/runtime/lib/string_buffer_patch.dart
+++ b/runtime/lib/string_buffer_patch.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:typed_data' show Uint16List;
+
 @patch class StringBuffer {
   static const int _BUFFER_SIZE = 64;
   static const int _PARTS_TO_COMPACT = 128;
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index f046d8f..a4bb7e7 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -1287,9 +1287,7 @@
 
 
 class _StringMatch implements Match {
-  const _StringMatch(int this.start,
-                     String this.input,
-                     String this.pattern);
+  const _StringMatch(this.start, this.input, this.pattern);
 
   int get end => start + pattern.length;
   String operator[](int g) => group(g);
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index ab055ee..4a0dd3e 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "dart:_internal";
+import "dart:_internal" hide Symbol;
 import "dart:collection" show ListBase;
 import 'dart:math' show Random;
 
@@ -179,12 +179,27 @@
   }
 
   int indexOf(element, [int start = 0]) {
-    return Lists.indexOf(this, element, start, this.length);
+    if (start >= this.length) {
+      return -1;
+    } else if (start < 0) {
+      start = 0;
+    }
+    for (int i = start; i < this.length; i++) {
+      if (this[i] == element) return i;
+    }
+    return -1;
   }
 
   int lastIndexOf(element, [int start = null]) {
-    if (start == null) start = this.length - 1;
-    return Lists.lastIndexOf(this, element, start);
+    if (start == null || start >= this.length) {
+      start = this.length - 1;
+    } else if (start < 0) {
+      return -1;
+    }
+    for (int i = start; i >= 0; i--) {
+      if (this[i] == element) return i;
+    }
+    return -1;
   }
 
   void clear() {
diff --git a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
index 9777993..cfdc667 100644
--- a/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_stack_contents_test.dart
@@ -65,6 +65,12 @@
     expect(asyncStack[1].toString(), contains('helper'));
     expect(asyncStack[2].kind, equals(M.FrameKind.asyncSuspensionMarker));
     expect(asyncStack[3].toString(), contains('testMain'));
+    // Line 19.
+    expect(await asyncStack[0].location.toUserString(), contains('.dart:19'));
+    // Line 25.
+    expect(await asyncStack[1].location.toUserString(), contains('.dart:25'));
+    // Line 30.
+    expect(await asyncStack[3].location.toUserString(), contains('.dart:30'));
   },
 ];
 
diff --git a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
index 0a32ace..47c3131 100644
--- a/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
+++ b/runtime/observatory/tests/service/causal_async_star_stack_contents_test.dart
@@ -75,6 +75,12 @@
     expect(asyncStack[2].toString(), contains('helper'));
     expect(asyncStack[3].kind, equals(M.FrameKind.asyncSuspensionMarker));
     expect(asyncStack[4].toString(), contains('testMain'));
+    // Line 21.
+    expect(await asyncStack[0].location.toUserString(), contains('.dart:21'));
+    // Line 27.
+    expect(await asyncStack[2].location.toUserString(), contains('.dart:27'));
+    // Line 30.
+    expect(await asyncStack[4].location.toUserString(), contains('.dart:33'));
   },
 ];
 
diff --git a/runtime/observatory/tests/service/positive_token_pos_test.dart b/runtime/observatory/tests/service/positive_token_pos_test.dart
index eb46496..c30da31 100644
--- a/runtime/observatory/tests/service/positive_token_pos_test.dart
+++ b/runtime/observatory/tests/service/positive_token_pos_test.dart
@@ -19,6 +19,7 @@
 
 var tests = [
   hasStoppedAtBreakpoint,
+  markDartColonLibrariesDebuggable,
   stoppedAtLine(17),
   stepInto,
 
diff --git a/runtime/observatory/tests/service/regress_28443_test.dart b/runtime/observatory/tests/service/regress_28443_test.dart
index b135a6f..652e4b0 100644
--- a/runtime/observatory/tests/service/regress_28443_test.dart
+++ b/runtime/observatory/tests/service/regress_28443_test.dart
@@ -61,6 +61,7 @@
 }
 
 var tests = [hasPausedAtStart,
+             markDartColonLibrariesDebuggable,
              setBreakpointAtLine(LINE_B),
              resumeIsolate,
              hasStoppedAtBreakpoint,
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 45e8b46..44d82f2 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -206,6 +206,24 @@
   return hasPausedFor(isolate, ServiceEvent.kPauseStart);
 }
 
+Future<Isolate> markDartColonLibrariesDebuggable(Isolate isolate) async {
+  await isolate.reload();
+  for (Library lib in isolate.libraries) {
+    await lib.load();
+    if (lib.uri.startsWith('dart:') &&
+        !lib.uri.startsWith('dart:_')) {
+      var setDebugParams = {
+            'libraryId': lib.id,
+            'isDebuggable': true,
+          };
+      Map<String, dynamic> result =
+          await isolate.invokeRpcNoUpgrade('setLibraryDebuggable',
+                                           setDebugParams);
+    }
+  }
+  return isolate;
+}
+
 IsolateTest reloadSources([bool pause = false]) {
     return (Isolate isolate) async {
       Map<String, dynamic> params = <String, dynamic>{ };
diff --git a/runtime/observatory/tests/service/set_library_debuggable_test.dart b/runtime/observatory/tests/service/set_library_debuggable_test.dart
index d76569c..6873e44 100644
--- a/runtime/observatory/tests/service/set_library_debuggable_test.dart
+++ b/runtime/observatory/tests/service/set_library_debuggable_test.dart
@@ -23,11 +23,13 @@
 }
 
 var tests = [
+  hasStoppedAtBreakpoint,
+  markDartColonLibrariesDebuggable,
   (Isolate isolate) async {
     await isolate.reload();
     Library dartCore = isolate.libraries.firstWhere(
       (Library library) => library.uri == 'dart:core');
-    await dartCore.load();
+    await dartCore.reload();
     expect(dartCore.debuggable, equals(true));
   },
   stoppedInFunction('testMain', contains:true),
diff --git a/runtime/observatory/tests/service/step_test.dart b/runtime/observatory/tests/service/step_test.dart
index 47009dc..480f549 100644
--- a/runtime/observatory/tests/service/step_test.dart
+++ b/runtime/observatory/tests/service/step_test.dart
@@ -32,7 +32,10 @@
   return completer.future;
 }
 
-var tests = [hasPausedAtStart, setBreakpointAtLine(LINE_A), stepThroughProgram];
+var tests = [hasPausedAtStart,
+             markDartColonLibrariesDebuggable,
+             setBreakpointAtLine(LINE_A),
+             stepThroughProgram];
 
 main(args) => runIsolateTestsSynchronous(args, tests,
     testeeConcurrent: code, pause_on_start: true, pause_on_exit: true);
diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
index ca1e5af..5078203 100644
--- a/runtime/observatory/tests/service/test_helper.dart
+++ b/runtime/observatory/tests/service/test_helper.dart
@@ -330,7 +330,6 @@
         await process.requestExit();
       });
     }, onError: (error, stackTrace) async {
-      print('onERROR FIRED!');
       if (testsDone) {
         print('Ignoring late exception during process exit:\n'
               '$error\n#stackTrace');
diff --git a/runtime/tools/concatenate_patches.py b/runtime/tools/concatenate_patches.py
index 1653066..8b2df2a5 100755
--- a/runtime/tools/concatenate_patches.py
+++ b/runtime/tools/concatenate_patches.py
@@ -9,9 +9,16 @@
   dart_file_names = filter(lambda name: name.endswith('.dart'),
                            input_file_names)
   with open(output_file_name, 'w') as output_file:
+    is_first = True
     for dart_file_name in dart_file_names:
       with open(dart_file_name, 'r') as dart_file:
-        output_file.write(dart_file.read())
+        if is_first:
+          output_file.write(dart_file.read())
+          is_first = False
+        else:
+          for line in dart_file.readlines():
+            if not line.startswith("import "):
+              output_file.write(line)
 
 
 def main():
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 81f35aa..7fd77e6 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -24,11 +24,15 @@
   result.add_option("--executable",
       action="store", type="string",
       help="path to snapshot generator executable")
+  result.add_option("--snapshot_kind",
+      action="store", type="string",
+      help="kind of snapshot to generate",
+      default="core")
   result.add_option("--vm_output_bin",
       action="store", type="string",
       help="output file name into which vm isolate snapshot in binary form " +
            "is generated")
-  result.add_option("--output_bin",
+  result.add_option("--isolate_output_bin",
       action="store", type="string",
       help="output file name into which isolate snapshot in binary form " +
            "is generated")
@@ -69,11 +73,14 @@
   if not options.executable:
     sys.stderr.write('--executable not specified\n')
     return False
+  if not options.snapshot_kind:
+    sys.stderr.write('--snapshot_kind not specified\n')
+    return False
   if not options.vm_output_bin:
     sys.stderr.write('--vm_output_bin not specified\n')
     return False
-  if not options.output_bin:
-    sys.stderr.write('--output_bin not specified\n')
+  if not options.isolate_output_bin:
+    sys.stderr.write('--isolate_output_bin not specified\n')
     return False
   if options.abi and not options.target_os == 'android':
     sys.stderr.write('--abi requires --target_os android\n')
@@ -116,8 +123,9 @@
     script_args.append(''.join([ "--packages=", options.packages]))
 
   # First setup the vm isolate and regular isolate snapshot output filename.
+  script_args.append(''.join([ "--snapshot_kind=", options.snapshot_kind ]))
   script_args.append(''.join([ "--vm_snapshot_data=", options.vm_output_bin ]))
-  script_args.append(''.join([ "--isolate_snapshot_data=", options.output_bin ]))
+  script_args.append(''.join([ "--isolate_snapshot_data=", options.isolate_output_bin ]))
 
   # Specify the embedder entry points snapshot
   if options.embedder_entry_points_manifest:
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index 57ff349..35c50b6 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -1079,7 +1079,7 @@
   }
   LoadFieldInstr* load = new (Z) LoadFieldInstr(
       new (Z) Value(call->ArgumentAt(0)), &field,
-      AbstractType::ZoneHandle(Z, field.type()), call->token_pos());
+      AbstractType::ZoneHandle(Z, field.type()), call->token_pos(), NULL);
   load->set_is_immutable(field.is_final());
 
   // Discard the environment from the original instruction because the load
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 2650f45..a8cbcba 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -351,7 +351,6 @@
   V(UserTag_makeCurrent, 1)                                                    \
   V(Profiler_getCurrentTag, 0)                                                 \
   V(ClassID_getID, 1)                                                          \
-  V(ClassID_byName, 1)                                                         \
   V(VMService_SendIsolateServiceMessage, 2)                                    \
   V(VMService_SendRootServiceMessage, 1)                                       \
   V(VMService_SendObjectRootServiceMessage, 1)                                 \
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 9ab1c95..e94092b 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -25,6 +25,12 @@
 #define USING_MULTICORE false
 #endif
 
+#if defined(DEBUG)
+#define USING_DEBUG true
+#else
+#define USING_DEBUG false
+#endif
+
 // List of all flags in the VM.
 // Flags can be one of three categories:
 // * P roduct flags: Can be set in any of the deployment modes, including in
@@ -68,6 +74,9 @@
     "Dump megamorphic cache statistics")                                       \
   R(dump_symbol_stats, false, bool, false, "Dump symbol table statistics")     \
   R(enable_asserts, false, bool, false, "Enable assert statements.")           \
+  R(enable_malloc_hooks, false, bool, USING_DEBUG,                             \
+    "Enable native memory statistic collection. Enabled by default in Debug "  \
+    "mode")                                                                    \
   C(enable_mirrors, false, false, bool, true,                                  \
     "Disable to make importing dart:mirrors an error.")                        \
   R(enable_type_checks, false, bool, false, "Enable type checks.")             \
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index a6547d1..cd7733b 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -3414,16 +3414,10 @@
   ValueGraphVisitor for_instance(owner());
   node->instance()->Visit(&for_instance);
   Append(for_instance);
-  LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      for_instance.value(), &node->field(),
-      AbstractType::ZoneHandle(Z, node->field().type()), node->token_pos());
-  if (node->field().guarded_cid() != kIllegalCid) {
-    if (!node->field().is_nullable() ||
-        (node->field().guarded_cid() == kNullCid)) {
-      load->set_result_cid(node->field().guarded_cid());
-    }
-    owner()->parsed_function().AddToGuardedFields(&node->field());
-  }
+  LoadFieldInstr* load =
+      new (Z) LoadFieldInstr(for_instance.value(), &node->field(),
+                             AbstractType::ZoneHandle(Z, node->field().type()),
+                             node->token_pos(), &owner()->parsed_function());
   ReturnDefinition(load);
 }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 8359174..54501a4 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -4289,7 +4289,8 @@
   LoadFieldInstr(Value* instance,
                  const Field* field,
                  const AbstractType& type,
-                 TokenPosition token_pos)
+                 TokenPosition token_pos,
+                 const ParsedFunction* parsed_function)
       : offset_in_bytes_(field->Offset()),
         type_(type),
         result_cid_(kDynamicCid),
@@ -4301,6 +4302,13 @@
     // May be null if field is not an instance.
     ASSERT(type.IsZoneHandle() || type.IsReadOnlyHandle());
     SetInputAt(0, instance);
+
+    if (parsed_function != NULL && field->guarded_cid() != kIllegalCid) {
+      if (!field->is_nullable() || (field->guarded_cid() == kNullCid)) {
+        set_result_cid(field->guarded_cid());
+      }
+      parsed_function->AddToGuardedFields(field);
+    }
   }
 
   void set_is_immutable(bool value) { immutable_ = value; }
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index d7ef3e3..719f359 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -971,16 +971,11 @@
                                                 RawFunction::kImplicitGetter)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      new (Z) Value(call->ArgumentAt(0)), &field,
-      AbstractType::ZoneHandle(Z, field.type()), call->token_pos());
+  LoadFieldInstr* load = new (Z)
+      LoadFieldInstr(new (Z) Value(call->ArgumentAt(0)), &field,
+                     AbstractType::ZoneHandle(Z, field.type()),
+                     call->token_pos(), &flow_graph()->parsed_function());
   load->set_is_immutable(field.is_final());
-  if (field.guarded_cid() != kIllegalCid) {
-    if (!field.is_nullable() || (field.guarded_cid() == kNullCid)) {
-      load->set_result_cid(field.guarded_cid());
-    }
-    flow_graph()->parsed_function().AddToGuardedFields(&field);
-  }
 
   // Discard the environment from the original instruction because the load
   // can't deoptimize.
diff --git a/runtime/vm/kernel_reader.cc b/runtime/vm/kernel_reader.cc
index b694077..752e42e 100644
--- a/runtime/vm/kernel_reader.cc
+++ b/runtime/vm/kernel_reader.cc
@@ -288,28 +288,37 @@
 
   ActiveClassScope active_class_scope(&active_class_, kernel_klass, &klass);
 
-  for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) {
-    Field* kernel_field = kernel_klass->fields()[i];
-    ActiveMemberScope active_member_scope(&active_class_, kernel_field);
+  if (library.raw() == dart::Library::InternalLibrary() &&
+      klass.Name() == Symbols::ClassID().raw()) {
+    // If this is a dart:internal.ClassID class ignore field declarations
+    // contained in the Kernel file and instead inject our own const
+    // fields.
+    klass.InjectCIDFields();
+  } else {
+    for (intptr_t i = 0; i < kernel_klass->fields().length(); i++) {
+      Field* kernel_field = kernel_klass->fields()[i];
+      ActiveMemberScope active_member_scope(&active_class_, kernel_field);
 
-    const dart::String& name = H.DartFieldName(kernel_field->name());
-    const AbstractType& type =
-        T.TranslateTypeWithoutFinalization(kernel_field->type());
-    const Object& script_class =
-        ClassForScriptAt(klass, kernel_field->source_uri_index());
-    dart::Field& field = dart::Field::Handle(
-        Z, dart::Field::New(name, kernel_field->IsStatic(),
-                            // In the VM all const fields are implicitly final
-                            // whereas in Kernel they are not final because they
-                            // are not explicitly declared that way.
-                            kernel_field->IsFinal() || kernel_field->IsConst(),
-                            kernel_field->IsConst(),
-                            false,  // is_reflectable
-                            script_class, type, kernel_field->position()));
-    field.set_kernel_field(kernel_field);
-    field.set_has_initializer(kernel_field->initializer() != NULL);
-    GenerateFieldAccessors(klass, field, kernel_field);
-    klass.AddField(field);
+      const dart::String& name = H.DartFieldName(kernel_field->name());
+      const AbstractType& type =
+          T.TranslateTypeWithoutFinalization(kernel_field->type());
+      const Object& script_class =
+          ClassForScriptAt(klass, kernel_field->source_uri_index());
+      dart::Field& field = dart::Field::Handle(
+          Z,
+          dart::Field::New(name, kernel_field->IsStatic(),
+                           // In the VM all const fields are implicitly final
+                           // whereas in Kernel they are not final because they
+                           // are not explicitly declared that way.
+                           kernel_field->IsFinal() || kernel_field->IsConst(),
+                           kernel_field->IsConst(),
+                           false,  // is_reflectable
+                           script_class, type, kernel_field->position()));
+      field.set_kernel_field(kernel_field);
+      field.set_has_initializer(kernel_field->initializer() != NULL);
+      GenerateFieldAccessors(klass, field, kernel_field);
+      klass.AddField(field);
+    }
   }
 
   for (intptr_t i = 0; i < kernel_klass->constructors().length(); i++) {
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 984de1d..d12987f 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -2452,9 +2452,10 @@
 
 
 Fragment FlowGraphBuilder::LoadField(const dart::Field& field) {
-  LoadFieldInstr* load = new (Z) LoadFieldInstr(
-      Pop(), &MayCloneField(Z, field),
-      AbstractType::ZoneHandle(Z, field.type()), TokenPosition::kNoSource);
+  LoadFieldInstr* load =
+      new (Z) LoadFieldInstr(Pop(), &MayCloneField(Z, field),
+                             AbstractType::ZoneHandle(Z, field.type()),
+                             TokenPosition::kNoSource, parsed_function_);
   Push(load);
   return Fragment(load);
 }
@@ -4496,7 +4497,7 @@
     Field* kernel_field = Field::Cast(target);
     const dart::Field& field =
         dart::Field::ZoneHandle(Z, H.LookupFieldByKernelField(kernel_field));
-    if (kernel_field->IsConst()) {
+    if (field.is_const()) {
       fragment_ = Constant(constant_evaluator_.EvaluateExpression(node));
     } else {
       const dart::Class& owner = dart::Class::Handle(Z, field.Owner());
@@ -4778,7 +4779,7 @@
 
 void FlowGraphBuilder::VisitDirectMethodInvocation(
     DirectMethodInvocation* node) {
-  const dart::String& method_name = H.DartMethodName(node->target()->name());
+  const dart::String& method_name = H.DartProcedureName(node->target());
   const Function& target = Function::ZoneHandle(
       Z, LookupMethodByMember(node->target(), method_name));
 
diff --git a/runtime/vm/malloc_hooks.cc b/runtime/vm/malloc_hooks.cc
index 9e5c658..4f7de9e 100644
--- a/runtime/vm/malloc_hooks.cc
+++ b/runtime/vm/malloc_hooks.cc
@@ -22,33 +22,47 @@
 class MallocHookScope {
  public:
   static void InitMallocHookFlag() {
+    MutexLocker ml(malloc_hook_scope_mutex_);
     ASSERT(in_malloc_hook_flag_ == kUnsetThreadLocalKey);
     in_malloc_hook_flag_ = OSThread::CreateThreadLocal();
     OSThread::SetThreadLocal(in_malloc_hook_flag_, 0);
   }
 
   static void DestroyMallocHookFlag() {
+    MutexLocker ml(malloc_hook_scope_mutex_);
     ASSERT(in_malloc_hook_flag_ != kUnsetThreadLocalKey);
     OSThread::DeleteThreadLocal(in_malloc_hook_flag_);
     in_malloc_hook_flag_ = kUnsetThreadLocalKey;
   }
 
   MallocHookScope() {
+    MutexLocker ml(malloc_hook_scope_mutex_);
     ASSERT(in_malloc_hook_flag_ != kUnsetThreadLocalKey);
     OSThread::SetThreadLocal(in_malloc_hook_flag_, 1);
   }
 
   ~MallocHookScope() {
+    MutexLocker ml(malloc_hook_scope_mutex_);
     ASSERT(in_malloc_hook_flag_ != kUnsetThreadLocalKey);
     OSThread::SetThreadLocal(in_malloc_hook_flag_, 0);
   }
 
   static bool IsInHook() {
-    ASSERT(in_malloc_hook_flag_ != kUnsetThreadLocalKey);
+    MutexLocker ml(malloc_hook_scope_mutex_);
+    if (in_malloc_hook_flag_ == kUnsetThreadLocalKey) {
+      // Bail out if the malloc hook flag is invalid. This means that
+      // MallocHookState::TearDown() has been called and MallocHookScope is no
+      // longer intitialized. Don't worry if MallocHookState::TearDown() is
+      // called before the hooks grab the mutex, since
+      // MallocHooksState::Active() is checked after the lock is taken before
+      // proceeding to act on the allocation/free.
+      return false;
+    }
     return OSThread::GetThreadLocal(in_malloc_hook_flag_);
   }
 
  private:
+  static Mutex* malloc_hook_scope_mutex_;
   static ThreadLocalKey in_malloc_hook_flag_;
 
   DISALLOW_ALLOCATION();
@@ -173,8 +187,11 @@
 };
 
 
-// MallocHooks state / locks.
+// MallocHookScope state.
+Mutex* MallocHookScope::malloc_hook_scope_mutex_ = new Mutex();
 ThreadLocalKey MallocHookScope::in_malloc_hook_flag_ = kUnsetThreadLocalKey;
+
+// MallocHooks state / locks.
 bool MallocHooksState::active_ = false;
 intptr_t MallocHooksState::original_pid_ = MallocHooksState::kInvalidPid;
 Mutex* MallocHooksState::malloc_hook_mutex_ = new Mutex();
@@ -186,6 +203,9 @@
 
 
 void MallocHooks::InitOnce() {
+  if (!FLAG_enable_malloc_hooks) {
+    return;
+  }
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
   ASSERT(!MallocHooksState::Active());
 
@@ -202,6 +222,9 @@
 
 
 void MallocHooks::TearDown() {
+  if (!FLAG_enable_malloc_hooks) {
+    return;
+  }
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
   ASSERT(MallocHooksState::Active());
 
@@ -218,6 +241,9 @@
 
 
 void MallocHooks::ResetStats() {
+  if (!FLAG_enable_malloc_hooks) {
+    return;
+  }
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
   if (MallocHooksState::Active()) {
     MallocHooksState::ResetStats();
@@ -226,12 +252,18 @@
 
 
 bool MallocHooks::Active() {
+  if (!FLAG_enable_malloc_hooks) {
+    return false;
+  }
   ASSERT(MallocHooksState::malloc_hook_mutex()->IsOwnedByCurrentThread());
   return MallocHooksState::Active();
 }
 
 
 void MallocHooks::PrintToJSONObject(JSONObject* jsobj) {
+  if (!FLAG_enable_malloc_hooks) {
+    return;
+  }
   intptr_t allocated_memory = 0;
   intptr_t allocation_count = 0;
   bool add_usage = false;
@@ -254,12 +286,18 @@
 
 
 intptr_t MallocHooks::allocation_count() {
+  if (!FLAG_enable_malloc_hooks) {
+    return 0;
+  }
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
   return MallocHooksState::allocation_count();
 }
 
 
 intptr_t MallocHooks::heap_allocated_memory_in_bytes() {
+  if (!FLAG_enable_malloc_hooks) {
+    return 0;
+  }
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
   return MallocHooksState::heap_allocated_memory_in_bytes();
 }
@@ -270,11 +308,12 @@
     return;
   }
 
-  // Set the malloc hook flag before grabbing the mutex to avoid calling hooks
-  // again.
-  MallocHookScope mhs;
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
+  // Now that we hold the lock, check to make sure everything is still active.
   if ((ptr != NULL) && MallocHooksState::Active()) {
+    // Set the malloc hook flag to avoid calling hooks again if memory is
+    // allocated/freed below.
+    MallocHookScope mhs;
     MallocHooksState::IncrementHeapAllocatedMemoryInBytes(size);
     MallocHooksState::address_map()->Insert(ptr, size);
   }
@@ -286,11 +325,12 @@
     return;
   }
 
-  // Set the malloc hook flag before grabbing the mutex to avoid calling hooks
-  // again.
-  MallocHookScope mhs;
   MutexLocker ml(MallocHooksState::malloc_hook_mutex());
+  // Now that we hold the lock, check to make sure everything is still active.
   if ((ptr != NULL) && MallocHooksState::Active()) {
+    // Set the malloc hook flag to avoid calling hooks again if memory is
+    // allocated/freed below.
+    MallocHookScope mhs;
     intptr_t size = 0;
     if (MallocHooksState::address_map()->Lookup(ptr, &size)) {
       MallocHooksState::DecrementHeapAllocatedMemoryInBytes(size);
diff --git a/runtime/vm/malloc_hooks_test.cc b/runtime/vm/malloc_hooks_test.cc
index 5054a50..791e269 100644
--- a/runtime/vm/malloc_hooks_test.cc
+++ b/runtime/vm/malloc_hooks_test.cc
@@ -26,6 +26,9 @@
 
 
 UNIT_TEST_CASE(BasicMallocHookTest) {
+  bool enable_malloc_hooks_saved = FLAG_enable_malloc_hooks;
+  FLAG_enable_malloc_hooks = true;
+
   MallocHooks::InitOnce();
   MallocHooks::ResetStats();
   EXPECT_EQ(0L, MallocHooks::allocation_count());
@@ -42,10 +45,15 @@
   EXPECT_EQ(0L, MallocHooks::allocation_count());
   EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes());
   MallocHooks::TearDown();
+
+  FLAG_enable_malloc_hooks = enable_malloc_hooks_saved;
 }
 
 
 UNIT_TEST_CASE(FreeUnseenMemoryMallocHookTest) {
+  bool enable_malloc_hooks_saved = FLAG_enable_malloc_hooks;
+  FLAG_enable_malloc_hooks = true;
+
   MallocHooks::InitOnce();
   const intptr_t pre_hook_buffer_size = 3;
   char* pre_hook_buffer = new char[pre_hook_buffer_size];
@@ -73,6 +81,8 @@
   EXPECT_EQ(0L, MallocHooks::allocation_count());
   EXPECT_EQ(0L, MallocHooks::heap_allocated_memory_in_bytes());
   MallocHooks::TearDown();
+
+  FLAG_enable_malloc_hooks = enable_malloc_hooks_saved;
 }
 
 };  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index b8da116..7482015 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -1177,7 +1177,7 @@
                                            "Object::Init");)
 
 #if defined(DART_NO_SNAPSHOT)
-  bool bootstrapping = true;
+  bool bootstrapping = Dart::vm_snapshot_kind() == Snapshot::kNone;
 #elif defined(DART_PRECOMPILED_RUNTIME)
   bool bootstrapping = false;
 #else
@@ -1670,6 +1670,13 @@
     // Set up recognized state of all functions (core, math and typed data).
     MethodRecognizer::InitializeState();
 
+    // Adds static const fields (class ids) to the class 'ClassID');
+    lib = Library::LookupLibrary(thread, Symbols::DartInternal());
+    ASSERT(!lib.IsNull());
+    cls = lib.LookupClassAllowPrivate(Symbols::ClassID());
+    ASSERT(!cls.IsNull());
+    cls.InjectCIDFields();
+
     isolate->object_store()->InitKnownObjects();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   } else {
@@ -3157,6 +3164,32 @@
 }
 
 
+void Class::InjectCIDFields() const {
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Field& field = Field::Handle(zone);
+  Smi& value = Smi::Handle(zone);
+  String& field_name = String::Handle(zone);
+
+#define CLASS_LIST_WITH_NULL(V)                                                \
+  V(Null)                                                                      \
+  CLASS_LIST_NO_OBJECT(V)
+
+#define ADD_SET_FIELD(clazz)                                                   \
+  field_name = Symbols::New(thread, "cid" #clazz);                             \
+  field =                                                                      \
+      Field::New(field_name, true, false, true, false, *this,                  \
+                 Type::Handle(Type::IntType()), TokenPosition::kMinSource);    \
+  value = Smi::New(k##clazz##Cid);                                             \
+  field.SetStaticValue(value, true);                                           \
+  AddField(field);
+
+  CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
+#undef ADD_SET_FIELD
+#undef CLASS_LIST_WITH_NULL
+}
+
+
 template <class FakeInstance>
 RawClass* Class::NewCommon(intptr_t index) {
   ASSERT(Object::class_class() != Class::null());
@@ -10805,7 +10838,17 @@
   result.set_native_entry_symbol_resolver(NULL);
   result.set_is_in_fullsnapshot(false);
   result.StoreNonPointer(&result.raw_ptr()->corelib_imported_, true);
-  result.set_debuggable(!dart_private_scheme);
+  if (dart_private_scheme) {
+    // Never debug dart:_ libraries.
+    result.set_debuggable(false);
+  } else if (dart_scheme) {
+    // Only debug dart: libraries if we have been requested to show invisible
+    // frames.
+    result.set_debuggable(FLAG_show_invisible_frames);
+  } else {
+    // Default to debuggable for all other libraries.
+    result.set_debuggable(true);
+  }
   result.set_is_dart_scheme(dart_scheme);
   result.StoreNonPointer(&result.raw_ptr()->load_state_,
                          RawLibrary::kAllocated);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9265649..9023b2f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1128,6 +1128,8 @@
   void AddField(const Field& field) const;
   void AddFields(const GrowableArray<const Field*>& fields) const;
 
+  void InjectCIDFields() const;
+
   // Returns an array of all instance fields of this class and its superclasses
   // indexed by offset in words.
   // |original_classes| only has an effect when reloading. If true and we
diff --git a/runtime/vm/redundancy_elimination.cc b/runtime/vm/redundancy_elimination.cc
index e8ffd2c..66a287c 100644
--- a/runtime/vm/redundancy_elimination.cc
+++ b/runtime/vm/redundancy_elimination.cc
@@ -3081,7 +3081,7 @@
         slots[i]->IsField()
             ? new (Z) LoadFieldInstr(
                   new (Z) Value(alloc), &Field::Cast(*slots[i]),
-                  AbstractType::ZoneHandle(Z), alloc->token_pos())
+                  AbstractType::ZoneHandle(Z), alloc->token_pos(), NULL)
             : new (Z) LoadFieldInstr(
                   new (Z) Value(alloc), Smi::Cast(*slots[i]).Value(),
                   AbstractType::ZoneHandle(Z), alloc->token_pos());
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 6065b6d..e4c0c69 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1491,8 +1491,8 @@
 ```
 class Frame extends Response {
   int index;
-  @Function function;
-  @Code code;
+  @Function function [optional];
+  @Code code [optional];
   SourceLocation location [optional];
   BoundVariable[] vars [optional];
   FrameKind kind [optional];
diff --git a/sdk/bin/dartanalyzer b/sdk/bin/dartanalyzer
index 34ce895..bad9306 100755
--- a/sdk/bin/dartanalyzer
+++ b/sdk/bin/dartanalyzer
@@ -45,4 +45,6 @@
 
 ANALYZER="$DART_ROOT/pkg/analyzer_cli/bin/analyzer.dart"
 
-exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$SDK_ARG" "$@"
+DEV_OPTIONS="--use-analysis-driver-memory-byte-store"
+
+exec "$DART" "--packages=$DART_ROOT/.packages" "${EXTRA_VM_OPTIONS[@]}" "$ANALYZER" "$DEV_OPTIONS" "$SDK_ARG" "$@"
diff --git a/sdk/lib/async/deferred_load.dart b/sdk/lib/async/deferred_load.dart
index 9d5c51f..698e60b 100644
--- a/sdk/lib/async/deferred_load.dart
+++ b/sdk/lib/async/deferred_load.dart
@@ -30,7 +30,7 @@
  * Thrown when a deferred library fails to load.
  */
 class DeferredLoadException implements Exception {
-  DeferredLoadException(String this._s);
+  DeferredLoadException(this._s);
   String toString() => "DeferredLoadException: '$_s'";
   final String _s;
 }
\ No newline at end of file
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 4e6ba42..eaad3b4 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -5,7 +5,7 @@
 part of dart.async;
 
 /** The onValue and onError handlers return either a value or a future */
-typedef dynamic/*T|Future<T>*/ _FutureOnValue<S, T>(S value);
+typedef FutureOr<T> _FutureOnValue<S, T>(S value);
 /** Test used by [Future.catchError] to handle skip some errors. */
 typedef bool _FutureErrorTest(var error);
 /** Used by [WhenFuture]. */
@@ -127,8 +127,8 @@
     return _onError != null;
   }
 
-  dynamic/*T|Future<T>*/ handleValue(S sourceResult) {
-    return _zone.runUnary<dynamic/*T|Future<T>*/, S>(
+  FutureOr<T> handleValue(S sourceResult) {
+    return _zone.runUnary<FutureOr<T>, S>(
         _onValue, sourceResult);
   }
 
@@ -138,16 +138,16 @@
     return _zone.runUnary<bool, dynamic>(_errorTest, asyncError.error);
   }
 
-  dynamic/*T|Future<T>*/ handleError(AsyncError asyncError) {
+  FutureOr<T> handleError(AsyncError asyncError) {
     assert(handlesError && hasErrorCallback);
     if (errorCallback is ZoneBinaryCallback) {
       var typedErrorCallback = errorCallback as Object
-          /*=ZoneBinaryCallback<Object/*T|Future<T>*/, Object, StackTrace>*/;
+          /*=ZoneBinaryCallback<FutureOr<T>, Object, StackTrace>*/;
       return _zone.runBinary(typedErrorCallback,
           asyncError.error,
           asyncError.stackTrace);
     } else {
-      return _zone.runUnary<dynamic/*T|Future<T>*/, dynamic>(
+      return _zone.runUnary<FutureOr<T>, dynamic>(
           errorCallback, asyncError.error);
     }
   }
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index 5a2a906..a66a5cd 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -11,7 +11,7 @@
  */
 library dart.collection;
 
-import 'dart:_internal';
+import 'dart:_internal' hide Symbol;
 import 'dart:math' show Random;  // Used by ListMixin.shuffle.
 
 part 'collections.dart';
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index ef646f3..276b108 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -15,7 +15,7 @@
   _SplayTreeNode<K> left;
   _SplayTreeNode<K> right;
 
-  _SplayTreeNode(K this.key);
+  _SplayTreeNode(this.key);
 }
 
 /**
@@ -25,7 +25,7 @@
  */
 class _SplayTreeMapNode<K, V> extends _SplayTreeNode<K> {
   V value;
-  _SplayTreeMapNode(K key, V this.value) : super(key);
+  _SplayTreeMapNode(K key, this.value) : super(key);
 }
 
 /**
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index 0254f85..ee65ae7 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -57,6 +57,140 @@
   Base64Encoder get encoder => _encoder;
 
   Base64Decoder get decoder => const Base64Decoder();
+
+  /**
+   * Validates and normalizes the base64 encoded data in [source].
+   *
+   * Only acts on the substring from [start] to [end], with [end]
+   * defaulting to the end of the string.
+   *
+   * Normalization will:
+   * * Unescape any `%`-escapes.
+   * * Only allow valid characters (`A`-`Z`, `a`-`z`, `0`-`9`, `/` and `+`).
+   * * Normalize a `_` or `-` character to `/` or `+`.
+   * * Validate that existing padding (trailing `=` characters) is correct.
+   * * If no padding exists, add correct padding if necessary and possible.
+   * * Validate that the length is correct (a multiple of four).
+   */
+  String normalize(String source, [int start = 0, int end]) {
+    end = RangeError.checkValidRange(start, end, source.length);
+    const int percent = 0x25;
+    const int equals = 0x3d;
+    StringBuffer buffer = null;
+    int sliceStart = start;
+    var alphabet = _Base64Encoder._base64Alphabet;
+    var inverseAlphabet = _Base64Decoder._inverseAlphabet;
+    int firstPadding = -1;
+    int firstPaddingSourceIndex = -1;
+    int paddingCount = 0;
+    for (int i = start; i < end;) {
+      int sliceEnd = i;
+      int char = source.codeUnitAt(i++);
+      int originalChar = char;
+      // Normalize char, keep originalChar to see if it matches the source.
+      if (char == percent) {
+        if (i + 2 <= end) {
+          char = parseHexByte(source, i);  // May be negative.
+          i += 2;
+          // We know that %25 isn't valid, but our table considers it
+          // a potential padding start, so skip the checks.
+          if (char == percent) char = -1;
+        } else {
+          // An invalid HEX escape (too short).
+          // Just skip past the handling and reach the throw below.
+          char = -1;
+        }
+      }
+      // If char is negative here, hex-decoding failed in some way.
+      if (0 <= char && char <= 127) {
+        int value = inverseAlphabet[char];
+        if (value >= 0) {
+          char = alphabet.codeUnitAt(value);
+          if (char == originalChar) continue;
+        } else if (value == _Base64Decoder._padding) {
+          // We have ruled out percent, so char is '='.
+          if (firstPadding < 0) {
+            // Mark position in normalized output where padding occurs.
+            firstPadding = (buffer?.length ?? 0) + (sliceEnd - sliceStart);
+            firstPaddingSourceIndex = sliceEnd;
+          }
+          paddingCount++;
+          // It could have been an escaped equals (%3D).
+          if (originalChar == equals) continue;
+        }
+        if (value != _Base64Decoder._invalid) {
+          buffer ??= new StringBuffer();
+          buffer.write(source.substring(sliceStart, sliceEnd));
+          buffer.writeCharCode(char);
+          sliceStart = i;
+          continue;
+        }
+      }
+      throw new FormatException("Invalid base64 data", source, sliceEnd);
+    }
+    if (buffer != null) {
+      buffer.write(source.substring(sliceStart, end));
+      if (firstPadding >= 0) {
+        // There was padding in the source. Check that it is valid:
+        // * result length a multiple of four
+        // * one or two padding characters at the end.
+        _checkPadding(source, firstPaddingSourceIndex, end,
+                      firstPadding, paddingCount, buffer.length);
+      } else {
+        // Length of last chunk (1-4 chars) in the encoding.
+        int endLength = ((buffer.length - 1) % 4) + 1;
+        if (endLength == 1) {
+          // The data must have length 0, 2 or 3 modulo 4.
+          throw new FormatException("Invalid base64 encoding length ",
+              source, end);
+        }
+        while (endLength < 4) {
+          buffer.write("=");
+          endLength++;
+        }
+      }
+      return source.replaceRange(start, end, buffer.toString());
+    }
+    // Original was already normalized, only check padding.
+    int length = end - start;
+    if (firstPadding >= 0) {
+      _checkPadding(source, firstPaddingSourceIndex, end,
+          firstPadding, paddingCount, length);
+    } else {
+      // No padding given, so add some if needed it.
+      int endLength = length % 4;
+      if (endLength == 1) {
+          // The data must have length 0, 2 or 3 modulo 4.
+          throw new FormatException("Invalid base64 encoding length ",
+              source, end);
+      }
+      if (endLength > 1) {
+        // There is no "insertAt" on String, but this works as well.
+        source = source.replaceRange(end, end, (endLength == 2) ? "==" : "=");
+      }
+    }
+    return source;
+  }
+
+  static int _checkPadding(String source, int sourceIndex, int sourceEnd,
+          int firstPadding, int paddingCount, int length) {
+    if (length % 4 != 0) {
+      throw new FormatException(
+          "Invalid base64 padding, padded length must be multiple of four, "
+          "is $length",
+          source, sourceEnd);
+    }
+    if (firstPadding + paddingCount != length) {
+      throw new FormatException(
+          "Invalid base64 padding, '=' not at the end",
+          source, sourceIndex);
+    }
+    if (paddingCount > 2) {
+      throw new FormatException(
+          "Invalid base64 padding, more than two '=' characters",
+          source, sourceIndex);
+    }
+  }
 }
 
 // ------------------------------------------------------------------------
@@ -389,7 +523,7 @@
    *
    * Accepts the "URL-safe" alphabet as well (`-` and `_` are the
    * 62nd and 63rd alphabet characters), and considers `%` a padding
-   * character, which mush then be followed by `3D`, the percent-escape
+   * character, which must then be followed by `3D`, the percent-escape
    * for `=`.
    */
   static final List<int> _inverseAlphabet = new Int8List.fromList([
diff --git a/sdk/lib/convert/convert.dart b/sdk/lib/convert/convert.dart
index 83bbfd6..d1d9a14 100644
--- a/sdk/lib/convert/convert.dart
+++ b/sdk/lib/convert/convert.dart
@@ -55,6 +55,7 @@
 
 import 'dart:async';
 import 'dart:typed_data';
+import 'dart:_internal' show parseHexByte;
 
 part 'ascii.dart';
 part 'base64.dart';
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index 712f094..ea700c5b 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -181,7 +181,7 @@
    * Creates a JSON encoder.
    *
    * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps directly.
+   * maps with string keys directly.
    *
    * Any other object is attempted converted by [toEncodable] to an
    * object that is of one of the convertible types.
@@ -189,7 +189,7 @@
    * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
    * the object.
    */
-  const JsonEncoder([toEncodable(nonSerializable)])
+  const JsonEncoder([toEncodable(object)])
       : this.indent = null,
         this._toEncodable = toEncodable;
 
@@ -203,7 +203,7 @@
    * If [indent] is `null`, the output is encoded as a single line.
    *
    * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps directly.
+   * maps with string keys directly.
    *
    * Any other object is attempted converted by [toEncodable] to an
    * object that is of one of the convertible types.
@@ -211,7 +211,7 @@
    * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
    * the object.
    */
-  const JsonEncoder.withIndent(this.indent, [toEncodable(nonSerializable)])
+  const JsonEncoder.withIndent(this.indent, [toEncodable(object)])
       : this._toEncodable = toEncodable;
 
   /**
diff --git a/sdk/lib/convert/string_conversion.dart b/sdk/lib/convert/string_conversion.dart
index 6eb27d9..e5bce69 100644
--- a/sdk/lib/convert/string_conversion.dart
+++ b/sdk/lib/convert/string_conversion.dart
@@ -193,7 +193,7 @@
  */
 class _StringSinkConversionSink extends StringConversionSinkBase {
   StringSink _stringSink;
-  _StringSinkConversionSink(StringSink this._stringSink);
+  _StringSinkConversionSink(this._stringSink);
 
   void close() {}
   void addSlice(String str, int start, int end, bool isLast) {
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 16f2ffb..c774b65 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -159,9 +159,7 @@
    * names differ from the interface, it might be more useful to use the
    * interface method's argument name (or just rename arguments to match).
    */
-  ArgumentError.value(value,
-                      [String this.name,
-                       String this.message])
+  ArgumentError.value(value, [this.name, this.message])
       : invalidValue = value,
         _hasValue = true;
 
@@ -499,7 +497,7 @@
  */
 class UnimplementedError extends Error implements UnsupportedError {
   final String message;
-  UnimplementedError([String this.message]);
+  UnimplementedError([this.message]);
   String toString() => (this.message != null
                         ? "UnimplementedError: $message"
                         : "UnimplementedError");
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 0454491..232d552 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -7,10 +7,12 @@
 // Frequently used character codes.
 const int _SPACE = 0x20;
 const int _PERCENT = 0x25;
+const int _AMPERSAND = 0x26;
 const int _PLUS = 0x2B;
 const int _DOT = 0x2E;
 const int _SLASH = 0x2F;
 const int _COLON = 0x3A;
+const int _EQUALS = 0x3d;
 const int _UPPER_CASE_A = 0x41;
 const int _UPPER_CASE_Z = 0x5A;
 const int _LEFT_BRACKET = 0x5B;
@@ -1369,7 +1371,7 @@
    *
    * Always non-null.
    */
-  String _path;
+  final String path;
 
   // The query content, or null if there is no query.
   final String _query;
@@ -1401,11 +1403,21 @@
   Map<String, List<String>> _queryParameterLists;
 
   /// Internal non-verifying constructor. Only call with validated arguments.
+  ///
+  /// The components must be properly normalized.
+  ///
+  /// Use `null` for [_host] if there is no authority. In that case, always
+  /// pass `null` for [_port] and [_userInfo] as well.
+  ///
+  /// Use `null` for [_port], [_userInfo], [_query] and [_fragment] if there is
+  /// component of that type.
+  ///
+  /// The [path] and [scheme] are never empty.
   _Uri._internal(this.scheme,
                  this._userInfo,
                  this._host,
                  this._port,
-                 this._path,
+                 this.path,
                  this._query,
                  this._fragment);
 
@@ -1543,8 +1555,6 @@
     return 0;
   }
 
-  String get path => _path;
-
   String get query => _query ?? "";
 
   String get fragment => _fragment ?? "";
@@ -1847,7 +1857,7 @@
       path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
                        scheme, hasAuthority);
     } else {
-      path = this._path;
+      path = this.path;
       if ((isFile || (hasAuthority && !path.isEmpty)) &&
           !path.startsWith('/')) {
         path = "/" + path;
@@ -1873,7 +1883,7 @@
   Uri removeFragment() {
     if (!this.hasFragment) return this;
     return new _Uri._internal(scheme, _userInfo, _host, _port,
-                             _path, _query, null);
+                             path, _query, null);
   }
 
   List<String> get pathSegments {
@@ -1914,8 +1924,8 @@
   }
 
   Uri normalizePath() {
-    String path = _normalizePath(_path, scheme, hasAuthority);
-    if (identical(path, _path)) return this;
+    String path = _normalizePath(this.path, scheme, hasAuthority);
+    if (identical(path, this.path)) return this;
     return this.replace(path: path);
   }
 
@@ -2082,7 +2092,7 @@
 
   static String _makeUserInfo(String userInfo, int start, int end) {
     if (userInfo == null) return "";
-    return _normalize(userInfo, start, end, _userinfoTable);
+    return _normalizeOrSubstring(userInfo, start, end, _userinfoTable);
   }
 
   static String _makePath(String path, int start, int end,
@@ -2097,7 +2107,7 @@
     }
     var result;
     if (path != null) {
-      result = _normalize(path, start, end, _pathCharOrSlashTable);
+      result = _normalizeOrSubstring(path, start, end, _pathCharOrSlashTable);
     } else {
       result = pathSegments.map((s) =>
           _uriEncode(_pathCharTable, s, UTF8, false)).join("/");
@@ -2130,7 +2140,7 @@
       if (queryParameters != null) {
         throw new ArgumentError('Both query and queryParameters specified');
       }
-      return _normalize(query, start, end, _queryCharTable);
+      return _normalizeOrSubstring(query, start, end, _queryCharTable);
     }
     if (queryParameters == null) return null;
 
@@ -2162,7 +2172,7 @@
 
   static String _makeFragment(String fragment, int start, int end) {
     if (fragment == null) return null;
-    return _normalize(fragment, start, end, _queryCharTable);
+    return _normalizeOrSubstring(fragment, start, end, _queryCharTable);
   }
 
   /**
@@ -2185,8 +2195,8 @@
     }
     int firstDigit = source.codeUnitAt(index + 1);
     int secondDigit = source.codeUnitAt(index + 2);
-    int firstDigitValue = _parseHexDigit(firstDigit);
-    int secondDigitValue = _parseHexDigit(secondDigit);
+    int firstDigitValue = hexDigitValue(firstDigit);
+    int secondDigitValue = hexDigitValue(secondDigit);
     if (firstDigitValue < 0 || secondDigitValue < 0) {
       return "%";  // Marks the escape as invalid.
     }
@@ -2206,19 +2216,6 @@
     return null;
   }
 
-  // Converts a UTF-16 code-unit to its value as a hex digit.
-  // Returns -1 for non-hex digits.
-  static int _parseHexDigit(int char) {
-    const int zeroDigit = 0x30;
-    int digit = char ^ zeroDigit;
-    if (digit <= 9) return digit;
-    int lowerCase = char | 0x20;
-    if (_LOWER_CASE_A <= lowerCase && lowerCase <= _LOWER_CASE_F) {
-      return lowerCase - (_LOWER_CASE_A - 10);
-    }
-    return -1;
-  }
-
   static String _escapeChar(int char) {
     assert(char <= 0x10ffff);  // It's a valid unicode code point.
     List<int> codeUnits;
@@ -2255,6 +2252,18 @@
   }
 
   /**
+   * Normalizes using [_normalize] or returns substring of original.
+   *
+   * If [_normalize] returns `null` (original content is already normalized),
+   * this methods returns the substring if [component] from [start] to [end].
+   */
+  static String _normalizeOrSubstring(String component, int start, int end,
+                                      List<int> charTable) {
+    return _normalize(component, start, end, charTable) ??
+        component.substring(start, end);
+  }
+
+  /**
    * Runs through component checking that each character is valid and
    * normalize percent escapes.
    *
@@ -2262,9 +2271,12 @@
    * Each `%` character must be followed by two hex digits.
    * If the hex-digits are lower case letters, they are converted to
    * upper case.
+   *
+   * Returns `null` if the original content was already normalized.
    */
   static String _normalize(String component, int start, int end,
-                           List<int> charTable) {
+                           List<int> charTable,
+                           {bool escapeDelimiters = false}) {
     StringBuffer buffer;
     int sectionStart = start;
     int index = start;
@@ -2290,7 +2302,7 @@
           } else {
             sourceLength = 3;
           }
-        } else if (_isGeneralDelimiter(char)) {
+        } else if (!escapeDelimiters && _isGeneralDelimiter(char)) {
           _fail(component, index, "Invalid character");
         } else {
           sourceLength = 1;
@@ -2315,8 +2327,7 @@
       }
     }
     if (buffer == null) {
-      // Makes no copy if start == 0 and end == component.length.
-      return component.substring(start, end);
+      return null;
     }
     if (sectionStart < end) {
       buffer.write(component.substring(sectionStart, end));
@@ -2509,7 +2520,7 @@
         targetHost = this._host;
         targetPort = this._port;
         if (reference.path == "") {
-          targetPath = this._path;
+          targetPath = this.path;
           if (reference.hasQuery) {
             targetQuery = reference.query;
           } else {
@@ -2535,7 +2546,7 @@
                 targetPath = _removeDotSegments("/" + reference.path);
               }
             } else {
-              var mergedPath = _mergePaths(this._path, reference.path);
+              var mergedPath = _mergePaths(this.path, reference.path);
               if (this.hasScheme || this.hasAuthority || this.hasAbsolutePath) {
                 targetPath = _removeDotSegments(mergedPath);
               } else {
@@ -2572,9 +2583,9 @@
 
   bool get hasFragment => _fragment != null;
 
-  bool get hasEmptyPath => _path.isEmpty;
+  bool get hasEmptyPath => path.isEmpty;
 
-  bool get hasAbsolutePath => _path.startsWith('/');
+  bool get hasAbsolutePath => path.startsWith('/');
 
   String get origin {
     if (scheme == "") {
@@ -2652,7 +2663,7 @@
   }
 
   bool get _isPathAbsolute {
-    return _path != null && _path.startsWith('/');
+    return path != null && path.startsWith('/');
   }
 
   void _writeAuthority(StringSink ss) {
@@ -2742,13 +2753,11 @@
       result.putIfAbsent(key, _createList).add(value);
     }
 
-    const int _equals = 0x3d;
-    const int _ampersand = 0x26;
     while (i < query.length) {
       int char = query.codeUnitAt(i);
-      if (char == _equals) {
+      if (char == _EQUALS) {
         if (equalsIndex < 0) equalsIndex = i;
-      } else if (char == _ampersand) {
+      } else if (char == _AMPERSAND) {
         parsePair(start, equalsIndex, i);
         start = i + 1;
         equalsIndex = -1;
@@ -3149,10 +3158,10 @@
    * If there is a single separator left, it ends the "base64" marker.
    *
    * So the following separators are found for a text:
-   *
-   *     data:text/plain;foo=bar;base64,ARGLEBARGLE=
-   *         ^          ^   ^   ^      ^
-   *
+   * ```
+   * data:text/plain;foo=bar;base64,ARGLEBARGLE=
+   *     ^          ^   ^   ^      ^
+   * ```
    */
   final List<int> _separatorIndices;
 
@@ -3353,12 +3362,15 @@
    * percent-escapes for non-ASCII byte values that need an interpretation
    * to be converted to the corresponding string.
    *
-   * Parsing doesn't check the validity of any part, it just checks that the
-   * input has the correct structure with the correct sequence of `/`, `;`, `=`
-   * and `,` delimiters.
+   * Parsing checks that Base64 encoded data is valid, and it normalizes it
+   * to use the default Base64 alphabet and to use padding.
+   * Non-Base64 data is escaped using percent-escapes as necessary to make
+   * it valid, and existing escapes are case normalized.
    *
    * Accessing the individual parts may fail later if they turn out to have
-   * content that can't be decoded successfully as a string.
+   * content that can't be decoded successfully as a string, for example if
+   * existing percent escapes represent bytes that cannot be decoded
+   * by the chosen [Encoding] (see [contentAsString]).
    */
   static UriData parse(String uri) {
     if (uri.length >= 5) {
@@ -3388,17 +3400,14 @@
     String query = null;
     int colonIndex = _separatorIndices[0];
     int queryIndex = _text.indexOf('?', colonIndex + 1);
-    int end = null;
+    int end = _text.length;
     if (queryIndex >= 0) {
-      query = _text.substring(queryIndex + 1);
+      query = _Uri._normalizeOrSubstring(_text, queryIndex + 1, end, _Uri._queryCharTable);
       end = queryIndex;
     }
-    path = _text.substring(colonIndex + 1, end);
-    // TODO(lrn): This can generate a URI that isn't path normalized.
-    // That's perfectly reasonable - data URIs are not hierarchical,
-    // but it may make some consumers stumble.
-    // Should we at least do escape normalization?
-    _uriCache = new _Uri._internal("data", "", null, null, path, query, null);
+    path = _Uri._normalizeOrSubstring(_text, colonIndex + 1, end,
+        _Uri._pathCharOrSlashTable);
+    _uriCache = new _DataUri(this, path, query);
     return _uriCache;
   }
 
@@ -3408,6 +3417,9 @@
    * A data URI consists of a "media type" followed by data.
    * The media type starts with a MIME type and can be followed by
    * extra parameters.
+   * If the MIME type representation in the URI text contains URI escapes,
+   * they are unescaped in the returned string.
+   * If the value contain non-ASCII percent escapes, they are decoded as UTF-8.
    *
    * Example:
    *
@@ -3432,6 +3444,10 @@
    * If the parameters of the media type contains a `charset` parameter
    * then this returns its value, otherwise it returns `US-ASCII`,
    * which is the default charset for data URIs.
+   * If the value contain non-ASCII percent escapes, they are decoded as UTF-8.
+   *
+   * If the MIME type representation in the URI text contains URI escapes,
+   * they are unescaped in the returned string.
    */
   String get charset {
     int parameterStart = 1;
@@ -3503,10 +3519,8 @@
         result[index++] = codeUnit;
       } else {
         if (i + 2 < text.length) {
-          var digit1 = _Uri._parseHexDigit(text.codeUnitAt(i + 1));
-          var digit2 = _Uri._parseHexDigit(text.codeUnitAt(i + 2));
-          if (digit1 >= 0 && digit2 >= 0) {
-            int byte = digit1 * 16 + digit2;
+          int byte = parseHexByte(text, i + 1);
+          if (byte >= 0) {
             result[index++] = byte;
             i += 2;
             continue;
@@ -3561,8 +3575,8 @@
    * in the URI, which is reflected by the [charset] getter. This means that
    * [charset] may return a value even if `parameters["charset"]` is `null`.
    *
-   * If the values contain non-ASCII values or percent escapes, they default
-   * to being decoded as UTF-8.
+   * If the values contain non-ASCII values or percent escapes,
+   * they are decoded as UTF-8.
    */
   Map<String, String> get parameters {
     var result = <String, String>{};
@@ -3633,6 +3647,19 @@
       }
     }
     indices.add(i);
+    bool isBase64 = indices.length.isOdd;
+    if (isBase64) {
+      text = BASE64.normalize(text, i + 1, text.length);
+    } else {
+      // Validate "data" part, must only contain RFC 2396 'uric' characters
+      // (reserved, unreserved, or escape sequences).
+      // Normalize to this (throws on a fragment separator).
+      var data = _Uri._normalize(text, i + 1, text.length, _uricTable,
+                                 escapeDelimiters: true);
+      if (data != null) {
+        text = text.replaceRange(i + 1, text.length, data);
+      }
+    }
     return new UriData._(text, indices, sourceUri);
   }
 
@@ -3706,6 +3733,26 @@
   //
   // This is the same characters as in a URI query (which is URI pchar plus '?')
   static const _uricTable = _Uri._queryCharTable;
+
+  // Characters allowed in base-64 encoding (alphanumeric, '/', '+' and '=').
+  static const _base64Table = const [
+                //             LSB             MSB
+                //              |               |
+      0x0000,   // 0x00 - 0x0f  00000000 00000000
+      0x0000,   // 0x10 - 0x1f  00000000 00000000
+                //                          +   /
+      0x8800,   // 0x20 - 0x2f  00000000 00010001
+                //              01234567 89
+      0x03ff,   // 0x30 - 0x3f  11111111 11000000
+                //               ABCDEFG HIJKLMNO
+      0xfffe,   // 0x40 - 0x4f  01111111 11111111
+                //              PQRSTUVW XYZ
+      0x07ff,   // 0x50 - 0x5f  11111111 11100000
+                //               abcdefg hijklmno
+      0xfffe,   // 0x60 - 0x6f  01111111 11111111
+                //              pqrstuvw xyz
+      0x07ff,   // 0x70 - 0x7f  11111111 11100000
+  ];
 }
 
 // --------------------------------------------------------------------
@@ -4555,6 +4602,16 @@
   String toString() => _uri;
 }
 
+/// Special [_Uri] created from an existing [UriData].
+class _DataUri extends _Uri {
+  final UriData _data;
+
+  _DataUri(this._data, String path, String query)
+      : super._internal("data", null, null, null, path, query, null);
+
+  UriData get data => _data;
+}
+
 /// Checks whether [text] starts with "data:" at position [start].
 ///
 /// The text must be long enough to allow reading five characters
diff --git a/sdk/lib/dart_client.platform b/sdk/lib/dart_client.platform
index 16c91ca..7108fac 100644
--- a/sdk/lib/dart_client.platform
+++ b/sdk/lib/dart_client.platform
@@ -33,7 +33,7 @@
 js_util: js_util/dart2js/js_util_dart2js.dart
 math: math/math.dart
 mirrors: mirrors/mirrors.dart
-nativewrappers: html/dart2js/nativewrappers.dart
+nativewrappers: html/dartium/nativewrappers.dart
 typed_data: typed_data/typed_data.dart
 _native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
 svg: svg/dart2js/svg_dart2js.dart
diff --git a/sdk/lib/dart_server.platform b/sdk/lib/dart_server.platform
index f275aff..94d5af4 100644
--- a/sdk/lib/dart_server.platform
+++ b/sdk/lib/dart_server.platform
@@ -23,7 +23,7 @@
 isolate: isolate/isolate.dart
 math: math/math.dart
 mirrors: mirrors/mirrors.dart
-nativewrappers: html/dart2js/nativewrappers.dart
+nativewrappers: html/dartium/nativewrappers.dart
 typed_data: typed_data/typed_data.dart
 _native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
 html: unsupported:
diff --git a/sdk/lib/dart_shared.platform b/sdk/lib/dart_shared.platform
index ae47359..40d5787 100644
--- a/sdk/lib/dart_shared.platform
+++ b/sdk/lib/dart_shared.platform
@@ -27,7 +27,7 @@
 js_util: js_util/dart2js/js_util_dart2js.dart
 math: math/math.dart
 mirrors: mirrors/mirrors.dart
-nativewrappers: html/dart2js/nativewrappers.dart
+nativewrappers: html/dartium/nativewrappers.dart
 typed_data: typed_data/typed_data.dart
 _native_typed_data: _internal/js_runtime/lib/native_typed_data.dart
 svg: svg/dart2js/svg_dart2js.dart
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 0acf068..512bc21 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -12,7 +12,6 @@
 
 part 'iterable.dart';
 part 'list.dart';
-part 'lists.dart';
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
@@ -69,3 +68,30 @@
   final String name;
   const ExternalName(this.name);
 }
+
+// Shared hex-parsing utilities.
+
+/// Parses a single hex-digit as code unit.
+///
+/// Returns a negative value if the character is not a valid hex-digit.
+int hexDigitValue(int char) {
+  assert(char >= 0 && char <= 0xFFFF);
+  const int digit0 = 0x30;
+  const int a = 0x61;
+  const int f = 0x66;
+  int digit = char ^ digit0;
+  if (digit <= 9) return digit;
+  int letter = (char | 0x20);
+  if (a <= letter && letter <= f) return letter - (a - 10);
+  return -1;
+}
+
+/// Parses two hex digits in a string.
+///
+/// Returns a negative value if either digit isn't valid.
+int parseHexByte(String source, int index) {
+  assert(index + 2 <= source.length);
+  int digit1 = hexDigitValue(source.codeUnitAt(index));
+  int digit2 = hexDigitValue(source.codeUnitAt(index + 1));
+  return digit1 * 16 + digit2 - (digit2 & 256);
+}
diff --git a/sdk/lib/internal/internal_sources.gypi b/sdk/lib/internal/internal_sources.gypi
index 17cc287..15d2511 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -9,7 +9,6 @@
     # The above file needs to be first as it lists the parts below.
     'iterable.dart',
     'list.dart',
-    'lists.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 5ab7d4c..73fa5bc 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -357,7 +357,7 @@
     return new MappedIterable<S, T>._(iterable, function);
   }
 
-  MappedIterable._(this._iterable, T this._f(S element));
+  MappedIterable._(this._iterable, this._f);
 
   Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f);
 
@@ -383,7 +383,7 @@
   final Iterator<S> _iterator;
   final _Transformation<S, T> _f;
 
-  MappedIterator(this._iterator, T this._f(S element));
+  MappedIterator(this._iterator, this._f);
 
   bool moveNext() {
     if (_iterator.moveNext()) {
@@ -406,7 +406,7 @@
   final Iterable<S> _source;
   final _Transformation<S, T> _f;
 
-  MappedListIterable(this._source, T this._f(S value));
+  MappedListIterable(this._source, this._f);
 
   int get length => _source.length;
   T elementAt(int index) => _f(_source.elementAt(index));
@@ -419,7 +419,7 @@
   final Iterable<E> _iterable;
   final _ElementPredicate<E> _f;
 
-  WhereIterable(this._iterable, bool this._f(E element));
+  WhereIterable(this._iterable, this._f);
 
   Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f);
 
@@ -431,7 +431,7 @@
   final Iterator<E> _iterator;
   final _ElementPredicate _f;
 
-  WhereIterator(this._iterator, bool this._f(E element));
+  WhereIterator(this._iterator, this._f);
 
   bool moveNext() {
     while (_iterator.moveNext()) {
@@ -451,7 +451,7 @@
   final Iterable<S> _iterable;
   final _ExpandFunction<S, T> _f;
 
-  ExpandIterable(this._iterable, Iterable<T> this._f(S element));
+  ExpandIterable(this._iterable, this._f);
 
   Iterator<T> get iterator => new ExpandIterator<S, T>(_iterable.iterator, _f);
 }
@@ -465,7 +465,7 @@
   Iterator<T> _currentExpansion = const EmptyIterator();
   T _current;
 
-  ExpandIterator(this._iterator, Iterable<T> this._f(S element));
+  ExpandIterator(this._iterator, this._f);
 
   T get current => _current;
 
@@ -548,7 +548,7 @@
   final Iterable<E> _iterable;
   final _ElementPredicate<E> _f;
 
-  TakeWhileIterable(this._iterable, bool this._f(E element));
+  TakeWhileIterable(this._iterable, this._f);
 
   Iterator<E> get iterator {
     return new TakeWhileIterator<E>(_iterable.iterator, _f);
@@ -560,7 +560,7 @@
   final _ElementPredicate<E> _f;
   bool _isFinished = false;
 
-  TakeWhileIterator(this._iterator, bool this._f(E element));
+  TakeWhileIterator(this._iterator, this._f);
 
   bool moveNext() {
     if (_isFinished) return false;
@@ -641,7 +641,7 @@
   final Iterable<E> _iterable;
   final _ElementPredicate<E> _f;
 
-  SkipWhileIterable(this._iterable, bool this._f(E element));
+  SkipWhileIterable(this._iterable, this._f);
 
   Iterator<E> get iterator {
     return new SkipWhileIterator<E>(_iterable.iterator, _f);
@@ -653,7 +653,7 @@
   final _ElementPredicate<E> _f;
   bool _hasSkipped = false;
 
-  SkipWhileIterator(this._iterator, bool this._f(E element));
+  SkipWhileIterator(this._iterator, this._f);
 
   bool moveNext() {
     if (!_hasSkipped) {
diff --git a/sdk/lib/internal/lists.dart b/sdk/lib/internal/lists.dart
deleted file mode 100644
index 0f5d8e7..0000000
--- a/sdk/lib/internal/lists.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart._internal;
-
-class Lists {
-  static void copy(List src, int srcStart,
-                   List dst, int dstStart, int count) {
-    if (srcStart < dstStart) {
-      for (int i = srcStart + count - 1, j = dstStart + count - 1;
-           i >= srcStart; i--, j--) {
-        dst[j] = src[i];
-      }
-    } else {
-      for (int i = srcStart, j = dstStart; i < srcStart + count; i++, j++) {
-        dst[j] = src[i];
-      }
-    }
-  }
-
-  static bool areEqual(List a, var b) {
-    if (identical(a, b)) return true;
-    if (!(b is List)) return false;
-    int length = a.length;
-    if (length != b.length) return false;
-
-    for (int i = 0; i < length; i++) {
-      if (!identical(a[i], b[i])) return false;
-    }
-    return true;
-  }
-
-  /**
-   * Returns the index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to [endIndex] (exclusive).
-   * Returns -1 if [element] is not found.
-   */
-  static int indexOf(List a,
-                     Object element,
-                     int startIndex,
-                     int endIndex) {
-    if (startIndex >= a.length) {
-      return -1;
-    }
-    if (startIndex < 0) {
-      startIndex = 0;
-    }
-    for (int i = startIndex; i < endIndex; i++) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns the last index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to 0.
-   * Returns -1 if [element] is not found.
-   */
-  static int lastIndexOf(List a, Object element, int startIndex) {
-    if (startIndex < 0) {
-      return -1;
-    }
-    if (startIndex >= a.length) {
-      startIndex = a.length - 1;
-    }
-    for (int i = startIndex; i >= 0; i--) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  static void indicesCheck(List a, int start, int end) {
-    RangeError.checkValidRange(start, end, a.length);
-  }
-
-  static void rangeCheck(List a, int start, int length) {
-    RangeError.checkNotNegative(length);
-    RangeError.checkNotNegative(start);
-    if (start + length > a.length) {
-      String message = "$start + $length must be in the range [0..${a.length}]";
-      throw new RangeError.range(length, 0, a.length - start,
-                                 "length", message);
-    }
-  }
-}
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 0e879b1..3ae67e3e 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -172,7 +172,7 @@
   File _file;
   Future<RandomAccessFile> _openFuture;
 
-  _FileStreamConsumer(File this._file, FileMode mode) {
+  _FileStreamConsumer(this._file, FileMode mode) {
     _openFuture = _file.open(mode: mode);
   }
 
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index 3a7b47d..386f8d2 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -2007,7 +2007,7 @@
   final String message;
   final Uri uri;
 
-  const HttpException(String this.message, {Uri this.uri});
+  const HttpException(this.message, {this.uri});
 
   String toString() {
     var b = new StringBuffer()
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 40df48a..b272e88 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -612,7 +612,7 @@
   Map<String, String> _parameters;
   Map<String, String> _unmodifiableParameters;
 
-  _HeaderValue([String this._value = "", Map<String, String> parameters]) {
+  _HeaderValue([this._value = "", Map<String, String> parameters]) {
     if (parameters != null) {
       _parameters = new HashMap<String, String>.from(parameters);
     }
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index ac7d67a..889a32e 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1673,7 +1673,7 @@
 
   String userAgent = _getHttpVersion();
 
-  _HttpClient(SecurityContext this._context);
+  _HttpClient(this._context);
 
   void set idleTimeout(Duration timeout) {
     _idleTimeout = timeout;
diff --git a/sdk/lib/io/io.dart b/sdk/lib/io/io.dart
index 844a380..5d94f30 100644
--- a/sdk/lib/io/io.dart
+++ b/sdk/lib/io/io.dart
@@ -195,7 +195,7 @@
 library dart.io;
 
 import 'dart:async';
-import 'dart:_internal';
+import 'dart:_internal' hide Symbol;
 import 'dart:collection' show HashMap,
                               HashSet,
                               Queue,
@@ -204,10 +204,11 @@
                               LinkedListEntry,
                               UnmodifiableMapView;
 import 'dart:convert';
-import 'dart:developer';
+import 'dart:developer' hide log;
 import 'dart:isolate';
 import 'dart:math';
 import 'dart:typed_data';
+import 'dart:nativewrappers';
 
 part 'bytes_builder.dart';
 part 'common.dart';
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index a523f20..c6d3cb2 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -446,12 +446,12 @@
       int requestedPort,
       this.is_server,
       this.context,
-      RawSocket this._socket,
+      this._socket,
       this._socketSubscription,
       this._bufferedData,
       this.requestClientCertificate,
       this.requireClientCertificate,
-      this.onBadCertificate(X509Certificate certificate),
+      this.onBadCertificate,
       List<String> supportedProtocols) {
     if (context == null) {
       context = SecurityContext.defaultContext;
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 4fbe0ff..4ab8af8 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -4897,7 +4897,7 @@
 LibTest/html/Element/getClientRects_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/getNamespacedAttributes_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isContentEditable_A01_t01: Pass, RuntimeError # Issue 28187
-LibTest/html/Element/isContentEditable_A02_t01: RuntimeError # Fails 10 out of 10.
+LibTest/html/Element/isContentEditable_A02_t01: Pass, RuntimeError # Issue 28187
 LibTest/html/Element/isTagSupported_A01_t01: RuntimeError # Please triage this failure
 LibTest/html/Element/isTagSupported_A01_t02: RuntimeError # Please triage this failure
 LibTest/html/Element/leftView_A01_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index fbc3ce6..8ae225d 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -1008,6 +1008,7 @@
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t06: Fail # Issue 13921
+WebPlatformTest/custom-elements/instantiating/isAttribute_A02_t01: Pass, Slow
 WebPlatformTest/custom-elements/concepts/type_A03_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A05_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/custom-elements/concepts/type_A06_t01: RuntimeError # co19-roll r722: Please triage this failure.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 1d9ebc0..7043760 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -54,6 +54,7 @@
 [ ($runtime == vm || $runtime == dart_precompiled ) && $mode == debug ]
 LibTest/core/List/List_class_A01_t02: Pass, Slow
 LibTest/isolate/Isolate/spawn_A04_t01: Pass, Fail  # Issue 28269
+LibTest/isolate/Isolate/spawnUri_A01_t07: Pass, Fail  # Issue 28269
 
 [ ($runtime == vm || $runtime == dart_precompiled) && ($arch != x64 && $arch != simarm64 && $arch != arm64 && $arch != simdbc64 && $arch != simdbc) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
@@ -222,3 +223,9 @@
 
 [ $runtime == vm && $mode == release && $system == linux && ($arch == x64 || $arch == ia32)]
 LibTest/isolate/Isolate/spawn_A04_t05: Pass, Slow
+
+[ $runtime == vm && $mode == release && $system == linux && $arch == ia32]
+service/dev_fs_spawn_test: Pass, Fail # Issue 28411
+
+[ $runtime == vm && $system == linux && ($arch == x64 || $arch == ia32) ]
+co19/LibTest/isolate/Isolate/spawnUri_A01_t06: Pass, Fail # Issue 28269
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 3975516..ededeaa 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -63,7 +63,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 466;
+    int expectedMethodCount = 476;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 5be8d14..8743ad6 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -123,3 +123,52 @@
 
 [ $compiler == dart2js ]
 mirror_printer_test: Pass, Slow # Issue 25940, 16473
+
+[ $compiler == dart2js && $dart2js_with_kernel ]
+big_allocation_expression_test: Pass # Issue 27394
+21666_test: Crash # Issue 27394
+23486_test/02: Crash # Issue 27394
+bailout_on_continue_test: RuntimeError # Issue 27394
+closure_type_reflection2_test: Crash # Issue 27394
+closure_type_reflection_test: Crash # Issue 27394
+deferred/deferred_constant3_test: RuntimeError # Issue 27394
+deferred/deferred_function_test: RuntimeError # Issue 27394
+deferred/deferred_mirrors2_test: Crash # Issue 27394
+first_class_types_hashcode_test: RuntimeError # Issue 27394
+generics_factories_test: RuntimeError # Issue 27394
+generics_is_check1_test: RuntimeError # Issue 27394
+inference_super_set_call_test: RuntimeError # Issue 27394
+invalid_annotation2_test/01: Crash # Issue 27394
+invalid_annotation2_test/none: Crash # Issue 27394
+invalid_annotation_test/01: Crash # Issue 27394
+is_check_instanceof_test: RuntimeError # Issue 27394
+lookup_map/dead_entry_through_mirrors_test: Crash # Issue 27394
+lookup_map/generic_type_test: RuntimeError # Issue 27394
+lookup_map/live_entry_through_mirrors_test: Crash # Issue 27394
+lookup_map/live_entry_through_mirrors_used_test: Crash # Issue 27394
+many_fields_test: Crash # Issue 27394
+mirror_enqueuer_regression_test: Crash # Issue 27394
+mirror_invalid_field_access2_test: Crash # Issue 27394
+mirror_invalid_field_access3_test: Crash # Issue 27394
+mirror_invalid_field_access4_test: Crash # Issue 27394
+mirror_invalid_field_access_test: Crash # Issue 27394
+mirror_invalid_invoke2_test: Crash # Issue 27394
+mirror_invalid_invoke3_test: Crash # Issue 27394
+mirror_invalid_invoke_test: Crash # Issue 27394
+mirror_printer_test/01: Crash # Issue 27394
+mirror_printer_test/none: Crash # Issue 27394
+mirror_test: Crash # Issue 27394
+mirror_type_inference_field2_test: Crash # Issue 27394
+mirror_type_inference_field_test: Crash # Issue 27394
+mirror_type_inference_function_test: Crash # Issue 27394
+mirrors_declarations_filtering_test: Crash # Issue 27394
+mirrors_used_closure_test: Crash # Issue 27394
+mirrors_used_metatargets_test: Crash # Issue 27394
+mirrors_used_native_test: Crash # Issue 27394
+reflect_native_types_test: Crash # Issue 27394
+runtime_type_test: RuntimeError # Issue 27394
+type_argument_factory_nocrash_test: RuntimeError # Issue 27394
+typevariable_substitution_test: Crash # Issue 27394
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+regress/4562_test/01: Crash # Issue 27394
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 874ace3..eab1082 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -25,3 +25,110 @@
 
 [ $compiler == dart2js && $runtime == d8 && $system == windows ]
 compute_this_script_test: Skip # Issue 17458
+
+[ $compiler == dart2js && $dart2js_with_kernel ]
+abstract_class_test: RuntimeError # Issue 27394
+bound_closure_test: RuntimeError # Issue 27394
+browser_compat_1_prepatched_test: RuntimeError # Issue 27394
+browser_compat_1_unpatched_test: RuntimeError # Issue 27394
+browser_compat_2_test: RuntimeError # Issue 27394
+core_type_check_native_test: RuntimeError # Issue 27394
+dispatch_property_initialization_test: RuntimeError # Issue 27394
+downcast_test: RuntimeError # Issue 27394
+error_safeToString_test: RuntimeError # Issue 27394
+event_loop_test: RuntimeError # Issue 27394
+field_type2_test: RuntimeError # Issue 27394
+field_type_test: RuntimeError # Issue 27394
+fixup_get_tag_test: RuntimeError # Issue 27394
+hash_code_test: RuntimeError # Issue 27394
+is_check_test: CompileTimeError # Issue 27394
+issue9182_test: RuntimeError # Issue 27394
+js_const_test: RuntimeError # Issue 27394
+jsobject_test: RuntimeError # Issue 27394
+load_elim_refinement_test: Crash # Issue 27394
+mirror_intercepted_field_test: Crash # Issue 27394
+native_call_arity1_frog_test: RuntimeError # Issue 27394
+native_call_arity2_frog_test: RuntimeError # Issue 27394
+native_call_arity3_frog_test: RuntimeError # Issue 27394
+native_checked_arguments1_frog_test: RuntimeError # Issue 27394
+native_checked_fields_frog_test: RuntimeError # Issue 27394
+native_class_avoids_hidden_name_frog_test: RuntimeError # Issue 27394
+native_class_fields_2_test: RuntimeError # Issue 27394
+native_class_fields_3_test: RuntimeError # Issue 27394
+native_class_fields_test: RuntimeError # Issue 27394
+native_class_inheritance1_frog_test: RuntimeError # Issue 27394
+native_class_inheritance2_frog_test: RuntimeError # Issue 27394
+native_class_inheritance3_frog_test: RuntimeError # Issue 27394
+native_class_inheritance4_frog_test: RuntimeError # Issue 27394
+native_class_is_check1_frog_test: RuntimeError # Issue 27394
+native_class_is_check3_frog_test: RuntimeError # Issue 27394
+native_class_with_dart_methods_frog_test: RuntimeError # Issue 27394
+native_closure_identity_frog_test: RuntimeError # Issue 27394
+native_constructor_name_test: RuntimeError # Issue 27394
+native_equals_frog_test: RuntimeError # Issue 27394
+native_exception2_test: RuntimeError # Issue 27394
+native_exceptions1_frog_test: RuntimeError # Issue 27394
+native_field_invocation2_test: RuntimeError # Issue 27394
+native_field_invocation3_test: RuntimeError # Issue 27394
+native_field_invocation5_test: RuntimeError # Issue 27394
+native_field_invocation6_test: RuntimeError # Issue 27394
+native_field_invocation_test: RuntimeError # Issue 27394
+native_field_name_test: RuntimeError # Issue 27394
+native_field_optimization_test: RuntimeError # Issue 27394
+native_field_rename_1_frog_test: RuntimeError # Issue 27394
+native_field_rename_2_frog_test: RuntimeError # Issue 27394
+native_library_same_name_used_frog_test: CompileTimeError # Issue 27394
+native_method_inlining_test: RuntimeError # Issue 27394
+native_method_rename1_frog_test: RuntimeError # Issue 27394
+native_method_rename2_frog_test: RuntimeError # Issue 27394
+native_method_rename3_frog_test: RuntimeError # Issue 27394
+native_method_with_keyword_name_test: RuntimeError # Issue 27394
+native_mirror_test: Crash # Issue 27394
+native_mixin_field_test: RuntimeError # Issue 27394
+native_mixin_multiple2_test: RuntimeError # Issue 27394
+native_mixin_multiple3_test: RuntimeError # Issue 27394
+native_mixin_multiple_test: RuntimeError # Issue 27394
+native_mixin_test: RuntimeError # Issue 27394
+native_mixin_with_plain_test: RuntimeError # Issue 27394
+native_named_constructors2_frog_test: RuntimeError # Issue 27394
+native_named_constructors3_frog_test: RuntimeError # Issue 27394
+native_no_such_method_exception2_frog_test: RuntimeError # Issue 27394
+native_no_such_method_exception3_frog_test: RuntimeError # Issue 27394
+native_no_such_method_exception_frog_test: RuntimeError # Issue 27394
+native_novel_html_test: RuntimeError # Issue 27394
+native_null_closure_frog_test: RuntimeError # Issue 27394
+native_null_frog_test: RuntimeError # Issue 27394
+native_property_frog_test: Crash # Issue 27394
+native_to_string_frog_test: RuntimeError # Issue 27394
+native_use_native_name_in_table_frog_test: RuntimeError # Issue 27394
+native_wrapping_function3_frog_test: RuntimeError # Issue 27394
+native_wrapping_function_frog_test: RuntimeError # Issue 27394
+oddly_named_fields_test: RuntimeError # Issue 27394
+optimization_hints_test: RuntimeError # Issue 27394
+runtimetype_test: CompileTimeError # Issue 27394
+static_methods_test: RuntimeError # Issue 27394
+subclassing_1_test: RuntimeError # Issue 27394
+subclassing_2_test: RuntimeError # Issue 27394
+subclassing_3_test: RuntimeError # Issue 27394
+subclassing_4_test: RuntimeError # Issue 27394
+subclassing_5_test: RuntimeError # Issue 27394
+subclassing_constructor_1_test: RuntimeError # Issue 27394
+subclassing_constructor_2_test: RuntimeError # Issue 27394
+subclassing_super_call_test: RuntimeError # Issue 27394
+subclassing_super_field_1_test: RuntimeError # Issue 27394
+subclassing_super_field_2_test: RuntimeError # Issue 27394
+subclassing_type_test: RuntimeError # Issue 27394
+super_call_test: RuntimeError # Issue 27394
+super_property_test: RuntimeError # Issue 27394
+uninstantiated_type_parameter_test: RuntimeError # Issue 27394
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+bound_closure_super_test: Crash # Issue 27394
+bound_closure_test: Crash # Issue 27394
+native_call_arity1_frog_test: Crash # Issue 27394
+native_call_arity2_frog_test: Crash # Issue 27394
+native_call_arity3_frog_test: Crash # Issue 27394
+native_class_inheritance1_frog_test: Crash # Issue 27394
+native_class_inheritance2_frog_test: Crash # Issue 27394
+native_class_inheritance3_frog_test: Crash # Issue 27394
+native_wrapping_function3_frog_test: Crash # Issue 27394
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 7c16962..a187e09 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -213,3 +213,55 @@
 [ $hot_reload || $hot_reload_rollback ]
 big_integer_parsed_mul_div_vm_test: Pass, Slow # Slow.
 
+[ $compiler == dart2js && $dart2js_with_kernel ]
+error_stack_trace1_test: Pass # Issue 27394
+symbol_reserved_word_test/03: Pass # Issue 27394
+bool_from_environment_test: RuntimeError # Issue 27394
+data_uri_test: RuntimeError # Issue 27394
+date_time7_test: RuntimeError # Issue 27394
+date_time_test: RuntimeError # Issue 27394
+duration_test: RuntimeError # Issue 27394
+growable_list_test: RuntimeError # Issue 27394
+int_from_environment2_test: RuntimeError # Issue 27394
+int_from_environment_test: RuntimeError # Issue 27394
+iterable_empty_test: RuntimeError # Issue 27394
+iterable_generate_test/01: RuntimeError # Issue 27394
+iterable_generate_test/none: RuntimeError # Issue 27394
+iterable_return_type_test/none: RuntimeError # Issue 27394
+iterable_to_list_test/none: RuntimeError # Issue 27394
+iterable_to_set_test: RuntimeError # Issue 27394
+linked_hash_map_from_iterable_test: RuntimeError # Issue 27394
+linked_hash_map_from_iterables_test: RuntimeError # Issue 27394
+list_filled_type_argument_test: RuntimeError # Issue 27394
+map_from_iterable_test: RuntimeError # Issue 27394
+map_from_iterables_test: RuntimeError # Issue 27394
+map_keys2_test: RuntimeError # Issue 27394
+map_test: Crash # Issue 27394
+map_values2_test: RuntimeError # Issue 27394
+map_values3_test: RuntimeError # Issue 27394
+map_values4_test: RuntimeError # Issue 27394
+reg_exp1_test: RuntimeError # Issue 27394
+regexp/compile_test: RuntimeError # Issue 27394
+regexp/default_arguments_test: RuntimeError # Issue 27394
+regexp/multiline_test: RuntimeError # Issue 27394
+regexp/parentheses_test: RuntimeError # Issue 27394
+regexp/pcre-test-4_test: RuntimeError # Issue 27394
+regexp/pcre_test: RuntimeError # Issue 27394
+set_test: RuntimeError # Issue 27394
+splay_tree_from_iterable_test: RuntimeError # Issue 27394
+splay_tree_from_iterables_test: RuntimeError # Issue 27394
+string_from_environment2_test: RuntimeError # Issue 27394
+string_from_environment_test: RuntimeError # Issue 27394
+symbol_operator_test/03: RuntimeError # Issue 27394
+symbol_reserved_word_test/06: RuntimeError # Issue 27394
+symbol_reserved_word_test/09: RuntimeError # Issue 27394
+symbol_reserved_word_test/12: RuntimeError # Issue 27394
+symbol_test/none: RuntimeError # Issue 27394
+uri_example_test: RuntimeError # Issue 27394
+uri_http_test: RuntimeError # Issue 27394
+uri_parameters_all_test: RuntimeError # Issue 27394
+uri_query_test: RuntimeError # Issue 27394
+uri_test: RuntimeError # Issue 27394
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+regress/4562_test/01: Crash # Issue 27394
diff --git a/tests/corelib/data_uri_test.dart b/tests/corelib/data_uri_test.dart
index 41f2290..58b1201 100644
--- a/tests/corelib/data_uri_test.dart
+++ b/tests/corelib/data_uri_test.dart
@@ -18,16 +18,18 @@
   testRoundTrip("blåbærgrød", UTF8);
   testRoundTrip("blåbærgrød", LATIN1);
 
-  testUriEquals("data:,abc?d#e");
-  testUriEquals("DATA:,ABC?D#E");
-  testUriEquals("data:,a%20bc?d#e");
-  testUriEquals("DATA:,A%20BC?D#E");
-  testUriEquals("data:,a%62c?d#e");
-  testUriEquals("DATA:,A%42C?D#E");
+  testUriEquals("data:,abc?d");
+  testUriEquals("DATA:,ABC?D");
+  testUriEquals("data:,a%20bc?d");
+  testUriEquals("DATA:,A%20BC?D");
+  testUriEquals("data:,abc?d%23e");  // # must and will be is escaped.
+
+  // Test that UriData.uri normalizes path and query.
 
   testUtf8Encoding("\u1000\uffff");
   testBytes();
   testInvalidCharacters();
+  testNormalization();
   testErrors();
 }
 
@@ -158,6 +160,37 @@
   testLists(new List.unmodifiable(bytes));
 }
 
+void testNormalization() {
+  // Base-64 normalization.
+
+  // Normalized URI-alphabet characters.
+  Expect.equals("data:;base64,AA/+",
+      UriData.parse("data:;base64,AA_-").toString());
+  // Normalized escapes.
+  Expect.equals("data:;base64,AB==",
+      UriData.parse("data:;base64,A%42=%3D").toString());
+  Expect.equals("data:;base64,/+/+",
+      UriData.parse("data:;base64,%5F%2D%2F%2B").toString());
+  // Normalized padded data.
+  Expect.equals("data:;base64,AA==",
+      UriData.parse("data:;base64,AA%3D%3D").toString());
+  Expect.equals("data:;base64,AAA=",
+      UriData.parse("data:;base64,AAA%3D").toString());
+  // Normalized unpadded data.
+  Expect.equals("data:;base64,AA==",
+      UriData.parse("data:;base64,AA").toString());
+  Expect.equals("data:;base64,AAA=",
+      UriData.parse("data:;base64,AAA").toString());
+
+  // "URI normalization" of non-base64 content.
+  var uri = UriData.parse("data:,\x20\xa0");
+  Expect.equals("data:,%20%C2%A0", uri.toString());
+  uri = UriData.parse("data:,x://x@y:[z]:42/p/./?q=x&y=z#?#\u1234\u{12345}");
+  Expect.equals(
+      "data:,x://x@y:%5Bz%5D:42/p/./?q=x&y=z%23?%23%E1%88%B4%F0%92%8D%85",
+      uri.toString());
+}
+
 bool badArgument(e) => e is ArgumentError;
 bool badFormat(e) => e is FormatException;
 
@@ -218,29 +251,45 @@
   Expect.throws(() { UriData.parse("data:type/sub;k=v;base64");},
                 badFormat);
 
-  // Invalid base64 format (only detected when decodeing).
+  void formatError(String input) {
+    Expect.throws(() => UriData.parse("data:;base64,$input"), badFormat, input);
+  }
+
+  // Invalid base64 format (detected when parsed).
   for (var a = 0; a <= 4; a++) {
     for (var p = 0; p <= 4; p++) {
       // Base-64 encoding must have length divisible by four and no more
       // than two padding characters at the end.
       if (p < 3 && (a + p) % 4 == 0) continue;
-      uri = UriData.parse("data:;base64," + "A" * a + "=" * p);
-      Expect.throws(uri.contentAsBytes, badFormat);
+      if (p == 0 && a > 1) continue;
+      formatError("A" * a + "=" * p);
+      formatError("A" * a + "%3D" * p);
     }
   }
   // Invalid base64 encoding: padding not at end.
-  uri = UriData.parse("data:;base64,AA=A");
-  Expect.throws(uri.contentAsBytes, badFormat);
-  uri = UriData.parse("data:;base64,A=AA");
-  Expect.throws(uri.contentAsBytes, badFormat);
-  uri = UriData.parse("data:;base64,=AAA");
-  Expect.throws(uri.contentAsBytes, badFormat);
-  uri = UriData.parse("data:;base64,A==A");
-  Expect.throws(uri.contentAsBytes, badFormat);
-  uri = UriData.parse("data:;base64,==AA");
-  Expect.throws(uri.contentAsBytes, badFormat);
-  uri = UriData.parse("data:;base64,===A");
-  Expect.throws(uri.contentAsBytes, badFormat);
+  formatError("AA=A");
+  formatError("A=AA");
+  formatError("=AAA");
+  formatError("A==A");
+  formatError("==AA");
+  formatError("===A");
+  formatError("AAA%3D=");
+  formatError("A%3D==");
+
+  // Invalid unpadded data.
+  formatError("A");
+  formatError("AAAAA");
+
+  // Invalid characters.
+  formatError("AAA*");
+  formatError("AAA\x00");
+  formatError("AAA\\");
+  formatError("AAA,");
+
+  // Invalid escapes.
+  formatError("AAA%25");
+  formatError("AAA%7F");
+  formatError("AAA%7F");
 }
 
 /// Checks that two [Uri]s are exactly the same.
diff --git a/tests/html/html.status b/tests/html/html.status
index 963d72a..1ebdd4b 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -269,6 +269,7 @@
 custom/document_register_type_extensions_test/construction: Fail # Issue 13193
 custom/element_upgrade_test: Fail # Issue 18247
 worker_api_test: Fail # IE does not support URL.createObjectURL in web workers.
+custom/document_register_template_test: Pass, Slow # Issue 28792
 
 [ $compiler == dart2js && $runtime == drt && $unchecked ]
 audiocontext_test/functional: Pass, Fail
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 2e8e2ed..9023900 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -364,3 +364,386 @@
 
 [ $compiler != dart2analyzer]
 switch_case_warn_test: SKIP # Analyzer only, see language_analyzer2.status
+
+[ $compiler == dart2js && $dart2js_with_kernel ]
+abstract_beats_arguments_test: RuntimeError # Issue 27394
+abstract_runtime_error_test/01: RuntimeError # Issue 27394
+abstract_runtime_error_test/02: RuntimeError # Issue 27394
+arithmetic_canonicalization_test: RuntimeError # Issue 27394
+assign_top_method_test/01: Crash # Issue 27394
+async_await_syntax_test/a04b: Crash # Issue 27394
+async_await_syntax_test/a06a: RuntimeError # Issue 27394
+async_await_syntax_test/a07b: Crash # Issue 27394
+async_await_syntax_test/a08b: Crash # Issue 27394
+async_await_syntax_test/b06a: RuntimeError # Issue 27394
+async_await_syntax_test/c06a: RuntimeError # Issue 27394
+async_await_syntax_test/d06a: RuntimeError # Issue 27394
+async_await_test: RuntimeError # Issue 27394
+async_star_pause_test: RuntimeError # Issue 27394
+async_star_regression_fisk_test: RuntimeError # Issue 27394
+async_star_stream_take_test: RuntimeError # Issue 27394
+async_star_take_reyield_test: RuntimeError # Issue 27394
+async_star_test: RuntimeError # Issue 27394
+await_for_test: RuntimeError # Issue 27394
+await_for_use_local_test: RuntimeError # Issue 27394
+bootstrap_test: RuntimeError # Issue 27394
+bound_closure_equality_test: RuntimeError # Issue 27394
+built_in_identifier_test/01: Crash # Issue 27394
+call_nonexistent_static_test/10: Crash # Issue 27394
+canonical_const3_test: RuntimeError # Issue 27394
+canonical_const_test: RuntimeError # Issue 27394
+closure_in_constructor_test: Crash # Issue 27394
+closure_in_initializer_test: Crash # Issue 27394
+closure_type_variable_test: RuntimeError # Issue 27394
+closure_type_variables_test: Crash # Issue 27394
+closures_initializer_test: RuntimeError # Issue 27394
+compile_time_constant9_test: RuntimeError # Issue 27394
+conditional_property_assignment_test/07: RuntimeError # Issue 27394
+conditional_property_increment_decrement_test/01: RuntimeError # Issue 27394
+conditional_property_increment_decrement_test/05: RuntimeError # Issue 27394
+conditional_property_increment_decrement_test/09: RuntimeError # Issue 27394
+conditional_property_increment_decrement_test/13: RuntimeError # Issue 27394
+const_escape_frog_test: RuntimeError # Issue 27394
+const_evaluation_test/01: Crash # Issue 27394
+const_locals_test: RuntimeError # Issue 27394
+const_map2_test/none: RuntimeError # Issue 27394
+const_map3_test/none: RuntimeError # Issue 27394
+const_nested_test: RuntimeError # Issue 27394
+const_qq_test: Crash # Issue 27394
+constructor10_test/01: Crash # Issue 27394
+constructor10_test/02: Crash # Issue 27394
+constructor12_test: Crash # Issue 27394
+constructor6_test: Crash # Issue 27394
+constructor_named_arguments_test/none: RuntimeError # Issue 27394
+constructor_redirect2_test/02: Crash # Issue 27394
+constructor_redirect2_test/04: Crash # Issue 27394
+covariant_test/10: Crash # Issue 27394
+covariant_test/11: Crash # Issue 27394
+covariant_test/20b: Crash # Issue 27394
+covariant_test/21: Crash # Issue 27394
+covariant_test/21b: Crash # Issue 27394
+covariant_test/24: Crash # Issue 27394
+covariant_test/27: Crash # Issue 27394
+covariant_test/27b: Crash # Issue 27394
+covariant_test/30: Crash # Issue 27394
+covariant_test/30b: Crash # Issue 27394
+covariant_test/31: Crash # Issue 27394
+covariant_test/31b: Crash # Issue 27394
+ct_const_test: RuntimeError # Issue 27394
+cyclic_default_values_test: RuntimeError # Issue 27394
+cyclic_type2_test: RuntimeError # Issue 27394
+cyclic_type_test/00: RuntimeError # Issue 27394
+cyclic_type_test/02: RuntimeError # Issue 27394
+cyclic_type_test/03: RuntimeError # Issue 27394
+cyclic_type_test/04: RuntimeError # Issue 27394
+deferred_constraints_constants_test/constructor1: Crash # Issue 27394
+deferred_constraints_constants_test/constructor2: Crash # Issue 27394
+deferred_constraints_constants_test/default_argument1: Crash # Issue 27394
+deferred_constraints_constants_test/default_argument2: Crash # Issue 27394
+deferred_constraints_constants_test/metadata1: Crash # Issue 27394
+deferred_constraints_constants_test/metadata2: Crash # Issue 27394
+deferred_constraints_constants_test/metadata3: Crash # Issue 27394
+deferred_constraints_constants_test/none: Crash # Issue 27394
+deferred_constraints_constants_test/reference1: Crash # Issue 27394
+deferred_constraints_constants_test/reference2: Crash # Issue 27394
+deferred_constraints_constants_test/reference_after_load: Crash # Issue 27394
+deferred_constraints_type_annotation_test/as_operation: Crash # Issue 27394
+deferred_global_test: RuntimeError # Issue 27394
+deferred_inheritance_constraints_test/mixin: Crash # Issue 27394
+deferred_load_constants_test/none: RuntimeError # Issue 27394
+deferred_static_seperate_test: RuntimeError # Issue 27394
+deferred_super_dependency_test/01: Crash # Issue 27394
+enum_mirror_test: Crash # Issue 27394
+equality_test: RuntimeError # Issue 27394
+evaluation_redirecting_constructor_test: RuntimeError # Issue 27394
+export_ambiguous_main_negative_test: Crash # Issue 27394
+f_bounded_quantification4_test: RuntimeError # Issue 27394
+f_bounded_quantification5_test: RuntimeError # Issue 27394
+factory3_test: RuntimeError # Issue 27394
+factory_redirection_test/09: RuntimeError # Issue 27394
+factory_type_parameter2_test: Crash # Issue 27394
+factory_type_parameter_test: RuntimeError # Issue 27394
+final_for_in_variable_test/01: MissingRuntimeError # Issue 27394
+final_param_test/01: MissingRuntimeError # Issue 27394
+final_variable_assignment_test/01: MissingRuntimeError # Issue 27394
+first_class_types_constants_test: RuntimeError # Issue 27394
+first_class_types_libraries_test: RuntimeError # Issue 27394
+first_class_types_test: RuntimeError # Issue 27394
+fixed_type_variable2_test/01: RuntimeError # Issue 27394
+fixed_type_variable2_test/02: RuntimeError # Issue 27394
+fixed_type_variable2_test/03: RuntimeError # Issue 27394
+fixed_type_variable2_test/05: RuntimeError # Issue 27394
+fixed_type_variable2_test/06: RuntimeError # Issue 27394
+fixed_type_variable_test/01: RuntimeError # Issue 27394
+fixed_type_variable_test/02: RuntimeError # Issue 27394
+fixed_type_variable_test/03: RuntimeError # Issue 27394
+fixed_type_variable_test/05: RuntimeError # Issue 27394
+fixed_type_variable_test/06: RuntimeError # Issue 27394
+function_subtype1_test: RuntimeError # Issue 27394
+function_subtype2_test: RuntimeError # Issue 27394
+function_subtype3_test: RuntimeError # Issue 27394
+function_subtype_bound_closure2_test: RuntimeError # Issue 27394
+function_subtype_bound_closure3_test: RuntimeError # Issue 27394
+function_subtype_bound_closure4_test: RuntimeError # Issue 27394
+function_subtype_bound_closure5_test: RuntimeError # Issue 27394
+function_subtype_bound_closure5a_test: RuntimeError # Issue 27394
+function_subtype_bound_closure6_test: RuntimeError # Issue 27394
+function_subtype_bound_closure7_test: RuntimeError # Issue 27394
+function_subtype_call1_test: RuntimeError # Issue 27394
+function_subtype_call2_test: RuntimeError # Issue 27394
+function_subtype_cast1_test: RuntimeError # Issue 27394
+function_subtype_cast2_test: RuntimeError # Issue 27394
+function_subtype_cast3_test: RuntimeError # Issue 27394
+function_subtype_factory0_test: RuntimeError # Issue 27394
+function_subtype_inline0_test: RuntimeError # Issue 27394
+function_subtype_local2_test: RuntimeError # Issue 27394
+function_subtype_local3_test: RuntimeError # Issue 27394
+function_subtype_local4_test: RuntimeError # Issue 27394
+function_subtype_local5_test: RuntimeError # Issue 27394
+function_subtype_named2_test: RuntimeError # Issue 27394
+function_subtype_not1_test: RuntimeError # Issue 27394
+function_subtype_not2_test: RuntimeError # Issue 27394
+function_subtype_not3_test: RuntimeError # Issue 27394
+function_subtype_optional2_test: RuntimeError # Issue 27394
+function_subtype_top_level1_test: RuntimeError # Issue 27394
+function_subtype_typearg0_test: RuntimeError # Issue 27394
+function_subtype_typearg5_test: RuntimeError # Issue 27394
+function_type_alias2_test: RuntimeError # Issue 27394
+function_type_alias3_test: RuntimeError # Issue 27394
+function_type_alias4_test: RuntimeError # Issue 27394
+generic2_test: RuntimeError # Issue 27394
+generic_closure_test: RuntimeError # Issue 27394
+generic_deep_test: RuntimeError # Issue 27394
+generic_field_mixin2_test: Crash # Issue 27394
+generic_field_mixin3_test: Crash # Issue 27394
+generic_field_mixin6_test/01: Crash # Issue 27394
+generic_field_mixin_test: Crash # Issue 27394
+generic_inheritance_test: RuntimeError # Issue 27394
+generic_instanceof2_test: RuntimeError # Issue 27394
+generic_instanceof_test: RuntimeError # Issue 27394
+generic_is_check_test: RuntimeError # Issue 27394
+generic_local_functions_test: Crash # Issue 27394
+generic_metadata_test/02: Crash # Issue 27394
+generic_metadata_test/03: Crash # Issue 27394
+generic_method_types_test/01: RuntimeError # Issue 27394
+generic_method_types_test/02: RuntimeError # Issue 27394
+generic_methods_generic_function_parameter_test: Crash # Issue 27394
+generic_methods_new_test: RuntimeError # Issue 27394
+generic_methods_type_expression_test/01: RuntimeError # Issue 27394
+generic_methods_type_expression_test/03: RuntimeError # Issue 27394
+generic_methods_type_expression_test/none: RuntimeError # Issue 27394
+generic_native_test: RuntimeError # Issue 27394
+generic_parameterized_extends_test: RuntimeError # Issue 27394
+get_set_syntax_test/00: Crash # Issue 27394
+if_null_assignment_behavior_test/06: RuntimeError # Issue 27394
+if_null_assignment_static_test/01: RuntimeError # Issue 27394
+if_null_assignment_static_test/03: RuntimeError # Issue 27394
+if_null_assignment_static_test/04: RuntimeError # Issue 27394
+if_null_assignment_static_test/05: RuntimeError # Issue 27394
+illegal_initializer_test/01: Crash # Issue 27394
+illegal_initializer_test/02: Crash # Issue 27394
+illegal_initializer_test/03: Crash # Issue 27394
+illegal_initializer_test/04: Crash # Issue 27394
+inference_mixin_field_test: Crash # Issue 27394
+initializing_formal_final_test: RuntimeError # Issue 27394
+inline_super_field_test: Crash # Issue 27394
+instance_creation_in_function_annotation_test: Crash # Issue 27394
+instanceof2_test: RuntimeError # Issue 27394
+instanceof4_test/01: RuntimeError # Issue 27394
+instanceof4_test/none: RuntimeError # Issue 27394
+invocation_mirror_test: Crash # Issue 27394
+is_malformed_type_test/94: Crash # Issue 27394
+is_malformed_type_test/96: Crash # Issue 27394
+is_malformed_type_test/98: Crash # Issue 27394
+issue10747_test: RuntimeError # Issue 27394
+issue21079_test: Crash # Issue 27394
+issue9602_test: Crash # Issue 27394
+issue_25671a_test/01: Crash # Issue 27394
+issue_25671b_test/01: Crash # Issue 27394
+library_env_test/has_html_support: RuntimeError # Issue 27394
+library_env_test/has_io_support: RuntimeError # Issue 27394
+library_env_test/has_mirror_support: RuntimeError # Issue 27394
+library_env_test/none: RuntimeError # Issue 27394
+list_is_test: RuntimeError # Issue 27394
+list_test: RuntimeError # Issue 27394
+main_not_a_function_test/01: Crash # Issue 27394
+malbounded_type_cast_test: RuntimeError # Issue 27394
+malbounded_type_test_test/04: RuntimeError # Issue 27394
+malformed_inheritance_test/03: Crash # Issue 27394
+malformed_inheritance_test/09: Crash # Issue 27394
+malformed_inheritance_test/10: Crash # Issue 27394
+many_generic_instanceof_test: RuntimeError # Issue 27394
+many_method_calls_test: Pass # Issue 27394
+map_literal6_test: RuntimeError # Issue 27394
+metadata_test: Crash # Issue 27394
+method_override_test: RuntimeError # Issue 27394
+mixin_black_listed_test/08: Crash # Issue 27394
+mixin_cyclic_test/01: Crash # Issue 27394
+mixin_extends_field_test: Crash # Issue 27394
+mixin_field_initializer_test: Crash # Issue 27394
+mixin_field_test: Crash # Issue 27394
+mixin_forwarding_constructor1_test: Crash # Issue 27394
+mixin_forwarding_constructor2_test: Crash # Issue 27394
+mixin_forwarding_constructor3_test: Crash # Issue 27394
+mixin_generic_test: RuntimeError # Issue 27394
+mixin_getter_regression_test: Crash # Issue 27394
+mixin_illegal_cycles_test/02: Crash # Issue 27394
+mixin_illegal_cycles_test/03: Crash # Issue 27394
+mixin_illegal_cycles_test/04: Crash # Issue 27394
+mixin_illegal_cycles_test/06: Crash # Issue 27394
+mixin_illegal_super_use_test/02: Crash # Issue 27394
+mixin_illegal_super_use_test/03: Crash # Issue 27394
+mixin_illegal_super_use_test/05: Crash # Issue 27394
+mixin_illegal_super_use_test/06: Crash # Issue 27394
+mixin_illegal_super_use_test/08: Crash # Issue 27394
+mixin_illegal_super_use_test/09: Crash # Issue 27394
+mixin_invalid_inheritance1_test/01: Crash # Issue 27394
+mixin_invalid_inheritance1_test/02: Crash # Issue 27394
+mixin_invalid_inheritance1_test/03: Crash # Issue 27394
+mixin_invalid_inheritance2_test/01: Crash # Issue 27394
+mixin_invalid_inheritance2_test/02: Crash # Issue 27394
+mixin_invalid_inheritance2_test/03: Crash # Issue 27394
+mixin_lib_extends_field_test: Crash # Issue 27394
+mixin_mixin4_test: RuntimeError # Issue 27394
+mixin_mixin5_test: RuntimeError # Issue 27394
+mixin_mixin_bound2_test: RuntimeError # Issue 27394
+mixin_mixin_bound_test: RuntimeError # Issue 27394
+mixin_only_for_rti_test: RuntimeError # Issue 27394
+mixin_proto_test: Crash # Issue 27394
+mixin_regress_11398_test: Crash # Issue 27394
+mixin_super_constructor2_test: Crash # Issue 27394
+mixin_super_constructor_default_test: Crash # Issue 27394
+mixin_super_constructor_named_test/01: Crash # Issue 27394
+mixin_super_constructor_named_test/none: Crash # Issue 27394
+mixin_super_constructor_positionals_test/01: Crash # Issue 27394
+mixin_super_constructor_positionals_test/none: Crash # Issue 27394
+mixin_super_constructor_test: Crash # Issue 27394
+mixin_type_parameter1_test: RuntimeError # Issue 27394
+mixin_type_parameter2_test: RuntimeError # Issue 27394
+mixin_type_parameter3_test: RuntimeError # Issue 27394
+mixin_type_parameter5_test: Crash # Issue 27394
+mixin_type_parameters_mixin_extends_test: RuntimeError # Issue 27394
+mixin_type_parameters_mixin_test: RuntimeError # Issue 27394
+mixin_type_parameters_simple_test: RuntimeError # Issue 27394
+mixin_type_parameters_super_extends_test: RuntimeError # Issue 27394
+mixin_type_parameters_super_test: RuntimeError # Issue 27394
+mixin_type_variable_test/02: Crash # Issue 27394
+mixin_type_variable_test/03: Crash # Issue 27394
+mixin_type_variable_test/04: Crash # Issue 27394
+mixin_type_variable_test/05: Crash # Issue 27394
+mixin_type_variable_test/06: Crash # Issue 27394
+mixin_type_variable_test/07: Crash # Issue 27394
+mixin_type_variable_test/08: Crash # Issue 27394
+mixin_typedef_constructor_test: Crash # Issue 27394
+named_parameters_aggregated_test/05: RuntimeError # Issue 27394
+named_parameters_default_eq_test/none: RuntimeError # Issue 27394
+named_parameters_passing_falsy_test: RuntimeError # Issue 27394
+named_parameters_passing_null_test: RuntimeError # Issue 27394
+named_parameters_passing_zero_test: RuntimeError # Issue 27394
+named_parameters_test/01: MissingRuntimeError # Issue 27394
+namer2_test: RuntimeError # Issue 27394
+null_bottom_test/none: RuntimeError # Issue 27394
+null_is2_test: RuntimeError # Issue 27394
+null_is_bottom_test/14: RuntimeError # Issue 27394
+null_is_bottom_test/16: RuntimeError # Issue 27394
+null_test/01: Crash # Issue 27394
+null_test/02: Crash # Issue 27394
+null_test/03: Crash # Issue 27394
+null_test/none: Crash # Issue 27394
+nullaware_opt_test: RuntimeError # Issue 27394
+operator_equals_test: RuntimeError # Issue 27394
+optional_named_parameters_test/none: RuntimeError # Issue 27394
+private_mixin2_test: Crash # Issue 27394
+redirecting_constructor_initializer_test: RuntimeError # Issue 27394
+redirecting_factory_long_test: RuntimeError # Issue 27394
+redirecting_factory_reflection_test: Crash # Issue 27394
+regress_18535_test: Crash # Issue 27394
+regress_18713_test: Crash # Issue 27394
+regress_22666_test: Crash # Issue 27394
+regress_22700_test: RuntimeError # Issue 27394
+regress_23650_test: RuntimeError # Issue 27394
+regress_23996_test: RuntimeError # Issue 27394
+regress_25246_1_test: Crash # Issue 27394
+regress_28255_test: Crash # Issue 27394
+reify_typevar_test: RuntimeError # Issue 27394
+runtime_type_function_test: RuntimeError # Issue 27394
+static_call_wrong_argument_count_negative_test: Fail # Issue 27394
+static_setter_get_test/01: Crash # Issue 27394
+static_top_level_test/00: Crash # Issue 27394
+static_top_level_test/04: Crash # Issue 27394
+super_call4_test: Crash # Issue 27394
+super_conditional_operator_test/01: Crash # Issue 27394
+super_getter_setter_test: Crash # Issue 27394
+super_no_such_method1_test/01: Crash # Issue 27394
+super_no_such_method2_test/01: Crash # Issue 27394
+super_no_such_method3_test/01: Crash # Issue 27394
+super_no_such_method4_test/01: Crash # Issue 27394
+super_no_such_method5_test/01: Crash # Issue 27394
+super_operator_index5_test: Crash # Issue 27394
+super_operator_index6_test: Crash # Issue 27394
+super_operator_index7_test: Crash # Issue 27394
+super_operator_index8_test: Crash # Issue 27394
+super_operator_index_test/01: Crash # Issue 27394
+super_operator_index_test/02: Crash # Issue 27394
+super_operator_index_test/03: Crash # Issue 27394
+super_operator_index_test/04: Crash # Issue 27394
+super_operator_index_test/05: Crash # Issue 27394
+super_operator_index_test/06: Crash # Issue 27394
+super_operator_index_test/07: Crash # Issue 27394
+super_operator_test: Crash # Issue 27394
+super_setter_interceptor_test: RuntimeError # Issue 27394
+this_conditional_operator_test/01: Crash # Issue 27394
+try_catch_syntax_test/13: Crash # Issue 27394
+try_catch_syntax_test/14: Crash # Issue 27394
+try_catch_syntax_test/15: Crash # Issue 27394
+type_argument_substitution_test: RuntimeError # Issue 27394
+type_parameter_literal_test: RuntimeError # Issue 27394
+type_parameter_test/01: Crash # Issue 27394
+type_parameter_test/02: Crash # Issue 27394
+type_parameter_test/03: Crash # Issue 27394
+type_parameter_test/04: Crash # Issue 27394
+type_parameter_test/05: Crash # Issue 27394
+type_parameter_test/06: Crash # Issue 27394
+type_parameter_test/none: Crash # Issue 27394
+type_variable_closure2_test: RuntimeError # Issue 27394
+type_variable_closure3_test: RuntimeError # Issue 27394
+type_variable_closure4_test: RuntimeError # Issue 27394
+type_variable_closure_test: Crash # Issue 27394
+type_variable_field_initializer2_test: RuntimeError # Issue 27394
+type_variable_field_initializer_closure2_test: Crash # Issue 27394
+type_variable_field_initializer_closure_test: Crash # Issue 27394
+type_variable_field_initializer_test: RuntimeError # Issue 27394
+type_variable_function_type_test: RuntimeError # Issue 27394
+type_variable_nested_test: RuntimeError # Issue 27394
+type_variable_typedef_test: RuntimeError # Issue 27394
+
+[ $compiler == dart2js && $dart2js_with_kernel && $host_checked ]
+class_cycle2_test/01: Crash # Issue 27394
+class_cycle_test/00: Crash # Issue 27394
+class_cycle_test/01: Crash # Issue 27394
+conditional_method_invocation_test/02: Crash # Issue 27394
+conditional_method_invocation_test/04: Crash # Issue 27394
+conditional_method_invocation_test/06: Crash # Issue 27394
+const_types_test/23: Crash # Issue 27394
+const_types_test/24: Crash # Issue 27394
+const_types_test/25: Crash # Issue 27394
+const_types_test/26: Crash # Issue 27394
+const_types_test/27: Crash # Issue 27394
+const_types_test/28: Crash # Issue 27394
+const_types_test/29: Crash # Issue 27394
+const_types_test/30: Crash # Issue 27394
+const_types_test/41: Crash # Issue 27394
+cyclic_class_member_test/01: Crash # Issue 27394
+deferred_global_test: Crash # Issue 27394
+factory6_test/00: Crash # Issue 27394
+factory_redirection_test/01: Crash # Issue 27394
+factory_redirection_test/02: Crash # Issue 27394
+factory_redirection_test/03: Crash # Issue 27394
+mixin_cyclic_test/02: Crash # Issue 27394
+mixin_illegal_cycles_test/01: Crash # Issue 27394
+mixin_illegal_cycles_test/05: Crash # Issue 27394
+named_parameters_test/01: Crash # Issue 27394
+named_parameters_test/03: Crash # Issue 27394
+named_parameters_test/05: Crash # Issue 27394
+named_parameters_test/07: Crash # Issue 27394
+named_parameters_test/09: Crash # Issue 27394
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 90433a9..5a73627 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -234,6 +234,7 @@
 [ $compiler == dartk && $runtime == vm ]
 hello_dart_test: CompileTimeError  # VMOptions=--compile-all causes us to hit "native function VMServiceIO_Shutdown cannot be resolved"
 ct_const2_test: Pass, CompileTimeError  # VMOptions=--compile-all causes us to hit "native function VMServiceIO_Shutdown cannot be resolved"
+disassemble_test: Pass, Crash  # Multitest via multiple VMOptions! Hits assert "kind() != RawScript::kKernelTag". Issue 28790
 
 # Failures during Gardening shift: To be triaged!
 [ $compiler == dartk || $compiler == dartkp ]
@@ -246,3 +247,7 @@
 # Triaged checked mode failures
 [ ($compiler == dartk || $compiler == dartkp) && $checked ]
 language/regress_22728_test: Fail # Dartk Issue 28498
+
+# Slow (very slow!) during Gardening shift:
+[ $compiler == dartk && $runtime == vm && $mode == debug ]
+vm/optimized_stacktrace_test: Skip # Issue 28788
diff --git a/tests/language/top_level_prefixed_library_test.lib b/tests/language/top_level_prefixed_library_test.lib
index d75930d..3347464 100644
--- a/tests/language/top_level_prefixed_library_test.lib
+++ b/tests/language/top_level_prefixed_library_test.lib
@@ -2,5 +2,5 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library TopLevelPrefixedLibrary;
+library TopLevelMultipleFilesTest.dart;
 part 'top_level_file2.dart';
diff --git a/tests/language/vm/causal_async_exception_stack_test.dart b/tests/language/vm/causal_async_exception_stack_test.dart
index ed4147f..d08ae9d 100644
--- a/tests/language/vm/causal_async_exception_stack_test.dart
+++ b/tests/language/vm/causal_async_exception_stack_test.dart
@@ -29,11 +29,11 @@
     await foo();
   } catch (e, st) {
     expect(st.toString(), stringContainsInOrder([
-        'thrower',
+        'thrower', '.dart:8',
         '<asynchronous suspension>',
-        'generator',
+        'generator', '.dart:17',
         '<asynchronous suspension>',
-        'foo',
+        'foo', '.dart:21',
         '<asynchronous suspension>',
         'main',
         ]));
@@ -67,9 +67,9 @@
     await thrower();
   } catch(e, st) {
     expect(st.toString(), stringContainsInOrder([
-           'thrower',
+           'thrower', '.dart:8',
            '<asynchronous suspension>',
-           'main',
+           'main', '.dart:67',
            ]));
   }
 }
\ No newline at end of file
diff --git a/tests/standalone/io/process_test_util.dart b/tests/standalone/io/process_test_util.dart
index 36325b1..ecaa8a9 100644
--- a/tests/standalone/io/process_test_util.dart
+++ b/tests/standalone/io/process_test_util.dart
@@ -15,7 +15,7 @@
 String getProcessTestFileName() {
   var extension = getPlatformExecutableExtension();
   var executable = Platform.executable;
-  var dirIndex = executable.lastIndexOf('dart$extension');
+  var dirIndex = executable.lastIndexOf('dart');
   var buffer = new StringBuffer(executable.substring(0, dirIndex));
   buffer.write('process_test$extension');
   return buffer.toString();
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 63bbebb..bb10d88 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -297,8 +297,9 @@
 io/stdin_sync_test: Skip
 io/stdio_implicit_close_test: Skip
 io/stdio_nonblocking_test: Skip
-io/test_extension_test: Skip
 io/test_extension_fail_test: Skip
+io/test_extension_test: Skip
+io/windows_environment_test: Skip
 verbose_gc_to_bmu_test: Skip
 
 io/platform_test: RuntimeError # Expects to be running from 'dart' instead of 'dart_precompiled_runtime'
diff --git a/tools/VERSION b/tools/VERSION
index dfbe20c..743feae 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 23
 PATCH 0
-PRERELEASE 0
+PRERELEASE 1
 PRERELEASE_PATCH 0
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index 647d196..fcad01e 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -9,7 +9,7 @@
 
 vars.update({
   "dartium_chromium_commit": "7558afb6379171d7f96b2db68ae9d2b64b2c5544",
-  "dartium_webkit_commit": "c75f4816a4a066834be431a2dc4b84d788020b64",
+  "dartium_webkit_commit": "56e20cfbfa7e1a680add908ed9c316c067454ff0",
   "chromium_base_revision": "338390",
 
   # We use mirrors of all github repos to guarantee reproducibility and
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index e9980ea..254b8b0 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -257,6 +257,11 @@
   return new List<String>.from(results.map((e) => e.toString()));
 }
 
+final String injectedCidFields = [
+  'Array', 'ExternalOneByteString', 'GrowableObjectArray',
+  'ImmutableArray', 'OneByteString', 'TwoByteString', 'Bigint'
+].map((name) => "static final int cid${name} = 0;").join('\n');
+
 /// Merge `@patch` declarations into `external` declarations.
 class PatchApplier extends GeneralizingAstVisitor {
   final StringEditBuffer edits;
@@ -274,6 +279,15 @@
 
   void _merge(AstNode node, int pos) {
     var code = patch.contents.substring(node.offset, node.end);
+
+    // We inject a number of static fields into dart:internal.ClassID class.
+    // These fields represent various VM class ids and are only used to
+    // make core libraries compile. Kernel reader will actually ignore these
+    // fields and instead inject concrete constants into this class.
+    if (node is ClassDeclaration && node.name.name == 'ClassID') {
+      code = code.replaceFirst(
+          new RegExp(r'}$'), injectedCidFields + '}');
+    }
     edits.insert(pos, '\n' + code);
   }
 
diff --git a/tools/task_kill.py b/tools/task_kill.py
index 44c8e2ee..fb677a8 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -26,35 +26,38 @@
   'win32': {
     'chrome': 'chrome.exe',
     'content_shell': 'content_shell.exe',
+    'dart_bootstrap': 'dart_bootstrap.exe',
     'dart': 'dart.exe',
-    'iexplore': 'iexplore.exe',
+    'dart_precompiled_runtime': 'dart_precompiled_runtime.exe',
     'firefox': 'firefox.exe',
+    'gen_snapshot': 'gen_snapshot.exe',
     'git': 'git.exe',
+    'iexplore': 'iexplore.exe',
     'svn': 'svn.exe',
-    'fletch': 'fletch.exe',
-    'fletch-vm': 'fletch-vm.exe',
   },
   'linux': {
     'chrome': 'chrome',
     'content_shell': 'content_shell',
+    'dart_bootstrap': 'dart_bootstrap',
     'dart': 'dart',
-    'firefox': 'firefox.exe',
+    'dart_precompiled_runtime': 'dart_precompiled_runtime',
+    'firefox': 'firefox',
+    'gen_snapshot': 'gen_snapshot',
     'git': 'git',
     'svn': 'svn',
-    'fletch': 'fletch',
-    'fletch-vm': 'fletch-vm',
   },
   'macos': {
     'chrome': 'Chrome',
     'chrome_helper': 'Chrome Helper',
     'content_shell': 'Content Shell',
+    'dart_bootstrap': 'dart_bootstrap',
     'dart': 'dart',
+    'dart_precompiled_runtime': 'dart_precompiled_runtime',
     'firefox': 'firefox',
-    'safari': 'Safari',
+    'gen_snapshot': 'gen_snapshot',
     'git': 'git',
+    'safari': 'Safari',
     'svn': 'svn',
-    'fletch': 'fletch',
-    'fletch-vm': 'fletch-vm',
   }
 }
 
@@ -74,8 +77,6 @@
   parser = optparse.OptionParser("usage: %prog [options]")
   parser.add_option("--kill_dart", default=True,
                     help="Kill all dart processes")
-  parser.add_option("--kill_fletch", default=True,
-                    help="Kill all fletch and fletch-vm processes")
   parser.add_option("--kill_vc", default=True,
                     help="Kill all git and svn processes")
   parser.add_option("--kill_browsers", default=False,
@@ -224,11 +225,9 @@
 
 def KillDart():
   status = Kill("dart", dump_stacks=True)
-  return status
-
-def KillFletch():
-  status = Kill("fletch")
-  status += Kill("fletch-vm")
+  status += Kill("dart_bootstrap", dump_stacks=True)
+  status += Kill("gen_snapshot", dump_stacks=True)
+  status += Kill("dart_precompiled_runtime", dump_stacks=True)
   return status
 
 def Main():
@@ -240,8 +239,6 @@
       KillDart()
     else:
       status += KillDart()
-  if options.kill_fletch:
-    status += KillFletch()
   if options.kill_vc:
     status += KillVCSystems()
   if options.kill_browsers:
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index d545b3f..3110586 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -67,8 +67,9 @@
     bool hotReload = configuration['hot_reload'];
     bool hotReloadRollback = configuration['hot_reload_rollback'];
     bool useFastStartup = configuration['fast_startup'];
+    bool useKernelInDart2js = configuration['dart2js_with_kernel'];
     bool verifyKernel = configuration['verify-ir'];
-    bool useDFE = configuration['useDFE'];
+    bool useDFE = !configuration['noDFE'];
     bool useFasta = configuration['useFasta'];
     bool treeShake = !configuration['no-tree-shake'];
 
@@ -89,6 +90,7 @@
             useSdk: useSdk,
             isCsp: isCsp,
             useFastStartup: useFastStartup,
+            useKernel: useKernelInDart2js,
             extraDart2jsOptions:
                 TestUtils.getExtraOptions(configuration, 'dart2js_options'));
       case 'app_jit':
@@ -535,6 +537,7 @@
   final bool isCsp;
   final bool useCps;
   final bool useFastStartup;
+  final bool useKernel;
   final List<String> extraDart2jsOptions;
   // We cache the extended environment to save memory.
   static Map<String, String> cpsFlagCache;
@@ -548,6 +551,7 @@
       bool this.useCps,
       bool this.isCsp,
       bool this.useFastStartup,
+      this.useKernel,
       this.extraDart2jsOptions})
       : super('dart2js',
             isDebug: isDebug,
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index 206059a..c82c7ce 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -213,6 +213,13 @@
           [],
           false,
           type: 'bool'),
+      new _TestOptionSpecification(
+          'dart2js_with_kernel',
+          'Enable the internal pipeline in dart2js to use kernel',
+          ['--dart2js-with-kernel'],
+          [],
+          false,
+          type: 'bool'),
       new _TestOptionSpecification('hot_reload', 'Run hot reload stress tests',
           ['--hot-reload'], [], false,
           type: 'bool'),
@@ -294,7 +301,7 @@
           'no-tree-shake', 'Disable kernel IR tree shaking', ['--no-tree-shake'], [], false,
           type: 'bool'),
       new _TestOptionSpecification(
-          'useDFE', 'Use Kernel Isolate', ['--use-dfe'], [], true,
+          'noDFE', 'Do not use Kernel Isolate', ['--no-dfe'], [], false,
           type: 'bool'),
       new _TestOptionSpecification(
           'useFasta', 'Use Fasta in Kernel Isolate', ['--use-fasta'], [], false,
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index a16141d..5a6cc26 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -1485,7 +1485,7 @@
     }
     args.addAll(additionalOptions(filePath));
     if (configuration['analyzer']) {
-      args.add('--machine');
+      args.add('--format=machine');
       args.add('--no-hints');
     }
 
@@ -2229,9 +2229,8 @@
     if (compiler == "dart2js" && configuration["fast_startup"]) {
       args.add("--fast-startup");
     }
-    if (compiler == "dart2analyzer") {
-      args.add("--show-package-warnings");
-      args.add("--enable-async");
+    if (compiler == "dart2js" && configuration["dart2js_with_kernel"]) {
+      args.add("--use-kernel");
     }
     return args;
   }
